summaryrefslogtreecommitdiff
path: root/chromium/ui
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-03-12 09:13:00 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-03-16 09:58:26 +0000
commit03561cae90f1d99b5c54b1ef3be69f10e882b25e (patch)
treecc5f0958e823c044e7ae51cc0117fe51432abe5e /chromium/ui
parentfa98118a45f7e169f8846086dc2c22c49a8ba310 (diff)
downloadqtwebengine-chromium-03561cae90f1d99b5c54b1ef3be69f10e882b25e.tar.gz
BASELINE: Update Chromium to 88.0.4324.208
Change-Id: I3ae87d23e4eff4b4a469685658740a213600c667 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/ui')
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm91
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h14
-rw-r--r--chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm57
-rw-r--r--chromium/ui/accessibility/BUILD.gn1
-rw-r--r--chromium/ui/accessibility/PRESUBMIT.py20
-rw-r--r--chromium/ui/accessibility/accessibility_features.cc31
-rw-r--r--chromium/ui/accessibility/accessibility_features.h23
-rw-r--r--chromium/ui/accessibility/accessibility_switches.cc9
-rw-r--r--chromium/ui/accessibility/accessibility_switches.h4
-rw-r--r--chromium/ui/accessibility/ax_common.h18
-rw-r--r--chromium/ui/accessibility/ax_enum_util.cc20
-rw-r--r--chromium/ui/accessibility/ax_enums.mojom17
-rw-r--r--chromium/ui/accessibility/ax_event_generator.cc211
-rw-r--r--chromium/ui/accessibility/ax_event_generator.h41
-rw-r--r--chromium/ui/accessibility/ax_event_generator_unittest.cc480
-rw-r--r--chromium/ui/accessibility/ax_language_detection.cc6
-rw-r--r--chromium/ui/accessibility/ax_mode.cc7
-rw-r--r--chromium/ui/accessibility/ax_node.cc99
-rw-r--r--chromium/ui/accessibility/ax_node.h40
-rw-r--r--chromium/ui/accessibility/ax_node_data.cc9
-rw-r--r--chromium/ui/accessibility/ax_node_data.h3
-rw-r--r--chromium/ui/accessibility/ax_node_position.cc62
-rw-r--r--chromium/ui/accessibility/ax_node_position_unittest.cc398
-rw-r--r--chromium/ui/accessibility/ax_position.h7
-rw-r--r--chromium/ui/accessibility/ax_range_unittest.cc2
-rw-r--r--chromium/ui/accessibility/ax_role_properties.cc86
-rw-r--r--chromium/ui/accessibility/ax_role_properties.h12
-rw-r--r--chromium/ui/accessibility/ax_tree_manager.h4
-rw-r--r--chromium/ui/accessibility/ax_tree_serializer.h88
-rw-r--r--chromium/ui/accessibility/ax_tree_serializer_unittest.cc8
-rw-r--r--chromium/ui/accessibility/extensions/chromevoxclassic/common/aria_util_test.unitjs16
-rw-r--r--chromium/ui/accessibility/extensions/chromevoxclassic/common/braille_util_test.unitjs2
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_bs.xtb14
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_en-GB.xtb2
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_es.xtb2
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_iw.xtb2
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_ta.xtb4
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_th.xtb6
-rw-r--r--chromium/ui/accessibility/platform/BUILD.gn8
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc7
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc34
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_base.cc39
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_base.h14
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate.h9
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc17
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h3
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_mac.mm4
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textprovider_win.cc2
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textprovider_win_unittest.cc4
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc414
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h50
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc314
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win.cc105
-rw-r--r--chromium/ui/accessibility/platform/ax_platform_node_win.h1
-rw-r--r--chromium/ui/accessibility/platform/inspect/inspect.cc23
-rw-r--r--chromium/ui/accessibility/platform/inspect/inspect.h82
-rw-r--r--chromium/ui/accessibility/platform/inspect/property_node.cc261
-rw-r--r--chromium/ui/accessibility/platform/inspect/property_node.h98
-rw-r--r--chromium/ui/accessibility/platform/inspect/property_node_unittest.cc145
-rw-r--r--chromium/ui/accessibility/platform/inspect/tree_formatter.cc66
-rw-r--r--chromium/ui/accessibility/platform/inspect/tree_formatter.h87
-rw-r--r--chromium/ui/accessibility/test_ax_tree_manager.cc28
-rw-r--r--chromium/ui/accessibility/test_ax_tree_manager.h2
-rw-r--r--chromium/ui/android/BUILD.gn17
-rw-r--r--chromium/ui/android/DIR_METADATA12
-rw-r--r--chromium/ui/android/OWNERS3
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/DIR_METADATA11
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/OWNERS2
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/modaldialog/DIR_METADATA12
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/modaldialog/OWNERS3
-rw-r--r--chromium/ui/android/resources/resource_manager_impl_unittest.cc5
-rw-r--r--chromium/ui/android/view_android.cc38
-rw-r--r--chromium/ui/android/view_android.h8
-rw-r--r--chromium/ui/aura/BUILD.gn1
-rw-r--r--chromium/ui/aura/client/screen_position_client.cc22
-rw-r--r--chromium/ui/aura/client/screen_position_client.h12
-rw-r--r--chromium/ui/aura/client/screen_position_client_unittest.cc65
-rw-r--r--chromium/ui/aura/gestures/gesture_recognizer_unittest.cc4
-rw-r--r--chromium/ui/aura/native_window_occlusion_tracker_win.cc183
-rw-r--r--chromium/ui/aura/native_window_occlusion_tracker_win.h50
-rw-r--r--chromium/ui/aura/screen_ozone.cc13
-rw-r--r--chromium/ui/aura/screen_ozone.h4
-rw-r--r--chromium/ui/aura/window.cc2
-rw-r--r--chromium/ui/aura/window_event_dispatcher.cc7
-rw-r--r--chromium/ui/aura/window_event_dispatcher.h2
-rw-r--r--chromium/ui/aura/window_event_dispatcher_unittest.cc6
-rw-r--r--chromium/ui/aura/window_occlusion_tracker_unittest.cc4
-rw-r--r--chromium/ui/aura/window_unittest.cc2
-rw-r--r--chromium/ui/aura_extra/window_occlusion_impl_win.cc16
-rw-r--r--chromium/ui/aura_extra/window_position_in_root_monitor_unittest.cc2
-rw-r--r--chromium/ui/base/BUILD.gn22
-rw-r--r--chromium/ui/base/DEPS1
-rw-r--r--chromium/ui/base/clipboard/BUILD.gn16
-rw-r--r--chromium/ui/base/clipboard/DIR_METADATA12
-rw-r--r--chromium/ui/base/clipboard/OWNERS3
-rw-r--r--chromium/ui/base/clipboard/clipboard.cc30
-rw-r--r--chromium/ui/base/clipboard/clipboard.h83
-rw-r--r--chromium/ui/base/clipboard/clipboard_android.cc36
-rw-r--r--chromium/ui/base/clipboard/clipboard_android.h28
-rw-r--r--chromium/ui/base/clipboard/clipboard_android_test_support.cc2
-rw-r--r--chromium/ui/base/clipboard/clipboard_constants.cc1
-rw-r--r--chromium/ui/base/clipboard/clipboard_constants.h6
-rw-r--r--chromium/ui/base/clipboard/clipboard_constants_mac.mm2
-rw-r--r--chromium/ui/base/clipboard/clipboard_data.cc4
-rw-r--r--chromium/ui/base/clipboard/clipboard_data.h8
-rw-r--r--chromium/ui/base/clipboard/clipboard_data_endpoint.cc32
-rw-r--r--chromium/ui/base/clipboard/clipboard_data_endpoint.h65
-rw-r--r--chromium/ui/base/clipboard/clipboard_data_unittest.cc6
-rw-r--r--chromium/ui/base/clipboard/clipboard_dlp_controller.cc33
-rw-r--r--chromium/ui/base/clipboard/clipboard_dlp_controller.h42
-rw-r--r--chromium/ui/base/clipboard/clipboard_format_type.h3
-rw-r--r--chromium/ui/base/clipboard/clipboard_format_type_android.cc7
-rw-r--r--chromium/ui/base/clipboard/clipboard_format_type_aura.cc7
-rw-r--r--chromium/ui/base/clipboard/clipboard_format_type_mac.mm7
-rw-r--r--chromium/ui/base/clipboard/clipboard_format_type_win.cc53
-rw-r--r--chromium/ui/base/clipboard/clipboard_mac.h28
-rw-r--r--chromium/ui/base/clipboard/clipboard_mac.mm30
-rw-r--r--chromium/ui/base/clipboard/clipboard_non_backed.cc49
-rw-r--r--chromium/ui/base/clipboard/clipboard_non_backed.h36
-rw-r--r--chromium/ui/base/clipboard/clipboard_ozone.cc30
-rw-r--r--chromium/ui/base/clipboard/clipboard_ozone.h28
-rw-r--r--chromium/ui/base/clipboard/clipboard_test_template.h95
-rw-r--r--chromium/ui/base/clipboard/clipboard_util_win.cc36
-rw-r--r--chromium/ui/base/clipboard/clipboard_util_win.h4
-rw-r--r--chromium/ui/base/clipboard/clipboard_win.cc32
-rw-r--r--chromium/ui/base/clipboard/clipboard_win.h28
-rw-r--r--chromium/ui/base/clipboard/clipboard_x11.cc31
-rw-r--r--chromium/ui/base/clipboard/clipboard_x11.h28
-rw-r--r--chromium/ui/base/clipboard/scoped_clipboard_writer.cc2
-rw-r--r--chromium/ui/base/clipboard/scoped_clipboard_writer.h10
-rw-r--r--chromium/ui/base/cocoa/DIR_METADATA11
-rw-r--r--chromium/ui/base/cocoa/OWNERS2
-rw-r--r--chromium/ui/base/cocoa/permissions_utils.h9
-rw-r--r--chromium/ui/base/cocoa/permissions_utils.mm21
-rw-r--r--chromium/ui/base/cocoa/touch_bar_util.h15
-rw-r--r--chromium/ui/base/cocoa/touch_bar_util.mm22
-rw-r--r--chromium/ui/base/cocoa/views_hostable.h3
-rw-r--r--chromium/ui/base/cursor/BUILD.gn26
-rw-r--r--chromium/ui/base/cursor/DIR_METADATA11
-rw-r--r--chromium/ui/base/cursor/OWNERS2
-rw-r--r--chromium/ui/base/cursor/cursor.h2
-rw-r--r--chromium/ui/base/cursor/cursor_factory.cc4
-rw-r--r--chromium/ui/base/cursor/cursor_factory.h12
-rw-r--r--chromium/ui/base/cursor/cursor_loader.h71
-rw-r--r--chromium/ui/base/cursor/cursor_loader_ozone.cc87
-rw-r--r--chromium/ui/base/cursor/cursor_loader_ozone.h27
-rw-r--r--chromium/ui/base/cursor/cursor_loader_unittest.cc57
-rw-r--r--chromium/ui/base/cursor/cursor_loader_win.cc21
-rw-r--r--chromium/ui/base/cursor/cursor_loader_win.h9
-rw-r--r--chromium/ui/base/cursor/cursor_util.cc3
-rw-r--r--chromium/ui/base/cursor/cursors_aura.cc37
-rw-r--r--chromium/ui/base/cursor/cursors_aura.h10
-rw-r--r--chromium/ui/base/cursor/image_cursors.cc120
-rw-r--r--chromium/ui/base/cursor/image_cursors.h52
-rw-r--r--chromium/ui/base/cursor/ozone/DIR_METADATA11
-rw-r--r--chromium/ui/base/cursor/ozone/OWNERS2
-rw-r--r--chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc101
-rw-r--r--chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h23
-rw-r--r--chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone_unittest.cc32
-rw-r--r--chromium/ui/base/data_transfer_policy/BUILD.gn22
-rw-r--r--chromium/ui/base/data_transfer_policy/DIR_METADATA12
-rw-r--r--chromium/ui/base/data_transfer_policy/OWNERS5
-rw-r--r--chromium/ui/base/data_transfer_policy/data_transfer_endpoint.cc39
-rw-r--r--chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h82
-rw-r--r--chromium/ui/base/data_transfer_policy/data_transfer_policy_controller.cc38
-rw-r--r--chromium/ui/base/data_transfer_policy/data_transfer_policy_controller.h46
-rw-r--r--chromium/ui/base/dragdrop/DIR_METADATA12
-rw-r--r--chromium/ui/base/dragdrop/OWNERS3
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data.cc10
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data.h7
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider.h8
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_mac.h3
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_mac.mm8
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc30
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.h14
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc41
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_win.h3
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_x11.cc8
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_x11.h3
-rw-r--r--chromium/ui/base/emoji/DIR_METADATA11
-rw-r--r--chromium/ui/base/emoji/OWNERS1
-rw-r--r--chromium/ui/base/glib/DIR_METADATA11
-rw-r--r--chromium/ui/base/glib/OWNERS1
-rw-r--r--chromium/ui/base/idle/BUILD.gn13
-rw-r--r--chromium/ui/base/idle/DIR_METADATA11
-rw-r--r--chromium/ui/base/idle/OWNERS1
-rw-r--r--chromium/ui/base/idle/idle_linux.cc44
-rw-r--r--chromium/ui/base/ime/DIR_METADATA11
-rw-r--r--chromium/ui/base/ime/OWNERS3
-rw-r--r--chromium/ui/base/ime/chromeos/BUILD.gn1
-rw-r--r--chromium/ui/base/ime/input_method_base.cc2
-rw-r--r--chromium/ui/base/ime/linux/composition_text_util_pango.cc6
-rw-r--r--chromium/ui/base/ime/mock_input_method.cc2
-rw-r--r--chromium/ui/base/ime/mojom/text_input_state.mojom2
-rw-r--r--chromium/ui/base/ime/utf_offset.cc41
-rw-r--r--chromium/ui/base/ime/utf_offset.h30
-rw-r--r--chromium/ui/base/ime/utf_offset_unittest.cc140
-rw-r--r--chromium/ui/base/l10n/DIR_METADATA11
-rw-r--r--chromium/ui/base/l10n/OWNERS3
-rw-r--r--chromium/ui/base/l10n/formatter.cc6
-rw-r--r--chromium/ui/base/l10n/l10n_util.cc7
-rw-r--r--chromium/ui/base/l10n/l10n_util.h5
-rw-r--r--chromium/ui/base/l10n/l10n_util_posix.cc35
-rw-r--r--chromium/ui/base/l10n/l10n_util_win.cc16
-rw-r--r--chromium/ui/base/l10n/l10n_util_win.h6
-rw-r--r--chromium/ui/base/models/dialog_model.cc8
-rw-r--r--chromium/ui/base/models/dialog_model.h53
-rw-r--r--chromium/ui/base/models/dialog_model_field.cc20
-rw-r--r--chromium/ui/base/models/dialog_model_field.h17
-rw-r--r--chromium/ui/base/pointer/DIR_METADATA11
-rw-r--r--chromium/ui/base/pointer/OWNERS2
-rw-r--r--chromium/ui/base/pointer/touch_ui_controller_unittest.cc2
-rw-r--r--chromium/ui/base/prediction/prediction_metrics_handler.cc49
-rw-r--r--chromium/ui/base/prediction/prediction_metrics_handler.h8
-rw-r--r--chromium/ui/base/prediction/prediction_metrics_handler_unittest.cc3
-rw-r--r--chromium/ui/base/resource/DIR_METADATA11
-rw-r--r--chromium/ui/base/resource/OWNERS3
-rw-r--r--chromium/ui/base/resource/mock_resource_bundle_delegate.h2
-rw-r--r--chromium/ui/base/resource/resource_bundle.cc9
-rw-r--r--chromium/ui/base/resource/resource_bundle.h11
-rw-r--r--chromium/ui/base/resource/resource_bundle_android.cc5
-rw-r--r--chromium/ui/base/resource/resource_bundle_android.h4
-rw-r--r--chromium/ui/base/resource/resource_bundle_fuchsia.cc11
-rw-r--r--chromium/ui/base/text/DIR_METADATA11
-rw-r--r--chromium/ui/base/text/OWNERS2
-rw-r--r--chromium/ui/base/ui_base_features.cc40
-rw-r--r--chromium/ui/base/ui_base_features.h4
-rw-r--r--chromium/ui/base/webui/DIR_METADATA11
-rw-r--r--chromium/ui/base/webui/OWNERS2
-rw-r--r--chromium/ui/base/webui/jstemplate_builder.cc5
-rw-r--r--chromium/ui/base/webui/web_ui_util.cc31
-rw-r--r--chromium/ui/base/webui/web_ui_util.h5
-rw-r--r--chromium/ui/base/webui/web_ui_util_unittest.cc64
-rw-r--r--chromium/ui/base/win/message_box_win.cc15
-rw-r--r--chromium/ui/base/win/message_box_win.h7
-rw-r--r--chromium/ui/base/win/power_setting_change_listener.cc110
-rw-r--r--chromium/ui/base/win/power_setting_change_listener.h40
-rw-r--r--chromium/ui/base/win/session_change_observer.cc2
-rw-r--r--chromium/ui/base/win/shell.cc36
-rw-r--r--chromium/ui/base/x/BUILD.gn17
-rw-r--r--chromium/ui/base/x/selection_owner.cc1
-rw-r--r--chromium/ui/base/x/selection_owner.h1
-rw-r--r--chromium/ui/base/x/selection_requestor.cc53
-rw-r--r--chromium/ui/base/x/selection_requestor.h2
-rw-r--r--chromium/ui/base/x/selection_requestor_unittest.cc5
-rw-r--r--chromium/ui/base/x/selection_utils.h2
-rw-r--r--chromium/ui/base/x/x11_cursor_factory.cc5
-rw-r--r--chromium/ui/base/x/x11_cursor_factory.h6
-rw-r--r--chromium/ui/base/x/x11_cursor_factory_unittest.cc2
-rw-r--r--chromium/ui/base/x/x11_desktop_window_move_client.cc1
-rw-r--r--chromium/ui/base/x/x11_desktop_window_move_client.h1
-rw-r--r--chromium/ui/base/x/x11_display_manager.cc1
-rw-r--r--chromium/ui/base/x/x11_display_manager.h1
-rw-r--r--chromium/ui/base/x/x11_display_util.cc6
-rw-r--r--chromium/ui/base/x/x11_display_util.h2
-rw-r--r--chromium/ui/base/x/x11_drag_context.h1
-rw-r--r--chromium/ui/base/x/x11_drag_drop_client.h1
-rw-r--r--chromium/ui/base/x/x11_error_handler.cc105
-rw-r--r--chromium/ui/base/x/x11_error_handler.h26
-rw-r--r--chromium/ui/base/x/x11_gl_egl_utility.cc1
-rw-r--r--chromium/ui/base/x/x11_idle_query.cc (renamed from chromium/ui/base/idle/idle_query_x11.cc)4
-rw-r--r--chromium/ui/base/x/x11_idle_query.h (renamed from chromium/ui/base/idle/idle_query_x11.h)11
-rw-r--r--chromium/ui/base/x/x11_menu_list.h2
-rw-r--r--chromium/ui/base/x/x11_menu_registrar.cc6
-rw-r--r--chromium/ui/base/x/x11_menu_registrar.h2
-rw-r--r--chromium/ui/base/x/x11_move_loop.h2
-rw-r--r--chromium/ui/base/x/x11_os_exchange_data_provider.cc10
-rw-r--r--chromium/ui/base/x/x11_os_exchange_data_provider.h6
-rw-r--r--chromium/ui/base/x/x11_pointer_grab.cc1
-rw-r--r--chromium/ui/base/x/x11_pointer_grab.h1
-rw-r--r--chromium/ui/base/x/x11_screensaver_window_finder.cc (renamed from chromium/ui/base/idle/screensaver_window_finder_x11.cc)10
-rw-r--r--chromium/ui/base/x/x11_screensaver_window_finder.h (renamed from chromium/ui/base/idle/screensaver_window_finder_x11.h)11
-rw-r--r--chromium/ui/base/x/x11_shm_image_pool.cc13
-rw-r--r--chromium/ui/base/x/x11_shm_image_pool.h1
-rw-r--r--chromium/ui/base/x/x11_software_bitmap_presenter.cc15
-rw-r--r--chromium/ui/base/x/x11_software_bitmap_presenter.h2
-rw-r--r--chromium/ui/base/x/x11_topmost_window_finder.h1
-rw-r--r--chromium/ui/base/x/x11_user_input_monitor.cc131
-rw-r--r--chromium/ui/base/x/x11_user_input_monitor.h68
-rw-r--r--chromium/ui/base/x/x11_util.cc148
-rw-r--r--chromium/ui/base/x/x11_util.h63
-rw-r--r--chromium/ui/base/x/x11_whole_screen_move_loop.cc30
-rw-r--r--chromium/ui/base/x/x11_whole_screen_move_loop.h2
-rw-r--r--chromium/ui/base/x/x11_window.cc11
-rw-r--r--chromium/ui/base/x/x11_window.h2
-rw-r--r--chromium/ui/base/x/x11_workspace_handler.cc2
-rw-r--r--chromium/ui/base/x/x11_workspace_handler.h1
-rw-r--r--chromium/ui/base/x/xwmstartupcheck/BUILD.gn2
-rw-r--r--chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.cc1
-rw-r--r--chromium/ui/chromeos/events/BUILD.gn2
-rw-r--r--chromium/ui/color/color_id.h5
-rw-r--r--chromium/ui/color/core_default_color_mixer.cc4
-rw-r--r--chromium/ui/color/ui_color_mixer.cc15
-rw-r--r--chromium/ui/compositor/BUILD.gn3
-rw-r--r--chromium/ui/compositor/animation_metrics_recorder.cc67
-rw-r--r--chromium/ui/compositor/animation_metrics_recorder.h74
-rw-r--r--chromium/ui/compositor/animation_metrics_reporter.h27
-rw-r--r--chromium/ui/compositor/animation_throughput_reporter.h4
-rw-r--r--chromium/ui/compositor/animation_throughput_reporter_unittest.cc25
-rw-r--r--chromium/ui/compositor/canvas_painter.cc2
-rw-r--r--chromium/ui/compositor/compositor.cc10
-rw-r--r--chromium/ui/compositor/compositor.h6
-rw-r--r--chromium/ui/compositor/compositor_observer.h8
-rw-r--r--chromium/ui/compositor/compositor_unittest.cc20
-rw-r--r--chromium/ui/compositor/layer.cc12
-rw-r--r--chromium/ui/compositor/layer.h4
-rw-r--r--chromium/ui/compositor/layer_animation_element.cc32
-rw-r--r--chromium/ui/compositor/layer_animation_element.h12
-rw-r--r--chromium/ui/compositor/layer_animation_sequence.cc22
-rw-r--r--chromium/ui/compositor/layer_animation_sequence.h6
-rw-r--r--chromium/ui/compositor/layer_animator.cc5
-rw-r--r--chromium/ui/compositor/layer_animator.h7
-rw-r--r--chromium/ui/compositor/layer_animator_unittest.cc179
-rw-r--r--chromium/ui/compositor/layer_unittest.cc30
-rw-r--r--chromium/ui/compositor/recyclable_compositor_mac.cc7
-rw-r--r--chromium/ui/compositor/recyclable_compositor_mac.h5
-rw-r--r--chromium/ui/compositor/scoped_layer_animation_settings.cc6
-rw-r--r--chromium/ui/compositor/scoped_layer_animation_settings.h2
-rw-r--r--chromium/ui/compositor/test/test_compositor_host_ozone.cc6
-rw-r--r--chromium/ui/compositor/throughput_tracker_host.h4
-rw-r--r--chromium/ui/display/BUILD.gn1
-rw-r--r--chromium/ui/display/display_features.cc10
-rw-r--r--chromium/ui/display/display_features.h4
-rw-r--r--chromium/ui/display/display_observer.cc4
-rw-r--r--chromium/ui/display/display_observer.h4
-rw-r--r--chromium/ui/display/manager/configure_displays_task.cc119
-rw-r--r--chromium/ui/display/manager/configure_displays_task.h11
-rw-r--r--chromium/ui/display/manager/configure_displays_task_unittest.cc112
-rw-r--r--chromium/ui/display/manager/display_change_observer.cc10
-rw-r--r--chromium/ui/display/manager/display_change_observer_unittest.cc152
-rw-r--r--chromium/ui/display/manager/display_configurator.cc9
-rw-r--r--chromium/ui/display/manager/display_configurator_unittest.cc26
-rw-r--r--chromium/ui/display/manager/display_manager.cc7
-rw-r--r--chromium/ui/display/manager/display_manager.h2
-rw-r--r--chromium/ui/display/manager/display_util.cc47
-rw-r--r--chromium/ui/display/manager/managed_display_info.cc17
-rw-r--r--chromium/ui/display/manager/managed_display_info.h4
-rw-r--r--chromium/ui/display/manager/managed_display_info_unittest.cc1
-rw-r--r--chromium/ui/display/screen.cc16
-rw-r--r--chromium/ui/display/screen.h19
-rw-r--r--chromium/ui/display/tablet_state.h20
-rw-r--r--chromium/ui/display/types/display_constants.h118
-rw-r--r--chromium/ui/display/win/color_profile_reader.cc18
-rw-r--r--chromium/ui/display/win/color_profile_reader.h5
-rw-r--r--chromium/ui/display/win/screen_win.cc2
-rw-r--r--chromium/ui/events/BUILD.gn10
-rw-r--r--chromium/ui/events/DIR_METADATA11
-rw-r--r--chromium/ui/events/OWNERS3
-rw-r--r--chromium/ui/events/android/DIR_METADATA12
-rw-r--r--chromium/ui/events/android/OWNERS3
-rw-r--r--chromium/ui/events/android/event_handler_android.cc4
-rw-r--r--chromium/ui/events/android/event_handler_android.h5
-rw-r--r--chromium/ui/events/blink/DIR_METADATA12
-rw-r--r--chromium/ui/events/blink/OWNERS3
-rw-r--r--chromium/ui/events/blink/blink_event_util.cc4
-rw-r--r--chromium/ui/events/blink/web_input_event.cc1
-rw-r--r--chromium/ui/events/blink/web_input_event_unittest.cc195
-rw-r--r--chromium/ui/events/devices/x11/BUILD.gn2
-rw-r--r--chromium/ui/events/devices/x11/device_data_manager_x11.cc3
-rw-r--r--chromium/ui/events/devices/x11/device_data_manager_x11.h2
-rw-r--r--chromium/ui/events/devices/x11/device_list_cache_x11.cc1
-rw-r--r--chromium/ui/events/devices/x11/device_list_cache_x11.h1
-rw-r--r--chromium/ui/events/devices/x11/touch_factory_x11.cc1
-rw-r--r--chromium/ui/events/devices/x11/touch_factory_x11.h1
-rw-r--r--chromium/ui/events/event_unittest.cc253
-rw-r--r--chromium/ui/events/fuchsia/DIR_METADATA13
-rw-r--r--chromium/ui/events/fuchsia/OWNERS3
-rw-r--r--chromium/ui/events/gesture_detection/DIR_METADATA12
-rw-r--r--chromium/ui/events/gesture_detection/OWNERS3
-rw-r--r--chromium/ui/events/gesture_detection/filtered_gesture_provider.cc4
-rw-r--r--chromium/ui/events/gesture_detection/filtered_gesture_provider.h4
-rw-r--r--chromium/ui/events/gesture_detection/gesture_event_data_packet.cc6
-rw-r--r--chromium/ui/events/gesture_detection/gesture_event_data_packet.h2
-rw-r--r--chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.cc6
-rw-r--r--chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.h2
-rw-r--r--chromium/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc12
-rw-r--r--chromium/ui/events/gesture_event_details.h13
-rw-r--r--chromium/ui/events/gestures/DIR_METADATA9
-rw-r--r--chromium/ui/events/gestures/OWNERS3
-rw-r--r--chromium/ui/events/gestures/gesture_provider_aura.cc6
-rw-r--r--chromium/ui/events/gestures/gesture_provider_aura.h2
-rw-r--r--chromium/ui/events/gestures/gesture_recognizer.h2
-rw-r--r--chromium/ui/events/gestures/gesture_recognizer_impl.cc4
-rw-r--r--chromium/ui/events/gestures/gesture_recognizer_impl.h2
-rw-r--r--chromium/ui/events/gestures/gesture_recognizer_impl_mac.cc2
-rw-r--r--chromium/ui/events/gestures/gesture_recognizer_impl_mac.h2
-rw-r--r--chromium/ui/events/keyboard_event_counter.cc33
-rw-r--r--chromium/ui/events/keyboard_event_counter.h48
-rw-r--r--chromium/ui/events/keyboard_event_counter_unittest.cc37
-rw-r--r--chromium/ui/events/keycodes/BUILD.gn2
-rw-r--r--chromium/ui/events/keycodes/DIR_METADATA11
-rw-r--r--chromium/ui/events/keycodes/OWNERS2
-rw-r--r--chromium/ui/events/keycodes/dom/dom_key.h13
-rw-r--r--chromium/ui/events/keycodes/dom/keycode_converter.cc78
-rw-r--r--chromium/ui/events/keycodes/dom/keycode_converter.h23
-rw-r--r--chromium/ui/events/keycodes/keyboard_code_conversion_x.cc42
-rw-r--r--chromium/ui/events/keycodes/keysym_to_unicode.cc9
-rw-r--r--chromium/ui/events/keycodes/platform_key_map_win_unittest.cc1
-rw-r--r--chromium/ui/events/ozone/DIR_METADATA9
-rw-r--r--chromium/ui/events/ozone/OWNERS2
-rw-r--r--chromium/ui/events/ozone/device/device_manager_manual.cc7
-rw-r--r--chromium/ui/events/ozone/evdev/BUILD.gn4
-rw-r--r--chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc7
-rw-r--r--chromium/ui/events/ozone/evdev/event_device_info.h1
-rw-r--r--chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc34
-rw-r--r--chromium/ui/events/ozone/evdev/input_device_factory_evdev.h1
-rw-r--r--chromium/ui/events/ozone/evdev/input_injector_evdev.cc6
-rw-r--r--chromium/ui/events/ozone/evdev/keyboard_evdev.cc7
-rw-r--r--chromium/ui/events/ozone/evdev/keyboard_util_evdev.cc35
-rw-r--r--chromium/ui/events/ozone/evdev/keyboard_util_evdev.h17
-rw-r--r--chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc7
-rw-r--r--chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h1
-rw-r--r--chromium/ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.cc10
-rw-r--r--chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc2
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc14
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.cc12
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.h2
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory_unittest.cc4
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc30816
-rw-r--r--chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h4
-rw-r--r--chromium/ui/events/ozone/layout/BUILD.gn1
-rw-r--r--chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc33
-rw-r--r--chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h9
-rw-r--r--chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc38
-rw-r--r--chromium/ui/events/platform/x11/BUILD.gn2
-rw-r--r--chromium/ui/events/platform/x11/x11_event_source.cc18
-rw-r--r--chromium/ui/events/platform/x11/x11_event_source.h2
-rw-r--r--chromium/ui/events/platform/x11/x11_event_watcher_fdwatch.cc1
-rw-r--r--chromium/ui/events/platform/x11/x11_event_watcher_glib.cc1
-rw-r--r--chromium/ui/events/platform/x11/x11_hotplug_event_handler.cc3
-rw-r--r--chromium/ui/events/x/OWNERS2
-rw-r--r--chromium/ui/events/x/events_x_utils.cc1
-rw-r--r--chromium/ui/events/x/events_x_utils.h1
-rw-r--r--chromium/ui/events/x/keyboard_hook_x11.h3
-rw-r--r--chromium/ui/events/x/x11_event_translation.cc1
-rw-r--r--chromium/ui/events/x/x11_event_translation.h1
-rw-r--r--chromium/ui/events/x/x11_window_event_manager.cc7
-rw-r--r--chromium/ui/events/x/x11_window_event_manager.h2
-rw-r--r--chromium/ui/file_manager/BUILD.gn85
-rw-r--r--chromium/ui/file_manager/audio_player/elements/BUILD.gn145
-rw-r--r--chromium/ui/file_manager/audio_player/js/BUILD.gn89
-rw-r--r--chromium/ui/file_manager/base/gn/js_test_gen_html.gni14
-rw-r--r--chromium/ui/file_manager/base/js/BUILD.gn109
-rw-r--r--chromium/ui/file_manager/externs/BUILD.gn74
-rw-r--r--chromium/ui/file_manager/file_manager/background/js/BUILD.gn267
-rw-r--r--chromium/ui/file_manager/file_manager/common/js/BUILD.gn192
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn84
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn4
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn213
-rw-r--r--chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn2
-rw-r--r--chromium/ui/file_manager/file_manager/test/BUILD.gn1
-rw-r--r--chromium/ui/file_manager/image_loader/BUILD.gn66
-rw-r--r--chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn6
-rw-r--r--chromium/ui/file_manager/video_player/js/BUILD.gn1
-rw-r--r--chromium/ui/gfx/BUILD.gn8
-rw-r--r--chromium/ui/gfx/DIR_METADATA12
-rw-r--r--chromium/ui/gfx/OWNERS3
-rw-r--r--chromium/ui/gfx/android/OWNERS2
-rw-r--r--chromium/ui/gfx/android/android_surface_control_compat.cc (renamed from chromium/ui/gl/android/android_surface_control_compat.cc)15
-rw-r--r--chromium/ui/gfx/android/android_surface_control_compat.h (renamed from chromium/ui/gl/android/android_surface_control_compat.h)23
-rw-r--r--chromium/ui/gfx/android/java_bitmap.cc172
-rw-r--r--chromium/ui/gfx/android/java_bitmap.h31
-rw-r--r--chromium/ui/gfx/animation/BUILD.gn2
-rw-r--r--chromium/ui/gfx/animation/DIR_METADATA12
-rw-r--r--chromium/ui/gfx/animation/OWNERS3
-rw-r--r--chromium/ui/gfx/animation/animation_runner_unittest.cc2
-rw-r--r--chromium/ui/gfx/animation/tween.cc3
-rw-r--r--chromium/ui/gfx/animation/tween.h25
-rw-r--r--chromium/ui/gfx/buffer_types.h4
-rw-r--r--chromium/ui/gfx/buffer_usage_util.cc4
-rw-r--r--chromium/ui/gfx/codec/OWNERS2
-rw-r--r--chromium/ui/gfx/codec/jpeg_codec_unittest.cc2
-rw-r--r--chromium/ui/gfx/color_space.cc97
-rw-r--r--chromium/ui/gfx/color_space.h9
-rw-r--r--chromium/ui/gfx/color_space_unittest.cc73
-rw-r--r--chromium/ui/gfx/color_space_win.cc4
-rw-r--r--chromium/ui/gfx/color_transform.cc136
-rw-r--r--chromium/ui/gfx/color_transform_unittest.cc70
-rw-r--r--chromium/ui/gfx/display_color_spaces.h6
-rw-r--r--chromium/ui/gfx/font_fallback_mac.mm4
-rw-r--r--chromium/ui/gfx/font_fallback_win.cc17
-rw-r--r--chromium/ui/gfx/font_render_params.cc29
-rw-r--r--chromium/ui/gfx/font_render_params.h6
-rw-r--r--chromium/ui/gfx/font_render_params_win.cc2
-rw-r--r--chromium/ui/gfx/geometry/quaternion.cc51
-rw-r--r--chromium/ui/gfx/geometry/quaternion.h4
-rw-r--r--chromium/ui/gfx/geometry/quaternion_unittest.cc64
-rw-r--r--chromium/ui/gfx/gpu_extra_info.cc23
-rw-r--r--chromium/ui/gfx/gpu_extra_info.h71
-rw-r--r--chromium/ui/gfx/gpu_fence.cc4
-rw-r--r--chromium/ui/gfx/gpu_fence.h2
-rw-r--r--chromium/ui/gfx/gpu_fence_handle.cc33
-rw-r--r--chromium/ui/gfx/gpu_fence_handle.h20
-rw-r--r--chromium/ui/gfx/gpu_memory_buffer.cc2
-rw-r--r--chromium/ui/gfx/gpu_memory_buffer.h2
-rw-r--r--chromium/ui/gfx/hdr_metadata.cc (renamed from chromium/ui/gl/hdr_metadata.cc)6
-rw-r--r--chromium/ui/gfx/hdr_metadata.h (renamed from chromium/ui/gl/hdr_metadata.h)18
-rw-r--r--chromium/ui/gfx/icon_util.cc8
-rw-r--r--chromium/ui/gfx/icon_util_unittest.cc41
-rw-r--r--chromium/ui/gfx/image/OWNERS2
-rw-r--r--chromium/ui/gfx/image/image_family_unittest.cc9
-rw-r--r--chromium/ui/gfx/image/image_skia_rep_default.cc7
-rw-r--r--chromium/ui/gfx/image/image_unittest.cc4
-rw-r--r--chromium/ui/gfx/ipc/BUILD.gn5
-rw-r--r--chromium/ui/gfx/ipc/gfx_param_traits.cc33
-rw-r--r--chromium/ui/gfx/ipc/gfx_param_traits.h10
-rw-r--r--chromium/ui/gfx/ipc/gfx_param_traits_macros.h5
-rw-r--r--chromium/ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h4
-rw-r--r--chromium/ui/gfx/linux/BUILD.gn7
-rw-r--r--chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc4
-rw-r--r--chromium/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc2
-rw-r--r--chromium/ui/gfx/linux/gbm_defines.h1
-rw-r--r--chromium/ui/gfx/linux/gbm_util.cc6
-rw-r--r--chromium/ui/gfx/linux/gbm_wrapper.cc6
-rw-r--r--chromium/ui/gfx/linux/gpu_memory_buffer_support_x11.cc2
-rw-r--r--chromium/ui/gfx/linux/native_pixmap_dmabuf.cc3
-rw-r--r--chromium/ui/gfx/linux/native_pixmap_dmabuf.h3
-rw-r--r--chromium/ui/gfx/mac/io_surface.cc10
-rw-r--r--chromium/ui/gfx/mac/io_surface.h3
-rw-r--r--chromium/ui/gfx/mask_filter_info.cc23
-rw-r--r--chromium/ui/gfx/mask_filter_info.h64
-rw-r--r--chromium/ui/gfx/mojom/BUILD.gn54
-rw-r--r--chromium/ui/gfx/mojom/buffer_types.mojom2
-rw-r--r--chromium/ui/gfx/mojom/buffer_types_mojom_traits.cc15
-rw-r--r--chromium/ui/gfx/mojom/buffer_types_mojom_traits.h10
-rw-r--r--chromium/ui/gfx/mojom/gpu_extra_info.mojom31
-rw-r--r--chromium/ui/gfx/mojom/gpu_extra_info_mojom_traits.cc36
-rw-r--r--chromium/ui/gfx/mojom/gpu_extra_info_mojom_traits.h75
-rw-r--r--chromium/ui/gfx/mojom/gpu_fence_handle.mojom6
-rw-r--r--chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.cc23
-rw-r--r--chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.h5
-rw-r--r--chromium/ui/gfx/mojom/hdr_metadata.mojom (renamed from chromium/ui/gl/mojom/hdr_metadata.mojom)6
-rw-r--r--chromium/ui/gfx/mojom/hdr_metadata_mojom_traits.cc (renamed from chromium/ui/gl/mojom/hdr_metadata_mojom_traits.cc)15
-rw-r--r--chromium/ui/gfx/mojom/hdr_metadata_mojom_traits.h58
-rw-r--r--chromium/ui/gfx/mojom/mask_filter_info.mojom12
-rw-r--r--chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc19
-rw-r--r--chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h25
-rw-r--r--chromium/ui/gfx/native_pixmap.h10
-rw-r--r--chromium/ui/gfx/range/OWNERS2
-rw-r--r--chromium/ui/gfx/render_text.cc63
-rw-r--r--chromium/ui/gfx/render_text.h4
-rw-r--r--chromium/ui/gfx/render_text_api_fuzzer.cc34
-rw-r--r--chromium/ui/gfx/render_text_harfbuzz.cc39
-rw-r--r--chromium/ui/gfx/render_text_harfbuzz.h4
-rw-r--r--chromium/ui/gfx/render_text_unittest.cc230
-rw-r--r--chromium/ui/gfx/skbitmap_operations.cc6
-rw-r--r--chromium/ui/gfx/skbitmap_operations_unittest.cc2
-rw-r--r--chromium/ui/gfx/sys_color_change_listener.cc2
-rw-r--r--chromium/ui/gfx/system_fonts_win.h2
-rw-r--r--chromium/ui/gfx/text_elider.cc14
-rw-r--r--chromium/ui/gfx/text_utils.cc6
-rw-r--r--chromium/ui/gfx/transform_util.cc37
-rw-r--r--chromium/ui/gfx/transform_util.h12
-rw-r--r--chromium/ui/gfx/win/direct_write.cc11
-rw-r--r--chromium/ui/gfx/win/hwnd_util.cc2
-rw-r--r--chromium/ui/gfx/win/hwnd_util.h7
-rw-r--r--chromium/ui/gfx/win/text_analysis_source.cc8
-rw-r--r--chromium/ui/gfx/win/text_analysis_source.h15
-rw-r--r--chromium/ui/gfx/win/window_impl.cc17
-rw-r--r--chromium/ui/gfx/x/BUILD.gn53
-rw-r--r--chromium/ui/gfx/x/DEPS3
-rw-r--r--chromium/ui/gfx/x/OWNERS2
-rw-r--r--chromium/ui/gfx/x/connection.cc545
-rw-r--r--chromium/ui/gfx/x/connection.h76
-rw-r--r--chromium/ui/gfx/x/connection_unittest.cc16
-rw-r--r--chromium/ui/gfx/x/error.cc13
-rw-r--r--chromium/ui/gfx/x/error.h26
-rw-r--r--chromium/ui/gfx/x/event.cc13
-rw-r--r--chromium/ui/gfx/x/event.h6
-rw-r--r--chromium/ui/gfx/x/gen_xproto.py134
-rw-r--r--chromium/ui/gfx/x/keyboard_state.cc136
-rw-r--r--chromium/ui/gfx/x/keyboard_state.h37
-rw-r--r--chromium/ui/gfx/x/keysyms/keysyms.h1151
-rw-r--r--chromium/ui/gfx/x/scoped_ignore_errors.cc25
-rw-r--r--chromium/ui/gfx/x/scoped_ignore_errors.h26
-rw-r--r--chromium/ui/gfx/x/x11.h73
-rw-r--r--chromium/ui/gfx/x/x11_atom_cache.cc9
-rw-r--r--chromium/ui/gfx/x/x11_atom_cache.h2
-rw-r--r--chromium/ui/gfx/x/x11_error_tracker.cc41
-rw-r--r--chromium/ui/gfx/x/x11_error_tracker.h37
-rw-r--r--chromium/ui/gfx/x/x11_path.cc1
-rw-r--r--chromium/ui/gfx/x/x11_types.cc22
-rw-r--r--chromium/ui/gfx/x/x11_types.h45
-rw-r--r--chromium/ui/gfx/x/xlib.h17
-rw-r--r--chromium/ui/gfx/x/xlib_support.cc101
-rw-r--r--chromium/ui/gfx/x/xlib_support.h73
-rw-r--r--chromium/ui/gfx/x/xproto_internal.cc1
-rw-r--r--chromium/ui/gfx/x/xproto_internal.h9
-rw-r--r--chromium/ui/gfx/x/xproto_types.cc68
-rw-r--r--chromium/ui/gfx/x/xproto_types.h86
-rw-r--r--chromium/ui/gfx/x/xproto_util.cc62
-rw-r--r--chromium/ui/gfx/x/xproto_util.h6
-rw-r--r--chromium/ui/gl/BUILD.gn16
-rw-r--r--chromium/ui/gl/DEPS4
-rw-r--r--chromium/ui/gl/android/scoped_java_surface.cc8
-rw-r--r--chromium/ui/gl/android/scoped_java_surface.h3
-rw-r--r--chromium/ui/gl/dc_layer_tree.cc55
-rw-r--r--chromium/ui/gl/dc_layer_tree.h35
-rw-r--r--chromium/ui/gl/dc_renderer_layer_params.h4
-rw-r--r--chromium/ui/gl/direct_composition_child_surface_win.cc21
-rw-r--r--chromium/ui/gl/direct_composition_surface_win.cc115
-rw-r--r--chromium/ui/gl/direct_composition_surface_win.h15
-rw-r--r--chromium/ui/gl/direct_composition_surface_win_unittest.cc163
-rw-r--r--chromium/ui/gl/features.gni7
-rwxr-xr-xchromium/ui/gl/generate_bindings.py9
-rw-r--r--chromium/ui/gl/gl_bindings.cc6
-rw-r--r--chromium/ui/gl/gl_bindings.h9
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_gl.cc12
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_gl.h2
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_mock.cc24
-rw-r--r--chromium/ui/gl/gl_bindings_autogen_mock.h8
-rw-r--r--chromium/ui/gl/gl_context_cgl.cc8
-rw-r--r--chromium/ui/gl/gl_context_glx.cc42
-rw-r--r--chromium/ui/gl/gl_context_glx.h5
-rw-r--r--chromium/ui/gl/gl_context_glx_unittest.cc7
-rw-r--r--chromium/ui/gl/gl_fence.cc13
-rw-r--r--chromium/ui/gl/gl_fence_egl.cc17
-rw-r--r--chromium/ui/gl/gl_fence_egl.h2
-rw-r--r--chromium/ui/gl/gl_fence_win.cc175
-rw-r--r--chromium/ui/gl/gl_fence_win.h42
-rw-r--r--chromium/ui/gl/gl_fence_win_unittest.cc125
-rw-r--r--chromium/ui/gl/gl_glx_api_implementation.cc2
-rw-r--r--chromium/ui/gl/gl_image_egl_pixmap.cc9
-rw-r--r--chromium/ui/gl/gl_image_egl_pixmap.h4
-rw-r--r--chromium/ui/gl/gl_image_glx.cc34
-rw-r--r--chromium/ui/gl/gl_image_glx.h6
-rw-r--r--chromium/ui/gl/gl_image_glx_native_pixmap.cc13
-rw-r--r--chromium/ui/gl/gl_image_native_pixmap.cc5
-rw-r--r--chromium/ui/gl/gl_surface_egl.cc2
-rw-r--r--chromium/ui/gl/gl_surface_egl_surface_control.cc72
-rw-r--r--chromium/ui/gl/gl_surface_egl_surface_control.h39
-rw-r--r--chromium/ui/gl/gl_surface_egl_x11.cc16
-rw-r--r--chromium/ui/gl/gl_surface_egl_x11_gles2.cc3
-rw-r--r--chromium/ui/gl/gl_surface_glx.cc202
-rw-r--r--chromium/ui/gl/gl_surface_glx.h10
-rw-r--r--chromium/ui/gl/gl_surface_glx_x11.cc8
-rw-r--r--chromium/ui/gl/gl_switches.cc34
-rw-r--r--chromium/ui/gl/gl_switches.h14
-rw-r--r--chromium/ui/gl/gl_utils.cc48
-rw-r--r--chromium/ui/gl/gl_utils.h22
-rw-r--r--chromium/ui/gl/gl_visual_picker_glx.cc1
-rw-r--r--chromium/ui/gl/glx_util.cc12
-rw-r--r--chromium/ui/gl/glx_util.h11
-rw-r--r--chromium/ui/gl/gpu_switching_manager.cc5
-rw-r--r--chromium/ui/gl/gpu_switching_manager.h6
-rw-r--r--chromium/ui/gl/gpu_switching_observer.h3
-rw-r--r--chromium/ui/gl/hdr_metadata_helper_win.cc2
-rw-r--r--chromium/ui/gl/hdr_metadata_helper_win.h4
-rw-r--r--chromium/ui/gl/init/create_gr_gl_interface.cc6
-rw-r--r--chromium/ui/gl/init/gl_initializer_linux_x11.cc8
-rw-r--r--chromium/ui/gl/mojom/BUILD.gn25
-rw-r--r--chromium/ui/gl/mojom/hdr_metadata_mojom_traits.h58
-rw-r--r--chromium/ui/gl/swap_chain_presenter.cc271
-rw-r--r--chromium/ui/gl/swap_chain_presenter.h35
-rw-r--r--chromium/ui/gl/yuv_to_rgb_converter.cc39
-rw-r--r--chromium/ui/gl/yuv_to_rgb_converter.h2
-rw-r--r--chromium/ui/gtk/BUILD.gn7
-rw-r--r--chromium/ui/gtk/gtk_ui.cc2
-rw-r--r--chromium/ui/gtk/native_theme_gtk.cc4
-rw-r--r--chromium/ui/gtk/select_file_dialog_impl_kde.cc3
-rw-r--r--chromium/ui/gtk/x/BUILD.gn2
-rw-r--r--chromium/ui/gtk/x/gtk_event_loop_x11.cc3
-rw-r--r--chromium/ui/gtk/x/gtk_ui_delegate_x11.cc13
-rw-r--r--chromium/ui/login/account_picker/chromeos_user_pod_row.js2
-rw-r--r--chromium/ui/login/account_picker/user_pod_row.js2
-rw-r--r--chromium/ui/login/display_manager.js71
-rw-r--r--chromium/ui/login/display_manager_types.js7
-rw-r--r--chromium/ui/message_center/BUILD.gn2
-rw-r--r--chromium/ui/message_center/fake_message_center.h5
-rw-r--r--chromium/ui/message_center/message_center_impl.cc6
-rw-r--r--chromium/ui/message_center/message_center_impl.h2
-rw-r--r--chromium/ui/message_center/message_center_impl_unittest.cc51
-rw-r--r--chromium/ui/message_center/message_center_observer.h6
-rw-r--r--chromium/ui/message_center/notification_blocker.h5
-rw-r--r--chromium/ui/message_center/public/cpp/notification.cc16
-rw-r--r--chromium/ui/message_center/public/cpp/notification.h6
-rw-r--r--chromium/ui/message_center/public/cpp/notifier_id.h3
-rw-r--r--chromium/ui/message_center/views/message_view.cc10
-rw-r--r--chromium/ui/message_center/views/message_view.h9
-rw-r--r--chromium/ui/message_center/views/notification_control_buttons_view.cc26
-rw-r--r--chromium/ui/message_center/views/notification_control_buttons_view.h15
-rw-r--r--chromium/ui/message_center/views/notification_header_view.cc10
-rw-r--r--chromium/ui/message_center/views/notification_header_view.h2
-rw-r--r--chromium/ui/message_center/views/notification_header_view_unittest.cc10
-rw-r--r--chromium/ui/message_center/views/notification_view_md.cc199
-rw-r--r--chromium/ui/message_center/views/notification_view_md.h25
-rw-r--r--chromium/ui/message_center/views/notification_view_md_unittest.cc9
-rw-r--r--chromium/ui/message_center/views/padded_button.cc5
-rw-r--r--chromium/ui/message_center/views/padded_button.h2
-rw-r--r--chromium/ui/native_theme/BUILD.gn3
-rw-r--r--chromium/ui/native_theme/common_theme.cc14
-rw-r--r--chromium/ui/native_theme/native_theme.cc20
-rw-r--r--chromium/ui/native_theme/native_theme.h32
-rw-r--r--chromium/ui/native_theme/native_theme_aura.cc8
-rw-r--r--chromium/ui/native_theme/native_theme_base.cc73
-rw-r--r--chromium/ui/native_theme/native_theme_base.h13
-rw-r--r--chromium/ui/native_theme/native_theme_color_id.h5
-rw-r--r--chromium/ui/native_theme/native_theme_features.cc14
-rw-r--r--chromium/ui/native_theme/native_theme_features.h2
-rw-r--r--chromium/ui/native_theme/native_theme_mac.h5
-rw-r--r--chromium/ui/native_theme/native_theme_mac.mm10
-rw-r--r--chromium/ui/native_theme/native_theme_mac_unittest.mm (renamed from chromium/ui/native_theme/native_theme_mac_unittest.cc)25
-rw-r--r--chromium/ui/native_theme/native_theme_win.cc37
-rw-r--r--chromium/ui/native_theme/native_theme_win.h3
-rw-r--r--chromium/ui/native_theme/native_theme_win_unittest.cc31
-rw-r--r--chromium/ui/ozone/BUILD.gn62
-rw-r--r--chromium/ui/ozone/common/BUILD.gn9
-rw-r--r--chromium/ui/ozone/common/features.cc24
-rw-r--r--chromium/ui/ozone/common/features.h17
-rw-r--r--chromium/ui/ozone/common/test/stub_ozone_ui_controls_test_helper.cc44
-rw-r--r--chromium/ui/ozone/common/test/stub_ozone_ui_controls_test_helper.h21
-rw-r--r--chromium/ui/ozone/demo/skia/skia_gl_renderer.cc4
-rw-r--r--chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.cc7
-rw-r--r--chromium/ui/ozone/demo/surfaceless_gl_renderer.cc2
-rwxr-xr-xchromium/ui/ozone/generate_constructor_list.py13
-rwxr-xr-xchromium/ui/ozone/generate_ozone_platform_list.py26
-rw-r--r--chromium/ui/ozone/ozone.gni116
-rw-r--r--chromium/ui/ozone/ozone_extra.gni19
-rw-r--r--chromium/ui/ozone/platform/cast/BUILD.gn4
-rw-r--r--chromium/ui/ozone/platform/cast/surface_factory_cast.cc16
-rw-r--r--chromium/ui/ozone/platform/drm/BUILD.gn2
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/crtc_controller.cc8
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/crtc_controller.h2
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc4
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc2
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc2
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_thread.cc3
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/drm_thread_unittest.cc2
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc2
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.cc22
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.h3
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc4
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.cc26
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.h6
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc292
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h2
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc10
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc5
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h1
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc39
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc16
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h4
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/screen_manager.cc255
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/screen_manager.h45
-rw-r--r--chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc150
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_window_host.cc2
-rw-r--r--chromium/ui/ozone/platform/drm/host/drm_window_host.h2
-rw-r--r--chromium/ui/ozone/platform/drm/host/host_drm_device.cc8
-rw-r--r--chromium/ui/ozone/platform/headless/headless_surface_factory.cc24
-rw-r--r--chromium/ui/ozone/platform/scenic/BUILD.gn4
-rw-r--r--chromium/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc5
-rw-r--r--chromium/ui/ozone/platform/scenic/overlay_manager_scenic.cc44
-rw-r--r--chromium/ui/ozone/platform/scenic/overlay_manager_scenic.h29
-rw-r--r--chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc17
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc91
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_overlay_view.h37
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_screen.cc3
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface.cc223
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface.h48
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc4
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window.cc37
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window.h15
-rw-r--r--chromium/ui/ozone/platform/scenic/scenic_window_canvas.cc4
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc138
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h6
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc146
-rw-r--r--chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h56
-rw-r--r--chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc4
-rw-r--r--chromium/ui/ozone/platform/wayland/BUILD.gn20
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_object.cc47
-rw-r--r--chromium/ui/ozone/platform/wayland/common/wayland_object.h56
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc12
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h3
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc3
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/vulkan_implementation_wayland.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc14
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc4
-rw-r--r--chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc55
-rw-r--r--chromium/ui/ozone/platform/wayland/host/DEPS1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc2
-rw-r--r--chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_offer.cc5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_auxiliary_window.cc1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc30
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_connection.cc61
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_connection.h36
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h35
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc10
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_cursor.h9
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_source.cc21
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_data_source.h5
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc103
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h11
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc10
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.cc23
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h29
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc44
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_popup.cc1
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_screen.cc8
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_screen.h4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc10
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_surface.cc15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_surface.h4
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc21
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window.cc101
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window.h17
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc118
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h19
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc151
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc167
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc50
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h36
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.cc148
-rw-r--r--chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h42
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device.cc72
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device.h50
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc47
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h45
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_offer.cc59
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_offer.h50
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h22
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc15
-rw-r--r--chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h8
-rw-r--r--chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc40
-rw-r--r--chromium/ui/ozone/platform/wayland/ozone_platform_wayland.h6
-rw-r--r--chromium/ui/ozone/platform/wayland/test/wayland_test.cc7
-rw-r--r--chromium/ui/ozone/platform/wayland/wayland.gni2
-rw-r--r--chromium/ui/ozone/platform/x11/BUILD.gn18
-rw-r--r--chromium/ui/ozone/platform/x11/gl_egl_utility_x11.cc12
-rw-r--r--chromium/ui/ozone/platform/x11/gl_egl_utility_x11.h3
-rw-r--r--chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc1
-rw-r--r--chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h1
-rw-r--r--chromium/ui/ozone/platform/x11/ozone_platform_x11.cc37
-rw-r--r--chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc1
-rw-r--r--chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h2
-rw-r--r--chromium/ui/ozone/platform/x11/x11_menu_utils.cc28
-rw-r--r--chromium/ui/ozone/platform/x11/x11_menu_utils.h26
-rw-r--r--chromium/ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.cc60
-rw-r--r--chromium/ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.h51
-rw-r--r--chromium/ui/ozone/platform/x11/x11_screen_ozone.cc18
-rw-r--r--chromium/ui/ozone/platform/x11/x11_screen_ozone.h4
-rw-r--r--chromium/ui/ozone/platform/x11/x11_surface_factory.cc6
-rw-r--r--chromium/ui/ozone/platform/x11/x11_user_input_monitor.cc37
-rw-r--r--chromium/ui/ozone/platform/x11/x11_user_input_monitor.h39
-rw-r--r--chromium/ui/ozone/platform_selection.cc3
-rw-r--r--chromium/ui/ozone/public/DEPS1
-rw-r--r--chromium/ui/ozone/public/ozone_platform.cc13
-rw-r--r--chromium/ui/ozone/public/ozone_platform.h25
-rw-r--r--chromium/ui/ozone/public/ozone_ui_controls_test_helper.cc17
-rw-r--r--chromium/ui/ozone/public/ozone_ui_controls_test_helper.h62
-rw-r--r--chromium/ui/ozone/public/platform_gl_egl_utility.h10
-rw-r--r--chromium/ui/ozone/public/platform_menu_utils.cc25
-rw-r--r--chromium/ui/ozone/public/platform_menu_utils.h36
-rw-r--r--chromium/ui/ozone/public/platform_screen.cc16
-rw-r--r--chromium/ui/ozone/public/platform_screen.h17
-rw-r--r--chromium/ui/ozone/public/platform_user_input_monitor.cc13
-rw-r--r--chromium/ui/ozone/public/platform_user_input_monitor.h49
-rw-r--r--chromium/ui/platform_window/platform_window.h2
-rw-r--r--chromium/ui/platform_window/platform_window_init_properties.cc4
-rw-r--r--chromium/ui/platform_window/platform_window_init_properties.h1
-rw-r--r--chromium/ui/platform_window/stub/stub_window.cc2
-rw-r--r--chromium/ui/platform_window/stub/stub_window.h2
-rw-r--r--chromium/ui/platform_window/win/win_window.cc2
-rw-r--r--chromium/ui/platform_window/win/win_window.h2
-rw-r--r--chromium/ui/platform_window/x11/BUILD.gn2
-rw-r--r--chromium/ui/platform_window/x11/atk_event_conversion.cc7
-rw-r--r--chromium/ui/platform_window/x11/atk_event_conversion.h1
-rw-r--r--chromium/ui/platform_window/x11/x11_topmost_window_finder.h1
-rw-r--r--chromium/ui/platform_window/x11/x11_window.cc3
-rw-r--r--chromium/ui/platform_window/x11/x11_window.h2
-rw-r--r--chromium/ui/resources/BUILD.gn17
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog.cc3
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog.h10
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_mac.mm2
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm25
-rw-r--r--chromium/ui/shell_dialogs/select_file_dialog_win.cc14
-rw-r--r--chromium/ui/snapshot/screenshot_grabber.cc2
-rw-r--r--chromium/ui/snapshot/snapshot_aura_unittest.cc6
-rw-r--r--chromium/ui/snapshot/snapshot_win.cc2
-rw-r--r--chromium/ui/strings/translations/ui_strings_af.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_am.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ar.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_as.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_az.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_be.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_bg.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_bn.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_bs.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ca.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_cs.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_da.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_de.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_el.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_en-GB.xtb10
-rw-r--r--chromium/ui/strings/translations/ui_strings_es-419.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_es.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_et.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_eu.xtb20
-rw-r--r--chromium/ui/strings/translations/ui_strings_fa.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_fi.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_fil.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_fr-CA.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_fr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_gl.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_gu.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_hi.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_hr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_hu.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_hy.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_id.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_is.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_it.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_iw.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ja.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ka.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_kk.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_km.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_kn.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ko.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ky.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_lo.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_lt.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_lv.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_mk.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_ml.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_mn.xtb14
-rw-r--r--chromium/ui/strings/translations/ui_strings_mr.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_ms.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_my.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_ne.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_nl.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_no.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_or.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_pa.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_pl.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_pt-BR.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_pt-PT.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ro.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ru.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_si.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sk.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_sl.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sq.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_sr-Latn.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_sv.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_sw.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ta.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_te.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_th.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_tr.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_uk.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_ur.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_uz.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_vi.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-CN.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-HK.xtb18
-rw-r--r--chromium/ui/strings/translations/ui_strings_zh-TW.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_zu.xtb4
-rw-r--r--chromium/ui/strings/ui_strings.grd22
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_LAUNCHER_ACCESSIBILITY_ANNOUNCEMENT.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_BITMAP_IMAGE.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_HTML_IMAGE.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_TITLE.png.sha11
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_NEW_BADGE.png.sha1 (renamed from chromium/ui/strings/ui_strings_grd/IDS_MENU_ITEM_NEW_BADGE.png.sha1)0
-rw-r--r--chromium/ui/strings/ui_strings_grd/IDS_NEW_BADGE_SCREEN_READER_MESSAGE.png.sha1 (renamed from chromium/ui/strings/ui_strings_grd/IDS_MENU_ITEM_NEW_BADGE_SCREEN_READER_MESSAGE.png.sha1)0
-rw-r--r--chromium/ui/touch_selection/touch_selection_controller.cc17
-rw-r--r--chromium/ui/touch_selection/touch_selection_controller.h5
-rw-r--r--chromium/ui/touch_selection/touch_selection_controller_unittest.cc67
-rw-r--r--chromium/ui/views/.clang-tidy32
-rw-r--r--chromium/ui/views/BUILD.gn36
-rw-r--r--chromium/ui/views/DEPS1
-rw-r--r--chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc3
-rw-r--r--chromium/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc2
-rw-r--r--chromium/ui/views/accessibility/ax_virtual_view_unittest.cc2
-rw-r--r--chromium/ui/views/accessibility/view_accessibility.cc12
-rw-r--r--chromium/ui/views/accessibility/view_accessibility.h5
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate.h3
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc8
-rw-r--r--chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc42
-rw-r--r--chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc2
-rw-r--r--chromium/ui/views/accessible_pane_view.cc1
-rw-r--r--chromium/ui/views/accessible_pane_view_unittest.cc32
-rw-r--r--chromium/ui/views/animation/animation_delegate_views.cc19
-rw-r--r--chromium/ui/views/animation/animation_delegate_views.h8
-rw-r--r--chromium/ui/views/animation/bounds_animator_unittest.cc5
-rw-r--r--chromium/ui/views/animation/compositor_animation_runner.cc26
-rw-r--r--chromium/ui/views/animation/compositor_animation_runner.h17
-rw-r--r--chromium/ui/views/animation/compositor_animation_runner_unittest.cc63
-rw-r--r--chromium/ui/views/animation/ink_drop_host_view.cc1
-rw-r--r--chromium/ui/views/animation/ink_drop_host_view.h4
-rw-r--r--chromium/ui/views/animation/ink_drop_ripple.cc2
-rw-r--r--chromium/ui/views/animation/installable_ink_drop_animator_unittest.cc2
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view.cc86
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view.h31
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc170
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_model_host.cc624
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_model_host.h88
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_model_host_unittest.cc43
-rw-r--r--chromium/ui/views/bubble/bubble_frame_view.cc58
-rw-r--r--chromium/ui/views/bubble/bubble_frame_view.h15
-rw-r--r--chromium/ui/views/bubble/bubble_frame_view_unittest.cc41
-rw-r--r--chromium/ui/views/bubble/footnote_container_view.cc1
-rw-r--r--chromium/ui/views/bubble/info_bubble.cc1
-rw-r--r--chromium/ui/views/bubble/tooltip_icon.cc1
-rw-r--r--chromium/ui/views/button_drag_utils.cc3
-rw-r--r--chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm26
-rw-r--r--chromium/ui/views/cocoa/bridged_native_widget_unittest.mm86
-rw-r--r--chromium/ui/views/color_chooser/color_chooser_unittest.cc163
-rw-r--r--chromium/ui/views/color_chooser/color_chooser_view.cc28
-rw-r--r--chromium/ui/views/color_chooser/color_chooser_view.h17
-rw-r--r--chromium/ui/views/controls/button/button.cc30
-rw-r--r--chromium/ui/views/controls/button/button.h53
-rw-r--r--chromium/ui/views/controls/button/button_unittest.cc74
-rw-r--r--chromium/ui/views/controls/button/checkbox.cc14
-rw-r--r--chromium/ui/views/controls/button/checkbox.h13
-rw-r--r--chromium/ui/views/controls/button/image_button.cc11
-rw-r--r--chromium/ui/views/controls/button/image_button.h13
-rw-r--r--chromium/ui/views/controls/button/image_button_factory.cc25
-rw-r--r--chromium/ui/views/controls/button/image_button_factory.h7
-rw-r--r--chromium/ui/views/controls/button/image_button_factory_unittest.cc6
-rw-r--r--chromium/ui/views/controls/button/image_button_unittest.cc7
-rw-r--r--chromium/ui/views/controls/button/label_button.cc14
-rw-r--r--chromium/ui/views/controls/button/label_button.h20
-rw-r--r--chromium/ui/views/controls/button/label_button_unittest.cc10
-rw-r--r--chromium/ui/views/controls/button/md_text_button.cc14
-rw-r--r--chromium/ui/views/controls/button/md_text_button.h15
-rw-r--r--chromium/ui/views/controls/button/md_text_button_unittest.cc7
-rw-r--r--chromium/ui/views/controls/button/menu_button.cc10
-rw-r--r--chromium/ui/views/controls/button/menu_button.h3
-rw-r--r--chromium/ui/views/controls/button/menu_button_controller.cc10
-rw-r--r--chromium/ui/views/controls/button/menu_button_controller.h3
-rw-r--r--chromium/ui/views/controls/button/menu_button_unittest.cc399
-rw-r--r--chromium/ui/views/controls/button/radio_button.cc1
-rw-r--r--chromium/ui/views/controls/button/toggle_button.cc4
-rw-r--r--chromium/ui/views/controls/button/toggle_button.h1
-rw-r--r--chromium/ui/views/controls/combobox/combobox.cc106
-rw-r--r--chromium/ui/views/controls/combobox/combobox.h37
-rw-r--r--chromium/ui/views/controls/combobox/combobox_unittest.cc51
-rw-r--r--chromium/ui/views/controls/editable_combobox/editable_combobox.cc24
-rw-r--r--chromium/ui/views/controls/editable_combobox/editable_combobox.h11
-rw-r--r--chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc2
-rw-r--r--chromium/ui/views/controls/focus_ring.cc17
-rw-r--r--chromium/ui/views/controls/image_view.cc1
-rw-r--r--chromium/ui/views/controls/image_view.h36
-rw-r--r--chromium/ui/views/controls/label.cc66
-rw-r--r--chromium/ui/views/controls/label.h26
-rw-r--r--chromium/ui/views/controls/label_unittest.cc57
-rw-r--r--chromium/ui/views/controls/link.cc16
-rw-r--r--chromium/ui/views/controls/link.h12
-rw-r--r--chromium/ui/views/controls/link_unittest.cc44
-rw-r--r--chromium/ui/views/controls/menu/menu_closure_animation_mac_unittest.cc2
-rw-r--r--chromium/ui/views/controls/menu/menu_config.h24
-rw-r--r--chromium/ui/views/controls/menu/menu_controller.cc17
-rw-r--r--chromium/ui/views/controls/menu/menu_controller_unittest.cc87
-rw-r--r--chromium/ui/views/controls/menu/menu_host_root_view.cc1
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view.cc85
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view.h7
-rw-r--r--chromium/ui/views/controls/menu/menu_item_view_unittest.cc2
-rw-r--r--chromium/ui/views/controls/menu/menu_runner_impl.cc8
-rw-r--r--chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm24
-rw-r--r--chromium/ui/views/controls/menu/menu_runner_unittest.cc6
-rw-r--r--chromium/ui/views/controls/menu/menu_scroll_view_container.cc1
-rw-r--r--chromium/ui/views/controls/menu/menu_separator.cc1
-rw-r--r--chromium/ui/views/controls/menu/new_badge.cc95
-rw-r--r--chromium/ui/views/controls/menu/new_badge.h80
-rw-r--r--chromium/ui/views/controls/menu/submenu_view.cc1
-rw-r--r--chromium/ui/views/controls/message_box_view.cc3
-rw-r--r--chromium/ui/views/controls/message_box_view_unittest.cc2
-rw-r--r--chromium/ui/views/controls/native/native_view_host.cc5
-rw-r--r--chromium/ui/views/controls/native/native_view_host.h3
-rw-r--r--chromium/ui/views/controls/native/native_view_host_aura.cc5
-rw-r--r--chromium/ui/views/controls/native/native_view_host_aura.h1
-rw-r--r--chromium/ui/views/controls/native/native_view_host_mac.h1
-rw-r--r--chromium/ui/views/controls/native/native_view_host_mac.mm6
-rw-r--r--chromium/ui/views/controls/native/native_view_host_mac_unittest.mm3
-rw-r--r--chromium/ui/views/controls/native/native_view_host_wrapper.h3
-rw-r--r--chromium/ui/views/controls/progress_bar.cc2
-rw-r--r--chromium/ui/views/controls/resize_area.cc1
-rw-r--r--chromium/ui/views/controls/scroll_view.cc192
-rw-r--r--chromium/ui/views/controls/scroll_view.h50
-rw-r--r--chromium/ui/views/controls/scroll_view_unittest.cc364
-rw-r--r--chromium/ui/views/controls/scrollbar/base_scroll_bar_button.cc14
-rw-r--r--chromium/ui/views/controls/scrollbar/base_scroll_bar_button.h2
-rw-r--r--chromium/ui/views/controls/scrollbar/base_scroll_bar_button_unittest.cc55
-rw-r--r--chromium/ui/views/controls/scrollbar/base_scroll_bar_thumb.cc1
-rw-r--r--chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm1
-rw-r--r--chromium/ui/views/controls/scrollbar/overlay_scroll_bar.cc3
-rw-r--r--chromium/ui/views/controls/scrollbar/scroll_bar.cc3
-rw-r--r--chromium/ui/views/controls/scrollbar/scroll_bar_views.cc74
-rw-r--r--chromium/ui/views/controls/scrollbar/scroll_bar_views.h6
-rw-r--r--chromium/ui/views/controls/separator.cc1
-rw-r--r--chromium/ui/views/controls/separator.h4
-rw-r--r--chromium/ui/views/controls/slider.cc8
-rw-r--r--chromium/ui/views/controls/slider.h4
-rw-r--r--chromium/ui/views/controls/styled_label.cc3
-rw-r--r--chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc1
-rw-r--r--chromium/ui/views/controls/table/table_view.cc495
-rw-r--r--chromium/ui/views/controls/table/table_view.h51
-rw-r--r--chromium/ui/views/controls/table/table_view_unittest.cc254
-rw-r--r--chromium/ui/views/controls/textfield/textfield.cc19
-rw-r--r--chromium/ui/views/controls/textfield/textfield.h37
-rw-r--r--chromium/ui/views/controls/textfield/textfield_unittest.cc15
-rw-r--r--chromium/ui/views/controls/throbber.cc1
-rw-r--r--chromium/ui/views/controls/tree/tree_view.cc1
-rw-r--r--chromium/ui/views/controls/views_text_services_context_menu_mac.mm3
-rw-r--r--chromium/ui/views/controls/webview/web_contents_set_background_color.cc1
-rw-r--r--chromium/ui/views/controls/webview/webview.cc89
-rw-r--r--chromium/ui/views/controls/webview/webview.h26
-rw-r--r--chromium/ui/views/controls/webview/webview_unittest.cc252
-rw-r--r--chromium/ui/views/examples/ax_example.cc15
-rw-r--r--chromium/ui/views/examples/ax_example.h9
-rw-r--r--chromium/ui/views/examples/box_layout_example.cc11
-rw-r--r--chromium/ui/views/examples/box_layout_example.h1
-rw-r--r--chromium/ui/views/examples/bubble_example.cc60
-rw-r--r--chromium/ui/views/examples/bubble_example.h16
-rw-r--r--chromium/ui/views/examples/button_example.cc110
-rw-r--r--chromium/ui/views/examples/button_example.h16
-rw-r--r--chromium/ui/views/examples/button_sticker_sheet.cc21
-rw-r--r--chromium/ui/views/examples/button_sticker_sheet.h7
-rw-r--r--chromium/ui/views/examples/checkbox_example.cc14
-rw-r--r--chromium/ui/views/examples/checkbox_example.h12
-rw-r--r--chromium/ui/views/examples/colored_dialog_example.cc22
-rw-r--r--chromium/ui/views/examples/colored_dialog_example.h7
-rw-r--r--chromium/ui/views/examples/combobox_example.cc43
-rw-r--r--chromium/ui/views/examples/dialog_example.cc92
-rw-r--r--chromium/ui/views/examples/dialog_example.h8
-rw-r--r--chromium/ui/views/examples/examples_window.cc2
-rw-r--r--chromium/ui/views/examples/flex_layout_example.cc32
-rw-r--r--chromium/ui/views/examples/flex_layout_example.h1
-rw-r--r--chromium/ui/views/examples/label_example.cc48
-rw-r--r--chromium/ui/views/examples/label_example.h7
-rw-r--r--chromium/ui/views/examples/layout_example_base.cc33
-rw-r--r--chromium/ui/views/examples/layout_example_base.h19
-rw-r--r--chromium/ui/views/examples/link_example.cc8
-rw-r--r--chromium/ui/views/examples/login_bubble_dialog_example.cc14
-rw-r--r--chromium/ui/views/examples/login_bubble_dialog_example.h6
-rw-r--r--chromium/ui/views/examples/menu_example.cc18
-rw-r--r--chromium/ui/views/examples/message_box_example.cc36
-rw-r--r--chromium/ui/views/examples/message_box_example.h12
-rw-r--r--chromium/ui/views/examples/multiline_example.cc30
-rw-r--r--chromium/ui/views/examples/multiline_example.h7
-rw-r--r--chromium/ui/views/examples/progress_bar_example.cc16
-rw-r--r--chromium/ui/views/examples/progress_bar_example.h9
-rw-r--r--chromium/ui/views/examples/radio_button_example.cc28
-rw-r--r--chromium/ui/views/examples/radio_button_example.h12
-rw-r--r--chromium/ui/views/examples/scroll_view_example.cc61
-rw-r--r--chromium/ui/views/examples/scroll_view_example.h19
-rw-r--r--chromium/ui/views/examples/tabbed_pane_example.cc43
-rw-r--r--chromium/ui/views/examples/tabbed_pane_example.h9
-rw-r--r--chromium/ui/views/examples/table_example.cc58
-rw-r--r--chromium/ui/views/examples/table_example.h7
-rw-r--r--chromium/ui/views/examples/text_example.cc9
-rw-r--r--chromium/ui/views/examples/text_example.h10
-rw-r--r--chromium/ui/views/examples/textfield_example.cc125
-rw-r--r--chromium/ui/views/examples/textfield_example.h10
-rw-r--r--chromium/ui/views/examples/toggle_button_example.cc12
-rw-r--r--chromium/ui/views/examples/toggle_button_example.h7
-rw-r--r--chromium/ui/views/examples/tree_view_example.cc46
-rw-r--r--chromium/ui/views/examples/tree_view_example.h8
-rw-r--r--chromium/ui/views/examples/vector_example.cc14
-rw-r--r--chromium/ui/views/examples/widget_example.cc123
-rw-r--r--chromium/ui/views/examples/widget_example.h31
-rw-r--r--chromium/ui/views/focus/focus_manager.cc17
-rw-r--r--chromium/ui/views/focus/focus_manager.h24
-rw-r--r--chromium/ui/views/focus/focus_manager_factory.h4
-rw-r--r--chromium/ui/views/focus/focus_manager_unittest.cc102
-rw-r--r--chromium/ui/views/focus/focus_search.cc10
-rw-r--r--chromium/ui/views/focus/focus_traversal_unittest.cc22
-rw-r--r--chromium/ui/views/layout/box_layout.cc26
-rw-r--r--chromium/ui/views/layout/box_layout.h28
-rw-r--r--chromium/ui/views/layout/box_layout_view.cc135
-rw-r--r--chromium/ui/views/layout/box_layout_view.h83
-rw-r--r--chromium/ui/views/layout/box_layout_view_unittest.cc100
-rw-r--r--chromium/ui/views/layout/flex_layout_view.cc93
-rw-r--r--chromium/ui/views/layout/flex_layout_view.h26
-rw-r--r--chromium/ui/views/layout/flex_layout_view_unittest.cc101
-rw-r--r--chromium/ui/views/layout/layout_manager_base_unittest.cc2
-rw-r--r--chromium/ui/views/layout/layout_provider.cc91
-rw-r--r--chromium/ui/views/layout/layout_provider.h13
-rw-r--r--chromium/ui/views/metadata/metadata_types.cc19
-rw-r--r--chromium/ui/views/metadata/metadata_types.h14
-rw-r--r--chromium/ui/views/metadata/property_metadata.h25
-rw-r--r--chromium/ui/views/metadata/type_conversion.cc31
-rw-r--r--chromium/ui/views/metadata/type_conversion.h18
-rw-r--r--chromium/ui/views/metadata/type_conversion_unittest.cc101
-rw-r--r--chromium/ui/views/metadata/view_factory.h98
-rw-r--r--chromium/ui/views/metadata/view_factory_internal.h36
-rw-r--r--chromium/ui/views/metadata/view_factory_unittest.cc8
-rw-r--r--chromium/ui/views/style/platform_style.cc20
-rw-r--r--chromium/ui/views/style/platform_style.h13
-rw-r--r--chromium/ui/views/style/platform_style_mac.mm8
-rw-r--r--chromium/ui/views/test/test_desktop_screen_ozone.cc26
-rw-r--r--chromium/ui/views/test/test_desktop_screen_ozone.h50
-rw-r--r--chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc177
-rw-r--r--chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.h20
-rw-r--r--chromium/ui/views/touchui/touch_selection_menu_views.cc42
-rw-r--r--chromium/ui/views/touchui/touch_selection_menu_views.h12
-rw-r--r--chromium/ui/views/view.cc32
-rw-r--r--chromium/ui/views/view.h34
-rw-r--r--chromium/ui/views/view_class_properties.cc5
-rw-r--r--chromium/ui/views/view_class_properties.h7
-rw-r--r--chromium/ui/views/view_unittest.cc84
-rw-r--r--chromium/ui/views/views_features.cc13
-rw-r--r--chromium/ui/views/widget/any_widget_observer.cc2
-rw-r--r--chromium/ui/views/widget/any_widget_observer_unittest.cc2
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc2
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc5
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc4
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_position_client.cc2
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc3
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc1
-rw-r--r--chromium/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc4
-rw-r--r--chromium/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc15
-rw-r--r--chromium/ui/views/widget/native_widget_aura.cc15
-rw-r--r--chromium/ui/views/widget/native_widget_aura_unittest.cc19
-rw-r--r--chromium/ui/views/widget/native_widget_mac_unittest.mm70
-rw-r--r--chromium/ui/views/widget/root_view.cc1
-rw-r--r--chromium/ui/views/widget/unique_widget_ptr.cc6
-rw-r--r--chromium/ui/views/widget/unique_widget_ptr.h6
-rw-r--r--chromium/ui/views/widget/widget.cc28
-rw-r--r--chromium/ui/views/widget/widget.h14
-rw-r--r--chromium/ui/views/widget/widget_delegate.cc102
-rw-r--r--chromium/ui/views/widget/widget_delegate.h76
-rw-r--r--chromium/ui/views/widget/widget_delegate_unittest.cc117
-rw-r--r--chromium/ui/views/widget/widget_unittest.cc232
-rw-r--r--chromium/ui/views/widget/widget_utils.cc22
-rw-r--r--chromium/ui/views/widget/widget_utils.h31
-rw-r--r--chromium/ui/views/win/DEPS2
-rw-r--r--chromium/ui/views/win/hwnd_message_handler.cc48
-rw-r--r--chromium/ui/views/win/hwnd_message_handler.h8
-rw-r--r--chromium/ui/views/win/hwnd_util_aurawin.cc3
-rw-r--r--chromium/ui/views/window/client_view.cc14
-rw-r--r--chromium/ui/views/window/client_view.h1
-rw-r--r--chromium/ui/views/window/custom_frame_view.cc32
-rw-r--r--chromium/ui/views/window/custom_frame_view.h9
-rw-r--r--chromium/ui/views/window/dialog_client_view.cc61
-rw-r--r--chromium/ui/views/window/dialog_client_view.h10
-rw-r--r--chromium/ui/views/window/dialog_client_view_unittest.cc55
-rw-r--r--chromium/ui/views/window/dialog_delegate.h7
-rw-r--r--chromium/ui/views/window/dialog_delegate_unittest.cc2
-rw-r--r--chromium/ui/views/window/frame_caption_button.cc7
-rw-r--r--chromium/ui/views/window/frame_caption_button.h2
-rw-r--r--chromium/ui/views/window/frame_caption_button_unittest.cc16
-rw-r--r--chromium/ui/views/window/non_client_view.cc14
-rw-r--r--chromium/ui/views/window/non_client_view.h19
-rw-r--r--chromium/ui/views/window/vector_icons/BUILD.gn2
-rw-r--r--chromium/ui/views_content_client/views_content_client.h2
-rw-r--r--chromium/ui/web_dialogs/web_dialog_ui.cc2
-rw-r--r--chromium/ui/webui/BUILD.gn2
-rw-r--r--chromium/ui/webui/DIR_METADATA11
-rw-r--r--chromium/ui/webui/OWNERS2
-rw-r--r--chromium/ui/webui/PLATFORM_OWNERS2
-rw-r--r--chromium/ui/webui/mojo_bubble_web_ui_controller.cc17
-rw-r--r--chromium/ui/webui/mojo_bubble_web_ui_controller.h44
-rw-r--r--chromium/ui/webui/resources/BUILD.gn219
-rw-r--r--chromium/ui/webui/resources/PRESUBMIT.py4
-rw-r--r--chromium/ui/webui/resources/cr_components/BUILD.gn281
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.html10
-rw-r--r--chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.js30
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/DIR_METADATA11
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/OWNERS2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn86
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.html151
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js300
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_camera.svg1
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_checked.svg1
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_switch_camera.svg1
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html31
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html9
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html29
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js74
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js45
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.html55
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.js29
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.html56
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js58
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.html1
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js52
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_selection_flow.js45
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/DIR_METADATA11
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/OWNERS2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn12
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/DIR_METADATA11
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js36
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js5
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js120
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list.html16
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list.js82
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html86
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js46
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.js4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html19
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js242
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.html12
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.js6
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js3
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_select.html1
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/network_select.js2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js62
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn20
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.html92
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js185
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.html4
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.js15
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/test_canceled.pngbin0 -> 743 bytes
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/test_failed.pngbin0 -> 687 bytes
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/test_not_run.pngbin0 -> 206 bytes
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/test_passed.pngbin0 -> 484 bytes
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/network_health/test_warning.pngbin0 -> 731 bytes
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni8
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/DIR_METADATA11
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/OWNERS2
-rw-r--r--chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html24
-rw-r--r--chromium/ui/webui/resources/cr_components/cr_components_images.grdp29
-rw-r--r--chromium/ui/webui/resources/cr_components/cr_components_resources.grdp390
-rw-r--r--chromium/ui/webui/resources/cr_components/cr_components_resources_v3.grdp296
-rw-r--r--chromium/ui/webui/resources/cr_components/customize_themes/DIR_METADATA11
-rw-r--r--chromium/ui/webui/resources/cr_components/customize_themes/OWNERS2
-rw-r--r--chromium/ui/webui/resources/cr_components/omnibox/DIR_METADATA11
-rw-r--r--chromium/ui/webui/resources/cr_components/omnibox/OWNERS2
-rw-r--r--chromium/ui/webui/resources/cr_elements/BUILD.gn225
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/DIR_METADATA11
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/OWNERS2
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn44
-rw-r--r--chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html8
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html1
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js10
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html45
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html2
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html6
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js19
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html7
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js31
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_icons_css.html4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html3
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_menu_selector/BUILD.gn22
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.html1
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.js107
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js5
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn1
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html5
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_search_field/BUILD.gn1
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toast/BUILD.gn3
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.html3
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.js73
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html1
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js4
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn3
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html59
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js48
-rw-r--r--chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html7
-rw-r--r--chromium/ui/webui/resources/cr_elements/icons.html10
-rw-r--r--chromium/ui/webui/resources/cr_elements/mwb_shared_style.html4
-rw-r--r--chromium/ui/webui/resources/cr_elements/mwb_shared_vars.html4
-rw-r--r--chromium/ui/webui/resources/cr_elements_images.grdp46
-rw-r--r--chromium/ui/webui/resources/cr_elements_resources.grdp308
-rw-r--r--chromium/ui/webui/resources/cr_elements_resources_v3.grdp254
-rw-r--r--chromium/ui/webui/resources/cr_polymer_resources.grdp40
-rw-r--r--chromium/ui/webui/resources/cr_polymer_resources_v3.grdp19
-rw-r--r--chromium/ui/webui/resources/css/BUILD.gn57
-rw-r--r--chromium/ui/webui/resources/html/BUILD.gn62
-rw-r--r--chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close.pngbin143 -> 0 bytes
-rw-r--r--chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close_hover.pngbin154 -> 0 bytes
-rw-r--r--chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close_pressed.pngbin158 -> 0 bytes
-rw-r--r--chromium/ui/webui/resources/images/apps/button_butter_bar_close.pngbin103 -> 0 bytes
-rw-r--r--chromium/ui/webui/resources/images/apps/button_butter_bar_close_hover.pngbin112 -> 0 bytes
-rw-r--r--chromium/ui/webui/resources/images/apps/button_butter_bar_close_pressed.pngbin115 -> 0 bytes
-rw-r--r--chromium/ui/webui/resources/images/google_logo.svg1
-rw-r--r--chromium/ui/webui/resources/images/icon_edit.svg1
-rw-r--r--chromium/ui/webui/resources/js/BUILD.gn125
-rw-r--r--chromium/ui/webui/resources/js/action_link.js4
-rw-r--r--chromium/ui/webui/resources/js/cr.gni43
-rw-r--r--chromium/ui/webui/resources/js/cr.js20
-rw-r--r--chromium/ui/webui/resources/js/cr.m.js169
-rw-r--r--chromium/ui/webui/resources/js/cr/BUILD.gn27
-rw-r--r--chromium/ui/webui/resources/js/cr/ui.js15
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/BUILD.gn342
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/array_data_model.js12
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/command.js41
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js17
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/dialogs.js9
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js11
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/grid.js24
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list.js34
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list_item.js31
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js6
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list_selection_model.js6
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list_single_selection_model.js6
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/menu.js26
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/menu_button.js20
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/menu_item.js46
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/position_util.js8
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/splitter.js6
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/tabs.js34
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/tree.js17
-rw-r--r--chromium/ui/webui/resources/js/ios/DIR_METADATA10
-rw-r--r--chromium/ui/webui/resources/js/ios/OWNERS3
-rw-r--r--chromium/ui/webui/resources/js/jstemplate_compiled.js13
-rw-r--r--chromium/ui/webui/resources/js/util.js105
-rw-r--r--chromium/ui/webui/resources/js/webui_resource_test.js4
-rw-r--r--chromium/ui/webui/resources/polymer_resources.grdp327
-rw-r--r--chromium/ui/webui/resources/polymer_resources_v3.grdp193
-rw-r--r--chromium/ui/webui/resources/roboto/DIR_METADATA11
-rw-r--r--chromium/ui/webui/resources/roboto/OWNERS2
-rw-r--r--chromium/ui/webui/resources/tools/generate_grd.gni47
-rw-r--r--chromium/ui/webui/resources/tools/generate_grd.py120
-rwxr-xr-xchromium/ui/webui/resources/tools/generate_grd_test.py124
-rw-r--r--chromium/ui/webui/resources/tools/js_modulizer.gni6
-rw-r--r--chromium/ui/webui/resources/webui_resources.grd355
-rw-r--r--chromium/ui/webui/webui_allowlist_provider.cc5
-rw-r--r--chromium/ui/webui/webui_allowlist_provider.h2
-rw-r--r--chromium/ui/webui/webui_features.gni6
-rw-r--r--chromium/ui/wm/core/default_screen_position_client.cc6
-rw-r--r--chromium/ui/wm/core/default_screen_position_client.h5
-rw-r--r--chromium/ui/wm/core/window_animations.cc6
1427 files changed, 42406 insertions, 31540 deletions
diff --git a/chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm b/chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm
index 06ea2a18063..a850776871b 100644
--- a/chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm
+++ b/chromium/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm
@@ -773,84 +773,103 @@ TEST_F(CALayerTreeTest, AVLayer) {
CreateGLImage(gfx::Size(256, 256), gfx::BufferFormat::BGRA_8888, false);
std::unique_ptr<ui::CARendererLayerTree> ca_layer_tree;
- CALayer* content_layer1 = nil;
- CALayer* content_layer2 = nil;
- CALayer* content_layer3 = nil;
- CALayer* content_layer4 = nil;
+ CALayer* content_layer_old = nil;
+ CALayer* content_layer_new = nil;
// Validate the initial values.
{
UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
- content_layer1 = GetOnlyContentLayer();
-
- // Validate the content layer.
- EXPECT_FALSE([content_layer1
+ content_layer_new = GetOnlyContentLayer();
+ EXPECT_FALSE([content_layer_new
isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
}
+ content_layer_old = content_layer_new;
+ // Pass a YUV 420 frame. This will become an AVSampleBufferDisplayLayer
+ // because it is in fullscreen low power mode.
properties.gl_image = CreateGLImage(
gfx::Size(256, 256), gfx::BufferFormat::YUV_420_BIPLANAR, false);
-
- // Pass another frame. This will automatically create a CVPixelBuffer
- // behind the scenes, because the underlying buffer is YUV 420.
{
UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
- content_layer2 = GetOnlyContentLayer();
-
- // Validate the content layer.
- EXPECT_TRUE([content_layer2
+ content_layer_new = GetOnlyContentLayer();
+ EXPECT_TRUE([content_layer_new
isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
- EXPECT_NE(content_layer2, content_layer1);
+ EXPECT_NE(content_layer_new, content_layer_old);
}
+ content_layer_old = content_layer_new;
+ // Pass a similar frame. Nothing should change.
properties.gl_image = CreateGLImage(
- gfx::Size(256, 256), gfx::BufferFormat::YUV_420_BIPLANAR, true);
+ gfx::Size(256, 128), gfx::BufferFormat::YUV_420_BIPLANAR, false);
+ {
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
+ content_layer_new = GetOnlyContentLayer();
+ EXPECT_TRUE([content_layer_new
+ isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
+ EXPECT_EQ(content_layer_new, content_layer_old);
+ }
+ content_layer_old = content_layer_new;
- // Pass a frame with a CVPixelBuffer.
+ // Break fullscreen low power mode by changing opacity. This should cause
+ // us to drop out of using AVSampleBufferDisplayLayer.
+ properties.opacity = 0.9;
{
UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
- content_layer3 = GetOnlyContentLayer();
+ content_layer_new = GetOnlyContentLayer();
+ EXPECT_FALSE([content_layer_new
+ isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
+ EXPECT_NE(content_layer_new, content_layer_old);
+ }
+ content_layer_old = content_layer_new;
- // Validate the content layer.
- EXPECT_TRUE([content_layer3
+ // Now try a P010 frame. Because this may be HDR, we should jump back to
+ // having an AVSampleBufferDisplayLayer.
+ properties.gl_image =
+ CreateGLImage(gfx::Size(128, 256), gfx::BufferFormat::P010, false);
+ {
+ UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
+ content_layer_new = GetOnlyContentLayer();
+ EXPECT_TRUE([content_layer_new
isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
- EXPECT_EQ(content_layer3, content_layer2);
+ EXPECT_NE(content_layer_new, content_layer_old);
}
+ content_layer_old = content_layer_new;
- properties.gl_image = CreateGLImage(
- gfx::Size(513, 512), gfx::BufferFormat::YUV_420_BIPLANAR, true);
+ // Go back to testing AVSampleBufferLayer and fullscreen low power.
+ properties.opacity = 1.0;
// Pass a frame with a CVPixelBuffer which, when scaled down, will have a
// fractional dimension.
+ properties.gl_image = CreateGLImage(
+ gfx::Size(513, 512), gfx::BufferFormat::YUV_420_BIPLANAR, true);
{
UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
- content_layer3 = GetOnlyContentLayer();
+ content_layer_new = GetOnlyContentLayer();
// Validate that the layer's size is adjusted to include the fractional
// width, which works around a macOS bug (https://crbug.com/792632).
- CGSize layer_size = content_layer3.bounds.size;
+ CGSize layer_size = content_layer_new.bounds.size;
EXPECT_EQ(256.5, layer_size.width);
EXPECT_EQ(256, layer_size.height);
}
-
- properties.gl_image = CreateGLImage(
- gfx::Size(256, 256), gfx::BufferFormat::YUV_420_BIPLANAR, false);
+ content_layer_old = content_layer_new;
// Pass a frame that is clipped.
properties.contents_rect = gfx::RectF(0, 0, 1, 0.9);
+ properties.gl_image = CreateGLImage(
+ gfx::Size(256, 256), gfx::BufferFormat::YUV_420_BIPLANAR, false);
{
UpdateCALayerTree(ca_layer_tree, &properties, superlayer_);
- content_layer4 = GetOnlyContentLayer();
-
- // Validate the content layer.
- EXPECT_FALSE([content_layer4
+ content_layer_new = GetOnlyContentLayer();
+ EXPECT_FALSE([content_layer_new
isKindOfClass:NSClassFromString(@"AVSampleBufferDisplayLayer")]);
- EXPECT_NE(content_layer4, content_layer3);
+ EXPECT_NE(content_layer_new, content_layer_old);
}
+ content_layer_old = content_layer_new;
}
-// Ensure that blacklisting AVSampleBufferDisplayLayer works.
-TEST_F(CALayerTreeTest, AVLayerBlacklist) {
+// Ensure that blocklisting AVSampleBufferDisplayLayer works.
+TEST_F(CALayerTreeTest, AVLayerBlocklist) {
CALayerProperties properties;
properties.gl_image = CreateGLImage(
gfx::Size(256, 256), gfx::BufferFormat::YUV_420_BIPLANAR, false);
diff --git a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h
index 3a3481198f7..60459a38297 100644
--- a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h
+++ b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.h
@@ -90,9 +90,10 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
bool AddContentLayer(CARendererLayerTree* tree,
const CARendererLayerParams& params);
- // Workaround for https://crbug.com/923427. Only allow any
- // AVSampleBufferDisplayLayer if there is exactly one video quad.
- void EnforceOnlyOneAVLayer();
+ // Downgrade all downgradeable AVSampleBufferDisplayLayers to be normal
+ // CALayers.
+ // https://crbug.com/923427, https://crbug.com/1143477
+ void DowngradeAVLayersToCALayers();
// Allocate CALayers for this layer and its children, and set their
// properties appropriately. Re-use the CALayers from |old_layer| if
@@ -200,6 +201,13 @@ class ACCELERATED_WIDGET_MAC_EXPORT CARendererLayerTree {
NSString* const ca_filter = nil;
CALayerType type = CALayerType::kDefault;
+
+ // If |type| is CALayerType::kVideo and |video_type_can_downgrade| then
+ // |type| can be downgraded to kDefault. This can be set to false for
+ // HDR video (that cannot be displayed by a regular CALayer) or for
+ // protected content (see https://crbug.com/1026703).
+ bool video_type_can_downgrade = true;
+
base::scoped_nsobject<CALayer> ca_layer;
// If this layer's contents can be represented as an
diff --git a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
index 2b3c3548368..d67941273ae 100644
--- a/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
+++ b/chromium/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm
@@ -268,23 +268,14 @@ bool CARendererLayerTree::RootLayer::WantsFullcreenLowPowerBackdrop() const {
return found_video_layer;
}
-void CARendererLayerTree::RootLayer::EnforceOnlyOneAVLayer() {
- size_t video_layer_count = 0;
+void CARendererLayerTree::RootLayer::DowngradeAVLayersToCALayers() {
for (auto& clip_layer : clip_and_sorting_layers) {
for (auto& transform_layer : clip_layer.transform_layers) {
for (auto& content_layer : transform_layer.content_layers) {
- if (content_layer.type == CALayerType::kVideo)
- video_layer_count += 1;
- }
- }
- }
- if (video_layer_count <= 1)
- return;
- for (auto& clip_layer : clip_and_sorting_layers) {
- for (auto& transform_layer : clip_layer.transform_layers) {
- for (auto& content_layer : transform_layer.content_layers) {
- if (content_layer.type == CALayerType::kVideo)
+ if (content_layer.type == CALayerType::kVideo &&
+ content_layer.video_type_can_downgrade) {
content_layer.type = CALayerType::kDefault;
+ }
}
}
}
@@ -443,18 +434,21 @@ CARendererLayerTree::ContentLayer::ContentLayer(
if (metal::ShouldUseHDRCopier(io_surface, io_surface_color_space)) {
type = CALayerType::kHDRCopier;
} else if (io_surface) {
- switch (IOSurfaceGetPixelFormat(io_surface)) {
- case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
- case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange:
- // Only allow 4:2:0 frames which fill the layer's contents to be
- // promoted to AV layers.
- if (tree->allow_av_sample_buffer_display_layer_ &&
- contents_rect == gfx::RectF(0, 0, 1, 1)) {
+ // Only allow 4:2:0 frames which fill the layer's contents to be
+ // promoted to AV layers.
+ if (tree->allow_av_sample_buffer_display_layer_ &&
+ contents_rect == gfx::RectF(0, 0, 1, 1)) {
+ switch (IOSurfaceGetPixelFormat(io_surface)) {
+ case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
type = CALayerType::kVideo;
- }
- break;
- default:
- break;
+ break;
+ case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange:
+ type = CALayerType::kVideo;
+ video_type_can_downgrade = false;
+ break;
+ default:
+ break;
+ }
}
}
@@ -498,6 +492,7 @@ CARendererLayerTree::ContentLayer::ContentLayer(ContentLayer&& layer)
opacity(layer.opacity),
ca_filter(layer.ca_filter),
type(layer.type),
+ video_type_can_downgrade(layer.video_type_can_downgrade),
ca_layer(std::move(layer.ca_layer)),
av_layer(std::move(layer.av_layer)) {
DCHECK(!layer.ca_layer);
@@ -609,9 +604,9 @@ void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
DLOG(ERROR) << "CARendererLayerTree root layer not attached to tree.";
}
- EnforceOnlyOneAVLayer();
-
if (WantsFullcreenLowPowerBackdrop()) {
+ // In fullscreen low power mode there exists a single video layer on a
+ // solid black background.
const gfx::RectF bg_rect(
ScaleSize(gfx::SizeF(pixel_size), 1 / scale_factor));
if (gfx::RectF([ca_layer frame]) != bg_rect)
@@ -623,6 +618,16 @@ void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer,
[ca_layer setFrame:CGRectZero];
if ([ca_layer backgroundColor])
[ca_layer setBackgroundColor:nil];
+ // We know that we are not in fullscreen low power mode, so there is no
+ // power savings (and a slight power cost) to using
+ // AVSampleBufferDisplayLayer.
+ // https://crbug.com/1143477
+ // We also want to minimize our use of AVSampleBufferDisplayLayer because we
+ // don't track which video element corresponded to which CALayer, and
+ // AVSampleBufferDisplayLayer is not updated with the CATransaction.
+ // Combined, these can result in result in videos jumping around.
+ // https://crbug.com/923427
+ DowngradeAVLayersToCALayers();
}
for (size_t i = 0; i < clip_and_sorting_layers.size(); ++i) {
diff --git a/chromium/ui/accessibility/BUILD.gn b/chromium/ui/accessibility/BUILD.gn
index 7fd8ad81027..4c192cb260d 100644
--- a/chromium/ui/accessibility/BUILD.gn
+++ b/chromium/ui/accessibility/BUILD.gn
@@ -238,6 +238,7 @@ test("accessibility_unittests") {
"platform/ax_platform_node_unittest.cc",
"platform/ax_platform_node_unittest.h",
"platform/ax_unique_id_unittest.cc",
+ "platform/inspect/property_node_unittest.cc",
"run_all_unittests.cc",
]
diff --git a/chromium/ui/accessibility/PRESUBMIT.py b/chromium/ui/accessibility/PRESUBMIT.py
index 3d104cc9c38..0cbcf9bd9e6 100644
--- a/chromium/ui/accessibility/PRESUBMIT.py
+++ b/chromium/ui/accessibility/PRESUBMIT.py
@@ -59,8 +59,6 @@ def GetEnumsFromFile(fullpath):
enum_value = CamelToLowerHacker(enum_value[1:])
if enum_value == 'none' or enum_value == 'last':
continue
- if enum_value == 'active_descendant_changed':
- enum_value = 'activedescendantchanged'
enums[enum_name].append(enum_value)
return enums
@@ -71,7 +69,8 @@ def CheckMatchingEnum(ax_enums,
automation_enum_name,
errs,
output_api,
- strict_ordering=False):
+ strict_ordering=False,
+ allow_extra_destination_enums=False):
if ax_enum_name not in ax_enums:
errs.append(output_api.PresubmitError(
'Expected %s to have an enum named %s' % (AX_MOJOM, ax_enum_name)))
@@ -113,12 +112,13 @@ def CheckMatchingEnum(ax_enums,
automation_enum_name, InitialLowerCamelCase(value),
AUTOMATION_IDL)))
# Should be no remaining items
- for value in dst:
- errs.append(output_api.PresubmitError(
- 'Found %s.%s in %s, but did not find %s.%s in %s' % (
- automation_enum_name, value, AUTOMATION_IDL,
- ax_enum_name, InitialLowerCamelCase(value),
- AX_MOJOM)))
+ if not allow_extra_destination_enums:
+ for value in dst:
+ errs.append(output_api.PresubmitError(
+ 'Found %s.%s in %s, but did not find %s.%s in %s' % (
+ automation_enum_name, value, AUTOMATION_IDL,
+ ax_enum_name, InitialLowerCamelCase(value),
+ AX_MOJOM)))
def CheckEnumsMatch(input_api, output_api):
repo_root = input_api.change.RepositoryRoot()
@@ -138,7 +138,7 @@ def CheckEnumsMatch(input_api, output_api):
CheckMatchingEnum(ax_enums, 'Action', automation_enums, 'ActionType', errs,
output_api, strict_ordering=True)
CheckMatchingEnum(ax_enums, 'Event', automation_enums, 'EventType', errs,
- output_api)
+ output_api, allow_extra_destination_enums=True)
CheckMatchingEnum(ax_enums, 'NameFrom', automation_enums, 'NameFromType',
errs, output_api)
CheckMatchingEnum(ax_enums, 'DescriptionFrom', automation_enums,
diff --git a/chromium/ui/accessibility/accessibility_features.cc b/chromium/ui/accessibility/accessibility_features.cc
index 0be1f155a3d..57377907436 100644
--- a/chromium/ui/accessibility/accessibility_features.cc
+++ b/chromium/ui/accessibility/accessibility_features.cc
@@ -21,13 +21,25 @@ bool IsAccessibilityExposeDisplayNoneEnabled() {
// Enable exposing the <html> element to the browser process AXTree
// (as an ignored node).
const base::Feature kEnableAccessibilityExposeHTMLElement{
- "AccessibilityExposeHTMLElement", base::FEATURE_DISABLED_BY_DEFAULT};
+ "AccessibilityExposeHTMLElement", base::FEATURE_ENABLED_BY_DEFAULT};
bool IsAccessibilityExposeHTMLElementEnabled() {
return base::FeatureList::IsEnabled(
::features::kEnableAccessibilityExposeHTMLElement);
}
+// Enable exposing ignored nodes from Blink to the browser process AXTree.
+// This will allow us to simplify logic by eliminating the distiction between
+// "ignored and included in the tree" from "ignored and not included in the
+// tree".
+const base::Feature kEnableAccessibilityExposeIgnoredNodes{
+ "AccessibilityExposeIgnoredNodes", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsAccessibilityExposeIgnoredNodesEnabled() {
+ return base::FeatureList::IsEnabled(
+ ::features::kEnableAccessibilityExposeIgnoredNodes);
+}
+
// Enable language detection to determine language used in page text, exposed
// on the browser process AXTree.
const base::Feature kEnableAccessibilityLanguageDetection{
@@ -71,6 +83,13 @@ const base::Feature kAccessibilityCursorColor{"AccessibilityCursorColor",
bool IsAccessibilityCursorColorEnabled() {
return base::FeatureList::IsEnabled(::features::kAccessibilityCursorColor);
}
+
+const base::Feature kMagnifierNewFocusFollowing{
+ "MagnifierNewFocusFollowing", base::FEATURE_ENABLED_BY_DEFAULT};
+
+bool IsMagnifierNewFocusFollowingEnabled() {
+ return base::FeatureList::IsEnabled(::features::kMagnifierNewFocusFollowing);
+}
#endif // defined(OS_CHROMEOS)
const base::Feature kAugmentExistingImageLabels{
@@ -88,4 +107,14 @@ bool IsUseAXPositionForDocumentMarkersEnabled() {
::features::kUseAXPositionForDocumentMarkers);
}
+#if defined(OS_CHROMEOS)
+const base::Feature kSelectToSpeakNavigationControl{
+ "SelectToSpeakNavigationControl", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsSelectToSpeakNavigationControlEnabled() {
+ return base::FeatureList::IsEnabled(
+ ::features::kSelectToSpeakNavigationControl);
+}
+#endif // defined(OS_CHROMEOS)
+
} // namespace features
diff --git a/chromium/ui/accessibility/accessibility_features.h b/chromium/ui/accessibility/accessibility_features.h
index f67d7a5123e..23110de37bc 100644
--- a/chromium/ui/accessibility/accessibility_features.h
+++ b/chromium/ui/accessibility/accessibility_features.h
@@ -24,6 +24,13 @@ AX_BASE_EXPORT extern const base::Feature kEnableAccessibilityExposeHTMLElement;
// browser process AXTree (as an ignored node).
AX_BASE_EXPORT bool IsAccessibilityExposeHTMLElementEnabled();
+AX_BASE_EXPORT extern const base::Feature
+ kEnableAccessibilityExposeIgnoredNodes;
+
+// Returns true if all ignored nodes are exposed by Blink in the
+// accessibility tree.
+AX_BASE_EXPORT bool IsAccessibilityExposeIgnoredNodesEnabled();
+
AX_BASE_EXPORT extern const base::Feature kEnableAccessibilityLanguageDetection;
// Return true if language detection should be used to determine the language
@@ -61,6 +68,13 @@ AX_BASE_EXPORT extern const base::Feature kAccessibilityCursorColor;
// Returns true if the accessibility cursor color feature is enabled, letting
// users pick a custom cursor color.
AX_BASE_EXPORT bool IsAccessibilityCursorColorEnabled();
+
+// Enables new magnifier focus following feature, which provides a richer
+// focus following experience.
+AX_BASE_EXPORT extern const base::Feature kMagnifierNewFocusFollowing;
+
+// Returns true if the new magnifier focus following feature is enabled.
+AX_BASE_EXPORT bool IsMagnifierNewFocusFollowingEnabled();
#endif // defined(OS_CHROMEOS)
// Enables Get Image Descriptions to augment existing images labels,
@@ -82,6 +96,15 @@ AX_BASE_EXPORT extern const base::Feature kUseAXPositionForDocumentMarkers;
// nodes and which is different for each platform.
AX_BASE_EXPORT bool IsUseAXPositionForDocumentMarkersEnabled();
+#if defined(OS_CHROMEOS)
+// Enables enhanced Select-to-speak features that allow users broader control
+// of TTS (pause, resume, skip between sentences and paragraphs).
+AX_BASE_EXPORT extern const base::Feature kSelectToSpeakNavigationControl;
+
+// Returns true if enhanced Select-to-speak features are enabled.
+AX_BASE_EXPORT bool IsSelectToSpeakNavigationControlEnabled();
+#endif // defined(OS_CHROMEOS)
+
} // namespace features
#endif // UI_ACCESSIBILITY_ACCESSIBILITY_FEATURES_H_
diff --git a/chromium/ui/accessibility/accessibility_switches.cc b/chromium/ui/accessibility/accessibility_switches.cc
index 09ce94e27a0..5fe682f65a8 100644
--- a/chromium/ui/accessibility/accessibility_switches.cc
+++ b/chromium/ui/accessibility/accessibility_switches.cc
@@ -36,15 +36,6 @@ const char kEnableExperimentalAccessibilitySwitchAccessText[] =
const char kEnableExperimentalAccessibilityChromeVoxAnnotations[] =
"enable-experimental-accessibility-chromevox-annotations";
-// Enables interactive tutorial for ChromeVox.
-const char kEnableExperimentalAccessibilityChromeVoxTutorial[] =
- "enable-experimental-accessibility-chromevox-tutorial";
-
-// Enables new magnifier focus following feature, which provides richer focus
-// following experience.
-const char kEnableExperimentalAccessibilityMagnifierNewFocusFollowing[] =
- "enable-experimental-accessibility-magnifier-new-focus-following";
-
// Enables Switch Access point scanning. This feature hasn't launched yet.
const char kEnableSwitchAccessPointScanning[] =
"enable-switch-access-point-scanning";
diff --git a/chromium/ui/accessibility/accessibility_switches.h b/chromium/ui/accessibility/accessibility_switches.h
index ad01597bcd4..fa841feeb62 100644
--- a/chromium/ui/accessibility/accessibility_switches.h
+++ b/chromium/ui/accessibility/accessibility_switches.h
@@ -22,10 +22,6 @@ AX_BASE_EXPORT extern const char
kEnableExperimentalAccessibilitySwitchAccessText[];
AX_BASE_EXPORT extern const char
kEnableExperimentalAccessibilityChromeVoxAnnotations[];
-AX_BASE_EXPORT extern const char
- kEnableExperimentalAccessibilityChromeVoxTutorial[];
-AX_BASE_EXPORT extern const char
- kEnableExperimentalAccessibilityMagnifierNewFocusFollowing[];
AX_BASE_EXPORT extern const char kEnableSwitchAccessPointScanning[];
// Returns true if experimental accessibility language detection is enabled.
diff --git a/chromium/ui/accessibility/ax_common.h b/chromium/ui/accessibility/ax_common.h
new file mode 100644
index 00000000000..997ae98b4f2
--- /dev/null
+++ b/chromium/ui/accessibility/ax_common.h
@@ -0,0 +1,18 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_ACCESSIBILITY_AX_COMMON_H_
+#define UI_ACCESSIBILITY_AX_COMMON_H_
+
+#if (!defined(NDEBUG) || defined(ADDRESS_SANITIZER) || \
+ defined(LEAK_SANITIZER) || defined(MEMORY_SANITIZER) || \
+ defined(THREAD_SANITIZER) || defined(UNDEFINED_SANITIZER) || \
+ DCHECK_IS_ON()) && \
+ !defined(OS_IOS)
+// Enable fast fails on clusterfuzz and other builds used to debug Chrome,
+// in order to help narrow down illegal states more quickly.
+#define AX_FAIL_FAST_BUILD
+#endif
+
+#endif // UI_ACCESSIBILITY_AX_COMMON_H_
diff --git a/chromium/ui/accessibility/ax_enum_util.cc b/chromium/ui/accessibility/ax_enum_util.cc
index 5e3e186029d..4a5f05468d4 100644
--- a/chromium/ui/accessibility/ax_enum_util.cc
+++ b/chromium/ui/accessibility/ax_enum_util.cc
@@ -55,8 +55,6 @@ const char* ToString(ax::mojom::Event event) {
return "hover";
case ax::mojom::Event::kImageFrameUpdated:
return "imageFrameUpdated";
- case ax::mojom::Event::kInvalidStatusChanged:
- return "invalidStatusChanged";
case ax::mojom::Event::kLayoutComplete:
return "layoutComplete";
case ax::mojom::Event::kLiveRegionCreated:
@@ -75,8 +73,6 @@ const char* ToString(ax::mojom::Event event) {
return "mediaStoppedPlaying";
case ax::mojom::Event::kMenuEnd:
return "menuEnd";
- case ax::mojom::Event::kMenuListItemSelected:
- return "menuListItemSelected";
case ax::mojom::Event::kMenuListValueChanged:
return "menuListValueChanged";
case ax::mojom::Event::kMenuPopupEnd:
@@ -125,16 +121,16 @@ const char* ToString(ax::mojom::Event event) {
return "tooltipClosed";
case ax::mojom::Event::kTooltipOpened:
return "tooltipOpened";
+ case ax::mojom::Event::kTreeChanged:
+ return "treeChanged";
+ case ax::mojom::Event::kValueChanged:
+ return "valueChanged";
case ax::mojom::Event::kWindowActivated:
return "windowActivated";
case ax::mojom::Event::kWindowDeactivated:
return "windowDeactivated";
case ax::mojom::Event::kWindowVisibilityChanged:
return "windowVisibilityChanged";
- case ax::mojom::Event::kTreeChanged:
- return "treeChanged";
- case ax::mojom::Event::kValueChanged:
- return "valueChanged";
}
return "";
@@ -280,6 +276,10 @@ const char* ToString(ax::mojom::Role role) {
return "docNotice";
case ax::mojom::Role::kDocPageBreak:
return "docPageBreak";
+ case ax::mojom::Role::kDocPageFooter:
+ return "docPageFooter";
+ case ax::mojom::Role::kDocPageHeader:
+ return "docPageHeader";
case ax::mojom::Role::kDocPageList:
return "docPageList";
case ax::mojom::Role::kDocPart:
@@ -688,7 +688,7 @@ const char* ToString(ax::mojom::DefaultActionVerb default_action_verb) {
case ax::mojom::DefaultActionVerb::kClickAncestor:
// Some screen readers, such as Jaws, expect the following spelling of
// this verb.
- return "click-ancestor";
+ return "clickAncestor";
case ax::mojom::DefaultActionVerb::kJump:
return "jump";
case ax::mojom::DefaultActionVerb::kOpen:
@@ -758,6 +758,8 @@ const char* ToString(ax::mojom::StringAttribute string_attribute) {
return "ariaInvalidValue";
case ax::mojom::StringAttribute::kAutoComplete:
return "autoComplete";
+ case ax::mojom::StringAttribute::kCheckedStateDescription:
+ return "checkedStateDescription";
case ax::mojom::StringAttribute::kChildTreeId:
return "childTreeId";
case ax::mojom::StringAttribute::kClassName:
diff --git a/chromium/ui/accessibility/ax_enums.mojom b/chromium/ui/accessibility/ax_enums.mojom
index bb2175f5f5e..ef0eb7f4423 100644
--- a/chromium/ui/accessibility/ax_enums.mojom
+++ b/chromium/ui/accessibility/ax_enums.mojom
@@ -47,7 +47,6 @@ enum Event {
kHitTestResult,
kHover,
kImageFrameUpdated, // Web
- kInvalidStatusChanged, // Implicit
kLayoutComplete, // Web
kLiveRegionCreated, // Implicit
kLiveRegionChanged, // Web
@@ -57,7 +56,6 @@ enum Event {
kMediaStartedPlaying, // Native / Automation
kMediaStoppedPlaying, // Native / Automation
kMenuEnd, // Native / web: menu interaction has ended.
- kMenuListItemSelected, // Web
kMenuListValueChanged, // Web
kMenuPopupEnd, // Native / web: a menu/submenu is hidden/closed.
kMenuPopupStart, // Native / web: a menu/submenu is shown/opened.
@@ -79,16 +77,16 @@ enum Event {
kShow, // Native / Automation
kStateChanged, // Native / Automation
kTextChanged,
- kWindowActivated, // Native
- kWindowDeactivated, // Native
- kWindowVisibilityChanged, // Native
+ // TODO(nektar): Remove kTextSelectionChanged.
kTextSelectionChanged,
kTooltipClosed,
kTooltipOpened,
- kTreeChanged, // Accessibility tree changed. Don't
- // explicitly fire an accessibility event,
- // only implicitly due to the change.
+ kTreeChanged, // Don't explicitly fire this event.
+ // TODO(nektar): Remove kValueChanged.
kValueChanged,
+ kWindowActivated, // Native
+ kWindowDeactivated, // Native
+ kWindowVisibilityChanged, // Native
};
// Accessibility object roles.
@@ -176,6 +174,8 @@ enum Role {
kDocNoteRef,
kDocNotice,
kDocPageBreak,
+ kDocPageFooter,
+ kDocPageHeader,
kDocPageList,
kDocPart,
kDocPreface,
@@ -501,6 +501,7 @@ enum StringAttribute {
// Only used when invalid_state == invalid_state_other.
kAriaInvalidValue,
kAutoComplete,
+ kCheckedStateDescription,
kChildTreeId,
kClassName,
kContainerLiveRelevant,
diff --git a/chromium/ui/accessibility/ax_event_generator.cc b/chromium/ui/accessibility/ax_event_generator.cc
index 1a59c15e45e..6428ce8eba8 100644
--- a/chromium/ui/accessibility/ax_event_generator.cc
+++ b/chromium/ui/accessibility/ax_event_generator.cc
@@ -48,7 +48,9 @@ void RemoveEvent(std::set<AXEventGenerator::EventParams>* node_events,
}
// If a node toggled its ignored state, don't also fire children-changed because
-// platforms likely will do that in response to ignored-changed.
+// platforms likely will do that in response to ignored-changed. Also do not
+// fire parent-changed on ignored nodes because functionally the parent did not
+// change as far as platform assistive technologies are concerned.
// Suppress name- and description-changed because those can be emitted as a side
// effect of calculating alternative text values for a newly-displayed object.
// Ditto for text attributes such as foreground and background colors, or
@@ -61,6 +63,7 @@ void RemoveEventsDueToIgnoredChanged(
RemoveEvent(node_events, AXEventGenerator::Event::DESCRIPTION_CHANGED);
RemoveEvent(node_events, AXEventGenerator::Event::NAME_CHANGED);
RemoveEvent(node_events, AXEventGenerator::Event::OBJECT_ATTRIBUTE_CHANGED);
+ RemoveEvent(node_events, AXEventGenerator::Event::PARENT_CHANGED);
RemoveEvent(node_events, AXEventGenerator::Event::SORT_CHANGED);
RemoveEvent(node_events, AXEventGenerator::Event::TEXT_ATTRIBUTE_CHANGED);
RemoveEvent(node_events,
@@ -86,8 +89,8 @@ bool HasIgnoredChangedState(
} // namespace
AXEventGenerator::EventParams::EventParams(
- Event event,
- ax::mojom::EventFrom event_from,
+ const Event event,
+ const ax::mojom::EventFrom event_from,
const std::vector<AXEventIntent>& event_intents)
: event(event), event_from(event_from), event_intents(event_intents) {}
@@ -95,13 +98,7 @@ AXEventGenerator::EventParams::EventParams(const EventParams& other) = default;
AXEventGenerator::EventParams::~EventParams() = default;
-AXEventGenerator::TargetedEvent::TargetedEvent(AXNode* node,
- const EventParams& event_params)
- : node(node), event_params(event_params) {
- DCHECK(node);
-}
-
-bool AXEventGenerator::EventParams::operator==(const EventParams& rhs) {
+bool AXEventGenerator::EventParams::operator==(const EventParams& rhs) const {
return rhs.event == event;
}
@@ -109,6 +106,12 @@ bool AXEventGenerator::EventParams::operator<(const EventParams& rhs) const {
return event < rhs.event;
}
+AXEventGenerator::TargetedEvent::TargetedEvent(AXNode* node,
+ const EventParams& event_params)
+ : node(node), event_params(event_params) {
+ DCHECK(node);
+}
+
AXEventGenerator::Iterator::Iterator(
const std::map<AXNode*, std::set<EventParams>>& map,
const std::map<AXNode*, std::set<EventParams>>::const_iterator& head)
@@ -174,6 +177,14 @@ void AXEventGenerator::ReleaseTree() {
tree_ = nullptr;
}
+bool AXEventGenerator::empty() const {
+ return tree_events_.empty();
+}
+
+size_t AXEventGenerator::size() const {
+ return tree_events_.size();
+}
+
AXEventGenerator::Iterator AXEventGenerator::begin() const {
auto map_iter = tree_events_.begin();
if (map_iter != tree_events_.end()) {
@@ -182,7 +193,7 @@ AXEventGenerator::Iterator AXEventGenerator::begin() const {
// |tree_events_| may contain empty sets of events in its first entry
// (i.e. |set_iter| is at the iterator's end). In this case, we want to
// increment |map_iter| to point to the next entry of |tree_events_| that
- // contains non-empty set of events.
+ // contains a non-empty set of events.
while (map_iter != tree_events_.end() &&
set_iter == map_iter->second.end()) {
map_iter++;
@@ -225,9 +236,26 @@ void AXEventGenerator::OnNodeDataChanged(AXTree* tree,
if (new_node_data.child_ids != old_node_data.child_ids &&
!ui::IsText(new_node_data.role)) {
AXNode* node = tree_->GetFromId(new_node_data.id);
- tree_events_[node].emplace(Event::CHILDREN_CHANGED,
- ax::mojom::EventFrom::kNone,
- tree_->event_intents());
+ if (node)
+ AddEvent(node, Event::CHILDREN_CHANGED);
+ }
+
+ // If the ignored state of a node has changed, the inclusion/exclusion of that
+ // node in platform accessibility trees will change. Fire PARENT_CHANGED on
+ // the children of a node whose ignored state changed in order to notify ATs
+ // that existing children may have been reparented.
+ //
+ // We don't fire parent-changed if the invisible state of the node has changed
+ // because when invisibility changes, the entire subtree is being inserted /
+ // removed. For example if the 'hidden' property is changed on list item, we
+ // should not fire parent-changed on the list marker or static text.
+ if (old_node_data.IsIgnored() != new_node_data.IsIgnored() &&
+ !old_node_data.IsInvisible() && !new_node_data.IsInvisible()) {
+ AXNode* node = tree_->GetFromId(new_node_data.id);
+ for (size_t i = 0; i < node->GetUnignoredChildCount(); ++i) {
+ AXNode* child = node->GetUnignoredChildAtIndex(i);
+ AddEvent(child, Event::PARENT_CHANGED);
+ }
}
}
@@ -309,6 +337,13 @@ void AXEventGenerator::OnStringAttributeChanged(AXTree* tree,
case ax::mojom::StringAttribute::kDescription:
AddEvent(node, Event::DESCRIPTION_CHANGED);
break;
+ case ax::mojom::StringAttribute::kFontFamily:
+ AddEvent(node, Event::TEXT_ATTRIBUTE_CHANGED);
+ break;
+ case ax::mojom::StringAttribute::kImageAnnotation:
+ // The image annotation is reported as part of the accessible name.
+ AddEvent(node, Event::IMAGE_ANNOTATION_CHANGED);
+ break;
case ax::mojom::StringAttribute::kKeyShortcuts:
AddEvent(node, Event::KEY_SHORTCUTS_CHANGED);
break;
@@ -336,23 +371,31 @@ void AXEventGenerator::OnStringAttributeChanged(AXTree* tree,
if (node != tree->root())
AddEvent(node, Event::NAME_CHANGED);
+ // If it's in a live region, fire live region events.
if (node->data().HasStringAttribute(
ax::mojom::StringAttribute::kContainerLiveStatus)) {
FireLiveRegionEvents(node);
}
+
+ // If it's a change to static text, and it's in an editable text field,
+ // fire an event on the editable root.
+ if (IsText(node->data().role)) {
+ AXNode* text_field = node->GetTextFieldAncestor();
+ if (text_field)
+ AddEvent(text_field, Event::EDITABLE_TEXT_CHANGED);
+ }
break;
case ax::mojom::StringAttribute::kPlaceholder:
AddEvent(node, Event::PLACEHOLDER_CHANGED);
break;
case ax::mojom::StringAttribute::kValue:
- AddEvent(node, Event::VALUE_CHANGED);
- break;
- case ax::mojom::StringAttribute::kImageAnnotation:
- // The image annotation is reported as part of the accessible name.
- AddEvent(node, Event::IMAGE_ANNOTATION_CHANGED);
- break;
- case ax::mojom::StringAttribute::kFontFamily:
- AddEvent(node, Event::TEXT_ATTRIBUTE_CHANGED);
+ if (node->data().IsRangeValueSupported()) {
+ AddEvent(node, Event::RANGE_VALUE_CHANGED);
+ } else if (IsSelectElement(node->data().role)) {
+ AddEvent(node, Event::SELECTED_VALUE_CHANGED);
+ } else if (node->data().IsTextField()) {
+ AddEvent(node, Event::VALUE_IN_TEXT_FIELD_CHANGED);
+ }
break;
default:
AddEvent(node, Event::OTHER_ATTRIBUTE_CHANGED);
@@ -468,16 +511,16 @@ void AXEventGenerator::OnFloatAttributeChanged(AXTree* tree,
switch (attr) {
case ax::mojom::FloatAttribute::kMaxValueForRange:
- AddEvent(node, Event::VALUE_MAX_CHANGED);
+ AddEvent(node, Event::RANGE_VALUE_MAX_CHANGED);
break;
case ax::mojom::FloatAttribute::kMinValueForRange:
- AddEvent(node, Event::VALUE_MIN_CHANGED);
+ AddEvent(node, Event::RANGE_VALUE_MIN_CHANGED);
break;
case ax::mojom::FloatAttribute::kStepValueForRange:
- AddEvent(node, Event::VALUE_STEP_CHANGED);
+ AddEvent(node, Event::RANGE_VALUE_STEP_CHANGED);
break;
case ax::mojom::FloatAttribute::kValueForRange:
- AddEvent(node, Event::VALUE_CHANGED);
+ AddEvent(node, Event::RANGE_VALUE_CHANGED);
break;
case ax::mojom::FloatAttribute::kFontSize:
case ax::mojom::FloatAttribute::kFontWeight:
@@ -568,10 +611,11 @@ void AXEventGenerator::OnIntListAttributeChanged(
// On a native text field, the spelling- and grammar-error markers are
// associated with children not exposed on any platform. Therefore, we
// adjust the node we fire that event on here.
- if (AXNode* text_field = node->GetTextFieldAncestor())
+ if (AXNode* text_field = node->GetTextFieldAncestor()) {
AddEvent(text_field, Event::TEXT_ATTRIBUTE_CHANGED);
- else
+ } else {
AddEvent(node, Event::TEXT_ATTRIBUTE_CHANGED);
+ }
break;
default:
AddEvent(node, Event::OTHER_ATTRIBUTE_CHANGED);
@@ -583,12 +627,16 @@ void AXEventGenerator::OnTreeDataChanged(AXTree* tree,
const AXTreeData& old_tree_data,
const AXTreeData& new_tree_data) {
DCHECK_EQ(tree_, tree);
+ DCHECK(tree->root());
if (new_tree_data.loaded && !old_tree_data.loaded &&
ShouldFireLoadEvents(tree->root())) {
AddEvent(tree->root(), Event::LOAD_COMPLETE);
}
+ if (new_tree_data.title != old_tree_data.title)
+ AddEvent(tree->root(), Event::DOCUMENT_TITLE_CHANGED);
+
if (new_tree_data.sel_is_backward != old_tree_data.sel_is_backward ||
new_tree_data.sel_anchor_object_id !=
old_tree_data.sel_anchor_object_id ||
@@ -598,9 +646,22 @@ void AXEventGenerator::OnTreeDataChanged(AXTree* tree,
new_tree_data.sel_focus_offset != old_tree_data.sel_focus_offset ||
new_tree_data.sel_focus_affinity != old_tree_data.sel_focus_affinity) {
AddEvent(tree->root(), Event::DOCUMENT_SELECTION_CHANGED);
+
+ // A special event is also fired internally for selection changes in text
+ // fields. The reasons are both historical and in order to have a unified
+ // way of handling selection changes between Web and Views. Views don't have
+ // the concept of a document selection but some individual Views controls
+ // have the ability for the user to select text inside them.
+ const AXNode* selection_focus =
+ tree_->GetFromId(new_tree_data.sel_focus_object_id);
+ if (selection_focus) {
+ // Even if it is possible for the document selection to span multiple text
+ // fields, an event should still fire on the field where the selection
+ // ends.
+ if (AXNode* text_field = selection_focus->GetTextFieldAncestor())
+ AddEvent(text_field, Event::SELECTION_IN_TEXT_FIELD_CHANGED);
+ }
}
- if (new_tree_data.title != old_tree_data.title)
- AddEvent(tree->root(), Event::DOCUMENT_TITLE_CHANGED);
}
void AXEventGenerator::OnNodeWillBeDeleted(AXTree* tree, AXNode* node) {
@@ -621,11 +682,17 @@ void AXEventGenerator::OnSubtreeWillBeReparented(AXTree* tree, AXNode* node) {
DCHECK_EQ(tree_, tree);
}
+void AXEventGenerator::OnNodeReparented(AXTree* tree, AXNode* node) {
+ DCHECK_EQ(tree_, tree);
+ AddEvent(node, Event::PARENT_CHANGED);
+}
+
void AXEventGenerator::OnAtomicUpdateFinished(
AXTree* tree,
bool root_changed,
const std::vector<Change>& changes) {
DCHECK_EQ(tree_, tree);
+ DCHECK(tree->root());
if (root_changed && ShouldFireLoadEvents(tree->root())) {
if (tree->data().loaded)
@@ -635,9 +702,11 @@ void AXEventGenerator::OnAtomicUpdateFinished(
}
for (const auto& change : changes) {
+ DCHECK(change.node);
if (change.type == SUBTREE_CREATED) {
AddEvent(change.node, Event::SUBTREE_CREATED);
} else if (change.type != NODE_CREATED) {
+ FireValueInTextFieldChangedEvent(tree, change.node);
FireRelationSourceEvents(tree, change.node);
continue;
}
@@ -658,6 +727,7 @@ void AXEventGenerator::OnAtomicUpdateFinished(
void AXEventGenerator::AddEventsForTesting(
AXNode* node,
const std::set<EventParams>& events) {
+ DCHECK(node);
tree_events_[node] = events;
}
@@ -701,6 +771,16 @@ void AXEventGenerator::FireActiveDescendantEvents() {
active_descendant_changed_.clear();
}
+void AXEventGenerator::FireValueInTextFieldChangedEvent(AXTree* tree,
+ AXNode* target_node) {
+ if (!target_node->IsText())
+ return;
+ AXNode* text_field_ancestor = target_node->GetTextFieldAncestor();
+ if (!text_field_ancestor)
+ return;
+ AddEvent(text_field_ancestor, Event::VALUE_IN_TEXT_FIELD_CHANGED);
+}
+
void AXEventGenerator::FireRelationSourceEvents(AXTree* tree,
AXNode* target_node) {
int32_t target_id = target_node->id();
@@ -846,10 +926,18 @@ void AXEventGenerator::TrimEventsDueToAncestorIgnoredChanged(
void AXEventGenerator::PostprocessEvents() {
std::map<AXNode*, IgnoredChangedStatesBitset> ancestor_ignored_changed_map;
std::set<AXNode*> removed_subtree_created_nodes;
+ std::set<AXNode*> removed_parent_changed_nodes;
// First pass through |tree_events_|, remove events that we do not need.
for (auto& iter : tree_events_) {
AXNode* node = iter.first;
+
+ // TODO(http://crbug.com/2279799): remove all of the cases that could
+ // add a null node to |tree_events|.
+ DCHECK(node);
+ if (!node)
+ continue;
+
std::set<EventParams>& node_events = iter.second;
// A newly created live region or alert should not *also* fire a
@@ -887,8 +975,28 @@ void AXEventGenerator::PostprocessEvents() {
RemoveEvent(&node_events, Event::TEXT_ATTRIBUTE_CHANGED);
}
+ // Don't fire parent changed on this node if any of its ancestors also has
+ // parent changed. However, if the ancestor also has subtree created, it is
+ // possible that the created subtree is actually a newly unignored parent
+ // of an existing node. In that instance, we need to inform ATs that the
+ // existing node's parent has changed on the platform.
+ if (HasEvent(node_events, Event::PARENT_CHANGED)) {
+ while (parent && (tree_events_.find(parent) != tree_events_.end() ||
+ base::Contains(removed_parent_changed_nodes, parent))) {
+ if ((base::Contains(removed_parent_changed_nodes, parent) ||
+ HasEvent(tree_events_[parent], Event::PARENT_CHANGED)) &&
+ !HasEvent(tree_events_[parent], Event::SUBTREE_CREATED)) {
+ RemoveEvent(&node_events, Event::PARENT_CHANGED);
+ removed_parent_changed_nodes.insert(node);
+ break;
+ }
+ parent = parent->GetUnignoredParent();
+ }
+ }
+
// Don't fire subtree created on this node if any of its ancestors also has
// subtree created.
+ parent = node->GetUnignoredParent();
if (HasEvent(node_events, Event::SUBTREE_CREATED)) {
while (parent &&
(tree_events_.find(parent) != tree_events_.end() ||
@@ -958,14 +1066,16 @@ const char* ToString(AXEventGenerator::Event event) {
switch (event) {
case AXEventGenerator::Event::ACCESS_KEY_CHANGED:
return "accessKeyChanged";
- case AXEventGenerator::Event::ATOMIC_CHANGED:
- return "atomicChanged";
case AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED:
return "activeDescendantChanged";
case AXEventGenerator::Event::ALERT:
return "alert";
case AXEventGenerator::Event::ATK_TEXT_OBJECT_ATTRIBUTE_CHANGED:
return "atkTextObjectAttributeChanged";
+ case AXEventGenerator::Event::ATOMIC_CHANGED:
+ return "atomicChanged";
+ case AXEventGenerator::Event::AUTO_COMPLETE_CHANGED:
+ return "autoCompleteChanged";
case AXEventGenerator::Event::BUSY_CHANGED:
return "busyChanged";
case AXEventGenerator::Event::CHECKED_STATE_CHANGED:
@@ -988,10 +1098,14 @@ const char* ToString(AXEventGenerator::Event event) {
return "documentTitleChanged";
case AXEventGenerator::Event::DROPEFFECT_CHANGED:
return "dropeffectChanged";
+ case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED:
+ return "editableTextChanged";
case AXEventGenerator::Event::ENABLED_CHANGED:
return "enabledChanged";
case AXEventGenerator::Event::EXPANDED:
return "expanded";
+ case AXEventGenerator::Event::FOCUS_CHANGED:
+ return "focusChanged";
case AXEventGenerator::Event::FLOW_FROM_CHANGED:
return "flowFromChanged";
case AXEventGenerator::Event::FLOW_TO_CHANGED:
@@ -1042,12 +1156,22 @@ const char* ToString(AXEventGenerator::Event event) {
return "objectAttributeChanged";
case AXEventGenerator::Event::OTHER_ATTRIBUTE_CHANGED:
return "otherAttributeChanged";
+ case AXEventGenerator::Event::PARENT_CHANGED:
+ return "parentChanged";
case AXEventGenerator::Event::PLACEHOLDER_CHANGED:
return "placeholderChanged";
case AXEventGenerator::Event::PORTAL_ACTIVATED:
return "portalActivated";
case AXEventGenerator::Event::POSITION_IN_SET_CHANGED:
return "positionInSetChanged";
+ case AXEventGenerator::Event::RANGE_VALUE_CHANGED:
+ return "rangeValueChanged";
+ case AXEventGenerator::Event::RANGE_VALUE_MAX_CHANGED:
+ return "rangeValueMaxChanged";
+ case AXEventGenerator::Event::RANGE_VALUE_MIN_CHANGED:
+ return "rangeValueMinChanged";
+ case AXEventGenerator::Event::RANGE_VALUE_STEP_CHANGED:
+ return "rangeValueStepChanged";
case AXEventGenerator::Event::READONLY_CHANGED:
return "readonlyChanged";
case AXEventGenerator::Event::RELATED_NODE_CHANGED:
@@ -1066,32 +1190,25 @@ const char* ToString(AXEventGenerator::Event event) {
return "selectedChanged";
case AXEventGenerator::Event::SELECTED_CHILDREN_CHANGED:
return "selectedChildrenChanged";
+ case AXEventGenerator::Event::SELECTED_VALUE_CHANGED:
+ return "selectedValueChanged";
+ case AXEventGenerator::Event::SELECTION_IN_TEXT_FIELD_CHANGED:
+ return "selectionInTextFieldChanged";
case AXEventGenerator::Event::SET_SIZE_CHANGED:
return "setSizeChanged";
+ case AXEventGenerator::Event::SORT_CHANGED:
+ return "sortChanged";
case AXEventGenerator::Event::STATE_CHANGED:
return "stateChanged";
case AXEventGenerator::Event::SUBTREE_CREATED:
return "subtreeCreated";
case AXEventGenerator::Event::TEXT_ATTRIBUTE_CHANGED:
return "textAttributeChanged";
- case AXEventGenerator::Event::VALUE_CHANGED:
- return "valueChanged";
- case AXEventGenerator::Event::VALUE_MAX_CHANGED:
- return "valueMaxChanged";
- case AXEventGenerator::Event::VALUE_MIN_CHANGED:
- return "valueMinChanged";
- case AXEventGenerator::Event::VALUE_STEP_CHANGED:
- return "valueStepChanged";
- case AXEventGenerator::Event::AUTO_COMPLETE_CHANGED:
- return "autoCompleteChanged";
- case AXEventGenerator::Event::FOCUS_CHANGED:
- return "focusChanged";
- case AXEventGenerator::Event::SORT_CHANGED:
- return "sortChanged";
+ case AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED:
+ return "valueInTextFieldChanged";
case AXEventGenerator::Event::WIN_IACCESSIBLE_STATE_CHANGED:
return "winIaccessibleStateChanged";
}
- NOTREACHED();
}
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_event_generator.h b/chromium/ui/accessibility/ax_event_generator.h
index 71cedcfea74..1d58988a789 100644
--- a/chromium/ui/accessibility/ax_event_generator.h
+++ b/chromium/ui/accessibility/ax_event_generator.h
@@ -31,7 +31,7 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
ALERT,
// ATK treats alignment, indentation, and other format-related attributes as
// text attributes even when they are only applicable to the entire object.
- // And it lacks an event for object attributes changing.
+ // And it lacks an event for use when object attributes have changed.
ATK_TEXT_OBJECT_ATTRIBUTE_CHANGED,
ATOMIC_CHANGED,
AUTO_COMPLETE_CHANGED,
@@ -46,6 +46,9 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
DOCUMENT_SELECTION_CHANGED,
DOCUMENT_TITLE_CHANGED,
DROPEFFECT_CHANGED,
+ // TODO(nektar): Deprecate this event and replace it with
+ // "VALUE_IN_TEXT_FIELD_CHANGED".
+ EDITABLE_TEXT_CHANGED,
ENABLED_CHANGED,
EXPANDED,
FOCUS_CHANGED,
@@ -60,7 +63,7 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
KEY_SHORTCUTS_CHANGED,
LABELED_BY_CHANGED,
LANGUAGE_CHANGED,
- LAYOUT_INVALIDATED, // Fired when aria-busy goes false
+ LAYOUT_INVALIDATED, // Fired when aria-busy turns from true to false.
LIVE_REGION_CHANGED, // Fired on the root of a live region.
LIVE_REGION_CREATED,
LIVE_REGION_NODE_CHANGED, // Fired on a node within a live region.
@@ -74,11 +77,16 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
NAME_CHANGED,
OBJECT_ATTRIBUTE_CHANGED,
OTHER_ATTRIBUTE_CHANGED,
+ PARENT_CHANGED,
PLACEHOLDER_CHANGED,
PORTAL_ACTIVATED,
POSITION_IN_SET_CHANGED,
- RELATED_NODE_CHANGED,
+ RANGE_VALUE_CHANGED,
+ RANGE_VALUE_MAX_CHANGED,
+ RANGE_VALUE_MIN_CHANGED,
+ RANGE_VALUE_STEP_CHANGED,
READONLY_CHANGED,
+ RELATED_NODE_CHANGED,
REQUIRED_STATE_CHANGED,
ROLE_CHANGED,
ROW_COUNT_CHANGED,
@@ -86,15 +94,14 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
SCROLL_VERTICAL_POSITION_CHANGED,
SELECTED_CHANGED,
SELECTED_CHILDREN_CHANGED,
+ SELECTED_VALUE_CHANGED,
+ SELECTION_IN_TEXT_FIELD_CHANGED,
SET_SIZE_CHANGED,
SORT_CHANGED,
STATE_CHANGED,
SUBTREE_CREATED,
TEXT_ATTRIBUTE_CHANGED,
- VALUE_CHANGED,
- VALUE_MAX_CHANGED,
- VALUE_MIN_CHANGED,
- VALUE_STEP_CHANGED,
+ VALUE_IN_TEXT_FIELD_CHANGED,
// This event is for the exact set of attributes that affect
// the MSAA/IAccessible state on Windows. Not needed on other platforms,
@@ -113,17 +120,20 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
const std::vector<AXEventIntent>& event_intents);
EventParams(const EventParams& other);
~EventParams();
+
+ bool operator==(const EventParams& rhs) const;
+ bool operator<(const EventParams& rhs) const;
+
Event event;
ax::mojom::EventFrom event_from;
std::vector<AXEventIntent> event_intents;
-
- bool operator==(const EventParams& rhs);
- bool operator<(const EventParams& rhs) const;
};
- struct TargetedEvent {
+ struct TargetedEvent final {
// |node| must not be null
TargetedEvent(ui::AXNode* node, const EventParams& event_params);
+ ~TargetedEvent() = default;
+
ui::AXNode* node;
const EventParams& event_params;
};
@@ -181,6 +191,13 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
// Null |tree_| without accessing it or destroying it.
void ReleaseTree();
+ //
+ // Methods that make this class behave like an STL container, which simplifies
+ // the process of iterating through generated events.
+ //
+
+ bool empty() const;
+ size_t size() const;
Iterator begin() const;
Iterator end() const;
@@ -247,6 +264,7 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
void OnSubtreeWillBeDeleted(AXTree* tree, AXNode* node) override;
void OnNodeWillBeReparented(AXTree* tree, AXNode* node) override;
void OnSubtreeWillBeReparented(AXTree* tree, AXNode* node) override;
+ void OnNodeReparented(AXTree* tree, AXNode* node) override;
void OnAtomicUpdateFinished(AXTree* tree,
bool root_changed,
const std::vector<Change>& changes) override;
@@ -254,6 +272,7 @@ class AX_EXPORT AXEventGenerator : public AXTreeObserver {
private:
void FireLiveRegionEvents(AXNode* node);
void FireActiveDescendantEvents();
+ void FireValueInTextFieldChangedEvent(AXTree* tree, AXNode* target_node);
void FireRelationSourceEvents(AXTree* tree, AXNode* target_node);
bool ShouldFireLoadEvents(AXNode* node);
// Remove excessive events for a tree update containing node.
diff --git a/chromium/ui/accessibility/ax_event_generator_unittest.cc b/chromium/ui/accessibility/ax_event_generator_unittest.cc
index 34f349a4e33..491578eaffe 100644
--- a/chromium/ui/accessibility/ax_event_generator_unittest.cc
+++ b/chromium/ui/accessibility/ax_event_generator_unittest.cc
@@ -21,6 +21,8 @@ void PrintTo(const AXEventGenerator::TargetedEvent& event, std::ostream* os) {
namespace {
+using testing::IsEmpty;
+using testing::IsSupersetOf;
using testing::Matches;
using testing::PrintToString;
using testing::UnorderedElementsAre;
@@ -177,6 +179,7 @@ TEST(AXEventGeneratorTest, LoadCompleteSameTree) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate load_complete_update = initial_state;
load_complete_update.tree_data.loaded = true;
@@ -195,6 +198,7 @@ TEST(AXEventGeneratorTest, LoadCompleteNewTree) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate load_complete_update;
load_complete_update.root_id = 2;
load_complete_update.nodes.resize(1);
@@ -252,6 +256,7 @@ TEST(AXEventGeneratorTest, LoadStart) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate load_start_update;
load_start_update.root_id = 2;
load_start_update.nodes.resize(1);
@@ -279,6 +284,7 @@ TEST(AXEventGeneratorTest, DocumentSelectionChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.tree_data.sel_focus_offset = 2;
@@ -298,6 +304,7 @@ TEST(AXEventGeneratorTest, DocumentTitleChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.tree_data.title = "After";
@@ -326,6 +333,7 @@ TEST(AXEventGeneratorTest, ExpandedAndRowCount) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[2].AddState(ax::mojom::State::kExpanded);
update.nodes[3].state = 0;
@@ -365,6 +373,7 @@ TEST(AXEventGeneratorTest, SelectedAndSelectedChildren) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[2].AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
update.nodes.pop_back();
@@ -386,25 +395,242 @@ TEST(AXEventGeneratorTest, SelectedAndSelectedChildren) {
4)));
}
-TEST(AXEventGeneratorTest, StringValueChanged) {
+TEST(AXEventGeneratorTest, SelectedAndSelectedValueChanged) {
+ // This test is based on the following HTML snippet which produces the below
+ // simplified accessibility tree.
+ //
+ // <select>
+ // <option selected>Item 1</option>
+ // <option>Item 2</option>
+ // </select>
+ // <select size="2">
+ // <option>Item 1</option>
+ // <option selected>Item 2</option>
+ // </select>
+ //
+ // kRootWebArea
+ // ++kPopUpButton value="Item 1"
+ // ++++kMenuListPopup invisible
+ // ++++++kMenuListOption name="Item 1" selected=true
+ // ++++++kMenuListOption name="Item 2" selected=false
+ // ++kListBox value="Item 2"
+ // ++++kListBoxOption name="Item 1" selected=false
+ // ++++kListBoxOption name="Item 2" selected=true
+
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
+
+ AXNodeData popup_button;
+ popup_button.id = 2;
+ popup_button.role = ax::mojom::Role::kPopUpButton;
+ popup_button.SetValue("Item 1");
+
+ AXNodeData menu_list_popup;
+ menu_list_popup.id = 3;
+ menu_list_popup.role = ax::mojom::Role::kMenuListPopup;
+ menu_list_popup.AddState(ax::mojom::State::kInvisible);
+
+ AXNodeData menu_list_option_1;
+ menu_list_option_1.id = 4;
+ menu_list_option_1.role = ax::mojom::Role::kMenuListOption;
+ menu_list_option_1.SetName("Item 1");
+ menu_list_option_1.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected,
+ true);
+
+ AXNodeData menu_list_option_2;
+ menu_list_option_2.id = 5;
+ menu_list_option_2.role = ax::mojom::Role::kMenuListOption;
+ menu_list_option_2.SetName("Item 2");
+
+ AXNodeData list_box;
+ list_box.id = 6;
+ list_box.role = ax::mojom::Role::kListBox;
+ list_box.SetValue("Item 2");
+
+ AXNodeData list_box_option_1;
+ list_box_option_1.id = 7;
+ list_box_option_1.role = ax::mojom::Role::kListBoxOption;
+ list_box_option_1.SetName("Item 1");
+
+ AXNodeData list_box_option_2;
+ list_box_option_2.id = 8;
+ list_box_option_2.role = ax::mojom::Role::kRootWebArea;
+ list_box_option_2.SetName("Item 2");
+ list_box_option_2.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
+
+ popup_button.child_ids = {menu_list_popup.id};
+ menu_list_popup.child_ids = {menu_list_option_1.id, menu_list_option_2.id};
+ list_box.child_ids = {list_box_option_1.id, list_box_option_2.id};
+ root.child_ids = {popup_button.id, list_box.id};
+
AXTreeUpdate initial_state;
- initial_state.root_id = 1;
- initial_state.nodes.resize(1);
- initial_state.nodes[0].id = 1;
- initial_state.nodes[0].role = ax::mojom::Role::kTextField;
- initial_state.nodes[0].AddStringAttribute(ax::mojom::StringAttribute::kValue,
- "Before");
+ initial_state.root_id = root.id;
+ initial_state.nodes = {root,
+ popup_button,
+ menu_list_popup,
+ menu_list_option_1,
+ menu_list_option_2,
+ list_box,
+ list_box_option_1,
+ list_box_option_2};
+
AXTree tree(initial_state);
+ AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
+
+ popup_button.SetValue("Item 2");
+ menu_list_option_1.RemoveBoolAttribute(ax::mojom::BoolAttribute::kSelected);
+ menu_list_option_2.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected,
+ true);
+ list_box.SetValue("Item 1");
+ list_box_option_1.AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
+ list_box_option_2.RemoveBoolAttribute(ax::mojom::BoolAttribute::kSelected);
+
+ AXTreeUpdate update;
+ update.nodes = {popup_button, menu_list_option_1, menu_list_option_2,
+ list_box, list_box_option_1, list_box_option_2};
+
+ ASSERT_TRUE(tree.Unserialize(update));
+ EXPECT_THAT(
+ event_generator,
+ IsSupersetOf(
+ {HasEventAtNode(AXEventGenerator::Event::SELECTED_VALUE_CHANGED,
+ popup_button.id),
+ HasEventAtNode(AXEventGenerator::Event::SELECTED_CHANGED,
+ menu_list_option_1.id),
+ HasEventAtNode(AXEventGenerator::Event::SELECTED_CHANGED,
+ menu_list_option_2.id),
+ HasEventAtNode(AXEventGenerator::Event::SELECTED_VALUE_CHANGED,
+ list_box.id),
+ HasEventAtNode(AXEventGenerator::Event::SELECTED_CHANGED,
+ list_box_option_1.id),
+ HasEventAtNode(AXEventGenerator::Event::SELECTED_CHANGED,
+ list_box_option_2.id)}));
+}
+
+TEST(AXEventGeneratorTest, SelectionInTextFieldChanged) {
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
+
+ AXNodeData text_field;
+ text_field.id = 2;
+ text_field.role = ax::mojom::Role::kTextField;
+ text_field.SetValue("Testing");
+ text_field.AddState(ax::mojom::State::kEditable);
+ text_field.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true);
+
+ root.child_ids = {text_field.id};
+
+ AXTreeUpdate initial_state;
+ initial_state.root_id = root.id;
+ initial_state.nodes = {root, text_field};
+
+ AXTreeData tree_data;
+ tree_data.sel_anchor_object_id = text_field.id;
+ tree_data.sel_anchor_offset = 0;
+ tree_data.sel_focus_object_id = text_field.id;
+ tree_data.sel_focus_offset = 0;
+ initial_state.tree_data = tree_data;
+ initial_state.has_tree_data = true;
+ AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
- AXTreeUpdate update = initial_state;
- update.nodes[0].string_attributes.clear();
- update.nodes[0].AddStringAttribute(ax::mojom::StringAttribute::kValue,
- "After");
+ ASSERT_THAT(event_generator, IsEmpty());
+
+ {
+ AXTreeData tree_data;
+ tree_data.sel_anchor_object_id = text_field.id;
+ tree_data.sel_anchor_offset = 0;
+ tree_data.sel_focus_object_id = text_field.id;
+ tree_data.sel_focus_offset = 2;
+ AXTreeUpdate update;
+ update.tree_data = tree_data;
+ update.has_tree_data = true;
+
+ ASSERT_TRUE(tree.Unserialize(update));
+ EXPECT_THAT(
+ event_generator,
+ UnorderedElementsAre(
+ HasEventAtNode(AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED,
+ root.id),
+ HasEventAtNode(
+ AXEventGenerator::Event::SELECTION_IN_TEXT_FIELD_CHANGED,
+ text_field.id)));
+ }
+
+ event_generator.ClearEvents();
+ {
+ // A selection that does not include a text field in it should not raise the
+ // "SELECTION_IN_TEXT_FIELD_CHANGED" event.
+ AXTreeData tree_data;
+ tree_data.sel_anchor_object_id = root.id;
+ tree_data.sel_anchor_offset = 0;
+ tree_data.sel_focus_object_id = root.id;
+ tree_data.sel_focus_offset = 0;
+ AXTreeUpdate update;
+ update.tree_data = tree_data;
+ update.has_tree_data = true;
+
+ ASSERT_TRUE(tree.Unserialize(update));
+ EXPECT_THAT(
+ event_generator,
+ UnorderedElementsAre(HasEventAtNode(
+ AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED, root.id)));
+ }
+
+ event_generator.ClearEvents();
+ {
+ // A selection that spans more than one node but which nevertheless ends on
+ // a text field should still raise the "SELECTION_IN_TEXT_FIELD_CHANGED"
+ // event.
+ AXTreeData tree_data;
+ tree_data.sel_anchor_object_id = root.id;
+ tree_data.sel_anchor_offset = 0;
+ tree_data.sel_focus_object_id = text_field.id;
+ tree_data.sel_focus_offset = 2;
+ AXTreeUpdate update;
+ update.tree_data = tree_data;
+ update.has_tree_data = true;
+
+ ASSERT_TRUE(tree.Unserialize(update));
+ EXPECT_THAT(
+ event_generator,
+ UnorderedElementsAre(
+ HasEventAtNode(AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED,
+ root.id),
+ HasEventAtNode(
+ AXEventGenerator::Event::SELECTION_IN_TEXT_FIELD_CHANGED,
+ text_field.id)));
+ }
+}
+
+TEST(AXEventGeneratorTest, ValueInTextFieldChanged) {
+ AXNodeData text_field;
+ text_field.id = 1;
+ text_field.role = ax::mojom::Role::kTextField;
+ text_field.AddState(ax::mojom::State::kEditable);
+ text_field.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true);
+ text_field.SetValue("Before");
+
+ AXTreeUpdate initial_state;
+ initial_state.root_id = text_field.id;
+ initial_state.nodes = {text_field};
+
+ AXTree tree(initial_state);
+ AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
+
+ text_field.SetValue("After");
+ AXTreeUpdate update;
+ update.nodes = {text_field};
ASSERT_TRUE(tree.Unserialize(update));
- EXPECT_THAT(event_generator, UnorderedElementsAre(HasEventAtNode(
- AXEventGenerator::Event::VALUE_CHANGED, 1)));
+ EXPECT_THAT(event_generator,
+ UnorderedElementsAre(HasEventAtNode(
+ AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED,
+ text_field.id)));
}
TEST(AXEventGeneratorTest, FloatValueChanged) {
@@ -418,29 +644,38 @@ TEST(AXEventGeneratorTest, FloatValueChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].float_attributes.clear();
update.nodes[0].AddFloatAttribute(ax::mojom::FloatAttribute::kValueForRange,
2.0);
ASSERT_TRUE(tree.Unserialize(update));
- EXPECT_THAT(event_generator, UnorderedElementsAre(HasEventAtNode(
- AXEventGenerator::Event::VALUE_CHANGED, 1)));
+ EXPECT_THAT(event_generator,
+ UnorderedElementsAre(HasEventAtNode(
+ AXEventGenerator::Event::RANGE_VALUE_CHANGED, 1)));
}
TEST(AXEventGeneratorTest, InvalidStatusChanged) {
+ AXNodeData text_field;
+ text_field.id = 1;
+ text_field.role = ax::mojom::Role::kTextField;
+ text_field.AddState(ax::mojom::State::kEditable);
+ text_field.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true);
+ text_field.AddStringAttribute(ax::mojom::StringAttribute::kValue, "Text");
+
AXTreeUpdate initial_state;
- initial_state.root_id = 1;
- initial_state.nodes.resize(1);
- initial_state.nodes[0].id = 1;
- initial_state.nodes[0].role = ax::mojom::Role::kTextField;
- initial_state.nodes[0].AddStringAttribute(ax::mojom::StringAttribute::kValue,
- "Text");
- AXTree tree(initial_state);
+ initial_state.root_id = text_field.id;
+ initial_state.nodes = {text_field};
+ AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
- AXTreeUpdate update = initial_state;
- update.nodes[0].SetInvalidState(ax::mojom::InvalidState::kTrue);
+ ASSERT_THAT(event_generator, IsEmpty());
+
+ AXTreeUpdate update;
+ text_field.SetInvalidState(ax::mojom::InvalidState::kTrue);
+ update.nodes = {text_field};
+
ASSERT_TRUE(tree.Unserialize(update));
EXPECT_THAT(event_generator,
UnorderedElementsAre(HasEventAtNode(
@@ -455,6 +690,7 @@ TEST(AXEventGeneratorTest, AddLiveRegionAttribute) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddStringAttribute(ax::mojom::StringAttribute::kLiveStatus,
"polite");
@@ -492,6 +728,7 @@ TEST(AXEventGeneratorTest, CheckedStateChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].SetCheckedState(ax::mojom::CheckedState::kTrue);
ASSERT_TRUE(tree.Unserialize(update));
@@ -520,6 +757,7 @@ TEST(AXEventGeneratorTest, ActiveDescendantChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].int_attributes.clear();
update.nodes[0].AddIntAttribute(ax::mojom::IntAttribute::kActivedescendantId,
@@ -540,6 +778,7 @@ TEST(AXEventGeneratorTest, CreateAlertAndLiveRegion) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes.resize(4);
update.nodes[0].child_ids.push_back(2);
@@ -599,6 +838,7 @@ TEST(AXEventGeneratorTest, LiveRegionChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].string_attributes.clear();
update.nodes[1].AddStringAttribute(
@@ -648,6 +888,7 @@ TEST(AXEventGeneratorTest, LiveRegionOnlyTextChanges) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].AddStringAttribute(ax::mojom::StringAttribute::kDescription,
"Description 1");
@@ -693,6 +934,7 @@ TEST(AXEventGeneratorTest, BusyLiveRegionChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].string_attributes.clear();
update.nodes[1].AddStringAttribute(
@@ -722,6 +964,7 @@ TEST(AXEventGeneratorTest, AddChild) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes.resize(3);
update.nodes[0].child_ids.push_back(3);
@@ -746,6 +989,7 @@ TEST(AXEventGeneratorTest, RemoveChild) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes.resize(2);
update.nodes[0].child_ids.clear();
@@ -769,6 +1013,7 @@ TEST(AXEventGeneratorTest, ReorderChildren) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].child_ids.clear();
update.nodes[0].child_ids.push_back(3);
@@ -788,6 +1033,7 @@ TEST(AXEventGeneratorTest, ScrollHorizontalPositionChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddIntAttribute(ax::mojom::IntAttribute::kScrollX, 10);
EXPECT_TRUE(tree.Unserialize(update));
@@ -805,6 +1051,7 @@ TEST(AXEventGeneratorTest, ScrollVerticalPositionChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddIntAttribute(ax::mojom::IntAttribute::kScrollY, 10);
ASSERT_TRUE(tree.Unserialize(update));
@@ -850,6 +1097,7 @@ TEST(AXEventGeneratorTest, TextAttributeChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].AddIntAttribute(ax::mojom::IntAttribute::kColor, 0);
update.nodes[2].AddIntAttribute(ax::mojom::IntAttribute::kBackgroundColor, 0);
@@ -925,6 +1173,7 @@ TEST(AXEventGeneratorTest, ObjectAttributeChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].AddIntAttribute(ax::mojom::IntAttribute::kTextAlign, 2);
update.nodes[2].AddFloatAttribute(ax::mojom::FloatAttribute::kTextIndent,
@@ -960,6 +1209,7 @@ TEST(AXEventGeneratorTest, OtherAttributeChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].AddStringAttribute(ax::mojom::StringAttribute::kLanguage,
"de");
@@ -993,6 +1243,7 @@ TEST(AXEventGeneratorTest, NameChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].AddStringAttribute(ax::mojom::StringAttribute::kName,
"Hello");
@@ -1009,6 +1260,7 @@ TEST(AXEventGeneratorTest, DescriptionChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddStringAttribute(ax::mojom::StringAttribute::kDescription,
"Hello");
@@ -1026,6 +1278,7 @@ TEST(AXEventGeneratorTest, RoleChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].role = ax::mojom::Role::kCheckBox;
ASSERT_TRUE(tree.Unserialize(update));
@@ -1050,6 +1303,7 @@ TEST(AXEventGeneratorTest, MenuItemSelected) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].int_attributes.clear();
update.nodes[0].AddIntAttribute(ax::mojom::IntAttribute::kActivedescendantId,
@@ -1086,13 +1340,15 @@ TEST(AXEventGeneratorTest, NodeBecomesIgnored) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[3].AddState(ax::mojom::State::kIgnored);
ASSERT_TRUE(tree.Unserialize(update));
EXPECT_THAT(event_generator,
UnorderedElementsAre(
HasEventAtNode(AXEventGenerator::Event::CHILDREN_CHANGED, 2),
- HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 4)));
+ HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 4),
+ HasEventAtNode(AXEventGenerator::Event::PARENT_CHANGED, 5)));
}
TEST(AXEventGeneratorTest, NodeBecomesIgnored2) {
@@ -1118,6 +1374,7 @@ TEST(AXEventGeneratorTest, NodeBecomesIgnored2) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
// Marking as ignored should fire CHILDREN_CHANGED on 2
update.nodes[3].AddState(ax::mojom::State::kIgnored);
@@ -1155,6 +1412,7 @@ TEST(AXEventGeneratorTest, NodeBecomesUnignored) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[3].state = 0;
ASSERT_TRUE(tree.Unserialize(update));
@@ -1162,7 +1420,8 @@ TEST(AXEventGeneratorTest, NodeBecomesUnignored) {
UnorderedElementsAre(
HasEventAtNode(AXEventGenerator::Event::CHILDREN_CHANGED, 2),
HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 4),
- HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 4)));
+ HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 4),
+ HasEventAtNode(AXEventGenerator::Event::PARENT_CHANGED, 5)));
}
TEST(AXEventGeneratorTest, NodeBecomesUnignored2) {
@@ -1189,6 +1448,7 @@ TEST(AXEventGeneratorTest, NodeBecomesUnignored2) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
// Marking as no longer ignored should fire CHILDREN_CHANGED on 2
update.nodes[3].state = 0;
@@ -1203,6 +1463,77 @@ TEST(AXEventGeneratorTest, NodeBecomesUnignored2) {
HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 4)));
}
+TEST(AXEventGeneratorTest, NodeInsertedViaRoleChange) {
+ // This test inserts a kSearch in between the kRootWebArea and the kTextField,
+ // but the node id are updated reflecting position in the tree. This results
+ // in node 2's role changing along with node 3 being created and added as a
+ // child of node 2.
+ AXTreeUpdate initial_state;
+ initial_state.root_id = 1;
+ initial_state.nodes.resize(2);
+ initial_state.nodes[0].id = 1;
+ initial_state.nodes[0].role = ax::mojom::Role::kRootWebArea;
+ initial_state.nodes[0].child_ids.push_back(2);
+ initial_state.nodes[1].id = 2;
+ initial_state.nodes[1].role = ax::mojom::Role::kTextField;
+ AXTree tree(initial_state);
+
+ AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
+ AXTreeUpdate update;
+ update.root_id = 1;
+ update.nodes.resize(3);
+ update.nodes[0].id = 1;
+ update.nodes[0].role = ax::mojom::Role::kRootWebArea;
+ update.nodes[0].child_ids.push_back(2);
+ update.nodes[1].id = 2;
+ update.nodes[1].role = ax::mojom::Role::kSearch;
+ update.nodes[1].child_ids.push_back(3);
+ update.nodes[2].id = 3;
+ update.nodes[2].role = ax::mojom::Role::kTextField;
+ ASSERT_TRUE(tree.Unserialize(update));
+ EXPECT_THAT(event_generator,
+ UnorderedElementsAre(
+ HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 3),
+ HasEventAtNode(AXEventGenerator::Event::CHILDREN_CHANGED, 2),
+ HasEventAtNode(AXEventGenerator::Event::ROLE_CHANGED, 2)));
+}
+
+TEST(AXEventGeneratorTest, NodeInserted) {
+ // This test inserts a kSearch in between the kRootWebArea and the kTextField.
+ // The node ids reflect the creation order, and the kTextField is not changed.
+ // Thus this is more like a reparenting.
+ AXTreeUpdate initial_state;
+ initial_state.root_id = 1;
+ initial_state.nodes.resize(2);
+ initial_state.nodes[0].id = 1;
+ initial_state.nodes[0].role = ax::mojom::Role::kRootWebArea;
+ initial_state.nodes[0].child_ids.push_back(2);
+ initial_state.nodes[1].id = 2;
+ initial_state.nodes[1].role = ax::mojom::Role::kTextField;
+ AXTree tree(initial_state);
+
+ AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
+ AXTreeUpdate update;
+ update.root_id = 1;
+ update.nodes.resize(3);
+ update.nodes[0].id = 1;
+ update.nodes[0].role = ax::mojom::Role::kRootWebArea;
+ update.nodes[0].child_ids.push_back(3);
+ update.nodes[1].id = 3;
+ update.nodes[1].role = ax::mojom::Role::kSearch;
+ update.nodes[1].child_ids.push_back(2);
+ update.nodes[2].id = 2;
+ update.nodes[2].role = ax::mojom::Role::kTextField;
+ ASSERT_TRUE(tree.Unserialize(update));
+ EXPECT_THAT(event_generator,
+ UnorderedElementsAre(
+ HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 3),
+ HasEventAtNode(AXEventGenerator::Event::CHILDREN_CHANGED, 1),
+ HasEventAtNode(AXEventGenerator::Event::PARENT_CHANGED, 2)));
+}
+
TEST(AXEventGeneratorTest, SubtreeBecomesUnignored) {
AXTreeUpdate initial_state;
initial_state.root_id = 1;
@@ -1221,6 +1552,7 @@ TEST(AXEventGeneratorTest, SubtreeBecomesUnignored) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].RemoveState(ax::mojom::State::kIgnored);
update.nodes[2].RemoveState(ax::mojom::State::kIgnored);
@@ -1249,6 +1581,7 @@ TEST(AXEventGeneratorTest, TwoNodesSwapIgnored) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].AddState(ax::mojom::State::kIgnored);
update.nodes[2].RemoveState(ax::mojom::State::kIgnored);
@@ -1278,6 +1611,7 @@ TEST(AXEventGeneratorTest, TwoNodesSwapIgnored2) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].RemoveState(ax::mojom::State::kIgnored);
update.nodes[2].AddState(ax::mojom::State::kIgnored);
@@ -1320,6 +1654,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly1) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].AddState(ax::mojom::State::kIgnored);
update.nodes[2].RemoveState(ax::mojom::State::kIgnored);
@@ -1368,6 +1703,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly2) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[2].AddState(ax::mojom::State::kIgnored);
update.nodes[3].RemoveState(ax::mojom::State::kIgnored);
@@ -1417,6 +1753,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly3) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddState(ax::mojom::State::kIgnored);
update.nodes[2].RemoveState(ax::mojom::State::kIgnored);
@@ -1426,6 +1763,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly3) {
UnorderedElementsAre(
HasEventAtNode(AXEventGenerator::Event::CHILDREN_CHANGED, 2),
HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 1),
+ HasEventAtNode(AXEventGenerator::Event::PARENT_CHANGED, 2),
HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 3),
HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 3)));
}
@@ -1498,6 +1836,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly4) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[5].RemoveState(ax::mojom::State::kIgnored);
update.nodes[6].RemoveState(ax::mojom::State::kIgnored);
@@ -1580,6 +1919,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly5) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddState(ax::mojom::State::kIgnored);
update.nodes[5].RemoveState(ax::mojom::State::kIgnored);
@@ -1591,6 +1931,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly5) {
HasEventAtNode(AXEventGenerator::Event::CHILDREN_CHANGED, 5),
HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 6),
HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 1),
+ HasEventAtNode(AXEventGenerator::Event::PARENT_CHANGED, 2),
HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 6)));
}
@@ -1661,6 +2002,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly6) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].RemoveState(ax::mojom::State::kIgnored);
update.nodes[5].RemoveState(ax::mojom::State::kIgnored);
@@ -1674,6 +2016,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly6) {
HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 6),
HasEventAtNode(AXEventGenerator::Event::SUBTREE_CREATED, 7),
HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 1),
+ HasEventAtNode(AXEventGenerator::Event::PARENT_CHANGED, 2),
HasEventAtNode(AXEventGenerator::Event::IGNORED_CHANGED, 8)));
}
@@ -1734,6 +2077,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly7) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].RemoveState(ax::mojom::State::kIgnored);
update.nodes[1].RemoveState(ax::mojom::State::kIgnored);
@@ -1813,6 +2157,7 @@ TEST(AXEventGeneratorTest, IgnoredChangedFiredOnAncestorOnly8) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].RemoveState(ax::mojom::State::kIgnored);
update.nodes[2].RemoveState(ax::mojom::State::kIgnored);
@@ -1853,18 +2198,23 @@ TEST(AXEventGeneratorTest, ActiveDescendantChangeOnDescendant) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
initial_state.nodes[2].RemoveIntAttribute(
ax::mojom::IntAttribute::kActivedescendantId);
initial_state.nodes[2].AddIntAttribute(
ax::mojom::IntAttribute::kActivedescendantId, 5);
AXTreeUpdate update = initial_state;
+ // Setting the node_id_to_clear causes AXTree::ComputePendingChangesToNode to
+ // create all of the node's children. Since node 3 already exists and remains
+ // in the tree, that (re)created child is reporting a new parent.
update.node_id_to_clear = 2;
ASSERT_TRUE(tree.Unserialize(update));
EXPECT_THAT(
event_generator,
UnorderedElementsAre(
HasEventAtNode(AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED, 3),
- HasEventAtNode(AXEventGenerator::Event::RELATED_NODE_CHANGED, 3)));
+ HasEventAtNode(AXEventGenerator::Event::RELATED_NODE_CHANGED, 3),
+ HasEventAtNode(AXEventGenerator::Event::PARENT_CHANGED, 3)));
}
TEST(AXEventGeneratorTest, ImageAnnotationChanged) {
@@ -1875,6 +2225,7 @@ TEST(AXEventGeneratorTest, ImageAnnotationChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddStringAttribute(
ax::mojom::StringAttribute::kImageAnnotation, "Hello");
@@ -1892,6 +2243,7 @@ TEST(AXEventGeneratorTest, ImageAnnotationStatusChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].SetImageAnnotationStatus(
ax::mojom::ImageAnnotationStatus::kAnnotationSucceeded);
@@ -2043,6 +2395,7 @@ TEST(AXEventGeneratorTest, AriaBusyChanged) {
true);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddBoolAttribute(ax::mojom::BoolAttribute::kBusy, false);
@@ -2065,6 +2418,7 @@ TEST(AXEventGeneratorTest, MultiselectableStateChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddState(ax::mojom::State::kMultiselectable);
@@ -2080,18 +2434,25 @@ TEST(AXEventGeneratorTest, MultiselectableStateChanged) {
}
TEST(AXEventGeneratorTest, RequiredStateChanged) {
+ AXNodeData text_field;
+ text_field.id = 1;
+ text_field.role = ax::mojom::Role::kTextField;
+ text_field.AddState(ax::mojom::State::kEditable);
+ text_field.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true);
+
AXTreeUpdate initial_state;
- initial_state.root_id = 1;
- initial_state.nodes.resize(1);
- initial_state.nodes[0].id = 1;
- initial_state.nodes[0].role = ax::mojom::Role::kTextField;
+ initial_state.root_id = text_field.id;
+ initial_state.nodes = {text_field};
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
- AXTreeUpdate update = initial_state;
+ ASSERT_THAT(event_generator, IsEmpty());
- update.nodes[0].AddState(ax::mojom::State::kRequired);
- EXPECT_TRUE(tree.Unserialize(update));
+ AXTreeUpdate update;
+ text_field.AddState(ax::mojom::State::kRequired);
+ update.nodes = {text_field};
+
+ ASSERT_TRUE(tree.Unserialize(update));
EXPECT_THAT(
event_generator,
UnorderedElementsAre(
@@ -2124,6 +2485,7 @@ TEST(AXEventGeneratorTest, FlowToChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[1].AddIntListAttribute(ax::mojom::IntListAttribute::kFlowtoIds,
{4, 5, 6});
@@ -2149,6 +2511,7 @@ TEST(AXEventGeneratorTest, ControlsChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
std::vector<int> ids = {2};
@@ -2170,6 +2533,7 @@ TEST(AXEventGeneratorTest, AtomicChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddBoolAttribute(ax::mojom::BoolAttribute::kLiveAtomic, true);
@@ -2187,6 +2551,7 @@ TEST(AXEventGeneratorTest, DropeffectChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddDropeffect(ax::mojom::Dropeffect::kCopy);
@@ -2204,6 +2569,7 @@ TEST(AXEventGeneratorTest, GrabbedChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddBoolAttribute(ax::mojom::BoolAttribute::kGrabbed, true);
@@ -2221,6 +2587,7 @@ TEST(AXEventGeneratorTest, HasPopupChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].SetHasPopup(ax::mojom::HasPopup::kTrue);
@@ -2241,6 +2608,7 @@ TEST(AXEventGeneratorTest, LiveRelevantChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddStringAttribute(ax::mojom::StringAttribute::kLiveRelevant,
@@ -2259,6 +2627,7 @@ TEST(AXEventGeneratorTest, MultilineStateChanged) {
AXTree tree(initial_state);
AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
AXTreeUpdate update = initial_state;
update.nodes[0].AddState(ax::mojom::State::kMultiline);
@@ -2272,4 +2641,47 @@ TEST(AXEventGeneratorTest, MultilineStateChanged) {
1)));
}
+TEST(AXEventGeneratorTest, EditableTextChanged) {
+ AXNodeData root;
+ root.id = 1;
+ root.role = ax::mojom::Role::kRootWebArea;
+
+ AXNodeData text_field;
+ text_field.id = 2;
+ text_field.role = ax::mojom::Role::kTextField;
+ text_field.AddState(ax::mojom::State::kEditable);
+ text_field.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true);
+ text_field.SetValue("Before");
+ root.child_ids = {text_field.id};
+
+ AXNodeData static_text;
+ static_text.id = 3;
+ static_text.role = ax::mojom::Role::kStaticText;
+ static_text.AddState(ax::mojom::State::kEditable);
+ static_text.SetName("Before");
+ text_field.child_ids = {static_text.id};
+
+ AXTreeUpdate initial_state;
+ initial_state.root_id = root.id;
+ initial_state.nodes = {root, text_field, static_text};
+ AXTree tree(initial_state);
+ AXEventGenerator event_generator(&tree);
+ ASSERT_THAT(event_generator, IsEmpty());
+
+ text_field.SetValue("After");
+ static_text.SetName("After");
+ AXTreeUpdate update;
+ update.nodes = {text_field, static_text};
+
+ ASSERT_TRUE(tree.Unserialize(update));
+ EXPECT_THAT(
+ event_generator,
+ UnorderedElementsAre(
+ HasEventAtNode(AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED,
+ text_field.id),
+ HasEventAtNode(AXEventGenerator::Event::NAME_CHANGED, static_text.id),
+ HasEventAtNode(AXEventGenerator::Event::EDITABLE_TEXT_CHANGED,
+ text_field.id)));
+}
+
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_language_detection.cc b/chromium/ui/accessibility/ax_language_detection.cc
index 433eae37389..8eed3f994ba 100644
--- a/chromium/ui/accessibility/ax_language_detection.cc
+++ b/chromium/ui/accessibility/ax_language_detection.cc
@@ -151,7 +151,7 @@ void AXLanguageInfoStats::ReportMetrics() {
int percentage_detected =
count_detection_results_ * 100 / count_detection_attempted_;
- base::UmaHistogramPercentage(
+ base::UmaHistogramPercentageObsoleteDoNotUse(
"Accessibility.LanguageDetection.PercentageLanguageDetected",
percentage_detected);
@@ -165,12 +165,12 @@ void AXLanguageInfoStats::ReportMetrics() {
if (count_labelled_) {
int percentage_top =
count_labelled_with_top_result_ * 100 / count_labelled_;
- base::UmaHistogramPercentage(
+ base::UmaHistogramPercentageObsoleteDoNotUse(
"Accessibility.LanguageDetection.PercentageLabelledWithTop",
percentage_top);
int percentage_overridden = count_overridden_ * 100 / count_labelled_;
- base::UmaHistogramPercentage(
+ base::UmaHistogramPercentageObsoleteDoNotUse(
"Accessibility.LanguageDetection.PercentageOverridden",
percentage_overridden);
}
diff --git a/chromium/ui/accessibility/ax_mode.cc b/chromium/ui/accessibility/ax_mode.cc
index 7919464eb0a..c41212220bb 100644
--- a/chromium/ui/accessibility/ax_mode.cc
+++ b/chromium/ui/accessibility/ax_mode.cc
@@ -6,6 +6,7 @@
#include <vector>
+#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
namespace ui {
@@ -15,13 +16,13 @@ std::ostream& operator<<(std::ostream& stream, const AXMode& mode) {
}
std::string AXMode::ToString() const {
- std::vector<std::string> tokens;
+ std::vector<base::StringPiece> tokens;
// Written as a loop with a switch so that this crashes if a new
// mode flag is added without adding support for logging it.
for (uint32_t mode_flag = AXMode::kFirstModeFlag;
mode_flag <= AXMode::kLastModeFlag; mode_flag = mode_flag << 1) {
- const char* flag_name = nullptr;
+ base::StringPiece flag_name;
switch (mode_flag) {
case AXMode::kNativeAPIs:
flag_name = "kNativeAPIs";
@@ -46,7 +47,7 @@ std::string AXMode::ToString() const {
break;
}
- DCHECK(flag_name);
+ DCHECK(!flag_name.empty());
if (has_mode(mode_flag))
tokens.push_back(flag_name);
diff --git a/chromium/ui/accessibility/ax_node.cc b/chromium/ui/accessibility/ax_node.cc
index da368ef0f1d..6fddfb98d71 100644
--- a/chromium/ui/accessibility/ax_node.cc
+++ b/chromium/ui/accessibility/ax_node.cc
@@ -8,9 +8,12 @@
#include <utility>
#include "base/strings/string16.h"
+#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
+#include "third_party/skia/include/core/SkColor.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_language_detection.h"
#include "ui/accessibility/ax_role_properties.h"
@@ -483,6 +486,28 @@ void AXNode::ClearLanguageInfo() {
language_info_.reset();
}
+std::string AXNode::GetHypertext() const {
+ if (IsLeaf())
+ return GetInnerText();
+
+ // Construct the hypertext for this node, which contains the concatenation of
+ // the inner text of this node's textual children, and an embedded object
+ // character for all the other children.
+ const std::string embedded_character_str("\xEF\xBF\xBC");
+ std::string hypertext;
+ for (auto it = UnignoredChildrenBegin(); it != UnignoredChildrenEnd(); ++it) {
+ // Similar to Firefox, we don't expose text nodes in IAccessible2 and ATK
+ // hypertext with the embedded object character. We copy all of their text
+ // instead.
+ if (it->IsText()) {
+ hypertext += it->GetInnerText();
+ } else {
+ hypertext += embedded_character_str;
+ }
+ }
+ return hypertext;
+}
+
std::string AXNode::GetInnerText() const {
// If a text field has no descendants, then we compute its inner text from its
// value or its placeholder. Otherwise we prefer to look at its descendant
@@ -562,6 +587,18 @@ std::string AXNode::GetLanguage() const {
return std::string();
}
+std::string AXNode::GetValueForControl() const {
+ if (data().IsTextField())
+ return GetValueForTextField();
+ if (data().IsRangeValueSupported())
+ return GetTextForRangeValue();
+ if (data().role == ax::mojom::Role::kColorWell)
+ return GetValueForColorWell();
+ if (!IsControl(data().role))
+ return std::string();
+ return data().GetStringAttribute(ax::mojom::StringAttribute::kValue);
+}
+
std::ostream& operator<<(std::ostream& stream, const AXNode& node) {
return stream << node.data().ToString();
}
@@ -1094,6 +1131,44 @@ AXNode* AXNode::ComputeFirstUnignoredChildRecursive() const {
return nullptr;
}
+std::string AXNode::GetTextForRangeValue() const {
+ DCHECK(data().IsRangeValueSupported());
+ std::string range_value =
+ data().GetStringAttribute(ax::mojom::StringAttribute::kValue);
+ float numeric_value;
+ if (range_value.empty() &&
+ data().GetFloatAttribute(ax::mojom::FloatAttribute::kValueForRange,
+ &numeric_value)) {
+ range_value = base::NumberToString(numeric_value);
+ }
+ return range_value;
+}
+
+std::string AXNode::GetValueForColorWell() const {
+ DCHECK_EQ(data().role, ax::mojom::Role::kColorWell);
+ // static cast because SkColor is a 4-byte unsigned int
+ unsigned int color = static_cast<unsigned int>(
+ data().GetIntAttribute(ax::mojom::IntAttribute::kColorValue));
+
+ unsigned int red = SkColorGetR(color);
+ unsigned int green = SkColorGetG(color);
+ unsigned int blue = SkColorGetB(color);
+ return base::StringPrintf("%d%% red %d%% green %d%% blue", red * 100 / 255,
+ green * 100 / 255, blue * 100 / 255);
+}
+
+std::string AXNode::GetValueForTextField() const {
+ DCHECK(data().IsTextField());
+ std::string value =
+ data().GetStringAttribute(ax::mojom::StringAttribute::kValue);
+ // Some screen readers like Jaws and VoiceOver require a value to be set in
+ // text fields with rich content, even though the same information is
+ // available on the children.
+ if (value.empty() && data().IsRichTextField())
+ return GetInnerText();
+ return value;
+}
+
bool AXNode::IsIgnored() const {
return data().IsIgnored();
}
@@ -1223,16 +1298,24 @@ bool AXNode::IsEmbeddedGroup() const {
}
AXNode* AXNode::GetTextFieldAncestor() const {
- AXNode* parent = GetUnignoredParent();
-
- while (parent && parent->data().HasState(ax::mojom::State::kEditable)) {
- if (parent->data().IsPlainTextField() || parent->data().IsRichTextField())
- return parent;
-
- parent = parent->GetUnignoredParent();
+ // The descendants of a text field usually have State::kEditable, however in
+ // the case of Role::kSearchBox or Role::kSpinButton being the text field
+ // ancestor, its immediate descendant can have Role::kGenericContainer without
+ // State::kEditable.
+ for (AXNode* ancestor = const_cast<AXNode*>(this);
+ ancestor &&
+ (ancestor->data().HasState(ax::mojom::State::kEditable) ||
+ ancestor->data().role == ax::mojom::Role::kGenericContainer);
+ ancestor = ancestor->GetUnignoredParent()) {
+ if (ancestor->data().IsTextField())
+ return ancestor;
}
-
return nullptr;
}
+bool AXNode::IsDescendantOfPlainTextField() const {
+ AXNode* textfield_node = GetTextFieldAncestor();
+ return textfield_node && textfield_node->data().IsPlainTextField();
+}
+
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_node.h b/chromium/ui/accessibility/ax_node.h
index c59d00da334..7c531de5f5a 100644
--- a/chromium/ui/accessibility/ax_node.h
+++ b/chromium/ui/accessibility/ax_node.h
@@ -297,6 +297,16 @@ class AX_EXPORT AXNode final {
base::string16 GetInheritedString16Attribute(
ax::mojom::StringAttribute attribute) const;
+ // If this node is a leaf, returns the inner text of this node. This is
+ // equivalent to its visible accessible name. Otherwise, if this node is not a
+ // leaf, represents every non-textual child node with a special "embedded
+ // object character", and every textual child node with its inner text.
+ // Textual nodes include e.g. static text and white space.
+ //
+ // This is how displayed text and embedded objects are represented in
+ // ATK and IAccessible2 APIs.
+ std::string GetHypertext() const;
+
// Returns the text of this node and all descendant nodes; including text
// found in embedded objects.
//
@@ -305,7 +315,7 @@ class AX_EXPORT AXNode final {
// not returned.
std::string GetInnerText() const;
- // Return a string representing the language code.
+ // Returns a string representing the language code.
//
// This will consider the language declared in the DOM, and may eventually
// attempt to automatically detect the language from the text.
@@ -315,6 +325,13 @@ class AX_EXPORT AXNode final {
// Returns empty string if no appropriate language was found.
std::string GetLanguage() const;
+ // Returns the value of a control such as a text field, a slider, a <select>
+ // element, a date picker or an ARIA combo box. In order to minimize
+ // cross-process communication between the renderer and the browser, this
+ // method may compute the value from the control's inner text in the case of a
+ // text field.
+ std::string GetValueForControl() const;
+
//
// Helper functions for tables, table rows, and table cells.
// Most of these functions construct and cache an AXTableInfo behind
@@ -440,9 +457,14 @@ class AX_EXPORT AXNode final {
// collapsed.
AXNode* GetCollapsedMenuListPopUpButtonAncestor() const;
- // Returns the text field ancestor of this current node if any.
+ // If this node is within an editable region, returns the node that is at the
+ // root of that editable region, otherwise returns nullptr. In accessibility,
+ // an editable region is synonymous to a text field.
AXNode* GetTextFieldAncestor() const;
+ // Returns true if the ancestor of the current node is a plain text field.
+ bool IsDescendantOfPlainTextField() const;
+
// Finds and returns a pointer to ordered set containing node.
AXNode* GetOrderedSet() const;
@@ -459,6 +481,20 @@ class AX_EXPORT AXNode final {
AXNode* ComputeLastUnignoredChildRecursive() const;
AXNode* ComputeFirstUnignoredChildRecursive() const;
+ // Returns the value of a range control such as a slider or a scroll bar in
+ // text format.
+ std::string GetTextForRangeValue() const;
+
+ // Returns the value of a color well (a color chooser control) in a human
+ // readable format. For example: "50% red 40% green 90% blue".
+ std::string GetValueForColorWell() const;
+
+ // Returns the value of a text field. If necessary, computes the value from
+ // the field's internal representation in the accessibility tree, in order to
+ // minimize cross-process communication between the renderer and the browser
+ // processes.
+ std::string GetValueForTextField() const;
+
OwnerTree* const tree_; // Owns this.
size_t index_in_parent_;
size_t unignored_index_in_parent_;
diff --git a/chromium/ui/accessibility/ax_node_data.cc b/chromium/ui/accessibility/ax_node_data.cc
index aa827033978..e35efcdc9bb 100644
--- a/chromium/ui/accessibility/ax_node_data.cc
+++ b/chromium/ui/accessibility/ax_node_data.cc
@@ -959,8 +959,12 @@ bool AXNodeData::IsIgnored() const {
role == ax::mojom::Role::kIgnored;
}
+bool AXNodeData::IsInvisible() const {
+ return HasState(ax::mojom::State::kInvisible);
+}
+
bool AXNodeData::IsInvisibleOrIgnored() const {
- return IsIgnored() || HasState(ax::mojom::State::kInvisible);
+ return IsIgnored() || IsInvisible();
}
bool AXNodeData::IsInvocable() const {
@@ -1432,6 +1436,9 @@ std::string AXNodeData::ToString() const {
case ax::mojom::StringAttribute::kAriaInvalidValue:
result += " aria_invalid_value=" + value;
break;
+ case ax::mojom::StringAttribute::kCheckedStateDescription:
+ result += " checked_state_description=" + value;
+ break;
case ax::mojom::StringAttribute::kAutoComplete:
result += " autocomplete=" + value;
break;
diff --git a/chromium/ui/accessibility/ax_node_data.h b/chromium/ui/accessibility/ax_node_data.h
index bc2484cb711..f2a979d3316 100644
--- a/chromium/ui/accessibility/ax_node_data.h
+++ b/chromium/ui/accessibility/ax_node_data.h
@@ -220,6 +220,9 @@ struct AX_BASE_EXPORT AXNodeData {
// Helper to determine if the data has the ignored state or ignored role.
bool IsIgnored() const;
+ // Helper to determine if the data has the invisible state.
+ bool IsInvisible() const;
+
// Helper to determine if the data has the ignored state, the invisible state
// or the ignored role.
bool IsInvisibleOrIgnored() const;
diff --git a/chromium/ui/accessibility/ax_node_position.cc b/chromium/ui/accessibility/ax_node_position.cc
index f00db5fcdb5..798bc670cb9 100644
--- a/chromium/ui/accessibility/ax_node_position.cc
+++ b/chromium/ui/accessibility/ax_node_position.cc
@@ -5,6 +5,7 @@
#include "ui/accessibility/ax_node_position.h"
#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
@@ -179,36 +180,25 @@ AXTreeID AXNodePosition::GetTreeID(AXNode* node) const {
base::string16 AXNodePosition::GetText() const {
if (IsNullPosition())
- return {};
-
- base::string16 text;
- if (IsEmptyObjectReplacedByCharacter()) {
- text += kEmbeddedCharacter;
- return text;
- }
+ return base::string16();
+
+ // Special case, if a node has only ignored descendants, i.e., it appears to
+ // be empty to assistive software, on some platforms we need to still treat it
+ // as a character and a word boundary. We achieve this by adding an embedded
+ // object character in the text representation used by this class, but we
+ // don't expose that character to assistive software that tries to retrieve
+ // the node's inner text.
+ if (IsEmptyObjectReplacedByCharacter())
+ return base::string16(1, kEmbeddedCharacter);
const AXNode* anchor = GetAnchor();
DCHECK(anchor);
- // TODO(nektar): Replace with PlatformChildCount when AXNodePosition and
- // BrowserAccessibilityPosition are merged into one class.
- if (!AnchorChildCount()) {
- // Special case: Allows us to get text even in non-web content, e.g. in the
- // browser's UI.
- text =
- anchor->data().GetString16Attribute(ax::mojom::StringAttribute::kValue);
- if (!text.empty())
- return text;
- }
-
- if (anchor->IsText()) {
- return anchor->data().GetString16Attribute(
- ax::mojom::StringAttribute::kName);
+ switch (g_ax_embedded_object_behavior) {
+ case AXEmbeddedObjectBehavior::kSuppressCharacter:
+ return base::UTF8ToUTF16(anchor->GetInnerText());
+ case AXEmbeddedObjectBehavior::kExposeCharacter:
+ return base::UTF8ToUTF16(anchor->GetHypertext());
}
-
- for (int i = 0; i < AnchorChildCount(); ++i)
- text += CreateChildPositionAt(i)->GetText();
-
- return text;
}
bool AXNodePosition::IsInLineBreak() const {
@@ -248,21 +238,14 @@ int AXNodePosition::MaxTextOffset() const {
const AXNode* anchor = GetAnchor();
DCHECK(anchor);
// TODO(nektar): Replace with PlatformChildCount when AXNodePosition and
- // BrowserAccessibilityPosition will make one.
- if (!AnchorChildCount()) {
- base::string16 value =
- anchor->data().GetString16Attribute(ax::mojom::StringAttribute::kValue);
- if (!value.empty())
- return value.length();
- }
-
- if (anchor->IsText()) {
- return anchor->data()
- .GetString16Attribute(ax::mojom::StringAttribute::kName)
- .length();
- }
+ // BrowserAccessibilityPosition will be merged.
+ if (!AnchorChildCount() || anchor->IsText())
+ return base::UTF8ToUTF16(anchor->GetInnerText()).length();
int text_length = 0;
+ // This is an optimization over retrieving the text of the whole subtree and
+ // then finding its length. It saves time by adding lengths instead of
+ // concatenating strings.
for (int i = 0; i < AnchorChildCount(); ++i)
text_length += CreateChildPositionAt(i)->MaxTextOffset();
@@ -278,6 +261,7 @@ bool AXNodePosition::IsEmbeddedObjectInParent() const {
// nodes and nodes that are invisible to platform APIs. Textual nodes are
// represented by their actual text.
return !IsNullPosition() && !GetAnchor()->IsText() &&
+ !GetAnchor()->IsDescendantOfPlainTextField() &&
GetAnchor()->IsChildOfLeaf();
}
}
diff --git a/chromium/ui/accessibility/ax_node_position_unittest.cc b/chromium/ui/accessibility/ax_node_position_unittest.cc
index 4fa8a3c4df3..3e69e24f3b1 100644
--- a/chromium/ui/accessibility/ax_node_position_unittest.cc
+++ b/chromium/ui/accessibility/ax_node_position_unittest.cc
@@ -281,6 +281,9 @@ void AXPositionTest::SetUp() {
true);
button_.SetHasPopup(ax::mojom::HasPopup::kMenu);
button_.SetName("Button");
+ // Name is not visible in the tree's text representation, i.e. it may be
+ // coming from an aria-label.
+ button_.SetNameFrom(ax::mojom::NameFrom::kAttribute);
button_.relative_bounds.bounds = gfx::RectF(20, 20, 200, 30);
root_.child_ids.push_back(button_.id);
@@ -289,6 +292,9 @@ void AXPositionTest::SetUp() {
true);
check_box_.SetCheckedState(ax::mojom::CheckedState::kTrue);
check_box_.SetName("Check box");
+ // Name is not visible in the tree's text representation, i.e. it may be
+ // coming from an aria-label.
+ check_box_.SetNameFrom(ax::mojom::NameFrom::kAttribute);
check_box_.relative_bounds.bounds = gfx::RectF(20, 50, 200, 30);
root_.child_ids.push_back(check_box_.id);
@@ -1013,41 +1019,47 @@ TEST_F(AXPositionTest, GetMaxTextOffsetUpdate) {
root_data.id = 1;
root_data.role = ax::mojom::Role::kRootWebArea;
+ AXNodeData text_field_data;
+ text_field_data.id = 2;
+ text_field_data.role = ax::mojom::Role::kTextField;
+ text_field_data.SetName("some text");
+ text_field_data.SetNameFrom(ax::mojom::NameFrom::kPlaceholder);
+
AXNodeData text_data;
- text_data.id = 2;
+ text_data.id = 3;
text_data.role = ax::mojom::Role::kStaticText;
- text_data.SetName("some text");
-
- AXNodeData more_text_data;
- more_text_data.id = 3;
- more_text_data.role = ax::mojom::Role::kStaticText;
- more_text_data.SetName("more text");
+ text_data.SetName("more text");
+ text_data.SetNameFrom(ax::mojom::NameFrom::kContents);
- root_data.child_ids = {2, 3};
-
- SetTree(CreateAXTree({root_data, text_data, more_text_data}));
+ root_data.child_ids = {text_field_data.id, text_data.id};
+ SetTree(CreateAXTree({root_data, text_field_data, text_data}));
+ AssertTextLengthEquals(GetTree(), text_field_data.id, 9);
AssertTextLengthEquals(GetTree(), text_data.id, 9);
AssertTextLengthEquals(GetTree(), root_data.id, 18);
- text_data.SetName("Adjusted line 1");
- SetTree(CreateAXTree({root_data, text_data, more_text_data}));
+ // Update the placeholder text.
+ text_field_data.SetName("Adjusted line 1");
+ SetTree(CreateAXTree({root_data, text_field_data, text_data}));
- AssertTextLengthEquals(GetTree(), text_data.id, 15);
+ AssertTextLengthEquals(GetTree(), text_field_data.id, 15);
+ AssertTextLengthEquals(GetTree(), text_data.id, 9);
AssertTextLengthEquals(GetTree(), root_data.id, 24);
- // Value should override name
- text_data.SetValue("Value should override name");
- SetTree(CreateAXTree({root_data, text_data, more_text_data}));
+ // Value should override name in text fields.
+ text_field_data.SetValue("Value should override name");
+ SetTree(CreateAXTree({root_data, text_field_data, text_data}));
- AssertTextLengthEquals(GetTree(), text_data.id, 26);
+ AssertTextLengthEquals(GetTree(), text_field_data.id, 26);
+ AssertTextLengthEquals(GetTree(), text_data.id, 9);
AssertTextLengthEquals(GetTree(), root_data.id, 35);
- // An empty value should fall back to name
- text_data.SetValue("");
- SetTree(CreateAXTree({root_data, text_data, more_text_data}));
+ // An empty value should fall back to placeholder text.
+ text_field_data.SetValue("");
+ SetTree(CreateAXTree({root_data, text_field_data, text_data}));
- AssertTextLengthEquals(GetTree(), text_data.id, 15);
+ AssertTextLengthEquals(GetTree(), text_field_data.id, 15);
+ AssertTextLengthEquals(GetTree(), text_data.id, 9);
AssertTextLengthEquals(GetTree(), root_data.id, 24);
}
@@ -2130,6 +2142,7 @@ TEST_F(AXPositionTest, AtStartOrEndOfParagraphOnAListMarker) {
list_marker_ng.role = ax::mojom::Role::kListMarker;
list_marker_ng.SetName("2. ");
+ list_marker_ng.SetNameFrom(ax::mojom::NameFrom::kContents);
list_marker_ng.AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId,
inline_box4.id);
@@ -3435,6 +3448,7 @@ TEST_F(AXPositionTest, AsLeafTextPositionWithTextPositionAndEmptyTextSandwich) {
button_data.id = 3;
button_data.role = ax::mojom::Role::kButton;
button_data.SetName("");
+ button_data.SetNameFrom(ax::mojom::NameFrom::kContents);
AXNodeData more_text_data;
more_text_data.id = 4;
@@ -7493,6 +7507,8 @@ TEST_F(AXPositionTest, CreatePreviousWordPositionInList) {
TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) {
g_ax_embedded_object_behavior = AXEmbeddedObjectBehavior::kExposeCharacter;
+ const base::string16 embedded_character_str(
+ 1, AXNodePosition::kEmbeddedCharacter);
// ++1 kRootWebArea
// ++++2 kStaticText
@@ -7615,137 +7631,148 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) {
TestPositionType result_position =
position->CreateNextWordStartPosition(AXBoundaryBehavior::CrossBoundary);
- std::string expectations =
- "TextPosition anchor_id=5 text_offset=0 affinity=downstream "
- "annotated_text=<\xEF\xBF\xBC>";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(generic_container_5.id, result_position->anchor_id());
+ EXPECT_EQ(0, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(embedded_character_str, result_position->GetText());
position = std::move(result_position);
result_position =
position->CreateNextWordStartPosition(AXBoundaryBehavior::CrossBoundary);
- expectations =
- "TextPosition anchor_id=7 text_offset=1 affinity=downstream "
- "annotated_text= <w>orld";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(inline_box_7.id, result_position->anchor_id());
+ EXPECT_EQ(1, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(base::WideToUTF16(L" world"), result_position->GetText());
// CreatePreviousWordStartPosition tests.
position = std::move(result_position);
result_position = position->CreatePreviousWordStartPosition(
AXBoundaryBehavior::CrossBoundary);
- expectations =
- "TextPosition anchor_id=5 text_offset=0 affinity=downstream "
- "annotated_text=<\xEF\xBF\xBC>";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(generic_container_5.id, result_position->anchor_id());
+ EXPECT_EQ(0, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(embedded_character_str, result_position->GetText());
position = std::move(result_position);
result_position = position->CreatePreviousWordStartPosition(
AXBoundaryBehavior::CrossBoundary);
- expectations =
- "TextPosition anchor_id=3 text_offset=0 affinity=downstream "
- "annotated_text=<H>ello ";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(inline_box_3.id, result_position->anchor_id());
+ EXPECT_EQ(0, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(base::WideToUTF16(L"Hello "), result_position->GetText());
// CreateNextWordEndPosition tests.
position = std::move(result_position);
result_position =
position->CreateNextWordEndPosition(AXBoundaryBehavior::CrossBoundary);
- expectations =
- "TextPosition anchor_id=3 text_offset=6 affinity=downstream "
- "annotated_text=Hello <>";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(inline_box_3.id, result_position->anchor_id());
+ EXPECT_EQ(6, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(base::WideToUTF16(L"Hello "), result_position->GetText());
position = std::move(result_position);
result_position =
position->CreateNextWordEndPosition(AXBoundaryBehavior::CrossBoundary);
- expectations =
- "TextPosition anchor_id=5 text_offset=1 affinity=downstream "
- "annotated_text=\xEF\xBF\xBC<>";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(generic_container_5.id, result_position->anchor_id());
+ EXPECT_EQ(1, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(embedded_character_str, result_position->GetText());
position = std::move(result_position);
result_position =
position->CreateNextWordEndPosition(AXBoundaryBehavior::CrossBoundary);
- expectations =
- "TextPosition anchor_id=7 text_offset=6 affinity=downstream "
- "annotated_text= world<>";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(inline_box_7.id, result_position->anchor_id());
+ EXPECT_EQ(6, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(base::WideToUTF16(L" world"), result_position->GetText());
// CreatePreviousWordEndPosition tests.
position = std::move(result_position);
result_position = position->CreatePreviousWordEndPosition(
AXBoundaryBehavior::CrossBoundary);
- expectations =
- "TextPosition anchor_id=5 text_offset=1 affinity=downstream "
- "annotated_text=\xEF\xBF\xBC<>";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(generic_container_5.id, result_position->anchor_id());
+ EXPECT_EQ(1, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(embedded_character_str, result_position->GetText());
position = std::move(result_position);
result_position = position->CreatePreviousWordEndPosition(
AXBoundaryBehavior::CrossBoundary);
- expectations =
- "TextPosition anchor_id=3 text_offset=6 affinity=downstream "
- "annotated_text=Hello <>";
- ASSERT_EQ(result_position->ToString(), expectations);
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(inline_box_3.id, result_position->anchor_id());
+ EXPECT_EQ(6, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(base::WideToUTF16(L"Hello "), result_position->GetText());
// GetText() with embedded object replacement character test.
position = AXNodePosition::CreateTextPosition(
GetTreeID(), generic_container_5.id, 0 /* text_offset */,
ax::mojom::TextAffinity::kDownstream);
- base::string16 expected_text;
- expected_text += AXNodePosition::kEmbeddedCharacter;
- ASSERT_EQ(expected_text, position->GetText());
+ EXPECT_EQ(embedded_character_str, position->GetText());
- // GetText() on a node parent of text nodes and an embedded object replacement
+ // GetText() on a node that is the parent of a set of text nodes and a
+ // non-text node, the latter represented by an embedded object replacement
// character.
position = AXNodePosition::CreateTextPosition(
GetTreeID(), root_1.id, 0 /* text_offset */,
ax::mojom::TextAffinity::kDownstream);
- expected_text =
+ base::string16 expected_text =
base::WideToUTF16(L"Hello ") + AXNodePosition::kEmbeddedCharacter +
- base::WideToUTF16(L" world3.14") + AXNodePosition::kEmbeddedCharacter +
- base::WideToUTF16(L"hey") + AXNodePosition::kEmbeddedCharacter;
- ASSERT_EQ(expected_text, position->GetText());
+ base::WideToUTF16(L" world") + AXNodePosition::kEmbeddedCharacter +
+ AXNodePosition::kEmbeddedCharacter + base::WideToUTF16(L"hey") +
+ AXNodePosition::kEmbeddedCharacter;
+ EXPECT_EQ(expected_text, position->GetText());
- // MaxTextOffset() with an embedded object replacement character.
+ // MaxTextOffset() on a non-text node. This is represented by an embedded
+ // object replacement character.
position = AXNodePosition::CreateTextPosition(
GetTreeID(), generic_container_5.id, 0 /* text_offset */,
ax::mojom::TextAffinity::kDownstream);
-
- ASSERT_EQ(1, position->MaxTextOffset());
+ EXPECT_EQ(1, position->MaxTextOffset());
// Parent positions created from a position inside a node represented by an
// embedded object replacement character.
position = position->CreateParentPosition();
- expectations =
- "TextPosition anchor_id=4 text_offset=0 affinity=downstream "
- "annotated_text=<\xEF\xBF\xBC>";
- ASSERT_EQ(position->ToString(), expectations);
- ASSERT_EQ(1, position->MaxTextOffset());
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(inline_box_3.id, result_position->anchor_id());
+ EXPECT_EQ(6, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(base::WideToUTF16(L"Hello "), result_position->GetText());
+ EXPECT_EQ(1, position->MaxTextOffset());
position = position->CreateParentPosition();
- expectations =
- "TextPosition anchor_id=1 text_offset=6 affinity=downstream "
- "annotated_text=Hello <\xEF\xBF\xBC> "
- "world3.14\xEF\xBF\xBChey\xEF\xBF\xBC";
- ASSERT_EQ(position->ToString(), expectations);
- ASSERT_EQ(22, position->MaxTextOffset());
-
- // MaxTextOffset() on a node parent of text nodes and an embedded object
- // replacement character.
+ EXPECT_TRUE(result_position->IsTextPosition());
+ EXPECT_EQ(inline_box_3.id, result_position->anchor_id());
+ EXPECT_EQ(6, result_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, result_position->affinity());
+ EXPECT_EQ(base::WideToUTF16(L"Hello "), result_position->GetText());
+ EXPECT_EQ(22, position->MaxTextOffset());
+
+ // MaxTextOffset() on a node which is the parent of a set of text nodes and an
+ // a non-text node, the latter represented by an embedded object replacement
+ // character.
position = AXNodePosition::CreateTextPosition(
GetTreeID(), root_1.id, 0 /* text_offset */,
ax::mojom::TextAffinity::kDownstream);
- ASSERT_EQ(22, position->MaxTextOffset());
+ EXPECT_EQ(22, position->MaxTextOffset());
// The following is to test a specific edge case with heading navigation,
// occurring in AXPosition::CreatePreviousFormatStartPosition.
//
// When the position is at the beginning of an unignored empty object,
- // preceded by an ignored empty object itself preceded by an heading node, the
- // previous format start position should stay on this unignored empty object.
- // It shouldn't move to the beginning of the heading.
+ // preceded by an ignored empty object, which is itself preceded by a heading
+ // node, the previous format start position should stay on this unignored
+ // empty object. It shouldn't move to the beginning of the heading.
TestPositionType text_position = AXNodePosition::CreateTextPosition(
GetTreeID(), generic_container_12.id, 0 /* text_offset */,
ax::mojom::TextAffinity::kDownstream);
@@ -7753,14 +7780,16 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) {
text_position = text_position->CreatePreviousFormatStartPosition(
AXBoundaryBehavior::StopIfAlreadyAtBoundary);
- EXPECT_NE(nullptr, text_position);
+ ASSERT_NE(nullptr, text_position);
EXPECT_TRUE(text_position->IsTextPosition());
EXPECT_EQ(generic_container_12.id, text_position->anchor_id());
EXPECT_EQ(0, text_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, text_position->affinity());
// The following is to test a specific edge case that occurs when all the
// children of a node are ignored and that node could be considered as an
- // empty object replaced by character (e.g., a button).
+ // empty object, which would be replaced by an embedded object replacement
+ // character, (e.g., a button).
//
// The button element should be treated as a leaf node even though it has a
// child. Because its only child is ignored, the button should be considered
@@ -7773,11 +7802,59 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) {
text_position = text_position->CreateNextParagraphEndPosition(
AXBoundaryBehavior::StopAtLastAnchorBoundary);
- EXPECT_NE(nullptr, text_position);
+ ASSERT_NE(nullptr, text_position);
EXPECT_TRUE(text_position->IsTextPosition());
EXPECT_TRUE(text_position->IsLeafTextPosition());
EXPECT_EQ(button_14.id, text_position->anchor_id());
EXPECT_EQ(1, text_position->text_offset());
+ EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, text_position->affinity());
+}
+
+TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterEmbedObject) {
+ g_ax_embedded_object_behavior = AXEmbeddedObjectBehavior::kExposeCharacter;
+
+ // Parent Tree
+ // ++1 kRootWebArea
+ // ++++2 kEmbeddedObject
+ //
+ // Child Tree
+ // ++1 kDocument
+ ui::AXTreeID child_tree_id = ui::AXTreeID::CreateNewAXTreeID();
+
+ // Create tree manager for parent tree.
+ AXNodeData root;
+ AXNodeData embed_object;
+
+ root.id = 1;
+ embed_object.id = 2;
+
+ root.role = ax::mojom::Role::kRootWebArea;
+ root.child_ids = {embed_object.id};
+
+ embed_object.role = ax::mojom::Role::kEmbeddedObject;
+ embed_object.AddStringAttribute(ax::mojom::StringAttribute::kChildTreeId,
+ child_tree_id.ToString());
+ SetTree(CreateAXTree({root, embed_object}));
+
+ // Create tree manager for child tree.
+ AXNodeData child_root;
+ child_root.id = 1;
+ child_root.role = ax::mojom::Role::kDocument;
+
+ AXTreeUpdate update;
+ update.tree_data.tree_id = child_tree_id;
+ update.tree_data.parent_tree_id = GetTreeID();
+ update.has_tree_data = true;
+ update.root_id = child_root.id;
+ update.nodes.push_back(child_root);
+ TestAXTreeManager child_tree_manager(std::make_unique<AXTree>(update));
+
+ // Verify that kEmbeddedObject node with child tree is not treated as an
+ // empty object.
+ TestPositionType tree_position = AXNodePosition::CreateTreePosition(
+ GetTreeID(), embed_object.id, 0 /* child_index */);
+ ASSERT_TRUE(tree_position->IsTreePosition());
+ EXPECT_FALSE(tree_position->IsLeaf());
}
TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) {
@@ -7836,6 +7913,7 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) {
menu_list_option_6.role = ax::mojom::Role::kMenuListOption;
menu_list_option_6.SetName("Option");
+ menu_list_option_6.SetNameFrom(ax::mojom::NameFrom::kContents);
static_text_7.role = ax::mojom::Role::kStaticText;
static_text_7.SetName("3.14");
@@ -7985,6 +8063,148 @@ TEST_P(AXPositionTextNavigationTestWithParam,
}
}
+TEST_F(AXPositionTest, TextPositionComparisonTextField) {
+ g_ax_embedded_object_behavior = AXEmbeddedObjectBehavior::kExposeCharacter;
+
+ // ++1 kRootWebArea
+ // ++++2 kTextField editable
+ // ++++++3 kGenericContainer editable
+ // ++++++++4 kStaticText editable "Hello"
+ // ++++++++++5 kInlineTextBox "Hello"
+ AXNodeData root_1;
+ AXNodeData text_field_2;
+ AXNodeData generic_container_3;
+ AXNodeData static_text_4;
+ AXNodeData inline_box_5;
+
+ root_1.id = 1;
+ text_field_2.id = 2;
+ generic_container_3.id = 3;
+ static_text_4.id = 4;
+ inline_box_5.id = 5;
+
+ root_1.role = ax::mojom::Role::kRootWebArea;
+ root_1.child_ids = {text_field_2.id};
+
+ text_field_2.role = ax::mojom::Role::kTextField;
+ text_field_2.AddState(ax::mojom::State::kEditable);
+ text_field_2.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true);
+ text_field_2.child_ids = {generic_container_3.id};
+
+ generic_container_3.role = ax::mojom::Role::kGenericContainer;
+ generic_container_3.AddState(ax::mojom::State::kEditable);
+ generic_container_3.child_ids = {static_text_4.id};
+
+ static_text_4.role = ax::mojom::Role::kStaticText;
+ static_text_4.SetName("Hello");
+ static_text_4.child_ids = {inline_box_5.id};
+
+ inline_box_5.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_5.SetName("Hello");
+
+ SetTree(CreateAXTree({root_1, text_field_2, generic_container_3,
+ static_text_4, inline_box_5}));
+
+ // TextPosition anchor_id=5 anchor_role=inlineTextBox text_offset=4
+ // annotated_text=hell<o>
+ TestPositionType inline_text_position = AXNodePosition::CreateTextPosition(
+ GetTreeID(), inline_box_5.id, 4, ax::mojom::TextAffinity::kDownstream);
+ ASSERT_NE(nullptr, inline_text_position);
+
+ // TextPosition anchor_id=2 anchor_role=textField text_offset=4
+ // annotated_text=hell<o>
+ TestPositionType text_field_position = AXNodePosition::CreateTextPosition(
+ GetTreeID(), text_field_2.id, 4, ax::mojom::TextAffinity::kDownstream);
+ ASSERT_NE(nullptr, text_field_position);
+
+ // Validate that two positions in the text field with the same text offsets
+ // but different anchors are logically equal.
+ EXPECT_EQ(*inline_text_position, *text_field_position);
+ EXPECT_EQ(*text_field_position, *inline_text_position);
+}
+
+TEST_F(AXPositionTest, TextPositionComparisonSearchBox) {
+ g_ax_embedded_object_behavior = AXEmbeddedObjectBehavior::kExposeCharacter;
+
+ // ++1 kRootWebArea
+ // ++++2 kSearchBox editable editableRoot=true
+ // ++++++3 kGenericContainer
+ // ++++++++4 kGenericContainer editable
+ // ++++++++++5 kStaticText editable "Hello"
+ // ++++++++++++6 kInlineTextBox "Hello"
+ // ++++7 kButton
+ // ++++++8 kStaticText "X"
+ // ++++++++9 kInlineTextBox "X"
+ AXNodeData root_1;
+ AXNodeData search_box_2;
+ AXNodeData generic_container_3;
+ AXNodeData generic_container_4;
+ AXNodeData static_text_5;
+ AXNodeData inline_box_6;
+ AXNodeData button_7;
+ AXNodeData static_text_8;
+ AXNodeData inline_box_9;
+
+ root_1.id = 1;
+ search_box_2.id = 2;
+ generic_container_3.id = 3;
+ generic_container_4.id = 4;
+ static_text_5.id = 5;
+ inline_box_6.id = 6;
+ button_7.id = 7;
+ static_text_8.id = 8;
+ inline_box_9.id = 9;
+
+ root_1.role = ax::mojom::Role::kRootWebArea;
+ root_1.child_ids = {search_box_2.id, button_7.id};
+
+ search_box_2.role = ax::mojom::Role::kSearchBox;
+ search_box_2.AddState(ax::mojom::State::kEditable);
+ search_box_2.AddBoolAttribute(ax::mojom::BoolAttribute::kEditableRoot, true);
+ search_box_2.child_ids = {generic_container_3.id};
+
+ generic_container_3.role = ax::mojom::Role::kGenericContainer;
+ generic_container_3.child_ids = {generic_container_4.id};
+
+ generic_container_4.role = ax::mojom::Role::kGenericContainer;
+ generic_container_4.AddState(ax::mojom::State::kEditable);
+ generic_container_4.child_ids = {static_text_5.id};
+
+ static_text_5.role = ax::mojom::Role::kStaticText;
+ static_text_5.SetName("Hello");
+ static_text_5.child_ids = {inline_box_6.id};
+
+ inline_box_6.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_6.SetName("Hello");
+
+ button_7.role = ax::mojom::Role::kButton;
+ button_7.child_ids = {static_text_8.id};
+
+ static_text_8.role = ax::mojom::Role::kStaticText;
+ static_text_8.SetName("X");
+ static_text_8.child_ids = {inline_box_9.id};
+
+ inline_box_9.role = ax::mojom::Role::kInlineTextBox;
+ inline_box_9.SetName("X");
+
+ SetTree(CreateAXTree({root_1, search_box_2, generic_container_3,
+ generic_container_4, static_text_5, inline_box_6,
+ button_7, static_text_8, inline_box_9}));
+
+ // TextPosition anchor_role=inlineTextBox text_offset=5 annotated_text=hello<>
+ TestPositionType inline_text_position = AXNodePosition::CreateTextPosition(
+ GetTreeID(), inline_box_6.id, 5, ax::mojom::TextAffinity::kDownstream);
+ ASSERT_NE(nullptr, inline_text_position);
+
+ // TextPosition anchor_role=searchBox text_offset=5 annotated_text=hello<>
+ TestPositionType search_box_position = AXNodePosition::CreateTextPosition(
+ GetTreeID(), search_box_2.id, 5, ax::mojom::TextAffinity::kDownstream);
+ ASSERT_NE(nullptr, search_box_position);
+
+ EXPECT_EQ(*search_box_position, *inline_text_position);
+ EXPECT_EQ(*inline_text_position, *search_box_position);
+}
+
//
// Instantiations of parameterized tests.
//
diff --git a/chromium/ui/accessibility/ax_position.h b/chromium/ui/accessibility/ax_position.h
index a2f79525c26..e68b38c435a 100644
--- a/chromium/ui/accessibility/ax_position.h
+++ b/chromium/ui/accessibility/ax_position.h
@@ -3225,6 +3225,13 @@ class AXPosition {
if (AnchorUnignoredChildCount())
return false;
+ // Embed element with non empty children should not be treated as empty
+ // objects.
+ if (GetAnchorRole() == ax::mojom::Role::kEmbeddedObject &&
+ AnchorChildCount() > 0) {
+ return false;
+ }
+
// All unignored leaf nodes in the AXTree except document and text
// nodes should be replaced by the embedded object character. Also, nodes
// that only have ignored children (e.g., a button that contains only an
diff --git a/chromium/ui/accessibility/ax_range_unittest.cc b/chromium/ui/accessibility/ax_range_unittest.cc
index b27df725cb6..ea2af606d1d 100644
--- a/chromium/ui/accessibility/ax_range_unittest.cc
+++ b/chromium/ui/accessibility/ax_range_unittest.cc
@@ -171,7 +171,7 @@ void AXRangeTest::SetUp() {
button_.role = ax::mojom::Role::kButton;
button_.SetHasPopup(ax::mojom::HasPopup::kMenu);
button_.SetName(BUTTON);
- button_.SetValue(BUTTON);
+ button_.SetNameFrom(ax::mojom::NameFrom::kValue);
button_.relative_bounds.bounds = gfx::RectF(20, 20, 100, 30);
button_.AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId,
check_box1_.id);
diff --git a/chromium/ui/accessibility/ax_role_properties.cc b/chromium/ui/accessibility/ax_role_properties.cc
index f776bb6a7c0..471248980a2 100644
--- a/chromium/ui/accessibility/ax_role_properties.cc
+++ b/chromium/ui/accessibility/ax_role_properties.cc
@@ -146,16 +146,16 @@ bool IsControl(const ax::mojom::Role role) {
case ax::mojom::Role::kCheckBox:
case ax::mojom::Role::kColorWell:
case ax::mojom::Role::kComboBoxMenuButton:
+ case ax::mojom::Role::kDate:
+ case ax::mojom::Role::kDateTime:
case ax::mojom::Role::kDisclosureTriangle:
+ case ax::mojom::Role::kInputTime:
case ax::mojom::Role::kListBox:
case ax::mojom::Role::kListGrid:
- case ax::mojom::Role::kMenu:
- case ax::mojom::Role::kMenuBar:
case ax::mojom::Role::kMenuItem:
case ax::mojom::Role::kMenuItemCheckBox:
case ax::mojom::Role::kMenuItemRadio:
case ax::mojom::Role::kMenuListOption:
- case ax::mojom::Role::kMenuListPopup:
case ax::mojom::Role::kPdfActionableHighlight:
case ax::mojom::Role::kPopUpButton:
case ax::mojom::Role::kRadioButton:
@@ -169,6 +169,8 @@ bool IsControl(const ax::mojom::Role role) {
case ax::mojom::Role::kTextFieldWithComboBox:
case ax::mojom::Role::kToggleButton:
case ax::mojom::Role::kTree:
+ case ax::mojom::Role::kTreeGrid:
+ case ax::mojom::Role::kTreeItem:
return true;
default:
return false;
@@ -557,6 +559,18 @@ bool IsSelect(const ax::mojom::Role role) {
}
}
+bool IsSelectElement(const ax::mojom::Role role) {
+ // Depending on their "size" attribute, <select> elements come in two flavors:
+ // the first appears like a list box and the second like a popup menu.
+ switch (role) {
+ case ax::mojom::Role::kListBox:
+ case ax::mojom::Role::kPopUpButton:
+ return true;
+ default:
+ return false;
+ }
+}
+
bool IsSetLike(const ax::mojom::Role role) {
switch (role) {
case ax::mojom::Role::kDescriptionList:
@@ -692,6 +706,39 @@ bool IsText(ax::mojom::Role role) {
}
}
+bool ShouldHaveReadonlyStateByDefault(const ax::mojom::Role role) {
+ switch (role) {
+ case ax::mojom::Role::kArticle:
+ case ax::mojom::Role::kDefinition:
+ case ax::mojom::Role::kDescriptionList:
+ case ax::mojom::Role::kDescriptionListTerm:
+ case ax::mojom::Role::kDocument:
+ case ax::mojom::Role::kGraphicsDocument:
+ case ax::mojom::Role::kImage:
+ case ax::mojom::Role::kImageMap:
+ case ax::mojom::Role::kList:
+ case ax::mojom::Role::kListItem:
+ case ax::mojom::Role::kProgressIndicator:
+ case ax::mojom::Role::kRootWebArea:
+ case ax::mojom::Role::kTerm:
+ case ax::mojom::Role::kTimer:
+ case ax::mojom::Role::kToolbar:
+ case ax::mojom::Role::kTooltip:
+ case ax::mojom::Role::kWebArea:
+ return true;
+
+ case ax::mojom::Role::kGrid:
+ // TODO(aleventhal) this changed between ARIA 1.0 and 1.1,
+ // need to determine whether grids/treegrids should really be readonly
+ // or editable by default
+ break;
+
+ default:
+ break;
+ }
+ return false;
+}
+
bool SupportsExpandCollapse(const ax::mojom::Role role) {
switch (role) {
case ax::mojom::Role::kComboBoxGrouping:
@@ -767,37 +814,4 @@ bool SupportsToggle(const ax::mojom::Role role) {
}
}
-bool ShouldHaveReadonlyStateByDefault(const ax::mojom::Role role) {
- switch (role) {
- case ax::mojom::Role::kArticle:
- case ax::mojom::Role::kDefinition:
- case ax::mojom::Role::kDescriptionList:
- case ax::mojom::Role::kDescriptionListTerm:
- case ax::mojom::Role::kDocument:
- case ax::mojom::Role::kGraphicsDocument:
- case ax::mojom::Role::kImage:
- case ax::mojom::Role::kImageMap:
- case ax::mojom::Role::kList:
- case ax::mojom::Role::kListItem:
- case ax::mojom::Role::kProgressIndicator:
- case ax::mojom::Role::kRootWebArea:
- case ax::mojom::Role::kTerm:
- case ax::mojom::Role::kTimer:
- case ax::mojom::Role::kToolbar:
- case ax::mojom::Role::kTooltip:
- case ax::mojom::Role::kWebArea:
- return true;
-
- case ax::mojom::Role::kGrid:
- // TODO(aleventhal) this changed between ARIA 1.0 and 1.1,
- // need to determine whether grids/treegrids should really be readonly
- // or editable by default
- break;
-
- default:
- break;
- }
- return false;
-}
-
} // namespace ui
diff --git a/chromium/ui/accessibility/ax_role_properties.h b/chromium/ui/accessibility/ax_role_properties.h
index 724de523b7d..c9819bd9002 100644
--- a/chromium/ui/accessibility/ax_role_properties.h
+++ b/chromium/ui/accessibility/ax_role_properties.h
@@ -140,6 +140,10 @@ AX_BASE_EXPORT bool IsSectionhead(const ax::mojom::Role role);
// Returns true if the role is a subclass of the ARIA Select abstract role.
AX_BASE_EXPORT bool IsSelect(const ax::mojom::Role role);
+// Returns true if the role is one of those exposed by the HTML <select>
+// element.
+AX_BASE_EXPORT bool IsSelectElement(const ax::mojom::Role role);
+
// Returns true if the provided role is ordered-set like, specifically if it
// can hold set_size values.
AX_BASE_EXPORT bool IsSetLike(const ax::mojom::Role role);
@@ -168,6 +172,10 @@ AX_BASE_EXPORT bool IsTableRow(ax::mojom::Role role);
// break, or inline text box.
AX_BASE_EXPORT bool IsText(ax::mojom::Role role);
+// Returns true if the node should be read only by default
+AX_BASE_EXPORT bool ShouldHaveReadonlyStateByDefault(
+ const ax::mojom::Role role);
+
// Returns true if the role supports expand/collapse.
AX_BASE_EXPORT bool SupportsExpandCollapse(const ax::mojom::Role role);
@@ -183,10 +191,6 @@ AX_BASE_EXPORT bool SupportsSelected(const ax::mojom::Role role);
// Returns true if the provided role supports toggle.
AX_BASE_EXPORT bool SupportsToggle(const ax::mojom::Role role);
-// Returns true if the node should be read only by default
-AX_BASE_EXPORT bool ShouldHaveReadonlyStateByDefault(
- const ax::mojom::Role role);
-
} // namespace ui
#endif // UI_ACCESSIBILITY_AX_ROLE_PROPERTIES_H_
diff --git a/chromium/ui/accessibility/ax_tree_manager.h b/chromium/ui/accessibility/ax_tree_manager.h
index 45388a8d7de..2e2d4d87c1f 100644
--- a/chromium/ui/accessibility/ax_tree_manager.h
+++ b/chromium/ui/accessibility/ax_tree_manager.h
@@ -8,6 +8,7 @@
#include "ui/accessibility/ax_export.h"
#include "ui/accessibility/ax_node.h"
#include "ui/accessibility/ax_tree_id.h"
+#include "ui/accessibility/ax_tree_observer.h"
namespace ui {
@@ -26,6 +27,9 @@ class AX_EXPORT AXTreeManager {
// Returns nullptr if |node_id| is not found.
virtual AXNode* GetNodeFromTree(const AXNode::AXID node_id) const = 0;
+ virtual void AddObserver(AXTreeObserver* observer) {}
+ virtual void RemoveObserver(AXTreeObserver* observer) {}
+
// Returns the tree id of the tree managed by this AXTreeManager.
virtual AXTreeID GetTreeID() const = 0;
diff --git a/chromium/ui/accessibility/ax_tree_serializer.h b/chromium/ui/accessibility/ax_tree_serializer.h
index a8ea1e8dcff..c809aa47a8b 100644
--- a/chromium/ui/accessibility/ax_tree_serializer.h
+++ b/chromium/ui/accessibility/ax_tree_serializer.h
@@ -8,11 +8,15 @@
#include <stddef.h>
#include <stdint.h>
+#include <ostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
+#include "base/debug/crash_logging.h"
+#include "base/debug/dump_without_crashing.h"
#include "base/logging.h"
+#include "ui/accessibility/ax_common.h"
#include "ui/accessibility/ax_export.h"
#include "ui/accessibility/ax_tree_source.h"
#include "ui/accessibility/ax_tree_update.h"
@@ -178,9 +182,6 @@ class AXTreeSerializer {
AXSourceNode node,
AXTreeUpdateBase<AXNodeData, AXTreeData>* out_update);
- // Visit all of the descendants of |node| once.
- void WalkAllDescendants(AXSourceNode node);
-
// Delete the entire client subtree but don't set the did_reset_ flag
// like when Reset() is called.
void InternalReset();
@@ -365,9 +366,9 @@ bool AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::
// This child is already in the client tree and valid, we won't
// recursively serialize it so we don't need to check this
// subtree recursively for reparenting.
- // However, if the child is ignored, the children may now be
+ // However, if the child is or was ignored, the children may now be
// considered as reparented, so continue recursion in that case.
- if (!client_child->ignored)
+ if (!client_child->ignored && !tree_->IsIgnored(child))
continue;
}
}
@@ -395,11 +396,22 @@ ClientTreeNode*
AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::GetClientTreeNodeParent(
ClientTreeNode* obj) {
ClientTreeNode* parent = obj->parent;
-#if DCHECK_IS_ON()
if (!parent)
return nullptr;
- DCHECK(ClientTreeNodeById(parent->id)) << "Parent not in id map.";
-#endif // DCHECK_IS_ON()
+ if (!ClientTreeNodeById(parent->id)) {
+ std::ostringstream error;
+ error << "Child: " << tree_->GetDebugString(tree_->GetFromId(obj->id))
+ << "\nParent: "
+ << tree_->GetDebugString(tree_->GetFromId(parent->id));
+ static auto* missing_parent_err = base::debug::AllocateCrashKeyString(
+ "ax_ts_missing_parent_err", base::debug::CrashKeySize::Size256);
+ base::debug::SetCrashKeyString(missing_parent_err,
+ error.str().substr(0, 230));
+#if defined(AX_FAIL_FAST_BUILD)
+ CHECK(false) << error.str();
+#endif // defined(AX_FAIL_FAST_BUILD)
+ base::debug::DumpWithoutCrashing();
+ }
return parent;
}
@@ -459,12 +471,6 @@ bool AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::SerializeChanges(
if (!tree_->IsValid(lca))
lca = tree_->GetRoot();
- // Work around flaky source trees where nodes don't figure out their
- // correct parent/child relationships until you walk the whole tree once.
- // Covered by this test in the content_browsertests suite:
- // DumpAccessibilityTreeTest.AccessibilityAriaOwns.
- WalkAllDescendants(lca);
-
if (!SerializeChangedNodes(lca, out_update))
return false;
@@ -588,12 +594,23 @@ bool AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::
ClientTreeNode* client_child = ClientTreeNodeById(new_child_id);
if (client_child && GetClientTreeNodeParent(client_child) != client_node) {
- DVLOG(1) << "Illegal reparenting detected";
-#if defined(ADDRESS_SANITIZER)
- // Wrapping this in ADDRESS_SANITIZER will cause it to run on
- // clusterfuzz, which should help us narrow down the issue.
- NOTREACHED() << "Illegal reparenting detected";
-#endif
+#if defined(AX_FAIL_FAST_BUILD)
+ // This condition leads to performance problems. It will
+ // also reset virtual buffers, causing users to lose their place.
+ std::ostringstream error;
+ error << "Passed-in parent: "
+ << tree_->GetDebugString(tree_->GetFromId(client_node->id))
+ << "\nChild: " << tree_->GetDebugString(child)
+ << "\nChild's parent: "
+ << tree_->GetDebugString(
+ tree_->GetFromId(client_child->parent->id));
+ static auto* reparent_err = base::debug::AllocateCrashKeyString(
+ "ax_ts_reparent_err", base::debug::CrashKeySize::Size256);
+ base::debug::SetCrashKeyString(reparent_err, error.str().substr(0, 230));
+ CHECK(false) << error.str();
+#endif // defined(AX_FAIL_FAST_BUILD)
+ // TODO: re-add this, including crash keys above.
+ // base::debug::DumpWithoutCrashing();
Reset();
return false;
}
@@ -672,6 +689,28 @@ bool AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::
new_child->ignored = tree_->IsIgnored(child);
new_child->invalid = false;
client_node->children.push_back(new_child);
+ if (ClientTreeNodeById(child_id)) {
+ // TODO(accessibility) Remove all cases where this occurs and re-add
+ // This condition leads to performance problems. It will
+ // also reset virtual buffers, causing users to lose their place.
+ std::ostringstream error;
+ error << "Child id " << child_id << " already in map."
+ << "\nChild: "
+ << tree_->GetDebugString(tree_->GetFromId(child_id))
+ << "\nWanted for parent " << tree_->GetDebugString(node)
+ << "\nAlready had parent "
+ << tree_->GetDebugString(tree_->GetFromId(
+ ClientTreeNodeById(child_id)->parent->id));
+ static auto* dupe_id_err = base::debug::AllocateCrashKeyString(
+ "ax_ts_dupe_id_err", base::debug::CrashKeySize::Size256);
+ base::debug::SetCrashKeyString(dupe_id_err, error.str().substr(0, 230));
+#if defined(AX_FAIL_FAST_BUILD)
+ CHECK(false) << error.str();
+#endif // defined(AX_FAIL_FAST_BUILD)
+ base::debug::DumpWithoutCrashing();
+ Reset();
+ return false;
+ }
client_id_map_[child_id] = new_child;
if (!SerializeChangedNodes(child, out_update))
return false;
@@ -686,15 +725,6 @@ bool AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::
return true;
}
-template <typename AXSourceNode, typename AXNodeData, typename AXTreeData>
-void AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::WalkAllDescendants(
- AXSourceNode node) {
- std::vector<AXSourceNode> children;
- tree_->GetChildren(node, &children);
- for (size_t i = 0; i < children.size(); ++i)
- WalkAllDescendants(children[i]);
-}
-
} // namespace ui
#endif // UI_ACCESSIBILITY_AX_TREE_SERIALIZER_H_
diff --git a/chromium/ui/accessibility/ax_tree_serializer_unittest.cc b/chromium/ui/accessibility/ax_tree_serializer_unittest.cc
index 079035623e1..0c5f7002673 100644
--- a/chromium/ui/accessibility/ax_tree_serializer_unittest.cc
+++ b/chromium/ui/accessibility/ax_tree_serializer_unittest.cc
@@ -13,9 +13,9 @@
#include "base/strings/string_number_conversions.h"
#include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/ax_common.h"
#include "ui/accessibility/ax_node.h"
#include "ui/accessibility/ax_serializable_tree.h"
-#include "ui/accessibility/ax_tree.h"
using testing::UnorderedElementsAre;
@@ -342,11 +342,9 @@ TEST_F(AXTreeSerializerTest, MaximumSerializedNodeCount) {
ASSERT_EQ(5u, update.nodes.size());
}
-#if !defined(ADDRESS_SANITIZER)
+#if !defined(AX_FAIL_FAST_BUILD)
// If duplicate ids are encountered, it returns an error and the next
// update will re-send the entire tree.
-// Test does not work with address sanitizer -- if EXPECT_DEATH is used to
-// catch the "Illegal parenting" NOTREACHED(), an ASAN crash is still generated.
TEST_F(AXTreeSerializerTest, DuplicateIdsReturnsErrorAndFlushes) {
// (1 (2 (3 (4) 5)))
treedata0_.root_id = 1;
@@ -397,7 +395,7 @@ TEST_F(AXTreeSerializerTest, DuplicateIdsReturnsErrorAndFlushes) {
serializer_->SerializeChanges(tree1_->GetFromId(7), &update);
ASSERT_EQ(5u, update.nodes.size());
}
-#endif
+#endif // !defined(AX_FAIL_FAST_BUILD)
// If a tree serializer is reset, that means it doesn't know about
// the state of the client tree anymore. The safest thing to do in
diff --git a/chromium/ui/accessibility/extensions/chromevoxclassic/common/aria_util_test.unitjs b/chromium/ui/accessibility/extensions/chromevoxclassic/common/aria_util_test.unitjs
index 708f4541655..f53d5125942 100644
--- a/chromium/ui/accessibility/extensions/chromevoxclassic/common/aria_util_test.unitjs
+++ b/chromium/ui/accessibility/extensions/chromevoxclassic/common/aria_util_test.unitjs
@@ -30,9 +30,9 @@ TEST_F('ChromeVoxAriaUtilUnitTest', 'GetStateGridWithActiveCell', function() {
</div>
</div>
*/});
- assertThat(
+ assertDeepEquals(
cvox.AriaUtil.getStateMsgs($('grid'), true),
- eqJSON([['role_gridcell_pos', 1, 1]]));
+ [['role_gridcell_pos', 1, 1]]);
});
TEST_F('ChromeVoxAriaUtilUnitTest', 'GetActiveDescendant', function() {
@@ -95,19 +95,19 @@ TEST_F('ChromeVoxAriaUtilUnitTest', 'ListIndexAndState', function() {
*/});
var optionElt = $('l2');
- assertThat(
+ assertDeepEquals(
cvox.AriaUtil.getStateMsgs(optionElt),
- eqJSON([['list_position', 2, 3]]));
+ [['list_position', 2, 3]]);
var ariaOptionElt = $('a2');
- assertThat(
+ assertDeepEquals(
cvox.AriaUtil.getStateMsgs(ariaOptionElt),
- eqJSON([['list_position', 15, 20]]));
+ [['list_position', 15, 20]]);
ariaOptionElt = $('b3');
- assertThat(
+ assertDeepEquals(
cvox.AriaUtil.getStateMsgs(ariaOptionElt),
- eqJSON([['list_position', 1, 3]]));
+ [['list_position', 1, 3]]);
});
TEST_F('ChromeVoxAriaUtilUnitTest', 'GetLiveRegions', function() {
diff --git a/chromium/ui/accessibility/extensions/chromevoxclassic/common/braille_util_test.unitjs b/chromium/ui/accessibility/extensions/chromevoxclassic/common/braille_util_test.unitjs
index 14ee1e243ef..41f4be75d1a 100644
--- a/chromium/ui/accessibility/extensions/chromevoxclassic/common/braille_util_test.unitjs
+++ b/chromium/ui/accessibility/extensions/chromevoxclassic/common/braille_util_test.unitjs
@@ -60,7 +60,7 @@ ChromeVoxBrailleUtilUnitTest.prototype = {
startIndex: actual.startIndex,
endIndex: actual.endIndex
});
- assertThat(actual, eqJSON(new cvox.NavBraille(expected)));
+ assertDeepEquals(actual, new cvox.NavBraille(expected));
}
};
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_bs.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_bs.xtb
index 046f9616173..29ac3f52158 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_bs.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_bs.xtb
@@ -7,18 +7,18 @@
<translation id="1555130319947370107">Plava</translation>
<translation id="1588438908519853928">Normalno</translation>
<translation id="1591070050619849194">Onemogući sve animirane slike.</translation>
-<translation id="1703735871906654364">Pregledanje znakom za umetanje</translation>
+<translation id="1703735871906654364">Navigacija kursorom</translation>
<translation id="1791496371305830581">Dozvoli sve animirane slike.</translation>
<translation id="1996252509865389616">Omogućiti?</translation>
<translation id="2079545284768500474">Vrati</translation>
<translation id="2179565792157161713">Otvori dugi opis na novoj kartici</translation>
<translation id="2223143012868735942">Na web stranice je primijenjen prilagodljivi filter boja za bolju percepciju boja.</translation>
-<translation id="2394933097471027016">Isprobajte sada – Pregledanje znakom za umetanje uvijek je omogućeno na ovoj stranici!</translation>
+<translation id="2394933097471027016">Isprobajte sada – Navigacija kursorom je uvijek omogućena na ovoj stranici!</translation>
<translation id="2471847333270902538">Šema boja za <ph name="SITE" />:</translation>
<translation id="2648340354586434750">Držite pritisnuto &lt;span class='key'&gt;Opcija&lt;/span&gt; da se pomjerate riječ po riječ.</translation>
<translation id="2795227192542594043">Ova ekstenzija vam daje pokretni kursor u web stranici, što omogućuje da odaberete tekst putem tastature.</translation>
<translation id="2808027189040546825">1. korak: Odaberite red s najslabije vidljivim zvijezdama:</translation>
-<translation id="2965611304828530558">&lt;p&gt;Kada dođete do nekog linka ili kontrole, taj element se automatski fokusira. Pritisnite tipku &lt;span class='key'&gt;Enter&lt;/span&gt; da biste kliknuli na link ili dugme. &lt;/p&gt; &lt;p&gt; Kada fokusirana kontrola (poput tekstualnog okvira ili okvira s listom) obuhvata tipke sa strelicama, pritisnite tipku &lt;span class='key'&gt;Esc&lt;/span&gt;, a zatim strelicu ulijevo ili udesno da nastavite pregledanje znakom za umetanje. &lt;/p&gt; &lt;p&gt; Možete pritisnuti i tipku &lt;span class='key'&gt;Tab&lt;/span&gt; da se pomjerite na sljedeću kontrolu koja se može fokusirati. &lt;/p&gt;</translation>
+<translation id="2965611304828530558">&lt;p&gt;Kada dođete do nekog linka ili kontrole, taj element se automatski fokusira. Pritisnite tipku &lt;span class='key'&gt;Enter&lt;/span&gt; da biste kliknuli na link ili dugme. &lt;/p&gt; &lt;p&gt; Kada fokusirana kontrola (poput okvira za tekst ili okvira s listom) obuhvata tipke sa strelicama, pritisnite tipku &lt;span class='key'&gt;Esc&lt;/span&gt;, a zatim strelicu ulijevo ili udesno da nastavite navigaciju kursorom. &lt;/p&gt; &lt;p&gt; Možete pritisnuti i tipku &lt;span class='key'&gt;Tab&lt;/span&gt; da se pomjerite na sljedeću kontrolu koja se može fokusirati. &lt;/p&gt;</translation>
<translation id="3252573918265662711">Podešavanje</translation>
<translation id="3410969471888629217">Zaboravi prilagodbe web lokacije</translation>
<translation id="3435896845095436175">Omogući</translation>
@@ -31,8 +31,8 @@
<translation id="4769065380738716500">Slike su zamijenjene "alt" tekstom.</translation>
<translation id="4896660567607030658">Bez povratnih informacija, samo prikaži kursor.</translation>
<translation id="4937901943818762779">Dozvoli animirane slike ali samo jedanput.</translation>
-<translation id="4949131196216960195">Pritisnite &lt;span class='key'&gt;Pretraživanje&lt;/span&gt; + &lt;img src='increase_brightness.png'&gt; (tipku za povećavanje osvjetljenja ili F7) da uključite pregledanje znakom za umetanje. Ponovo pritisnite da isključite.</translation>
-<translation id="4954450790315188152">Kada je omogućeno pregledanje znakom za umetanje:</translation>
+<translation id="4949131196216960195">Pritisnite &lt;span class='key'&gt;Pretraživanje&lt;/span&gt; + &lt;img src='increase_brightness.png'&gt; (tipku za povećavanje osvjetljenja ili F7) da uključite navigaciju kursorom. Ponovo pritisnite da isključite.</translation>
+<translation id="4954450790315188152">Kada je omogućena navigacija kursorom:</translation>
<translation id="5041932793799765940">Podešavanje boje</translation>
<translation id="5094574508723441140">Povećan kontrast</translation>
<translation id="5173942593318174089">Istaknite položaj kursora animacijom.</translation>
@@ -61,9 +61,9 @@
<translation id="7658239707568436148">Otkaži</translation>
<translation id="786423340267544509">Dodaj okvir elementima s atributima aria-describedat ili longdesc.</translation>
<translation id="7942349550061667556">Crvena</translation>
-<translation id="8260673944985561857">Opcije pregledanja znakom za umetanje</translation>
+<translation id="8260673944985561857">Opcije navigacije kursorom</translation>
<translation id="8321034316479930120">Pravila za animaciju</translation>
<translation id="8480209185614411573">Visoki kontrast</translation>
-<translation id="8609925175482059018">Pritisnite &lt;span class='key'&gt;F7&lt;/span&gt; da uključite pregledanje znakom za umetanje. Pritisnite ponovo da ga isključite.</translation>
+<translation id="8609925175482059018">Pritisnite &lt;span class='key'&gt;F7&lt;/span&gt; da uključite navigaciju kursorom. Pritisnite ponovo da ga isključite.</translation>
<translation id="894241283505723656">Dugi opisi u kontekstualnom meniju</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_en-GB.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_en-GB.xtb
index 70d3f9f00c7..2cb7f4dccd1 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_en-GB.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_en-GB.xtb
@@ -45,7 +45,7 @@
<translation id="5650358096585648000">Visual Feedback</translation>
<translation id="5710185147685935461">Change or invert the colour scheme to make web pages easier to read.</translation>
<translation id="5939518447894949180">Reset</translation>
-<translation id="595639123821853262">Inverted Greyscale</translation>
+<translation id="595639123821853262">Inverted greyscale</translation>
<translation id="6017514345406065928">Green</translation>
<translation id="6050189528197190982">Greyscale</translation>
<translation id="6170146920149900756">Colour Enhancer</translation>
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_es.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_es.xtb
index ca610cf1015..e4708cae65c 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_es.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_es.xtb
@@ -50,7 +50,7 @@
<translation id="6050189528197190982">Escala de grises</translation>
<translation id="6170146920149900756">Potenciador del color</translation>
<translation id="633394792577263429">Mantén pulsada la tecla &lt;span class='key'&gt;Control&lt;/span&gt; para desplazarte palabra a palabra.</translation>
-<translation id="6550675742724504774">Configuración</translation>
+<translation id="6550675742724504774">Opciones</translation>
<translation id="6838518108677880446">Configuración:</translation>
<translation id="690628312087070417">Cuando el cursor salta una gran distancia:</translation>
<translation id="6965382102122355670">Aceptar</translation>
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_iw.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_iw.xtb
index eb6ad998115..9e8a01c0a5f 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_iw.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_iw.xtb
@@ -24,7 +24,7 @@
<translation id="3435896845095436175">הפעלה</translation>
<translation id="3622586652998721735">הגדרה כברירת מחדל של ערכת צבעים</translation>
<translation id="3812541808639806898">‏מציג טקסט Alt של תמונה</translation>
-<translation id="381767806621926835">‏לחץ לחיצה ארוכה על כל פריט עם המאפיין "longdesc" או "aria-describedat" כדי לגשת לתיאור הארוך שלו.</translation>
+<translation id="381767806621926835">‏כדי לגשת לתיאור הארוך יש ללחוץ לחיצה ארוכה על הפריט עם המאפיין "longdesc" או "aria-describedat".</translation>
<translation id="4023902424053835668">דפדף בטקסט של דפי אינטרנט באמצעות מקשי החצים.</translation>
<translation id="4388820049312272371">הדגשת מיקום הסמן באמצעות הבהוב מהיר.</translation>
<translation id="4394049700291259645">השבתה</translation>
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_ta.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_ta.xtb
index 4219699dde9..ae59c885244 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_ta.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_ta.xtb
@@ -16,7 +16,7 @@
<translation id="2394933097471027016">இப்போதே முயற்சிக்கவும் - இந்தப் பக்கத்தில் சுட்டி உலாவல் எப்போதும் இயக்கப்பட்டிருக்கும்!</translation>
<translation id="2471847333270902538"><ph name="SITE" />க்கான வண்ணத் திட்டம்:</translation>
<translation id="2648340354586434750">வார்த்தைகளில் நகர &lt;span class='key'&gt;Option&lt;/span&gt; என்ற விசையை அழுத்திப்பிடிக்கவும்.</translation>
-<translation id="2795227192542594043">இந்த நீட்டிப்பில் கிடைக்கும் இணைய பக்கத்தில் நகரும் கர்சர், உங்களை விசைப்பலகை மூலம் உரையைத் தேர்வுசெய்ய அனுமதிக்கிறது.</translation>
+<translation id="2795227192542594043">இந்த நீட்டிப்பில் கிடைக்கும் இணைய பக்கத்தில் நகரும் கர்சர், உங்களை கீபோர்டு மூலம் உரையைத் தேர்வுசெய்ய அனுமதிக்கிறது.</translation>
<translation id="2808027189040546825">படி 1: மங்கலான நட்சத்திரங்களைக் கொண்ட வரிசையைத் தேர்ந்தெடுக்கவும்:</translation>
<translation id="2965611304828530558">&lt;p&gt;நீங்கள் இணைப்பு அல்லது கட்டுப்பாட்டை அடையும்போது, இது தானாகவே மையப்படுத்தப்படும். இணைப்பு அல்லது பொத்தானைக் கிளிக் செய்ய, &lt;span class='key'&gt;Enter&lt;/span&gt; என்பதை அழுத்தவும். &lt;/p&gt; &lt;p&gt; மையப்படுத்தப்பட்ட (உரைப் பெட்டி அல்லது பட்டியல் பெட்டி போன்றது) கட்டுப்பாடானது, அம்புக்குறிகளைப் பிடிக்கும்போது, சுட்டி உலாவலைத் தொடர, இடது அல்லது வலது அம்புக்குறியைத் தொடர்ந்து &lt;span class='key'&gt;Esc&lt;/span&gt; அழுத்தவும். &lt;/p&gt; &lt;p&gt; மாற்றாக, மையப்படுத்தப்பட்ட அடுத்த கட்டுப்பாட்டிற்கு நகர, &lt;span class='key'&gt;Tab&lt;/span&gt; அழுத்தவும். &lt;/p&gt;</translation>
<translation id="3252573918265662711">அமைவு</translation>
@@ -39,7 +39,7 @@
<translation id="5287723860611749454">&lt;p&gt;ஆவணம் முழுவதும் செல்ல அம்புக்குறிகளைப் பயன்படுத்தவும். &lt;/p&gt;&lt;p&gt;கர்சரை ஒரு இடத்திற்கு நகர்த்த அங்கு கிளிக் செய்யவும். &lt;/p&gt; &lt;p&gt; உரையைத் தேர்வுசெய்ய &lt;span class='key'&gt;Shift&lt;/span&gt; + அம்புக்குறிகளை அழுத்தவும்.&lt;/p&gt;</translation>
<translation id="5331422999063554397">தலைகீழ் வண்ணம்</translation>
<translation id="5555153510860501336">உயர் ஒளி மாறுபாடு முடக்கப்பட்டது</translation>
-<translation id="5558600050691192317">விசைப்பலகை கட்டளைகள்</translation>
+<translation id="5558600050691192317">கீபோர்டு கட்டளைகள்</translation>
<translation id="5594989420907487559">ஒருமுறை மட்டும் அனிமேஷன்களை இயக்கவும் அல்லது அதை முழுமையாக முடக்கவும்.</translation>
<translation id="5631241868147802353">இயல்புநிலை வண்ணங்கள்:</translation>
<translation id="5650358096585648000">விஷுவல் கருத்து</translation>
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_th.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_th.xtb
index f27c042af4e..c017fa41f9c 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_th.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_th.xtb
@@ -38,7 +38,7 @@
<translation id="5173942593318174089">ไฮไลต์ตำแหน่งเคอร์เซอร์ที่มีภาพเคลื่อนไหว</translation>
<translation id="5287723860611749454">&lt;p&gt;ใช้คีย์ลูกศรเพื่อเลื่อนไปยังส่วนต่างๆ ของเอกสาร &lt;/p&gt;&lt;p&gt;คลิกตำแหน่งหนึ่งๆ เพื่อย้ายเคอร์เซอร์ไปยังตำแหน่งนั้น&lt;/p&gt; &lt;p&gt; กด &lt;span class='key'&gt;Shift&lt;/span&gt; + ลูกศร เพื่อเลือกข้อความ&lt;/p&gt;</translation>
<translation id="5331422999063554397">สีสลับ</translation>
-<translation id="5555153510860501336">ปิดความเปรียบต่างสูงอยู่</translation>
+<translation id="5555153510860501336">ปิดโหมดคอนทราสต์สูงอยู่</translation>
<translation id="5558600050691192317">คำสั่งแป้นพิมพ์</translation>
<translation id="5594989420907487559">เรียกใช้ภาพเคลื่อนไหวเพียงครั้งเดียว หรือปิดใช้ภาพเคลื่อนไหวอย่างสมบูรณ์</translation>
<translation id="5631241868147802353">รูปแบบชุดสีเริ่มต้น:</translation>
@@ -55,7 +55,7 @@
<translation id="690628312087070417">เมื่อเครื่องหมาย caret ข้ามไปยังระยะที่ห่างมาก</translation>
<translation id="6965382102122355670">ตกลง</translation>
<translation id="7379645913608427028">ระดับ</translation>
-<translation id="7384431257964758081">เปิดความเปรียบต่างอยู่</translation>
+<translation id="7384431257964758081">เปิดโหมดคอนทราสต์อยู่</translation>
<translation id="7586636300921797327">ขั้นตอนที่ 2: ปรับแถบเลื่อนจนสามารถเห็นดาวทั้งหมดได้ใน
แถวที่เลือก</translation>
<translation id="7658239707568436148">ยกเลิก</translation>
@@ -63,7 +63,7 @@
<translation id="7942349550061667556">สีแดง</translation>
<translation id="8260673944985561857">ตัวเลือกการเรียกดูด้วยแป้นพิมพ์</translation>
<translation id="8321034316479930120">นโยบายภาพเคลื่อนไหว</translation>
-<translation id="8480209185614411573">ความเปรียบต่างสูง</translation>
+<translation id="8480209185614411573">คอนทราสต์สูง</translation>
<translation id="8609925175482059018">กด &lt;span class='key'&gt;F7&lt;/span&gt; เพื่อเปิดการเรียกดูด้วยแป้นพิมพ์ กดอีกครั้งเพื่อปิด</translation>
<translation id="894241283505723656">คำอธิบายแบบยาวในเมนูบริบท</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/accessibility/platform/BUILD.gn b/chromium/ui/accessibility/platform/BUILD.gn
index 2f015b939bb..99df759347f 100644
--- a/chromium/ui/accessibility/platform/BUILD.gn
+++ b/chromium/ui/accessibility/platform/BUILD.gn
@@ -57,6 +57,14 @@ source_set("platform") {
# Used by //chrome/test/browser_tests/browser_view_browsertest.cc
"ax_platform_node_test_helper.cc",
"ax_platform_node_test_helper.h",
+
+ # Used by DumpAccTree testsuite and a11y tools
+ "inspect/inspect.cc",
+ "inspect/inspect.h",
+ "inspect/property_node.cc",
+ "inspect/property_node.h",
+ "inspect/tree_formatter.cc",
+ "inspect/tree_formatter.h",
]
public_deps = [
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
index 5c51478d8be..900fe8d2fff 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -2732,6 +2732,10 @@ AtkRole AXPlatformNodeAuraLinux::GetAtkRole() const {
return kAtkFootnoteRole;
case ax::mojom::Role::kDocPageBreak:
return ATK_ROLE_SEPARATOR;
+ case ax::mojom::Role::kDocPageFooter:
+ return ATK_ROLE_FOOTER;
+ case ax::mojom::Role::kDocPageHeader:
+ return ATK_ROLE_HEADER;
case ax::mojom::Role::kDocAcknowledgments:
case ax::mojom::Role::kDocAfterword:
case ax::mojom::Role::kDocAppendix:
@@ -4062,9 +4066,6 @@ void AXPlatformNodeAuraLinux::NotifyAccessibilityEvent(
case ax::mojom::Event::kValueChanged:
OnValueChanged();
break;
- case ax::mojom::Event::kInvalidStatusChanged:
- OnInvalidStatusChanged();
- break;
case ax::mojom::Event::kWindowActivated:
if (AtkUtilAuraLinux::GetInstance()->IsAtSpiReady()) {
OnWindowActivated();
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
index bc24786b922..73080de191b 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
@@ -13,6 +13,26 @@
#include "ui/accessibility/platform/ax_platform_node_unittest.h"
#include "ui/accessibility/platform/test_ax_node_wrapper.h"
+namespace {
+
+// ATK window activated event will be held until AT-SPI bridge is ready. For
+// those tests using this event, we work that around by faking the state of the
+// AT-SPI bridge. Creating an instance of this class will set it to true during
+// the test and set it back to its default state when the test ends, so it
+// doesn't affect other tests run in the same batch.
+class ScopedAtSpiReady final {
+ public:
+ explicit ScopedAtSpiReady() {
+ ui::AtkUtilAuraLinux::GetInstance()->SetAtSpiReady(true);
+ }
+
+ ~ScopedAtSpiReady() {
+ ui::AtkUtilAuraLinux::GetInstance()->SetAtSpiReady(false);
+ }
+};
+
+} // namespace
+
namespace ui {
class AXPlatformNodeAuraLinuxTest : public AXPlatformNodeTest {
@@ -1587,6 +1607,8 @@ class ActivationTester {
//
//
TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkWindowActive) {
+ ScopedAtSpiReady enable_at_spi;
+
AXNodeData root;
root.id = 1;
root.role = ax::mojom::Role::kWindow;
@@ -1621,10 +1643,6 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkWindowActive) {
}),
&saw_active_focus_state_change);
- // ATK window activated event will be held until AT-SPI bridge is ready. We
- // work that around by faking its state.
- ui::AtkUtilAuraLinux::GetInstance()->SetAtSpiReady(true);
-
{
ActivationTester tester(root_atk_object);
EXPECT_FALSE(tester.IsActivatedInStateSet());
@@ -1712,6 +1730,10 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestPostponedAtkWindowActive) {
EXPECT_FALSE(tester.saw_deactivate_);
}
+ // Set AtSpiReady state back to its default state, so it doesn't affect other
+ // tests run in the same batch.
+ atk_util->SetAtSpiReady(false);
+
g_object_unref(root_atk_object);
}
@@ -1815,7 +1837,9 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestFocusTriggersAtkWindowActive) {
g_object_unref(root_atk_object);
}
-TEST_F(AXPlatformNodeAuraLinuxTest, DISABLED_TestAtkPopupWindowActive) {
+TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkPopupWindowActive) {
+ ScopedAtSpiReady enable_at_spi;
+
AXNodeData root;
root.id = 1;
root.role = ax::mojom::Role::kApplication;
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_base.cc b/chromium/ui/accessibility/platform/ax_platform_node_base.cc
index f74ed2dfdfc..6472dae7e08 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_base.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_base.cc
@@ -676,18 +676,6 @@ base::string16 AXPlatformNodeBase::GetInnerText() const {
return delegate_->GetInnerText();
}
-base::string16 AXPlatformNodeBase::GetRangeValueText() const {
- float fval;
- base::string16 value =
- GetString16Attribute(ax::mojom::StringAttribute::kValue);
-
- if (value.empty() &&
- GetFloatAttribute(ax::mojom::FloatAttribute::kValueForRange, &fval)) {
- value = base::NumberToString16(fval);
- }
- return value;
-}
-
base::string16
AXPlatformNodeBase::GetRoleDescriptionFromImageAnnotationStatusOrFromAttribute()
const {
@@ -961,25 +949,10 @@ bool AXPlatformNodeBase::IsVerticallyScrollable() const {
GetIntAttribute(ax::mojom::IntAttribute::kScrollYMax);
}
-base::string16 AXPlatformNodeBase::GetValue() const {
- // Expose slider value.
- if (GetData().IsRangeValueSupported())
- return GetRangeValueText();
-
- // On Windows, the value of a document should be its URL.
- if (ui::IsDocument(GetData().role))
- return base::UTF8ToUTF16(delegate_->GetTreeData().url);
-
- base::string16 value =
- GetString16Attribute(ax::mojom::StringAttribute::kValue);
-
- // Some screen readers like Jaws and VoiceOver require a
- // value to be set in text fields with rich content, even though the same
- // information is available on the children.
- if (value.empty() && IsRichTextField())
- return GetInnerText();
-
- return value;
+base::string16 AXPlatformNodeBase::GetValueForControl() const {
+ if (!delegate_)
+ return base::string16();
+ return delegate_->GetValueForControl();
}
void AXPlatformNodeBase::ComputeAttributes(PlatformAttributeList* attributes) {
@@ -1206,10 +1179,10 @@ void AXPlatformNodeBase::ComputeAttributes(PlatformAttributeList* attributes) {
}
}
- // Expose slider value.
+ // Expose the value of a progress bar, slider, scroll bar or <select> element.
if (GetData().IsRangeValueSupported() ||
GetData().role == ax::mojom::Role::kComboBoxMenuButton) {
- std::string value = base::UTF16ToUTF8(GetRangeValueText());
+ std::string value = base::UTF16ToUTF8(GetValueForControl());
if (!value.empty())
AddAttributeToList("valuetext", value, attributes);
}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_base.h b/chromium/ui/accessibility/platform/ax_platform_node_base.h
index fb31b4e8892..23d8794a157 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_base.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_base.h
@@ -283,7 +283,12 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
// e.g. aria-label and HTML title, is not returned.
base::string16 GetInnerText() const;
- virtual base::string16 GetValue() const;
+ // Returns the value of a control such as a text field, a slider, a <select>
+ // element, a date picker or an ARIA combo box. In order to minimize
+ // cross-process communication between the renderer and the browser, may
+ // compute the value from the control's inner text in the case of a text
+ // field.
+ base::string16 GetValueForControl() const;
// Represents a non-static text node in IAccessibleHypertext (and ATK in the
// future). This character is embedded in the response to
@@ -358,16 +363,11 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode {
//
AXPlatformNodeDelegate* delegate_ = nullptr;
- protected:
bool IsDocument() const;
+ protected:
bool IsSelectionItemSupported() const;
- // Get the range value text, which might come from aria-valuetext or
- // a floating-point value. This is different from the value string
- // attribute used in input controls such as text boxes and combo boxes.
- base::string16 GetRangeValueText() const;
-
// Get the role description from the node data or from the image annotation
// status.
base::string16 GetRoleDescription() const;
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_delegate.h b/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
index 6b9c27e9e66..acbf7f2e34f 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -86,6 +86,13 @@ class AX_EXPORT AXPlatformNodeDelegate {
// e.g. aria-label and HTML title, is not returned.
virtual base::string16 GetInnerText() const = 0;
+ // Returns the value of a control such as a text field, a slider, a <select>
+ // element, a date picker or an ARIA combo box. In order to minimize
+ // cross-process communication between the renderer and the browser, may
+ // compute the value from the control's inner text in the case of a text
+ // field.
+ virtual base::string16 GetValueForControl() const = 0;
+
// Get the unignored selection from the tree
virtual const AXTree::Selection GetUnignoredSelection() const = 0;
@@ -138,7 +145,7 @@ class AX_EXPORT AXPlatformNodeDelegate {
// Returns true if this current node is editable and the root editable node is
// a plain text field.
- virtual bool IsChildOfPlainTextField() const = 0;
+ virtual bool IsDescendantOfPlainTextField() const = 0;
// Returns true if this is a leaf node, meaning all its
// children should not be exposed to any platform's native accessibility
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc
index 2a44e03fafe..ba49fe98b82 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.cc
@@ -63,6 +63,21 @@ base::string16 AXPlatformNodeDelegateBase::GetInnerText() const {
return inner_text;
}
+base::string16 AXPlatformNodeDelegateBase::GetValueForControl() const {
+ if (!IsControl(GetData().role) && !GetData().IsRangeValueSupported())
+ return base::string16();
+
+ base::string16 value =
+ GetData().GetString16Attribute(ax::mojom::StringAttribute::kValue);
+ float numeric_value;
+ if (GetData().IsRangeValueSupported() && value.empty() &&
+ GetData().GetFloatAttribute(ax::mojom::FloatAttribute::kValueForRange,
+ &numeric_value)) {
+ value = base::NumberToString16(numeric_value);
+ }
+ return value;
+}
+
const AXTree::Selection AXPlatformNodeDelegateBase::GetUnignoredSelection()
const {
return AXTree::Selection{-1, -1, -1, ax::mojom::TextAffinity::kDownstream};
@@ -149,7 +164,7 @@ bool AXPlatformNodeDelegateBase::IsToplevelBrowserWindow() {
return false;
}
-bool AXPlatformNodeDelegateBase::IsChildOfPlainTextField() const {
+bool AXPlatformNodeDelegateBase::IsDescendantOfPlainTextField() const {
return false;
}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h
index 8158fe7da5d..43459f18b43 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_delegate_base.h
@@ -36,6 +36,7 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
const AXTreeData& GetTreeData() const override;
base::string16 GetInnerText() const override;
+ base::string16 GetValueForControl() const override;
const AXTree::Selection GetUnignoredSelection() const override;
// Creates a text position rooted at this object.
@@ -71,7 +72,7 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate {
gfx::NativeViewAccessible GetPreviousSibling() override;
bool IsChildOfLeaf() const override;
- bool IsChildOfPlainTextField() const override;
+ bool IsDescendantOfPlainTextField() const override;
bool IsLeaf() const override;
bool IsToplevelBrowserWindow() override;
gfx::NativeViewAccessible GetClosestPlatformObject() const override;
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_mac.mm b/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
index 96d46d45218..afd130143d7 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/chromium/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -106,6 +106,8 @@ RoleMap BuildRoleMap() {
{ax::mojom::Role::kDocNoteRef, NSAccessibilityLinkRole},
{ax::mojom::Role::kDocNotice, NSAccessibilityGroupRole},
{ax::mojom::Role::kDocPageBreak, NSAccessibilitySplitterRole},
+ {ax::mojom::Role::kDocPageFooter, NSAccessibilityGroupRole},
+ {ax::mojom::Role::kDocPageHeader, NSAccessibilityGroupRole},
{ax::mojom::Role::kDocPageList, NSAccessibilityGroupRole},
{ax::mojom::Role::kDocPart, NSAccessibilityGroupRole},
{ax::mojom::Role::kDocPreface, NSAccessibilityGroupRole},
@@ -752,7 +754,7 @@ bool AlsoUseShowMenuActionForDefaultAction(const ui::AXNodeData& data) {
_node->GetIntAttribute(ax::mojom::IntAttribute::kCheckedState));
return checkedState == ax::mojom::CheckedState::kTrue ? @1 : @0;
}
- return [self getStringAttribute:ax::mojom::StringAttribute::kValue];
+ return base::SysUTF16ToNSString(_node->GetValueForControl());
}
- (NSNumber*)AXEnabled {
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textprovider_win.cc b/chromium/ui/accessibility/platform/ax_platform_node_textprovider_win.cc
index afa69c77c7a..f5ecd975918 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textprovider_win.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textprovider_win.cc
@@ -300,7 +300,7 @@ ITextRangeProvider* AXPlatformNodeTextProviderWin::GetRangeFromChild(
descendant->GetDelegate()->CreateTextPositionAt(0)->AsLeafTextPosition();
AXNodePosition::AXPositionInstance end;
- if (ui::IsDocument(descendant->GetData().role)) {
+ if (descendant->IsDocument()) {
// Fast path for getting the range of the web root.
end = start->CreatePositionAtEndOfDocument();
} else if (descendant->GetChildCount() == 0) {
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textprovider_win_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_textprovider_win_unittest.cc
index aecad8d1880..3d375fb06f5 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textprovider_win_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textprovider_win_unittest.cc
@@ -44,11 +44,11 @@ class AXPlatformNodeTextProviderTest : public AXPlatformNodeWinTest {
}
const AXNodePosition::AXPositionInstance& GetStart(
const AXPlatformNodeTextRangeProviderWin* text_range) {
- return text_range->start_;
+ return text_range->start();
}
const AXNodePosition::AXPositionInstance& GetEnd(
const AXPlatformNodeTextRangeProviderWin* text_range) {
- return text_range->end_;
+ return text_range->end();
}
};
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
index 9ec0e0d4fa4..f8410f3b3c6 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
@@ -14,38 +14,38 @@
#include "ui/accessibility/ax_action_data.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
-#define UIA_VALIDATE_TEXTRANGEPROVIDER_CALL() \
- if (!owner() || !owner()->GetDelegate() || !start_ || \
- !start_->GetAnchor() || !end_ || !end_->GetAnchor()) \
- return UIA_E_ELEMENTNOTAVAILABLE; \
- start_ = start_->AsValidPosition(); \
- end_ = end_->AsValidPosition();
-#define UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_IN(in) \
- if (!owner() || !owner()->GetDelegate() || !start_ || \
- !start_->GetAnchor() || !end_ || !end_->GetAnchor()) \
- return UIA_E_ELEMENTNOTAVAILABLE; \
- if (!in) \
- return E_POINTER; \
- start_ = start_->AsValidPosition(); \
- end_ = end_->AsValidPosition();
-#define UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_OUT(out) \
- if (!owner() || !owner()->GetDelegate() || !start_ || \
- !start_->GetAnchor() || !end_ || !end_->GetAnchor()) \
- return UIA_E_ELEMENTNOTAVAILABLE; \
- if (!out) \
- return E_POINTER; \
- *out = {}; \
- start_ = start_->AsValidPosition(); \
- end_ = end_->AsValidPosition();
+#define UIA_VALIDATE_TEXTRANGEPROVIDER_CALL() \
+ if (!owner() || !owner()->GetDelegate() || !start() || \
+ !start()->GetAnchor() || !end() || !end()->GetAnchor()) \
+ return UIA_E_ELEMENTNOTAVAILABLE; \
+ SetStart(start()->AsValidPosition()); \
+ SetEnd(end()->AsValidPosition());
+#define UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_IN(in) \
+ if (!owner() || !owner()->GetDelegate() || !start() || \
+ !start()->GetAnchor() || !end() || !end()->GetAnchor()) \
+ return UIA_E_ELEMENTNOTAVAILABLE; \
+ if (!in) \
+ return E_POINTER; \
+ SetStart(start()->AsValidPosition()); \
+ SetEnd(end()->AsValidPosition());
+#define UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_OUT(out) \
+ if (!owner() || !owner()->GetDelegate() || !start() || \
+ !start()->GetAnchor() || !end() || !end()->GetAnchor()) \
+ return UIA_E_ELEMENTNOTAVAILABLE; \
+ if (!out) \
+ return E_POINTER; \
+ *out = {}; \
+ SetStart(start()->AsValidPosition()); \
+ SetEnd(end()->AsValidPosition());
#define UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_IN_1_OUT(in, out) \
- if (!owner() || !owner()->GetDelegate() || !start_ || \
- !start_->GetAnchor() || !end_ || !end_->GetAnchor()) \
+ if (!owner() || !owner()->GetDelegate() || !start() || \
+ !start()->GetAnchor() || !end() || !end()->GetAnchor()) \
return UIA_E_ELEMENTNOTAVAILABLE; \
if (!in || !out) \
return E_POINTER; \
*out = {}; \
- start_ = start_->AsValidPosition(); \
- end_ = end_->AsValidPosition();
+ SetStart(start()->AsValidPosition()); \
+ SetEnd(end()->AsValidPosition());
// Validate bounds calculated by AXPlatformNodeDelegate. Degenerate bounds
// indicate the interface is not yet supported on the platform.
#define UIA_VALIDATE_BOUNDS(bounds) \
@@ -101,8 +101,8 @@ ITextRangeProvider* AXPlatformNodeTextRangeProviderWin::CreateTextRangeProvider(
&text_range_provider))) {
DCHECK(text_range_provider);
text_range_provider->owner_ = owner;
- text_range_provider->start_ = std::move(start);
- text_range_provider->end_ = std::move(end);
+ text_range_provider->SetStart(std::move(start));
+ text_range_provider->SetEnd(std::move(end));
text_range_provider->AddRef();
return text_range_provider;
}
@@ -118,7 +118,7 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Clone(ITextRangeProvider** clone) {
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_OUT(clone);
*clone =
- CreateTextRangeProvider(owner_.Get(), start_->Clone(), end_->Clone());
+ CreateTextRangeProvider(owner_.Get(), start()->Clone(), end()->Clone());
return S_OK;
}
@@ -132,8 +132,8 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Compare(ITextRangeProvider* other,
if (other->QueryInterface(IID_PPV_ARGS(&other_provider)) != S_OK)
return UIA_E_INVALIDOPERATION;
- if (*start_ == *(other_provider->start_) &&
- *end_ == *(other_provider->end_)) {
+ if (*start() == *(other_provider->start()) &&
+ *end() == *(other_provider->end())) {
*result = TRUE;
}
return S_OK;
@@ -153,11 +153,11 @@ HRESULT AXPlatformNodeTextRangeProviderWin::CompareEndpoints(
return UIA_E_INVALIDOPERATION;
const AXPositionInstance& this_provider_endpoint =
- (this_endpoint == TextPatternRangeEndpoint_Start) ? start_ : end_;
+ (this_endpoint == TextPatternRangeEndpoint_Start) ? start() : end();
const AXPositionInstance& other_provider_endpoint =
(other_endpoint == TextPatternRangeEndpoint_Start)
- ? other_provider->start_
- : other_provider->end_;
+ ? other_provider->start()
+ : other_provider->end();
base::Optional<int> comparison =
this_provider_endpoint->CompareTo(*other_provider_endpoint);
@@ -183,7 +183,11 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnit(
HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnitImpl(
TextUnit unit) {
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL();
- NormalizeTextRange();
+ AXPositionInstance normalized_start = start()->Clone();
+ AXPositionInstance normalized_end = end()->Clone();
+ NormalizeTextRange(normalized_start, normalized_end);
+ SetStart(std::move(normalized_start));
+ SetEnd(std::move(normalized_end));
// Determine if start is on a boundary of the specified TextUnit, if it is
// not, move backwards until it is. Move the end forwards from start until it
@@ -192,98 +196,103 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnitImpl(
case TextUnit_Character: {
// For characters, the start endpoint will always be on a TextUnit
// boundary, thus we only need to move the end position.
- AXPositionInstance end_backup = end_->Clone();
- end_ = start_->CreateNextCharacterPosition(
- AXBoundaryBehavior::CrossBoundary);
+ AXPositionInstance end_backup = end()->Clone();
+ SetEnd(start()->CreateNextCharacterPosition(
+ AXBoundaryBehavior::CrossBoundary));
- if (end_->IsNullPosition()) {
+ if (end()->IsNullPosition()) {
// The previous could fail if the start is at the end of the last anchor
// of the tree, try expanding to the previous character instead.
- AXPositionInstance start_backup = start_->Clone();
- start_ = start_->CreatePreviousCharacterPosition(
- AXBoundaryBehavior::CrossBoundary);
+ AXPositionInstance start_backup = start()->Clone();
+ SetStart(start()->CreatePreviousCharacterPosition(
+ AXBoundaryBehavior::CrossBoundary));
- if (start_->IsNullPosition()) {
+ if (start()->IsNullPosition()) {
// Text representation is empty, undo everything and exit.
- start_ = std::move(start_backup);
- end_ = std::move(end_backup);
+ SetStart(std::move(start_backup));
+ SetEnd(std::move(end_backup));
return S_OK;
}
- end_ = start_->CreateNextCharacterPosition(
- AXBoundaryBehavior::CrossBoundary);
- DCHECK(!end_->IsNullPosition());
+ SetEnd(start()->CreateNextCharacterPosition(
+ AXBoundaryBehavior::CrossBoundary));
+ DCHECK(!end()->IsNullPosition());
}
- NormalizeTextRange();
+ AXPositionInstance normalized_start = start()->Clone();
+ AXPositionInstance normalized_end = end()->Clone();
+ NormalizeTextRange(normalized_start, normalized_end);
+ SetStart(std::move(normalized_start));
+ SetEnd(std::move(normalized_end));
break;
}
case TextUnit_Format:
- start_ = start_->CreatePreviousFormatStartPosition(
- AXBoundaryBehavior::StopIfAlreadyAtBoundary);
- end_ = start_->CreateNextFormatEndPosition(
- AXBoundaryBehavior::StopIfAlreadyAtBoundary);
+ SetStart(start()->CreatePreviousFormatStartPosition(
+ AXBoundaryBehavior::StopIfAlreadyAtBoundary));
+ SetEnd(start()->CreateNextFormatEndPosition(
+ AXBoundaryBehavior::StopIfAlreadyAtBoundary));
break;
case TextUnit_Word: {
- AXPositionInstance start_backup = start_->Clone();
- start_ = start_->CreatePreviousWordStartPosition(
- AXBoundaryBehavior::StopIfAlreadyAtBoundary);
+ AXPositionInstance start_backup = start()->Clone();
+ SetStart(start()->CreatePreviousWordStartPosition(
+ AXBoundaryBehavior::StopIfAlreadyAtBoundary));
// Since we use AXBoundaryBehavior::StopIfAlreadyAtBoundary, the only case
// possible where CreatePreviousWordStartPosition can return a
// NullPosition is when it's called on a node before the first word
// boundary. This can happen when the document starts with nodes that have
// no word boundaries, like whitespaces and punctuation. When it happens,
// move the position back to the start of the document.
- if (start_->IsNullPosition())
- start_ = start_backup->CreatePositionAtStartOfDocument();
+ if (start()->IsNullPosition())
+ SetStart(start_backup->CreatePositionAtStartOfDocument());
// Since start_ is already located at a word boundary, we need to cross it
// in order to move to the next one. Because Windows ATs behave
// undesirably when the start and end endpoints are not in the same anchor
// (for character and word navigation), stop at anchor boundary.
- end_ = start_->CreateNextWordStartPosition(
- AXBoundaryBehavior::StopAtAnchorBoundary);
+ SetEnd(start()->CreateNextWordStartPosition(
+ AXBoundaryBehavior::StopAtAnchorBoundary));
break;
}
case TextUnit_Line:
- start_ = start_->CreateBoundaryStartPosition(
+ SetStart(start()->CreateBoundaryStartPosition(
AXBoundaryBehavior::StopIfAlreadyAtBoundary,
ax::mojom::MoveDirection::kBackward,
base::BindRepeating(&AtStartOfLinePredicate),
- base::BindRepeating(&AtEndOfLinePredicate));
- end_ = start_->CreateBoundaryEndPosition(
+ base::BindRepeating(&AtEndOfLinePredicate)));
+ SetEnd(start()->CreateBoundaryEndPosition(
AXBoundaryBehavior::StopIfAlreadyAtBoundary,
ax::mojom::MoveDirection::kForward,
base::BindRepeating(&AtStartOfLinePredicate),
- base::BindRepeating(&AtEndOfLinePredicate));
+ base::BindRepeating(&AtEndOfLinePredicate)));
break;
case TextUnit_Paragraph:
- start_ = start_->CreatePreviousParagraphStartPosition(
- AXBoundaryBehavior::StopIfAlreadyAtBoundary);
- end_ = start_->CreateNextParagraphEndPosition(
- AXBoundaryBehavior::StopIfAlreadyAtBoundary);
+ SetStart(start()->CreatePreviousParagraphStartPosition(
+ AXBoundaryBehavior::StopIfAlreadyAtBoundary));
+ SetEnd(start()->CreateNextParagraphEndPosition(
+ AXBoundaryBehavior::StopIfAlreadyAtBoundary));
break;
case TextUnit_Page: {
// Per UIA spec, if the document containing the current range doesn't
// support pagination, default to document navigation.
- const AXNode* common_anchor = start_->LowestCommonAnchor(*end_);
+ const AXNode* common_anchor = start()->LowestCommonAnchor(*end());
if (common_anchor->tree()->HasPaginationSupport()) {
- start_ = start_->CreatePreviousPageStartPosition(
- ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary);
- end_ = start_->CreateNextPageEndPosition(
- ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary);
+ SetStart(start()->CreatePreviousPageStartPosition(
+ ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary));
+ SetEnd(start()->CreateNextPageEndPosition(
+ ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary));
break;
}
}
FALLTHROUGH;
case TextUnit_Document:
- start_ = start_->CreatePositionAtStartOfDocument()->AsLeafTextPosition();
- end_ = start_->CreatePositionAtEndOfDocument();
+ SetStart(
+ start()->CreatePositionAtStartOfDocument()->AsLeafTextPosition());
+ SetEnd(start()->CreatePositionAtEndOfDocument());
break;
default:
return UIA_E_NOTSUPPORTED;
}
- DCHECK(!start_->IsNullPosition());
- DCHECK(!end_->IsNullPosition());
+ DCHECK(!start()->IsNullPosition());
+ DCHECK(!end()->IsNullPosition());
return S_OK;
}
@@ -323,14 +332,18 @@ HRESULT AXPlatformNodeTextRangeProviderWin::FindAttribute(
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_TEXTRANGE_FINDATTRIBUTE);
WIN_ACCESSIBILITY_API_PERF_HISTOGRAM(UMA_API_TEXTRANGE_FINDATTRIBUTE);
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_OUT(result);
- NormalizeTextRange();
+ // Use a cloned range so that FindAttribute does not introduce side-effects
+ // while normalizing the original range.
+ AXPositionInstance normalized_start = start()->Clone();
+ AXPositionInstance normalized_end = end()->Clone();
+ NormalizeTextRange(normalized_start, normalized_end);
*result = nullptr;
AXPositionInstance matched_range_start = nullptr;
AXPositionInstance matched_range_end = nullptr;
std::vector<AXNodeRange> anchors;
- AXNodeRange range(start_->Clone(), end_->Clone());
+ AXNodeRange range(normalized_start->Clone(), normalized_end->Clone());
for (AXNodeRange leaf_text_range : range)
anchors.emplace_back(std::move(leaf_text_range));
@@ -440,12 +453,12 @@ HRESULT AXPlatformNodeTextRangeProviderWin::FindText(
// breaking object. FindText() is rarely called, and when it is, it's not to
// look for a string starting or ending with a newline. This may change
// someday, and if so, we'll have to address this issue.
- const AXNode* common_anchor = start_->LowestCommonAnchor(*end_);
+ const AXNode* common_anchor = start()->LowestCommonAnchor(*end());
AXPositionInstance start_ancestor_position =
- start_->CreateAncestorPosition(common_anchor);
+ start()->CreateAncestorPosition(common_anchor);
DCHECK(!start_ancestor_position->IsNullPosition());
AXPositionInstance end_ancestor_position =
- end_->CreateAncestorPosition(common_anchor);
+ end()->CreateAncestorPosition(common_anchor);
DCHECK(!end_ancestor_position->IsNullPosition());
AXTreeID tree_id = start_ancestor_position->tree_id();
AXNode::AXID anchor_id = start_ancestor_position->anchor_id();
@@ -476,16 +489,20 @@ HRESULT AXPlatformNodeTextRangeProviderWin::GetAttributeValue(
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_TEXTRANGE_GETATTRIBUTEVALUE);
WIN_ACCESSIBILITY_API_PERF_HISTOGRAM(UMA_API_TEXTRANGE_GETATTRIBUTEVALUE);
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_OUT(value);
- NormalizeTextRange();
+ // Use a cloned range so that GetAttributeValue does not introduce
+ // side-effects while normalizing the original range.
+ AXPositionInstance normalized_start = start()->Clone();
+ AXPositionInstance normalized_end = end()->Clone();
+ NormalizeTextRange(normalized_start, normalized_end);
base::win::VariantVector attribute_value;
// The range is inclusive, so advance our endpoint to the next position
- const auto end_leaf_text_position = end_->AsLeafTextPosition();
+ const auto end_leaf_text_position = normalized_end->AsLeafTextPosition();
auto end = end_leaf_text_position->CreateNextAnchorPosition();
// Iterate over anchor positions
- for (auto it = start_->AsLeafTextPosition();
+ for (auto it = normalized_start->AsLeafTextPosition();
it->anchor_id() != end->anchor_id() || it->tree_id() != end->tree_id();
it = it->CreateNextAnchorPosition()) {
// If the iterator creates a null position, then it has likely overrun the
@@ -548,7 +565,7 @@ HRESULT AXPlatformNodeTextRangeProviderWin::GetBoundingRectangles(
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_OUT(screen_physical_pixel_rectangles);
*screen_physical_pixel_rectangles = nullptr;
- AXNodeRange range(start_->Clone(), end_->Clone());
+ AXNodeRange range(start()->Clone(), end()->Clone());
AXRangePhysicalPixelRectDelegate rect_delegate(this);
std::vector<gfx::Rect> rects = range.GetRects(&rect_delegate);
@@ -648,9 +665,9 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Move(TextUnit unit,
return S_OK;
// Save a clone of start and end, in case one of the moves fails.
- auto start_backup = start_->Clone();
- auto end_backup = end_->Clone();
- bool is_degenerate_range = (*start_ == *end_);
+ auto start_backup = start()->Clone();
+ auto end_backup = end()->Clone();
+ bool is_degenerate_range = (*start() == *end());
// Move the start of the text range forward or backward in the document by the
// requested number of text unit boundaries.
@@ -660,10 +677,10 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Move(TextUnit unit,
bool succeeded_move = SUCCEEDED(hr) && start_units_moved != 0;
if (succeeded_move) {
- end_ = start_->Clone();
+ SetEnd(start()->Clone());
if (!is_degenerate_range) {
bool forwards = count > 0;
- if (forwards && start_->AtEndOfDocument()) {
+ if (forwards && start()->AtEndOfDocument()) {
// The start is at the end of the document, so move the start backward
// by one text unit to expand the text range from the degenerate range
// state.
@@ -686,7 +703,7 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Move(TextUnit unit,
// Because Windows ATs behave undesirably when the start and end endpoints
// are not in the same anchor (for character and word navigation), make
// sure to bring back the end endpoint to the end of the start's anchor.
- if (start_->anchor_id() != end_->anchor_id() &&
+ if (start()->anchor_id() != end()->anchor_id() &&
(unit == TextUnit_Character || unit == TextUnit_Word)) {
ExpandToEnclosingUnitImpl(unit);
}
@@ -694,8 +711,8 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Move(TextUnit unit,
}
if (!succeeded_move) {
- start_ = std::move(start_backup);
- end_ = std::move(end_backup);
+ SetStart(std::move(start_backup));
+ SetEnd(std::move(end_backup));
start_units_moved = 0;
if (!SUCCEEDED(hr))
return hr;
@@ -729,7 +746,8 @@ HRESULT AXPlatformNodeTextRangeProviderWin::MoveEndpointByUnitImpl(
}
bool is_start_endpoint = endpoint == TextPatternRangeEndpoint_Start;
- AXPositionInstance& position_to_move = is_start_endpoint ? start_ : end_;
+ AXPositionInstance position_to_move =
+ is_start_endpoint ? start()->Clone() : end()->Clone();
AXPositionInstance new_position;
switch (unit) {
@@ -762,19 +780,22 @@ HRESULT AXPlatformNodeTextRangeProviderWin::MoveEndpointByUnitImpl(
default:
return UIA_E_NOTSUPPORTED;
}
- position_to_move = std::move(new_position);
+ if (is_start_endpoint)
+ SetStart(std::move(new_position));
+ else
+ SetEnd(std::move(new_position));
// If the start was moved past the end, create a degenerate range with the end
// equal to the start; do the equivalent if the end moved past the start.
base::Optional<int> endpoint_comparison =
- AXNodeRange::CompareEndpoints(start_.get(), end_.get());
+ AXNodeRange::CompareEndpoints(start().get(), end().get());
DCHECK(endpoint_comparison.has_value());
if (endpoint_comparison.value_or(0) > 0) {
if (is_start_endpoint)
- end_ = start_->Clone();
+ SetEnd(start()->Clone());
else
- start_ = end_->Clone();
+ SetStart(end()->Clone());
}
return S_OK;
}
@@ -794,17 +815,17 @@ HRESULT AXPlatformNodeTextRangeProviderWin::MoveEndpointByRange(
const AXPositionInstance& other_provider_endpoint =
(other_endpoint == TextPatternRangeEndpoint_Start)
- ? other_provider->start_
- : other_provider->end_;
+ ? other_provider->start()
+ : other_provider->end();
if (this_endpoint == TextPatternRangeEndpoint_Start) {
- start_ = other_provider_endpoint->Clone();
- if (*start_ > *end_)
- end_ = start_->Clone();
+ SetStart(other_provider_endpoint->Clone());
+ if (*start() > *end())
+ SetEnd(start()->Clone());
} else {
- end_ = other_provider_endpoint->Clone();
- if (*start_ > *end_)
- start_ = end_->Clone();
+ SetEnd(other_provider_endpoint->Clone());
+ if (*start() > *end())
+ SetStart(end()->Clone());
}
return S_OK;
}
@@ -813,8 +834,8 @@ HRESULT AXPlatformNodeTextRangeProviderWin::Select() {
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_TEXTRANGE_SELECT);
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL();
- AXPositionInstance selection_start = start_->Clone();
- AXPositionInstance selection_end = end_->Clone();
+ AXPositionInstance selection_start = start()->Clone();
+ AXPositionInstance selection_end = end()->Clone();
// Blink only supports selections within a single tree. So if start_ and end_
// are in different trees, we can't directly pass them to the render process
@@ -875,9 +896,9 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ScrollIntoView(BOOL align_to_top) {
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL();
const AXPositionInstance start_common_ancestor =
- start_->LowestCommonAncestor(*end_);
+ start()->LowestCommonAncestor(*end());
const AXPositionInstance end_common_ancestor =
- end_->LowestCommonAncestor(*start_);
+ end()->LowestCommonAncestor(*start());
if (start_common_ancestor->IsNullPosition() ||
end_common_ancestor->IsNullPosition())
return E_INVALIDARG;
@@ -914,8 +935,8 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ScrollIntoView(BOOL align_to_top) {
root_frame_bounds.y() + root_frame_bounds.height());
}
- if ((align_to_top && start_->GetAnchor()->IsText()) ||
- (!align_to_top && end_->GetAnchor()->IsText())) {
+ if ((align_to_top && start()->GetAnchor()->IsText()) ||
+ (!align_to_top && end()->GetAnchor()->IsText())) {
const gfx::Rect text_range_frame_bounds =
common_ancestor_delegate->GetInnerTextRangeBoundsRect(
start_common_ancestor->text_offset(),
@@ -952,10 +973,11 @@ HRESULT AXPlatformNodeTextRangeProviderWin::GetChildren(SAFEARRAY** children) {
WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_TEXTRANGE_GETCHILDREN);
WIN_ACCESSIBILITY_API_PERF_HISTOGRAM(UMA_API_TEXTRANGE_GETCHILDREN);
UIA_VALIDATE_TEXTRANGEPROVIDER_CALL_1_OUT(children);
-
std::vector<gfx::NativeViewAccessible> descendants;
- const AXNode* common_anchor = start_->LowestCommonAnchor(*end_);
+ const AXNode* common_anchor = start()->LowestCommonAnchor(*end());
+ if (!common_anchor)
+ return UIA_E_ELEMENTNOTAVAILABLE;
const AXTreeID tree_id = common_anchor->tree()->GetAXTreeID();
const AXNode::AXID node_id = common_anchor->id();
AXPlatformNodeDelegate* delegate = GetDelegate(tree_id, node_id);
@@ -1036,7 +1058,7 @@ AXPlatformNodeTextRangeProviderWin::GetNextTextBoundaryPosition(
base::string16 AXPlatformNodeTextRangeProviderWin::GetString(
int max_count,
size_t* appended_newlines_count) {
- AXNodeRange range(start_->Clone(), end_->Clone());
+ AXNodeRange range(start()->Clone(), end()->Clone());
return range.GetText(AXTextConcatenationBehavior::kAsInnerText, max_count,
false, appended_newlines_count);
}
@@ -1125,7 +1147,7 @@ AXPlatformNodeTextRangeProviderWin::MoveEndpointByPage(
int* units_moved) {
// Per UIA spec, if the document containing the current endpoint doesn't
// support pagination, default to document navigation.
- AXPositionInstance common_ancestor = start_->LowestCommonAncestor(*end_);
+ AXPositionInstance common_ancestor = start()->LowestCommonAncestor(*end());
if (!common_ancestor->GetAnchor()->tree()->HasPaginationSupport())
return MoveEndpointByDocument(std::move(endpoint), count, units_moved);
@@ -1189,75 +1211,81 @@ AXPlatformNodeTextRangeProviderWin::MoveEndpointByUnitHelper(
return current_endpoint;
}
-void AXPlatformNodeTextRangeProviderWin::NormalizeTextRange() {
- if (!start_->IsValid() || !end_->IsValid())
+// TODO(vicfei): Make static.
+void AXPlatformNodeTextRangeProviderWin::NormalizeTextRange(
+ AXPositionInstance& start,
+ AXPositionInstance& end) {
+ if (!start->IsValid() || !end->IsValid())
return;
// If either endpoint is anchored to an ignored node,
// first snap them both to be unignored positions.
- NormalizeAsUnignoredTextRange();
+ NormalizeAsUnignoredTextRange(start, end);
// When carets are visible or selections are occurring, the precise state of
// the TextPattern must be preserved so that the UIA client can handle
// scenarios such as determining which characters were deleted. So
// normalization must be bypassed.
- if (HasCaretOrSelectionInPlainTextField(start_) ||
- HasCaretOrSelectionInPlainTextField(end_)) {
+ if (HasCaretOrSelectionInPlainTextField(start) ||
+ HasCaretOrSelectionInPlainTextField(end)) {
return;
}
AXPositionInstance normalized_start =
- start_->AsLeafTextPositionBeforeCharacter();
+ start->AsLeafTextPositionBeforeCharacter();
// For a degenerate range, the |end_| will always be the same as the
// normalized start, so there's no need to compute the normalized end.
// However, a degenerate range might go undetected if there's an ignored node
// (or many) between the two endpoints. For this reason, we need to
// compare the |end_| with both the |start_| and the |normalized_start|.
- bool is_degenerate = *start_ == *end_ || *normalized_start == *end_;
+ bool is_degenerate = *start == *end || *normalized_start == *end;
AXPositionInstance normalized_end =
is_degenerate ? normalized_start->Clone()
- : end_->AsLeafTextPositionAfterCharacter();
+ : end->AsLeafTextPositionAfterCharacter();
if (!normalized_start->IsNullPosition() &&
!normalized_end->IsNullPosition()) {
- start_ = std::move(normalized_start);
- end_ = std::move(normalized_end);
+ start = std::move(normalized_start);
+ end = std::move(normalized_end);
}
- DCHECK_LE(*start_, *end_);
+ DCHECK_LE(*start, *end);
}
-void AXPlatformNodeTextRangeProviderWin::NormalizeAsUnignoredTextRange() {
- if (!start_->IsValid() || !end_->IsValid())
+// static
+void AXPlatformNodeTextRangeProviderWin::NormalizeAsUnignoredTextRange(
+ AXPositionInstance& start,
+ AXPositionInstance& end) {
+ if (!start->IsValid() || !end->IsValid())
return;
- if (!start_->IsIgnored() && !end_->IsIgnored())
+ if (!start->IsIgnored() && !end->IsIgnored())
return;
- if (start_->IsIgnored()) {
+ if (start->IsIgnored()) {
AXPositionInstance normalized_start =
- start_->AsUnignoredPosition(AXPositionAdjustmentBehavior::kMoveForward);
+ start->AsUnignoredPosition(AXPositionAdjustmentBehavior::kMoveForward);
if (normalized_start->IsNullPosition()) {
- normalized_start = start_->AsUnignoredPosition(
+ normalized_start = start->AsUnignoredPosition(
AXPositionAdjustmentBehavior::kMoveBackward);
}
if (!normalized_start->IsNullPosition())
- start_ = std::move(normalized_start);
+ start = std::move(normalized_start);
}
- if (end_->IsIgnored()) {
+ if (end->IsIgnored()) {
AXPositionInstance normalized_end =
- end_->AsUnignoredPosition(AXPositionAdjustmentBehavior::kMoveForward);
+ end->AsUnignoredPosition(AXPositionAdjustmentBehavior::kMoveForward);
if (normalized_end->IsNullPosition()) {
- normalized_end = end_->AsUnignoredPosition(
- AXPositionAdjustmentBehavior::kMoveBackward);
+ normalized_end =
+ end->AsUnignoredPosition(AXPositionAdjustmentBehavior::kMoveBackward);
}
if (!normalized_end->IsNullPosition())
- end_ = std::move(normalized_end);
+ end = std::move(normalized_end);
}
- DCHECK_LE(*start_, *end_);
+ DCHECK_LE(*start, *end);
}
AXPlatformNodeDelegate* AXPlatformNodeTextRangeProviderWin::GetRootDelegate(
@@ -1272,6 +1300,15 @@ AXPlatformNodeDelegate* AXPlatformNodeTextRangeProviderWin::GetRootDelegate(
return root_platform_node->GetDelegate();
}
+void AXPlatformNodeTextRangeProviderWin::SetStart(
+ AXPositionInstance new_start) {
+ endpoints_.SetStart(std::move(new_start));
+}
+
+void AXPlatformNodeTextRangeProviderWin::SetEnd(AXPositionInstance new_end) {
+ endpoints_.SetEnd(std::move(new_end));
+}
+
AXNode* AXPlatformNodeTextRangeProviderWin::GetSelectionCommonAnchor() {
AXPlatformNodeDelegate* delegate = owner()->GetDelegate();
ui::AXTree::Selection unignored_selection = delegate->GetUnignoredSelection();
@@ -1328,7 +1365,7 @@ void AXPlatformNodeTextRangeProviderWin::
AXPlatformNodeWin*
AXPlatformNodeTextRangeProviderWin::GetLowestAccessibleCommonPlatformNode()
const {
- AXNode* common_anchor = start_->LowestCommonAnchor(*end_);
+ AXNode* common_anchor = start()->LowestCommonAnchor(*end());
if (!common_anchor)
return nullptr;
@@ -1353,7 +1390,7 @@ bool AXPlatformNodeTextRangeProviderWin::HasCaretOrSelectionInPlainTextField(
if (delegate && delegate->HasVisibleCaretOrSelection()) {
if (!delegate->GetData().HasState(ax::mojom::State::kEditable) ||
(delegate->GetData().IsPlainTextField() ||
- delegate->IsChildOfPlainTextField())) {
+ delegate->IsDescendantOfPlainTextField())) {
return true;
}
}
@@ -1405,4 +1442,93 @@ bool AXPlatformNodeTextRangeProviderWin::ShouldReleaseTextAttributeAsSafearray(
!TextAttributeIsUiaReservedValue(attribute_value);
}
+AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::TextRangeEndpoints() {
+ start_ = AXNodePosition::CreateNullPosition();
+ end_ = AXNodePosition::CreateNullPosition();
+}
+
+AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::~TextRangeEndpoints() {
+ SetStart(AXNodePosition::CreateNullPosition());
+ SetEnd(AXNodePosition::CreateNullPosition());
+}
+
+void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::SetStart(
+ AXPositionInstance new_start) {
+ bool did_tree_change = start_->tree_id() != new_start->tree_id();
+ if (did_tree_change && !start_->IsNullPosition() &&
+ start_->tree_id() != end_->tree_id()) {
+ RemoveObserver(start_->tree_id());
+ }
+
+ start_ = std::move(new_start);
+
+ if (did_tree_change && !start_->IsNullPosition() &&
+ start_->tree_id() != end_->tree_id()) {
+ AddObserver(start_->tree_id());
+ }
+}
+
+void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::SetEnd(
+ AXPositionInstance new_end) {
+ bool did_tree_change = end_->tree_id() != new_end->tree_id();
+ if (did_tree_change && !end_->IsNullPosition() &&
+ end_->tree_id() != start_->tree_id()) {
+ RemoveObserver(end_->tree_id());
+ }
+
+ end_ = std::move(new_end);
+
+ if (did_tree_change && !end_->IsNullPosition() &&
+ start_->tree_id() != end_->tree_id()) {
+ AddObserver(end_->tree_id());
+ }
+}
+
+void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::AddObserver(
+ const AXTreeID tree_id) {
+ AXTreeManager* ax_tree_manager =
+ AXTreeManagerMap::GetInstance().GetManager(tree_id);
+ DCHECK(ax_tree_manager);
+ ax_tree_manager->AddObserver(this);
+}
+
+void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::RemoveObserver(
+ const AXTreeID tree_id) {
+ AXTreeManager* ax_tree_manager =
+ AXTreeManagerMap::GetInstance().GetManager(tree_id);
+ if (ax_tree_manager)
+ ax_tree_manager->RemoveObserver(this);
+}
+
+void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::
+ OnNodeWillBeDeleted(AXTree* tree, AXNode* node) {
+ // If an endpoint is on a node that will be deleted, move endpoint up to a
+ // parent since we want to ensure that the endpoints of a text range provider
+ // are always valid positions. Otherwise, the range will be stuck on nodes
+ // that don't exist anymore.
+ DCHECK(tree);
+ DCHECK(node);
+ DCHECK_EQ(tree->GetAXTreeID(), node->tree()->GetAXTreeID());
+ if (tree->GetAXTreeID() == start_->tree_id() &&
+ node->id() == start_->anchor_id()) {
+ AXPositionInstance new_start = start_->CreateParentPosition();
+ // Create a degenerate range at |end_| if we have an inverted range -
+ // which occurs when the |end_| comes before the |start_|. However, if the
+ // |end_| is positioned on the deleted node, don't create a degenerate range
+ // yet as that position will be updated below.
+ if (node->id() != end_->anchor_id() && *end_ < *new_start)
+ new_start = end_->Clone();
+ SetStart(std::move(new_start));
+ }
+ if (tree->GetAXTreeID() == end_->tree_id() &&
+ node->id() == end_->anchor_id()) {
+ AXPositionInstance new_end = end_->CreateParentPosition();
+ // Create a degenerate range at |start_| if we have an inverted range -
+ // which occurs when the |end_| comes before the |start_|.
+ if (*new_end < *start_)
+ new_end = start_->Clone();
+ SetEnd(std::move(new_end));
+ }
+}
+
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h
index 859c74734a0..0d960715d9e 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.h
@@ -112,6 +112,8 @@ class AX_EXPORT __declspec(uuid("3071e40d-a10d-45ff-a59f-6e8e1138e2c1"))
base::string16 GetString(int max_count,
size_t* appended_newlines_count = nullptr);
AXPlatformNodeWin* owner() const;
+ const AXPositionInstance& start() const { return endpoints_.GetStart(); }
+ const AXPositionInstance& end() const { return endpoints_.GetEnd(); }
AXPlatformNodeDelegate* GetDelegate(
const AXPositionInstanceType* position) const;
AXPlatformNodeDelegate* GetDelegate(const AXTreeID tree_id,
@@ -158,12 +160,17 @@ class AX_EXPORT __declspec(uuid("3071e40d-a10d-45ff-a59f-6e8e1138e2c1"))
// A text range normalization is necessary to prevent a |start_| endpoint to
// be positioned at the end of an anchor when it can be at the start of the
// next anchor. After normalization, it is guaranteed that:
- // * both endpoints of a range are always positioned on unignored anchors;
- // * both endpoints of a range are never between a grapheme cluster;
- // * if the range is degenerate, both endpoints of a range are on the same
- // anchor.
- void NormalizeTextRange();
- void NormalizeAsUnignoredTextRange();
+ // * both endpoints passed by parameter are always positioned on unignored
+ // anchors;
+ // * both endpoints passed by parameter are never between a grapheme cluster;
+ // * if the endpoints passed by parameter create a degenerate range, both
+ // endpoints are on the same anchor.
+ // Normalization never updates the internal endpoints directly. Instead, it
+ // normalizes the endpoints passed by parameter.
+ // TODO(vicfei): Make static.
+ void NormalizeTextRange(AXPositionInstance& start, AXPositionInstance& end);
+ static void NormalizeAsUnignoredTextRange(AXPositionInstance& start,
+ AXPositionInstance& end);
AXPlatformNodeDelegate* GetRootDelegate(const ui::AXTreeID tree_id);
AXNode* GetSelectionCommonAnchor();
@@ -173,6 +180,9 @@ class AX_EXPORT __declspec(uuid("3071e40d-a10d-45ff-a59f-6e8e1138e2c1"))
bool HasCaretOrSelectionInPlainTextField(
const AXPositionInstance& position) const;
+ void SetStart(AXPositionInstance start);
+ void SetEnd(AXPositionInstance end);
+
static bool TextAttributeIsArrayType(TEXTATTRIBUTEID attribute_id);
static bool TextAttributeIsUiaReservedValue(
const base::win::VariantVector& vector);
@@ -181,8 +191,32 @@ class AX_EXPORT __declspec(uuid("3071e40d-a10d-45ff-a59f-6e8e1138e2c1"))
const base::win::VariantVector& vector);
Microsoft::WRL::ComPtr<AXPlatformNodeWin> owner_;
- AXPositionInstance start_;
- AXPositionInstance end_;
+
+ // Why we can't use a ScopedObserver here:
+ // We tried using a ScopedObserver instead of a simple observer in this case,
+ // but there appears to be a problem with the lifetime of the referenced
+ // AXTreeManager in the ScopedObserver. The AXTreeManager can get deleted
+ // before the TextRangeEndpoints does, so when the destructor of the
+ // ScopedObserver calls ScopedObserver::RemoveAll on an already deleted
+ // AXTreeManager, it crashes.
+ class TextRangeEndpoints : public AXTreeObserver {
+ public:
+ TextRangeEndpoints();
+ ~TextRangeEndpoints() override;
+ const AXPositionInstance& GetStart() const { return start_; }
+ const AXPositionInstance& GetEnd() const { return end_; }
+ void SetStart(AXPositionInstance new_start);
+ void SetEnd(AXPositionInstance new_end);
+
+ void AddObserver(const AXTreeID tree_id);
+ void RemoveObserver(const AXTreeID tree_id);
+ void OnNodeWillBeDeleted(AXTree* tree, AXNode* node) override;
+
+ private:
+ AXPositionInstance start_;
+ AXPositionInstance end_;
+ };
+ TextRangeEndpoints endpoints_;
};
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
index d42dd13d870..d36a8cc9d81 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_textrangeprovider_win_unittest.cc
@@ -165,12 +165,12 @@ class AXPlatformNodeTextRangeProviderTest : public ui::AXPlatformNodeWinTest {
public:
const AXNodePosition::AXPositionInstance& GetStart(
const AXPlatformNodeTextRangeProviderWin* text_range) {
- return text_range->start_;
+ return text_range->start();
}
const AXNodePosition::AXPositionInstance& GetEnd(
const AXPlatformNodeTextRangeProviderWin* text_range) {
- return text_range->end_;
+ return text_range->end();
}
ui::AXPlatformNodeWin* GetOwner(
@@ -178,8 +178,12 @@ class AXPlatformNodeTextRangeProviderTest : public ui::AXPlatformNodeWinTest {
return text_range->owner_.Get();
}
- void NormalizeTextRange(AXPlatformNodeTextRangeProviderWin* text_range) {
- text_range->NormalizeTextRange();
+ void NormalizeTextRange(AXPlatformNodeTextRangeProviderWin* text_range,
+ AXNodePosition::AXPositionInstance& start,
+ AXNodePosition::AXPositionInstance& end) {
+ DCHECK_EQ(*GetStart(text_range), *start);
+ DCHECK_EQ(*GetEnd(text_range), *end);
+ text_range->NormalizeTextRange(start, end);
}
ComPtr<AXPlatformNodeTextRangeProviderWin> CloneTextRangeProviderWin(
@@ -768,6 +772,13 @@ class AXPlatformNodeTextRangeProviderTest : public ui::AXPlatformNodeWinTest {
update.tree_data.tree_id = ui::AXTreeID::CreateNewAXTreeID();
return update;
}
+
+ void ExpectPositionsEqual(const AXNodePosition::AXPositionInstance& a,
+ const AXNodePosition::AXPositionInstance& b) {
+ EXPECT_EQ(*a, *b);
+ EXPECT_EQ(a->anchor_id(), b->anchor_id());
+ EXPECT_EQ(a->text_offset(), b->text_offset());
+ }
};
class MockAXPlatformNodeTextRangeProviderWin
@@ -5292,9 +5303,20 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
update.nodes[1].SetName("aa");
ASSERT_TRUE(GetTree()->Unserialize(update));
- NormalizeTextRange(text_range_provider_win.Get());
- EXPECT_EQ(*start_after_move, *GetStart(text_range_provider_win.Get()));
- EXPECT_EQ(*end_after_move, *GetEnd(text_range_provider_win.Get()));
+ auto* text_range = text_range_provider_win.Get();
+
+ auto original_start = GetStart(text_range)->Clone();
+ auto original_end = GetEnd(text_range)->Clone();
+
+ auto normalized_start = GetStart(text_range)->Clone();
+ auto normalized_end = GetEnd(text_range)->Clone();
+ NormalizeTextRange(text_range, normalized_start, normalized_end);
+ // Verify that the original range was not changed by normalization.
+ ExpectPositionsEqual(original_start, GetStart(text_range));
+ ExpectPositionsEqual(original_end, GetEnd(text_range));
+
+ EXPECT_EQ(*start_after_move, *normalized_start);
+ EXPECT_EQ(*end_after_move, *normalized_end);
}
TEST_F(AXPlatformNodeTextRangeProviderTest,
@@ -5350,9 +5372,20 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
update.nodes[1].SetName("aa");
ASSERT_TRUE(GetTree()->Unserialize(update));
- NormalizeTextRange(text_range_provider_win.Get());
- EXPECT_EQ(*start_after_move, *GetStart(text_range_provider_win.Get()));
- EXPECT_EQ(*end_after_move, *GetEnd(text_range_provider_win.Get()));
+ auto* text_range = text_range_provider_win.Get();
+
+ auto original_start = GetStart(text_range)->Clone();
+ auto original_end = GetEnd(text_range)->Clone();
+
+ auto normalized_start = GetStart(text_range)->Clone();
+ auto normalized_end = GetEnd(text_range)->Clone();
+ NormalizeTextRange(text_range, normalized_start, normalized_end);
+ // Verify that the original range was not changed by normalization.
+ ExpectPositionsEqual(original_start, GetStart(text_range));
+ ExpectPositionsEqual(original_end, GetEnd(text_range));
+
+ EXPECT_EQ(*start_after_move, *normalized_start);
+ EXPECT_EQ(*end_after_move, *normalized_end);
}
TEST_F(AXPlatformNodeTextRangeProviderTest,
@@ -5397,18 +5430,21 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
EXPECT_TRUE(GetStart(ignored_range_win.Get())->IsIgnored());
EXPECT_TRUE(GetEnd(ignored_range_win.Get())->IsIgnored());
- ComPtr<AXPlatformNodeTextRangeProviderWin> normalized_range_win =
- CloneTextRangeProviderWin(ignored_range_win.Get());
- NormalizeTextRange(normalized_range_win.Get());
+ auto original_start = GetStart(ignored_range_win.Get())->Clone();
+ auto original_end = GetEnd(ignored_range_win.Get())->Clone();
- EXPECT_FALSE(GetStart(normalized_range_win.Get())->IsIgnored());
- EXPECT_FALSE(GetEnd(normalized_range_win.Get())->IsIgnored());
- EXPECT_LE(*GetStart(ignored_range_win.Get()),
- *GetStart(normalized_range_win.Get()));
- EXPECT_LE(*GetEnd(ignored_range_win.Get()),
- *GetEnd(normalized_range_win.Get()));
- EXPECT_LE(*GetStart(normalized_range_win.Get()),
- *GetEnd(normalized_range_win.Get()));
+ auto normalized_start = GetStart(ignored_range_win.Get())->Clone();
+ auto normalized_end = GetEnd(ignored_range_win.Get())->Clone();
+ NormalizeTextRange(ignored_range_win.Get(), normalized_start, normalized_end);
+ // Verify that the original range was not changed by normalization.
+ ExpectPositionsEqual(original_start, GetStart(ignored_range_win.Get()));
+ ExpectPositionsEqual(original_end, GetEnd(ignored_range_win.Get()));
+
+ EXPECT_FALSE(normalized_start->IsIgnored());
+ EXPECT_FALSE(normalized_end->IsIgnored());
+ EXPECT_LE(*GetStart(ignored_range_win.Get()), *normalized_start);
+ EXPECT_LE(*GetEnd(ignored_range_win.Get()), *normalized_end);
+ EXPECT_LE(*normalized_start, *normalized_end);
// Remove the last node, forcing |NormalizeTextRange| to normalize
// using the opposite AdjustmentBehavior.
@@ -5418,17 +5454,21 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
update.nodes[0].child_ids = {2, 3};
ASSERT_TRUE(GetTree()->Unserialize(update));
- normalized_range_win = CloneTextRangeProviderWin(ignored_range_win.Get());
- NormalizeTextRange(normalized_range_win.Get());
-
- EXPECT_FALSE(GetStart(normalized_range_win.Get())->IsIgnored());
- EXPECT_FALSE(GetEnd(normalized_range_win.Get())->IsIgnored());
- EXPECT_GE(*GetStart(ignored_range_win.Get()),
- *GetStart(normalized_range_win.Get()));
- EXPECT_GE(*GetEnd(ignored_range_win.Get()),
- *GetEnd(normalized_range_win.Get()));
- EXPECT_LE(*GetStart(normalized_range_win.Get()),
- *GetEnd(normalized_range_win.Get()));
+ original_start = GetStart(ignored_range_win.Get())->Clone();
+ original_end = GetEnd(ignored_range_win.Get())->Clone();
+
+ normalized_start = GetStart(ignored_range_win.Get())->Clone();
+ normalized_end = GetEnd(ignored_range_win.Get())->Clone();
+ NormalizeTextRange(ignored_range_win.Get(), normalized_start, normalized_end);
+ // Verify that the original range was not changed by normalization.
+ ExpectPositionsEqual(original_start, GetStart(ignored_range_win.Get()));
+ ExpectPositionsEqual(original_end, GetEnd(ignored_range_win.Get()));
+
+ EXPECT_FALSE(normalized_start->IsIgnored());
+ EXPECT_FALSE(normalized_end->IsIgnored());
+ EXPECT_GE(*GetStart(ignored_range_win.Get()), *normalized_start);
+ EXPECT_GE(*GetEnd(ignored_range_win.Get()), *normalized_end);
+ EXPECT_LE(*normalized_start, *normalized_end);
}
TEST_F(AXPlatformNodeTextRangeProviderTest,
@@ -5477,7 +5517,7 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
AXPlatformNodeWin* owner = static_cast<AXPlatformNodeWin*>(
AXPlatformNodeFromNode(GetNodeFromTree(tree_id, 1)));
- // Text range before NormalizeTextRange()
+ // Original range before NormalizeTextRange()
// |before<>||ignored1||ignored2||<a>fter|
// |-----------------------|
// start: TextPosition, anchor_id=2, text_offset=6, annotated_text=before<>
@@ -5490,22 +5530,34 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
/*end_anchor_id=*/5, /*end_offset=*/0,
/*end_affinity*/ ax::mojom::TextAffinity::kDownstream);
- // Text range after NormalizeTextRange()
+ auto original_start = GetStart(range_span_ignored_nodes.Get())->Clone();
+ auto original_end = GetEnd(range_span_ignored_nodes.Get())->Clone();
+
+ // Normalized range after NormalizeTextRange()
// |before||ignored1||ignored2||<a>fter|
// |-|
- NormalizeTextRange(range_span_ignored_nodes.Get());
- EXPECT_EQ(*GetStart(range_span_ignored_nodes.Get()),
- *GetEnd(range_span_ignored_nodes.Get()));
-
- EXPECT_EQ(true, GetStart(range_span_ignored_nodes.Get())->IsTextPosition());
- EXPECT_EQ(true, GetStart(range_span_ignored_nodes.Get())->AtStartOfAnchor());
- EXPECT_EQ(5, GetStart(range_span_ignored_nodes.Get())->anchor_id());
- EXPECT_EQ(0, GetStart(range_span_ignored_nodes.Get())->text_offset());
-
- EXPECT_EQ(true, GetEnd(range_span_ignored_nodes.Get())->IsTextPosition());
- EXPECT_EQ(true, GetEnd(range_span_ignored_nodes.Get())->AtStartOfAnchor());
- EXPECT_EQ(5, GetEnd(range_span_ignored_nodes.Get())->anchor_id());
- EXPECT_EQ(0, GetEnd(range_span_ignored_nodes.Get())->text_offset());
+ AXNodePosition::AXPositionInstance normalized_start =
+ GetStart(range_span_ignored_nodes.Get())->Clone();
+ AXNodePosition::AXPositionInstance normalized_end =
+ GetEnd(range_span_ignored_nodes.Get())->Clone();
+ NormalizeTextRange(range_span_ignored_nodes.Get(), normalized_start,
+ normalized_end);
+ // Verify that the original range was not changed by normalization.
+ ExpectPositionsEqual(original_start,
+ GetStart(range_span_ignored_nodes.Get()));
+ ExpectPositionsEqual(original_end, GetEnd(range_span_ignored_nodes.Get()));
+
+ EXPECT_EQ(*normalized_start, *normalized_end);
+
+ EXPECT_TRUE(normalized_start->IsTextPosition());
+ EXPECT_TRUE(normalized_start->AtStartOfAnchor());
+ EXPECT_EQ(5, normalized_start->anchor_id());
+ EXPECT_EQ(0, normalized_start->text_offset());
+
+ EXPECT_TRUE(normalized_end->IsTextPosition());
+ EXPECT_TRUE(normalized_end->AtStartOfAnchor());
+ EXPECT_EQ(5, normalized_end->anchor_id());
+ EXPECT_EQ(0, normalized_end->text_offset());
}
TEST_F(AXPlatformNodeTextRangeProviderTest,
@@ -5586,13 +5638,24 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
/*end_anchor_id=*/7, /*end_offset=*/0,
/*end_affinity*/ ax::mojom::TextAffinity::kDownstream);
- NormalizeTextRange(range.Get());
- EXPECT_EQ(*GetStart(range.Get()), *GetEnd(range.Get()));
+ auto original_start = GetStart(range.Get())->Clone();
+ auto original_end = GetEnd(range.Get())->Clone();
+
+ AXNodePosition::AXPositionInstance normalized_start =
+ GetStart(range.Get())->Clone();
+ AXNodePosition::AXPositionInstance normalized_end =
+ GetEnd(range.Get())->Clone();
+ NormalizeTextRange(range.Get(), normalized_start, normalized_end);
+ // Verify that the original range was not changed by normalization.
+ ExpectPositionsEqual(original_start, GetStart(range.Get()));
+ ExpectPositionsEqual(original_end, GetEnd(range.Get()));
+
+ EXPECT_EQ(*normalized_start, *normalized_start);
- EXPECT_EQ(true, GetStart(range.Get())->AtStartOfAnchor());
- EXPECT_EQ(true, GetEnd(range.Get())->AtStartOfAnchor());
- EXPECT_EQ(7, GetStart(range.Get())->anchor_id());
- EXPECT_EQ(7, GetEnd(range.Get())->anchor_id());
+ EXPECT_TRUE(normalized_start->AtStartOfAnchor());
+ EXPECT_TRUE(normalized_end->AtStartOfAnchor());
+ EXPECT_EQ(7, normalized_start->anchor_id());
+ EXPECT_EQ(7, normalized_end->anchor_id());
}
TEST_F(AXPlatformNodeTextRangeProviderTest, TestValidateStartAndEnd) {
@@ -5718,4 +5781,149 @@ TEST_F(AXPlatformNodeTextRangeProviderTest, TestValidateStartAndEnd) {
/*expected_text*/ L"ome tex",
/*expected_count*/ 1);
}
+
+TEST_F(AXPlatformNodeTextRangeProviderTest,
+ TestReplaceStartAndEndEndpointNode) {
+ // This test updates the tree structure to ensure that the text range is still
+ // valid after a text node gets replaced by another one. This case occurs
+ // every time an AT's focus moves to a node whose style is affected by focus,
+ // thus generating a tree update.
+ //
+ // ++1 kRootWebArea
+ // ++++2 kStaticText/++++3 kStaticText (replacement node)
+ // ++++4 kStaticText/++++5 kStaticText (replacement node)
+ AXNodeData root_1;
+ AXNodeData text_2;
+ AXNodeData text_3;
+ AXNodeData text_4;
+ AXNodeData text_5;
+
+ root_1.id = 1;
+ text_2.id = 2;
+ text_3.id = 3;
+ text_4.id = 4;
+ text_5.id = 5;
+
+ root_1.role = ax::mojom::Role::kRootWebArea;
+ root_1.child_ids = {text_2.id, text_4.id};
+
+ text_2.role = ax::mojom::Role::kStaticText;
+ text_2.SetName("some text");
+
+ // Replacement node of |text_2|.
+ text_3.role = ax::mojom::Role::kStaticText;
+ text_3.SetName("some text");
+
+ text_4.role = ax::mojom::Role::kStaticText;
+ text_4.SetName("more text");
+
+ // Replacement node of |text_4|.
+ text_5.role = ax::mojom::Role::kStaticText;
+ text_5.SetName("more text");
+
+ ui::AXTreeUpdate update;
+ ui::AXTreeID tree_id = ui::AXTreeID::CreateNewAXTreeID();
+ update.root_id = root_1.id;
+ update.tree_data.tree_id = tree_id;
+ update.has_tree_data = true;
+ update.nodes = {root_1, text_2, text_4};
+ Init(update);
+
+ // Create a position at MaxTextOffset.
+ // Making |owner| AXID:1 so that |TestAXNodeWrapper::BuildAllWrappers|
+ // will build the entire tree.
+ AXPlatformNodeWin* owner = static_cast<AXPlatformNodeWin*>(
+ AXPlatformNodeFromNode(GetNodeFromTree(tree_id, 1)));
+
+ // start: TextPosition, anchor_id=2, text_offset=0, annotated_text=<s>ome text
+ // end : TextPosition, anchor_id=4, text_offset=9, annotated_text=more text<>
+ ComPtr<AXPlatformNodeTextRangeProviderWin> range;
+ CreateTextRangeProviderWin(
+ range, owner, tree_id,
+ /*start_anchor_id*/ 2, /*start_offset*/ 0,
+ /*start_affinity*/ ax::mojom::TextAffinity::kDownstream,
+ /*end_anchor_id*/ 4, /*end_offset*/ 9,
+ /*end_affinity*/ ax::mojom::TextAffinity::kDownstream);
+
+ EXPECT_UIA_TEXTRANGE_EQ(range, /*expected_text*/ L"some textmore text");
+
+ // 1. Replace the node on which |start_| is.
+ {
+ // Replace node |text_2| with |text_3|.
+ root_1.child_ids = {text_3.id, text_4.id};
+ AXTreeUpdate test_update;
+ test_update.nodes = {root_1, text_3};
+ ASSERT_TRUE(GetTree()->Unserialize(test_update));
+
+ // Replacing that node shouldn't impact the range.
+ base::win::ScopedSafearray children;
+ range->GetChildren(children.Receive());
+ EXPECT_UIA_TEXTRANGE_EQ(range, /*expected_text*/ L"some textmore text");
+
+ // The |start_| endpoint should have moved to its parent.
+ EXPECT_EQ(1, GetStart(range.Get())->anchor_id());
+ EXPECT_EQ(0, GetStart(range.Get())->text_offset());
+
+ // The |end_| endpoint should not have moved.
+ EXPECT_EQ(4, GetEnd(range.Get())->anchor_id());
+ EXPECT_EQ(9, GetEnd(range.Get())->text_offset());
+ }
+
+ // 2. Replace the node on which |end_| is.
+ {
+ // Replace node |text_4| with |text_5|.
+ root_1.child_ids = {text_3.id, text_5.id};
+ AXTreeUpdate test_update;
+ test_update.nodes = {root_1, text_5};
+ ASSERT_TRUE(GetTree()->Unserialize(test_update));
+
+ // Replacing that node shouldn't impact the range.
+ base::win::ScopedSafearray children;
+ range->GetChildren(children.Receive());
+ EXPECT_UIA_TEXTRANGE_EQ(range, /*expected_text*/ L"some textmore text");
+
+ // The |start_| endpoint should still be on its parent.
+ EXPECT_EQ(1, GetStart(range.Get())->anchor_id());
+ EXPECT_EQ(0, GetStart(range.Get())->text_offset());
+
+ // The |end_| endpoint should have moved to its parent.
+ EXPECT_EQ(1, GetEnd(range.Get())->anchor_id());
+ EXPECT_EQ(18, GetEnd(range.Get())->text_offset());
+ }
+
+ // 3. Replace the node on which |end_| is.
+ {
+ // start: TextPosition, anchor_id=3, text_offset=0, annotated_text=<s>ome
+ // end : TextPosition, anchor_id=3, text_offset=4, annotated_text=some<>
+ ComPtr<AXPlatformNodeTextRangeProviderWin> range_2;
+ CreateTextRangeProviderWin(
+ range_2, owner, tree_id,
+ /*start_anchor_id*/ 3, /*start_offset*/ 0,
+ /*start_affinity*/ ax::mojom::TextAffinity::kDownstream,
+ /*end_anchor_id*/ 3, /*end_offset*/ 4,
+ /*end_affinity*/ ax::mojom::TextAffinity::kDownstream);
+
+ EXPECT_UIA_TEXTRANGE_EQ(range_2, /*expected_text*/ L"some");
+
+ // Replace node |text_3| with |text_2|.
+ root_1.child_ids = {text_2.id, text_5.id};
+ AXTreeUpdate test_update;
+ test_update.nodes = {root_1, text_2};
+ ASSERT_TRUE(GetTree()->Unserialize(test_update));
+
+ // Replacing that node shouldn't impact the range.
+ base::win::ScopedSafearray children;
+ range_2->GetChildren(children.Receive());
+ EXPECT_UIA_TEXTRANGE_EQ(range_2, /*expected_text*/ L"some");
+
+ // The |start_| endpoint should have moved to its parent.
+ EXPECT_EQ(1, GetStart(range_2.Get())->anchor_id());
+ EXPECT_EQ(0, GetStart(range_2.Get())->text_offset());
+
+ // The |end_| endpoint should have moved to its parent.
+ EXPECT_EQ(1, GetEnd(range_2.Get())->anchor_id());
+ EXPECT_EQ(4, GetEnd(range_2.Get())->text_offset());
+ }
+}
+
} // namespace ui
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win.cc b/chromium/ui/accessibility/platform/ax_platform_node_win.cc
index 6d348bf0cad..cee747eaa87 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win.cc
@@ -31,7 +31,6 @@
#include "base/win/variant_vector.h"
#include "skia/ext/skia_utils_win.h"
#include "third_party/iaccessible2/ia2_api_all.h"
-#include "third_party/skia/include/core/SkColor.h"
#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/accessibility_switches.h"
#include "ui/accessibility/ax_action_data.h"
@@ -5173,6 +5172,8 @@ int AXPlatformNodeWin::MSAARole() {
case ax::mojom::Role::kDocIndex:
case ax::mojom::Role::kDocIntroduction:
case ax::mojom::Role::kDocNotice:
+ case ax::mojom::Role::kDocPageFooter:
+ case ax::mojom::Role::kDocPageHeader:
case ax::mojom::Role::kDocPageList:
case ax::mojom::Role::kDocPart:
case ax::mojom::Role::kDocPreface:
@@ -5667,6 +5668,12 @@ int32_t AXPlatformNodeWin::ComputeIA2Role() {
case ax::mojom::Role::kDescriptionListDetail:
ia2_role = IA2_ROLE_PARAGRAPH;
break;
+ case ax::mojom::Role::kDocPageFooter:
+ ia2_role = IA2_ROLE_FOOTER;
+ break;
+ case ax::mojom::Role::kDocPageHeader:
+ ia2_role = IA2_ROLE_HEADER;
+ break;
case ax::mojom::Role::kDocAcknowledgments:
case ax::mojom::Role::kDocAfterword:
case ax::mojom::Role::kDocAppendix:
@@ -5993,6 +6000,8 @@ base::string16 AXPlatformNodeWin::UIAAriaRole() {
case ax::mojom::Role::kDocIndex:
case ax::mojom::Role::kDocIntroduction:
case ax::mojom::Role::kDocNotice:
+ case ax::mojom::Role::kDocPageFooter:
+ case ax::mojom::Role::kDocPageHeader:
case ax::mojom::Role::kDocPageList:
case ax::mojom::Role::kDocPart:
case ax::mojom::Role::kDocPreface:
@@ -6498,7 +6507,7 @@ base::string16 AXPlatformNodeWin::ComputeUIAProperties() {
StringAttributeToUIAAriaProperty(
properties, ax::mojom::StringAttribute::kValue, "valuetext");
- base::string16 value_now = GetRangeValueText();
+ base::string16 value_now = GetValueForControl();
SanitizeStringAttributeForUIAAriaProperty(value_now, &value_now);
if (!value_now.empty())
properties.push_back(L"valuenow=" + value_now);
@@ -6666,6 +6675,8 @@ LONG AXPlatformNodeWin::ComputeUIAControlType() { // NOLINT(runtime/int)
case ax::mojom::Role::kDocIndex:
case ax::mojom::Role::kDocIntroduction:
case ax::mojom::Role::kDocNotice:
+ case ax::mojom::Role::kDocPageFooter:
+ case ax::mojom::Role::kDocPageHeader:
case ax::mojom::Role::kDocPageList:
case ax::mojom::Role::kDocPart:
case ax::mojom::Role::kDocPreface:
@@ -7180,8 +7191,7 @@ bool AXPlatformNodeWin::IsUIAControl() const {
} // end of web-content only case.
const AXNodeData& data = GetData();
- return !((IsReadOnlySupported(data.role) && data.IsReadOnlyOrDisabled()) ||
- data.HasState(ax::mojom::State::kInvisible) ||
+ return !(data.HasState(ax::mojom::State::kInvisible) ||
(data.IsIgnored() && !data.HasState(ax::mojom::State::kFocusable)));
}
@@ -7275,20 +7285,6 @@ bool AXPlatformNodeWin::ShouldHideChildrenForUIA() const {
}
}
-base::string16 AXPlatformNodeWin::GetValue() const {
- base::string16 value = AXPlatformNodeBase::GetValue();
-
- // If this doesn't have a value and is linked then set its value to the URL
- // attribute. This allows screen readers to read an empty link's
- // destination.
- // TODO(dougt): Look into ensuring that on click handlers correctly provide
- // a value here.
- if (value.empty() && (MSAAState() & STATE_SYSTEM_LINKED))
- value = GetString16Attribute(ax::mojom::StringAttribute::kUrl);
-
- return value;
-}
-
bool AXPlatformNodeWin::IsPlatformCheckable() const {
if (GetData().role == ax::mojom::Role::kToggleButton)
return false;
@@ -7598,78 +7594,23 @@ base::Optional<PROPERTYID> AXPlatformNodeWin::MojoEventToUIAProperty(
// static
BSTR AXPlatformNodeWin::GetValueAttributeAsBstr(AXPlatformNodeWin* target) {
- // GetValueAttributeAsBstr() has two sets of special cases depending on the
- // node's role.
- // The first set apply without regard for the nodes |value| attribute. That is
- // the nodes value attribute isn't consider for the first set of special
- // cases. For example, if the node role is ax::mojom::Role::kColorWell, we do
- // not care at all about the node's ax::mojom::StringAttribute::kValue
- // attribute. The second set of special cases only apply if the value
- // attribute for the node is empty. That is, if
- // ax::mojom::StringAttribute::kValue is empty, we do something special.
- base::string16 result;
-
- //
- // Color Well special case (Use ax::mojom::IntAttribute::kColorValue)
- //
- if (target->GetData().role == ax::mojom::Role::kColorWell) {
- // static cast because SkColor is a 4-byte unsigned int
- unsigned int color = static_cast<unsigned int>(
- target->GetIntAttribute(ax::mojom::IntAttribute::kColorValue));
-
- unsigned int red = SkColorGetR(color);
- unsigned int green = SkColorGetG(color);
- unsigned int blue = SkColorGetB(color);
- base::string16 value_text;
- value_text = base::NumberToString16(red * 100 / 255) + L"% red " +
- base::NumberToString16(green * 100 / 255) + L"% green " +
- base::NumberToString16(blue * 100 / 255) + L"% blue";
- BSTR value = SysAllocString(value_text.c_str());
- DCHECK(value);
- return value;
- }
-
- //
- // Document special case (Use the document's URL)
- //
- if (target->GetData().role == ax::mojom::Role::kRootWebArea ||
- target->GetData().role == ax::mojom::Role::kWebArea) {
- result = base::UTF8ToUTF16(target->GetDelegate()->GetTreeData().url);
- BSTR value = SysAllocString(result.c_str());
+ if (target->IsDocument()) {
+ base::string16 url =
+ base::UTF8ToUTF16(target->GetDelegate()->GetTreeData().url);
+ BSTR value = SysAllocString(url.c_str());
DCHECK(value);
return value;
}
- //
- // Links (Use ax::mojom::StringAttribute::kUrl)
- //
- if (target->GetData().role == ax::mojom::Role::kLink) {
- result = target->GetString16Attribute(ax::mojom::StringAttribute::kUrl);
- BSTR value = SysAllocString(result.c_str());
+ if (IsLink(target->GetData().role)) {
+ base::string16 url =
+ target->GetString16Attribute(ax::mojom::StringAttribute::kUrl);
+ BSTR value = SysAllocString(url.c_str());
DCHECK(value);
return value;
}
- // For range controls, e.g. sliders and spin buttons, |ax_attr_value| holds
- // the aria-valuetext if present but not the inner text. The actual value,
- // provided either via aria-valuenow or the actual control's value is held in
- // |ax::mojom::FloatAttribute::kValueForRange|.
- result = target->GetString16Attribute(ax::mojom::StringAttribute::kValue);
- if (result.empty() && target->GetData().IsRangeValueSupported()) {
- float fval;
- if (target->GetFloatAttribute(ax::mojom::FloatAttribute::kValueForRange,
- &fval)) {
- result = base::NumberToString16(fval);
- BSTR value = SysAllocString(result.c_str());
- DCHECK(value);
- return value;
- }
- }
-
- if (result.empty() && target->IsRichTextField())
- result = target->GetInnerText();
-
- BSTR value = SysAllocString(result.c_str());
+ BSTR value = SysAllocString(target->GetValueForControl().c_str());
DCHECK(value);
return value;
}
diff --git a/chromium/ui/accessibility/platform/ax_platform_node_win.h b/chromium/ui/accessibility/platform/ax_platform_node_win.h
index 720dc43d209..64b1819c9d8 100644
--- a/chromium/ui/accessibility/platform/ax_platform_node_win.h
+++ b/chromium/ui/accessibility/platform/ax_platform_node_win.h
@@ -432,7 +432,6 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
// AXPlatformNodeBase overrides.
void Destroy() override;
- base::string16 GetValue() const override;
bool IsPlatformCheckable() const override;
//
diff --git a/chromium/ui/accessibility/platform/inspect/inspect.cc b/chromium/ui/accessibility/platform/inspect/inspect.cc
new file mode 100644
index 00000000000..85b9627c1e8
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/inspect.cc
@@ -0,0 +1,23 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/accessibility/platform/inspect/inspect.h"
+
+namespace ui {
+
+AXPropertyFilter::AXPropertyFilter(const AXPropertyFilter&) = default;
+
+AXPropertyFilter::AXPropertyFilter(const std::string& str, Type type)
+ : match_str(str), type(type) {
+ size_t index = str.find(';');
+ if (index != std::string::npos) {
+ filter_str = str.substr(0, index);
+ if (index + 1 < str.length()) {
+ match_str = str.substr(index + 1, std::string::npos);
+ }
+ }
+ property_str = match_str.substr(0, match_str.find('='));
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/platform/inspect/inspect.h b/chromium/ui/accessibility/platform/inspect/inspect.h
new file mode 100644
index 00000000000..dcbb36ee4d0
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/inspect.h
@@ -0,0 +1,82 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_INSPECT_H_
+#define UI_ACCESSIBILITY_PLATFORM_INSPECT_INSPECT_H_
+
+#include <string>
+
+#include "ui/accessibility/ax_export.h"
+
+namespace ui {
+
+// Tree selector used to identify an accessible tree to traverse, it can be
+// built by a pre-defined tree type like Chromium to indicate that Chromium
+// browser tree should be traversed and/or by a string pattern which matches
+// an accessible name of a root of some accessible subtree.
+struct AX_EXPORT AXTreeSelector {
+ enum Type {
+ None = 0,
+ ActiveTab = 1 << 0,
+ Chrome = 1 << 1,
+ Chromium = 1 << 2,
+ Firefox = 1 << 3,
+ Safari = 1 << 4,
+ };
+ int types{None};
+ std::string pattern;
+
+ AXTreeSelector() = default;
+ AXTreeSelector(int types, const std::string& pattern)
+ : types(types), pattern(pattern) {}
+
+ bool empty() const { return types == None && pattern.empty(); }
+};
+
+// A single property filter specification. Represents a parsed string of the
+// filter_str;match_str format, where `filter_str` has
+// :line_num_0,...:line_num_N format, `match_str` has format of
+// property_str=value_str, value_str is optional. For example,
+// AXSubrole=* or :1,:3;AXDOMClassList.
+//
+// Longer version: `filter_str` is a comma separated list of the line
+// indexes from the output accessible tree, and serves to narrow down the
+// property calls to the accessible object placed on those line indexes only;
+// `match_str` is used to match properties by property name and value.
+// For example, :1,:3;AXDOMClassList=*
+// will query a AXDOMClassList attribute on accessible objects placed at 1st
+// and 3rd lines in the output accessible tree.
+// Also see
+// DumpAccessibilityTestBase::ParseHtmlForExtraDirectives() for more
+// information.
+struct AX_EXPORT AXPropertyFilter {
+ enum Type { ALLOW, ALLOW_EMPTY, DENY };
+
+ std::string match_str;
+ std::string property_str;
+ std::string filter_str;
+ Type type;
+
+ AXPropertyFilter(const std::string& str, Type type);
+ AXPropertyFilter(const AXPropertyFilter&);
+};
+
+// A single node filter specification which will exclude any node where the
+// value of the named property matches the given pattern.
+//
+// This can be used to exclude nodes based on properties like role, for
+// example to exclude all inlineTextBox nodes under blink we would use a
+// NodeFilter of the form:
+// {property='internalRole', pattern='inlineTextBox'};
+struct AX_EXPORT AXNodeFilter {
+ std::string property;
+ std::string pattern;
+
+ AXNodeFilter(const std::string& property, const std::string& pattern)
+ : property(property), pattern(pattern) {}
+};
+
+} // namespace ui
+
+#endif // UI_ACCESSIBILITY_PLATFORM_INSPECT_INSPECT_H_
diff --git a/chromium/ui/accessibility/platform/inspect/property_node.cc b/chromium/ui/accessibility/platform/inspect/property_node.cc
new file mode 100644
index 00000000000..4110de2c199
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/property_node.cc
@@ -0,0 +1,261 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/accessibility/platform/inspect/property_node.h"
+
+#include "base/optional.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "ui/accessibility/platform/inspect/inspect.h"
+
+namespace ui {
+
+// static
+AXPropertyNode AXPropertyNode::From(const AXPropertyFilter& filter) {
+ // Property invocation: property_str expected format is
+ // prop_name or prop_name(arg1, ... argN).
+ AXPropertyNode root;
+ const std::string& property_str = filter.property_str;
+ Parse(&root, property_str.begin(), property_str.end());
+
+ AXPropertyNode* node = &root.parameters[0];
+
+ // Expel a trailing wildcard if any.
+ node->original_property =
+ property_str.substr(0, property_str.find_last_of('*'));
+
+ // Line indexes filter: filter_str expected format is
+ // :line_num_1, ... :line_num_N, a comma separated list of line indexes
+ // the property should be queried for. For example, ":1,:5,:7" indicates that
+ // the property should called for objects placed on 1, 5 and 7 lines only.
+ const std::string& filter_str = filter.filter_str;
+ if (!filter_str.empty()) {
+ node->line_indexes =
+ base::SplitString(filter_str, std::string(1, ','),
+ base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ }
+
+ return std::move(*node);
+}
+
+AXPropertyNode::AXPropertyNode() = default;
+AXPropertyNode::AXPropertyNode(AXPropertyNode&& o)
+ : key(std::move(o.key)),
+ target(std::move(o.target)),
+ name_or_value(std::move(o.name_or_value)),
+ parameters(std::move(o.parameters)),
+ original_property(std::move(o.original_property)),
+ line_indexes(std::move(o.line_indexes)) {}
+AXPropertyNode::~AXPropertyNode() = default;
+
+AXPropertyNode& AXPropertyNode::operator=(AXPropertyNode&& o) {
+ key = std::move(o.key);
+ target = std::move(o.target);
+ name_or_value = std::move(o.name_or_value);
+ parameters = std::move(o.parameters);
+ original_property = std::move(o.original_property);
+ line_indexes = std::move(o.line_indexes);
+ return *this;
+}
+
+AXPropertyNode::operator bool() const {
+ return !name_or_value.empty();
+}
+
+bool AXPropertyNode::IsMatching(const std::string& pattern) const {
+ // Looking for exact property match. Expel a trailing whildcard from
+ // the property filter to handle filters like AXRole*.
+ return name_or_value.compare(0, name_or_value.find_last_of('*'), pattern) ==
+ 0;
+}
+
+bool AXPropertyNode::IsArray() const {
+ return name_or_value == "[]";
+}
+
+bool AXPropertyNode::IsDict() const {
+ return name_or_value == "{}";
+}
+
+base::Optional<int> AXPropertyNode::AsInt() const {
+ int value = 0;
+ if (!base::StringToInt(name_or_value, &value)) {
+ return base::nullopt;
+ }
+ return value;
+}
+
+const AXPropertyNode* AXPropertyNode::FindKey(const char* refkey) const {
+ for (const auto& param : parameters) {
+ if (param.key == refkey) {
+ return &param;
+ }
+ }
+ return nullptr;
+}
+
+base::Optional<std::string> AXPropertyNode::FindStringKey(
+ const char* refkey) const {
+ for (const auto& param : parameters) {
+ if (param.key == refkey) {
+ return param.name_or_value;
+ }
+ }
+ return base::nullopt;
+}
+
+base::Optional<int> AXPropertyNode::FindIntKey(const char* refkey) const {
+ for (const auto& param : parameters) {
+ if (param.key == refkey) {
+ return param.AsInt();
+ }
+ }
+ return base::nullopt;
+}
+
+std::string AXPropertyNode::ToString() const {
+ std::string out;
+ for (const auto& index : line_indexes) {
+ if (!out.empty()) {
+ out += ',';
+ }
+ out += index;
+ }
+ if (!out.empty()) {
+ out += ';';
+ }
+
+ if (!key.empty()) {
+ out += key + ": ";
+ }
+
+ if (!target.empty()) {
+ out += target + '.';
+ }
+ out += name_or_value;
+ if (parameters.size()) {
+ out += '(';
+ for (size_t i = 0; i < parameters.size(); i++) {
+ if (i != 0) {
+ out += ", ";
+ }
+ out += parameters[i].ToString();
+ }
+ out += ')';
+ }
+ return out;
+}
+
+// private
+AXPropertyNode::AXPropertyNode(AXPropertyNode::iterator key_begin,
+ AXPropertyNode::iterator key_end,
+ const std::string& name_or_value)
+ : key(key_begin, key_end) {
+ Set(name_or_value.begin(), name_or_value.end());
+}
+AXPropertyNode::AXPropertyNode(AXPropertyNode::iterator begin,
+ AXPropertyNode::iterator end) {
+ Set(begin, end);
+}
+AXPropertyNode::AXPropertyNode(AXPropertyNode::iterator key_begin,
+ AXPropertyNode::iterator key_end,
+ AXPropertyNode::iterator value_begin,
+ AXPropertyNode::iterator value_end)
+ : key(key_begin, key_end), name_or_value(value_begin, value_end) {
+ Set(value_begin, value_end);
+}
+
+void AXPropertyNode::Set(AXPropertyNode::iterator begin,
+ AXPropertyNode::iterator end) {
+ AXPropertyNode::iterator dot_operator = std::find(begin, end, '.');
+ if (dot_operator != end) {
+ target = std::string(begin, dot_operator);
+ name_or_value = std::string(dot_operator + 1, end);
+ } else {
+ name_or_value = std::string(begin, end);
+ }
+}
+
+// private static
+AXPropertyNode::iterator AXPropertyNode::Parse(AXPropertyNode* node,
+ AXPropertyNode::iterator begin,
+ AXPropertyNode::iterator end) {
+ auto iter = begin;
+ auto key_begin = end, key_end = end;
+ while (iter != end) {
+ // Subnode begins: create a new node, record its name and parse its
+ // arguments.
+ if (*iter == '(') {
+ node->parameters.push_back(
+ AXPropertyNode(key_begin, key_end, begin, iter));
+ key_begin = key_end = end;
+ begin = iter = Parse(&node->parameters.back(), ++iter, end);
+ continue;
+ }
+
+ // Subnode begins: a special case for arrays, which have [arg1, ..., argN]
+ // form.
+ if (*iter == '[') {
+ node->parameters.push_back(AXPropertyNode(key_begin, key_end, "[]"));
+ key_begin = key_end = end;
+ begin = iter = Parse(&node->parameters.back(), ++iter, end);
+ continue;
+ }
+
+ // Subnode begins: a special case for dictionaries of {key1: value1, ...,
+ // key2: value2} form.
+ if (*iter == '{') {
+ node->parameters.push_back(AXPropertyNode(key_begin, key_end, "{}"));
+ key_begin = key_end = end;
+ begin = iter = Parse(&node->parameters.back(), ++iter, end);
+ continue;
+ }
+
+ // Subnode ends.
+ if (*iter == ')' || *iter == ']' || *iter == '}') {
+ if (begin != iter) {
+ node->parameters.push_back(
+ AXPropertyNode(key_begin, key_end, begin, iter));
+ key_begin = key_end = end;
+ }
+ return ++iter;
+ }
+
+ // Dictionary key
+ auto maybe_key_end = end;
+ if (*iter == ':') {
+ maybe_key_end = iter++;
+ }
+
+ // Skip spaces, adjust new node start.
+ if (*iter == ' ') {
+ if (maybe_key_end != end) {
+ key_begin = begin;
+ key_end = maybe_key_end;
+ }
+ begin = ++iter;
+ continue;
+ }
+
+ // Subsequent scalar param case.
+ if (*iter == ',' && begin != iter) {
+ node->parameters.push_back(
+ AXPropertyNode(key_begin, key_end, begin, iter));
+ iter++;
+ key_begin = key_end = end;
+ begin = iter;
+ continue;
+ }
+
+ iter++;
+ }
+
+ // Single scalar param case.
+ if (begin != iter) {
+ node->parameters.push_back(AXPropertyNode(begin, iter));
+ }
+ return iter;
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/platform/inspect/property_node.h b/chromium/ui/accessibility/platform/inspect/property_node.h
new file mode 100644
index 00000000000..2da2819b67a
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/property_node.h
@@ -0,0 +1,98 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_PROPERTY_NODE_H_
+#define UI_ACCESSIBILITY_PLATFORM_INSPECT_PROPERTY_NODE_H_
+
+#include <string>
+#include <vector>
+
+#include "ui/accessibility/ax_export.h"
+
+namespace base {
+template <typename T>
+class Optional;
+}
+
+namespace ui {
+
+struct AXPropertyFilter;
+
+// Property node is a tree-like structure, representing a property or collection
+// of properties and its invocation parameters. A collection of properties is
+// specified by putting a wildcard into a property name, for exampe, AXRole*
+// will match both AXRole and AXRoleDescription properties. Parameters of a
+// property are given in parentheses like a conventional function call, for
+// example, AXCellForColumnAndRow([0, 0]) will call AXCellForColumnAndRow
+// parameterized property for column/row 0 indexes.
+class AX_EXPORT AXPropertyNode final {
+ public:
+ // Parses a property node from a property filter.
+ static AXPropertyNode From(const AXPropertyFilter& filter);
+
+ AXPropertyNode();
+ AXPropertyNode(AXPropertyNode&&);
+ ~AXPropertyNode();
+
+ AXPropertyNode& operator=(AXPropertyNode&& other);
+ explicit operator bool() const;
+
+ // Key name in case of { key: value } dictionary.
+ std::string key;
+
+ // An object the property should be called for, designated by a line number
+ // in accessible tree the object is located at. For example, :1 indicates
+ // that the property should be called for an object located at first line.
+ std::string target;
+
+ // Value or a property name, for example 3 or AXLineForIndex
+ std::string name_or_value;
+
+ // Parameters if it's a property, for example, it is a vector of a single
+ // value 3 in case of AXLineForIndex(3)
+ std::vector<AXPropertyNode> parameters;
+
+ // Used to store the origianl unparsed property including invocation
+ // parameters if any.
+ std::string original_property;
+
+ // The list of line indexes of accessible objects the property is allowed to
+ // be called for, used if no property target is provided.
+ std::vector<std::string> line_indexes;
+
+ bool IsMatching(const std::string& pattern) const;
+
+ // Argument conversion methods.
+ bool IsArray() const;
+ bool IsDict() const;
+ base::Optional<int> AsInt() const;
+ const AXPropertyNode* FindKey(const char* refkey) const;
+ base::Optional<std::string> FindStringKey(const char* refkey) const;
+ base::Optional<int> FindIntKey(const char* key) const;
+
+ std::string ToString() const;
+
+ private:
+ using iterator = std::string::const_iterator;
+
+ explicit AXPropertyNode(iterator key_begin,
+ iterator key_end,
+ const std::string&);
+ AXPropertyNode(iterator begin, iterator end);
+ AXPropertyNode(iterator key_begin,
+ iterator key_end,
+ iterator value_begin,
+ iterator value_end);
+
+ // Helper to set context and name.
+ void Set(iterator begin, iterator end);
+
+ // Builds a property node struct for a string of NAME(ARG1, ..., ARGN) format,
+ // where each ARG is a scalar value or a string of the same format.
+ static iterator Parse(AXPropertyNode* node, iterator begin, iterator end);
+};
+
+} // namespace ui
+
+#endif // UI_ACCESSIBILITY_PLATFORM_INSPECT_PROPERTY_NODE_H_
diff --git a/chromium/ui/accessibility/platform/inspect/property_node_unittest.cc b/chromium/ui/accessibility/platform/inspect/property_node_unittest.cc
new file mode 100644
index 00000000000..1b676b97a76
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/property_node_unittest.cc
@@ -0,0 +1,145 @@
+// Copyright (c) 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/accessibility/platform/inspect/property_node.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/platform/inspect/inspect.h"
+
+using ui::AXPropertyFilter;
+using ui::AXPropertyNode;
+
+namespace ui {
+
+class AXPropertyNodeTest : public testing::Test {
+ public:
+ AXPropertyNodeTest() = default;
+ ~AXPropertyNodeTest() override = default;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(AXPropertyNodeTest);
+};
+
+AXPropertyNode Parse(const char* input) {
+ AXPropertyFilter filter(input, AXPropertyFilter::ALLOW);
+ return AXPropertyNode::From(filter);
+}
+
+AXPropertyNode GetArgumentNode(const char* input) {
+ auto got = Parse(input);
+ if (got.parameters.size() == 0) {
+ return AXPropertyNode();
+ }
+ return std::move(got.parameters[0]);
+}
+
+void ParseAndCheck(const char* input, const char* expected) {
+ auto got = Parse(input).ToString();
+ EXPECT_EQ(got, expected);
+}
+
+struct ProperyNodeCheck {
+ std::string target;
+ std::string name_or_value;
+ std::vector<ProperyNodeCheck> parameters;
+};
+
+void Check(const AXPropertyNode& got, const ProperyNodeCheck& expected) {
+ EXPECT_EQ(got.target, expected.target);
+ EXPECT_EQ(got.name_or_value, expected.name_or_value);
+ EXPECT_EQ(got.parameters.size(), expected.parameters.size());
+ for (auto i = 0U;
+ i < std::min(expected.parameters.size(), got.parameters.size()); i++) {
+ Check(got.parameters[i], expected.parameters[i]);
+ }
+}
+
+void ParseAndCheck(const char* input, const ProperyNodeCheck& expected) {
+ Check(Parse(input), expected);
+}
+
+TEST_F(AXPropertyNodeTest, ParseProperty) {
+ // Properties and methods.
+ ParseAndCheck("Role", "Role");
+ ParseAndCheck("ChildAt(3)", "ChildAt(3)");
+ ParseAndCheck("Cell(3, 4)", "Cell(3, 4)");
+ ParseAndCheck("Volume(3, 4, 5)", "Volume(3, 4, 5)");
+ ParseAndCheck("TableFor(CellBy(id))", "TableFor(CellBy(id))");
+ ParseAndCheck("A(B(1), 2)", "A(B(1), 2)");
+ ParseAndCheck("A(B(1), 2, C(3, 4))", "A(B(1), 2, C(3, 4))");
+ ParseAndCheck("[3, 4]", "[](3, 4)");
+ ParseAndCheck("Cell([3, 4])", "Cell([](3, 4))");
+
+ // Arguments
+ ParseAndCheck("Text({val: 1})", "Text({}(val: 1))");
+ ParseAndCheck("Text({lat: 1, len: 1})", "Text({}(lat: 1, len: 1))");
+ ParseAndCheck("Text({dict: {val: 1}})", "Text({}(dict: {}(val: 1)))");
+ ParseAndCheck("Text({dict: {val: 1}, 3})", "Text({}(dict: {}(val: 1), 3))");
+ ParseAndCheck("Text({dict: [1, 2]})", "Text({}(dict: [](1, 2)))");
+ ParseAndCheck("Text({dict: ValueFor(1)})", "Text({}(dict: ValueFor(1)))");
+
+ // Nested arguments
+ ParseAndCheck("AXIndexForTextMarker(AXTextMarkerForIndex(0))",
+ "AXIndexForTextMarker(AXTextMarkerForIndex(0))");
+
+ // Line indexes filter.
+ ParseAndCheck(":3,:5;AXDOMClassList", ":3,:5;AXDOMClassList");
+
+ // Context object.
+ ParseAndCheck(":1.AXDOMClassList", ":1.AXDOMClassList");
+ ParseAndCheck(":1.AXDOMClassList", {":1", "AXDOMClassList"});
+
+ ParseAndCheck(":1.AXIndexForTextMarker(:1.AXTextMarkerForIndex(0))",
+ ":1.AXIndexForTextMarker(:1.AXTextMarkerForIndex(0))");
+ ParseAndCheck(":1.AXIndexForTextMarker(:1.AXTextMarkerForIndex(0))",
+ {":1",
+ "AXIndexForTextMarker",
+ {{":1", "AXTextMarkerForIndex", {{"", "0"}}}}});
+
+ // Wrong format.
+ ParseAndCheck("Role(3", "Role(3)");
+ ParseAndCheck("TableFor(CellBy(id", "TableFor(CellBy(id))");
+ ParseAndCheck("[3, 4", "[](3, 4)");
+
+ // Arguments conversion
+ EXPECT_EQ(GetArgumentNode("ChildAt([3])").IsArray(), true);
+ EXPECT_EQ(GetArgumentNode("Text({loc: 3, len: 2})").IsDict(), true);
+ EXPECT_EQ(GetArgumentNode("ChildAt(3)").IsDict(), false);
+ EXPECT_EQ(GetArgumentNode("ChildAt(3)").IsArray(), false);
+ EXPECT_EQ(GetArgumentNode("ChildAt(3)").AsInt(), 3);
+
+ // Dict: FindStringKey
+ EXPECT_EQ(
+ GetArgumentNode("Text({start: :1, dir: forward})").FindStringKey("start"),
+ ":1");
+ EXPECT_EQ(
+ GetArgumentNode("Text({start: :1, dir: forward})").FindStringKey("dir"),
+ "forward");
+ EXPECT_EQ(GetArgumentNode("Text({start: :1, dir: forward})")
+ .FindStringKey("notexists"),
+ base::nullopt);
+
+ // Dict: FindIntKey
+ EXPECT_EQ(GetArgumentNode("Text({loc: 3, len: 2})").FindIntKey("loc"), 3);
+ EXPECT_EQ(GetArgumentNode("Text({loc: 3, len: 2})").FindIntKey("len"), 2);
+ EXPECT_EQ(GetArgumentNode("Text({loc: 3, len: 2})").FindIntKey("notexists"),
+ base::nullopt);
+
+ // Dict: FindKey
+ EXPECT_EQ(GetArgumentNode("Text({anchor: {:1, 0, up}})")
+ .FindKey("anchor")
+ ->ToString(),
+ "anchor: {}(:1, 0, up)");
+
+ EXPECT_EQ(GetArgumentNode("Text({anchor: {:1, 0, up}})").FindKey("focus"),
+ nullptr);
+
+ EXPECT_EQ(GetArgumentNode("AXStringForTextMarkerRange({anchor: {:2, 1, "
+ "down}, focus: {:2, 2, down}})")
+ .FindKey("anchor")
+ ->ToString(),
+ "anchor: {}(:2, 1, down)");
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/platform/inspect/tree_formatter.cc b/chromium/ui/accessibility/platform/inspect/tree_formatter.cc
new file mode 100644
index 00000000000..e2a1e222a15
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/tree_formatter.cc
@@ -0,0 +1,66 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/accessibility/platform/inspect/tree_formatter.h"
+
+#include <ostream>
+
+#include "base/check.h"
+#include "base/strings/pattern.h"
+#include "base/values.h"
+
+namespace ui {
+
+// AXTreeFormatter
+
+// static
+bool AXTreeFormatter::MatchesPropertyFilters(
+ const std::vector<AXPropertyFilter>& property_filters,
+ const std::string& text,
+ bool default_result) {
+ bool allow = default_result;
+ for (const auto& filter : property_filters) {
+ // Either
+ // 1) the line matches a filter pattern, for example, AXSubrole=* filter
+ // will match AXSubrole=AXTerm line or
+ // 2) a property on the line is exactly equal to the filter pattern, for
+ // example, AXSubrole filter will match AXSubrole=AXTerm line.
+ if (base::MatchPattern(text, filter.match_str) ||
+ (filter.match_str.length() > 0 &&
+ filter.match_str.find('=') == std::string::npos &&
+ filter.match_str[filter.match_str.length() - 1] != '*' &&
+ base::MatchPattern(text, filter.match_str + "=*"))) {
+ switch (filter.type) {
+ case AXPropertyFilter::ALLOW_EMPTY:
+ allow = true;
+ break;
+ case AXPropertyFilter::ALLOW:
+ allow = (!base::MatchPattern(text, "*=''"));
+ break;
+ case AXPropertyFilter::DENY:
+ allow = false;
+ break;
+ }
+ }
+ }
+ return allow;
+}
+
+// static
+bool AXTreeFormatter::MatchesNodeFilters(
+ const std::vector<AXNodeFilter>& node_filters,
+ const base::DictionaryValue& dict) {
+ for (const auto& filter : node_filters) {
+ std::string value;
+ if (!dict.GetString(filter.property, &value)) {
+ continue;
+ }
+ if (base::MatchPattern(value, filter.pattern)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+} // namespace ui
diff --git a/chromium/ui/accessibility/platform/inspect/tree_formatter.h b/chromium/ui/accessibility/platform/inspect/tree_formatter.h
new file mode 100644
index 00000000000..4a70a4d5439
--- /dev/null
+++ b/chromium/ui/accessibility/platform/inspect/tree_formatter.h
@@ -0,0 +1,87 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
+#define UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
+
+#include "ui/accessibility/platform/inspect/inspect.h"
+
+#include "ui/gfx/native_widget_types.h"
+
+namespace base {
+class Value;
+class DictionaryValue;
+}
+
+namespace ui {
+
+class AXPlatformNodeDelegate;
+
+// A utility class for formatting platform-specific accessibility information,
+// for use in testing, debugging, and developer tools.
+// This is extended by a subclass for each platform where accessibility is
+// implemented.
+class AX_EXPORT AXTreeFormatter {
+ public:
+ using AXTreeSelector = ui::AXTreeSelector;
+ using AXPropertyFilter = ui::AXPropertyFilter;
+ using AXNodeFilter = ui::AXNodeFilter;
+
+ virtual ~AXTreeFormatter() = default;
+
+ // Appends default filters of the formatter.
+ virtual void AddDefaultFilters(
+ std::vector<AXPropertyFilter>* property_filters) = 0;
+
+ // Returns true if the given text matches |allow| property filters, or false
+ // if matches |deny| filter. Returns default value if doesn't match any
+ // property filters.
+ static bool MatchesPropertyFilters(
+ const std::vector<AXPropertyFilter>& property_filters,
+ const std::string& text,
+ bool default_result);
+
+ // Check if the given dictionary matches any of the supplied AXNodeFilter(s).
+ static bool MatchesNodeFilters(const std::vector<AXNodeFilter>& node_filters,
+ const base::DictionaryValue& dict);
+
+ // Build an accessibility tree for any window.
+ virtual base::Value BuildTreeForWindow(
+ gfx::AcceleratedWidget widget) const = 0;
+
+ // Build an accessibility tree for an application with a name matching the
+ // given pattern.
+ virtual base::Value BuildTreeForSelector(const AXTreeSelector&) const = 0;
+
+ // Returns a filtered accessibility tree using the current property and node
+ // filters.
+ virtual std::unique_ptr<base::DictionaryValue> FilterAccessibilityTree(
+ const base::DictionaryValue& dict) = 0;
+
+ // Dumps a BrowserAccessibility tree into a string.
+ virtual void FormatAccessibilityTree(const base::DictionaryValue& tree_node,
+ std::string* contents) = 0;
+
+ // Test version of FormatAccessibilityTree().
+ // |root| must be non-null and must be in web content.
+ virtual void FormatAccessibilityTreeForTesting(AXPlatformNodeDelegate* root,
+ std::string* contents) = 0;
+
+ // Set regular expression filters that apply to each property of every node
+ // before it's output.
+ virtual void SetPropertyFilters(
+ const std::vector<AXPropertyFilter>& property_filters) = 0;
+
+ // Set regular expression filters that apply to every node before output.
+ virtual void SetNodeFilters(
+ const std::vector<AXNodeFilter>& node_filters) = 0;
+
+ // If true, the internal accessibility id of each node will be included
+ // in its output.
+ virtual void set_show_ids(bool show_ids) = 0;
+};
+
+} // namespace ui
+
+#endif // UI_ACCESSIBILITY_PLATFORM_INSPECT_TREE_FORMATTER_H_
diff --git a/chromium/ui/accessibility/test_ax_tree_manager.cc b/chromium/ui/accessibility/test_ax_tree_manager.cc
index e699a879f13..70d872d8efc 100644
--- a/chromium/ui/accessibility/test_ax_tree_manager.cc
+++ b/chromium/ui/accessibility/test_ax_tree_manager.cc
@@ -53,12 +53,22 @@ AXNode* TestAXTreeManager::GetNodeFromTree(const AXNode::AXID node_id) const {
return tree_ ? tree_->GetFromId(node_id) : nullptr;
}
+void TestAXTreeManager::AddObserver(AXTreeObserver* observer) {
+ if (tree_)
+ tree_->AddObserver(observer);
+}
+
+void TestAXTreeManager::RemoveObserver(AXTreeObserver* observer) {
+ if (tree_)
+ tree_->RemoveObserver(observer);
+}
+
AXTreeID TestAXTreeManager::GetTreeID() const {
return tree_ ? tree_->data().tree_id : AXTreeIDUnknown();
}
AXTreeID TestAXTreeManager::GetParentTreeID() const {
- return AXTreeIDUnknown();
+ return tree_ ? tree_->data().parent_tree_id : AXTreeIDUnknown();
}
AXNode* TestAXTreeManager::GetRootAsAXNode() const {
@@ -66,6 +76,22 @@ AXNode* TestAXTreeManager::GetRootAsAXNode() const {
}
AXNode* TestAXTreeManager::GetParentNodeFromParentTreeAsAXNode() const {
+ ui::AXTreeID parent_tree_id = GetParentTreeID();
+ TestAXTreeManager* parent_manager = static_cast<TestAXTreeManager*>(
+ ui::AXTreeManagerMap::GetInstance().GetManager(parent_tree_id));
+ if (!parent_manager)
+ return nullptr;
+
+ std::set<int32_t> host_node_ids =
+ parent_manager->GetTree()->GetNodeIdsForChildTreeId(GetTreeID());
+
+ for (int32_t host_node_id : host_node_ids) {
+ ui::AXNode* parent_node =
+ parent_manager->GetNodeFromTree(parent_tree_id, host_node_id);
+ if (parent_node)
+ return parent_node;
+ }
+
return nullptr;
}
diff --git a/chromium/ui/accessibility/test_ax_tree_manager.h b/chromium/ui/accessibility/test_ax_tree_manager.h
index 958761d4a34..117f020d062 100644
--- a/chromium/ui/accessibility/test_ax_tree_manager.h
+++ b/chromium/ui/accessibility/test_ax_tree_manager.h
@@ -43,6 +43,8 @@ class TestAXTreeManager : public AXTreeManager {
AXNode* GetNodeFromTree(const AXTreeID tree_id,
const AXNode::AXID node_id) const override;
AXNode* GetNodeFromTree(const AXNode::AXID node_id) const override;
+ void AddObserver(AXTreeObserver* observer) override;
+ void RemoveObserver(AXTreeObserver* observer) override;
AXTreeID GetTreeID() const override;
AXTreeID GetParentTreeID() const override;
AXNode* GetRootAsAXNode() const override;
diff --git a/chromium/ui/android/BUILD.gn b/chromium/ui/android/BUILD.gn
index c682901d23c..780d7d57605 100644
--- a/chromium/ui/android/BUILD.gn
+++ b/chromium/ui/android/BUILD.gn
@@ -5,6 +5,7 @@
import("//build/config/android/rules.gni")
import("//build/config/locales.gni")
import("//testing/test.gni")
+import("//tools/grit/grit_rule.gni")
assert(is_android)
@@ -116,6 +117,17 @@ java_cpp_enum("java_enums_srcjar") {
]
}
+java_cpp_features("java_features_srcjar") {
+ # External code should depend on ":ui_features_java" instead.
+ visibility = [ ":*" ]
+ sources = [ "../base/ui_base_features.cc" ]
+ template = "java/src/org/chromium/ui/base/UiFeatures.java.tmpl"
+}
+
+android_library("ui_features_java") {
+ srcjar_deps = [ ":java_features_srcjar" ]
+}
+
java_strings_grd("ui_strings_grd") {
grd_file = "java/strings/android_ui_strings.grd"
outputs = [ "values/android_ui_strings.xml" ] +
@@ -127,6 +139,7 @@ java_strings_grd("ui_strings_grd") {
android_resources("ui_java_resources") {
sources = [
"java/res/color/blue_when_enabled.xml",
+ "java/res/color/blue_when_enabled_dark.xml",
"java/res/color/chip_background_color.xml",
"java/res/color/chip_ripple_color.xml",
"java/res/color/chip_stroke_color.xml",
@@ -139,6 +152,7 @@ android_resources("ui_java_resources") {
"java/res/color/default_text_color_secondary_list.xml",
"java/res/color/filled_button_bg.xml",
"java/res/color/filled_button_ripple_color.xml",
+ "java/res/color/menu_chip_background.xml",
"java/res/color/text_button_ripple_color.xml",
"java/res/drawable-hdpi/btn_close.png",
"java/res/drawable-hdpi/ic_expand_less_black_24dp.png",
@@ -163,10 +177,12 @@ android_resources("ui_java_resources") {
"java/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png",
"java/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png",
"java/res/drawable-xxxhdpi/popup_bg.9.png",
+ "java/res/drawable/custom_toast_background.xml",
"java/res/drawable/drag_handlebar.xml",
"java/res/drawable/ic_expand_more_horizontal_black_24dp.xml",
"java/res/drawable/popup_bg_tinted.xml",
"java/res/font/accent_font.xml",
+ "java/res/layout/custom_toast_layout.xml",
"java/res/layout/dropdown_footer_wrapper_jellybean.xml",
"java/res/layout/dropdown_item.xml",
"java/res/layout/dropdown_window.xml",
@@ -293,6 +309,7 @@ android_library("ui_no_recycler_view_java") {
"java/src/org/chromium/ui/modelutil/PropertyKey.java",
"java/src/org/chromium/ui/modelutil/PropertyListModel.java",
"java/src/org/chromium/ui/modelutil/PropertyModel.java",
+ "java/src/org/chromium/ui/modelutil/PropertyModelAnimatorFactory.java",
"java/src/org/chromium/ui/modelutil/PropertyModelChangeProcessor.java",
"java/src/org/chromium/ui/modelutil/PropertyObservable.java",
"java/src/org/chromium/ui/modelutil/SimpleList.java",
diff --git a/chromium/ui/android/DIR_METADATA b/chromium/ui/android/DIR_METADATA
new file mode 100644
index 00000000000..fdda50b12d1
--- /dev/null
+++ b/chromium/ui/android/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI"
+}
+os: ANDROID \ No newline at end of file
diff --git a/chromium/ui/android/OWNERS b/chromium/ui/android/OWNERS
index 2a99c692980..3dce3d6e3fc 100644
--- a/chromium/ui/android/OWNERS
+++ b/chromium/ui/android/OWNERS
@@ -11,6 +11,3 @@ jinsukkim@chromium.org
# for CC and Viz integration
khushalsagar@chromium.org
-
-# COMPONENT: UI
-# OS: Android
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/DIR_METADATA b/chromium/ui/android/junit/src/org/chromium/ui/base/DIR_METADATA
new file mode 100644
index 00000000000..2769d07edc7
--- /dev/null
+++ b/chromium/ui/android/junit/src/org/chromium/ui/base/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI"
+} \ No newline at end of file
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/OWNERS b/chromium/ui/android/junit/src/org/chromium/ui/base/OWNERS
index b9c1ca44d04..8363189425d 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/base/OWNERS
+++ b/chromium/ui/android/junit/src/org/chromium/ui/base/OWNERS
@@ -1,5 +1,3 @@
# Implementation of the new in-app file picker.
per-file SelectFileDialogTest.java=finnur@chromium.org
per-file SelectFileDialogTest.java=peter@chromium.org
-
-# COMPONENT: UI
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/DIR_METADATA b/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/DIR_METADATA
new file mode 100644
index 00000000000..94bd7e259da
--- /dev/null
+++ b/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Browser>Mobile"
+}
+os: ANDROID \ No newline at end of file
diff --git a/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/OWNERS b/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/OWNERS
index ac64cd03a08..eae57e0d07a 100644
--- a/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/OWNERS
+++ b/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/OWNERS
@@ -1,4 +1 @@
file://ui/android/java/src/org/chromium/ui/modaldialog/OWNERS
-
-# COMPONENT: UI>Browser>Mobile
-# OS: Android
diff --git a/chromium/ui/android/resources/resource_manager_impl_unittest.cc b/chromium/ui/android/resources/resource_manager_impl_unittest.cc
index 70096bdc024..564c9dba1de 100644
--- a/chromium/ui/android/resources/resource_manager_impl_unittest.cc
+++ b/chromium/ui/android/resources/resource_manager_impl_unittest.cc
@@ -48,14 +48,13 @@ class TestResourceManagerImpl : public ResourceManagerImpl {
void SetResourceAsLoaded(AndroidResourceType res_type, int res_id) {
SkBitmap small_bitmap;
- small_bitmap.allocPixels(
- SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));
+ small_bitmap.allocN32Pixels(1, 1, /*is_opaque=*/true);
SkCanvas canvas(small_bitmap);
canvas.drawColor(SK_ColorWHITE);
small_bitmap.setImmutable();
OnResourceReady(nullptr, nullptr, res_type, res_id,
- gfx::ConvertToJavaBitmap(&small_bitmap), 1, 1,
+ gfx::ConvertToJavaBitmap(small_bitmap), 1, 1,
reinterpret_cast<intptr_t>(new Resource()));
}
diff --git a/chromium/ui/android/view_android.cc b/chromium/ui/android/view_android.cc
index bb6d1852c35..90b6b8c1f4f 100644
--- a/chromium/ui/android/view_android.cc
+++ b/chromium/ui/android/view_android.cc
@@ -114,6 +114,32 @@ float ViewAndroid::GetDipScale() {
return ui::GetScaleFactorForNativeView(this);
}
+base::Optional<gfx::Rect> ViewAndroid::GetDisplayFeature() {
+ ScopedJavaLocalRef<jobject> delegate(GetViewAndroidDelegate());
+ if (delegate.is_null())
+ return base::nullopt;
+
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::ScopedJavaLocalRef<jintArray> jni_display_feature =
+ Java_ViewAndroidDelegate_getDisplayFeature(env, delegate);
+ std::vector<int> display_feature_values;
+ if (jni_display_feature.obj()) {
+ // In order to reduce jni overhead, the DisplayFeature is returned in
+ // an integer array. This array must have 4 items in it (or the return
+ // value should be null).
+ base::android::JavaIntArrayToIntVector(env, jni_display_feature,
+ &display_feature_values);
+ CHECK(display_feature_values.size() == 4);
+ gfx::Rect display_feature;
+ display_feature.SetByBounds(
+ display_feature_values[0], display_feature_values[1],
+ display_feature_values[2], display_feature_values[3]);
+ return display_feature;
+ }
+
+ return base::nullopt;
+}
+
ScopedJavaLocalRef<jobject> ViewAndroid::GetEventForwarder() {
if (!event_forwarder_) {
DCHECK(!RootPathHasEventForwarder(parent_))
@@ -407,7 +433,7 @@ void ViewAndroid::OnCursorChanged(const Cursor& cursor) {
env, delegate, static_cast<int>(mojom::CursorType::kPointer));
return;
}
- ScopedJavaLocalRef<jobject> java_bitmap = gfx::ConvertToJavaBitmap(&bitmap);
+ ScopedJavaLocalRef<jobject> java_bitmap = gfx::ConvertToJavaBitmap(bitmap);
Java_ViewAndroidDelegate_onCursorChangedToCustom(env, delegate, java_bitmap,
hotspot.x(), hotspot.y());
} else {
@@ -659,6 +685,16 @@ bool ViewAndroid::ScrollTo(float x, float y) {
return false;
}
+void ViewAndroid::NotifyVirtualKeyboardOverlayRect(
+ const gfx::Rect& keyboard_rect) {
+ if (event_handler_)
+ event_handler_->NotifyVirtualKeyboardOverlayRect(keyboard_rect);
+
+ for (auto* child : children_) {
+ child->NotifyVirtualKeyboardOverlayRect(keyboard_rect);
+ }
+}
+
template <typename E>
bool ViewAndroid::HitTest(EventHandlerCallback<E> handler_callback,
const E& event,
diff --git a/chromium/ui/android/view_android.h b/chromium/ui/android/view_android.h
index 680f4634e8f..5114fbce214 100644
--- a/chromium/ui/android/view_android.h
+++ b/chromium/ui/android/view_android.h
@@ -209,10 +209,16 @@ class UI_ANDROID_EXPORT ViewAndroid {
ViewAndroid* parent() const { return parent_; }
+ base::Optional<gfx::Rect> GetDisplayFeature();
+
bool OnTouchEventForTesting(const MotionEventAndroid& event) {
return OnTouchEvent(event);
}
+ void NotifyVirtualKeyboardOverlayRect(const gfx::Rect& keyboard_rect);
+
+ void SetLayoutForTesting(int x, int y, int width, int height);
+
protected:
void RemoveAllChildren(bool attached_to_window);
@@ -245,8 +251,6 @@ class UI_ANDROID_EXPORT ViewAndroid {
void OnAttachedToWindow();
void OnDetachedFromWindow();
- void SetLayoutForTesting(int x, int y, int width, int height);
-
template <typename E>
using EventHandlerCallback =
const base::RepeatingCallback<bool(EventHandlerAndroid*, const E&)>;
diff --git a/chromium/ui/aura/BUILD.gn b/chromium/ui/aura/BUILD.gn
index 76a5742b2f3..193de1bb5ca 100644
--- a/chromium/ui/aura/BUILD.gn
+++ b/chromium/ui/aura/BUILD.gn
@@ -322,6 +322,7 @@ test("aura_unittests") {
sources = [
"../compositor_extra/shadow_unittest.cc",
+ "client/screen_position_client_unittest.cc",
"gestures/gesture_recognizer_unittest.cc",
"test/aura_test_suite.h",
"test/run_all_unittests.cc",
diff --git a/chromium/ui/aura/client/screen_position_client.cc b/chromium/ui/aura/client/screen_position_client.cc
index b40ff46ebc1..7bc23e48b42 100644
--- a/chromium/ui/aura/client/screen_position_client.cc
+++ b/chromium/ui/aura/client/screen_position_client.cc
@@ -30,6 +30,28 @@ void ScreenPositionClient::ConvertPointFromScreen(const Window* window,
*point = gfx::ToFlooredPoint(point_float);
}
+void ScreenPositionClient::ConvertPointToRootWindowIgnoringTransforms(
+ const Window* window,
+ gfx::Point* point) {
+ DCHECK(window);
+ DCHECK(window->GetRootWindow());
+ Window* ancestor = const_cast<Window*>(window);
+ while (ancestor && !ancestor->IsRootWindow()) {
+ const gfx::Point origin = ancestor->bounds().origin();
+ point->Offset(origin.x(), origin.y());
+ ancestor = ancestor->parent();
+ }
+}
+
+void ScreenPositionClient::ConvertPointToScreenIgnoringTransforms(
+ const aura::Window* window,
+ gfx::Point* point) {
+ const aura::Window* root_window = window->GetRootWindow();
+ ConvertPointToRootWindowIgnoringTransforms(window, point);
+ gfx::Point origin = GetRootWindowOriginInScreen(root_window);
+ point->Offset(origin.x(), origin.y());
+}
+
void SetScreenPositionClient(Window* root_window,
ScreenPositionClient* client) {
DCHECK_EQ(root_window->GetRootWindow(), root_window);
diff --git a/chromium/ui/aura/client/screen_position_client.h b/chromium/ui/aura/client/screen_position_client.h
index 24e22be60c6..f2d7a44a155 100644
--- a/chromium/ui/aura/client/screen_position_client.h
+++ b/chromium/ui/aura/client/screen_position_client.h
@@ -45,6 +45,18 @@ class AURA_EXPORT ScreenPositionClient {
virtual void SetBounds(Window* window,
const gfx::Rect& bounds,
const display::Display& display) = 0;
+ // Converts |point| from |window|'s coordinate space into screen coordinate
+ // space. Ignores any transforms that may be applied on |window| or its window
+ // hieraichy.
+ void ConvertPointToScreenIgnoringTransforms(const Window* window,
+ gfx::Point* point);
+ void ConvertPointToRootWindowIgnoringTransforms(const Window* window,
+ gfx::Point* point);
+
+ protected:
+ // Returns the origin of the host platform-window in system DIP coordinates.
+ virtual gfx::Point GetRootWindowOriginInScreen(
+ const aura::Window* root_window) = 0;
};
// Sets/Gets the activation client on the Window.
diff --git a/chromium/ui/aura/client/screen_position_client_unittest.cc b/chromium/ui/aura/client/screen_position_client_unittest.cc
new file mode 100644
index 00000000000..834b73bfbc6
--- /dev/null
+++ b/chromium/ui/aura/client/screen_position_client_unittest.cc
@@ -0,0 +1,65 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/aura/client/screen_position_client.h"
+
+#include <memory>
+
+#include "ui/aura/test/aura_test_base.h"
+
+namespace aura {
+namespace client {
+
+using ScreenPositionClientTest = test::AuraTestBase;
+
+class TestScreenPositionClient : public ScreenPositionClient {
+ public:
+ TestScreenPositionClient() = default;
+ TestScreenPositionClient(const TestScreenPositionClient&) = delete;
+ TestScreenPositionClient& operator=(const TestScreenPositionClient&) = delete;
+ ~TestScreenPositionClient() override = default;
+
+ // ScreenPositionClient:
+ void ConvertPointToScreen(const Window* window, gfx::PointF* point) override {
+ }
+ void ConvertPointFromScreen(const Window* window,
+ gfx::PointF* point) override {}
+ void ConvertHostPointToScreen(Window* root_window,
+ gfx::Point* point) override {}
+ void SetBounds(Window* window,
+ const gfx::Rect& bounds,
+ const display::Display& display) override {}
+
+ protected:
+ // ScreenPositionClient:
+ gfx::Point GetRootWindowOriginInScreen(
+ const aura::Window* root_window) override {
+ return gfx::Point();
+ }
+};
+
+TEST_F(ScreenPositionClientTest, ConvertPointToRootWindowIgnoringTransforms) {
+ std::unique_ptr<Window> parent(CreateNormalWindow(1, root_window(), nullptr));
+ std::unique_ptr<Window> child(CreateNormalWindow(2, parent.get(), nullptr));
+
+ parent->SetBounds(gfx::Rect(50, 50, 200, 200));
+ child->SetBounds(gfx::Rect(150, 150, 200, 200));
+
+ TestScreenPositionClient test_client;
+ gfx::Point point(100, 100);
+ test_client.ConvertPointToRootWindowIgnoringTransforms(parent.get(), &point);
+ EXPECT_EQ(gfx::Point(150, 150), point);
+
+ point = gfx::Point(100, 100);
+ test_client.ConvertPointToRootWindowIgnoringTransforms(child.get(), &point);
+ EXPECT_EQ(gfx::Point(300, 300), point);
+
+ point = gfx::Point(100, 100);
+ child->SetTransform(gfx::Transform(1, 0, 0, 1, 100, 100));
+ test_client.ConvertPointToRootWindowIgnoringTransforms(child.get(), &point);
+ EXPECT_EQ(gfx::Point(300, 300), point);
+}
+
+} // namespace client
+} // namespace aura
diff --git a/chromium/ui/aura/gestures/gesture_recognizer_unittest.cc b/chromium/ui/aura/gestures/gesture_recognizer_unittest.cc
index c681aa4b077..9d582844a33 100644
--- a/chromium/ui/aura/gestures/gesture_recognizer_unittest.cc
+++ b/chromium/ui/aura/gestures/gesture_recognizer_unittest.cc
@@ -351,7 +351,7 @@ class QueueTouchEventDelegate : public GestureEventConsumeDelegate {
synchronous_ack_for_next_event_ == AckState::CONSUMED
? ui::ER_CONSUMED
: ui::ER_UNHANDLED,
- false /* is_source_touch_event_set_non_blocking */, window_);
+ false /* is_source_touch_event_set_blocking */, window_);
synchronous_ack_for_next_event_ = AckState::PENDING;
} else {
sent_events_ids_.push_back(event->unique_event_id());
@@ -389,7 +389,7 @@ class QueueTouchEventDelegate : public GestureEventConsumeDelegate {
dispatcher_->ProcessedTouchEvent(
sent_event_id, window_,
prevent_defaulted ? ui::ER_HANDLED : ui::ER_UNHANDLED,
- false /* is_source_touch_event_set_non_blocking */);
+ false /* is_source_touch_event_set_blocking */);
}
Window* window_;
diff --git a/chromium/ui/aura/native_window_occlusion_tracker_win.cc b/chromium/ui/aura/native_window_occlusion_tracker_win.cc
index 66fd0b94353..9b7e1e3fa9d 100644
--- a/chromium/ui/aura/native_window_occlusion_tracker_win.cc
+++ b/chromium/ui/aura/native_window_occlusion_tracker_win.cc
@@ -5,11 +5,14 @@
#include "ui/aura/native_window_occlusion_tracker_win.h"
#include <dwmapi.h>
+#include <powersetting.h>
#include <memory>
+#include <string>
#include "base/bind.h"
#include "base/callback.h"
#include "base/memory/scoped_refptr.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/post_task.h"
#include "base/task/task_traits.h"
@@ -19,6 +22,58 @@
#include "base/win/scoped_gdi_object.h"
#include "base/win/windows_version.h"
#include "ui/aura/window_tree_host.h"
+#include "ui/base/ui_base_features.h"
+#include "ui/gfx/win/hwnd_util.h"
+
+const CLSID CLSID_ImmersiveShell = {
+ 0xC2F03A33,
+ 0x21F5,
+ 0x47FA,
+ {0xB4, 0xBB, 0x15, 0x63, 0x62, 0xA2, 0xF2, 0x39}};
+
+const CLSID CLSID_VirtualDesktopAPI_Unknown = {
+ 0xC5E0CDCA,
+ 0x7B6E,
+ 0x41B2,
+ {0x9F, 0xC4, 0xD9, 0x39, 0x75, 0xCC, 0x46, 0x7B}};
+
+struct IApplicationView : public IUnknown {
+ public:
+};
+
+MIDL_INTERFACE("FF72FFDD-BE7E-43FC-9C03-AD81681E88E4")
+IVirtualDesktop : public IUnknown {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE IsViewVisible(IApplicationView * pView,
+ int* pfVisible) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetID(GUID * pGuid) = 0;
+};
+
+enum AdjacentDesktop { LeftDirection = 3, RightDirection = 4 };
+
+MIDL_INTERFACE("F31574D6-B682-4cdc-BD56-1827860ABEC6")
+IVirtualDesktopManagerInternal : public IUnknown {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE GetCount(UINT * pCount) = 0;
+ virtual HRESULT STDMETHODCALLTYPE MoveViewToDesktop(
+ IApplicationView * pView, IVirtualDesktop * pDesktop) = 0;
+ virtual HRESULT STDMETHODCALLTYPE CanViewMoveDesktops(
+ IApplicationView * pView, int* pfCanViewMoveDesktops) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetCurrentDesktop(IVirtualDesktop *
+ *desktop) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetDesktops(IObjectArray * *ppDesktops) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetAdjacentDesktop(
+ IVirtualDesktop * pDesktopReference, AdjacentDesktop uDirection,
+ IVirtualDesktop * *ppAdjacentDesktop) = 0;
+ virtual HRESULT STDMETHODCALLTYPE SwitchDesktop(IVirtualDesktop *
+ pDesktop) = 0;
+ virtual HRESULT STDMETHODCALLTYPE CreateDesktopW(IVirtualDesktop *
+ *ppNewDesktop) = 0;
+ virtual HRESULT STDMETHODCALLTYPE RemoveDesktop(
+ IVirtualDesktop * pRemove, IVirtualDesktop * pFallbackDesktop) = 0;
+ virtual HRESULT STDMETHODCALLTYPE FindDesktop(
+ GUID * desktopId, IVirtualDesktop * *ppDesktop) = 0;
+};
namespace aura {
@@ -28,6 +83,9 @@ namespace {
const base::TimeDelta kUpdateOcclusionDelay =
base::TimeDelta::FromMilliseconds(16);
+const base::TimeDelta kUpdateVirtualDesktopDelay =
+ base::TimeDelta::FromMilliseconds(1000);
+
// This global variable can be accessed only on main thread.
NativeWindowOcclusionTrackerWin* g_tracker = nullptr;
@@ -120,7 +178,8 @@ NativeWindowOcclusionTrackerWin::NativeWindowOcclusionTrackerWin()
base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
session_change_observer_(
base::BindRepeating(&NativeWindowOcclusionTrackerWin::OnSessionChange,
- base::Unretained(this))) {
+ base::Unretained(this))),
+ power_setting_change_listener_(this) {
WindowOcclusionCalculator::CreateInstance(
update_occlusion_task_runner_, base::SequencedTaskRunnerHandle::Get(),
base::BindRepeating(
@@ -225,7 +284,8 @@ bool NativeWindowOcclusionTrackerWin::IsWindowVisibleAndFullyOpaque(
void NativeWindowOcclusionTrackerWin::UpdateOcclusionState(
const base::flat_map<HWND, Window::OcclusionState>&
- root_window_hwnds_occlusion_state) {
+ root_window_hwnds_occlusion_state,
+ bool show_all_windows) {
num_visible_root_windows_ = 0;
for (const auto& root_window_pair : root_window_hwnds_occlusion_state) {
auto it = hwnd_root_window_map_.find(root_window_pair.first);
@@ -234,17 +294,22 @@ void NativeWindowOcclusionTrackerWin::UpdateOcclusionState(
continue;
// Check Window::IsVisible here, on the UI thread, because it can't be
// checked on the occlusion calculation thread. Do this first before
- // checking screen_locked_ so that hidden windows remain hidden.
+ // checking screen_locked_ or display_on_ so that hidden windows remain
+ // hidden.
if (!it->second->IsVisible()) {
it->second->GetHost()->SetNativeWindowOcclusionState(
Window::OcclusionState::HIDDEN);
continue;
}
- // If the screen is locked, ignore occlusion state results and
+ Window::OcclusionState occl_state = root_window_pair.second;
+ // If the screen is locked or off, ignore occlusion state results and
// mark the window as occluded.
- it->second->GetHost()->SetNativeWindowOcclusionState(
- screen_locked_ ? Window::OcclusionState::OCCLUDED
- : root_window_pair.second);
+ if (screen_locked_ || !display_on_)
+ occl_state = Window::OcclusionState::OCCLUDED;
+ else if (show_all_windows)
+ occl_state = Window::OcclusionState::VISIBLE;
+
+ it->second->GetHost()->SetNativeWindowOcclusionState(occl_state);
num_visible_root_windows_++;
}
}
@@ -260,14 +325,29 @@ void NativeWindowOcclusionTrackerWin::OnSessionChange(
screen_locked_ = false;
} else if (status_code == WTS_SESSION_LOCK && is_current_session) {
screen_locked_ = true;
- // Set all visible root windows as occluded. If not visible,
- // set them as hidden.
- for (const auto& root_window_hwnd_pair : hwnd_root_window_map_) {
- root_window_hwnd_pair.second->GetHost()->SetNativeWindowOcclusionState(
- IsIconic(root_window_hwnd_pair.first)
- ? Window::OcclusionState::HIDDEN
- : Window::OcclusionState::OCCLUDED);
- }
+ MarkNonIconicWindowsOccluded();
+ }
+}
+
+void NativeWindowOcclusionTrackerWin::OnDisplayStateChanged(bool display_on) {
+ if (display_on == display_on_)
+ return;
+
+ display_on_ = display_on;
+ // Display changing to on will cause a foreground window change,
+ // which will trigger an occlusion calculation on its own.
+ if (!display_on_)
+ MarkNonIconicWindowsOccluded();
+}
+
+void NativeWindowOcclusionTrackerWin::MarkNonIconicWindowsOccluded() {
+ // Set all visible root windows as occluded. If not visible,
+ // set them as hidden.
+ for (const auto& root_window_hwnd_pair : hwnd_root_window_map_) {
+ root_window_hwnd_pair.second->GetHost()->SetNativeWindowOcclusionState(
+ IsIconic(root_window_hwnd_pair.first)
+ ? Window::OcclusionState::HIDDEN
+ : Window::OcclusionState::OCCLUDED);
}
}
@@ -282,6 +362,19 @@ NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
if (base::win::GetVersion() >= base::win::Version::WIN10) {
::CoCreateInstance(__uuidof(VirtualDesktopManager), nullptr, CLSCTX_ALL,
IID_PPV_ARGS(&virtual_desktop_manager_));
+
+ Microsoft::WRL::ComPtr<IServiceProvider> service_provider;
+ if (base::FeatureList::IsEnabled(
+ features::kCalculateNativeWinOcclusionCheckVirtualDesktopUsed) &&
+ SUCCEEDED(::CoCreateInstance(CLSID_ImmersiveShell, NULL,
+ CLSCTX_LOCAL_SERVER,
+ IID_PPV_ARGS(&service_provider)))) {
+ service_provider->QueryService(
+ CLSID_VirtualDesktopAPI_Unknown,
+ IID_PPV_ARGS(&virtual_desktop_manager_internal_));
+ if (virtual_desktop_manager_internal_)
+ ComputeVirtualDesktopUsed();
+ }
}
DETACH_FROM_SEQUENCE(sequence_checker_);
}
@@ -329,6 +422,8 @@ void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
UnregisterEventHooks();
if (occlusion_update_timer_.IsRunning())
occlusion_update_timer_.Stop();
+ if (virtual_desktop_update_timer_.IsRunning())
+ virtual_desktop_update_timer_.Stop();
}
}
@@ -469,17 +564,31 @@ void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
// Post a task to the browser ui thread to update the window occlusion state
// on the root windows.
ui_thread_task_runner_->PostTask(
- FROM_HERE, base::BindOnce(update_occlusion_state_callback_,
- root_window_hwnds_occlusion_state_));
+ FROM_HERE,
+ base::BindOnce(update_occlusion_state_callback_,
+ root_window_hwnds_occlusion_state_, showing_thumbnails_));
+}
+
+void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
+ ComputeVirtualDesktopUsed() {
+ UINT count = 0;
+ if (SUCCEEDED(virtual_desktop_manager_internal_->GetCount(&count)))
+ virtual_desktops_used_ = count > 1;
}
void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
ScheduleOcclusionCalculationIfNeeded() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (!occlusion_update_timer_.IsRunning())
+ if (!occlusion_update_timer_.IsRunning()) {
occlusion_update_timer_.Start(
FROM_HERE, kUpdateOcclusionDelay, this,
&WindowOcclusionCalculator::ComputeNativeWindowOcclusionStatus);
+ if (virtual_desktop_manager_internal_) {
+ virtual_desktop_update_timer_.Start(
+ FROM_HERE, kUpdateVirtualDesktopDelay, this,
+ &WindowOcclusionCalculator::ComputeVirtualDesktopUsed);
+ }
+ }
}
void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
@@ -515,6 +624,10 @@ void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
// Detects foreground window changing.
RegisterGlobalEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND);
+ // Detects objects getting shown and hidden. Used to know when the task bar
+ // and alt tab are showing preview windows so we can unocclude Chrome windows.
+ RegisterGlobalEventHook(EVENT_OBJECT_SHOW, EVENT_OBJECT_HIDE);
+
// Detects object state changes, e.g., enable/disable state, native window
// maximize and native window restore events.
RegisterGlobalEventHook(EVENT_OBJECT_STATECHANGE, EVENT_OBJECT_STATECHANGE);
@@ -626,6 +739,38 @@ void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
if (id_object != OBJID_WINDOW)
return;
+ // Detect if either the alt tab view or the task list thumbnail is being
+ // shown. If so, mark all non-hidden windows as occluded, and remember that
+ // we're in the showing_thumbnails state. This lasts until we get told that
+ // either the alt tab view or task list thumbnail are hidden.
+ if (event == EVENT_OBJECT_SHOW) {
+ // Avoid getting the hwnd's class name, and recomputing occlusion, if not
+ // needed.
+ if (showing_thumbnails_)
+ return;
+ std::string hwnd_class_name = base::UTF16ToUTF8(gfx::GetClassName(hwnd));
+ if ((hwnd_class_name == "MultitaskingViewFrame" ||
+ hwnd_class_name == "TaskListThumbnailWnd")) {
+ showing_thumbnails_ = true;
+ ui_thread_task_runner_->PostTask(
+ FROM_HERE, base::BindOnce(update_occlusion_state_callback_,
+ root_window_hwnds_occlusion_state_,
+ showing_thumbnails_));
+ return;
+ }
+ } else if (event == EVENT_OBJECT_HIDE) {
+ // Avoid getting the hwnd's class name, and recomputing occlusion, if not
+ // needed.
+ if (!showing_thumbnails_)
+ return;
+ std::string hwnd_class_name = base::UTF16ToUTF8(gfx::GetClassName(hwnd));
+ if (hwnd_class_name == "MultitaskingViewFrame" ||
+ hwnd_class_name == "TaskListThumbnailWnd") {
+ showing_thumbnails_ = false;
+ // Let occlusion calculation fix occlusion state.
+ }
+ }
+
// Don't continually calculate occlusion while a window is moving, but rather
// once at the beginning and once at the end.
if (event == EVENT_SYSTEM_MOVESIZESTART) {
@@ -677,7 +822,7 @@ bool NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
base::Optional<bool> NativeWindowOcclusionTrackerWin::
WindowOcclusionCalculator::IsWindowOnCurrentVirtualDesktop(HWND hwnd) {
- if (!virtual_desktop_manager_)
+ if (!virtual_desktop_manager_ || !virtual_desktops_used_)
return true;
BOOL on_current_desktop;
diff --git a/chromium/ui/aura/native_window_occlusion_tracker_win.h b/chromium/ui/aura/native_window_occlusion_tracker_win.h
index 751562e9bb5..8fe2f6f3348 100644
--- a/chromium/ui/aura/native_window_occlusion_tracker_win.h
+++ b/chromium/ui/aura/native_window_occlusion_tracker_win.h
@@ -23,6 +23,7 @@
#include "ui/aura/aura_export.h"
#include "ui/aura/window.h"
#include "ui/aura/window_observer.h"
+#include "ui/base/win/power_setting_change_listener.h"
#include "ui/base/win/session_change_observer.h"
namespace base {
@@ -33,12 +34,16 @@ namespace gfx {
class Rect;
}
+struct IVirtualDesktopManagerInternal;
+
namespace aura {
// This class keeps track of whether any HWNDs are occluding any app windows.
// It notifies the host of any app window whose occlusion state changes. Most
// code should not need to use this; it's an implementation detail.
-class AURA_EXPORT NativeWindowOcclusionTrackerWin : public WindowObserver {
+class AURA_EXPORT NativeWindowOcclusionTrackerWin
+ : public WindowObserver,
+ public ui::PowerSettingChangeListener {
public:
static NativeWindowOcclusionTrackerWin* GetOrCreateInstance();
@@ -67,7 +72,8 @@ class AURA_EXPORT NativeWindowOcclusionTrackerWin : public WindowObserver {
class WindowOcclusionCalculator {
public:
using UpdateOcclusionStateCallback = base::RepeatingCallback<void(
- const base::flat_map<HWND, Window::OcclusionState>&)>;
+ const base::flat_map<HWND, Window::OcclusionState>&,
+ bool show_all_windows)>;
// Creates WindowOcclusionCalculator instance. Must be called on UI thread.
static void CreateInstance(
@@ -130,6 +136,10 @@ class AURA_EXPORT NativeWindowOcclusionTrackerWin : public WindowObserver {
// their occlusion status has changed.
void ComputeNativeWindowOcclusionStatus();
+ // Computes if virtual desktops are used. This is used as an optimization
+ // since IsWindowOnCurrentVirtualDesktop is a slow call.
+ void ComputeVirtualDesktopUsed();
+
// Schedules an occlusion calculation |update_occlusion_delay_| time in the
// future, if one isn't already scheduled.
void ScheduleOcclusionCalculationIfNeeded();
@@ -213,6 +223,9 @@ class AURA_EXPORT NativeWindowOcclusionTrackerWin : public WindowObserver {
// Timer to delay occlusion update.
base::OneShotTimer occlusion_update_timer_;
+ // Timer to check how many virtual desktops are present.
+ base::OneShotTimer virtual_desktop_update_timer_;
+
// Used to keep track of whether we're in the middle of getting window move
// events, in order to wait until the window move is complete before
// calculating window occlusion.
@@ -231,9 +244,22 @@ class AURA_EXPORT NativeWindowOcclusionTrackerWin : public WindowObserver {
// windows from |unoccluded_desktop_region_|.
int num_root_windows_with_unknown_occlusion_state_;
+ // This is true if the task bar thumbnails or the alt tab thumbnails are
+ // showing.
+ bool showing_thumbnails_ = false;
+
+ // By caching if virtual desktops are in use or not we can avoid calling
+ // IsWindowOnCurrentVirtualDesktop which is slow. Start with an initial
+ // value of true so that we only optimize after we get confirmation that
+ // there are no virtual desktops.
+ bool virtual_desktops_used_ = true;
+
// Only used on Win10+.
Microsoft::WRL::ComPtr<IVirtualDesktopManager> virtual_desktop_manager_;
+ Microsoft::WRL::ComPtr<IVirtualDesktopManagerInternal>
+ virtual_desktop_manager_internal_;
+
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<WindowOcclusionCalculator> weak_factory_{this};
@@ -250,14 +276,24 @@ class AURA_EXPORT NativeWindowOcclusionTrackerWin : public WindowObserver {
// window rectangle in |window_rect|.
static bool IsWindowVisibleAndFullyOpaque(HWND hwnd, gfx::Rect* window_rect);
- // Updates root windows occclusion state.
+ // Updates root windows occclusion state. If |show_all_windows| is true,
+ // all non-hidden windows will be marked visible. This is used to force
+ // rendering of thumbnails.
void UpdateOcclusionState(const base::flat_map<HWND, Window::OcclusionState>&
- root_window_hwnds_occlusion_state);
+ root_window_hwnds_occlusion_state,
+ bool show_all_windows);
// This is called with session changed notifications. If the screen is locked
// by the current session, it marks app windows as occluded.
void OnSessionChange(WPARAM status_code, const bool* is_current_session);
+ // This is called when the display is put to sleep. If the display is sleeping
+ // it marks app windows as occluded.
+ void OnDisplayStateChanged(bool display_on) override;
+
+ // Marks all root windows as either occluded, or if hwnd IsIconic, hidden.
+ void MarkNonIconicWindowsOccluded();
+
// Task runner to call ComputeNativeWindowOcclusionStatus, and to handle
// Windows event notifications, off of the UI thread.
const scoped_refptr<base::SequencedTaskRunner> update_occlusion_task_runner_;
@@ -273,9 +309,15 @@ class AURA_EXPORT NativeWindowOcclusionTrackerWin : public WindowObserver {
// Manages observation of Windows Session Change messages.
ui::SessionChangeObserver session_change_observer_;
+ // Listens for Power Setting Change messages.
+ ui::ScopedPowerSettingChangeListener power_setting_change_listener_;
+
// If the screen is locked, windows are considered occluded.
bool screen_locked_ = false;
+ // If the display is off, windows are considered occluded.
+ bool display_on_ = true;
+
base::WeakPtrFactory<NativeWindowOcclusionTrackerWin> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(NativeWindowOcclusionTrackerWin);
diff --git a/chromium/ui/aura/screen_ozone.cc b/chromium/ui/aura/screen_ozone.cc
index aa167666369..df496fb5e9d 100644
--- a/chromium/ui/aura/screen_ozone.cc
+++ b/chromium/ui/aura/screen_ozone.cc
@@ -89,6 +89,14 @@ void ScreenOzone::SetScreenSaverSuspended(bool suspend) {
platform_screen_->SetScreenSaverSuspended(suspend);
}
+bool ScreenOzone::IsScreenSaverActive() const {
+ return platform_screen_->IsScreenSaverActive();
+}
+
+base::TimeDelta ScreenOzone::CalculateIdleTime() const {
+ return platform_screen_->CalculateIdleTime();
+}
+
void ScreenOzone::AddObserver(display::DisplayObserver* observer) {
platform_screen_->AddObserver(observer);
}
@@ -101,6 +109,11 @@ std::string ScreenOzone::GetCurrentWorkspace() {
return platform_screen_->GetCurrentWorkspace();
}
+base::Value ScreenOzone::GetGpuExtraInfoAsListValue(
+ const gfx::GpuExtraInfo& gpu_extra_info) {
+ return platform_screen_->GetGpuExtraInfoAsListValue(gpu_extra_info);
+}
+
gfx::NativeWindow ScreenOzone::GetNativeWindowFromAcceleratedWidget(
gfx::AcceleratedWidget widget) const {
return nullptr;
diff --git a/chromium/ui/aura/screen_ozone.h b/chromium/ui/aura/screen_ozone.h
index cd130694503..f92c14f5667 100644
--- a/chromium/ui/aura/screen_ozone.h
+++ b/chromium/ui/aura/screen_ozone.h
@@ -42,9 +42,13 @@ class AURA_EXPORT ScreenOzone : public display::Screen {
const gfx::Rect& match_rect) const override;
display::Display GetPrimaryDisplay() const override;
void SetScreenSaverSuspended(bool suspend) override;
+ bool IsScreenSaverActive() const override;
+ base::TimeDelta CalculateIdleTime() const override;
void AddObserver(display::DisplayObserver* observer) override;
void RemoveObserver(display::DisplayObserver* observer) override;
std::string GetCurrentWorkspace() override;
+ base::Value GetGpuExtraInfoAsListValue(
+ const gfx::GpuExtraInfo& gpu_extra_info) override;
// Returns the NativeWindow associated with the AcceleratedWidget.
virtual gfx::NativeWindow GetNativeWindowFromAcceleratedWidget(
diff --git a/chromium/ui/aura/window.cc b/chromium/ui/aura/window.cc
index 3d112662de9..a752e293658 100644
--- a/chromium/ui/aura/window.cc
+++ b/chromium/ui/aura/window.cc
@@ -11,8 +11,8 @@
#include "base/auto_reset.h"
#include "base/bind.h"
-#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/callback_helpers.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/stl_util.h"
diff --git a/chromium/ui/aura/window_event_dispatcher.cc b/chromium/ui/aura/window_event_dispatcher.cc
index 56e87735fc5..af90753ae70 100644
--- a/chromium/ui/aura/window_event_dispatcher.cc
+++ b/chromium/ui/aura/window_event_dispatcher.cc
@@ -184,11 +184,10 @@ void WindowEventDispatcher::ProcessedTouchEvent(
uint32_t unique_event_id,
Window* window,
ui::EventResult result,
- bool is_source_touch_event_set_non_blocking) {
+ bool is_source_touch_event_set_blocking) {
ui::GestureRecognizer::Gestures gestures =
Env::GetInstance()->gesture_recognizer()->AckTouchEvent(
- unique_event_id, result, is_source_touch_event_set_non_blocking,
- window);
+ unique_event_id, result, is_source_touch_event_set_blocking, window);
DispatchDetails details = ProcessGestures(window, std::move(gestures));
if (details.dispatcher_destroyed)
return;
@@ -575,7 +574,7 @@ ui::EventDispatchDetails WindowEventDispatcher::PostDispatchEvent(
ui::GestureRecognizer::Gestures gestures =
Env::GetInstance()->gesture_recognizer()->AckTouchEvent(
touchevent.unique_event_id(), event.result(),
- false /* is_source_touch_event_set_non_blocking */, window);
+ false /* is_source_touch_event_set_blocking */, window);
return ProcessGestures(window, std::move(gestures));
}
diff --git a/chromium/ui/aura/window_event_dispatcher.h b/chromium/ui/aura/window_event_dispatcher.h
index 5435ce7b7f3..573cec8f5ca 100644
--- a/chromium/ui/aura/window_event_dispatcher.h
+++ b/chromium/ui/aura/window_event_dispatcher.h
@@ -106,7 +106,7 @@ class AURA_EXPORT WindowEventDispatcher : public ui::EventProcessor,
virtual void ProcessedTouchEvent(uint32_t unique_event_id,
Window* window,
ui::EventResult result,
- bool is_source_touch_event_set_non_blocking);
+ bool is_source_touch_event_set_blocking);
// These methods are used to defer the processing of mouse/touch events
// related to resize. A client (typically a RenderWidgetHostViewAura) can call
diff --git a/chromium/ui/aura/window_event_dispatcher_unittest.cc b/chromium/ui/aura/window_event_dispatcher_unittest.cc
index 37cc19b9d2c..35fd78d0632 100644
--- a/chromium/ui/aura/window_event_dispatcher_unittest.cc
+++ b/chromium/ui/aura/window_event_dispatcher_unittest.cc
@@ -14,7 +14,7 @@
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/stl_util.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
@@ -1009,7 +1009,7 @@ TEST_F(WindowEventDispatcherTest, CallToProcessedTouchEvent) {
host()->dispatcher()->ProcessedTouchEvent(
0, window.get(), ui::ER_UNHANDLED,
- false /* is_source_touch_event_set_non_blocking */);
+ false /* is_source_touch_event_set_blocking */);
}
// This event handler requests the dispatcher to start holding pointer-move
@@ -2873,7 +2873,7 @@ class AsyncWindowDelegate : public test::TestWindowDelegate {
event->DisableSynchronousHandling();
dispatcher_->ProcessedTouchEvent(
event->unique_event_id(), window_, ui::ER_UNHANDLED,
- false /* is_source_touch_event_set_non_blocking */);
+ false /* is_source_touch_event_set_blocking */);
event->StopPropagation();
}
diff --git a/chromium/ui/aura/window_occlusion_tracker_unittest.cc b/chromium/ui/aura/window_occlusion_tracker_unittest.cc
index 31ba4e71245..a8ecbcf2a62 100644
--- a/chromium/ui/aura/window_occlusion_tracker_unittest.cc
+++ b/chromium/ui/aura/window_occlusion_tracker_unittest.cc
@@ -4,10 +4,10 @@
#include "ui/aura/window_occlusion_tracker.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/macros.h"
#include "base/run_loop.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/test/gtest_util.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
diff --git a/chromium/ui/aura/window_unittest.cc b/chromium/ui/aura/window_unittest.cc
index 54265f64c98..6bf4c71aff6 100644
--- a/chromium/ui/aura/window_unittest.cc
+++ b/chromium/ui/aura/window_unittest.cc
@@ -15,7 +15,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "build/build_config.h"
#include "cc/trees/layer_tree_frame_sink.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/ui/aura_extra/window_occlusion_impl_win.cc b/chromium/ui/aura_extra/window_occlusion_impl_win.cc
index b74c8d2bacc..965925ff29a 100644
--- a/chromium/ui/aura_extra/window_occlusion_impl_win.cc
+++ b/chromium/ui/aura_extra/window_occlusion_impl_win.cc
@@ -4,7 +4,6 @@
#include "ui/aura_extra/window_occlusion_impl_win.h"
-#include "base/metrics/histogram_macros.h"
#include "base/win/scoped_gdi_object.h"
#include "ui/aura/window_tree_host.h"
#include "ui/gfx/geometry/rect.h"
@@ -174,7 +173,14 @@ ComputeNativeWindowOcclusionStatusImpl(
const std::vector<aura::WindowTreeHost*>& windows,
std::unique_ptr<NativeWindowIterator> iterator,
std::unique_ptr<WindowBoundsDelegate> bounds_delegate) {
- base::TimeTicks calculation_start_time = base::TimeTicks::Now();
+ // Time to execute this method, according to 28 days of Stable data
+ // ending on June 15, 2020:
+ //
+ // 50th percentile: 156 us
+ // 75th percentile: 273 us
+ // 95th percentile: 647 us
+ // 99th percentile: 1939 us
+ // 99.5th percentile: 5592 us
WindowEvaluatorImpl window_evaluator(windows, std::move(bounds_delegate));
@@ -182,12 +188,6 @@ ComputeNativeWindowOcclusionStatusImpl(
if (window_evaluator.HasAtLeastOneVisibleWindow())
iterator->Iterate(&window_evaluator);
- UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
- "Windows.ComputeNativeWindowOcclusionTime",
- base::TimeTicks::Now() - calculation_start_time,
- base::TimeDelta::FromMicroseconds(1), base::TimeDelta::FromSeconds(10),
- 50);
-
return window_evaluator.TakeResult();
}
diff --git a/chromium/ui/aura_extra/window_position_in_root_monitor_unittest.cc b/chromium/ui/aura_extra/window_position_in_root_monitor_unittest.cc
index 785e23a35bb..30a446d644c 100644
--- a/chromium/ui/aura_extra/window_position_in_root_monitor_unittest.cc
+++ b/chromium/ui/aura_extra/window_position_in_root_monitor_unittest.cc
@@ -6,7 +6,7 @@
#include "base/bind.h"
#include "base/callback.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "ui/aura/test/aura_test_base.h"
#include "ui/aura/test/test_windows.h"
#include "ui/aura/window.h"
diff --git a/chromium/ui/base/BUILD.gn b/chromium/ui/base/BUILD.gn
index 60d58740ef2..df0db2e2e26 100644
--- a/chromium/ui/base/BUILD.gn
+++ b/chromium/ui/base/BUILD.gn
@@ -7,6 +7,7 @@ import("//build/config/compiler/compiler.gni")
import("//build/config/dcheck_always_on.gni")
import("//build/config/linux/gtk/gtk.gni")
import("//build/config/linux/pangocairo/pangocairo.gni")
+import("//build/config/ozone.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/ui.gni")
import("//build/util/branding.gni")
@@ -14,7 +15,6 @@ import("//components/system_media_controls/linux/buildflags/buildflags.gni")
import("//testing/test.gni")
import("//tools/grit/grit_rule.gni")
import("//ui/base/ui_features.gni")
-import("//ui/ozone/ozone.gni")
if (is_android) {
import("//build/config/android/config.gni")
@@ -96,6 +96,8 @@ component("base") {
"dragdrop/os_exchange_data.h",
"dragdrop/os_exchange_data_provider_factory.cc",
"dragdrop/os_exchange_data_provider_factory.h",
+ "ime/utf_offset.cc",
+ "ime/utf_offset.h",
"l10n/formatter.cc",
"l10n/formatter.h",
"l10n/l10n_font_util.cc",
@@ -221,6 +223,8 @@ component("base") {
"win/message_box_win.h",
"win/mouse_wheel_util.cc",
"win/mouse_wheel_util.h",
+ "win/power_setting_change_listener.cc",
+ "win/power_setting_change_listener.h",
"win/scoped_ole_initializer.cc",
"win/scoped_ole_initializer.h",
"win/session_change_observer.cc",
@@ -307,10 +311,6 @@ component("base") {
]
}
- if (is_posix) {
- sources += [ "l10n/l10n_util_posix.cc" ]
- }
-
if (is_ios) {
sources += [
"device_form_factor_ios.mm",
@@ -409,10 +409,7 @@ component("base") {
}
if (is_fuchsia) {
- sources += [
- "l10n/l10n_util_posix.cc",
- "resource/resource_bundle_fuchsia.cc",
- ]
+ sources += [ "resource/resource_bundle_fuchsia.cc" ]
}
configs += [ "//build/config/compiler:wexit_time_destructors" ]
@@ -447,6 +444,7 @@ component("base") {
"//ui/display",
"//ui/events",
"//ui/events/devices",
+ "//ui/resources:webui_generated_resources_grd",
"//ui/resources:webui_resources_grd",
"//ui/strings",
"//url",
@@ -481,7 +479,7 @@ component("base") {
deps += [ "//ui/events" ]
}
- if ((is_desktop_linux || is_chromeos) && (use_x11 || ozone_platform_x11)) {
+ if ((is_linux || is_chromeos) && (use_x11 || ozone_platform_x11)) {
public_deps += [ "//ui/base/x" ]
# X11 drag and drop wants to use common drag and drop types.
@@ -614,6 +612,8 @@ component("data_exchange") {
"//ui/gfx/geometry",
"//url",
]
+
+ public_deps = [ "//ui/base/data_transfer_policy" ]
}
component("features") {
@@ -645,6 +645,7 @@ if (is_win || is_mac || (is_linux && !is_chromeos)) {
]
deps = [
"//base",
+ "//base/test:test_config",
"//testing/gtest",
"//ui/gfx",
"//ui/snapshot",
@@ -856,6 +857,7 @@ test("ui_base_unittests") {
sources = [
"class_property_unittest.cc",
+ "ime/utf_offset_unittest.cc",
"l10n/l10n_util_unittest.cc",
"l10n/time_format_unittest.cc",
"layout_unittest.cc",
diff --git a/chromium/ui/base/DEPS b/chromium/ui/base/DEPS
index 10a3245a323..f333c5dc19c 100644
--- a/chromium/ui/base/DEPS
+++ b/chromium/ui/base/DEPS
@@ -12,6 +12,7 @@ include_rules = [
"+ui/gfx",
"+ui/resources/grit/ui_resources.h",
"+ui/resources/grit/ui_unscaled_resources.h",
+ "+ui/resources/grit/webui_generated_resources.h",
"+ui/resources/grit/webui_resources.h",
"+ui/strings/grit/app_locale_settings.h",
"+ui/strings/grit/ui_strings.h",
diff --git a/chromium/ui/base/clipboard/BUILD.gn b/chromium/ui/base/clipboard/BUILD.gn
index 36048a6bc82..a24dfe52e7c 100644
--- a/chromium/ui/base/clipboard/BUILD.gn
+++ b/chromium/ui/base/clipboard/BUILD.gn
@@ -2,7 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import("///ui/ozone/ozone.gni")
+import("///build/config/ozone.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/ui.gni")
@@ -35,7 +35,7 @@ component("clipboard_types") {
}
if (use_aura) {
- if ((use_x11 && is_desktop_linux) || !is_win) {
+ if ((use_x11 && is_linux) || !is_win) {
sources += [ "clipboard_format_type_aura.cc" ]
}
}
@@ -59,10 +59,6 @@ component("clipboard") {
sources = [
"clipboard.cc",
"clipboard.h",
- "clipboard_data_endpoint.cc",
- "clipboard_data_endpoint.h",
- "clipboard_dlp_controller.cc",
- "clipboard_dlp_controller.h",
"clipboard_metrics.cc",
"clipboard_metrics.h",
"clipboard_monitor.cc",
@@ -107,15 +103,19 @@ component("clipboard") {
"//mojo/public/cpp/base",
"//net",
"//skia",
+ "//ui/base:features",
"//ui/gfx",
"//ui/gfx/geometry",
]
- public_deps = [ ":clipboard_types" ]
+ public_deps = [
+ ":clipboard_types",
+ "//ui/base/data_transfer_policy",
+ ]
if (use_aura) {
# Linux clipboard implementations.
- if (is_desktop_linux && !is_chromecast) {
+ if (is_linux && !is_chromecast) {
sources += [ "clipboard_linux.cc" ]
if (use_ozone) {
sources += [
diff --git a/chromium/ui/base/clipboard/DIR_METADATA b/chromium/ui/base/clipboard/DIR_METADATA
new file mode 100644
index 00000000000..185817f957c
--- /dev/null
+++ b/chromium/ui/base/clipboard/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Blink>DataTransfer"
+}
+team_email: "storage-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/base/clipboard/OWNERS b/chromium/ui/base/clipboard/OWNERS
index 4a0f01ac3b6..9317fe4e188 100644
--- a/chromium/ui/base/clipboard/OWNERS
+++ b/chromium/ui/base/clipboard/OWNERS
@@ -1,5 +1,2 @@
dcheng@chromium.org
huangdarwin@chromium.org
-
-# TEAM: storage-dev@chromium.org
-# COMPONENT: Blink>DataTransfer
diff --git a/chromium/ui/base/clipboard/clipboard.cc b/chromium/ui/base/clipboard/clipboard.cc
index b7445c0a98b..76f95800d1c 100644
--- a/chromium/ui/base/clipboard/clipboard.cc
+++ b/chromium/ui/base/clipboard/clipboard.cc
@@ -15,9 +15,37 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/geometry/size.h"
+#if defined(USE_OZONE)
+#include "ui/base/ui_base_features.h"
+#endif
+
namespace ui {
// static
+bool Clipboard::IsSupportedClipboardBuffer(ClipboardBuffer buffer) {
+ switch (buffer) {
+ case ClipboardBuffer::kCopyPaste:
+ return true;
+ case ClipboardBuffer::kSelection:
+#if defined(USE_OZONE) && !defined(OS_CHROMEOS)
+ if (features::IsUsingOzonePlatform()) {
+ ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
+ CHECK(clipboard);
+ return clipboard->IsSelectionBufferAvailable();
+ }
+#endif
+#if !defined(OS_WIN) && !defined(OS_APPLE) && !defined(OS_CHROMEOS)
+ return true;
+#else
+ return false;
+#endif
+ case ClipboardBuffer::kDrag:
+ return false;
+ }
+ NOTREACHED();
+}
+
+// static
void Clipboard::SetAllowedThreads(
const std::vector<base::PlatformThreadId>& allowed_threads) {
base::AutoLock lock(ClipboardMapLock());
@@ -181,7 +209,7 @@ base::PlatformThreadId Clipboard::GetAndValidateThreadID() {
// A Clipboard instance must be allocated for every thread that uses the
// clipboard. To prevented unbounded memory use, CHECK that the current thread
- // was whitelisted to use the clipboard. This is a CHECK rather than a DCHECK
+ // was allowlisted to use the clipboard. This is a CHECK rather than a DCHECK
// to catch incorrect usage in production (e.g. https://crbug.com/872737).
CHECK(AllowedThreads().empty() || base::Contains(AllowedThreads(), id));
diff --git a/chromium/ui/base/clipboard/clipboard.h b/chromium/ui/base/clipboard/clipboard.h
index e596a20b40e..410e2936cfb 100644
--- a/chromium/ui/base/clipboard/clipboard.h
+++ b/chromium/ui/base/clipboard/clipboard.h
@@ -28,13 +28,14 @@
#include "mojo/public/cpp/base/big_buffer.h"
#include "ui/base/clipboard/clipboard_buffer.h"
#include "ui/base/clipboard/clipboard_format_type.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
class SkBitmap;
namespace ui {
class TestClipboard;
class ScopedClipboardWriter;
-class ClipboardDataEndpoint;
+class DataTransferEndpoint;
// Clipboard:
// - reads from and writes to the system clipboard.
@@ -47,21 +48,7 @@ class ClipboardDataEndpoint;
class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) Clipboard
: public base::ThreadChecker {
public:
- static bool IsSupportedClipboardBuffer(ClipboardBuffer buffer) {
- switch (buffer) {
- case ClipboardBuffer::kCopyPaste:
- return true;
- case ClipboardBuffer::kSelection:
-#if !defined(OS_WIN) && !defined(OS_APPLE) && !defined(OS_CHROMEOS)
- return true;
-#else
- return false;
-#endif
- case ClipboardBuffer::kDrag:
- return false;
- }
- NOTREACHED();
- }
+ static bool IsSupportedClipboardBuffer(ClipboardBuffer buffer);
// Sets the list of threads that are allowed to access the clipboard.
static void SetAllowedThreads(
@@ -108,12 +95,10 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) Clipboard
virtual uint64_t GetSequenceNumber(ClipboardBuffer buffer) const = 0;
// Tests whether the clipboard contains a certain format.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual bool IsFormatAvailable(
const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const = 0;
+ const DataTransferEndpoint* data_dst) const = 0;
// Returns whether the clipboard has data that is marked by its originator as
// confidential. This is available for opt-in checking by the user of this API
@@ -133,91 +118,69 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) Clipboard
// TODO(huangdarwin): Rename to ReadAvailablePortableFormatNames().
// Includes all sanitized types.
// Also, includes pickled types by splitting them out of the pickled format.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originated uses.
virtual void ReadAvailableTypes(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const = 0;
// Includes all types, including unsanitized types.
// Omits formats held within pickles, as they're different from what a native
// application would see.
- // TODO(crbug.com/1103614): Update |dst| in all references to its appropriate
- // ClipboardDataEndpoint for web-originates uses.
virtual std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const = 0;
+ const DataTransferEndpoint* data_dst) const = 0;
// Reads Unicode text from the clipboard, if available.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual void ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const = 0;
// Reads ASCII text from the clipboard, if available.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual void ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const = 0;
// Reads HTML from the clipboard, if available. If the HTML fragment requires
// context to parse, |fragment_start| and |fragment_end| are indexes into
// markup indicating the beginning and end of the actual fragment. Otherwise,
// they will contain 0 and markup->size().
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual void ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
uint32_t* fragment_end) const = 0;
// Reads an SVG image from the clipboard, if available.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual void ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const = 0;
// Reads RTF from the clipboard, if available. Stores the result as a byte
// vector.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual void ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const = 0;
using ReadImageCallback = base::OnceCallback<void(const SkBitmap&)>;
// Reads an image from the clipboard, if available.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual void ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const = 0;
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual void ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const = 0;
// Reads a bookmark from the clipboard, if available.
// |title| or |url| may be null.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
- virtual void ReadBookmark(const ClipboardDataEndpoint* data_dst,
+ virtual void ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const = 0;
// Reads raw data from the clipboard with the given format type. Stores result
// as a byte vector.
- // TODO(crbug.com/1103614): Update |data_dst| in all references to its
- // appropriate ClipboardDataEndpoint for web-originates uses.
virtual void ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const = 0;
// Returns an estimate of the time the clipboard was last updated. If the
@@ -227,12 +190,6 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) Clipboard
// Resets the clipboard last modified time to Time::Time().
virtual void ClearLastModifiedTime();
-#if defined(USE_OZONE)
- // Returns whether the selection buffer is available. This is true for some
- // Linux platforms.
- virtual bool IsSelectionBufferAvailable() const = 0;
-#endif // defined(USE_OZONE)
-
protected:
// PortableFormat designates the type of data to be stored in the clipboard.
// This designation is shared across all OSes. The system-specific designation
@@ -306,7 +263,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) Clipboard
virtual void WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) = 0;
+ std::unique_ptr<DataTransferEndpoint> data_src) = 0;
// Write |platform_representations|, in the order of their appearance in
// |platform_representations|. Also, adds the source of the data to the
@@ -316,7 +273,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) Clipboard
virtual void WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) = 0;
+ std::unique_ptr<DataTransferEndpoint> data_src) = 0;
void DispatchPortableRepresentation(PortableFormat format,
const ObjectMapParams& params);
@@ -362,6 +319,12 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) Clipboard
static base::PlatformThreadId GetAndValidateThreadID();
+#if defined(USE_OZONE)
+ // Returns whether the selection buffer is available. This is true for some
+ // Linux platforms.
+ virtual bool IsSelectionBufferAvailable() const = 0;
+#endif // defined(USE_OZONE)
+
// A list of allowed threads. By default, this is empty and no thread checking
// is done (in the unit test case), but a user (like content) can set which
// threads are allowed to call this method.
diff --git a/chromium/ui/base/clipboard/clipboard_android.cc b/chromium/ui/base/clipboard/clipboard_android.cc
index caf32eb42ab..d1f728c1992 100644
--- a/chromium/ui/base/clipboard/clipboard_android.cc
+++ b/chromium/ui/base/clipboard/clipboard_android.cc
@@ -26,9 +26,9 @@
#include "base/time/time.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
#include "ui/base/clipboard/clipboard_format_type.h"
#include "ui/base/clipboard/clipboard_metrics.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/base/ui_base_jni_headers/Clipboard_jni.h"
#include "ui/gfx/android/java_bitmap.h"
#include "ui/gfx/image/image.h"
@@ -76,7 +76,7 @@ SkBitmap GetImageData(
}
gfx::JavaBitmap java_bitmap(jbitmap);
- if (java_bitmap.size().IsEmpty() || java_bitmap.stride() == 0U ||
+ if (java_bitmap.size().IsEmpty() || java_bitmap.bytes_per_row() == 0U ||
java_bitmap.pixels() == nullptr) {
return SkBitmap();
}
@@ -375,7 +375,7 @@ uint64_t ClipboardAndroid::GetSequenceNumber(
bool ClipboardAndroid::IsFormatAvailable(
const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -396,7 +396,7 @@ void ClipboardAndroid::Clear(ClipboardBuffer buffer) {
// platforms.
void ClipboardAndroid::ReadAvailableTypes(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -425,7 +425,7 @@ void ClipboardAndroid::ReadAvailableTypes(
std::vector<base::string16>
ClipboardAndroid::ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
std::vector<ClipboardFormatType> formats = g_map.Get().GetFormats();
@@ -440,7 +440,7 @@ ClipboardAndroid::ReadAvailablePlatformSpecificFormatNames(
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardAndroid::ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -452,7 +452,7 @@ void ClipboardAndroid::ReadText(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardAndroid::ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -460,11 +460,11 @@ void ClipboardAndroid::ReadAsciiText(ClipboardBuffer buffer,
*result = g_map.Get().Get(ClipboardFormatType::GetPlainTextType());
}
-// Note: |src_url| isn't really used. It is only implemented in Windows.
+// |src_url| isn't really used. It is only implemented in Windows.
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardAndroid::ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
@@ -485,7 +485,7 @@ void ClipboardAndroid::ReadHTML(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardAndroid::ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -496,7 +496,7 @@ void ClipboardAndroid::ReadSvg(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardAndroid::ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
NOTIMPLEMENTED();
@@ -505,7 +505,7 @@ void ClipboardAndroid::ReadRTF(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardAndroid::ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -517,7 +517,7 @@ void ClipboardAndroid::ReadImage(ClipboardBuffer buffer,
// platforms.
void ClipboardAndroid::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
NOTIMPLEMENTED();
@@ -525,7 +525,7 @@ void ClipboardAndroid::ReadCustomData(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
-void ClipboardAndroid::ReadBookmark(const ClipboardDataEndpoint* data_dst,
+void ClipboardAndroid::ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const {
DCHECK(CalledOnValidThread());
@@ -535,7 +535,7 @@ void ClipboardAndroid::ReadBookmark(const ClipboardDataEndpoint* data_dst,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardAndroid::ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kData);
@@ -558,7 +558,7 @@ void ClipboardAndroid::ClearLastModifiedTime() {
void ClipboardAndroid::WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
g_map.Get().Clear();
@@ -574,7 +574,7 @@ void ClipboardAndroid::WritePortableRepresentations(
void ClipboardAndroid::WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
g_map.Get().Clear();
@@ -606,7 +606,7 @@ void ClipboardAndroid::WriteRTF(const char* rtf_data, size_t data_len) {
NOTIMPLEMENTED();
}
-// Note: according to other platforms implementations, this really writes the
+// According to other platforms implementations, this really writes the
// URL spec.
void ClipboardAndroid::WriteBookmark(const char* title_data,
size_t title_len,
diff --git a/chromium/ui/base/clipboard/clipboard_android.h b/chromium/ui/base/clipboard/clipboard_android.h
index 68ac63dd120..5a262fa3595 100644
--- a/chromium/ui/base/clipboard/clipboard_android.h
+++ b/chromium/ui/base/clipboard/clipboard_android.h
@@ -61,56 +61,56 @@ class ClipboardAndroid : public Clipboard {
uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void Clear(ClipboardBuffer buffer) override;
void ReadAvailableTypes(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const override;
std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
uint32_t* fragment_end) const override;
void ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const override;
void ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
- void ReadBookmark(const ClipboardDataEndpoint* data_dst,
+ void ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const override;
void ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
base::Time GetLastModifiedTime() const override;
void ClearLastModifiedTime() override;
void WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WriteText(const char* text_data, size_t text_len) override;
void WriteHTML(const char* markup_data,
size_t markup_len,
diff --git a/chromium/ui/base/clipboard/clipboard_android_test_support.cc b/chromium/ui/base/clipboard/clipboard_android_test_support.cc
index fa69f2ba17f..30b2d5ba81d 100644
--- a/chromium/ui/base/clipboard/clipboard_android_test_support.cc
+++ b/chromium/ui/base/clipboard/clipboard_android_test_support.cc
@@ -24,7 +24,7 @@ jboolean JNI_ClipboardAndroidTestSupport_NativeWriteHtml(
const base::android::JavaParamRef<jstring>& j_html_text) {
{
// Simulate something writing HTML to the clipboard in native.
- // NOTE: Android requires both a plaintext and HTML version.
+ // Android requires both a plaintext and HTML version.
base::string16 html_text;
base::android::ConvertJavaStringToUTF16(env, j_html_text, &html_text);
std::string url;
diff --git a/chromium/ui/base/clipboard/clipboard_constants.cc b/chromium/ui/base/clipboard/clipboard_constants.cc
index 9fafdfaeea8..a64162fdd86 100644
--- a/chromium/ui/base/clipboard/clipboard_constants.cc
+++ b/chromium/ui/base/clipboard/clipboard_constants.cc
@@ -25,7 +25,6 @@ const char kMimeTypeLinuxText[] = "TEXT";
#if !defined(OS_APPLE)
const char kMimeTypeWebCustomData[] = "chromium/x-web-custom-data";
const char kMimeTypeWebkitSmartPaste[] = "chromium/x-webkit-paste";
-const char kMimeTypePepperCustomData[] = "chromium/x-pepper-custom-data";
#endif // defined(OS_APPLE)
#if defined(OS_ANDROID)
diff --git a/chromium/ui/base/clipboard/clipboard_constants.h b/chromium/ui/base/clipboard/clipboard_constants.h
index aceeb8ea6e3..d0eea2208fb 100644
--- a/chromium/ui/base/clipboard/clipboard_constants.h
+++ b/chromium/ui/base/clipboard/clipboard_constants.h
@@ -52,8 +52,6 @@ COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
extern const char kMimeTypeWebCustomData[];
COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
extern const char kMimeTypeWebkitSmartPaste[];
-COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
-extern const char kMimeTypePepperCustomData[];
#else
// MacOS-specific Uniform Type Identifiers.
@@ -70,10 +68,6 @@ extern NSString* const kWebCustomDataPboardType;
COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
extern NSString* const kWebSmartPastePboardType;
-// Pepper custom data format type.
-COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
-extern NSString* const kPepperCustomDataPboardType;
-
// Data format used to tag the current data as confidential.
COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES)
extern NSString* const kUTTypeConfidentialData;
diff --git a/chromium/ui/base/clipboard/clipboard_constants_mac.mm b/chromium/ui/base/clipboard/clipboard_constants_mac.mm
index a7bc458f284..a7a1c8ccadd 100644
--- a/chromium/ui/base/clipboard/clipboard_constants_mac.mm
+++ b/chromium/ui/base/clipboard/clipboard_constants_mac.mm
@@ -12,8 +12,6 @@ NSString* const kImageSvg = @"public.svg-image";
// TODO(dcheng): This name is temporary. See crbug.com/106449.
NSString* const kWebCustomDataPboardType = @"org.chromium.web-custom-data";
NSString* const kWebSmartPastePboardType = @"NeXT smart paste pasteboard type";
-NSString* const kPepperCustomDataPboardType =
- @"org.chromium.pepper-custom-data";
// It is the common convention on the Mac and on iOS that password managers tag
// confidential data with the flavor "org.nspasteboard.ConcealedType". Obey this
diff --git a/chromium/ui/base/clipboard/clipboard_data.cc b/chromium/ui/base/clipboard/clipboard_data.cc
index 64f055b3266..956afe8c2fe 100644
--- a/chromium/ui/base/clipboard/clipboard_data.cc
+++ b/chromium/ui/base/clipboard/clipboard_data.cc
@@ -9,7 +9,7 @@
#include "base/notreached.h"
#include "skia/ext/skia_utils_base.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/gfx/skia_util.h"
namespace ui {
@@ -29,7 +29,7 @@ ClipboardData::ClipboardData(const ClipboardData& other) {
custom_data_data_ = other.custom_data_data_;
web_smart_paste_ = other.web_smart_paste_;
svg_data_ = other.svg_data_;
- src_ = other.src_ ? std::make_unique<ClipboardDataEndpoint>(*other.src_.get())
+ src_ = other.src_ ? std::make_unique<DataTransferEndpoint>(*other.src_.get())
: nullptr;
}
diff --git a/chromium/ui/base/clipboard/clipboard_data.h b/chromium/ui/base/clipboard/clipboard_data.h
index a9eec23d950..ac89e4f65f4 100644
--- a/chromium/ui/base/clipboard/clipboard_data.h
+++ b/chromium/ui/base/clipboard/clipboard_data.h
@@ -10,7 +10,7 @@
#include "base/component_export.h"
#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
class SkBitmap;
@@ -100,9 +100,9 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardData {
format_ |= static_cast<int>(ClipboardInternalFormat::kWeb);
}
- ClipboardDataEndpoint* source() const { return src_.get(); }
+ DataTransferEndpoint* source() const { return src_.get(); }
- void set_source(std::unique_ptr<ClipboardDataEndpoint> src) {
+ void set_source(std::unique_ptr<DataTransferEndpoint> src) {
src_ = std::move(src);
}
@@ -137,7 +137,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardData {
int format_;
// The source of the data.
- std::unique_ptr<ClipboardDataEndpoint> src_ = nullptr;
+ std::unique_ptr<DataTransferEndpoint> src_ = nullptr;
};
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_data_endpoint.cc b/chromium/ui/base/clipboard/clipboard_data_endpoint.cc
index 8fbab3cbdbe..10aed991bcb 100644
--- a/chromium/ui/base/clipboard/clipboard_data_endpoint.cc
+++ b/chromium/ui/base/clipboard/clipboard_data_endpoint.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "base/check_op.h"
#include "base/optional.h"
@@ -10,25 +10,31 @@
namespace ui {
-ClipboardDataEndpoint::ClipboardDataEndpoint(const url::Origin& origin)
- : type_(EndpointType::kUrl), origin_(origin) {}
-
-ClipboardDataEndpoint::ClipboardDataEndpoint(EndpointType type)
- : type_(type), origin_(base::nullopt) {
+DataTransferEndpoint::DataTransferEndpoint(const url::Origin& origin,
+ bool notify_if_restricted)
+ : type_(EndpointType::kUrl),
+ origin_(origin),
+ notify_if_restricted_(notify_if_restricted) {}
+
+DataTransferEndpoint::DataTransferEndpoint(EndpointType type,
+ bool notify_if_restricted)
+ : type_(type),
+ origin_(base::nullopt),
+ notify_if_restricted_(notify_if_restricted) {
DCHECK_NE(type, EndpointType::kUrl);
}
-ClipboardDataEndpoint::ClipboardDataEndpoint(
- const ClipboardDataEndpoint& other) = default;
+DataTransferEndpoint::DataTransferEndpoint(const DataTransferEndpoint& other) =
+ default;
-ClipboardDataEndpoint::ClipboardDataEndpoint(ClipboardDataEndpoint&& other) =
+DataTransferEndpoint::DataTransferEndpoint(DataTransferEndpoint&& other) =
default;
-bool ClipboardDataEndpoint::operator==(
- const ClipboardDataEndpoint& other) const {
- return origin_ == other.origin_ && type_ == other.type_;
+bool DataTransferEndpoint::operator==(const DataTransferEndpoint& other) const {
+ return origin_ == other.origin_ && type_ == other.type_ &&
+ notify_if_restricted_ == other.notify_if_restricted_;
}
-ClipboardDataEndpoint::~ClipboardDataEndpoint() = default;
+DataTransferEndpoint::~DataTransferEndpoint() = default;
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_data_endpoint.h b/chromium/ui/base/clipboard/clipboard_data_endpoint.h
deleted file mode 100644
index 9e6f12dfd96..00000000000
--- a/chromium/ui/base/clipboard/clipboard_data_endpoint.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_DATA_ENDPOINT_H_
-#define UI_BASE_CLIPBOARD_CLIPBOARD_DATA_ENDPOINT_H_
-
-#include "base/optional.h"
-#include "base/stl_util.h"
-#include "url/origin.h"
-
-namespace ui {
-
-// EndpointType can represent either the source of the clipboard data or the
-// destination trying to read the clipboard data.
-// Whenever a new format is supported, a new enum should be added.
-enum class EndpointType {
-#if defined(OS_CHROMEOS) || (OS_LINUX) || (OS_FUCHSIA)
- kGuestOs = 0, // Guest OS: PluginVM, Crostini.
-#endif // defined(OS_CHROMEOS) || (OS_LINUX) || (OS_FUCHSIA)
-#if defined(OS_CHROMEOS)
- kArc = 1, // ARC.
-#endif // defined(OS_CHROMEOS)
- kUrl = 2, // Website URL e.g. www.example.com.
- kClipboardHistory = 3, // Clipboard History UI has privileged access to any
- // clipboard data.
- kMaxValue = kClipboardHistory
-};
-
-// ClipboardDataEndpoint can represent:
-// - The source of the data in the clipboard.
-// - The destination trying to access the clipboard data.
-class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardDataEndpoint {
- public:
- explicit ClipboardDataEndpoint(const url::Origin& origin);
- // This constructor shouldn't be used if |type| == EndpointType::kUrl.
- explicit ClipboardDataEndpoint(EndpointType type);
-
- ClipboardDataEndpoint(const ClipboardDataEndpoint& other);
- ClipboardDataEndpoint(ClipboardDataEndpoint&& other);
-
- ClipboardDataEndpoint& operator=(const ClipboardDataEndpoint& other) = delete;
- ClipboardDataEndpoint& operator=(ClipboardDataEndpoint&& other) = delete;
-
- bool operator==(const ClipboardDataEndpoint& other) const;
-
- ~ClipboardDataEndpoint();
-
- bool IsUrlType() const { return type_ == EndpointType::kUrl; }
-
- const url::Origin* origin() const { return base::OptionalOrNullptr(origin_); }
-
- EndpointType type() const { return type_; }
-
- private:
- // This variable should always have a value representing the object type.
- const EndpointType type_;
- // The url::Origin of the data endpoint. It always has a value if |type_| ==
- // EndpointType::kUrl, otherwise it's empty.
- const base::Optional<url::Origin> origin_;
-};
-
-} // namespace ui
-
-#endif // UI_BASE_CLIPBOARD_CLIPBOARD_DATA_ENDPOINT_H_
diff --git a/chromium/ui/base/clipboard/clipboard_data_unittest.cc b/chromium/ui/base/clipboard/clipboard_data_unittest.cc
index f0a0c784736..627793fd3c1 100644
--- a/chromium/ui/base/clipboard/clipboard_data_unittest.cc
+++ b/chromium/ui/base/clipboard/clipboard_data_unittest.cc
@@ -8,7 +8,7 @@
#include "base/strings/string_piece_forward.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "url/gurl.h"
namespace ui {
@@ -34,12 +34,12 @@ TEST(ClipboardDataTest, BitMapTest) {
TEST(ClipboardDataTest, DataSrcTest) {
url::Origin origin(url::Origin::Create(GURL("www.example.com")));
ClipboardData data1;
- data1.set_source(std::make_unique<ClipboardDataEndpoint>(origin));
+ data1.set_source(std::make_unique<DataTransferEndpoint>(origin));
ClipboardData data2;
EXPECT_NE(data1, data2);
- data2.set_source(std::make_unique<ClipboardDataEndpoint>(origin));
+ data2.set_source(std::make_unique<DataTransferEndpoint>(origin));
EXPECT_EQ(data1, data2);
}
diff --git a/chromium/ui/base/clipboard/clipboard_dlp_controller.cc b/chromium/ui/base/clipboard/clipboard_dlp_controller.cc
deleted file mode 100644
index 5ab980182c9..00000000000
--- a/chromium/ui/base/clipboard/clipboard_dlp_controller.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/clipboard/clipboard_dlp_controller.h"
-
-namespace ui {
-
-// static
-ClipboardDlpController* ClipboardDlpController::Get() {
- return g_clipboard_dlp_controller_;
-}
-
-// static
-void ClipboardDlpController::DeleteInstance() {
- if (!g_clipboard_dlp_controller_)
- return;
-
- delete g_clipboard_dlp_controller_;
-}
-
-ClipboardDlpController::ClipboardDlpController() {
- g_clipboard_dlp_controller_ = this;
-}
-
-ClipboardDlpController::~ClipboardDlpController() {
- g_clipboard_dlp_controller_ = nullptr;
-}
-
-ClipboardDlpController* ClipboardDlpController::g_clipboard_dlp_controller_ =
- nullptr;
-
-} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_dlp_controller.h b/chromium/ui/base/clipboard/clipboard_dlp_controller.h
deleted file mode 100644
index 8fca4a43961..00000000000
--- a/chromium/ui/base/clipboard/clipboard_dlp_controller.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_DLP_CONTROLLER_H_
-#define UI_BASE_CLIPBOARD_CLIPBOARD_DLP_CONTROLLER_H_
-
-#include "base/component_export.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
-
-namespace ui {
-
-// The Clipboard Data Leak Prevention controller is used to control clipboard
-// read operations. It should allow/disallow clipboard data read given the
-// source of the data and the destination trying to access the data and a set of
-// rules controlling these source and destination.
-class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardDlpController {
- public:
- // Returns a pointer to the existing instance of the class.
- static ClipboardDlpController* Get();
-
- // Deletes the existing instance of the class if it's already created.
- // Indicates that restricting clipboard content is no longer required.
- static void DeleteInstance();
-
- virtual bool IsDataReadAllowed(
- const ClipboardDataEndpoint* const data_src,
- const ClipboardDataEndpoint* const data_dst) const = 0;
-
- protected:
- ClipboardDlpController();
- virtual ~ClipboardDlpController();
-
- private:
- // A singleton of ClipboardDlpController. Equals nullptr when there's not any
- // clipboard restrictions required.
- static ClipboardDlpController* g_clipboard_dlp_controller_;
-};
-
-} // namespace ui
-
-#endif // UI_BASE_CLIPBOARD_CLIPBOARD_DLP_CONTROLLER_H_
diff --git a/chromium/ui/base/clipboard/clipboard_format_type.h b/chromium/ui/base/clipboard/clipboard_format_type.h
index 687a0f87ed1..b5944b0ef7e 100644
--- a/chromium/ui/base/clipboard/clipboard_format_type.h
+++ b/chromium/ui/base/clipboard/clipboard_format_type.h
@@ -62,10 +62,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD_TYPES) ClipboardFormatType {
static const ClipboardFormatType& GetSvgType();
static const ClipboardFormatType& GetRtfType();
static const ClipboardFormatType& GetBitmapType();
- // TODO(raymes): Unify web custom data and pepper custom data:
- // crbug.com/158399.
static const ClipboardFormatType& GetWebCustomDataType();
- static const ClipboardFormatType& GetPepperCustomDataType();
#if defined(OS_WIN)
// ANSI formats. Only Windows differentiates between ANSI and UNICODE formats
diff --git a/chromium/ui/base/clipboard/clipboard_format_type_android.cc b/chromium/ui/base/clipboard/clipboard_format_type_android.cc
index 12a132edf1c..e773978a379 100644
--- a/chromium/ui/base/clipboard/clipboard_format_type_android.cc
+++ b/chromium/ui/base/clipboard/clipboard_format_type_android.cc
@@ -95,11 +95,4 @@ const ClipboardFormatType& ClipboardFormatType::GetWebCustomDataType() {
return *type;
}
-// static
-const ClipboardFormatType& ClipboardFormatType::GetPepperCustomDataType() {
- static base::NoDestructor<ClipboardFormatType> type(
- kMimeTypePepperCustomData);
- return *type;
-}
-
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_format_type_aura.cc b/chromium/ui/base/clipboard/clipboard_format_type_aura.cc
index 1d35f357e43..06e2293c01a 100644
--- a/chromium/ui/base/clipboard/clipboard_format_type_aura.cc
+++ b/chromium/ui/base/clipboard/clipboard_format_type_aura.cc
@@ -98,11 +98,4 @@ const ClipboardFormatType& ClipboardFormatType::GetWebCustomDataType() {
return *type;
}
-// static
-const ClipboardFormatType& ClipboardFormatType::GetPepperCustomDataType() {
- static base::NoDestructor<ClipboardFormatType> type(
- kMimeTypePepperCustomData);
- return *type;
-}
-
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_format_type_mac.mm b/chromium/ui/base/clipboard/clipboard_format_type_mac.mm
index 376bebae39e..3ee36e5bd9c 100644
--- a/chromium/ui/base/clipboard/clipboard_format_type_mac.mm
+++ b/chromium/ui/base/clipboard/clipboard_format_type_mac.mm
@@ -110,11 +110,4 @@ const ClipboardFormatType& ClipboardFormatType::GetWebCustomDataType() {
return *type;
}
-// static
-const ClipboardFormatType& ClipboardFormatType::GetPepperCustomDataType() {
- static base::NoDestructor<ClipboardFormatType> type(
- kPepperCustomDataPboardType);
- return *type;
-}
-
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_format_type_win.cc b/chromium/ui/base/clipboard/clipboard_format_type_win.cc
index b0d0a9249df..7e7516fa801 100644
--- a/chromium/ui/base/clipboard/clipboard_format_type_win.cc
+++ b/chromium/ui/base/clipboard/clipboard_format_type_win.cc
@@ -23,35 +23,37 @@ const base::flat_map<UINT, std::string>& PredefinedFormatToNameMap() {
static const base::NoDestructor<base::flat_map<UINT, std::string>>
format_to_name({
{CF_TEXT, "CF_TEXT"},
- {CF_BITMAP, "CF_BITMAP"},
- {CF_METAFILEPICT, "CF_METAFILEPICT"},
- {CF_SYLK, "CF_SYLK"},
{CF_DIF, "CF_DIF"},
{CF_TIFF, "CF_TIFF"},
{CF_OEMTEXT, "CF_OEMTEXT"},
{CF_DIB, "CF_DIB"},
- {CF_PALETTE, "CF_PALETTE"},
{CF_PENDATA, "CF_PENDATA"},
{CF_RIFF, "CF_RIFF"},
{CF_WAVE, "CF_WAVE"},
{CF_UNICODETEXT, "CF_UNICODETEXT"},
- {CF_ENHMETAFILE, "CF_ENHMETAFILE"},
- {CF_HDROP, "CF_HDROP"},
- {CF_LOCALE, "CF_LOCALE"},
{CF_DIBV5, "CF_DIBV5"},
{CF_OWNERDISPLAY, "CF_OWNERDISPLAY"},
- {CF_DSPTEXT, "CF_DSPTEXT"},
- {CF_DSPBITMAP, "CF_DSPBITMAP"},
- {CF_DSPMETAFILEPICT, "CF_DSPMETAFILEPICT"},
- {CF_DSPENHMETAFILE, "CF_DSPENHMETAFILE"},
-
- // These formats are predefined but explicitly blocked from use.
- // TODO(huangdarwin): Which other formats should always be disallowed?
- // {CF_MAX, "CF_MAX"},
- // {CF_PRIVATEFIRST, "CF_PRIVATEFIRST"},
- // {CF_PRIVATELAST, "CF_PRIVATELAST"},
- // {CF_GDIOBJFIRST, "CF_GDIOBJFIRST"},
- // {CF_GDIOBJLAST, "CF_GDIOBJLAST"},
+
+ // These formats are predefined but explicitly blocked from use,
+ // either due to passing along handles, or concerns regarding exposing
+ // private information.
+ // {CF_MAX, "CF_MAX"},
+ // {CF_PRIVATEFIRST, "CF_PRIVATEFIRST"},
+ // {CF_PRIVATELAST, "CF_PRIVATELAST"},
+ // {CF_GDIOBJFIRST, "CF_GDIOBJFIRST"},
+ // {CF_GDIOBJLAST, "CF_GDIOBJLAST"},
+ // {CF_BITMAP, "CF_BITMAP"},
+ // {CF_SYLK, "CF_SYLK"},
+ // {CF_METAFILEPICT, "CF_METAFILEPICT"},
+ // {CF_DSPTEXT, "CF_DSPTEXT"},
+ // {CF_DSPBITMAP, "CF_DSPBITMAP"},
+ // {CF_DSPMETAFILEPICT, "CF_DSPMETAFILEPICT"},
+ // {CF_DSPENHMETAFILE, "CF_DSPENHMETAFILE"},
+ // {CF_ENHMETAFILE, "CF_ENHMETAFILE"},
+ // {CF_HDROP, "CF_HDROP"},
+ // {CF_LOCALE, "CF_LOCALE"},
+ // {CF_PALETTE, "CF_PALETTE"},
+
});
return *format_to_name;
}
@@ -135,7 +137,7 @@ std::string ClipboardFormatType::GetName() const {
return std::string();
}
- return base::UTF16ToUTF8(base::string16(name_buffer->data(), name_size));
+ return base::WideToUTF8(std::wstring(name_buffer->data(), name_size));
}
bool ClipboardFormatType::operator<(const ClipboardFormatType& other) const {
@@ -157,7 +159,7 @@ ClipboardFormatType ClipboardFormatType::GetType(
return ClipboardFormatType(it->second);
return ClipboardFormatType(
- ::RegisterClipboardFormat(base::ASCIIToUTF16(format_string).c_str()));
+ ::RegisterClipboardFormat(base::ASCIIToWide(format_string).c_str()));
}
// The following formats can be referenced by ClipboardUtilWin::GetPlainText.
@@ -263,7 +265,7 @@ const ClipboardFormatType& ClipboardFormatType::GetFileDescriptorType() {
// static
const ClipboardFormatType& ClipboardFormatType::GetFileContentZeroType() {
- // Note this uses a storage media type of TYMED_HGLOBAL, which is not commonly
+ // This uses a storage media type of TYMED_HGLOBAL, which is not commonly
// used with CFSTR_FILECONTENTS (but used in Chromium--see
// OSExchangeDataProviderWin::SetFileContents). Use GetFileContentAtIndexType
// if TYMED_ISTREAM and TYMED_ISTORAGE are needed.
@@ -333,11 +335,4 @@ const ClipboardFormatType& ClipboardFormatType::GetWebCustomDataType() {
return *format;
}
-// static
-const ClipboardFormatType& ClipboardFormatType::GetPepperCustomDataType() {
- static base::NoDestructor<ClipboardFormatType> format(
- ::RegisterClipboardFormat(L"Chromium Pepper MIME Data Format"));
- return *format;
-}
-
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_mac.h b/chromium/ui/base/clipboard/clipboard_mac.h
index f220aa72ca4..b556901af5d 100644
--- a/chromium/ui/base/clipboard/clipboard_mac.h
+++ b/chromium/ui/base/clipboard/clipboard_mac.h
@@ -33,55 +33,55 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardMac : public Clipboard {
uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
bool IsMarkedByOriginatorAsConfidential() const override;
void MarkAsConfidential() override;
void Clear(ClipboardBuffer buffer) override;
void ReadAvailableTypes(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const override;
std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
uint32_t* fragment_end) const override;
void ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const override;
void ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
- void ReadBookmark(const ClipboardDataEndpoint* data_dst,
+ void ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const override;
void ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WriteText(const char* text_data, size_t text_len) override;
void WriteHTML(const char* markup_data,
size_t markup_len,
diff --git a/chromium/ui/base/clipboard/clipboard_mac.mm b/chromium/ui/base/clipboard/clipboard_mac.mm
index 2c1487fb632..67cb135e387 100644
--- a/chromium/ui/base/clipboard/clipboard_mac.mm
+++ b/chromium/ui/base/clipboard/clipboard_mac.mm
@@ -24,10 +24,10 @@
#import "third_party/mozilla/NSPasteboard+Utils.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
#include "ui/base/clipboard/clipboard_metrics.h"
#include "ui/base/clipboard/clipboard_util_mac.h"
#include "ui/base/clipboard/custom_data_helper.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
@@ -75,7 +75,7 @@ uint64_t ClipboardMac::GetSequenceNumber(ClipboardBuffer buffer) const {
bool ClipboardMac::IsFormatAvailable(
const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -124,7 +124,7 @@ void ClipboardMac::Clear(ClipboardBuffer buffer) {
// platforms.
void ClipboardMac::ReadAvailableTypes(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const {
DCHECK(CalledOnValidThread());
DCHECK(types);
@@ -156,7 +156,7 @@ void ClipboardMac::ReadAvailableTypes(
std::vector<base::string16>
ClipboardMac::ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -173,7 +173,7 @@ ClipboardMac::ReadAvailablePlatformSpecificFormatNames(
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardMac::ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -187,7 +187,7 @@ void ClipboardMac::ReadText(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardMac::ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -204,7 +204,7 @@ void ClipboardMac::ReadAsciiText(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardMac::ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
@@ -237,7 +237,7 @@ void ClipboardMac::ReadHTML(ClipboardBuffer buffer,
}
void ClipboardMac::ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -251,7 +251,7 @@ void ClipboardMac::ReadSvg(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardMac::ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -263,7 +263,7 @@ void ClipboardMac::ReadRTF(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardMac::ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const {
RecordRead(ClipboardFormatMetric::kImage);
std::move(callback).Run(ReadImageInternal(buffer, GetPasteboard()));
@@ -273,7 +273,7 @@ void ClipboardMac::ReadImage(ClipboardBuffer buffer,
// platforms.
void ClipboardMac::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -289,7 +289,7 @@ void ClipboardMac::ReadCustomData(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
-void ClipboardMac::ReadBookmark(const ClipboardDataEndpoint* data_dst,
+void ClipboardMac::ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const {
DCHECK(CalledOnValidThread());
@@ -313,7 +313,7 @@ void ClipboardMac::ReadBookmark(const ClipboardDataEndpoint* data_dst,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardMac::ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kData);
@@ -328,7 +328,7 @@ void ClipboardMac::ReadData(const ClipboardFormatType& format,
void ClipboardMac::WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
@@ -344,7 +344,7 @@ void ClipboardMac::WritePortableRepresentations(
void ClipboardMac::WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
diff --git a/chromium/ui/base/clipboard/clipboard_non_backed.cc b/chromium/ui/base/clipboard/clipboard_non_backed.cc
index a53ca0a33d1..05513ec8398 100644
--- a/chromium/ui/base/clipboard/clipboard_non_backed.cc
+++ b/chromium/ui/base/clipboard/clipboard_non_backed.cc
@@ -24,12 +24,12 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_constants.h"
#include "ui/base/clipboard/clipboard_data.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
-#include "ui/base/clipboard/clipboard_dlp_controller.h"
#include "ui/base/clipboard/clipboard_format_type.h"
#include "ui/base/clipboard/clipboard_metrics.h"
#include "ui/base/clipboard/clipboard_monitor.h"
#include "ui/base/clipboard/custom_data_helper.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
+#include "ui/base/data_transfer_policy/data_transfer_policy_controller.h"
#include "ui/gfx/geometry/size.h"
#include "ui/ozone/buildflags.h"
@@ -240,12 +240,13 @@ class ClipboardInternal {
return previous_data;
}
- bool IsReadAllowed(const ClipboardDataEndpoint* data_dst) const {
- ClipboardDlpController* dlp_controller = ClipboardDlpController::Get();
+ bool IsReadAllowed(const DataTransferEndpoint* data_dst) const {
+ DataTransferPolicyController* policy_controller =
+ DataTransferPolicyController::Get();
auto* data = GetData();
- if (!dlp_controller || !data)
+ if (!policy_controller || !data)
return true;
- return dlp_controller->IsDataReadAllowed(data->source(), data_dst);
+ return policy_controller->IsDataReadAllowed(data->source(), data_dst);
}
private:
@@ -271,7 +272,7 @@ class ClipboardDataBuilder {
// confidential and the data can be pasted in any document.
static void CommitToClipboard(
ClipboardInternal* clipboard,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
ClipboardData* data = GetCurrentData();
data->set_source(std::move(data_src));
clipboard->WriteData(TakeCurrentData());
@@ -375,7 +376,7 @@ ClipboardNonBacked::~ClipboardNonBacked() {
}
const ClipboardData* ClipboardNonBacked::GetClipboardData(
- ClipboardDataEndpoint* data_dst) const {
+ DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
if (!clipboard_internal_->IsReadAllowed(data_dst))
@@ -400,7 +401,7 @@ uint64_t ClipboardNonBacked::GetSequenceNumber(ClipboardBuffer buffer) const {
bool ClipboardNonBacked::IsFormatAvailable(
const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
@@ -438,7 +439,7 @@ void ClipboardNonBacked::Clear(ClipboardBuffer buffer) {
void ClipboardNonBacked::ReadAvailableTypes(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const {
DCHECK(CalledOnValidThread());
DCHECK(types);
@@ -472,7 +473,7 @@ void ClipboardNonBacked::ReadAvailableTypes(
std::vector<base::string16>
ClipboardNonBacked::ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
std::vector<base::string16> types;
@@ -503,7 +504,7 @@ ClipboardNonBacked::ReadAvailablePlatformSpecificFormatNames(
}
void ClipboardNonBacked::ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
@@ -519,7 +520,7 @@ void ClipboardNonBacked::ReadText(ClipboardBuffer buffer,
}
void ClipboardNonBacked::ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
@@ -535,7 +536,7 @@ void ClipboardNonBacked::ReadAsciiText(ClipboardBuffer buffer,
}
void ClipboardNonBacked::ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
@@ -554,7 +555,7 @@ void ClipboardNonBacked::ReadHTML(ClipboardBuffer buffer,
}
void ClipboardNonBacked::ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
@@ -566,7 +567,7 @@ void ClipboardNonBacked::ReadSvg(ClipboardBuffer buffer,
}
void ClipboardNonBacked::ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
@@ -582,7 +583,7 @@ void ClipboardNonBacked::ReadRTF(ClipboardBuffer buffer,
}
void ClipboardNonBacked::ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const {
DCHECK(CalledOnValidThread());
@@ -601,7 +602,7 @@ void ClipboardNonBacked::ReadImage(ClipboardBuffer buffer,
void ClipboardNonBacked::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
@@ -616,7 +617,7 @@ void ClipboardNonBacked::ReadCustomData(ClipboardBuffer buffer,
#endif
}
-void ClipboardNonBacked::ReadBookmark(const ClipboardDataEndpoint* data_dst,
+void ClipboardNonBacked::ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const {
DCHECK(CalledOnValidThread());
@@ -633,7 +634,7 @@ void ClipboardNonBacked::ReadBookmark(const ClipboardDataEndpoint* data_dst,
}
void ClipboardNonBacked::ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
@@ -649,13 +650,17 @@ void ClipboardNonBacked::ReadData(const ClipboardFormatType& format,
}
bool ClipboardNonBacked::IsSelectionBufferAvailable() const {
+#if defined(OS_CHROMEOS)
return false;
+#else
+ return true;
+#endif
}
void ClipboardNonBacked::WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
for (const auto& object : objects)
@@ -667,7 +672,7 @@ void ClipboardNonBacked::WritePortableRepresentations(
void ClipboardNonBacked::WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
diff --git a/chromium/ui/base/clipboard/clipboard_non_backed.h b/chromium/ui/base/clipboard/clipboard_non_backed.h
index 76dee9c24ed..a9fa8b39c44 100644
--- a/chromium/ui/base/clipboard/clipboard_non_backed.h
+++ b/chromium/ui/base/clipboard/clipboard_non_backed.h
@@ -26,19 +26,22 @@ class ClipboardInternal;
class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardNonBacked
: public Clipboard {
public:
- // Returns the in-memory clipboard for the current thread. Note that this
+ // Returns the in-memory clipboard for the current thread. This
// method must *only* be used when the caller is sure that the clipboard for
// the current thread is in fact an instance of ClipboardNonBacked.
static ClipboardNonBacked* GetForCurrentThread();
// Returns the current ClipboardData.
- const ClipboardData* GetClipboardData(ClipboardDataEndpoint* data_dst) const;
+ const ClipboardData* GetClipboardData(DataTransferEndpoint* data_dst) const;
// Writes the current ClipboardData and returns the previous data.
// The data source is expected to be set in `data`.
std::unique_ptr<ClipboardData> WriteClipboardData(
std::unique_ptr<ClipboardData> data);
+ // Clipboard overrides:
+ uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
+
private:
friend class Clipboard;
friend class ClipboardNonBackedTest;
@@ -47,57 +50,56 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardNonBacked
// Clipboard overrides:
void OnPreShutdown() override;
- uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void Clear(ClipboardBuffer buffer) override;
void ReadAvailableTypes(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const override;
std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
uint32_t* fragment_end) const override;
void ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const override;
void ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
- void ReadBookmark(const ClipboardDataEndpoint* data_dst,
+ void ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const override;
void ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
bool IsSelectionBufferAvailable() const override;
void WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WriteText(const char* text_data, size_t text_len) override;
void WriteHTML(const char* markup_data,
size_t markup_len,
diff --git a/chromium/ui/base/clipboard/clipboard_ozone.cc b/chromium/ui/base/clipboard/clipboard_ozone.cc
index 4c97d862b6f..774c8848ddf 100644
--- a/chromium/ui/base/clipboard/clipboard_ozone.cc
+++ b/chromium/ui/base/clipboard/clipboard_ozone.cc
@@ -19,10 +19,10 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_buffer.h"
#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
#include "ui/base/clipboard/clipboard_metrics.h"
#include "ui/base/clipboard/clipboard_monitor.h"
#include "ui/base/clipboard/custom_data_helper.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/ozone/buildflags.h"
#include "ui/ozone/public/ozone_platform.h"
@@ -351,7 +351,7 @@ uint64_t ClipboardOzone::GetSequenceNumber(ClipboardBuffer buffer) const {
bool ClipboardOzone::IsFormatAvailable(
const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
auto available_types = async_clipboard_ozone_->RequestMimeTypes(buffer);
@@ -365,7 +365,7 @@ void ClipboardOzone::Clear(ClipboardBuffer buffer) {
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadAvailableTypes(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const {
DCHECK(CalledOnValidThread());
DCHECK(types);
@@ -391,7 +391,7 @@ void ClipboardOzone::ReadAvailableTypes(
std::vector<base::string16>
ClipboardOzone::ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
std::vector<std::string> mime_types =
@@ -405,7 +405,7 @@ ClipboardOzone::ReadAvailablePlatformSpecificFormatNames(
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kText);
@@ -418,7 +418,7 @@ void ClipboardOzone::ReadText(ClipboardBuffer buffer,
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kText);
@@ -430,7 +430,7 @@ void ClipboardOzone::ReadAsciiText(ClipboardBuffer buffer,
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
@@ -454,7 +454,7 @@ void ClipboardOzone::ReadHTML(ClipboardBuffer buffer,
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kSvg);
@@ -467,7 +467,7 @@ void ClipboardOzone::ReadSvg(ClipboardBuffer buffer,
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kRtf);
@@ -479,7 +479,7 @@ void ClipboardOzone::ReadRTF(ClipboardBuffer buffer,
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const {
RecordRead(ClipboardFormatMetric::kImage);
std::move(callback).Run(ReadImageInternal(buffer));
@@ -488,7 +488,7 @@ void ClipboardOzone::ReadImage(ClipboardBuffer buffer,
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kCustomData);
@@ -499,7 +499,7 @@ void ClipboardOzone::ReadCustomData(ClipboardBuffer buffer,
}
// TODO(crbug.com/1103194): |data_dst| should be supported.
-void ClipboardOzone::ReadBookmark(const ClipboardDataEndpoint* data_dst,
+void ClipboardOzone::ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const {
DCHECK(CalledOnValidThread());
@@ -509,7 +509,7 @@ void ClipboardOzone::ReadBookmark(const ClipboardDataEndpoint* data_dst,
// TODO(crbug.com/1103194): |data_dst| should be supported.
void ClipboardOzone::ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kData);
@@ -527,7 +527,7 @@ bool ClipboardOzone::IsSelectionBufferAvailable() const {
void ClipboardOzone::WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
for (const auto& object : objects)
@@ -555,7 +555,7 @@ void ClipboardOzone::WritePortableRepresentations(
void ClipboardOzone::WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DispatchPlatformRepresentations(std::move(platform_representations));
diff --git a/chromium/ui/base/clipboard/clipboard_ozone.h b/chromium/ui/base/clipboard/clipboard_ozone.h
index 43f7b5c2651..b46a7c5703e 100644
--- a/chromium/ui/base/clipboard/clipboard_ozone.h
+++ b/chromium/ui/base/clipboard/clipboard_ozone.h
@@ -28,54 +28,54 @@ class ClipboardOzone : public Clipboard {
uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void Clear(ClipboardBuffer buffer) override;
void ReadAvailableTypes(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const override;
std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
uint32_t* fragment_end) const override;
void ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const override;
void ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
- void ReadBookmark(const ClipboardDataEndpoint* data_dst,
+ void ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const override;
void ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
bool IsSelectionBufferAvailable() const override;
void WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WriteText(const char* text_data, size_t text_len) override;
void WriteHTML(const char* markup_data,
size_t markup_len,
diff --git a/chromium/ui/base/clipboard/clipboard_test_template.h b/chromium/ui/base/clipboard/clipboard_test_template.h
index 372a758cd79..7be5cd2d0b8 100644
--- a/chromium/ui/base/clipboard/clipboard_test_template.h
+++ b/chromium/ui/base/clipboard/clipboard_test_template.h
@@ -1,8 +1,8 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
-// Note: This header doesn't use REGISTER_TYPED_TEST_SUITE_P like most
+// This header doesn't use REGISTER_TYPED_TEST_SUITE_P like most
// type-parameterized gtests. There are lot of test cases in here that are only
// enabled on certain platforms. However, preprocessor directives in macro
// arguments result in undefined behavior (and don't work on MSVC). Instead,
@@ -39,11 +39,11 @@
#include "third_party/skia/include/core/SkUnPreMultiply.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
-#include "ui/base/clipboard/clipboard_dlp_controller.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "ui/base/clipboard/test/clipboard_test_util.h"
#include "ui/base/clipboard/test/test_clipboard.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
+#include "ui/base/data_transfer_policy/data_transfer_policy_controller.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/half_float.h"
#include "url/origin.h"
@@ -58,8 +58,8 @@
#endif
using base::ASCIIToUTF16;
-using base::UTF8ToUTF16;
using base::UTF16ToUTF8;
+using base::UTF8ToUTF16;
using testing::Contains;
@@ -104,27 +104,19 @@ class ClipboardTest : public PlatformTest {
};
// A mock delegate for testing.
-class MockClipboardDlpController : public ClipboardDlpController {
+class MockPolicyController : public DataTransferPolicyController {
public:
- static MockClipboardDlpController* Init();
+ MockPolicyController();
+ ~MockPolicyController() override;
MOCK_CONST_METHOD2(IsDataReadAllowed,
- bool(const ClipboardDataEndpoint* const data_src,
- const ClipboardDataEndpoint* const data_dst));
-
- private:
- MockClipboardDlpController();
- ~MockClipboardDlpController() override;
+ bool(const DataTransferEndpoint* const data_src,
+ const DataTransferEndpoint* const data_dst));
};
-// static
-MockClipboardDlpController* MockClipboardDlpController::Init() {
- return new MockClipboardDlpController();
-}
+MockPolicyController::MockPolicyController() = default;
-MockClipboardDlpController::MockClipboardDlpController() = default;
-
-MockClipboardDlpController::~MockClipboardDlpController() = default;
+MockPolicyController::~MockPolicyController() = default;
// Hack for tests that need to call static methods of ClipboardTest.
struct NullClipboardTraits {
@@ -270,10 +262,10 @@ TYPED_TEST(ClipboardTest, RTFTest) {
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
TYPED_TEST(ClipboardTest, MultipleBufferTest) {
-#if defined(USE_OZONE)
- if (!this->clipboard().IsSelectionBufferAvailable())
+ if (!ui::Clipboard::IsSupportedClipboardBuffer(
+ ui::ClipboardBuffer::kSelection)) {
return;
-#endif
+ }
base::string16 text(ASCIIToUTF16("Standard")), text_result;
base::string16 markup(ASCIIToUTF16("<string>Selection</string>"));
@@ -753,18 +745,28 @@ TYPED_TEST(ClipboardTest, ReadAvailablePlatformSpecificFormatNamesTest) {
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("public.utf8-plain-text")));
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("NSStringPboardType")));
EXPECT_EQ(raw_types.size(), static_cast<uint64_t>(2));
-#elif defined(USE_X11)
+#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) && \
+ !BUILDFLAG(IS_CHROMECAST) && !BUILDFLAG(IS_LACROS)
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16(kMimeTypeText)));
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("TEXT")));
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("STRING")));
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("UTF8_STRING")));
+#if defined(USE_OZONE)
+ if (features::IsUsingOzonePlatform()) {
+ EXPECT_THAT(raw_types, Contains(ASCIIToUTF16(kMimeTypeTextUtf8)));
+ EXPECT_EQ(raw_types.size(), static_cast<uint64_t>(5));
+ return;
+ }
+#endif // USE_OZONE
+#if defined(USE_X11)
+ EXPECT_FALSE(features::IsUsingOzonePlatform());
EXPECT_EQ(raw_types.size(), static_cast<uint64_t>(4));
+#endif // USE_X11
#elif defined(OS_WIN)
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("CF_UNICODETEXT")));
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("CF_TEXT")));
- EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("CF_LOCALE")));
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16("CF_OEMTEXT")));
- EXPECT_EQ(raw_types.size(), static_cast<uint64_t>(4));
+ EXPECT_EQ(raw_types.size(), static_cast<uint64_t>(3));
#elif defined(USE_AURA) || defined(OS_ANDROID)
EXPECT_THAT(raw_types, Contains(ASCIIToUTF16(kMimeTypeText)));
EXPECT_EQ(raw_types.size(), static_cast<uint64_t>(1));
@@ -829,7 +831,7 @@ TYPED_TEST(ClipboardTest, PlatformSpecificDataTest) {
this->clipboard().ReadAsciiText(ClipboardBuffer::kCopyPaste,
/* data_dst = */ nullptr, &text_result);
EXPECT_EQ(text_result, text);
- // Note: Windows will automatically convert CF_TEXT to its UNICODE version.
+ // Windows will automatically convert CF_TEXT to its UNICODE version.
EXPECT_TRUE(this->clipboard().IsFormatAvailable(
ClipboardFormatType::GetPlainTextType(), ClipboardBuffer::kCopyPaste,
/* data_dst = */ nullptr));
@@ -1017,59 +1019,56 @@ TYPED_TEST(ClipboardTest, WriteImageEmptyParams) {
scw.WriteImage(SkBitmap());
}
-// DLP is only intended to be used in Chrome OS, so the following DLP related
-// tests are only run on Chrome OS.
+// Policy controller is only intended to be used in Chrome OS, so the following
+// policy related tests are only run on Chrome OS.
#if defined(OS_CHROMEOS)
-// Test that copy/paste would work normally if the dlp controller didn't
+// Test that copy/paste would work normally if the policy controller didn't
// restrict the clipboard data.
-TYPED_TEST(ClipboardTest, DlpAllowDataRead) {
- auto* dlp_controller = MockClipboardDlpController::Init();
+TYPED_TEST(ClipboardTest, PolicyAllowDataRead) {
+ auto policy_controller = std::make_unique<MockPolicyController>();
const base::string16 kTestText(base::UTF8ToUTF16("World"));
{
ScopedClipboardWriter writer(
ClipboardBuffer::kCopyPaste,
- std::make_unique<ClipboardDataEndpoint>(url::Origin()));
+ std::make_unique<DataTransferEndpoint>(url::Origin()));
writer.WriteText(kTestText);
}
- EXPECT_CALL(*dlp_controller, IsDataReadAllowed)
+ EXPECT_CALL(*policy_controller, IsDataReadAllowed)
.WillRepeatedly(testing::Return(true));
base::string16 read_result;
this->clipboard().ReadText(ClipboardBuffer::kCopyPaste,
/* data_dst = */ nullptr, &read_result);
- ::testing::Mock::VerifyAndClearExpectations(dlp_controller);
+ ::testing::Mock::VerifyAndClearExpectations(policy_controller.get());
EXPECT_EQ(kTestText, read_result);
- MockClipboardDlpController::DeleteInstance();
}
-// Test that pasting clipboard data would not work if the dlp controller
+// Test that pasting clipboard data would not work if the policy controller
// restricted it.
-TYPED_TEST(ClipboardTest, DlpDisallow_ReadText) {
- auto* dlp_controller = MockClipboardDlpController::Init();
+TYPED_TEST(ClipboardTest, PolicyDisallow_ReadText) {
+ auto policy_controller = std::make_unique<MockPolicyController>();
const base::string16 kTestText(base::UTF8ToUTF16("World"));
{
ScopedClipboardWriter writer(
ClipboardBuffer::kCopyPaste,
- std::make_unique<ClipboardDataEndpoint>(url::Origin()));
+ std::make_unique<DataTransferEndpoint>(url::Origin()));
writer.WriteText(kTestText);
}
- EXPECT_CALL(*dlp_controller, IsDataReadAllowed)
+ EXPECT_CALL(*policy_controller, IsDataReadAllowed)
.WillRepeatedly(testing::Return(false));
base::string16 read_result;
this->clipboard().ReadText(ClipboardBuffer::kCopyPaste,
/* data_dst = */ nullptr, &read_result);
- ::testing::Mock::VerifyAndClearExpectations(dlp_controller);
+ ::testing::Mock::VerifyAndClearExpectations(policy_controller.get());
EXPECT_EQ(base::string16(), read_result);
- MockClipboardDlpController::DeleteInstance();
}
-TYPED_TEST(ClipboardTest, DlpDisallow_ReadImage) {
- auto* dlp_controller = MockClipboardDlpController::Init();
- EXPECT_CALL(*dlp_controller, IsDataReadAllowed)
+TYPED_TEST(ClipboardTest, PolicyDisallow_ReadImage) {
+ auto policy_controller = std::make_unique<MockPolicyController>();
+ EXPECT_CALL(*policy_controller, IsDataReadAllowed)
.WillRepeatedly(testing::Return(false));
const SkBitmap& image = clipboard_test_util::ReadImage(&this->clipboard());
- ::testing::Mock::VerifyAndClearExpectations(dlp_controller);
+ ::testing::Mock::VerifyAndClearExpectations(policy_controller.get());
EXPECT_EQ(true, image.empty());
- MockClipboardDlpController::DeleteInstance();
}
#endif // defined(OS_CHROMEOS)
diff --git a/chromium/ui/base/clipboard/clipboard_util_win.cc b/chromium/ui/base/clipboard/clipboard_util_win.cc
index 708b5693bd5..8c6486c0212 100644
--- a/chromium/ui/base/clipboard/clipboard_util_win.cc
+++ b/chromium/ui/base/clipboard/clipboard_util_win.cc
@@ -67,9 +67,9 @@ bool GetUrlFromHDrop(IDataObject* data_object,
if (0 == _wcsicmp(PathFindExtensionW(filename), L".url") &&
GetPrivateProfileStringW(L"InternetShortcut", L"url", 0, url_buffer,
base::size(url_buffer), filename)) {
- *url = GURL(url_buffer);
+ *url = GURL(base::AsStringPiece16(url_buffer));
PathRemoveExtension(filename);
- title->assign(PathFindFileName(filename));
+ title->assign(base::as_u16cstr(PathFindFileName(filename)));
success = url->is_valid();
}
}
@@ -112,7 +112,7 @@ bool ContainsFilePathCaseInsensitive(
// emails with the same subject line are dragged out of Outlook.exe).
// |uniquifier| is incremented on encountering a non-unique file name.
base::FilePath GetUniqueVirtualFilename(
- const base::string16& candidate_name,
+ const std::wstring& candidate_name,
const std::vector<base::FilePath>& existing_filenames,
unsigned int* uniquifier) {
// Remove any possible filepath components/separators that drag source may
@@ -122,9 +122,9 @@ base::FilePath GetUniqueVirtualFilename(
// To mitigate against running up against MAX_PATH limitations (temp files
// failing to be created), truncate the display name.
const size_t kTruncatedDisplayNameLength = 128;
- const base::string16 extension = unique_name.Extension();
+ const std::wstring extension = unique_name.Extension();
unique_name = unique_name.RemoveExtension();
- base::string16 truncated = unique_name.value();
+ std::wstring truncated = unique_name.value();
if (truncated.length() > kTruncatedDisplayNameLength) {
truncated.erase(kTruncatedDisplayNameLength);
unique_name = base::FilePath(truncated);
@@ -133,7 +133,7 @@ base::FilePath GetUniqueVirtualFilename(
// Replace any file name illegal characters.
unique_name = net::GenerateFileName(GURL(), std::string(), std::string(),
- base::UTF16ToUTF8(unique_name.value()),
+ base::WideToUTF8(unique_name.value()),
std::string(), std::string());
// Make the file name unique. This is more involved than just marching through
@@ -348,11 +348,11 @@ HGLOBAL CopyFileContentsToHGlobal(IDataObject* data_object, LONG index) {
return hdata;
}
-base::string16 ConvertString(const char* string) {
+std::wstring ConvertString(const char* string) {
return base::UTF8ToWide(string);
}
-base::string16 ConvertString(const wchar_t* string) {
+std::wstring ConvertString(const wchar_t* string) {
return string;
}
@@ -424,7 +424,7 @@ bool GetVirtualFilenames(IDataObject* data_object,
template <typename FileGroupDescriptorType>
bool GetFileNameFromFirstDescriptor(IDataObject* data_object,
- base::string16* filename) {
+ std::wstring* filename) {
STGMEDIUM medium;
if (!FileGroupDescriptorData<FileGroupDescriptorType>::get(data_object,
@@ -505,7 +505,7 @@ bool ClipboardUtil::GetUrl(IDataObject* data_object,
{
// Mozilla URL format or Unicode URL
base::win::ScopedHGlobal<wchar_t*> data(store.hGlobal);
- SplitUrlAndTitle(data.get(), url, title);
+ SplitUrlAndTitle(base::WideToUTF16(data.get()), url, title);
}
ReleaseStgMedium(&store);
return url->is_valid();
@@ -515,14 +515,14 @@ bool ClipboardUtil::GetUrl(IDataObject* data_object,
{
// URL using ASCII
base::win::ScopedHGlobal<char*> data(store.hGlobal);
- SplitUrlAndTitle(base::UTF8ToWide(data.get()), url, title);
+ SplitUrlAndTitle(base::UTF8ToUTF16(data.get()), url, title);
}
ReleaseStgMedium(&store);
return url->is_valid();
}
if (convert_filenames) {
- std::vector<base::string16> filenames;
+ std::vector<std::wstring> filenames;
if (!GetFilenames(data_object, &filenames))
return false;
DCHECK_GT(filenames.size(), 0U);
@@ -534,7 +534,7 @@ bool ClipboardUtil::GetUrl(IDataObject* data_object,
}
bool ClipboardUtil::GetFilenames(IDataObject* data_object,
- std::vector<base::string16>* filenames) {
+ std::vector<std::wstring>* filenames) {
DCHECK(data_object && filenames);
if (!HasFilenames(data_object))
return false;
@@ -646,7 +646,7 @@ bool ClipboardUtil::GetPlainText(IDataObject* data_object,
{
// Unicode text
base::win::ScopedHGlobal<wchar_t*> data(store.hGlobal);
- plain_text->assign(data.get());
+ plain_text->assign(base::as_u16cstr(data.get()));
}
ReleaseStgMedium(&store);
return true;
@@ -656,7 +656,7 @@ bool ClipboardUtil::GetPlainText(IDataObject* data_object,
{
// ASCII text
base::win::ScopedHGlobal<char*> data(store.hGlobal);
- plain_text->assign(base::UTF8ToWide(data.get()));
+ plain_text->assign(base::UTF8ToUTF16(data.get()));
}
ReleaseStgMedium(&store);
return true;
@@ -686,7 +686,7 @@ bool ClipboardUtil::GetHtml(IDataObject* data_object,
std::string html_utf8;
CFHtmlToHtml(std::string(data.get(), data.Size()), &html_utf8, base_url);
- html->assign(base::UTF8ToWide(html_utf8));
+ html->assign(base::UTF8ToUTF16(html_utf8));
}
ReleaseStgMedium(&store);
return true;
@@ -701,14 +701,14 @@ bool ClipboardUtil::GetHtml(IDataObject* data_object,
{
// text/html
base::win::ScopedHGlobal<wchar_t*> data(store.hGlobal);
- html->assign(data.get());
+ html->assign(base::as_u16cstr(data.get()));
}
ReleaseStgMedium(&store);
return true;
}
bool ClipboardUtil::GetFileContents(IDataObject* data_object,
- base::string16* filename,
+ std::wstring* filename,
std::string* file_contents) {
DCHECK(data_object && filename && file_contents);
if (!HasFileContents(data_object))
diff --git a/chromium/ui/base/clipboard/clipboard_util_win.h b/chromium/ui/base/clipboard/clipboard_util_win.h
index a1e8d5438b0..2c0af5d665c 100644
--- a/chromium/ui/base/clipboard/clipboard_util_win.h
+++ b/chromium/ui/base/clipboard/clipboard_util_win.h
@@ -45,7 +45,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardUtil {
bool convert_filenames);
// Only returns true if |*filenames| is not empty.
static bool GetFilenames(IDataObject* data_object,
- std::vector<base::string16>* filenames);
+ std::vector<std::wstring>* filenames);
// Fills a vector of display names of "virtual files" in the data store, but
// does not actually retrieve the file contents. Display names are assured to
@@ -78,7 +78,7 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ClipboardUtil {
base::string16* text_html,
std::string* base_url);
static bool GetFileContents(IDataObject* data_object,
- base::string16* filename,
+ std::wstring* filename,
std::string* file_contents);
// This represents custom MIME types a web page might set to transport its
// own types of data for drag and drop. It is sandboxed in its own CLIPFORMAT
diff --git a/chromium/ui/base/clipboard/clipboard_win.cc b/chromium/ui/base/clipboard/clipboard_win.cc
index 260858079f2..344b847b0e2 100644
--- a/chromium/ui/base/clipboard/clipboard_win.cc
+++ b/chromium/ui/base/clipboard/clipboard_win.cc
@@ -30,10 +30,10 @@
#include "skia/ext/skia_utils_win.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
#include "ui/base/clipboard/clipboard_metrics.h"
#include "ui/base/clipboard/clipboard_util_win.h"
#include "ui/base/clipboard/custom_data_helper.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/size.h"
@@ -251,7 +251,7 @@ uint64_t ClipboardWin::GetSequenceNumber(ClipboardBuffer buffer) const {
bool ClipboardWin::IsFormatAvailable(
const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
return ::IsClipboardFormatAvailable(format.ToFormatEtc().cfFormat) != FALSE;
}
@@ -269,7 +269,7 @@ void ClipboardWin::Clear(ClipboardBuffer buffer) {
// platforms.
void ClipboardWin::ReadAvailableTypes(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const {
DCHECK(types);
@@ -305,7 +305,7 @@ void ClipboardWin::ReadAvailableTypes(
std::vector<base::string16>
ClipboardWin::ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
int count = ::CountClipboardFormats();
if (!count)
return {};
@@ -331,7 +331,7 @@ ClipboardWin::ReadAvailablePlatformSpecificFormatNames(
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardWin::ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
RecordRead(ClipboardFormatMetric::kText);
@@ -360,7 +360,7 @@ void ClipboardWin::ReadText(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardWin::ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
RecordRead(ClipboardFormatMetric::kText);
@@ -389,7 +389,7 @@ void ClipboardWin::ReadAsciiText(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardWin::ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
@@ -450,7 +450,7 @@ void ClipboardWin::ReadHTML(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardWin::ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
RecordRead(ClipboardFormatMetric::kSvg);
@@ -466,7 +466,7 @@ void ClipboardWin::ReadSvg(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardWin::ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
RecordRead(ClipboardFormatMetric::kRtf);
@@ -478,7 +478,7 @@ void ClipboardWin::ReadRTF(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardWin::ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const {
RecordRead(ClipboardFormatMetric::kImage);
std::move(callback).Run(ReadImageInternal(buffer));
@@ -488,7 +488,7 @@ void ClipboardWin::ReadImage(ClipboardBuffer buffer,
// platforms.
void ClipboardWin::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
RecordRead(ClipboardFormatMetric::kCustomData);
@@ -509,7 +509,7 @@ void ClipboardWin::ReadCustomData(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
-void ClipboardWin::ReadBookmark(const ClipboardDataEndpoint* data_dst,
+void ClipboardWin::ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const {
RecordRead(ClipboardFormatMetric::kBookmark);
@@ -540,7 +540,7 @@ void ClipboardWin::ReadBookmark(const ClipboardDataEndpoint* data_dst,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardWin::ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
RecordRead(ClipboardFormatMetric::kData);
if (!result) {
@@ -566,7 +566,7 @@ void ClipboardWin::ReadData(const ClipboardFormatType& format,
void ClipboardWin::WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
ScopedClipboard clipboard;
@@ -584,7 +584,7 @@ void ClipboardWin::WritePortableRepresentations(
void ClipboardWin::WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK_EQ(buffer, ClipboardBuffer::kCopyPaste);
ScopedClipboard clipboard;
@@ -789,7 +789,7 @@ SkBitmap ClipboardWin::ReadImageInternal(ClipboardBuffer buffer) const {
// Since Windows uses premultiplied alpha, we scan for instances where
// (R, G, B) > A. If there are any invalid premultiplied colors in the image,
// we assume the alpha channel contains garbage and force the bitmap to be
- // opaque as well. Note that this heuristic will fail on a transparent bitmap
+ // opaque as well. This heuristic will fail on a transparent bitmap
// containing only black pixels...
SkPixmap device_pixels(SkImageInfo::MakeN32Premul(bitmap->bmiHeader.biWidth,
bitmap->bmiHeader.biHeight),
diff --git a/chromium/ui/base/clipboard/clipboard_win.h b/chromium/ui/base/clipboard/clipboard_win.h
index 8fbe2722bff..e3532315b68 100644
--- a/chromium/ui/base/clipboard/clipboard_win.h
+++ b/chromium/ui/base/clipboard/clipboard_win.h
@@ -38,53 +38,53 @@ class ClipboardWin : public Clipboard {
uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void Clear(ClipboardBuffer buffer) override;
void ReadAvailableTypes(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const override;
std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
uint32_t* fragment_end) const override;
void ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const override;
void ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
- void ReadBookmark(const ClipboardDataEndpoint* data_dst,
+ void ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const override;
void ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WriteText(const char* text_data, size_t text_len) override;
void WriteHTML(const char* markup_data,
size_t markup_len,
diff --git a/chromium/ui/base/clipboard/clipboard_x11.cc b/chromium/ui/base/clipboard/clipboard_x11.cc
index a1fbfcae549..13966680032 100644
--- a/chromium/ui/base/clipboard/clipboard_x11.cc
+++ b/chromium/ui/base/clipboard/clipboard_x11.cc
@@ -22,10 +22,10 @@
#include "base/strings/utf_string_conversions.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_constants.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
#include "ui/base/clipboard/clipboard_metrics.h"
#include "ui/base/clipboard/clipboard_monitor.h"
#include "ui/base/clipboard/custom_data_helper.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/base/nine_image_painter_factory.h"
#include "ui/base/x/selection_owner.h"
#include "ui/base/x/selection_requestor.h"
@@ -37,7 +37,6 @@
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xfixes.h"
#include "ui/gfx/x/xproto.h"
@@ -501,7 +500,7 @@ uint64_t ClipboardX11::GetSequenceNumber(ClipboardBuffer buffer) const {
bool ClipboardX11::IsFormatAvailable(
const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
@@ -523,7 +522,7 @@ void ClipboardX11::Clear(ClipboardBuffer buffer) {
// platforms.
void ClipboardX11::ReadAvailableTypes(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const {
DCHECK(CalledOnValidThread());
DCHECK(types);
@@ -553,7 +552,7 @@ void ClipboardX11::ReadAvailableTypes(
std::vector<base::string16>
ClipboardX11::ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const {
+ const DataTransferEndpoint* data_dst) const {
DCHECK(CalledOnValidThread());
// Copy target_list(), so that XGetAtomNames can get a non-const Atom*.
@@ -580,7 +579,7 @@ ClipboardX11::ReadAvailablePlatformSpecificFormatNames(
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardX11::ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kText);
@@ -596,7 +595,7 @@ void ClipboardX11::ReadText(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardX11::ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kText);
@@ -612,7 +611,7 @@ void ClipboardX11::ReadAsciiText(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardX11::ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
@@ -640,7 +639,7 @@ void ClipboardX11::ReadHTML(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardX11::ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kSvg);
@@ -658,7 +657,7 @@ void ClipboardX11::ReadSvg(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardX11::ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kRtf);
@@ -673,7 +672,7 @@ void ClipboardX11::ReadRTF(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardX11::ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const {
DCHECK(IsSupportedClipboardBuffer(buffer));
RecordRead(ClipboardFormatMetric::kImage);
@@ -684,7 +683,7 @@ void ClipboardX11::ReadImage(ClipboardBuffer buffer,
// platforms.
void ClipboardX11::ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kCustomData);
@@ -698,7 +697,7 @@ void ClipboardX11::ReadCustomData(ClipboardBuffer buffer,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
-void ClipboardX11::ReadBookmark(const ClipboardDataEndpoint* data_dst,
+void ClipboardX11::ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const {
DCHECK(CalledOnValidThread());
@@ -709,7 +708,7 @@ void ClipboardX11::ReadBookmark(const ClipboardDataEndpoint* data_dst,
// |data_dst| is not used. It's only passed to be consistent with other
// platforms.
void ClipboardX11::ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const {
DCHECK(CalledOnValidThread());
RecordRead(ClipboardFormatMetric::kData);
@@ -731,7 +730,7 @@ bool ClipboardX11::IsSelectionBufferAvailable() const {
void ClipboardX11::WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
@@ -760,7 +759,7 @@ void ClipboardX11::WritePortableRepresentations(
void ClipboardX11::WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) {
+ std::unique_ptr<DataTransferEndpoint> data_src) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardBuffer(buffer));
diff --git a/chromium/ui/base/clipboard/clipboard_x11.h b/chromium/ui/base/clipboard/clipboard_x11.h
index cae0a85a29b..803b4408686 100644
--- a/chromium/ui/base/clipboard/clipboard_x11.h
+++ b/chromium/ui/base/clipboard/clipboard_x11.h
@@ -27,44 +27,44 @@ class ClipboardX11 : public Clipboard {
uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
bool IsFormatAvailable(const ClipboardFormatType& format,
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void Clear(ClipboardBuffer buffer) override;
void ReadAvailableTypes(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::vector<base::string16>* types) const override;
std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst) const override;
+ const DataTransferEndpoint* data_dst) const override;
void ReadText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadAsciiText(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadHTML(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* markup,
std::string* src_url,
uint32_t* fragment_start,
uint32_t* fragment_end) const override;
void ReadSvg(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
void ReadRTF(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
void ReadImage(ClipboardBuffer buffer,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
ReadImageCallback callback) const override;
void ReadCustomData(ClipboardBuffer buffer,
const base::string16& type,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
base::string16* result) const override;
- void ReadBookmark(const ClipboardDataEndpoint* data_dst,
+ void ReadBookmark(const DataTransferEndpoint* data_dst,
base::string16* title,
std::string* url) const override;
void ReadData(const ClipboardFormatType& format,
- const ClipboardDataEndpoint* data_dst,
+ const DataTransferEndpoint* data_dst,
std::string* result) const override;
#if defined(USE_OZONE)
bool IsSelectionBufferAvailable() const override;
@@ -72,11 +72,11 @@ class ClipboardX11 : public Clipboard {
void WritePortableRepresentations(
ClipboardBuffer buffer,
const ObjectMap& objects,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WritePlatformRepresentations(
ClipboardBuffer buffer,
std::vector<Clipboard::PlatformRepresentation> platform_representations,
- std::unique_ptr<ClipboardDataEndpoint> data_src) override;
+ std::unique_ptr<DataTransferEndpoint> data_src) override;
void WriteText(const char* text_data, size_t text_len) override;
void WriteHTML(const char* markup_data,
size_t markup_len,
diff --git a/chromium/ui/base/clipboard/scoped_clipboard_writer.cc b/chromium/ui/base/clipboard/scoped_clipboard_writer.cc
index f89d396d74e..d49f3ff31a4 100644
--- a/chromium/ui/base/clipboard/scoped_clipboard_writer.cc
+++ b/chromium/ui/base/clipboard/scoped_clipboard_writer.cc
@@ -19,7 +19,7 @@ namespace ui {
ScopedClipboardWriter::ScopedClipboardWriter(
ClipboardBuffer buffer,
- std::unique_ptr<ClipboardDataEndpoint> data_src)
+ std::unique_ptr<DataTransferEndpoint> data_src)
: buffer_(buffer), data_src_(std::move(data_src)) {}
ScopedClipboardWriter::~ScopedClipboardWriter() {
diff --git a/chromium/ui/base/clipboard/scoped_clipboard_writer.h b/chromium/ui/base/clipboard/scoped_clipboard_writer.h
index bac40ada9ee..1dd0bae74fe 100644
--- a/chromium/ui/base/clipboard/scoped_clipboard_writer.h
+++ b/chromium/ui/base/clipboard/scoped_clipboard_writer.h
@@ -12,7 +12,7 @@
#include "base/strings/string16.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard.h"
-#include "ui/base/clipboard/clipboard_data_endpoint.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
namespace base {
class Pickle;
@@ -33,10 +33,10 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ScopedClipboardWriter {
// Create an instance that is a simple wrapper around the clipboard of the
// given buffer with an optional parameter indicating the source of the data.
// TODO(crbug.com/1103193): change its references to use
- // ClipboardDataEndpoint, if possible.
+ // DataTransferEndpoint, if possible.
explicit ScopedClipboardWriter(
ClipboardBuffer buffer,
- std::unique_ptr<ClipboardDataEndpoint> src = nullptr);
+ std::unique_ptr<DataTransferEndpoint> src = nullptr);
~ScopedClipboardWriter();
@@ -98,8 +98,8 @@ class COMPONENT_EXPORT(UI_BASE_CLIPBOARD) ScopedClipboardWriter {
// The source of the data written in ScopedClipboardWriter, nullptr means it's
// not set, or the source of the data can't be represented by
- // ClipboardDataEndpoint.
- std::unique_ptr<ClipboardDataEndpoint> data_src_ = nullptr;
+ // DataTransferEndpoint.
+ std::unique_ptr<DataTransferEndpoint> data_src_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(ScopedClipboardWriter);
};
diff --git a/chromium/ui/base/cocoa/DIR_METADATA b/chromium/ui/base/cocoa/DIR_METADATA
new file mode 100644
index 00000000000..2769d07edc7
--- /dev/null
+++ b/chromium/ui/base/cocoa/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI"
+} \ No newline at end of file
diff --git a/chromium/ui/base/cocoa/OWNERS b/chromium/ui/base/cocoa/OWNERS
index 27991830902..f5de6bf4af9 100644
--- a/chromium/ui/base/cocoa/OWNERS
+++ b/chromium/ui/base/cocoa/OWNERS
@@ -2,5 +2,3 @@ avi@chromium.org
rsesek@chromium.org
tapted@chromium.org
thakis@chromium.org
-
-# COMPONENT: UI
diff --git a/chromium/ui/base/cocoa/permissions_utils.h b/chromium/ui/base/cocoa/permissions_utils.h
index a8ec034cdf2..f410268162c 100644
--- a/chromium/ui/base/cocoa/permissions_utils.h
+++ b/chromium/ui/base/cocoa/permissions_utils.h
@@ -16,6 +16,15 @@ namespace ui {
// has been granted.
COMPONENT_EXPORT(UI_BASE) bool IsScreenCaptureAllowed();
+// Heuristic to prompt the user if they have never been prompted for permission.
+// Starting on macOS 10.15, not only can we not tell if we have has permission
+// granted, we also can't tell if we have requested the permission before. We
+// must try capture a stream and the OS will show a modal dialog asking the user
+// for permission if Chrome is not in the permission app list, then return
+// a stream based on whether permission is granted.
+// Returns whether or not permission was granted.
+COMPONENT_EXPORT(UI_BASE) bool TryPromptUserForScreenCapture();
+
} // namespace ui
#endif // UI_BASE_COCOA_PERMISSIONS_UTILS_H_
diff --git a/chromium/ui/base/cocoa/permissions_utils.mm b/chromium/ui/base/cocoa/permissions_utils.mm
index ae34a26d827..bea5c6477ea 100644
--- a/chromium/ui/base/cocoa/permissions_utils.mm
+++ b/chromium/ui/base/cocoa/permissions_utils.mm
@@ -8,6 +8,7 @@
#include <Foundation/Foundation.h>
#include "base/mac/foundation_util.h"
+#include "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h"
namespace ui {
@@ -16,7 +17,7 @@ namespace ui {
// or dock window running on another process is visible.
// See https://crbug.com/993692.
bool IsScreenCaptureAllowed() {
- if (@available(macOS 10.15, *)) {
+ if (base::mac::IsAtLeastOS10_15()) {
base::ScopedCFTypeRef<CFArrayRef> window_list(
CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID));
int current_pid = [[NSProcessInfo processInfo] processIdentifier];
@@ -49,4 +50,22 @@ bool IsScreenCaptureAllowed() {
return true;
}
+bool TryPromptUserForScreenCapture() {
+ if (base::mac::IsAtLeastOS10_15()) {
+ // On 10.15+, macOS will show the permissions prompt for Screen Recording
+ // if we request to create a display stream and our application is not
+ // in the applications list in System permissions. Stream creation will
+ // fail if the user denies permission, or if our application is already
+ // in the system permssion and is unchecked.
+ base::ScopedCFTypeRef<CGDisplayStreamRef> stream(CGDisplayStreamCreate(
+ CGMainDisplayID(), 1, 1, 'BGRA', nullptr,
+ ^(CGDisplayStreamFrameStatus status, uint64_t displayTime,
+ IOSurfaceRef frameSurface, CGDisplayStreamUpdateRef updateRef){
+ }));
+ return stream != nullptr;
+ } else {
+ return true;
+ }
+}
+
} // namespace ui
diff --git a/chromium/ui/base/cocoa/touch_bar_util.h b/chromium/ui/base/cocoa/touch_bar_util.h
index f69d2a392f1..19293c6f93a 100644
--- a/chromium/ui/base/cocoa/touch_bar_util.h
+++ b/chromium/ui/base/cocoa/touch_bar_util.h
@@ -31,21 +31,6 @@ enum TouchBarAction {
// Logs the sample's UMA metrics into the DefaultTouchBar.Metrics histogram.
COMPONENT_EXPORT(UI_BASE) void LogTouchBarUMA(TouchBarAction command);
-// Returns the NSTouchBar Class.
-COMPONENT_EXPORT(UI_BASE) Class NSTouchBar();
-
-// Returns the NSCustomTouchBarItem Class.
-COMPONENT_EXPORT(UI_BASE) Class NSCustomTouchBarItem();
-
-// Returns the NSGroupTouchBarItem Class.
-COMPONENT_EXPORT(UI_BASE) Class NSGroupTouchBarItem();
-
-// Returns a stylized blue button for the touch bar. The button performs
-// |action| from the |target|.
-API_AVAILABLE(macosx(10.12.2))
-COMPONENT_EXPORT(UI_BASE)
-NSButton* GetBlueTouchBarButton(NSString* title, id target, SEL action);
-
// Creates a touch bar identifier with the given |id|.
COMPONENT_EXPORT(UI_BASE) NSString* GetTouchBarId(NSString* touch_bar_id);
diff --git a/chromium/ui/base/cocoa/touch_bar_util.mm b/chromium/ui/base/cocoa/touch_bar_util.mm
index 7125569488e..47c213021c9 100644
--- a/chromium/ui/base/cocoa/touch_bar_util.mm
+++ b/chromium/ui/base/cocoa/touch_bar_util.mm
@@ -15,28 +15,6 @@ void LogTouchBarUMA(TouchBarAction command) {
TOUCH_BAR_ACTION_COUNT);
}
-Class NSTouchBar() {
- return NSClassFromString(@"NSTouchBar");
-}
-
-Class NSCustomTouchBarItem() {
- return NSClassFromString(@"NSCustomTouchBarItem");
-}
-
-Class NSGroupTouchBarItem() {
- return NSClassFromString(@"NSGroupTouchBarItem");
-}
-
-NSButton* GetBlueTouchBarButton(NSString* title, id target, SEL action) {
- NSButton* button =
- [NSButton buttonWithTitle:title target:target action:action];
- [button setBezelColor:[NSColor colorWithSRGBRed:0.168
- green:0.51
- blue:0.843
- alpha:1.0]];
- return button;
-}
-
NSString* GetTouchBarId(NSString* touch_bar_id) {
NSString* chrome_bundle_id =
base::SysUTF8ToNSString(base::mac::BaseBundleID());
diff --git a/chromium/ui/base/cocoa/views_hostable.h b/chromium/ui/base/cocoa/views_hostable.h
index 9a9ae9324a5..00595d34ef3 100644
--- a/chromium/ui/base/cocoa/views_hostable.h
+++ b/chromium/ui/base/cocoa/views_hostable.h
@@ -74,6 +74,9 @@ class ViewsHostableView {
virtual void ViewsHostableSetParentAccessible(
gfx::NativeViewAccessible parent_accessibility_element) = 0;
+ // Get the WebContentsView's parent accessibility element.
+ virtual gfx::NativeViewAccessible ViewsHostableGetParentAccessible() = 0;
+
// Retrieve the WebContentsView's accessibility element.
virtual gfx::NativeViewAccessible ViewsHostableGetAccessibilityElement() = 0;
};
diff --git a/chromium/ui/base/cursor/BUILD.gn b/chromium/ui/base/cursor/BUILD.gn
index f4e3f83c604..947ff85b6ef 100644
--- a/chromium/ui/base/cursor/BUILD.gn
+++ b/chromium/ui/base/cursor/BUILD.gn
@@ -55,8 +55,6 @@ if (use_aura) {
"cursor_util.h",
"cursors_aura.cc",
"cursors_aura.h",
- "image_cursors.cc",
- "image_cursors.h",
]
defines = [ "IS_UI_BASE_CURSOR_IMPL" ]
public_deps = [
@@ -92,6 +90,7 @@ if (use_aura) {
"//skia",
"//ui/gfx/geometry",
]
+ deps += [ "//build:chromeos_buildflags" ]
}
if (use_x11 || use_ozone) {
@@ -106,26 +105,39 @@ if (use_aura) {
source_set("unittests") {
testonly = true
sources = []
- deps = [ "//testing/gtest" ]
+ deps = [
+ ":cursor_base",
+ "//testing/gtest",
+ "//ui/base/cursor/mojom:cursor_type",
+ ]
if (!is_ios) {
sources += [ "cursor_unittest.cc" ]
deps += [
- ":cursor_base",
"//skia",
- "//ui/base/cursor/mojom:cursor_type",
"//ui/gfx:geometry_skia",
"//ui/gfx/geometry",
]
}
if (use_aura) {
- sources += [ "cursor_util_unittest.cc" ]
+ sources += [
+ "cursor_loader_unittest.cc",
+ "cursor_util_unittest.cc",
+ ]
deps += [
":cursor",
"//skia",
"//ui/gfx/geometry",
]
+
+ if (use_x11) {
+ deps += [
+ "//skia",
+ "//ui/base/x",
+ "//ui/gfx/geometry",
+ ]
+ }
}
if (use_ozone) {
@@ -133,7 +145,7 @@ source_set("unittests") {
deps += [
":cursor",
"//base",
- "//ui/base/cursor/mojom:cursor_type",
+ "//build:chromeos_buildflags",
]
}
}
diff --git a/chromium/ui/base/cursor/DIR_METADATA b/chromium/ui/base/cursor/DIR_METADATA
new file mode 100644
index 00000000000..198db497480
--- /dev/null
+++ b/chromium/ui/base/cursor/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Internals>Input"
+}
diff --git a/chromium/ui/base/cursor/OWNERS b/chromium/ui/base/cursor/OWNERS
index 776ce1a5de3..81aec02d68a 100644
--- a/chromium/ui/base/cursor/OWNERS
+++ b/chromium/ui/base/cursor/OWNERS
@@ -1 +1 @@
-# COMPONENT: Internal>Input
+hferreiro@igalia.com
diff --git a/chromium/ui/base/cursor/cursor.h b/chromium/ui/base/cursor/cursor.h
index 804ba96c337..1c54756715d 100644
--- a/chromium/ui/base/cursor/cursor.h
+++ b/chromium/ui/base/cursor/cursor.h
@@ -20,6 +20,8 @@ namespace ui {
#if defined(OS_WIN)
typedef ::HCURSOR PlatformCursor;
#else
+// NOTE: On Ozone platforms, the type is chosen at runtime, and is either
+// X11Cursor* or BitmapCursorOzone*.
typedef void* PlatformCursor;
#endif
diff --git a/chromium/ui/base/cursor/cursor_factory.cc b/chromium/ui/base/cursor/cursor_factory.cc
index 43645a5d446..5a987bf501a 100644
--- a/chromium/ui/base/cursor/cursor_factory.cc
+++ b/chromium/ui/base/cursor/cursor_factory.cc
@@ -39,13 +39,15 @@ base::Optional<PlatformCursor> CursorFactory::GetDefaultCursor(
return base::nullopt;
}
-PlatformCursor CursorFactory::CreateImageCursor(const SkBitmap& bitmap,
+PlatformCursor CursorFactory::CreateImageCursor(mojom::CursorType type,
+ const SkBitmap& bitmap,
const gfx::Point& hotspot) {
NOTIMPLEMENTED();
return 0;
}
PlatformCursor CursorFactory::CreateAnimatedCursor(
+ mojom::CursorType type,
const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
int frame_delay_ms) {
diff --git a/chromium/ui/base/cursor/cursor_factory.h b/chromium/ui/base/cursor/cursor_factory.h
index f038a422819..57c70c9e60a 100644
--- a/chromium/ui/base/cursor/cursor_factory.h
+++ b/chromium/ui/base/cursor/cursor_factory.h
@@ -36,17 +36,21 @@ class COMPONENT_EXPORT(UI_BASE_CURSOR_BASE) CursorFactory {
virtual base::Optional<PlatformCursor> GetDefaultCursor(
mojom::CursorType type);
- // Return a image cursor from the specified image & hotspot. Image cursors
- // are referenced counted and have an initial refcount of 1. Therefore, each
- // CreateImageCursor call must be matched with a call to UnrefImageCursor.
- virtual PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
+ // Return an image cursor for the specified |type| with a |bitmap| and
+ // |hotspot|. Image cursors are referenced counted and have an initial
+ // refcount of 1. Therefore, each CreateImageCursor call must be matched with
+ // a call to UnrefImageCursor.
+ virtual PlatformCursor CreateImageCursor(mojom::CursorType type,
+ const SkBitmap& bitmap,
const gfx::Point& hotspot);
// Return a animated cursor from the specified image & hotspot. Animated
// cursors are referenced counted and have an initial refcount of 1.
// Therefore, each CreateAnimatedCursor call must be matched with a call to
// UnrefImageCursor.
+ // |frame_delay_ms| is the delay between frames in millisecond.
virtual PlatformCursor CreateAnimatedCursor(
+ mojom::CursorType type,
const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
int frame_delay_ms);
diff --git a/chromium/ui/base/cursor/cursor_loader.h b/chromium/ui/base/cursor/cursor_loader.h
index 2553c54e488..0c516d7fa7c 100644
--- a/chromium/ui/base/cursor/cursor_loader.h
+++ b/chromium/ui/base/cursor/cursor_loader.h
@@ -5,71 +5,70 @@
#ifndef UI_BASE_CURSOR_CURSOR_LOADER_H_
#define UI_BASE_CURSOR_CURSOR_LOADER_H_
+#include <memory>
+
#include "base/component_export.h"
-#include "base/macros.h"
+#include "ui/base/cursor/cursor_size.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
#include "ui/display/display.h"
#include "ui/gfx/native_widget_types.h"
-namespace gfx {
-class Point;
-}
-
namespace ui {
class COMPONENT_EXPORT(UI_BASE_CURSOR) CursorLoader {
public:
- CursorLoader() : scale_(1.f), rotation_(display::Display::ROTATE_0) {}
- virtual ~CursorLoader() {}
+ CursorLoader() = default;
+ CursorLoader(const CursorLoader&) = delete;
+ CursorLoader& operator=(const CursorLoader&) = delete;
+ virtual ~CursorLoader() = default;
+ // Returns the rotation and scale of the currently loaded cursor.
display::Display::Rotation rotation() const { return rotation_; }
+ float scale() const { return scale_; }
- void set_rotation(display::Display::Rotation rotation) {
- rotation_ = rotation;
- }
+ // Sets the rotation and scale the cursors are loaded for.
+ // Returns true if the cursor image was reloaded.
+ bool SetDisplayData(display::Display::Rotation rotation, float scale) {
+ if (rotation_ == rotation && scale_ == scale)
+ return false;
- // Returns the current scale of the mouse cursor icon.
- float scale() const {
- return scale_;
- }
-
- // Sets the scale of the mouse cursor icon.
- void set_scale(const float scale) {
+ rotation_ = rotation;
scale_ = scale;
+ UnloadCursors();
+ return true;
}
- // Creates a cursor from an image resource and puts it in the cursor map.
- virtual void LoadImageCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot) = 0;
+ // Returns the size of the currently loaded cursor.
+ CursorSize size() const { return size_; }
- // Creates an animated cursor from an image resource and puts it in the
- // cursor map. The image is assumed to be a concatenation of animation frames
- // from left to right. Also, each frame is assumed to be square
- // (width == height).
- // |frame_delay_ms| is the delay between frames in millisecond.
- virtual void LoadAnimatedCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot,
- int frame_delay_ms) = 0;
+ // Sets the size of the mouse cursor icon.
+ void set_size(CursorSize size) {
+ if (size_ == size)
+ return;
- // Unloads all the cursors.
- virtual void UnloadAll() = 0;
+ size_ = size;
+ UnloadCursors();
+ }
// Sets the platform cursor based on the native type of |cursor|.
virtual void SetPlatformCursor(gfx::NativeCursor* cursor) = 0;
// Creates a CursorLoader.
- static CursorLoader* Create();
+ static std::unique_ptr<CursorLoader> Create(bool use_platform_cursors = true);
+
+ protected:
+ // Resets the cursor cache.
+ virtual void UnloadCursors() = 0;
private:
// The current scale of the mouse cursor icon.
- float scale_;
+ float scale_ = 1.0f;
// The current rotation of the mouse cursor icon.
- display::Display::Rotation rotation_;
+ display::Display::Rotation rotation_ = display::Display::ROTATE_0;
- DISALLOW_COPY_AND_ASSIGN(CursorLoader);
+ // The preferred size of the mouse cursor icon.
+ CursorSize size_ = CursorSize::kNormal;
};
} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_loader_ozone.cc b/chromium/ui/base/cursor/cursor_loader_ozone.cc
index 6df16b5f1e7..6d386672c9e 100644
--- a/chromium/ui/base/cursor/cursor_loader_ozone.cc
+++ b/chromium/ui/base/cursor/cursor_loader_ozone.cc
@@ -4,50 +4,37 @@
#include "ui/base/cursor/cursor_loader_ozone.h"
+#include <memory>
#include <vector>
+#include "base/ranges/algorithm.h"
#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/cursor_size.h"
#include "ui/base/cursor/cursor_util.h"
#include "ui/base/cursor/cursors_aura.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+#include "ui/gfx/geometry/point.h"
namespace ui {
-CursorLoaderOzone::CursorLoaderOzone() {
- factory_ = CursorFactory::GetInstance();
-}
+namespace {
-CursorLoaderOzone::~CursorLoaderOzone() {
- UnloadAll();
-}
+constexpr mojom::CursorType kAnimatedCursorTypes[] = {
+ mojom::CursorType::kWait, mojom::CursorType::kProgress};
-void CursorLoaderOzone::LoadImageCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot) {
- SkBitmap bitmap;
- gfx::Point hotspot = hot;
-
- GetImageCursorBitmap(resource_id, scale(), rotation(), &hotspot, &bitmap);
-
- image_cursors_[id] = factory_->CreateImageCursor(bitmap, hotspot);
-}
+const int kAnimatedCursorFrameDelayMs = 25;
-void CursorLoaderOzone::LoadAnimatedCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot,
- int frame_delay_ms) {
- std::vector<SkBitmap> bitmaps;
- gfx::Point hotspot = hot;
+} // namespace
- GetAnimatedCursorBitmaps(
- resource_id, scale(), rotation(), &hotspot, &bitmaps);
+CursorLoaderOzone::CursorLoaderOzone(bool use_platform_cursors)
+ : use_platform_cursors_(use_platform_cursors),
+ factory_(CursorFactory::GetInstance()) {}
- image_cursors_[id] =
- factory_->CreateAnimatedCursor(bitmaps, hotspot, frame_delay_ms);
+CursorLoaderOzone::~CursorLoaderOzone() {
+ UnloadCursors();
}
-void CursorLoaderOzone::UnloadAll() {
+void CursorLoaderOzone::UnloadCursors() {
for (const auto& image_cursor : image_cursors_)
factory_->UnrefImageCursor(image_cursor.second);
image_cursors_.clear();
@@ -63,43 +50,63 @@ void CursorLoaderOzone::SetPlatformCursor(gfx::NativeCursor* cursor) {
cursor->SetPlatformCursor(CursorFromType(cursor->type()));
}
+void CursorLoaderOzone::LoadImageCursor(mojom::CursorType type,
+ int resource_id,
+ const gfx::Point& hot) {
+ gfx::Point hotspot = hot;
+ if (base::ranges::count(kAnimatedCursorTypes, type) == 0) {
+ SkBitmap bitmap;
+ GetImageCursorBitmap(resource_id, scale(), rotation(), &hotspot, &bitmap);
+ image_cursors_[type] = factory_->CreateImageCursor(type, bitmap, hotspot);
+ } else {
+ std::vector<SkBitmap> bitmaps;
+ GetAnimatedCursorBitmaps(resource_id, scale(), rotation(), &hotspot,
+ &bitmaps);
+ image_cursors_[type] = factory_->CreateAnimatedCursor(
+ type, bitmaps, hotspot, kAnimatedCursorFrameDelayMs);
+ }
+}
+
PlatformCursor CursorLoaderOzone::CursorFromType(mojom::CursorType type) {
// An image cursor is loaded for this type.
if (image_cursors_.count(type))
return image_cursors_[type];
// Check if there's a default platform cursor available.
- base::Optional<PlatformCursor> default_cursor =
- factory_->GetDefaultCursor(type);
- if (default_cursor)
- return *default_cursor;
+ // For the none cursor, we also need to use the platform factory to take
+ // into account the different ways of creating an invisible cursor.
+ if (use_platform_cursors_ || type == mojom::CursorType::kNone) {
+ base::Optional<PlatformCursor> default_cursor =
+ factory_->GetDefaultCursor(type);
+ if (default_cursor)
+ return *default_cursor;
+ }
// Loads the default Aura cursor bitmap for the cursor type. Falls back on
// pointer cursor if this fails.
- PlatformCursor platform = CreateFallbackCursor(type);
+ PlatformCursor platform = LoadCursorFromAsset(type);
if (!platform && type != mojom::CursorType::kPointer) {
platform = CursorFromType(mojom::CursorType::kPointer);
factory_->RefImageCursor(platform);
image_cursors_[type] = platform;
}
- DCHECK(platform) << "Failed to load a fallback bitmap for cursor " << type;
+ DCHECK(platform) << "Failed to load a bitmap for the pointer cursor.";
return platform;
}
// Gets default Aura cursor bitmap/hotspot and creates a PlatformCursor with it.
-PlatformCursor CursorLoaderOzone::CreateFallbackCursor(mojom::CursorType type) {
+PlatformCursor CursorLoaderOzone::LoadCursorFromAsset(mojom::CursorType type) {
int resource_id;
- gfx::Point point;
- if (ui::GetCursorDataFor(ui::CursorSize::kNormal, type, scale(), &resource_id,
- &point)) {
- LoadImageCursor(type, resource_id, point);
+ gfx::Point hotspot;
+ if (GetCursorDataFor(size(), type, scale(), &resource_id, &hotspot)) {
+ LoadImageCursor(type, resource_id, hotspot);
return image_cursors_[type];
}
return nullptr;
}
-CursorLoader* CursorLoader::Create() {
- return new CursorLoaderOzone();
+std::unique_ptr<CursorLoader> CursorLoader::Create(bool use_platform_cursors) {
+ return std::make_unique<CursorLoaderOzone>(use_platform_cursors);
}
} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_loader_ozone.h b/chromium/ui/base/cursor/cursor_loader_ozone.h
index ccd23a3c9e0..bf1c11f6afb 100644
--- a/chromium/ui/base/cursor/cursor_loader_ozone.h
+++ b/chromium/ui/base/cursor/cursor_loader_ozone.h
@@ -13,28 +13,35 @@
#include "ui/base/cursor/cursor_loader.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
+namespace gfx {
+class Point;
+}
+
namespace ui {
class CursorFactory;
class COMPONENT_EXPORT(UI_BASE_CURSOR) CursorLoaderOzone : public CursorLoader {
public:
- CursorLoaderOzone();
+ explicit CursorLoaderOzone(bool use_platform_cursors);
~CursorLoaderOzone() override;
// CursorLoader overrides:
- void LoadImageCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot) override;
- void LoadAnimatedCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot,
- int frame_delay_ms) override;
- void UnloadAll() override;
void SetPlatformCursor(gfx::NativeCursor* cursor) override;
private:
+ // CursorLoader overrides:
+ void UnloadCursors() override;
+
+ void LoadImageCursor(mojom::CursorType id,
+ int resource_id,
+ const gfx::Point& hot);
PlatformCursor CursorFromType(mojom::CursorType type);
- PlatformCursor CreateFallbackCursor(mojom::CursorType type);
+ PlatformCursor LoadCursorFromAsset(mojom::CursorType type);
+
+ // Whether to use cursors provided by the underlying platform (e.g. X11
+ // cursors). If false or in the case of a failure, Chromium assets will be
+ // used instead.
+ const bool use_platform_cursors_;
// Pointers are owned by ResourceBundle and must not be freed here.
std::map<mojom::CursorType, PlatformCursor> image_cursors_;
diff --git a/chromium/ui/base/cursor/cursor_loader_unittest.cc b/chromium/ui/base/cursor/cursor_loader_unittest.cc
new file mode 100644
index 00000000000..67b4c2be1ce
--- /dev/null
+++ b/chromium/ui/base/cursor/cursor_loader_unittest.cc
@@ -0,0 +1,57 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/cursor/cursor_loader.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/cursor/cursor.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+
+#if defined(USE_OZONE)
+#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
+#endif
+
+#if defined(USE_X11)
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/x/x11_cursor_factory.h" // nogncheck
+#include "ui/gfx/geometry/point.h"
+#endif
+
+namespace ui {
+
+namespace {
+
+PlatformCursor LoadInvisibleCursor() {
+ auto cursor_loader = CursorLoader::Create();
+ Cursor cursor(mojom::CursorType::kNone);
+ cursor_loader->SetPlatformCursor(&cursor);
+ return cursor.platform();
+}
+
+} // namespace
+
+#if !defined(USE_X11)
+TEST(CursorLoaderTest, InvisibleCursorOnNotX11) {
+#if defined(USE_OZONE)
+ BitmapCursorFactoryOzone cursor_factory;
+#endif
+ EXPECT_EQ(LoadInvisibleCursor(), nullptr);
+}
+#endif
+
+#if defined(USE_X11)
+TEST(CursorLoaderTest, InvisibleCursorOnX11) {
+ X11CursorFactory cursor_factory;
+ // Building an image cursor with an invalid SkBitmap should return the
+ // invisible cursor in X11.
+ auto* invisible_cursor =
+ cursor_factory.CreateImageCursor({}, SkBitmap(), gfx::Point());
+ EXPECT_EQ(LoadInvisibleCursor(), invisible_cursor);
+
+ // Release our refcount on the cursor
+ cursor_factory.UnrefImageCursor(invisible_cursor);
+}
+#endif
+
+} // namespace ui
diff --git a/chromium/ui/base/cursor/cursor_loader_win.cc b/chromium/ui/base/cursor/cursor_loader_win.cc
index 735568dddc0..392fd85d6f3 100644
--- a/chromium/ui/base/cursor/cursor_loader_win.cc
+++ b/chromium/ui/base/cursor/cursor_loader_win.cc
@@ -6,6 +6,8 @@
#include <windows.h>
+#include <memory>
+
#include "base/lazy_instance.h"
#include "base/notreached.h"
#include "ui/base/cursor/cursor.h"
@@ -122,8 +124,8 @@ const wchar_t* GetCursorId(gfx::NativeCursor native_cursor) {
} // namespace
-CursorLoader* CursorLoader::Create() {
- return new CursorLoaderWin;
+std::unique_ptr<CursorLoader> CursorLoader::Create(bool use_platform_cursors) {
+ return std::make_unique<CursorLoaderWin>();
}
CursorLoaderWin::CursorLoaderWin() {
@@ -132,20 +134,7 @@ CursorLoaderWin::CursorLoaderWin() {
CursorLoaderWin::~CursorLoaderWin() {
}
-void CursorLoaderWin::LoadImageCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot) {
- // NOTIMPLEMENTED();
-}
-
-void CursorLoaderWin::LoadAnimatedCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot,
- int frame_delay_ms) {
- // NOTIMPLEMENTED();
-}
-
-void CursorLoaderWin::UnloadAll() {
+void CursorLoaderWin::UnloadCursors() {
// NOTIMPLEMENTED();
}
diff --git a/chromium/ui/base/cursor/cursor_loader_win.h b/chromium/ui/base/cursor/cursor_loader_win.h
index bf3ec63c961..cbe7d000138 100644
--- a/chromium/ui/base/cursor/cursor_loader_win.h
+++ b/chromium/ui/base/cursor/cursor_loader_win.h
@@ -18,14 +18,7 @@ class COMPONENT_EXPORT(UI_BASE_CURSOR) CursorLoaderWin : public CursorLoader {
~CursorLoaderWin() override;
// Overridden from CursorLoader:
- void LoadImageCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot) override;
- void LoadAnimatedCursor(mojom::CursorType id,
- int resource_id,
- const gfx::Point& hot,
- int frame_delay_ms) override;
- void UnloadAll() override;
+ void UnloadCursors() override;
void SetPlatformCursor(gfx::NativeCursor* cursor) override;
// Used to pass the cursor resource module name to the cursor loader. This is
diff --git a/chromium/ui/base/cursor/cursor_util.cc b/chromium/ui/base/cursor/cursor_util.cc
index a19a4ddcf1e..ee513696649 100644
--- a/chromium/ui/base/cursor/cursor_util.cc
+++ b/chromium/ui/base/cursor/cursor_util.cc
@@ -133,6 +133,9 @@ void GetAnimatedCursorBitmaps(int resource_id,
ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
const gfx::ImageSkiaRep& image_rep = image->GetRepresentation(scale);
SkBitmap bitmap = image_rep.GetBitmap();
+
+ // The image is assumed to be a concatenation of animation frames from left to
+ // right. Also, each frame is assumed to be square (width == height).
int frame_width = bitmap.height();
int frame_height = frame_width;
int total_width = bitmap.width();
diff --git a/chromium/ui/base/cursor/cursors_aura.cc b/chromium/ui/base/cursor/cursors_aura.cc
index 710fb8dba11..c527ac4d8eb 100644
--- a/chromium/ui/base/cursor/cursors_aura.cc
+++ b/chromium/ui/base/cursor/cursors_aura.cc
@@ -42,8 +42,6 @@ struct CursorSizeData {
const CursorSize id;
const CursorData* cursors;
const int length;
- const CursorData* animated_cursors;
- const int animated_length;
};
const CursorData kNormalCursors[] = {
@@ -127,6 +125,8 @@ const CursorData kNormalCursors[] = {
{24, 23}},
{mojom::CursorType::kGrab, IDR_AURA_CURSOR_GRAB, {8, 5}, {16, 10}},
{mojom::CursorType::kGrabbing, IDR_AURA_CURSOR_GRABBING, {9, 9}, {18, 18}},
+ {mojom::CursorType::kWait, IDR_AURA_CURSOR_THROBBER, {7, 7}, {14, 14}},
+ {mojom::CursorType::kProgress, IDR_AURA_CURSOR_THROBBER, {7, 7}, {14, 14}},
};
const CursorData kLargeCursors[] = {
@@ -233,20 +233,12 @@ const CursorData kLargeCursors[] = {
IDR_AURA_CURSOR_BIG_GRABBING,
{20, 12},
{40, 24}},
-};
-
-const CursorData kAnimatedCursors[] = {
- {mojom::CursorType::kWait, IDR_AURA_CURSOR_THROBBER, {7, 7}, {14, 14}},
- {mojom::CursorType::kProgress, IDR_AURA_CURSOR_THROBBER, {7, 7}, {14, 14}},
+ // TODO(https://crbug.com/336867): create IDR_AURA_CURSOR_BIG_THROBBER.
};
const CursorSizeData kCursorSizes[] = {
- {CursorSize::kNormal, kNormalCursors, base::size(kNormalCursors),
- kAnimatedCursors, base::size(kAnimatedCursors)},
- {CursorSize::kLarge, kLargeCursors, base::size(kLargeCursors),
- // TODO(yoshiki): Replace animated cursors with big assets.
- // crbug.com/247254
- kAnimatedCursors, base::size(kAnimatedCursors)},
+ {CursorSize::kNormal, kNormalCursors, base::size(kNormalCursors)},
+ {CursorSize::kLarge, kLargeCursors, base::size(kLargeCursors)},
};
const CursorSizeData* GetCursorSizeByType(CursorSize cursor_size) {
@@ -302,25 +294,6 @@ bool GetCursorDataFor(CursorSize cursor_size,
resource_id, point);
}
-bool GetAnimatedCursorDataFor(CursorSize cursor_size,
- mojom::CursorType id,
- float scale_factor,
- int* resource_id,
- gfx::Point* point) {
- const CursorSizeData* cursor_set = GetCursorSizeByType(cursor_size);
- if (cursor_set &&
- SearchTable(cursor_set->animated_cursors, cursor_set->animated_length, id,
- scale_factor, resource_id, point)) {
- return true;
- }
-
- // Falls back to the default cursor set.
- cursor_set = GetCursorSizeByType(ui::CursorSize::kNormal);
- DCHECK(cursor_set);
- return SearchTable(cursor_set->animated_cursors, cursor_set->animated_length,
- id, scale_factor, resource_id, point);
-}
-
SkBitmap GetDefaultBitmap(const Cursor& cursor) {
#if defined(OS_WIN)
Cursor cursor_copy = cursor;
diff --git a/chromium/ui/base/cursor/cursors_aura.h b/chromium/ui/base/cursor/cursors_aura.h
index cc82d976546..69e514ebd57 100644
--- a/chromium/ui/base/cursor/cursors_aura.h
+++ b/chromium/ui/base/cursor/cursors_aura.h
@@ -18,8 +18,6 @@ namespace ui {
class Cursor;
enum class CursorSize;
-const int kAnimatedCursorFrameDelayMs = 25;
-
// Returns data about |id|, where id is a cursor constant like
// ui::mojom::CursorType::kHelp. The IDR will be placed in |resource_id| and
// the hotspots for the different DPIs will be placed in |hot_1x| and
@@ -31,14 +29,6 @@ bool GetCursorDataFor(CursorSize cursor_size,
int* resource_id,
gfx::Point* point);
-// Like above, but for animated cursors.
-COMPONENT_EXPORT(UI_BASE_CURSOR)
-bool GetAnimatedCursorDataFor(CursorSize cursor_size,
- mojom::CursorType id,
- float scale_factor,
- int* resource_id,
- gfx::Point* point);
-
SkBitmap GetDefaultBitmap(const Cursor& cursor);
gfx::Point GetDefaultHotspot(const Cursor& cursor);
diff --git a/chromium/ui/base/cursor/image_cursors.cc b/chromium/ui/base/cursor/image_cursors.cc
deleted file mode 100644
index 42fd3249684..00000000000
--- a/chromium/ui/base/cursor/image_cursors.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/cursor/image_cursors.h"
-
-#include "base/check.h"
-#include "ui/base/cursor/cursor_loader.h"
-#include "ui/base/cursor/cursors_aura.h"
-#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace ui {
-
-namespace {
-
-constexpr mojom::CursorType kImageCursorIds[] = {
- mojom::CursorType::kNull,
- mojom::CursorType::kPointer,
- mojom::CursorType::kNoDrop,
- mojom::CursorType::kNotAllowed,
- mojom::CursorType::kCopy,
- mojom::CursorType::kHand,
- mojom::CursorType::kMove,
- mojom::CursorType::kNorthEastResize,
- mojom::CursorType::kSouthWestResize,
- mojom::CursorType::kSouthEastResize,
- mojom::CursorType::kNorthWestResize,
- mojom::CursorType::kNorthResize,
- mojom::CursorType::kSouthResize,
- mojom::CursorType::kEastResize,
- mojom::CursorType::kWestResize,
- mojom::CursorType::kIBeam,
- mojom::CursorType::kAlias,
- mojom::CursorType::kCell,
- mojom::CursorType::kContextMenu,
- mojom::CursorType::kCross,
- mojom::CursorType::kHelp,
- mojom::CursorType::kVerticalText,
- mojom::CursorType::kZoomIn,
- mojom::CursorType::kZoomOut,
- mojom::CursorType::kRowResize,
- mojom::CursorType::kColumnResize,
- mojom::CursorType::kEastWestResize,
- mojom::CursorType::kNorthSouthResize,
- mojom::CursorType::kNorthEastSouthWestResize,
- mojom::CursorType::kNorthWestSouthEastResize,
- mojom::CursorType::kGrab,
- mojom::CursorType::kGrabbing,
-};
-
-constexpr mojom::CursorType kAnimatedCursorIds[] = {
- mojom::CursorType::kWait, mojom::CursorType::kProgress};
-
-} // namespace
-
-ImageCursors::ImageCursors()
- : cursor_loader_(CursorLoader::Create()),
- cursor_size_(CursorSize::kNormal) {}
-
-ImageCursors::~ImageCursors() = default;
-
-float ImageCursors::GetScale() const {
- return cursor_loader_->scale();
-}
-
-display::Display::Rotation ImageCursors::GetRotation() const {
- return cursor_loader_->rotation();
-}
-
-bool ImageCursors::SetDisplay(const display::Display& display,
- float scale_factor) {
- if (cursor_loader_->rotation() == display.panel_rotation() &&
- cursor_loader_->scale() == scale_factor)
- return false;
-
- cursor_loader_->set_rotation(display.panel_rotation());
- cursor_loader_->set_scale(scale_factor);
- ReloadCursors();
- return true;
-}
-
-void ImageCursors::ReloadCursors() {
- float device_scale_factor = cursor_loader_->scale();
-
- cursor_loader_->UnloadAll();
-
- for (auto cursor_id : kImageCursorIds) {
- int resource_id = -1;
- gfx::Point hot_point;
- bool success = GetCursorDataFor(
- cursor_size_, cursor_id, device_scale_factor, &resource_id, &hot_point);
- DCHECK(success);
- cursor_loader_->LoadImageCursor(cursor_id, resource_id, hot_point);
- }
- for (auto cursor_id : kAnimatedCursorIds) {
- int resource_id = -1;
- gfx::Point hot_point;
- bool success = GetAnimatedCursorDataFor(
- cursor_size_, cursor_id, device_scale_factor, &resource_id, &hot_point);
- DCHECK(success);
- cursor_loader_->LoadAnimatedCursor(cursor_id, resource_id, hot_point,
- kAnimatedCursorFrameDelayMs);
- }
-}
-
-void ImageCursors::SetCursorSize(CursorSize cursor_size) {
- if (cursor_size_ == cursor_size)
- return;
-
- cursor_size_ = cursor_size;
-
- ReloadCursors();
-}
-
-void ImageCursors::SetPlatformCursor(gfx::NativeCursor* cursor) {
- cursor_loader_->SetPlatformCursor(cursor);
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/cursor/image_cursors.h b/chromium/ui/base/cursor/image_cursors.h
deleted file mode 100644
index b5b5ec274dd..00000000000
--- a/chromium/ui/base/cursor/image_cursors.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_CURSOR_IMAGE_CURSORS_H_
-#define UI_BASE_CURSOR_IMAGE_CURSORS_H_
-
-#include <memory>
-
-#include "base/component_export.h"
-#include "ui/base/cursor/cursor_size.h"
-#include "ui/display/display.h"
-#include "ui/gfx/native_widget_types.h"
-
-namespace ui {
-
-class CursorLoader;
-
-// A utility class that provides cursors for NativeCursors for which we have
-// image resources.
-class COMPONENT_EXPORT(UI_BASE_CURSOR) ImageCursors {
- public:
- ImageCursors();
- ImageCursors(const ImageCursors&) = delete;
- ImageCursors& operator=(const ImageCursors&) = delete;
- ~ImageCursors();
-
- // Returns the scale and rotation of the currently loaded cursor.
- float GetScale() const;
- display::Display::Rotation GetRotation() const;
-
- // Sets the display the cursors are loaded for. |scale_factor| determines the
- // size of the image to load. Returns true if the cursor image is reloaded.
- bool SetDisplay(const display::Display& display, float scale_factor);
-
- // Sets the size of the mouse cursor icon.
- void SetCursorSize(CursorSize cursor_size);
-
- // Sets the platform cursor based on the native type of |cursor|.
- void SetPlatformCursor(gfx::NativeCursor* cursor);
-
- private:
- // Reloads the all loaded cursors in the cursor loader.
- void ReloadCursors();
-
- std::unique_ptr<CursorLoader> cursor_loader_;
- CursorSize cursor_size_;
-};
-
-} // namespace ui
-
-#endif // UI_BASE_CURSOR_IMAGE_CURSORS_H_
diff --git a/chromium/ui/base/cursor/ozone/DIR_METADATA b/chromium/ui/base/cursor/ozone/DIR_METADATA
new file mode 100644
index 00000000000..69e73155446
--- /dev/null
+++ b/chromium/ui/base/cursor/ozone/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>GFX"
+} \ No newline at end of file
diff --git a/chromium/ui/base/cursor/ozone/OWNERS b/chromium/ui/base/cursor/ozone/OWNERS
index 1c6f90ab829..479c4d806cc 100644
--- a/chromium/ui/base/cursor/ozone/OWNERS
+++ b/chromium/ui/base/cursor/ozone/OWNERS
@@ -1,4 +1,2 @@
rjkroege@chromium.org
spang@chromium.org
-
-# COMPONENT: UI>GFX
diff --git a/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc b/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
index e86f70ea603..f16c01a02a7 100644
--- a/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
+++ b/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.cc
@@ -7,11 +7,78 @@
#include <algorithm>
#include "base/check_op.h"
+#include "base/notreached.h"
+#include "build/chromeos_buildflags.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
namespace ui {
namespace {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+// Returns true if ozone should use the default cursor for |type|, instead of
+// loading and storing bitmaps for it. Used on Lacros to skip client-side bitmap
+// loading for server-side cursors.
+bool UseDefaultCursorForType(mojom::CursorType type) {
+ using mojom::CursorType;
+ switch (type) {
+ case CursorType::kNull:
+ case CursorType::kPointer:
+ case CursorType::kCross:
+ case CursorType::kHand:
+ case CursorType::kIBeam:
+ case CursorType::kWait:
+ case CursorType::kHelp:
+ case CursorType::kEastResize:
+ case CursorType::kNorthResize:
+ case CursorType::kNorthEastResize:
+ case CursorType::kNorthWestResize:
+ case CursorType::kSouthResize:
+ case CursorType::kSouthEastResize:
+ case CursorType::kSouthWestResize:
+ case CursorType::kWestResize:
+ case CursorType::kNorthSouthResize:
+ case CursorType::kEastWestResize:
+ case CursorType::kNorthEastSouthWestResize:
+ case CursorType::kNorthWestSouthEastResize:
+ case CursorType::kColumnResize:
+ case CursorType::kRowResize:
+ case CursorType::kMiddlePanning:
+ case CursorType::kEastPanning:
+ case CursorType::kNorthPanning:
+ case CursorType::kNorthEastPanning:
+ case CursorType::kNorthWestPanning:
+ case CursorType::kSouthPanning:
+ case CursorType::kSouthEastPanning:
+ case CursorType::kSouthWestPanning:
+ case CursorType::kWestPanning:
+ case CursorType::kMove:
+ case CursorType::kVerticalText:
+ case CursorType::kCell:
+ case CursorType::kContextMenu:
+ case CursorType::kAlias:
+ case CursorType::kProgress:
+ case CursorType::kNoDrop:
+ case CursorType::kCopy:
+ case CursorType::kNotAllowed:
+ case CursorType::kZoomIn:
+ case CursorType::kZoomOut:
+ case CursorType::kGrab:
+ case CursorType::kGrabbing:
+ case CursorType::kDndNone:
+ case CursorType::kDndMove:
+ case CursorType::kDndCopy:
+ case CursorType::kDndLink:
+ return true;
+ case CursorType::kNone:
+ case CursorType::kMiddlePanningVertical:
+ case CursorType::kMiddlePanningHorizontal:
+ case CursorType::kCustom:
+ return false;
+ }
+}
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+
BitmapCursorOzone* ToBitmapCursorOzone(PlatformCursor cursor) {
return static_cast<BitmapCursorOzone*>(cursor);
}
@@ -22,17 +89,25 @@ PlatformCursor ToPlatformCursor(BitmapCursorOzone* cursor) {
} // namespace
-BitmapCursorOzone::BitmapCursorOzone(const SkBitmap& bitmap,
+BitmapCursorOzone::BitmapCursorOzone(mojom::CursorType type)
+ : type_(type), frame_delay_ms_(0) {}
+
+BitmapCursorOzone::BitmapCursorOzone(mojom::CursorType type,
+ const SkBitmap& bitmap,
const gfx::Point& hotspot)
- : hotspot_(hotspot), frame_delay_ms_(0) {
+ : type_(type), hotspot_(hotspot), frame_delay_ms_(0) {
if (!bitmap.isNull())
bitmaps_.push_back(bitmap);
}
-BitmapCursorOzone::BitmapCursorOzone(const std::vector<SkBitmap>& bitmaps,
+BitmapCursorOzone::BitmapCursorOzone(mojom::CursorType type,
+ const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
int frame_delay_ms)
- : bitmaps_(bitmaps), hotspot_(hotspot), frame_delay_ms_(frame_delay_ms) {
+ : type_(type),
+ bitmaps_(bitmaps),
+ hotspot_(hotspot),
+ frame_delay_ms_(frame_delay_ms) {
DCHECK_LT(0U, bitmaps.size());
DCHECK_LE(0, frame_delay_ms);
// No null bitmap should be in the list. Blank cursors should just be an empty
@@ -42,8 +117,7 @@ BitmapCursorOzone::BitmapCursorOzone(const std::vector<SkBitmap>& bitmaps,
bitmaps_.end());
}
-BitmapCursorOzone::~BitmapCursorOzone() {
-}
+BitmapCursorOzone::~BitmapCursorOzone() = default;
const gfx::Point& BitmapCursorOzone::hotspot() {
return hotspot_;
@@ -75,24 +149,35 @@ base::Optional<PlatformCursor> BitmapCursorFactoryOzone::GetDefaultCursor(
mojom::CursorType type) {
if (type == mojom::CursorType::kNone)
return nullptr; // nullptr is used for the hidden cursor.
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ if (UseDefaultCursorForType(type)) {
+ // Lacros uses server-side cursors for most types. These cursors don't need
+ // to load bitmap images on the client.
+ BitmapCursorOzone* cursor = new BitmapCursorOzone(type);
+ cursor->AddRef(); // Balanced by UnrefImageCursor.
+ return ToPlatformCursor(cursor);
+ }
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
return base::nullopt;
}
PlatformCursor BitmapCursorFactoryOzone::CreateImageCursor(
+ mojom::CursorType type,
const SkBitmap& bitmap,
const gfx::Point& hotspot) {
- BitmapCursorOzone* cursor = new BitmapCursorOzone(bitmap, hotspot);
+ BitmapCursorOzone* cursor = new BitmapCursorOzone(type, bitmap, hotspot);
cursor->AddRef(); // Balanced by UnrefImageCursor.
return ToPlatformCursor(cursor);
}
PlatformCursor BitmapCursorFactoryOzone::CreateAnimatedCursor(
+ mojom::CursorType type,
const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
int frame_delay_ms) {
DCHECK_LT(0U, bitmaps.size());
BitmapCursorOzone* cursor =
- new BitmapCursorOzone(bitmaps, hotspot, frame_delay_ms);
+ new BitmapCursorOzone(type, bitmaps, hotspot, frame_delay_ms);
cursor->AddRef(); // Balanced by UnrefImageCursor.
return ToPlatformCursor(cursor);
}
diff --git a/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h b/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h
index b489e099ad0..db049fb4532 100644
--- a/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h
+++ b/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h
@@ -13,6 +13,7 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/cursor_factory.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
#include "ui/gfx/geometry/point.h"
namespace ui {
@@ -21,11 +22,22 @@ namespace ui {
class COMPONENT_EXPORT(UI_BASE_CURSOR) BitmapCursorOzone
: public base::RefCounted<BitmapCursorOzone> {
public:
- BitmapCursorOzone(const SkBitmap& bitmap, const gfx::Point& hotspot);
- BitmapCursorOzone(const std::vector<SkBitmap>& bitmaps,
+ // Creates a cursor that doesn't need backing bitmaps (for example, a
+ // server-side cursor for Lacros).
+ explicit BitmapCursorOzone(mojom::CursorType type);
+
+ // Creates a cursor with a single backing bitmap.
+ BitmapCursorOzone(mojom::CursorType type,
+ const SkBitmap& bitmap,
+ const gfx::Point& hotspot);
+
+ // Creates a cursor with multiple bitmaps for animation.
+ BitmapCursorOzone(mojom::CursorType type,
+ const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
int frame_delay_ms);
+ mojom::CursorType type() const { return type_; }
const gfx::Point& hotspot();
const SkBitmap& bitmap();
@@ -37,6 +49,7 @@ class COMPONENT_EXPORT(UI_BASE_CURSOR) BitmapCursorOzone
friend class base::RefCounted<BitmapCursorOzone>;
~BitmapCursorOzone();
+ const mojom::CursorType type_;
std::vector<SkBitmap> bitmaps_;
gfx::Point hotspot_;
int frame_delay_ms_;
@@ -64,9 +77,11 @@ class COMPONENT_EXPORT(UI_BASE_CURSOR) BitmapCursorFactoryOzone
// CursorFactoryOzone:
base::Optional<PlatformCursor> GetDefaultCursor(
mojom::CursorType type) override;
- PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
+ PlatformCursor CreateImageCursor(mojom::CursorType type,
+ const SkBitmap& bitmap,
const gfx::Point& hotspot) override;
- PlatformCursor CreateAnimatedCursor(const std::vector<SkBitmap>& bitmaps,
+ PlatformCursor CreateAnimatedCursor(mojom::CursorType type,
+ const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
int frame_delay_ms) override;
void RefImageCursor(PlatformCursor cursor) override;
diff --git a/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone_unittest.cc b/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone_unittest.cc
index 0d8dbbfca41..3ed24fe7047 100644
--- a/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone_unittest.cc
+++ b/chromium/ui/base/cursor/ozone/bitmap_cursor_factory_ozone_unittest.cc
@@ -5,6 +5,7 @@
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "base/optional.h"
+#include "build/chromeos_buildflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
@@ -21,4 +22,35 @@ TEST(BitmapCursorFactoryOzoneTest, InvisibleCursor) {
EXPECT_EQ(cursor, nullptr);
}
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+TEST(BitmapCursorFactoryOzoneTest, LacrosUsesDefaultCursorsForCommonTypes) {
+ BitmapCursorFactoryOzone factory;
+
+ // Verify some common cursor types.
+ base::Optional<PlatformCursor> cursor =
+ factory.GetDefaultCursor(mojom::CursorType::kPointer);
+ ASSERT_TRUE(cursor.has_value());
+ EXPECT_NE(cursor, nullptr);
+ factory.UnrefImageCursor(cursor.value());
+
+ cursor = factory.GetDefaultCursor(mojom::CursorType::kHand);
+ ASSERT_TRUE(cursor.has_value());
+ EXPECT_NE(cursor, nullptr);
+ factory.UnrefImageCursor(cursor.value());
+
+ cursor = factory.GetDefaultCursor(mojom::CursorType::kIBeam);
+ ASSERT_TRUE(cursor.has_value());
+ EXPECT_NE(cursor, nullptr);
+ factory.UnrefImageCursor(cursor.value());
+}
+
+TEST(BitmapCursorFactoryOzoneTest, LacrosCustomCursor) {
+ BitmapCursorFactoryOzone factory;
+ base::Optional<PlatformCursor> cursor =
+ factory.GetDefaultCursor(mojom::CursorType::kCustom);
+ // Custom cursors don't have a default platform cursor.
+ EXPECT_FALSE(cursor.has_value());
+}
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+
} // namespace ui
diff --git a/chromium/ui/base/data_transfer_policy/BUILD.gn b/chromium/ui/base/data_transfer_policy/BUILD.gn
new file mode 100644
index 00000000000..aeea4b1d324
--- /dev/null
+++ b/chromium/ui/base/data_transfer_policy/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/ui.gni")
+
+component("data_transfer_policy") {
+ output_name = "ui_base_data_transfer_policy"
+ sources = [
+ "data_transfer_endpoint.cc",
+ "data_transfer_endpoint.h",
+ "data_transfer_policy_controller.cc",
+ "data_transfer_policy_controller.h",
+ ]
+
+ defines = [ "IS_UI_BASE_DATA_TRANSFER_POLICY_IMPL" ]
+
+ deps = [
+ "//base",
+ "//url",
+ ]
+}
diff --git a/chromium/ui/base/data_transfer_policy/DIR_METADATA b/chromium/ui/base/data_transfer_policy/DIR_METADATA
new file mode 100644
index 00000000000..c4701852608
--- /dev/null
+++ b/chromium/ui/base/data_transfer_policy/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "OS>Software>Enterprise>DLP"
+}
+team_email: "chromeos-dlp@google.com" \ No newline at end of file
diff --git a/chromium/ui/base/data_transfer_policy/OWNERS b/chromium/ui/base/data_transfer_policy/OWNERS
new file mode 100644
index 00000000000..11249b99d52
--- /dev/null
+++ b/chromium/ui/base/data_transfer_policy/OWNERS
@@ -0,0 +1,5 @@
+# Primary:
+ayaelattar@chromium.org
+
+# Secondary:
+huangdarwin@chromium.org \ No newline at end of file
diff --git a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.cc b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.cc
new file mode 100644
index 00000000000..a5f3c7bdac8
--- /dev/null
+++ b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.cc
@@ -0,0 +1,39 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
+
+#include "base/check_op.h"
+#include "base/optional.h"
+#include "url/origin.h"
+
+namespace ui {
+
+DataTransferEndpoint::DataTransferEndpoint(const url::Origin& origin,
+ bool notify_if_restricted)
+ : type_(EndpointType::kUrl),
+ origin_(origin),
+ notify_if_restricted_(notify_if_restricted) {}
+
+DataTransferEndpoint::DataTransferEndpoint(EndpointType type,
+ bool notify_if_restricted)
+ : type_(type),
+ origin_(base::nullopt),
+ notify_if_restricted_(notify_if_restricted) {
+ DCHECK_NE(type, EndpointType::kUrl);
+}
+
+DataTransferEndpoint::DataTransferEndpoint(const DataTransferEndpoint& other) =
+ default;
+
+DataTransferEndpoint::DataTransferEndpoint(DataTransferEndpoint&& other) =
+ default;
+
+bool DataTransferEndpoint::operator==(const DataTransferEndpoint& other) const {
+ return origin_ == other.origin_ && type_ == other.type_;
+}
+
+DataTransferEndpoint::~DataTransferEndpoint() = default;
+
+} // namespace ui
diff --git a/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h
new file mode 100644
index 00000000000..cd510a56011
--- /dev/null
+++ b/chromium/ui/base/data_transfer_policy/data_transfer_endpoint.h
@@ -0,0 +1,82 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_DATA_TRANSFER_POLICY_DATA_TRANSFER_ENDPOINT_H_
+#define UI_BASE_DATA_TRANSFER_POLICY_DATA_TRANSFER_ENDPOINT_H_
+
+#include "base/optional.h"
+#include "base/stl_util.h"
+#include "url/origin.h"
+
+namespace ui {
+
+// EndpointType can represent either the source of the transferred data or the
+// destination trying to read the data.
+// Whenever a new format is supported, a new enum should be added.
+enum class EndpointType {
+ kDefault = 0, // This type shouldn't be used if any of the following types is
+ // a better match.
+#if defined(OS_CHROMEOS) || (OS_LINUX) || (OS_FUCHSIA)
+ kGuestOs = 1, // Guest OS: PluginVM, Crostini.
+#endif // defined(OS_CHROMEOS) || (OS_LINUX) || (OS_FUCHSIA)
+#if defined(OS_CHROMEOS)
+ kArc = 2, // ARC.
+#endif // defined(OS_CHROMEOS)
+ kUrl = 3, // Website URL e.g. www.example.com.
+ kClipboardHistory = 4, // Clipboard History UI has privileged access to any
+ // clipboard data.
+ kMaxValue = kClipboardHistory
+};
+
+// DataTransferEndpoint represents:
+// - The source of the data being ransferred.
+// - The destination trying to access the data.
+// - Whether the user should see a notification if the data access is not
+// allowed.
+// Passing DataTransferEndpoint as a nullptr is equivalent to
+// DataTransferEndpoint(kDefault, true). Both specify the same types of
+// endpoints (not a URL/ARC++/...etc, and should show a notification to the user
+// if the data read is not allowed.)
+class COMPONENT_EXPORT(UI_BASE_DATA_TRANSFER_POLICY) DataTransferEndpoint {
+ public:
+ explicit DataTransferEndpoint(const url::Origin& origin,
+ bool notify_if_restricted = true);
+ // This constructor shouldn't be used if |type| == EndpointType::kUrl.
+ explicit DataTransferEndpoint(EndpointType type,
+ bool notify_if_restricted = true);
+
+ DataTransferEndpoint(const DataTransferEndpoint& other);
+ DataTransferEndpoint(DataTransferEndpoint&& other);
+
+ DataTransferEndpoint& operator=(const DataTransferEndpoint& other) = delete;
+ DataTransferEndpoint& operator=(DataTransferEndpoint&& other) = delete;
+
+ bool operator==(const DataTransferEndpoint& other) const;
+
+ ~DataTransferEndpoint();
+
+ bool IsUrlType() const { return type_ == EndpointType::kUrl; }
+
+ const url::Origin* origin() const { return base::OptionalOrNullptr(origin_); }
+
+ EndpointType type() const { return type_; }
+
+ bool notify_if_restricted() const { return notify_if_restricted_; }
+
+ private:
+ // This variable should always have a value representing the object type.
+ const EndpointType type_;
+ // The url::Origin of the data endpoint. It always has a value if `type_` ==
+ // EndpointType::kUrl, otherwise it's empty.
+ const base::Optional<url::Origin> origin_;
+ // This variable should be set to true, if paste is initiated by the user.
+ // Otherwise it should be set to false, so the user won't see a notification
+ // when the data is restricted by the rules of data leak prevention policy
+ // and something in the background is trying to access it.
+ bool notify_if_restricted_ = true;
+};
+
+} // namespace ui
+
+#endif // UI_BASE_DATA_TRANSFER_POLICY_DATA_TRANSFER_ENDPOINT_H_
diff --git a/chromium/ui/base/data_transfer_policy/data_transfer_policy_controller.cc b/chromium/ui/base/data_transfer_policy/data_transfer_policy_controller.cc
new file mode 100644
index 00000000000..fc02854cf90
--- /dev/null
+++ b/chromium/ui/base/data_transfer_policy/data_transfer_policy_controller.cc
@@ -0,0 +1,38 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/data_transfer_policy/data_transfer_policy_controller.h"
+
+namespace ui {
+
+// static
+DataTransferPolicyController* DataTransferPolicyController::Get() {
+ return g_data_transfer_policy_controller_;
+}
+
+// static
+bool DataTransferPolicyController::HasInstance() {
+ return g_data_transfer_policy_controller_ != nullptr;
+}
+
+// static
+void DataTransferPolicyController::DeleteInstance() {
+ if (!g_data_transfer_policy_controller_)
+ return;
+
+ delete g_data_transfer_policy_controller_;
+}
+
+DataTransferPolicyController::DataTransferPolicyController() {
+ g_data_transfer_policy_controller_ = this;
+}
+
+DataTransferPolicyController::~DataTransferPolicyController() {
+ g_data_transfer_policy_controller_ = nullptr;
+}
+
+DataTransferPolicyController*
+ DataTransferPolicyController::g_data_transfer_policy_controller_ = nullptr;
+
+} // namespace ui
diff --git a/chromium/ui/base/data_transfer_policy/data_transfer_policy_controller.h b/chromium/ui/base/data_transfer_policy/data_transfer_policy_controller.h
new file mode 100644
index 00000000000..a858af9b447
--- /dev/null
+++ b/chromium/ui/base/data_transfer_policy/data_transfer_policy_controller.h
@@ -0,0 +1,46 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_DATA_TRANSFER_POLICY_DATA_TRANSFER_POLICY_CONTROLLER_H_
+#define UI_BASE_DATA_TRANSFER_POLICY_DATA_TRANSFER_POLICY_CONTROLLER_H_
+
+#include "base/component_export.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
+
+namespace ui {
+
+// The DataTransfer filter controls transferring data via drag-and-drop and
+// clipboard read operations. It allows/disallows transferring the data given
+// the source of the data and the destination trying to access the data and a
+// set of rules controlling these source and destination.
+class COMPONENT_EXPORT(UI_BASE_DATA_TRANSFER_POLICY)
+ DataTransferPolicyController {
+ public:
+ // Returns a pointer to the existing instance of the class.
+ static DataTransferPolicyController* Get();
+
+ // Returns true if an instance exists, without forcing an initialization.
+ static bool HasInstance();
+
+ // Deletes the existing instance of the class if it's already created.
+ // Indicates that restricting data transfer is no longer required.
+ static void DeleteInstance();
+
+ virtual bool IsDataReadAllowed(
+ const DataTransferEndpoint* const data_src,
+ const DataTransferEndpoint* const data_dst) const = 0;
+
+ protected:
+ DataTransferPolicyController();
+ virtual ~DataTransferPolicyController();
+
+ private:
+ // A singleton of DataTransferPolicyController. Equals nullptr when there's
+ // not any data transfer restrictions required.
+ static DataTransferPolicyController* g_data_transfer_policy_controller_;
+};
+
+} // namespace ui
+
+#endif // UI_BASE_DATA_TRANSFER_POLICY_DATA_TRANSFER_POLICY_CONTROLLER_H_
diff --git a/chromium/ui/base/dragdrop/DIR_METADATA b/chromium/ui/base/dragdrop/DIR_METADATA
new file mode 100644
index 00000000000..185817f957c
--- /dev/null
+++ b/chromium/ui/base/dragdrop/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Blink>DataTransfer"
+}
+team_email: "storage-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/base/dragdrop/OWNERS b/chromium/ui/base/dragdrop/OWNERS
index 9f471ef04e3..7baa107fd51 100644
--- a/chromium/ui/base/dragdrop/OWNERS
+++ b/chromium/ui/base/dragdrop/OWNERS
@@ -3,6 +3,3 @@ huangdarwin@chromium.org
# Secondary:
dcheng@chromium.org
-
-# TEAM: storage-dev@chromium.org
-# COMPONENT: Blink>DataTransfer
diff --git a/chromium/ui/base/dragdrop/os_exchange_data.cc b/chromium/ui/base/dragdrop/os_exchange_data.cc
index 7f2da0ddeff..9d708acc056 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data.cc
@@ -10,6 +10,7 @@
#include "base/callback.h"
#include "base/pickle.h"
#include "ui/base/clipboard/clipboard_format_type.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/base/dragdrop/os_exchange_data_provider_factory.h"
#include "url/gurl.h"
@@ -160,4 +161,13 @@ bool OSExchangeData::GetHtml(base::string16* html, GURL* base_url) const {
}
#endif
+void OSExchangeData::SetSource(
+ std::unique_ptr<DataTransferEndpoint> data_source) {
+ provider_->SetSource(std::move(data_source));
+}
+
+DataTransferEndpoint* OSExchangeData::GetSource() const {
+ return provider_->GetSource();
+}
+
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/os_exchange_data.h b/chromium/ui/base/dragdrop/os_exchange_data.h
index a5098f57439..067e2108655 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data.h
@@ -32,6 +32,7 @@ class Pickle;
namespace ui {
class ClipboardFormatType;
+class DataTransferEndpoint;
struct FileInfo;
///////////////////////////////////////////////////////////////////////////////
@@ -186,6 +187,12 @@ class COMPONENT_EXPORT(UI_BASE) OSExchangeData {
bool HasHtml() const;
#endif
+ // Adds a DataTransferEndpoint to represent the source of the data.
+ // TODO(crbug.com/1142406): Update all drag-and-drop references to set the
+ // source of the data.
+ void SetSource(std::unique_ptr<DataTransferEndpoint> data_source);
+ DataTransferEndpoint* GetSource() const;
+
private:
// Provides the actual data.
std::unique_ptr<OSExchangeDataProvider> provider_;
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider.h b/chromium/ui/base/dragdrop/os_exchange_data_provider.h
index 1a7186b2c6d..b398fe64fa0 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider.h
@@ -31,6 +31,8 @@
namespace ui {
+class DataTransferEndpoint;
+
// Controls whether or not filenames should be converted to file: URLs when
// getting a URL.
enum class FilenameToURLPolicy {
@@ -71,7 +73,7 @@ class COMPONENT_EXPORT(UI_BASE_DATA_EXCHANGE) OSExchangeDataProvider {
virtual bool HasFile() const = 0;
virtual bool HasCustomFormat(const ClipboardFormatType& format) const = 0;
-#if defined(USE_X11) || defined(OS_WIN)
+#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_WIN)
virtual void SetFileContents(const base::FilePath& filename,
const std::string& file_contents) = 0;
#endif
@@ -105,6 +107,10 @@ class COMPONENT_EXPORT(UI_BASE_DATA_EXCHANGE) OSExchangeDataProvider {
virtual gfx::ImageSkia GetDragImage() const = 0;
virtual gfx::Vector2d GetDragImageOffset() const = 0;
#endif
+
+ // These functions are only implemented on Chrome OS currently.
+ virtual void SetSource(std::unique_ptr<DataTransferEndpoint> data_source) = 0;
+ virtual DataTransferEndpoint* GetSource() const = 0;
};
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.h b/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.h
index 8fb6a3ad5c6..1626a146078 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.h
@@ -76,6 +76,9 @@ class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderMac
// OSExchangeData.
static NSArray* SupportedPasteboardTypes();
+ void SetSource(std::unique_ptr<DataTransferEndpoint> data_source) override;
+ DataTransferEndpoint* GetSource() const override;
+
protected:
OSExchangeDataProviderMac();
OSExchangeDataProviderMac(const OSExchangeDataProviderMac&);
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.mm b/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.mm
index b7f144452f3..f264b8b5eb1 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.mm
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_mac.mm
@@ -17,6 +17,7 @@
#include "ui/base/clipboard/clipboard_format_type.h"
#import "ui/base/clipboard/clipboard_util_mac.h"
#include "ui/base/clipboard/custom_data_helper.h"
+#include "ui/base/data_transfer_policy/data_transfer_policy_controller.h"
#import "ui/base/dragdrop/cocoa_dnd_util.h"
#include "ui/base/dragdrop/file_info/file_info.h"
#include "url/gurl.h"
@@ -337,4 +338,11 @@ NSArray* OSExchangeDataProviderMac::SupportedPasteboardTypes() {
];
}
+void OSExchangeDataProviderMac::SetSource(
+ std::unique_ptr<DataTransferEndpoint> data_source) {}
+
+DataTransferEndpoint* OSExchangeDataProviderMac::GetSource() const {
+ return nullptr;
+}
+
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc b/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc
index a3722644622..a858abbe290 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc
@@ -12,6 +12,7 @@
#include "base/strings/utf_string_conversions.h"
#include "net/base/filename_util.h"
#include "ui/base/clipboard/clipboard_format_type.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/base/dragdrop/file_info/file_info.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "url/gurl.h"
@@ -42,10 +43,17 @@ std::unique_ptr<OSExchangeDataProvider> OSExchangeDataProviderNonBacked::Clone()
void OSExchangeDataProviderNonBacked::MarkOriginatedFromRenderer() {
// TODO(dcheng): Currently unneeded because ChromeOS Aura correctly separates
// URL and filename metadata, and does not implement the DownloadURL protocol.
+#if !defined(OS_CHROMEOS)
+ originated_from_renderer_ = true;
+#endif
}
bool OSExchangeDataProviderNonBacked::DidOriginateFromRenderer() const {
+#if defined(OS_CHROMEOS)
return false;
+#else
+ return originated_from_renderer_;
+#endif
}
void OSExchangeDataProviderNonBacked::SetString(const base::string16& data) {
@@ -85,6 +93,15 @@ void OSExchangeDataProviderNonBacked::SetPickledData(
}
bool OSExchangeDataProviderNonBacked::GetString(base::string16* data) const {
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+ if (HasFile()) {
+ // Various Linux file managers both pass a list of file:// URIs and set the
+ // string representation to the URI. We explicitly don't want to return use
+ // this representation.
+ return false;
+ }
+#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
+
if ((formats_ & OSExchangeData::STRING) == 0)
return false;
*data = string_;
@@ -160,11 +177,11 @@ bool OSExchangeDataProviderNonBacked::HasCustomFormat(
return base::Contains(pickle_data_, format);
}
-#if defined(USE_X11)
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
void OSExchangeDataProviderNonBacked::SetFileContents(
const base::FilePath& filename,
const std::string& file_contents) {
- NOTREACHED();
+ NOTIMPLEMENTED();
}
#endif
@@ -230,4 +247,13 @@ bool OSExchangeDataProviderNonBacked::GetPlainTextURL(GURL* url) const {
return true;
}
+void OSExchangeDataProviderNonBacked::SetSource(
+ std::unique_ptr<DataTransferEndpoint> data_source) {
+ source_ = std::move(data_source);
+}
+
+DataTransferEndpoint* OSExchangeDataProviderNonBacked::GetSource() const {
+ return source_.get();
+}
+
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.h b/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.h
index 0ae453e067a..c30cef45611 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_non_backed.h
@@ -6,9 +6,11 @@
#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_NON_BACKED_H_
#include <map>
+#include <memory>
#include "base/component_export.h"
#include "base/pickle.h"
+#include "build/build_config.h"
#include "ui/base/dragdrop/file_info/file_info.h"
#include "ui/base/dragdrop/os_exchange_data_provider.h"
#include "ui/gfx/geometry/vector2d.h"
@@ -58,7 +60,7 @@ class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderNonBacked
bool HasURL(FilenameToURLPolicy policy) const override;
bool HasFile() const override;
bool HasCustomFormat(const ClipboardFormatType& format) const override;
-#if defined(USE_X11)
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
void SetFileContents(const base::FilePath& filename,
const std::string& file_contents) override;
#endif
@@ -71,6 +73,9 @@ class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderNonBacked
gfx::ImageSkia GetDragImage() const override;
gfx::Vector2d GetDragImageOffset() const override;
+ void SetSource(std::unique_ptr<DataTransferEndpoint> data_source) override;
+ DataTransferEndpoint* GetSource() const override;
+
private:
// Returns true if |formats_| contains a file format and the file name can be
// parsed as a URL.
@@ -104,6 +109,13 @@ class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderNonBacked
// For HTML format
base::string16 html_;
GURL base_url_;
+
+#if !defined(OS_CHROMEOS)
+ bool originated_from_renderer_ = false;
+#endif
+
+ // Data source.
+ std::unique_ptr<DataTransferEndpoint> source_;
};
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
index 4fdfcbe7e01..516fb31fcbd 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
@@ -24,6 +24,7 @@
#include "base/notreached.h"
#include "base/pickle.h"
#include "base/stl_util.h"
+#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/win/scoped_hdc.h"
#include "base/win/scoped_hglobal.h"
@@ -33,8 +34,10 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/clipboard_format_type.h"
#include "ui/base/clipboard/clipboard_util_win.h"
+#include "ui/base/data_transfer_policy/data_transfer_policy_controller.h"
#include "ui/base/dragdrop/file_info/file_info.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/l10n_util_win.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/skbitmap_operations.h"
@@ -64,8 +67,8 @@ const ClipboardFormatType& GetRendererTaintFormatType();
// Creates the contents of an Internet Shortcut file for the given URL.
std::string GetInternetShortcutFileContents(const GURL& url);
// Creates a valid file name given a suggested title and URL.
-base::string16 CreateValidFileNameFromTitle(const GURL& url,
- const base::string16& title);
+std::wstring CreateValidFileNameFromTitle(const GURL& url,
+ const std::wstring& title);
} // namespace
@@ -329,7 +332,8 @@ void OSExchangeDataProviderWin::SetURL(const GURL& url,
ClipboardFormatType::GetMozUrlType().ToFormatEtc(), storage));
// Add a .URL shortcut file for dragging to Explorer.
- base::string16 valid_file_name = CreateValidFileNameFromTitle(url, title);
+ std::wstring valid_file_name =
+ CreateValidFileNameFromTitle(url, base::AsWString(title));
std::string shortcut_url_file_contents = GetInternetShortcutFileContents(url);
SetFileContents(base::FilePath(valid_file_name), shortcut_url_file_contents);
@@ -400,7 +404,7 @@ void OSExchangeDataProviderWin::SetVirtualFileContentsForTesting(
for (size_t i = 0; i < num_files; i++) {
// Fill in each FILEDESCRIPTORW with file name.
descriptor->fgd[i].dwFlags |= FD_UNICODE;
- base::string16 file_name = filenames_and_contents[i].first.value();
+ std::wstring file_name = filenames_and_contents[i].first.value();
wcsncpy_s(descriptor->fgd[i].cFileName, MAX_PATH, file_name.c_str(),
std::min(file_name.size(), static_cast<size_t>(MAX_PATH - 1u)));
@@ -544,7 +548,7 @@ bool OSExchangeDataProviderWin::GetURLAndTitle(FilenameToURLPolicy policy,
}
bool OSExchangeDataProviderWin::GetFilename(base::FilePath* path) const {
- std::vector<base::string16> filenames;
+ std::vector<std::wstring> filenames;
bool success = ClipboardUtil::GetFilenames(source_object_.Get(), &filenames);
if (success)
*path = base::FilePath(filenames[0]);
@@ -553,11 +557,11 @@ bool OSExchangeDataProviderWin::GetFilename(base::FilePath* path) const {
bool OSExchangeDataProviderWin::GetFilenames(
std::vector<FileInfo>* filenames) const {
- std::vector<base::string16> filenames_local;
+ std::vector<std::wstring> filenames_local;
bool success =
ClipboardUtil::GetFilenames(source_object_.Get(), &filenames_local);
if (success) {
- for (const base::string16& filename_local : filenames_local)
+ for (const std::wstring& filename_local : filenames_local)
filenames->push_back(
FileInfo(base::FilePath(filename_local), base::FilePath()));
}
@@ -619,7 +623,7 @@ bool OSExchangeDataProviderWin::GetPickledData(
bool OSExchangeDataProviderWin::GetFileContents(
base::FilePath* filename,
std::string* file_contents) const {
- base::string16 filename_str;
+ std::wstring filename_str;
if (!ClipboardUtil::GetFileContents(source_object_.Get(), &filename_str,
file_contents)) {
return false;
@@ -734,6 +738,13 @@ gfx::Vector2d OSExchangeDataProviderWin::GetDragImageOffset() const {
return gfx::Vector2d();
}
+void OSExchangeDataProviderWin::SetSource(
+ std::unique_ptr<DataTransferEndpoint> data_source) {}
+
+DataTransferEndpoint* OSExchangeDataProviderWin::GetSource() const {
+ return nullptr;
+}
+
///////////////////////////////////////////////////////////////////////////////
// DataObjectImpl, IDataObject implementation:
@@ -1195,7 +1206,7 @@ STGMEDIUM CreateIdListStorageForFileName(const base::FilePath& path) {
}
STGMEDIUM CreateStorageForFileDescriptor(const base::FilePath& path) {
- base::string16 file_name = path.value();
+ std::wstring file_name = path.value();
DCHECK(!file_name.empty());
HANDLE hdata = GlobalAlloc(GPTR, sizeof(FILEGROUPDESCRIPTORW));
base::win::ScopedHGlobal<FILEGROUPDESCRIPTORW*> locked_mem(hdata);
@@ -1224,16 +1235,16 @@ std::string GetInternetShortcutFileContents(const GURL& url) {
return kInternetShortcutFileStart + url.spec() + kInternetShortcutFileEnd;
}
-base::string16 CreateValidFileNameFromTitle(const GURL& url,
- const base::string16& title) {
- base::string16 validated;
+std::wstring CreateValidFileNameFromTitle(const GURL& url,
+ const std::wstring& title) {
+ std::wstring validated;
if (title.empty()) {
if (url.is_valid()) {
- validated = net::GetSuggestedFilename(url, "", "", "", "", std::string());
+ validated = base::AsWString(
+ net::GetSuggestedFilename(url, "", "", "", "", std::string()));
} else {
// Nothing else can be done, just use a default.
- validated =
- l10n_util::GetStringUTF16(IDS_APP_UNTITLED_SHORTCUT_FILE_NAME);
+ validated = l10n_util::GetWideString(IDS_APP_UNTITLED_SHORTCUT_FILE_NAME);
}
} else {
validated = title;
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h
index 1fb90911a46..447a3efdba1 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.h
@@ -191,6 +191,9 @@ class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderWin
gfx::ImageSkia GetDragImage() const override;
gfx::Vector2d GetDragImageOffset() const override;
+ void SetSource(std::unique_ptr<DataTransferEndpoint> data_source) override;
+ DataTransferEndpoint* GetSource() const override;
+
private:
void SetVirtualFileContentAtIndexForTesting(base::span<const uint8_t> data,
DWORD tymed,
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.cc b/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.cc
index d4555f18894..8365cc492e5 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.cc
@@ -8,6 +8,7 @@
#include "base/check.h"
#include "ui/base/clipboard/clipboard_constants.h"
+#include "ui/base/data_transfer_policy/data_transfer_policy_controller.h"
#include "ui/base/x/selection_utils.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/x/x11_atom_cache.h"
@@ -46,4 +47,11 @@ bool OSExchangeDataProviderX11::DispatchXEvent(x11::Event* xev) {
return false;
}
+void OSExchangeDataProviderX11::SetSource(
+ std::unique_ptr<DataTransferEndpoint> data_source) {}
+
+DataTransferEndpoint* OSExchangeDataProviderX11::GetSource() const {
+ return nullptr;
+}
+
} // namespace ui
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.h b/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.h
index a85e864624e..60dac520176 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.h
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_x11.h
@@ -38,6 +38,9 @@ class COMPONENT_EXPORT(UI_BASE) OSExchangeDataProviderX11
// XEventDispatcher:
bool DispatchXEvent(x11::Event* xev) override;
+ void SetSource(std::unique_ptr<DataTransferEndpoint> data_source) override;
+ DataTransferEndpoint* GetSource() const override;
+
private:
friend class OSExchangeDataProviderX11Test;
};
diff --git a/chromium/ui/base/emoji/DIR_METADATA b/chromium/ui/base/emoji/DIR_METADATA
new file mode 100644
index 00000000000..198db497480
--- /dev/null
+++ b/chromium/ui/base/emoji/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Internals>Input"
+}
diff --git a/chromium/ui/base/emoji/OWNERS b/chromium/ui/base/emoji/OWNERS
deleted file mode 100644
index 776ce1a5de3..00000000000
--- a/chromium/ui/base/emoji/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-# COMPONENT: Internal>Input
diff --git a/chromium/ui/base/glib/DIR_METADATA b/chromium/ui/base/glib/DIR_METADATA
new file mode 100644
index 00000000000..63fc482f75d
--- /dev/null
+++ b/chromium/ui/base/glib/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Internals"
+} \ No newline at end of file
diff --git a/chromium/ui/base/glib/OWNERS b/chromium/ui/base/glib/OWNERS
deleted file mode 100644
index f136fc175b8..00000000000
--- a/chromium/ui/base/glib/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-# COMPONENT: Internals
diff --git a/chromium/ui/base/idle/BUILD.gn b/chromium/ui/base/idle/BUILD.gn
index 3c137d0779d..adfd4c02bc5 100644
--- a/chromium/ui/base/idle/BUILD.gn
+++ b/chromium/ui/base/idle/BUILD.gn
@@ -55,12 +55,13 @@ component("idle") {
}
if (use_x11 && !is_chromeos) {
- deps += [ "//ui/gfx/x" ]
- sources += [
- "idle_query_x11.cc",
- "idle_query_x11.h",
- "screensaver_window_finder_x11.cc",
- "screensaver_window_finder_x11.h",
+ deps += [ "//ui/base/x" ]
+ }
+
+ if (use_ozone) {
+ deps += [
+ "//ui/base:features",
+ "//ui/display",
]
}
diff --git a/chromium/ui/base/idle/DIR_METADATA b/chromium/ui/base/idle/DIR_METADATA
new file mode 100644
index 00000000000..63fc482f75d
--- /dev/null
+++ b/chromium/ui/base/idle/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Internals"
+} \ No newline at end of file
diff --git a/chromium/ui/base/idle/OWNERS b/chromium/ui/base/idle/OWNERS
deleted file mode 100644
index f136fc175b8..00000000000
--- a/chromium/ui/base/idle/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-# COMPONENT: Internals
diff --git a/chromium/ui/base/idle/idle_linux.cc b/chromium/ui/base/idle/idle_linux.cc
index 3f13e93c146..bd8a44d733f 100644
--- a/chromium/ui/base/idle/idle_linux.cc
+++ b/chromium/ui/base/idle/idle_linux.cc
@@ -7,36 +7,56 @@
#include "ui/base/idle/idle_internal.h"
#if defined(USE_X11)
-#include "ui/base/idle/idle_query_x11.h"
-#include "ui/base/idle/screensaver_window_finder_x11.h"
+#include "ui/base/x/x11_idle_query.h"
+#include "ui/base/x/x11_screensaver_window_finder.h"
+#endif
+
+#if defined(USE_OZONE)
#include "ui/base/ui_base_features.h"
+#include "ui/display/screen.h"
#endif
namespace ui {
int CalculateIdleTime() {
-// TODO(https://crbug.com/1098201): calculate idle time for Ozone/Linux.
-#if defined(USE_X11)
- if (!features::IsUsingOzonePlatform()) {
- IdleQueryX11 idle_query;
- return idle_query.IdleTime();
+#if defined(USE_OZONE)
+ if (features::IsUsingOzonePlatform()) {
+ auto* const screen = display::Screen::GetScreen();
+ // The screen can be nullptr in tests.
+ if (!screen)
+ return 0;
+ return screen->CalculateIdleTime().InSeconds();
}
#endif
+#if defined(USE_X11)
+ IdleQueryX11 idle_query;
+ return idle_query.IdleTime();
+#else
+ NOTIMPLEMENTED_LOG_ONCE();
return 0;
+#endif
}
bool CheckIdleStateIsLocked() {
if (IdleStateForTesting().has_value())
return IdleStateForTesting().value() == IDLE_STATE_LOCKED;
-// TODO(https://crbug.com/1098202): fix screensaver.
-#if defined(USE_X11)
- if (!features::IsUsingOzonePlatform()) {
- // Usually the screensaver is used to lock the screen.
- return ScreensaverWindowFinder::ScreensaverWindowExists();
+#if defined(USE_OZONE)
+ if (features::IsUsingOzonePlatform()) {
+ auto* const screen = display::Screen::GetScreen();
+ // The screen can be nullptr in tests.
+ if (!screen)
+ return false;
+ return screen->IsScreenSaverActive();
}
#endif
+#if defined(USE_X11)
+ // Usually the screensaver is used to lock the screen.
+ return ScreensaverWindowFinder::ScreensaverWindowExists();
+#else
+ NOTIMPLEMENTED_LOG_ONCE();
return false;
+#endif
}
} // namespace ui
diff --git a/chromium/ui/base/ime/DIR_METADATA b/chromium/ui/base/ime/DIR_METADATA
new file mode 100644
index 00000000000..40507e198d2
--- /dev/null
+++ b/chromium/ui/base/ime/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Input>Text>IME"
+} \ No newline at end of file
diff --git a/chromium/ui/base/ime/OWNERS b/chromium/ui/base/ime/OWNERS
index 42b1af0cd7a..5e184ce0640 100644
--- a/chromium/ui/base/ime/OWNERS
+++ b/chromium/ui/base/ime/OWNERS
@@ -7,5 +7,4 @@ keithlee@chromium.org
yukishiino@chromium.org
# For Windows.
-yukawa@chromium.org
-# COMPONENT: UI>Input>Text>IME
+yukawa@chromium.org \ No newline at end of file
diff --git a/chromium/ui/base/ime/chromeos/BUILD.gn b/chromium/ui/base/ime/chromeos/BUILD.gn
index ed2a8b8f88a..0d4ff07fd7d 100644
--- a/chromium/ui/base/ime/chromeos/BUILD.gn
+++ b/chromium/ui/base/ime/chromeos/BUILD.gn
@@ -14,6 +14,7 @@ component("chromeos") {
sources = [
"component_extension_ime_manager.cc",
"component_extension_ime_manager.h",
+ "component_extension_ime_manager_delegate.h",
"extension_ime_util.cc",
"extension_ime_util.h",
"fake_ime_keyboard.cc",
diff --git a/chromium/ui/base/ime/input_method_base.cc b/chromium/ui/base/ime/input_method_base.cc
index eac91312d04..36a615a58b4 100644
--- a/chromium/ui/base/ime/input_method_base.cc
+++ b/chromium/ui/base/ime/input_method_base.cc
@@ -5,7 +5,7 @@
#include "ui/base/ime/input_method_base.h"
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/check.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
diff --git a/chromium/ui/base/ime/linux/composition_text_util_pango.cc b/chromium/ui/base/ime/linux/composition_text_util_pango.cc
index 84ccf531bde..db18d1949f5 100644
--- a/chromium/ui/base/ime/linux/composition_text_util_pango.cc
+++ b/chromium/ui/base/ime/linux/composition_text_util_pango.cc
@@ -30,10 +30,10 @@ void ExtractCompositionTextFromGtkPreedit(const char* utf8_text,
// conversion here.
std::vector<size_t> char16_offsets;
size_t length = composition->text.length();
- base::i18n::UTF16CharIterator char_iterator(&composition->text);
- do {
+ for (base::i18n::UTF16CharIterator char_iterator(composition->text);
+ !char_iterator.end(); char_iterator.Advance()) {
char16_offsets.push_back(char_iterator.array_pos());
- } while (char_iterator.Advance());
+ }
// The text length in Unicode characters.
int char_length = static_cast<int>(char16_offsets.size());
diff --git a/chromium/ui/base/ime/mock_input_method.cc b/chromium/ui/base/ime/mock_input_method.cc
index 62702077507..6ef10947256 100644
--- a/chromium/ui/base/ime/mock_input_method.cc
+++ b/chromium/ui/base/ime/mock_input_method.cc
@@ -4,8 +4,8 @@
#include "ui/base/ime/mock_input_method.h"
-#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/callback_helpers.h"
#include "build/build_config.h"
#include "ui/base/ime/input_method_delegate.h"
#include "ui/base/ime/text_input_client.h"
diff --git a/chromium/ui/base/ime/mojom/text_input_state.mojom b/chromium/ui/base/ime/mojom/text_input_state.mojom
index d52feb42d0a..cba3427a944 100644
--- a/chromium/ui/base/ime/mojom/text_input_state.mojom
+++ b/chromium/ui/base/ime/mojom/text_input_state.mojom
@@ -33,7 +33,7 @@ struct TextInputState {
uint32 flags;
// The value of input field.
- mojo_base.mojom.String16? value;
+ mojo_base.mojom.BigString16? value;
// The current selection range, or the caret position if nothing is selected.
gfx.mojom.Range selection;
diff --git a/chromium/ui/base/ime/utf_offset.cc b/chromium/ui/base/ime/utf_offset.cc
new file mode 100644
index 00000000000..f6d4bd13d50
--- /dev/null
+++ b/chromium/ui/base/ime/utf_offset.cc
@@ -0,0 +1,41 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/ime/utf_offset.h"
+
+#include <string>
+
+#include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
+#include "base/strings/utf_string_conversions.h"
+
+namespace ui {
+
+base::Optional<size_t> Utf16OffsetFromUtf8Offset(base::StringPiece text,
+ size_t utf8_offset) {
+ if (utf8_offset > text.length())
+ return base::nullopt;
+
+ // TODO(hidehiko): Update not to depend on UTF8ToUTF16 to avoid
+ // unnecessary memory allocation.
+ base::string16 converted;
+ if (!base::UTF8ToUTF16(text.data(), utf8_offset, &converted))
+ return base::nullopt;
+ return converted.length();
+}
+
+base::Optional<size_t> Utf8OffsetFromUtf16Offset(base::StringPiece16 text,
+ size_t utf16_offset) {
+ if (utf16_offset > text.length())
+ return base::nullopt;
+
+ // TODO(hidehiko): Update not to depend on UTF16ToUTF8 to avoid
+ // unnecessary memory allocation.
+ std::string converted;
+ if (!base::UTF16ToUTF8(text.data(), utf16_offset, &converted))
+ return base::nullopt;
+ return converted.length();
+}
+
+} // namespace ui
diff --git a/chromium/ui/base/ime/utf_offset.h b/chromium/ui/base/ime/utf_offset.h
new file mode 100644
index 00000000000..fc2ce21d4bc
--- /dev/null
+++ b/chromium/ui/base/ime/utf_offset.h
@@ -0,0 +1,30 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_IME_UTF_OFFSET_H_
+#define UI_BASE_IME_UTF_OFFSET_H_
+
+#include "base/component_export.h"
+#include "base/optional.h"
+#include "base/strings/string_piece_forward.h"
+
+namespace ui {
+
+// Given UTF8 string and its valid offset, returns the offset in UTF16.
+// Returns nullopt if the given offset is invalid (not at a valid boundary
+// or out of range).
+COMPONENT_EXPORT(UI_BASE)
+base::Optional<size_t> Utf16OffsetFromUtf8Offset(base::StringPiece text,
+ size_t utf8_offset);
+
+// Given UTF16 string and its valid offset, returns the offset in UTF8.
+// Returns nullopt if the given offset is invalid (not at a valid boundary
+// or out of range).
+COMPONENT_EXPORT(UI_BASE)
+base::Optional<size_t> Utf8OffsetFromUtf16Offset(base::StringPiece16 text,
+ size_t utf16_offset);
+
+} // namespace ui
+
+#endif // UI_BASE_IME_UTF_OFFSET_H_
diff --git a/chromium/ui/base/ime/utf_offset_unittest.cc b/chromium/ui/base/ime/utf_offset_unittest.cc
new file mode 100644
index 00000000000..2c4af2576dc
--- /dev/null
+++ b/chromium/ui/base/ime/utf_offset_unittest.cc
@@ -0,0 +1,140 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/ime/utf_offset.h"
+
+#include "base/optional.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ui {
+namespace {
+
+TEST(UtfOffsetTest, Utf16OffsetFromUtf8Offset) {
+ constexpr struct {
+ const char* str;
+ size_t offset;
+ base::Optional<size_t> expect;
+ } kTestCases[] = {
+ // 1 byte letters.
+ {u8"ab", 0, 0},
+ {u8"ab", 1, 1},
+ {u8"ab", 2, 2},
+ {u8"ab", 3, base::nullopt},
+
+ // 2 byte letters. \u03A9=\xCE\xA9 is greek OMEGA.
+ {u8"\u03A9\u03A9", 0, 0},
+ {u8"\u03A9\u03A9", 1, base::nullopt},
+ {u8"\u03A9\u03A9", 2, 1},
+ {u8"\u03A9\u03A9", 3, base::nullopt},
+ {u8"\u03A9\u03A9", 4, 2},
+ {u8"\u03A9\u03A9", 5, base::nullopt},
+
+ // 3 byte letters. \u3042=\xE3\x81\x82 is Japanese "A".
+ {u8"\u3042\u3042", 0, 0},
+ {u8"\u3042\u3042", 1, base::nullopt},
+ {u8"\u3042\u3042", 2, base::nullopt},
+ {u8"\u3042\u3042", 3, 1},
+ {u8"\u3042\u3042", 4, base::nullopt},
+ {u8"\u3042\u3042", 5, base::nullopt},
+ {u8"\u3042\u3042", 6, 2},
+ {u8"\u3042\u3042", 7, base::nullopt},
+
+ // 4 byte letters. \U0001F3B7=\xF0\x9F\x8E\xB7 is "SAXOPHONE" emoji.
+ // Note that a surrogate pair advances by 2 in UTF16.
+ {u8"\U0001F3B7\U0001F3B7", 0, 0},
+ {u8"\U0001F3B7\U0001F3B7", 1, base::nullopt},
+ {u8"\U0001F3B7\U0001F3B7", 2, base::nullopt},
+ {u8"\U0001F3B7\U0001F3B7", 3, base::nullopt},
+ {u8"\U0001F3B7\U0001F3B7", 4, 2},
+ {u8"\U0001F3B7\U0001F3B7", 5, base::nullopt},
+ {u8"\U0001F3B7\U0001F3B7", 6, base::nullopt},
+ {u8"\U0001F3B7\U0001F3B7", 7, base::nullopt},
+ {u8"\U0001F3B7\U0001F3B7", 8, 4},
+ {u8"\U0001F3B7\U0001F3B7", 9, base::nullopt},
+
+ // Mix case.
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 0, 0},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 1, 1},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 2, base::nullopt},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 3, 2},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 4, 3},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 5, base::nullopt},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 6, base::nullopt},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 7, 4},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 8, 5},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 9, base::nullopt},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 10, base::nullopt},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 11, base::nullopt},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 12, 7},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 13, 8},
+ {u8"a\u03A9b\u3042c\U0001F3B7d", 14, base::nullopt},
+ };
+
+ for (const auto& test_case : kTestCases) {
+ EXPECT_EQ(test_case.expect,
+ Utf16OffsetFromUtf8Offset(test_case.str, test_case.offset))
+ << " at " << test_case.str << "[" << test_case.offset << "]";
+ }
+}
+
+TEST(UtfOffsetTest, Utf8OffsetFromUtf16Offset) {
+ constexpr struct {
+ const char16_t* str;
+ size_t offset;
+ base::Optional<size_t> expect;
+ } kTestCases[] = {
+ // 1 byte letters.
+ {u"ab", 0, 0},
+ {u"ab", 1, 1},
+ {u"ab", 2, 2},
+ {u"ab", 3, base::nullopt},
+
+ // 2 byte letters.
+ {u"\u03A9\u03A9", 0, 0},
+ {u"\u03A9\u03A9", 1, 2},
+ {u"\u03A9\u03A9", 2, 4},
+ {u"\u03A9\u03A9", 3, base::nullopt},
+
+ // 3 byte letters.
+ {u"\u3042\u3042", 0, 0},
+ {u"\u3042\u3042", 1, 3},
+ {u"\u3042\u3042", 2, 6},
+ {u"\u3042\u3042", 3, base::nullopt},
+
+ // 4 byte letters = surrogate pairs.
+ {u"\U0001F3B7\U0001F3B7", 0, 0},
+ {u"\U0001F3B7\U0001F3B7", 1, base::nullopt},
+ {u"\U0001F3B7\U0001F3B7", 2, 4},
+ {u"\U0001F3B7\U0001F3B7", 3, base::nullopt},
+ {u"\U0001F3B7\U0001F3B7", 4, 8},
+ {u"\U0001F3B7\U0001F3B7", 5, base::nullopt},
+ {u"\U0001F3B7\U0001F3B7", 6, base::nullopt},
+
+ // Mix case.
+ {u"a\u03A9b\u3042c\U0001F3B7d", 0, 0},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 1, 1},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 2, 3},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 3, 4},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 4, 7},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 5, 8},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 6, base::nullopt},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 7, 12},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 8, 13},
+ {u"a\u03A9b\u3042c\U0001F3B7d", 9, base::nullopt},
+ };
+
+ for (const auto& test_case : kTestCases) {
+ // TODO(crbug.com/911896): Get rid of reinterpret_cast on switching
+ // to char16_t.
+ base::string16 text(reinterpret_cast<const base::char16*>(test_case.str));
+ EXPECT_EQ(test_case.expect,
+ Utf8OffsetFromUtf16Offset(text, test_case.offset))
+ << " at " << text << "[" << test_case.offset << "]";
+ }
+}
+
+} // namespace
+} // namespace ui
diff --git a/chromium/ui/base/l10n/DIR_METADATA b/chromium/ui/base/l10n/DIR_METADATA
new file mode 100644
index 00000000000..34512e7607a
--- /dev/null
+++ b/chromium/ui/base/l10n/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Internationalization"
+} \ No newline at end of file
diff --git a/chromium/ui/base/l10n/OWNERS b/chromium/ui/base/l10n/OWNERS
index b2ce105d5b7..a3be676b08b 100644
--- a/chromium/ui/base/l10n/OWNERS
+++ b/chromium/ui/base/l10n/OWNERS
@@ -1,2 +1 @@
-jshin@chromium.org
-# COMPONENT: UI>Internationalization
+jshin@chromium.org \ No newline at end of file
diff --git a/chromium/ui/base/l10n/formatter.cc b/chromium/ui/base/l10n/formatter.cc
index e4446d4786f..684ead8c0a0 100644
--- a/chromium/ui/base/l10n/formatter.cc
+++ b/chromium/ui/base/l10n/formatter.cc
@@ -234,7 +234,7 @@ void Formatter::Format(Unit unit,
int value,
icu::UnicodeString* formatted_string) const {
DCHECK(simple_format_[unit]);
- DCHECK(formatted_string->isEmpty() == TRUE);
+ DCHECK(formatted_string->isEmpty());
UErrorCode error = U_ZERO_ERROR;
FormatNumberInPlural(*simple_format_[unit],
value, formatted_string, &error);
@@ -250,7 +250,7 @@ void Formatter::Format(TwoUnits units,
<< "Detailed() not implemented for your (format, length) combination!";
DCHECK(detailed_format_[units][1])
<< "Detailed() not implemented for your (format, length) combination!";
- DCHECK(formatted_string->isEmpty() == TRUE);
+ DCHECK(formatted_string->isEmpty());
UErrorCode error = U_ZERO_ERROR;
FormatNumberInPlural(*detailed_format_[units][0], value_1,
formatted_string, &error);
@@ -283,7 +283,7 @@ std::unique_ptr<icu::MessageFormat> Formatter::InitFormat(
base::string16 pattern = l10n_util::GetStringUTF16(pluralities.id);
UErrorCode error = U_ZERO_ERROR;
std::unique_ptr<icu::MessageFormat> format(new icu::MessageFormat(
- icu::UnicodeString(FALSE, pattern.data(), pattern.length()), error));
+ icu::UnicodeString(false, pattern.data(), pattern.length()), error));
DCHECK(U_SUCCESS(error));
if (format.get())
return format;
diff --git a/chromium/ui/base/l10n/l10n_util.cc b/chromium/ui/base/l10n/l10n_util.cc
index fdfc14ef542..291e24f9e77 100644
--- a/chromium/ui/base/l10n/l10n_util.cc
+++ b/chromium/ui/base/l10n/l10n_util.cc
@@ -270,9 +270,6 @@ bool IsLocaleAvailable(const std::string& locale) {
// under a system locale Chrome is not localized to (e.g.Farsi on Linux),
// but it'd slow down the start up time a little bit for locales Chrome is
// localized to. So, we don't call it here.
- if (!l10n_util::IsLocaleSupportedByOS(locale))
- return false;
-
return ui::ResourceBundle::LocaleDataPakExists(locale);
}
#endif
@@ -309,8 +306,6 @@ struct AvailableLocalesTraits
// and to which Chrome is not localized.
if (IsLocalePartiallyPopulated(locale_name))
continue;
- if (!l10n_util::IsLocaleSupportedByOS(locale_name))
- continue;
// Normalize underscores to hyphens because that's what our locale files
// use.
std::replace(locale_name.begin(), locale_name.end(), '_', '-');
@@ -727,7 +722,7 @@ base::string16 GetStringFUTF16(int message_id,
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
const base::string16& format_string = rb.GetLocalizedString(message_id);
-#ifndef NDEBUG
+#if DCHECK_IS_ON()
// Make sure every replacement string is being used, so we don't just
// silently fail to insert one. If |offsets| is non-NULL, then don't do this
// check as the code may simply want to find the placeholders rather than
diff --git a/chromium/ui/base/l10n/l10n_util.h b/chromium/ui/base/l10n/l10n_util.h
index 124248defa8..b821be44665 100644
--- a/chromium/ui/base/l10n/l10n_util.h
+++ b/chromium/ui/base/l10n/l10n_util.h
@@ -58,11 +58,6 @@ COMPONENT_EXPORT(UI_BASE)
bool IsLocaleNameTranslated(const char* locale,
const std::string& display_locale);
-// Given a locale code, return true if the OS is capable of supporting it.
-// For instance, Oriya is not well supported on Windows XP and we return
-// false for "or".
-bool IsLocaleSupportedByOS(const std::string& locale);
-
// This method returns the display name of the locale code in |display_locale|.
// For example, for |locale| = "fr" and |display_locale| = "en",
diff --git a/chromium/ui/base/l10n/l10n_util_posix.cc b/chromium/ui/base/l10n/l10n_util_posix.cc
deleted file mode 100644
index 3f75f324cf2..00000000000
--- a/chromium/ui/base/l10n/l10n_util_posix.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/stl_util.h"
-#include "build/build_config.h"
-
-#if defined(OS_CHROMEOS)
-#include "base/strings/string_util.h"
-#endif
-
-namespace l10n_util {
-
-bool IsLocaleSupportedByOS(const std::string& locale) {
-#if defined(OS_CHROMEOS)
- // We don't have translations yet for am, and sw.
- // TODO(jungshik): Once the above issues are resolved, change this back
- // to return true.
- static const char kUnsupportedLocales[][3] = {"am", "sw"};
- for (size_t i = 0; i < base::size(kUnsupportedLocales); ++i) {
- if (base::LowerCaseEqualsASCII(locale, kUnsupportedLocales[i]))
- return false;
- }
- return true;
-#else
- // Return true blindly for now.
- return true;
-#endif
-}
-
-} // namespace l10n_util
diff --git a/chromium/ui/base/l10n/l10n_util_win.cc b/chromium/ui/base/l10n/l10n_util_win.cc
index 8b3850c2441..fec321f8904 100644
--- a/chromium/ui/base/l10n/l10n_util_win.cc
+++ b/chromium/ui/base/l10n/l10n_util_win.cc
@@ -63,18 +63,14 @@ void HWNDSetRTLLayout(HWND hwnd) {
}
}
-bool IsLocaleSupportedByOS(const std::string& locale) {
- return true;
-}
-
-bool NeedOverrideDefaultUIFont(base::string16* override_font_family,
+bool NeedOverrideDefaultUIFont(std::wstring* override_font_family,
double* font_size_scaler) {
// This is rather simple-minded to deal with the UI font size
// issue for some Indian locales (ml, bn, hi) for which
// the default Windows fonts are too small to be legible. For those
// locales, IDS_UI_FONT_FAMILY is set to an actual font family to
// use while for other locales, it's set to 'default'.
- base::string16 ui_font_family = GetStringUTF16(IDS_UI_FONT_FAMILY);
+ std::wstring ui_font_family = GetWideString(IDS_UI_FONT_FAMILY);
int scaler100;
if (!base::StringToInt(l10n_util::GetStringUTF16(IDS_UI_FONT_SIZE_SCALER),
&scaler100))
@@ -97,12 +93,12 @@ bool NeedOverrideDefaultUIFont(base::string16* override_font_family,
}
void OverrideLocaleWithUILanguageList() {
- std::vector<base::string16> ui_languages;
+ std::vector<std::wstring> ui_languages;
if (base::win::i18n::GetThreadPreferredUILanguageList(&ui_languages)) {
std::vector<std::string> ascii_languages;
ascii_languages.reserve(ui_languages.size());
std::transform(ui_languages.begin(), ui_languages.end(),
- std::back_inserter(ascii_languages), &base::UTF16ToASCII);
+ std::back_inserter(ascii_languages), &base::WideToASCII);
override_locale_holder.Get().swap_value(&ascii_languages);
} else {
NOTREACHED() << "Failed to determine the UI language for locale override.";
@@ -113,4 +109,8 @@ const std::vector<std::string>& GetLocaleOverrides() {
return override_locale_holder.Get().value();
}
+std::wstring GetWideString(int message_id) {
+ return base::UTF16ToWide(GetStringUTF16(message_id));
+}
+
} // namespace l10n_util
diff --git a/chromium/ui/base/l10n/l10n_util_win.h b/chromium/ui/base/l10n/l10n_util_win.h
index 70a7be88046..380bba077d3 100644
--- a/chromium/ui/base/l10n/l10n_util_win.h
+++ b/chromium/ui/base/l10n/l10n_util_win.h
@@ -10,7 +10,6 @@
#include <vector>
#include "base/component_export.h"
-#include "base/strings/string16.h"
namespace l10n_util {
@@ -41,7 +40,7 @@ COMPONENT_EXPORT(UI_BASE) void HWNDSetRTLLayout(HWND hwnd);
// filled with the font family name and the size scaler. The output
// parameters are not modified if the return value is false.
COMPONENT_EXPORT(UI_BASE)
-bool NeedOverrideDefaultUIFont(base::string16* override_font_family,
+bool NeedOverrideDefaultUIFont(std::wstring* override_font_family,
double* font_size_scaler);
// Allow processes to override the configured locale with the user's Windows UI
@@ -53,6 +52,9 @@ COMPONENT_EXPORT(UI_BASE) void OverrideLocaleWithUILanguageList();
// or failed to be overridden.
COMPONENT_EXPORT(UI_BASE) const std::vector<std::string>& GetLocaleOverrides();
+// Pulls resource string from the string bundle and returns it.
+COMPONENT_EXPORT(UI_BASE) std::wstring GetWideString(int message_id);
+
} // namespace l10n_util
#endif // UI_BASE_L10N_L10N_UTIL_WIN_H_
diff --git a/chromium/ui/base/models/dialog_model.cc b/chromium/ui/base/models/dialog_model.cc
index 5479c788846..b1077c7788f 100644
--- a/chromium/ui/base/models/dialog_model.cc
+++ b/chromium/ui/base/models/dialog_model.cc
@@ -4,7 +4,7 @@
#include "ui/base/models/dialog_model.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/ranges/algorithm.h"
namespace ui {
@@ -12,6 +12,9 @@ namespace ui {
DialogModel::Builder::Builder(std::unique_ptr<DialogModelDelegate> delegate)
: model_(std::make_unique<DialogModel>(util::PassKey<Builder>(),
std::move(delegate))) {}
+
+DialogModel::Builder::Builder() : Builder(nullptr) {}
+
DialogModel::Builder::~Builder() {
DCHECK(!model_) << "Model should've been built.";
}
@@ -75,7 +78,8 @@ DialogModel::Builder& DialogModel::Builder::SetInitiallyFocusedField(
DialogModel::DialogModel(util::PassKey<Builder>,
std::unique_ptr<DialogModelDelegate> delegate)
: delegate_(std::move(delegate)) {
- delegate_->set_dialog_model(this);
+ if (delegate_)
+ delegate_->set_dialog_model(this);
}
DialogModel::~DialogModel() = default;
diff --git a/chromium/ui/base/models/dialog_model.h b/chromium/ui/base/models/dialog_model.h
index 30f8176630a..4a5be0d6837 100644
--- a/chromium/ui/base/models/dialog_model.h
+++ b/chromium/ui/base/models/dialog_model.h
@@ -14,6 +14,7 @@
#include "base/util/type_safety/pass_key.h"
#include "ui/base/models/dialog_model_field.h"
#include "ui/base/models/dialog_model_host.h"
+#include "ui/base/models/image_model.h"
#include "ui/base/ui_base_types.h"
namespace ui {
@@ -83,15 +84,41 @@ class COMPONENT_EXPORT(UI_BASE) DialogModel final {
public:
// Builder for DialogModel. Used for properties that are either only or
// commonly const after construction.
- class COMPONENT_EXPORT(UI_BASE) Builder {
+ class COMPONENT_EXPORT(UI_BASE) Builder final {
public:
+ // Constructs a Builder for a DialogModel with a DialogModelDelegate whose
+ // lifetime (and storage) is tied to the lifetime of the DialogModel.
explicit Builder(std::unique_ptr<DialogModelDelegate> delegate);
+
+ // Constructs a DialogModel without a DialogModelDelegate (that doesn't
+ // require storage tied to the DialogModel). For access to the DialogModel
+ // during construction (for use in callbacks), use model().
+ Builder();
+
+ Builder(const Builder&) = delete;
+ Builder& operator=(const Builder&) = delete;
+
~Builder();
std::unique_ptr<DialogModel> Build() WARN_UNUSED_RESULT;
- Builder& SetShowCloseButton(bool show_close_button) {
- model_->show_close_button_ = show_close_button;
+ // Gets the DialogModel. Used for setting up callbacks that make use of the
+ // model later once it's fully constructed. This is useful for dialogs or
+ // callbacks that don't use DialogModelDelegate and don't have direct access
+ // to the model through DialogModelDelegate::dialog_model().
+ //
+ // Note that the DialogModel* returned here is only for registering
+ // callbacks with the DialogModel::Builder. These callbacks share lifetimes
+ // with the DialogModel so uses of it will not result in use-after-frees.
+ DialogModel* model() { return model_.get(); }
+
+ // Overrides the close-x use for the dialog. Should be avoided as the
+ // close-x is generally derived from dialog modality. Kept to allow
+ // conversion of dialogs that currently do not allow style.
+ // TODO(pbos): Propose UX updates to existing dialogs that require this,
+ // then remove OverrideShowCloseButton().
+ Builder& OverrideShowCloseButton(bool show_close_button) {
+ model_->override_show_close_button_ = show_close_button;
return *this;
}
@@ -100,6 +127,11 @@ class COMPONENT_EXPORT(UI_BASE) DialogModel final {
return *this;
}
+ Builder& SetIcon(ImageModel icon) {
+ model_->icon_ = std::move(icon);
+ return *this;
+ }
+
// Make screen readers announce the contents of the dialog as it appears.
// See |ax::mojom::Role::kAlertDialog|.
Builder& SetIsAlertDialog() {
@@ -192,6 +224,10 @@ class COMPONENT_EXPORT(UI_BASE) DialogModel final {
DialogModel(util::PassKey<DialogModel::Builder>,
std::unique_ptr<DialogModelDelegate> delegate);
+
+ DialogModel(const DialogModel&) = delete;
+ DialogModel& operator=(const DialogModel&) = delete;
+
~DialogModel();
// The host in which this model is hosted. Set by the Host implementation
@@ -242,14 +278,17 @@ class COMPONENT_EXPORT(UI_BASE) DialogModel final {
host_ = host;
}
- bool show_close_button(util::PassKey<DialogModelHost>) const {
- return show_close_button_;
+ const base::Optional<bool>& override_show_close_button(
+ util::PassKey<DialogModelHost>) const {
+ return override_show_close_button_;
}
const base::string16& title(util::PassKey<DialogModelHost>) const {
return title_;
}
+ const ImageModel& icon(util::PassKey<DialogModelHost>) const { return icon_; }
+
base::Optional<int> initially_focused_field(
util::PassKey<DialogModelHost>) const {
return initially_focused_field_;
@@ -293,11 +332,11 @@ class COMPONENT_EXPORT(UI_BASE) DialogModel final {
std::unique_ptr<DialogModelDelegate> delegate_;
DialogModelHost* host_ = nullptr;
- bool show_close_button_ = false;
+ base::Optional<bool> override_show_close_button_;
bool close_on_deactivate_ = true;
base::string16 title_;
+ ImageModel icon_;
- static constexpr int kExtraButtonId = DIALOG_BUTTON_LAST + 1;
std::vector<std::unique_ptr<DialogModelField>> fields_;
base::Optional<int> initially_focused_field_;
bool is_alert_dialog_ = false;
diff --git a/chromium/ui/base/models/dialog_model_field.cc b/chromium/ui/base/models/dialog_model_field.cc
index 0781fdb60f1..3432b970aa8 100644
--- a/chromium/ui/base/models/dialog_model_field.cc
+++ b/chromium/ui/base/models/dialog_model_field.cc
@@ -3,7 +3,9 @@
// found in the LICENSE file.
#include "ui/base/models/dialog_model_field.h"
+
#include "base/bind.h"
+#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/dialog_model.h"
namespace ui {
@@ -18,9 +20,23 @@ DialogModelLabel::Link::Link(int message_id, base::RepeatingClosure closure)
DialogModelLabel::Link::Link(const Link&) = default;
DialogModelLabel::Link::~Link() = default;
-DialogModelLabel::DialogModelLabel(int message_id) : message_id_(message_id) {}
+DialogModelLabel::DialogModelLabel(int message_id)
+ : message_id_(message_id),
+ string_(l10n_util::GetStringUTF16(message_id_)) {}
DialogModelLabel::DialogModelLabel(int message_id, std::vector<Link> links)
- : message_id_(message_id), links_(std::move(links)) {}
+ : message_id_(message_id), links_(std::move(links)) {
+ // Note that this constructor does not set |string_| which is invalid for
+ // labels with links.
+}
+
+DialogModelLabel::DialogModelLabel(base::string16 fixed_string)
+ : message_id_(-1), string_(std::move(fixed_string)) {}
+
+const base::string16& DialogModelLabel::GetString(
+ util::PassKey<DialogModelHost>) const {
+ DCHECK(links_.empty());
+ return string_;
+}
DialogModelLabel::DialogModelLabel(const DialogModelLabel&) = default;
diff --git a/chromium/ui/base/models/dialog_model_field.h b/chromium/ui/base/models/dialog_model_field.h
index 35a622dad5e..1e2c2c87d50 100644
--- a/chromium/ui/base/models/dialog_model_field.h
+++ b/chromium/ui/base/models/dialog_model_field.h
@@ -45,6 +45,7 @@ class COMPONENT_EXPORT(UI_BASE) DialogModelLabel {
};
explicit DialogModelLabel(int message_id);
+ explicit DialogModelLabel(base::string16 fixed_string);
DialogModelLabel(const DialogModelLabel&);
DialogModelLabel& operator=(const DialogModelLabel&) = delete;
~DialogModelLabel();
@@ -54,11 +55,22 @@ class COMPONENT_EXPORT(UI_BASE) DialogModelLabel {
static DialogModelLabel CreateWithLinks(int message_id,
std::vector<Link> links);
+ // Gets the string. Not for use with links, in which case the caller must use
+ // links() and message_id() to construct the final label. This is required to
+ // style the final label appropriately and support link callbacks. The caller
+ // is responsible for checking links().empty() before calling this.
+ const base::string16& GetString(util::PassKey<DialogModelHost>) const;
+
DialogModelLabel& set_is_secondary() {
is_secondary_ = true;
return *this;
}
+ DialogModelLabel& set_allow_character_break() {
+ allow_character_break_ = true;
+ return *this;
+ }
+
int message_id(util::PassKey<DialogModelHost>) const { return message_id_; }
const std::vector<Link> links(util::PassKey<DialogModelHost>) const {
return links_;
@@ -66,13 +78,18 @@ class COMPONENT_EXPORT(UI_BASE) DialogModelLabel {
bool is_secondary(util::PassKey<DialogModelHost>) const {
return is_secondary_;
}
+ bool allow_character_break(util::PassKey<DialogModelHost>) const {
+ return allow_character_break_;
+ }
private:
explicit DialogModelLabel(int message_id, std::vector<Link> links);
const int message_id_;
+ const base::string16 string_;
const std::vector<Link> links_;
bool is_secondary_ = false;
+ bool allow_character_break_ = false;
};
// These "field" classes represent entries in a DialogModel. They are owned
diff --git a/chromium/ui/base/pointer/DIR_METADATA b/chromium/ui/base/pointer/DIR_METADATA
new file mode 100644
index 00000000000..198db497480
--- /dev/null
+++ b/chromium/ui/base/pointer/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Internals>Input"
+}
diff --git a/chromium/ui/base/pointer/OWNERS b/chromium/ui/base/pointer/OWNERS
index c55b9d29ec6..b3dbc20b12b 100644
--- a/chromium/ui/base/pointer/OWNERS
+++ b/chromium/ui/base/pointer/OWNERS
@@ -2,5 +2,3 @@ sadrul@chromium.org
per-file touch_ui_controller*=kylixrd@chromium.org
per-file touch_ui_controller*=robliao@chromium.org
-
-# COMPONENT: Internal>Input
diff --git a/chromium/ui/base/pointer/touch_ui_controller_unittest.cc b/chromium/ui/base/pointer/touch_ui_controller_unittest.cc
index 1cfa4b8e170..98d7baa0848 100644
--- a/chromium/ui/base/pointer/touch_ui_controller_unittest.cc
+++ b/chromium/ui/base/pointer/touch_ui_controller_unittest.cc
@@ -6,7 +6,7 @@
#include "base/macros.h"
#include "base/scoped_observer.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/pointer/touch_ui_controller.h"
diff --git a/chromium/ui/base/prediction/prediction_metrics_handler.cc b/chromium/ui/base/prediction/prediction_metrics_handler.cc
index e782e6736e5..f01862443c8 100644
--- a/chromium/ui/base/prediction/prediction_metrics_handler.cc
+++ b/chromium/ui/base/prediction/prediction_metrics_handler.cc
@@ -2,22 +2,43 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <utility>
+
#include "ui/base/prediction/prediction_metrics_handler.h"
#include "base/metrics/histogram_functions.h"
+#include "base/strings/strcat.h"
namespace ui {
-PredictionMetricsHandler::PredictionMetricsHandler() {}
-PredictionMetricsHandler::~PredictionMetricsHandler() {}
+PredictionMetricsHandler::PredictionMetricsHandler(const char* histogram_name)
+ : histogram_name_(std::move(histogram_name)) {}
+PredictionMetricsHandler::~PredictionMetricsHandler() = default;
void PredictionMetricsHandler::AddRealEvent(const gfx::PointF& pos,
const base::TimeTicks& time_stamp,
const base::TimeTicks& frame_time,
bool scrolling) {
- // Be sure real events are ordered over time
- DCHECK(events_queue_.empty() ||
- time_stamp >= events_queue_.back().time_stamp);
+ // Real events should arrive in order over time, and if they aren't then just
+ // bail. Early out instead of DCHECKing in order to handle delegated ink
+ // trails. Delegated ink trails may submit points out of order in a situation
+ // such as three points with timestamps = 1, 2, and 3 making up the trail on
+ // one frame, and then on the next frame only the points with timestamp 2 and
+ // 3 make up the trail. In this case, 2 would be added as a real point again,
+ // but it has a timestamp earlier than 3, so a DCHECK would fail. Early out
+ // here will not impact correctness since 2 already exists in |events_queue_|.
+ if (!events_queue_.empty() && time_stamp <= events_queue_.back().time_stamp) {
+ // Confirm that the above assertion is true, and that timestamp 2 (from
+ // the above example) exists in |events_queue_|.
+ bool event_exists = false;
+ for (uint64_t i = 0; i < events_queue_.size() && !event_exists; ++i) {
+ if (events_queue_[i].time_stamp == time_stamp)
+ event_exists = true;
+ }
+ DCHECK(event_exists);
+ return;
+ }
+
EventData e;
if (scrolling)
e.pos = gfx::PointF(0, pos.y());
@@ -130,25 +151,25 @@ void PredictionMetricsHandler::ComputeMetrics() {
for (int i = 0; i < first_needed_event - 1; i++)
events_queue_.pop_front();
- std::string kPredictionMetrics = "Event.InputEventPrediction.Scroll.";
-
double score = ComputeOverUnderPredictionMetric();
if (score >= 0) {
- base::UmaHistogramCounts1000(kPredictionMetrics + "OverPrediction", score);
+ base::UmaHistogramCounts1000(
+ base::StrCat({histogram_name_, ".OverPrediction"}), score);
} else {
- base::UmaHistogramCounts1000(kPredictionMetrics + "UnderPrediction",
- -score);
+ base::UmaHistogramCounts1000(
+ base::StrCat({histogram_name_, ".UnderPrediction"}), -score);
}
// Need |last_predicted_| to compute WrongDirection and Jitter metrics.
if (!last_predicted_.has_value())
return;
- base::UmaHistogramBoolean(kPredictionMetrics + "WrongDirection",
+ base::UmaHistogramBoolean(base::StrCat({histogram_name_, ".WrongDirection"}),
ComputeWrongDirectionMetric());
- base::UmaHistogramCounts1000(kPredictionMetrics + "PredictionJitter",
- ComputePredictionJitterMetric());
- base::UmaHistogramCounts1000(kPredictionMetrics + "VisualJitter",
+ base::UmaHistogramCounts1000(
+ base::StrCat({histogram_name_, ".PredictionJitter"}),
+ ComputePredictionJitterMetric());
+ base::UmaHistogramCounts1000(base::StrCat({histogram_name_, ".VisualJitter"}),
ComputeVisualJitterMetric());
}
diff --git a/chromium/ui/base/prediction/prediction_metrics_handler.h b/chromium/ui/base/prediction/prediction_metrics_handler.h
index 648ccdd9998..24167f5954f 100644
--- a/chromium/ui/base/prediction/prediction_metrics_handler.h
+++ b/chromium/ui/base/prediction/prediction_metrics_handler.h
@@ -25,7 +25,7 @@ class PredictionMetricsHandlerTest;
// few metrics.
class COMPONENT_EXPORT(UI_BASE_PREDICTION) PredictionMetricsHandler {
public:
- explicit PredictionMetricsHandler();
+ explicit PredictionMetricsHandler(const char* histogram_name);
~PredictionMetricsHandler();
// Struct used to store predicted and real event information.
@@ -103,6 +103,12 @@ class COMPONENT_EXPORT(UI_BASE_PREDICTION) PredictionMetricsHandler {
base::Optional<gfx::PointF> last_predicted_ = base::nullopt;
// The first real event position which time is later than the predicted time.
gfx::PointF next_real_;
+
+ // Beginning of the full histogram name. It will have the various metrics'
+ // names (.OverPrediction, .UnderPrediction, .WrongDirection,
+ // .PredictionJitter, .VisualJitter) appended to it when counting the metric
+ // in a histogram.
+ const char* const histogram_name_;
};
} // namespace ui
diff --git a/chromium/ui/base/prediction/prediction_metrics_handler_unittest.cc b/chromium/ui/base/prediction/prediction_metrics_handler_unittest.cc
index f44df0d01dd..fcfa9c052a7 100644
--- a/chromium/ui/base/prediction/prediction_metrics_handler_unittest.cc
+++ b/chromium/ui/base/prediction/prediction_metrics_handler_unittest.cc
@@ -29,7 +29,8 @@ class PredictionMetricsHandlerTest : public testing::Test {
explicit PredictionMetricsHandlerTest() {}
void SetUp() override {
- metrics_handler_ = std::make_unique<PredictionMetricsHandler>();
+ metrics_handler_ = std::make_unique<PredictionMetricsHandler>(
+ "Event.InputEventPrediction.Scroll");
histogram_tester_ = std::make_unique<base::HistogramTester>();
}
diff --git a/chromium/ui/base/resource/DIR_METADATA b/chromium/ui/base/resource/DIR_METADATA
new file mode 100644
index 00000000000..63fc482f75d
--- /dev/null
+++ b/chromium/ui/base/resource/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Internals"
+} \ No newline at end of file
diff --git a/chromium/ui/base/resource/OWNERS b/chromium/ui/base/resource/OWNERS
index 1c5b89efccb..56c2d34b387 100644
--- a/chromium/ui/base/resource/OWNERS
+++ b/chromium/ui/base/resource/OWNERS
@@ -1,2 +1 @@
-per-file *_android.*=file://chrome/browser/android/OWNERS
-# COMPONENT: Internals
+per-file *_android.*=file://chrome/browser/android/OWNERS \ No newline at end of file
diff --git a/chromium/ui/base/resource/mock_resource_bundle_delegate.h b/chromium/ui/base/resource/mock_resource_bundle_delegate.h
index 0df2e07a7d6..54e75e18b4b 100644
--- a/chromium/ui/base/resource/mock_resource_bundle_delegate.h
+++ b/chromium/ui/base/resource/mock_resource_bundle_delegate.h
@@ -26,6 +26,8 @@ class MockResourceBundleDelegate : public ResourceBundle::Delegate {
MOCK_METHOD2(LoadDataResourceBytes,
base::RefCountedMemory*(int resource_id,
ScaleFactor scale_factor));
+ MOCK_METHOD1(LoadDataResourceString,
+ base::Optional<std::string>(int resource_id));
MOCK_CONST_METHOD3(GetRawDataResource,
bool(int resource_id,
ScaleFactor scale_factor,
diff --git a/chromium/ui/base/resource/resource_bundle.cc b/chromium/ui/base/resource/resource_bundle.cc
index d14bc858f56..2b24b4ce2e2 100644
--- a/chromium/ui/base/resource/resource_bundle.cc
+++ b/chromium/ui/base/resource/resource_bundle.cc
@@ -85,7 +85,7 @@ base::FilePath GetResourcesPakFilePath(const std::string& pak_name) {
// Return just the name of the pak file.
#if defined(OS_WIN)
- return base::FilePath(base::ASCIIToUTF16(pak_name));
+ return base::FilePath(base::ASCIIToWide(pak_name));
#else
return base::FilePath(pak_name.c_str());
#endif // OS_WIN
@@ -659,6 +659,13 @@ base::StringPiece ResourceBundle::GetRawDataResourceForScale(
}
std::string ResourceBundle::LoadDataResourceString(int resource_id) const {
+ if (delegate_) {
+ base::Optional<std::string> data =
+ delegate_->LoadDataResourceString(resource_id);
+ if (data)
+ return data.value();
+ }
+
return LoadDataResourceStringForScale(resource_id, ui::SCALE_FACTOR_NONE);
}
diff --git a/chromium/ui/base/resource/resource_bundle.h b/chromium/ui/base/resource/resource_bundle.h
index 317ad685e41..51dbdfab396 100644
--- a/chromium/ui/base/resource/resource_bundle.h
+++ b/chromium/ui/base/resource/resource_bundle.h
@@ -18,6 +18,7 @@
#include "base/files/memory_mapped_file.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
+#include "base/optional.h"
#include "base/sequence_checker.h"
#include "base/strings/string16.h"
#include "base/strings/string_piece.h"
@@ -73,6 +74,8 @@ class COMPONENT_EXPORT(UI_BASE) ResourceBundle {
// Delegate class that allows interception of pack file loading and resource
// requests. The methods of this class may be called on multiple threads.
+ // TODO(crbug.com/1146446): The interface and usage model of this class are
+ // clunky; it would be good to clean them up.
class Delegate {
public:
// Called before a resource pack file is loaded. Return the full path for
@@ -105,6 +108,14 @@ class COMPONENT_EXPORT(UI_BASE) ResourceBundle {
int resource_id,
ScaleFactor scale_factor) = 0;
+ // Supports intercepting of ResourceBundle::LoadDataResourceString(): Return
+ // a populated base::Optional instance to override the value that
+ // ResourceBundle::LoadDataResourceString() would return by default, or an
+ // empty base::Optional instance to pass through to the default behavior of
+ // ResourceBundle::LoadDataResourceString().
+ virtual base::Optional<std::string> LoadDataResourceString(
+ int resource_id) = 0;
+
// Retrieve a raw data resource. Return true if a resource was provided or
// false to attempt retrieval of the default resource.
virtual bool GetRawDataResource(int resource_id,
diff --git a/chromium/ui/base/resource/resource_bundle_android.cc b/chromium/ui/base/resource/resource_bundle_android.cc
index e8cf7b78c66..ddb0e045499 100644
--- a/chromium/ui/base/resource/resource_bundle_android.cc
+++ b/chromium/ui/base/resource/resource_bundle_android.cc
@@ -238,9 +238,10 @@ void LoadMainAndroidPackFile(const char* path_within_apk,
}
}
-void LoadPackFileFromApk(const std::string& path) {
+void LoadPackFileFromApk(const std::string& path,
+ const std::string& split_name) {
base::MemoryMappedFile::Region region;
- int fd = base::android::OpenApkAsset(path, &region);
+ int fd = base::android::OpenApkAsset(path, split_name, &region);
CHECK_GE(fd, 0) << "Could not find " << path << " in APK.";
ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion(
base::File(fd), region, ui::SCALE_FACTOR_NONE);
diff --git a/chromium/ui/base/resource/resource_bundle_android.h b/chromium/ui/base/resource/resource_bundle_android.h
index 99096888fc9..f3b480e2117 100644
--- a/chromium/ui/base/resource/resource_bundle_android.h
+++ b/chromium/ui/base/resource/resource_bundle_android.h
@@ -20,7 +20,9 @@ void LoadMainAndroidPackFile(const char* path_within_apk,
const base::FilePath& disk_file_path);
// Loads a PAK file from the APK and makes the contained resources accessible.
-COMPONENT_EXPORT(UI_BASE) void LoadPackFileFromApk(const std::string& path);
+COMPONENT_EXPORT(UI_BASE)
+void LoadPackFileFromApk(const std::string& path,
+ const std::string& split_name);
// Returns the file descriptor and region for resources.pak.
COMPONENT_EXPORT(UI_BASE)
diff --git a/chromium/ui/base/resource/resource_bundle_fuchsia.cc b/chromium/ui/base/resource/resource_bundle_fuchsia.cc
index e4139f25896..0a54b752ce4 100644
--- a/chromium/ui/base/resource/resource_bundle_fuchsia.cc
+++ b/chromium/ui/base/resource/resource_bundle_fuchsia.cc
@@ -4,13 +4,22 @@
#include "ui/base/resource/resource_bundle.h"
+#include "base/base_paths.h"
#include "base/macros.h"
+#include "base/path_service.h"
#include "ui/gfx/image/image.h"
namespace ui {
void ResourceBundle::LoadCommonResources() {
- LoadChromeResources();
+ constexpr char kCommonResourcesPakPath[] = "common_resources.pak";
+
+ base::FilePath asset_root;
+ bool result = base::PathService::Get(base::DIR_ASSETS, &asset_root);
+ DCHECK(result);
+
+ AddDataPackFromPath(asset_root.Append(kCommonResourcesPakPath),
+ ui::SCALE_FACTOR_100P);
}
gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id) {
diff --git a/chromium/ui/base/text/DIR_METADATA b/chromium/ui/base/text/DIR_METADATA
new file mode 100644
index 00000000000..55a8d5782a3
--- /dev/null
+++ b/chromium/ui/base/text/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Localization"
+} \ No newline at end of file
diff --git a/chromium/ui/base/text/OWNERS b/chromium/ui/base/text/OWNERS
index b999cb152dd..b9e8da980ec 100644
--- a/chromium/ui/base/text/OWNERS
+++ b/chromium/ui/base/text/OWNERS
@@ -1,3 +1 @@
asvitkine@chromium.org
-
-# COMPONENT: UI>Localization
diff --git a/chromium/ui/base/ui_base_features.cc b/chromium/ui/base/ui_base_features.cc
index d35c5b6fe04..2d856a29782 100644
--- a/chromium/ui/base/ui_base_features.cc
+++ b/chromium/ui/base/ui_base_features.cc
@@ -10,12 +10,20 @@
#include "base/win/windows_version.h"
#endif
+#if defined(OS_ANDROID)
+#include "base/android/build_info.h"
+#endif
+
namespace features {
#if defined(OS_WIN)
// If enabled, calculate native window occlusion - Windows-only.
const base::Feature kCalculateNativeWinOcclusion{
"CalculateNativeWinOcclusion", base::FEATURE_ENABLED_BY_DEFAULT};
+
+const base::Feature kCalculateNativeWinOcclusionCheckVirtualDesktopUsed{
+ "CalculateNativeWinOcclusionCheckVirtualDesktopUsed",
+ base::FEATURE_DISABLED_BY_DEFAULT};
#endif // OW_WIN
// Whether or not to delegate color queries to the color provider.
@@ -50,7 +58,7 @@ const base::Feature kPercentBasedScrolling = {
// Allows requesting unadjusted movement when entering pointerlock.
const base::Feature kPointerLockOptions = {"PointerLockOptions",
- base::FEATURE_DISABLED_BY_DEFAULT};
+ base::FEATURE_ENABLED_BY_DEFAULT};
// Allows system caption style for WebVTT Captions.
const base::Feature kSystemCaptionStyle{"SystemCaptionStyle",
@@ -67,7 +75,7 @@ bool IsNotificationIndicatorEnabled() {
return base::FeatureList::IsEnabled(kNotificationIndicator);
}
-// Enables GPU rasterization for all UI drawing (where not blacklisted).
+// Enables GPU rasterization for all UI drawing (where not blocklisted).
const base::Feature kUiGpuRasterization = {"UiGpuRasterization",
#if defined(OS_APPLE) || defined(OS_CHROMEOS) || defined(OS_FUCHSIA)
base::FEATURE_ENABLED_BY_DEFAULT
@@ -100,7 +108,8 @@ const base::Feature kCompositorThreadedScrollbarScrolling = {
// native apps on Windows.
const base::Feature kExperimentalFlingAnimation {
"ExperimentalFlingAnimation",
-#if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
+#if defined(OS_WIN) || \
+ (defined(OS_LINUX) && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_LACROS))
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
@@ -156,9 +165,16 @@ bool IsForcedColorsEnabled() {
return forced_colors_enabled;
}
-// Enables the eye-dropper in the refresh color-picker.
-const base::Feature kEyeDropper{"EyeDropper",
- base::FEATURE_DISABLED_BY_DEFAULT};
+// Enables the eye-dropper in the refresh color-picker for Windows and Mac.
+// This feature will be released for other platforms in later milestones.
+const base::Feature kEyeDropper {
+ "EyeDropper",
+#if defined(OS_WIN) || defined(OS_MAC)
+ base::FEATURE_ENABLED_BY_DEFAULT
+#else
+ base::FEATURE_DISABLED_BY_DEFAULT
+#endif
+};
bool IsEyeDropperEnabled() {
return IsFormControlsRefreshEnabled() &&
@@ -258,4 +274,16 @@ const char kFilterNameOneEuro[] = "one_euro_filter";
const base::Feature kSwipeToMoveCursor{"SwipeToMoveCursor",
base::FEATURE_DISABLED_BY_DEFAULT};
+bool IsSwipeToMoveCursorEnabled() {
+ static const bool enabled =
+ base::FeatureList::IsEnabled(kSwipeToMoveCursor)
+#if defined(OS_ANDROID)
+ && base::android::BuildInfo::GetInstance()->sdk_int() >=
+ base::android::SDK_VERSION_R;
+#else
+ ;
+#endif
+ return enabled;
+}
+
} // namespace features
diff --git a/chromium/ui/base/ui_base_features.h b/chromium/ui/base/ui_base_features.h
index fbd1bb06fe2..304805ea7f8 100644
--- a/chromium/ui/base/ui_base_features.h
+++ b/chromium/ui/base/ui_base_features.h
@@ -47,6 +47,8 @@ COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUiGpuRasterizationEnabled();
COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kCalculateNativeWinOcclusion;
COMPONENT_EXPORT(UI_BASE_FEATURES)
+extern const base::Feature kCalculateNativeWinOcclusionCheckVirtualDesktopUsed;
+COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kElasticOverscrollWin;
COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kInputPaneOnScreenKeyboard;
@@ -146,6 +148,8 @@ COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kFilterNameOneEuro[];
COMPONENT_EXPORT(UI_BASE_FEATURES)
extern const base::Feature kSwipeToMoveCursor;
+COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsSwipeToMoveCursorEnabled();
+
} // namespace features
#endif // UI_BASE_UI_BASE_FEATURES_H_
diff --git a/chromium/ui/base/webui/DIR_METADATA b/chromium/ui/base/webui/DIR_METADATA
new file mode 100644
index 00000000000..cf1499073d6
--- /dev/null
+++ b/chromium/ui/base/webui/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Browser>WebUI"
+} \ No newline at end of file
diff --git a/chromium/ui/base/webui/OWNERS b/chromium/ui/base/webui/OWNERS
index 918baa1330f..a42ad1efcbd 100644
--- a/chromium/ui/base/webui/OWNERS
+++ b/chromium/ui/base/webui/OWNERS
@@ -1,3 +1 @@
file://ui/webui/PLATFORM_OWNERS
-
-# COMPONENT: UI>Browser>WebUI
diff --git a/chromium/ui/base/webui/jstemplate_builder.cc b/chromium/ui/base/webui/jstemplate_builder.cc
index 50c52507d00..0506b643ea3 100644
--- a/chromium/ui/base/webui/jstemplate_builder.cc
+++ b/chromium/ui/base/webui/jstemplate_builder.cc
@@ -15,6 +15,7 @@
#include "ui/base/layout.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/template_expressions.h"
+#include "ui/resources/grit/webui_generated_resources.h"
#include "ui/resources/grit/webui_resources.h"
namespace webui {
@@ -41,7 +42,7 @@ void AppendLoadTimeData(std::string* output) {
// fetch and cache the pointer of the jstemplate resource source text.
std::string load_time_data_src =
ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
- IDR_WEBUI_JS_LOAD_TIME_DATA);
+ IDR_WEBUI_JS_LOAD_TIME_DATA_JS);
if (load_time_data_src.empty()) {
NOTREACHED() << "Unable to get loadTimeData src";
@@ -58,7 +59,7 @@ void AppendJsTemplateSourceHtml(std::string* output) {
// fetch and cache the pointer of the jstemplate resource source text.
std::string jstemplate_src =
ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
- IDR_WEBUI_JSTEMPLATE_JS);
+ IDR_WEBUI_JS_JSTEMPLATE_COMPILED_JS);
if (jstemplate_src.empty()) {
NOTREACHED() << "Unable to get jstemplate src";
diff --git a/chromium/ui/base/webui/web_ui_util.cc b/chromium/ui/base/webui/web_ui_util.cc
index 9b8ad27b170..a3fa61f66d8 100644
--- a/chromium/ui/base/webui/web_ui_util.cc
+++ b/chromium/ui/base/webui/web_ui_util.cc
@@ -21,12 +21,11 @@
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/template_expressions.h"
-#include "ui/base/ui_base_features.h"
#include "ui/base/window_open_disposition.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/font.h"
#include "ui/gfx/image/image_skia.h"
-#include "ui/resources/grit/webui_resources.h"
+#include "ui/resources/grit/webui_generated_resources.h"
#include "ui/strings/grit/app_locale_settings.h"
#include "url/gurl.h"
@@ -34,10 +33,6 @@
#include "base/win/windows_version.h"
#endif
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-#include "ui/base/ui_base_features.h"
-#endif
-
namespace webui {
namespace {
std::string GetWebUiCssTextDefaults(const std::string& css_template) {
@@ -187,10 +182,6 @@ void ParsePathAndScale(const GURL& url,
ParsePathAndImageSpec(url, path, scale_factor, nullptr);
}
-void ParsePathAndFrame(const GURL& url, std::string* path, int* frame_index) {
- ParsePathAndImageSpec(url, path, nullptr, frame_index);
-}
-
void SetLoadTimeDataDefaults(const std::string& app_locale,
base::DictionaryValue* localized_strings) {
localized_strings->SetString("fontfamily", GetFontFamily());
@@ -211,14 +202,14 @@ std::string GetWebUiCssTextDefaults() {
const ui::ResourceBundle& resource_bundle =
ui::ResourceBundle::GetSharedInstance();
return GetWebUiCssTextDefaults(
- resource_bundle.LoadDataResourceString(IDR_WEBUI_CSS_TEXT_DEFAULTS));
+ resource_bundle.LoadDataResourceString(IDR_WEBUI_CSS_TEXT_DEFAULTS_CSS));
}
std::string GetWebUiCssTextDefaultsMd() {
const ui::ResourceBundle& resource_bundle =
ui::ResourceBundle::GetSharedInstance();
- return GetWebUiCssTextDefaults(
- resource_bundle.LoadDataResourceString(IDR_WEBUI_CSS_TEXT_DEFAULTS_MD));
+ return GetWebUiCssTextDefaults(resource_bundle.LoadDataResourceString(
+ IDR_WEBUI_CSS_TEXT_DEFAULTS_MD_CSS));
}
void AppendWebUiCssTextDefaults(std::string* html) {
@@ -230,15 +221,13 @@ void AppendWebUiCssTextDefaults(std::string* html) {
std::string GetFontFamily() {
std::string font_family = l10n_util::GetStringUTF8(IDS_WEB_FONT_FAMILY);
-// TODO(dnicoara) Remove Ozone check when PlatformFont support is introduced
-// into Ozone: crbug.com/320050
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
- if (!features::IsUsingOzonePlatform()) {
- font_family = ui::ResourceBundle::GetSharedInstance()
- .GetFont(ui::ResourceBundle::BaseFont)
- .GetFontName() +
- ", " + font_family;
- }
+ std::string font_name = ui::ResourceBundle::GetSharedInstance()
+ .GetFont(ui::ResourceBundle::BaseFont)
+ .GetFontName();
+ // Wrap |font_name| with quotes to ensure it will always be parsed correctly
+ // in CSS.
+ font_family = "\"" + font_name + "\", " + font_family;
#endif
return font_family;
diff --git a/chromium/ui/base/webui/web_ui_util.h b/chromium/ui/base/webui/web_ui_util.h
index 1aa12627756..a0c1ca2fee6 100644
--- a/chromium/ui/base/webui/web_ui_util.h
+++ b/chromium/ui/base/webui/web_ui_util.h
@@ -62,11 +62,6 @@ void ParsePathAndImageSpec(const GURL& url,
COMPONENT_EXPORT(UI_BASE)
void ParsePathAndScale(const GURL& url, std::string* path, float* scale_factor);
-// Parses a URL containing some path [{frame}]. If it does not contain a frame
-// index then the default frame index is returned.
-COMPONENT_EXPORT(UI_BASE)
-void ParsePathAndFrame(const GURL& url, std::string* path, int* frame_index);
-
// Helper function to set some default values (e.g., font family, size,
// language, and text direction) into the given dictionary. Requires an
// application locale (i.e. g_browser_process->GetApplicationLocale()).
diff --git a/chromium/ui/base/webui/web_ui_util_unittest.cc b/chromium/ui/base/webui/web_ui_util_unittest.cc
index 362cc3e9535..a934bbe7cd9 100644
--- a/chromium/ui/base/webui/web_ui_util_unittest.cc
+++ b/chromium/ui/base/webui/web_ui_util_unittest.cc
@@ -53,70 +53,6 @@ TEST(WebUIUtilTest, ParsePathAndScale) {
EXPECT_EQ(1.3f, factor);
}
-TEST(WebUIUtilTest, ParsePathAndFrame) {
- std::string path;
-
- int index = -2;
- GURL url("http://[::192.9.5.5]/and/some/more");
- webui::ParsePathAndFrame(url, &path, &index);
- EXPECT_EQ("and/some/more", path);
- EXPECT_EQ(-1, index);
-
- index = -2;
- GURL url2("http://host/and/some/more");
- webui::ParsePathAndFrame(url2, &path, &index);
- EXPECT_EQ("and/some/more", path);
- EXPECT_EQ(-1, index);
-
- index = -2;
- GURL url3("http://host/and/some/more[2a]");
- webui::ParsePathAndFrame(url3, &path, &index);
- EXPECT_EQ("and/some/more[2a]", path);
- EXPECT_EQ(-1, index);
-
- index = -2;
- GURL url4("http://host/and/some/more[]");
- webui::ParsePathAndFrame(url4, &path, &index);
- EXPECT_EQ("and/some/more[]", path);
- EXPECT_EQ(-1, index);
-
- index = -2;
- GURL url5("http://host/and/some/more[-2]");
- webui::ParsePathAndFrame(url5, &path, &index);
- EXPECT_EQ("and/some/more[-2]", path);
- EXPECT_EQ(-1, index);
-
- index = -2;
- GURL url6("http://[::192.9.5.5]/and/some/more[0]");
- webui::ParsePathAndFrame(url6, &path, &index);
- EXPECT_EQ("and/some/more", path);
- EXPECT_EQ(0, index);
-
- index = -2;
- GURL url7("http://host/and/some/more[1]");
- webui::ParsePathAndFrame(url7, &path, &index);
- EXPECT_EQ("and/some/more", path);
- EXPECT_EQ(1, index);
-
- index = -2;
- GURL url8("http://host/and/some/more[3]");
- webui::ParsePathAndFrame(url8, &path, &index);
- EXPECT_EQ("and/some/more", path);
- EXPECT_EQ(3, index);
-
- index = -2;
- GURL url9("http://host/and/some/more0]");
- webui::ParsePathAndFrame(url9, &path, &index);
- EXPECT_EQ("and/some/more0]", path);
- EXPECT_EQ(-1, index);
-
- index = -2;
- GURL url10("http://host/and/some/more[0");
- webui::ParsePathAndFrame(url10, &path, &index);
- EXPECT_EQ("and/some/more[0", path);
- EXPECT_EQ(-1, index);
-}
-
TEST(WebUIUtilTest, ParsePathAndImageSpec) {
std::string path;
diff --git a/chromium/ui/base/win/message_box_win.cc b/chromium/ui/base/win/message_box_win.cc
index 27277a213ea..8665536bf4c 100644
--- a/chromium/ui/base/win/message_box_win.cc
+++ b/chromium/ui/base/win/message_box_win.cc
@@ -5,6 +5,9 @@
#include "ui/base/win/message_box_win.h"
#include "base/i18n/rtl.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
namespace ui {
@@ -12,20 +15,20 @@ namespace ui {
// RTL locale, we need to make sure that LTR strings are rendered correctly by
// adding the appropriate Unicode directionality marks.
int MessageBox(HWND hwnd,
- const base::string16& text,
- const base::string16& caption,
+ const std::wstring& text,
+ const std::wstring& caption,
UINT flags) {
UINT actual_flags = flags;
if (base::i18n::IsRTL())
actual_flags |= MB_RIGHT | MB_RTLREADING;
- base::string16 localized_text = text;
+ base::string16 localized_text = base::WideToUTF16(text);
base::i18n::AdjustStringForLocaleDirection(&localized_text);
- const wchar_t* text_ptr = localized_text.c_str();
+ const wchar_t* text_ptr = base::as_wcstr(localized_text);
- base::string16 localized_caption = caption;
+ base::string16 localized_caption = base::WideToUTF16(caption);
base::i18n::AdjustStringForLocaleDirection(&localized_caption);
- const wchar_t* caption_ptr = localized_caption.c_str();
+ const wchar_t* caption_ptr = base::as_wcstr(localized_caption);
return ::MessageBox(hwnd, text_ptr, caption_ptr, actual_flags);
}
diff --git a/chromium/ui/base/win/message_box_win.h b/chromium/ui/base/win/message_box_win.h
index f19bb39e6fa..9b0ecdc21d4 100644
--- a/chromium/ui/base/win/message_box_win.h
+++ b/chromium/ui/base/win/message_box_win.h
@@ -7,8 +7,9 @@
#include <windows.h>
+#include <string>
+
#include "base/component_export.h"
-#include "base/strings/string16.h"
namespace ui {
@@ -18,8 +19,8 @@ namespace ui {
// right-to-left locale.
COMPONENT_EXPORT(UI_BASE)
int MessageBox(HWND hwnd,
- const base::string16& text,
- const base::string16& caption,
+ const std::wstring& text,
+ const std::wstring& caption,
UINT flags);
} // namespace ui
diff --git a/chromium/ui/base/win/power_setting_change_listener.cc b/chromium/ui/base/win/power_setting_change_listener.cc
new file mode 100644
index 00000000000..d62e55b7bff
--- /dev/null
+++ b/chromium/ui/base/win/power_setting_change_listener.cc
@@ -0,0 +1,110 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/win/power_setting_change_listener.h"
+
+#include "base/bind.h"
+#include "base/callback_helpers.h"
+#include "base/location.h"
+#include "base/memory/singleton.h"
+#include "base/observer_list.h"
+#include "ui/gfx/win/singleton_hwnd.h"
+#include "ui/gfx/win/singleton_hwnd_observer.h"
+
+namespace ui {
+
+class PowerSettingChangeObserver {
+ public:
+ static PowerSettingChangeObserver* GetInstance();
+
+ void AddListener(PowerSettingChangeListener* listener);
+ void RemoveListener(PowerSettingChangeListener* listener);
+
+ private:
+ friend struct base::DefaultSingletonTraits<PowerSettingChangeObserver>;
+
+ PowerSettingChangeObserver();
+ virtual ~PowerSettingChangeObserver();
+
+ void OnWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
+
+ void OnDisplayStateChanged(bool display_on);
+
+ static HPOWERNOTIFY RegisterNotification(LPCGUID power_setting);
+ static BOOL UnregisterNotification(HPOWERNOTIFY handle);
+
+ base::ObserverList<PowerSettingChangeListener>::Unchecked listeners_;
+ std::unique_ptr<gfx::SingletonHwndObserver> singleton_hwnd_observer_;
+ HPOWERNOTIFY power_display_state_;
+};
+
+// static
+PowerSettingChangeObserver* PowerSettingChangeObserver::GetInstance() {
+ return base::Singleton<PowerSettingChangeObserver>::get();
+}
+
+PowerSettingChangeObserver::PowerSettingChangeObserver()
+ : singleton_hwnd_observer_(new gfx::SingletonHwndObserver(
+ base::BindRepeating(&PowerSettingChangeObserver::OnWndProc,
+ base::Unretained(this)))),
+ power_display_state_(RegisterNotification(&GUID_SESSION_DISPLAY_STATUS)) {
+}
+
+PowerSettingChangeObserver::~PowerSettingChangeObserver() {
+ UnregisterNotification(power_display_state_);
+}
+
+void PowerSettingChangeObserver::AddListener(
+ PowerSettingChangeListener* listener) {
+ listeners_.AddObserver(listener);
+}
+
+void PowerSettingChangeObserver::RemoveListener(
+ PowerSettingChangeListener* listener) {
+ listeners_.RemoveObserver(listener);
+}
+
+void PowerSettingChangeObserver::OnWndProc(HWND hwnd,
+ UINT message,
+ WPARAM wparam,
+ LPARAM lparam) {
+ if (message == WM_POWERBROADCAST && wparam == PBT_POWERSETTINGCHANGE) {
+ POWERBROADCAST_SETTING* setting = (POWERBROADCAST_SETTING*)lparam;
+ if (setting &&
+ IsEqualGUID(setting->PowerSetting, GUID_SESSION_DISPLAY_STATUS) &&
+ setting->DataLength == sizeof(DWORD)) {
+ OnDisplayStateChanged(
+ PowerMonitorOff !=
+ static_cast<MONITOR_DISPLAY_STATE>(setting->Data[0]));
+ }
+ }
+}
+
+void PowerSettingChangeObserver::OnDisplayStateChanged(bool display_on) {
+ for (PowerSettingChangeListener& observer : listeners_)
+ observer.OnDisplayStateChanged(display_on);
+}
+
+HPOWERNOTIFY PowerSettingChangeObserver::RegisterNotification(
+ LPCGUID power_setting) {
+ return RegisterPowerSettingNotification(
+ gfx::SingletonHwnd::GetInstance()->hwnd(), power_setting,
+ DEVICE_NOTIFY_WINDOW_HANDLE);
+}
+
+BOOL PowerSettingChangeObserver::UnregisterNotification(HPOWERNOTIFY handle) {
+ return UnregisterPowerSettingNotification(handle);
+}
+
+ScopedPowerSettingChangeListener::ScopedPowerSettingChangeListener(
+ PowerSettingChangeListener* listener)
+ : listener_(listener) {
+ PowerSettingChangeObserver::GetInstance()->AddListener(listener_);
+}
+
+ScopedPowerSettingChangeListener::~ScopedPowerSettingChangeListener() {
+ PowerSettingChangeObserver::GetInstance()->RemoveListener(listener_);
+}
+
+} // namespace ui
diff --git a/chromium/ui/base/win/power_setting_change_listener.h b/chromium/ui/base/win/power_setting_change_listener.h
new file mode 100644
index 00000000000..0a48115ecca
--- /dev/null
+++ b/chromium/ui/base/win/power_setting_change_listener.h
@@ -0,0 +1,40 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_WIN_POWER_SETTING_CHANGE_LISTENER_H_
+#define UI_BASE_WIN_POWER_SETTING_CHANGE_LISTENER_H_
+
+#include "base/component_export.h"
+
+namespace ui {
+
+// Interface for classes that want to listen to power setting changes.
+class COMPONENT_EXPORT(UI_BASE) PowerSettingChangeListener {
+ public:
+ virtual void OnDisplayStateChanged(bool display_on) = 0;
+
+ protected:
+ virtual ~PowerSettingChangeListener() = default;
+};
+
+// Create an instance of this class in any object that wants to listen
+// for power setting changes.
+class COMPONENT_EXPORT(UI_BASE) ScopedPowerSettingChangeListener {
+ public:
+ explicit ScopedPowerSettingChangeListener(
+ PowerSettingChangeListener* listener);
+ ~ScopedPowerSettingChangeListener();
+
+ private:
+ PowerSettingChangeListener* listener_;
+
+ ScopedPowerSettingChangeListener(const ScopedPowerSettingChangeListener&) =
+ delete;
+ const ScopedPowerSettingChangeListener& operator=(
+ const ScopedPowerSettingChangeListener&) = delete;
+};
+
+} // namespace ui
+
+#endif // UI_BASE_WIN_POWER_SETTING_CHANGE_LISTENER_H_
diff --git a/chromium/ui/base/win/session_change_observer.cc b/chromium/ui/base/win/session_change_observer.cc
index 44c20e2969b..a717568fb19 100644
--- a/chromium/ui/base/win/session_change_observer.cc
+++ b/chromium/ui/base/win/session_change_observer.cc
@@ -10,8 +10,8 @@
#include <utility>
#include "base/bind.h"
-#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/macros.h"
#include "base/memory/singleton.h"
diff --git a/chromium/ui/base/win/shell.cc b/chromium/ui/base/win/shell.cc
index d1ce18112b5..aabdfee8ceb 100644
--- a/chromium/ui/base/win/shell.cc
+++ b/chromium/ui/base/win/shell.cc
@@ -39,10 +39,10 @@ namespace {
const DWORD kDefaultShellExecuteFlags = SEE_MASK_NOASYNC;
// Invokes ShellExecuteExW() with the given parameters.
-bool InvokeShellExecute(const base::string16 path,
- const base::string16 working_directory,
- const base::string16 args,
- const base::string16 verb,
+bool InvokeShellExecute(const std::wstring& path,
+ const std::wstring& working_directory,
+ const std::wstring& args,
+ const std::wstring& verb,
DWORD mask) {
base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
base::BlockingType::WILL_BLOCK);
@@ -67,7 +67,7 @@ bool InvokeShellExecute(const base::string16 path,
bool OpenFileViaShell(const base::FilePath& full_path) {
// Invoke the default verb on the file with no arguments.
return InvokeShellExecute(full_path.value(), full_path.DirName().value(),
- base::string16(), base::string16(),
+ std::wstring(), std::wstring(),
kDefaultShellExecuteFlags);
}
@@ -75,7 +75,7 @@ bool OpenFolderViaShell(const base::FilePath& full_path) {
// The "explore" verb causes the folder at |full_path| to be displayed in a
// file browser. This will fail if |full_path| is not a directory.
return InvokeShellExecute(full_path.value(), full_path.value(),
- base::string16(), L"explore",
+ std::wstring(), L"explore",
kDefaultShellExecuteFlags);
}
@@ -92,11 +92,11 @@ bool PreventWindowFromPinning(HWND hwnd) {
// TODO(calamity): investigate moving this out of the UI thread as COM
// operations may spawn nested run loops which can cause issues.
-void SetAppDetailsForWindow(const base::string16& app_id,
+void SetAppDetailsForWindow(const std::wstring& app_id,
const base::FilePath& app_icon_path,
int app_icon_index,
- const base::string16& relaunch_command,
- const base::string16& relaunch_display_name,
+ const std::wstring& relaunch_command,
+ const std::wstring& relaunch_display_name,
HWND hwnd) {
DCHECK(hwnd);
@@ -127,23 +127,23 @@ void SetAppDetailsForWindow(const base::string16& app_id,
}
}
-void SetAppIdForWindow(const base::string16& app_id, HWND hwnd) {
- SetAppDetailsForWindow(app_id, base::FilePath(), 0, base::string16(),
- base::string16(), hwnd);
+void SetAppIdForWindow(const std::wstring& app_id, HWND hwnd) {
+ SetAppDetailsForWindow(app_id, base::FilePath(), 0, std::wstring(),
+ std::wstring(), hwnd);
}
void SetAppIconForWindow(const base::FilePath& app_icon_path,
int app_icon_index,
HWND hwnd) {
- SetAppDetailsForWindow(base::string16(), app_icon_path, app_icon_index,
- base::string16(), base::string16(), hwnd);
+ SetAppDetailsForWindow(std::wstring(), app_icon_path, app_icon_index,
+ std::wstring(), std::wstring(), hwnd);
}
-void SetRelaunchDetailsForWindow(const base::string16& relaunch_command,
- const base::string16& display_name,
+void SetRelaunchDetailsForWindow(const std::wstring& relaunch_command,
+ const std::wstring& display_name,
HWND hwnd) {
- SetAppDetailsForWindow(base::string16(), base::FilePath(), 0,
- relaunch_command, display_name, hwnd);
+ SetAppDetailsForWindow(std::wstring(), base::FilePath(), 0, relaunch_command,
+ display_name, hwnd);
}
void ClearWindowPropertyStore(HWND hwnd) {
diff --git a/chromium/ui/base/x/BUILD.gn b/chromium/ui/base/x/BUILD.gn
index 69fc364223c..b1aa641a4fe 100644
--- a/chromium/ui/base/x/BUILD.gn
+++ b/chromium/ui/base/x/BUILD.gn
@@ -3,8 +3,8 @@
# found in the LICENSE file.
import("//build/config/linux/gtk/gtk.gni")
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
assert(use_x11 || ozone_platform_x11)
@@ -26,8 +26,8 @@ component("x") {
"x11_display_manager.h",
"x11_display_util.cc",
"x11_display_util.h",
- "x11_error_handler.cc",
- "x11_error_handler.h",
+ "x11_idle_query.cc",
+ "x11_idle_query.h",
"x11_menu_list.cc",
"x11_menu_list.h",
"x11_menu_registrar.cc",
@@ -36,6 +36,8 @@ component("x") {
"x11_move_loop_delegate.h",
"x11_pointer_grab.cc",
"x11_pointer_grab.h",
+ "x11_screensaver_window_finder.cc",
+ "x11_screensaver_window_finder.h",
"x11_shm_image_pool.cc",
"x11_shm_image_pool.h",
"x11_software_bitmap_presenter.cc",
@@ -44,6 +46,8 @@ component("x") {
"x11_topmost_window_finder.h",
"x11_ui_thread.cc",
"x11_ui_thread.h",
+ "x11_user_input_monitor.cc",
+ "x11_user_input_monitor.h",
"x11_util.cc",
"x11_util.h",
"x11_whole_screen_move_loop.cc",
@@ -54,7 +58,7 @@ component("x") {
"x11_workspace_handler.h",
]
- if (is_desktop_linux || is_chromeos) {
+ if (is_linux || is_chromeos) {
sources += [
"selection_owner.cc",
"selection_owner.h",
@@ -118,10 +122,15 @@ source_set("test_support") {
sources = [
"test/x11_property_change_waiter.cc",
"test/x11_property_change_waiter.h",
+ "test/x11_ui_controls_test_helper.cc",
+ "test/x11_ui_controls_test_helper.h",
]
deps = [
+ ":x",
+ "//ui/base:test_support",
"//ui/events:platform_event",
+ "//ui/events:test_support",
"//ui/events/platform/x11",
"//ui/gfx/x",
]
diff --git a/chromium/ui/base/x/selection_owner.cc b/chromium/ui/base/x/selection_owner.cc
index 47bb2b6359b..6cbe80cc372 100644
--- a/chromium/ui/base/x/selection_owner.cc
+++ b/chromium/ui/base/x/selection_owner.cc
@@ -12,7 +12,6 @@
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/events/x/x11_window_event_manager.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_util.h"
diff --git a/chromium/ui/base/x/selection_owner.h b/chromium/ui/base/x/selection_owner.h
index 1dad4df144d..2d82e43ec31 100644
--- a/chromium/ui/base/x/selection_owner.h
+++ b/chromium/ui/base/x/selection_owner.h
@@ -17,7 +17,6 @@
#include "base/timer/timer.h"
#include "ui/base/x/selection_utils.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11_types.h"
namespace ui {
diff --git a/chromium/ui/base/x/selection_requestor.cc b/chromium/ui/base/x/selection_requestor.cc
index 7a83c814a75..6e01199f153 100644
--- a/chromium/ui/base/x/selection_requestor.cc
+++ b/chromium/ui/base/x/selection_requestor.cc
@@ -7,14 +7,12 @@
#include <algorithm>
#include "base/memory/ref_counted_memory.h"
-#include "base/run_loop.h"
#include "ui/base/x/selection_owner.h"
#include "ui/base/x/selection_utils.h"
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
namespace ui {
@@ -28,7 +26,7 @@ const char kChromeSelection[] = "CHROME_SELECTION";
const int KSelectionRequestorTimerPeriodMs = 100;
// The amount of time to wait for a request to complete before aborting it.
-const int kRequestTimeoutMs = 10000;
+const int kRequestTimeoutMs = 1000;
static_assert(KSelectionRequestorTimerPeriodMs <= kRequestTimeoutMs,
"timer period must be <= request timeout");
@@ -235,37 +233,30 @@ void SelectionRequestor::ConvertSelectionForCurrentRequest() {
}
void SelectionRequestor::BlockTillSelectionNotifyForRequest(Request* request) {
- if (X11EventSource::HasInstance()) {
- if (!abort_timer_.IsRunning()) {
- abort_timer_.Start(
- FROM_HERE,
- base::TimeDelta::FromMilliseconds(KSelectionRequestorTimerPeriodMs),
- this, &SelectionRequestor::AbortStaleRequests);
- }
-
- base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
- request->quit_closure = run_loop.QuitClosure();
- run_loop.Run();
-
- // We cannot put logic to process the next request here because the RunLoop
- // might be nested. For instance, request 'B' may start a RunLoop while the
- // RunLoop for request 'A' is running. It is not possible to end the RunLoop
- // for request 'A' without first ending the RunLoop for request 'B'.
- } else {
- // This occurs if PerformBlockingConvertSelection() is called during
- // shutdown and the X11EventSource has already been destroyed.
- auto* conn = x11::Connection::Get();
- auto& events = conn->events();
- while (!request->completed && request->timeout > base::TimeTicks::Now()) {
- conn->Flush();
- conn->ReadResponses();
- if (!conn->events().empty()) {
- x11::Event event = std::move(events.front());
- events.pop_front();
- dispatcher_->DispatchXEvent(&event);
+ auto* connection = x11::Connection::Get();
+ auto& events = connection->events();
+ size_t i = 0;
+ while (!request->completed && request->timeout > base::TimeTicks::Now()) {
+ connection->Flush();
+ connection->ReadResponses();
+ size_t events_size = events.size();
+ for (; i < events_size; ++i) {
+ auto& event = events[i];
+ if (auto* notify = event.As<x11::SelectionNotifyEvent>()) {
+ if (notify->requestor == x_window_) {
+ OnSelectionNotify(*notify);
+ event = x11::Event();
+ }
+ } else if (auto* prop = event.As<x11::PropertyNotifyEvent>()) {
+ if (CanDispatchPropertyEvent(event)) {
+ OnPropertyEvent(event);
+ event = x11::Event();
+ }
}
}
+ DCHECK_EQ(events_size, events.size());
}
+ AbortStaleRequests();
}
SelectionRequestor::Request* SelectionRequestor::GetCurrentRequest() {
diff --git a/chromium/ui/base/x/selection_requestor.h b/chromium/ui/base/x/selection_requestor.h
index 9a32c88986e..e9a38ceb19c 100644
--- a/chromium/ui/base/x/selection_requestor.h
+++ b/chromium/ui/base/x/selection_requestor.h
@@ -17,8 +17,6 @@
#include "base/timer/timer.h"
#include "ui/events/platform_event.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
namespace ui {
class XEventDispatcher;
diff --git a/chromium/ui/base/x/selection_requestor_unittest.cc b/chromium/ui/base/x/selection_requestor_unittest.cc
index c67b8e62213..ba68529c289 100644
--- a/chromium/ui/base/x/selection_requestor_unittest.cc
+++ b/chromium/ui/base/x/selection_requestor_unittest.cc
@@ -19,9 +19,7 @@
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
namespace ui {
@@ -102,7 +100,8 @@ void PerformBlockingConvertSelection(SelectionRequestor* requestor,
// Test that SelectionRequestor correctly handles receiving a request while it
// is processing another request.
-TEST_F(SelectionRequestorTest, NestedRequests) {
+// TODO(https://crbug.com/443355): Reenable once clipboard interface is async.
+TEST_F(SelectionRequestorTest, DISABLED_NestedRequests) {
// Assume that |selection| will have no owner. If there is an owner, the owner
// will set the property passed into the XConvertSelection() request which is
// undesirable.
diff --git a/chromium/ui/base/x/selection_utils.h b/chromium/ui/base/x/selection_utils.h
index 3e90ed3f20b..2183832130b 100644
--- a/chromium/ui/base/x/selection_utils.h
+++ b/chromium/ui/base/x/selection_utils.h
@@ -10,7 +10,7 @@
#include "base/component_export.h"
#include "base/memory/ref_counted_memory.h"
-#include "ui/gfx/x/x11.h"
+#include "ui/gfx/x/xproto.h"
namespace ui {
class SelectionData;
diff --git a/chromium/ui/base/x/x11_cursor_factory.cc b/chromium/ui/base/x/x11_cursor_factory.cc
index 4a97b8dc009..bfd662b201a 100644
--- a/chromium/ui/base/x/x11_cursor_factory.cc
+++ b/chromium/ui/base/x/x11_cursor_factory.cc
@@ -11,7 +11,6 @@
#include "ui/base/x/x11_util.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
@@ -160,7 +159,8 @@ base::Optional<PlatformCursor> X11CursorFactory::GetDefaultCursor(
return ToPlatformCursor(cursor.get());
}
-PlatformCursor X11CursorFactory::CreateImageCursor(const SkBitmap& bitmap,
+PlatformCursor X11CursorFactory::CreateImageCursor(mojom::CursorType type,
+ const SkBitmap& bitmap,
const gfx::Point& hotspot) {
// There is a problem with custom cursors that have no custom data. The
// resulting SkBitmap is empty and X crashes when creating a zero size cursor
@@ -181,6 +181,7 @@ PlatformCursor X11CursorFactory::CreateImageCursor(const SkBitmap& bitmap,
}
PlatformCursor X11CursorFactory::CreateAnimatedCursor(
+ mojom::CursorType type,
const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
int frame_delay_ms) {
diff --git a/chromium/ui/base/x/x11_cursor_factory.h b/chromium/ui/base/x/x11_cursor_factory.h
index 464c75f2306..ab4d55b233a 100644
--- a/chromium/ui/base/x/x11_cursor_factory.h
+++ b/chromium/ui/base/x/x11_cursor_factory.h
@@ -34,9 +34,11 @@ class COMPONENT_EXPORT(UI_BASE_X) X11CursorFactory
// CursorFactoryOzone:
base::Optional<PlatformCursor> GetDefaultCursor(
mojom::CursorType type) override;
- PlatformCursor CreateImageCursor(const SkBitmap& bitmap,
+ PlatformCursor CreateImageCursor(mojom::CursorType type,
+ const SkBitmap& bitmap,
const gfx::Point& hotspot) override;
- PlatformCursor CreateAnimatedCursor(const std::vector<SkBitmap>& bitmaps,
+ PlatformCursor CreateAnimatedCursor(mojom::CursorType type,
+ const std::vector<SkBitmap>& bitmaps,
const gfx::Point& hotspot,
int frame_delay_ms) override;
void RefImageCursor(PlatformCursor cursor) override;
diff --git a/chromium/ui/base/x/x11_cursor_factory_unittest.cc b/chromium/ui/base/x/x11_cursor_factory_unittest.cc
index 8c317fba402..bb6b0f8e51e 100644
--- a/chromium/ui/base/x/x11_cursor_factory_unittest.cc
+++ b/chromium/ui/base/x/x11_cursor_factory_unittest.cc
@@ -19,7 +19,7 @@ TEST(X11CursorFactoryTest, InvisibleRefcount) {
// than a single reference since the factory should hold a reference and
// CreateImageCursor should return an incremented refcount.
auto* invisible_cursor = static_cast<X11Cursor*>(
- factory.CreateImageCursor(SkBitmap(), gfx::Point()));
+ factory.CreateImageCursor({}, SkBitmap(), gfx::Point()));
ASSERT_FALSE(invisible_cursor->HasOneRef());
// Release our refcount on the cursor
diff --git a/chromium/ui/base/x/x11_desktop_window_move_client.cc b/chromium/ui/base/x/x11_desktop_window_move_client.cc
index 9b810e0f39e..0c53079dc0f 100644
--- a/chromium/ui/base/x/x11_desktop_window_move_client.cc
+++ b/chromium/ui/base/x/x11_desktop_window_move_client.cc
@@ -7,7 +7,6 @@
#include "ui/base/x/x11_util.h"
#include "ui/base/x/x11_window.h"
#include "ui/events/event.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_desktop_window_move_client.h b/chromium/ui/base/x/x11_desktop_window_move_client.h
index aaa32c3c16c..dc8462919a2 100644
--- a/chromium/ui/base/x/x11_desktop_window_move_client.h
+++ b/chromium/ui/base/x/x11_desktop_window_move_client.h
@@ -11,7 +11,6 @@
#include "ui/base/x/x11_move_loop_delegate.h"
#include "ui/base/x/x11_whole_screen_move_loop.h"
#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_display_manager.cc b/chromium/ui/base/x/x11_display_manager.cc
index ac1e99da7e2..170aeb8b914 100644
--- a/chromium/ui/base/x/x11_display_manager.cc
+++ b/chromium/ui/base/x/x11_display_manager.cc
@@ -10,7 +10,6 @@
#include "base/threading/thread_task_runner_handle.h"
#include "ui/base/x/x11_display_util.h"
#include "ui/gfx/x/randr.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xproto.h"
diff --git a/chromium/ui/base/x/x11_display_manager.h b/chromium/ui/base/x/x11_display_manager.h
index ec6c676249e..069ec82c926 100644
--- a/chromium/ui/base/x/x11_display_manager.h
+++ b/chromium/ui/base/x/x11_display_manager.h
@@ -15,7 +15,6 @@
#include "ui/display/display_change_notifier.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11_types.h"
namespace views {
class DesktopScreenX11Test;
diff --git a/chromium/ui/base/x/x11_display_util.cc b/chromium/ui/base/x/x11_display_util.cc
index e8d433ad4b6..f5d93cffb3d 100644
--- a/chromium/ui/base/x/x11_display_util.cc
+++ b/chromium/ui/base/x/x11_display_util.cc
@@ -19,7 +19,6 @@
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/vector3d_f.h"
#include "ui/gfx/x/randr.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
namespace ui {
@@ -138,11 +137,10 @@ int DefaultBitsPerComponent() {
// Get the EDID data from the |output| and stores to |edid|.
std::vector<uint8_t> GetEDIDProperty(x11::RandR* randr,
x11::RandR::Output output) {
- auto future = randr->GetOutputProperty({
+ auto future = randr->GetOutputProperty(x11::RandR::GetOutputPropertyRequest{
.output = output,
.property = gfx::GetAtom(kRandrEdidProperty),
- .long_length = 128,
- });
+ .long_length = 128});
auto response = future.Sync();
std::vector<uint8_t> edid;
if (response && response->format == 8 && response->type != x11::Atom::None)
diff --git a/chromium/ui/base/x/x11_display_util.h b/chromium/ui/base/x/x11_display_util.h
index 7a128004483..484d35ca662 100644
--- a/chromium/ui/base/x/x11_display_util.h
+++ b/chromium/ui/base/x/x11_display_util.h
@@ -8,8 +8,6 @@
#include "base/component_export.h"
#include "base/time/time.h"
#include "ui/display/display.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_drag_context.h b/chromium/ui/base/x/x11_drag_context.h
index f01efc28210..5e9a2ca6a39 100644
--- a/chromium/ui/base/x/x11_drag_context.h
+++ b/chromium/ui/base/x/x11_drag_context.h
@@ -13,7 +13,6 @@
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_drag_drop_client.h b/chromium/ui/base/x/x11_drag_drop_client.h
index 274e90adc4d..e32e73185ce 100644
--- a/chromium/ui/base/x/x11_drag_drop_client.h
+++ b/chromium/ui/base/x/x11_drag_drop_client.h
@@ -14,7 +14,6 @@
#include "ui/base/x/x11_drag_context.h"
#include "ui/base/x/x11_topmost_window_finder.h"
#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_error_handler.cc b/chromium/ui/base/x/x11_error_handler.cc
deleted file mode 100644
index cab6e26be74..00000000000
--- a/chromium/ui/base/x/x11_error_handler.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/x/x11_error_handler.h"
-
-#include "base/check.h"
-#include "base/compiler_specific.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/sequenced_task_runner.h"
-#include "base/task/current_thread.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "ui/base/x/x11_util.h"
-#include "ui/gfx/x/xproto_util.h"
-
-namespace ui {
-
-namespace {
-
-// Indicates that we're currently responding to an IO error (by shutting down).
-bool g_in_x11_io_error_handler = false;
-
-base::LazyInstance<base::OnceClosure>::Leaky g_shutdown_cb =
- LAZY_INSTANCE_INITIALIZER;
-
-// Number of seconds to wait for UI thread to get an IO error if we get it on
-// the background thread.
-const int kWaitForUIThreadSeconds = 10;
-
-int BrowserX11ErrorHandler(Display* d, XErrorEvent* error) {
- if (!g_in_x11_io_error_handler) {
- base::SequencedTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&x11::LogErrorEventDescription, error->serial,
- error->error_code, error->request_code,
- error->minor_code));
- }
- return 0;
-}
-
-// This function is used to help us diagnose crash dumps that happen
-// during the shutdown process.
-NOINLINE void WaitingForUIThreadToHandleIOError() {
- // Ensure function isn't optimized away.
- asm("");
- sleep(kWaitForUIThreadSeconds);
-}
-
-int BrowserX11IOErrorHandler(Display* d) {
- if (!base::CurrentUIThread::IsSet()) {
- // Wait for the UI thread (which has a different connection to the X server)
- // to get the error. We can't call shutdown from this thread without
- // tripping an error. Doing it through a function so that we'll be able
- // to see it in any crash dumps.
- WaitingForUIThreadToHandleIOError();
- return 0;
- }
-
- // If there's an IO error it likely means the X server has gone away.
- // If this CHECK fails, then that means SessionEnding() below triggered some
- // code that tried to talk to the X server, resulting in yet another error.
- CHECK(!g_in_x11_io_error_handler);
-
- g_in_x11_io_error_handler = true;
- LOG(ERROR) << "X IO error received (X server probably went away)";
- DCHECK(!g_shutdown_cb.Get().is_null());
- std::move(g_shutdown_cb.Get()).Run();
-
- return 0;
-}
-
-int X11EmptyErrorHandler(Display* d, XErrorEvent* error) {
- return 0;
-}
-
-int X11EmptyIOErrorHandler(Display* d) {
- return 0;
-}
-
-} // namespace
-
-void SetNullErrorHandlers() {
- // Installs the X11 error handlers for the browser process used during
- // startup. They simply print error messages and exit because
- // we can't shutdown properly while creating and initializing services.
- ui::SetX11ErrorHandlers(nullptr, nullptr);
-}
-
-void SetErrorHandlers(base::OnceCallback<void()> shutdown_cb) {
- // Installs the X11 error handlers for the browser process after the
- // main message loop has started. This will allow us to exit cleanly
- // if X exits before we do.
- DCHECK(g_shutdown_cb.Get().is_null());
- g_shutdown_cb.Get() = std::move(shutdown_cb);
- ui::SetX11ErrorHandlers(BrowserX11ErrorHandler, BrowserX11IOErrorHandler);
-}
-
-void SetEmptyErrorHandlers() {
- // Unset the X11 error handlers. The X11 error handlers log the errors using a
- // |PostTask()| on the message-loop. But since the message-loop is in the
- // process of terminating, this can cause errors.
- ui::SetX11ErrorHandlers(X11EmptyErrorHandler, X11EmptyIOErrorHandler);
-}
-
-} // namespace ui
diff --git a/chromium/ui/base/x/x11_error_handler.h b/chromium/ui/base/x/x11_error_handler.h
deleted file mode 100644
index 49011beb3d8..00000000000
--- a/chromium/ui/base/x/x11_error_handler.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_X_X11_ERROR_HANDLER_H_
-#define UI_BASE_X_X11_ERROR_HANDLER_H_
-
-#include "base/callback.h"
-#include "base/component_export.h"
-
-namespace ui {
-
-// Sets null error handlers that just catch error messages.
-COMPONENT_EXPORT(UI_BASE_X) void SetNullErrorHandlers();
-
-// Sets error handlers that catch the error messages on ui thread, waits until
-// errors are received on io thread, and stops the browser.
-COMPONENT_EXPORT(UI_BASE_X)
-void SetErrorHandlers(base::OnceCallback<void()> shutdown_cb);
-
-// Unsets the error handlers.
-COMPONENT_EXPORT(UI_BASE_X) void SetEmptyErrorHandlers();
-
-} // namespace ui
-
-#endif // UI_BASE_X_X11_ERROR_HANDLER_H_
diff --git a/chromium/ui/base/x/x11_gl_egl_utility.cc b/chromium/ui/base/x/x11_gl_egl_utility.cc
index 0e5fcf9fff6..b921f6291c7 100644
--- a/chromium/ui/base/x/x11_gl_egl_utility.cc
+++ b/chromium/ui/base/x/x11_gl_egl_utility.cc
@@ -5,7 +5,6 @@
#include "ui/base/x/x11_gl_egl_utility.h"
#include "ui/base/x/x11_util.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gl/gl_surface_egl.h"
#ifndef EGL_ANGLE_x11_visual
diff --git a/chromium/ui/base/idle/idle_query_x11.cc b/chromium/ui/base/x/x11_idle_query.cc
index 569c57a2d71..c880e49080f 100644
--- a/chromium/ui/base/idle/idle_query_x11.cc
+++ b/chromium/ui/base/x/x11_idle_query.cc
@@ -2,12 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/base/idle/idle_query_x11.h"
+#include "ui/base/x/x11_idle_query.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/screensaver.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
namespace ui {
diff --git a/chromium/ui/base/idle/idle_query_x11.h b/chromium/ui/base/x/x11_idle_query.h
index 457aada6a1e..ffdc12cb9ac 100644
--- a/chromium/ui/base/idle/idle_query_x11.h
+++ b/chromium/ui/base/x/x11_idle_query.h
@@ -2,11 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_IDLE_IDLE_QUERY_X11_H_
-#define UI_BASE_IDLE_IDLE_QUERY_X11_H_
-
-#include <memory>
+#ifndef UI_BASE_X_X11_IDLE_QUERY_H_
+#define UI_BASE_X_X11_IDLE_QUERY_H_
+#include "base/component_export.h"
#include "base/macros.h"
namespace x11 {
@@ -15,7 +14,7 @@ class Connection;
namespace ui {
-class IdleQueryX11 {
+class COMPONENT_EXPORT(UI_BASE_X) IdleQueryX11 {
public:
IdleQueryX11();
~IdleQueryX11();
@@ -30,4 +29,4 @@ class IdleQueryX11 {
} // namespace ui
-#endif // UI_BASE_IDLE_IDLE_QUERY_X11_H_
+#endif // UI_BASE_X_X11_IDLE_QUERY_H_
diff --git a/chromium/ui/base/x/x11_menu_list.h b/chromium/ui/base/x/x11_menu_list.h
index 8f45b83e50d..f0327944e87 100644
--- a/chromium/ui/base/x/x11_menu_list.h
+++ b/chromium/ui/base/x/x11_menu_list.h
@@ -9,7 +9,7 @@
#include "base/component_export.h"
#include "base/macros.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/xproto.h"
// A process wide singleton cache for X menus.
namespace base {
diff --git a/chromium/ui/base/x/x11_menu_registrar.cc b/chromium/ui/base/x/x11_menu_registrar.cc
index 8b4da2347eb..847829c4664 100644
--- a/chromium/ui/base/x/x11_menu_registrar.cc
+++ b/chromium/ui/base/x/x11_menu_registrar.cc
@@ -10,9 +10,9 @@
#include "ui/base/x/x11_menu_list.h"
#include "ui/base/x/x11_util.h"
#include "ui/events/x/x11_window_event_manager.h"
-#include "ui/gfx/x/x11.h"
+#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/scoped_ignore_errors.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_error_tracker.h"
#include "ui/gfx/x/xproto.h"
namespace {
@@ -66,7 +66,7 @@ void X11MenuRegistrar::OnWindowCreatedOrDestroyed(bool created,
if (created) {
// The window might be destroyed if the message pump did not get a chance to
// run but we can safely ignore the X error.
- gfx::X11ErrorTracker error_tracker;
+ x11::ScopedIgnoreErrors ignore_errors(x11::Connection::Get());
XMenuList::GetInstance()->MaybeRegisterMenu(window);
} else {
XMenuList::GetInstance()->MaybeUnregisterMenu(window);
diff --git a/chromium/ui/base/x/x11_menu_registrar.h b/chromium/ui/base/x/x11_menu_registrar.h
index 65b19e7c844..2e6584fb696 100644
--- a/chromium/ui/base/x/x11_menu_registrar.h
+++ b/chromium/ui/base/x/x11_menu_registrar.h
@@ -13,8 +13,6 @@
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_move_loop.h b/chromium/ui/base/x/x11_move_loop.h
index 9a00455409c..4a358af2d10 100644
--- a/chromium/ui/base/x/x11_move_loop.h
+++ b/chromium/ui/base/x/x11_move_loop.h
@@ -6,8 +6,6 @@
#define UI_BASE_X_X11_MOVE_LOOP_H_
#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_os_exchange_data_provider.cc b/chromium/ui/base/x/x11_os_exchange_data_provider.cc
index ef6463f78c6..d76cbc9d28c 100644
--- a/chromium/ui/base/x/x11_os_exchange_data_provider.cc
+++ b/chromium/ui/base/x/x11_os_exchange_data_provider.cc
@@ -13,6 +13,7 @@
#include "net/base/filename_util.h"
#include "ui/base/clipboard/clipboard_constants.h"
#include "ui/base/clipboard/clipboard_format_type.h"
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/base/dragdrop/file_info/file_info.h"
#include "ui/base/x/selection_utils.h"
#include "ui/base/x/x11_util.h"
@@ -367,7 +368,6 @@ bool XOSExchangeDataProvider::HasCustomFormat(
return !requested_types.empty();
}
-#if defined(USE_X11)
void XOSExchangeDataProvider::SetFileContents(
const base::FilePath& filename,
const std::string& file_contents) {
@@ -398,7 +398,6 @@ void XOSExchangeDataProvider::SetFileContents(
scoped_refptr<base::RefCountedMemory>(
base::RefCountedString::TakeString(&file_contents_copy)));
}
-#endif
void XOSExchangeDataProvider::SetHtml(const base::string16& html,
const GURL& base_url) {
@@ -477,4 +476,11 @@ void XOSExchangeDataProvider::InsertData(
format_map_.Insert(format, data);
}
+void XOSExchangeDataProvider::SetSource(
+ std::unique_ptr<DataTransferEndpoint> data_source) {}
+
+DataTransferEndpoint* XOSExchangeDataProvider::GetSource() const {
+ return nullptr;
+}
+
} // namespace ui
diff --git a/chromium/ui/base/x/x11_os_exchange_data_provider.h b/chromium/ui/base/x/x11_os_exchange_data_provider.h
index 24c0f42dbac..fbc79e53b91 100644
--- a/chromium/ui/base/x/x11_os_exchange_data_provider.h
+++ b/chromium/ui/base/x/x11_os_exchange_data_provider.h
@@ -18,7 +18,6 @@
#include "ui/base/x/selection_utils.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/image/image_skia.h"
-#include "ui/gfx/x/x11.h"
#include "url/gurl.h"
namespace ui {
@@ -82,10 +81,8 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
bool HasURL(FilenameToURLPolicy policy) const override;
bool HasFile() const override;
bool HasCustomFormat(const ClipboardFormatType& format) const override;
-#if defined(USE_X11)
void SetFileContents(const base::FilePath& filename,
const std::string& file_contents) override;
-#endif
void SetHtml(const base::string16& html, const GURL& base_url) override;
bool GetHtml(base::string16* html, GURL* base_url) const override;
@@ -95,6 +92,9 @@ class COMPONENT_EXPORT(UI_BASE_X) XOSExchangeDataProvider
gfx::ImageSkia GetDragImage() const override;
gfx::Vector2d GetDragImageOffset() const override;
+ void SetSource(std::unique_ptr<DataTransferEndpoint> data_source) override;
+ DataTransferEndpoint* GetSource() const override;
+
protected:
friend class OSExchangeDataProviderX11Test;
using PickleData = std::map<ClipboardFormatType, base::Pickle>;
diff --git a/chromium/ui/base/x/x11_pointer_grab.cc b/chromium/ui/base/x/x11_pointer_grab.cc
index e422d880c41..9e003369a0d 100644
--- a/chromium/ui/base/x/x11_pointer_grab.cc
+++ b/chromium/ui/base/x/x11_pointer_grab.cc
@@ -12,7 +12,6 @@
#include "ui/base/x/x11_util.h"
#include "ui/events/devices/x11/device_data_manager_x11.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xinput.h"
#include "ui/gfx/x/xproto.h"
diff --git a/chromium/ui/base/x/x11_pointer_grab.h b/chromium/ui/base/x/x11_pointer_grab.h
index 534a9402247..265b28f9457 100644
--- a/chromium/ui/base/x/x11_pointer_grab.h
+++ b/chromium/ui/base/x/x11_pointer_grab.h
@@ -6,7 +6,6 @@
#define UI_BASE_X_X11_POINTER_GRAB_H_
#include "base/component_export.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
namespace ui {
diff --git a/chromium/ui/base/idle/screensaver_window_finder_x11.cc b/chromium/ui/base/x/x11_screensaver_window_finder.cc
index 1813d9ab560..41c0da28282 100644
--- a/chromium/ui/base/idle/screensaver_window_finder_x11.cc
+++ b/chromium/ui/base/x/x11_screensaver_window_finder.cc
@@ -2,21 +2,21 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/base/idle/screensaver_window_finder_x11.h"
+#include "ui/base/x/x11_screensaver_window_finder.h"
#include "base/command_line.h"
#include "ui/base/x/x11_util.h"
#include "ui/gfx/switches.h"
#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/scoped_ignore_errors.h"
#include "ui/gfx/x/screensaver.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_error_tracker.h"
namespace ui {
ScreensaverWindowFinder::ScreensaverWindowFinder() : exists_(false) {}
+// static
bool ScreensaverWindowFinder::ScreensaverWindowExists() {
// Avoid calling into potentially missing X11 APIs in headless mode.
if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kHeadless))
@@ -50,10 +50,10 @@ bool ScreensaverWindowFinder::ScreensaverWindowExists() {
}
// Also check the top level windows to see if any of them are screensavers.
- gfx::X11ErrorTracker err_tracker;
+ x11::ScopedIgnoreErrors ignore_errors(connection);
ScreensaverWindowFinder finder;
ui::EnumerateTopLevelWindows(&finder);
- return finder.exists_ && !err_tracker.FoundNewError();
+ return finder.exists_;
}
bool ScreensaverWindowFinder::ShouldStopIterating(x11::Window window) {
diff --git a/chromium/ui/base/idle/screensaver_window_finder_x11.h b/chromium/ui/base/x/x11_screensaver_window_finder.h
index a502daa6fbe..147099a629c 100644
--- a/chromium/ui/base/idle/screensaver_window_finder_x11.h
+++ b/chromium/ui/base/x/x11_screensaver_window_finder.h
@@ -2,16 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_BASE_IDLE_SCREENSAVER_WINDOW_FINDER_X11_H_
-#define UI_BASE_IDLE_SCREENSAVER_WINDOW_FINDER_X11_H_
+#ifndef UI_BASE_X_X11_SCREENSAVER_WINDOW_FINDER_H_
+#define UI_BASE_X_X11_SCREENSAVER_WINDOW_FINDER_H_
-#include "base/compiler_specific.h"
+#include "base/component_export.h"
#include "base/macros.h"
#include "ui/base/x/x11_util.h"
namespace ui {
-class ScreensaverWindowFinder : public ui::EnumerateWindowsDelegate {
+class COMPONENT_EXPORT(UI_BASE_X) ScreensaverWindowFinder
+ : public ui::EnumerateWindowsDelegate {
public:
static bool ScreensaverWindowExists();
@@ -30,4 +31,4 @@ class ScreensaverWindowFinder : public ui::EnumerateWindowsDelegate {
} // namespace ui
-#endif // UI_BASE_IDLE_SCREENSAVER_WINDOW_FINDER_X11_H_
+#endif // UI_BASE_X_X11_SCREENSAVER_WINDOW_FINDER_H_
diff --git a/chromium/ui/base/x/x11_shm_image_pool.cc b/chromium/ui/base/x/x11_shm_image_pool.cc
index 91dd0122693..3adadda03cd 100644
--- a/chromium/ui/base/x/x11_shm_image_pool.cc
+++ b/chromium/ui/base/x/x11_shm_image_pool.cc
@@ -70,16 +70,9 @@ bool ShouldUseMitShm(x11::Connection* connection) {
// codepath. It may be possible in contrived cases for there to be a
// false-positive, but in that case we'll just fallback to the non-SHM
// codepath.
- const std::string& display_string = connection->DisplayString();
- char* host = nullptr;
- int display_id = 0;
- int screen = 0;
- if (xcb_parse_display(display_string.c_str(), &host, &display_id, &screen)) {
- std::string name = host;
- free(host);
- if (IsRemoteHost(name))
- return false;
- }
+ auto host = connection->GetConnectionHostname();
+ if (!host.empty() && IsRemoteHost(host))
+ return false;
std::unique_ptr<base::Environment> env = base::Environment::Create();
diff --git a/chromium/ui/base/x/x11_shm_image_pool.h b/chromium/ui/base/x/x11_shm_image_pool.h
index dfd480550ed..a0e44920307 100644
--- a/chromium/ui/base/x/x11_shm_image_pool.h
+++ b/chromium/ui/base/x/x11_shm_image_pool.h
@@ -21,7 +21,6 @@
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/x/event.h"
#include "ui/gfx/x/shm.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_software_bitmap_presenter.cc b/chromium/ui/base/x/x11_software_bitmap_presenter.cc
index 0894413c511..2c0a8bf8095 100644
--- a/chromium/ui/base/x/x11_software_bitmap_presenter.cc
+++ b/chromium/ui/base/x/x11_software_bitmap_presenter.cc
@@ -16,6 +16,7 @@
#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/ref_counted_memory.h"
+#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkSurface.h"
@@ -23,9 +24,6 @@
#include "ui/base/x/x11_util.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_error_tracker.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_types.h"
@@ -78,11 +76,11 @@ bool X11SoftwareBitmapPresenter::CompositeBitmap(x11::Connection* connection,
connection->CreatePixmap({depth, pixmap_id, widget, width, height});
ScopedPixmap pixmap(connection, pixmap_id);
- connection->ChangeGC(
- {.gc = gc, .subwindow_mode = x11::SubwindowMode::IncludeInferiors});
+ connection->ChangeGC(x11::ChangeGCRequest{
+ .gc = gc, .subwindow_mode = x11::SubwindowMode::IncludeInferiors});
connection->CopyArea({widget, pixmap_id, gc, x, y, 0, 0, width, height});
- connection->ChangeGC(
- {.gc = gc, .subwindow_mode = x11::SubwindowMode::ClipByChildren});
+ connection->ChangeGC(x11::ChangeGCRequest{
+ .gc = gc, .subwindow_mode = x11::SubwindowMode::ClipByChildren});
auto req = connection->GetImage({x11::ImageFormat::ZPixmap, pixmap_id, 0, 0,
width, height, kAllPlanes});
@@ -174,7 +172,8 @@ void X11SoftwareBitmapPresenter::Resize(const gfx::Size& pixel_size) {
SkImageInfo info = SkImageInfo::Make(viewport_pixel_size_.width(),
viewport_pixel_size_.height(),
color_type, kOpaque_SkAlphaType);
- surface_ = SkSurface::MakeRaster(info);
+ SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps();
+ surface_ = SkSurface::MakeRaster(info, &props);
}
}
diff --git a/chromium/ui/base/x/x11_software_bitmap_presenter.h b/chromium/ui/base/x/x11_software_bitmap_presenter.h
index d4859e43749..d862609d2b3 100644
--- a/chromium/ui/base/x/x11_software_bitmap_presenter.h
+++ b/chromium/ui/base/x/x11_software_bitmap_presenter.h
@@ -15,8 +15,6 @@
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
class SkCanvas;
diff --git a/chromium/ui/base/x/x11_topmost_window_finder.h b/chromium/ui/base/x/x11_topmost_window_finder.h
index 8099ce8bbcb..f2b75cf195c 100644
--- a/chromium/ui/base/x/x11_topmost_window_finder.h
+++ b/chromium/ui/base/x/x11_topmost_window_finder.h
@@ -8,7 +8,6 @@
#include "base/component_export.h"
#include "ui/base/x/x11_util.h"
#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
diff --git a/chromium/ui/base/x/x11_user_input_monitor.cc b/chromium/ui/base/x/x11_user_input_monitor.cc
new file mode 100644
index 00000000000..4b9ae0158a4
--- /dev/null
+++ b/chromium/ui/base/x/x11_user_input_monitor.cc
@@ -0,0 +1,131 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/x/x11_user_input_monitor.h"
+
+#include "base/logging.h"
+#include "ui/events/devices/x11/xinput_util.h"
+#include "ui/events/keycodes/keyboard_code_conversion_x.h"
+
+namespace ui {
+
+XUserInputMonitor::XUserInputMonitor(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
+ : io_task_runner_(io_task_runner) {}
+
+XUserInputMonitor::~XUserInputMonitor() {
+ DCHECK(!connection_);
+}
+
+void XUserInputMonitor::WillDestroyCurrentMessageLoop() {
+ DCHECK(io_task_runner_->BelongsToCurrentThread());
+ StopMonitor();
+}
+
+bool XUserInputMonitor::ShouldContinueStream() const {
+ return true;
+}
+
+void XUserInputMonitor::DispatchXEvent(x11::Event* event) {
+ DCHECK(io_task_runner_->BelongsToCurrentThread());
+ DCHECK(write_key_press_callback_);
+
+ auto* raw = event->As<x11::Input::RawDeviceEvent>();
+ if (!raw || (raw->opcode != x11::Input::RawDeviceEvent::RawKeyPress &&
+ raw->opcode != x11::Input::RawDeviceEvent::RawKeyRelease)) {
+ return;
+ }
+
+ EventType type = raw->opcode == x11::Input::RawDeviceEvent::RawKeyPress
+ ? ET_KEY_PRESSED
+ : ET_KEY_RELEASED;
+
+ auto key_sym =
+ connection_->KeycodeToKeysym(static_cast<x11::KeyCode>(raw->detail), 0);
+ KeyboardCode key_code = KeyboardCodeFromXKeysym(key_sym);
+ counter_.OnKeyboardEvent(type, key_code);
+
+ // Update count value in shared memory.
+ if (key_press_count_mapping_) {
+ write_key_press_callback_.Run(*key_press_count_mapping_,
+ GetKeyPressCount());
+ }
+}
+
+uint32_t XUserInputMonitor::GetKeyPressCount() const {
+ return counter_.GetKeyPressCount();
+}
+
+void XUserInputMonitor::StartMonitor(WriteKeyPressCallback& callback) {
+ DCHECK(io_task_runner_->BelongsToCurrentThread());
+ write_key_press_callback_ = callback;
+
+ if (!connection_) {
+ // TODO(jamiewalch): We should pass the connection in.
+ if (auto* connection = x11::Connection::Get()) {
+ connection_ = x11::Connection::Get()->Clone();
+ } else {
+ LOG(ERROR) << "Couldn't open X connection";
+ StopMonitor();
+ return;
+ }
+ }
+
+ if (!connection_->xinput().present()) {
+ LOG(ERROR) << "X Input extension not available.";
+ StopMonitor();
+ return;
+ }
+ // Let the server know the client XInput version.
+ connection_->xinput().XIQueryVersion(
+ {x11::Input::major_version, x11::Input::minor_version});
+
+ x11::Input::XIEventMask mask;
+ SetXinputMask(&mask, x11::Input::RawDeviceEvent::RawKeyPress);
+ SetXinputMask(&mask, x11::Input::RawDeviceEvent::RawKeyRelease);
+ connection_->xinput().XISelectEvents(
+ {connection_->default_root(),
+ {{x11::Input::DeviceId::AllMaster, {mask}}}});
+ connection_->Flush();
+
+ // Register OnConnectionData() to be called every time there is something to
+ // read from |connection_|.
+ watch_controller_ = base::FileDescriptorWatcher::WatchReadable(
+ connection_->GetFd(),
+ base::BindRepeating(&XUserInputMonitor::OnConnectionData,
+ base::Unretained(this)));
+
+ // Start observing message loop destruction if we start monitoring the first
+ // event.
+ base::CurrentThread::Get()->AddDestructionObserver(this);
+
+ // Fetch pending events if any.
+ OnConnectionData();
+}
+
+void XUserInputMonitor::StartMonitorWithMapping(
+ WriteKeyPressCallback& callback,
+ base::WritableSharedMemoryMapping mapping) {
+ StartMonitor(callback);
+ key_press_count_mapping_ =
+ std::make_unique<base::WritableSharedMemoryMapping>(std::move(mapping));
+}
+
+void XUserInputMonitor::StopMonitor() {
+ DCHECK(io_task_runner_->BelongsToCurrentThread());
+
+ watch_controller_.reset();
+ connection_.reset();
+ key_press_count_mapping_.reset();
+
+ // Stop observing message loop destruction if no event is being monitored.
+ base::CurrentThread::Get()->RemoveDestructionObserver(this);
+}
+
+void XUserInputMonitor::OnConnectionData() {
+ DCHECK(io_task_runner_->BelongsToCurrentThread());
+ connection_->Dispatch(this);
+}
+
+} // namespace ui
diff --git a/chromium/ui/base/x/x11_user_input_monitor.h b/chromium/ui/base/x/x11_user_input_monitor.h
new file mode 100644
index 00000000000..708817c9321
--- /dev/null
+++ b/chromium/ui/base/x/x11_user_input_monitor.h
@@ -0,0 +1,68 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_X_X11_USER_INPUT_MONITOR_H_
+#define UI_BASE_X_X11_USER_INPUT_MONITOR_H_
+
+#include <memory>
+
+#include "base/component_export.h"
+#include "base/files/file_descriptor_watcher_posix.h"
+#include "base/memory/shared_memory_mapping.h"
+#include "base/single_thread_task_runner.h"
+#include "base/task/current_thread.h"
+#include "ui/events/keyboard_event_counter.h"
+#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/xinput.h"
+
+namespace ui {
+
+// This is the actual implementation of event monitoring. It's separated from
+// UserInputMonitorLinux since it needs to be deleted on the IO thread.
+class COMPONENT_EXPORT(UI_BASE_X) XUserInputMonitor
+ : public base::SupportsWeakPtr<XUserInputMonitor>,
+ public base::CurrentThread::DestructionObserver,
+ public x11::Connection::Delegate {
+ public:
+ using WriteKeyPressCallback = base::RepeatingCallback<
+ void(const base::WritableSharedMemoryMapping& shmem, uint32_t count)>;
+
+ explicit XUserInputMonitor(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
+ XUserInputMonitor(const XUserInputMonitor&) = delete;
+ XUserInputMonitor& operator=(const XUserInputMonitor&) = delete;
+ ~XUserInputMonitor() override;
+
+ uint32_t GetKeyPressCount() const;
+ void StartMonitor(WriteKeyPressCallback& callback);
+ void StartMonitorWithMapping(WriteKeyPressCallback& callback,
+ base::WritableSharedMemoryMapping mapping);
+ void StopMonitor();
+
+ private:
+ // base::CurrentThread::DestructionObserver:
+ void WillDestroyCurrentMessageLoop() override;
+
+ // x11::Connection::Delegate:
+ bool ShouldContinueStream() const override;
+ void DispatchXEvent(x11::Event* event) override;
+
+ void OnConnectionData();
+
+ scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
+
+ // Used for sharing key press count value.
+ std::unique_ptr<base::WritableSharedMemoryMapping> key_press_count_mapping_;
+
+ // The following members should only be accessed on the IO thread.
+ std::unique_ptr<base::FileDescriptorWatcher::Controller> watch_controller_;
+ std::unique_ptr<x11::Connection> connection_;
+ KeyboardEventCounter counter_;
+
+ WriteKeyPressCallback write_key_press_callback_;
+};
+
+} // namespace ui
+
+#endif // UI_BASE_X_X11_USER_INPUT_MONITOR_H_
diff --git a/chromium/ui/base/x/x11_util.cc b/chromium/ui/base/x/x11_util.cc
index c604bcd0f9b..e9e4671a80c 100644
--- a/chromium/ui/base/x/x11_util.cc
+++ b/chromium/ui/base/x/x11_util.cc
@@ -22,6 +22,7 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
+#include "base/environment.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/memory/ref_counted_memory.h"
@@ -67,9 +68,7 @@
#include "ui/gfx/x/screensaver.h"
#include "ui/gfx/x/shm.h"
#include "ui/gfx/x/sync.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_error_tracker.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_util.h"
@@ -93,33 +92,6 @@ namespace {
constexpr int kNetWMStateAdd = 1;
constexpr int kNetWMStateRemove = 0;
-int DefaultX11ErrorHandler(XDisplay* d, XErrorEvent* e) {
- // This callback can be invoked by drivers very late in thread destruction,
- // when Chrome TLS is no longer usable. https://crbug.com/849225.
- if (TLSDestructionCheckerForX11::HasBeenDestroyed())
- return 0;
-
- if (base::CurrentThread::Get()) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&x11::LogErrorEventDescription, e->serial, e->error_code,
- e->request_code, e->minor_code));
- } else {
- LOG(ERROR) << "X error received: "
- << "serial " << e->serial << ", "
- << "error_code " << static_cast<int>(e->error_code) << ", "
- << "request_code " << static_cast<int>(e->request_code) << ", "
- << "minor_code " << static_cast<int>(e->minor_code);
- }
- return 0;
-}
-
-int DefaultX11IOErrorHandler(XDisplay* d) {
- // If there's an IO error it likely means the X server has gone away
- LOG(ERROR) << "X IO error received (X server probably went away)";
- _exit(1);
-}
-
bool SupportsEWMH() {
static bool supports_ewmh = false;
static bool supports_ewmh_cached = false;
@@ -142,13 +114,11 @@ bool SupportsEWMH() {
// _NET_SUPPORTING_WM_CHECK property pointing to itself (to avoid a stale
// property referencing an ID that's been recycled for another window), so
// we check that too.
- gfx::X11ErrorTracker err_tracker;
x11::Window wm_window_property = x11::Window::None;
- bool result =
+ supports_ewmh =
GetProperty(wm_window, gfx::GetAtom("_NET_SUPPORTING_WM_CHECK"),
- &wm_window_property);
- supports_ewmh = !err_tracker.FoundNewError() && result &&
- wm_window_property == wm_window;
+ &wm_window_property) &&
+ wm_window_property == wm_window;
}
return supports_ewmh;
@@ -165,9 +135,7 @@ bool GetWindowManagerName(std::string* wm_name) {
return false;
}
- gfx::X11ErrorTracker err_tracker;
- bool result = GetStringProperty(wm_window, "_NET_WM_NAME", wm_name);
- return !err_tracker.FoundNewError() && result;
+ return GetStringProperty(wm_window, "_NET_WM_NAME", wm_name);
}
// Returns whether the X11 Screen Saver Extension can be used to disable the
@@ -188,6 +156,15 @@ bool IsX11ScreenSaverAvailable() {
version->server_minor_version >= 1));
}
+// Must be in sync with the copy in //content/browser/gpu/gpu_internals_ui.cc.
+base::Value NewDescriptionValuePair(base::StringPiece desc,
+ base::StringPiece value) {
+ base::Value dict(base::Value::Type::DICTIONARY);
+ dict.SetKey("description", base::Value(desc));
+ dict.SetKey("value", base::Value(value));
+ return dict;
+}
+
} // namespace
void DeleteProperty(x11::Window window, x11::Atom name) {
@@ -243,13 +220,13 @@ void WithdrawWindow(x11::Window window) {
}
void RaiseWindow(x11::Window window) {
- x11::Connection::Get()->ConfigureWindow(
- {.window = window, .stack_mode = x11::StackMode::Above});
+ x11::Connection::Get()->ConfigureWindow(x11::ConfigureWindowRequest{
+ .window = window, .stack_mode = x11::StackMode::Above});
}
void LowerWindow(x11::Window window) {
- x11::Connection::Get()->ConfigureWindow(
- {.window = window, .stack_mode = x11::StackMode::Below});
+ x11::Connection::Get()->ConfigureWindow(x11::ConfigureWindowRequest{
+ .window = window, .stack_mode = x11::StackMode::Below});
}
void DefineCursor(x11::Window window, x11::Cursor cursor) {
@@ -258,14 +235,15 @@ void DefineCursor(x11::Window window, x11::Cursor cursor) {
// timing on BookmarkBarViewTest8.DNDBackToOriginatingMenu on
// linux-chromeos-rel, causing it to flake.
x11::Connection::Get()
- ->ChangeWindowAttributes({.window = window, .cursor = cursor})
+ ->ChangeWindowAttributes(x11::ChangeWindowAttributesRequest{
+ .window = window, .cursor = cursor})
.Sync();
}
x11::Window CreateDummyWindow(const std::string& name) {
auto* connection = x11::Connection::Get();
auto window = connection->GenerateId<x11::Window>();
- connection->CreateWindow({
+ connection->CreateWindow(x11::CreateWindowRequest{
.wid = window,
.parent = connection->default_root(),
.x = -100,
@@ -348,16 +326,14 @@ int CoalescePendingMotionEvents(const x11::Event* x11_event,
conn->ReadResponses();
if (motion) {
- for (auto it = conn->events().begin(); it != conn->events().end();) {
- const auto& next_event = *it;
+ for (auto& next_event : conn->events()) {
// Discard all but the most recent motion event that targets the same
// window with unchanged state.
const auto* next_motion = next_event.As<x11::MotionNotifyEvent>();
if (next_motion && next_motion->event == motion->event &&
next_motion->child == motion->child &&
next_motion->state == motion->state) {
- *last_event = std::move(*it);
- it = conn->events().erase(it);
+ *last_event = std::move(next_event);
} else {
break;
}
@@ -367,8 +343,8 @@ int CoalescePendingMotionEvents(const x11::Event* x11_event,
device->opcode == x11::Input::DeviceEvent::TouchUpdate);
auto* ddmx11 = ui::DeviceDataManagerX11::GetInstance();
- for (auto it = conn->events().begin(); it != conn->events().end();) {
- auto* next_device = it->As<x11::Input::DeviceEvent>();
+ for (auto& event : conn->events()) {
+ auto* next_device = event.As<x11::Input::DeviceEvent>();
if (!next_device)
break;
@@ -379,13 +355,13 @@ int CoalescePendingMotionEvents(const x11::Event* x11_event,
// always be at least one pending.
if (!ui::TouchFactory::GetInstance()->ShouldProcessDeviceEvent(
*next_device)) {
- it = conn->events().erase(it);
+ event = x11::Event();
continue;
}
if (next_device->opcode == device->opcode &&
- !ddmx11->IsCMTGestureEvent(*it) &&
- ddmx11->GetScrollClassEventDetail(*it) == SCROLL_TYPE_NO_SCROLL) {
+ !ddmx11->IsCMTGestureEvent(event) &&
+ ddmx11->GetScrollClassEventDetail(event) == SCROLL_TYPE_NO_SCROLL) {
// Confirm that the motion event is targeted at the same window
// and that no buttons or modifiers have changed.
if (device->event == next_device->event &&
@@ -396,12 +372,12 @@ int CoalescePendingMotionEvents(const x11::Event* x11_event,
device->mods.latched == next_device->mods.latched &&
device->mods.locked == next_device->mods.locked &&
device->mods.effective == next_device->mods.effective) {
- *last_event = std::move(*it);
- it = conn->events().erase(it);
+ *last_event = std::move(event);
num_coalesced++;
continue;
}
}
+
break;
}
}
@@ -487,6 +463,8 @@ bool GetInnerWindowBounds(x11::Window window, gfx::Rect* rect) {
auto translate_coords = connection->TranslateCoordinates({x11_window, root});
// Sync after making both requests so only one round-trip is made.
+ // Flush so all requests are sent before waiting on any replies.
+ connection->Flush();
auto geometry = get_geometry.Sync();
auto coords = translate_coords.Sync();
@@ -583,7 +561,7 @@ bool WindowContainsPoint(x11::Window window, gfx::Point screen_loc) {
bool PropertyExists(x11::Window window, const std::string& property_name) {
auto response = x11::Connection::Get()
- ->GetProperty({
+ ->GetProperty(x11::GetPropertyRequest{
.window = static_cast<x11::Window>(window),
.property = gfx::GetAtom(property_name),
.long_length = 1,
@@ -596,7 +574,7 @@ bool GetRawBytesOfProperty(x11::Window window,
x11::Atom property,
scoped_refptr<base::RefCountedMemory>* out_data,
x11::Atom* out_type) {
- auto future = x11::Connection::Get()->GetProperty({
+ auto future = x11::Connection::Get()->GetProperty(x11::GetPropertyRequest{
.window = static_cast<x11::Window>(window),
.property = property,
// Don't limit the amount of returned data.
@@ -794,12 +772,6 @@ bool GetWindowDesktop(x11::Window window, int* desktop) {
return GetIntProperty(window, "_NET_WM_DESKTOP", desktop);
}
-std::string GetX11ErrorString(XDisplay* display, int err) {
- char buffer[256];
- XGetErrorText(display, err, buffer, base::size(buffer));
- return buffer;
-}
-
// Returns true if |window| is a named window.
bool IsWindowNamed(x11::Window window) {
return PropertyExists(window, "WM_NAME");
@@ -1011,10 +983,6 @@ bool IsCompositingManagerPresent() {
return is_compositing_manager_present;
}
-void SetDefaultX11ErrorHandlers() {
- SetX11ErrorHandlers(nullptr, nullptr);
-}
-
bool IsX11WindowFullScreen(x11::Window window) {
// If _NET_WM_STATE_FULLSCREEN is in _NET_SUPPORTED, use the presence or
// absence of _NET_WM_STATE_FULLSCREEN in _NET_WM_STATE to determine
@@ -1048,6 +1016,31 @@ void SuspendX11ScreenSaver(bool suspend) {
x11::Connection::Get()->screensaver().Suspend({suspend});
}
+base::Value GpuExtraInfoAsListValue(unsigned long system_visual,
+ unsigned long rgba_visual) {
+ base::Value result(base::Value::Type::LIST);
+ result.Append(
+ NewDescriptionValuePair("Window manager", ui::GuessWindowManagerName()));
+ {
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+ std::string value;
+ const char kXDGCurrentDesktop[] = "XDG_CURRENT_DESKTOP";
+ if (env->GetVar(kXDGCurrentDesktop, &value))
+ result.Append(NewDescriptionValuePair(kXDGCurrentDesktop, value));
+ const char kGDMSession[] = "GDMSESSION";
+ if (env->GetVar(kGDMSession, &value))
+ result.Append(NewDescriptionValuePair(kGDMSession, value));
+ result.Append(NewDescriptionValuePair(
+ "Compositing manager",
+ ui::IsCompositingManagerPresent() ? "Yes" : "No"));
+ }
+ result.Append(NewDescriptionValuePair("System visual ID",
+ base::NumberToString(system_visual)));
+ result.Append(NewDescriptionValuePair("RGBA visual ID",
+ base::NumberToString(rgba_visual)));
+ return result;
+}
+
bool WmSupportsHint(x11::Atom atom) {
if (!SupportsEWMH())
return false;
@@ -1148,13 +1141,6 @@ x11::Future<void> SendClientMessage(x11::Window window,
return SendEvent(event, target, event_mask);
}
-void SetX11ErrorHandlers(XErrorHandler error_handler,
- XIOErrorHandler io_error_handler) {
- XSetErrorHandler(error_handler ? error_handler : DefaultX11ErrorHandler);
- XSetIOErrorHandler(io_error_handler ? io_error_handler
- : DefaultX11IOErrorHandler);
-}
-
bool IsVulkanSurfaceSupported() {
static const char* extensions[] = {
"DRI3", // open source driver.
@@ -1169,6 +1155,22 @@ bool IsVulkanSurfaceSupported() {
return false;
}
+bool DoesVisualHaveAlphaForTest() {
+ // testing/xvfb.py runs xvfb and xcompmgr.
+ std::unique_ptr<base::Environment> env(base::Environment::Create());
+
+ uint8_t depth = 0;
+ bool visual_has_alpha = false;
+ ui::XVisualManager::GetInstance()->ChooseVisualForWindow(
+ env->HasVar("_CHROMIUM_INSIDE_XVFB"), nullptr, &depth, nullptr,
+ &visual_has_alpha);
+
+ if (visual_has_alpha)
+ DCHECK_EQ(32, depth);
+
+ return visual_has_alpha;
+}
+
// static
XVisualManager* XVisualManager::GetInstance() {
return base::Singleton<XVisualManager>::get();
diff --git a/chromium/ui/base/x/x11_util.h b/chromium/ui/base/x/x11_util.h
index 5c84aa3691d..ca024c442a6 100644
--- a/chromium/ui/base/x/x11_util.h
+++ b/chromium/ui/base/x/x11_util.h
@@ -24,15 +24,15 @@
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "base/synchronization/lock.h"
+#include "base/values.h"
#include "build/build_config.h"
#include "ui/base/x/x11_cursor.h"
#include "ui/events/event_constants.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/events/platform_event.h"
#include "ui/gfx/icc_profile.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto_types.h"
typedef unsigned long Cursor;
@@ -113,15 +113,15 @@ struct WmHints {
// See below
int32_t initial_state;
// Pixmap to be used as icon
- xcb_pixmap_t icon_pixmap;
+ x11::Pixmap icon_pixmap;
// Window to be used as icon
- xcb_window_t icon_window;
+ x11::Window icon_window;
// Initial position of icon
int32_t icon_x, icon_y;
// Icon mask bitmap
- xcb_pixmap_t icon_mask;
+ x11::Pixmap icon_mask;
// Identifier of related window group
- xcb_window_t window_group;
+ x11::Window window_group;
};
// These functions use the default display and this /must/ be called from
@@ -143,11 +143,11 @@ bool GetArrayProperty(x11::Window window,
using lentype = decltype(x11::GetPropertyRequest::long_length);
auto response =
x11::Connection::Get()
- ->GetProperty(
- {.window = static_cast<x11::Window>(window),
- .property = name,
- .long_length =
- amount ? length : std::numeric_limits<lentype>::max()})
+ ->GetProperty(x11::GetPropertyRequest{
+ .window = static_cast<x11::Window>(window),
+ .property = name,
+ .long_length =
+ amount ? length : std::numeric_limits<lentype>::max()})
.Sync();
if (!response || response->format != CHAR_BIT * sizeof(T))
return false;
@@ -178,13 +178,13 @@ void SetArrayProperty(x11::Window window,
static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "");
std::vector<uint8_t> data(sizeof(T) * values.size());
memcpy(data.data(), values.data(), sizeof(T) * values.size());
- x11::Connection::Get()->ChangeProperty(
- {.window = static_cast<x11::Window>(window),
- .property = name,
- .type = type,
- .format = CHAR_BIT * sizeof(T),
- .data_len = values.size(),
- .data = base::RefCountedBytes::TakeVector(&data)});
+ x11::Connection::Get()->ChangeProperty(x11::ChangePropertyRequest{
+ .window = static_cast<x11::Window>(window),
+ .property = name,
+ .type = type,
+ .format = CHAR_BIT * sizeof(T),
+ .data_len = values.size(),
+ .data = base::RefCountedBytes::TakeVector(&data)});
}
template <typename T>
@@ -406,10 +406,6 @@ static const int kAllDesktops = -1;
COMPONENT_EXPORT(UI_BASE_X)
bool GetWindowDesktop(x11::Window window, int* desktop);
-// Translates an X11 error code into a printable string.
-COMPONENT_EXPORT(UI_BASE_X)
-std::string GetX11ErrorString(XDisplay* display, int err);
-
// Implementers of this interface receive a notification for every X window of
// the main display.
class EnumerateWindowsDelegate {
@@ -515,17 +511,18 @@ COMPONENT_EXPORT(UI_BASE_X) bool IsWmTiling(WindowManagerName window_manager);
// Returns true if a compositing manager is present.
COMPONENT_EXPORT(UI_BASE_X) bool IsCompositingManagerPresent();
-// Enable the default X error handlers. These will log the error and abort
-// the process if called. Use SetX11ErrorHandlers() to set your own error
-// handlers.
-COMPONENT_EXPORT(UI_BASE_X) void SetDefaultX11ErrorHandlers();
-
// Returns true if a given window is in full-screen mode.
COMPONENT_EXPORT(UI_BASE_X) bool IsX11WindowFullScreen(x11::Window window);
// Suspends or resumes the X screen saver. Must be called on the UI thread.
COMPONENT_EXPORT(UI_BASE_X) void SuspendX11ScreenSaver(bool suspend);
+// Returns human readable description of the window manager, desktop, and
+// other system properties related to the compositing.
+COMPONENT_EXPORT(UI_BASE_X)
+base::Value GpuExtraInfoAsListValue(unsigned long system_visual,
+ unsigned long rgba_visual);
+
// Returns true if the window manager supports the given hint.
COMPONENT_EXPORT(UI_BASE_X) bool WmSupportsHint(x11::Atom atom);
@@ -550,17 +547,13 @@ x11::Future<void> SendClientMessage(
x11::EventMask event_mask = x11::EventMask::SubstructureNotify |
x11::EventMask::SubstructureRedirect);
-// --------------------------------------------------------------------------
-// X11 error handling.
-// Sets the X Error Handlers. Passing NULL for either will enable the default
-// error handler, which if called will log the error and abort the process.
-COMPONENT_EXPORT(UI_BASE_X)
-void SetX11ErrorHandlers(XErrorHandler error_handler,
- XIOErrorHandler io_error_handler);
-
// Return true if VulkanSurface is supported.
COMPONENT_EXPORT(UI_BASE_X) bool IsVulkanSurfaceSupported();
+// Returns whether the visual supports alpha.
+// The function examines the _CHROMIUM_INSIDE_XVFB environment variable.
+COMPONENT_EXPORT(UI_BASE_X) bool DoesVisualHaveAlphaForTest();
+
// --------------------------------------------------------------------------
// Selects a visual with a preference for alpha support on compositing window
// managers.
diff --git a/chromium/ui/base/x/x11_whole_screen_move_loop.cc b/chromium/ui/base/x/x11_whole_screen_move_loop.cc
index e26532b8403..09a0c5a7f58 100644
--- a/chromium/ui/base/x/x11_whole_screen_move_loop.cc
+++ b/chromium/ui/base/x/x11_whole_screen_move_loop.cc
@@ -27,15 +27,13 @@
#include "ui/events/x/events_x_utils.h"
#include "ui/events/x/x11_window_event_manager.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
+#include "ui/gfx/x/keysyms/keysyms.h"
#include "ui/gfx/x/xproto.h"
namespace ui {
namespace {
-constexpr x11::KeySym kEscKeysym = static_cast<x11::KeySym>(0xff1b);
-
// XGrabKey requires the modifier mask to explicitly be specified.
constexpr x11::ModMask kModifiersMasks[] = {
{}, // No additional modifier.
@@ -48,6 +46,23 @@ constexpr x11::ModMask kModifiersMasks[] = {
x11::ModMask::c_2 | x11::ModMask::Lock | x11::ModMask::c_5,
};
+const char* GrabStatusToString(x11::GrabStatus grab_status) {
+ switch (grab_status) {
+ case x11::GrabStatus::Success:
+ return "Success";
+ case x11::GrabStatus::AlreadyGrabbed:
+ return "AlreadyGrabbed";
+ case x11::GrabStatus::InvalidTime:
+ return "InvalidTime";
+ case x11::GrabStatus::NotViewable:
+ return "NotViewable";
+ case x11::GrabStatus::Frozen:
+ return "Frozen";
+ }
+ NOTREACHED();
+ return "";
+}
+
} // namespace
X11WholeScreenMoveLoop::X11WholeScreenMoveLoop(X11MoveLoopDelegate* delegate)
@@ -207,7 +222,7 @@ void X11WholeScreenMoveLoop::EndMoveLoop() {
UpdateCursor(initial_cursor_);
auto* connection = x11::Connection::Get();
- auto esc_keycode = connection->KeysymToKeycode(kEscKeysym);
+ auto esc_keycode = connection->KeysymToKeycode(XK_Escape);
for (auto mask : kModifiersMasks)
connection->UngrabKey({esc_keycode, grab_input_window_, mask});
@@ -230,8 +245,7 @@ bool X11WholeScreenMoveLoop::GrabPointer(scoped_refptr<X11Cursor> cursor) {
auto ret = ui::GrabPointer(grab_input_window_, false, cursor);
if (ret != x11::GrabStatus::Success) {
DLOG(ERROR) << "Grabbing pointer for dragging failed: "
- << ui::GetX11ErrorString(connection->display(),
- static_cast<int>(ret));
+ << GrabStatusToString(ret);
}
connection->Flush();
return ret == x11::GrabStatus::Success;
@@ -239,7 +253,7 @@ bool X11WholeScreenMoveLoop::GrabPointer(scoped_refptr<X11Cursor> cursor) {
void X11WholeScreenMoveLoop::GrabEscKey() {
auto* connection = x11::Connection::Get();
- auto esc_keycode = connection->KeysymToKeycode(kEscKeysym);
+ auto esc_keycode = connection->KeysymToKeycode(XK_Escape);
for (auto mask : kModifiersMasks) {
connection->GrabKey({false, grab_input_window_, mask, esc_keycode,
x11::GrabMode::Async, x11::GrabMode::Async});
@@ -249,7 +263,7 @@ void X11WholeScreenMoveLoop::GrabEscKey() {
void X11WholeScreenMoveLoop::CreateDragInputWindow(
x11::Connection* connection) {
grab_input_window_ = connection->GenerateId<x11::Window>();
- connection->CreateWindow({
+ connection->CreateWindow(x11::CreateWindowRequest{
.wid = grab_input_window_,
.parent = connection->default_root(),
.x = -100,
diff --git a/chromium/ui/base/x/x11_whole_screen_move_loop.h b/chromium/ui/base/x/x11_whole_screen_move_loop.h
index 7717b3d3913..e56d82910ab 100644
--- a/chromium/ui/base/x/x11_whole_screen_move_loop.h
+++ b/chromium/ui/base/x/x11_whole_screen_move_loop.h
@@ -20,7 +20,7 @@
#include "ui/gfx/geometry/vector2d_f.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/connection.h"
namespace ui {
class MouseEvent;
diff --git a/chromium/ui/base/x/x11_window.cc b/chromium/ui/base/x/x11_window.cc
index 7d151df864f..988ffa93bf2 100644
--- a/chromium/ui/base/x/x11_window.cc
+++ b/chromium/ui/base/x/x11_window.cc
@@ -35,7 +35,6 @@
#include "ui/gfx/skia_util.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_error_tracker.h"
#include "ui/gfx/x/x11_path.h"
#include "ui/gfx/x/xfixes.h"
#include "ui/gfx/x/xinput.h"
@@ -719,7 +718,7 @@ void XWindow::StackXWindowAbove(x11::Window window) {
if (it_below_window != window_below_parents.rend() &&
it_above_window != window_above_parents.rend()) {
- connection_->ConfigureWindow({
+ connection_->ConfigureWindow(x11::ConfigureWindowRequest{
.window = *it_above_window,
.sibling = *it_below_window,
.stack_mode = x11::StackMode::Above,
@@ -838,7 +837,7 @@ bool XWindow::IsXWindowVisibleOnAllWorkspaces() const {
}
void XWindow::MoveCursorTo(const gfx::Point& location_in_pixels) {
- connection_->WarpPointer({
+ connection_->WarpPointer(x11::WarpPointerRequest{
.dst_window = x_root_window_,
.dst_x = bounds_in_pixels_.x() + location_in_pixels.x(),
.dst_y = bounds_in_pixels_.y() + location_in_pixels.y(),
@@ -1425,7 +1424,7 @@ void XWindow::SetOverrideRedirect(bool override_redirect) {
bool remap = window_mapped_in_client_;
if (remap)
Hide();
- connection_->ChangeWindowAttributes({
+ connection_->ChangeWindowAttributes(x11::ChangeWindowAttributesRequest{
.window = xwindow_,
.override_redirect = x11::Bool32(override_redirect),
});
@@ -1488,7 +1487,7 @@ void XWindow::UnconfineCursor() {
void XWindow::UpdateWindowRegion(
std::unique_ptr<std::vector<x11::Rectangle>> region) {
auto set_shape = [&](const std::vector<x11::Rectangle>& rectangles) {
- connection_->shape().Rectangles({
+ connection_->shape().Rectangles(x11::Shape::RectanglesRequest{
.operation = x11::Shape::So::Set,
.destination_kind = x11::Shape::Sk::Bounding,
.ordering = x11::ClipOrdering::YXBanded,
@@ -1516,7 +1515,7 @@ void XWindow::UpdateWindowRegion(
// If the window has system borders, the mask must be set to null (not a
// rectangle), because several window managers (eg, KDE, XFCE, XMonad) will
// not put borders on a window with a custom shape.
- connection_->shape().Mask({
+ connection_->shape().Mask(x11::Shape::MaskRequest{
.operation = x11::Shape::So::Set,
.destination_kind = x11::Shape::Sk::Bounding,
.destination_window = xwindow_,
diff --git a/chromium/ui/base/x/x11_window.h b/chromium/ui/base/x/x11_window.h
index af282d4190d..4078ea5dc7b 100644
--- a/chromium/ui/base/x/x11_window.h
+++ b/chromium/ui/base/x/x11_window.h
@@ -23,8 +23,6 @@
#include "ui/gfx/geometry/size_f.h"
#include "ui/gfx/x/event.h"
#include "ui/gfx/x/sync.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xfixes.h"
#include "ui/gfx/x/xproto.h"
diff --git a/chromium/ui/base/x/x11_workspace_handler.cc b/chromium/ui/base/x/x11_workspace_handler.cc
index 65a7b1705cd..84ae4701b14 100644
--- a/chromium/ui/base/x/x11_workspace_handler.cc
+++ b/chromium/ui/base/x/x11_workspace_handler.cc
@@ -17,7 +17,7 @@ namespace {
x11::Future<x11::GetPropertyReply> GetWorkspace() {
auto* connection = x11::Connection::Get();
- return connection->GetProperty({
+ return connection->GetProperty(x11::GetPropertyRequest{
.window = connection->default_screen().root,
.property = static_cast<x11::Atom>(gfx::GetAtom("_NET_CURRENT_DESKTOP")),
.type = static_cast<x11::Atom>(gfx::GetAtom("CARDINAL")),
diff --git a/chromium/ui/base/x/x11_workspace_handler.h b/chromium/ui/base/x/x11_workspace_handler.h
index 1a253ab62f1..cf6f1b45603 100644
--- a/chromium/ui/base/x/x11_workspace_handler.h
+++ b/chromium/ui/base/x/x11_workspace_handler.h
@@ -11,7 +11,6 @@
#include "base/memory/weak_ptr.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto.h"
namespace ui {
diff --git a/chromium/ui/base/x/xwmstartupcheck/BUILD.gn b/chromium/ui/base/x/xwmstartupcheck/BUILD.gn
index 50f34ca6460..0f3c1b4e23f 100644
--- a/chromium/ui/base/x/xwmstartupcheck/BUILD.gn
+++ b/chromium/ui/base/x/xwmstartupcheck/BUILD.gn
@@ -11,6 +11,4 @@ executable("xwmstartupcheck") {
"//base",
"//ui/gfx/x",
]
-
- configs += [ "//build/config/linux:x11" ]
}
diff --git a/chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.cc b/chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.cc
index c5a03fd54c6..9954e562e97 100644
--- a/chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.cc
+++ b/chromium/ui/base/x/xwmstartupcheck/xwmstartupcheck.cc
@@ -14,7 +14,6 @@
#include "base/command_line.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto.h"
void CalculateTimeout(const timespec& now,
diff --git a/chromium/ui/chromeos/events/BUILD.gn b/chromium/ui/chromeos/events/BUILD.gn
index 34fad2555b4..3792fdbcefc 100644
--- a/chromium/ui/chromeos/events/BUILD.gn
+++ b/chromium/ui/chromeos/events/BUILD.gn
@@ -2,8 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
assert(is_chromeos)
diff --git a/chromium/ui/color/color_id.h b/chromium/ui/color/color_id.h
index 772fd982577..f050e8164bf 100644
--- a/chromium/ui/color/color_id.h
+++ b/chromium/ui/color/color_id.h
@@ -16,9 +16,9 @@
E(kColorAlertHighSeverity, NativeTheme::kColorId_AlertSeverityHigh) \
E(kColorAlertLowSeverity, NativeTheme::kColorId_AlertSeverityLow) \
E(kColorAlertMediumSeverity, NativeTheme::kColorId_AlertSeverityMedium) \
- E_CPONLY(kColorBorderAndSeparatorForeground) \
E_CPONLY(kColorDisabledForeground) \
E_CPONLY(kColorItemSelectionBackground) \
+ E_CPONLY(kColorMidground) \
E_CPONLY(kColorPrimaryBackground) \
E_CPONLY(kColorPrimaryForeground) \
E_CPONLY(kColorSecondaryForeground) \
@@ -26,6 +26,9 @@
E_CPONLY(kColorTextSelectionBackground) \
\
/* Further UI element colors */ \
+ E(kColorAvatarHeaderArt, NativeTheme::kColorId_AvatarHeaderArt) \
+ E(kColorAvatarIconGuest, NativeTheme::kColorId_AvatarIconGuest) \
+ E(kColorAvatarIconIncognito, NativeTheme::kColorId_AvatarIconIncognito) \
E(kColorBubbleBackground, NativeTheme::kColorId_BubbleBackground) \
E(kColorBubbleFooterBackground, \
NativeTheme::kColorId_BubbleFooterBackground) \
diff --git a/chromium/ui/color/core_default_color_mixer.cc b/chromium/ui/color/core_default_color_mixer.cc
index 6552471e7d2..184423b8254 100644
--- a/chromium/ui/color/core_default_color_mixer.cc
+++ b/chromium/ui/color/core_default_color_mixer.cc
@@ -28,7 +28,7 @@ ColorMixer& AddMixerForDarkMode(ColorProvider* provider) {
{kColorAlertHighSeverity, gfx::kGoogleRed300},
{kColorAlertLowSeverity, gfx::kGoogleGreen300},
{kColorAlertMediumSeverity, gfx::kGoogleYellow300},
- {kColorBorderAndSeparatorForeground, gfx::kGoogleGrey800},
+ {kColorMidground, gfx::kGoogleGrey800},
{kColorPrimaryBackground, SkColorSetRGB(0x29, 0x2A, 0x2D)},
{kColorPrimaryForeground, gfx::kGoogleGrey200},
{kColorSecondaryForeground, gfx::kGoogleGrey500},
@@ -46,7 +46,7 @@ ColorMixer& AddMixerForLightMode(ColorProvider* provider) {
{kColorAlertHighSeverity, gfx::kGoogleRed600},
{kColorAlertLowSeverity, gfx::kGoogleGreen700},
{kColorAlertMediumSeverity, gfx::kGoogleYellow700},
- {kColorBorderAndSeparatorForeground, gfx::kGoogleGrey300},
+ {kColorMidground, gfx::kGoogleGrey300},
{kColorPrimaryBackground, SK_ColorWHITE},
{kColorPrimaryForeground, gfx::kGoogleGrey900},
{kColorSecondaryForeground, gfx::kGoogleGrey700},
diff --git a/chromium/ui/color/ui_color_mixer.cc b/chromium/ui/color/ui_color_mixer.cc
index b7dd2e08dc1..ecf814bb893 100644
--- a/chromium/ui/color/ui_color_mixer.cc
+++ b/chromium/ui/color/ui_color_mixer.cc
@@ -17,10 +17,13 @@ void AddUiColorMixer(ColorProvider* provider) {
const auto button_disabled_background =
BlendForMinContrastWithSelf(kColorButtonBackground, 1.2f);
+ mixer[kColorAvatarHeaderArt] = {kColorMidground};
+ mixer[kColorAvatarIconGuest] = {kColorSecondaryForeground};
+ mixer[kColorAvatarIconIncognito] = {kColorPrimaryForeground};
mixer[kColorBubbleBackground] = {kColorPrimaryBackground};
mixer[kColorBubbleFooterBackground] = {kColorSubtleEmphasisBackground};
mixer[kColorButtonBackground] = {kColorPrimaryBackground};
- mixer[kColorButtonBorder] = {kColorBorderAndSeparatorForeground};
+ mixer[kColorButtonBorder] = {kColorMidground};
mixer[kColorButtonBorderDisabled] = button_disabled_background;
mixer[kColorButtonForegroundDisabled] = {kColorDisabledForeground};
mixer[kColorButtonForeground] = {kColorAccent};
@@ -35,7 +38,7 @@ void AddUiColorMixer(ColorProvider* provider) {
mixer[kColorDialogBackground] = {kColorPrimaryBackground};
mixer[kColorDialogForeground] = {kColorSecondaryForeground};
mixer[kColorFocusableBorderFocused] = SetAlpha(kColorAccent, 0x4D);
- mixer[kColorFocusableBorderUnfocused] = {kColorBorderAndSeparatorForeground};
+ mixer[kColorFocusableBorderUnfocused] = {kColorMidground};
mixer[kColorIcon] = {kColorSecondaryForeground};
mixer[kColorMenuIcon] = {kColorIcon};
mixer[kColorLabelForegroundDisabled] = {kColorDisabledForeground};
@@ -47,7 +50,7 @@ void AddUiColorMixer(ColorProvider* provider) {
mixer[kColorLinkForegroundPressed] = {kColorLinkForeground};
mixer[kColorLinkForeground] = {kColorAccent};
mixer[kColorMenuBackground] = {kColorPrimaryBackground};
- mixer[kColorMenuBorder] = {kColorBorderAndSeparatorForeground};
+ mixer[kColorMenuBorder] = {kColorMidground};
mixer[kColorMenuItemBackgroundAlertedInitial] = SetAlpha(kColorAccent, 0x4D);
mixer[kColorMenuItemBackgroundAlertedTarget] = SetAlpha(kColorAccent, 0x1A);
mixer[kColorMenuItemForegroundDisabled] = {kColorDisabledForeground};
@@ -57,8 +60,8 @@ void AddUiColorMixer(ColorProvider* provider) {
mixer[kColorMenuItemForegroundSecondary] = {kColorSecondaryForeground};
mixer[kColorMenuItemBackgroundSelected] = {kColorItemSelectionBackground};
mixer[kColorMenuItemForegroundSelected] = {kColorMenuItemForeground};
- mixer[kColorMenuSeparator] = {kColorBorderAndSeparatorForeground};
- mixer[kColorTabContentSeparator] = {kColorBorderAndSeparatorForeground};
+ mixer[kColorMenuSeparator] = {kColorMidground};
+ mixer[kColorTabContentSeparator] = {kColorMidground};
mixer[kColorTabForeground] = {kColorSecondaryForeground};
mixer[kColorTabBorderSelected] = {kColorAccent};
mixer[kColorTabForegroundSelected] = {kColorAccent};
@@ -67,7 +70,7 @@ void AddUiColorMixer(ColorProvider* provider) {
mixer[kColorTableGroupingIndicator] = {kColorTableBackgroundSelectedFocused};
mixer[kColorTableHeaderBackground] = {kColorTableBackground};
mixer[kColorTableHeaderForeground] = {kColorTableForeground};
- mixer[kColorTableHeaderSeparator] = {kColorBorderAndSeparatorForeground};
+ mixer[kColorTableHeaderSeparator] = {kColorMidground};
mixer[kColorTableBackgroundSelectedFocused] = {kColorItemSelectionBackground};
mixer[kColorTableForegroundSelectedFocused] = {kColorTableForeground};
mixer[kColorTableBackgroundSelectedUnfocused] = {
diff --git a/chromium/ui/compositor/BUILD.gn b/chromium/ui/compositor/BUILD.gn
index 116f36d96a4..65a978aebaa 100644
--- a/chromium/ui/compositor/BUILD.gn
+++ b/chromium/ui/compositor/BUILD.gn
@@ -7,9 +7,6 @@ import("//testing/test.gni")
component("compositor") {
sources = [
- "animation_metrics_recorder.cc",
- "animation_metrics_recorder.h",
- "animation_metrics_reporter.h",
"animation_throughput_reporter.cc",
"animation_throughput_reporter.h",
"callback_layer_animation_observer.cc",
diff --git a/chromium/ui/compositor/animation_metrics_recorder.cc b/chromium/ui/compositor/animation_metrics_recorder.cc
deleted file mode 100644
index 1b60427856e..00000000000
--- a/chromium/ui/compositor/animation_metrics_recorder.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/compositor/animation_metrics_recorder.h"
-
-#include "base/check_op.h"
-#include "ui/compositor/animation_metrics_reporter.h"
-
-namespace ui {
-
-AnimationMetricsRecorder::AnimationMetricsRecorder(
- AnimationMetricsReporter* reporter)
- : reporter_(reporter) {}
-
-AnimationMetricsRecorder::~AnimationMetricsRecorder() = default;
-
-void AnimationMetricsRecorder::OnAnimatorAttached(
- base::Optional<int> frame_number) {
- DCHECK(frame_number.has_value());
- if (start_frame_number_.has_value() || animator_detached_after_start_)
- return;
-
- start_frame_number_ = frame_number;
-}
-
-void AnimationMetricsRecorder::OnAnimatorDetached() {
- animator_detached_after_start_ = true;
- start_frame_number_.reset();
-}
-
-void AnimationMetricsRecorder::OnAnimationStart(
- base::Optional<int> start_frame_number,
- base::TimeTicks effective_start_time,
- base::TimeDelta duration) {
- start_frame_number_ = start_frame_number;
- effective_start_time_ = effective_start_time;
- duration_ = duration;
- animator_detached_after_start_ = false;
-}
-
-void AnimationMetricsRecorder::OnAnimationEnd(
- base::Optional<int> end_frame_number,
- float refresh_rate) {
- DCHECK(reporter_);
-
- if (duration_.is_zero() || !start_frame_number_.has_value() ||
- !end_frame_number.has_value()) {
- return;
- }
- DCHECK_GE(end_frame_number.value(), start_frame_number_.value());
-
- base::TimeDelta elapsed = base::TimeTicks::Now() - effective_start_time_;
- if (elapsed < duration_)
- return;
-
- int smoothness = 100;
- const float frame_interval =
- base::Time::kMillisecondsPerSecond / refresh_rate;
- const float actual_duration =
- (end_frame_number.value() - start_frame_number_.value()) * frame_interval;
- if (duration_.InMillisecondsF() - actual_duration >= frame_interval)
- smoothness = 100 * (actual_duration / duration_.InMillisecondsF());
- reporter_->Report(smoothness);
-}
-
-} // namespace ui
diff --git a/chromium/ui/compositor/animation_metrics_recorder.h b/chromium/ui/compositor/animation_metrics_recorder.h
deleted file mode 100644
index 75376aa435d..00000000000
--- a/chromium/ui/compositor/animation_metrics_recorder.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_COMPOSITOR_ANIMATION_METRICS_RECORDER_H_
-#define UI_COMPOSITOR_ANIMATION_METRICS_RECORDER_H_
-
-#include "base/optional.h"
-#include "base/time/time.h"
-#include "ui/compositor/compositor_export.h"
-
-namespace ui {
-
-class AnimationMetricsReporter;
-
-// This is the interface to send animation smoothness numbers to a given
-// AnimationMetricsReporter.
-//
-// Classes that run animations (e.g. ui::LayerAnimationSequence,
-// views::CompositorAnimationRunner) should own one of these objects and pass
-// the values required to calculate animation smoothness when an animation
-// starts and ends.
-//
-// To use, when your animation starts:
-// animation_metrics_recorder_->OnAnimationStart(frame, start_time,
-// expected_duration);
-// and when it ends:
-// animation metrics_recorder_->OnAnimationEnd(frame, refresh_rate);
-// and your attached AnimationMetricsReporter will report the calculated
-// smoothness. Note that if the animator is attached or detached during an
-// animation, this class will have to be notified.
-//
-// Unless implementing a complex custom animator, client code should just need
-// to supply an AnimationMetricsReporter to an animations class that already
-// owns an instance of this class.
-class COMPOSITOR_EXPORT AnimationMetricsRecorder {
- public:
- explicit AnimationMetricsRecorder(AnimationMetricsReporter* reporter);
- AnimationMetricsRecorder(const AnimationMetricsRecorder&) = delete;
- AnimationMetricsRecorder& operator=(const AnimationMetricsRecorder&) = delete;
- ~AnimationMetricsRecorder();
-
- // Called when the animator is attached to/detached from a Compositor to
- // update |start_frame_number_|.
- void OnAnimatorAttached(base::Optional<int> frame_number);
- void OnAnimatorDetached();
-
- void OnAnimationStart(base::Optional<int> start_frame_number,
- base::TimeTicks effective_start_time,
- base::TimeDelta duration);
- void OnAnimationEnd(base::Optional<int> end_frame_number, float refresh_rate);
-
- private:
- AnimationMetricsReporter* const reporter_;
-
- // Variables set at the start of an animation which are required to compute
- // the smoothness when the animation ends.
- // |start_frame_number_| is the frame number in relevant Compositor when
- // the animation starts. If not set, it means the animator and its Layer
- // is not attached to a Compositor when the animation starts, or is
- // detached from the Compositor partway through the animation.
- base::Optional<int> start_frame_number_;
- base::TimeTicks effective_start_time_;
- base::TimeDelta duration_;
-
- // Whether animator is detached from Compositor partway through the animation.
- // If it is true, no metrics is reported because the number of frames could
- // not be counted correctly in such case.
- bool animator_detached_after_start_ = false;
-};
-
-} // namespace ui
-
-#endif // UI_COMPOSITOR_ANIMATION_METRICS_RECORDER_H_
diff --git a/chromium/ui/compositor/animation_metrics_reporter.h b/chromium/ui/compositor/animation_metrics_reporter.h
deleted file mode 100644
index d06fe232e70..00000000000
--- a/chromium/ui/compositor/animation_metrics_reporter.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_COMPOSITOR_ANIMATION_METRICS_REPORTER_H_
-#define UI_COMPOSITOR_ANIMATION_METRICS_REPORTER_H_
-
-#include "ui/compositor/compositor_export.h"
-
-namespace ui {
-
-// Override this class and attach it to any class that supports recording
-// animation smoothness (e.g. ui::LayerAnimationSequence,
-// views::CompositorAnimationRunner). When an animation ends, |Report| will be
-// called with the animation smoothness as a percentage.
-class COMPOSITOR_EXPORT AnimationMetricsReporter {
- public:
- virtual ~AnimationMetricsReporter() = default;
- // Called at the end of every animation sequence, if the duration and frames
- // passed meets certain criteria. |value| is the smoothness, measured in
- // percentage of the animation.
- virtual void Report(int value) = 0;
-};
-
-} // namespace ui
-
-#endif // UI_COMPOSITOR_ANIMATION_METRICS_REPORTER_H_
diff --git a/chromium/ui/compositor/animation_throughput_reporter.h b/chromium/ui/compositor/animation_throughput_reporter.h
index 7fb9b665728..334a9eddee4 100644
--- a/chromium/ui/compositor/animation_throughput_reporter.h
+++ b/chromium/ui/compositor/animation_throughput_reporter.h
@@ -35,8 +35,8 @@ class LayerAnimator;
// and none of the layer animation sequences is aborted.
class COMPOSITOR_EXPORT AnimationThroughputReporter {
public:
- using ReportCallback =
- base::RepeatingCallback<void(cc::FrameSequenceMetrics::ThroughputData)>;
+ using ReportCallback = base::RepeatingCallback<void(
+ const cc::FrameSequenceMetrics::CustomReportData&)>;
AnimationThroughputReporter(LayerAnimator* animator,
ReportCallback report_callback);
AnimationThroughputReporter(const AnimationThroughputReporter&) = delete;
diff --git a/chromium/ui/compositor/animation_throughput_reporter_unittest.cc b/chromium/ui/compositor/animation_throughput_reporter_unittest.cc
index 446a57db6bf..d39b01bfdab 100644
--- a/chromium/ui/compositor/animation_throughput_reporter_unittest.cc
+++ b/chromium/ui/compositor/animation_throughput_reporter_unittest.cc
@@ -7,7 +7,7 @@
#include <memory>
#include "base/run_loop.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
@@ -85,7 +85,7 @@ TEST_F(AnimationThroughputReporterTest, ImplicitAnimation) {
LayerAnimator* animator = layer.GetAnimator();
AnimationThroughputReporter reporter(
animator, base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
run_loop.Quit();
}));
@@ -107,7 +107,7 @@ TEST_F(AnimationThroughputReporterTest, ImplicitAnimationLateAttach) {
LayerAnimator* animator = layer.GetAnimator();
AnimationThroughputReporter reporter(
animator, base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
run_loop.Quit();
}));
@@ -134,7 +134,7 @@ TEST_F(AnimationThroughputReporterTest, ExplicitAnimation) {
LayerAnimator* animator = layer.GetAnimator();
AnimationThroughputReporter reporter(
animator, base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
run_loop.Quit();
}));
@@ -159,9 +159,10 @@ TEST_F(AnimationThroughputReporterTest, PersistedAnimation) {
std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>();
// |reporter| keeps reporting as long as it is alive.
AnimationThroughputReporter reporter(
- animator,
- base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) { run_loop->Quit(); }));
+ animator, base::BindLambdaForTesting(
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
+ run_loop->Quit();
+ }));
// Report data for animation of opacity goes to 1.
layer->SetOpacity(1.0f);
@@ -183,7 +184,7 @@ TEST_F(AnimationThroughputReporterTest, AbortedAnimation) {
LayerAnimator* animator = layer->GetAnimator();
AnimationThroughputReporter reporter(
animator, base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
ADD_FAILURE() << "No report for aborted animations.";
}));
@@ -213,7 +214,7 @@ TEST_F(AnimationThroughputReporterTest, NoReportOnDetach) {
LayerAnimator* animator = layer->GetAnimator();
AnimationThroughputReporter reporter(
animator, base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
ADD_FAILURE() << "No report for aborted animations.";
}));
@@ -246,7 +247,7 @@ TEST_F(AnimationThroughputReporterTest, EndDetachedNoReportNoLeak) {
{
AnimationThroughputReporter reporter(
animator, base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
ADD_FAILURE() << "No report for aborted animations.";
}));
@@ -282,7 +283,7 @@ TEST_F(AnimationThroughputReporterTest, ReportForAnimateToNewTarget) {
{
AnimationThroughputReporter reporter(
animator, base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
ADD_FAILURE() << "No report for aborted animations.";
}));
@@ -297,7 +298,7 @@ TEST_F(AnimationThroughputReporterTest, ReportForAnimateToNewTarget) {
{
AnimationThroughputReporter reporter(
animator, base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData&) {
run_loop.Quit();
}));
diff --git a/chromium/ui/compositor/canvas_painter.cc b/chromium/ui/compositor/canvas_painter.cc
index 31c4cabdc1f..b5b0b9c7f10 100644
--- a/chromium/ui/compositor/canvas_painter.cc
+++ b/chromium/ui/compositor/canvas_painter.cc
@@ -31,7 +31,7 @@ CanvasPainter::~CanvasPainter() {
if (!output_->tryAllocPixels(info))
return;
- SkCanvas canvas(*output_);
+ SkCanvas canvas(*output_, SkSurfaceProps{});
canvas.clear(clear_color_);
// When pixel canvas is enabled, the recordings and canvas are already scaled
diff --git a/chromium/ui/compositor/compositor.cc b/chromium/ui/compositor/compositor.cc
index 975f7729f93..7d498732553 100644
--- a/chromium/ui/compositor/compositor.cc
+++ b/chromium/ui/compositor/compositor.cc
@@ -674,7 +674,7 @@ Compositor::GetBeginMainFrameMetrics() {
void Compositor::NotifyThroughputTrackerResults(
cc::CustomTrackerResults results) {
for (auto& pair : results)
- ReportThroughputForTracker(pair.first, std::move(pair.second));
+ ReportMetricsForTracker(pair.first, std::move(pair.second));
}
void Compositor::DidReceiveCompositorFrameAck() {
@@ -689,6 +689,8 @@ void Compositor::DidPresentCompositorFrame(
TRACE_EVENT_MARK_WITH_TIMESTAMP1("cc,benchmark", "FramePresented",
feedback.timestamp, "environment",
"browser");
+ for (auto& observer : observer_list_)
+ observer.OnDidPresentCompositorFrame(frame_token, feedback);
}
void Compositor::DidSubmitCompositorFrame() {
@@ -757,14 +759,14 @@ void Compositor::RequestPresentationTimeForNextFrame(
host_->RequestPresentationTimeForNextFrame(std::move(callback));
}
-void Compositor::ReportThroughputForTracker(
+void Compositor::ReportMetricsForTracker(
int tracker_id,
- cc::FrameSequenceMetrics::ThroughputData throughput) {
+ const cc::FrameSequenceMetrics::CustomReportData& data) {
auto it = throughput_tracker_map_.find(tracker_id);
if (it == throughput_tracker_map_.end())
return;
- std::move(it->second).Run(std::move(throughput));
+ std::move(it->second).Run(data);
throughput_tracker_map_.erase(it);
}
diff --git a/chromium/ui/compositor/compositor.h b/chromium/ui/compositor/compositor.h
index 32cdffd116b..dc011fe48e2 100644
--- a/chromium/ui/compositor/compositor.h
+++ b/chromium/ui/compositor/compositor.h
@@ -406,10 +406,10 @@ class COMPOSITOR_EXPORT Compositor : public cc::LayerTreeHostClient,
private:
friend class base::RefCounted<Compositor>;
- // Called when throughput data for the tracker of |tracker_id| is ready.
- void ReportThroughputForTracker(
+ // Called when collected metrics for the tracker of |tracker_id| is ready.
+ void ReportMetricsForTracker(
int tracker_id,
- cc::FrameSequenceMetrics::ThroughputData throughput);
+ const cc::FrameSequenceMetrics::CustomReportData& data);
gfx::Size size_;
diff --git a/chromium/ui/compositor/compositor_observer.h b/chromium/ui/compositor/compositor_observer.h
index a5d845d5870..5855c94b799 100644
--- a/chromium/ui/compositor/compositor_observer.h
+++ b/chromium/ui/compositor/compositor_observer.h
@@ -11,7 +11,8 @@
namespace gfx {
class Size;
-}
+struct PresentationFeedback;
+} // namespace gfx
namespace ui {
@@ -51,6 +52,11 @@ class COMPOSITOR_EXPORT CompositorObserver {
// Called at the top of the compositor's destructor, to give observers a
// chance to remove themselves.
virtual void OnCompositingShuttingDown(Compositor* compositor) {}
+
+ // Called when the presentation feedback was received from the viz.
+ virtual void OnDidPresentCompositorFrame(
+ uint32_t frame_token,
+ const gfx::PresentationFeedback& feedback) {}
};
} // namespace ui
diff --git a/chromium/ui/compositor/compositor_unittest.cc b/chromium/ui/compositor/compositor_unittest.cc
index 469faab2ab2..242a508436d 100644
--- a/chromium/ui/compositor/compositor_unittest.cc
+++ b/chromium/ui/compositor/compositor_unittest.cc
@@ -7,7 +7,7 @@
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "base/test/test_mock_time_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -177,7 +177,7 @@ TEST_F(CompositorTestWithMessageLoop, MoveThroughputTracker) {
{
auto tracker = compositor()->RequestNewThroughputTracker();
tracker.Start(base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData throughput) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
// This should not be called since the tracking is auto canceled.
ADD_FAILURE();
}));
@@ -188,7 +188,7 @@ TEST_F(CompositorTestWithMessageLoop, MoveThroughputTracker) {
{
auto tracker = compositor()->RequestNewThroughputTracker();
tracker.Start(base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData throughput) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
// May be called since Stop() is called.
}));
auto moved_tracker = std::move(tracker);
@@ -199,7 +199,7 @@ TEST_F(CompositorTestWithMessageLoop, MoveThroughputTracker) {
{
auto tracker = compositor()->RequestNewThroughputTracker();
tracker.Start(base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData throughput) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
// This should not be called since Cancel() is called.
ADD_FAILURE();
}));
@@ -211,7 +211,7 @@ TEST_F(CompositorTestWithMessageLoop, MoveThroughputTracker) {
{
auto tracker = compositor()->RequestNewThroughputTracker();
tracker.Start(base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData throughput) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
// May be called since Stop() is called.
}));
tracker.Stop();
@@ -222,7 +222,7 @@ TEST_F(CompositorTestWithMessageLoop, MoveThroughputTracker) {
{
auto tracker = compositor()->RequestNewThroughputTracker();
tracker.Start(base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData throughput) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
// This should not be called since Cancel() is called.
ADD_FAILURE();
}));
@@ -245,9 +245,9 @@ TEST_F(CompositorTestWithMessageLoop, ThroughputTracker) {
base::RunLoop run_loop;
tracker.Start(base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData throughput) {
- EXPECT_GT(throughput.frames_expected, 0u);
- EXPECT_GT(throughput.frames_produced, 0u);
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
+ EXPECT_GT(data.frames_expected, 0u);
+ EXPECT_GT(data.frames_produced, 0u);
run_loop.Quit();
}));
@@ -273,7 +273,7 @@ TEST_F(CompositorTestWithMessageLoop, ThroughputTracker) {
TEST_F(CompositorTestWithMessageLoop, ThroughputTrackerOutliveCompositor) {
auto tracker = compositor()->RequestNewThroughputTracker();
tracker.Start(base::BindLambdaForTesting(
- [&](cc::FrameSequenceMetrics::ThroughputData throughput) {
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
ADD_FAILURE() << "No report should happen";
}));
diff --git a/chromium/ui/compositor/layer.cc b/chromium/ui/compositor/layer.cc
index cbba0873e2f..2013423958d 100644
--- a/chromium/ui/compositor/layer.cc
+++ b/chromium/ui/compositor/layer.cc
@@ -281,6 +281,9 @@ std::unique_ptr<Layer> Layer::Clone() const {
clone->SetIsFastRoundedCorner(is_fast_rounded_corner());
clone->SetName(name_);
+ // the |damaged_region_| will be sent to cc later in SendDamagedRects().
+ clone->damaged_region_ = damaged_region_;
+
return clone;
}
@@ -1300,8 +1303,7 @@ gfx::Rect Layer::PaintableRegion() {
return gfx::Rect(size());
}
-scoped_refptr<cc::DisplayItemList> Layer::PaintContentsToDisplayList(
- ContentLayerClient::PaintingControlSetting painting_control) {
+scoped_refptr<cc::DisplayItemList> Layer::PaintContentsToDisplayList() {
TRACE_EVENT1("ui", "Layer::PaintContentsToDisplayList", "name", name_);
gfx::Rect local_bounds(bounds().size());
gfx::Rect invalidation(
@@ -1322,12 +1324,6 @@ scoped_refptr<cc::DisplayItemList> Layer::PaintContentsToDisplayList(
bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; }
-size_t Layer::GetApproximateUnsharedMemoryUsage() const {
- // Most of the "picture memory" is shared with the cc::DisplayItemList, so
- // there's nothing significant to report here.
- return 0;
-}
-
bool Layer::PrepareTransferableResource(
cc::SharedBitmapIdRegistrar* bitmap_registar,
viz::TransferableResource* resource,
diff --git a/chromium/ui/compositor/layer.h b/chromium/ui/compositor/layer.h
index 8290f3f7397..62d5959a60a 100644
--- a/chromium/ui/compositor/layer.h
+++ b/chromium/ui/compositor/layer.h
@@ -441,10 +441,8 @@ class COMPOSITOR_EXPORT Layer : public LayerAnimationDelegate,
// ContentLayerClient implementation.
gfx::Rect PaintableRegion() override;
- scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList(
- ContentLayerClient::PaintingControlSetting painting_control) override;
+ scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList() override;
bool FillsBoundsCompletely() const override;
- size_t GetApproximateUnsharedMemoryUsage() const override;
cc::MirrorLayer* mirror_layer_for_testing() { return mirror_layer_.get(); }
cc::Layer* cc_layer_for_testing() { return cc_layer_; }
diff --git a/chromium/ui/compositor/layer_animation_element.cc b/chromium/ui/compositor/layer_animation_element.cc
index 3c5207f7c65..c8aac298abb 100644
--- a/chromium/ui/compositor/layer_animation_element.cc
+++ b/chromium/ui/compositor/layer_animation_element.cc
@@ -11,7 +11,6 @@
#include "base/strings/stringprintf.h"
#include "cc/animation/animation_id_provider.h"
#include "cc/animation/keyframe_model.h"
-#include "ui/compositor/animation_metrics_recorder.h"
#include "ui/compositor/float_animation_curve_adapter.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animation_delegate.h"
@@ -597,11 +596,6 @@ void LayerAnimationElement::Start(LayerAnimationDelegate* delegate,
OnStart(delegate);
RequestEffectiveStart(delegate);
first_frame_ = false;
-
- if (animation_metrics_recorder_ && delegate) {
- animation_metrics_recorder_->OnAnimationStart(
- delegate->GetFrameNumber(), effective_start_time_, duration_);
- }
}
bool LayerAnimationElement::Progress(base::TimeTicks now,
@@ -659,11 +653,6 @@ bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) {
base::WeakPtr<LayerAnimationElement> alive(weak_ptr_factory_.GetWeakPtr());
bool need_draw = OnProgress(1.0, delegate);
- if (animation_metrics_recorder_ && delegate) {
- animation_metrics_recorder_->OnAnimationEnd(delegate->GetFrameNumber(),
- delegate->GetRefreshRate());
- }
-
if (!alive)
return need_draw;
last_progressed_fraction_ = 1.0;
@@ -675,27 +664,6 @@ void LayerAnimationElement::GetTargetValue(TargetValue* target) const {
OnGetTarget(target);
}
-void LayerAnimationElement::SetAnimationMetricsReporter(
- AnimationMetricsReporter* reporter) {
- if (reporter) {
- animation_metrics_recorder_ =
- std::make_unique<AnimationMetricsRecorder>(reporter);
- } else {
- animation_metrics_recorder_.reset();
- }
-}
-
-void LayerAnimationElement::OnAnimatorAttached(
- LayerAnimationDelegate* delegate) {
- if (animation_metrics_recorder_)
- animation_metrics_recorder_->OnAnimatorAttached(delegate->GetFrameNumber());
-}
-
-void LayerAnimationElement::OnAnimatorDetached() {
- if (animation_metrics_recorder_)
- animation_metrics_recorder_->OnAnimatorDetached();
-}
-
bool LayerAnimationElement::IsThreaded(LayerAnimationDelegate* delegate) const {
return false;
}
diff --git a/chromium/ui/compositor/layer_animation_element.h b/chromium/ui/compositor/layer_animation_element.h
index 016a98fbd51..13ff9577ec2 100644
--- a/chromium/ui/compositor/layer_animation_element.h
+++ b/chromium/ui/compositor/layer_animation_element.h
@@ -24,8 +24,6 @@
namespace ui {
-class AnimationMetricsReporter;
-class AnimationMetricsRecorder;
class InterpolatedTransform;
class LayerAnimationDelegate;
@@ -196,14 +194,6 @@ class COMPOSITOR_EXPORT LayerAnimationElement {
// Assigns the target value to |target|.
void GetTargetValue(TargetValue* target) const;
- // Sets the reporter to report animation metrics if |reporter| is not null.
- // Otherwise, cancels the metric reporting.
- void SetAnimationMetricsReporter(AnimationMetricsReporter* reporter);
-
- // Called when the animator is attached to/detached from a Compositor.
- void OnAnimatorAttached(LayerAnimationDelegate* delegate);
- void OnAnimatorDetached();
-
// The properties that the element modifies.
AnimatableProperties properties() const { return properties_; }
@@ -263,8 +253,6 @@ class COMPOSITOR_EXPORT LayerAnimationElement {
double last_progressed_fraction_;
- std::unique_ptr<AnimationMetricsRecorder> animation_metrics_recorder_;
-
base::WeakPtrFactory<LayerAnimationElement> weak_ptr_factory_{this};
DISALLOW_ASSIGN(LayerAnimationElement);
diff --git a/chromium/ui/compositor/layer_animation_sequence.cc b/chromium/ui/compositor/layer_animation_sequence.cc
index e25e1c34541..25d73903cb8 100644
--- a/chromium/ui/compositor/layer_animation_sequence.cc
+++ b/chromium/ui/compositor/layer_animation_sequence.cc
@@ -22,8 +22,7 @@ LayerAnimationSequence::LayerAnimationSequence()
last_element_(0),
waiting_for_group_start_(false),
animation_group_id_(0),
- last_progressed_fraction_(0.0),
- animation_metrics_reporter_(nullptr) {}
+ last_progressed_fraction_(0.0) {}
LayerAnimationSequence::LayerAnimationSequence(
std::unique_ptr<LayerAnimationElement> element)
@@ -32,8 +31,7 @@ LayerAnimationSequence::LayerAnimationSequence(
last_element_(0),
waiting_for_group_start_(false),
animation_group_id_(0),
- last_progressed_fraction_(0.0),
- animation_metrics_reporter_(nullptr) {
+ last_progressed_fraction_(0.0) {
AddElement(std::move(element));
}
@@ -186,7 +184,6 @@ void LayerAnimationSequence::Abort(LayerAnimationDelegate* delegate) {
void LayerAnimationSequence::AddElement(
std::unique_ptr<LayerAnimationElement> element) {
properties_ |= element->properties();
- element->SetAnimationMetricsReporter(animation_metrics_reporter_);
elements_.push_back(std::move(element));
}
@@ -247,35 +244,22 @@ void LayerAnimationSequence::OnAnimatorDestroyed() {
void LayerAnimationSequence::OnAnimatorAttached(
LayerAnimationDelegate* delegate) {
- for (auto& element : elements_)
- element->OnAnimatorAttached(delegate);
-
for (LayerAnimationObserver& observer : observers_)
observer.OnAnimatorAttachedToTimeline();
}
void LayerAnimationSequence::OnAnimatorDetached() {
- for (auto& element : elements_)
- element->OnAnimatorDetached();
-
for (LayerAnimationObserver& observer : observers_)
observer.OnAnimatorDetachedFromTimeline();
}
-void LayerAnimationSequence::SetAnimationMetricsReporter(
- AnimationMetricsReporter* reporter) {
- animation_metrics_reporter_ = reporter;
- for (auto& element : elements_)
- element->SetAnimationMetricsReporter(animation_metrics_reporter_);
-}
-
size_t LayerAnimationSequence::size() const {
return elements_.size();
}
LayerAnimationElement* LayerAnimationSequence::FirstElement() const {
if (elements_.empty()) {
- return NULL;
+ return nullptr;
}
return elements_[0].get();
diff --git a/chromium/ui/compositor/layer_animation_sequence.h b/chromium/ui/compositor/layer_animation_sequence.h
index 89f575d3162..88208f1e4e7 100644
--- a/chromium/ui/compositor/layer_animation_sequence.h
+++ b/chromium/ui/compositor/layer_animation_sequence.h
@@ -131,9 +131,6 @@ class COMPOSITOR_EXPORT LayerAnimationSequence
void OnAnimatorAttached(LayerAnimationDelegate* delegate);
void OnAnimatorDetached();
- // Sets |animation_metrics_reporter_| and passes it to all |elements_|.
- void SetAnimationMetricsReporter(AnimationMetricsReporter* reporter);
-
// The last_progressed_fraction of the element most recently progressed by
// by this sequence. Returns 0.0 if no elements have been progressed.
double last_progressed_fraction() const { return last_progressed_fraction_; }
@@ -202,9 +199,6 @@ class COMPOSITOR_EXPORT LayerAnimationSequence
// element.
double last_progressed_fraction_;
- // Used to tag animation elements to obtain metrics of animation performance.
- AnimationMetricsReporter* animation_metrics_reporter_;
-
DISALLOW_COPY_AND_ASSIGN(LayerAnimationSequence);
};
diff --git a/chromium/ui/compositor/layer_animator.cc b/chromium/ui/compositor/layer_animator.cc
index a9db6922b89..c200f61ebe0 100644
--- a/chromium/ui/compositor/layer_animator.cc
+++ b/chromium/ui/compositor/layer_animator.cc
@@ -53,8 +53,7 @@ LayerAnimator::LayerAnimator(base::TimeDelta transition_duration)
tween_type_(gfx::Tween::LINEAR),
is_started_(false),
disable_timer_for_test_(false),
- adding_animations_(false),
- animation_metrics_reporter_(nullptr) {
+ adding_animations_(false) {
animation_ =
cc::Animation::Create(cc::AnimationIdProvider::NextAnimationId());
}
@@ -214,8 +213,6 @@ cc::Animation* LayerAnimator::GetAnimationForTesting() const {
void LayerAnimator::StartAnimation(LayerAnimationSequence* animation) {
scoped_refptr<LayerAnimator> retain(this);
- if (animation_metrics_reporter_)
- animation->SetAnimationMetricsReporter(animation_metrics_reporter_);
OnScheduled(animation);
if (!StartSequenceImmediately(animation)) {
// Attempt to preempt a running animation.
diff --git a/chromium/ui/compositor/layer_animator.h b/chromium/ui/compositor/layer_animator.h
index fe4cb76be33..8c02356a38a 100644
--- a/chromium/ui/compositor/layer_animator.h
+++ b/chromium/ui/compositor/layer_animator.h
@@ -387,10 +387,6 @@ class COMPOSITOR_EXPORT LayerAnimator : public base::RefCounted<LayerAnimator>,
void AttachLayerToAnimation(int layer_id);
void DetachLayerFromAnimation();
- void set_animation_metrics_reporter(AnimationMetricsReporter* reporter) {
- animation_metrics_reporter_ = reporter;
- }
-
// This is the queue of animations to run.
AnimationQueue animation_queue_;
@@ -430,9 +426,6 @@ class COMPOSITOR_EXPORT LayerAnimator : public base::RefCounted<LayerAnimator>,
// with preemption strategies that discard previous animations.
bool adding_animations_;
- // Helper to output UMA performance metrics.
- AnimationMetricsReporter* animation_metrics_reporter_;
-
// Observers are notified when layer animations end, are scheduled or are
// aborted.
base::ObserverList<LayerAnimationObserver>::Unchecked observers_;
diff --git a/chromium/ui/compositor/layer_animator_unittest.cc b/chromium/ui/compositor/layer_animator_unittest.cc
index 1aa26315d36..3e86fb5ac66 100644
--- a/chromium/ui/compositor/layer_animator_unittest.cc
+++ b/chromium/ui/compositor/layer_animator_unittest.cc
@@ -20,7 +20,6 @@
#include "cc/trees/layer_tree_host.h"
#include "cc/trees/mutator_host.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/compositor/animation_metrics_reporter.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animation_delegate.h"
#include "ui/compositor/layer_animation_element.h"
@@ -3371,184 +3370,6 @@ TEST(LayerAnimatorTest, ThreadedAnimationSurvivesIfLayerRemovedAdded) {
host.reset();
}
-// A simple AnimationMetricsReporter class that remembers smoothness metric
-// when animation completes.
-class TestMetricsReporter : public ui::AnimationMetricsReporter {
- public:
- TestMetricsReporter() {}
- ~TestMetricsReporter() override {}
-
- bool report_called() { return report_called_; }
- int value() const { return value_; }
-
- protected:
- void Report(int value) override {
- value_ = value;
- report_called_ = true;
- }
-
- private:
- bool report_called_ = false;
- int value_ = -1;
-
- DISALLOW_COPY_AND_ASSIGN(TestMetricsReporter);
-};
-
-// Starts an animation and tests that incrementing compositor frame count can
-// be used to report animation smoothness metrics. This verifies that when an
-// animation is smooth (frame count matches refresh rate) that we receive a
-// smoothness value of 100.
-TEST(LayerAnimatorTest, ReportMetricsSmooth) {
- base::ScopedMockClockOverride mock_clock_;
- const base::TimeDelta kAnimationDuration =
- base::TimeDelta::FromMilliseconds(100);
-
- std::unique_ptr<Layer> root(new Layer(LAYER_SOLID_COLOR));
- TestLayerAnimationDelegate delegate;
- scoped_refptr<LayerAnimator> animator(CreateImplicitTestAnimator(&delegate));
-
- // Simulates that Layer has attached to a Compositor.
- delegate.SetFrameNumber(0);
-
- std::unique_ptr<ui::LayerAnimationElement> animation_element =
- ui::LayerAnimationElement::CreateColorElement(SK_ColorRED,
- kAnimationDuration);
- ui::LayerAnimationSequence* animation_sequence =
- new ui::LayerAnimationSequence(std::move(animation_element));
- TestMetricsReporter reporter;
-
- animation_sequence->SetAnimationMetricsReporter(&reporter);
- animator->StartAnimation(animation_sequence);
- // Advances the frame count, simulating having produced 6 frames, and received
- // an ack for each one. This implicitly simulates calling LayerAnimator::Step
- // with an increased clock 6 times.
- delegate.SetFrameNumber(6);
-
- // Advancing the clock does not implicitly advance frame count. It allows the
- // next call of LayerAnimator::Step to detect that the animation is finished,
- // thus triggering the processing of metrics reporting.
- mock_clock_.Advance(kAnimationDuration);
- animator->Step(mock_clock_.NowTicks());
-
- CHECK(reporter.report_called());
- // With the clock being controlled, the animations should be smooth regardless
- // of the test bots. Smoothness is based on a calculated duration of the
- // animation when compared to the requested duration, as an integer
- // percentage. With 100 being 100%. When the number of frames match the
- // refresh rate, reporter should be notified of a smoothness of 100.
- EXPECT_EQ(reporter.value(), 100);
-}
-
-// Starts an animation and tests that incrementing compositor frame count can
-// be used to report animation smoothness metrics. This verifies that when an
-// animation is not smooth (frame count doesn't match refresh rate) that we
-// receive a smoothness value that is not 100.
-TEST(LayerAnimatorTest, ReportMetricsNotSmooth) {
- base::ScopedMockClockOverride mock_clock_;
- const base::TimeDelta kAnimationDuration =
- base::TimeDelta::FromMilliseconds(100);
-
- std::unique_ptr<Layer> root(new Layer(LAYER_SOLID_COLOR));
- TestLayerAnimationDelegate delegate;
- scoped_refptr<LayerAnimator> animator(CreateImplicitTestAnimator(&delegate));
-
- // Simulates that Layer has attached to a Compositor.
- delegate.SetFrameNumber(0);
-
- std::unique_ptr<ui::LayerAnimationElement> animation_element =
- ui::LayerAnimationElement::CreateColorElement(SK_ColorRED,
- kAnimationDuration);
- ui::LayerAnimationSequence* animation_sequence =
- new ui::LayerAnimationSequence(std::move(animation_element));
- TestMetricsReporter reporter;
-
- animation_sequence->SetAnimationMetricsReporter(&reporter);
- animator->StartAnimation(animation_sequence);
- // Advances the frame count, simulating having produced 1 frame, and received
- // an ack for it. This implicitly simulates calling LayerAnimator::Step with
- // an increased clock 1 time.
- delegate.SetFrameNumber(1);
-
- // Advancing the clock does not implicitly advance frame count. It allows the
- // next call of LayerAnimator::Step to detect that the animation is finished,
- // thus triggering the processing of metrics reporting.
- mock_clock_.Advance(kAnimationDuration);
- animator->Step(mock_clock_.NowTicks());
-
- CHECK(reporter.report_called());
- // With the clock being controlled, we have direct control of the smoothness
- // regardless of the test bots. Smoothness is based on a calculated duration
- // of the animation when compared to the requested duration, as an integer
- // percentage. With 100 being 100%. With a single frame being generated over
- // 100ms, the reporter should be notified of a smoothness matching the
- // interval between refreshes.
- int expected = base::Time::kMillisecondsPerSecond / delegate.GetRefreshRate();
- EXPECT_EQ(reporter.value(), expected);
-}
-
-// Tests that metrics is reported correctly as not smooth when animation starts
-// before Layer is attached to a Compositor.
-TEST(LayerAnimatorTest,
- ReportMetricsNotSmoothForAnimationStartsBeforeAttached) {
- base::test::TaskEnvironment task_environment_(
- base::test::TaskEnvironment::MainThreadType::UI);
- const bool enable_pixel_output = false;
- TestContextFactories context_factories(enable_pixel_output);
- const gfx::Rect bounds(10, 10, 100, 100);
- std::unique_ptr<TestCompositorHost> host(TestCompositorHost::Create(
- bounds, context_factories.GetContextFactory()));
- host->Show();
-
- Compositor* compositor = host->GetCompositor();
- Layer root;
- compositor->SetRootLayer(&root);
-
- constexpr auto kAnimationDuration = base::TimeDelta::FromMilliseconds(50);
-
- // Draw enough frames so that missing the start frame number would cause the
- // reporter to always report 100% smoothness. 4 times of the expected
- // animation frames because somehow the refresh rate changes from 60fps to
- // 200fps when reporting.
- const int kStartFrameNumber =
- base::ClampFloor(kAnimationDuration.InSecondsF() *
- compositor->refresh_rate()) *
- 4;
- while (compositor->activated_frame_count() < kStartFrameNumber) {
- compositor->ScheduleFullRedraw();
- EXPECT_TRUE(ui::WaitForNextFrameToBePresented(compositor));
- }
-
- Layer layer;
- layer.SetBounds(gfx::Rect(0, 0, 5, 5));
-
- TestImplicitAnimationObserver waiter(false);
- TestMetricsReporter reporter;
- {
- // Starts an animation before |layer| is attached.
- ScopedLayerAnimationSettings settings(layer.GetAnimator());
- settings.SetAnimationMetricsReporter(&reporter);
- settings.AddObserver(&waiter);
- settings.SetTransitionDuration(kAnimationDuration);
- layer.SetBounds(gfx::Rect(0, 0, 50, 50));
- }
-
- // Attaches |layer|.
- root.Add(&layer);
-
- // Blocks UI thread for kAnimationDuration to make animation not smooth.
- base::TimeTicks start = base::TimeTicks::Now();
- do {
- base::PlatformThread::Sleep(kAnimationDuration);
- } while (base::TimeTicks::Now() - start < kAnimationDuration);
-
- // Waits for the animation to finish.
- waiter.Wait();
-
- // Metrics should be reported as not smooth.
- EXPECT_TRUE(reporter.report_called());
- EXPECT_LT(reporter.value(), 100);
-}
-
class LayerOwnerAnimationObserver : public LayerAnimationObserver {
public:
explicit LayerOwnerAnimationObserver(LayerAnimator* animator)
diff --git a/chromium/ui/compositor/layer_unittest.cc b/chromium/ui/compositor/layer_unittest.cc
index fc21b32d1f3..b4db7e46388 100644
--- a/chromium/ui/compositor/layer_unittest.cc
+++ b/chromium/ui/compositor/layer_unittest.cc
@@ -22,7 +22,7 @@
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
@@ -841,6 +841,25 @@ TEST_F(LayerWithDelegateTest, Cloning) {
EXPECT_EQ(SK_ColorGREEN, clone->background_color());
}
+TEST_F(LayerWithDelegateTest, CloneDamagedRegion) {
+ std::unique_ptr<Layer> layer = CreateLayer(LAYER_TEXTURED);
+ // Set a delegate so that the damage region is accumulated.
+ DrawTreeLayerDelegate delegate(gfx::Rect(0, 0, 10, 10));
+ layer->set_delegate(&delegate);
+
+ cc::Region damaged_region;
+ damaged_region.Union(gfx::Rect(10, 10, 5, 5));
+ damaged_region.Union(gfx::Rect(20, 20, 7, 7));
+
+ for (auto rect : damaged_region)
+ layer->SchedulePaint(rect);
+
+ ASSERT_EQ(damaged_region, layer->damaged_region());
+
+ auto clone = layer->Clone();
+ EXPECT_EQ(damaged_region, clone->damaged_region());
+}
+
TEST_F(LayerWithDelegateTest, Mirroring) {
std::unique_ptr<Layer> root = CreateNoTextureLayer(gfx::Rect(0, 0, 100, 100));
std::unique_ptr<Layer> child = CreateLayer(LAYER_TEXTURED);
@@ -1431,8 +1450,7 @@ TEST_F(LayerWithNullDelegateTest, UpdateDamageInDeferredPaint) {
EXPECT_EQ(bound1, root->damaged_region_for_testing());
root->SendDamagedRects();
EXPECT_EQ(gfx::Rect(), root->cc_layer_for_testing()->update_rect());
- root->PaintContentsToDisplayList(
- cc::ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
+ root->PaintContentsToDisplayList();
EXPECT_EQ(gfx::Rect(), LastInvalidation());
// During deferring paint request, a new invalid_rect will be accumulated.
@@ -1443,8 +1461,7 @@ TEST_F(LayerWithNullDelegateTest, UpdateDamageInDeferredPaint) {
EXPECT_EQ(bound_union, root->damaged_region_for_testing().bounds());
root->SendDamagedRects();
EXPECT_EQ(gfx::Rect(), root->cc_layer_for_testing()->update_rect());
- root->PaintContentsToDisplayList(
- cc::ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
+ root->PaintContentsToDisplayList();
EXPECT_EQ(gfx::Rect(), LastInvalidation());
// Remove deferring paint request.
@@ -1454,8 +1471,7 @@ TEST_F(LayerWithNullDelegateTest, UpdateDamageInDeferredPaint) {
// paint, i.e. union of bound1 and bound2.
root->SendDamagedRects();
EXPECT_EQ(bound_union, root->cc_layer_for_testing()->update_rect());
- root->PaintContentsToDisplayList(
- cc::ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
+ root->PaintContentsToDisplayList();
EXPECT_EQ(bound_union, LastInvalidation());
}
diff --git a/chromium/ui/compositor/recyclable_compositor_mac.cc b/chromium/ui/compositor/recyclable_compositor_mac.cc
index 35bd88b8e13..131c7d809f7 100644
--- a/chromium/ui/compositor/recyclable_compositor_mac.cc
+++ b/chromium/ui/compositor/recyclable_compositor_mac.cc
@@ -130,6 +130,8 @@ void RecyclableCompositorMacFactory::RecycleCompositor(
if (recycling_disabled_)
return;
+ // Invalidate the surface before suspending it.
+ compositor->InvalidateSurface();
compositor->accelerated_widget_mac_->SetSuspended(true);
// Make this RecyclableCompositorMac recyclable for future instances.
@@ -154,7 +156,10 @@ void RecyclableCompositorMacFactory::RecycleCompositor(
}
RecyclableCompositorMacFactory::RecyclableCompositorMacFactory()
- : weak_factory_(this) {}
+ : weak_factory_(this) {
+ if (features::IsUsingSkiaRenderer())
+ recycling_disabled_ = true;
+}
RecyclableCompositorMacFactory::~RecyclableCompositorMacFactory() = default;
diff --git a/chromium/ui/compositor/recyclable_compositor_mac.h b/chromium/ui/compositor/recyclable_compositor_mac.h
index 4c3bba1b534..fef44162753 100644
--- a/chromium/ui/compositor/recyclable_compositor_mac.h
+++ b/chromium/ui/compositor/recyclable_compositor_mac.h
@@ -43,12 +43,13 @@ class COMPOSITOR_EXPORT RecyclableCompositorMac
void UpdateSurface(const gfx::Size& size_pixels,
float scale_factor,
const gfx::DisplayColorSpaces& display_color_spaces);
- // Invalidate the compositor's surface information.
- void InvalidateSurface();
private:
friend class RecyclableCompositorMacFactory;
+ // Invalidate the compositor's surface information.
+ void InvalidateSurface();
+
// ui::CompositorObserver implementation:
void OnCompositingDidCommit(ui::Compositor* compositor) override;
diff --git a/chromium/ui/compositor/scoped_layer_animation_settings.cc b/chromium/ui/compositor/scoped_layer_animation_settings.cc
index 085b15f6a24..2fc1b18f2c6 100644
--- a/chromium/ui/compositor/scoped_layer_animation_settings.cc
+++ b/chromium/ui/compositor/scoped_layer_animation_settings.cc
@@ -120,7 +120,6 @@ ScopedLayerAnimationSettings::ScopedLayerAnimationSettings(
}
ScopedLayerAnimationSettings::~ScopedLayerAnimationSettings() {
- animator_->set_animation_metrics_reporter(nullptr);
animator_->is_transition_duration_locked_ =
old_is_transition_duration_locked_;
animator_->SetTransitionDuration(old_transition_duration_);
@@ -143,11 +142,6 @@ void ScopedLayerAnimationSettings::AddObserver(
animator_->AddObserver(observer);
}
-void ScopedLayerAnimationSettings::SetAnimationMetricsReporter(
- AnimationMetricsReporter* reporter) {
- animator_->set_animation_metrics_reporter(reporter);
-}
-
void ScopedLayerAnimationSettings::SetTransitionDuration(
base::TimeDelta duration) {
animator_->SetTransitionDuration(duration);
diff --git a/chromium/ui/compositor/scoped_layer_animation_settings.h b/chromium/ui/compositor/scoped_layer_animation_settings.h
index 6b08ebe5833..47e4cd6e57a 100644
--- a/chromium/ui/compositor/scoped_layer_animation_settings.h
+++ b/chromium/ui/compositor/scoped_layer_animation_settings.h
@@ -29,8 +29,6 @@ class COMPOSITOR_EXPORT ScopedLayerAnimationSettings {
void AddObserver(ImplicitAnimationObserver* observer);
- void SetAnimationMetricsReporter(AnimationMetricsReporter* reporter);
-
void SetTransitionDuration(base::TimeDelta duration);
base::TimeDelta GetTransitionDuration() const;
diff --git a/chromium/ui/compositor/test/test_compositor_host_ozone.cc b/chromium/ui/compositor/test/test_compositor_host_ozone.cc
index 5b2c4752932..9ebb06b5da0 100644
--- a/chromium/ui/compositor/test/test_compositor_host_ozone.cc
+++ b/chromium/ui/compositor/test/test_compositor_host_ozone.cc
@@ -67,7 +67,11 @@ TestCompositorHostOzone::TestCompositorHostOzone(
context_factory,
base::ThreadTaskRunnerHandle::Get(),
false /* enable_pixel_canvas */),
- window_delegate_(std::make_unique<StubPlatformWindowDelegate>()) {}
+ window_delegate_(std::make_unique<StubPlatformWindowDelegate>()) {
+#if defined(OS_FUCHSIA)
+ ui::PlatformWindowInitProperties::allow_null_view_token_for_test = true;
+#endif
+}
TestCompositorHostOzone::~TestCompositorHostOzone() {
// |window_| should be destroyed earlier than |window_delegate_| as it refers
diff --git a/chromium/ui/compositor/throughput_tracker_host.h b/chromium/ui/compositor/throughput_tracker_host.h
index 9082d00c4c1..d763516edb3 100644
--- a/chromium/ui/compositor/throughput_tracker_host.h
+++ b/chromium/ui/compositor/throughput_tracker_host.h
@@ -19,9 +19,9 @@ class COMPOSITOR_EXPORT ThroughputTrackerHost {
virtual ~ThroughputTrackerHost() = default;
// Starts the tracking for the given tracker id. |callback| is invoked after
- // the tracker is stopped and the throughput data is collected.
+ // the tracker is stopped and the metrics data is collected.
using ReportCallback = base::OnceCallback<void(
- const cc::FrameSequenceMetrics::ThroughputData throughput)>;
+ const cc::FrameSequenceMetrics::CustomReportData& data)>;
virtual void StartThroughputTracker(TrackerId tracker_id,
ReportCallback callback) = 0;
diff --git a/chromium/ui/display/BUILD.gn b/chromium/ui/display/BUILD.gn
index 3c549dcd753..429cb8f30b8 100644
--- a/chromium/ui/display/BUILD.gn
+++ b/chromium/ui/display/BUILD.gn
@@ -35,6 +35,7 @@ component("display") {
"screen.h",
"screen_base.cc",
"screen_base.h",
+ "tablet_state.h",
"unified_desktop_utils.cc",
"unified_desktop_utils.h",
]
diff --git a/chromium/ui/display/display_features.cc b/chromium/ui/display/display_features.cc
index 9d5a08ed60f..3b9e4de733c 100644
--- a/chromium/ui/display/display_features.cc
+++ b/chromium/ui/display/display_features.cc
@@ -32,5 +32,15 @@ bool IsListAllDisplayModesEnabled() {
return base::FeatureList::IsEnabled(kListAllDisplayModes);
}
+// TODO(crbug.com/1161556): Add a flag to control hardware mirroring as the
+// first step towards permanently disabling hardware mirroring. This will be
+// removed once no critical regression is seen by removing HW mirroring.
+const base::Feature kEnableHardwareMirrorMode{
+ "EnableHardwareMirrorMode", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsHardwareMirrorModeEnabled() {
+ return base::FeatureList::IsEnabled(kEnableHardwareMirrorMode);
+}
+
} // namespace features
} // namespace display
diff --git a/chromium/ui/display/display_features.h b/chromium/ui/display/display_features.h
index 878fa3bb0a6..5a67c49c068 100644
--- a/chromium/ui/display/display_features.h
+++ b/chromium/ui/display/display_features.h
@@ -19,6 +19,10 @@ DISPLAY_EXPORT extern const base::Feature kListAllDisplayModes;
DISPLAY_EXPORT bool IsListAllDisplayModesEnabled();
+DISPLAY_EXPORT extern const base::Feature kEnableHardwareMirrorMode;
+
+DISPLAY_EXPORT bool IsHardwareMirrorModeEnabled();
+
} // namespace features
} // namespace display
diff --git a/chromium/ui/display/display_observer.cc b/chromium/ui/display/display_observer.cc
index c4455a97740..5c2802278d5 100644
--- a/chromium/ui/display/display_observer.cc
+++ b/chromium/ui/display/display_observer.cc
@@ -4,6 +4,8 @@
#include "ui/display/display_observer.h"
+#include "ui/display/tablet_state.h"
+
namespace display {
DisplayObserver::~DisplayObserver() {}
@@ -22,4 +24,6 @@ void DisplayObserver::OnDisplayMetricsChanged(const Display& display,
void DisplayObserver::OnCurrentWorkspaceChanged(
const std::string& new_workspace) {}
+void DisplayObserver::OnDisplayTabletStateChanged(TabletState state) {}
+
} // namespace display
diff --git a/chromium/ui/display/display_observer.h b/chromium/ui/display/display_observer.h
index 1d3bc80fde9..8f06a745f13 100644
--- a/chromium/ui/display/display_observer.h
+++ b/chromium/ui/display/display_observer.h
@@ -12,6 +12,7 @@
namespace display {
class Display;
+enum class TabletState;
// Observers for display configuration changes.
class DISPLAY_EXPORT DisplayObserver : public base::CheckedObserver {
@@ -55,6 +56,9 @@ class DISPLAY_EXPORT DisplayObserver : public base::CheckedObserver {
// |new_workspace|.
virtual void OnCurrentWorkspaceChanged(const std::string& new_workspace);
+ // Called when display changes between conventional and tablet mode.
+ virtual void OnDisplayTabletStateChanged(TabletState state);
+
protected:
~DisplayObserver() override;
};
diff --git a/chromium/ui/display/manager/configure_displays_task.cc b/chromium/ui/display/manager/configure_displays_task.cc
index f1d8601ef57..57eba9997e4 100644
--- a/chromium/ui/display/manager/configure_displays_task.cc
+++ b/chromium/ui/display/manager/configure_displays_task.cc
@@ -96,11 +96,7 @@ ConfigureDisplaysTask::ConfigureDisplaysTask(
: delegate_(delegate),
requests_(requests),
callback_(std::move(callback)),
- is_configuring_(false),
- num_displays_configured_(0),
task_status_(SUCCESS) {
- for (size_t i = 0; i < requests_.size(); ++i)
- pending_request_indexes_.push(i);
delegate_->AddObserver(this);
}
@@ -109,81 +105,46 @@ ConfigureDisplaysTask::~ConfigureDisplaysTask() {
}
void ConfigureDisplaysTask::Run() {
- // Synchronous configurators will recursively call Run(). In that case just
- // defer their call to the next iteration in the while-loop. This is done to
- // guard against stack overflows if the display has a large list of broken
- // modes.
- if (is_configuring_)
- return;
-
- {
- base::AutoReset<bool> recursivity_guard(&is_configuring_, true);
- // The callback passed to delegate_->Configure() could be run synchronously
- // or async. If it runs synchronously and any display fails and tries to
- // reconfigure, new requests will get added to |pending_request_indexes_|,
- // then another attempt to reconfigure will recursively call Run(). However
- // |is_configuring_| will block the run due to the reason mentioned above.
- // Hence, after we configure the first set of pending requests (loop over
- // |current_pending_requests_count|), we check again if the new requests
- // were added (!pending_request_indexes_.empty()).
- while (!pending_request_indexes_.empty()) {
- std::vector<display::DisplayConfigurationParams> config_requests;
- size_t current_pending_requests_count = pending_request_indexes_.size();
- for (size_t i = 0; i < current_pending_requests_count; ++i) {
- size_t index = pending_request_indexes_.front();
- DisplayConfigureRequest* request = &requests_[index];
- pending_request_indexes_.pop();
-
- const bool internal =
- request->display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL;
- base::UmaHistogramExactLinear(
- internal ? "ConfigureDisplays.Internal.Modeset.Resolution"
- : "ConfigureDisplays.External.Modeset.Resolution",
- ComputeDisplayResolutionEnum(request->mode),
- base::size(kDisplayResolutionSamples) *
- base::size(kDisplayResolutionSamples) +
- 2);
- base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
- internal ? "ConfigureDisplays.Internal.Modeset.RefreshRate"
- : "ConfigureDisplays.External.Modeset.RefreshRate",
- 1, 240, 18, base::HistogramBase::kUmaTargetedHistogramFlag);
- histogram->Add(request->mode ? std::round(request->mode->refresh_rate())
- : 0);
-
- display::DisplayConfigurationParams display_config_params(
- request->display->display_id(), request->origin, request->mode);
- config_requests.push_back(std::move(display_config_params));
- }
- if (!config_requests.empty()) {
- delegate_->Configure(
- config_requests,
- base::BindOnce(&ConfigureDisplaysTask::OnConfigured,
- weak_ptr_factory_.GetWeakPtr()));
- }
- }
+ DCHECK(!requests_.empty());
+
+ std::vector<display::DisplayConfigurationParams> config_requests;
+ for (const auto& request : requests_) {
+ config_requests.emplace_back(request.display->display_id(), request.origin,
+ request.mode);
+
+ const bool internal =
+ request.display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL;
+ base::UmaHistogramExactLinear(
+ internal ? "ConfigureDisplays.Internal.Modeset.Resolution"
+ : "ConfigureDisplays.External.Modeset.Resolution",
+ ComputeDisplayResolutionEnum(request.mode),
+ base::size(kDisplayResolutionSamples) *
+ base::size(kDisplayResolutionSamples) +
+ 2);
+ base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
+ internal ? "ConfigureDisplays.Internal.Modeset.RefreshRate"
+ : "ConfigureDisplays.External.Modeset.RefreshRate",
+ 1, 240, 18, base::HistogramBase::kUmaTargetedHistogramFlag);
+ histogram->Add(request.mode ? std::round(request.mode->refresh_rate()) : 0);
}
- // Nothing should be modified after the |callback_| is called since the
- // task may be deleted in the callback.
- if (num_displays_configured_ == requests_.size())
- std::move(callback_).Run(task_status_);
+ delegate_->Configure(config_requests,
+ base::BindOnce(&ConfigureDisplaysTask::OnConfigured,
+ weak_ptr_factory_.GetWeakPtr()));
}
void ConfigureDisplaysTask::OnConfigurationChanged() {}
void ConfigureDisplaysTask::OnDisplaySnapshotsInvalidated() {
- base::queue<size_t> empty_queue;
- pending_request_indexes_.swap(empty_queue);
// From now on, don't access |requests_[index]->display|; they're invalid.
task_status_ = ERROR;
weak_ptr_factory_.InvalidateWeakPtrs();
- Run();
+ std::move(callback_).Run(task_status_);
}
void ConfigureDisplaysTask::OnConfigured(
const base::flat_map<int64_t, bool>& statuses) {
bool config_success = true;
-
// Check if all displays are successfully configured.
for (const auto& status : statuses) {
int64_t display_id = status.first;
@@ -206,11 +167,11 @@ void ConfigureDisplaysTask::OnConfigured(
display_success);
}
+ // Update displays upon success or prep |requests_| for reconfiguration.
if (config_success) {
- for (const auto& status : statuses) {
- auto request = GetRequestForDisplayId(status.first, requests_);
- request->display->set_current_mode(request->mode);
- request->display->set_origin(request->origin);
+ for (auto& request : requests_) {
+ request.display->set_current_mode(request.mode);
+ request.display->set_origin(request.origin);
}
} else {
bool should_reconfigure = false;
@@ -230,37 +191,25 @@ void ConfigureDisplaysTask::OnConfigured(
}
}
}
- // When reconfiguring, reconfigure all displays, not only the failing ones
- // as they could potentially depend on each other.
if (should_reconfigure) {
- for (const auto& status : statuses) {
- auto const_iterator = GetRequestForDisplayId(status.first, requests_);
- auto request = requests_.erase(const_iterator, const_iterator);
- size_t index = std::distance(requests_.begin(), request);
- pending_request_indexes_.push(index);
- }
- if (task_status_ == SUCCESS)
- task_status_ = PARTIAL_SUCCESS;
+ task_status_ = PARTIAL_SUCCESS;
Run();
return;
}
}
- // If no reconfigurations are happening, update the final state.
- for (const auto& status : statuses) {
- auto request = GetRequestForDisplayId(status.first, requests_);
- bool internal =
- request->display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL;
+ // Update the final state.
+ for (auto& request : requests_) {
+ bool internal = request.display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL;
base::UmaHistogramBoolean(
internal ? "ConfigureDisplays.Internal.Modeset.FinalStatus"
: "ConfigureDisplays.External.Modeset.FinalStatus",
config_success);
}
- num_displays_configured_ += statuses.size();
if (!config_success)
task_status_ = ERROR;
- Run();
+ std::move(callback_).Run(task_status_);
}
} // namespace display
diff --git a/chromium/ui/display/manager/configure_displays_task.h b/chromium/ui/display/manager/configure_displays_task.h
index 25ca3f7b10a..2c09b932317 100644
--- a/chromium/ui/display/manager/configure_displays_task.h
+++ b/chromium/ui/display/manager/configure_displays_task.h
@@ -76,17 +76,6 @@ class DISPLAY_MANAGER_EXPORT ConfigureDisplaysTask
// task is done and the task status.
ResponseCallback callback_;
- // Stores the indexes of pending requests in |requests_|.
- base::queue<size_t> pending_request_indexes_;
-
- // Used to keep make sure that synchronous executions do not recurse during
- // the configuration.
- bool is_configuring_;
-
- // Number of display configured. This is used to check whether there are
- // pending requests.
- size_t num_displays_configured_;
-
Status task_status_;
base::WeakPtrFactory<ConfigureDisplaysTask> weak_ptr_factory_{this};
diff --git a/chromium/ui/display/manager/configure_displays_task_unittest.cc b/chromium/ui/display/manager/configure_displays_task_unittest.cc
index 91769963cf7..92c8ee4efa6 100644
--- a/chromium/ui/display/manager/configure_displays_task_unittest.cc
+++ b/chromium/ui/display/manager/configure_displays_task_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include <stddef.h>
+#include <vector>
#include "base/bind.h"
#include "base/run_loop.h"
@@ -24,22 +25,23 @@ class ConfigureDisplaysTaskTest : public testing::Test {
ConfigureDisplaysTaskTest()
: delegate_(&log_),
small_mode_(gfx::Size(1366, 768), false, 60.0f),
- big_mode_(gfx::Size(2560, 1600), false, 60.0f) {
- displays_[0] = FakeDisplaySnapshot::Builder()
- .SetId(123)
- .SetNativeMode(small_mode_.Clone())
- .SetCurrentMode(small_mode_.Clone())
- .Build();
-
- displays_[1] = FakeDisplaySnapshot::Builder()
- .SetId(456)
- .SetNativeMode(big_mode_.Clone())
- .SetCurrentMode(big_mode_.Clone())
- .AddMode(small_mode_.Clone())
- .Build();
- }
+ big_mode_(gfx::Size(2560, 1600), false, 60.0f) {}
~ConfigureDisplaysTaskTest() override = default;
+ void SetUp() override {
+ displays_.push_back(FakeDisplaySnapshot::Builder()
+ .SetId(123)
+ .SetNativeMode(small_mode_.Clone())
+ .SetCurrentMode(small_mode_.Clone())
+ .Build());
+ displays_.push_back(FakeDisplaySnapshot::Builder()
+ .SetId(456)
+ .SetNativeMode(big_mode_.Clone())
+ .SetCurrentMode(big_mode_.Clone())
+ .AddMode(small_mode_.Clone())
+ .Build());
+ }
+
void ConfigureCallback(ConfigureDisplaysTask::Status status) {
callback_called_ = true;
status_ = status;
@@ -56,7 +58,7 @@ class ConfigureDisplaysTaskTest : public testing::Test {
const DisplayMode small_mode_;
const DisplayMode big_mode_;
- std::unique_ptr<DisplaySnapshot> displays_[2];
+ std::vector<std::unique_ptr<DisplaySnapshot>> displays_;
private:
DISALLOW_COPY_AND_ASSIGN(ConfigureDisplaysTaskTest);
@@ -64,20 +66,6 @@ class ConfigureDisplaysTaskTest : public testing::Test {
} // namespace
-TEST_F(ConfigureDisplaysTaskTest, ConfigureWithNoDisplays) {
- ConfigureDisplaysTask::ResponseCallback callback = base::BindOnce(
- &ConfigureDisplaysTaskTest::ConfigureCallback, base::Unretained(this));
-
- ConfigureDisplaysTask task(&delegate_, std::vector<DisplayConfigureRequest>(),
- std::move(callback));
-
- task.Run();
-
- EXPECT_TRUE(callback_called_);
- EXPECT_EQ(ConfigureDisplaysTask::SUCCESS, status_);
- EXPECT_EQ(kNoActions, log_.GetActionsAndClear());
-}
-
TEST_F(ConfigureDisplaysTaskTest, ConfigureWithOneDisplay) {
ConfigureDisplaysTask::ResponseCallback callback = base::BindOnce(
&ConfigureDisplaysTaskTest::ConfigureCallback, base::Unretained(this));
@@ -100,9 +88,8 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureWithTwoDisplay) {
&ConfigureDisplaysTaskTest::ConfigureCallback, base::Unretained(this));
std::vector<DisplayConfigureRequest> requests;
- for (size_t i = 0; i < base::size(displays_); ++i) {
- requests.emplace_back(displays_[i].get(), displays_[i]->native_mode(),
- gfx::Point());
+ for (const auto& display : displays_) {
+ requests.emplace_back(display.get(), display->native_mode(), gfx::Point());
}
ConfigureDisplaysTask task(&delegate_, requests, std::move(callback));
@@ -170,9 +157,8 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureWithTwoDisplayFails) {
delegate_.set_max_configurable_pixels(1);
std::vector<DisplayConfigureRequest> requests;
- for (size_t i = 0; i < base::size(displays_); ++i) {
- requests.emplace_back(displays_[i].get(), displays_[i]->native_mode(),
- gfx::Point());
+ for (const auto& display : displays_) {
+ requests.emplace_back(display.get(), display->native_mode(), gfx::Point());
}
ConfigureDisplaysTask task(&delegate_, requests, std::move(callback));
@@ -196,16 +182,15 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureWithTwoDisplayFails) {
log_.GetActionsAndClear());
}
-TEST_F(ConfigureDisplaysTaskTest, ConfigureWithTwoDisplaysPartialSuccess) {
+TEST_F(ConfigureDisplaysTaskTest, ReconfigureLastDisplayPartialSuccess) {
ConfigureDisplaysTask::ResponseCallback callback = base::BindOnce(
&ConfigureDisplaysTaskTest::ConfigureCallback, base::Unretained(this));
delegate_.set_max_configurable_pixels(small_mode_.size().GetArea());
std::vector<DisplayConfigureRequest> requests;
- for (size_t i = 0; i < base::size(displays_); ++i) {
- requests.emplace_back(displays_[i].get(), displays_[i]->native_mode(),
- gfx::Point());
+ for (const auto& display : displays_) {
+ requests.emplace_back(display.get(), display->native_mode(), gfx::Point());
}
ConfigureDisplaysTask task(&delegate_, requests, std::move(callback));
@@ -229,6 +214,50 @@ TEST_F(ConfigureDisplaysTaskTest, ConfigureWithTwoDisplaysPartialSuccess) {
log_.GetActionsAndClear());
}
+TEST_F(ConfigureDisplaysTaskTest, ReconfigureMiddleDisplayPartialSuccess) {
+ ConfigureDisplaysTask::ResponseCallback callback = base::BindOnce(
+ &ConfigureDisplaysTaskTest::ConfigureCallback, base::Unretained(this));
+
+ displays_.push_back(FakeDisplaySnapshot::Builder()
+ .SetId(789)
+ .SetNativeMode(small_mode_.Clone())
+ .SetCurrentMode(small_mode_.Clone())
+ .Build());
+
+ delegate_.set_max_configurable_pixels(small_mode_.size().GetArea());
+
+ std::vector<DisplayConfigureRequest> requests;
+ for (const auto& display : displays_) {
+ requests.emplace_back(display.get(), display->native_mode(), gfx::Point());
+ }
+
+ ConfigureDisplaysTask task(&delegate_, requests, std::move(callback));
+ task.Run();
+
+ EXPECT_TRUE(callback_called_);
+ EXPECT_EQ(ConfigureDisplaysTask::PARTIAL_SUCCESS, status_);
+ EXPECT_EQ(JoinActions(GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ &big_mode_})
+ .c_str(),
+ GetCrtcAction({displays_[2]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ GetCrtcAction({displays_[0]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ GetCrtcAction({displays_[1]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ GetCrtcAction({displays_[2]->display_id(), gfx::Point(),
+ &small_mode_})
+ .c_str(),
+ nullptr),
+ log_.GetActionsAndClear());
+}
+
TEST_F(ConfigureDisplaysTaskTest, AsyncConfigureWithTwoDisplaysPartialSuccess) {
ConfigureDisplaysTask::ResponseCallback callback = base::BindOnce(
&ConfigureDisplaysTaskTest::ConfigureCallback, base::Unretained(this));
@@ -237,9 +266,8 @@ TEST_F(ConfigureDisplaysTaskTest, AsyncConfigureWithTwoDisplaysPartialSuccess) {
delegate_.set_max_configurable_pixels(small_mode_.size().GetArea());
std::vector<DisplayConfigureRequest> requests;
- for (size_t i = 0; i < base::size(displays_); ++i) {
- requests.emplace_back(displays_[i].get(), displays_[i]->native_mode(),
- gfx::Point());
+ for (const auto& display : displays_) {
+ requests.emplace_back(display.get(), display->native_mode(), gfx::Point());
}
ConfigureDisplaysTask task(&delegate_, requests, std::move(callback));
diff --git a/chromium/ui/display/manager/display_change_observer.cc b/chromium/ui/display/manager/display_change_observer.cc
index 8bc5730e274..249c7e49278 100644
--- a/chromium/ui/display/manager/display_change_observer.cc
+++ b/chromium/ui/display/manager/display_change_observer.cc
@@ -429,11 +429,15 @@ float DisplayChangeObserver::FindDeviceScaleFactor(
float dpi,
const gfx::Size& size_in_pixels) {
// Nocturne has special scale factor 3000/1332=2.252.. for the panel 3kx2k.
- constexpr gfx::Size k225DisplaySizeHack(3000, 2000);
+ constexpr gfx::Size k225DisplaySizeHackNocturne(3000, 2000);
+ // Keep the Chell's scale factor 2.252 until we make decision.
+ constexpr gfx::Size k2DisplaySizeHackChell(3200, 1800);
- if (size_in_pixels == k225DisplaySizeHack)
+ if (size_in_pixels == k225DisplaySizeHackNocturne) {
return kDsf_2_252;
- else {
+ } else if (size_in_pixels == k2DisplaySizeHackChell) {
+ return 2.f;
+ } else {
for (size_t i = 0; i < base::size(kThresholdTableForInternal); ++i) {
if (dpi >= kThresholdTableForInternal[i].dpi)
return kThresholdTableForInternal[i].device_scale_factor;
diff --git a/chromium/ui/display/manager/display_change_observer_unittest.cc b/chromium/ui/display/manager/display_change_observer_unittest.cc
index 6a3ffeb971f..8e17c1b80ee 100644
--- a/chromium/ui/display/manager/display_change_observer_unittest.cc
+++ b/chromium/ui/display/manager/display_change_observer_unittest.cc
@@ -4,6 +4,7 @@
#include "ui/display/manager/display_change_observer.h"
+#include <cmath>
#include <string>
#include "base/strings/stringprintf.h"
@@ -17,21 +18,27 @@
#include "ui/display/manager/display_manager.h"
#include "ui/display/manager/managed_display_info.h"
#include "ui/display/screen.h"
+#include "ui/display/types/display_constants.h"
#include "ui/display/types/display_mode.h"
#include "ui/events/devices/device_data_manager.h"
#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/range/range_f.h"
namespace display {
namespace {
-float ComputeDeviceScaleFactor(float diagonal_inch,
- const gfx::Size& resolution) {
+float ComputeDpi(float diagonal_inch, const gfx::Size& resolution) {
// We assume that displays have square pixel.
float diagonal_pixel = std::sqrt(std::pow(resolution.width(), 2) +
std::pow(resolution.height(), 2));
- float dpi = diagonal_pixel / diagonal_inch;
+ return diagonal_pixel / diagonal_inch;
+}
+
+float ComputeDeviceScaleFactor(float dpi, const gfx::Size& resolution) {
return DisplayChangeObserver::FindDeviceScaleFactor(dpi, resolution);
}
@@ -194,8 +201,23 @@ TEST_P(DisplayChangeObserverTest, GetEmptyExternalManagedDisplayModeList) {
EXPECT_EQ(0u, display_modes.size());
}
+bool IsDpiOutOfRange(float dpi) {
+ // http://go/cros-ppi-spectrum
+ constexpr gfx::RangeF good_ranges[] = {
+ {125.f, 165.f},
+ {180.f, 210.f},
+ {220.f, 265.f},
+ {270.f, 350.f},
+ };
+ for (auto& range : good_ranges) {
+ if (range.start() <= dpi && range.end() > dpi)
+ return true;
+ }
+ return false;
+}
+
TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) {
- // sanity check
+ // Validation check
EXPECT_EQ(1.25f,
DisplayChangeObserver::FindDeviceScaleFactor(150, gfx::Size()));
EXPECT_EQ(1.6f,
@@ -210,44 +232,21 @@ TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) {
0, gfx::Size(3000, 2000)));
EXPECT_EQ(kDsf_2_666,
DisplayChangeObserver::FindDeviceScaleFactor(310, gfx::Size()));
- constexpr struct Data {
- const float diagonal_size;
- const gfx::Size resolution;
- const float expected_dsf;
- const gfx::Size expected_dp_size;
- const bool screenshot_size_error;
- } display_configs[] = {
- // clang-format off
- // inch, resolution, DSF, size in DP, screenshot size error
- {19.5, {1600, 900}, 1.f, {1600, 900}, false},
- {21.5f, {1920, 1080}, 1.f, {1920, 1080}, false},
- {10.0f, {1920, 1200}, kDsf_1_777, {1080, 675}, false},
- {12.1f, {1280, 800}, 1.0f, {1280, 800}, false},
- {13.3f, {1920, 1080}, 1.25f, {1536, 864}, false},
- {14.0f, {1920, 1080}, 1.25f, {1536, 864}, false},
- {11.6f, {1920, 1080}, 1.6f, {1200, 675}, false},
- {12.02f, {2160, 1440}, 1.6f, {1350, 900}, false},
- {9.7f, {1536, 2048}, 2.0f, {768, 1024}, false},
- {12.85f, {2560, 1700}, 2.0f, {1280, 850}, false},
- {12.3f, {2400, 1600}, 2.0f, {1200, 800}, false},
- {10.1f, {1920, 1200}, kDsf_1_777, {1080, 675}, false},
- {11.0f, {2160, 1440}, 2.f, {1080, 720}, false},
- {12.3f, {3000, 2000}, kDsf_2_252, {1332, 888}, true},
- {15.6f, {3840, 2160}, 2.4f, {1600, 900}, true},
- {13.1f, {3840, 2160}, kDsf_2_666, {1440, 810}, false},
- // clang-format on
- };
for (auto& entry : display_configs) {
SCOPED_TRACE(base::StringPrintf(
"%dx%d, diag=%1.3f inch, expected=%1.10f", entry.resolution.width(),
entry.resolution.height(), entry.diagonal_size, entry.expected_dsf));
+ float dpi = ComputeDpi(entry.diagonal_size, entry.resolution);
// Check ScaleFactor.
- float scale_factor =
- ComputeDeviceScaleFactor(entry.diagonal_size, entry.resolution);
+ float scale_factor = ComputeDeviceScaleFactor(dpi, entry.resolution);
EXPECT_EQ(entry.expected_dsf, scale_factor);
+ bool bad_range = !IsDpiOutOfRange(dpi);
+ EXPECT_EQ(bad_range, entry.bad_range);
// Check DP size.
+ gfx::ScaleToCeiledSize(entry.resolution, 1.f / scale_factor);
+
const gfx::Size dp_size =
gfx::ScaleToCeiledSize(entry.resolution, 1.f / scale_factor);
@@ -258,15 +257,21 @@ TEST_P(DisplayChangeObserverTest, FindDeviceScaleFactor) {
const gfx::Size screenshot_size =
cc::MathUtil::MapEnclosingClippedRect(transform, gfx::Rect(dp_size))
.size();
- if (entry.screenshot_size_error) {
- EXPECT_NE(entry.resolution, screenshot_size);
- constexpr float kEpsilon = 0.001f;
- EXPECT_EQ(entry.resolution,
- cc::MathUtil::MapEnclosingClippedRectIgnoringError(
- transform, gfx::Rect(dp_size), kEpsilon)
- .size());
- } else {
- EXPECT_EQ(entry.resolution, screenshot_size);
+ switch (entry.screenshot_size_error) {
+ case kEpsilon: {
+ EXPECT_NE(entry.resolution, screenshot_size);
+ constexpr float kEpsilon = 0.001f;
+ EXPECT_EQ(entry.resolution,
+ cc::MathUtil::MapEnclosingClippedRectIgnoringError(
+ transform, gfx::Rect(dp_size), kEpsilon)
+ .size());
+ break;
+ }
+ case kExact:
+ EXPECT_EQ(entry.resolution, screenshot_size);
+ break;
+ case kSkip:
+ break;
}
}
@@ -476,4 +481,67 @@ INSTANTIATE_TEST_SUITE_P(All,
DisplayChangeObserverTest,
::testing::Values(false, true));
+#if defined(OS_CHROMEOS)
+using DisplayResolutionTest = testing::Test;
+
+TEST_F(DisplayResolutionTest, CheckEffectiveResoutionUMAIndex) {
+ std::map<int, gfx::Size> effective_resolutions;
+ for (const auto& display_config : display_configs) {
+ gfx::Size size = display_config.resolution;
+ if (size.width() < size.height())
+ size = gfx::Size(size.height(), size.width());
+
+ const float dsf = display_config.expected_dsf;
+
+ std::array<float, kNumOfZoomFactors> zoom_levels;
+
+ if (dsf == 1.f) {
+ for (const ZoomListBucket& zoom_list_bucket : kZoomListBuckets) {
+ if (size.width() >= zoom_list_bucket.first)
+ zoom_levels = zoom_list_bucket.second;
+ }
+ } else {
+ for (const ZoomListBucketDsf& zoom_list_bucket : kZoomListBucketsForDsf) {
+ if (cc::MathUtil::IsWithinEpsilon(dsf, zoom_list_bucket.first))
+ zoom_levels = zoom_list_bucket.second;
+ }
+ }
+
+ for (float zoom_level : zoom_levels) {
+ float effective_scale = 1.f / (zoom_level * dsf);
+ gfx::SizeF effective_resolution_f(size);
+ effective_resolution_f.Scale(effective_scale);
+
+ gfx::Size effective_resolution =
+ gfx::ToEnclosedRectIgnoringError(gfx::RectF(effective_resolution_f),
+ 0.01f)
+ .size();
+ gfx::Size portrait_effective_resolution = gfx::Size(
+ effective_resolution.height(), effective_resolution.width());
+
+ const int landscape_key =
+ effective_resolution.width() * effective_resolution.height();
+ const int portrait_key = landscape_key - 1;
+
+ auto it = effective_resolutions.find(landscape_key);
+ if (it != effective_resolutions.end())
+ EXPECT_EQ(it->second, effective_resolution);
+ else
+ effective_resolutions[landscape_key] = effective_resolution;
+
+ it = effective_resolutions.find(portrait_key);
+ if (it != effective_resolutions.end())
+ EXPECT_EQ(it->second, portrait_effective_resolution);
+ else
+ effective_resolutions[portrait_key] = portrait_effective_resolution;
+ }
+ }
+
+ // With the current set of display configs and zoom levels, there are only 288
+ // possible effective resolutions for internal displays in chromebooks. Update
+ // this value when adding a new display config.
+ EXPECT_EQ(effective_resolutions.size(), 288ul);
+}
+#endif
+
} // namespace display
diff --git a/chromium/ui/display/manager/display_configurator.cc b/chromium/ui/display/manager/display_configurator.cc
index 53dc139a4e8..aade5924df2 100644
--- a/chromium/ui/display/manager/display_configurator.cc
+++ b/chromium/ui/display/manager/display_configurator.cc
@@ -8,7 +8,7 @@
#include <utility>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "base/macros.h"
@@ -200,6 +200,13 @@ DisplayConfigurator::DisplayLayoutManagerImpl::ParseDisplays(
cached_displays.push_back(display_state);
}
+ // TODO(crbug.com/1161556): Hardware mirroring is now disabled by deafult.
+ // This is the first step towards permanently disabling HW mirroring. The use
+ // of a feature flag will be removed once we verify no regressions occur due
+ // to disabling HW mirroring.
+ if (!features::IsHardwareMirrorModeEnabled())
+ return cached_displays;
+
// Hardware mirroring doesn't work on desktop-linux Chrome OS's fake displays.
// Skip mirror mode setup in that case to fall back on software mirroring.
if (!chromeos::IsRunningAsSystemCompositor())
diff --git a/chromium/ui/display/manager/display_configurator_unittest.cc b/chromium/ui/display/manager/display_configurator_unittest.cc
index 94b3675d713..958d00425c4 100644
--- a/chromium/ui/display/manager/display_configurator_unittest.cc
+++ b/chromium/ui/display/manager/display_configurator_unittest.cc
@@ -11,9 +11,11 @@
#include "base/command_line.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
+#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "chromeos/constants/chromeos_switches.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/display/display_features.h"
#include "ui/display/fake/fake_display_snapshot.h"
#include "ui/display/manager/test/action_logger_util.h"
#include "ui/display/manager/test/test_native_display_delegate.h"
@@ -218,6 +220,12 @@ class DisplayConfiguratorTest : public testing::Test {
void SetUp() override {
log_ = std::make_unique<ActionLogger>();
+ // TODO(crbug.com/1161556): |kEnableHardwareMirrorMode| is disabled by
+ // default. We enable it here to maintain test coverage for hardware mirror
+ // mode until it is permanently removed.
+ scoped_feature_list_.InitAndEnableFeature(
+ features::kEnableHardwareMirrorMode);
+
// Force system compositor mode to simulate on-device configurator behavior.
base::CommandLine::ForCurrentProcess()->AppendSwitch(
chromeos::switches::kForceSystemCompositorMode);
@@ -330,6 +338,7 @@ class DisplayConfiguratorTest : public testing::Test {
TestNativeDisplayDelegate* native_display_delegate_; // not owned
DisplayConfigurator::TestApi test_api_{&configurator_};
ConfigurationWaiter config_waiter_{&test_api_};
+ base::test::ScopedFeatureList scoped_feature_list_;
static constexpr size_t kNumOutputs = 3;
std::unique_ptr<DisplaySnapshot> outputs_[kNumOutputs];
@@ -823,12 +832,27 @@ TEST_F(DisplayConfiguratorTest, InvalidMultipleDisplayStates) {
EXPECT_EQ(2, observer_.num_failures());
}
-TEST_F(DisplayConfiguratorTest, GetMultipleDisplayStateForMirroredDisplays) {
+TEST_F(DisplayConfiguratorTest, GetMultipleDisplayStateForHWMirroredDisplays) {
UpdateOutputs(2, false);
Init(false);
state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
configurator_.ForceInitialConfigure();
EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR, configurator_.display_state());
+ EXPECT_FALSE(mirroring_controller_.SoftwareMirroringEnabled());
+}
+
+TEST_F(DisplayConfiguratorTest, GetMultipleDisplayStateForSWMirroredDisplays) {
+ // Disable hardware mirroring.
+ scoped_feature_list_.Reset();
+ scoped_feature_list_.InitAndDisableFeature(
+ features::kEnableHardwareMirrorMode);
+ UpdateOutputs(2, false);
+ Init(false);
+ state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR);
+ configurator_.ForceInitialConfigure();
+ EXPECT_EQ(MULTIPLE_DISPLAY_STATE_MULTI_EXTENDED,
+ configurator_.display_state());
+ EXPECT_TRUE(mirroring_controller_.SoftwareMirroringEnabled());
}
TEST_F(DisplayConfiguratorTest, UpdateCachedOutputsEvenAfterFailure) {
diff --git a/chromium/ui/display/manager/display_manager.cc b/chromium/ui/display/manager/display_manager.cc
index 5fb0a9342c5..b153abdf165 100644
--- a/chromium/ui/display/manager/display_manager.cc
+++ b/chromium/ui/display/manager/display_manager.cc
@@ -36,6 +36,7 @@
#include "ui/display/manager/display_util.h"
#include "ui/display/manager/managed_display_info.h"
#include "ui/display/screen.h"
+#include "ui/display/tablet_state.h"
#include "ui/display/types/display_snapshot.h"
#include "ui/gfx/font_render_params.h"
#include "ui/gfx/geometry/rect.h"
@@ -2192,6 +2193,12 @@ void DisplayManager::NotifyDisplayRemoved(const Display& display) {
observer.OnDisplayRemoved(display);
}
+void DisplayManager::NotifyDisplayTabletStateChanged(
+ const TabletState& tablet_state) {
+ for (auto& observer : observers_)
+ observer.OnDisplayTabletStateChanged(tablet_state);
+}
+
void DisplayManager::AddObserver(DisplayObserver* observer) {
observers_.AddObserver(observer);
}
diff --git a/chromium/ui/display/manager/display_manager.h b/chromium/ui/display/manager/display_manager.h
index 9520879323a..f681a3ebf02 100644
--- a/chromium/ui/display/manager/display_manager.h
+++ b/chromium/ui/display/manager/display_manager.h
@@ -50,6 +50,7 @@ class DisplayLayoutStore;
class DisplayObserver;
class NativeDisplayDelegate;
class Screen;
+enum class TabletState;
namespace test {
class DisplayManagerTestApi;
@@ -492,6 +493,7 @@ class DISPLAY_MANAGER_EXPORT DisplayManager
void NotifyMetricsChanged(const Display& display, uint32_t metrics);
void NotifyDisplayAdded(const Display& display);
void NotifyDisplayRemoved(const Display& display);
+ void NotifyDisplayTabletStateChanged(const TabletState& tablet_state);
// Delegated from the Screen implementation.
void AddObserver(DisplayObserver* observer);
diff --git a/chromium/ui/display/manager/display_util.cc b/chromium/ui/display/manager/display_util.cc
index 8364bdfac68..59a4401f49d 100644
--- a/chromium/ui/display/manager/display_util.cc
+++ b/chromium/ui/display/manager/display_util.cc
@@ -17,53 +17,6 @@
#include "ui/display/types/display_snapshot.h"
namespace display {
-namespace {
-
-// The total number of display zoom factors to enumerate.
-constexpr int kNumOfZoomFactors = 9;
-
-// A pair representing the list of zoom values for a given minimum display
-// resolution width.
-using ZoomListBucket = std::pair<int, std::array<float, kNumOfZoomFactors>>;
-
-// A pair representing the list of zoom values for a given minimum default dsf.
-using ZoomListBucketDsf =
- std::pair<float, std::array<float, kNumOfZoomFactors>>;
-
-// For displays with a device scale factor of unity, we use a static list of
-// initialized zoom values. For a given resolution width of a display, we can
-// find its associated list of zoom values by simply finding the last bucket
-// with a width less than the given resolution width.
-// Ex. A resolution width of 1024, we will use the bucket with the width of 960.
-constexpr std::array<ZoomListBucket, 8> kZoomListBuckets{{
- {0, {0.60f, 0.65f, 0.70f, 0.75f, 0.80f, 0.85f, 0.90f, 0.95f, 1.f}},
- {720, {0.70f, 0.75f, 0.80f, 0.85f, 0.90f, 0.95f, 1.f, 1.05f, 1.10f}},
- {800, {0.75f, 0.80f, 0.85f, 0.90f, 0.95f, 1.f, 1.05f, 1.10f, 1.15f}},
- {960, {0.90f, 0.95f, 1.f, 1.05f, 1.10f, 1.15f, 1.20f, 1.25f, 1.30f}},
- {1280, {0.90f, 1.f, 1.05f, 1.10f, 1.15f, 1.20f, 1.25f, 1.30f, 1.50f}},
- {1920, {1.f, 1.10f, 1.15f, 1.20f, 1.30f, 1.40f, 1.50f, 1.75f, 2.00f}},
- {3840, {1.f, 1.10f, 1.20f, 1.40f, 1.60f, 1.80f, 2.00f, 2.20f, 2.40f}},
- {5120, {1.f, 1.25f, 1.50f, 1.75f, 2.00f, 2.25f, 2.50f, 2.75f, 3.00f}},
-}};
-
-// Displays with a default device scale factor have a static list of initialized
-// zoom values that includes a zoom level to go to the native resolution of the
-// display. Ensure that the list of DSFs are in sync with the list of default
-// device scale factors in display_change_observer.cc.
-constexpr std::array<ZoomListBucketDsf, 7> kZoomListBucketsForDsf{{
- {1.25f, {0.7f, 1.f / 1.25f, 0.85f, 0.9f, 0.95f, 1.f, 1.1f, 1.2f, 1.3f}},
- {1.6f, {1.f / 1.6f, 0.7f, 0.75f, 0.8f, 0.85f, 0.9f, 1.f, 1.15f, 1.3f}},
- {kDsf_1_777,
- {1.f / kDsf_1_777, 0.65f, 0.75f, 0.8f, 0.9f, 1.f, 1.1f, 1.2f, 1.3f}},
- {2.f, {1.f / 2.f, 0.6f, 0.7f, 0.8f, 0.9f, 1.f, 1.1f, 1.25f, 1.5f}},
- {kDsf_2_252,
- {1.f / kDsf_2_252, 0.6f, 0.7f, 0.8f, 0.9f, 1.f, 1.15f, 1.3f, 1.5f}},
- {2.4f, {1.f / 2.4f, 0.5f, 0.6f, 0.8f, 0.9f, 1.f, 1.2f, 1.35f, 1.5f}},
- {kDsf_2_666,
- {1.f / kDsf_2_666, 0.5f, 0.6f, 0.8f, 0.9f, 1.f, 1.2f, 1.35f, 1.5f}},
-}};
-
-} // namespace
#if defined(OS_CHROMEOS)
std::string DisplayPowerStateToString(chromeos::DisplayPowerState state) {
diff --git a/chromium/ui/display/manager/managed_display_info.cc b/chromium/ui/display/manager/managed_display_info.cc
index 06dfbeb16ec..f9c5b726aa8 100644
--- a/chromium/ui/display/manager/managed_display_info.cc
+++ b/chromium/ui/display/manager/managed_display_info.cc
@@ -54,6 +54,17 @@ bool GetDisplayBounds(const std::string& spec,
sscanf(spec.c_str(), "%d+%d-%dx%d*%f", &x, &y, &width, &height,
device_scale_factor) >= 4) {
bounds->SetRect(x, y, width, height);
+
+ auto equals_within_epsilon = [device_scale_factor](float dsf) {
+ return std::abs(*device_scale_factor - dsf) < 0.01f;
+ };
+ if (equals_within_epsilon(1.77f)) {
+ *device_scale_factor = kDsf_1_777;
+ } else if (equals_within_epsilon(2.25f)) {
+ *device_scale_factor = kDsf_2_252;
+ } else if (equals_within_epsilon(2.66)) {
+ *device_scale_factor = kDsf_2_666;
+ }
return true;
}
return false;
@@ -396,12 +407,6 @@ void ManagedDisplayInfo::SetBounds(const gfx::Rect& new_bounds_in_native) {
UpdateDisplaySize();
}
-float ManagedDisplayInfo::GetDensityRatio() const {
- if (Display::IsInternalDisplayId(id_) && device_scale_factor_ == 1.25f)
- return 1.0f;
- return device_scale_factor_;
-}
-
float ManagedDisplayInfo::GetEffectiveDeviceScaleFactor() const {
return device_scale_factor_ * zoom_factor_;
}
diff --git a/chromium/ui/display/manager/managed_display_info.h b/chromium/ui/display/manager/managed_display_info.h
index f99bf46bbcf..9c6b87eb267 100644
--- a/chromium/ui/display/manager/managed_display_info.h
+++ b/chromium/ui/display/manager/managed_display_info.h
@@ -202,10 +202,6 @@ class DISPLAY_MANAGER_EXPORT ManagedDisplayInfo {
// Returns the rotation set by a given |source|.
Display::Rotation GetRotation(Display::RotationSource source) const;
- // Returns a measure of density relative to a display with 1.0 DSF. Unlike the
- // effective DSF, this is independent from the UI scale.
- float GetDensityRatio() const;
-
// Returns the ui scale and device scale factor actually used to create
// display that chrome sees. This is |device_scale_factor| x |zoom_factor_|.
// TODO(oshima): Rename to |GetDeviceScaleFactor()|.
diff --git a/chromium/ui/display/manager/managed_display_info_unittest.cc b/chromium/ui/display/manager/managed_display_info_unittest.cc
index 115214dd8be..b2ad47f724e 100644
--- a/chromium/ui/display/manager/managed_display_info_unittest.cc
+++ b/chromium/ui/display/manager/managed_display_info_unittest.cc
@@ -4,7 +4,6 @@
#include "ui/display/manager/managed_display_info.h"
-#include "base/test/scoped_feature_list.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/display/display_switches.h"
diff --git a/chromium/ui/display/screen.cc b/chromium/ui/display/screen.cc
index 833e53c7aff..95588119d57 100644
--- a/chromium/ui/display/screen.cc
+++ b/chromium/ui/display/screen.cc
@@ -8,6 +8,7 @@
#include "base/check.h"
#include "base/notreached.h"
+#include "base/time/time.h"
#include "ui/display/display.h"
#include "ui/display/types/display_constants.h"
#include "ui/gfx/geometry/rect.h"
@@ -67,6 +68,16 @@ void Screen::SetScreenSaverSuspended(bool suspend) {
NOTIMPLEMENTED_LOG_ONCE();
}
+bool Screen::IsScreenSaverActive() const {
+ NOTIMPLEMENTED_LOG_ONCE();
+ return false;
+}
+
+base::TimeDelta Screen::CalculateIdleTime() const {
+ NOTIMPLEMENTED_LOG_ONCE();
+ return base::TimeDelta::FromSeconds(0);
+}
+
gfx::Rect Screen::ScreenToDIPRectInWindow(gfx::NativeWindow window,
const gfx::Rect& screen_rect) const {
float scale = GetDisplayNearestWindow(window).device_scale_factor();
@@ -101,6 +112,11 @@ std::string Screen::GetCurrentWorkspace() {
return {};
}
+base::Value Screen::GetGpuExtraInfoAsListValue(
+ const gfx::GpuExtraInfo& gpu_extra_info) {
+ return base::Value(base::Value::Type::LIST);
+}
+
void Screen::SetScopedDisplayForNewWindows(int64_t display_id) {
if (display_id == scoped_display_id_for_new_windows_)
return;
diff --git a/chromium/ui/display/screen.h b/chromium/ui/display/screen.h
index 1a3c883afde..046c2cd2873 100644
--- a/chromium/ui/display/screen.h
+++ b/chromium/ui/display/screen.h
@@ -9,14 +9,20 @@
#include <vector>
#include "base/macros.h"
+#include "base/values.h"
#include "ui/display/display.h"
#include "ui/display/display_export.h"
+#include "ui/gfx/gpu_extra_info.h"
#include "ui/gfx/native_widget_types.h"
+namespace base {
+class TimeDelta;
+} // namespace base
+
namespace gfx {
class Point;
class Rect;
-}
+} // namespace gfx
namespace display {
class DisplayObserver;
@@ -99,6 +105,12 @@ class DISPLAY_EXPORT Screen {
// Suspends the platform-specific screensaver, if applicable.
virtual void SetScreenSaverSuspended(bool suspend);
+ // Returns whether the screensaver is currently running.
+ virtual bool IsScreenSaverActive() const;
+
+ // Calculates idle time.
+ virtual base::TimeDelta CalculateIdleTime() const;
+
// Adds/Removes display observers.
virtual void AddObserver(DisplayObserver* observer) = 0;
virtual void RemoveObserver(DisplayObserver* observer) = 0;
@@ -130,6 +142,11 @@ class DISPLAY_EXPORT Screen {
// to get current workspace through the GetCurrentWorkspace method.
virtual std::string GetCurrentWorkspace();
+ // Returns human readable description of the window manager, desktop, and
+ // other system properties related to the compositing.
+ virtual base::Value GetGpuExtraInfoAsListValue(
+ const gfx::GpuExtraInfo& gpu_extra_info);
+
private:
friend class ScopedDisplayForNewWindows;
diff --git a/chromium/ui/display/tablet_state.h b/chromium/ui/display/tablet_state.h
new file mode 100644
index 00000000000..1413fce469e
--- /dev/null
+++ b/chromium/ui/display/tablet_state.h
@@ -0,0 +1,20 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_DISPLAY_TABLET_STATE_H_
+#define UI_DISPLAY_TABLET_STATE_H_
+
+namespace display {
+
+// Tracks whether we are in the process of entering or exiting tablet mode.
+enum class TabletState {
+ kInClamshellMode,
+ kEnteringTabletMode,
+ kInTabletMode,
+ kExitingTabletMode,
+};
+
+} // namespace display
+
+#endif // UI_DISPLAY_TABLET_STATE_H_
diff --git a/chromium/ui/display/types/display_constants.h b/chromium/ui/display/types/display_constants.h
index e131778e7a9..ab139363e7d 100644
--- a/chromium/ui/display/types/display_constants.h
+++ b/chromium/ui/display/types/display_constants.h
@@ -6,6 +6,9 @@
#define UI_DISPLAY_TYPES_DISPLAY_CONSTANTS_H_
#include <stdint.h>
+#include <array>
+
+#include "ui/gfx/geometry/size_conversions.h"
namespace display {
@@ -97,6 +100,121 @@ constexpr char kDsfStr_1_777[] = "1.77777779102325439453125";
constexpr char kDsfStr_2_252[] = "2.2522523403167724609375";
constexpr char kDsfStr_2_666[] = "2.6666667461395263671875";
+// The total number of display zoom factors to enumerate.
+constexpr int kNumOfZoomFactors = 9;
+
+// A pair representing the list of zoom values for a given minimum display
+// resolution width.
+using ZoomListBucket = std::pair<int, std::array<float, kNumOfZoomFactors>>;
+
+// A pair representing the list of zoom values for a given minimum default dsf.
+using ZoomListBucketDsf =
+ std::pair<float, std::array<float, kNumOfZoomFactors>>;
+
+// For displays with a device scale factor of unity, we use a static list of
+// initialized zoom values. For a given resolution width of a display, we can
+// find its associated list of zoom values by simply finding the last bucket
+// with a width less than the given resolution width.
+// Ex. A resolution width of 1024, we will use the bucket with the width of 960.
+constexpr std::array<ZoomListBucket, 8> kZoomListBuckets{{
+ {0, {0.60f, 0.65f, 0.70f, 0.75f, 0.80f, 0.85f, 0.90f, 0.95f, 1.f}},
+ {720, {0.70f, 0.75f, 0.80f, 0.85f, 0.90f, 0.95f, 1.f, 1.05f, 1.10f}},
+ {800, {0.75f, 0.80f, 0.85f, 0.90f, 0.95f, 1.f, 1.05f, 1.10f, 1.15f}},
+ {960, {0.90f, 0.95f, 1.f, 1.05f, 1.10f, 1.15f, 1.20f, 1.25f, 1.30f}},
+ {1280, {0.90f, 1.f, 1.05f, 1.10f, 1.15f, 1.20f, 1.25f, 1.30f, 1.50f}},
+ {1920, {1.f, 1.10f, 1.15f, 1.20f, 1.30f, 1.40f, 1.50f, 1.75f, 2.00f}},
+ {3840, {1.f, 1.10f, 1.20f, 1.40f, 1.60f, 1.80f, 2.00f, 2.20f, 2.40f}},
+ {5120, {1.f, 1.25f, 1.50f, 1.75f, 2.00f, 2.25f, 2.50f, 2.75f, 3.00f}},
+}};
+
+// Displays with a default device scale factor have a static list of initialized
+// zoom values that includes a zoom level to go to the native resolution of the
+// display. Ensure that the list of DSFs are in sync with the list of default
+// device scale factors in display_change_observer.cc.
+constexpr std::array<ZoomListBucketDsf, 7> kZoomListBucketsForDsf{{
+ {1.25f, {0.7f, 1.f / 1.25f, 0.85f, 0.9f, 0.95f, 1.f, 1.1f, 1.2f, 1.3f}},
+ {1.6f, {1.f / 1.6f, 0.7f, 0.75f, 0.8f, 0.85f, 0.9f, 1.f, 1.15f, 1.3f}},
+ {kDsf_1_777,
+ {1.f / kDsf_1_777, 0.65f, 0.75f, 0.8f, 0.9f, 1.f, 1.1f, 1.2f, 1.3f}},
+ {2.f, {1.f / 2.f, 0.6f, 0.7f, 0.8f, 0.9f, 1.f, 1.1f, 1.25f, 1.5f}},
+ {kDsf_2_252,
+ {1.f / kDsf_2_252, 0.6f, 0.7f, 0.8f, 0.9f, 1.f, 1.15f, 1.3f, 1.5f}},
+ {2.4f, {1.f / 2.4f, 0.5f, 0.6f, 0.8f, 0.9f, 1.f, 1.2f, 1.35f, 1.5f}},
+ {kDsf_2_666,
+ {1.f / kDsf_2_666, 0.5f, 0.6f, 0.8f, 0.9f, 1.f, 1.2f, 1.35f, 1.5f}},
+}};
+
+// Valid Displays
+constexpr gfx::Size kWXGA_768{1366, 768};
+constexpr gfx::Size kWXGA_800{1280, 800};
+constexpr gfx::Size kHD_PLUS{1600, 900};
+constexpr gfx::Size kFHD{1920, 1080};
+constexpr gfx::Size kWUXGA{1920, 1200};
+// Dru
+constexpr gfx::Size kQXGA_P{1536, 2048};
+constexpr gfx::Size kQHD{2560, 1440};
+// Chell
+constexpr gfx::Size kQHD_PLUS{3200, 1800};
+constexpr gfx::Size kUHD{3840, 2160};
+
+// Chromebook special panels
+constexpr gfx::Size kLux{2160, 1440};
+constexpr gfx::Size kAkaliQHD{2256, 1504};
+constexpr gfx::Size kLink{2560, 1700};
+constexpr gfx::Size kEveDisplay{2400, 1600};
+constexpr gfx::Size kNocturne{3000, 2000};
+
+enum SizeErrorCheckType {
+ kExact, // Exact match.
+ kEpsilon, // Matches within epsilon.
+ kSkip, // Skip testing the error.
+};
+
+constexpr struct Data {
+ const float diagonal_size;
+ const gfx::Size resolution;
+ const float expected_dsf;
+ const gfx::Size expected_dp_size;
+ const bool bad_range;
+ const SizeErrorCheckType screenshot_size_error;
+} display_configs[] = {
+ // clang-format off
+ // inch, resolution, DSF, size in DP, Bad range, size error
+ {10.1f, kWXGA_800, 1.f, kWXGA_800, false, kExact},
+ {12.1f, kWXGA_800, 1.f, kWXGA_800, true, kExact},
+ {11.6f, kWXGA_768, 1.f, kWXGA_768, false, kExact},
+ {13.3f, kWXGA_768, 1.f, kWXGA_768, true, kExact},
+ {14.f, kWXGA_768, 1.f, kWXGA_768, true, kExact},
+ {15.6f, kWXGA_768, 1.f, kWXGA_768, true, kExact},
+ {9.7f, kQXGA_P, 2.0f, {768, 1024}, false, kExact},
+ {11.6f, kFHD, 1.6f, {1200, 675}, false, kExact},
+ {13.0f, kFHD, 1.25f, {1536, 864}, true, kExact},
+ {13.3f, kFHD, 1.25f, {1536, 864}, true, kExact},
+ {14.f, kFHD, 1.25f, {1536, 864}, false, kExact},
+ {10.1f, kWUXGA, kDsf_1_777, {1080, 675}, false, kExact},
+ {12.2f, kWUXGA, 1.6f, {1200, 750}, false, kExact},
+ {15.6f, kWUXGA, 1.f, kWUXGA, false, kExact},
+ {12.3f, kQHD, 2.f, {1280, 720}, false, kExact},
+
+ // Non standard panels
+ {11.0f, kLux, 2.f, {1080, 720}, false, kExact},
+ {12.02f, kLux, 1.6f, {1350, 900}, true, kExact},
+ {13.3f, kQHD_PLUS, 2.f, {1600, 900}, false, kSkip},
+ {13.3f, kAkaliQHD, 1.6f, {1410, 940}, false, kExact},
+ {12.3f, kEveDisplay,2.0f, {1200, 800}, false, kExact},
+ {12.85f, kLink, 2.0f, {1280, 850}, false, kExact},
+ {12.3f, kNocturne, kDsf_2_252, {1332, 888}, false, kEpsilon},
+ {13.1f, kUHD, kDsf_2_666, {1440, 810}, false, kExact},
+ {15.6f, kUHD, 2.4f, {1600, 900}, false, kEpsilon},
+
+ // Chromebase
+ {19.5, kHD_PLUS, 1.f, kHD_PLUS, true, kExact},
+ {21.5f, kFHD, 1.f, kFHD, true, kExact},
+ {23.8f, kFHD, 1.f, kFHD, true, kExact},
+
+ // clang-format on
+};
+
} // namespace display
#endif // UI_DISPLAY_TYPES_DISPLAY_CONSTANTS_H_
diff --git a/chromium/ui/display/win/color_profile_reader.cc b/chromium/ui/display/win/color_profile_reader.cc
index 495fb5b1b86..f24a8309033 100644
--- a/chromium/ui/display/win/color_profile_reader.cc
+++ b/chromium/ui/display/win/color_profile_reader.cc
@@ -23,14 +23,14 @@ BOOL CALLBACK EnumMonitorForProfilePathCallback(HMONITOR monitor,
HDC input_hdc,
LPRECT rect,
LPARAM data) {
- base::string16 device_name;
+ std::wstring device_name;
MONITORINFOEX monitor_info;
::ZeroMemory(&monitor_info, sizeof(monitor_info));
monitor_info.cbSize = sizeof(monitor_info);
::GetMonitorInfo(monitor, &monitor_info);
- device_name = base::string16(monitor_info.szDevice);
+ device_name = std::wstring(monitor_info.szDevice);
- base::string16 profile_path;
+ std::wstring profile_path;
HDC hdc = ::CreateDC(monitor_info.szDevice, NULL, NULL, NULL);
if (hdc) {
DWORD path_length = MAX_PATH;
@@ -38,11 +38,11 @@ BOOL CALLBACK EnumMonitorForProfilePathCallback(HMONITOR monitor,
BOOL result = ::GetICMProfile(hdc, &path_length, path);
::DeleteDC(hdc);
if (result)
- profile_path = base::string16(path);
+ profile_path = std::wstring(path);
}
- std::map<base::string16, base::string16>* device_to_path_map =
- reinterpret_cast<std::map<base::string16, base::string16>*>(data);
+ std::map<std::wstring, std::wstring>* device_to_path_map =
+ reinterpret_cast<std::map<std::wstring, std::wstring>*>(data);
(*device_to_path_map)[device_name] = profile_path;
return TRUE;
}
@@ -113,8 +113,8 @@ ColorProfileReader::ReadProfilesOnBackgroundThread(
DeviceToPathMap new_device_to_path_map) {
DeviceToDataMap new_device_to_data_map;
for (auto entry : new_device_to_path_map) {
- const base::string16& device_name = entry.first;
- const base::string16& profile_path = entry.second;
+ const std::wstring& device_name = entry.first;
+ const std::wstring& profile_path = entry.second;
std::string profile_data;
base::ReadFileToString(base::FilePath(profile_path), &profile_data);
new_device_to_data_map[device_name] = profile_data;
@@ -129,7 +129,7 @@ void ColorProfileReader::ReadProfilesCompleted(
display_id_to_profile_map_.clear();
for (auto entry : device_to_data_map) {
- const base::string16& device_name = entry.first;
+ const std::wstring& device_name = entry.first;
const std::string& profile_data = entry.second;
if (!profile_data.empty()) {
int64_t display_id =
diff --git a/chromium/ui/display/win/color_profile_reader.h b/chromium/ui/display/win/color_profile_reader.h
index 417c56bd511..f0adfafa2d0 100644
--- a/chromium/ui/display/win/color_profile_reader.h
+++ b/chromium/ui/display/win/color_profile_reader.h
@@ -7,7 +7,6 @@
#include "base/callback.h"
#include "base/memory/weak_ptr.h"
-#include "base/strings/string16.h"
#include "ui/display/display_export.h"
#include "ui/gfx/icc_profile.h"
@@ -42,8 +41,8 @@ class DISPLAY_EXPORT ColorProfileReader {
gfx::ColorSpace GetDisplayColorSpace(int64_t id) const;
private:
- typedef std::map<base::string16, base::string16> DeviceToPathMap;
- typedef std::map<base::string16, std::string> DeviceToDataMap;
+ typedef std::map<std::wstring, std::wstring> DeviceToPathMap;
+ typedef std::map<std::wstring, std::string> DeviceToDataMap;
// Enumerate displays and return a map to their ICC profile path. This
// needs to be run off of the main thread.
diff --git a/chromium/ui/display/win/screen_win.cc b/chromium/ui/display/win/screen_win.cc
index f5064d1b53d..4b6c82f9877 100644
--- a/chromium/ui/display/win/screen_win.cc
+++ b/chromium/ui/display/win/screen_win.cc
@@ -10,7 +10,7 @@
#include <algorithm>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/metrics/histogram_functions.h"
#include "base/numerics/ranges.h"
#include "base/numerics/safe_conversions.h"
diff --git a/chromium/ui/events/BUILD.gn b/chromium/ui/events/BUILD.gn
index cd2ca4ccc0e..f5fc2f2c48d 100644
--- a/chromium/ui/events/BUILD.gn
+++ b/chromium/ui/events/BUILD.gn
@@ -3,10 +3,10 @@
# found in the LICENSE file.
import("//build/config/features.gni")
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")
import("//ui/base/ui_features.gni")
-import("//ui/ozone/ozone.gni")
if (is_android) {
import("//build/config/android/rules.gni")
@@ -255,6 +255,11 @@ component("events") {
]
}
+ if (is_linux || is_chromeos || is_win) {
+ public += [ "keyboard_event_counter.h" ]
+ sources += [ "keyboard_event_counter.cc" ]
+ }
+
defines = [ "EVENTS_IMPLEMENTATION" ]
public_deps = [
@@ -579,6 +584,9 @@ if (!is_ios) {
"win/modifier_keyboard_hook_win_unittest.cc",
]
}
+ if (is_linux || is_chromeos || is_win) {
+ sources += [ "keyboard_event_counter_unittest.cc" ]
+ }
deps = [
":dom_keyboard_layout",
diff --git a/chromium/ui/events/DIR_METADATA b/chromium/ui/events/DIR_METADATA
new file mode 100644
index 00000000000..27f51aaca29
--- /dev/null
+++ b/chromium/ui/events/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Input"
+} \ No newline at end of file
diff --git a/chromium/ui/events/OWNERS b/chromium/ui/events/OWNERS
index ba90608f11c..230180c6641 100644
--- a/chromium/ui/events/OWNERS
+++ b/chromium/ui/events/OWNERS
@@ -1,5 +1,4 @@
sadrul@chromium.org
# If you're doing structural changes get a review from one of the OWNERS.
-per-file BUILD.gn=*
-# COMPONENT: UI>Input
+per-file BUILD.gn=* \ No newline at end of file
diff --git a/chromium/ui/events/android/DIR_METADATA b/chromium/ui/events/android/DIR_METADATA
new file mode 100644
index 00000000000..1c611eb8201
--- /dev/null
+++ b/chromium/ui/events/android/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Blink>Input"
+}
+team_email: "input-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/events/android/OWNERS b/chromium/ui/events/android/OWNERS
index e19954f9b0a..6e91dc0e07c 100644
--- a/chromium/ui/events/android/OWNERS
+++ b/chromium/ui/events/android/OWNERS
@@ -1,5 +1,2 @@
tdresser@chromium.org
nzolghadr@chromium.org
-
-# TEAM: input-dev@chromium.org
-# COMPONENT: Blink>Input
diff --git a/chromium/ui/events/android/event_handler_android.cc b/chromium/ui/events/android/event_handler_android.cc
index 7124711af47..e74e3e15211 100644
--- a/chromium/ui/events/android/event_handler_android.cc
+++ b/chromium/ui/events/android/event_handler_android.cc
@@ -4,6 +4,8 @@
#include "ui/events/android/event_handler_android.h"
+#include "ui/gfx/geometry/rect.h"
+
namespace ui {
bool EventHandlerAndroid::OnTouchEvent(const MotionEventAndroid& event) {
@@ -56,4 +58,6 @@ void EventHandlerAndroid::OnBrowserControlsHeightChanged() {}
void EventHandlerAndroid::OnControlsResizeViewChanged() {}
+void EventHandlerAndroid::NotifyVirtualKeyboardOverlayRect(
+ const gfx::Rect& keyboard_rect) {}
} // namespace ui
diff --git a/chromium/ui/events/android/event_handler_android.h b/chromium/ui/events/android/event_handler_android.h
index d2eaa35e0f8..99bb3959897 100644
--- a/chromium/ui/events/android/event_handler_android.h
+++ b/chromium/ui/events/android/event_handler_android.h
@@ -9,6 +9,10 @@
#include "base/time/time.h"
#include "ui/events/events_export.h"
+namespace gfx {
+class Rect;
+}
+
namespace ui {
class DragEventAndroid;
@@ -40,6 +44,7 @@ class EVENTS_EXPORT EventHandlerAndroid {
virtual bool DispatchKeyEvent(const KeyEventAndroid& event);
virtual bool ScrollBy(float delta_x, float delta_y);
virtual bool ScrollTo(float x, float y);
+ virtual void NotifyVirtualKeyboardOverlayRect(const gfx::Rect& keyboard_rect);
};
} // namespace ui
diff --git a/chromium/ui/events/blink/DIR_METADATA b/chromium/ui/events/blink/DIR_METADATA
new file mode 100644
index 00000000000..1c611eb8201
--- /dev/null
+++ b/chromium/ui/events/blink/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Blink>Input"
+}
+team_email: "input-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/events/blink/OWNERS b/chromium/ui/events/blink/OWNERS
index c81e7a79ef7..8968c2d706a 100644
--- a/chromium/ui/events/blink/OWNERS
+++ b/chromium/ui/events/blink/OWNERS
@@ -2,6 +2,3 @@ dtapuska@chromium.org
tdresser@chromium.org
bokan@chromium.org
nzolghadr@chromium.org
-
-# TEAM: input-dev@chromium.org
-# COMPONENT: Blink>Input
diff --git a/chromium/ui/events/blink/blink_event_util.cc b/chromium/ui/events/blink/blink_event_util.cc
index c53efe798b9..4a632bfd8da 100644
--- a/chromium/ui/events/blink/blink_event_util.cc
+++ b/chromium/ui/events/blink/blink_event_util.cc
@@ -322,8 +322,8 @@ WebGestureEvent CreateWebGestureEvent(const GestureEventDetails& details,
gesture.SetPositionInWidget(location);
gesture.SetPositionInScreen(raw_location);
- gesture.is_source_touch_event_set_non_blocking =
- details.is_source_touch_event_set_non_blocking();
+ gesture.is_source_touch_event_set_blocking =
+ details.is_source_touch_event_set_blocking();
gesture.primary_pointer_type =
ToWebPointerType(details.primary_pointer_type());
gesture.unique_touch_event_id = unique_touch_event_id;
diff --git a/chromium/ui/events/blink/web_input_event.cc b/chromium/ui/events/blink/web_input_event.cc
index f4f9e8fae3e..a07b99f9d02 100644
--- a/chromium/ui/events/blink/web_input_event.cc
+++ b/chromium/ui/events/blink/web_input_event.cc
@@ -18,7 +18,6 @@
#endif
#if defined(USE_X11)
-#include "ui/gfx/x/x11.h" // nogncheck
#endif
namespace ui {
diff --git a/chromium/ui/events/blink/web_input_event_unittest.cc b/chromium/ui/events/blink/web_input_event_unittest.cc
index cdf8d15293b..e655f2db232 100644
--- a/chromium/ui/events/blink/web_input_event_unittest.cc
+++ b/chromium/ui/events/blink/web_input_event_unittest.cc
@@ -4,8 +4,8 @@
#include "ui/events/blink/web_input_event.h"
-#include <stddef.h>
-#include <stdint.h>
+#include <cstddef>
+#include <cstdint>
#include "base/stl_util.h"
#include "base/test/scoped_feature_list.h"
@@ -21,17 +21,6 @@
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/test/keyboard_layout.h"
-#if defined(USE_X11)
-#include "ui/base/x/x11_util.h" // nogncheck
-#include "ui/events/test/events_test_utils_x11.h" // nogncheck
-#include "ui/events/x/x11_event_translation.h" // nogncheck
-#include "ui/gfx/x/event.h" // nogncheck
-#include "ui/gfx/x/keysyms/keysyms.h" // nogncheck
-#include "ui/gfx/x/x11.h" // nogncheck
-#include "ui/gfx/x/x11_types.h" // nogncheck
-#include "ui/gfx/x/xproto.h" // nogncheck
-#endif
-
namespace ui {
// Checks that MakeWebKeyboardEvent makes a DOM3 spec compliant key event.
@@ -81,66 +70,10 @@ TEST(WebInputEventTest, TestMakeWebKeyboardEvent) {
EXPECT_EQ(static_cast<int>(DomCode::CONTROL_RIGHT), webkit_event.dom_code);
EXPECT_EQ(static_cast<int>(DomKey::CONTROL), webkit_event.dom_key);
}
-#if defined(USE_X11)
- // https://crbug.com/1109112): fix this.
- if (features::IsUsingOzonePlatform())
- return;
- const int kLocationModifiers =
- blink::WebInputEvent::kIsLeft | blink::WebInputEvent::kIsRight;
- ScopedXI2Event xev;
- {
- // Press Ctrl.
- xev.InitKeyEvent(ET_KEY_PRESSED, VKEY_CONTROL, 0);
- auto event = ui::BuildKeyEventFromXEvent(*xev);
- blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(*event);
- // However, modifier bit for Control in |webkit_event| should be set.
- EXPECT_EQ(blink::WebInputEvent::kControlKey,
- webkit_event.GetModifiers() & ~kLocationModifiers);
- }
- {
- // Release Ctrl.
- xev.InitKeyEvent(ET_KEY_RELEASED, VKEY_CONTROL,
- static_cast<uint32_t>(x11::KeyButMask::Control));
- auto event = ui::BuildKeyEventFromXEvent(*xev);
- blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(*event);
- // However, modifier bit for Control in |webkit_event| shouldn't be set.
- EXPECT_EQ(0, webkit_event.GetModifiers() & ~kLocationModifiers);
- }
-#endif
}
TEST(WebInputEventTest, TestMakeWebKeyboardEventWindowsKeyCode) {
-#if defined(USE_X11)
- // https://crbug.com/1109112): enable this.
- if (features::IsUsingOzonePlatform())
- return;
- ScopedXI2Event xev;
- {
- // Press left Ctrl.
- xev.InitKeyEvent(ET_KEY_PRESSED, VKEY_CONTROL, 0);
- x11::Event* x11_event = xev;
- x11_event->As<x11::KeyEvent>()->detail = static_cast<x11::KeyCode>(
- KeycodeConverter::DomCodeToNativeKeycode(DomCode::CONTROL_LEFT));
- auto event = ui::BuildKeyEventFromXEvent(*xev);
- blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(*event);
- EXPECT_EQ(VKEY_CONTROL, webkit_event.windows_key_code);
- }
- {
- // Press right Ctrl.
- xev.InitKeyEvent(ET_KEY_PRESSED, VKEY_CONTROL, 0);
- x11::Event* x11_event = xev;
- x11_event->As<x11::KeyEvent>()->detail = static_cast<x11::KeyCode>(
- KeycodeConverter::DomCodeToNativeKeycode(DomCode::CONTROL_RIGHT));
- auto event = ui::BuildKeyEventFromXEvent(*xev);
- blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(*event);
- EXPECT_EQ(VKEY_CONTROL, webkit_event.windows_key_code);
- }
-#elif defined(OS_WIN)
-// TODO(yusukes): Add tests for win_aura once keyboardEvent() in
-// third_party/WebKit/Source/web/win/WebInputEventFactory.cpp is modified
-// to return VKEY_[LR]XXX instead of VKEY_XXX.
-// https://bugs.webkit.org/show_bug.cgi?id=86694
-#endif
+ ui::ScopedKeyboardLayout keyboard_layout(ui::KEYBOARD_LAYOUT_ENGLISH_US);
{
// Press left Ctrl.
KeyEvent event(ET_KEY_PRESSED, VKEY_CONTROL, DomCode::CONTROL_LEFT,
@@ -155,61 +88,62 @@ TEST(WebInputEventTest, TestMakeWebKeyboardEventWindowsKeyCode) {
blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(event);
EXPECT_EQ(VKEY_CONTROL, webkit_event.windows_key_code);
}
+#if defined(OS_WIN)
+// TODO(yusukes): Add tests for win_aura once keyboardEvent() in
+// third_party/WebKit/Source/web/win/WebInputEventFactory.cpp is modified
+// to return VKEY_[LR]XXX instead of VKEY_XXX.
+// https://bugs.webkit.org/show_bug.cgi?id=86694
+#endif
}
// Checks that MakeWebKeyboardEvent fills a correct keypad modifier.
TEST(WebInputEventTest, TestMakeWebKeyboardEventKeyPadKeyCode) {
-#if defined(USE_X11)
-#define XK(x) XK_##x
-#else
-#define XK(x) 0
-#endif
ui::ScopedKeyboardLayout keyboard_layout(ui::KEYBOARD_LAYOUT_ENGLISH_US);
struct TestCase {
DomCode dom_code; // The physical key (location).
KeyboardCode ui_keycode; // The virtual key code.
- uint32_t x_keysym; // The X11 keysym.
bool expected_result; // true if the event has "isKeyPad" modifier.
} kTesCases[] = {
- {DomCode::DIGIT0, VKEY_0, XK(0), false},
- {DomCode::DIGIT1, VKEY_1, XK(1), false},
- {DomCode::DIGIT2, VKEY_2, XK(2), false},
- {DomCode::DIGIT3, VKEY_3, XK(3), false},
- {DomCode::DIGIT4, VKEY_4, XK(4), false},
- {DomCode::DIGIT5, VKEY_5, XK(5), false},
- {DomCode::DIGIT6, VKEY_6, XK(6), false},
- {DomCode::DIGIT7, VKEY_7, XK(7), false},
- {DomCode::DIGIT8, VKEY_8, XK(8), false},
- {DomCode::DIGIT9, VKEY_9, XK(9), false},
-
- {DomCode::NUMPAD0, VKEY_NUMPAD0, XK(KP_0), true},
- {DomCode::NUMPAD1, VKEY_NUMPAD1, XK(KP_1), true},
- {DomCode::NUMPAD2, VKEY_NUMPAD2, XK(KP_2), true},
- {DomCode::NUMPAD3, VKEY_NUMPAD3, XK(KP_3), true},
- {DomCode::NUMPAD4, VKEY_NUMPAD4, XK(KP_4), true},
- {DomCode::NUMPAD5, VKEY_NUMPAD5, XK(KP_5), true},
- {DomCode::NUMPAD6, VKEY_NUMPAD6, XK(KP_6), true},
- {DomCode::NUMPAD7, VKEY_NUMPAD7, XK(KP_7), true},
- {DomCode::NUMPAD8, VKEY_NUMPAD8, XK(KP_8), true},
- {DomCode::NUMPAD9, VKEY_NUMPAD9, XK(KP_9), true},
-
- {DomCode::NUMPAD_MULTIPLY, VKEY_MULTIPLY, XK(KP_Multiply), true},
- {DomCode::NUMPAD_SUBTRACT, VKEY_SUBTRACT, XK(KP_Subtract), true},
- {DomCode::NUMPAD_ADD, VKEY_ADD, XK(KP_Add), true},
- {DomCode::NUMPAD_DIVIDE, VKEY_DIVIDE, XK(KP_Divide), true},
- {DomCode::NUMPAD_DECIMAL, VKEY_DECIMAL, XK(KP_Decimal), true},
- {DomCode::NUMPAD_DECIMAL, VKEY_DELETE, XK(KP_Delete), true},
- {DomCode::NUMPAD0, VKEY_INSERT, XK(KP_Insert), true},
- {DomCode::NUMPAD1, VKEY_END, XK(KP_End), true},
- {DomCode::NUMPAD2, VKEY_DOWN, XK(KP_Down), true},
- {DomCode::NUMPAD3, VKEY_NEXT, XK(KP_Page_Down), true},
- {DomCode::NUMPAD4, VKEY_LEFT, XK(KP_Left), true},
- {DomCode::NUMPAD5, VKEY_CLEAR, XK(KP_Begin), true},
- {DomCode::NUMPAD6, VKEY_RIGHT, XK(KP_Right), true},
- {DomCode::NUMPAD7, VKEY_HOME, XK(KP_Home), true},
- {DomCode::NUMPAD8, VKEY_UP, XK(KP_Up), true},
- {DomCode::NUMPAD9, VKEY_PRIOR, XK(KP_Page_Up), true},
+ {DomCode::DIGIT0, VKEY_0, false},
+ {DomCode::DIGIT1, VKEY_1, false},
+ {DomCode::DIGIT2, VKEY_2, false},
+ {DomCode::DIGIT3, VKEY_3, false},
+ {DomCode::DIGIT4, VKEY_4, false},
+ {DomCode::DIGIT5, VKEY_5, false},
+ {DomCode::DIGIT6, VKEY_6, false},
+ {DomCode::DIGIT7, VKEY_7, false},
+ {DomCode::DIGIT8, VKEY_8, false},
+ {DomCode::DIGIT9, VKEY_9, false},
+
+ {DomCode::NUMPAD0, VKEY_NUMPAD0, true},
+ {DomCode::NUMPAD1, VKEY_NUMPAD1, true},
+ {DomCode::NUMPAD2, VKEY_NUMPAD2, true},
+ {DomCode::NUMPAD3, VKEY_NUMPAD3, true},
+ {DomCode::NUMPAD4, VKEY_NUMPAD4, true},
+ {DomCode::NUMPAD5, VKEY_NUMPAD5, true},
+ {DomCode::NUMPAD6, VKEY_NUMPAD6, true},
+ {DomCode::NUMPAD7, VKEY_NUMPAD7, true},
+ {DomCode::NUMPAD8, VKEY_NUMPAD8, true},
+ {DomCode::NUMPAD9, VKEY_NUMPAD9, true},
+
+ {DomCode::NUMPAD_MULTIPLY, VKEY_MULTIPLY, true},
+ {DomCode::NUMPAD_SUBTRACT, VKEY_SUBTRACT, true},
+ {DomCode::NUMPAD_ADD, VKEY_ADD, true},
+ {DomCode::NUMPAD_DIVIDE, VKEY_DIVIDE, true},
+ {DomCode::NUMPAD_DECIMAL, VKEY_DECIMAL, true},
+ {DomCode::NUMPAD_DECIMAL, VKEY_DELETE, true},
+ {DomCode::NUMPAD0, VKEY_INSERT, true},
+ {DomCode::NUMPAD1, VKEY_END, true},
+ {DomCode::NUMPAD2, VKEY_DOWN, true},
+ {DomCode::NUMPAD3, VKEY_NEXT, true},
+ {DomCode::NUMPAD4, VKEY_LEFT, true},
+ {DomCode::NUMPAD5, VKEY_CLEAR, true},
+ {DomCode::NUMPAD6, VKEY_RIGHT, true},
+ {DomCode::NUMPAD7, VKEY_HOME, true},
+ {DomCode::NUMPAD8, VKEY_UP, true},
+ {DomCode::NUMPAD9, VKEY_PRIOR, true},
};
+
for (const auto& test_case : kTesCases) {
KeyEvent event(ET_KEY_PRESSED, test_case.ui_keycode, test_case.dom_code,
EF_NONE);
@@ -222,39 +156,6 @@ TEST(WebInputEventTest, TestMakeWebKeyboardEventKeyPadKeyCode) {
<< ", ui_keycode:" << test_case.ui_keycode
<< "}, expect: " << test_case.expected_result;
}
-#if defined(USE_X11)
- // https://crbug.com/1109112): fix this.
- if (features::IsUsingOzonePlatform())
- return;
- ScopedXI2Event xev;
- for (size_t i = 0; i < base::size(kTesCases); ++i) {
- const TestCase& test_case = kTesCases[i];
-
- // TODO: re-enable the two cases excluded here once all trybots
- // are sufficiently up to date to round-trip the associated keys.
- if ((test_case.x_keysym == XK_KP_Divide) ||
- (test_case.x_keysym == XK_KP_Decimal))
- continue;
-
- xev.InitKeyEvent(ET_KEY_PRESSED, test_case.ui_keycode, EF_NONE);
- x11::Event* x11_event = xev;
- auto keycode = x11::Connection::Get()->KeysymToKeycode(
- static_cast<x11::KeySym>(test_case.x_keysym));
- if (keycode == x11::KeyCode{})
- continue;
- x11_event->As<x11::KeyEvent>()->detail = keycode;
- auto event = ui::BuildKeyEventFromXEvent(*xev);
- blink::WebKeyboardEvent webkit_event = MakeWebKeyboardEvent(*event);
- EXPECT_EQ(test_case.expected_result, (webkit_event.GetModifiers() &
- blink::WebInputEvent::kIsKeyPad) != 0)
- << "Failed in " << i << "th test case: "
- << "{dom_code:"
- << KeycodeConverter::DomCodeToCodeString(test_case.dom_code)
- << ", ui_keycode:" << test_case.ui_keycode
- << ", x_keysym:" << test_case.x_keysym
- << "}, expect: " << test_case.expected_result;
- }
-#endif
}
TEST(WebInputEventTest, TestMakeWebMouseEvent) {
diff --git a/chromium/ui/events/devices/x11/BUILD.gn b/chromium/ui/events/devices/x11/BUILD.gn
index 888e18ee8e1..2777382cdfd 100644
--- a/chromium/ui/events/devices/x11/BUILD.gn
+++ b/chromium/ui/events/devices/x11/BUILD.gn
@@ -2,8 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
assert(use_x11 || ozone_platform_x11)
diff --git a/chromium/ui/events/devices/x11/device_data_manager_x11.cc b/chromium/ui/events/devices/x11/device_data_manager_x11.cc
index d83649108bc..274c07950db 100644
--- a/chromium/ui/events/devices/x11/device_data_manager_x11.cc
+++ b/chromium/ui/events/devices/x11/device_data_manager_x11.cc
@@ -9,7 +9,7 @@
#include <utility>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
@@ -25,7 +25,6 @@
#include "ui/events/event_switches.h"
#include "ui/events/keycodes/keyboard_code_conversion_x.h"
#include "ui/gfx/geometry/point3_f.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
// XIScrollClass was introduced in XI 2.1 so we need to define it here
diff --git a/chromium/ui/events/devices/x11/device_data_manager_x11.h b/chromium/ui/events/devices/x11/device_data_manager_x11.h
index 30b97cfd64d..d5a2d867ee8 100644
--- a/chromium/ui/events/devices/x11/device_data_manager_x11.h
+++ b/chromium/ui/events/devices/x11/device_data_manager_x11.h
@@ -20,8 +20,6 @@
#include "ui/events/platform_event.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xinput.h"
namespace ui {
diff --git a/chromium/ui/events/devices/x11/device_list_cache_x11.cc b/chromium/ui/events/devices/x11/device_list_cache_x11.cc
index e0f7e19b6c3..49fe471d79e 100644
--- a/chromium/ui/events/devices/x11/device_list_cache_x11.cc
+++ b/chromium/ui/events/devices/x11/device_list_cache_x11.cc
@@ -8,6 +8,7 @@
#include "base/memory/singleton.h"
#include "ui/events/devices/x11/device_data_manager_x11.h"
+#include "ui/gfx/x/connection.h"
namespace ui {
diff --git a/chromium/ui/events/devices/x11/device_list_cache_x11.h b/chromium/ui/events/devices/x11/device_list_cache_x11.h
index b9c0c3dd2bc..a953a0538b3 100644
--- a/chromium/ui/events/devices/x11/device_list_cache_x11.h
+++ b/chromium/ui/events/devices/x11/device_list_cache_x11.h
@@ -10,7 +10,6 @@
#include "base/macros.h"
#include "ui/events/devices/x11/events_devices_x11_export.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xinput.h"
namespace base {
diff --git a/chromium/ui/events/devices/x11/touch_factory_x11.cc b/chromium/ui/events/devices/x11/touch_factory_x11.cc
index 9b431a65a13..6a811d1a8ff 100644
--- a/chromium/ui/events/devices/x11/touch_factory_x11.cc
+++ b/chromium/ui/events/devices/x11/touch_factory_x11.cc
@@ -20,7 +20,6 @@
#include "ui/events/devices/x11/xinput_util.h"
#include "ui/events/event_switches.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
namespace {
diff --git a/chromium/ui/events/devices/x11/touch_factory_x11.h b/chromium/ui/events/devices/x11/touch_factory_x11.h
index 053631eeca8..254e018c647 100644
--- a/chromium/ui/events/devices/x11/touch_factory_x11.h
+++ b/chromium/ui/events/devices/x11/touch_factory_x11.h
@@ -17,7 +17,6 @@
#include "ui/events/devices/x11/events_devices_x11_export.h"
#include "ui/events/event_constants.h"
#include "ui/gfx/sequential_id_generator.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xinput.h"
namespace base {
diff --git a/chromium/ui/events/event_unittest.cc b/chromium/ui/events/event_unittest.cc
index 2eaaa7e3d1e..79ac1dd3cbf 100644
--- a/chromium/ui/events/event_unittest.cc
+++ b/chromium/ui/events/event_unittest.cc
@@ -11,7 +11,6 @@
#include "base/stl_util.h"
#include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/ui_base_features.h"
@@ -25,14 +24,6 @@
#include "ui/events/test/test_event_target.h"
#include "ui/gfx/transform.h"
-#if defined(USE_X11)
-#include "ui/events/test/events_test_utils_x11.h"
-#include "ui/events/x/x11_event_translation.h" // nogncheck
-#include "ui/gfx/x/event.h" // nogncheck
-#include "ui/gfx/x/x11.h" // nogncheck
-#include "ui/gfx/x/x11_types.h" // nogncheck
-#endif
-
namespace ui {
TEST(EventTest, NoNativeEvent) {
@@ -46,14 +37,6 @@ TEST(EventTest, NativeEvent) {
KeyEvent keyev(native_event);
EXPECT_TRUE(keyev.HasNativeEvent());
#endif
-#if defined(USE_X11)
- if (!features::IsUsingOzonePlatform()) {
- ScopedXI2Event event;
- event.InitKeyEvent(ET_KEY_RELEASED, VKEY_A, EF_NONE);
- auto keyev = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_FALSE(keyev->HasNativeEvent());
- }
-#endif
}
TEST(EventTest, GetCharacter) {
@@ -66,20 +49,6 @@ TEST(EventTest, GetCharacter) {
KeyEvent keyev2(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE);
EXPECT_EQ(13, keyev2.GetCharacter());
-#if defined(USE_X11)
- if (!features::IsUsingOzonePlatform()) {
- // For X11, test the functions with native_event() as well. crbug.com/107837
- ScopedXI2Event event;
- event.InitKeyEvent(ET_KEY_PRESSED, VKEY_RETURN, EF_CONTROL_DOWN);
- auto keyev3 = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_EQ(10, keyev3->GetCharacter());
-
- event.InitKeyEvent(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE);
- auto keyev4 = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_EQ(13, keyev4->GetCharacter());
- }
-#endif
-
// Check if expected Unicode character was returned for a key combination
// contains Control.
// e.g. Control+Shift+2 produces U+200C on "Persian" keyboard.
@@ -320,43 +289,6 @@ TEST(EventTest, KeyEventDirectUnicode) {
}
TEST(EventTest, NormalizeKeyEventFlags) {
-#if defined(USE_X11)
- if (!features::IsUsingOzonePlatform()) {
- // Normalize flags when KeyEvent is created from XEvent.
- ScopedXI2Event event;
- {
- event.InitKeyEvent(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN);
- auto keyev = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_EQ(EF_SHIFT_DOWN, keyev->flags());
- }
- {
- event.InitKeyEvent(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN);
- auto keyev = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_EQ(EF_NONE, keyev->flags());
- }
- {
- event.InitKeyEvent(ET_KEY_PRESSED, VKEY_CONTROL, EF_CONTROL_DOWN);
- auto keyev = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_EQ(EF_CONTROL_DOWN, keyev->flags());
- }
- {
- event.InitKeyEvent(ET_KEY_RELEASED, VKEY_CONTROL, EF_CONTROL_DOWN);
- auto keyev = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_EQ(EF_NONE, keyev->flags());
- }
- {
- event.InitKeyEvent(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN);
- auto keyev = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_EQ(EF_ALT_DOWN, keyev->flags());
- }
- {
- event.InitKeyEvent(ET_KEY_RELEASED, VKEY_MENU, EF_ALT_DOWN);
- auto keyev = ui::BuildKeyEventFromXEvent(*event);
- EXPECT_EQ(EF_NONE, keyev->flags());
- }
- }
-#endif
-
// Do not normalize flags for synthesized events without
// KeyEvent::NormalizeFlags called explicitly.
{
@@ -425,15 +357,6 @@ TEST(EventTest, KeyEventCode) {
KeyEvent key(ET_KEY_PRESSED, VKEY_SPACE, EF_NONE);
EXPECT_EQ(kCodeForSpace, key.GetCodeString());
}
-#if defined(USE_X11)
- if (!features::IsUsingOzonePlatform()) {
- // KeyEvent converts from the native keycode (XKB) to the code.
- ScopedXI2Event xevent;
- xevent.InitKeyEvent(ET_KEY_PRESSED, VKEY_SPACE, kNativeCodeSpace);
- auto keyev = ui::BuildKeyEventFromXEvent(*xevent);
- EXPECT_EQ(kCodeForSpace, keyev->GetCodeString());
- }
-#endif // USE_X11
#if defined(OS_WIN)
{
// Test a non extended key.
@@ -463,135 +386,6 @@ TEST(EventTest, KeyEventCode) {
#endif // OS_WIN
}
-#if defined(USE_X11)
-namespace {
-
-void SetKeyEventTimestamp(x11::Event* event, int64_t time64) {
- uint32_t time = time64 & UINT32_MAX;
- event->As<x11::KeyEvent>()->time = static_cast<x11::Time>(time);
-}
-
-void AdvanceKeyEventTimestamp(x11::Event* event) {
- auto time = static_cast<uint32_t>(event->As<x11::KeyEvent>()->time) + 1;
- event->As<x11::KeyEvent>()->time = static_cast<x11::Time>(time);
-}
-
-} // namespace
-
-TEST(EventTest, AutoRepeat) {
- if (features::IsUsingOzonePlatform())
- return;
- const uint16_t kNativeCodeA =
- ui::KeycodeConverter::DomCodeToNativeKeycode(DomCode::US_A);
- const uint16_t kNativeCodeB =
- ui::KeycodeConverter::DomCodeToNativeKeycode(DomCode::US_B);
-
- ScopedXI2Event native_event_a_pressed;
- native_event_a_pressed.InitKeyEvent(ET_KEY_PRESSED, VKEY_A, kNativeCodeA);
- ScopedXI2Event native_event_a_pressed_1500;
- native_event_a_pressed_1500.InitKeyEvent(ET_KEY_PRESSED, VKEY_A,
- kNativeCodeA);
- ScopedXI2Event native_event_a_pressed_3000;
- native_event_a_pressed_3000.InitKeyEvent(ET_KEY_PRESSED, VKEY_A,
- kNativeCodeA);
-
- ScopedXI2Event native_event_a_released;
- native_event_a_released.InitKeyEvent(ET_KEY_RELEASED, VKEY_A, kNativeCodeA);
- ScopedXI2Event native_event_b_pressed;
- native_event_b_pressed.InitKeyEvent(ET_KEY_PRESSED, VKEY_B, kNativeCodeB);
- ScopedXI2Event native_event_a_pressed_nonstandard_state;
- native_event_a_pressed_nonstandard_state.InitKeyEvent(ET_KEY_PRESSED, VKEY_A,
- kNativeCodeA);
- // IBUS-GTK uses the mask (1 << 25) to detect reposted event.
- {
- x11::Event& event = *native_event_a_pressed_nonstandard_state;
- int mask = static_cast<int>(event.As<x11::KeyEvent>()->state) | 1 << 25;
- event.As<x11::KeyEvent>()->state = static_cast<x11::KeyButMask>(mask);
- }
-
- int64_t ticks_base =
- (base::TimeTicks::Now() - base::TimeTicks()).InMilliseconds() - 5000;
- SetKeyEventTimestamp(native_event_a_pressed, ticks_base);
- SetKeyEventTimestamp(native_event_a_pressed_1500, ticks_base + 1500);
- SetKeyEventTimestamp(native_event_a_pressed_3000, ticks_base + 3000);
-
- {
- auto key_a1 = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_FALSE(key_a1->is_repeat());
-
- auto key_a1_released = BuildKeyEventFromXEvent(*native_event_a_released);
- EXPECT_FALSE(key_a1_released->is_repeat());
-
- auto key_a2 = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_FALSE(key_a2->is_repeat());
-
- AdvanceKeyEventTimestamp(native_event_a_pressed);
- auto key_a2_repeated = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_TRUE(key_a2_repeated->is_repeat());
-
- auto key_a2_released = BuildKeyEventFromXEvent(*native_event_a_released);
- EXPECT_FALSE(key_a2_released->is_repeat());
- }
-
- // Interleaved with different key press.
- {
- auto key_a3 = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_FALSE(key_a3->is_repeat());
-
- auto key_b = BuildKeyEventFromXEvent(*native_event_b_pressed);
- EXPECT_FALSE(key_b->is_repeat());
-
- AdvanceKeyEventTimestamp(native_event_a_pressed);
- auto key_a3_again = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_FALSE(key_a3_again->is_repeat());
-
- AdvanceKeyEventTimestamp(native_event_a_pressed);
- auto key_a3_repeated = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_TRUE(key_a3_repeated->is_repeat());
-
- AdvanceKeyEventTimestamp(native_event_a_pressed);
- auto key_a3_repeated2 = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_TRUE(key_a3_repeated2->is_repeat());
-
- auto key_a3_released = BuildKeyEventFromXEvent(*native_event_a_released);
- EXPECT_FALSE(key_a3_released->is_repeat());
- }
-
- // Hold the key longer than max auto repeat timeout.
- {
- auto key_a4_0 = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_FALSE(key_a4_0->is_repeat());
-
- auto key_a4_1500 = BuildKeyEventFromXEvent(*native_event_a_pressed_1500);
- EXPECT_TRUE(key_a4_1500->is_repeat());
-
- auto key_a4_3000 = BuildKeyEventFromXEvent(*native_event_a_pressed_3000);
- EXPECT_TRUE(key_a4_3000->is_repeat());
-
- auto key_a4_released = BuildKeyEventFromXEvent(*native_event_a_released);
- EXPECT_FALSE(key_a4_released->is_repeat());
- }
-
- {
- auto key_a4_pressed = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_FALSE(key_a4_pressed->is_repeat());
-
- auto key_a4_pressed_nonstandard_state =
- BuildKeyEventFromXEvent(*native_event_a_pressed_nonstandard_state);
- EXPECT_FALSE(key_a4_pressed_nonstandard_state->is_repeat());
- }
-
- {
- auto key_a1 = BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_FALSE(key_a1->is_repeat());
-
- auto key_a1_with_same_event =
- BuildKeyEventFromXEvent(*native_event_a_pressed);
- EXPECT_FALSE(key_a1_with_same_event->is_repeat());
- }
-}
-#endif // USE_X11
-
TEST(EventTest, TouchEventRadiusDefaultsToOtherAxis) {
const base::TimeTicks time = base::TimeTicks::Now();
const float non_zero_length1 = 30;
@@ -853,37 +647,6 @@ TEST(EventTest, OrdinalMotionConversion) {
EXPECT_FALSE(mouseev3.flags() & EF_UNADJUSTED_MOUSE);
}
-// Checks that Event.Latency.OS.TOUCH_PRESSED, TOUCH_MOVED,
-// and TOUCH_RELEASED histograms are computed properly.
-#if defined(USE_X11)
-TEST(EventTest, EventLatencyOSTouchHistograms) {
- if (features::IsUsingOzonePlatform())
- return;
- base::HistogramTester histogram_tester;
- ScopedXI2Event scoped_xevent;
-
- // SetUp for test
- DeviceDataManagerX11::CreateInstance();
- std::vector<int> devices;
- devices.push_back(0);
- ui::SetUpTouchDevicesForTest(devices);
-
- // Init touch begin, update, and end events with tracking id 5, touch id 0.
- scoped_xevent.InitTouchEvent(0, x11::Input::DeviceEvent::TouchBegin, 5,
- gfx::Point(10, 10), {});
- auto touch_begin = ui::BuildTouchEventFromXEvent(*scoped_xevent);
- histogram_tester.ExpectTotalCount("Event.Latency.OS.TOUCH_PRESSED", 1);
- scoped_xevent.InitTouchEvent(0, x11::Input::DeviceEvent::TouchUpdate, 5,
- gfx::Point(20, 20), {});
- auto touch_update = ui::BuildTouchEventFromXEvent(*scoped_xevent);
- histogram_tester.ExpectTotalCount("Event.Latency.OS.TOUCH_MOVED", 1);
- scoped_xevent.InitTouchEvent(0, x11::Input::DeviceEvent::TouchEnd, 5,
- gfx::Point(30, 30), {});
- auto touch_end = ui::BuildTouchEventFromXEvent(*scoped_xevent);
- histogram_tester.ExpectTotalCount("Event.Latency.OS.TOUCH_RELEASED", 1);
-}
-#endif
-
// Checks that Event.Latency.OS.MOUSE_WHEEL histogram is computed properly.
TEST(EventTest, EventLatencyOSMouseWheelHistogram) {
#if defined(OS_WIN)
@@ -892,22 +655,6 @@ TEST(EventTest, EventLatencyOSMouseWheelHistogram) {
MouseWheelEvent mouseWheelEvent(event);
histogram_tester.ExpectTotalCount("Event.Latency.OS.MOUSE_WHEEL", 1);
#endif
-#if defined(USE_X11)
- if (features::IsUsingOzonePlatform())
- return;
- base::HistogramTester histogram_tester;
- DeviceDataManagerX11::CreateInstance();
-
- // Initializes a native event and uses it to generate a MouseWheel event.
- xcb_generic_event_t ge;
- memset(&ge, 0, sizeof(ge));
- auto* button = reinterpret_cast<xcb_button_press_event_t*>(&ge);
- button->response_type = x11::ButtonEvent::Press;
- button->detail = 4; // A valid wheel button number between min and max.
- x11::Event native_event(&ge, x11::Connection::Get());
- auto mouse_ev = ui::BuildMouseWheelEventFromXEvent(native_event);
- histogram_tester.ExpectTotalCount("Event.Latency.OS.MOUSE_WHEEL", 1);
-#endif
}
TEST(EventTest, UpdateForRootTransformation) {
diff --git a/chromium/ui/events/fuchsia/DIR_METADATA b/chromium/ui/events/fuchsia/DIR_METADATA
new file mode 100644
index 00000000000..de0c11f0bd6
--- /dev/null
+++ b/chromium/ui/events/fuchsia/DIR_METADATA
@@ -0,0 +1,13 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Fuchsia"
+}
+team_email: "cr-fuchsia@chromium.org"
+os: FUCHSIA \ No newline at end of file
diff --git a/chromium/ui/events/fuchsia/OWNERS b/chromium/ui/events/fuchsia/OWNERS
index c1dc0d5fc15..e69de29bb2d 100644
--- a/chromium/ui/events/fuchsia/OWNERS
+++ b/chromium/ui/events/fuchsia/OWNERS
@@ -1,3 +0,0 @@
-# COMPONENT: Fuchsia
-# OS: Fuchsia
-# TEAM: cr-fuchsia@chromium.org
diff --git a/chromium/ui/events/gesture_detection/DIR_METADATA b/chromium/ui/events/gesture_detection/DIR_METADATA
new file mode 100644
index 00000000000..1c611eb8201
--- /dev/null
+++ b/chromium/ui/events/gesture_detection/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Blink>Input"
+}
+team_email: "input-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/events/gesture_detection/OWNERS b/chromium/ui/events/gesture_detection/OWNERS
index 7d088914c89..234d0596f10 100644
--- a/chromium/ui/events/gesture_detection/OWNERS
+++ b/chromium/ui/events/gesture_detection/OWNERS
@@ -3,6 +3,3 @@ nzolghadr@chromium.org
per-file gesture_configuration_cast.cc=alexst@chromium.org
per-file gesture_configuration_cast.cc=kpschoedel@chromium.org
-
-# TEAM: input-dev@chromium.org
-# COMPONENT: Blink>Input
diff --git a/chromium/ui/events/gesture_detection/filtered_gesture_provider.cc b/chromium/ui/events/gesture_detection/filtered_gesture_provider.cc
index 8a449deddca..efde83eae72 100644
--- a/chromium/ui/events/gesture_detection/filtered_gesture_provider.cc
+++ b/chromium/ui/events/gesture_detection/filtered_gesture_provider.cc
@@ -60,9 +60,9 @@ FilteredGestureProvider::OnTouchEvent(const MotionEvent& event) {
void FilteredGestureProvider::OnTouchEventAck(
uint32_t unique_event_id,
bool event_consumed,
- bool is_source_touch_event_set_non_blocking) {
+ bool is_source_touch_event_set_blocking) {
gesture_filter_.OnTouchEventAck(unique_event_id, event_consumed,
- is_source_touch_event_set_non_blocking);
+ is_source_touch_event_set_blocking);
}
void FilteredGestureProvider::ResetGestureHandlingState() {
diff --git a/chromium/ui/events/gesture_detection/filtered_gesture_provider.h b/chromium/ui/events/gesture_detection/filtered_gesture_provider.h
index 14718904d29..3595c8aeb67 100644
--- a/chromium/ui/events/gesture_detection/filtered_gesture_provider.h
+++ b/chromium/ui/events/gesture_detection/filtered_gesture_provider.h
@@ -18,7 +18,7 @@ namespace ui {
// Provides filtered gesture detection and dispatch given a sequence of touch
// events and touch event acks.
-class GESTURE_DETECTION_EXPORT FilteredGestureProvider
+class GESTURE_DETECTION_EXPORT FilteredGestureProvider final
: public ui::TouchDispositionGestureFilterClient,
public ui::GestureProviderClient {
public:
@@ -47,7 +47,7 @@ class GESTURE_DETECTION_EXPORT FilteredGestureProvider
// forwarded after a successful call to |OnTouchEvent()|.
void OnTouchEventAck(uint32_t unique_event_id,
bool event_consumed,
- bool is_source_touch_event_set_non_blocking);
+ bool is_source_touch_event_set_blocking);
void ResetGestureHandlingState();
diff --git a/chromium/ui/events/gesture_detection/gesture_event_data_packet.cc b/chromium/ui/events/gesture_detection/gesture_event_data_packet.cc
index 8f17e254d0a..84a35cc7731 100644
--- a/chromium/ui/events/gesture_detection/gesture_event_data_packet.cc
+++ b/chromium/ui/events/gesture_detection/gesture_event_data_packet.cc
@@ -113,12 +113,12 @@ GestureEventDataPacket GestureEventDataPacket::FromTouchTimeout(
}
void GestureEventDataPacket::Ack(bool event_consumed,
- bool is_source_touch_event_set_non_blocking) {
+ bool is_source_touch_event_set_blocking) {
DCHECK_EQ(static_cast<int>(ack_state_), static_cast<int>(AckState::PENDING));
ack_state_ = event_consumed ? AckState::CONSUMED : AckState::UNCONSUMED;
for (auto& gesture : gestures_.container()) {
- gesture.details.set_is_source_touch_event_set_non_blocking(
- is_source_touch_event_set_non_blocking);
+ gesture.details.set_is_source_touch_event_set_blocking(
+ is_source_touch_event_set_blocking);
}
}
diff --git a/chromium/ui/events/gesture_detection/gesture_event_data_packet.h b/chromium/ui/events/gesture_detection/gesture_event_data_packet.h
index d408ba1f69f..f5f3234fc8a 100644
--- a/chromium/ui/events/gesture_detection/gesture_event_data_packet.h
+++ b/chromium/ui/events/gesture_detection/gesture_event_data_packet.h
@@ -61,7 +61,7 @@ class GESTURE_DETECTION_EXPORT GestureEventDataPacket {
// We store the ack with the packet until the packet reaches the
// head of the queue, and then we handle the ack.
- void Ack(bool event_consumed, bool is_source_touch_event_set_non_blocking);
+ void Ack(bool event_consumed, bool is_source_touch_event_set_blocking);
AckState ack_state() { return ack_state_; }
uint32_t unique_touch_event_id() const { return unique_touch_event_id_; }
diff --git a/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.cc b/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
index c240bbdc4c1..5423c7ad40a 100644
--- a/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
+++ b/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
@@ -194,7 +194,7 @@ TouchDispositionGestureFilter::OnGesturePacket(
void TouchDispositionGestureFilter::OnTouchEventAck(
uint32_t unique_touch_event_id,
bool event_consumed,
- bool is_source_touch_event_set_non_blocking) {
+ bool is_source_touch_event_set_blocking) {
// Spurious asynchronous acks should not trigger a crash.
if (IsEmpty() || (Head().empty() && sequences_.size() == 1))
return;
@@ -207,13 +207,13 @@ void TouchDispositionGestureFilter::OnTouchEventAck(
if (!Tail().empty() &&
Tail().back().unique_touch_event_id() == unique_touch_event_id &&
Tail().back().gesture_source() != GestureEventDataPacket::TOUCH_TIMEOUT) {
- Tail().back().Ack(event_consumed, is_source_touch_event_set_non_blocking);
+ Tail().back().Ack(event_consumed, is_source_touch_event_set_blocking);
if (sequences_.size() == 1 && Tail().size() == 1)
SendAckedEvents();
} else {
DCHECK(!Head().empty());
DCHECK_EQ(Head().front().unique_touch_event_id(), unique_touch_event_id);
- Head().front().Ack(event_consumed, is_source_touch_event_set_non_blocking);
+ Head().front().Ack(event_consumed, is_source_touch_event_set_blocking);
SendAckedEvents();
}
}
diff --git a/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.h b/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.h
index fd9fa50509f..668cd0306bd 100644
--- a/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.h
+++ b/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter.h
@@ -47,7 +47,7 @@ class GESTURE_DETECTION_EXPORT TouchDispositionGestureFilter {
// OnTouchEventAck must be called upon receipt of every touch event ack.
void OnTouchEventAck(uint32_t unique_touch_event_id,
bool event_consumed,
- bool is_source_touch_event_set_non_blocking);
+ bool is_source_touch_event_set_blocking);
// Whether there are any active gesture sequences still queued in the filter.
bool IsEmpty() const;
diff --git a/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc b/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
index e66ccb8d0eb..033571cb77c 100644
--- a/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
+++ b/chromium/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
@@ -142,29 +142,29 @@ class TouchDispositionGestureFilterTest
void SendTouchEventAck(uint32_t touch_event_id,
bool event_consumed,
- bool is_source_touch_event_set_non_blocking) {
+ bool is_source_touch_event_set_blocking) {
queue_->OnTouchEventAck(touch_event_id, event_consumed,
- is_source_touch_event_set_non_blocking);
+ is_source_touch_event_set_blocking);
}
void SendTouchConsumedAck(uint32_t touch_event_id) {
SendTouchEventAck(touch_event_id, true /* event_consumed */,
- false /* is_source_touch_event_set_non_blocking */);
+ false /* is_source_touch_event_set_blocking */);
}
void SendTouchNotConsumedAck(uint32_t touch_event_id) {
SendTouchEventAck(touch_event_id, false /* event_consumed */,
- false /* is_source_touch_event_set_non_blocking */);
+ false /* is_source_touch_event_set_blocking */);
}
void SendTouchConsumedAckForLastTouch() {
SendTouchEventAck(last_sent_touch_event_id_, true /* event_consumed */,
- false /* is_source_touch_event_set_non_blocking */);
+ false /* is_source_touch_event_set_blocking */);
}
void SendTouchNotConsumedAckForLastTouch() {
SendTouchEventAck(last_sent_touch_event_id_, false /* event_consumed */,
- false /* is_source_touch_event_set_non_blocking */);
+ false /* is_source_touch_event_set_blocking */);
}
void PushGesture(EventType type) {
diff --git a/chromium/ui/events/gesture_event_details.h b/chromium/ui/events/gesture_event_details.h
index d20416738bd..668f07489eb 100644
--- a/chromium/ui/events/gesture_event_details.h
+++ b/chromium/ui/events/gesture_event_details.h
@@ -39,13 +39,12 @@ struct EVENTS_BASE_EXPORT GestureEventDetails {
device_type_ = device_type;
}
- bool is_source_touch_event_set_non_blocking() const {
- return is_source_touch_event_set_non_blocking_;
+ bool is_source_touch_event_set_blocking() const {
+ return is_source_touch_event_set_blocking_;
}
- void set_is_source_touch_event_set_non_blocking(
- bool is_source_touch_event_set_non_blocking) {
- is_source_touch_event_set_non_blocking_ =
- is_source_touch_event_set_non_blocking;
+ void set_is_source_touch_event_set_blocking(
+ bool is_source_touch_event_set_blocking) {
+ is_source_touch_event_set_blocking_ = is_source_touch_event_set_blocking;
}
EventPointerType primary_pointer_type() const {
@@ -224,7 +223,7 @@ struct EVENTS_BASE_EXPORT GestureEventDetails {
GestureDeviceType device_type_;
- bool is_source_touch_event_set_non_blocking_ = false;
+ bool is_source_touch_event_set_blocking_ = false;
// The pointer type for the first touch point in the gesture.
EventPointerType primary_pointer_type_ = EventPointerType::kUnknown;
diff --git a/chromium/ui/events/gestures/DIR_METADATA b/chromium/ui/events/gestures/DIR_METADATA
new file mode 100644
index 00000000000..44eb665d544
--- /dev/null
+++ b/chromium/ui/events/gestures/DIR_METADATA
@@ -0,0 +1,9 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+team_email: "input-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/events/gestures/OWNERS b/chromium/ui/events/gestures/OWNERS
index 4b27ef7648b..7ac1c376701 100644
--- a/chromium/ui/events/gestures/OWNERS
+++ b/chromium/ui/events/gestures/OWNERS
@@ -2,6 +2,3 @@ rjkroege@chromium.org
sadrul@chromium.org
tdresser@chromium.org
nzolghadr@chromium.org
-
-# TEAM: input-dev@chromium.org
-# COMPONENT: UI>Input
diff --git a/chromium/ui/events/gestures/gesture_provider_aura.cc b/chromium/ui/events/gestures/gesture_provider_aura.cc
index 297c4c2a3e1..8a1ffa2507e 100644
--- a/chromium/ui/events/gestures/gesture_provider_aura.cc
+++ b/chromium/ui/events/gestures/gesture_provider_aura.cc
@@ -57,13 +57,13 @@ bool GestureProviderAura::OnTouchEvent(TouchEvent* event) {
void GestureProviderAura::OnTouchEventAck(
uint32_t unique_touch_event_id,
bool event_consumed,
- bool is_source_touch_event_set_non_blocking) {
+ bool is_source_touch_event_set_blocking) {
DCHECK(pending_gestures_.empty());
DCHECK(!handling_event_);
base::AutoReset<bool> handling_event(&handling_event_, true);
filtered_gesture_provider_.OnTouchEventAck(
unique_touch_event_id, event_consumed,
- is_source_touch_event_set_non_blocking);
+ is_source_touch_event_set_blocking);
}
void GestureProviderAura::ResetGestureHandlingState() {
@@ -106,7 +106,7 @@ void GestureProviderAura::OnTouchEnter(int pointer_id, float x, float y) {
OnTouchEvent(touch_event.get());
OnTouchEventAck(touch_event->unique_event_id(), true /* event_consumed */,
- false /* is_source_touch_event_set_non_blocking */);
+ false /* is_source_touch_event_set_blocking */);
}
} // namespace content
diff --git a/chromium/ui/events/gestures/gesture_provider_aura.h b/chromium/ui/events/gestures/gesture_provider_aura.h
index 7072bf8e9ff..1cf2b3a47dc 100644
--- a/chromium/ui/events/gestures/gesture_provider_aura.h
+++ b/chromium/ui/events/gestures/gesture_provider_aura.h
@@ -44,7 +44,7 @@ class EVENTS_EXPORT GestureProviderAura : public GestureProviderClient {
bool OnTouchEvent(TouchEvent* event);
void OnTouchEventAck(uint32_t unique_touch_event_id,
bool event_consumed,
- bool is_source_touch_event_set_non_blocking);
+ bool is_source_touch_event_set_blocking);
const MotionEventAura& pointer_state() { return pointer_state_; }
std::vector<std::unique_ptr<GestureEvent>> GetAndResetPendingGestures();
void OnTouchEnter(int pointer_id, float x, float y);
diff --git a/chromium/ui/events/gestures/gesture_recognizer.h b/chromium/ui/events/gestures/gesture_recognizer.h
index d69a09fabf3..c7878fdf1ad 100644
--- a/chromium/ui/events/gestures/gesture_recognizer.h
+++ b/chromium/ui/events/gestures/gesture_recognizer.h
@@ -36,7 +36,7 @@ class EVENTS_EXPORT GestureRecognizer {
// the queue which matches with unique_event_id.
virtual Gestures AckTouchEvent(uint32_t unique_event_id,
ui::EventResult result,
- bool is_source_touch_event_set_non_blocking,
+ bool is_source_touch_event_set_blocking,
GestureConsumer* consumer) = 0;
// This is called when the consumer is destroyed. So this should cleanup any
diff --git a/chromium/ui/events/gestures/gesture_recognizer_impl.cc b/chromium/ui/events/gestures/gesture_recognizer_impl.cc
index 0539a81a4ca..7be72d3f10d 100644
--- a/chromium/ui/events/gestures/gesture_recognizer_impl.cc
+++ b/chromium/ui/events/gestures/gesture_recognizer_impl.cc
@@ -306,7 +306,7 @@ void GestureRecognizerImpl::DispatchGestureEvent(
GestureRecognizer::Gestures GestureRecognizerImpl::AckTouchEvent(
uint32_t unique_event_id,
ui::EventResult result,
- bool is_source_touch_event_set_non_blocking,
+ bool is_source_touch_event_set_blocking,
GestureConsumer* consumer) {
GestureProviderAura* gesture_provider = nullptr;
@@ -321,7 +321,7 @@ GestureRecognizer::Gestures GestureRecognizerImpl::AckTouchEvent(
gesture_provider = GetGestureProviderForConsumer(consumer);
}
gesture_provider->OnTouchEventAck(unique_event_id, result != ER_UNHANDLED,
- is_source_touch_event_set_non_blocking);
+ is_source_touch_event_set_blocking);
return gesture_provider->GetAndResetPendingGestures();
}
diff --git a/chromium/ui/events/gestures/gesture_recognizer_impl.h b/chromium/ui/events/gestures/gesture_recognizer_impl.h
index 0d27b2b4f08..54d9c1079a3 100644
--- a/chromium/ui/events/gestures/gesture_recognizer_impl.h
+++ b/chromium/ui/events/gestures/gesture_recognizer_impl.h
@@ -81,7 +81,7 @@ class EVENTS_EXPORT GestureRecognizerImpl : public GestureRecognizer,
Gestures AckTouchEvent(uint32_t unique_event_id,
ui::EventResult result,
- bool is_source_touch_event_set_non_blocking,
+ bool is_source_touch_event_set_blocking,
GestureConsumer* consumer) override;
void CancelActiveTouchesExceptImpl(GestureConsumer* not_cancelled);
diff --git a/chromium/ui/events/gestures/gesture_recognizer_impl_mac.cc b/chromium/ui/events/gestures/gesture_recognizer_impl_mac.cc
index 924de8bf049..eff4e4159dd 100644
--- a/chromium/ui/events/gestures/gesture_recognizer_impl_mac.cc
+++ b/chromium/ui/events/gestures/gesture_recognizer_impl_mac.cc
@@ -18,7 +18,7 @@ bool GestureRecognizerImplMac::ProcessTouchEventPreDispatch(
GestureRecognizer::Gestures GestureRecognizerImplMac::AckTouchEvent(
uint32_t unique_event_id,
ui::EventResult result,
- bool is_source_touch_event_set_non_blocking,
+ bool is_source_touch_event_set_blocking,
GestureConsumer* consumer) {
return {};
}
diff --git a/chromium/ui/events/gestures/gesture_recognizer_impl_mac.h b/chromium/ui/events/gestures/gesture_recognizer_impl_mac.h
index 1550e1b5677..5d22b145360 100644
--- a/chromium/ui/events/gestures/gesture_recognizer_impl_mac.h
+++ b/chromium/ui/events/gestures/gesture_recognizer_impl_mac.h
@@ -27,7 +27,7 @@ class EVENTS_EXPORT GestureRecognizerImplMac : public GestureRecognizer {
GestureConsumer* consumer) override;
Gestures AckTouchEvent(uint32_t unique_event_id,
ui::EventResult result,
- bool is_source_touch_event_set_non_blocking,
+ bool is_source_touch_event_set_blocking,
GestureConsumer* consumer) override;
bool CleanupStateForConsumer(GestureConsumer* consumer) override;
GestureConsumer* GetTouchLockedTarget(const TouchEvent& event) override;
diff --git a/chromium/ui/events/keyboard_event_counter.cc b/chromium/ui/events/keyboard_event_counter.cc
new file mode 100644
index 00000000000..1551035ab59
--- /dev/null
+++ b/chromium/ui/events/keyboard_event_counter.cc
@@ -0,0 +1,33 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/events/keyboard_event_counter.h"
+
+#include "base/check_op.h"
+
+namespace ui {
+
+KeyboardEventCounter::KeyboardEventCounter() : total_key_presses_(0) {}
+
+KeyboardEventCounter::~KeyboardEventCounter() = default;
+
+void KeyboardEventCounter::OnKeyboardEvent(EventType event,
+ KeyboardCode key_code) {
+ // Updates the pressed keys and the total count of key presses.
+ if (event == ET_KEY_PRESSED) {
+ if (pressed_keys_.find(key_code) != pressed_keys_.end())
+ return;
+ pressed_keys_.insert(key_code);
+ ++total_key_presses_;
+ } else {
+ DCHECK_EQ(ET_KEY_RELEASED, event);
+ pressed_keys_.erase(key_code);
+ }
+}
+
+uint32_t KeyboardEventCounter::GetKeyPressCount() const {
+ return total_key_presses_.load();
+}
+
+} // namespace ui
diff --git a/chromium/ui/events/keyboard_event_counter.h b/chromium/ui/events/keyboard_event_counter.h
new file mode 100644
index 00000000000..a82fcdd3817
--- /dev/null
+++ b/chromium/ui/events/keyboard_event_counter.h
@@ -0,0 +1,48 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_EVENTS_KEYBOARD_EVENT_COUNTER_H_
+#define UI_EVENTS_KEYBOARD_EVENT_COUNTER_H_
+
+#include <stddef.h>
+
+#include <atomic>
+#include <set>
+
+#include "base/macros.h"
+#include "ui/events/events_export.h"
+#include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/events/types/event_type.h"
+
+namespace ui {
+
+// This class tracks the total number of keypresses based on the OnKeyboardEvent
+// calls it receives from the client.
+// Multiple key down events for the same key are counted as one keypress until
+// the same key is released.
+class EVENTS_EXPORT KeyboardEventCounter {
+ public:
+ KeyboardEventCounter();
+ ~KeyboardEventCounter();
+
+ // Returns the total number of keypresses since its creation.
+ // Can be called on any thread.
+ uint32_t GetKeyPressCount() const;
+
+ // The client should call this method on key down or key up events.
+ // Must be called on a single thread.
+ void OnKeyboardEvent(EventType event, KeyboardCode key_code);
+
+ private:
+ // The set of keys currently held down.
+ std::set<KeyboardCode> pressed_keys_;
+
+ std::atomic<uint32_t> total_key_presses_;
+
+ DISALLOW_COPY_AND_ASSIGN(KeyboardEventCounter);
+};
+
+} // namespace ui
+
+#endif // UI_EVENTS_KEYBOARD_EVENT_COUNTER_H_
diff --git a/chromium/ui/events/keyboard_event_counter_unittest.cc b/chromium/ui/events/keyboard_event_counter_unittest.cc
new file mode 100644
index 00000000000..e4a03a1e0de
--- /dev/null
+++ b/chromium/ui/events/keyboard_event_counter_unittest.cc
@@ -0,0 +1,37 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/events/keyboard_event_counter.h"
+
+#include <memory>
+
+#include "base/run_loop.h"
+#include "build/build_config.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ui {
+
+TEST(KeyboardEventCounterTest, KeyPressCounter) {
+ KeyboardEventCounter counter;
+
+ EXPECT_EQ(0u, counter.GetKeyPressCount());
+
+ counter.OnKeyboardEvent(ui::ET_KEY_PRESSED, ui::VKEY_0);
+ EXPECT_EQ(1u, counter.GetKeyPressCount());
+
+ // Holding the same key without releasing it does not increase the count.
+ counter.OnKeyboardEvent(ui::ET_KEY_PRESSED, ui::VKEY_0);
+ EXPECT_EQ(1u, counter.GetKeyPressCount());
+
+ // Releasing the key does not affect the total count.
+ counter.OnKeyboardEvent(ui::ET_KEY_RELEASED, ui::VKEY_0);
+ EXPECT_EQ(1u, counter.GetKeyPressCount());
+
+ counter.OnKeyboardEvent(ui::ET_KEY_PRESSED, ui::VKEY_0);
+ counter.OnKeyboardEvent(ui::ET_KEY_RELEASED, ui::VKEY_0);
+ EXPECT_EQ(2u, counter.GetKeyPressCount());
+}
+
+} // namespace ui
diff --git a/chromium/ui/events/keycodes/BUILD.gn b/chromium/ui/events/keycodes/BUILD.gn
index 4aae406b9ac..4a2d0348cae 100644
--- a/chromium/ui/events/keycodes/BUILD.gn
+++ b/chromium/ui/events/keycodes/BUILD.gn
@@ -2,9 +2,9 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//ui/base/ui_features.gni")
-import("//ui/ozone/ozone.gni")
source_set("xkb") {
sources = [
diff --git a/chromium/ui/events/keycodes/DIR_METADATA b/chromium/ui/events/keycodes/DIR_METADATA
new file mode 100644
index 00000000000..19b048fa1ab
--- /dev/null
+++ b/chromium/ui/events/keycodes/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "IO>Keyboard"
+} \ No newline at end of file
diff --git a/chromium/ui/events/keycodes/OWNERS b/chromium/ui/events/keycodes/OWNERS
index 0fe96b8e812..a49314c396b 100644
--- a/chromium/ui/events/keycodes/OWNERS
+++ b/chromium/ui/events/keycodes/OWNERS
@@ -1,4 +1,2 @@
garykac@chromium.org
wez@chromium.org
-
-# COMPONENT: IO>Keyboard
diff --git a/chromium/ui/events/keycodes/dom/dom_key.h b/chromium/ui/events/keycodes/dom/dom_key.h
index 2f062886eca..3835537f4b7 100644
--- a/chromium/ui/events/keycodes/dom/dom_key.h
+++ b/chromium/ui/events/keycodes/dom/dom_key.h
@@ -79,6 +79,9 @@ class DomKey {
"suspicious representation change");
public:
+ // Following block is a technique to add inlined constant with C++14
+ // compatible way. These can be replaced with inline constexpr after
+ // C++17 support.
enum InvalidKey : Base { NONE = 0 };
// |dom_key_data.inc| describes the non-printable DomKey values, and is
// included here to create constants for them in the DomKey:: scope.
@@ -91,14 +94,14 @@ class DomKey {
#undef DOM_KEY_UNI
// Create a DomKey, with the undefined-value sentinel DomKey::NONE.
- DomKey() : value_(NONE) {}
+ constexpr DomKey() = default;
// Create a DomKey from an encoded integer value. This is implicit so
// that DomKey::NAME constants don't need to be explicitly converted
// to DomKey.
- DomKey(Base value) : value_(value) {
- DCHECK(value == 0 || IsValid()) << value;
- }
+ // After switching to C++17, this can be replaced by inline constexpr,
+ // so can be private. On runtime, FromBase is preferred.
+ constexpr DomKey(Base value) : value_(value) {}
// Factory that returns a DomKey for the specified value. Returns nullopt if
// |value| is not a valid value (or NONE).
@@ -161,7 +164,7 @@ class DomKey {
private:
static bool IsValidValue(Base value) { return (value & TYPE_MASK) != 0; }
- Base value_;
+ Base value_ = NONE;
};
} // namespace ui
diff --git a/chromium/ui/events/keycodes/dom/keycode_converter.cc b/chromium/ui/events/keycodes/dom/keycode_converter.cc
index 1840608f730..c6ed4ac20a8 100644
--- a/chromium/ui/events/keycodes/dom/keycode_converter.cc
+++ b/chromium/ui/events/keycodes/dom/keycode_converter.cc
@@ -11,6 +11,10 @@
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/dom/dom_key.h"
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+#include <linux/input.h>
+#endif
+
namespace ui {
namespace {
@@ -44,7 +48,7 @@ inline constexpr uint32_t CodeIfOnKeyboardPage(uint32_t usage) {
#else
#error Unsupported platform
#endif
-#define DOM_CODE_DECLARATION const KeycodeMapEntry kDomCodeMappings[] =
+#define DOM_CODE_DECLARATION constexpr KeycodeMapEntry kDomCodeMappings[] =
#include "ui/events/keycodes/dom/dom_code_data.inc"
#undef DOM_CODE
#undef DOM_CODE_DECLARATION
@@ -55,7 +59,7 @@ struct DomKeyMapEntry {
const char* string;
};
-#define DOM_KEY_MAP_DECLARATION const DomKeyMapEntry kDomKeyMappings[] =
+#define DOM_KEY_MAP_DECLARATION constexpr DomKeyMapEntry kDomKeyMappings[] =
#define DOM_KEY_UNI(key, id, value) {DomKey::id, key}
#define DOM_KEY_MAP(key, id, value) {DomKey::id, key}
#include "ui/events/keycodes/dom/dom_key_data.inc"
@@ -63,6 +67,46 @@ struct DomKeyMapEntry {
#undef DOM_KEY_MAP
#undef DOM_KEY_UNI
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+
+// The offset between XKB Keycode and evdev code.
+constexpr int kXkbKeycodeOffset = 8;
+
+// TODO(crbug.com/1135034): After migrating native code for
+// these platforms from XKB to evdev, use XKB_INVALID_KEYCODE
+// (=0xFFFFFFFF) to represent invalid XKB keycode.
+// Currently, 0 is returned for backward compatibility.
+
+// Converts XKB keycode to evdev code, based on the mapping
+// usually available at /usr/share/X11/xkb/keycodes/evdev.
+// See also
+// https://xkbcommon.org/doc/current/xkbcommon_8h.html#ac29aee92124c08d1953910ab28ee1997
+// for the reference of the history of key mapping.
+// Returns KEY_RESERVED for unknown XKB keycode mapping.
+int XkbKeycodeToEvdevCode(uint32_t xkb_keycode) {
+ // There's no mapping from XKB keycode in range [0-7] (inclusive)
+ // to evdev. Return KEY_RESERVED as an error.
+ if (xkb_keycode < kXkbKeycodeOffset)
+ return KEY_RESERVED;
+ return static_cast<int>(xkb_keycode - kXkbKeycodeOffset);
+}
+
+// Converts evdev code into XKB keycode.
+// Returns KeycodeConverter::InvalidNativeKeycode() if the given code is in
+// the invalid range or KEY_RESERVED.
+uint32_t EvdevCodeToXkbKeycode(int evdev_code) {
+ if (evdev_code < 0 || evdev_code > KEY_MAX || evdev_code == KEY_RESERVED)
+ return KeycodeConverter::InvalidNativeKeycode();
+
+ // TODO(crbug.com/1135034): Move this to EvdevCodeToDomCode on
+ // migration.
+ if (evdev_code == KEY_PLAYCD)
+ evdev_code = KEY_PLAY;
+ return static_cast<uint32_t>(evdev_code + kXkbKeycodeOffset);
+}
+
+#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
+
} // namespace
// static
@@ -104,6 +148,36 @@ int KeycodeConverter::DomCodeToNativeKeycode(DomCode code) {
return UsbKeycodeToNativeKeycode(static_cast<uint32_t>(code));
}
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+// static
+DomCode KeycodeConverter::XkbKeycodeToDomCode(uint32_t xkb_keycode) {
+ // Currently XKB keycode is the native keycode.
+ // TODO(crbug.com/1135034): Replace with evdev.
+ return NativeKeycodeToDomCode(static_cast<int>(xkb_keycode));
+}
+
+// static
+uint32_t KeycodeConverter::DomCodeToXkbKeycode(DomCode code) {
+ // Currently XKB keycode is the native keycode.
+ // TODO(crbug.com/1135034): Replace with evdev.
+ return static_cast<uint32_t>(DomCodeToNativeKeycode(code));
+}
+
+// static
+DomCode KeycodeConverter::EvdevCodeToDomCode(int evdev_code) {
+ // Currently XKB keycode is the native keycode.
+ // TODO(crbug.com/1135034): Replace with evdev.
+ return XkbKeycodeToDomCode(EvdevCodeToXkbKeycode(evdev_code));
+}
+
+// static
+int KeycodeConverter::DomCodeToEvdevCode(DomCode code) {
+ // Currently XKB keycode is the native keycode.
+ // TODO(crbug.com/1135034): Replace with evdev.
+ return XkbKeycodeToEvdevCode(DomCodeToXkbKeycode(code));
+}
+#endif
+
// static
DomCode KeycodeConverter::CodeStringToDomCode(const std::string& code) {
if (code.empty())
diff --git a/chromium/ui/events/keycodes/dom/keycode_converter.h b/chromium/ui/events/keycodes/dom/keycode_converter.h
index 7084499376e..b6d0f12539b 100644
--- a/chromium/ui/events/keycodes/dom/keycode_converter.h
+++ b/chromium/ui/events/keycodes/dom/keycode_converter.h
@@ -9,7 +9,7 @@
#include <stdint.h>
#include <string>
-#include "base/macros.h"
+#include "build/build_config.h"
#include "ui/events/keycodes/dom/dom_key.h"
// For reference, the W3C UI Event spec is located at:
@@ -46,6 +46,10 @@ typedef struct {
// spec (http://www.w3.org/TR/uievents/).
class KeycodeConverter {
public:
+ KeycodeConverter() = delete;
+ KeycodeConverter(const KeycodeConverter&) = delete;
+ KeycodeConverter& operator=(const KeycodeConverter&) = delete;
+
// Return the value that identifies an invalid native keycode.
static int InvalidNativeKeycode();
@@ -55,6 +59,20 @@ class KeycodeConverter {
// Convert a DomCode into a native keycode.
static int DomCodeToNativeKeycode(DomCode code);
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+ // Convert a XKB keycode into a DomCode.
+ static DomCode XkbKeycodeToDomCode(uint32_t xkb_keycode);
+
+ // Convert a DomCode into a XKB keycode.
+ static uint32_t DomCodeToXkbKeycode(DomCode code);
+
+ // Convert an evdev code into DomCode.
+ static DomCode EvdevCodeToDomCode(int evdev_code);
+
+ // Convert a DomCode into an evdev code.
+ static int DomCodeToEvdevCode(DomCode code);
+#endif
+
// Convert a UI Events |code| string value into a DomCode.
static DomCode CodeStringToDomCode(const std::string& code);
@@ -110,9 +128,6 @@ class KeycodeConverter {
static size_t NumKeycodeMapEntriesForTest();
static const KeycodeMapEntry* GetKeycodeMapForTest();
static const char* DomKeyStringForTest(size_t index);
-
- private:
- DISALLOW_COPY_AND_ASSIGN(KeycodeConverter);
};
} // namespace ui
diff --git a/chromium/ui/events/keycodes/keyboard_code_conversion_x.cc b/chromium/ui/events/keycodes/keyboard_code_conversion_x.cc
index 02e2db8dc69..d94e5a07ab8 100644
--- a/chromium/ui/events/keycodes/keyboard_code_conversion_x.cc
+++ b/chromium/ui/events/keycodes/keyboard_code_conversion_x.cc
@@ -19,7 +19,6 @@
#include "ui/events/keycodes/keysym_to_unicode.h"
#include "ui/events/keycodes/xkb_keysym.h"
#include "ui/gfx/x/keysyms/keysyms.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xinput.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_types.h"
@@ -133,7 +132,7 @@ namespace {
// Please refer to crbug.com/386066.
//
const struct MAP0 {
- KeySym ch0;
+ uint32_t ch0;
uint8_t vk;
bool operator()(const MAP0& m1, const MAP0& m2) const {
return m1.ch0 < m2.ch0;
@@ -193,7 +192,7 @@ const struct MAP0 {
};
const struct MAP1 {
- KeySym ch0;
+ uint32_t ch0;
unsigned sc;
uint8_t vk;
bool operator()(const MAP1& m1, const MAP1& m2) const {
@@ -382,9 +381,9 @@ const struct MAP1 {
};
const struct MAP2 {
- KeySym ch0;
+ uint32_t ch0;
unsigned sc;
- KeySym ch1;
+ uint32_t ch1;
uint8_t vk;
bool operator()(const MAP2& m1, const MAP2& m2) const {
if (m1.ch0 == m2.ch0 && m1.sc == m2.sc)
@@ -423,10 +422,10 @@ const struct MAP2 {
};
const struct MAP3 {
- KeySym ch0;
+ uint32_t ch0;
unsigned sc;
- KeySym ch1;
- KeySym ch2;
+ uint32_t ch1;
+ uint32_t ch2;
uint8_t vk;
bool operator()(const MAP3& m1, const MAP3& m2) const {
if (m1.ch0 == m2.ch0 && m1.sc == m2.sc && m1.ch1 == m2.ch1)
@@ -545,10 +544,10 @@ KeyboardCode FindVK(const T_MAP& key, const T_MAP* map, size_t size) {
// based on KeySym, and never fall back to MAP0~MAP3, since some layouts
// generate them by applying the Control/AltGr modifier to some other key.
// e.g. in de(neo), AltGr+V generates XK_Enter.
-bool IsTtyFunctionOrSpaceKey(KeySym keysym) {
- KeySym keysyms[] = {XK_BackSpace, XK_Tab, XK_Linefeed, XK_Clear,
- XK_Return, XK_Pause, XK_Scroll_Lock, XK_Sys_Req,
- XK_Escape, XK_Delete, XK_space};
+bool IsTtyFunctionOrSpaceKey(uint32_t keysym) {
+ uint32_t keysyms[] = {XK_BackSpace, XK_Tab, XK_Linefeed, XK_Clear,
+ XK_Return, XK_Pause, XK_Scroll_Lock, XK_Sys_Req,
+ XK_Escape, XK_Delete, XK_space};
for (unsigned long i : keysyms) {
if (i == keysym)
@@ -557,9 +556,9 @@ bool IsTtyFunctionOrSpaceKey(KeySym keysym) {
return false;
}
-::KeySym TranslateKey(uint32_t keycode, uint32_t modifiers) {
- auto* connection = x11::Connection::Get();
- return static_cast<::KeySym>(connection->KeycodeToKeysym(keycode, modifiers));
+uint32_t TranslateKey(uint32_t keycode, uint32_t modifiers) {
+ return x11::Connection::Get()->KeycodeToKeysym(
+ static_cast<x11::KeyCode>(keycode), modifiers);
}
void GetKeycodeAndModifiers(const x11::Event& event,
@@ -658,7 +657,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const x11::Event& xev) {
if (keycode != VKEY_UNKNOWN)
return keycode;
- KeySym keysym_shift{};
+ uint32_t keysym_shift{};
modifiers |= static_cast<int>(x11::KeyButMask::Shift);
keysym_shift = TranslateKey(xkeycode, modifiers);
MAP2 key2 = {keysym & 0xFFFF, xkeycode, keysym_shift & 0xFFFF, 0};
@@ -666,7 +665,7 @@ KeyboardCode KeyboardCodeFromXKeyEvent(const x11::Event& xev) {
if (keycode != VKEY_UNKNOWN)
return keycode;
- KeySym keysym_altgr{};
+ uint32_t keysym_altgr{};
modifiers &= ~static_cast<int>(x11::KeyButMask::Shift);
modifiers |= static_cast<int>(x11::KeyButMask::Mod1);
keysym_altgr = TranslateKey(xkeycode, modifiers);
@@ -999,7 +998,7 @@ uint16_t GetCharacterFromXEvent(const x11::Event& xev) {
uint32_t xkeycode = 0;
uint32_t modifiers = 0;
GetKeycodeAndModifiers(xev, &xkeycode, &modifiers);
- KeySym keysym = TranslateKey(xkeycode, modifiers);
+ uint32_t keysym = TranslateKey(xkeycode, modifiers);
return GetUnicodeCharacterFromXKeySym(keysym);
}
@@ -1017,7 +1016,7 @@ DomKey GetDomKeyFromXEvent(const x11::Event& xev) {
// no keyboard combinations with ctrl key are mapped to printable character.
// https://crbug.com/633838
modifiers &= ~static_cast<int>(x11::KeyButMask::Control);
- KeySym keysym = TranslateKey(xkeycode, modifiers);
+ uint32_t keysym = TranslateKey(xkeycode, modifiers);
base::char16 ch = GetUnicodeCharacterFromXKeySym(keysym);
return XKeySymToDomKey(keysym, ch);
}
@@ -1484,9 +1483,8 @@ unsigned int XKeyCodeForWindowsKeyCode(ui::KeyboardCode key_code,
// crbug.com/386066 and crbug.com/390263 are examples of problems
// associated with this.
//
- auto keysym =
- static_cast<x11::KeySym>(XKeysymForWindowsKeyCode(key_code, false));
- return static_cast<unsigned int>(connection->KeysymToKeycode(keysym));
+ return static_cast<uint8_t>(
+ connection->KeysymToKeycode(XKeysymForWindowsKeyCode(key_code, false)));
}
} // namespace ui
diff --git a/chromium/ui/events/keycodes/keysym_to_unicode.cc b/chromium/ui/events/keycodes/keysym_to_unicode.cc
index 72de4717a37..320ed5eb04a 100644
--- a/chromium/ui/events/keycodes/keysym_to_unicode.cc
+++ b/chromium/ui/events/keycodes/keysym_to_unicode.cc
@@ -9,12 +9,11 @@
#include "base/lazy_instance.h"
#include "base/stl_util.h"
#include "ui/gfx/x/keysyms/keysyms.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
const struct {
- KeySym keysym;
+ uint32_t keysym;
uint16_t unicode;
} g_keysym_to_unicode_table[] = {
// Control characters
@@ -819,7 +818,7 @@ class KeySymToUnicode {
}
}
- uint16_t UnicodeFromKeySym(KeySym keysym) const {
+ uint16_t UnicodeFromKeySym(uint32_t keysym) const {
// Latin-1 characters have the same representation.
if ((0x0020 <= keysym && keysym <= 0x007e) ||
(0x00a0 <= keysym && keysym <= 0x00ff))
@@ -839,7 +838,7 @@ class KeySymToUnicode {
}
private:
- typedef std::unordered_map<KeySym, uint16_t> KeySymToUnicodeMap;
+ typedef std::unordered_map<uint32_t, uint16_t> KeySymToUnicodeMap;
KeySymToUnicodeMap keysym_to_unicode_map_;
DISALLOW_COPY_AND_ASSIGN(KeySymToUnicode);
@@ -850,7 +849,7 @@ static base::LazyInstance<KeySymToUnicode>::Leaky g_keysym_to_unicode =
uint16_t GetUnicodeCharacterFromXKeySym(unsigned long keysym) {
return g_keysym_to_unicode.Get().UnicodeFromKeySym(
- static_cast<KeySym>(keysym));
+ static_cast<uint32_t>(keysym));
}
} // namespace ui
diff --git a/chromium/ui/events/keycodes/platform_key_map_win_unittest.cc b/chromium/ui/events/keycodes/platform_key_map_win_unittest.cc
index 34f13dc8b91..e251a73f880 100644
--- a/chromium/ui/events/keycodes/platform_key_map_win_unittest.cc
+++ b/chromium/ui/events/keycodes/platform_key_map_win_unittest.cc
@@ -6,7 +6,6 @@
#include "base/macros.h"
#include "base/strings/string16.h"
-#include "base/test/scoped_feature_list.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/event_constants.h"
#include "ui/events/keycodes/dom/dom_code.h"
diff --git a/chromium/ui/events/ozone/DIR_METADATA b/chromium/ui/events/ozone/DIR_METADATA
new file mode 100644
index 00000000000..b8b9277b19b
--- /dev/null
+++ b/chromium/ui/events/ozone/DIR_METADATA
@@ -0,0 +1,9 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+team_email: "ozone-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/events/ozone/OWNERS b/chromium/ui/events/ozone/OWNERS
index cee2fefb276..10c69898914 100644
--- a/chromium/ui/events/ozone/OWNERS
+++ b/chromium/ui/events/ozone/OWNERS
@@ -7,5 +7,3 @@ seobrien@chromium.org
# Touchscreen palm rejection
robsc@chromium.org
-
-# TEAM: ozone-dev@chromium.org
diff --git a/chromium/ui/events/ozone/device/device_manager_manual.cc b/chromium/ui/events/ozone/device/device_manager_manual.cc
index 8c1063be81b..5262df1b50c 100644
--- a/chromium/ui/events/ozone/device/device_manager_manual.cc
+++ b/chromium/ui/events/ozone/device/device_manager_manual.cc
@@ -68,8 +68,11 @@ void DeviceManagerManual::StartWatching() {
base::PostTaskAndReplyWithResult(
blocking_task_runner_.get(), FROM_HERE,
base::BindOnce(
- &base::FilePathWatcher::Watch, base::Unretained(watcher_.get()),
- base::FilePath(kDevInput), false,
+ static_cast<bool (base::FilePathWatcher::*)(
+ const base::FilePath&, bool,
+ const base::FilePathWatcher::Callback&)>(
+ &base::FilePathWatcher::Watch),
+ base::Unretained(watcher_.get()), base::FilePath(kDevInput), false,
base::BindRepeating(&DeviceManagerManual::OnWatcherEventOnUiSequence,
base::SequencedTaskRunnerHandle::Get(),
weak_ptr_factory_.GetWeakPtr())),
diff --git a/chromium/ui/events/ozone/evdev/BUILD.gn b/chromium/ui/events/ozone/evdev/BUILD.gn
index 9f0138966ff..ce0d32fc928 100644
--- a/chromium/ui/events/ozone/evdev/BUILD.gn
+++ b/chromium/ui/events/ozone/evdev/BUILD.gn
@@ -63,8 +63,6 @@ component("evdev") {
"input_injector_evdev.h",
"keyboard_evdev.cc",
"keyboard_evdev.h",
- "keyboard_util_evdev.cc",
- "keyboard_util_evdev.h",
"mouse_button_map_evdev.cc",
"mouse_button_map_evdev.h",
"stylus_button_event_converter_evdev.cc",
@@ -152,8 +150,8 @@ component("evdev") {
}
visibility += [
- "//ui/ozone/*",
"//ui/chromeos/*",
+ "//ui/ozone/*",
]
}
diff --git a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc
index 00ff1500aaa..3ed449cce5a 100644
--- a/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc
+++ b/chromium/ui/events/ozone/evdev/event_converter_evdev_impl.cc
@@ -15,7 +15,6 @@
#include "ui/events/event_utils.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
-#include "ui/events/ozone/evdev/keyboard_util_evdev.h"
namespace ui {
@@ -99,10 +98,8 @@ void EventConverterEvdevImpl::SetKeyFilter(bool enable_filter,
}
blocked_keys_.set();
- for (const DomCode& it : allowed_keys) {
- int evdev_code =
- NativeCodeToEvdevCode(KeycodeConverter::DomCodeToNativeKeycode(it));
- blocked_keys_.reset(evdev_code);
+ for (const DomCode& code : allowed_keys) {
+ blocked_keys_.reset(KeycodeConverter::DomCodeToEvdevCode(code));
}
// Release any pressed blocked keys.
diff --git a/chromium/ui/events/ozone/evdev/event_device_info.h b/chromium/ui/events/ozone/evdev/event_device_info.h
index ac52b98bad3..4b73534c9da 100644
--- a/chromium/ui/events/ozone/evdev/event_device_info.h
+++ b/chromium/ui/events/ozone/evdev/event_device_info.h
@@ -37,6 +37,7 @@ namespace ui {
enum COMPONENT_EXPORT(EVDEV) EventDeviceType {
DT_KEYBOARD,
DT_MOUSE,
+ DT_POINTING_STICK,
DT_TOUCHPAD,
DT_TOUCHSCREEN,
DT_MULTITOUCH,
diff --git a/chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc b/chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc
index fe36ae1ca3d..7e06c24d8cc 100644
--- a/chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/input_device_factory_evdev.cc
@@ -342,20 +342,8 @@ void InputDeviceFactoryEvdev::ApplyInputDeviceSettings() {
SetBoolPropertyForOneType(DT_MULTITOUCH, "Australian Scrolling",
input_device_settings_.natural_scroll_enabled);
- SetIntPropertyForOneType(DT_MOUSE, "Pointer Sensitivity",
- input_device_settings_.mouse_sensitivity);
- SetIntPropertyForOneType(DT_MOUSE, "Mouse Scroll Sensitivity",
- input_device_settings_.mouse_scroll_sensitivity);
- SetBoolPropertyForOneType(DT_MOUSE, "Pointer Acceleration",
- input_device_settings_.mouse_acceleration_enabled);
- SetBoolPropertyForOneType(
- DT_MOUSE, "Mouse Scroll Acceleration",
- input_device_settings_.mouse_scroll_acceleration_enabled);
- SetBoolPropertyForOneType(
- DT_MOUSE, "Mouse Reverse Scrolling",
- input_device_settings_.mouse_reverse_scroll_enabled);
- SetBoolPropertyForOneType(DT_MOUSE, "Mouse High Resolution Scrolling", true);
- SetBoolPropertyForOneType(DT_MOUSE, "Output Mouse Wheel Gestures", true);
+ ApplyRelativePointingDeviceSettings(DT_MOUSE);
+ ApplyRelativePointingDeviceSettings(DT_POINTING_STICK);
SetBoolPropertyForOneType(DT_TOUCHPAD, "Tap Paused",
input_device_settings_.tap_to_click_paused);
@@ -387,6 +375,24 @@ void InputDeviceFactoryEvdev::ApplyInputDeviceSettings() {
NotifyDevicesUpdated();
}
+void InputDeviceFactoryEvdev::ApplyRelativePointingDeviceSettings(
+ EventDeviceType type) {
+ SetIntPropertyForOneType(type, "Pointer Sensitivity",
+ input_device_settings_.mouse_sensitivity);
+ SetIntPropertyForOneType(type, "Mouse Scroll Sensitivity",
+ input_device_settings_.mouse_scroll_sensitivity);
+ SetBoolPropertyForOneType(type, "Pointer Acceleration",
+ input_device_settings_.mouse_acceleration_enabled);
+ SetBoolPropertyForOneType(
+ type, "Mouse Scroll Acceleration",
+ input_device_settings_.mouse_scroll_acceleration_enabled);
+ SetBoolPropertyForOneType(
+ type, "Mouse Reverse Scrolling",
+ input_device_settings_.mouse_reverse_scroll_enabled);
+ SetBoolPropertyForOneType(type, "Mouse High Resolution Scrolling", true);
+ SetBoolPropertyForOneType(type, "Output Mouse Wheel Gestures", true);
+}
+
void InputDeviceFactoryEvdev::ApplyCapsLockLed() {
for (const auto& it : converters_) {
EventConverterEvdev* converter = it.second.get();
diff --git a/chromium/ui/events/ozone/evdev/input_device_factory_evdev.h b/chromium/ui/events/ozone/evdev/input_device_factory_evdev.h
index 91f7b8578d2..1cd73a736fa 100644
--- a/chromium/ui/events/ozone/evdev/input_device_factory_evdev.h
+++ b/chromium/ui/events/ozone/evdev/input_device_factory_evdev.h
@@ -86,6 +86,7 @@ class COMPONENT_EXPORT(EVDEV) InputDeviceFactoryEvdev {
// Sync input_device_settings_ to attached devices.
void ApplyInputDeviceSettings();
+ void ApplyRelativePointingDeviceSettings(EventDeviceType type);
void ApplyCapsLockLed();
// Policy for device enablement.
diff --git a/chromium/ui/events/ozone/evdev/input_injector_evdev.cc b/chromium/ui/events/ozone/evdev/input_injector_evdev.cc
index 44ea29e531b..dc19ad4607e 100644
--- a/chromium/ui/events/ozone/evdev/input_injector_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/input_injector_evdev.cc
@@ -11,10 +11,10 @@
#include "ui/events/event_modifiers.h"
#include "ui/events/event_utils.h"
#include "ui/events/keycodes/dom/dom_code.h"
+#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
#include "ui/events/ozone/evdev/keyboard_evdev.h"
-#include "ui/events/ozone/evdev/keyboard_util_evdev.h"
namespace ui {
@@ -78,9 +78,7 @@ void InputInjectorEvdev::InjectKeyEvent(DomCode physical_key,
if (physical_key == DomCode::NONE)
return;
- int native_keycode = KeycodeConverter::DomCodeToNativeKeycode(physical_key);
- int evdev_code = NativeCodeToEvdevCode(native_keycode);
-
+ int evdev_code = KeycodeConverter::DomCodeToEvdevCode(physical_key);
dispatcher_->DispatchKeyEvent(KeyEventParams(
kDeviceIdForInjection, ui::EF_NONE, evdev_code, 0 /*scan_code*/, down,
suppress_auto_repeat, EventTimeForNow()));
diff --git a/chromium/ui/events/ozone/evdev/keyboard_evdev.cc b/chromium/ui/events/ozone/evdev/keyboard_evdev.cc
index e89821d64e7..7f663813df5 100644
--- a/chromium/ui/events/ozone/evdev/keyboard_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/keyboard_evdev.cc
@@ -13,7 +13,6 @@
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/keycodes/keyboard_code_conversion.h"
-#include "ui/events/ozone/evdev/keyboard_util_evdev.h"
#include "ui/events/ozone/layout/keyboard_layout_engine.h"
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
#include "ui/events/types/event_type.h"
@@ -119,8 +118,7 @@ void KeyboardEvdev::RefreshModifiers() {
for (int key = 0; key < KEY_CNT; ++key) {
if (!key_state_.test(key))
continue;
- DomCode dom_code =
- KeycodeConverter::NativeKeycodeToDomCode(EvdevCodeToNativeCode(key));
+ DomCode dom_code = KeycodeConverter::EvdevCodeToDomCode(key);
if (dom_code == DomCode::NONE)
continue;
DomKey dom_key;
@@ -141,8 +139,7 @@ void KeyboardEvdev::DispatchKey(unsigned int key,
base::TimeTicks timestamp,
int device_id,
int flags) {
- DomCode dom_code =
- KeycodeConverter::NativeKeycodeToDomCode(EvdevCodeToNativeCode(key));
+ DomCode dom_code = KeycodeConverter::EvdevCodeToDomCode(key);
if (dom_code == DomCode::NONE)
return;
int modifier_flags = modifiers_->GetModifierFlags();
diff --git a/chromium/ui/events/ozone/evdev/keyboard_util_evdev.cc b/chromium/ui/events/ozone/evdev/keyboard_util_evdev.cc
deleted file mode 100644
index 34f8618430d..00000000000
--- a/chromium/ui/events/ozone/evdev/keyboard_util_evdev.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/events/ozone/evdev/keyboard_util_evdev.h"
-
-#include <linux/input.h>
-
-#include "ui/events/keycodes/dom/keycode_converter.h"
-
-namespace ui {
-
-namespace {
-
-const int kXkbKeycodeOffset = 8;
-
-} // namespace
-
-int NativeCodeToEvdevCode(int native_code) {
- if (native_code == KeycodeConverter::InvalidNativeKeycode())
- return KEY_RESERVED;
-
- return native_code - kXkbKeycodeOffset;
-}
-
-int EvdevCodeToNativeCode(int evdev_code) {
- if (evdev_code == KEY_RESERVED)
- return KeycodeConverter::InvalidNativeKeycode();
- if (evdev_code == KEY_PLAYCD)
- evdev_code = KEY_PLAY;
-
- return evdev_code + kXkbKeycodeOffset;
-}
-
-} // namespace ui
diff --git a/chromium/ui/events/ozone/evdev/keyboard_util_evdev.h b/chromium/ui/events/ozone/evdev/keyboard_util_evdev.h
deleted file mode 100644
index 8a3811e3d82..00000000000
--- a/chromium/ui/events/ozone/evdev/keyboard_util_evdev.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_EVENTS_OZONE_EVDEV_KEYBOARD_UTIL_EVDEV_H_
-#define UI_EVENTS_OZONE_EVDEV_KEYBOARD_UTIL_EVDEV_H_
-
-#include "base/component_export.h"
-
-namespace ui {
-
-int COMPONENT_EXPORT(EVDEV) NativeCodeToEvdevCode(int native_code);
-int COMPONENT_EXPORT(EVDEV) EvdevCodeToNativeCode(int evdev_code);
-
-} // namespace ui
-
-#endif // UI_EVENTS_OZONE_EVDEV_KEYBOARD_UTIL_EVDEV_H_
diff --git a/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc b/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
index 17e4f078da2..6908d97b82f 100644
--- a/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
+++ b/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
@@ -20,7 +20,6 @@
#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
#include "ui/events/ozone/evdev/event_device_info.h"
#include "ui/events/ozone/evdev/event_device_util.h"
-#include "ui/events/ozone/evdev/keyboard_util_evdev.h"
#include "ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.h"
#include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h"
#include "ui/gfx/geometry/point_f.h"
@@ -39,6 +38,8 @@ GestureInterpreterDeviceClass GestureDeviceClass(Evdev* evdev) {
switch (evdev->info.evdev_class) {
case EvdevClassMouse:
return GESTURES_DEVCLASS_MOUSE;
+ case EvdevClassPointingStick:
+ return GESTURES_DEVCLASS_POINTING_STICK;
case EvdevClassMultitouchMouse:
return GESTURES_DEVCLASS_MULTITOUCH_MOUSE;
case EvdevClassTouchpad:
@@ -145,6 +146,8 @@ void GestureInterpreterLibevdevCros::OnLibEvdevCrosOpen(
GestureHardwareProperties(evdev, device_properties_.get());
GestureInterpreterDeviceClass devclass = GestureDeviceClass(evdev);
is_mouse_ = property_provider_->IsDeviceIdOfType(id_, DT_MOUSE);
+ is_pointing_stick_ =
+ property_provider_->IsDeviceIdOfType(id_, DT_POINTING_STICK);
// Create & initialize GestureInterpreter.
DCHECK(!interpreter_);
@@ -520,7 +523,7 @@ void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int button,
if (!SetMouseButtonState(button, down))
return; // No change.
- bool allow_remap = is_mouse_;
+ bool allow_remap = is_mouse_ || is_pointing_stick_;
dispatcher_->DispatchMouseButtonEvent(MouseButtonEventParams(
id_, EF_NONE, cursor_->GetLocation(), button, down, allow_remap,
PointerDetails(EventPointerType::kMouse), StimeToTimeTicks(time)));
diff --git a/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h b/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h
index fb1115adaf6..d46589869de 100644
--- a/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h
+++ b/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h
@@ -99,6 +99,7 @@ class COMPONENT_EXPORT(EVDEV) GestureInterpreterLibevdevCros
// True if the device may be regarded as a mouse. This includes normal mice
// and multi-touch mice.
bool is_mouse_ = false;
+ bool is_pointing_stick_ = false;
// Shared cursor state.
CursorDelegateEvdev* cursor_;
diff --git a/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.cc b/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.cc
index a515ba0dcd5..98823069402 100644
--- a/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.cc
+++ b/chromium/ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.cc
@@ -448,25 +448,20 @@ bool IsDeviceOfType(const ui::GesturePropertyProvider::DevicePtr device,
switch (type) {
case ui::DT_KEYBOARD:
return (evdev_class == EvdevClassKeyboard);
- break;
case ui::DT_MOUSE:
return is_mouse;
- break;
+ case ui::DT_POINTING_STICK:
+ return (evdev_class == EvdevClassPointingStick);
case ui::DT_TOUCHPAD:
return (!is_mouse) && is_touchpad;
- break;
case ui::DT_TOUCHSCREEN:
return (evdev_class == EvdevClassTouchscreen);
- break;
case ui::DT_MULTITOUCH:
return is_touchpad;
- break;
case ui::DT_MULTITOUCH_MOUSE:
return is_mouse && is_touchpad;
- break;
case ui::DT_ALL:
return true;
- break;
default:
break;
}
@@ -816,6 +811,7 @@ bool MatchIsPointer::Match(const DevicePtr device) {
if (!is_valid_)
return true;
return (value_ == (device->info.evdev_class == EvdevClassMouse ||
+ device->info.evdev_class == EvdevClassPointingStick ||
device->info.evdev_class == EvdevClassMultitouchMouse));
}
diff --git a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
index 11497d03b4e..f105611663a 100644
--- a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
@@ -13,7 +13,7 @@
#include <vector>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/command_line.h"
#include "base/files/file_util.h"
#include "base/files/scoped_file.h"
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
index d6e1f0a79b1..fae17a83570 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc
@@ -262,11 +262,13 @@ bool NeuralStylusPalmDetectionFilter::IsHeuristicPalmStroke(
const auto& config = model_->config();
if (config.heuristic_palm_touch_limit > 0.0) {
if (stroke.MaxMajorRadius() >= config.heuristic_palm_touch_limit) {
+ VLOG(1) << "IsHeuristicPalm: Yes major radius.";
return true;
}
}
if (config.heuristic_palm_area_limit > 0.0) {
if (stroke.BiggestSize() >= config.heuristic_palm_area_limit) {
+ VLOG(1) << "IsHeuristicPalm: Yes area.";
return true;
}
std::vector<std::pair<float, int>> biggest_strokes;
@@ -276,9 +278,11 @@ bool NeuralStylusPalmDetectionFilter::IsHeuristicPalmStroke(
if (!biggest_strokes.empty() &&
strokes_.find(biggest_strokes[0].second)->second.BiggestSize() >=
config.heuristic_palm_area_limit) {
+ VLOG(1) << "IsHeuristicPalm: Yes neighbor area.";
return true;
}
}
+ VLOG(1) << "IsHeuristicPalm: No.";
return false;
}
@@ -286,7 +290,15 @@ bool NeuralStylusPalmDetectionFilter::DetectSpuriousStroke(
const std::vector<float>& features,
int tracking_id,
float threshold) const {
- return model_->Inference(features) >= threshold;
+ auto inference_value = model_->Inference(features);
+ if (VLOG_IS_ON(1)) {
+ VLOG(1) << "Running Inference, features are:";
+ for (std::vector<float>::size_type i = 0; i < features.size(); ++i) {
+ VLOG(1) << "Feature " << i << " is " << features[i];
+ }
+ VLOG(1) << "Inference value is : " << inference_value;
+ }
+ return inference_value >= threshold;
}
std::vector<float> NeuralStylusPalmDetectionFilter::ExtractFeatures(
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.cc b/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.cc
index 76160310bc3..f5a321b437a 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.cc
@@ -69,7 +69,7 @@ std::string FetchNeuralPalmRadiusPolynomial(const EventDeviceInfo& devinfo,
// TODO(robsc): Investigate a better way of doing this configuration.
std::string release_board = base::SysInfo::GetLsbReleaseBoard();
if ("hatch" == release_board) {
- return "0.090477715, 3.9225964";
+ return "0.1010944, 3.51837568";
} else if ("reef" == release_board) {
return "0.17889799, 4.22584412";
}
@@ -91,10 +91,12 @@ std::unique_ptr<PalmDetectionFilter> CreatePalmDetectionFilter(
if (base::FeatureList::IsEnabled(kEnableNeuralPalmDetectionFilter) &&
NeuralStylusPalmDetectionFilter::
CompatibleWithNeuralStylusPalmDetectionFilter(devinfo)) {
- std::vector<float> radius_polynomial = internal::ParseRadiusPolynomial(
- internal::FetchNeuralPalmRadiusPolynomial(
- devinfo, kNeuralPalmRadiusPolynomial.Get()));
- // Theres only one model right now.
+ std::string polynomial_string = internal::FetchNeuralPalmRadiusPolynomial(
+ devinfo, kNeuralPalmRadiusPolynomial.Get());
+ VLOG(1) << "Will attempt to use radius polynomial: " << polynomial_string;
+ std::vector<float> radius_polynomial =
+ internal::ParseRadiusPolynomial(polynomial_string);
+ // There's only one model right now.
std::unique_ptr<NeuralStylusPalmDetectionFilterModel> model =
std::make_unique<OneDeviceTrainNeuralStylusPalmDetectionFilterModel>(
radius_polynomial);
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.h b/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.h
index 4dc9a3db41f..8a9f6058b0c 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory.h
@@ -32,7 +32,7 @@ std::vector<float> ParseRadiusPolynomial(const std::string& radius_string);
// Returns either an empty string or a comma separated floating point numbers,
// used in transforming touch_major/touch_minor radius. The parsed numbers are
// used as described in:
-// https://source.chromium.org/chromium/chromium/src/+/master:ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h;l=63
+// https://source.chromium.org/chromium/chromium/src/+/HEAD:ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h;l=63
COMPONENT_EXPORT(EVDEV)
std::string FetchNeuralPalmRadiusPolynomial(const EventDeviceInfo& devinfo,
const std::string param_string);
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory_unittest.cc b/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory_unittest.cc
index 43fc4af5360..eb014db6a66 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_detection_filter_factory_unittest.cc
@@ -55,8 +55,8 @@ class PalmDetectionFilterFactoryDeathTest
TEST_F(PalmDetectionFilterFactoryTest, RadiusesFromLSBRelease) {
std::string lsb_release = "CHROMEOS_RELEASE_BOARD=hatch\n";
base::SysInfo::SetChromeOSVersionInfoForTest(lsb_release, base::Time());
- EXPECT_EQ("0.090477715, 3.9225964", internal::FetchNeuralPalmRadiusPolynomial(
- kohaku_touchscreen_info_, ""));
+ EXPECT_EQ("0.1010944, 3.51837568", internal::FetchNeuralPalmRadiusPolynomial(
+ kohaku_touchscreen_info_, ""));
lsb_release = "CHROMEOS_RELEASE_BOARD=reef\n";
base::SysInfo::SetChromeOSVersionInfoForTest(lsb_release, base::Time());
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
index 4a8697863a1..f26cea98243 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc
@@ -44,8 +44,8 @@ using RowVectorMap =
template <typename Scalar>
using MatrixMap =
typename Eigen::Map<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>>;
-template <typename Scalar>
-using SparseMatrix = Eigen::SparseMatrix<Scalar, Eigen::RowMajor>;
+template <typename Scalar, typename StorageIndex>
+using SparseMatrix = Eigen::SparseMatrix<Scalar, Eigen::RowMajor, StorageIndex>;
#endif
#if OP_LIB_BENCHMARK
@@ -491,46 +491,44 @@ void BatchToSpaceNDRank4(const int32_t* __restrict input_shape,
}
}
-#if USE_EIGEN_SPARSE
-template <typename T>
-void SparseDenseMatmulCSR(const int32_t* __restrict input_shape,
+#if USE_EIGEN
+template <typename T, typename Tidx>
+void SparseDenseMatMulCSR(const int32_t* __restrict input_shape,
const T* __restrict input_values,
- const int32_t* __restrict weight_shape,
- const T* __restrict weight_values,
- const int32_t nnz,
- const int32_t* outer_index,
- const int32_t* cols,
+ const int32_t num_rows,
+ const int32_t* __restrict nnz_shape,
+ const T* __restrict nnz_values,
+ const Tidx* __restrict outer_index,
+ const Tidx* __restrict cols,
T* __restrict output_values) {
- BENCHMARK_TIMER("SparseDenseMatmulCSR");
- const int32_t num_rows = weight_shape[1];
- const int32_t num_cols = weight_shape[0];
+ BENCHMARK_TIMER("SparseDenseMatMulCSR");
+ const int32_t num_cols = input_shape[1];
const auto in =
ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
- const Eigen::Map<const SparseMatrix<T>> weight(
- num_rows, num_cols, nnz, outer_index, cols, weight_values);
+ const Eigen::Map<const SparseMatrix<T, Tidx>> weight(
+ num_rows, num_cols, nnz_shape[0], outer_index, cols, nnz_values);
auto result = MatrixMap<T>(output_values, num_rows, input_shape[0]);
result.noalias() = weight * in;
}
-template <typename T>
+template <typename T, typename Tidx>
void SparseFullyConnectedCSR(const int32_t* __restrict input_shape,
const T* __restrict input_values,
- const int32_t* __restrict weight_shape,
- const T* __restrict weight_values,
- const int32_t nnz,
- const int32_t* outer_index,
- const int32_t* cols,
+ const int32_t num_rows,
+ const int32_t* __restrict nnz_shape,
+ const T* __restrict nnz_values,
+ const Tidx* __restrict outer_index,
+ const Tidx* __restrict cols,
const int32_t* __restrict bias_shape,
const T* __restrict bias_values,
T* __restrict output_values) {
BENCHMARK_TIMER("SparseFullyConnectedCSR");
- const int32_t num_rows = weight_shape[1];
- const int32_t num_cols = weight_shape[0];
+ const int32_t num_cols = input_shape[1];
const auto in =
ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]);
const auto bias = ConstRowVectorMap<T>(bias_values, bias_shape[0]);
- const Eigen::Map<const SparseMatrix<T>> weight(
- num_rows, num_cols, nnz, outer_index, cols, weight_values);
+ const Eigen::Map<const SparseMatrix<T, Tidx>> weight(
+ num_rows, num_cols, nnz_shape[0], outer_index, cols, nnz_values);
auto result = MatrixMap<T>(output_values, num_rows, input_shape[0]);
result.noalias() = (weight * in).colwise() + bias;
}
@@ -1478,16376 +1476,14449 @@ void DequantizeMinFirst(const int32_t rank,
// Note that for now, endianness of the target machine needs to match that of
// the one training was performed on.
// -----------------------------------------------------------------------------
-const int32_t dnn_hiddenlayer_0_bias_part_0_shape[1] = {102};
+const int32_t dnn_hiddenlayer_0_bias_part_0_shape[1] = {117};
const union {
- uint8_t bytes[408];
- float values[102];
+ uint8_t bytes[468];
+ float values[117];
} dnn_hiddenlayer_0_bias_part_0 = {{
- 0x0f, 0xba, 0xa9, 0xbe, 0x54, 0xd3, 0x36, 0xbd, 0x08, 0x7a, 0xcb, 0xbd,
- 0x49, 0x76, 0xdb, 0x3d, 0xbe, 0xc2, 0x33, 0xbe, 0x98, 0x7b, 0xf8, 0xbd,
- 0xef, 0xa4, 0xc0, 0x3e, 0xee, 0xb1, 0x85, 0x3f, 0xef, 0xcd, 0x4c, 0xbf,
- 0x51, 0xb7, 0xb7, 0x3d, 0xc7, 0x66, 0xb0, 0x3c, 0x46, 0x05, 0x88, 0xbf,
- 0x7f, 0x4a, 0x76, 0x3f, 0xca, 0xab, 0x84, 0xbe, 0x39, 0x83, 0x46, 0xbd,
- 0xd9, 0xc1, 0x17, 0xbe, 0x18, 0x85, 0x4f, 0xbd, 0x58, 0x1c, 0x87, 0xbf,
- 0x9a, 0x7b, 0x5d, 0xbf, 0x24, 0xe1, 0x96, 0xbf, 0x85, 0x0d, 0xbd, 0xbf,
- 0x66, 0x11, 0x17, 0xbf, 0x8b, 0x4c, 0x20, 0xbd, 0x61, 0xc8, 0x79, 0xbd,
- 0xb3, 0xfe, 0x9c, 0x3e, 0x6d, 0xfb, 0xa2, 0xbe, 0x2d, 0xa9, 0x26, 0xbe,
- 0x25, 0x1d, 0xe2, 0xbd, 0x00, 0x42, 0xf3, 0x3e, 0xbc, 0x0a, 0xbb, 0x3e,
- 0x45, 0x4b, 0xf3, 0xbc, 0x56, 0xde, 0xd6, 0xbd, 0xe3, 0xf7, 0xc6, 0x3e,
- 0x3d, 0x0d, 0xba, 0x3b, 0xa0, 0x1f, 0xe4, 0xbe, 0xa6, 0xb5, 0x4c, 0xbe,
- 0x5f, 0xa3, 0xa5, 0x3f, 0x06, 0x9b, 0xe0, 0xbe, 0xfb, 0x99, 0x0c, 0x3e,
- 0xc5, 0x59, 0x14, 0xbf, 0x15, 0xb1, 0xe1, 0xbc, 0xe7, 0xed, 0x8e, 0x3d,
- 0x55, 0x56, 0xfd, 0xbc, 0x38, 0x49, 0x45, 0x3e, 0x60, 0x99, 0x48, 0x3f,
- 0xc9, 0x94, 0x21, 0x3c, 0xc9, 0xc7, 0xc6, 0xbf, 0x43, 0xd0, 0xe9, 0xbf,
- 0x83, 0xc8, 0x7e, 0xbf, 0x58, 0xf5, 0xaf, 0x3e, 0xa0, 0x62, 0x2e, 0x3f,
- 0x9d, 0x15, 0x83, 0xbe, 0xf7, 0xfd, 0xaf, 0x3c, 0xf6, 0x9b, 0xb7, 0xbf,
- 0xb4, 0x91, 0xcd, 0x3f, 0x36, 0xe8, 0xa6, 0xbd, 0xb5, 0x6a, 0x13, 0x3e,
- 0x13, 0x79, 0x45, 0x3d, 0x15, 0x01, 0x0d, 0xbf, 0x72, 0xae, 0xb0, 0xbd,
- 0xf8, 0x44, 0x07, 0x3e, 0x76, 0xdd, 0x67, 0xbc, 0x29, 0x9e, 0xd2, 0x3e,
- 0xbb, 0x7d, 0x41, 0xbe, 0xc2, 0xd7, 0x89, 0xbe, 0xab, 0xb9, 0xb2, 0x3e,
- 0x9e, 0x0f, 0x05, 0xbe, 0x60, 0x9e, 0x45, 0xbe, 0x8b, 0xd5, 0x7e, 0x3f,
- 0xa6, 0xda, 0x86, 0x3e, 0xfa, 0xb9, 0x2d, 0xbe, 0x8d, 0xb2, 0xc9, 0xbe,
- 0x35, 0xa0, 0xd8, 0x3d, 0x0c, 0xaf, 0x8c, 0x3e, 0xaf, 0x71, 0x50, 0x3e,
- 0xf5, 0x36, 0x75, 0xbe, 0x98, 0x95, 0x8b, 0xba, 0xa4, 0xdf, 0x0e, 0xbe,
- 0x79, 0xfc, 0xf0, 0xbd, 0xfb, 0x25, 0xe0, 0xbd, 0x34, 0x01, 0x7f, 0x3f,
- 0x53, 0x9e, 0x0e, 0x3f, 0x13, 0x60, 0x85, 0xbd, 0x31, 0xa3, 0xd3, 0x3d,
- 0xad, 0x8c, 0xff, 0x3e, 0xd3, 0x2d, 0x8d, 0xbd, 0x7e, 0x86, 0x3d, 0xbd,
- 0x7d, 0x2f, 0x27, 0xbe, 0xb4, 0x0a, 0x61, 0x3d, 0x1a, 0xf2, 0x5b, 0xbd,
- 0x7b, 0x3a, 0x0a, 0xbd, 0x32, 0xad, 0xd5, 0xbe, 0xe1, 0x00, 0x6f, 0x3f,
- 0xb8, 0x08, 0x5c, 0x3e, 0xfb, 0xb9, 0x97, 0xbd, 0x75, 0x80, 0xa6, 0xbd,
- 0x99, 0x79, 0x92, 0x3f, 0x8b, 0x61, 0xb4, 0x3f, 0xd3, 0xbe, 0x72, 0x3e,
- 0x1f, 0x23, 0x0f, 0xbd, 0x43, 0xd5, 0x94, 0xbe, 0xb5, 0xe0, 0x61, 0x3f,
+ 0x97, 0xd4, 0x79, 0xbb, 0x66, 0xfb, 0x80, 0xbe, 0x54, 0x36, 0x40, 0xbc,
+ 0x86, 0xc2, 0x0a, 0xbe, 0x48, 0xb0, 0xbb, 0x3d, 0x72, 0xc8, 0x72, 0xbc,
+ 0x87, 0x1a, 0xb7, 0xbd, 0xff, 0xf0, 0xca, 0xbd, 0xc3, 0x9a, 0xb6, 0xbe,
+ 0x04, 0x38, 0x15, 0x3e, 0x1b, 0x9f, 0x42, 0xbd, 0x08, 0x86, 0x52, 0x3d,
+ 0xc0, 0x28, 0x96, 0x3e, 0xd2, 0x5e, 0x56, 0xbc, 0x0e, 0x88, 0xa8, 0x3e,
+ 0xb1, 0x99, 0x93, 0xbe, 0x23, 0x34, 0xe3, 0xbb, 0x0a, 0xea, 0x99, 0xbd,
+ 0x5e, 0x87, 0xf8, 0xbe, 0x5b, 0xe6, 0x9e, 0x3e, 0x50, 0xf4, 0xa6, 0x36,
+ 0xf1, 0x9a, 0x28, 0xbe, 0x30, 0x2d, 0x93, 0xbd, 0x58, 0x2b, 0xe2, 0xbc,
+ 0x3f, 0xdb, 0xaf, 0x3d, 0xc2, 0x0b, 0x75, 0xbc, 0x7e, 0x64, 0x15, 0x3e,
+ 0x52, 0x76, 0xdc, 0x3e, 0xb8, 0x44, 0x55, 0xbd, 0x74, 0xdb, 0x56, 0x3c,
+ 0x50, 0x24, 0xd5, 0x3e, 0x8e, 0xfc, 0x72, 0xbd, 0x2c, 0x75, 0x77, 0x3e,
+ 0x2f, 0x90, 0x99, 0xbe, 0xce, 0x76, 0x58, 0x3c, 0x9a, 0x5a, 0x00, 0xbe,
+ 0x1e, 0xb1, 0x74, 0xbd, 0x0d, 0x61, 0x98, 0x3d, 0xf9, 0x98, 0x48, 0x3d,
+ 0x13, 0x61, 0x4b, 0xbe, 0x97, 0x39, 0x90, 0xbe, 0x14, 0xbd, 0x99, 0xbe,
+ 0x43, 0xc3, 0x22, 0xbe, 0x12, 0x77, 0x56, 0xbd, 0x14, 0x6d, 0xae, 0x3e,
+ 0xc6, 0x91, 0xc8, 0xbd, 0x41, 0x19, 0xa4, 0xbe, 0x56, 0xf7, 0x8a, 0xbe,
+ 0x0e, 0x98, 0x82, 0xbe, 0x23, 0xe1, 0x89, 0xbe, 0x77, 0x4c, 0x6e, 0xbc,
+ 0xc6, 0x98, 0xc2, 0x3e, 0x8b, 0x2d, 0xce, 0x3d, 0xd5, 0xb2, 0x8d, 0xbe,
+ 0xae, 0x89, 0xe7, 0xbd, 0xe2, 0x88, 0xa9, 0x3e, 0xf6, 0x1c, 0x09, 0xbd,
+ 0x71, 0x73, 0xb1, 0x3b, 0xb5, 0x9b, 0x81, 0xbe, 0xc2, 0x5c, 0x6d, 0xbd,
+ 0x48, 0x79, 0x6f, 0xbe, 0xbb, 0xea, 0x83, 0x3e, 0xd3, 0xee, 0x96, 0xbe,
+ 0x2e, 0x4a, 0xfe, 0x3e, 0x96, 0xa0, 0x29, 0xbe, 0xa4, 0x08, 0x5c, 0x3e,
+ 0x75, 0xa3, 0x97, 0x3e, 0x1c, 0xf3, 0x20, 0xbe, 0xc7, 0x91, 0xc7, 0xbd,
+ 0x85, 0xb6, 0x35, 0x3e, 0x71, 0x59, 0xfe, 0x3c, 0x21, 0x7e, 0x47, 0x3e,
+ 0x00, 0xf7, 0x87, 0xbe, 0xe2, 0xf1, 0xb7, 0xbc, 0x63, 0x41, 0x6f, 0x3e,
+ 0xb5, 0x29, 0xec, 0x3e, 0x2d, 0x30, 0xcc, 0xbc, 0x36, 0xf8, 0x3f, 0xbc,
+ 0x0c, 0x44, 0x13, 0x3d, 0xb6, 0x3d, 0x89, 0x3c, 0x55, 0x10, 0xad, 0xbe,
+ 0xd2, 0x4a, 0x14, 0x3e, 0xdf, 0x29, 0xf5, 0x3c, 0xf7, 0x39, 0xc8, 0x3e,
+ 0x95, 0x61, 0xa7, 0x3d, 0x4f, 0x7d, 0xbc, 0xbe, 0x02, 0x3f, 0x9f, 0xbe,
+ 0xc7, 0xa1, 0x6f, 0x3e, 0x23, 0x45, 0x61, 0xbd, 0xa8, 0x42, 0xd1, 0xbe,
+ 0x2c, 0x67, 0x5c, 0xbe, 0x0d, 0x3a, 0x61, 0xbe, 0x47, 0xfd, 0x87, 0xbe,
+ 0x14, 0x01, 0x1a, 0x3e, 0x5f, 0x42, 0xb0, 0x3d, 0x70, 0x2c, 0x96, 0x3e,
+ 0xb3, 0xdc, 0x99, 0x3e, 0x4c, 0x4f, 0x95, 0x3d, 0xc4, 0xcb, 0x2e, 0x3e,
+ 0x54, 0x68, 0xb3, 0xbe, 0x90, 0x91, 0xe4, 0xbe, 0x4f, 0xc7, 0x59, 0xbe,
+ 0xb7, 0x72, 0x24, 0xbc, 0x05, 0x19, 0xa6, 0x3e, 0xf7, 0xb1, 0x2e, 0xbe,
+ 0xfd, 0x4e, 0xd4, 0xbd, 0x42, 0xa8, 0x41, 0x3d, 0x7d, 0x2e, 0xd2, 0xbe,
+ 0x37, 0x3c, 0x52, 0xbc, 0x0a, 0xdd, 0xf0, 0xbe, 0x05, 0xd8, 0xbf, 0xbc,
+ 0xf0, 0xc2, 0x95, 0x3e, 0x81, 0x26, 0x86, 0x3e, 0x88, 0x6e, 0x82, 0xbd,
+ 0xfc, 0xf4, 0x6d, 0xbb, 0xde, 0x87, 0x92, 0x3d, 0x6c, 0xbf, 0x97, 0xbe,
}};
-const int32_t dnn_hiddenlayer_0_kernel_part_0_shape[2] = {193, 102};
+const int32_t dnn_hiddenlayer_0_kernel_part_0_shape[2] = {193, 117};
const union {
- uint8_t bytes[78744];
- float values[19686];
+ uint8_t bytes[90324];
+ float values[22581];
} dnn_hiddenlayer_0_kernel_part_0 = {{
- 0x19, 0x27, 0x16, 0xbe, 0x56, 0x7f, 0x83, 0xbd, 0xbf, 0xbb, 0xcc, 0x3d,
- 0xe5, 0xee, 0x65, 0xbf, 0x21, 0xd1, 0x7b, 0xbe, 0x3f, 0x1c, 0xb1, 0xbe,
- 0xd7, 0x15, 0xa5, 0x3b, 0x6b, 0xb5, 0x34, 0xbe, 0x61, 0xf9, 0x06, 0x3f,
- 0xeb, 0xd0, 0xfa, 0xbd, 0xf8, 0x36, 0x6b, 0xbe, 0x5a, 0xe7, 0x3e, 0xbd,
- 0xf6, 0x31, 0x74, 0xbd, 0xb2, 0x29, 0x6b, 0x3e, 0xaa, 0x2c, 0xe9, 0xbd,
- 0x13, 0x7d, 0xb8, 0x3e, 0xf9, 0x29, 0xfd, 0xbe, 0x20, 0x5c, 0x4e, 0x3e,
- 0x2b, 0x20, 0x0e, 0x3e, 0xf1, 0xc3, 0xf2, 0x3e, 0x46, 0x3f, 0xdc, 0x3d,
- 0x13, 0xdc, 0x90, 0xbe, 0x86, 0x1a, 0x29, 0x3d, 0x72, 0xe1, 0x13, 0x3d,
- 0x4e, 0xa1, 0x92, 0x3e, 0x58, 0x16, 0xa6, 0xbb, 0xa8, 0xd7, 0x1c, 0x3d,
- 0x2f, 0x62, 0x9c, 0xbc, 0xcb, 0x20, 0x5f, 0x3e, 0xac, 0xd2, 0x9d, 0xbe,
- 0xdb, 0xeb, 0xcd, 0xbd, 0xe1, 0xbc, 0x40, 0xbe, 0x9f, 0x5a, 0x80, 0x3e,
- 0x09, 0x0c, 0x8c, 0x3d, 0x36, 0x5b, 0xac, 0xbd, 0x08, 0xdb, 0xfa, 0x3b,
- 0xaf, 0x0f, 0x92, 0xbd, 0x35, 0x2e, 0xdf, 0x3e, 0xb0, 0xfa, 0xb8, 0x3e,
- 0x98, 0x6e, 0x9f, 0x3e, 0xc5, 0xd8, 0x04, 0x3d, 0xfb, 0x4f, 0x6f, 0xbe,
- 0x60, 0x40, 0x5f, 0xbe, 0x16, 0x1c, 0xad, 0x3c, 0x29, 0x41, 0xbc, 0x3d,
- 0x67, 0x0b, 0x7e, 0xbd, 0xdb, 0x53, 0x55, 0x3d, 0x89, 0xce, 0xef, 0xbc,
- 0x94, 0x1a, 0xbc, 0x3d, 0xca, 0xd3, 0x92, 0x3e, 0xfa, 0x57, 0xea, 0xbd,
- 0x7e, 0x26, 0x5c, 0x3b, 0x95, 0x03, 0xc3, 0xbe, 0x26, 0xdc, 0x3c, 0x3e,
- 0x4d, 0x48, 0xc6, 0x3e, 0xc3, 0x81, 0x29, 0xbe, 0x9d, 0x9d, 0xec, 0xbe,
- 0xb1, 0x0f, 0x49, 0xbe, 0xc6, 0xfb, 0x45, 0xbe, 0xdd, 0x61, 0xa4, 0xbd,
- 0x34, 0xba, 0x28, 0x3e, 0x04, 0x08, 0x0d, 0xbd, 0x1d, 0x34, 0xe4, 0x3c,
- 0xa7, 0x1a, 0x42, 0xbe, 0x9e, 0x08, 0x49, 0x3e, 0x4a, 0xfb, 0x0c, 0xbe,
- 0xd5, 0xa6, 0x3c, 0xbe, 0x80, 0xa5, 0x5d, 0x3d, 0xf5, 0xbf, 0x84, 0xbe,
- 0x15, 0x9f, 0x82, 0xbe, 0xfb, 0xd5, 0x42, 0xbe, 0xa3, 0xf8, 0x9c, 0xbc,
- 0x11, 0x6a, 0x80, 0x3d, 0xf1, 0x9d, 0xd4, 0xbe, 0x42, 0xb5, 0x47, 0xbd,
- 0x65, 0xfe, 0xd7, 0x3d, 0x1d, 0xc6, 0x76, 0x3c, 0x78, 0x9c, 0x49, 0xbe,
- 0xfa, 0xfb, 0xb7, 0x3d, 0x79, 0x48, 0x31, 0x3d, 0x02, 0x80, 0xe0, 0x3c,
- 0xfc, 0xca, 0x7a, 0xbe, 0x07, 0xb7, 0x16, 0xbe, 0x2c, 0xcb, 0x6a, 0xbe,
- 0x4b, 0xe3, 0xf4, 0xbe, 0x5c, 0xc6, 0xca, 0xbb, 0xde, 0x46, 0x51, 0x3e,
- 0xe5, 0x4f, 0x14, 0xbe, 0xc8, 0x5a, 0xf3, 0xbd, 0x82, 0xa4, 0x88, 0xbc,
- 0x51, 0xd4, 0xf0, 0xbd, 0x64, 0x09, 0x85, 0xbe, 0x1f, 0x99, 0xc9, 0xbe,
- 0x76, 0x30, 0xa2, 0xbe, 0x9a, 0x9d, 0x5e, 0xbe, 0xcd, 0x98, 0x40, 0xbd,
- 0x33, 0x1b, 0x37, 0xbe, 0x40, 0xea, 0x8a, 0xbd, 0xf7, 0x33, 0x20, 0x3e,
- 0xa0, 0x3e, 0xc0, 0xbd, 0xe1, 0x03, 0x61, 0xbe, 0x69, 0xb3, 0x9c, 0xbe,
- 0x8b, 0x01, 0x7c, 0x3d, 0xd2, 0xcb, 0x7b, 0xbe, 0xfe, 0x19, 0x95, 0x3d,
- 0x09, 0x91, 0x60, 0xbf, 0xb4, 0x97, 0x20, 0xbd, 0x55, 0xfa, 0x6e, 0xbe,
- 0x63, 0xac, 0xbf, 0x3e, 0xf5, 0x71, 0xad, 0x3e, 0xe9, 0xd6, 0xfc, 0x3d,
- 0xe5, 0xb8, 0x5a, 0xbe, 0x3d, 0xe0, 0xec, 0xbe, 0xab, 0x63, 0x97, 0xbd,
- 0xab, 0xe9, 0xed, 0x3d, 0x28, 0x42, 0x44, 0xbd, 0x9f, 0x9a, 0xc9, 0xbd,
- 0x8a, 0x7e, 0x22, 0x3f, 0x5c, 0xd2, 0x02, 0x3c, 0xb2, 0x49, 0x8e, 0xbe,
- 0x38, 0xc7, 0x2d, 0x3e, 0xb2, 0x37, 0x97, 0x3e, 0x6d, 0x21, 0x77, 0x3e,
- 0xca, 0x87, 0x9f, 0xbe, 0xed, 0xba, 0x82, 0xbe, 0xdf, 0x49, 0xdc, 0xbd,
- 0xf6, 0xa7, 0x96, 0x3e, 0x99, 0xa2, 0x83, 0x3e, 0x63, 0x80, 0x1f, 0xbf,
- 0xb6, 0x7b, 0xe3, 0xbd, 0xd7, 0x7e, 0x98, 0xbe, 0xb7, 0xb4, 0x73, 0xbe,
- 0xc6, 0xec, 0x12, 0x3d, 0x14, 0x2c, 0x27, 0xbd, 0x7e, 0xed, 0x9f, 0x3d,
- 0xeb, 0xba, 0x1e, 0xbe, 0x35, 0xc9, 0x32, 0xbd, 0x09, 0xe5, 0xb4, 0xbd,
- 0x86, 0x09, 0x02, 0x3e, 0x01, 0xc6, 0xa3, 0xbe, 0xbe, 0x82, 0x55, 0x3e,
- 0xbf, 0x7d, 0x17, 0x3e, 0xe7, 0x7b, 0x15, 0xbe, 0x75, 0xa1, 0x9b, 0xbe,
- 0x4e, 0xf5, 0x98, 0xbe, 0x45, 0x53, 0x3f, 0xbe, 0xb0, 0xa4, 0x58, 0x3e,
- 0x15, 0x5c, 0xd7, 0xbd, 0x8d, 0x4f, 0x27, 0xbd, 0x33, 0x77, 0x59, 0x3d,
- 0xa0, 0xb2, 0x37, 0x3e, 0x20, 0xca, 0x3e, 0xbc, 0x94, 0x43, 0x24, 0x3e,
- 0x8e, 0x07, 0xb2, 0xbd, 0xab, 0x42, 0xf0, 0xbe, 0xe5, 0xcc, 0x55, 0x3d,
- 0x83, 0x57, 0x0e, 0xbe, 0xa5, 0x87, 0xc3, 0xbe, 0x70, 0xde, 0xd0, 0xbd,
- 0xff, 0x41, 0x33, 0xbe, 0x8a, 0xd3, 0xc5, 0x3e, 0xeb, 0xf9, 0x1b, 0x3e,
- 0xc6, 0x5c, 0x60, 0xbe, 0xae, 0x32, 0xcf, 0xbd, 0x74, 0x2d, 0x14, 0xbe,
- 0xe7, 0xb8, 0xdd, 0xbd, 0xd1, 0xd5, 0x6e, 0xbb, 0xc2, 0x6b, 0xbe, 0xbe,
- 0xa8, 0x7a, 0x50, 0xbb, 0x09, 0x39, 0xcc, 0xbd, 0x8f, 0xd2, 0x82, 0xbe,
- 0xeb, 0x3c, 0x20, 0xbf, 0x0b, 0x41, 0x84, 0xbe, 0x22, 0x59, 0x6a, 0xbe,
- 0xe1, 0x52, 0x02, 0x3e, 0x54, 0x3c, 0x94, 0xbd, 0xa3, 0x39, 0x00, 0xbe,
- 0x60, 0xb9, 0x81, 0x3d, 0x5e, 0xb9, 0xdc, 0xb8, 0xb6, 0xbc, 0x9a, 0xbe,
- 0xa4, 0x78, 0x20, 0x3d, 0x9f, 0x41, 0x08, 0xbe, 0xe3, 0x4c, 0xc9, 0x3d,
- 0xe1, 0x92, 0xe1, 0x3d, 0xea, 0xc3, 0xd0, 0x3d, 0xdf, 0xda, 0xd7, 0xbe,
- 0x61, 0x02, 0x08, 0xbe, 0xf3, 0x12, 0x82, 0xbc, 0x01, 0x06, 0x4e, 0xbe,
- 0x2e, 0xae, 0x29, 0xbe, 0x68, 0xba, 0x35, 0xbe, 0x01, 0x72, 0xc8, 0xbd,
- 0x7d, 0x86, 0x27, 0xbd, 0x4a, 0x17, 0x25, 0xbe, 0xbf, 0x7d, 0x33, 0x3d,
- 0xab, 0x48, 0xb2, 0x3d, 0xa4, 0xe4, 0xea, 0xbe, 0xa2, 0xfa, 0x37, 0xbe,
- 0xc1, 0x8f, 0x58, 0xbd, 0xaf, 0xff, 0x97, 0xbd, 0x1e, 0x57, 0xcd, 0xbd,
- 0xe9, 0xdc, 0x73, 0xbe, 0x1a, 0x65, 0x31, 0xbe, 0xc2, 0x6e, 0xab, 0x3e,
- 0xf2, 0x43, 0x3f, 0xbd, 0xc0, 0x87, 0xb2, 0xbd, 0xd6, 0x68, 0xd7, 0x3d,
- 0x53, 0xa8, 0xf4, 0xbd, 0x79, 0x81, 0x09, 0xbe, 0xfb, 0xf6, 0x11, 0xbe,
- 0x48, 0x20, 0xbe, 0x3d, 0xae, 0x22, 0xbf, 0xbd, 0x00, 0x48, 0x0d, 0x3e,
- 0x02, 0xc1, 0xbb, 0xbd, 0x7e, 0xf6, 0xd9, 0xbd, 0x08, 0x82, 0xb7, 0xbd,
- 0xe2, 0x84, 0x0b, 0x3e, 0x72, 0x8a, 0x9b, 0x3d, 0x6d, 0x2f, 0xd5, 0xbd,
- 0x46, 0x2e, 0xc9, 0xbd, 0x60, 0xc4, 0x08, 0xbc, 0x08, 0x67, 0x0d, 0x3d,
- 0xfe, 0x67, 0x03, 0x3e, 0xe0, 0xb2, 0x6f, 0xbc, 0x17, 0x3f, 0x07, 0xbe,
- 0x00, 0xa5, 0x37, 0x3c, 0x20, 0x14, 0x6c, 0x3d, 0x0a, 0xa8, 0xe6, 0xbd,
- 0xf6, 0xa3, 0xcf, 0xbd, 0x60, 0x89, 0x2d, 0x3c, 0x50, 0x67, 0xb3, 0xbc,
- 0xbe, 0xdb, 0x95, 0xbd, 0x94, 0x7f, 0x95, 0x3d, 0x5c, 0xae, 0xa5, 0x3d,
- 0xac, 0x43, 0x04, 0xbe, 0x4c, 0x70, 0xe0, 0x3d, 0x98, 0xa9, 0x01, 0xbd,
- 0xb6, 0x7d, 0x94, 0x3d, 0x9c, 0xcb, 0xb9, 0xbc, 0xee, 0x20, 0x0c, 0x3e,
- 0x62, 0x17, 0xb8, 0xbd, 0x10, 0x41, 0xc6, 0xbd, 0x90, 0x9f, 0xb0, 0xbd,
- 0xd0, 0x53, 0xe3, 0xbd, 0x34, 0xe9, 0x7c, 0x3d, 0xb6, 0x60, 0x4b, 0xbd,
- 0x9c, 0x21, 0x4a, 0x3d, 0x22, 0x96, 0x0c, 0xbd, 0x82, 0x69, 0x3c, 0xbd,
- 0x60, 0x33, 0xc0, 0xbd, 0x8c, 0x95, 0x86, 0xbd, 0x6d, 0xde, 0x0e, 0xbe,
- 0x70, 0xa3, 0x04, 0x3c, 0x87, 0x75, 0xf0, 0xbd, 0x28, 0xcb, 0x87, 0x3c,
- 0xc0, 0xaa, 0x90, 0xbd, 0x9e, 0x29, 0x30, 0xbd, 0x90, 0xf3, 0x9a, 0xbd,
- 0x72, 0x2d, 0xa3, 0x3d, 0xfe, 0x3b, 0x90, 0xbd, 0xb4, 0x26, 0xf9, 0x3d,
- 0x80, 0x1b, 0x76, 0xbc, 0x24, 0x63, 0xba, 0xbc, 0x60, 0x6f, 0xf2, 0xbb,
- 0xf0, 0x3e, 0x16, 0xbc, 0xa4, 0xd0, 0x09, 0xbe, 0x0e, 0x3f, 0x04, 0xbe,
- 0x33, 0x7e, 0xe9, 0xbd, 0x80, 0xb3, 0x65, 0x3c, 0xea, 0x49, 0x79, 0xbd,
- 0x10, 0x3b, 0x32, 0x3c, 0x40, 0x95, 0xf1, 0xbb, 0xb8, 0x4a, 0x55, 0xbd,
- 0x44, 0xee, 0xf6, 0x3d, 0x90, 0xac, 0xea, 0x3d, 0x1c, 0x6f, 0xdd, 0x3d,
- 0x9e, 0x47, 0x5b, 0xbd, 0x1c, 0xae, 0x7e, 0xbd, 0xb8, 0xcc, 0xe2, 0xbd,
- 0x76, 0xa0, 0x29, 0xbd, 0x1c, 0xde, 0xee, 0x3d, 0xe0, 0xfb, 0x17, 0x3c,
- 0xe4, 0x2e, 0x3c, 0xbd, 0xc0, 0xfa, 0x29, 0xbb, 0xa4, 0x9b, 0xb0, 0x3d,
- 0x9a, 0xc5, 0x81, 0x3d, 0x00, 0x00, 0x68, 0x3a, 0xac, 0x3a, 0x02, 0xbe,
- 0x14, 0x71, 0x34, 0x3d, 0xfe, 0x23, 0xbd, 0xbd, 0xb6, 0xef, 0xbe, 0xbd,
- 0xd5, 0x27, 0x92, 0xbd, 0x20, 0xaf, 0xcf, 0xbb, 0x04, 0xee, 0x07, 0x3d,
- 0x30, 0x86, 0x36, 0xbc, 0xa3, 0x47, 0x0b, 0xbe, 0x80, 0xfd, 0x56, 0xbc,
- 0x00, 0x58, 0xe7, 0x3a, 0x80, 0x2e, 0xbb, 0xbc, 0xbc, 0xfc, 0xdc, 0xbc,
- 0xe0, 0xc8, 0x3c, 0xbc, 0x2e, 0xa1, 0xe3, 0xbd, 0xd6, 0x5c, 0xab, 0xbd,
- 0x34, 0x32, 0xc2, 0xbd, 0x80, 0x45, 0x29, 0x3c, 0x50, 0x63, 0x02, 0x3e,
- 0xdd, 0x31, 0x97, 0x3d, 0xb8, 0xd1, 0x4d, 0xbd, 0x8d, 0x92, 0x58, 0x3d,
- 0x48, 0xe7, 0xe1, 0x3d, 0x43, 0xc3, 0x6d, 0x3d, 0x19, 0xba, 0x1b, 0xbb,
- 0x45, 0x35, 0xe8, 0xbc, 0xe0, 0xa6, 0x96, 0x3d, 0x76, 0x1a, 0xfd, 0xbd,
- 0x9a, 0x34, 0x30, 0xbd, 0x2a, 0x6b, 0xfd, 0xbc, 0xbd, 0xf8, 0x67, 0xbc,
- 0x55, 0xea, 0x42, 0x3d, 0x58, 0xd0, 0x28, 0x3a, 0x90, 0x47, 0x0c, 0xbe,
- 0x6c, 0x44, 0xdd, 0x3d, 0x46, 0x60, 0x94, 0x3d, 0x68, 0x32, 0xa3, 0x3d,
- 0x23, 0x9d, 0x72, 0xbe, 0xcc, 0xdf, 0x33, 0xbd, 0xe4, 0x39, 0x04, 0xbb,
- 0x1c, 0x78, 0xd4, 0xb8, 0xbc, 0xff, 0x7d, 0xbd, 0x83, 0x24, 0xf0, 0xbd,
- 0x46, 0x06, 0xcd, 0x3d, 0x0f, 0x07, 0xa3, 0xbe, 0x85, 0x9e, 0xb9, 0xbc,
- 0x87, 0xd3, 0xd3, 0xbd, 0x69, 0x03, 0x25, 0x3d, 0xa3, 0xef, 0x88, 0x3d,
- 0x0a, 0x65, 0x28, 0xbc, 0xcb, 0x28, 0x9b, 0xbd, 0x1e, 0x4d, 0xa1, 0xbf,
- 0xcd, 0xd9, 0x87, 0xbd, 0xdf, 0x06, 0xf5, 0x3d, 0x04, 0x91, 0x77, 0xbd,
- 0xc6, 0x86, 0x04, 0x3e, 0x1a, 0x5a, 0x06, 0x3d, 0x67, 0xbf, 0x33, 0xbe,
- 0x4e, 0x85, 0xbb, 0xbe, 0x74, 0xac, 0x20, 0xbe, 0xdb, 0x60, 0x90, 0xbe,
- 0xbf, 0xc9, 0xd9, 0xbe, 0xd1, 0x05, 0x15, 0xbe, 0x38, 0x34, 0x13, 0xbd,
- 0x88, 0xb3, 0xa0, 0xbd, 0xf3, 0x29, 0x20, 0x3e, 0xe4, 0x19, 0x12, 0xbd,
- 0x42, 0xfb, 0x16, 0x3e, 0xce, 0xc2, 0xc4, 0xbe, 0x11, 0x92, 0x6e, 0x3d,
- 0x9a, 0x19, 0x84, 0xbe, 0xcc, 0x44, 0x64, 0xbe, 0x0e, 0x1b, 0xda, 0xbd,
- 0x6c, 0x10, 0xa6, 0x3d, 0xb5, 0x44, 0x4b, 0xbe, 0xc6, 0x4a, 0x31, 0xbe,
- 0x2c, 0x0a, 0x0d, 0xbe, 0x9f, 0x69, 0x03, 0xbe, 0xfd, 0xec, 0x97, 0xbe,
- 0x28, 0x1d, 0x5f, 0xbe, 0xbc, 0x66, 0x9e, 0xbd, 0x58, 0x0f, 0xe4, 0xbe,
- 0x65, 0x3f, 0x21, 0xbe, 0x6c, 0xbc, 0xb9, 0xbe, 0x69, 0xf9, 0xce, 0xbb,
- 0xc4, 0xea, 0x85, 0xbc, 0x49, 0xdb, 0x46, 0xbe, 0x2b, 0x04, 0x00, 0x3e,
- 0x1c, 0x15, 0x02, 0x3e, 0xcc, 0xdc, 0xf0, 0x3d, 0x43, 0x3d, 0x42, 0xbe,
- 0x05, 0x90, 0xa5, 0x3d, 0x4b, 0x3d, 0x12, 0xbf, 0xb4, 0x6f, 0x62, 0x3c,
- 0x5b, 0x35, 0x2b, 0xbd, 0xc7, 0xa0, 0x87, 0xbe, 0x1a, 0xbc, 0x75, 0xbd,
- 0x1b, 0x1a, 0xd7, 0x3d, 0xa4, 0xb7, 0x5b, 0x3c, 0x93, 0x67, 0xc9, 0xbd,
- 0x05, 0x3b, 0xa6, 0xbd, 0xe5, 0xcb, 0xf8, 0x3b, 0xde, 0x05, 0x80, 0xbd,
- 0x02, 0x40, 0x8c, 0x3d, 0xed, 0x94, 0x86, 0xbd, 0x29, 0xd0, 0xbf, 0x3c,
- 0x77, 0x04, 0xf1, 0xbd, 0x8e, 0xef, 0xcb, 0x3b, 0x5e, 0x01, 0xaf, 0x3d,
- 0xca, 0x85, 0xf7, 0xbd, 0x6c, 0x83, 0x8b, 0x3c, 0xc4, 0xe7, 0x86, 0x3d,
- 0xf1, 0x03, 0xea, 0x3d, 0x9f, 0x97, 0x57, 0xbe, 0x4e, 0xbd, 0x0d, 0xbe,
- 0xea, 0x46, 0x17, 0x3b, 0x6a, 0xb4, 0x24, 0x3d, 0xe1, 0x8a, 0xc5, 0x3d,
- 0x90, 0xde, 0x18, 0xbe, 0x98, 0xb7, 0x0d, 0xbf, 0x61, 0x41, 0x0b, 0xbd,
- 0xdb, 0xb8, 0xab, 0xbe, 0xbd, 0xfa, 0x33, 0xbe, 0x46, 0x75, 0x1e, 0xbe,
- 0x4a, 0xee, 0xe8, 0xbc, 0x4e, 0x15, 0x8c, 0xbe, 0x3d, 0x17, 0x66, 0xbe,
- 0x5b, 0xcc, 0x85, 0x3e, 0x48, 0x51, 0x8a, 0x3f, 0x25, 0x8e, 0x67, 0xbf,
- 0xc3, 0x87, 0x17, 0x3e, 0x67, 0xed, 0xa7, 0x3c, 0xf4, 0x0d, 0x77, 0xbf,
- 0x69, 0x5f, 0x8a, 0x3f, 0x0e, 0xd5, 0x8a, 0xbe, 0x32, 0x1f, 0xb3, 0x3d,
- 0xc4, 0x0e, 0x79, 0xbe, 0x2e, 0xc3, 0xb8, 0xbd, 0x56, 0x07, 0x6a, 0xbf,
- 0x98, 0x3a, 0x56, 0xbf, 0x11, 0xb4, 0x94, 0xbf, 0x8a, 0xb9, 0xb3, 0xbf,
- 0xab, 0x4b, 0x16, 0xbf, 0xe9, 0x4f, 0x03, 0xbd, 0x53, 0x16, 0xa5, 0xbd,
- 0x15, 0x27, 0x9a, 0x3e, 0x51, 0x9e, 0x9a, 0xbe, 0xfb, 0x4e, 0x2e, 0xbe,
- 0xeb, 0x82, 0x5c, 0xbe, 0xd0, 0x94, 0xb7, 0x3e, 0xbc, 0xad, 0xd3, 0x3e,
- 0x8e, 0x79, 0x25, 0xbe, 0xf5, 0xda, 0x69, 0xbe, 0x1d, 0xc7, 0x91, 0x3e,
- 0x29, 0x41, 0x4c, 0x3c, 0xbd, 0x61, 0x0b, 0xbf, 0xf0, 0x4f, 0x4d, 0xbe,
- 0x64, 0x02, 0xaa, 0x3f, 0xe6, 0x31, 0xd5, 0xbe, 0x5a, 0xd9, 0x49, 0x3d,
- 0xe6, 0xc8, 0x01, 0xbf, 0x2a, 0xe7, 0x43, 0xbd, 0xcf, 0x11, 0x03, 0xbd,
- 0x30, 0x70, 0xcb, 0xbb, 0x50, 0x43, 0x69, 0x3e, 0xa6, 0x63, 0x3e, 0x3f,
- 0xee, 0x69, 0x05, 0xbe, 0x26, 0x47, 0xce, 0xbf, 0x87, 0x8c, 0xf7, 0xbf,
- 0x41, 0x93, 0x67, 0xbf, 0x32, 0x73, 0xa8, 0x3e, 0x00, 0xec, 0x45, 0x3f,
- 0xbd, 0x25, 0xbc, 0xbe, 0x0e, 0x11, 0xb4, 0xbd, 0x33, 0x19, 0xab, 0xbf,
- 0x03, 0xb5, 0xde, 0x3f, 0xa4, 0x70, 0x98, 0x3c, 0x9b, 0x93, 0x4f, 0x3e,
- 0xf0, 0xea, 0x9f, 0xbd, 0x52, 0x64, 0xea, 0xbe, 0xc5, 0x42, 0x3f, 0xbe,
- 0x45, 0x22, 0x52, 0x3d, 0x5f, 0x51, 0x86, 0x3c, 0x15, 0xf5, 0x9e, 0x3e,
- 0x09, 0xdd, 0xff, 0xbd, 0xcd, 0xe6, 0x32, 0xbe, 0xbd, 0x26, 0x8b, 0x3e,
- 0xca, 0x85, 0xda, 0xbd, 0x5c, 0x34, 0x3e, 0xbe, 0x99, 0xe5, 0x85, 0x3f,
- 0x02, 0x30, 0x79, 0x3e, 0x27, 0xd2, 0x7f, 0xbd, 0x11, 0x41, 0xef, 0xbe,
- 0xb2, 0x0e, 0x6f, 0xbc, 0xb4, 0xc9, 0xba, 0x3e, 0xc6, 0x3d, 0xaa, 0x3e,
- 0x26, 0xdc, 0x70, 0xbe, 0x9b, 0x5f, 0x70, 0x3d, 0xd1, 0x8d, 0xba, 0xbd,
- 0x2a, 0x79, 0xe0, 0xbd, 0x32, 0x39, 0x18, 0xbd, 0x53, 0x7c, 0x8d, 0x3f,
- 0x5f, 0xcc, 0x21, 0x3f, 0x45, 0x28, 0xba, 0x3a, 0xd4, 0x5d, 0xac, 0x3c,
- 0x35, 0xca, 0xf7, 0x3e, 0xb0, 0x1a, 0x4d, 0xbe, 0x6c, 0x73, 0x2e, 0x3d,
- 0xec, 0x01, 0xf8, 0xbd, 0x36, 0x34, 0x10, 0x3d, 0x2a, 0xd7, 0x73, 0xbd,
- 0x2e, 0x5c, 0xdc, 0x3d, 0x6f, 0xd1, 0x01, 0xbf, 0xb1, 0x03, 0x4f, 0x3f,
- 0x10, 0xcf, 0x69, 0x3e, 0xb6, 0x96, 0x1f, 0xbe, 0xc7, 0x79, 0x43, 0xbe,
- 0xdd, 0x5e, 0x91, 0x3f, 0xcb, 0x59, 0xc1, 0x3f, 0xef, 0xf4, 0x50, 0x3e,
- 0x6e, 0xeb, 0xd2, 0x3d, 0x59, 0xf5, 0x3e, 0xbe, 0xa7, 0xd1, 0x4d, 0x3f,
- 0xd0, 0x6f, 0xe7, 0x3d, 0xad, 0x1f, 0x9d, 0x3d, 0xfd, 0x0d, 0x09, 0xbe,
- 0x91, 0x74, 0x01, 0xbf, 0x26, 0x82, 0xa3, 0xbd, 0xc2, 0x20, 0x96, 0xbe,
- 0x56, 0xd6, 0x08, 0x3e, 0x8f, 0x1e, 0x3f, 0xbe, 0x38, 0xcf, 0x68, 0x3d,
- 0x90, 0xd4, 0x66, 0xbd, 0x50, 0x1e, 0x57, 0x3d, 0x12, 0x89, 0x94, 0xbc,
- 0xd8, 0xba, 0xde, 0x3d, 0x9b, 0x56, 0x91, 0x3e, 0x76, 0x7c, 0x8c, 0x3c,
- 0x2c, 0xa5, 0x7a, 0x3e, 0xc9, 0x14, 0xcc, 0xbe, 0xd0, 0xc9, 0xa5, 0x3e,
- 0x39, 0x84, 0x2b, 0x3e, 0x22, 0xec, 0xad, 0x3e, 0x08, 0x95, 0x40, 0x3d,
- 0x8b, 0x33, 0x97, 0xbe, 0xaf, 0x05, 0x24, 0x3c, 0x2c, 0x98, 0x29, 0xbe,
- 0xed, 0x19, 0x81, 0x3e, 0xc4, 0xe9, 0x1c, 0xbe, 0x12, 0x5e, 0xd7, 0xbc,
- 0x61, 0x2d, 0xf1, 0x3b, 0x93, 0x43, 0x0f, 0x3e, 0x06, 0xa3, 0xa4, 0xbe,
- 0x66, 0xf6, 0x67, 0xbc, 0x55, 0x64, 0xd3, 0xbc, 0x6f, 0x84, 0x70, 0x3d,
- 0xd8, 0xdc, 0x25, 0x3d, 0x50, 0x8c, 0x2e, 0xbe, 0x17, 0x05, 0x6d, 0x3d,
- 0x8f, 0xe0, 0x7e, 0xbe, 0xff, 0x7e, 0x13, 0x3f, 0x24, 0xb2, 0xc3, 0x3e,
- 0x4d, 0x0b, 0x64, 0x3e, 0x30, 0x9b, 0x81, 0xbd, 0x17, 0x20, 0x35, 0xbe,
- 0xc0, 0x10, 0x80, 0xbe, 0x53, 0xe5, 0x40, 0x3e, 0xf4, 0x4b, 0xe9, 0xbd,
- 0xfc, 0xbb, 0x39, 0x3d, 0xb7, 0x5f, 0x84, 0xbc, 0xa8, 0x83, 0x7f, 0x3c,
- 0xb1, 0x4b, 0x66, 0x3e, 0xe6, 0x75, 0x08, 0x3d, 0xbf, 0x84, 0x07, 0xbe,
- 0xc8, 0x53, 0x7c, 0xbb, 0x94, 0xb0, 0x5e, 0xbe, 0x4e, 0x0a, 0x9c, 0x3d,
- 0xa7, 0xba, 0x80, 0x3e, 0x11, 0x1a, 0x9e, 0xbe, 0x00, 0x55, 0x22, 0xbe,
- 0x57, 0x97, 0xae, 0xbd, 0xd1, 0xd4, 0x8b, 0x3d, 0x6b, 0x60, 0x01, 0xbe,
- 0xac, 0xfc, 0x3b, 0x3e, 0x37, 0xff, 0xd4, 0x3d, 0xae, 0xc0, 0xb9, 0xbd,
- 0xcd, 0x8f, 0xa2, 0xbe, 0x52, 0x51, 0x38, 0x3e, 0x1f, 0x8c, 0xa9, 0xbe,
- 0x07, 0x2f, 0x96, 0xbd, 0x78, 0x5e, 0x72, 0xbd, 0x27, 0x14, 0x73, 0xbe,
- 0x8c, 0x85, 0x1a, 0xba, 0xbd, 0x65, 0x67, 0x3c, 0xd9, 0xdf, 0xcc, 0x3d,
- 0x9c, 0x89, 0x92, 0xbd, 0x27, 0x61, 0x02, 0xbe, 0xad, 0x23, 0x0a, 0xbe,
- 0xbf, 0x79, 0x10, 0xbe, 0x2f, 0x12, 0x3a, 0xbc, 0x81, 0x3f, 0xaf, 0xbd,
- 0x49, 0x6c, 0x15, 0xbe, 0xcd, 0x81, 0x0d, 0x3d, 0x40, 0xb3, 0x2e, 0xbd,
- 0xac, 0xc0, 0x6e, 0x3c, 0x7a, 0x9a, 0xed, 0xbd, 0xa1, 0x2c, 0x98, 0xbe,
- 0x53, 0x8c, 0xc3, 0xbe, 0x04, 0x60, 0x19, 0xbe, 0x2a, 0x57, 0x00, 0x3d,
- 0xfe, 0xf2, 0x31, 0xbb, 0x51, 0x3b, 0xaa, 0xbd, 0x99, 0x4b, 0x11, 0xbe,
- 0x1f, 0x4d, 0x0d, 0xbe, 0x79, 0x9f, 0x27, 0xbe, 0x89, 0xb9, 0x80, 0xbd,
- 0x97, 0x33, 0x82, 0xbe, 0x5f, 0x4a, 0x3c, 0xbd, 0x51, 0x60, 0x8f, 0xbd,
- 0x61, 0x96, 0x87, 0xbd, 0xad, 0x51, 0xa9, 0xbe, 0x8a, 0x46, 0x1a, 0x3e,
- 0x76, 0x6e, 0x6f, 0x3c, 0x24, 0xe3, 0x93, 0xbe, 0xbd, 0x55, 0x25, 0xbe,
- 0x42, 0x24, 0x63, 0x3e, 0x31, 0xb0, 0x16, 0xbd, 0x68, 0x8d, 0x8a, 0x3d,
- 0xba, 0x0d, 0x25, 0xbf, 0x53, 0x35, 0x5a, 0xbe, 0xb9, 0xcd, 0xcb, 0xbd,
- 0x9a, 0xb3, 0xa3, 0x3e, 0xd3, 0x17, 0xf0, 0x3d, 0x21, 0x37, 0x71, 0x3c,
- 0xd5, 0x96, 0x07, 0xbd, 0x06, 0x9e, 0x92, 0xbe, 0x12, 0xac, 0x4a, 0x3e,
- 0xde, 0x09, 0x81, 0xbd, 0x9f, 0x14, 0x0a, 0xbe, 0xed, 0x8e, 0x41, 0xbe,
- 0xb6, 0xc9, 0xfa, 0x3e, 0xae, 0x2d, 0x97, 0x3d, 0x7a, 0xb0, 0xdd, 0xbd,
- 0x83, 0x90, 0x3e, 0xbb, 0x7b, 0xcf, 0xa6, 0x3e, 0xf5, 0xa7, 0x3a, 0x3e,
- 0xa1, 0x94, 0x0d, 0xbd, 0xa8, 0x77, 0x2f, 0xbc, 0xa9, 0x99, 0x9f, 0xbc,
- 0x7b, 0x9f, 0x41, 0x3e, 0xee, 0x76, 0x85, 0x3e, 0xb3, 0xa2, 0xc6, 0xbe,
- 0x1d, 0x32, 0xbc, 0x3d, 0x09, 0x11, 0x73, 0xbe, 0xdd, 0x1d, 0xd4, 0xbd,
- 0xb0, 0xda, 0x2b, 0xbe, 0x6a, 0x4b, 0x68, 0xbc, 0xaa, 0xd8, 0x37, 0xbd,
- 0xe3, 0x20, 0x76, 0x3d, 0xaa, 0xf8, 0x27, 0xbe, 0x1c, 0x37, 0xb4, 0x3d,
- 0x61, 0xe0, 0x28, 0x3e, 0x67, 0x8b, 0x8f, 0xbe, 0x1c, 0x7a, 0x0a, 0x3e,
- 0x0d, 0x61, 0x71, 0x3d, 0x85, 0x86, 0x25, 0xbd, 0xcf, 0x77, 0xdb, 0xbd,
- 0xc0, 0x19, 0x64, 0xbe, 0x00, 0xa3, 0x13, 0xbe, 0x1b, 0xc3, 0xbf, 0xbb,
- 0x3d, 0xa1, 0x30, 0x3d, 0x09, 0x28, 0x03, 0xbe, 0x27, 0xdf, 0x0b, 0x3e,
- 0xee, 0x73, 0x3c, 0x3e, 0x26, 0xf0, 0x71, 0xbe, 0x11, 0x30, 0x2c, 0x3e,
- 0x62, 0x69, 0x41, 0x3d, 0xb0, 0x58, 0xc3, 0xbe, 0x3f, 0x79, 0xb8, 0xbd,
- 0xd0, 0x72, 0xa8, 0xbd, 0xe5, 0x3f, 0x8e, 0xbe, 0xd5, 0xa6, 0xd2, 0x3d,
- 0x6b, 0x55, 0x0b, 0xbe, 0xc6, 0x50, 0xbd, 0x3e, 0x44, 0x2e, 0x8a, 0x3d,
- 0x28, 0x22, 0x95, 0xbc, 0x24, 0xb6, 0xb1, 0xbd, 0xf6, 0x06, 0x2e, 0x3d,
- 0x7a, 0x01, 0x46, 0xbe, 0x75, 0x58, 0x05, 0xbe, 0x25, 0x03, 0xc4, 0xbe,
- 0x55, 0x7e, 0x74, 0xbe, 0xb3, 0x25, 0x31, 0xbe, 0x60, 0x66, 0xab, 0xbe,
- 0x47, 0xa9, 0xf6, 0xbe, 0xbf, 0x1d, 0x25, 0x3d, 0x6a, 0x7a, 0x48, 0xbe,
- 0x92, 0xb7, 0xaa, 0xba, 0xf1, 0x1e, 0x3d, 0xbe, 0x44, 0x81, 0xc5, 0xbe,
- 0x83, 0x8a, 0x10, 0x3e, 0xd0, 0x33, 0x73, 0xbe, 0x1c, 0x23, 0xc4, 0xbd,
- 0xa8, 0x8e, 0x8d, 0xbd, 0x0d, 0xf5, 0x1c, 0xbe, 0x51, 0x82, 0x1e, 0x3d,
- 0x3b, 0x08, 0x1b, 0x3e, 0x1d, 0xa2, 0x86, 0x3d, 0x9b, 0x91, 0xad, 0xbe,
- 0xbe, 0xc6, 0x2b, 0xbe, 0x23, 0x12, 0x0e, 0xbe, 0x7e, 0xa5, 0xa4, 0xbd,
- 0xde, 0xfb, 0x0d, 0xbc, 0x7a, 0xd8, 0x0c, 0xbc, 0x9b, 0x47, 0x25, 0xbe,
- 0xf0, 0xda, 0xbc, 0xbc, 0x6f, 0xed, 0xa4, 0xbd, 0xac, 0x08, 0x3b, 0x3e,
- 0x1b, 0xdc, 0xf7, 0x3d, 0xd0, 0xe3, 0x3b, 0xbe, 0xf7, 0x29, 0x35, 0xbe,
- 0x7e, 0xae, 0x28, 0x3e, 0xc2, 0xcd, 0xe9, 0xbd, 0xbb, 0x18, 0x75, 0xbe,
- 0x31, 0x2e, 0x09, 0xbe, 0xaa, 0x3c, 0x19, 0xbc, 0xc1, 0xce, 0xae, 0x3e,
- 0xa2, 0xcf, 0x2b, 0x3f, 0x04, 0xa3, 0x6b, 0x3e, 0x4c, 0x4a, 0x3c, 0xbe,
- 0x6f, 0xf0, 0xbd, 0x3e, 0xe9, 0x89, 0x87, 0x3e, 0xdd, 0xa9, 0x94, 0x3c,
- 0xce, 0x2f, 0x73, 0x3e, 0xa2, 0x98, 0x1f, 0x3f, 0x12, 0x3f, 0x3a, 0xbf,
- 0x03, 0xdb, 0xda, 0x3e, 0xeb, 0xd9, 0x96, 0x3f, 0x4d, 0xe2, 0x08, 0x40,
- 0xce, 0x05, 0xb1, 0x3e, 0x9f, 0xfd, 0x81, 0x3f, 0xd2, 0xa4, 0x33, 0xbd,
- 0x1b, 0x2b, 0x1b, 0x3f, 0x0e, 0x22, 0x06, 0xc0, 0xa9, 0xac, 0xc6, 0x3f,
- 0x07, 0x8c, 0x4f, 0x3f, 0x4b, 0xcc, 0x2a, 0xbe, 0xf9, 0x2a, 0x0c, 0x3f,
- 0x73, 0x49, 0xd9, 0xbf, 0xd8, 0xd9, 0x44, 0xbc, 0x7b, 0x12, 0x0b, 0x3f,
- 0xfb, 0x6d, 0x78, 0xbf, 0xfc, 0xbe, 0x56, 0x3e, 0x5c, 0x3d, 0x01, 0x3d,
- 0x52, 0xec, 0x37, 0x3e, 0x6e, 0x91, 0x48, 0xbf, 0xa1, 0x7c, 0x5f, 0xbf,
- 0xfb, 0xf0, 0x3a, 0xbe, 0x4f, 0xb2, 0xb8, 0x3d, 0x60, 0x54, 0xa5, 0xbf,
- 0xef, 0xbb, 0x0c, 0x3f, 0x96, 0x2f, 0xf1, 0x3e, 0xa0, 0x45, 0xe5, 0x3c,
- 0xd9, 0x74, 0x3e, 0xbf, 0xfd, 0x46, 0xda, 0xbe, 0xeb, 0x89, 0x74, 0x3f,
- 0xb4, 0x14, 0x60, 0xbf, 0xcd, 0x2d, 0x09, 0x3f, 0xcc, 0x47, 0xab, 0x3e,
- 0xc2, 0xf4, 0x7f, 0xbf, 0x8b, 0xec, 0x27, 0x3f, 0xb1, 0x7c, 0x5c, 0xbf,
- 0x83, 0xcc, 0x3c, 0xbe, 0x56, 0x47, 0x7a, 0x3f, 0xd4, 0xf0, 0x90, 0x3e,
- 0x9e, 0xbf, 0x0a, 0x3f, 0x90, 0x65, 0x6f, 0xbf, 0x5a, 0x66, 0x06, 0xc0,
- 0x8d, 0x5e, 0x7d, 0x3e, 0x8d, 0xd5, 0x1a, 0xbf, 0xa9, 0x7d, 0x8b, 0x3f,
- 0x76, 0x32, 0xef, 0x3e, 0xba, 0x3f, 0x81, 0xbf, 0xc4, 0xe2, 0x80, 0xbf,
- 0x5e, 0x2c, 0xfb, 0x3d, 0xf7, 0x8a, 0x08, 0xbf, 0xa3, 0xa0, 0xae, 0x3d,
- 0xfc, 0x09, 0x74, 0x3e, 0x56, 0x58, 0x6a, 0xbd, 0x7f, 0x19, 0x87, 0xbf,
- 0xc9, 0x66, 0x09, 0x3e, 0x22, 0x94, 0x73, 0xbf, 0xe1, 0x90, 0x70, 0x3c,
- 0x04, 0xb6, 0x14, 0x3f, 0x2b, 0xa0, 0x67, 0xbe, 0x8a, 0xec, 0xa8, 0x3e,
- 0xa3, 0x6a, 0x4e, 0x3f, 0xcf, 0x70, 0x4d, 0x3e, 0x7e, 0x14, 0x89, 0x3e,
- 0x32, 0xcb, 0xa7, 0xbe, 0x29, 0x7a, 0xb0, 0xbe, 0x5f, 0xae, 0x33, 0x3f,
- 0xe2, 0x22, 0xca, 0xbd, 0xbb, 0xc4, 0x86, 0xbd, 0xd9, 0x6c, 0x31, 0xbe,
- 0x6b, 0x56, 0xc4, 0xbd, 0xa5, 0x5b, 0x37, 0x3f, 0xb9, 0x53, 0x17, 0xc0,
- 0x92, 0xa0, 0x59, 0xbf, 0x3b, 0x7a, 0xec, 0xbb, 0x3d, 0x57, 0x9d, 0x3d,
- 0x0b, 0x22, 0x8d, 0x3e, 0x41, 0xce, 0xaf, 0xbc, 0x31, 0xb1, 0xd4, 0x3e,
- 0x3b, 0xf4, 0x6b, 0x3d, 0xc3, 0x85, 0xf7, 0xbc, 0x62, 0x8d, 0x7a, 0x3e,
- 0xae, 0xd0, 0x09, 0xbc, 0xe4, 0xb6, 0x90, 0x3e, 0x3a, 0xf9, 0x19, 0xbf,
- 0xe3, 0xa4, 0x8e, 0xbf, 0x4c, 0x1c, 0x48, 0xbf, 0xac, 0x0e, 0x17, 0xbe,
- 0x5f, 0x3f, 0xea, 0xbf, 0x96, 0xa5, 0x00, 0x3f, 0x13, 0xd2, 0x54, 0x3e,
- 0x04, 0xe6, 0x04, 0xbe, 0x3f, 0xd5, 0xf6, 0x3e, 0x46, 0xe7, 0x3b, 0xc0,
- 0x82, 0xda, 0xad, 0x3c, 0xa1, 0x75, 0xa6, 0xbd, 0xbb, 0x7b, 0xfa, 0xbc,
- 0xeb, 0xc6, 0xc6, 0x3c, 0xc8, 0xb7, 0x67, 0xbd, 0xd5, 0xdc, 0x5a, 0x3d,
- 0x37, 0x5b, 0x94, 0x3c, 0x15, 0x61, 0x97, 0xbd, 0xd7, 0x7a, 0x8d, 0xbd,
- 0xb4, 0x8d, 0x0d, 0xbd, 0x8a, 0xa6, 0xc1, 0xbc, 0x23, 0x44, 0xa8, 0x3d,
- 0x5b, 0x50, 0x65, 0xbe, 0xef, 0x06, 0x95, 0xbd, 0x71, 0x35, 0x58, 0xbd,
- 0xc6, 0x5f, 0x84, 0x3d, 0x2f, 0x4d, 0xe8, 0x3c, 0x0b, 0x77, 0xc6, 0x3c,
- 0x89, 0x7c, 0x63, 0xbe, 0x1a, 0x1e, 0xe5, 0x3d, 0x1f, 0xc9, 0x15, 0xbd,
- 0xc1, 0xc0, 0x05, 0x3d, 0x9b, 0xfa, 0x49, 0xbe, 0x12, 0x79, 0xa9, 0xbd,
- 0xb7, 0x80, 0x99, 0x3c, 0xc9, 0xd7, 0xae, 0xbe, 0xb5, 0xaa, 0x85, 0x3b,
- 0x58, 0xe1, 0x71, 0xbd, 0xdb, 0x86, 0x84, 0x3d, 0x46, 0x8c, 0x0c, 0xbe,
- 0x07, 0x78, 0xd4, 0xbd, 0x23, 0x55, 0x66, 0xbd, 0xed, 0x56, 0xa5, 0xbf,
- 0xa5, 0x08, 0xe6, 0xba, 0x21, 0x1e, 0xad, 0xbc, 0xe5, 0xe1, 0x2d, 0xbe,
- 0xaf, 0x42, 0xd2, 0xbd, 0x9e, 0x39, 0xa4, 0x3d, 0xd4, 0xc5, 0xf7, 0xbd,
- 0xf5, 0x88, 0xda, 0xbe, 0x7d, 0xef, 0xe9, 0x3d, 0x0d, 0xb7, 0xbc, 0xbd,
- 0xc4, 0x7a, 0x9e, 0xbe, 0x61, 0x50, 0x44, 0xbe, 0xc8, 0xc9, 0x8a, 0xbd,
- 0xcf, 0x8a, 0x44, 0xbe, 0x6f, 0xc7, 0x57, 0xbd, 0x72, 0xec, 0x2a, 0x3d,
- 0x5c, 0xf0, 0xea, 0x3d, 0x50, 0x10, 0xf8, 0xbe, 0xdc, 0xd0, 0xc3, 0x3d,
- 0x1d, 0xac, 0x06, 0xbe, 0x8b, 0xc1, 0x7c, 0xbd, 0x63, 0x51, 0x6c, 0xbd,
- 0xc3, 0x41, 0x73, 0x3c, 0xf0, 0x3d, 0x57, 0xbc, 0x13, 0x38, 0xc2, 0x3d,
- 0x68, 0x4a, 0xaa, 0xbd, 0x39, 0x6c, 0xb3, 0xbd, 0xe7, 0x24, 0x7b, 0xbe,
- 0x67, 0xd8, 0xc1, 0xbe, 0xf7, 0x5e, 0xfe, 0xbd, 0x25, 0xc8, 0xe5, 0xbe,
- 0xe1, 0x2d, 0x1b, 0xbe, 0x79, 0x71, 0x0c, 0xbf, 0x95, 0xd5, 0x29, 0xbd,
- 0x2c, 0x30, 0x22, 0x3d, 0x9f, 0x2e, 0x3b, 0xbd, 0xc7, 0x92, 0x12, 0x3e,
- 0xc0, 0x80, 0x91, 0x3d, 0x73, 0x44, 0x0e, 0x3e, 0x9a, 0xf3, 0x8b, 0x3d,
- 0xef, 0xa5, 0x13, 0xbe, 0x2c, 0x14, 0x15, 0xbf, 0xd9, 0x79, 0x07, 0x3d,
- 0x6a, 0x34, 0xca, 0xbd, 0x20, 0x0c, 0x16, 0xbe, 0x25, 0xf8, 0xce, 0x3c,
- 0xe4, 0x55, 0x7c, 0xbd, 0x6f, 0xa4, 0x83, 0x3d, 0xe8, 0xe6, 0x43, 0xbd,
- 0x44, 0x68, 0x4b, 0xbd, 0x56, 0x26, 0x26, 0xbe, 0xe7, 0x82, 0x55, 0xbd,
- 0xe6, 0xaa, 0x75, 0x3d, 0xd0, 0xe8, 0x27, 0xbe, 0x18, 0x8a, 0xd6, 0xbd,
- 0x94, 0x46, 0x58, 0xbe, 0xf2, 0xf4, 0xae, 0xbd, 0xc5, 0xcc, 0xd0, 0xbd,
- 0xff, 0x2c, 0x9e, 0x3c, 0xf9, 0xb2, 0x89, 0xbd, 0xe6, 0x79, 0x3e, 0xbe,
- 0x17, 0x76, 0xab, 0xbd, 0xb0, 0x70, 0x1d, 0xbe, 0x9a, 0xf6, 0x20, 0xbe,
- 0xbd, 0x2b, 0x11, 0xbe, 0xfa, 0xe4, 0x18, 0x3e, 0xa7, 0x47, 0x5a, 0xbe,
- 0x2f, 0x15, 0x13, 0xbe, 0x15, 0x24, 0xda, 0xbe, 0xf0, 0x88, 0x19, 0x3d,
- 0xb9, 0x44, 0xf1, 0xbe, 0xde, 0xdb, 0x4b, 0xbd, 0xf9, 0xfb, 0xf3, 0xbd,
- 0xd1, 0xf1, 0x56, 0xbc, 0x50, 0xb4, 0x2f, 0xbe, 0x5f, 0xd9, 0x25, 0xbe,
- 0x1b, 0xfa, 0xa9, 0x3e, 0x52, 0x98, 0x72, 0x3f, 0x21, 0x03, 0x46, 0xbf,
- 0xde, 0xdf, 0xc3, 0x3c, 0xef, 0x27, 0x79, 0x3d, 0xa8, 0x66, 0x85, 0xbf,
- 0x57, 0x99, 0x8c, 0x3f, 0x92, 0x68, 0x84, 0xbe, 0xb3, 0x28, 0xfd, 0xbd,
- 0x1f, 0x5b, 0x4a, 0xbe, 0xf7, 0x17, 0x0e, 0xbe, 0x28, 0x4e, 0x94, 0xbf,
- 0x9e, 0x71, 0x3e, 0xbf, 0x5f, 0x47, 0x99, 0xbf, 0x38, 0x0e, 0xc1, 0xbf,
- 0xd0, 0x14, 0xec, 0xbe, 0x89, 0x90, 0xc1, 0x3c, 0x77, 0x57, 0x9a, 0x3d,
- 0x97, 0x47, 0xc0, 0x3e, 0x47, 0x5d, 0x89, 0xbe, 0x5b, 0x19, 0x12, 0xbe,
- 0x4c, 0x48, 0x07, 0x3c, 0x60, 0x9a, 0xb5, 0x3e, 0x68, 0xc8, 0xb6, 0x3e,
- 0xa1, 0xb2, 0xbe, 0x3b, 0xa9, 0x94, 0x6b, 0xbe, 0x6b, 0xbb, 0xc6, 0x3e,
- 0xee, 0x77, 0x9a, 0xbc, 0x80, 0xdb, 0xe8, 0xbe, 0x3a, 0x72, 0x93, 0xbe,
- 0xe5, 0x96, 0xa3, 0x3f, 0x4a, 0xa1, 0x02, 0xbf, 0x87, 0xdb, 0x1b, 0x3e,
- 0x67, 0x6e, 0x11, 0xbf, 0xf5, 0x88, 0x86, 0xbd, 0xba, 0x4c, 0x46, 0x3e,
- 0x86, 0xd1, 0x71, 0x3d, 0xe4, 0x5b, 0xdb, 0x3d, 0xc0, 0xd6, 0x6a, 0x3f,
- 0x7e, 0x49, 0x50, 0xbb, 0xf9, 0xd8, 0xba, 0xbf, 0x91, 0x4b, 0xee, 0xbf,
- 0xa6, 0xb6, 0x8b, 0xbf, 0x78, 0xe8, 0xdb, 0x3e, 0x8c, 0xe1, 0x0b, 0x3f,
- 0xf9, 0xee, 0x67, 0xbe, 0x92, 0x8b, 0xdf, 0x3d, 0xe7, 0x86, 0xbf, 0xbf,
- 0x36, 0xa6, 0xdc, 0x3f, 0x54, 0xc8, 0x36, 0xbe, 0x6a, 0x1c, 0xac, 0x3d,
- 0x97, 0x28, 0x3a, 0x3d, 0xd9, 0xb4, 0x0a, 0xbf, 0xd7, 0x57, 0xa7, 0xbd,
- 0x61, 0xc3, 0x18, 0x3d, 0x65, 0xfa, 0xfb, 0xbd, 0x2a, 0xda, 0x06, 0x3f,
- 0xc2, 0x47, 0x5f, 0xbd, 0xc0, 0x12, 0xc4, 0xbe, 0xf7, 0x83, 0x7d, 0x3e,
- 0xc8, 0x29, 0x47, 0xbc, 0xa3, 0x80, 0xa2, 0xbe, 0xef, 0x22, 0x71, 0x3f,
- 0xa7, 0x4f, 0xb1, 0x3e, 0x80, 0x8f, 0x6f, 0xbe, 0xb5, 0x8f, 0xbd, 0xbe,
- 0xad, 0xf5, 0xae, 0x3d, 0x0a, 0x55, 0xa2, 0x3e, 0x34, 0x04, 0xa9, 0x3e,
- 0x70, 0xe4, 0x09, 0xbe, 0xbb, 0x58, 0xd0, 0x3c, 0x35, 0x8a, 0x83, 0xbd,
- 0x2d, 0x22, 0x64, 0xbe, 0x14, 0x10, 0x3c, 0x3c, 0x05, 0x35, 0x90, 0x3f,
- 0xb2, 0x68, 0xfe, 0x3e, 0x0f, 0xad, 0x96, 0x3c, 0x49, 0x9d, 0x5b, 0x3e,
- 0x2b, 0xb6, 0xc8, 0x3e, 0x8a, 0xfe, 0xf7, 0xbd, 0x00, 0xc8, 0xd2, 0xbd,
- 0x31, 0x1c, 0xc4, 0xbd, 0x61, 0x8d, 0x0c, 0x3e, 0x86, 0x59, 0x3c, 0xbd,
- 0x2e, 0x89, 0xf4, 0xbc, 0x53, 0xa0, 0xfd, 0xbe, 0x59, 0x86, 0x6c, 0x3f,
- 0xb1, 0x43, 0x94, 0x3e, 0x4f, 0x4f, 0x8c, 0x3c, 0x8f, 0xfa, 0x34, 0xbe,
- 0x6b, 0xe8, 0xa1, 0x3f, 0xfd, 0x5e, 0xa4, 0x3f, 0x22, 0xc3, 0xed, 0x3d,
- 0x24, 0xef, 0x2c, 0xbe, 0x53, 0x61, 0x8b, 0xbe, 0x0d, 0x13, 0x40, 0x3f,
- 0xa1, 0x94, 0xd5, 0x3d, 0x71, 0xbe, 0x0a, 0xbe, 0x6d, 0xbd, 0x2f, 0xbe,
- 0x57, 0xa2, 0xd9, 0xbe, 0xb5, 0xdc, 0x60, 0xbe, 0x05, 0x7a, 0xac, 0xbe,
- 0x2e, 0x91, 0x13, 0xbe, 0x9e, 0xc6, 0x72, 0xbe, 0xe7, 0x0e, 0x6c, 0x3e,
- 0x2e, 0x82, 0x0c, 0x3e, 0x20, 0x43, 0xc5, 0xbc, 0x06, 0xfb, 0x92, 0xbd,
- 0xbc, 0x14, 0x05, 0x3d, 0xb7, 0x25, 0x26, 0x3e, 0xea, 0x0e, 0x86, 0x3d,
- 0xd1, 0xcf, 0xce, 0xbd, 0xf4, 0xc8, 0x8d, 0xbd, 0xa3, 0x0a, 0x84, 0x3e,
- 0xd7, 0x9e, 0xc2, 0x3c, 0x02, 0x92, 0xc1, 0x3a, 0xc1, 0x50, 0xca, 0x3d,
- 0x4f, 0x40, 0x64, 0xbe, 0x0b, 0x7f, 0x2f, 0xbe, 0x30, 0x81, 0x25, 0xbe,
- 0x9f, 0x9a, 0x60, 0xbc, 0xe5, 0x19, 0x8c, 0xbe, 0x7a, 0x9d, 0x4c, 0x3d,
- 0x3f, 0xeb, 0xc9, 0xbc, 0x3c, 0x7f, 0x7d, 0x3b, 0x90, 0xae, 0xdc, 0xbe,
- 0x6a, 0xfa, 0x8c, 0x3d, 0xba, 0xb5, 0xbf, 0x3c, 0x54, 0xed, 0x86, 0xba,
- 0x33, 0x47, 0xae, 0xbd, 0xfe, 0x7e, 0xca, 0xbd, 0x74, 0xc5, 0x06, 0xbd,
- 0x97, 0x87, 0x08, 0xbe, 0xe9, 0xc7, 0x94, 0x3e, 0xca, 0x1c, 0x67, 0x3e,
- 0x50, 0xf1, 0x71, 0x3e, 0x82, 0x0d, 0xd8, 0xbd, 0xad, 0x81, 0x67, 0x3d,
- 0x49, 0x06, 0x4e, 0xbe, 0xd7, 0x65, 0x62, 0x3b, 0x62, 0x22, 0x1d, 0xbc,
- 0x4c, 0x03, 0x13, 0x3c, 0x56, 0x4b, 0x5e, 0x3e, 0x57, 0xeb, 0x37, 0x3e,
- 0xd1, 0xc1, 0xb7, 0xbd, 0xd9, 0x61, 0x78, 0x3e, 0x12, 0xa8, 0x41, 0xbe,
- 0xd4, 0x05, 0xd4, 0x3b, 0x5d, 0xb6, 0xa7, 0xbd, 0x4b, 0x3b, 0x21, 0x3e,
- 0x77, 0x78, 0xee, 0x3d, 0x47, 0x43, 0xaf, 0xbe, 0xfc, 0x85, 0x7d, 0xbd,
- 0x0d, 0xea, 0x31, 0xbe, 0xb2, 0x1e, 0xd1, 0xbd, 0x15, 0xd7, 0xdc, 0xba,
- 0x0c, 0x74, 0x90, 0x3d, 0x0e, 0x43, 0xa1, 0xbd, 0x50, 0xe7, 0x98, 0x3d,
- 0x35, 0x5d, 0x4c, 0xbe, 0xc9, 0x6a, 0x1c, 0x3e, 0x95, 0xe7, 0x9c, 0xbe,
- 0xac, 0xc0, 0x36, 0xbe, 0xfa, 0x38, 0x35, 0xbe, 0x93, 0x2c, 0xaa, 0xbd,
- 0x3a, 0xf3, 0x40, 0x3b, 0x32, 0xdc, 0x2f, 0xbe, 0x3a, 0xf8, 0xf0, 0x3d,
- 0x0b, 0x92, 0x8d, 0xbd, 0xf0, 0x0c, 0xf6, 0xbd, 0x53, 0x19, 0x5f, 0x3d,
- 0xe2, 0x67, 0x20, 0xbe, 0x4d, 0x1e, 0xb5, 0xbc, 0x20, 0x65, 0x5e, 0xbd,
- 0x8e, 0xfd, 0x0f, 0xbd, 0xc3, 0x42, 0x18, 0x3e, 0xd9, 0xf8, 0x28, 0xbe,
- 0x30, 0x96, 0x56, 0xbe, 0x35, 0x5b, 0xcf, 0x3c, 0xc2, 0x35, 0x86, 0xbe,
- 0xa9, 0x21, 0x99, 0xbe, 0xf1, 0x9e, 0xf5, 0x3c, 0x3c, 0xcc, 0xd4, 0x3d,
- 0xd7, 0x49, 0x88, 0x3d, 0xc7, 0xfa, 0x34, 0xbe, 0xc2, 0xfd, 0x20, 0xbe,
- 0x9b, 0x9b, 0xe4, 0xbc, 0x8a, 0x7b, 0x6e, 0xbd, 0x64, 0xb4, 0x47, 0xbe,
- 0xb4, 0x14, 0x29, 0xbe, 0x43, 0x1e, 0x4d, 0x3d, 0x6a, 0x9d, 0xfa, 0xbd,
- 0x68, 0x59, 0x29, 0xbd, 0x2f, 0x50, 0xf5, 0xbd, 0xe7, 0xd0, 0xcb, 0x3d,
- 0xb7, 0xc5, 0xca, 0xbd, 0x0b, 0x5d, 0xa3, 0xbe, 0x32, 0xe9, 0x81, 0xbd,
- 0x28, 0xbf, 0x11, 0xbd, 0x55, 0x42, 0x9d, 0xbc, 0xd3, 0x94, 0x21, 0x3d,
- 0xfc, 0xd4, 0x00, 0xbf, 0x94, 0x78, 0x62, 0xbe, 0x47, 0x93, 0x23, 0xbe,
- 0x81, 0x65, 0xc0, 0x3d, 0x4c, 0xdb, 0x08, 0x3e, 0xa5, 0xc0, 0x3b, 0xbe,
- 0xfe, 0x5f, 0x3f, 0x39, 0xad, 0xa5, 0xc1, 0xbd, 0x09, 0xda, 0x01, 0x3b,
- 0xbf, 0x4d, 0x1f, 0x3d, 0xce, 0x52, 0x07, 0xbb, 0x5f, 0x39, 0x7d, 0xbd,
- 0xc4, 0x51, 0x96, 0x3e, 0x5a, 0xdc, 0x77, 0x3e, 0xe7, 0x15, 0x8c, 0xbd,
- 0x0b, 0xac, 0x24, 0x3e, 0xa1, 0xcc, 0x07, 0x3e, 0x8e, 0x3a, 0xe9, 0x3d,
- 0x52, 0xa5, 0x82, 0x3d, 0x92, 0x26, 0xa5, 0xbd, 0x95, 0x94, 0x25, 0xbe,
- 0x1a, 0x9f, 0xe9, 0x3d, 0xcb, 0x76, 0xb1, 0xbc, 0xb2, 0x7a, 0xbe, 0xbe,
- 0xf6, 0x93, 0x03, 0xbe, 0x55, 0x76, 0x23, 0xbe, 0xe5, 0x33, 0x51, 0xbe,
- 0x6e, 0xe6, 0xb4, 0xbd, 0xde, 0x08, 0xd9, 0xbc, 0xab, 0x2a, 0x5c, 0x3d,
- 0xc6, 0x7c, 0xc7, 0x3c, 0xba, 0x4d, 0xda, 0xbd, 0xcb, 0xb0, 0xb4, 0xbd,
- 0x9e, 0xb2, 0x74, 0x3e, 0x76, 0xef, 0x94, 0xbe, 0x4b, 0xfd, 0xf4, 0x3c,
- 0x6c, 0x81, 0x2c, 0xbc, 0x61, 0x7b, 0x92, 0xbd, 0xaa, 0x65, 0xd7, 0x3d,
- 0xbb, 0xf2, 0xa9, 0xbd, 0xad, 0x1a, 0xb7, 0xbe, 0x12, 0x0d, 0xd1, 0x3d,
- 0xc3, 0xd2, 0xb5, 0xbd, 0x12, 0x60, 0x53, 0x3d, 0xc4, 0xd0, 0xab, 0x3c,
- 0x72, 0x8e, 0xa7, 0x3d, 0x58, 0xc6, 0x0e, 0x3c, 0x2f, 0x05, 0x64, 0x3e,
- 0x88, 0x00, 0xd3, 0x3d, 0x4f, 0x62, 0x41, 0xbe, 0x33, 0x2c, 0x4c, 0x3d,
- 0xf5, 0x26, 0x0d, 0xbe, 0xb5, 0xa8, 0xae, 0xbe, 0xd5, 0xc7, 0x94, 0x3d,
- 0x10, 0x1e, 0x4b, 0xbd, 0x53, 0x71, 0xf8, 0x3e, 0xdd, 0xa8, 0xfc, 0xbd,
- 0x6e, 0x57, 0x27, 0xbd, 0x06, 0x47, 0x59, 0x3d, 0x18, 0xf5, 0x99, 0xbd,
- 0x68, 0xaa, 0x79, 0xbe, 0xbf, 0xe5, 0x02, 0xbe, 0x13, 0xdb, 0x42, 0xbe,
- 0x38, 0xe2, 0xfd, 0xbd, 0x64, 0x0d, 0x76, 0xbc, 0xac, 0xd0, 0xa3, 0xbe,
- 0xca, 0xe2, 0x99, 0xbe, 0x29, 0x26, 0xae, 0xbd, 0xa3, 0xdd, 0x4f, 0xbe,
- 0x42, 0x42, 0xa3, 0xbd, 0x2b, 0xd2, 0x1c, 0xbd, 0x45, 0x77, 0x67, 0xbe,
- 0x15, 0xd8, 0x48, 0x3d, 0xf2, 0x8e, 0x5d, 0xbe, 0xee, 0x7e, 0x37, 0xbe,
- 0xa7, 0xd0, 0x99, 0x3d, 0x8a, 0x44, 0x0f, 0x3d, 0x1a, 0x16, 0x37, 0xbd,
- 0x1c, 0x13, 0x88, 0xbb, 0xce, 0x0a, 0xba, 0xbd, 0xab, 0x43, 0xdb, 0xbe,
- 0x96, 0x9c, 0xe2, 0x3b, 0xf3, 0x43, 0x2c, 0xbe, 0xb0, 0xf6, 0x58, 0x3c,
- 0x4b, 0x8b, 0x6a, 0xbc, 0x0f, 0xb3, 0x36, 0xbe, 0xa2, 0x16, 0x89, 0xbe,
- 0x78, 0x71, 0xe1, 0x3a, 0x7f, 0xb8, 0x02, 0xbe, 0x81, 0x70, 0x5b, 0x3e,
- 0xee, 0x81, 0x46, 0x3b, 0xef, 0xf6, 0x48, 0xbe, 0xc2, 0x86, 0x3d, 0xbd,
- 0xdc, 0x3d, 0x33, 0x3e, 0x5c, 0xea, 0x36, 0xbe, 0xca, 0xb2, 0x8b, 0xbc,
- 0x9a, 0xb2, 0x38, 0xbc, 0x21, 0xfc, 0x1a, 0x3e, 0x5f, 0xab, 0x78, 0x3e,
- 0xae, 0x94, 0x79, 0x3f, 0x9b, 0x6d, 0x1d, 0xbe, 0x61, 0x7f, 0x4a, 0xbe,
- 0x16, 0x24, 0x77, 0x3f, 0x9b, 0x0e, 0x08, 0x3d, 0x5e, 0xe7, 0x25, 0x3f,
- 0xff, 0xc8, 0x46, 0x3f, 0x53, 0xa2, 0x05, 0x3f, 0xec, 0x74, 0x06, 0xbf,
- 0x7f, 0x01, 0x22, 0xbf, 0xac, 0xec, 0xac, 0x3f, 0x25, 0x03, 0x0c, 0x40,
- 0x30, 0xe6, 0x9b, 0x3f, 0xff, 0x89, 0x75, 0x3f, 0x2c, 0xb5, 0xf2, 0x3d,
- 0x9c, 0x2f, 0x7f, 0x3d, 0x6c, 0x0a, 0x7b, 0xbe, 0x97, 0xe8, 0xb9, 0x3f,
- 0x26, 0xb4, 0x05, 0x3e, 0xca, 0xf0, 0xa3, 0x3c, 0xf1, 0x3f, 0xdc, 0x3e,
- 0xbb, 0x83, 0xbe, 0xbf, 0xb7, 0x87, 0xf4, 0xbd, 0x8c, 0xb5, 0x13, 0x3e,
- 0x35, 0x78, 0xab, 0xbf, 0x27, 0x20, 0x55, 0xbe, 0x1e, 0xa3, 0xaa, 0x3e,
- 0x6e, 0x9d, 0x7c, 0x3e, 0x65, 0xf6, 0x83, 0xbe, 0x0d, 0x7e, 0x80, 0x3e,
- 0x41, 0xee, 0xa0, 0xbd, 0x9c, 0x28, 0x0f, 0x3d, 0x46, 0x36, 0xa5, 0x3e,
- 0x16, 0x3b, 0x0b, 0x3f, 0xec, 0xc3, 0xa3, 0x3e, 0xf0, 0x9c, 0x14, 0x3e,
- 0x93, 0xe8, 0x87, 0xbf, 0xe3, 0x3a, 0x05, 0x3e, 0x85, 0x27, 0xd4, 0xbe,
- 0x5f, 0x1e, 0xcc, 0xbe, 0x47, 0x14, 0xd0, 0x3e, 0x39, 0x4c, 0x88, 0x3e,
- 0xa3, 0x37, 0x1b, 0xbf, 0xc6, 0xa9, 0x6a, 0x3f, 0xd9, 0xca, 0x96, 0xbf,
- 0x11, 0x23, 0x33, 0xbf, 0xde, 0xcb, 0x4b, 0x3f, 0x0d, 0xaf, 0xb1, 0x3e,
- 0x72, 0xaf, 0x37, 0x3f, 0x36, 0xf7, 0x8b, 0xbe, 0xf7, 0x39, 0x66, 0xbf,
- 0x09, 0x51, 0x04, 0xbd, 0x75, 0xe6, 0x02, 0x3e, 0xf9, 0x87, 0x5f, 0x3f,
- 0xc7, 0x51, 0x8e, 0xbd, 0xbf, 0xdb, 0x5b, 0xbf, 0x2e, 0x19, 0x24, 0xbc,
- 0x3b, 0x1b, 0x4e, 0x3c, 0x15, 0xec, 0xab, 0xbf, 0x06, 0xf7, 0x48, 0xbc,
- 0x42, 0x1b, 0x0b, 0x3e, 0x99, 0xb1, 0xe2, 0xbd, 0xc1, 0x7c, 0x36, 0xbd,
- 0x01, 0xd6, 0xfe, 0x3d, 0x20, 0xe2, 0xc2, 0xbe, 0x72, 0xf9, 0xb9, 0xbd,
- 0x4c, 0xcb, 0x83, 0x3f, 0x8f, 0xb3, 0xad, 0x3e, 0x7f, 0x46, 0xee, 0xbe,
- 0xee, 0xb0, 0xa4, 0xbd, 0x87, 0x63, 0x79, 0x3e, 0x3a, 0x79, 0x3a, 0xbf,
- 0x33, 0xd5, 0x4b, 0xbf, 0x98, 0xaf, 0xa4, 0x3d, 0x47, 0x42, 0xbb, 0x3e,
- 0x66, 0x6f, 0xa4, 0xbe, 0x79, 0xd9, 0xb7, 0xbc, 0xf4, 0xfd, 0x82, 0xbe,
- 0xf7, 0xdc, 0x0d, 0xbc, 0xef, 0x96, 0x30, 0x3f, 0x9b, 0x6f, 0xbd, 0xbe,
- 0xdd, 0x44, 0x9f, 0xbf, 0x09, 0xc3, 0x54, 0xbd, 0x55, 0xb2, 0xb2, 0x3d,
- 0xca, 0x7b, 0x5c, 0x3e, 0xcf, 0xfa, 0x9b, 0x3b, 0x21, 0xb1, 0x12, 0xbe,
- 0xee, 0x5a, 0x00, 0x3d, 0xaf, 0x4c, 0x87, 0xbd, 0xb6, 0x8a, 0xb5, 0x3d,
- 0xaf, 0xa4, 0xd5, 0x3d, 0x3a, 0xb2, 0x3e, 0xbe, 0xe2, 0xbd, 0x92, 0xbe,
- 0x91, 0xea, 0x66, 0xbf, 0x10, 0x3e, 0x15, 0xbe, 0xc0, 0xdf, 0x39, 0x3e,
- 0xeb, 0xfe, 0xb4, 0xbf, 0x53, 0xbc, 0xe9, 0x3e, 0xb4, 0xd2, 0x90, 0xbe,
- 0x57, 0xc5, 0xea, 0xbd, 0x3b, 0x3b, 0xe1, 0x3e, 0xac, 0x4b, 0xa2, 0xbf,
- 0xe3, 0x8f, 0x43, 0xbe, 0x18, 0x56, 0xf5, 0xbd, 0xa5, 0x14, 0x18, 0xbe,
- 0x91, 0x19, 0x8e, 0x3d, 0x42, 0x04, 0x0b, 0xbe, 0xce, 0xfa, 0xc0, 0xbc,
- 0x29, 0x62, 0xca, 0x3d, 0x29, 0xdf, 0x04, 0xbd, 0x8d, 0x32, 0x8a, 0xbd,
- 0xd0, 0x49, 0xc6, 0xbd, 0xb9, 0xbe, 0x42, 0x3d, 0x89, 0x36, 0x6b, 0xbd,
- 0x75, 0x73, 0x18, 0x3c, 0x2d, 0x2f, 0x58, 0x3b, 0x63, 0xe3, 0x6a, 0xbe,
- 0x87, 0xd7, 0x9b, 0x3d, 0x58, 0x9a, 0x1b, 0xbc, 0xd9, 0xf5, 0xb6, 0x3d,
- 0x5b, 0xc5, 0x87, 0xbe, 0x69, 0x0b, 0x6d, 0x3d, 0xa4, 0x4d, 0x7a, 0x3d,
- 0xbf, 0x74, 0x88, 0x3d, 0x1f, 0x5d, 0x82, 0xbd, 0xe9, 0x0d, 0x54, 0x3c,
- 0x8b, 0x35, 0x0d, 0x3d, 0x43, 0xaf, 0x6e, 0xbe, 0x0f, 0x5b, 0xa5, 0x3c,
- 0x83, 0x25, 0x93, 0x3d, 0x42, 0x8d, 0xa8, 0x3d, 0x29, 0x8d, 0xd4, 0x3d,
- 0x18, 0xc9, 0xe6, 0x3c, 0xba, 0x34, 0x38, 0xbe, 0x00, 0x9d, 0x97, 0xbf,
- 0x5f, 0xd3, 0xf1, 0x3c, 0x10, 0x90, 0xb2, 0x3d, 0xef, 0x74, 0x17, 0xbe,
- 0xda, 0x32, 0xc7, 0xbd, 0x4d, 0xf2, 0x79, 0xbd, 0x34, 0x4d, 0x70, 0xbe,
- 0xaa, 0xd8, 0xcd, 0xbe, 0xdd, 0x9a, 0x1b, 0xbe, 0xd4, 0x6d, 0x01, 0xbe,
- 0xe2, 0xc7, 0xc2, 0xbe, 0xcf, 0xd7, 0x4b, 0x3d, 0x14, 0x89, 0x13, 0x3b,
- 0x00, 0xfa, 0x60, 0xbd, 0xdf, 0xba, 0xa8, 0x3c, 0x8d, 0x1f, 0xd6, 0xb9,
- 0x35, 0x3f, 0x99, 0x3d, 0x73, 0xae, 0xbc, 0xbe, 0xc9, 0xd5, 0x08, 0xbe,
- 0x54, 0xb0, 0xb6, 0xbc, 0x53, 0x34, 0x98, 0xbc, 0xe7, 0x18, 0xb4, 0x3d,
- 0x40, 0x9c, 0xa6, 0xbc, 0xdf, 0x5c, 0xc8, 0xbd, 0x91, 0xcb, 0x13, 0xbe,
- 0xd6, 0xf4, 0x99, 0xbd, 0xde, 0xc7, 0xb0, 0x3d, 0x3a, 0xb2, 0x9c, 0xbe,
- 0x68, 0xb0, 0x85, 0xbe, 0x08, 0xb9, 0x15, 0xbe, 0xb3, 0x77, 0xf3, 0xbe,
- 0x7d, 0x27, 0x12, 0xbe, 0xc3, 0xf9, 0x3a, 0xbf, 0xa4, 0xa0, 0x7d, 0xbc,
- 0x0e, 0x90, 0xb6, 0x3d, 0xfa, 0x03, 0x3b, 0xbd, 0x7e, 0xcd, 0x6f, 0x3d,
- 0x34, 0xad, 0x48, 0x3c, 0xa7, 0xc8, 0x07, 0xbd, 0x49, 0x08, 0x91, 0x3d,
- 0xfa, 0x9a, 0x0f, 0xbd, 0x26, 0x24, 0xff, 0xbe, 0xc3, 0xc4, 0x05, 0xbe,
- 0x90, 0x99, 0x90, 0xbc, 0xad, 0xd0, 0x04, 0xbe, 0xf0, 0x36, 0x80, 0xbe,
- 0x70, 0xd7, 0x25, 0xbe, 0xe5, 0x76, 0x0c, 0xbe, 0x70, 0x16, 0x1a, 0xbd,
- 0x85, 0x28, 0x03, 0x3d, 0xbb, 0x93, 0x65, 0x3d, 0x0d, 0xa3, 0x0a, 0x3e,
- 0x12, 0xdd, 0x4f, 0xbd, 0xfd, 0x26, 0x02, 0xbe, 0x0c, 0x7c, 0x46, 0x3d,
- 0x76, 0x1d, 0x3c, 0xbe, 0x37, 0x88, 0xc4, 0x3d, 0x65, 0x4d, 0x03, 0xbe,
- 0x9e, 0x47, 0x25, 0xbe, 0xdd, 0xcf, 0x67, 0x3c, 0xee, 0x65, 0x20, 0xbd,
- 0x14, 0x97, 0xcd, 0x3d, 0x30, 0x8c, 0xd5, 0x3c, 0x1b, 0x6f, 0x47, 0xbd,
- 0x95, 0xea, 0x52, 0xbe, 0xf8, 0xb1, 0xa7, 0xbd, 0x6f, 0x6f, 0x0b, 0xbe,
- 0x1d, 0x34, 0x69, 0xbd, 0x5f, 0x3a, 0x0a, 0xbf, 0xc9, 0x1a, 0xac, 0x3c,
- 0x55, 0xb4, 0xba, 0xbe, 0x37, 0x2b, 0x08, 0xbd, 0x4a, 0x8b, 0x2a, 0xbc,
- 0xfc, 0xb2, 0x59, 0x3e, 0x48, 0x61, 0xdb, 0xbd, 0xef, 0xd2, 0x79, 0xbe,
- 0x05, 0xf3, 0x02, 0x3f, 0x97, 0xc3, 0x81, 0x3f, 0x8f, 0xe4, 0x2d, 0xbf,
- 0x49, 0x66, 0x65, 0x3e, 0xf4, 0x1d, 0x4d, 0xbc, 0xac, 0x9d, 0x83, 0xbf,
- 0x4f, 0x3d, 0x8c, 0x3f, 0xa2, 0x23, 0xc0, 0xbe, 0xc0, 0x2c, 0xc5, 0x3c,
- 0x8b, 0x3d, 0x65, 0xbe, 0xb4, 0x34, 0x6f, 0xbd, 0x5a, 0xc9, 0x7e, 0xbf,
- 0x96, 0x1e, 0x44, 0xbf, 0x18, 0x8c, 0x8b, 0xbf, 0x5c, 0x97, 0xae, 0xbf,
- 0x47, 0x62, 0x3b, 0xbf, 0x54, 0x6a, 0xa0, 0x3b, 0x81, 0x66, 0x6c, 0xbd,
- 0x93, 0x62, 0xa0, 0x3e, 0xb3, 0x92, 0xb0, 0xbe, 0xef, 0x9d, 0x3c, 0xbe,
- 0xb1, 0xa0, 0x80, 0xbe, 0xe4, 0x2f, 0xbe, 0x3e, 0x80, 0x19, 0xf6, 0x3e,
- 0xa9, 0x1f, 0x24, 0xbe, 0x3b, 0x38, 0x2d, 0xbe, 0x31, 0x00, 0xac, 0x3e,
- 0xbd, 0xfa, 0x95, 0xbc, 0xb5, 0xae, 0x04, 0xbf, 0xe2, 0x6b, 0x46, 0xbe,
- 0xab, 0x26, 0xb2, 0x3f, 0xa4, 0x80, 0xed, 0xbe, 0x41, 0xe0, 0x5b, 0x3e,
- 0x53, 0x4b, 0x22, 0xbf, 0x81, 0x24, 0xa6, 0x3c, 0x8e, 0x94, 0x89, 0xbd,
- 0x34, 0x8d, 0x9b, 0xbd, 0x1d, 0xa3, 0x9d, 0x3e, 0x94, 0xf7, 0x28, 0x3f,
- 0xec, 0xf3, 0x87, 0xbd, 0x8c, 0xa4, 0xc2, 0xbf, 0xd1, 0xe3, 0xf6, 0xbf,
- 0x96, 0x29, 0x90, 0xbf, 0xe8, 0xca, 0xeb, 0x3e, 0x2e, 0xaa, 0x32, 0x3f,
- 0xb1, 0x2b, 0xb0, 0xbe, 0x56, 0x44, 0xb0, 0x3d, 0x13, 0x1e, 0xb0, 0xbf,
- 0xd7, 0x89, 0xd8, 0x3f, 0x91, 0x0e, 0x66, 0xbd, 0x65, 0x45, 0x59, 0x3e,
- 0x60, 0xa7, 0x40, 0xbd, 0xe2, 0xc8, 0xf8, 0xbe, 0x0e, 0xf4, 0x22, 0xbe,
- 0xd9, 0x18, 0x77, 0x3d, 0x8b, 0x3f, 0xc0, 0x3d, 0x81, 0xe7, 0x94, 0x3e,
- 0x0c, 0x8b, 0x91, 0xbe, 0x93, 0x97, 0x2b, 0xbe, 0x23, 0x2c, 0xdc, 0x3e,
- 0x50, 0xb5, 0x1b, 0xbe, 0x0d, 0xb8, 0x97, 0xbe, 0xb0, 0x98, 0x8c, 0x3f,
- 0x68, 0x2e, 0x5a, 0x3e, 0x63, 0x45, 0xd8, 0xbd, 0xab, 0x80, 0x83, 0xbe,
- 0x25, 0xae, 0x55, 0x3e, 0x14, 0x16, 0xa4, 0x3e, 0x79, 0x4b, 0x43, 0x3e,
- 0x16, 0xd7, 0x65, 0xbe, 0x12, 0x5c, 0x87, 0x3d, 0x62, 0x88, 0x81, 0xbe,
- 0xb1, 0xc8, 0x71, 0xbe, 0x68, 0x40, 0x77, 0xbe, 0x71, 0xd5, 0x85, 0x3f,
- 0xa2, 0x2b, 0xed, 0x3e, 0x21, 0xc0, 0x66, 0x3d, 0x13, 0xf0, 0x1f, 0x3d,
- 0xcb, 0xe0, 0x0c, 0x3f, 0xf1, 0xcc, 0x90, 0xbd, 0x6c, 0x93, 0x00, 0xbe,
- 0xf4, 0xbd, 0x5f, 0xbe, 0x7e, 0x67, 0xd6, 0x3d, 0x99, 0x38, 0xe2, 0xbc,
- 0x3a, 0x79, 0x94, 0xbc, 0x24, 0x12, 0xf2, 0xbe, 0x2b, 0xa3, 0x7a, 0x3f,
- 0x1d, 0x89, 0x08, 0x3e, 0x14, 0xa3, 0x7f, 0x3d, 0xcc, 0x94, 0xb2, 0x3c,
- 0xc5, 0x9b, 0x9e, 0x3f, 0xd1, 0x11, 0xbb, 0x3f, 0x52, 0x9a, 0x02, 0x3e,
- 0x58, 0x40, 0x02, 0xbe, 0xa1, 0x8d, 0x75, 0xbe, 0x73, 0xd2, 0x6a, 0x3f,
- 0x6a, 0x94, 0xc3, 0x3d, 0xa5, 0xef, 0xf4, 0xbb, 0x8a, 0xb4, 0x30, 0xbe,
- 0xd2, 0x7a, 0x0d, 0xbe, 0x22, 0x16, 0x3c, 0xbe, 0xeb, 0xfe, 0x8e, 0xbe,
- 0x97, 0x05, 0xc0, 0xbe, 0xae, 0x1f, 0x5e, 0xbe, 0xbe, 0xc2, 0x11, 0x3e,
- 0xbb, 0x91, 0x7f, 0x3e, 0xd1, 0x88, 0x86, 0x3e, 0x7f, 0xd4, 0xc6, 0x3d,
- 0xca, 0x6b, 0x13, 0xbc, 0xdd, 0x1c, 0x83, 0x3e, 0x8b, 0x31, 0x96, 0xbd,
- 0x48, 0xf7, 0xe1, 0xbe, 0xfc, 0x24, 0xca, 0xbd, 0x58, 0x1d, 0x93, 0x3d,
- 0x37, 0x8e, 0x1e, 0x3e, 0x53, 0x47, 0xb0, 0xbe, 0xc7, 0xc9, 0x24, 0xbe,
- 0xea, 0x1a, 0x92, 0x3e, 0x9b, 0xdf, 0x06, 0x3d, 0xed, 0x54, 0x28, 0xbe,
- 0xff, 0x1a, 0x0e, 0xbd, 0x95, 0xeb, 0xbb, 0xbe, 0xf6, 0xe4, 0xbf, 0x3d,
- 0x0f, 0xb6, 0x2d, 0xbe, 0xb1, 0xd2, 0x7e, 0xbd, 0x6a, 0x41, 0xeb, 0xbe,
- 0x44, 0xba, 0x00, 0x3a, 0xb9, 0xbe, 0x70, 0x3d, 0xb6, 0x0a, 0xbe, 0x3c,
- 0xbc, 0xec, 0xa8, 0x3d, 0x47, 0xe6, 0x12, 0xbd, 0x50, 0xf9, 0x95, 0xbc,
- 0x87, 0x40, 0x82, 0xbe, 0xa1, 0xb6, 0x21, 0x3e, 0xb6, 0x48, 0x6e, 0x3d,
- 0x23, 0x97, 0xb9, 0xbd, 0x3d, 0xfa, 0x1d, 0xbe, 0x18, 0x0b, 0x34, 0x3e,
- 0x2d, 0x8c, 0x9b, 0xbe, 0x0c, 0x17, 0xda, 0xbd, 0x7a, 0xdd, 0x59, 0x3d,
- 0x40, 0x0e, 0x15, 0xbe, 0x31, 0xc4, 0x8b, 0x3a, 0x27, 0x4c, 0x1b, 0x3e,
- 0xb1, 0x81, 0x1c, 0xbe, 0x72, 0xb2, 0xf5, 0x3c, 0x83, 0x47, 0x20, 0xbe,
- 0xe7, 0x77, 0x10, 0xbe, 0x78, 0x60, 0xa3, 0xbe, 0x81, 0x75, 0x91, 0x3e,
- 0x48, 0xcb, 0xce, 0xbd, 0xa3, 0xed, 0x87, 0xbe, 0x87, 0x8c, 0x5d, 0x3e,
- 0x97, 0xdd, 0xee, 0xbd, 0xe0, 0x03, 0xd2, 0xbd, 0xa7, 0x9d, 0xaf, 0xbd,
- 0x32, 0x27, 0x33, 0x3e, 0x2d, 0x44, 0x9a, 0x3d, 0x67, 0x19, 0xaf, 0xbd,
- 0x49, 0x62, 0x15, 0xbe, 0x52, 0xf0, 0x1a, 0x3e, 0x84, 0x8a, 0x83, 0xbe,
- 0x68, 0x12, 0x4f, 0xbe, 0x6e, 0xba, 0xd4, 0xbb, 0x56, 0xd6, 0x49, 0xbe,
- 0x7c, 0xa3, 0x59, 0x3d, 0xc3, 0x8b, 0x1a, 0xbe, 0x25, 0x6f, 0xc1, 0x3d,
- 0x21, 0x56, 0x11, 0x3d, 0x28, 0x21, 0xcf, 0x3c, 0x8f, 0x38, 0x19, 0xbe,
- 0x14, 0x2e, 0xe3, 0x3c, 0x33, 0xa5, 0x66, 0x3c, 0xc0, 0x43, 0x44, 0x3d,
- 0xeb, 0x71, 0x9c, 0x3b, 0xb1, 0xd0, 0xb4, 0xbd, 0xbc, 0x42, 0x4e, 0xbe,
- 0xe7, 0xb1, 0x8a, 0x3d, 0xe4, 0x25, 0x23, 0xbe, 0x9c, 0x75, 0xd8, 0xbd,
- 0x9b, 0x5d, 0x81, 0x3d, 0x66, 0xb7, 0x2a, 0xbe, 0xf8, 0x7c, 0x3b, 0x3c,
- 0xf2, 0x7f, 0x01, 0xbd, 0xcf, 0xcd, 0x83, 0xbc, 0x0d, 0x4f, 0x1b, 0xbd,
- 0x96, 0xa7, 0x90, 0xbd, 0x4a, 0x15, 0x0d, 0xbd, 0x70, 0xfb, 0xde, 0xbc,
- 0xee, 0x66, 0xa3, 0xbe, 0xc4, 0x08, 0xab, 0x3d, 0xdb, 0xfb, 0x76, 0xbc,
- 0x89, 0x30, 0xaf, 0x3c, 0x07, 0x07, 0xb1, 0xbe, 0x06, 0x23, 0x8c, 0x3d,
- 0x62, 0x1d, 0x6d, 0xbe, 0x7b, 0x52, 0x9a, 0xbe, 0xbc, 0x2d, 0x8b, 0xbe,
- 0x42, 0xd2, 0xeb, 0x3d, 0x38, 0xc0, 0x62, 0xbe, 0x8b, 0x02, 0x14, 0xbe,
- 0x4e, 0x35, 0xe4, 0xbe, 0x2e, 0x69, 0x24, 0xbe, 0xe1, 0x6c, 0x43, 0xbe,
- 0x02, 0x4a, 0x60, 0xbd, 0x0e, 0xc8, 0x71, 0x3e, 0x23, 0xa5, 0x87, 0xbe,
- 0xf5, 0x72, 0x41, 0x3d, 0x66, 0xbd, 0x8b, 0x3d, 0xaf, 0x44, 0x73, 0x3e,
- 0x46, 0xc8, 0x02, 0x3e, 0xb4, 0x5f, 0x24, 0xbe, 0xab, 0x0d, 0x54, 0xbe,
- 0x73, 0x96, 0x8d, 0x3d, 0xca, 0x7b, 0x71, 0x3e, 0xfb, 0x9d, 0x37, 0xbe,
- 0xeb, 0xec, 0x43, 0x3d, 0xe0, 0x3b, 0xcb, 0xbd, 0x99, 0x1a, 0xad, 0x3c,
- 0x24, 0x11, 0x73, 0x3e, 0x7f, 0x69, 0x2c, 0xbe, 0x2a, 0x07, 0x9d, 0xbe,
- 0x05, 0x37, 0xb8, 0x3d, 0x4c, 0xd8, 0xb6, 0x3d, 0xe2, 0xaf, 0x16, 0x3a,
- 0xe5, 0x08, 0xd2, 0xbd, 0x03, 0xb5, 0xbf, 0xbe, 0x71, 0x3d, 0x3a, 0xbd,
- 0xf0, 0x42, 0x35, 0xbd, 0xbc, 0x01, 0x43, 0xbd, 0xc9, 0x67, 0x02, 0x3e,
- 0xda, 0x31, 0x64, 0xbd, 0x3d, 0x8a, 0x41, 0xbe, 0x43, 0x90, 0x12, 0x3d,
- 0x3f, 0x47, 0x4b, 0x3e, 0x5c, 0x1f, 0x88, 0xbe, 0x48, 0x4e, 0x58, 0xbd,
- 0x55, 0x9a, 0xbc, 0x3d, 0x62, 0xed, 0xaa, 0xbd, 0x68, 0xb0, 0x58, 0x3e,
- 0xc0, 0x93, 0x5d, 0xbe, 0x49, 0x72, 0x35, 0xbe, 0xf2, 0x19, 0xf2, 0x3d,
- 0x2f, 0xcb, 0x11, 0x3c, 0xfa, 0x78, 0xfa, 0xbb, 0x1a, 0x77, 0xa6, 0x3d,
- 0x8b, 0xe6, 0x55, 0xbe, 0x44, 0x0a, 0x0e, 0xbe, 0xed, 0x15, 0x3e, 0x3e,
- 0x8a, 0x54, 0x07, 0x3e, 0x0b, 0x4c, 0x5c, 0xbe, 0x3a, 0xe3, 0x62, 0x3d,
- 0x8f, 0x2b, 0x03, 0xbe, 0xa2, 0x4d, 0xf7, 0xbe, 0xf9, 0x82, 0x95, 0x3e,
- 0x6c, 0x90, 0xd1, 0xbc, 0xfa, 0x44, 0xc2, 0x3e, 0xea, 0x7e, 0xc2, 0x3d,
- 0x8e, 0xa6, 0x55, 0xbc, 0xa2, 0x37, 0x4d, 0xbd, 0x72, 0x50, 0x31, 0x3d,
- 0x7b, 0x20, 0xa5, 0xbd, 0xe6, 0x7a, 0x3b, 0xbd, 0xca, 0x0d, 0x45, 0xbe,
- 0xb8, 0x97, 0x02, 0xbe, 0xe4, 0x54, 0x35, 0xbe, 0x00, 0xbe, 0x87, 0xbe,
- 0x28, 0x9c, 0xcc, 0xbe, 0x70, 0xdf, 0x89, 0xb8, 0x16, 0x36, 0x82, 0xbe,
- 0xde, 0xcb, 0xfa, 0xbc, 0x70, 0x44, 0x81, 0xbd, 0x10, 0x03, 0xa6, 0x3d,
- 0x85, 0x5b, 0x23, 0xbe, 0x24, 0xfb, 0x9c, 0x3d, 0x0e, 0x07, 0x09, 0xbe,
- 0xea, 0x94, 0xb3, 0xbd, 0x80, 0x18, 0x2f, 0xbd, 0xb5, 0xa3, 0x1a, 0xbe,
- 0xf1, 0xbc, 0x6e, 0x3e, 0xe2, 0x05, 0x3b, 0xbc, 0x6d, 0x31, 0x4a, 0xbe,
- 0xd3, 0x2a, 0x8b, 0x3e, 0xbb, 0x5c, 0xca, 0xbc, 0x47, 0x4e, 0xd4, 0xbd,
- 0x27, 0xe8, 0xb4, 0xbd, 0x75, 0x37, 0x18, 0xbe, 0xe7, 0xd2, 0x83, 0xbc,
- 0x34, 0xf7, 0x24, 0xbc, 0xf8, 0xc5, 0x40, 0xbe, 0x3c, 0x43, 0x1c, 0x3e,
- 0xf0, 0xe0, 0xd1, 0xbd, 0x99, 0xca, 0x0d, 0x3e, 0x61, 0xda, 0xc0, 0x3d,
- 0xc3, 0x88, 0xcc, 0x3d, 0x35, 0xdb, 0x48, 0xbe, 0x23, 0xbb, 0x24, 0xbe,
- 0xe3, 0xb8, 0x8c, 0xbe, 0x5f, 0x68, 0x50, 0xbb, 0xdf, 0x8d, 0x3c, 0x3e,
- 0x6e, 0xcf, 0x8d, 0x3f, 0x12, 0x42, 0xf6, 0xbd, 0x12, 0x78, 0xdd, 0xbd,
- 0xa0, 0x71, 0xc6, 0x3d, 0xe3, 0x00, 0xa8, 0x3d, 0xae, 0xc2, 0x80, 0x3f,
- 0xda, 0x00, 0xae, 0x3e, 0xbe, 0xc9, 0x48, 0x3f, 0x8c, 0xce, 0xb9, 0x3e,
- 0x8a, 0x4f, 0xf4, 0xbe, 0x33, 0xee, 0x2a, 0x3f, 0x08, 0xbb, 0x3a, 0x3f,
- 0xe6, 0x99, 0x3d, 0xbf, 0xbd, 0xcf, 0x8e, 0x3e, 0x5b, 0xa8, 0x2b, 0x3e,
- 0x0e, 0x1e, 0x2f, 0xbf, 0x64, 0xec, 0x2c, 0xbf, 0xdb, 0xfa, 0x42, 0x3f,
- 0xb0, 0x92, 0x65, 0x3f, 0x55, 0x2a, 0x9c, 0xbf, 0x51, 0x30, 0xb6, 0x3e,
- 0x6c, 0xa3, 0xc6, 0xbc, 0x93, 0x0b, 0xeb, 0xbd, 0x46, 0x41, 0x97, 0xbd,
- 0xe1, 0x4f, 0x4f, 0xbb, 0x75, 0x67, 0x8b, 0x3e, 0x8b, 0x0d, 0x9b, 0x3d,
- 0xe6, 0xf0, 0x03, 0x3e, 0x19, 0xaf, 0x12, 0xbf, 0xc9, 0x2f, 0xbf, 0x3e,
- 0x6b, 0x9b, 0x1a, 0xbe, 0xf7, 0xea, 0x66, 0x3d, 0xb5, 0xb5, 0x06, 0x3f,
- 0xd6, 0xb3, 0x42, 0x3f, 0x25, 0x7d, 0xfc, 0x3e, 0x6f, 0x41, 0x08, 0xbe,
- 0x5d, 0xaf, 0x50, 0x3c, 0xd0, 0x11, 0xe9, 0xbd, 0xb7, 0x9c, 0x47, 0xbf,
- 0x57, 0x2d, 0x33, 0x3f, 0xc3, 0x16, 0x2c, 0xbe, 0xea, 0x37, 0xe0, 0x3d,
- 0x1e, 0x6a, 0x76, 0x3d, 0xf8, 0x3b, 0x60, 0x3f, 0xe4, 0x39, 0x81, 0x3d,
- 0x3b, 0xec, 0xc4, 0xbe, 0x36, 0x60, 0x46, 0x3f, 0x83, 0xc5, 0xca, 0x3d,
- 0xd2, 0x77, 0x64, 0x3c, 0xfc, 0xd6, 0xa4, 0x3d, 0x72, 0xa3, 0x9c, 0x3d,
- 0x34, 0x07, 0x6f, 0x3d, 0xdb, 0x57, 0x92, 0xba, 0xf1, 0xf1, 0xca, 0x3e,
- 0x4b, 0xfd, 0x04, 0x3f, 0x6d, 0xea, 0x88, 0xbf, 0xd0, 0xf2, 0x85, 0xbe,
- 0x2d, 0x31, 0x78, 0xbc, 0x91, 0x3b, 0x2f, 0xbf, 0xf9, 0x56, 0xfa, 0xbb,
- 0x1d, 0xde, 0x34, 0xbe, 0xe2, 0xba, 0x52, 0x3d, 0x87, 0xbd, 0x0d, 0x3f,
- 0x2f, 0xff, 0xef, 0xbc, 0x83, 0xb2, 0x6a, 0x3f, 0x59, 0x48, 0x23, 0xbf,
- 0x16, 0x2b, 0x39, 0x3f, 0xe2, 0xb8, 0xa6, 0xbe, 0x37, 0x31, 0xef, 0x3a,
- 0x79, 0x97, 0xe0, 0xbe, 0x92, 0xcf, 0xfe, 0xbd, 0x97, 0x55, 0x81, 0xbe,
- 0xfd, 0x87, 0xc1, 0x3e, 0x60, 0xd8, 0x5f, 0x3e, 0x68, 0xb9, 0x2f, 0x3f,
- 0xbc, 0x7f, 0x0f, 0xbe, 0xe7, 0xb5, 0x8c, 0x3d, 0xe2, 0x2f, 0x0a, 0x3f,
- 0x08, 0xcc, 0xef, 0xbd, 0xc1, 0xdc, 0x55, 0xbe, 0x58, 0xbe, 0x31, 0xbf,
- 0x19, 0x04, 0x62, 0x3e, 0xb4, 0x8d, 0x5e, 0x3b, 0x8a, 0x59, 0xbf, 0x3e,
- 0x82, 0xe6, 0x20, 0xbf, 0xaa, 0x3f, 0xce, 0xbd, 0xa4, 0x43, 0x92, 0x3f,
- 0xa1, 0x26, 0x7f, 0x3d, 0xf5, 0xad, 0xaf, 0xbe, 0x71, 0xe0, 0x34, 0x3e,
- 0x1c, 0x62, 0x0a, 0x3d, 0xaa, 0x8e, 0x0d, 0x3e, 0x70, 0x6d, 0x61, 0x3e,
- 0x60, 0xe8, 0x0f, 0xc0, 0x56, 0x4b, 0xd0, 0xbd, 0xa0, 0x3f, 0x71, 0xbd,
- 0xb8, 0xd1, 0xbe, 0xbf, 0x49, 0xfa, 0xa7, 0xbc, 0xeb, 0x60, 0x45, 0x3e,
- 0x1c, 0xdd, 0x35, 0xbe, 0x65, 0x0b, 0xd9, 0x3e, 0x91, 0x72, 0xdd, 0xbd,
- 0x85, 0x25, 0xf4, 0xbc, 0x80, 0x1e, 0x8d, 0xbe, 0x06, 0x28, 0x00, 0xbe,
- 0x29, 0xe4, 0x08, 0x3a, 0xc1, 0x64, 0x67, 0xbc, 0xd0, 0xab, 0xaa, 0x3c,
- 0x89, 0x13, 0x16, 0x3d, 0xe9, 0x9f, 0xbb, 0xbc, 0xce, 0x53, 0xf3, 0xbd,
- 0x7c, 0x2c, 0xa9, 0xbc, 0xdb, 0x35, 0xad, 0xbc, 0xc1, 0x93, 0x38, 0xbe,
- 0x0a, 0x5f, 0x64, 0xbd, 0x00, 0x7f, 0xfe, 0xbb, 0xd0, 0x07, 0x98, 0xbd,
- 0x50, 0x67, 0x29, 0xbd, 0x6e, 0x70, 0xb6, 0x3d, 0xe9, 0x76, 0x11, 0xbe,
- 0x91, 0xe0, 0x59, 0xbe, 0xb4, 0x4b, 0x87, 0x3d, 0x2c, 0xc3, 0x11, 0x3e,
- 0x4c, 0xaf, 0x46, 0x3c, 0xff, 0xf1, 0x06, 0xbe, 0x2e, 0x9e, 0x5e, 0x3c,
- 0xa9, 0x74, 0x80, 0xbc, 0x1a, 0x9d, 0xa1, 0xbc, 0x65, 0x2c, 0x83, 0x3d,
- 0x74, 0x63, 0x9e, 0xbd, 0xc1, 0xe3, 0x80, 0x3c, 0x16, 0xd4, 0xfe, 0x3d,
- 0x4a, 0xe6, 0x22, 0xbe, 0xe4, 0xa2, 0x49, 0xbd, 0x16, 0x19, 0xa5, 0xbf,
- 0x20, 0x6d, 0x5d, 0xbe, 0x33, 0x74, 0xfa, 0x3c, 0xb5, 0x23, 0x84, 0xbd,
- 0xb9, 0xfe, 0x18, 0xbd, 0xbe, 0x29, 0x25, 0x3c, 0xad, 0x15, 0x48, 0xbe,
- 0xf7, 0x25, 0x02, 0xbf, 0xa1, 0x1d, 0x48, 0xbe, 0xad, 0x63, 0xf7, 0xba,
- 0x4f, 0x01, 0xe7, 0xbe, 0x7b, 0xe8, 0x12, 0xbe, 0x08, 0x1a, 0x51, 0xbe,
- 0xe2, 0xfe, 0xb3, 0x3d, 0xb8, 0x9e, 0xab, 0xbd, 0xca, 0xbb, 0xda, 0xbd,
- 0x24, 0x56, 0x8f, 0x3d, 0x28, 0xb5, 0x06, 0xbf, 0x9a, 0x54, 0x7a, 0x3d,
- 0xd8, 0xfd, 0xa3, 0xbd, 0x49, 0x48, 0x09, 0xbe, 0x14, 0x08, 0x3b, 0x3c,
- 0xae, 0xcc, 0x9a, 0x39, 0xbd, 0xa9, 0xba, 0xbd, 0x1d, 0xf7, 0x17, 0x3e,
- 0xb2, 0xe6, 0xf2, 0xbd, 0x22, 0x38, 0x0a, 0xbe, 0x3e, 0x67, 0x91, 0xbe,
- 0x1c, 0x3e, 0x1a, 0xbf, 0x06, 0xd8, 0x1a, 0xbe, 0xac, 0x06, 0xd2, 0xbe,
- 0x93, 0xf7, 0xf4, 0xbd, 0x6e, 0x97, 0x31, 0xbf, 0x57, 0x9b, 0xf7, 0x3d,
- 0xe3, 0x92, 0x8d, 0x3d, 0x79, 0x26, 0x69, 0xbe, 0xaa, 0xf7, 0x97, 0xbd,
- 0xd1, 0x4c, 0x98, 0xbd, 0x85, 0x35, 0xee, 0xbd, 0x5e, 0x75, 0xec, 0xbc,
- 0xc9, 0x37, 0x2c, 0xbd, 0x5d, 0x95, 0xd4, 0xbe, 0x09, 0x20, 0x67, 0xbe,
- 0xf1, 0x2a, 0x1b, 0xbe, 0x2b, 0xc1, 0x8b, 0xbe, 0xe6, 0x50, 0x6c, 0xbd,
- 0x66, 0xcc, 0x4a, 0xbd, 0xff, 0x73, 0x81, 0xbe, 0x16, 0x59, 0xcf, 0x3c,
- 0xfb, 0xe7, 0x48, 0xbd, 0x7b, 0x62, 0x1e, 0xbd, 0x23, 0xdf, 0x29, 0x3d,
- 0x39, 0xad, 0xd7, 0x3d, 0xd3, 0xf0, 0x9b, 0xbd, 0x44, 0x55, 0x2c, 0xbc,
- 0x2c, 0xcc, 0xda, 0xbc, 0x26, 0x27, 0x09, 0xbe, 0xdf, 0xe7, 0xb9, 0x3d,
- 0x47, 0xf9, 0x4e, 0x3d, 0x40, 0x5e, 0xe1, 0xbd, 0xc6, 0xf5, 0xf0, 0x3d,
- 0x5b, 0xca, 0x5d, 0xbb, 0x24, 0x20, 0x9d, 0xbc, 0xe5, 0x1b, 0x2d, 0xbe,
- 0x80, 0x7a, 0xac, 0xbd, 0x99, 0x5e, 0x01, 0x3e, 0xae, 0xae, 0x48, 0xbe,
- 0xf5, 0x37, 0x57, 0xbe, 0x93, 0xdf, 0xe2, 0xbe, 0x89, 0xc9, 0x67, 0x3d,
- 0xbf, 0x1c, 0x9b, 0xbe, 0x9b, 0x47, 0xbe, 0x3d, 0x81, 0xec, 0x76, 0xbd,
- 0xd0, 0x59, 0x27, 0x3e, 0x70, 0xe7, 0x1f, 0xbe, 0x0b, 0x1e, 0xc6, 0xbd,
- 0x93, 0x74, 0xc8, 0x3e, 0xce, 0x02, 0x79, 0x3f, 0xa5, 0x09, 0x52, 0xbf,
- 0xf5, 0x93, 0x29, 0x3e, 0x63, 0xf3, 0x9c, 0x3d, 0x3a, 0x58, 0x8f, 0xbf,
- 0x29, 0x04, 0x8a, 0x3f, 0x9e, 0x55, 0xfc, 0xbd, 0x71, 0xe1, 0x45, 0xbd,
- 0x73, 0x7c, 0x11, 0xbe, 0x21, 0x58, 0x1f, 0xbe, 0x78, 0xfb, 0x6b, 0xbf,
- 0x86, 0xd5, 0x5d, 0xbf, 0x2b, 0x9b, 0x8c, 0xbf, 0x69, 0x9d, 0xbf, 0xbf,
- 0x1f, 0x5d, 0x1e, 0xbf, 0x30, 0xbf, 0x7c, 0x3d, 0xa5, 0x18, 0x89, 0x3d,
- 0xc7, 0xc2, 0xa7, 0x3e, 0x0d, 0x03, 0x9c, 0xbe, 0xe3, 0x0c, 0x05, 0xbd,
- 0xaf, 0xe9, 0x63, 0xbe, 0xeb, 0x3e, 0x0e, 0x3f, 0xb0, 0x3c, 0x6a, 0x3e,
- 0x85, 0x8e, 0x7a, 0x3d, 0x74, 0xf4, 0xbd, 0xbd, 0x23, 0xb1, 0xeb, 0x3e,
- 0xdf, 0x6c, 0x9c, 0x3c, 0x52, 0x0d, 0xdf, 0xbe, 0xc7, 0x2a, 0x98, 0xbe,
- 0xce, 0xe1, 0x95, 0x3f, 0xfc, 0xdc, 0xed, 0xbe, 0x90, 0x64, 0xce, 0x3d,
- 0x05, 0xef, 0x2e, 0xbf, 0xfb, 0xd3, 0xb3, 0x3d, 0xf8, 0x24, 0x39, 0xbd,
- 0xd0, 0xd6, 0x10, 0xbe, 0x34, 0xee, 0x5c, 0x3e, 0xb2, 0xfa, 0x42, 0x3f,
- 0x75, 0x37, 0x3c, 0x3d, 0x5c, 0xee, 0xbe, 0xbf, 0x3f, 0x17, 0xec, 0xbf,
- 0xab, 0x63, 0x80, 0xbf, 0x08, 0x85, 0x95, 0x3e, 0xd6, 0x67, 0x14, 0x3f,
- 0xd7, 0xd1, 0xb9, 0xbe, 0x6a, 0x6d, 0xd6, 0x3d, 0xd9, 0x1b, 0xc0, 0xbf,
- 0x93, 0x75, 0xcd, 0x3f, 0x08, 0xd3, 0x0f, 0xbe, 0x85, 0xed, 0x18, 0x3e,
- 0xf3, 0x90, 0x2d, 0xbd, 0x88, 0x34, 0xe1, 0xbe, 0x89, 0x1f, 0x48, 0xbe,
- 0x77, 0xaf, 0x5a, 0x3e, 0x3d, 0x2b, 0x9a, 0x3d, 0x3f, 0x28, 0xb7, 0x3e,
- 0x76, 0x35, 0x8c, 0xbe, 0x21, 0x99, 0x58, 0xbe, 0x16, 0x6b, 0x72, 0x3e,
- 0x28, 0x4e, 0x52, 0xbe, 0x73, 0x06, 0x86, 0xbe, 0x2d, 0x4b, 0x6b, 0x3f,
- 0xe3, 0x89, 0x97, 0x3e, 0x06, 0x6a, 0x00, 0xbe, 0xe1, 0xb6, 0xc5, 0xbe,
- 0x1b, 0xf3, 0x30, 0x3e, 0xe1, 0xd7, 0x80, 0x3e, 0x45, 0x25, 0x4e, 0x3e,
- 0xa4, 0x65, 0x8b, 0xbe, 0x73, 0xd2, 0x73, 0xbd, 0xf6, 0x0d, 0x70, 0xbe,
- 0x48, 0x5b, 0xb2, 0xbd, 0x70, 0xef, 0x4c, 0xbe, 0xe7, 0xee, 0x8e, 0x3f,
- 0x95, 0x6f, 0x16, 0x3f, 0x1c, 0x27, 0xd1, 0xbd, 0xc4, 0x9c, 0xe7, 0xbb,
- 0x49, 0xc4, 0x08, 0x3f, 0x60, 0x95, 0x7d, 0xbd, 0x1b, 0x77, 0x17, 0xbe,
- 0x53, 0x8e, 0x17, 0xbe, 0x73, 0x35, 0x0f, 0x3e, 0xe6, 0xe6, 0xac, 0xbd,
- 0x30, 0xc2, 0xc3, 0xba, 0xbe, 0x7a, 0xe7, 0xbe, 0x73, 0x4f, 0x5c, 0x3f,
- 0x22, 0x6d, 0x3a, 0x3e, 0x90, 0x89, 0xe7, 0xbc, 0xee, 0x3a, 0x6a, 0xbc,
- 0x65, 0xad, 0x86, 0x3f, 0x17, 0x14, 0xb9, 0x3f, 0x9e, 0xa9, 0x99, 0x3e,
- 0xbe, 0x8d, 0x18, 0xbe, 0x07, 0x6a, 0xd4, 0xbe, 0xef, 0xee, 0x65, 0x3f,
- 0xfa, 0xd7, 0x8d, 0xbe, 0xf1, 0xb1, 0x7b, 0x3d, 0xbe, 0x5f, 0xa8, 0xbd,
- 0xb5, 0x10, 0x45, 0xbd, 0x24, 0xd5, 0x72, 0xbe, 0x8d, 0x8e, 0x92, 0xbe,
- 0x2f, 0xda, 0x0f, 0xbf, 0x29, 0x55, 0xbe, 0xbd, 0xf8, 0x48, 0x1f, 0x3d,
- 0x0a, 0xe2, 0xb5, 0xbd, 0xe7, 0x13, 0x04, 0x3f, 0xdb, 0xf6, 0x47, 0x3e,
- 0xb3, 0x92, 0x07, 0xbe, 0x5d, 0xba, 0x69, 0x3d, 0x16, 0xb6, 0x7f, 0xbd,
- 0x35, 0xa6, 0x07, 0xbf, 0xca, 0x19, 0x94, 0x3e, 0x60, 0x20, 0x68, 0x3e,
- 0x9d, 0x3b, 0x0e, 0x3c, 0xda, 0xf4, 0xb1, 0xbe, 0xe6, 0x50, 0xcf, 0xbe,
- 0xf2, 0x85, 0xdb, 0x3e, 0x4d, 0x18, 0x57, 0xbd, 0x1a, 0x03, 0x9b, 0xbe,
- 0xd5, 0x1d, 0x7c, 0xbe, 0x27, 0x6e, 0x50, 0xbe, 0x8d, 0xc3, 0x04, 0x3f,
- 0xb5, 0x6f, 0x15, 0xbe, 0xdb, 0xbe, 0x01, 0xbe, 0x4d, 0x15, 0xf6, 0xbe,
- 0x2e, 0xa8, 0x90, 0xbd, 0x0d, 0x1a, 0x09, 0xbe, 0x97, 0x06, 0x39, 0x3e,
- 0x67, 0xdc, 0x54, 0xbd, 0x63, 0xca, 0x98, 0xbd, 0x26, 0x73, 0xde, 0x3c,
- 0x41, 0x01, 0x87, 0xbe, 0xb6, 0x79, 0xa5, 0x3e, 0xb9, 0x8c, 0xc4, 0x3d,
- 0x2e, 0x73, 0x0d, 0xbd, 0x9d, 0x14, 0x10, 0xbe, 0x19, 0xef, 0x5c, 0x3e,
- 0xfc, 0x7f, 0x65, 0xbe, 0xc9, 0xd2, 0x63, 0x3d, 0x42, 0xc3, 0x05, 0xbd,
- 0xac, 0x00, 0xe2, 0x3d, 0xdf, 0xc5, 0x8f, 0x3e, 0x8c, 0xcc, 0x81, 0x3d,
- 0x76, 0x56, 0x86, 0xbd, 0xe5, 0x90, 0x55, 0x3c, 0xc4, 0x55, 0x20, 0xbe,
- 0x40, 0x55, 0xfd, 0xbd, 0xdb, 0x21, 0xb1, 0xbd, 0x70, 0xe0, 0x97, 0x3e,
- 0x39, 0xd0, 0xe8, 0x3c, 0x8b, 0xe1, 0xb9, 0xbe, 0xfe, 0xc0, 0x85, 0x3e,
- 0xc4, 0x9f, 0x1c, 0xbe, 0x02, 0xb7, 0x57, 0xbe, 0x53, 0x89, 0xbd, 0xbd,
- 0xce, 0xc6, 0x86, 0x3e, 0x74, 0x67, 0x9e, 0xbd, 0xa0, 0x97, 0xbe, 0x3a,
- 0xb1, 0x26, 0xd2, 0xbd, 0x99, 0xbe, 0xe7, 0x3d, 0x66, 0xae, 0x9e, 0xbe,
- 0x4a, 0x2d, 0x24, 0xbe, 0xe8, 0x08, 0x65, 0xbe, 0xfa, 0x35, 0x15, 0x3d,
- 0x6f, 0x2e, 0x93, 0x3d, 0x7b, 0x53, 0xa7, 0x3b, 0x5a, 0x5b, 0x4b, 0x3e,
- 0x19, 0xba, 0x90, 0xbd, 0xd8, 0x91, 0xa0, 0xbd, 0xfb, 0x60, 0x49, 0xbe,
- 0x79, 0x8f, 0xd4, 0xbd, 0xc9, 0xf4, 0x0d, 0xbd, 0xfe, 0x68, 0xfa, 0x3d,
- 0xc3, 0x76, 0xe8, 0xbd, 0xc0, 0x3b, 0x53, 0xbe, 0x78, 0x0f, 0x93, 0xbd,
- 0xe3, 0xb5, 0x24, 0xbe, 0xa8, 0xf1, 0x86, 0xbd, 0xab, 0xc8, 0x7d, 0x3d,
- 0x97, 0xbd, 0x67, 0x3e, 0x11, 0x80, 0xc1, 0x3d, 0x24, 0xd3, 0x2d, 0x3d,
- 0x57, 0x7f, 0x1c, 0xbe, 0x3f, 0x8d, 0x18, 0xbe, 0x15, 0x8f, 0x48, 0xbe,
- 0xf8, 0x49, 0xfc, 0xbd, 0x9a, 0xcc, 0x02, 0x3d, 0x93, 0x35, 0x0c, 0x3d,
- 0xdd, 0x4f, 0x8e, 0xbe, 0x60, 0x98, 0xd3, 0x3a, 0x4f, 0x5c, 0x79, 0xbd,
- 0xc1, 0xaf, 0xf3, 0x3c, 0x00, 0xee, 0x97, 0xbe, 0x02, 0x01, 0xb2, 0xbd,
- 0x86, 0xc5, 0xb6, 0xbd, 0xa7, 0x12, 0xe7, 0xbc, 0x51, 0xd9, 0xbb, 0xbe,
- 0x03, 0x58, 0xee, 0x3d, 0xe7, 0xd0, 0x98, 0xbe, 0x10, 0xe9, 0x35, 0xbe,
- 0x9c, 0xf8, 0x9d, 0xbd, 0x87, 0x6c, 0xd2, 0xbe, 0x2f, 0x22, 0xb9, 0xbd,
- 0xf2, 0xe4, 0x8c, 0xbe, 0x7e, 0x2c, 0x49, 0x3d, 0xa6, 0xa8, 0x89, 0xbe,
- 0x89, 0x6d, 0x4c, 0x3c, 0x76, 0x63, 0x84, 0x3e, 0xdb, 0xe2, 0x72, 0x3e,
- 0xf3, 0x79, 0x29, 0xbe, 0x72, 0xd6, 0xb1, 0xbe, 0xea, 0xdd, 0x09, 0xbe,
- 0x38, 0xe3, 0xa2, 0xbe, 0x9b, 0x8f, 0x16, 0x3f, 0x1a, 0x7a, 0xd4, 0xbd,
- 0x35, 0x42, 0x8b, 0x3e, 0xba, 0x46, 0xea, 0xbd, 0x85, 0xd9, 0x9c, 0xbd,
- 0x3a, 0x5a, 0x09, 0x3f, 0x89, 0xfd, 0x3b, 0xbe, 0xf5, 0x2f, 0x3c, 0xbe,
- 0x86, 0xb1, 0x67, 0xbe, 0x80, 0x9a, 0x18, 0xbc, 0xf5, 0xd6, 0xb4, 0x3e,
- 0x50, 0x58, 0xa6, 0x3d, 0x9c, 0x71, 0x80, 0xbe, 0xe8, 0x65, 0xf2, 0xbd,
- 0x68, 0x64, 0xd8, 0x3d, 0x0b, 0xb8, 0x07, 0x3d, 0x4e, 0x60, 0xf7, 0xbc,
- 0xe0, 0xb5, 0x78, 0xbe, 0x95, 0xa6, 0x10, 0x3d, 0x51, 0x58, 0x2f, 0xbe,
- 0xff, 0x18, 0x33, 0x3e, 0x6d, 0x8a, 0x59, 0xbe, 0x88, 0x37, 0x4c, 0xbe,
- 0xb2, 0x05, 0x70, 0x3d, 0x7e, 0xda, 0x20, 0xbe, 0x15, 0xd2, 0x8c, 0x3e,
- 0xff, 0xd3, 0x37, 0xbe, 0x7f, 0xd8, 0x70, 0xbe, 0x61, 0x2b, 0x64, 0x3c,
- 0x89, 0x5f, 0x0f, 0xbe, 0x79, 0x5b, 0x0a, 0x3e, 0x17, 0xd3, 0xe9, 0xbd,
- 0x70, 0xc5, 0xb3, 0xbe, 0x35, 0x6a, 0x25, 0x3d, 0x22, 0xa7, 0x85, 0x3d,
- 0x75, 0x22, 0x1b, 0xbe, 0xe0, 0x7d, 0x8b, 0xbe, 0xce, 0xba, 0xfc, 0x3d,
- 0x93, 0xe5, 0x5e, 0xbe, 0x52, 0x8a, 0xb0, 0xbe, 0x63, 0xd2, 0xea, 0x3e,
- 0x5b, 0x92, 0xf9, 0xbd, 0x64, 0xe4, 0x90, 0x3e, 0x07, 0xfc, 0x8d, 0xbb,
- 0xa4, 0x90, 0x36, 0xbd, 0x80, 0x87, 0x6d, 0x3d, 0x68, 0x26, 0xf6, 0x3d,
- 0xc5, 0x8b, 0x88, 0xbd, 0x52, 0xf6, 0xd6, 0xbb, 0x6a, 0xcf, 0xc8, 0xbe,
- 0x49, 0x54, 0x72, 0xbe, 0xfe, 0x24, 0x33, 0xbe, 0x31, 0xaa, 0x31, 0x3b,
- 0xf2, 0xda, 0x02, 0xbe, 0xc7, 0xdf, 0xc5, 0xbb, 0xc6, 0x9a, 0x70, 0xbe,
- 0x4b, 0x0f, 0x61, 0xbc, 0xf3, 0x5b, 0x0a, 0x3d, 0x6e, 0x36, 0x41, 0x3d,
- 0x84, 0xbe, 0x9d, 0x3d, 0x9b, 0x70, 0x5b, 0xbd, 0xb5, 0xe6, 0x76, 0xbd,
- 0x3b, 0x42, 0x1a, 0xbe, 0x0d, 0xe1, 0xda, 0x3d, 0x0a, 0x58, 0xb1, 0xbd,
- 0x2c, 0x21, 0x3e, 0x3e, 0xe4, 0x0d, 0x8a, 0x3d, 0xa4, 0x1b, 0xa6, 0x3d,
- 0x98, 0x58, 0x90, 0x3e, 0x24, 0xce, 0xb7, 0xbd, 0xb8, 0x32, 0x33, 0x3d,
- 0xae, 0x69, 0x26, 0xbd, 0x81, 0x1f, 0x5f, 0xbe, 0x72, 0xb3, 0xef, 0xbd,
- 0x95, 0x75, 0xc5, 0x3d, 0x0d, 0x64, 0xa5, 0xbe, 0xbf, 0xa4, 0x4b, 0x3e,
- 0x74, 0x05, 0x3d, 0xbe, 0x49, 0xc9, 0x10, 0xbd, 0x17, 0x31, 0xa4, 0xbd,
- 0x0d, 0x34, 0x81, 0x3e, 0x75, 0xaa, 0x6e, 0xbe, 0x6d, 0x04, 0x9d, 0xbe,
- 0xd5, 0xa1, 0x19, 0xbc, 0x4a, 0x9c, 0xbc, 0xbd, 0x21, 0xa6, 0x0a, 0x3e,
- 0x3a, 0x5e, 0xdd, 0x3e, 0x1d, 0x13, 0xa5, 0xbe, 0x50, 0xc5, 0xb1, 0xbe,
- 0x46, 0xc1, 0x73, 0xbe, 0x2f, 0x10, 0xab, 0x3d, 0x53, 0x93, 0x85, 0x3a,
- 0x2f, 0x05, 0x19, 0xbe, 0x06, 0x42, 0xc5, 0x3e, 0xa4, 0xf3, 0x8e, 0x3e,
- 0xd0, 0x94, 0x03, 0x3f, 0xe0, 0x23, 0x5e, 0xbd, 0x82, 0x2c, 0xcb, 0xbd,
- 0x49, 0x9a, 0x10, 0xbf, 0xa4, 0x8e, 0x0e, 0x3f, 0x53, 0xc7, 0x95, 0x3e,
- 0x17, 0x01, 0x5c, 0x3e, 0xe5, 0x93, 0xd3, 0xbe, 0x87, 0xd6, 0xbe, 0xbc,
- 0xbb, 0xbc, 0xba, 0xbd, 0xef, 0x32, 0x18, 0xbf, 0xb4, 0xf1, 0x65, 0x3f,
- 0x15, 0x96, 0xe2, 0xbe, 0x40, 0x90, 0x06, 0xbe, 0x08, 0xdf, 0x10, 0xbe,
- 0x69, 0xd5, 0x87, 0x3e, 0x3c, 0x12, 0x2e, 0x3f, 0xf9, 0x3d, 0xf8, 0xbe,
- 0x15, 0xa0, 0x58, 0xbe, 0x6b, 0x7e, 0x3d, 0xbf, 0x2d, 0xa3, 0xe6, 0xbd,
- 0xcc, 0x25, 0x7a, 0xbd, 0xd1, 0xda, 0x98, 0x3e, 0x40, 0x96, 0xf9, 0xbe,
- 0xa5, 0xf7, 0x2c, 0x3e, 0x43, 0xff, 0xa7, 0x3e, 0x0a, 0xdd, 0xc5, 0x3d,
- 0x68, 0x13, 0x32, 0x3f, 0x24, 0x6d, 0xde, 0xbc, 0x23, 0x99, 0xc9, 0xbd,
- 0x0b, 0xac, 0xc9, 0x3e, 0x13, 0x09, 0x13, 0xbe, 0xe2, 0x47, 0xec, 0xbe,
- 0xc1, 0x9f, 0xb3, 0xbe, 0xec, 0x98, 0x16, 0x3f, 0x41, 0xb4, 0x69, 0x3d,
- 0x93, 0x21, 0x8f, 0x3e, 0x9c, 0x7b, 0xc3, 0x3e, 0x5d, 0xd5, 0xe5, 0xbd,
- 0x7e, 0xed, 0x30, 0x3d, 0xc4, 0x25, 0x36, 0xbf, 0xdf, 0xcb, 0xbb, 0x3e,
- 0x11, 0x68, 0x97, 0x3e, 0xec, 0x88, 0x99, 0xbe, 0x05, 0x8e, 0x5e, 0xbd,
- 0x8d, 0x91, 0xcb, 0x3e, 0x79, 0x50, 0x87, 0xbf, 0x59, 0x92, 0x43, 0xbf,
- 0x95, 0xd8, 0xa9, 0xbc, 0x00, 0x2d, 0xba, 0xbb, 0xd0, 0x12, 0x1c, 0xbe,
- 0x2c, 0xa6, 0xc3, 0xbe, 0x9d, 0xc1, 0x1e, 0xbe, 0x5d, 0xa9, 0xd6, 0xbe,
- 0x4b, 0xa3, 0x85, 0x3e, 0x5d, 0xa9, 0x9e, 0x3e, 0xeb, 0x58, 0x42, 0x3e,
- 0x0b, 0x67, 0x97, 0xbe, 0x6a, 0x46, 0x53, 0xbf, 0x3c, 0x33, 0x9a, 0xbe,
- 0x9d, 0x0b, 0x49, 0xbe, 0xa1, 0x7c, 0x50, 0xbe, 0xc8, 0x94, 0x05, 0x3f,
- 0xa5, 0x7b, 0xc4, 0xbe, 0x6a, 0xc8, 0x08, 0x3f, 0x39, 0xb8, 0x24, 0x3e,
- 0xe4, 0x1c, 0x28, 0xbe, 0x0f, 0x5b, 0x7f, 0xbe, 0x45, 0xe2, 0x16, 0x3e,
- 0xfb, 0x09, 0xa0, 0xbd, 0x1c, 0xea, 0x5f, 0xbf, 0xc8, 0x88, 0xb6, 0xbe,
- 0x48, 0x69, 0x03, 0x3d, 0x89, 0x1a, 0x12, 0xbe, 0x93, 0xba, 0x34, 0xbd,
- 0xac, 0x2f, 0x63, 0xbe, 0x37, 0xf6, 0x73, 0xbe, 0x06, 0x05, 0xaf, 0xbe,
- 0xd6, 0x16, 0x8f, 0xbe, 0xcb, 0x2c, 0x23, 0x3e, 0x8e, 0xb2, 0x33, 0xbe,
- 0xa2, 0x28, 0x9a, 0x3c, 0x7a, 0x85, 0x8e, 0xbe, 0xba, 0x28, 0x0a, 0x3b,
- 0xf7, 0x1c, 0x09, 0xc0, 0x07, 0x67, 0xbe, 0xbe, 0xb9, 0x46, 0xbc, 0xbd,
- 0xba, 0xc7, 0x8d, 0xbf, 0xf0, 0xd0, 0xc1, 0xbd, 0x43, 0xeb, 0x57, 0xbd,
- 0x14, 0xa9, 0x15, 0x3e, 0x22, 0xb2, 0x0a, 0x3c, 0x20, 0xab, 0x7d, 0xbe,
- 0x4f, 0x08, 0x64, 0xbe, 0x8f, 0xf0, 0xcf, 0xbd, 0x77, 0x0f, 0x98, 0x3c,
- 0x27, 0xf5, 0xe9, 0x3d, 0xc6, 0xa3, 0x69, 0xbd, 0xaa, 0xe2, 0x8c, 0xbd,
- 0x97, 0x78, 0x96, 0x3d, 0xce, 0xd2, 0xa3, 0x3b, 0x65, 0x83, 0x1d, 0x3e,
- 0xcf, 0x93, 0x8f, 0x3d, 0x14, 0x61, 0xb3, 0x3d, 0x8d, 0xd3, 0xe5, 0x3c,
- 0x1c, 0xbe, 0x28, 0xbc, 0x68, 0x17, 0x8d, 0x3d, 0xaf, 0xc6, 0x7c, 0xbe,
- 0xcc, 0x40, 0xea, 0xbd, 0x28, 0xc5, 0x63, 0xbc, 0x09, 0x41, 0x9d, 0xbd,
- 0x61, 0xca, 0x4d, 0xbd, 0x8f, 0xd6, 0xbe, 0x3c, 0x87, 0xb4, 0x88, 0x3d,
- 0x2f, 0x43, 0x6a, 0xbc, 0xdf, 0x72, 0x2f, 0xbe, 0xb0, 0x22, 0x12, 0xbe,
- 0xe2, 0xf5, 0xff, 0xb9, 0xfe, 0x8d, 0x53, 0xbe, 0x73, 0x9c, 0x1e, 0x3e,
- 0x62, 0x2c, 0x44, 0x3c, 0x2f, 0x69, 0x02, 0x3e, 0x7a, 0x51, 0x99, 0x3d,
- 0xae, 0x61, 0xa0, 0xbd, 0x1b, 0x05, 0x12, 0xbd, 0x79, 0x52, 0xba, 0xbf,
- 0xe2, 0x5d, 0x63, 0xbd, 0xc3, 0x48, 0x0d, 0x3c, 0xec, 0x27, 0x48, 0xbd,
- 0xc3, 0xe1, 0xe7, 0x3d, 0x79, 0x5d, 0x36, 0x3c, 0x00, 0xa7, 0x53, 0xbe,
- 0x96, 0x32, 0x05, 0xbf, 0xee, 0x5b, 0xf1, 0xbd, 0xe8, 0x39, 0xf3, 0x3c,
- 0x56, 0xfb, 0xd4, 0xbe, 0x9d, 0xd2, 0x5f, 0xbe, 0x17, 0x9d, 0xa7, 0x3c,
- 0x82, 0xee, 0x75, 0xbd, 0xd2, 0x59, 0x91, 0x3d, 0xd9, 0x36, 0x7d, 0x3d,
- 0x23, 0xd9, 0xf7, 0x3d, 0x3f, 0x85, 0x01, 0xbf, 0x9a, 0xa7, 0x0f, 0xbd,
- 0x42, 0xae, 0x88, 0xbe, 0x0a, 0x72, 0xad, 0x3d, 0x1c, 0xae, 0x0c, 0xbd,
- 0x8e, 0xd3, 0x13, 0xbd, 0xbb, 0x0a, 0x69, 0xbe, 0x1e, 0x3b, 0x2c, 0x3e,
- 0xaa, 0x0f, 0xaa, 0x3d, 0x45, 0x9d, 0xf8, 0x3d, 0x4b, 0x60, 0xae, 0xbd,
- 0x4f, 0xa7, 0x13, 0xbf, 0x5e, 0x69, 0xfc, 0x3a, 0xb9, 0x0c, 0xb3, 0xbe,
- 0xb0, 0x80, 0x44, 0xbe, 0xf5, 0x13, 0x40, 0xbf, 0x8e, 0xd3, 0x55, 0xba,
- 0x11, 0x66, 0x92, 0xbd, 0x00, 0xfa, 0x9a, 0xbe, 0x06, 0x8c, 0x1c, 0xbd,
- 0xc8, 0xe4, 0x88, 0x3d, 0x18, 0xfd, 0x21, 0x3d, 0x0d, 0x53, 0x64, 0x3d,
- 0x6a, 0xaf, 0x2a, 0xbe, 0x76, 0x0a, 0x06, 0xbf, 0x99, 0xe9, 0x8c, 0xbe,
- 0x8d, 0xc1, 0xcd, 0xbd, 0xd0, 0x96, 0xc6, 0xbd, 0x4c, 0x02, 0xb4, 0xbd,
- 0xe1, 0xe4, 0x86, 0xbc, 0xc6, 0xaf, 0x97, 0xbe, 0xe9, 0xe2, 0x8a, 0x3d,
- 0x85, 0x69, 0x16, 0xbe, 0xf7, 0xfd, 0x28, 0xbe, 0xe1, 0x61, 0xb4, 0x3d,
- 0x97, 0xf6, 0xbc, 0xbb, 0xcc, 0x55, 0xbf, 0x3c, 0x0e, 0x8c, 0x69, 0xbe,
- 0x45, 0x5a, 0x34, 0xbe, 0x49, 0xfd, 0x95, 0xbd, 0x51, 0xbc, 0x2e, 0xbe,
- 0x83, 0x58, 0xaa, 0x3d, 0x1e, 0x2d, 0x83, 0xbd, 0x2c, 0xfc, 0x22, 0x3d,
- 0x7c, 0x56, 0x85, 0x3d, 0xf8, 0x12, 0x0f, 0x3d, 0xc1, 0xd6, 0x59, 0xbe,
- 0x51, 0xb7, 0xa3, 0x3c, 0xbe, 0x69, 0xce, 0xbc, 0xb6, 0x99, 0x4d, 0xbe,
- 0x43, 0x55, 0xa1, 0xbd, 0x5b, 0x2a, 0xd5, 0xbe, 0x4b, 0x8c, 0x50, 0x3c,
- 0xe7, 0x00, 0xe1, 0xbe, 0xf3, 0xd2, 0x82, 0x3d, 0xdd, 0x08, 0x99, 0xbd,
- 0xf2, 0x67, 0x97, 0xbc, 0x76, 0xbc, 0x80, 0xbe, 0x47, 0x70, 0xf3, 0xbd,
- 0x61, 0xdf, 0xc7, 0x3e, 0xaa, 0x30, 0x87, 0x3f, 0xc5, 0xe3, 0x4f, 0xbf,
- 0x59, 0xe9, 0x91, 0x3d, 0x13, 0xa7, 0xe8, 0x3d, 0x7c, 0x64, 0x8c, 0xbf,
- 0xad, 0xab, 0x56, 0x3f, 0xe4, 0xbe, 0x83, 0xbe, 0x9b, 0x9a, 0x13, 0x3b,
- 0x0b, 0xbc, 0x04, 0xbe, 0x32, 0x1d, 0x0e, 0xbd, 0x42, 0xa4, 0x6c, 0xbf,
- 0xfa, 0x29, 0x69, 0xbf, 0xea, 0xfc, 0x8b, 0xbf, 0x90, 0x1f, 0xac, 0xbf,
- 0x7f, 0xb7, 0x13, 0xbf, 0xe1, 0x5d, 0x2e, 0xbe, 0x5a, 0x39, 0x3d, 0xbe,
- 0xf1, 0xd4, 0x71, 0x3e, 0xb7, 0xf8, 0xca, 0xbe, 0xc0, 0xab, 0x99, 0xbd,
- 0x29, 0x5e, 0x5c, 0xbe, 0x9f, 0x74, 0x10, 0x3f, 0x99, 0x43, 0x82, 0x3e,
- 0x95, 0x83, 0x72, 0x3d, 0x92, 0x5f, 0x25, 0xbd, 0x60, 0x46, 0x85, 0x3e,
- 0xa6, 0x81, 0x86, 0x3d, 0x40, 0x84, 0xda, 0xbe, 0xd0, 0xfb, 0x3b, 0xbe,
- 0x91, 0xac, 0xa0, 0x3f, 0x57, 0xa6, 0x0d, 0xbf, 0xeb, 0x7e, 0x3f, 0x3e,
- 0xd3, 0x61, 0x08, 0xbf, 0xb7, 0xb9, 0xd2, 0x3c, 0x88, 0x3f, 0x87, 0xbd,
- 0xb0, 0xdc, 0x33, 0x3d, 0x42, 0x8d, 0x3d, 0x3e, 0xa4, 0x09, 0x5c, 0x3f,
- 0xf7, 0x77, 0x95, 0xbb, 0xa0, 0x07, 0xbb, 0xbf, 0xff, 0x3e, 0xd8, 0xbf,
- 0x57, 0x31, 0x60, 0xbf, 0x5c, 0x89, 0xb0, 0x3e, 0x1e, 0x2e, 0x1d, 0x3f,
- 0x49, 0xee, 0xb6, 0xbe, 0xee, 0x08, 0xc5, 0xbd, 0xef, 0xbc, 0xa5, 0xbf,
- 0x67, 0xb6, 0xd2, 0x3f, 0x6f, 0x9a, 0x78, 0x3d, 0xef, 0xe0, 0x55, 0x3e,
- 0x5d, 0x4c, 0x15, 0x3e, 0x05, 0xe5, 0x28, 0xbf, 0x53, 0xb0, 0x52, 0xbe,
- 0x06, 0x6f, 0x6e, 0x3e, 0x67, 0x49, 0x8c, 0x3d, 0x3a, 0xf8, 0x07, 0x3f,
- 0xf7, 0x1a, 0x82, 0xbe, 0x52, 0xce, 0xd1, 0xbe, 0x47, 0xbe, 0xd7, 0x3e,
- 0xd8, 0x9a, 0x28, 0xbe, 0x51, 0x0e, 0x20, 0xbe, 0xd9, 0xf2, 0x62, 0x3f,
- 0x98, 0xfc, 0x0a, 0x3e, 0x8f, 0x63, 0x0f, 0xbd, 0xa1, 0xbc, 0x81, 0xbe,
- 0xba, 0xe3, 0x74, 0x3d, 0x40, 0x1d, 0xb7, 0x3e, 0xc8, 0x5e, 0xa0, 0x3d,
- 0xc6, 0x30, 0x7b, 0xbe, 0x97, 0x31, 0x1d, 0xbd, 0x32, 0x16, 0x96, 0x37,
- 0x59, 0x4b, 0x70, 0xbe, 0xe9, 0x2f, 0xcb, 0xbd, 0x69, 0xb4, 0x79, 0x3f,
- 0x16, 0xe0, 0xd5, 0x3e, 0xb6, 0xd8, 0x8c, 0x3d, 0x9f, 0x47, 0x05, 0x3e,
- 0x5d, 0x56, 0xf2, 0x3e, 0xae, 0x23, 0x1f, 0xbe, 0x42, 0x74, 0x66, 0x3d,
- 0x52, 0xd9, 0x5c, 0xbe, 0xb0, 0x70, 0x32, 0xbb, 0x5e, 0x5d, 0x38, 0xbe,
- 0x24, 0xfb, 0xe6, 0xbc, 0xbe, 0x6d, 0xe0, 0xbe, 0x51, 0xb0, 0x72, 0x3f,
- 0x76, 0x72, 0x12, 0x3e, 0x4e, 0x4b, 0x4b, 0xbe, 0xbd, 0x6d, 0x08, 0x3d,
- 0xd5, 0x86, 0x8c, 0x3f, 0xed, 0x76, 0xae, 0x3f, 0xc8, 0xcf, 0x09, 0x3e,
- 0x1f, 0x78, 0x47, 0x3d, 0x3d, 0x85, 0xa2, 0xbe, 0x19, 0xc0, 0x58, 0x3f,
- 0x86, 0x85, 0x11, 0xbc, 0x8b, 0xcf, 0x84, 0x3d, 0x6f, 0x36, 0x95, 0xbe,
- 0xc5, 0x59, 0x2d, 0x3d, 0x6e, 0xa9, 0x1d, 0xbe, 0x8b, 0x44, 0x60, 0xbe,
- 0x23, 0x9a, 0xa8, 0xbe, 0x6e, 0xff, 0x12, 0xbe, 0x12, 0x83, 0x03, 0x3e,
- 0x12, 0x48, 0xb9, 0xbc, 0xa5, 0x30, 0x7c, 0x3e, 0x02, 0xcf, 0x89, 0xbd,
- 0x19, 0xaf, 0x9d, 0x3d, 0x30, 0x9c, 0x7d, 0xbb, 0x92, 0xbd, 0x1a, 0xbe,
- 0x2f, 0x94, 0x71, 0xbe, 0x31, 0xd3, 0xe2, 0xbd, 0x48, 0x7d, 0x7e, 0x3e,
- 0xca, 0x10, 0xc8, 0x3d, 0x7d, 0x6f, 0xe3, 0xbd, 0x4e, 0xeb, 0x93, 0xbd,
- 0x3f, 0xc5, 0x3c, 0x3e, 0x30, 0xa4, 0x4b, 0xbe, 0x26, 0xba, 0xf2, 0xbd,
- 0x8b, 0x73, 0xb3, 0xbd, 0x1d, 0x2e, 0x93, 0xbe, 0x67, 0x11, 0x43, 0xbd,
- 0x47, 0x4b, 0x08, 0xbe, 0xc1, 0x17, 0xc7, 0xbd, 0x4d, 0xb1, 0xd4, 0xbe,
- 0xe9, 0xa0, 0x1c, 0xbe, 0x4f, 0x7d, 0x48, 0x3d, 0x4d, 0xa8, 0x41, 0x3e,
- 0xe1, 0x6f, 0x8b, 0xbc, 0x57, 0x1b, 0x21, 0xbe, 0x47, 0x31, 0x8f, 0xbd,
- 0x6d, 0x4c, 0xac, 0xbd, 0xfd, 0x85, 0x47, 0x3e, 0x25, 0x35, 0x9b, 0x3d,
- 0x19, 0xd8, 0x97, 0x3d, 0xbc, 0x25, 0xed, 0x3c, 0x66, 0xea, 0x80, 0xbd,
- 0xde, 0xd2, 0xdd, 0xbb, 0xe6, 0xd1, 0x98, 0x3d, 0x0c, 0xd2, 0x90, 0xbe,
- 0x2c, 0x6a, 0x53, 0xbe, 0xe7, 0x3e, 0x9d, 0xbb, 0x25, 0x22, 0xe1, 0xbd,
- 0xd3, 0x88, 0x90, 0xbc, 0xb4, 0x22, 0x03, 0x3e, 0xb4, 0x80, 0xd9, 0xbd,
- 0x3a, 0x58, 0xe3, 0xbc, 0xe8, 0x8b, 0x78, 0xbe, 0x21, 0xcb, 0xec, 0x3d,
- 0xdf, 0x7c, 0x15, 0x3e, 0x28, 0x5f, 0x0d, 0xbe, 0x25, 0x5e, 0x19, 0xbd,
- 0x98, 0xe4, 0x5b, 0xbe, 0x70, 0x41, 0x1b, 0xbe, 0xd1, 0x1d, 0x48, 0xbe,
- 0xcc, 0x4e, 0xc6, 0x3d, 0xc3, 0x32, 0xc2, 0xbd, 0x25, 0x45, 0xb6, 0x3d,
- 0x18, 0x7b, 0x26, 0xbe, 0x6b, 0x6a, 0x8d, 0x3e, 0xa8, 0xd6, 0x11, 0xbe,
- 0x19, 0xc5, 0x9e, 0xbe, 0xcd, 0x94, 0xc1, 0x3c, 0x83, 0x31, 0x37, 0xbd,
- 0x14, 0xda, 0x91, 0x3d, 0x47, 0x8c, 0x9a, 0xbd, 0xaf, 0xaa, 0x65, 0x3e,
- 0x07, 0x89, 0x9f, 0x3c, 0x18, 0xa7, 0xc3, 0x3d, 0xd1, 0xf4, 0xac, 0x3d,
- 0xdb, 0xe1, 0x2d, 0xbe, 0x68, 0x9f, 0x27, 0x3d, 0xec, 0x0c, 0x62, 0x3d,
- 0xd0, 0x36, 0xff, 0x3d, 0x53, 0xb1, 0x82, 0x3d, 0x9e, 0x28, 0xb0, 0xbd,
- 0xda, 0xa9, 0xec, 0xbd, 0x6d, 0xf5, 0xae, 0x3d, 0xad, 0x1e, 0x9e, 0xbd,
- 0xd9, 0xef, 0x08, 0x3d, 0x6c, 0x99, 0x7c, 0x3d, 0x8a, 0x4c, 0x13, 0xbe,
- 0xd9, 0x8a, 0x21, 0xbe, 0x3a, 0x91, 0x27, 0xbe, 0x99, 0x2e, 0x0e, 0xbc,
- 0xb7, 0x77, 0x57, 0xbd, 0x78, 0xa2, 0xb4, 0x3d, 0xce, 0x61, 0xfb, 0xbd,
- 0x7d, 0x66, 0x95, 0xbe, 0x97, 0xbd, 0xc2, 0x3d, 0xaa, 0xbb, 0xcb, 0xbd,
- 0x04, 0x8b, 0xf7, 0xbd, 0x71, 0xa5, 0x23, 0xbd, 0xf4, 0x0a, 0x3f, 0x3e,
- 0xa9, 0x10, 0xbc, 0xbd, 0xd5, 0x9a, 0x8b, 0xbd, 0x64, 0xc3, 0x48, 0xbe,
- 0x9f, 0xc4, 0x53, 0x3d, 0xa8, 0xdd, 0x08, 0xbd, 0x0e, 0x70, 0x89, 0xbe,
- 0xb3, 0x1b, 0xa9, 0xbe, 0x4b, 0x51, 0x70, 0xbe, 0x25, 0x9c, 0x8e, 0x3c,
- 0xea, 0x29, 0x81, 0xbe, 0x93, 0xcc, 0xa6, 0x3d, 0xf8, 0x09, 0xd2, 0xbd,
- 0xae, 0x8e, 0x03, 0x3e, 0xdd, 0xa1, 0x1b, 0x3d, 0xe9, 0x94, 0x11, 0x3e,
- 0x66, 0x74, 0x54, 0x3d, 0x79, 0x72, 0x46, 0xbe, 0x01, 0xb0, 0x2f, 0xbe,
- 0x3e, 0xc1, 0x90, 0x3e, 0x04, 0x0a, 0x30, 0x3c, 0xea, 0xac, 0x02, 0xbe,
- 0x1e, 0xc5, 0x9f, 0x3d, 0x6a, 0xc7, 0x4b, 0x3d, 0x4c, 0x14, 0x6c, 0x3d,
- 0x24, 0xec, 0x76, 0x3d, 0x1d, 0xbe, 0x3f, 0xbd, 0xb4, 0xe6, 0x8b, 0xbd,
- 0xa4, 0xa2, 0xa5, 0xbd, 0xd0, 0xbc, 0xb8, 0x3d, 0x9d, 0xf1, 0x97, 0xbd,
- 0xf5, 0x99, 0x16, 0x3d, 0xe9, 0x64, 0xa1, 0xbe, 0x3d, 0xe0, 0x15, 0xbe,
- 0x2d, 0x0d, 0x13, 0xbe, 0x9d, 0xf8, 0xc1, 0x3d, 0x84, 0x0d, 0xaa, 0xbd,
- 0x01, 0x01, 0x6b, 0xbe, 0x92, 0xd1, 0x20, 0xbb, 0x7a, 0x58, 0x8d, 0xbd,
- 0xe5, 0x93, 0x1b, 0x3e, 0xfc, 0x7c, 0x85, 0xbe, 0x3f, 0x88, 0x75, 0x3c,
- 0x10, 0x31, 0x28, 0xbe, 0x4a, 0x01, 0x98, 0x3a, 0x81, 0x17, 0x9f, 0xbd,
- 0x73, 0x3f, 0x30, 0xbd, 0xc7, 0xf2, 0xeb, 0xbd, 0xd5, 0x57, 0xab, 0x3c,
- 0x1a, 0xc9, 0x95, 0xbd, 0x8e, 0x3e, 0x8e, 0xbc, 0x68, 0x8f, 0xdd, 0x3d,
- 0x53, 0x0b, 0xdb, 0x3b, 0x7d, 0x2c, 0x07, 0xbe, 0x3b, 0x9d, 0x32, 0xbd,
- 0x27, 0x5c, 0x58, 0x3e, 0x25, 0x44, 0x27, 0xbe, 0xd0, 0x00, 0xff, 0x3c,
- 0xa8, 0x00, 0x4b, 0xbe, 0xd9, 0x08, 0x9a, 0xbe, 0xf0, 0x81, 0xab, 0x3e,
- 0x76, 0x29, 0xef, 0x3c, 0x1e, 0x33, 0x2c, 0x3e, 0xa4, 0xef, 0x98, 0xbd,
- 0x05, 0x71, 0x81, 0x3d, 0xc9, 0x1f, 0x00, 0xbe, 0x38, 0x71, 0x62, 0x3e,
- 0xa8, 0xd5, 0xb8, 0xbd, 0x9e, 0xbe, 0x9e, 0x3d, 0x38, 0x48, 0xcd, 0xbe,
- 0x6e, 0x2b, 0x46, 0xbe, 0x5e, 0x44, 0x33, 0x3d, 0x38, 0xd3, 0xdd, 0xbd,
- 0x35, 0x32, 0xad, 0xbe, 0xe9, 0x47, 0xa6, 0xbd, 0x4e, 0xe1, 0x1a, 0xbe,
- 0xa7, 0xdc, 0xe8, 0xbd, 0xb7, 0xde, 0x80, 0x3c, 0xb2, 0x17, 0xb0, 0xbd,
- 0xdb, 0x46, 0xee, 0xbc, 0x94, 0xb1, 0xea, 0x3c, 0xa9, 0xc1, 0x5d, 0xbd,
- 0x70, 0x4b, 0xc5, 0xbd, 0x69, 0x00, 0x55, 0x3e, 0x18, 0x5c, 0x4d, 0xbe,
- 0xb0, 0xdd, 0x9f, 0x3d, 0x44, 0xf2, 0x02, 0xbe, 0x0b, 0xd9, 0x3a, 0x3d,
- 0x1b, 0x74, 0xa6, 0x3e, 0x37, 0x4d, 0x12, 0xbe, 0x6b, 0xd8, 0x50, 0xbe,
- 0x28, 0xc0, 0xc2, 0xbd, 0x49, 0x30, 0x95, 0xbe, 0x59, 0xd1, 0xf0, 0xbc,
- 0xfc, 0x02, 0xf5, 0xbc, 0x8d, 0x65, 0xa2, 0xbd, 0x63, 0xfb, 0x54, 0x3d,
- 0x7b, 0xe7, 0x1e, 0x3e, 0x13, 0xc6, 0x43, 0xbe, 0x5e, 0xf6, 0xde, 0x3d,
- 0x98, 0xd4, 0x46, 0x3e, 0xef, 0x3e, 0x01, 0xbe, 0x7c, 0xc6, 0xb9, 0xbc,
- 0xcb, 0xd7, 0x96, 0xbd, 0x55, 0xb6, 0xa6, 0x3c, 0x82, 0xf1, 0xdb, 0x3d,
- 0x26, 0xec, 0xa7, 0x3f, 0x8f, 0xf8, 0x2f, 0xbd, 0xf1, 0xa3, 0x15, 0xbe,
- 0x89, 0x38, 0x52, 0xbc, 0x3b, 0x68, 0x9d, 0x3e, 0x9f, 0x00, 0x39, 0x3c,
- 0xff, 0xd1, 0x02, 0x3e, 0x9d, 0x3e, 0xb8, 0x3d, 0xe9, 0x4c, 0x4f, 0x3d,
- 0x87, 0x2f, 0xc5, 0x3e, 0xd2, 0x6b, 0x97, 0xbe, 0x45, 0x60, 0xa1, 0xbe,
- 0xc6, 0xc1, 0xf4, 0xbe, 0x85, 0xaa, 0xcb, 0x3d, 0xb8, 0xfd, 0x19, 0xbe,
- 0xc7, 0xca, 0xa0, 0x3d, 0x78, 0xf7, 0x35, 0xbf, 0x2c, 0x66, 0x2c, 0x3d,
- 0x4a, 0x3a, 0x24, 0x3d, 0xd9, 0x1f, 0xdc, 0xbe, 0x1a, 0xe4, 0xd4, 0x3e,
- 0x4a, 0x80, 0xf1, 0xbe, 0x71, 0x47, 0x4b, 0xbe, 0xcd, 0x39, 0x80, 0x3e,
- 0x62, 0x54, 0x90, 0x3e, 0xd7, 0xb2, 0xdc, 0x3e, 0x06, 0xe0, 0x1a, 0xbd,
- 0x93, 0x57, 0x5f, 0xbc, 0x5a, 0xf7, 0x59, 0x3e, 0x9d, 0xbf, 0x54, 0x3d,
- 0xe6, 0x9d, 0x76, 0x3d, 0xa9, 0x3b, 0x82, 0xbc, 0x43, 0x7b, 0xc4, 0x3e,
- 0x97, 0x82, 0x28, 0xbe, 0xa1, 0x75, 0xd9, 0xbd, 0x24, 0xbf, 0x66, 0x3c,
- 0x74, 0xa8, 0x9c, 0xbc, 0xd1, 0x59, 0x87, 0xbe, 0x64, 0xa0, 0xc0, 0x3e,
- 0x47, 0x30, 0xae, 0x3e, 0x52, 0x75, 0x49, 0xbc, 0x69, 0xbb, 0xd0, 0xbd,
- 0xa6, 0x80, 0xb4, 0x3c, 0x4d, 0xab, 0xaa, 0x3e, 0xaa, 0x84, 0x30, 0x3f,
- 0xf0, 0xfb, 0x9a, 0x3e, 0x40, 0xb2, 0x61, 0x3d, 0xcb, 0xf6, 0x97, 0x3e,
- 0x02, 0x75, 0x26, 0x3e, 0x57, 0x7b, 0x4b, 0xbe, 0xff, 0x37, 0x19, 0x3f,
- 0x4a, 0x25, 0x38, 0xbe, 0xc9, 0xe8, 0x22, 0xbd, 0x58, 0xf7, 0x6b, 0x3e,
- 0x0c, 0x4b, 0xb9, 0x3e, 0x12, 0x5f, 0x52, 0xbf, 0x76, 0xfa, 0x17, 0xbf,
- 0x04, 0x57, 0x40, 0xbd, 0xf4, 0x8c, 0x98, 0x3e, 0x8b, 0x74, 0xd7, 0xbd,
- 0x83, 0x7f, 0x2f, 0xbe, 0x99, 0xd6, 0xbe, 0x3c, 0x97, 0x56, 0x03, 0xbf,
- 0x7e, 0xbd, 0x2f, 0x3e, 0xed, 0x22, 0x38, 0x3f, 0xf8, 0xd1, 0x20, 0x3e,
- 0x93, 0x33, 0x4d, 0xbe, 0x39, 0x24, 0x39, 0xbe, 0x1a, 0x5b, 0x98, 0x3e,
- 0xda, 0x08, 0xf6, 0x3e, 0x84, 0xf3, 0x23, 0x3d, 0x57, 0x1c, 0x94, 0x3e,
- 0x98, 0x50, 0x31, 0x3f, 0x6f, 0xb1, 0x36, 0x3f, 0x19, 0x18, 0x6c, 0xbe,
- 0xf5, 0x4c, 0x23, 0x3e, 0x80, 0xa6, 0x8f, 0xbe, 0xa7, 0xfe, 0x49, 0xbc,
- 0xcc, 0x23, 0x70, 0x3d, 0x2a, 0xe5, 0xa7, 0xbd, 0x5b, 0x60, 0xd3, 0xbe,
- 0x29, 0x75, 0x08, 0x3d, 0x9e, 0x1d, 0x12, 0xbe, 0x03, 0xce, 0x33, 0xbf,
- 0x03, 0x6b, 0x36, 0xbf, 0xe5, 0x54, 0x3e, 0x3d, 0x12, 0x71, 0x5c, 0x3f,
- 0x9c, 0x66, 0xc9, 0xbd, 0xb4, 0x3d, 0x90, 0xbe, 0xce, 0x27, 0x3e, 0x3e,
- 0x62, 0xf1, 0xdc, 0xbd, 0xcd, 0xdc, 0x27, 0x3e, 0xee, 0xbd, 0xaf, 0xbe,
- 0x6d, 0x55, 0xa4, 0xbf, 0x86, 0x61, 0xe5, 0xbe, 0x94, 0x52, 0x5c, 0x3d,
- 0x45, 0x5d, 0xa7, 0xbf, 0x48, 0xba, 0xb0, 0xbd, 0xe1, 0xb0, 0xd7, 0xbd,
- 0x4d, 0x14, 0x4a, 0xbb, 0xcb, 0x22, 0xda, 0x3e, 0xa5, 0x1c, 0x56, 0xbe,
- 0xbe, 0x19, 0xb2, 0xbd, 0xe1, 0xcf, 0x09, 0xbe, 0x59, 0x6e, 0x82, 0xbe,
- 0xb7, 0x6c, 0x75, 0x3d, 0x3f, 0xeb, 0x30, 0xbc, 0xc1, 0x3f, 0x98, 0x3e,
- 0x1c, 0xf9, 0x5e, 0x3d, 0x4f, 0x7d, 0xc4, 0x3d, 0x44, 0xb4, 0x81, 0x3d,
- 0x33, 0x6c, 0xaa, 0x3c, 0x34, 0xee, 0x61, 0x37, 0xba, 0x88, 0x0d, 0xbd,
- 0xc4, 0x7f, 0x83, 0xbd, 0xf0, 0x97, 0x28, 0x3b, 0x18, 0x17, 0x1a, 0xbe,
- 0x3b, 0xc7, 0x12, 0x3d, 0xf6, 0x1f, 0x1a, 0xbc, 0xfa, 0x52, 0xaf, 0x3a,
- 0x97, 0x03, 0x6c, 0xbe, 0xf9, 0xf2, 0xfb, 0x3d, 0xfc, 0x46, 0x94, 0x3b,
- 0xd1, 0xf5, 0xc1, 0xbc, 0xa9, 0x85, 0x84, 0xbc, 0xe0, 0x0b, 0xd3, 0xbd,
- 0x1d, 0x09, 0x8e, 0xbc, 0xbd, 0x8f, 0xbb, 0xbd, 0xfa, 0x0a, 0x67, 0x3d,
- 0x18, 0x85, 0x63, 0x3c, 0xe4, 0x29, 0xce, 0x3d, 0xed, 0x8f, 0x32, 0xbc,
- 0xf5, 0x31, 0x39, 0x3d, 0x69, 0x21, 0xd5, 0xbd, 0xb8, 0xb1, 0x3c, 0xbf,
- 0x9c, 0x85, 0x65, 0xbe, 0xc5, 0xa4, 0x71, 0x3c, 0x4c, 0x1f, 0x0c, 0x3d,
- 0x40, 0x66, 0xbe, 0xbc, 0x96, 0x13, 0xc1, 0x3d, 0xd4, 0x60, 0xc7, 0xbd,
- 0x61, 0x87, 0x0e, 0xbf, 0xa0, 0x41, 0xdd, 0xbd, 0x12, 0x65, 0x4d, 0xbe,
- 0x16, 0x95, 0x45, 0xbd, 0xf2, 0x84, 0xba, 0x3c, 0x9b, 0xbc, 0x1a, 0x3d,
- 0x30, 0xb0, 0x8f, 0x3d, 0x36, 0x6a, 0xd0, 0xbc, 0xce, 0x9f, 0x61, 0xbd,
- 0x62, 0xf3, 0x14, 0x3d, 0x29, 0x79, 0x93, 0xbe, 0xad, 0x1d, 0x0e, 0x3d,
- 0x5b, 0x7c, 0x60, 0xbe, 0xfc, 0xf4, 0x8b, 0xbd, 0xcf, 0x78, 0x3d, 0xbc,
- 0xc9, 0x93, 0xe4, 0xbc, 0x52, 0xda, 0x9d, 0x3b, 0xea, 0x4a, 0x06, 0xbd,
- 0xb1, 0x00, 0xf9, 0xbd, 0x5b, 0xa2, 0xa6, 0xbc, 0x89, 0x6b, 0x16, 0xbe,
- 0x30, 0x77, 0x83, 0xbe, 0x65, 0x1f, 0xce, 0xbd, 0xe3, 0x32, 0x8b, 0xbe,
- 0x9d, 0xcf, 0x3f, 0x3e, 0xf9, 0xda, 0x0a, 0xbf, 0x43, 0x5b, 0xa9, 0xbd,
- 0x80, 0x1c, 0x9f, 0x3c, 0x1a, 0xa6, 0xc2, 0x3c, 0xca, 0xdc, 0x32, 0x3d,
- 0x87, 0xe7, 0x22, 0xbd, 0xe2, 0xdc, 0xaf, 0x3d, 0xf1, 0xac, 0xad, 0xbd,
- 0x39, 0x60, 0xa9, 0x3d, 0xb1, 0x69, 0x82, 0xbe, 0x7a, 0xaf, 0x3a, 0xbd,
- 0x52, 0x8a, 0x4f, 0x3d, 0xcd, 0xf8, 0x1a, 0xbe, 0x2e, 0x64, 0x6f, 0xbc,
- 0xad, 0xf3, 0xae, 0xbd, 0xb8, 0x15, 0x7c, 0xbe, 0xe3, 0x22, 0xf4, 0xbd,
- 0x55, 0xe9, 0xc0, 0xbc, 0xd1, 0xe6, 0x08, 0xbe, 0xf5, 0xdc, 0xd3, 0x3d,
- 0x3f, 0x58, 0x6f, 0x3d, 0x9d, 0xb9, 0xfc, 0xbd, 0x7d, 0x04, 0x45, 0x3d,
- 0x6e, 0x40, 0x66, 0xbe, 0x19, 0x65, 0x81, 0x3d, 0x9d, 0x91, 0xcb, 0xbd,
- 0x9a, 0x02, 0x06, 0xbd, 0x2a, 0x4e, 0xe2, 0x3c, 0xc5, 0x89, 0x38, 0xbc,
- 0x64, 0xad, 0x22, 0x3d, 0x1b, 0xa7, 0x09, 0xbc, 0xb8, 0xa5, 0x93, 0x3c,
- 0x44, 0xaa, 0xe8, 0xbc, 0x83, 0x34, 0x99, 0x3c, 0xec, 0xd1, 0xec, 0xbd,
- 0x2d, 0x8a, 0x1d, 0xbe, 0x69, 0x32, 0x86, 0xbe, 0x1d, 0xb4, 0xb0, 0x3d,
- 0x13, 0x2e, 0x96, 0xbe, 0x8f, 0x7d, 0xea, 0x3d, 0xeb, 0x5c, 0xe8, 0xbd,
- 0x52, 0xa5, 0x25, 0x3e, 0x07, 0x60, 0x95, 0xbd, 0x9f, 0x4a, 0x53, 0x3d,
- 0xd0, 0xad, 0x18, 0x3f, 0xa3, 0x64, 0x72, 0x3f, 0x72, 0x1f, 0x32, 0xbf,
- 0x85, 0x26, 0x53, 0xbd, 0xd6, 0x7d, 0x83, 0xbe, 0x2e, 0x78, 0x74, 0xbf,
- 0x88, 0xb0, 0x8b, 0x3f, 0xe9, 0xc8, 0x9a, 0xbc, 0xac, 0xde, 0x74, 0x3d,
- 0x7e, 0xab, 0xbd, 0x3e, 0x42, 0x30, 0x83, 0x3d, 0x10, 0x53, 0x92, 0xbf,
- 0x1e, 0x0b, 0x44, 0xbf, 0xd8, 0xab, 0x7c, 0xbf, 0x0d, 0xf7, 0xa3, 0xbf,
- 0xb5, 0x06, 0x5e, 0xbf, 0x57, 0x2b, 0x17, 0xbe, 0xf0, 0x17, 0xd1, 0x3c,
- 0x59, 0x26, 0x0e, 0x3f, 0x1c, 0xc1, 0xa7, 0xbe, 0xa6, 0xa3, 0xad, 0xbe,
- 0xed, 0xe5, 0x62, 0xbe, 0xe0, 0xb8, 0x13, 0x3f, 0x50, 0xd9, 0x1b, 0x3e,
- 0x32, 0x6c, 0x6a, 0xbd, 0x32, 0x0a, 0x11, 0xbe, 0xbe, 0xd2, 0xe5, 0x3e,
- 0xb1, 0xe7, 0xba, 0xbe, 0x31, 0x62, 0xb2, 0xbe, 0xaf, 0xbb, 0xf1, 0xbc,
- 0xef, 0xda, 0x90, 0x3f, 0x4c, 0x33, 0x0f, 0xbf, 0x94, 0xe6, 0x77, 0x3e,
- 0x1f, 0x6b, 0x27, 0xbf, 0x90, 0x47, 0xdc, 0xbd, 0x62, 0x19, 0xb6, 0x3d,
- 0x51, 0x87, 0x1e, 0x3e, 0xc6, 0xa3, 0x61, 0x3e, 0x99, 0x1b, 0x19, 0x3f,
- 0x42, 0xe3, 0x1e, 0x3e, 0x22, 0xe7, 0xd6, 0xbf, 0x77, 0xc4, 0xbb, 0xbf,
- 0x50, 0x3d, 0x39, 0xbf, 0xd0, 0x15, 0x97, 0x3e, 0xc8, 0x59, 0x11, 0x3f,
- 0x98, 0x89, 0xde, 0xbd, 0x17, 0x66, 0x2e, 0x3b, 0x5e, 0x11, 0xb3, 0xbf,
- 0xba, 0xc6, 0xba, 0x3f, 0x5a, 0x10, 0x48, 0x3e, 0x48, 0xea, 0x09, 0x3d,
- 0xb8, 0x24, 0xd4, 0x3b, 0x3d, 0xcd, 0x63, 0xbe, 0x05, 0xb9, 0xc5, 0xbc,
- 0x23, 0xc2, 0x10, 0xbc, 0x32, 0x0e, 0x62, 0xbd, 0xd2, 0xe7, 0xc2, 0x3e,
- 0xc5, 0x07, 0x88, 0x3a, 0xe3, 0x35, 0xfa, 0xbe, 0x22, 0x2b, 0xee, 0x3c,
- 0xc2, 0xaa, 0xc2, 0xbc, 0x2f, 0x73, 0xcc, 0xbd, 0x32, 0x6e, 0x59, 0x3f,
- 0x83, 0x1f, 0x51, 0x3e, 0x6d, 0xd2, 0xd7, 0xbd, 0x80, 0x19, 0x8d, 0xbe,
- 0x38, 0x19, 0xa8, 0xbd, 0xf5, 0x57, 0x09, 0x3f, 0x55, 0x55, 0x03, 0x3f,
- 0x01, 0x2f, 0x2b, 0xbe, 0x7e, 0xd8, 0x51, 0xbd, 0x9a, 0x7d, 0x8a, 0xbe,
- 0x0f, 0x69, 0xcc, 0xbd, 0x42, 0x09, 0xd0, 0x3d, 0x9c, 0xef, 0x7b, 0x3f,
- 0x0f, 0x0f, 0x2e, 0x3f, 0x29, 0x59, 0x4f, 0x3d, 0x0d, 0x7d, 0x0e, 0xbe,
- 0x33, 0xa6, 0xcd, 0x3e, 0x56, 0x27, 0xe6, 0xbc, 0xe6, 0x77, 0xf1, 0xbe,
- 0x5a, 0xc7, 0xca, 0xbc, 0xbf, 0x60, 0x91, 0x3d, 0xc5, 0x2c, 0x52, 0x3d,
- 0x50, 0xac, 0x82, 0x3d, 0x00, 0xba, 0x74, 0xbe, 0x5e, 0x3b, 0x29, 0x3f,
- 0x27, 0x33, 0x12, 0x3e, 0x1d, 0xac, 0x79, 0x3d, 0x33, 0x07, 0x24, 0xbd,
- 0x6c, 0x17, 0x95, 0x3f, 0x42, 0x51, 0x93, 0x3f, 0xd6, 0xe6, 0xf9, 0x3e,
- 0x40, 0x6d, 0xca, 0xbd, 0x33, 0x7a, 0x73, 0x3e, 0xc8, 0xd5, 0x5d, 0x3f,
- 0x7a, 0x4b, 0x62, 0xbd, 0x63, 0x28, 0x50, 0x3d, 0xc1, 0x1e, 0x67, 0xbe,
- 0x79, 0x59, 0x05, 0xbe, 0x00, 0x55, 0x67, 0xbe, 0x51, 0x3f, 0x5e, 0x3d,
- 0x9b, 0x6f, 0xb4, 0xbe, 0x48, 0x7b, 0x0c, 0xbd, 0x25, 0x4c, 0x0c, 0x3d,
- 0x96, 0x8d, 0x5a, 0xbd, 0x82, 0xd4, 0x04, 0x3e, 0x7e, 0x23, 0xed, 0x3d,
- 0xab, 0x87, 0xe3, 0x3d, 0x16, 0xd0, 0xf0, 0x3d, 0x17, 0xa9, 0xe1, 0xbd,
- 0xb4, 0x3b, 0x9f, 0xbd, 0xc1, 0x3f, 0x26, 0xbd, 0x60, 0x1c, 0x89, 0x3e,
- 0x0a, 0x1e, 0xa0, 0x3b, 0xea, 0xb2, 0x11, 0x3d, 0x52, 0xbf, 0xac, 0xbd,
- 0x92, 0x34, 0xbd, 0x3d, 0xdd, 0xe1, 0xab, 0x3c, 0x34, 0xbe, 0xa1, 0xbd,
- 0x5f, 0xcf, 0x4b, 0x3d, 0x43, 0xd2, 0x31, 0xbe, 0xbb, 0xd6, 0xbf, 0x3d,
- 0xcb, 0x8e, 0x83, 0x3d, 0x77, 0xb5, 0x02, 0xbe, 0x05, 0x3d, 0x04, 0xbf,
- 0x41, 0xa7, 0xf8, 0xbd, 0x4c, 0x36, 0x15, 0x3c, 0x2a, 0x66, 0x1b, 0x3d,
- 0x5d, 0x36, 0xdb, 0xbd, 0x24, 0x5b, 0x93, 0x3d, 0xc8, 0x16, 0x4a, 0xbe,
- 0x27, 0x87, 0x17, 0x3d, 0x3a, 0xda, 0x91, 0x3e, 0x53, 0x81, 0x0f, 0x3d,
- 0x2f, 0x86, 0x9c, 0x3c, 0xd1, 0x50, 0xad, 0xbc, 0x4a, 0xfc, 0x40, 0xbe,
- 0x0f, 0xf9, 0xc6, 0xbd, 0xa0, 0x91, 0x71, 0x3d, 0x45, 0xf6, 0x5a, 0xbd,
- 0x38, 0xa1, 0x2b, 0xbe, 0x2c, 0x15, 0x12, 0x3d, 0x1c, 0x3b, 0x56, 0x3c,
- 0x4b, 0x65, 0x9f, 0x3d, 0x47, 0xd9, 0x16, 0x3e, 0x25, 0x62, 0x85, 0xbd,
- 0xb8, 0x63, 0x89, 0xbe, 0x4e, 0x2f, 0x9f, 0xbe, 0xb7, 0xb9, 0x20, 0x3c,
- 0x5c, 0x98, 0x45, 0xbd, 0x24, 0xae, 0xba, 0xbd, 0xee, 0xfe, 0x12, 0xbe,
- 0x93, 0xb0, 0xc6, 0xbc, 0x8f, 0xa1, 0x29, 0x3c, 0xe5, 0xe0, 0xfe, 0xbd,
- 0x2b, 0x36, 0xeb, 0x3d, 0x7d, 0x8c, 0xe0, 0x3d, 0xdf, 0xe8, 0x2b, 0x3e,
- 0x05, 0xfa, 0xf0, 0xbc, 0x96, 0x92, 0x19, 0x3e, 0xf1, 0xf7, 0x17, 0x3c,
- 0x04, 0xbc, 0xa1, 0xbd, 0xcb, 0x06, 0x27, 0x3e, 0x30, 0xa8, 0x39, 0xbe,
- 0x06, 0xfc, 0x08, 0xbe, 0x8f, 0xa5, 0x01, 0xbe, 0xde, 0xab, 0x05, 0x3e,
- 0x3a, 0xbf, 0xe4, 0xbd, 0x78, 0x07, 0x30, 0x3e, 0xf0, 0xbc, 0xa1, 0xba,
- 0xb6, 0x3b, 0x90, 0xbc, 0x9e, 0xca, 0x85, 0xbd, 0x28, 0x3c, 0xf0, 0x3d,
- 0xd1, 0xa5, 0x82, 0x3d, 0x4a, 0x79, 0x84, 0x3d, 0x46, 0xb1, 0x11, 0xbd,
- 0x79, 0x97, 0xfd, 0xbd, 0xcf, 0x6a, 0xac, 0xbd, 0xc5, 0xbc, 0x5a, 0x3e,
- 0xa5, 0xe4, 0x42, 0x3c, 0xab, 0xe2, 0xf9, 0xbd, 0x2c, 0x28, 0x2d, 0xbe,
- 0xcf, 0x5a, 0xa6, 0xbd, 0xe1, 0x5e, 0x31, 0xbe, 0x0d, 0x2f, 0x4c, 0x3e,
- 0x21, 0x77, 0xc2, 0xbd, 0x6a, 0xdf, 0x2c, 0xbd, 0x28, 0xec, 0x23, 0xbe,
- 0x0b, 0x0a, 0x30, 0xbe, 0xa5, 0xa2, 0x22, 0xbe, 0xa7, 0xf3, 0x24, 0xbe,
- 0x10, 0x6b, 0x07, 0x3e, 0x9a, 0x2f, 0x25, 0xbe, 0xe6, 0x9d, 0x40, 0x3e,
- 0x4e, 0x65, 0x1f, 0xbe, 0x2a, 0xd3, 0xda, 0x3c, 0x08, 0x60, 0xa3, 0xbe,
- 0xcd, 0xa6, 0x31, 0x3d, 0x9d, 0x8a, 0x85, 0xbd, 0x53, 0x25, 0x8c, 0xbe,
- 0x2d, 0x61, 0x70, 0xbe, 0xf3, 0x15, 0x8e, 0xbe, 0xc7, 0xc9, 0x35, 0x3e,
- 0xd7, 0xc7, 0x96, 0xbe, 0xdf, 0x71, 0x76, 0xbd, 0x8b, 0xe9, 0x26, 0xbd,
- 0x43, 0x20, 0x80, 0x3d, 0xe5, 0x1f, 0x16, 0x3d, 0x5e, 0xc1, 0x82, 0xbc,
- 0xd9, 0x88, 0xc7, 0xbb, 0xe3, 0x0d, 0xbc, 0xbe, 0xbc, 0x8b, 0x16, 0xbe,
- 0x9e, 0x74, 0x97, 0xba, 0xa2, 0xfd, 0xeb, 0xbc, 0x3b, 0x64, 0xa1, 0xbd,
- 0xeb, 0x7f, 0xa0, 0xbb, 0x11, 0x8a, 0x69, 0x3e, 0xc5, 0x6f, 0x3a, 0x3e,
- 0x03, 0xed, 0x23, 0xbc, 0xaa, 0x21, 0xa1, 0x3d, 0x6f, 0xe7, 0x09, 0xbd,
- 0xe7, 0xca, 0xcb, 0xbd, 0x53, 0xd9, 0x8c, 0x3e, 0xc3, 0x97, 0xfe, 0x3c,
- 0xa2, 0x95, 0xb0, 0x3d, 0x3f, 0xeb, 0xb1, 0xbe, 0x8d, 0xa4, 0xba, 0x3d,
- 0x7d, 0xd4, 0x21, 0xba, 0x38, 0x9c, 0x37, 0xbd, 0xc1, 0xf2, 0x12, 0xbe,
- 0x5b, 0xb0, 0xe1, 0xbc, 0xf8, 0xfa, 0x46, 0x3d, 0x74, 0xf8, 0x4f, 0xbd,
- 0x18, 0xf6, 0x10, 0x3e, 0x7b, 0xf8, 0x78, 0xbe, 0x18, 0x39, 0x1a, 0xbb,
- 0xf2, 0x50, 0x9f, 0x3b, 0xaf, 0x4e, 0x3a, 0x3d, 0xe9, 0x08, 0x6a, 0xbe,
- 0xd6, 0x64, 0xe5, 0x3a, 0x1a, 0xf6, 0x9c, 0x3c, 0x50, 0xc2, 0x98, 0xbd,
- 0x81, 0x4b, 0x8d, 0x3c, 0x9e, 0x7c, 0xbd, 0x3d, 0x93, 0x77, 0xc5, 0x3d,
- 0x6e, 0xf9, 0x57, 0x3d, 0x65, 0x0c, 0x60, 0xbe, 0x97, 0x30, 0x3f, 0xbe,
- 0x79, 0xac, 0x54, 0xbe, 0x6b, 0x7b, 0x6a, 0xbe, 0x2b, 0x91, 0x16, 0xbe,
- 0x6d, 0x96, 0xaa, 0xbd, 0xfc, 0x8f, 0x1c, 0xbe, 0x3b, 0x10, 0x30, 0x3d,
- 0xfb, 0xdc, 0x74, 0xbc, 0x17, 0x2b, 0x1f, 0x3e, 0xa7, 0xee, 0x34, 0x3d,
- 0x7f, 0xbb, 0x44, 0xbd, 0x02, 0x82, 0x02, 0xbe, 0x70, 0x61, 0xac, 0x3e,
- 0x09, 0xdd, 0x99, 0x3d, 0x6b, 0x7b, 0x76, 0x3d, 0xdb, 0x3f, 0x75, 0xbe,
- 0x05, 0x22, 0x12, 0xbe, 0x09, 0x15, 0x8c, 0x3e, 0xcf, 0xab, 0xd3, 0xbd,
- 0xa0, 0x50, 0xfc, 0xbe, 0x11, 0x4c, 0x73, 0xbe, 0x3a, 0x75, 0x1f, 0xbd,
- 0x8d, 0xfd, 0x56, 0xbd, 0xfb, 0x9a, 0xfb, 0x3d, 0xd8, 0xcb, 0x9f, 0x3c,
- 0x2e, 0x21, 0xad, 0x3c, 0xde, 0xb2, 0xca, 0xbd, 0xda, 0xa9, 0xea, 0xbd,
- 0xb1, 0x18, 0xe7, 0xbd, 0x8b, 0xc1, 0xa3, 0xbb, 0xc4, 0xab, 0xd4, 0xbd,
- 0x27, 0x79, 0x01, 0x3d, 0x9c, 0x89, 0xcf, 0x3d, 0x90, 0x9b, 0x10, 0x3e,
- 0xd8, 0xa7, 0x42, 0x3e, 0x29, 0xa0, 0xa2, 0x3d, 0x19, 0xe6, 0x74, 0xbe,
- 0xf3, 0xff, 0x2c, 0xbd, 0x3b, 0x30, 0x12, 0xbe, 0x01, 0x37, 0xfa, 0x3c,
- 0x7b, 0xdf, 0x38, 0x3c, 0x4e, 0x53, 0x7a, 0x3d, 0x69, 0x17, 0x04, 0x3e,
- 0xca, 0x7d, 0xb3, 0x3d, 0x2e, 0x23, 0xc0, 0xbd, 0xb9, 0x7f, 0x25, 0xbe,
- 0x52, 0xad, 0xd2, 0xbc, 0xce, 0x8b, 0x33, 0xbe, 0x4e, 0x03, 0xdb, 0x3b,
- 0xad, 0x57, 0x97, 0xbd, 0x1e, 0xc6, 0xc5, 0xbd, 0xa9, 0xcb, 0x6a, 0x3e,
- 0xcc, 0x05, 0x61, 0x3d, 0x54, 0x38, 0x8d, 0x3d, 0xd5, 0x4a, 0x59, 0xbe,
- 0xa2, 0x2c, 0xc9, 0x3e, 0xb6, 0x1e, 0xd6, 0x3d, 0x8a, 0xdb, 0x15, 0x3f,
- 0x75, 0x6a, 0x33, 0x3f, 0xca, 0x38, 0x82, 0x3e, 0xf6, 0x34, 0x1f, 0x3f,
- 0x63, 0xa0, 0x1a, 0x3f, 0xe5, 0x00, 0x90, 0x3e, 0x3a, 0xa2, 0xd0, 0xbe,
- 0x08, 0x44, 0x0c, 0xbe, 0xdc, 0x27, 0x87, 0x3f, 0x90, 0x80, 0x3c, 0x3e,
- 0x04, 0x30, 0x98, 0x3d, 0xf5, 0x31, 0x5f, 0xbd, 0xb4, 0x09, 0xe4, 0x3d,
- 0x53, 0x6a, 0x0e, 0x3e, 0x8f, 0xab, 0xac, 0xbe, 0xeb, 0x33, 0x13, 0x3f,
- 0x78, 0xf4, 0xf6, 0x3e, 0x07, 0x7c, 0x39, 0xbe, 0xc3, 0x68, 0xc8, 0x3e,
- 0xea, 0xa2, 0x20, 0x3f, 0x2a, 0xd1, 0x50, 0xbe, 0x72, 0x36, 0xbf, 0xbf,
- 0x92, 0x8d, 0x3d, 0x3d, 0x31, 0x3c, 0x8e, 0x3e, 0x95, 0xeb, 0xa4, 0xbe,
- 0xa9, 0x2c, 0x7d, 0xbd, 0x57, 0x2b, 0xf6, 0x3d, 0x53, 0x10, 0x69, 0xbd,
- 0xdb, 0x01, 0xfe, 0xbc, 0xa2, 0x2f, 0x88, 0xbe, 0x5a, 0x01, 0xa7, 0xbd,
- 0x27, 0x06, 0x2d, 0xbe, 0x5c, 0xeb, 0xfb, 0x3e, 0xc6, 0x3a, 0x23, 0x3f,
- 0xaa, 0x36, 0x6a, 0x3f, 0x3c, 0x7f, 0x58, 0xbe, 0x1d, 0x8c, 0xec, 0xbd,
- 0xc8, 0x59, 0x43, 0x3f, 0x38, 0xf5, 0x0b, 0x3f, 0xfe, 0xf6, 0xa5, 0x3e,
- 0x54, 0x22, 0x6b, 0xbe, 0xb7, 0xd5, 0xb3, 0x3d, 0xa0, 0xdd, 0x19, 0x3c,
- 0x18, 0x48, 0x76, 0xbe, 0xcd, 0x51, 0xc5, 0xbe, 0xca, 0x6a, 0xdb, 0x3e,
- 0xd2, 0x09, 0x80, 0xbe, 0x42, 0xe9, 0xf1, 0xbd, 0xbb, 0xf3, 0x6f, 0x3e,
- 0xe1, 0xdb, 0x69, 0xbd, 0x55, 0x0d, 0xdc, 0x3c, 0xaf, 0xbc, 0x57, 0xbe,
- 0x81, 0xab, 0xe8, 0xbd, 0x16, 0x2c, 0x7e, 0x3e, 0x8c, 0xda, 0x6b, 0xbe,
- 0xe5, 0x09, 0x64, 0x3f, 0x62, 0xff, 0xfc, 0xbb, 0xb2, 0xbb, 0xb1, 0x3e,
- 0x9e, 0x98, 0x85, 0x3c, 0xfb, 0x57, 0x79, 0x3f, 0x91, 0x5b, 0xd0, 0x3e,
- 0xce, 0x4a, 0xd9, 0x3e, 0x4a, 0x7b, 0xce, 0xbe, 0x3c, 0x69, 0xb4, 0x3e,
- 0xa4, 0x40, 0x86, 0xbf, 0x44, 0x0c, 0x70, 0xbc, 0x08, 0x7e, 0xe0, 0xbd,
- 0xf5, 0xd8, 0x4c, 0x3e, 0x07, 0x44, 0x3d, 0x3f, 0x8f, 0x0e, 0x25, 0x3f,
- 0x49, 0x82, 0x96, 0x3c, 0x5d, 0x20, 0x0a, 0xbd, 0x21, 0x37, 0xe9, 0x3e,
- 0x0d, 0x3f, 0x11, 0xbe, 0xa1, 0x79, 0x92, 0x3e, 0x53, 0x34, 0x50, 0xbe,
- 0x6f, 0x50, 0x0d, 0x3e, 0x8c, 0xdb, 0x32, 0xbe, 0x10, 0xe6, 0x1e, 0xbe,
- 0xf4, 0xfb, 0x81, 0xbf, 0x62, 0x69, 0x36, 0x3e, 0xc9, 0xe3, 0x7f, 0xbe,
- 0x47, 0xcd, 0x5f, 0xbd, 0x46, 0xd9, 0x24, 0xbe, 0x4f, 0x6f, 0x78, 0x3e,
- 0x61, 0x58, 0xe9, 0x3c, 0x87, 0xec, 0xba, 0xbd, 0x88, 0x10, 0xe3, 0x3e,
- 0x7c, 0xee, 0x89, 0xbf, 0x33, 0x0c, 0x88, 0xbe, 0xcc, 0xf0, 0x03, 0x3d,
- 0x5b, 0x49, 0x82, 0xbf, 0x18, 0x48, 0xd2, 0xbe, 0xdd, 0x8d, 0x2e, 0x3e,
- 0x1c, 0x7e, 0xcb, 0x3d, 0xe4, 0x78, 0x37, 0x3e, 0xfd, 0x98, 0x1a, 0x3d,
- 0xd0, 0x50, 0x38, 0x3c, 0xa9, 0xda, 0x8f, 0xbd, 0xa3, 0x17, 0x5b, 0xbe,
- 0x54, 0xe8, 0x6a, 0x3d, 0x5d, 0xce, 0x9c, 0xbd, 0xd2, 0x5d, 0x06, 0x3e,
- 0x7a, 0xb7, 0x18, 0x3d, 0x09, 0xc9, 0xf4, 0xbc, 0x4f, 0x17, 0xcd, 0xbc,
- 0xfa, 0x2e, 0x3f, 0xbc, 0xfa, 0x61, 0x72, 0x3d, 0x2f, 0x62, 0xb9, 0x3c,
- 0x22, 0x05, 0xa8, 0xbd, 0x7b, 0x7b, 0x7c, 0x3d, 0xce, 0x89, 0xd0, 0xbd,
- 0xa9, 0xe8, 0xaa, 0x3d, 0xc3, 0xd5, 0xb8, 0x3d, 0x71, 0x98, 0x24, 0x3c,
- 0x7a, 0x14, 0x7b, 0xbd, 0x88, 0xea, 0x12, 0xbc, 0x04, 0x10, 0x9a, 0x3c,
- 0x46, 0x2e, 0x6c, 0x3d, 0x4c, 0x81, 0x2c, 0x3d, 0xbc, 0x0a, 0x92, 0xbd,
- 0x77, 0x8d, 0x34, 0xbd, 0xce, 0xe6, 0x8d, 0x3d, 0x56, 0xad, 0xac, 0x3c,
- 0xd3, 0x12, 0x19, 0xbe, 0xa9, 0x6f, 0xff, 0x3d, 0xdf, 0x29, 0xa3, 0xbc,
- 0x8a, 0xc8, 0xcd, 0x3d, 0xe3, 0x24, 0xec, 0x3d, 0x71, 0xe4, 0x9a, 0xbf,
- 0x8d, 0xa0, 0xcf, 0xbd, 0x65, 0xf6, 0xa6, 0xbd, 0x28, 0xc5, 0x22, 0xbe,
- 0x60, 0x3e, 0x3d, 0xbd, 0xa0, 0x62, 0xa9, 0xbc, 0xc7, 0x1a, 0x19, 0xbe,
- 0x30, 0x5f, 0xcd, 0xbe, 0x5d, 0x8b, 0x99, 0x3d, 0x94, 0xae, 0xee, 0xbd,
- 0x11, 0x1b, 0x77, 0xbc, 0x20, 0xd9, 0xc5, 0xbd, 0x9c, 0xe3, 0xe0, 0x3d,
- 0xf3, 0xd2, 0x78, 0xbd, 0xea, 0x13, 0x16, 0xbe, 0x3d, 0xc8, 0xc9, 0xbd,
- 0xdc, 0x16, 0x22, 0xbd, 0x9c, 0x66, 0x10, 0xbf, 0xb5, 0x61, 0xc4, 0x3d,
- 0xc3, 0x33, 0x19, 0xbe, 0x2c, 0x0a, 0x0c, 0xbe, 0x33, 0x08, 0xe0, 0x3c,
- 0x16, 0x22, 0x28, 0x3d, 0xe7, 0xbe, 0xcc, 0xbc, 0xaa, 0xf9, 0xb9, 0x3c,
- 0xad, 0x07, 0x20, 0xbe, 0x7b, 0x6b, 0x3f, 0xbd, 0x04, 0xfe, 0x14, 0xbe,
- 0x0a, 0xee, 0xa4, 0xbe, 0x66, 0x2d, 0xfb, 0x3d, 0x63, 0xdd, 0x9b, 0xbd,
- 0x2c, 0x2d, 0x2a, 0x3e, 0x7a, 0xdd, 0x02, 0xbf, 0x68, 0xba, 0x82, 0xbd,
- 0x0f, 0xed, 0xc4, 0xbd, 0x99, 0xcd, 0x22, 0x3e, 0xd2, 0xcd, 0xcd, 0x3c,
- 0x8c, 0xbb, 0x99, 0x3d, 0x66, 0xa0, 0xc8, 0xbd, 0x46, 0x0e, 0xa2, 0xbc,
- 0x6c, 0x09, 0x22, 0xbd, 0x3f, 0x0d, 0xa5, 0xbd, 0xa8, 0x2f, 0xec, 0xbd,
- 0x4f, 0xeb, 0x54, 0xbb, 0x98, 0xa8, 0xd7, 0xbd, 0xb6, 0x50, 0x05, 0xbd,
- 0x3e, 0x66, 0xf1, 0x3d, 0xbf, 0x6c, 0x3b, 0xbe, 0xe3, 0xdd, 0x9f, 0xbd,
- 0xb8, 0xcb, 0x41, 0x3e, 0x21, 0xbe, 0x23, 0xbe, 0x52, 0x20, 0xd4, 0xbc,
- 0xea, 0xbf, 0x8e, 0xbd, 0x02, 0x4c, 0x19, 0x3a, 0xe3, 0x37, 0x3c, 0x3d,
- 0x7e, 0x5e, 0xb6, 0xbd, 0xdb, 0xc8, 0xaf, 0x3d, 0x3c, 0x0a, 0xf4, 0x3d,
- 0x48, 0x2e, 0x98, 0x3d, 0xe7, 0xd2, 0x31, 0x3e, 0xf5, 0x2e, 0xbe, 0xbc,
- 0x28, 0xc0, 0xaf, 0x3d, 0xcb, 0xe5, 0x90, 0xbc, 0x7c, 0x77, 0x50, 0xbe,
- 0x9d, 0xf2, 0xc3, 0xbd, 0xe5, 0xb4, 0x4d, 0x3c, 0x0c, 0xa0, 0x3c, 0xbe,
- 0xbb, 0x28, 0xa6, 0xbd, 0x9f, 0x93, 0x6b, 0xbd, 0x23, 0xa9, 0x1f, 0x3d,
- 0x8a, 0xc1, 0xb6, 0xbe, 0x00, 0xd7, 0x4b, 0xbd, 0xe0, 0x86, 0x88, 0xbe,
- 0xc9, 0xf2, 0x84, 0x3d, 0x96, 0xa7, 0xd7, 0xbd, 0x6a, 0x69, 0x79, 0x3d,
- 0xaa, 0x51, 0x7f, 0x3f, 0x0f, 0xfb, 0x94, 0x3f, 0x15, 0x0e, 0xc0, 0xbe,
- 0xa8, 0x43, 0x2d, 0xbc, 0x5d, 0xfe, 0x8e, 0xbe, 0x93, 0x33, 0x36, 0xbf,
- 0x59, 0x02, 0x4c, 0x3f, 0x5b, 0x9e, 0xfc, 0xbb, 0x6e, 0xe8, 0x24, 0xbd,
- 0x32, 0x0a, 0x04, 0x3f, 0xe6, 0x4c, 0x53, 0xbe, 0x2a, 0x78, 0x6c, 0xbf,
- 0x04, 0xac, 0x01, 0xbf, 0x27, 0xda, 0x58, 0xbf, 0x48, 0xb3, 0x93, 0xbf,
- 0x3e, 0x78, 0x48, 0xbf, 0xf6, 0xa1, 0x3d, 0xbe, 0xe8, 0xb9, 0x54, 0x3e,
- 0x40, 0xd0, 0x14, 0x3f, 0x40, 0xb9, 0x2f, 0xbe, 0xcb, 0xeb, 0x9c, 0xbe,
- 0xc6, 0x9f, 0x0e, 0xbe, 0x1f, 0xb5, 0x13, 0x3f, 0x9c, 0x6c, 0x72, 0x3e,
- 0xd9, 0xa4, 0x98, 0x3b, 0xf4, 0xb5, 0x86, 0x3c, 0x6e, 0x70, 0xa8, 0x3e,
- 0x88, 0xed, 0xae, 0xbd, 0xae, 0x72, 0x58, 0xbe, 0x28, 0x61, 0x2f, 0xbd,
- 0xe7, 0x77, 0xa1, 0x3f, 0x3a, 0x03, 0x00, 0xbf, 0xeb, 0xbf, 0x31, 0x3e,
- 0xb3, 0x43, 0x4f, 0xbf, 0xfc, 0x5f, 0x27, 0xbe, 0x2d, 0x60, 0xfb, 0xbe,
- 0x14, 0xed, 0xac, 0x3d, 0x25, 0x8c, 0x79, 0x3e, 0xa9, 0x5a, 0x0a, 0x3f,
- 0xbc, 0x51, 0x53, 0xbd, 0x5b, 0x94, 0xbc, 0xbf, 0x12, 0x76, 0xa3, 0xbf,
- 0xd5, 0x2f, 0x22, 0xbf, 0xfb, 0x22, 0x1e, 0x3e, 0x81, 0xc4, 0x17, 0x3f,
- 0x44, 0x81, 0xb3, 0xbe, 0x68, 0xfd, 0x80, 0xbe, 0xa6, 0xa2, 0xa9, 0xbf,
- 0xc4, 0xd2, 0x88, 0x3f, 0x13, 0xb4, 0xa6, 0x3e, 0x5b, 0x25, 0x11, 0xbe,
- 0x12, 0x0a, 0xca, 0x3b, 0xf0, 0xec, 0x31, 0xbe, 0xdc, 0xd7, 0x5b, 0xbe,
- 0xd1, 0x0b, 0x6f, 0xbe, 0x5b, 0xa2, 0xa6, 0xbd, 0x5e, 0x65, 0xc2, 0x3e,
- 0xb7, 0x82, 0x14, 0x3e, 0xe5, 0x0c, 0x1d, 0xbf, 0xf1, 0x70, 0xa4, 0x3e,
- 0xa9, 0x24, 0x5a, 0xbc, 0xc6, 0xa7, 0x80, 0xba, 0xc6, 0x3a, 0x19, 0x3f,
- 0xd3, 0x0e, 0xda, 0x3d, 0xff, 0xe0, 0x75, 0xbd, 0x07, 0x89, 0xaf, 0xbe,
- 0x7b, 0x31, 0x46, 0x3e, 0x8f, 0x01, 0xfb, 0x3e, 0xac, 0x01, 0x99, 0x3e,
- 0x21, 0x0d, 0xef, 0xbd, 0x6d, 0x64, 0x0e, 0x3e, 0xb0, 0xe8, 0xa2, 0xbe,
- 0xb0, 0x60, 0x59, 0xbe, 0xdd, 0xad, 0xa2, 0x3d, 0xae, 0xfb, 0xa5, 0x3f,
- 0xa4, 0xa8, 0x33, 0x3f, 0x22, 0x7a, 0xeb, 0x3c, 0x99, 0x7f, 0x89, 0xbd,
- 0x0c, 0x52, 0x0f, 0x3e, 0x7a, 0x55, 0x37, 0xbd, 0x52, 0x27, 0x6a, 0xbe,
- 0x04, 0x60, 0x1b, 0xbd, 0xe5, 0x45, 0x20, 0xbc, 0xd7, 0xbf, 0x84, 0x3d,
- 0x49, 0x0d, 0x13, 0x3e, 0x8f, 0x98, 0x1f, 0xbe, 0x86, 0x7c, 0x1f, 0x3f,
- 0xc3, 0x19, 0xb1, 0x3d, 0x86, 0x23, 0xe7, 0xbd, 0x9d, 0x21, 0xa9, 0x3d,
- 0x8b, 0xbc, 0x88, 0x3f, 0x15, 0x56, 0x84, 0x3f, 0x2e, 0xba, 0xa5, 0x3e,
- 0xff, 0xd3, 0xe7, 0x3d, 0xee, 0x20, 0x8b, 0x3d, 0xdd, 0x57, 0x5a, 0x3f,
- 0xac, 0x9b, 0xd8, 0xbd, 0xd3, 0xa7, 0xaf, 0xbd, 0xd5, 0x18, 0xb6, 0xbe,
- 0xbb, 0xc5, 0x7a, 0x3c, 0xbc, 0xb6, 0xcb, 0xbd, 0x61, 0x4d, 0x48, 0x3b,
- 0x86, 0x2f, 0xad, 0xbe, 0x6a, 0x77, 0x9f, 0xbd, 0xc1, 0x8f, 0x6b, 0x3e,
- 0x3e, 0x23, 0xd5, 0xbc, 0x9f, 0x6c, 0x46, 0x3e, 0x87, 0x55, 0x83, 0x3d,
- 0x9a, 0x14, 0xfd, 0xbd, 0x5a, 0x34, 0x00, 0x3e, 0x64, 0x8e, 0x8d, 0xba,
- 0x24, 0xf4, 0x4a, 0xbd, 0x4f, 0x61, 0x97, 0xbd, 0xb2, 0x4f, 0x42, 0x3e,
- 0xcb, 0xf0, 0x81, 0xbc, 0x2a, 0xf9, 0xcb, 0x3d, 0x93, 0x31, 0x35, 0xbe,
- 0x00, 0x68, 0x67, 0xbc, 0x94, 0xa3, 0xaa, 0xbd, 0x06, 0xdb, 0x83, 0xbc,
- 0xa7, 0xce, 0xf8, 0xbd, 0xf8, 0x5c, 0x39, 0xbe, 0xaf, 0x4a, 0x8f, 0x3d,
- 0xb9, 0xcb, 0xd0, 0x3c, 0x61, 0x5f, 0x90, 0xbd, 0xed, 0xc8, 0x84, 0xbe,
- 0x21, 0xa4, 0xad, 0xbc, 0x51, 0xd4, 0xb5, 0xbd, 0x26, 0x79, 0x02, 0xbd,
- 0xdd, 0x53, 0xfa, 0xbd, 0x9a, 0xdf, 0x1a, 0x3b, 0xae, 0x7b, 0x00, 0x3e,
- 0xe8, 0xd8, 0x29, 0xbe, 0x82, 0xb6, 0xb5, 0x3d, 0x9b, 0xda, 0x11, 0x3e,
- 0x96, 0x45, 0x24, 0x3d, 0x9d, 0x1f, 0x8c, 0xbd, 0x33, 0x73, 0x92, 0xbd,
- 0x1b, 0x54, 0x8a, 0xbd, 0xb1, 0x4e, 0x94, 0x3d, 0x8c, 0x78, 0x39, 0xbd,
- 0xab, 0x24, 0xdc, 0x3c, 0xc2, 0xfe, 0xfa, 0x3d, 0x25, 0x45, 0xb2, 0xbc,
- 0x5d, 0xd7, 0x85, 0x3d, 0x37, 0xbd, 0xb0, 0xbc, 0x26, 0x53, 0x4d, 0xbe,
- 0x25, 0x04, 0xab, 0xbe, 0x12, 0x53, 0xb2, 0xbe, 0x4f, 0xec, 0x49, 0x3e,
- 0xd1, 0xaf, 0x1f, 0x3d, 0xcf, 0xd9, 0x1b, 0xbe, 0xea, 0x4c, 0xa7, 0xbd,
- 0xdc, 0x00, 0xf0, 0xbd, 0xf1, 0xf8, 0x71, 0xbe, 0xaf, 0xee, 0xed, 0x3d,
- 0x0c, 0xd9, 0xf6, 0x3d, 0xe0, 0xb4, 0x74, 0xbd, 0x86, 0x46, 0x56, 0x3d,
- 0xa0, 0xbd, 0x8f, 0xbd, 0x9a, 0x86, 0x3a, 0x3d, 0xfa, 0x77, 0x29, 0xbe,
- 0x8c, 0xad, 0xa6, 0xbd, 0x1c, 0x24, 0x8d, 0xbc, 0xac, 0x0f, 0x0e, 0xbd,
- 0xfd, 0x15, 0x6c, 0xbe, 0x42, 0xb8, 0xc1, 0xbd, 0xea, 0x60, 0x99, 0x3d,
- 0xae, 0xc3, 0x93, 0xbd, 0x74, 0xd0, 0x57, 0xbd, 0x04, 0x9d, 0x38, 0x3d,
- 0xc7, 0x6e, 0x0c, 0xbd, 0x77, 0xa2, 0x8c, 0xbd, 0x0a, 0x21, 0x49, 0x3d,
- 0xfa, 0xce, 0x01, 0x3d, 0xae, 0x8a, 0x0f, 0x3e, 0xf9, 0x37, 0x6c, 0x3c,
- 0x02, 0x34, 0x9c, 0xbe, 0xd9, 0x2e, 0x8e, 0x3c, 0x1d, 0x27, 0xcf, 0x3e,
- 0xd3, 0x61, 0xba, 0xbc, 0xb2, 0x56, 0x9a, 0xbd, 0x96, 0x46, 0x2b, 0xbd,
- 0x90, 0x03, 0x55, 0x3d, 0x50, 0x04, 0xaf, 0xbd, 0xf0, 0xf7, 0x03, 0x3d,
- 0xdd, 0x15, 0x9c, 0x3c, 0xca, 0x58, 0x98, 0xbc, 0xc6, 0x13, 0x93, 0xbe,
- 0xc4, 0x7a, 0x30, 0xbe, 0x7a, 0xb5, 0x9b, 0xbc, 0x57, 0x1c, 0xb0, 0xbd,
- 0x0e, 0x54, 0x30, 0x3c, 0x2c, 0x76, 0x82, 0xbe, 0x75, 0x27, 0xe9, 0x3d,
- 0x0e, 0x34, 0x30, 0xbd, 0x05, 0x33, 0x84, 0xbc, 0x17, 0x70, 0x91, 0xbe,
- 0xcf, 0x7a, 0x4c, 0xbd, 0x39, 0xff, 0x46, 0xbe, 0x3f, 0xda, 0x1e, 0xbe,
- 0x6b, 0xba, 0x99, 0xbe, 0x81, 0xd8, 0x85, 0xbd, 0x00, 0x2a, 0x57, 0xbc,
- 0xd9, 0xfb, 0x75, 0xbe, 0xbc, 0xe6, 0xea, 0xb9, 0xfc, 0x18, 0x56, 0xbe,
- 0x90, 0x3f, 0xb4, 0x3d, 0x26, 0x44, 0x86, 0xbd, 0x83, 0xd5, 0x50, 0xbd,
- 0x60, 0xc7, 0x14, 0xbd, 0x05, 0xca, 0x83, 0xbc, 0x3a, 0x65, 0x0a, 0xbe,
- 0x1c, 0x8f, 0x06, 0x3e, 0x15, 0x9d, 0xbf, 0x3d, 0xc4, 0x22, 0xa0, 0xbe,
- 0x72, 0x46, 0x17, 0xbe, 0x5c, 0x58, 0x98, 0x3c, 0x40, 0x9b, 0xba, 0x3d,
- 0xbe, 0x25, 0x4e, 0x3d, 0xc3, 0x08, 0xf2, 0xbd, 0x6e, 0x64, 0x2c, 0x3e,
- 0xd0, 0xf0, 0xf5, 0xbb, 0x13, 0x20, 0x09, 0x3e, 0xfe, 0xc1, 0x24, 0x3c,
- 0x26, 0xc3, 0x45, 0xbd, 0xa9, 0x47, 0xa3, 0xbe, 0x90, 0x16, 0x34, 0xbe,
- 0xfa, 0x94, 0x63, 0xbd, 0x5a, 0x4a, 0x70, 0x3d, 0x4a, 0x68, 0xf1, 0x3d,
- 0x52, 0x10, 0x26, 0xbc, 0xa8, 0x44, 0xe0, 0x3d, 0xac, 0x5e, 0x5c, 0x3d,
- 0x5f, 0xde, 0x08, 0x3e, 0x3c, 0x80, 0x5c, 0xbe, 0x2b, 0xaa, 0x1e, 0xbe,
- 0x80, 0x78, 0xcd, 0x3d, 0x9e, 0x57, 0xe1, 0x3d, 0x85, 0x0e, 0xf6, 0x3d,
- 0x46, 0xae, 0x6a, 0x3d, 0xcb, 0x6e, 0x1c, 0xbd, 0x97, 0x7c, 0x82, 0xbd,
- 0xc8, 0x4c, 0x91, 0xbc, 0xc1, 0xe4, 0x93, 0x3d, 0x39, 0xfa, 0x15, 0xbe,
- 0x55, 0xca, 0xed, 0x3d, 0x82, 0x23, 0xdf, 0xbd, 0x05, 0xe0, 0x1d, 0xbd,
- 0x33, 0x68, 0x0d, 0xbe, 0x66, 0x34, 0xee, 0xbc, 0x6a, 0xae, 0xfa, 0xbd,
- 0xa4, 0x41, 0xc1, 0xbc, 0xa1, 0x6d, 0x68, 0x3d, 0x67, 0x7c, 0xd2, 0x3c,
- 0x24, 0x0f, 0xc9, 0xbd, 0x8a, 0x16, 0x6e, 0x3e, 0x3d, 0x50, 0xd8, 0xbd,
- 0x06, 0x3f, 0x21, 0xbe, 0x16, 0xe9, 0xd5, 0x3d, 0xb2, 0xf9, 0x3c, 0x3e,
- 0x89, 0x0e, 0x1c, 0x3d, 0xb8, 0xbf, 0xf4, 0x3d, 0xd6, 0x45, 0xc5, 0xbd,
- 0x92, 0x18, 0x80, 0xbd, 0xf2, 0x91, 0x83, 0x3d, 0x5c, 0x34, 0x9f, 0xbe,
- 0xe8, 0x0e, 0xa5, 0xbe, 0x1d, 0x90, 0x33, 0xbe, 0x62, 0x16, 0x91, 0xbe,
- 0x01, 0x2f, 0x45, 0xbe, 0xf2, 0x84, 0x00, 0x3e, 0xf9, 0x1c, 0x3a, 0xbe,
- 0xfd, 0xe4, 0x4e, 0x3d, 0x5b, 0x60, 0xa2, 0xbc, 0x35, 0x48, 0x07, 0xbe,
- 0x83, 0x03, 0x3f, 0xbd, 0x22, 0x11, 0x18, 0x3e, 0x65, 0xf6, 0x3b, 0xbe,
- 0x71, 0xb3, 0x89, 0x3d, 0x17, 0x67, 0xee, 0x3a, 0x52, 0x8e, 0xc1, 0x3e,
- 0x53, 0x10, 0x4c, 0x3e, 0x5d, 0xb1, 0x24, 0x3d, 0xc9, 0x83, 0xc0, 0xbe,
- 0x54, 0x66, 0xc3, 0x3d, 0x24, 0xa4, 0x14, 0xbe, 0x18, 0xb2, 0xe0, 0x3d,
- 0x58, 0x34, 0xf3, 0x3c, 0x3b, 0xce, 0x03, 0xbe, 0x5d, 0xeb, 0x0f, 0x3e,
- 0xf7, 0x92, 0x41, 0x3e, 0xab, 0x57, 0xfb, 0xbd, 0x52, 0x1e, 0x0b, 0xbe,
- 0x1a, 0x3c, 0x22, 0xbd, 0x82, 0x0a, 0x37, 0xbc, 0xc6, 0xe1, 0x03, 0xbe,
- 0x0a, 0x95, 0x12, 0x3d, 0x8b, 0x66, 0x4b, 0x3c, 0xc0, 0xc4, 0x3b, 0x3e,
- 0x14, 0xeb, 0x63, 0x3f, 0x60, 0x1a, 0x9a, 0xbe, 0x77, 0x35, 0xb1, 0xbe,
- 0x5d, 0x24, 0xea, 0x3e, 0x70, 0xd3, 0xf3, 0xbc, 0x34, 0x67, 0x85, 0x3e,
- 0x63, 0x92, 0x64, 0xbd, 0xce, 0x9b, 0x0a, 0x3e, 0x6b, 0x70, 0xe9, 0xbe,
- 0x6b, 0xba, 0x54, 0xbc, 0x4c, 0x31, 0xf2, 0x3e, 0xfd, 0xee, 0x13, 0xbe,
- 0xa9, 0x87, 0xcc, 0xbd, 0x4b, 0xa5, 0x38, 0x3f, 0x7b, 0xcf, 0x1a, 0x3e,
- 0x54, 0xe3, 0x6f, 0xbd, 0x3b, 0xe2, 0x11, 0xbf, 0x3d, 0x88, 0xeb, 0x3d,
- 0xf1, 0x93, 0xd4, 0x3c, 0x72, 0xda, 0x22, 0xbe, 0xe2, 0xc9, 0xe5, 0x3e,
- 0x97, 0x49, 0xb6, 0x3e, 0x71, 0xbf, 0x21, 0xbe, 0xe3, 0x2a, 0x33, 0x3d,
- 0xf6, 0xc0, 0x69, 0x3f, 0x4d, 0x2d, 0xfa, 0xbd, 0xe9, 0xc1, 0x07, 0xbf,
- 0x6b, 0xc2, 0xe4, 0xbb, 0xd1, 0xa7, 0x5b, 0xbe, 0xa9, 0x55, 0xe6, 0x3d,
- 0xdf, 0x0c, 0x0d, 0xbe, 0x66, 0x5c, 0x36, 0xbe, 0x5d, 0x58, 0x7b, 0x3e,
- 0x02, 0x9d, 0x07, 0x3f, 0x7b, 0xdb, 0x2a, 0xbd, 0x91, 0x84, 0x74, 0x3d,
- 0xe6, 0xd8, 0xd8, 0xbe, 0xd8, 0x6d, 0x45, 0xbd, 0x87, 0xc5, 0x25, 0x3f,
- 0xf8, 0xaf, 0x4f, 0x3f, 0x68, 0x0b, 0xea, 0x3b, 0x88, 0x2d, 0xda, 0xbd,
- 0x8b, 0x33, 0xcd, 0x3e, 0x85, 0x0f, 0xa1, 0x3e, 0x92, 0xcc, 0x81, 0x3e,
- 0xca, 0x34, 0x41, 0x3d, 0xf2, 0x32, 0x4d, 0xbd, 0xf2, 0xe6, 0x30, 0xbe,
- 0xac, 0xed, 0xb5, 0xbd, 0xf4, 0x78, 0xb1, 0x3d, 0x8f, 0xe5, 0x5b, 0x3e,
- 0x9c, 0xbf, 0xbb, 0xbe, 0xf0, 0x5a, 0x32, 0x3c, 0xc4, 0x66, 0x26, 0x3f,
- 0x95, 0xeb, 0xeb, 0x3e, 0x47, 0x36, 0x89, 0x3e, 0xad, 0xc9, 0x90, 0x3f,
- 0xe7, 0x45, 0x1d, 0x3e, 0xef, 0xc4, 0x43, 0xbd, 0xd6, 0xac, 0x26, 0xbd,
- 0x11, 0xd5, 0x68, 0x3e, 0x6d, 0x2a, 0x94, 0xbd, 0x68, 0x19, 0xe9, 0xbe,
- 0x8c, 0x23, 0x30, 0x3e, 0xc5, 0x86, 0x9b, 0x3e, 0x71, 0xe2, 0xf6, 0x3d,
- 0x5e, 0xa9, 0x2d, 0x3e, 0xae, 0x40, 0xef, 0xbe, 0x97, 0x84, 0xc8, 0x3d,
- 0x1a, 0xf5, 0x8f, 0xbf, 0xcc, 0xec, 0x7d, 0xbd, 0x00, 0x21, 0x6e, 0xbd,
- 0x0e, 0x97, 0xcd, 0x3c, 0xe4, 0xda, 0xac, 0x3e, 0x83, 0xa4, 0x22, 0x3e,
- 0xca, 0x42, 0xe5, 0xbd, 0x9d, 0x1f, 0xa1, 0xbc, 0x17, 0x95, 0xb4, 0x3d,
- 0x1d, 0xd9, 0x08, 0xbc, 0x1c, 0x76, 0x86, 0xbe, 0xd1, 0xcf, 0x00, 0xbe,
- 0xf7, 0x1a, 0x1c, 0x3e, 0x1a, 0x6a, 0x6f, 0xbd, 0x50, 0x50, 0x23, 0x3f,
- 0x4f, 0xe4, 0x64, 0xbf, 0xf3, 0xec, 0xd2, 0xbd, 0x5c, 0x22, 0x27, 0x3e,
- 0x8c, 0x97, 0x2b, 0x3e, 0x44, 0xf8, 0xb4, 0xbd, 0xd3, 0xbb, 0x8e, 0x3d,
- 0x40, 0x92, 0xab, 0x3c, 0x1f, 0x62, 0xf6, 0x3d, 0xf8, 0xa8, 0xbe, 0x3d,
- 0x98, 0x78, 0x0f, 0xbf, 0x2e, 0x65, 0x88, 0xbd, 0xcc, 0x78, 0x15, 0x3d,
- 0xdc, 0x58, 0x9e, 0xbf, 0x7a, 0x4e, 0xab, 0xbe, 0x42, 0x6a, 0xbd, 0x3e,
- 0x00, 0x91, 0xa0, 0x3c, 0x40, 0x08, 0xe4, 0x3c, 0x80, 0x2b, 0x66, 0x3c,
- 0x4a, 0x31, 0x19, 0xbd, 0x12, 0xe3, 0x1f, 0x3e, 0x45, 0x79, 0xb9, 0xbe,
- 0x33, 0x24, 0xc6, 0x3c, 0xd6, 0x05, 0x95, 0x3d, 0x61, 0x7f, 0x0d, 0xbd,
- 0xb8, 0xb9, 0x2a, 0x3d, 0x0b, 0x0b, 0x19, 0x3d, 0x93, 0xe0, 0x76, 0x3d,
- 0x73, 0xd8, 0x13, 0xbd, 0x4a, 0xc0, 0x84, 0xbc, 0xfe, 0xda, 0x4c, 0xbc,
- 0xff, 0xc4, 0x5f, 0x3e, 0xe9, 0xa6, 0x30, 0xbd, 0x8b, 0xfd, 0x03, 0xbe,
- 0x1e, 0x2e, 0xa7, 0xb9, 0xc1, 0x8b, 0x5a, 0xbd, 0x68, 0x45, 0x46, 0x3d,
- 0xe2, 0x96, 0xbe, 0x3d, 0xbc, 0xb6, 0x38, 0x3d, 0x6d, 0x16, 0x03, 0x3c,
- 0xf7, 0x7a, 0x27, 0x3d, 0xfc, 0x34, 0xeb, 0xbd, 0x35, 0xe9, 0xd8, 0x3d,
- 0xee, 0xa9, 0x8c, 0xbd, 0x70, 0xc5, 0xea, 0x3d, 0xa9, 0x3e, 0xd2, 0xbb,
- 0xea, 0x18, 0xa3, 0xbb, 0xc3, 0x62, 0xa8, 0x3d, 0x85, 0xf3, 0x82, 0xbd,
- 0xa2, 0x8b, 0xaf, 0x3d, 0x5e, 0x52, 0xef, 0xbd, 0x4d, 0x66, 0x62, 0xbf,
- 0x86, 0x45, 0x89, 0x3d, 0xef, 0xd8, 0xd7, 0xbd, 0x94, 0x3c, 0x22, 0xbe,
- 0xfe, 0x5d, 0xf2, 0xbc, 0x7e, 0xc1, 0x45, 0x3d, 0xc7, 0x4d, 0x86, 0xbd,
- 0x51, 0x0b, 0xfd, 0xbe, 0xad, 0xe5, 0x77, 0x3d, 0xc1, 0x85, 0xd6, 0x3d,
- 0x60, 0xf7, 0x91, 0x3d, 0xb9, 0xf9, 0x32, 0xbd, 0x2e, 0x0e, 0xf0, 0xbc,
- 0x60, 0xe1, 0xd5, 0xbd, 0xac, 0x7a, 0x82, 0xbd, 0xef, 0xb3, 0xd5, 0xbd,
- 0x57, 0x3f, 0x81, 0xbc, 0x66, 0x01, 0xc9, 0xbe, 0x7b, 0x8e, 0x03, 0x3e,
- 0x8e, 0x57, 0x65, 0xbe, 0xf5, 0x52, 0x2c, 0xbe, 0xd3, 0x3c, 0x9c, 0xbd,
- 0xf0, 0x14, 0x25, 0xbd, 0x4a, 0xa9, 0x06, 0x3d, 0xdf, 0x43, 0xa2, 0xbc,
- 0x22, 0xb3, 0x1b, 0x3d, 0x27, 0x58, 0x09, 0x3d, 0xc0, 0xd6, 0x08, 0xbe,
- 0x01, 0x76, 0x52, 0xbe, 0x26, 0x09, 0x7c, 0x3d, 0x9f, 0x8b, 0x34, 0xbe,
- 0x9c, 0x3e, 0x77, 0x3e, 0xde, 0x92, 0x33, 0xbf, 0xcf, 0x24, 0x9c, 0xbd,
- 0x7b, 0xe4, 0xfd, 0x3d, 0x91, 0x8a, 0xdd, 0x3d, 0x79, 0x63, 0x9f, 0x3d,
- 0xc4, 0xaf, 0x9f, 0x3d, 0xb4, 0x75, 0x7e, 0x3d, 0xde, 0xf7, 0x44, 0xbd,
- 0x6d, 0x01, 0xa9, 0xbd, 0xe4, 0x83, 0xda, 0x3d, 0xad, 0xb3, 0x4e, 0xbd,
- 0x73, 0xf2, 0x0f, 0xbe, 0x36, 0x13, 0x01, 0x3d, 0xa7, 0x4b, 0x85, 0xbe,
- 0x7e, 0x3f, 0xad, 0x3d, 0x89, 0x67, 0x0f, 0xbe, 0x4d, 0xa3, 0xb0, 0x3c,
- 0xb6, 0x8d, 0x53, 0x3e, 0x72, 0x64, 0x90, 0x3d, 0x28, 0x79, 0x85, 0xbd,
- 0xf4, 0xc9, 0x87, 0x3b, 0x1b, 0xb7, 0x3c, 0xbd, 0x6b, 0x4d, 0x24, 0x3d,
- 0x5f, 0x88, 0xeb, 0x3c, 0xeb, 0xee, 0xd9, 0xbd, 0x1b, 0x23, 0xa7, 0xbd,
- 0x04, 0x59, 0x86, 0x3d, 0x81, 0x46, 0x0c, 0x3e, 0x3c, 0xea, 0xc3, 0x3c,
- 0x66, 0x90, 0xc1, 0xbb, 0xd9, 0x1b, 0x73, 0x3d, 0xcc, 0xc1, 0xbc, 0xbd,
- 0x8b, 0x7a, 0x5d, 0xbd, 0xb2, 0x87, 0x50, 0x3d, 0xc5, 0xe0, 0x9c, 0xbe,
- 0xdc, 0x25, 0x91, 0xbd, 0x1c, 0xe9, 0xd2, 0xbd, 0xcf, 0x50, 0x53, 0xbb,
- 0x6a, 0xcb, 0x8e, 0xbe, 0xc4, 0x2a, 0x06, 0xbd, 0x6a, 0xbb, 0xbe, 0xbe,
- 0x15, 0xd0, 0xe1, 0x3d, 0x18, 0xd3, 0x18, 0xbe, 0x12, 0x4d, 0x6c, 0xbe,
- 0xc5, 0xa9, 0x56, 0x3f, 0x2c, 0xc6, 0x3d, 0x3f, 0x15, 0xe7, 0x95, 0xbe,
- 0x75, 0x5e, 0x0c, 0xbe, 0x09, 0xb9, 0x55, 0xbe, 0x83, 0xd2, 0xfa, 0xbe,
- 0x8b, 0x13, 0x56, 0x3f, 0x2d, 0xa1, 0x4c, 0x3e, 0x99, 0x09, 0x6f, 0xbb,
- 0x09, 0x37, 0x99, 0x3e, 0xc6, 0x09, 0xae, 0x3d, 0x24, 0x02, 0x5b, 0xbf,
- 0x31, 0x51, 0xcf, 0xbe, 0xd4, 0x09, 0x3d, 0xbf, 0x11, 0xea, 0x35, 0xbf,
- 0x81, 0x2a, 0x3a, 0xbf, 0x09, 0x8f, 0x08, 0xbe, 0x5c, 0xad, 0x50, 0xbc,
- 0x91, 0x62, 0x9a, 0x3e, 0x9a, 0x6e, 0x24, 0xbe, 0x87, 0xa4, 0xac, 0xbe,
- 0xc5, 0x17, 0x4c, 0xbe, 0xa8, 0x33, 0xb0, 0x3e, 0xd5, 0xd3, 0x9d, 0xbd,
- 0x16, 0xd1, 0x03, 0x3d, 0xa6, 0xae, 0xfc, 0xbd, 0xe9, 0xba, 0xea, 0x3e,
- 0xd9, 0x9b, 0x34, 0x3d, 0xa4, 0xc1, 0x54, 0xbe, 0xc6, 0xdb, 0xfa, 0x3d,
- 0xcd, 0x7f, 0x91, 0x3f, 0xf3, 0x05, 0xdf, 0xbe, 0x3b, 0xaf, 0x8a, 0x3e,
- 0xf9, 0xc1, 0x39, 0xbf, 0xef, 0x64, 0xf3, 0xbd, 0x28, 0x1c, 0xc8, 0xbd,
- 0x14, 0x64, 0x66, 0x3e, 0xf6, 0x77, 0x9d, 0x3e, 0x16, 0x91, 0x67, 0x3e,
- 0xaa, 0x4a, 0xf8, 0xbd, 0x9c, 0x78, 0xb9, 0xbf, 0x22, 0xb3, 0xb4, 0xbf,
- 0x82, 0x17, 0xde, 0xbe, 0x49, 0x8e, 0xb1, 0x3e, 0xbe, 0xb7, 0x8a, 0x3e,
- 0x74, 0xb2, 0x88, 0xbd, 0x75, 0xbb, 0x48, 0xbe, 0x5d, 0x88, 0x80, 0xbf,
- 0xd2, 0x6c, 0x63, 0x3f, 0xf9, 0x76, 0xbf, 0x3e, 0x14, 0x88, 0x03, 0x3d,
- 0xd8, 0x07, 0x81, 0xbd, 0xf2, 0x92, 0xb6, 0xbe, 0x5d, 0x2a, 0x87, 0xbd,
- 0x99, 0x9c, 0x89, 0xbe, 0x2e, 0xa7, 0x0b, 0x3d, 0x6d, 0x9f, 0x09, 0x3e,
- 0xd8, 0x82, 0xea, 0xbd, 0xa3, 0x43, 0xc9, 0xbe, 0xa6, 0x25, 0x99, 0x3e,
- 0x0d, 0xa9, 0xd3, 0x3d, 0x2b, 0x0a, 0xc4, 0x3d, 0x87, 0xaa, 0x51, 0x3e,
- 0x4c, 0x2d, 0xed, 0x3d, 0x8a, 0xd3, 0x4e, 0xbc, 0x2f, 0x84, 0x5d, 0xbe,
- 0x44, 0xa7, 0x83, 0x3d, 0xe3, 0x20, 0xc6, 0x3e, 0xa2, 0x68, 0xcd, 0x3e,
- 0x92, 0xb1, 0x80, 0xbe, 0xd8, 0x7c, 0x98, 0x3d, 0x8f, 0xd8, 0x96, 0xbe,
- 0x1a, 0x4d, 0x14, 0xbe, 0x20, 0x13, 0x95, 0x3e, 0x15, 0x3c, 0x83, 0x3f,
- 0x08, 0x08, 0x21, 0x3f, 0x95, 0x2b, 0x49, 0x3d, 0x0f, 0xc5, 0x62, 0x3e,
- 0xb2, 0xb4, 0x93, 0xbb, 0xd8, 0x09, 0xdf, 0xbd, 0xdc, 0x80, 0x37, 0xbe,
- 0x16, 0x7a, 0x08, 0x3e, 0xf8, 0xe8, 0xb0, 0xbd, 0x21, 0x69, 0xc1, 0x3c,
- 0x4b, 0x8d, 0x79, 0x3c, 0x56, 0x2a, 0xa5, 0xbd, 0x42, 0x2f, 0x1f, 0x3f,
- 0x10, 0x99, 0x0d, 0xbe, 0x75, 0x3b, 0xbc, 0xbd, 0x68, 0x81, 0xbe, 0x3c,
- 0xb9, 0x84, 0x80, 0x3f, 0x9c, 0x9a, 0x84, 0x3f, 0x66, 0xe1, 0xed, 0x3e,
- 0xdc, 0x5a, 0x01, 0x3e, 0x6a, 0x21, 0xa4, 0x3e, 0x79, 0x84, 0x2b, 0x3f,
- 0x65, 0xea, 0x09, 0xbb, 0x65, 0x5d, 0x4b, 0x3e, 0xf4, 0xc6, 0x90, 0xbd,
- 0x09, 0x0f, 0xb5, 0x3d, 0x35, 0xff, 0x55, 0xbe, 0x46, 0xe9, 0xa3, 0xbe,
- 0x84, 0x5f, 0xc0, 0xbe, 0xa2, 0x01, 0xa7, 0xbd, 0xbf, 0x80, 0xf4, 0xbc,
- 0x8d, 0x87, 0x51, 0xbc, 0xb1, 0xc0, 0x84, 0x3d, 0x81, 0x7a, 0x0b, 0xbc,
- 0x64, 0xb4, 0x94, 0x3d, 0x43, 0x02, 0x34, 0x3e, 0x21, 0xbe, 0x1e, 0xbd,
- 0xa4, 0x8a, 0x86, 0x3d, 0xcb, 0x0a, 0x38, 0xbe, 0xa1, 0xb6, 0x08, 0xbd,
- 0x5c, 0xf9, 0x63, 0x3d, 0xb4, 0xe9, 0x7b, 0x3d, 0x92, 0x32, 0x29, 0xbd,
- 0xb8, 0xa9, 0xc1, 0x3d, 0x57, 0x41, 0x4e, 0xbd, 0xe3, 0xc6, 0x30, 0x3e,
- 0x82, 0x9b, 0x6d, 0xbd, 0x96, 0x53, 0x86, 0xbd, 0xde, 0x96, 0x82, 0xbe,
- 0x07, 0x50, 0x23, 0x3d, 0x0d, 0x1d, 0x09, 0xbc, 0x0d, 0x22, 0xae, 0xbe,
- 0xe4, 0x52, 0x8b, 0x3c, 0x7c, 0x1a, 0x5c, 0xbd, 0x2b, 0xc8, 0xee, 0x3c,
- 0x52, 0xa4, 0xe1, 0xbd, 0x53, 0xb0, 0x8d, 0xbd, 0xa2, 0x2b, 0x07, 0xbe,
- 0x4f, 0x66, 0xcc, 0xbd, 0x67, 0xbd, 0x34, 0x3e, 0x54, 0xf5, 0xe8, 0x3d,
- 0x17, 0xff, 0xf8, 0xbc, 0x3d, 0xb0, 0x0c, 0x3d, 0x9b, 0xa3, 0x11, 0xbd,
- 0xf0, 0x59, 0x46, 0x3d, 0xa1, 0x2d, 0x98, 0x3c, 0x64, 0x31, 0x05, 0xbe,
- 0xc9, 0x5a, 0x67, 0xbd, 0xaf, 0xd4, 0x18, 0x3e, 0xcd, 0x3c, 0x2b, 0xbd,
- 0xef, 0xad, 0x21, 0xbd, 0xf3, 0xe2, 0x64, 0xbd, 0xbd, 0xdc, 0xc1, 0xbd,
- 0x8e, 0x5a, 0x04, 0xbe, 0x3b, 0x37, 0x8e, 0xbe, 0x5e, 0x29, 0x8b, 0x3d,
- 0xfe, 0xeb, 0x6e, 0xbd, 0x46, 0x2b, 0xd1, 0xbd, 0xf7, 0x0c, 0x77, 0xbe,
- 0x5b, 0xd6, 0x5c, 0x3c, 0xc3, 0x4f, 0x17, 0xbe, 0x39, 0x4c, 0x52, 0xbd,
- 0xa5, 0x5f, 0xd1, 0x3d, 0x93, 0x4b, 0xec, 0xbd, 0x43, 0x35, 0x28, 0x3e,
- 0x0c, 0xbd, 0xb4, 0xbc, 0xd8, 0x4f, 0xe6, 0x3d, 0x67, 0x83, 0x1e, 0xbe,
- 0xc6, 0x15, 0xf9, 0x3d, 0xa3, 0x40, 0x07, 0x3d, 0x0d, 0x7b, 0x3d, 0xbd,
- 0xbd, 0x21, 0x18, 0x3d, 0x51, 0x2e, 0xd6, 0xbe, 0x73, 0x52, 0x86, 0x3d,
- 0x43, 0x13, 0x06, 0xbe, 0x26, 0x3f, 0x53, 0xbc, 0x5b, 0x37, 0x62, 0xbd,
- 0x32, 0x5d, 0x14, 0xbd, 0x17, 0x33, 0x43, 0xbd, 0x99, 0xce, 0x14, 0xbe,
- 0xe2, 0xaf, 0x76, 0xba, 0xc3, 0x3b, 0x9e, 0xbd, 0x60, 0x4a, 0xab, 0x3d,
- 0x27, 0xbf, 0x3d, 0xbe, 0x7c, 0x0b, 0x22, 0x3d, 0xe0, 0x83, 0xc0, 0x3e,
- 0x1b, 0x89, 0x4f, 0x3d, 0xb4, 0xea, 0x79, 0xbc, 0x1b, 0xe0, 0x75, 0xbe,
- 0x3a, 0xde, 0xc0, 0xbd, 0xfd, 0x21, 0x07, 0xbe, 0x1c, 0x72, 0x04, 0x3e,
- 0xf7, 0x06, 0xda, 0x3d, 0xf0, 0x6a, 0x30, 0xbc, 0xbc, 0xf6, 0x4d, 0xbe,
- 0x62, 0x28, 0x7b, 0x3c, 0x54, 0x92, 0x58, 0xbd, 0xb6, 0x24, 0x2e, 0xbe,
- 0x4e, 0xdb, 0xce, 0xbc, 0x82, 0x40, 0x30, 0xbe, 0x8b, 0x12, 0x28, 0x3b,
- 0x5b, 0xe1, 0x9b, 0xbc, 0xfa, 0xd3, 0x55, 0xbc, 0x40, 0xd7, 0x5f, 0xbe,
- 0xd9, 0x74, 0x13, 0x3e, 0xb1, 0x3e, 0x93, 0xbd, 0x4c, 0x9c, 0x72, 0xbd,
- 0x09, 0x94, 0xd2, 0xbe, 0x52, 0xcf, 0xcf, 0xbd, 0x8d, 0x98, 0x4b, 0xbe,
- 0x38, 0x1f, 0x4b, 0xbe, 0xfc, 0xae, 0x78, 0x3c, 0x39, 0x08, 0xb5, 0xbe,
- 0xae, 0xce, 0x00, 0x3e, 0x1f, 0x63, 0x2f, 0xbe, 0xc1, 0x07, 0x80, 0x3d,
- 0xfd, 0xad, 0x76, 0x3c, 0x4a, 0xab, 0x70, 0x3d, 0xc0, 0x05, 0xc4, 0xbb,
- 0xd2, 0xd2, 0x06, 0x3d, 0x11, 0xd1, 0x17, 0x3e, 0x4f, 0xc7, 0x7f, 0xbe,
- 0xd3, 0x60, 0x27, 0xbe, 0x85, 0xe1, 0x6b, 0xbc, 0xc9, 0xd4, 0x87, 0x3c,
- 0x20, 0x50, 0x9a, 0xbc, 0x18, 0x58, 0x2f, 0xbd, 0x6e, 0x6f, 0xf7, 0x3d,
- 0x7c, 0xfe, 0xe3, 0xbb, 0x0f, 0x2f, 0x97, 0x3e, 0x47, 0x7e, 0xcd, 0xbe,
- 0xb7, 0x8a, 0x4f, 0x3d, 0x08, 0x47, 0x80, 0xbe, 0x9c, 0x0d, 0x16, 0xbe,
- 0xe0, 0x09, 0x66, 0xbd, 0xd1, 0xc3, 0x26, 0xbe, 0x19, 0xca, 0x3b, 0xbe,
- 0xf2, 0x9a, 0x84, 0xbc, 0x6b, 0xc3, 0xbb, 0xbd, 0x70, 0x4c, 0x6b, 0xbd,
- 0x57, 0x6d, 0x03, 0xbc, 0xe6, 0xa5, 0x80, 0x3d, 0xc8, 0x92, 0xa7, 0xbd,
- 0x43, 0x7f, 0x15, 0x3e, 0x9f, 0xc8, 0xac, 0x3d, 0xee, 0xce, 0x2c, 0xbe,
- 0x62, 0x4c, 0xf6, 0x3d, 0x43, 0x44, 0x09, 0x3e, 0xa2, 0x8d, 0x8b, 0xbe,
- 0xe5, 0x5c, 0xcc, 0xbd, 0x2e, 0x0e, 0x17, 0x3d, 0x70, 0x99, 0x65, 0xbd,
- 0xdb, 0x83, 0xd8, 0x3d, 0xac, 0xff, 0xc5, 0xbe, 0xbe, 0xbd, 0x11, 0xbe,
- 0xee, 0xa4, 0x73, 0xbe, 0xf2, 0x3f, 0x33, 0xbe, 0x49, 0xa3, 0x96, 0xbd,
- 0x8a, 0xa5, 0x67, 0xbd, 0x8b, 0x08, 0xf7, 0xbc, 0x6c, 0x0f, 0x98, 0x3d,
- 0x49, 0x42, 0x55, 0xbe, 0xe7, 0x90, 0xe1, 0x3d, 0x84, 0x9e, 0x1c, 0xbe,
- 0x03, 0x9f, 0xc0, 0x3c, 0x1a, 0x97, 0xb7, 0x3d, 0xe0, 0xc4, 0x77, 0x3e,
- 0xda, 0xf8, 0xe0, 0xbd, 0x3a, 0xe2, 0x1c, 0xbc, 0xce, 0xfb, 0x2e, 0xbd,
- 0x97, 0x0c, 0x3a, 0x3e, 0x86, 0x88, 0x2a, 0x3e, 0xa8, 0x73, 0x39, 0xbe,
- 0xe2, 0xa0, 0xed, 0xbd, 0x29, 0x08, 0xae, 0xbe, 0x56, 0xa1, 0xb9, 0xb9,
- 0xf7, 0x41, 0x3f, 0xbe, 0x70, 0xe8, 0x5e, 0x3e, 0x7e, 0x0f, 0x0c, 0xbc,
- 0x44, 0xc6, 0xbe, 0x3d, 0x81, 0x26, 0x83, 0x3d, 0xf8, 0xfc, 0xa7, 0xbd,
- 0x0c, 0xc3, 0xe3, 0xbb, 0x4c, 0x19, 0xd3, 0xbd, 0x8c, 0xc1, 0x72, 0xbd,
- 0x2a, 0x6f, 0x3a, 0x3e, 0x2b, 0x5a, 0x29, 0xbe, 0x38, 0xe5, 0x68, 0x3e,
- 0x84, 0xce, 0xe6, 0x3d, 0x3c, 0x78, 0x9e, 0x3d, 0x2a, 0x7f, 0x9d, 0xbe,
- 0xc4, 0xe6, 0xcc, 0xbd, 0xdc, 0xe2, 0x52, 0x3d, 0xb1, 0x70, 0xd2, 0xbd,
- 0x23, 0x7e, 0x6d, 0xbd, 0x0c, 0x93, 0x3c, 0x3d, 0x1a, 0x78, 0x23, 0x3e,
- 0x87, 0x4a, 0xc8, 0x3d, 0x61, 0x35, 0x2d, 0xbe, 0x18, 0xea, 0x08, 0xbe,
- 0x92, 0x77, 0xd3, 0x3d, 0xf6, 0x5d, 0xa4, 0x3d, 0xd3, 0xb5, 0xb6, 0x3d,
- 0x64, 0x51, 0xb7, 0xbd, 0x59, 0xe0, 0xe9, 0xbd, 0xf6, 0xd8, 0x21, 0x3e,
- 0x30, 0x74, 0x5e, 0x3f, 0x83, 0x8a, 0x2d, 0x3f, 0xb5, 0x22, 0x12, 0xbe,
- 0x52, 0x38, 0x15, 0x3f, 0x42, 0x83, 0x80, 0xbe, 0xca, 0x05, 0xac, 0xbe,
- 0xcb, 0xab, 0xf7, 0x3e, 0x95, 0x1f, 0xe1, 0x3e, 0x79, 0xe5, 0x15, 0xbe,
- 0x13, 0x79, 0x96, 0x3d, 0x68, 0x66, 0xbd, 0xbe, 0xae, 0xe5, 0x09, 0x3f,
- 0x2b, 0x4a, 0x0d, 0xbf, 0xdc, 0x21, 0x1f, 0xbd, 0x42, 0x5a, 0xc0, 0x3d,
- 0xb3, 0x98, 0x3f, 0x3e, 0x80, 0xe8, 0x55, 0x3e, 0xfc, 0x89, 0x8d, 0xbf,
- 0xc8, 0x80, 0x49, 0xbe, 0xd6, 0x9d, 0x96, 0x3c, 0x8a, 0x30, 0x2f, 0x3e,
- 0x49, 0xb8, 0x02, 0x3f, 0x26, 0xd6, 0x2a, 0xbe, 0xc6, 0x7f, 0xbb, 0x3e,
- 0x1d, 0xfa, 0x46, 0x3f, 0x95, 0x7c, 0x5f, 0x3e, 0x9d, 0x57, 0x06, 0x3e,
- 0xb1, 0x17, 0xa3, 0xbd, 0xc2, 0xec, 0x7e, 0xbd, 0x75, 0xa2, 0x23, 0xbe,
- 0x2d, 0x8a, 0x9a, 0xbd, 0xed, 0xee, 0x40, 0xbe, 0xcb, 0x59, 0x8e, 0xbd,
- 0x69, 0x60, 0xa2, 0x3e, 0xdf, 0xaa, 0x9c, 0x3e, 0x03, 0xbf, 0xc8, 0x3d,
- 0x95, 0x85, 0x8d, 0x3e, 0x9a, 0x53, 0xc8, 0xbe, 0x77, 0x8b, 0x30, 0x3f,
- 0x0f, 0x8b, 0x23, 0x3f, 0xd2, 0x4e, 0x27, 0xbe, 0x1a, 0x52, 0xeb, 0xbe,
- 0xb7, 0xfa, 0xfe, 0xbd, 0xbd, 0x64, 0xb2, 0xbe, 0x8a, 0xf3, 0x9a, 0x3e,
- 0x6f, 0xbf, 0x90, 0x3d, 0x41, 0xa3, 0x61, 0x3e, 0x3d, 0xb6, 0xf6, 0xbd,
- 0xdc, 0xd0, 0x46, 0xbe, 0x9c, 0xb9, 0x5b, 0xbe, 0x69, 0xa6, 0xa5, 0x3e,
- 0x64, 0x60, 0x90, 0x3d, 0x85, 0x10, 0x70, 0xbc, 0x5e, 0xc5, 0xb1, 0x3e,
- 0x09, 0x45, 0xcc, 0xbe, 0xf6, 0x84, 0xc0, 0x3d, 0x5d, 0x39, 0x48, 0x3f,
- 0xf4, 0xfb, 0xfa, 0x3d, 0x9f, 0xf1, 0xc2, 0xbd, 0x29, 0x00, 0x76, 0x3d,
- 0x7d, 0xbe, 0x8a, 0x3d, 0x67, 0x3d, 0x4e, 0xbc, 0x71, 0xf8, 0x16, 0xbe,
- 0x68, 0x47, 0xb5, 0xbc, 0x45, 0x7f, 0x34, 0xbd, 0x46, 0xf5, 0x42, 0xbe,
- 0xac, 0x3c, 0x7e, 0x3d, 0xdb, 0x72, 0xf1, 0x3d, 0x3e, 0x54, 0x30, 0xbc,
- 0xc3, 0x0c, 0xe2, 0xbe, 0xca, 0xb3, 0x10, 0xbe, 0x68, 0x31, 0x07, 0x3f,
- 0xb9, 0xa9, 0x89, 0xbc, 0x80, 0xa3, 0x8c, 0x3d, 0x38, 0x31, 0x1b, 0x3f,
- 0x92, 0xd4, 0x03, 0xbe, 0x9a, 0x83, 0x02, 0x3f, 0x89, 0x50, 0x0d, 0xbd,
- 0x59, 0xa3, 0x01, 0xbe, 0xe3, 0x3f, 0xbe, 0x3e, 0x43, 0x72, 0x88, 0x3e,
- 0x25, 0x8f, 0x29, 0x3e, 0xbd, 0x37, 0xf2, 0xbc, 0xa5, 0x0a, 0x1b, 0x3e,
- 0x46, 0xd2, 0xd4, 0xbe, 0xbe, 0x5f, 0x04, 0xbc, 0x81, 0xf6, 0x72, 0x3e,
- 0x2e, 0x96, 0x30, 0x3f, 0x8b, 0xc0, 0x5b, 0x3c, 0xff, 0x42, 0xd7, 0x3d,
- 0x24, 0x57, 0x13, 0xbe, 0x50, 0xb1, 0xaf, 0x3e, 0x5e, 0xd6, 0xac, 0x3e,
- 0x48, 0x0c, 0xaa, 0x3e, 0x3f, 0x69, 0x94, 0x3d, 0x40, 0x9d, 0x00, 0xbe,
- 0x63, 0x51, 0x2f, 0xbf, 0x1f, 0xd2, 0x5d, 0xbd, 0x2a, 0xba, 0x1c, 0x3e,
- 0xff, 0x87, 0x5f, 0x3e, 0x2a, 0x51, 0x46, 0x3e, 0xce, 0x00, 0x84, 0x3e,
- 0xcb, 0x36, 0x1b, 0xbe, 0x8a, 0x36, 0x30, 0x3e, 0xae, 0xf5, 0xca, 0xbd,
- 0x5f, 0x74, 0xb9, 0x3d, 0x47, 0x3d, 0xa6, 0x3b, 0xf8, 0x6c, 0xef, 0xbd,
- 0x67, 0x86, 0xd1, 0x3d, 0xb4, 0xbd, 0x3f, 0x3c, 0x1b, 0x38, 0x4a, 0x3e,
- 0x7a, 0x91, 0x22, 0xbe, 0x9a, 0xc7, 0x33, 0x3d, 0x3f, 0xa8, 0x42, 0xbd,
- 0xda, 0x60, 0xaa, 0xbc, 0x70, 0x4c, 0x2d, 0x3b, 0xd9, 0x24, 0xd3, 0x3d,
- 0x1f, 0x12, 0x0e, 0xbd, 0x4c, 0x14, 0x8d, 0xbc, 0xad, 0x77, 0x55, 0x3c,
- 0x2d, 0x86, 0xc4, 0x3d, 0xd5, 0x7c, 0x45, 0x3c, 0x90, 0x40, 0x45, 0x3b,
- 0x04, 0x22, 0xe5, 0xbc, 0x46, 0x5c, 0x16, 0xbd, 0x90, 0xda, 0x1d, 0x3e,
- 0xf8, 0x26, 0xb0, 0xbd, 0x89, 0xd1, 0x8e, 0xbd, 0x21, 0x12, 0x17, 0x3d,
- 0xb6, 0x0f, 0x87, 0x3d, 0x54, 0x0c, 0xa2, 0x3d, 0x38, 0x5f, 0x74, 0x3c,
- 0xe7, 0xf2, 0x9d, 0xbd, 0xde, 0xec, 0xe8, 0xbd, 0xbb, 0x8a, 0x70, 0xbe,
- 0xd8, 0xd2, 0xe9, 0x3c, 0x04, 0x21, 0xd1, 0x3a, 0xcb, 0x22, 0xbe, 0xbd,
- 0x47, 0xff, 0x6a, 0x3d, 0xd0, 0x60, 0xbd, 0x3c, 0x54, 0x28, 0x2d, 0xbd,
- 0x26, 0x3b, 0xcf, 0xbe, 0xf7, 0x04, 0xef, 0xbd, 0x2b, 0xe3, 0xca, 0xbd,
- 0x57, 0xb6, 0x08, 0xbd, 0xf8, 0x67, 0x4a, 0x3d, 0x74, 0x9b, 0x43, 0xbe,
- 0xae, 0x2a, 0x43, 0x3c, 0x32, 0xab, 0x4b, 0xbd, 0xde, 0x4c, 0x7d, 0x3c,
- 0x06, 0x29, 0x25, 0xbc, 0x93, 0x38, 0x89, 0xbd, 0x02, 0x8a, 0xdd, 0x3c,
- 0x2d, 0xb3, 0x2e, 0xbe, 0xa1, 0x66, 0x93, 0xbe, 0xd7, 0x10, 0x1c, 0xbd,
- 0xba, 0xb2, 0xf8, 0xbc, 0xd2, 0x4a, 0xa2, 0x3b, 0x17, 0x66, 0xf3, 0x3c,
- 0x4f, 0x59, 0x03, 0xbe, 0x84, 0x0a, 0xe8, 0x3c, 0x4c, 0xb3, 0x9e, 0xbd,
- 0x6f, 0x6d, 0xbd, 0xbb, 0x1a, 0xf9, 0x07, 0x3d, 0x52, 0xcc, 0xd2, 0xbe,
- 0x02, 0x72, 0xec, 0xbd, 0xfd, 0x72, 0x33, 0xbf, 0x2d, 0xfa, 0x1e, 0xbd,
- 0x04, 0xa6, 0x6b, 0xbd, 0xb2, 0x9f, 0x21, 0x3e, 0xa1, 0xf3, 0xe5, 0xbc,
- 0xe8, 0xa0, 0x05, 0xbd, 0xe4, 0xb0, 0x49, 0xbe, 0x61, 0xfd, 0xf6, 0xbb,
- 0x0c, 0xe6, 0xd7, 0x3d, 0xec, 0x74, 0xc6, 0x3d, 0x43, 0x91, 0xd9, 0x3d,
- 0xfc, 0x4a, 0x41, 0x3d, 0x2e, 0x07, 0x1b, 0x3e, 0x05, 0x29, 0x1a, 0xbe,
- 0x46, 0x8c, 0x8d, 0x3d, 0xc4, 0x9f, 0x25, 0xbe, 0xec, 0x37, 0x21, 0xbe,
- 0x15, 0x59, 0xa3, 0x3d, 0x22, 0x9b, 0xc2, 0x3d, 0x76, 0xfb, 0x1b, 0xbe,
- 0xa5, 0xf4, 0x43, 0xbc, 0x53, 0x7d, 0x89, 0xbd, 0xbe, 0xc5, 0x67, 0x3d,
- 0xd9, 0xef, 0x43, 0x3e, 0x9d, 0x20, 0xe9, 0xbd, 0x4b, 0x47, 0xdc, 0x3d,
- 0x25, 0x40, 0x06, 0xbe, 0xb8, 0x12, 0xd3, 0x3d, 0xea, 0xcb, 0x8a, 0xbd,
- 0xe3, 0x3f, 0x05, 0xbc, 0x45, 0x77, 0xe7, 0xbb, 0x16, 0x4d, 0xa8, 0xbd,
- 0xb1, 0x89, 0x6a, 0x3c, 0xea, 0xf3, 0xdb, 0x3a, 0x82, 0x2d, 0x5b, 0xbe,
- 0x61, 0xb6, 0x74, 0xbd, 0x6b, 0xec, 0x80, 0x3e, 0xb3, 0xdf, 0x7e, 0x3d,
- 0xa6, 0x6a, 0x6c, 0xbe, 0xd6, 0x03, 0xd9, 0x3d, 0x84, 0xff, 0x04, 0xbe,
- 0x5a, 0x8f, 0x2f, 0x3e, 0x51, 0xa6, 0x85, 0x3d, 0x55, 0x44, 0x01, 0xbf,
- 0xd2, 0x27, 0x4c, 0x3f, 0xf6, 0x10, 0x3a, 0x3f, 0x93, 0xbf, 0x92, 0xba,
- 0x2c, 0xaf, 0xed, 0x3d, 0xd0, 0x26, 0x44, 0xbe, 0x93, 0x90, 0xdd, 0xbe,
- 0x90, 0x70, 0x35, 0x3f, 0xa8, 0xdd, 0xb9, 0xbc, 0xf6, 0x68, 0x75, 0x3c,
- 0x73, 0x28, 0xd9, 0x3e, 0x26, 0x58, 0xd8, 0xbd, 0x89, 0xa5, 0x0a, 0xbf,
- 0xb4, 0xf6, 0xee, 0xbe, 0x12, 0x8d, 0x0f, 0xbf, 0x32, 0x06, 0x33, 0xbf,
- 0xb9, 0x6e, 0xcf, 0xbe, 0x76, 0xf1, 0x43, 0xbe, 0x4f, 0x3b, 0xb6, 0x3d,
- 0x08, 0xb9, 0xed, 0x3e, 0x14, 0x3e, 0xaa, 0xbe, 0x5f, 0x4b, 0xab, 0xbe,
- 0x25, 0xed, 0xa3, 0xbd, 0x13, 0x44, 0xf0, 0x3e, 0x52, 0x7f, 0x29, 0xbe,
- 0x2b, 0x2f, 0x25, 0xbd, 0x45, 0xf8, 0x57, 0xbe, 0xfa, 0x4b, 0xc4, 0x3d,
- 0x8c, 0x08, 0x3a, 0xbd, 0xea, 0x98, 0xcf, 0x3c, 0x75, 0xa3, 0x3e, 0xbe,
- 0xe5, 0xd0, 0x3c, 0x3f, 0xcf, 0xd5, 0x9e, 0xbe, 0x90, 0x75, 0x9a, 0x3e,
- 0x4f, 0xb4, 0x27, 0xbf, 0x20, 0x33, 0x41, 0x3c, 0xdc, 0xd1, 0x81, 0xbd,
- 0xa1, 0x2e, 0x6f, 0xbd, 0x35, 0x14, 0x02, 0x3f, 0xb1, 0x75, 0x96, 0x3d,
- 0xde, 0x06, 0xa0, 0xbe, 0x68, 0xbc, 0x9c, 0xbf, 0xe8, 0x29, 0x8d, 0xbf,
- 0x55, 0x9d, 0x12, 0xbf, 0xa1, 0x92, 0x1d, 0x3e, 0x94, 0x6a, 0x01, 0x3e,
- 0x6b, 0x94, 0x86, 0xbe, 0xd9, 0xe2, 0xdc, 0xbe, 0x89, 0xf2, 0x53, 0xbf,
- 0x92, 0xbd, 0x3e, 0x3f, 0x85, 0x53, 0x30, 0x3e, 0x3b, 0x2f, 0x54, 0x3d,
- 0xb0, 0xb4, 0xd8, 0xbc, 0xfa, 0x7c, 0xa8, 0xbe, 0xea, 0xff, 0x0c, 0xbd,
- 0xcd, 0x64, 0x86, 0xbd, 0x11, 0x86, 0x05, 0xbd, 0xee, 0x17, 0xb4, 0xbd,
- 0x3e, 0x99, 0x1a, 0x3e, 0xa6, 0x14, 0xbb, 0xbe, 0xd3, 0x22, 0xa9, 0x3e,
- 0x4a, 0x8f, 0x10, 0x3e, 0xa8, 0xf1, 0xcb, 0x3d, 0xea, 0x26, 0xe1, 0x3c,
- 0x94, 0x3a, 0xe8, 0x3d, 0xba, 0x31, 0xa7, 0xbe, 0x54, 0x17, 0xbd, 0xbd,
- 0xb2, 0x05, 0x03, 0xbd, 0x86, 0x04, 0xb2, 0x3e, 0x31, 0x1e, 0xf1, 0x3e,
- 0x7b, 0x69, 0xcc, 0xbd, 0x2c, 0x91, 0x50, 0x3e, 0x2f, 0xf1, 0x8b, 0xbe,
- 0xa8, 0xc8, 0x5c, 0xbe, 0x93, 0x99, 0xcc, 0x3e, 0x7c, 0x79, 0x55, 0x3f,
- 0xf5, 0x9f, 0x20, 0x3f, 0xd2, 0x3b, 0x5e, 0x3d, 0xe2, 0xfd, 0xa0, 0x3c,
- 0x3e, 0x43, 0x0c, 0x3e, 0xbb, 0x0f, 0x84, 0x3d, 0x19, 0xf5, 0x90, 0x3d,
- 0xbd, 0xef, 0x90, 0x3e, 0x1f, 0x7b, 0xf9, 0xbc, 0x34, 0xfa, 0x12, 0x3e,
- 0x04, 0x8d, 0x12, 0xbe, 0xd4, 0x58, 0x85, 0xbd, 0x0b, 0x84, 0xc9, 0x3e,
- 0x4c, 0x72, 0x61, 0xbe, 0x4a, 0x29, 0x30, 0xbe, 0x3f, 0x82, 0xeb, 0xbd,
- 0x65, 0xc1, 0x80, 0x3f, 0x66, 0x68, 0x56, 0x3f, 0x2a, 0xbe, 0xd4, 0x3e,
- 0xe5, 0x42, 0x6e, 0xbd, 0x65, 0x09, 0xdb, 0x3e, 0xdd, 0x9e, 0xfd, 0x3e,
- 0xb8, 0x9b, 0x26, 0xbc, 0x32, 0x48, 0x11, 0x3d, 0x60, 0x2a, 0xc4, 0xbd,
- 0x90, 0xad, 0x23, 0x3d, 0xe6, 0x88, 0x47, 0xbe, 0x9c, 0x77, 0x66, 0xbe,
- 0xe6, 0x48, 0x3b, 0xbe, 0xc3, 0x6c, 0x2d, 0xbd, 0x7f, 0x36, 0xe4, 0x3d,
- 0x65, 0x4f, 0xcf, 0xbd, 0x94, 0x0a, 0xb7, 0x3d, 0x95, 0x77, 0x12, 0x3e,
- 0x64, 0x41, 0x06, 0x3d, 0xa6, 0x41, 0x84, 0x3e, 0xf7, 0x6f, 0x36, 0xbd,
- 0x8a, 0xd6, 0x4f, 0xbd, 0xf6, 0x9a, 0x92, 0xbd, 0xfe, 0xe8, 0x1e, 0x3e,
- 0xa7, 0x0d, 0x0c, 0xbe, 0x9a, 0xa0, 0x5e, 0x3e, 0x4a, 0xd1, 0x21, 0x3e,
- 0x9e, 0x69, 0x10, 0x3d, 0xb4, 0x51, 0xef, 0xbd, 0x20, 0xe6, 0x5d, 0x3d,
- 0xe7, 0xb9, 0x00, 0xbd, 0xb1, 0xd4, 0x3d, 0x3e, 0xa0, 0x6c, 0x9b, 0x3b,
- 0x49, 0xca, 0x16, 0x3e, 0xd9, 0x65, 0x1f, 0x3d, 0x76, 0x35, 0x2c, 0xbe,
- 0x9d, 0x30, 0xf6, 0x3d, 0x2e, 0xc5, 0x5e, 0xbe, 0xee, 0xfe, 0x30, 0x3d,
- 0xf5, 0x53, 0xeb, 0xbd, 0xeb, 0x9d, 0x8d, 0xbe, 0x49, 0x57, 0xf4, 0xbc,
- 0xb3, 0x25, 0xc5, 0xbd, 0x3d, 0x34, 0x74, 0x3e, 0x82, 0xde, 0xc8, 0xbd,
- 0x71, 0x6f, 0x78, 0x3d, 0x0c, 0xd5, 0x82, 0xbd, 0x9b, 0x73, 0x89, 0xbe,
- 0x0f, 0x40, 0x92, 0xbc, 0xe7, 0x87, 0x47, 0x3e, 0x7a, 0x9a, 0x1a, 0xbe,
- 0x30, 0xf8, 0x10, 0x3e, 0x50, 0x2e, 0xcd, 0x3b, 0x32, 0xf8, 0xe6, 0x3d,
- 0xf0, 0x40, 0x3c, 0x3d, 0x80, 0x05, 0x32, 0xbc, 0xcf, 0xf8, 0xfc, 0xbe,
- 0xe1, 0x84, 0xe4, 0xbc, 0xb1, 0x77, 0x46, 0xbe, 0xa3, 0x38, 0x60, 0xbd,
- 0x88, 0x27, 0xa1, 0xbd, 0x1b, 0xbb, 0xbd, 0xbb, 0x18, 0xec, 0x20, 0xbe,
- 0x57, 0xb7, 0x17, 0x3c, 0xaa, 0x3a, 0xe8, 0xbd, 0xa8, 0xff, 0xa4, 0x3b,
- 0x8b, 0x87, 0x16, 0x3d, 0x2a, 0xd8, 0x98, 0xbd, 0xbd, 0x86, 0x96, 0x3d,
- 0x15, 0x1b, 0x1c, 0x3e, 0x49, 0x4f, 0x68, 0xbd, 0x3a, 0x87, 0x62, 0xbe,
- 0x0e, 0x9a, 0xa6, 0x3e, 0x72, 0xba, 0xfb, 0x3d, 0xe2, 0x6b, 0xd6, 0xbe,
- 0xcf, 0xf0, 0x1d, 0x3e, 0xf2, 0x81, 0xa5, 0xbd, 0xe0, 0xfd, 0x37, 0x3e,
- 0x05, 0x50, 0xb0, 0x3d, 0xa1, 0x07, 0x2b, 0xbc, 0x06, 0xef, 0xf4, 0xbc,
- 0xcb, 0x38, 0xd8, 0x3d, 0xbd, 0x6a, 0x47, 0xbd, 0x7f, 0xd4, 0x96, 0xbd,
- 0x42, 0x04, 0xcb, 0xbd, 0x77, 0xca, 0xa7, 0xbb, 0x95, 0xa3, 0x57, 0xbe,
- 0xf5, 0x73, 0x54, 0xbe, 0x37, 0x87, 0x9a, 0x3d, 0xdc, 0xbb, 0x2a, 0x3d,
- 0x5d, 0x14, 0x96, 0x3d, 0x92, 0x59, 0x0a, 0x3d, 0x39, 0x19, 0xc8, 0xbe,
- 0x70, 0x16, 0x4d, 0x3d, 0x7a, 0xcc, 0x0b, 0x3e, 0x09, 0x4a, 0x53, 0xbd,
- 0x21, 0x07, 0xd7, 0xbd, 0x5c, 0x23, 0x48, 0x3d, 0x69, 0x75, 0x70, 0xbd,
- 0xd4, 0x62, 0xb5, 0xbd, 0x4f, 0x81, 0x4b, 0x3e, 0xc0, 0xda, 0x7f, 0xbd,
- 0x74, 0x1f, 0xe3, 0xbb, 0x3a, 0x37, 0xbe, 0xbe, 0x04, 0x21, 0x0a, 0xbc,
- 0x72, 0xee, 0xdc, 0x3c, 0x2f, 0x25, 0x17, 0xbe, 0xd1, 0x1d, 0x35, 0xbe,
- 0xff, 0xd2, 0x42, 0x3e, 0x35, 0xe1, 0x63, 0xbe, 0x26, 0x22, 0x27, 0xbd,
- 0x27, 0xec, 0x57, 0xbe, 0x00, 0xd3, 0x1a, 0x3d, 0xab, 0x30, 0x0e, 0xbe,
- 0xa9, 0x6e, 0x4e, 0xbe, 0xc8, 0xa7, 0x5d, 0xbd, 0xb1, 0xb3, 0x93, 0xbe,
- 0x46, 0x37, 0xa3, 0xbc, 0x5f, 0x19, 0xcf, 0xbd, 0x4f, 0xc0, 0xb5, 0xbd,
- 0xed, 0x8d, 0x79, 0x3d, 0xeb, 0x75, 0x87, 0xbe, 0x17, 0xa7, 0xf2, 0xbd,
- 0x9f, 0xc6, 0x6d, 0xbc, 0x49, 0xe9, 0x65, 0x3e, 0x82, 0x16, 0x6f, 0xbe,
- 0x24, 0x61, 0x02, 0xbe, 0xd4, 0x79, 0xb8, 0x3c, 0x6e, 0xe1, 0x52, 0x3d,
- 0x46, 0x96, 0xcb, 0xbc, 0x63, 0xd2, 0x2d, 0xbe, 0x80, 0xb0, 0xb7, 0x3d,
- 0x4f, 0x96, 0x6c, 0xbd, 0x7d, 0x66, 0x23, 0x3e, 0x91, 0xeb, 0x1b, 0xbe,
- 0x04, 0x04, 0xf3, 0xbc, 0x73, 0x75, 0x7c, 0xbe, 0x81, 0xd7, 0x08, 0x3e,
- 0x02, 0x05, 0x58, 0x3d, 0x64, 0x1f, 0x58, 0xbe, 0x24, 0x68, 0x72, 0x3e,
- 0xc1, 0x71, 0x97, 0xbc, 0x3b, 0x38, 0xa6, 0xbd, 0x3c, 0x11, 0xcf, 0xbd,
- 0x1c, 0xfa, 0xf6, 0x3d, 0x2e, 0x9d, 0xa0, 0x3c, 0x17, 0x31, 0xb1, 0xbd,
- 0x08, 0xcd, 0x08, 0xbd, 0x27, 0x6e, 0x06, 0xbd, 0x23, 0x13, 0xbb, 0xbd,
- 0x43, 0xa7, 0x24, 0x3e, 0x57, 0x1a, 0xf5, 0xbd, 0xe5, 0x22, 0xc2, 0x3d,
- 0x38, 0x51, 0x05, 0x3e, 0x6f, 0x2e, 0xee, 0x3d, 0xe6, 0x3a, 0xae, 0xbd,
- 0xcb, 0x23, 0x30, 0xba, 0x29, 0x69, 0xcb, 0xbe, 0x19, 0x3f, 0x37, 0xbe,
- 0x7f, 0x5c, 0x4e, 0xbe, 0xd3, 0x04, 0x56, 0xbe, 0x87, 0xbd, 0xb9, 0x3c,
- 0xc9, 0x3d, 0x56, 0x3d, 0x7d, 0x13, 0x4c, 0x3e, 0xc4, 0x1b, 0xc9, 0x3d,
- 0x89, 0x3a, 0x2f, 0xbe, 0x36, 0xd8, 0x0e, 0x3e, 0x6d, 0xbe, 0x06, 0xbe,
- 0xd6, 0x05, 0xd9, 0x3d, 0xe0, 0x1c, 0xd6, 0x3d, 0xc8, 0x2a, 0x21, 0x3e,
- 0xbc, 0x0f, 0xa6, 0xbd, 0x4c, 0xd3, 0x19, 0x3e, 0xb9, 0x29, 0xee, 0x3b,
- 0x0f, 0x0b, 0x03, 0x3f, 0x6f, 0x10, 0x52, 0xbd, 0x94, 0x00, 0x1c, 0xbf,
- 0x92, 0xc8, 0xc3, 0xbd, 0x6b, 0x7d, 0xbb, 0xbd, 0x53, 0x49, 0x0a, 0xbe,
- 0x0d, 0x44, 0x20, 0x3d, 0x3f, 0x43, 0x42, 0xbd, 0xef, 0x9c, 0x37, 0xbd,
- 0xad, 0xda, 0x2d, 0xbc, 0x81, 0xd4, 0x1c, 0x3e, 0x05, 0x55, 0xff, 0xbc,
- 0xd9, 0x04, 0x34, 0xbd, 0xc8, 0xc1, 0x4b, 0x3c, 0xcf, 0xa2, 0x30, 0xbd,
- 0xf1, 0xde, 0xe9, 0x3d, 0x63, 0x63, 0x61, 0x3d, 0xff, 0x4c, 0x19, 0x3d,
- 0xd2, 0x32, 0xa8, 0x3d, 0x75, 0x57, 0xb9, 0x3b, 0xf3, 0x20, 0xdc, 0xbe,
- 0x72, 0xfb, 0x09, 0x3c, 0x55, 0xc4, 0xaa, 0xbc, 0x14, 0x6b, 0x35, 0xbe,
- 0x5d, 0xe2, 0xeb, 0x3d, 0x53, 0x5b, 0xfd, 0x3d, 0xdb, 0xe5, 0xd8, 0xbd,
- 0xb8, 0x32, 0x29, 0xbd, 0x68, 0x89, 0x9f, 0x3d, 0xc2, 0x9a, 0xf8, 0xbd,
- 0x7f, 0x38, 0x50, 0x3d, 0xcc, 0x2b, 0x99, 0x3d, 0x29, 0x24, 0x4f, 0xbe,
- 0xc5, 0x2a, 0xc1, 0x3d, 0x40, 0xb5, 0x79, 0x3c, 0xa8, 0x15, 0xbd, 0x3d,
- 0x76, 0x84, 0x5b, 0x3f, 0x9e, 0x3d, 0x1e, 0x3e, 0xa5, 0xb9, 0x68, 0xbd,
- 0x8f, 0x3a, 0x95, 0xbd, 0xa4, 0xfe, 0x26, 0x3e, 0x3e, 0x63, 0xd5, 0x3c,
- 0xf0, 0xb7, 0xa1, 0xbe, 0x27, 0x5b, 0x35, 0xbe, 0x15, 0xae, 0x4a, 0x3e,
- 0x2e, 0x83, 0xc2, 0xbd, 0xe7, 0x42, 0x24, 0x3e, 0xcf, 0x17, 0x28, 0x3f,
- 0xd0, 0x1a, 0x41, 0xbf, 0xca, 0x2e, 0xc3, 0x3e, 0x3d, 0x44, 0x09, 0xbe,
- 0xa6, 0x5d, 0x1c, 0xbf, 0x41, 0xe9, 0x02, 0xbf, 0xf0, 0x9f, 0x11, 0x3e,
- 0xa1, 0x1c, 0x34, 0x3d, 0xb0, 0xae, 0x7b, 0xbf, 0x28, 0xd2, 0x74, 0xbe,
- 0x4a, 0xce, 0x76, 0x3e, 0x5d, 0xae, 0x2d, 0xbd, 0xdd, 0xae, 0xfe, 0x3e,
- 0xd9, 0x85, 0x5e, 0x3f, 0x2d, 0x28, 0x5a, 0x3e, 0x5f, 0xf3, 0x88, 0x3e,
- 0x3e, 0x79, 0x24, 0xbe, 0x13, 0x91, 0x88, 0xbd, 0xfa, 0x25, 0xe0, 0xbe,
- 0x9d, 0x2f, 0x92, 0x3c, 0x06, 0x57, 0xf0, 0xbd, 0xf5, 0xb0, 0xdf, 0x3e,
- 0xfb, 0x03, 0x36, 0x3e, 0x52, 0xc3, 0xab, 0x3e, 0xa5, 0xe6, 0x99, 0x3b,
- 0x2a, 0x2a, 0x07, 0x3e, 0x07, 0xa0, 0x97, 0xbe, 0x28, 0x32, 0x0c, 0x3e,
- 0xac, 0xbf, 0xef, 0x3e, 0x27, 0x39, 0xab, 0x3d, 0xb4, 0x43, 0xd8, 0xbd,
- 0x8d, 0xd8, 0x81, 0xbf, 0xf9, 0xef, 0x9b, 0x3d, 0xde, 0x1e, 0xee, 0x3e,
- 0xb9, 0x87, 0x3c, 0xbe, 0x52, 0x96, 0x40, 0xbd, 0x62, 0x1b, 0x0d, 0x3f,
- 0x93, 0x22, 0x3c, 0xbf, 0xeb, 0x83, 0xef, 0x3d, 0x58, 0xce, 0xb4, 0x3e,
- 0xaa, 0x85, 0x8c, 0x3d, 0xbf, 0x24, 0xa0, 0xbe, 0xa7, 0x24, 0xaf, 0x3e,
- 0x18, 0xf6, 0x2c, 0xbe, 0xf3, 0x5a, 0xed, 0xbe, 0x09, 0x3c, 0x1e, 0x3f,
- 0x47, 0xdb, 0x00, 0xbd, 0xf4, 0x5e, 0xc0, 0xbe, 0xcc, 0x16, 0x02, 0xbe,
- 0x2c, 0x91, 0xaf, 0x3e, 0x8a, 0x7a, 0xb3, 0xbd, 0x8c, 0x90, 0x25, 0x3f,
- 0xf6, 0x2b, 0xb4, 0xbc, 0x55, 0x7c, 0x7a, 0xbe, 0xa7, 0xfb, 0x8c, 0x3e,
- 0xf1, 0x9f, 0xd4, 0xbe, 0x03, 0x7c, 0x9b, 0xbe, 0x7b, 0xa1, 0x19, 0xbe,
- 0x1b, 0x70, 0x3a, 0x3e, 0xbe, 0xfb, 0x2d, 0xbe, 0xb9, 0x2e, 0xcc, 0x3d,
- 0x19, 0x1e, 0x6c, 0xbe, 0x26, 0xad, 0x03, 0xbd, 0x75, 0x71, 0xf9, 0x3e,
- 0x8b, 0xae, 0x7c, 0xbd, 0x7b, 0x31, 0xd0, 0x3e, 0xb1, 0xb2, 0x90, 0x3d,
- 0xa8, 0x72, 0x19, 0xbe, 0xff, 0x3a, 0x9e, 0x3e, 0x2b, 0x2f, 0xd2, 0xbe,
- 0xa9, 0x6d, 0x02, 0x3f, 0x09, 0xb1, 0xd9, 0xbd, 0xd7, 0xc2, 0xb0, 0xbe,
- 0x53, 0x1e, 0x7d, 0xbf, 0x3d, 0xc6, 0x41, 0xbe, 0x68, 0x0b, 0xfb, 0x3e,
- 0x06, 0xd1, 0x43, 0x3f, 0xfa, 0x35, 0xe9, 0xbd, 0x01, 0xa7, 0xa8, 0x3e,
- 0xc9, 0x3f, 0xf7, 0x3d, 0x7b, 0xd6, 0xd0, 0xbe, 0x0c, 0x2a, 0x92, 0x3d,
- 0x41, 0xbd, 0x05, 0x3d, 0xc2, 0xdd, 0xfc, 0xbe, 0xbc, 0x5a, 0x92, 0xbd,
- 0xe6, 0x9f, 0x09, 0x3e, 0x47, 0x13, 0x2e, 0x3e, 0xbc, 0xb8, 0x84, 0xbd,
- 0x67, 0x56, 0x23, 0x3d, 0xe6, 0xb7, 0x97, 0x3e, 0xe0, 0x70, 0x05, 0x3e,
- 0x3f, 0x32, 0x15, 0xbe, 0xc5, 0x19, 0x89, 0xbc, 0x9d, 0x62, 0x31, 0x3d,
- 0xba, 0x88, 0xc1, 0x3b, 0x06, 0xcd, 0xb3, 0x3c, 0x9f, 0x07, 0xa4, 0xbd,
- 0x95, 0xf7, 0x05, 0x3e, 0x61, 0xed, 0x14, 0x3d, 0x0c, 0x69, 0x1d, 0x3e,
- 0x50, 0xda, 0xb0, 0x3c, 0xa3, 0xf1, 0x62, 0xbb, 0x1a, 0x12, 0xf9, 0xbb,
- 0x14, 0xea, 0x2b, 0xbd, 0x0a, 0x94, 0x8e, 0xbc, 0x60, 0xa4, 0x01, 0x3d,
- 0x97, 0x4b, 0xaa, 0x3c, 0x8a, 0x05, 0x62, 0x3c, 0x24, 0x24, 0x5f, 0x3d,
- 0xce, 0xa3, 0x88, 0x3e, 0xa1, 0xbd, 0x3b, 0xbd, 0x62, 0xbe, 0x55, 0xbd,
- 0xa0, 0xb8, 0x4b, 0x3d, 0x6b, 0xa4, 0x59, 0x3d, 0x74, 0x49, 0xaa, 0xbd,
- 0xd6, 0x13, 0x5e, 0x3d, 0xd1, 0xaa, 0x4b, 0xbd, 0xe6, 0xc1, 0x54, 0x3d,
- 0xef, 0xe6, 0x99, 0xbb, 0xce, 0xaf, 0xb9, 0x3d, 0x16, 0xad, 0x15, 0xbd,
- 0x89, 0x42, 0x82, 0x3c, 0x25, 0x81, 0x05, 0xbe, 0x8e, 0x32, 0x7b, 0xbe,
- 0x85, 0xa5, 0x73, 0x3c, 0xff, 0x45, 0xdc, 0xbd, 0xc6, 0x9c, 0xcb, 0xbd,
- 0x76, 0xd0, 0x87, 0xbc, 0x0e, 0x72, 0x6c, 0xbd, 0x9b, 0xb9, 0xc0, 0x3b,
- 0xcd, 0xe3, 0xd3, 0xbe, 0xfa, 0x25, 0x5a, 0x3c, 0x43, 0xf9, 0x74, 0xbe,
- 0xc6, 0x0e, 0x89, 0x3b, 0xa5, 0xa5, 0xb2, 0xbd, 0x34, 0xf5, 0x40, 0xbe,
- 0x6c, 0xf5, 0x08, 0xbe, 0x26, 0xd1, 0xfc, 0xbd, 0x28, 0x04, 0x74, 0x3b,
- 0x27, 0xd0, 0x13, 0xbd, 0xb1, 0xda, 0x0f, 0xbe, 0x5b, 0x47, 0xc1, 0xbd,
- 0x03, 0xd4, 0xb2, 0xbd, 0x0b, 0x27, 0x9d, 0xbe, 0x40, 0x5d, 0x1d, 0xba,
- 0x74, 0xc4, 0xd5, 0xbc, 0xf2, 0x73, 0xd7, 0x3c, 0xd0, 0x08, 0x82, 0x3d,
- 0x62, 0x4b, 0x40, 0x3c, 0xc5, 0xb6, 0x49, 0x3d, 0xf2, 0xcc, 0x26, 0xbe,
- 0x02, 0x55, 0x4d, 0xbe, 0xd1, 0xa1, 0x97, 0x3c, 0x57, 0x5c, 0x80, 0xbe,
- 0x81, 0xad, 0xba, 0xbd, 0xf8, 0x9a, 0x06, 0xbf, 0xfe, 0x5b, 0xbc, 0xbb,
- 0x20, 0x1b, 0x4b, 0x3e, 0x65, 0xcb, 0x77, 0x3e, 0x55, 0x3e, 0xff, 0xbe,
- 0x4b, 0x58, 0xf8, 0xbc, 0xef, 0x52, 0xe1, 0xbd, 0xb1, 0x58, 0x82, 0xbd,
- 0xd9, 0xff, 0xeb, 0x3d, 0xf1, 0x13, 0x8f, 0x3c, 0xed, 0x35, 0xde, 0x3c,
- 0xa3, 0x9d, 0x12, 0xbe, 0x44, 0x46, 0x0c, 0x3e, 0x14, 0x9c, 0xaf, 0xbe,
- 0x8e, 0x66, 0x1f, 0xbe, 0x8a, 0x30, 0x0e, 0xbe, 0x53, 0xab, 0xc2, 0x3c,
- 0x80, 0x25, 0x65, 0x3d, 0xe7, 0xa2, 0x7b, 0x3d, 0xfd, 0x79, 0xef, 0xbd,
- 0x9b, 0x49, 0x9a, 0xbd, 0xcd, 0xfc, 0xed, 0x3a, 0x38, 0x63, 0xdb, 0xbd,
- 0x01, 0xad, 0x5c, 0x3d, 0x8a, 0xaf, 0xa7, 0xbd, 0xac, 0x2d, 0x34, 0xbe,
- 0x32, 0xc3, 0xa1, 0x3c, 0xdc, 0xc6, 0x61, 0x3d, 0xd6, 0x14, 0xdf, 0x3d,
- 0x75, 0xbf, 0x26, 0x3d, 0x13, 0x09, 0x40, 0x3e, 0x67, 0xb6, 0xd5, 0x3d,
- 0xb1, 0x13, 0xb9, 0x3d, 0x3a, 0x0e, 0xc4, 0x3d, 0x01, 0xdd, 0x87, 0xbe,
- 0x66, 0x30, 0xc6, 0xbc, 0xbd, 0x4d, 0x2c, 0xbd, 0xf7, 0x92, 0x29, 0xbc,
- 0x5c, 0xc1, 0x51, 0xbe, 0x41, 0x12, 0xd3, 0xbd, 0x22, 0x20, 0x97, 0xbd,
- 0x5c, 0x6e, 0x6b, 0x3e, 0xeb, 0xd8, 0x33, 0xbe, 0xb4, 0x2e, 0x26, 0xbe,
- 0x68, 0x54, 0x42, 0x3f, 0x55, 0xe8, 0x22, 0x3f, 0xb7, 0x61, 0x09, 0x3e,
- 0x76, 0x87, 0x56, 0x3e, 0x91, 0x4b, 0x67, 0xbe, 0x3a, 0x1e, 0xd3, 0xbe,
- 0x4c, 0x36, 0x2f, 0x3f, 0xed, 0xd3, 0x83, 0x3d, 0x86, 0xdc, 0x3f, 0xbe,
- 0x06, 0xa3, 0xd0, 0x3e, 0xb4, 0x74, 0x75, 0xbd, 0x4f, 0xcc, 0xfb, 0xbe,
- 0x42, 0x48, 0x88, 0xbe, 0x6a, 0x54, 0xc4, 0xbe, 0xba, 0x86, 0x0c, 0xbf,
- 0x61, 0xfc, 0x14, 0xbf, 0xf4, 0x53, 0x9e, 0x3b, 0x1e, 0x37, 0xd3, 0xbd,
- 0xb8, 0xb4, 0x90, 0x3e, 0x8f, 0xf2, 0xd4, 0xbd, 0xee, 0x22, 0x48, 0xbd,
- 0x16, 0x7e, 0xe0, 0xbd, 0x69, 0x6c, 0xcb, 0x3e, 0x55, 0xc6, 0x4e, 0xbe,
- 0xfb, 0xa7, 0x14, 0xbe, 0x50, 0xdf, 0x09, 0xbe, 0xbb, 0xb7, 0xe9, 0x3e,
- 0x00, 0xda, 0x55, 0xbd, 0xde, 0x12, 0x1f, 0xbe, 0xfe, 0x19, 0xc8, 0xbd,
- 0xf5, 0x3f, 0x3b, 0x3f, 0x56, 0xcb, 0x03, 0xbf, 0x5e, 0xe9, 0xc8, 0x3d,
- 0x9f, 0x72, 0x87, 0xbe, 0xf9, 0xdb, 0x12, 0xbe, 0x2b, 0xd0, 0x79, 0xbe,
- 0x7d, 0xb7, 0x1d, 0xbe, 0xd9, 0x27, 0xc7, 0x3e, 0xc5, 0xcb, 0xbc, 0x3d,
- 0xb2, 0x81, 0x17, 0xbe, 0xfe, 0x5e, 0xa1, 0xbf, 0x77, 0xe3, 0x77, 0xbf,
- 0xde, 0xb4, 0xbb, 0xbe, 0xd1, 0x41, 0xb8, 0x3e, 0xb0, 0x1a, 0xab, 0x3d,
- 0x2a, 0x6a, 0xca, 0xbd, 0xf8, 0x1b, 0x80, 0xbe, 0xf6, 0x50, 0x5b, 0xbf,
- 0x33, 0x07, 0x26, 0x3f, 0xe0, 0xb7, 0x9f, 0xbd, 0x57, 0x43, 0xe3, 0xbd,
- 0xc3, 0xa8, 0x06, 0xbe, 0xf1, 0x49, 0x83, 0xbd, 0x33, 0xbd, 0x72, 0xbd,
- 0xd4, 0xaf, 0x0b, 0xbe, 0x1f, 0x22, 0xd2, 0x3c, 0x46, 0x7c, 0x8b, 0x3e,
- 0xb1, 0xef, 0x7f, 0x3d, 0x4d, 0xda, 0x8b, 0xbe, 0xe7, 0xe3, 0xa7, 0xbb,
- 0x00, 0x9c, 0x77, 0x3e, 0xf8, 0xc5, 0x8c, 0x3c, 0x26, 0x85, 0x45, 0xbf,
- 0x9a, 0xbf, 0x07, 0x3e, 0x60, 0x43, 0x2e, 0xbe, 0x13, 0xbc, 0xcc, 0xbb,
- 0x54, 0xad, 0xf1, 0x3d, 0x66, 0x8d, 0xad, 0x3e, 0x0a, 0x3f, 0x16, 0x3f,
- 0x7f, 0x68, 0x6f, 0xbe, 0x72, 0xf9, 0x31, 0x3e, 0xcd, 0x45, 0xd6, 0xbe,
- 0x61, 0xef, 0x29, 0x3d, 0x20, 0x7f, 0xa6, 0x3d, 0x40, 0x3e, 0xf7, 0x3e,
- 0xc0, 0x1d, 0xe0, 0x3e, 0x19, 0x94, 0xba, 0x3c, 0x49, 0xa3, 0x48, 0xbe,
- 0x26, 0x2d, 0xdc, 0x3d, 0x68, 0xec, 0xee, 0x3d, 0x7b, 0x60, 0x96, 0xbe,
- 0xa2, 0x14, 0x23, 0x3e, 0xcd, 0x65, 0x68, 0x3e, 0x2c, 0x0c, 0x8a, 0x3c,
- 0x29, 0x27, 0xe5, 0x3d, 0xee, 0xa8, 0x90, 0x3d, 0x25, 0x65, 0x0c, 0x3e,
- 0xb3, 0xcd, 0xbf, 0xbe, 0x60, 0x80, 0x75, 0xbd, 0x50, 0x6a, 0xd4, 0x3c,
- 0x7c, 0x5d, 0x7f, 0x3f, 0x93, 0x8e, 0xe8, 0x3e, 0x03, 0x1f, 0x1c, 0x3e,
- 0x72, 0x60, 0xda, 0xbd, 0xf3, 0x80, 0xf9, 0x3e, 0x89, 0x57, 0x92, 0x3e,
- 0x4c, 0x31, 0x3a, 0xbd, 0x2e, 0x72, 0xb7, 0xbd, 0x9a, 0xe3, 0xf1, 0xbd,
- 0x83, 0x21, 0x69, 0x3d, 0x9b, 0x2f, 0x12, 0x3d, 0xda, 0x24, 0x0c, 0xbd,
- 0xd8, 0x56, 0x81, 0xbe, 0x96, 0x04, 0x10, 0xbe, 0xb8, 0x7b, 0x01, 0x3e,
- 0xdf, 0x6b, 0xf5, 0x3d, 0x98, 0x96, 0x34, 0xbd, 0x3e, 0x0b, 0xde, 0xbb,
- 0x2a, 0x54, 0x49, 0xbb, 0x3a, 0x99, 0x50, 0x3d, 0x17, 0x67, 0x07, 0xbe,
- 0xf6, 0xd9, 0x9a, 0x3d, 0x45, 0xd3, 0xa7, 0x3b, 0xd5, 0x1e, 0x50, 0x3e,
- 0x67, 0x5a, 0x99, 0xbc, 0x98, 0x3e, 0x11, 0xba, 0x18, 0x17, 0x9b, 0x3d,
- 0x65, 0x7d, 0xbe, 0xbc, 0x62, 0xfe, 0x06, 0xbe, 0x56, 0x1d, 0x7b, 0x3d,
- 0x37, 0x17, 0xad, 0xbd, 0x61, 0xfa, 0x0b, 0x3e, 0x4c, 0x10, 0x19, 0xbe,
- 0x80, 0xe0, 0x88, 0xbc, 0x66, 0xb3, 0x16, 0x3e, 0x3f, 0xc9, 0x36, 0xbe,
- 0x80, 0xfe, 0x65, 0xbd, 0xa3, 0x2e, 0x39, 0xbe, 0xce, 0x74, 0x12, 0xbe,
- 0xd1, 0x56, 0x13, 0x3e, 0x25, 0x9c, 0x0f, 0xbe, 0x59, 0xce, 0xd9, 0xbd,
- 0x30, 0x18, 0x21, 0xbe, 0x78, 0x97, 0xed, 0x3d, 0x9f, 0x6d, 0xa4, 0x3d,
- 0x29, 0xcc, 0x97, 0x3d, 0xab, 0x74, 0xe3, 0x3c, 0x1f, 0x06, 0x26, 0xbd,
- 0xfd, 0xcf, 0x87, 0xbc, 0x12, 0xd0, 0xd5, 0x3c, 0xa1, 0xce, 0x89, 0xbe,
- 0x28, 0xcd, 0xc6, 0x3d, 0x7a, 0x39, 0x83, 0x3d, 0xd7, 0x81, 0xb3, 0x3d,
- 0xe2, 0xdd, 0x9f, 0x3d, 0xac, 0x0d, 0x72, 0x3c, 0x18, 0xa7, 0x3b, 0xbe,
- 0xc2, 0xbf, 0x8f, 0xbd, 0x3e, 0x41, 0x9a, 0xbe, 0xf6, 0xdb, 0x91, 0xbc,
- 0x3c, 0x0f, 0x32, 0xbe, 0xf3, 0x2a, 0xba, 0x3d, 0x36, 0x28, 0x53, 0xbe,
- 0x24, 0x9b, 0x44, 0xbe, 0xb9, 0x9b, 0x51, 0xbd, 0x62, 0x3a, 0x1d, 0xbd,
- 0x88, 0x28, 0x90, 0xbd, 0x94, 0x23, 0xd2, 0xbd, 0xec, 0xe4, 0x65, 0x3d,
- 0x05, 0xb3, 0xd0, 0xbd, 0x13, 0x5c, 0x34, 0xbc, 0xf0, 0x97, 0xf7, 0xbd,
- 0x84, 0xe0, 0x92, 0x3e, 0x17, 0x47, 0xc8, 0x3d, 0x3e, 0xff, 0xf4, 0xbd,
- 0xbf, 0xb1, 0xc7, 0x3d, 0x45, 0xae, 0x8e, 0x3c, 0x0e, 0xb6, 0x6d, 0xba,
- 0xa8, 0x66, 0x71, 0xbe, 0x34, 0x6e, 0xde, 0x3c, 0x12, 0x01, 0x38, 0xbd,
- 0xeb, 0xc2, 0x16, 0x3c, 0xd5, 0x38, 0xb0, 0x3b, 0x51, 0x77, 0x2a, 0xbe,
- 0x8d, 0x0d, 0x74, 0xbc, 0xd5, 0x02, 0x00, 0x3e, 0xa9, 0x53, 0x81, 0xbe,
- 0x03, 0xb0, 0x95, 0xbe, 0x06, 0xba, 0x14, 0xbe, 0xc5, 0x5c, 0x71, 0x3d,
- 0xdc, 0xf6, 0x0e, 0xbd, 0x88, 0x7e, 0x1c, 0x3d, 0x93, 0x3c, 0x1e, 0x3e,
- 0xc4, 0xb9, 0x41, 0xbe, 0x16, 0xb3, 0xf7, 0x3d, 0x64, 0xd9, 0x73, 0x3d,
- 0xfe, 0x44, 0xa7, 0xbd, 0x2d, 0x79, 0xc6, 0x3d, 0xb4, 0x48, 0x92, 0xbd,
- 0xaf, 0x6a, 0x3a, 0xbe, 0x91, 0x19, 0x90, 0x3c, 0x2c, 0xd4, 0xfc, 0xbd,
- 0x96, 0xe3, 0xd0, 0x3d, 0xde, 0xec, 0x5b, 0xbe, 0xd0, 0xe8, 0xdf, 0x3d,
- 0x22, 0xc1, 0xe1, 0x3c, 0xaf, 0xa3, 0xf4, 0xbd, 0x65, 0x89, 0xfe, 0xbd,
- 0x48, 0xb5, 0x71, 0xbc, 0xf9, 0xc5, 0x55, 0xbd, 0x39, 0x27, 0x33, 0xbe,
- 0x02, 0xab, 0x25, 0xbe, 0x46, 0x29, 0xcc, 0x3d, 0xd0, 0x37, 0x84, 0xbe,
- 0x16, 0x81, 0x87, 0xbe, 0xe2, 0x94, 0x30, 0xbd, 0xaf, 0x52, 0x9c, 0xbd,
- 0x3c, 0x9f, 0xe8, 0x3d, 0xec, 0x45, 0x0c, 0xbe, 0x07, 0x0d, 0xcc, 0x3c,
- 0x84, 0x7b, 0x3b, 0xbc, 0xc5, 0x35, 0x91, 0xbd, 0x44, 0x5b, 0x7a, 0xbe,
- 0xbf, 0x2e, 0x2a, 0xbc, 0x54, 0x92, 0xb4, 0xbc, 0x19, 0x23, 0xc9, 0x3b,
- 0x8f, 0xf3, 0x44, 0xbe, 0xb6, 0x0f, 0x08, 0xbd, 0x3a, 0x1c, 0x9c, 0x3d,
- 0x64, 0x67, 0x7d, 0x3c, 0x27, 0xc6, 0x57, 0xbd, 0x32, 0x27, 0xc8, 0xbc,
- 0x95, 0x49, 0x12, 0xbd, 0x56, 0xef, 0x91, 0xbd, 0x1f, 0x9c, 0x06, 0xbe,
- 0xb3, 0x7b, 0xb0, 0xbd, 0xcf, 0xfd, 0xa9, 0xbe, 0x59, 0x3e, 0x80, 0x3d,
- 0x18, 0xf7, 0xab, 0x3c, 0x93, 0x5b, 0x3f, 0xbe, 0x04, 0xb7, 0x8f, 0x3d,
- 0xaf, 0xde, 0xe2, 0x3d, 0xbc, 0x38, 0x7d, 0xbd, 0xe8, 0x02, 0xa6, 0xbd,
- 0x66, 0x19, 0x08, 0x3e, 0x45, 0xed, 0x1a, 0xbd, 0xfa, 0x40, 0x4f, 0xbe,
- 0x1e, 0x0c, 0x06, 0x3e, 0xd2, 0x8b, 0x4a, 0xbe, 0x35, 0xcd, 0xe5, 0xbc,
- 0x70, 0xa6, 0x82, 0x3e, 0x5b, 0x46, 0xef, 0xbd, 0x54, 0x65, 0xcb, 0xba,
- 0x44, 0x28, 0x79, 0x3d, 0xad, 0xbd, 0x8f, 0xbc, 0x49, 0x10, 0xa9, 0xbd,
- 0xf6, 0xf1, 0x10, 0xbe, 0x77, 0x9e, 0x2c, 0xbd, 0x10, 0x4f, 0x8a, 0x3d,
- 0xac, 0x16, 0x5e, 0xbd, 0xe3, 0x84, 0xa1, 0xbe, 0xcc, 0x13, 0x20, 0xbe,
- 0x7c, 0x1e, 0x4d, 0xbe, 0xc4, 0xe1, 0x4a, 0x3d, 0xe9, 0x7e, 0xd3, 0x3d,
- 0x9f, 0x9f, 0x33, 0xbd, 0xdf, 0x04, 0xe0, 0x3d, 0x24, 0x73, 0x02, 0x3e,
- 0xe5, 0x02, 0x62, 0x3d, 0x03, 0xa4, 0xa1, 0xbc, 0x27, 0x54, 0xdd, 0xbd,
- 0xf0, 0x60, 0x17, 0x3d, 0x77, 0x62, 0x89, 0x3d, 0x1e, 0xb3, 0xe2, 0x3d,
- 0x3e, 0x4b, 0x08, 0x3f, 0x4e, 0xb1, 0xd9, 0x3d, 0xf9, 0xcd, 0x45, 0xbe,
- 0xbb, 0xe5, 0x32, 0xbe, 0x9e, 0x3a, 0xf4, 0xbc, 0xef, 0x87, 0x06, 0xbe,
- 0xc4, 0x8b, 0x46, 0xbd, 0x6f, 0x33, 0x26, 0xbd, 0xef, 0x9b, 0xe9, 0xbd,
- 0x24, 0x76, 0x17, 0xbd, 0x23, 0xca, 0x03, 0x3e, 0xf8, 0x84, 0xaa, 0x3c,
- 0x62, 0x5a, 0xd5, 0xbb, 0x9f, 0x67, 0x82, 0x3e, 0x17, 0xba, 0x8b, 0xbd,
- 0xb3, 0x5c, 0xc6, 0x3d, 0xb9, 0x81, 0x3f, 0xbd, 0x95, 0x82, 0x8c, 0x3d,
- 0xbc, 0x55, 0xe5, 0x3c, 0xd3, 0xab, 0xc3, 0xbd, 0xb1, 0x5f, 0x5e, 0x3d,
- 0x92, 0xc5, 0x90, 0x3c, 0x59, 0x6f, 0xd3, 0xbc, 0xe2, 0xb3, 0xd1, 0xbd,
- 0x84, 0xa8, 0xd6, 0x3d, 0x0b, 0x7b, 0x76, 0x3d, 0x7e, 0x23, 0x0c, 0x3c,
- 0x54, 0x6e, 0xde, 0x3c, 0x05, 0x50, 0x71, 0x3d, 0xd2, 0x30, 0xa0, 0xbd,
- 0x5d, 0xd4, 0x6c, 0x3d, 0xea, 0x88, 0x97, 0x3d, 0xa7, 0xe3, 0x95, 0xbd,
- 0xa7, 0x03, 0xee, 0xbd, 0xbb, 0xda, 0x33, 0xbe, 0xfb, 0xbc, 0x6f, 0x3e,
- 0x6e, 0x33, 0x5c, 0x3f, 0x5a, 0x24, 0xc7, 0x3e, 0xe1, 0x50, 0x53, 0xbd,
- 0x95, 0x36, 0xf2, 0x3e, 0xe9, 0xc8, 0xa2, 0x3e, 0xe1, 0x9d, 0x36, 0x3e,
- 0x34, 0xd4, 0xfa, 0xbd, 0xb8, 0xe6, 0xfe, 0xbe, 0x8a, 0x3a, 0x1f, 0xbf,
- 0x14, 0x77, 0x11, 0xbe, 0x1b, 0x4b, 0x01, 0x3f, 0xa1, 0x75, 0xe4, 0x3e,
- 0xee, 0x8a, 0xf0, 0xbe, 0xee, 0xa5, 0x02, 0x3f, 0x99, 0x17, 0x72, 0xbe,
- 0x29, 0xbf, 0x21, 0xbf, 0x77, 0x8f, 0xe1, 0x3d, 0x7d, 0x76, 0xe9, 0x3d,
- 0x8b, 0xe8, 0x3c, 0xbe, 0x3a, 0xa1, 0x6c, 0xbf, 0xf5, 0x0a, 0x88, 0xbe,
- 0xdf, 0xe7, 0x9d, 0x3e, 0xa1, 0xcd, 0x3b, 0x3d, 0x5a, 0xd9, 0x54, 0x3e,
- 0x59, 0xa8, 0x7b, 0x3f, 0xb1, 0x4e, 0xf5, 0x3d, 0xaf, 0x6a, 0x71, 0xbe,
- 0x6d, 0x80, 0xa9, 0x3d, 0x78, 0x9c, 0x22, 0xbd, 0x5f, 0x12, 0x4a, 0x3e,
- 0x61, 0xf2, 0xfb, 0xbd, 0x3f, 0xec, 0xff, 0xbd, 0x3d, 0x52, 0x0d, 0x3c,
- 0x3a, 0x92, 0x97, 0x3d, 0xc5, 0x61, 0x62, 0x3e, 0xbf, 0x95, 0x16, 0xbe,
- 0x5f, 0x4e, 0x99, 0xbe, 0x94, 0x3c, 0x90, 0x3e, 0x75, 0x4a, 0x3e, 0x3d,
- 0x40, 0x83, 0x91, 0x3e, 0x50, 0xaf, 0x0a, 0xbe, 0x87, 0x47, 0xb9, 0x3d,
- 0xc6, 0x76, 0x25, 0xbf, 0xd9, 0x4d, 0xdf, 0x3d, 0x82, 0x5b, 0xa4, 0x3d,
- 0xfb, 0xeb, 0x9d, 0xbd, 0x64, 0xfe, 0xa5, 0xbe, 0x86, 0x81, 0x09, 0x3f,
- 0xf0, 0x30, 0x39, 0xbf, 0x5f, 0xb4, 0x08, 0xbe, 0x0d, 0x44, 0x72, 0x3e,
- 0x51, 0x71, 0x5c, 0xbe, 0xb4, 0x25, 0x03, 0x3d, 0xb6, 0xed, 0xaf, 0xbe,
- 0x49, 0x14, 0x13, 0x3e, 0x80, 0xc6, 0x88, 0xbe, 0x3b, 0x5e, 0x07, 0x3f,
- 0xd6, 0x38, 0x5d, 0xbd, 0x00, 0xfd, 0x9f, 0xbe, 0x32, 0x1c, 0x54, 0x3d,
- 0x07, 0x60, 0x8f, 0x3e, 0x24, 0x41, 0xd5, 0xbd, 0x08, 0x8f, 0x56, 0xbe,
- 0x81, 0x15, 0x25, 0xbd, 0x23, 0x61, 0x6a, 0xbe, 0xca, 0x45, 0x33, 0x3e,
- 0xd0, 0xbd, 0x15, 0xbf, 0x4f, 0x78, 0x57, 0xbe, 0x04, 0x6e, 0xbb, 0x3d,
- 0x76, 0xff, 0xe2, 0x3d, 0xfc, 0x50, 0x12, 0xbd, 0x6d, 0x6b, 0x14, 0x3e,
- 0x0e, 0x40, 0x2b, 0xbe, 0xfa, 0x83, 0x1a, 0xbd, 0x87, 0xf9, 0x01, 0x3f,
- 0x10, 0xb9, 0xd3, 0xbd, 0x8e, 0x0e, 0x7a, 0x3e, 0xfa, 0xad, 0xfa, 0xbd,
- 0x17, 0xb9, 0x17, 0xbe, 0x51, 0xb7, 0x16, 0x3e, 0x02, 0x66, 0x5f, 0xbe,
- 0x76, 0x05, 0x99, 0x3e, 0x28, 0x0c, 0x1b, 0xbe, 0xf7, 0xbc, 0x71, 0xbe,
- 0x6d, 0xbe, 0xa1, 0xbe, 0x75, 0xd4, 0x66, 0x3d, 0xe2, 0x6b, 0x0e, 0x3f,
- 0x8c, 0xe9, 0x88, 0x3e, 0x5e, 0x36, 0xb7, 0xbd, 0x21, 0xe9, 0x76, 0x3d,
- 0xa6, 0xa7, 0x5b, 0x3c, 0x68, 0x33, 0x3b, 0xbe, 0xfd, 0x06, 0xe7, 0x3e,
- 0x43, 0x86, 0x88, 0xbe, 0x76, 0x13, 0xce, 0x3b, 0xbb, 0x5d, 0x19, 0xbd,
- 0xc2, 0x8e, 0xaf, 0x3d, 0xc7, 0x7c, 0x94, 0xbe, 0x40, 0x57, 0xfb, 0x3d,
- 0xbf, 0x64, 0x35, 0xbe, 0x69, 0xe0, 0xff, 0x3e, 0x2a, 0x16, 0x3b, 0x3d,
- 0x83, 0x4e, 0x36, 0x3e, 0x18, 0x4e, 0x85, 0xbd, 0x58, 0x39, 0x7c, 0x3d,
- 0xb7, 0x6f, 0x0c, 0x3d, 0x2e, 0x8e, 0x96, 0x3d, 0xa9, 0x46, 0x44, 0xbc,
- 0x92, 0xcd, 0x52, 0x3d, 0xae, 0x31, 0xb1, 0x3d, 0xd7, 0xbb, 0xe3, 0x3d,
- 0x4a, 0x86, 0x25, 0xbe, 0x8a, 0x15, 0x36, 0xbb, 0xb1, 0x5e, 0x8b, 0xbc,
- 0x30, 0x33, 0x43, 0xbc, 0x5d, 0x82, 0x57, 0xbd, 0xbb, 0x34, 0xfb, 0xbd,
- 0xd7, 0x65, 0x90, 0xbd, 0xa0, 0x56, 0xdf, 0x3d, 0x7f, 0x02, 0xc4, 0x3b,
- 0xc9, 0x61, 0x3a, 0x3e, 0x6d, 0xdb, 0xf2, 0x3c, 0x18, 0xd9, 0xa2, 0xbc,
- 0xf0, 0x4e, 0x8b, 0x3d, 0x31, 0x07, 0xb3, 0xbd, 0x9f, 0x9e, 0x9a, 0xbd,
- 0x39, 0x9a, 0x4e, 0xb9, 0x92, 0x44, 0x22, 0xbe, 0x0d, 0x20, 0xc5, 0x3d,
- 0x56, 0x28, 0x0f, 0xbd, 0xb2, 0xec, 0x32, 0x3d, 0x3d, 0xde, 0x00, 0xbd,
- 0xdb, 0x07, 0xbc, 0xbd, 0x42, 0xf3, 0xcd, 0x3c, 0xf7, 0xc5, 0x78, 0x3c,
- 0x4e, 0x1d, 0xce, 0xbd, 0xdc, 0xb7, 0x82, 0xbd, 0xc5, 0x78, 0x97, 0x3d,
- 0x37, 0x79, 0xec, 0x3c, 0xc2, 0x84, 0x85, 0xbb, 0x18, 0xf2, 0x09, 0xbe,
- 0xf1, 0x04, 0x92, 0xbe, 0x5c, 0xb8, 0x09, 0x3d, 0x74, 0xcf, 0x93, 0x3d,
- 0x80, 0x65, 0x7d, 0x3d, 0xd2, 0x60, 0x4f, 0x3d, 0xe7, 0x85, 0x9e, 0x3d,
- 0xce, 0xb2, 0xc6, 0x3c, 0x88, 0xbc, 0x38, 0xbd, 0xff, 0x83, 0x63, 0xbd,
- 0x3f, 0xfc, 0xb9, 0xbd, 0xe3, 0x00, 0xad, 0xbd, 0x78, 0xc3, 0x3b, 0xbe,
- 0x7b, 0x74, 0x05, 0xbe, 0x83, 0x3f, 0x47, 0xbe, 0x27, 0xac, 0x23, 0x3d,
- 0x69, 0xe5, 0xc4, 0x3d, 0xb7, 0xec, 0xa8, 0xbb, 0x34, 0x49, 0xcc, 0x3d,
- 0xc8, 0x77, 0x51, 0x3d, 0x4f, 0x85, 0x91, 0x3d, 0x15, 0xef, 0xe0, 0xbc,
- 0x1c, 0xce, 0x9e, 0xbd, 0x99, 0x95, 0x8d, 0x3d, 0x0c, 0xad, 0x1a, 0xbe,
- 0x1a, 0xea, 0x19, 0xbe, 0x36, 0xb1, 0x05, 0xbf, 0xd7, 0x09, 0x54, 0x3a,
- 0xb0, 0x5e, 0x5c, 0xbd, 0x2e, 0x94, 0x64, 0x3e, 0x0b, 0x62, 0xbf, 0xbe,
- 0x76, 0x8e, 0x32, 0xbd, 0xb5, 0x72, 0xad, 0xbd, 0xc6, 0xb2, 0xba, 0x3d,
- 0xd2, 0x44, 0x42, 0xbe, 0x15, 0xef, 0xf3, 0x3d, 0x1e, 0xb5, 0x8c, 0xbe,
- 0x87, 0xc5, 0xbe, 0xbd, 0x63, 0x17, 0x4a, 0xbd, 0x84, 0x0a, 0x72, 0xbe,
- 0xd2, 0xf8, 0xbe, 0x3d, 0x2c, 0x8a, 0x91, 0x3d, 0x8c, 0x1b, 0xbf, 0x3d,
- 0x21, 0x1d, 0xe8, 0x3d, 0x1b, 0xaa, 0x4b, 0x3d, 0x23, 0x83, 0x85, 0xbe,
- 0x95, 0xc2, 0x96, 0x3c, 0xe2, 0x1a, 0x4c, 0x3e, 0x3a, 0x70, 0x6e, 0xbe,
- 0x97, 0x3a, 0xd0, 0xbd, 0xde, 0xe9, 0x2d, 0xbc, 0x27, 0x3d, 0x07, 0xbe,
- 0x99, 0x86, 0xa1, 0x3d, 0x08, 0x9d, 0x72, 0x3c, 0x25, 0xa7, 0xf5, 0xbd,
- 0x6c, 0x80, 0x98, 0x3d, 0x75, 0x53, 0x8a, 0x3d, 0xff, 0x60, 0x83, 0xbd,
- 0x3e, 0x6e, 0x51, 0x3d, 0x03, 0x23, 0x68, 0x3c, 0x0d, 0x17, 0x04, 0xbe,
- 0xe7, 0x99, 0x52, 0xbd, 0x01, 0x8c, 0x0f, 0x3e, 0x71, 0x7a, 0xa2, 0x3a,
- 0xfd, 0x54, 0x10, 0x3e, 0x1e, 0xc1, 0xd0, 0xbd, 0x82, 0xa9, 0x4c, 0x3d,
- 0xbb, 0x7d, 0x94, 0x3c, 0xa1, 0xa2, 0xc9, 0x3d, 0x4c, 0x8e, 0x03, 0xbe,
- 0x1b, 0xc3, 0x09, 0x3f, 0x74, 0x2b, 0xba, 0x3e, 0x96, 0x4e, 0x60, 0xbd,
- 0xe8, 0x01, 0xb4, 0x3e, 0x47, 0xdf, 0xf9, 0x3d, 0xc7, 0x37, 0xfb, 0xbe,
- 0x74, 0x8e, 0x17, 0x3f, 0x1f, 0x49, 0x11, 0x3d, 0x0a, 0x7a, 0xab, 0xbc,
- 0xaa, 0xe2, 0x84, 0x3e, 0xba, 0xd9, 0x44, 0xbe, 0xd2, 0xc0, 0xd8, 0xbe,
- 0x50, 0x5a, 0x3e, 0xbe, 0x90, 0x30, 0xaf, 0xbe, 0xe5, 0xdc, 0xe9, 0xbe,
- 0x56, 0x54, 0xf8, 0xbe, 0xae, 0xde, 0xaa, 0x3d, 0x26, 0xe3, 0x0d, 0xbd,
- 0x70, 0xfa, 0xca, 0x3e, 0x01, 0x97, 0x66, 0xbe, 0x5a, 0x81, 0x09, 0xbe,
- 0xc7, 0x8e, 0x5f, 0xbd, 0x9d, 0xc8, 0x7a, 0x3e, 0x76, 0xf8, 0x84, 0xbe,
- 0x28, 0x8b, 0x5b, 0xbd, 0x95, 0xf8, 0x54, 0xbe, 0xfc, 0xa7, 0x69, 0x3e,
- 0xdc, 0x18, 0x57, 0x3c, 0x04, 0xc1, 0xba, 0xbd, 0xea, 0x3f, 0xf9, 0x3b,
- 0x66, 0x66, 0xe9, 0x3e, 0x7f, 0x0c, 0x89, 0xbe, 0xd3, 0x73, 0xbe, 0x3e,
- 0xd0, 0x44, 0xea, 0xbd, 0x43, 0x42, 0x35, 0xbd, 0xd7, 0xb6, 0x64, 0xbe,
- 0x4f, 0x86, 0x45, 0xbd, 0xc2, 0xe9, 0x0e, 0x3f, 0xff, 0x64, 0x14, 0x3d,
- 0xaf, 0xc5, 0xbf, 0xbd, 0x2a, 0x0b, 0x6b, 0xbf, 0x97, 0x1c, 0x28, 0xbf,
- 0x23, 0xf1, 0xb1, 0xbe, 0x3a, 0x8c, 0x08, 0x3f, 0x04, 0xa3, 0x3d, 0xbe,
- 0x98, 0x7a, 0x49, 0xbd, 0x9d, 0x44, 0x9e, 0xbe, 0x7f, 0x7a, 0x2e, 0xbf,
- 0xb4, 0x78, 0xc5, 0x3e, 0x20, 0x49, 0x24, 0x3b, 0x41, 0x54, 0x33, 0xbe,
- 0x1f, 0x22, 0xf3, 0xbd, 0xa2, 0x2c, 0x8c, 0xbe, 0xad, 0x44, 0xf5, 0x3d,
- 0x23, 0x80, 0x10, 0xbe, 0x32, 0xb0, 0x05, 0x3e, 0x6b, 0xd2, 0x61, 0x3c,
- 0x81, 0xc4, 0x1e, 0x3d, 0xd3, 0x77, 0xb1, 0xbe, 0xea, 0x69, 0x57, 0x3e,
- 0x8f, 0x4a, 0x88, 0xbd, 0x34, 0x03, 0xd3, 0xbc, 0x16, 0x7c, 0xa5, 0xbe,
- 0xf0, 0x89, 0x5c, 0x3e, 0x58, 0x6e, 0x78, 0xbd, 0x29, 0xbd, 0x1e, 0x3e,
- 0xdf, 0xe9, 0x8c, 0xbe, 0x91, 0x09, 0x10, 0x3e, 0x0d, 0xcf, 0x93, 0x3e,
- 0x41, 0x12, 0x45, 0xbe, 0xcf, 0x33, 0xc1, 0xbc, 0x11, 0x8c, 0x33, 0xbe,
- 0x1a, 0x8f, 0xe9, 0xbc, 0xcb, 0x23, 0xf2, 0x3e, 0x41, 0x1b, 0x12, 0x3f,
- 0x01, 0x6a, 0x92, 0x3d, 0x3a, 0x51, 0x2a, 0xbe, 0x91, 0x98, 0x97, 0xbe,
- 0xdc, 0xd5, 0xae, 0x3d, 0xb8, 0x0c, 0x81, 0x3d, 0xf0, 0x5f, 0x8e, 0x3d,
- 0xcc, 0xa2, 0xb3, 0xbc, 0x27, 0x17, 0xe9, 0x3d, 0xf4, 0xfb, 0x3b, 0x3e,
- 0xe3, 0xa5, 0x92, 0x3d, 0x1c, 0x85, 0x39, 0x3d, 0x56, 0xa8, 0x64, 0x3d,
- 0x3d, 0xb2, 0xce, 0xbd, 0x83, 0xae, 0xd6, 0xbd, 0x15, 0xb2, 0xf9, 0x3d,
- 0xd7, 0xc2, 0x40, 0x3f, 0x87, 0x40, 0xeb, 0x3e, 0xae, 0xed, 0xba, 0x3e,
- 0x90, 0x97, 0xc9, 0x3d, 0x45, 0x57, 0x93, 0x3e, 0xb9, 0x8e, 0xf1, 0x3d,
- 0x68, 0x2b, 0x35, 0xbd, 0xd7, 0x9b, 0x85, 0xbe, 0xfa, 0x76, 0x59, 0xbd,
- 0x55, 0x1e, 0x80, 0x3e, 0x5b, 0xbd, 0x95, 0x3e, 0x1a, 0x35, 0x05, 0xbe,
- 0x7c, 0x1e, 0x8e, 0xbe, 0xed, 0xb6, 0x6a, 0xbc, 0x86, 0x2a, 0xa4, 0x3c,
- 0x87, 0x41, 0x26, 0x3e, 0xcf, 0x15, 0xbb, 0xbc, 0xb6, 0x5d, 0xb9, 0x3d,
- 0x11, 0x28, 0xa6, 0x3d, 0x94, 0xa8, 0xcc, 0x3d, 0x12, 0x7e, 0x02, 0xbe,
- 0x0d, 0xa1, 0x11, 0x3d, 0x93, 0xb5, 0x44, 0xbb, 0x26, 0x80, 0x7a, 0x3d,
- 0xfc, 0xe1, 0xc9, 0x3c, 0x7e, 0x9e, 0x24, 0xbc, 0xdd, 0x08, 0x26, 0x3e,
- 0xaf, 0x44, 0x85, 0x3d, 0xec, 0xd5, 0xb2, 0xbc, 0x2a, 0xdd, 0xe7, 0x3d,
- 0x95, 0xe5, 0x8b, 0xbd, 0xba, 0xba, 0x4c, 0x3e, 0x42, 0xc7, 0x53, 0x3e,
- 0x78, 0x24, 0xc2, 0xbd, 0x22, 0x70, 0x0f, 0x3d, 0x27, 0x10, 0x3e, 0x3e,
- 0x76, 0x3e, 0xb8, 0x3d, 0x1f, 0x6d, 0x06, 0xbe, 0xae, 0x1e, 0x30, 0xbb,
- 0x58, 0x30, 0x06, 0x3e, 0x3a, 0x3c, 0xbf, 0xbe, 0x79, 0x7b, 0x76, 0xbd,
- 0x47, 0xe0, 0xa2, 0xbd, 0x52, 0x29, 0x55, 0x3e, 0x4a, 0x3b, 0x0f, 0xbd,
- 0xab, 0xda, 0xa6, 0x3c, 0x93, 0x8e, 0xe7, 0xbd, 0xb6, 0x25, 0x9a, 0x3d,
- 0x31, 0x92, 0x1b, 0xbe, 0x97, 0xcf, 0xb7, 0xbd, 0x73, 0x12, 0xdb, 0xbe,
- 0xc7, 0xee, 0x15, 0x3e, 0xdf, 0x83, 0xce, 0x3c, 0xbd, 0xdf, 0x44, 0xbd,
- 0x4c, 0xe8, 0xf6, 0xbc, 0xf0, 0x56, 0xf6, 0x3c, 0xf4, 0x29, 0xd7, 0xbd,
- 0xf4, 0xc0, 0x5b, 0xbe, 0xbd, 0xe5, 0x0c, 0xbd, 0x1d, 0x24, 0x90, 0x3d,
- 0x3d, 0x77, 0x26, 0xbe, 0x6a, 0x42, 0x24, 0xbe, 0x61, 0xa3, 0x1b, 0xbe,
- 0x62, 0x70, 0x86, 0x3d, 0x13, 0xba, 0xea, 0xbc, 0xa4, 0xaa, 0x51, 0xbd,
- 0x1f, 0x93, 0x01, 0x3e, 0xac, 0xe5, 0xef, 0xbd, 0x1b, 0xa0, 0x96, 0x3b,
- 0x99, 0x59, 0x4d, 0x3e, 0x98, 0x04, 0x3a, 0x3d, 0xc0, 0x17, 0x15, 0xbd,
- 0xf9, 0xee, 0x83, 0x3b, 0xfc, 0x4b, 0xbf, 0xbd, 0x9b, 0xa1, 0x43, 0xbe,
- 0x23, 0xba, 0xa3, 0xbc, 0xe8, 0xc7, 0x76, 0x3d, 0x6f, 0x80, 0x5f, 0x3e,
- 0x5c, 0x83, 0x7a, 0xbe, 0x92, 0xf8, 0x34, 0xbd, 0x97, 0x9f, 0xb5, 0x3d,
- 0x22, 0xed, 0x84, 0x3d, 0x08, 0x82, 0xf6, 0xbd, 0x3f, 0xfa, 0x19, 0x3d,
- 0x90, 0x64, 0x11, 0x3e, 0xac, 0x3e, 0x57, 0x3c, 0x0d, 0x36, 0x7c, 0xbd,
- 0x6e, 0x9f, 0x2a, 0xbe, 0xe8, 0x24, 0xb2, 0xbd, 0x73, 0x49, 0x88, 0xbd,
- 0x23, 0x4b, 0xcb, 0xbd, 0xd8, 0x00, 0x50, 0x3d, 0x6b, 0x52, 0x19, 0xbd,
- 0x3b, 0xf4, 0x34, 0xbd, 0x32, 0xd4, 0x3f, 0x3b, 0xda, 0x3f, 0x36, 0xbe,
- 0x01, 0xca, 0xb7, 0xba, 0x0f, 0x63, 0x46, 0x3c, 0x6b, 0x24, 0x48, 0xbe,
- 0x90, 0x81, 0x1a, 0x3e, 0x2e, 0x62, 0xd2, 0x3d, 0xd5, 0x92, 0xee, 0xbd,
- 0x20, 0x7d, 0x3c, 0xbd, 0x5c, 0xf1, 0xaf, 0xbc, 0xa1, 0x1a, 0xd7, 0x3d,
- 0x4d, 0x40, 0x6b, 0x3d, 0x19, 0xf5, 0x78, 0xbd, 0x39, 0xd7, 0x8e, 0xbe,
- 0x6b, 0x88, 0x3e, 0xbd, 0x9f, 0x28, 0xc2, 0xbd, 0x55, 0x01, 0xdd, 0xbb,
- 0xcf, 0x72, 0x60, 0xbe, 0xf3, 0x02, 0x41, 0x3e, 0x1f, 0x38, 0x8d, 0x3c,
- 0xdd, 0x9b, 0x01, 0x3d, 0x81, 0x9c, 0x21, 0xbd, 0x15, 0x1b, 0xb5, 0xbd,
- 0x74, 0x9f, 0x37, 0xbd, 0x39, 0x88, 0x73, 0xbe, 0x1f, 0xa5, 0xad, 0xbb,
- 0x98, 0x57, 0xf4, 0x3d, 0xcd, 0x0b, 0x91, 0x3c, 0x97, 0x05, 0x3e, 0xbc,
- 0xc4, 0x00, 0xfc, 0x3c, 0xef, 0xfd, 0x51, 0x3e, 0xf1, 0x18, 0xb0, 0x3b,
- 0xb4, 0xff, 0x35, 0x3d, 0xd7, 0xfc, 0xb2, 0xbd, 0x1d, 0xc3, 0xa1, 0x3d,
- 0x5b, 0xa3, 0x7f, 0xbd, 0x7e, 0xe9, 0x73, 0xbc, 0x99, 0x03, 0xe7, 0x3c,
- 0x5a, 0x5a, 0x8b, 0xbd, 0xca, 0x5c, 0x26, 0xbb, 0x18, 0xa6, 0xa5, 0x3d,
- 0xc0, 0xa9, 0xaa, 0x3c, 0x69, 0xbd, 0x50, 0xbe, 0xff, 0x56, 0x44, 0x3d,
- 0xbe, 0xc1, 0xa0, 0x3d, 0xe7, 0x7c, 0x92, 0x3d, 0x88, 0x2f, 0xf5, 0xbc,
- 0x68, 0xd1, 0xcc, 0x3d, 0xcb, 0xa6, 0xb7, 0xbd, 0x32, 0x78, 0x32, 0x3d,
- 0x0f, 0xbc, 0x3a, 0x3d, 0x49, 0xc7, 0x1a, 0xbe, 0x04, 0xf6, 0x32, 0xbd,
- 0x5b, 0x2f, 0xdf, 0x3d, 0xd2, 0x94, 0x07, 0xbd, 0x19, 0xab, 0x0f, 0xbe,
- 0xac, 0x14, 0x84, 0x3d, 0x43, 0xc6, 0x5b, 0x3c, 0x2a, 0xfa, 0x8c, 0xbe,
- 0x08, 0x43, 0x67, 0xba, 0x2f, 0x1b, 0x6d, 0x3d, 0x3a, 0xb7, 0x84, 0xbd,
- 0x2b, 0xd0, 0x0d, 0xbe, 0x93, 0xfe, 0x09, 0x3e, 0x88, 0x4c, 0x9d, 0x3d,
- 0xae, 0xc3, 0x1d, 0xbe, 0xff, 0x35, 0x0b, 0x3e, 0xb0, 0xcf, 0x0b, 0xbe,
- 0xa4, 0x06, 0xd2, 0xbd, 0x67, 0xa2, 0x1d, 0x3e, 0x9b, 0x4d, 0x8c, 0x3e,
- 0x43, 0xc3, 0xe9, 0x3c, 0xeb, 0x95, 0xbc, 0x3c, 0x19, 0xba, 0x1a, 0x3e,
- 0x0e, 0x82, 0x7d, 0xbd, 0xbf, 0x1b, 0x0b, 0xbe, 0x2a, 0x9d, 0x34, 0xbd,
- 0xe8, 0x53, 0x8a, 0x3e, 0x41, 0x28, 0x84, 0x3d, 0xdd, 0x54, 0xc9, 0x3d,
- 0x87, 0x42, 0x2d, 0x3e, 0xeb, 0x60, 0xe2, 0xbd, 0x9f, 0xa8, 0xd5, 0x3b,
- 0xaa, 0x47, 0x44, 0xbe, 0x85, 0xd4, 0x49, 0xbc, 0xac, 0x02, 0xbf, 0xbd,
- 0xde, 0x29, 0xbc, 0xbd, 0x75, 0x02, 0xe9, 0xbc, 0x34, 0x68, 0xdb, 0x3d,
- 0x65, 0x80, 0x31, 0x3d, 0x30, 0xce, 0xa2, 0xbb, 0x5f, 0xf4, 0xcb, 0xbc,
- 0xa6, 0x29, 0x16, 0x3d, 0x62, 0xe6, 0x45, 0xbe, 0x8d, 0x65, 0x58, 0xbd,
- 0xbc, 0xcf, 0x13, 0x3d, 0x44, 0xd3, 0xcd, 0x3d, 0x35, 0x16, 0x12, 0xbd,
- 0xa0, 0xaf, 0x89, 0x3a, 0x16, 0x9e, 0xc3, 0x3d, 0xf7, 0x96, 0x04, 0xbd,
- 0xd3, 0x66, 0xfb, 0x3d, 0x76, 0x46, 0xe5, 0x3d, 0x9d, 0x8c, 0xa2, 0xbd,
- 0x8a, 0x02, 0xf4, 0x3d, 0xd8, 0x5c, 0x8f, 0x3d, 0xa3, 0x5f, 0xb9, 0x3d,
- 0x53, 0xda, 0xc9, 0xbd, 0x5e, 0x3d, 0x24, 0xbd, 0x00, 0xf0, 0x11, 0x3d,
- 0x1e, 0xc2, 0x09, 0x3e, 0x44, 0x7f, 0x0b, 0x3e, 0x64, 0x93, 0x44, 0x3d,
- 0xd9, 0xf4, 0x65, 0x3d, 0x7d, 0x05, 0x6f, 0xbd, 0x12, 0xb1, 0x66, 0x3e,
- 0x10, 0x6b, 0x0a, 0x3f, 0xed, 0x7f, 0x81, 0xbe, 0x0b, 0x23, 0xee, 0xbc,
- 0x36, 0x08, 0xf8, 0x3e, 0x44, 0x1c, 0xc8, 0x3e, 0xba, 0x8d, 0xc0, 0x3e,
- 0x34, 0xea, 0xc6, 0x3c, 0xed, 0x49, 0x8b, 0xbd, 0xc8, 0xb8, 0x96, 0xbc,
- 0xc9, 0x0b, 0x91, 0x3c, 0x5e, 0x66, 0xa5, 0xbe, 0x5f, 0xa6, 0x8f, 0x3d,
- 0xdd, 0xa1, 0x0a, 0xbe, 0x87, 0x89, 0x6f, 0xbd, 0xba, 0x9e, 0x38, 0xbe,
- 0x06, 0xc3, 0x43, 0xbe, 0x04, 0xb6, 0x59, 0xbe, 0x0d, 0x22, 0x26, 0x3d,
- 0x8b, 0xa9, 0xd1, 0xbe, 0x27, 0xcd, 0x62, 0xbf, 0x46, 0xf4, 0xeb, 0xbd,
- 0xaa, 0xe0, 0x49, 0x3e, 0xe3, 0x82, 0x38, 0xbe, 0xe7, 0x50, 0x12, 0x3e,
- 0x7b, 0xb6, 0x4a, 0x3f, 0x37, 0x2c, 0xea, 0xbe, 0xcb, 0xc7, 0x81, 0xbe,
- 0xb5, 0x2b, 0x13, 0xbc, 0x61, 0x55, 0x64, 0x3e, 0x67, 0x7a, 0x30, 0x3e,
- 0xa8, 0xbc, 0x17, 0x3d, 0x8b, 0x0d, 0x42, 0x3d, 0xef, 0x76, 0xa0, 0xbe,
- 0xc2, 0x02, 0xa8, 0xbd, 0x66, 0x25, 0x83, 0xbd, 0xc4, 0xa3, 0xdb, 0x3b,
- 0x0e, 0xc2, 0xae, 0x3d, 0x7a, 0x96, 0xbd, 0xbe, 0xcb, 0x90, 0x03, 0xbe,
- 0xd3, 0x9f, 0x80, 0x3e, 0x3e, 0x20, 0x45, 0x3d, 0x8e, 0x5a, 0x8e, 0xbb,
- 0xe5, 0xf9, 0xcf, 0xbe, 0x8b, 0xe4, 0x43, 0x3e, 0x1f, 0xa3, 0x0f, 0x3e,
- 0xe2, 0x79, 0xbb, 0xbe, 0x17, 0x8b, 0x72, 0xbe, 0x8c, 0x9d, 0x3c, 0x3e,
- 0xa9, 0xed, 0xf5, 0xbe, 0x27, 0x68, 0x66, 0xbe, 0x6b, 0xa0, 0x8d, 0x3e,
- 0x4e, 0xcf, 0xb7, 0xbe, 0x33, 0x49, 0x92, 0xbd, 0xba, 0x15, 0xe6, 0xbe,
- 0x78, 0xff, 0x0c, 0x3f, 0xed, 0x8c, 0x80, 0xbe, 0x3c, 0x9f, 0x5d, 0x3f,
- 0x55, 0xa5, 0x60, 0x3d, 0x97, 0x02, 0xd6, 0xbe, 0xf2, 0x83, 0x37, 0xbd,
- 0x3a, 0x76, 0x1c, 0x3f, 0xd7, 0x8e, 0x80, 0x3c, 0xba, 0xc6, 0x3d, 0xbe,
- 0x9f, 0xb4, 0x73, 0x3e, 0x40, 0x4c, 0x31, 0xbe, 0x1d, 0x97, 0xeb, 0xbc,
- 0x14, 0x90, 0x2d, 0xbf, 0x26, 0x42, 0x1c, 0xbf, 0xef, 0x15, 0xae, 0x3b,
- 0xd2, 0xe7, 0xa5, 0xbe, 0x89, 0xc1, 0x56, 0xbe, 0x49, 0xee, 0xd3, 0x3e,
- 0x15, 0xbb, 0x44, 0xbd, 0x10, 0x3c, 0x98, 0xbd, 0xeb, 0x52, 0xc6, 0xbe,
- 0x1f, 0xa8, 0x3c, 0xbe, 0x6f, 0x26, 0x39, 0xbe, 0x10, 0xfa, 0x0e, 0x3c,
- 0xdc, 0x54, 0x66, 0xbd, 0x71, 0xb5, 0xc5, 0x3e, 0x1f, 0x8d, 0xd0, 0x3e,
- 0x0d, 0x6c, 0x71, 0x3e, 0x52, 0xa2, 0xf6, 0x3d, 0x12, 0x3a, 0xf1, 0x3e,
- 0x19, 0xbc, 0x3d, 0xbf, 0x72, 0xd1, 0xa1, 0x3d, 0xc7, 0x70, 0xb4, 0x3e,
- 0x78, 0x9f, 0x55, 0xbe, 0x57, 0x8a, 0x98, 0xbd, 0xc8, 0xe0, 0xa2, 0x3c,
- 0xf6, 0x3c, 0x86, 0x3d, 0x41, 0xe4, 0x58, 0x3e, 0xab, 0x75, 0x84, 0xbe,
- 0x18, 0xda, 0x48, 0xbe, 0x4c, 0x17, 0xdb, 0xbe, 0x55, 0x22, 0x2a, 0xbc,
- 0x1d, 0xc4, 0x52, 0x3d, 0x8d, 0x45, 0x0e, 0xbe, 0x34, 0xe8, 0xe5, 0xbd,
- 0xbc, 0x67, 0xfe, 0xbd, 0xf6, 0xb9, 0xa6, 0x3d, 0xe6, 0x1f, 0x11, 0x3e,
- 0xd1, 0xe4, 0x88, 0x3d, 0x5e, 0xdc, 0x17, 0xbe, 0xec, 0xdc, 0xaa, 0x3d,
- 0x04, 0x5d, 0xcc, 0x3a, 0x17, 0x0c, 0x64, 0x3c, 0xe5, 0x37, 0x49, 0x3e,
- 0x36, 0x30, 0xb3, 0x3d, 0x40, 0x38, 0x60, 0x3c, 0xbc, 0x07, 0xe0, 0x3c,
- 0x59, 0x41, 0x0e, 0xbd, 0xf8, 0x45, 0x1b, 0x3d, 0x87, 0xf6, 0x87, 0xbd,
- 0xd9, 0x4f, 0x53, 0x3d, 0x89, 0x18, 0x84, 0xbd, 0x26, 0x2a, 0x2f, 0x3d,
- 0x8e, 0x6d, 0x1f, 0xbd, 0x78, 0x5d, 0x6e, 0x3d, 0x8c, 0x09, 0x30, 0x3c,
- 0x82, 0xdd, 0x07, 0x3e, 0x7d, 0x59, 0x2e, 0xbd, 0x1f, 0xd7, 0x06, 0xbd,
- 0x39, 0x4d, 0xfb, 0x3c, 0xd6, 0xcd, 0x4d, 0xbe, 0xe9, 0x4e, 0x17, 0x3e,
- 0x23, 0xb9, 0x0e, 0xbc, 0xad, 0xe8, 0xbf, 0xbd, 0x64, 0x16, 0x9f, 0xbb,
- 0xd2, 0xcb, 0x23, 0xbe, 0x21, 0xad, 0x57, 0xbd, 0x40, 0x1d, 0xde, 0x3c,
- 0xf9, 0xa1, 0x8a, 0xbd, 0x2c, 0x2b, 0x90, 0x3d, 0xb3, 0x2f, 0x50, 0xbc,
- 0x4f, 0xdb, 0xf0, 0x3c, 0x72, 0x10, 0x60, 0xbe, 0x77, 0x5b, 0xc0, 0xbd,
- 0xfa, 0x86, 0x4c, 0x3d, 0xf3, 0xf1, 0x7b, 0x3c, 0x3c, 0xd7, 0x9c, 0xbd,
- 0xd1, 0xfa, 0x81, 0xbd, 0xff, 0x12, 0x99, 0xbd, 0x5c, 0x28, 0xb0, 0x3b,
- 0xe4, 0x1f, 0x02, 0xbc, 0xaf, 0x56, 0xbc, 0xbd, 0xf0, 0x0c, 0x8f, 0x3d,
- 0xe6, 0x60, 0xc7, 0xbc, 0x5c, 0x51, 0x23, 0xbd, 0x38, 0x44, 0x69, 0x3c,
- 0x81, 0xa7, 0x0d, 0x3c, 0x59, 0x94, 0xd4, 0xbc, 0x60, 0x1e, 0x1a, 0x3e,
- 0x12, 0x33, 0x64, 0xbe, 0x9d, 0xa0, 0x46, 0x3c, 0x6d, 0x75, 0x00, 0xbc,
- 0x31, 0xfe, 0x86, 0x3d, 0x71, 0xdf, 0x8e, 0xbc, 0x69, 0x5a, 0xb8, 0xbb,
- 0xf3, 0xe1, 0xb9, 0x3a, 0xeb, 0x09, 0xd7, 0x3c, 0x31, 0xbd, 0x1d, 0x3e,
- 0xa6, 0x32, 0xbe, 0xbd, 0x12, 0xec, 0x53, 0x3d, 0x7a, 0xf0, 0x37, 0xbe,
- 0xfc, 0x91, 0x97, 0x3d, 0x86, 0x71, 0x1d, 0xbe, 0x07, 0xfd, 0xc0, 0xbd,
- 0xd4, 0x7d, 0xf0, 0xbd, 0x17, 0x02, 0x61, 0x3d, 0x36, 0x9d, 0xeb, 0xbd,
- 0xa2, 0x37, 0x65, 0x3b, 0xa0, 0x01, 0x98, 0xbd, 0xc0, 0x14, 0x49, 0xbe,
- 0xa7, 0x12, 0xc3, 0xbd, 0x89, 0xe1, 0xc2, 0x3e, 0x91, 0xc0, 0x0d, 0xbe,
- 0x4c, 0xf2, 0x1c, 0xbd, 0xd6, 0xb3, 0x9a, 0xbd, 0x96, 0xba, 0x3e, 0xbe,
- 0x54, 0xa7, 0xce, 0x3c, 0x87, 0x89, 0x26, 0xbd, 0x87, 0xfd, 0xf3, 0xbc,
- 0x98, 0x9e, 0x77, 0xbc, 0xe7, 0x80, 0xed, 0xbd, 0x75, 0x71, 0xf3, 0xbd,
- 0x41, 0x21, 0x76, 0xbc, 0x50, 0x25, 0x2a, 0x3d, 0xf6, 0x6c, 0x3b, 0xbd,
- 0xd0, 0xe6, 0x05, 0x3e, 0x21, 0xd9, 0x3a, 0x3d, 0x6c, 0x7e, 0x9e, 0xbc,
- 0x2d, 0x13, 0x01, 0xbe, 0x2c, 0x01, 0xf6, 0x3c, 0x4b, 0x66, 0x68, 0x3d,
- 0x76, 0xba, 0xea, 0xbc, 0xa4, 0xad, 0xd9, 0xbd, 0x88, 0x0c, 0xef, 0xbd,
- 0x56, 0x59, 0x68, 0x3d, 0x2e, 0x34, 0xc7, 0x3c, 0x3e, 0xbd, 0x17, 0xbe,
- 0x7e, 0x8b, 0x03, 0x3d, 0x75, 0xde, 0x9b, 0x3e, 0x6d, 0xa6, 0xf4, 0x3c,
- 0x1e, 0x98, 0x66, 0x3e, 0x2d, 0x66, 0xab, 0xbe, 0x52, 0x93, 0xcc, 0xbd,
- 0x85, 0x9b, 0x04, 0x3e, 0x91, 0x3b, 0xb4, 0x3e, 0xdc, 0x2a, 0x35, 0xbb,
- 0x8e, 0xa5, 0x81, 0x3e, 0x53, 0x95, 0xc3, 0x3e, 0xba, 0xfb, 0x0e, 0x3d,
- 0xf8, 0x3c, 0x56, 0xb7, 0x9b, 0xec, 0x56, 0x3e, 0x8f, 0xc6, 0x05, 0xbf,
- 0x53, 0x7a, 0x00, 0x3f, 0x9c, 0xb6, 0x5d, 0x3e, 0xd5, 0x20, 0x13, 0xbe,
- 0x4c, 0xb7, 0x55, 0x3d, 0x68, 0xbb, 0x34, 0xbe, 0x09, 0x1c, 0x32, 0xbe,
- 0xe3, 0x4d, 0x90, 0x3d, 0x45, 0x91, 0x88, 0xbe, 0xa1, 0xe6, 0x92, 0xbe,
- 0xcc, 0xe1, 0x81, 0xbe, 0x45, 0x7c, 0x1b, 0xbe, 0x47, 0x0f, 0x88, 0x3e,
- 0xd3, 0x8f, 0x21, 0x3e, 0xd7, 0xd8, 0xa1, 0xbd, 0x91, 0x48, 0x29, 0xbe,
- 0xba, 0x5a, 0x75, 0xbd, 0xb5, 0xe2, 0x7a, 0x3e, 0xd4, 0x40, 0x9f, 0x3d,
- 0x01, 0x33, 0x2c, 0x3c, 0xca, 0x8f, 0xf8, 0x3b, 0x74, 0xfc, 0x7a, 0x3e,
- 0x67, 0xc7, 0x22, 0xbe, 0x41, 0xbd, 0x0b, 0xbe, 0xb7, 0x17, 0xc0, 0x3d,
- 0x95, 0x7c, 0xf9, 0x3e, 0xcd, 0xa6, 0xae, 0x3d, 0x32, 0x42, 0x5e, 0x3e,
- 0x81, 0x9d, 0x54, 0xbe, 0xb8, 0x8d, 0x67, 0xbd, 0x79, 0x4b, 0xc6, 0x3d,
- 0x05, 0xab, 0xbc, 0xbe, 0xeb, 0x3c, 0x0e, 0x3f, 0x6b, 0xc1, 0xac, 0x3d,
- 0x5b, 0x4e, 0xa8, 0xbe, 0xe8, 0x48, 0x41, 0xbf, 0xf8, 0x32, 0x88, 0xbe,
- 0xbe, 0x00, 0x18, 0xbe, 0xa8, 0x49, 0xbf, 0x3e, 0xec, 0x73, 0x02, 0xbe,
- 0x2a, 0x3e, 0x29, 0x3c, 0x15, 0xf0, 0x0a, 0x3d, 0x78, 0x82, 0x11, 0xbf,
- 0x95, 0x50, 0xa0, 0x3e, 0xae, 0x19, 0x30, 0xbe, 0xb1, 0xf4, 0x3e, 0xbe,
- 0x40, 0x7f, 0x60, 0xbd, 0xf6, 0x82, 0xab, 0xbe, 0xb7, 0xd1, 0x47, 0x3e,
- 0x20, 0x94, 0xe3, 0xbd, 0xa0, 0x4f, 0xf2, 0xbd, 0x18, 0xd3, 0x39, 0xbe,
- 0x8f, 0x8b, 0x8d, 0x3d, 0x2a, 0xf1, 0xbd, 0xbe, 0x90, 0x63, 0x15, 0x3e,
- 0xb0, 0x53, 0x97, 0xbd, 0x68, 0xf1, 0xce, 0x3d, 0x3e, 0x49, 0xd3, 0xbd,
- 0xab, 0x33, 0xb7, 0x3e, 0x26, 0xd5, 0x28, 0x3e, 0x0d, 0x2d, 0x27, 0x3e,
- 0xfd, 0x11, 0x34, 0xbe, 0xf6, 0x46, 0xb1, 0x3e, 0x5d, 0xa8, 0x42, 0x3e,
- 0xc1, 0x61, 0x3a, 0xbe, 0x45, 0x5d, 0x11, 0xbe, 0x3c, 0xa2, 0xd2, 0xbd,
- 0x19, 0xc5, 0x1f, 0xbe, 0x59, 0x97, 0x70, 0x3e, 0xc5, 0xd2, 0x17, 0x3f,
- 0xfd, 0x39, 0x7c, 0x3d, 0x0a, 0xeb, 0xa1, 0x3d, 0xad, 0x4d, 0xc4, 0x3b,
- 0x3e, 0x88, 0x44, 0xbe, 0xec, 0x94, 0x7d, 0xbd, 0x0a, 0xb9, 0x1d, 0x3e,
- 0x5f, 0x9e, 0x1a, 0xbd, 0xed, 0x6d, 0xc6, 0x3d, 0x83, 0x7e, 0xb3, 0x3d,
- 0x5f, 0x1a, 0x8c, 0x3d, 0xb1, 0x4e, 0x3a, 0xbe, 0xe7, 0xea, 0xe2, 0xbd,
- 0xfa, 0x32, 0x2b, 0xbe, 0x71, 0x6c, 0x06, 0xbd, 0x9d, 0x52, 0x08, 0xbe,
- 0x84, 0xc3, 0x15, 0x3f, 0x43, 0xfc, 0xad, 0x3e, 0xdc, 0x7f, 0xad, 0x3e,
- 0xa6, 0x3b, 0x26, 0x3e, 0x22, 0x1e, 0x02, 0x3e, 0xb2, 0xc0, 0xc4, 0xbd,
- 0xe0, 0x1a, 0xb2, 0xbe, 0xe1, 0xcd, 0xe4, 0xbd, 0x04, 0xe8, 0x60, 0xbe,
- 0xae, 0xe5, 0x6c, 0x3e, 0xf9, 0x51, 0x30, 0xbe, 0xfa, 0x6b, 0x07, 0xbe,
- 0x3a, 0xbb, 0x31, 0x3f, 0x5a, 0x02, 0x75, 0x3f, 0xb3, 0x5f, 0x0e, 0xbf,
- 0x3a, 0x55, 0x09, 0x3e, 0x19, 0xeb, 0xb4, 0xbd, 0x43, 0xd5, 0x91, 0xbf,
- 0x56, 0x23, 0x61, 0x3f, 0xe2, 0xde, 0x8a, 0xbe, 0xa8, 0xc4, 0xb5, 0x3b,
- 0x11, 0x9b, 0x4c, 0x3e, 0x90, 0x88, 0x2e, 0xbe, 0xae, 0x38, 0x75, 0xbf,
- 0x91, 0x7b, 0x68, 0xbf, 0xfc, 0x09, 0x93, 0xbf, 0xe0, 0xb8, 0xc3, 0xbf,
- 0xd9, 0xff, 0x49, 0xbf, 0xa7, 0x81, 0xbe, 0xbd, 0x22, 0xe6, 0x95, 0xbc,
- 0x24, 0xac, 0xc1, 0x3e, 0xa5, 0x3d, 0xbc, 0xbe, 0xef, 0x26, 0xe5, 0xbd,
- 0xd1, 0x0d, 0x71, 0xbe, 0x4d, 0x65, 0x05, 0x3f, 0x7a, 0x9f, 0xbd, 0x3e,
- 0xcf, 0x28, 0xce, 0x3c, 0x7d, 0x84, 0xda, 0xbd, 0xc3, 0xfd, 0xeb, 0x3e,
- 0x65, 0x9b, 0x0c, 0xbe, 0xc3, 0x8c, 0xc2, 0xbe, 0x00, 0x83, 0xa0, 0xbe,
- 0xca, 0xad, 0xa4, 0x3f, 0x5d, 0x39, 0xf3, 0xbe, 0x5b, 0xd1, 0xa1, 0x3e,
- 0xcf, 0xa7, 0x0b, 0xbf, 0x97, 0x73, 0x9a, 0x3d, 0x4a, 0x13, 0x63, 0x3d,
- 0xa0, 0x9e, 0xbe, 0x3d, 0x64, 0xa0, 0x3c, 0x3e, 0x32, 0x7c, 0x32, 0x3f,
- 0x7e, 0x41, 0x04, 0x3d, 0x0e, 0x63, 0xcb, 0xbf, 0xd7, 0x10, 0xf0, 0xbf,
- 0x27, 0x2d, 0x47, 0xbf, 0x5d, 0x24, 0x9d, 0x3e, 0x17, 0xeb, 0x0a, 0x3f,
- 0x8c, 0xc1, 0x82, 0xbe, 0xeb, 0x86, 0x30, 0x3d, 0xfb, 0x62, 0xb4, 0xbf,
- 0x74, 0x77, 0xb8, 0x3f, 0x06, 0x8e, 0x8f, 0xbd, 0xeb, 0xc4, 0xba, 0x3d,
- 0x2a, 0x99, 0xd3, 0x3d, 0x70, 0x9e, 0x19, 0xbf, 0x13, 0xaa, 0x67, 0xbd,
- 0x44, 0xf3, 0x09, 0x3e, 0xb0, 0xf5, 0xaf, 0xbd, 0x40, 0x5e, 0x9f, 0x3e,
- 0x7f, 0x8d, 0x53, 0xbe, 0x46, 0x2e, 0x81, 0xbe, 0x56, 0x05, 0x60, 0x3e,
- 0xc2, 0x1c, 0x3a, 0x3d, 0xef, 0xf4, 0x19, 0x3d, 0xff, 0x1e, 0x7d, 0x3f,
- 0x4d, 0x69, 0x70, 0x3e, 0x67, 0x84, 0x84, 0xbe, 0x6b, 0x41, 0xd8, 0xbe,
- 0x5c, 0x80, 0xcf, 0x3d, 0xb4, 0xf7, 0xc6, 0x3e, 0xa1, 0xa6, 0x85, 0x3e,
- 0x5b, 0x3e, 0x78, 0xbe, 0x44, 0x33, 0x9d, 0x3d, 0x30, 0x8c, 0x81, 0xbe,
- 0xbe, 0x52, 0x58, 0xbe, 0x96, 0x0f, 0xd5, 0xbc, 0xf9, 0x48, 0x6f, 0x3f,
- 0x8d, 0x67, 0x31, 0x3f, 0xbf, 0x4a, 0x03, 0xbe, 0x53, 0xe3, 0xb0, 0x3d,
- 0xcd, 0x8b, 0xd7, 0x3e, 0x0d, 0x60, 0x41, 0xbe, 0xe1, 0x9e, 0x3c, 0xbe,
- 0x6c, 0x28, 0x0a, 0xbe, 0xcc, 0xa4, 0x26, 0x3e, 0x52, 0x1b, 0x74, 0xbd,
- 0x82, 0x74, 0x18, 0xbe, 0x9d, 0x1c, 0x83, 0xbe, 0x1e, 0xcd, 0x48, 0x3f,
- 0x54, 0x27, 0xc0, 0x3d, 0x44, 0xf6, 0x03, 0x3d, 0x1b, 0xfd, 0x2e, 0xbe,
- 0xae, 0x14, 0xa5, 0x3f, 0x01, 0xb0, 0xa9, 0x3f, 0xe2, 0xe7, 0x7e, 0x3e,
- 0xfc, 0x43, 0xcb, 0x3d, 0x63, 0x9a, 0x41, 0xbe, 0x3f, 0xf0, 0x3d, 0x3f,
- 0xd4, 0xaa, 0xcd, 0x3e, 0x52, 0xe4, 0x8d, 0x3e, 0xa9, 0x26, 0x8d, 0xbe,
- 0xae, 0x92, 0xb9, 0x3e, 0x64, 0xc8, 0x6a, 0xbd, 0x07, 0x12, 0x32, 0x3e,
- 0x28, 0x97, 0x98, 0x3e, 0xb6, 0x0d, 0x9f, 0x3e, 0x93, 0xe5, 0x30, 0x3d,
- 0x30, 0xcc, 0x28, 0xbf, 0x1b, 0x1d, 0x49, 0x3c, 0x04, 0x3e, 0xde, 0x3e,
- 0xb9, 0xc9, 0x7c, 0xbe, 0x72, 0xa7, 0xd2, 0x3c, 0x6d, 0xaf, 0x7a, 0xbe,
- 0x68, 0xc1, 0x99, 0xbd, 0x05, 0xe1, 0xf9, 0xbe, 0xe6, 0xc3, 0x33, 0xbe,
- 0x76, 0x3e, 0x81, 0x3e, 0x73, 0x55, 0x5f, 0xbf, 0x39, 0xe5, 0x22, 0x3f,
- 0x82, 0x72, 0xff, 0xbc, 0xde, 0x86, 0x94, 0xbd, 0xe5, 0x2c, 0xac, 0x3e,
- 0x84, 0xc9, 0x85, 0x3e, 0xda, 0x54, 0x3a, 0x3e, 0x9a, 0x0b, 0xb1, 0xbe,
- 0xcb, 0x4a, 0x88, 0xbd, 0x34, 0xbb, 0x8a, 0x3d, 0x2f, 0x20, 0x8e, 0x3e,
- 0x3f, 0xec, 0x77, 0x3d, 0x9e, 0x95, 0xd1, 0xbd, 0xd8, 0x9f, 0x57, 0xbe,
- 0x68, 0x00, 0x9e, 0x3e, 0xe1, 0x48, 0xb4, 0xbd, 0x16, 0x26, 0xd1, 0xbd,
- 0x9c, 0xc4, 0xc7, 0x3d, 0x05, 0x5f, 0x78, 0xbe, 0x4b, 0xa6, 0x80, 0xbe,
- 0x84, 0x6a, 0xf1, 0x3e, 0x92, 0xee, 0x24, 0xbe, 0x80, 0x1f, 0x2a, 0x3e,
- 0xb8, 0xd1, 0x40, 0x3d, 0x38, 0x54, 0x1b, 0x3e, 0x39, 0x29, 0x84, 0x3e,
- 0xc5, 0xcf, 0x57, 0x3d, 0x15, 0xd2, 0x7c, 0xbe, 0xc7, 0xea, 0x07, 0xbd,
- 0xde, 0x01, 0xfb, 0xbd, 0x96, 0xc5, 0x35, 0xbf, 0xf2, 0x5c, 0x0c, 0x3e,
- 0x86, 0xd9, 0x19, 0xbe, 0x63, 0x7d, 0x24, 0x3e, 0xe4, 0x81, 0xa0, 0x3e,
- 0x98, 0x5c, 0x80, 0xbc, 0x2f, 0x7e, 0xd6, 0xbe, 0xe0, 0x75, 0x98, 0x3e,
- 0x29, 0x30, 0x67, 0x3b, 0x04, 0x90, 0xdc, 0xbd, 0x74, 0xe1, 0x6d, 0xbe,
- 0x44, 0xcb, 0xf0, 0xbd, 0xb3, 0x12, 0x53, 0xbc, 0xe2, 0xf4, 0x27, 0x3e,
- 0xbf, 0xbe, 0x57, 0x3e, 0x64, 0x9e, 0x98, 0xbc, 0x10, 0xf5, 0x42, 0x3e,
- 0x13, 0x44, 0x61, 0xbe, 0x83, 0xd7, 0xbd, 0xbe, 0x4f, 0x01, 0x41, 0x3e,
- 0xd0, 0xa0, 0x31, 0xbf, 0x89, 0x36, 0x7a, 0xbd, 0x03, 0xf7, 0xf7, 0x3e,
- 0xc7, 0x8f, 0xb5, 0x3e, 0x02, 0xe4, 0xee, 0x3d, 0x1a, 0xbb, 0xd4, 0x3e,
- 0x8a, 0x04, 0x15, 0xbe, 0x80, 0x0c, 0x09, 0x3e, 0x48, 0x70, 0xce, 0x3e,
- 0x1d, 0xb8, 0x45, 0xbe, 0x65, 0xd2, 0x3d, 0x3e, 0x74, 0x48, 0x45, 0xbe,
- 0x73, 0xb7, 0x53, 0x3e, 0x46, 0x92, 0x51, 0xbd, 0x21, 0xb9, 0x53, 0x3e,
- 0x3c, 0xb2, 0x15, 0xbf, 0x19, 0x62, 0x1e, 0x3d, 0x97, 0x16, 0x4f, 0x3e,
- 0x06, 0x52, 0xcd, 0x3e, 0xce, 0x9c, 0x98, 0xbd, 0xb5, 0xad, 0xe7, 0x3b,
- 0x67, 0xad, 0x06, 0xbe, 0x53, 0x97, 0x3c, 0xbe, 0xfa, 0x7b, 0x79, 0x3e,
- 0x0f, 0x49, 0x12, 0xbf, 0x43, 0xac, 0xcf, 0xbe, 0x42, 0x3b, 0x0e, 0x3e,
- 0x1d, 0xda, 0x99, 0xbf, 0x18, 0xdc, 0xda, 0x3e, 0x1e, 0x12, 0x93, 0x3c,
- 0x4f, 0xdd, 0x40, 0x3e, 0x92, 0xfb, 0xe6, 0x3d, 0x70, 0x4e, 0x9c, 0x3e,
- 0xc0, 0xcb, 0x9a, 0x3c, 0x14, 0x6e, 0xdd, 0x3d, 0xb0, 0x20, 0x08, 0xbe,
- 0x74, 0x67, 0x35, 0x3d, 0xa2, 0xf2, 0x81, 0xbd, 0x1e, 0x87, 0xdd, 0xbd,
- 0xd0, 0xa7, 0x3d, 0xbc, 0x4e, 0x2a, 0x4b, 0xbd, 0x18, 0xbd, 0xeb, 0xbc,
- 0x16, 0xcf, 0x10, 0x3e, 0x78, 0xf5, 0x95, 0x3d, 0x64, 0x10, 0x84, 0xbd,
- 0x80, 0x00, 0x3c, 0x3d, 0x11, 0xce, 0xee, 0xbd, 0xe0, 0x3c, 0xec, 0x3c,
- 0xdd, 0x63, 0xb5, 0xbd, 0x82, 0xf8, 0x01, 0xbe, 0x0c, 0x7b, 0xb7, 0x3d,
- 0x30, 0xe3, 0xde, 0x3c, 0x0e, 0x96, 0xa3, 0xbd, 0x90, 0xac, 0x11, 0xbd,
- 0x00, 0x94, 0x51, 0x39, 0x8f, 0x21, 0x92, 0xbd, 0xae, 0xed, 0xc9, 0x3d,
- 0x9e, 0x60, 0x91, 0x3d, 0xc0, 0x24, 0x14, 0x3b, 0xa0, 0x4e, 0xe1, 0xbb,
- 0xc4, 0x90, 0xa2, 0x3d, 0xaa, 0x8d, 0x08, 0x3e, 0x2a, 0x12, 0xa1, 0x3d,
- 0xb4, 0xc8, 0x63, 0xbd, 0xf2, 0xa1, 0xb4, 0x3d, 0x40, 0xc6, 0x1e, 0x3b,
- 0x70, 0x8d, 0xb7, 0x3d, 0xc4, 0xca, 0x74, 0x3d, 0x00, 0xca, 0x90, 0xb9,
- 0x42, 0xa0, 0x89, 0xbd, 0x82, 0xb2, 0x0f, 0x3e, 0x3e, 0xc7, 0x30, 0xbd,
- 0x91, 0x5e, 0x10, 0xbe, 0xb0, 0x67, 0x0a, 0xbe, 0xc0, 0x43, 0x19, 0x3c,
- 0x24, 0x5d, 0x57, 0x3d, 0x54, 0x93, 0xb3, 0x3d, 0xaa, 0xcf, 0x35, 0xbd,
- 0xdc, 0xfd, 0x87, 0x3d, 0xd4, 0x15, 0x0a, 0xbd, 0x96, 0x69, 0x96, 0x3d,
- 0x14, 0x33, 0x71, 0xbd, 0x8a, 0x27, 0xd9, 0xbd, 0xea, 0xc3, 0x4e, 0xbd,
- 0xad, 0xdc, 0x07, 0xbe, 0xc4, 0xf3, 0xfd, 0xbd, 0xfd, 0x20, 0x92, 0xbd,
- 0x8e, 0x32, 0xf8, 0xbd, 0x54, 0xba, 0xf6, 0x3d, 0x58, 0xb2, 0x0f, 0x3d,
- 0x40, 0xee, 0x3a, 0x3d, 0x2a, 0x14, 0xc2, 0x3d, 0x71, 0x2c, 0xcb, 0xbd,
- 0x70, 0x47, 0xf7, 0x3c, 0x58, 0xe1, 0x7e, 0xbd, 0x70, 0xf8, 0x74, 0xbd,
- 0xae, 0x25, 0x09, 0xbe, 0x16, 0x38, 0x88, 0x3d, 0xc4, 0x1d, 0xea, 0xbd,
- 0xc0, 0x2d, 0xa0, 0x3c, 0x6d, 0x1b, 0xf9, 0xbd, 0xba, 0x05, 0xec, 0xbd,
- 0xab, 0xce, 0xba, 0xbd, 0xc6, 0x5c, 0xc0, 0x3d, 0x14, 0x35, 0xe0, 0x3d,
- 0xa4, 0x46, 0x7f, 0x3d, 0xf2, 0xd8, 0x05, 0x3e, 0x00, 0xd7, 0xe0, 0xbb,
- 0xdd, 0x1a, 0x0a, 0xbe, 0x8e, 0x2a, 0xf4, 0xbd, 0xd2, 0x66, 0x3e, 0xbd,
- 0x38, 0xf2, 0x45, 0x3d, 0xb3, 0x24, 0x81, 0xbd, 0x5d, 0x53, 0x06, 0xbe,
- 0x44, 0x3b, 0xde, 0xbc, 0xda, 0xa9, 0x99, 0x3d, 0xf2, 0x26, 0xad, 0x3d,
- 0x68, 0x08, 0x10, 0x3e, 0x38, 0x47, 0x35, 0x3d, 0x40, 0x8a, 0x03, 0x3b,
- 0xdc, 0x2c, 0x09, 0x3e, 0x03, 0x45, 0x98, 0xbd, 0x76, 0xcb, 0xa4, 0x3d,
- 0x58, 0x6a, 0x07, 0xbd, 0xcd, 0x06, 0x9d, 0xbd, 0x06, 0x2c, 0x6b, 0xbd,
- 0xb0, 0xfd, 0xdf, 0x3d, 0xc7, 0xa4, 0x0d, 0xbe, 0x9c, 0xa2, 0x70, 0xbd,
- 0x6d, 0x8f, 0x07, 0xbe, 0x90, 0xcd, 0x12, 0x3c, 0xd4, 0x5e, 0x0c, 0x3d,
- 0x36, 0x30, 0xa6, 0x3d, 0x84, 0x18, 0x61, 0xbd, 0xc0, 0x0d, 0x93, 0xbb,
- 0x85, 0x23, 0xd7, 0x3d, 0xbd, 0xcb, 0xf5, 0x3c, 0xc8, 0x84, 0x4b, 0xbb,
- 0x9c, 0x5f, 0x8b, 0xbe, 0xa5, 0x4b, 0x68, 0xbd, 0x2b, 0x0c, 0x2f, 0xbd,
- 0xd3, 0x45, 0xd6, 0x3e, 0xb5, 0x3b, 0x18, 0x3f, 0x92, 0x86, 0xed, 0xbd,
- 0xd4, 0x02, 0xd2, 0xbd, 0x2f, 0xb9, 0xd6, 0x3e, 0x42, 0x4d, 0x8a, 0x3e,
- 0x27, 0x2a, 0xb4, 0xbd, 0xde, 0x44, 0xf4, 0x3e, 0x1c, 0xb1, 0xc8, 0x3c,
- 0x03, 0x91, 0x64, 0xbe, 0xd9, 0xdf, 0xb5, 0x3c, 0x36, 0x2c, 0x47, 0xbe,
- 0xd0, 0x77, 0xf7, 0xbe, 0x05, 0xa4, 0x51, 0xbf, 0x6d, 0x0e, 0x4b, 0xbf,
- 0x86, 0x96, 0x08, 0xbf, 0x58, 0xbd, 0xb4, 0x3d, 0xbd, 0xb5, 0x7e, 0xbe,
- 0xbb, 0xe1, 0xe6, 0xbe, 0x8c, 0x60, 0xca, 0xbe, 0x73, 0x3a, 0x58, 0xbe,
- 0x4e, 0xf2, 0x44, 0x3c, 0xf9, 0xd3, 0xf1, 0x3e, 0xa6, 0x18, 0x28, 0x3e,
- 0x3a, 0x26, 0xfd, 0xbd, 0x57, 0x86, 0x9b, 0x3d, 0xdb, 0xe9, 0x66, 0xbe,
- 0xd1, 0xc8, 0xa7, 0xbd, 0x51, 0x9a, 0x62, 0xbd, 0xa7, 0x5f, 0xe8, 0xbd,
- 0xf8, 0x19, 0x8a, 0x3e, 0x4f, 0x8f, 0x33, 0xbe, 0xa7, 0xdf, 0x51, 0x3e,
- 0x5f, 0x0d, 0x95, 0xbd, 0x9c, 0xb3, 0x06, 0xbe, 0x86, 0x0f, 0x68, 0xbd,
- 0x39, 0xc3, 0x01, 0x3d, 0xee, 0xe3, 0xca, 0x3e, 0xcd, 0x63, 0xa7, 0x3d,
- 0x79, 0x65, 0xab, 0x3c, 0x1b, 0x0b, 0xa7, 0xbe, 0x7e, 0x5f, 0x05, 0xbf,
- 0xf4, 0x56, 0x1b, 0x3e, 0x5b, 0x6f, 0x25, 0x3e, 0x55, 0xb7, 0xad, 0xbd,
- 0xde, 0x6d, 0x30, 0xbe, 0x40, 0x1f, 0x80, 0x3d, 0x61, 0x26, 0x54, 0xbf,
- 0xe5, 0xda, 0xb7, 0x3f, 0xee, 0xa7, 0xb6, 0xbd, 0x18, 0x10, 0xfa, 0xbc,
- 0xc8, 0xa9, 0x63, 0x3e, 0x85, 0xc2, 0x3f, 0xbf, 0xf1, 0x93, 0x47, 0x3d,
- 0xe0, 0x32, 0x2b, 0x3f, 0x13, 0x57, 0xa3, 0x3c, 0xde, 0xd1, 0xad, 0x3e,
- 0xd7, 0x26, 0x1f, 0xbe, 0x2d, 0xed, 0xcb, 0xbe, 0xb0, 0xa3, 0x6c, 0x3e,
- 0xf3, 0xf9, 0x9f, 0xbb, 0xc0, 0x3f, 0x3c, 0x3c, 0x55, 0x6a, 0x5b, 0xbe,
- 0x08, 0xf7, 0x76, 0x3e, 0xdb, 0x54, 0x84, 0xbd, 0xb9, 0x89, 0x8c, 0xbd,
- 0x5c, 0xdd, 0xed, 0x3d, 0xef, 0x90, 0x22, 0xbd, 0xbb, 0xa2, 0x24, 0xbd,
- 0x25, 0xec, 0x86, 0x3c, 0x3e, 0x83, 0x43, 0x3e, 0x24, 0xe9, 0x22, 0xbe,
- 0x35, 0xb1, 0x05, 0x3e, 0xbc, 0x76, 0x8c, 0x3e, 0xe0, 0x7d, 0x63, 0x3f,
- 0xff, 0xa5, 0x23, 0xbd, 0x6d, 0x95, 0x59, 0xbd, 0xc0, 0x3c, 0x01, 0xbd,
- 0xe2, 0x0e, 0xd6, 0x3e, 0x89, 0x1c, 0xbc, 0x3d, 0xc2, 0xad, 0x22, 0x3e,
- 0xaa, 0x39, 0x8e, 0xbd, 0x24, 0x96, 0xba, 0xbc, 0xa3, 0x71, 0x83, 0x3e,
- 0xbd, 0xb8, 0x0d, 0xbc, 0x91, 0xc4, 0x2d, 0xbe, 0x17, 0x24, 0x2a, 0x3f,
- 0x92, 0x49, 0xe1, 0x3d, 0x62, 0xad, 0x57, 0x3e, 0x49, 0x5d, 0xc1, 0x3c,
- 0x64, 0x03, 0xa7, 0x3e, 0x74, 0x60, 0x1e, 0x3f, 0x2a, 0x12, 0x01, 0x3e,
- 0x04, 0xb3, 0xc2, 0xbd, 0xc6, 0xc8, 0x70, 0xbe, 0x41, 0xc4, 0xe9, 0x3d,
- 0x2b, 0x41, 0x06, 0xbe, 0xd9, 0x4d, 0xc9, 0xbd, 0x31, 0x5c, 0x47, 0xbd,
- 0x3b, 0x00, 0x8c, 0x3d, 0x85, 0x2a, 0xea, 0xbd, 0x11, 0xb4, 0x0f, 0x3d,
- 0x9b, 0x7a, 0x86, 0xbd, 0x35, 0x0b, 0x22, 0x3f, 0xf5, 0xd2, 0xdc, 0x3e,
- 0x02, 0x05, 0x50, 0xbd, 0x6c, 0xf9, 0x0d, 0x3e, 0xee, 0xbf, 0x8e, 0x3e,
- 0x5b, 0x4a, 0xaa, 0xbe, 0x3a, 0x0c, 0xd3, 0x3e, 0xfb, 0x3f, 0xc9, 0xbd,
- 0x38, 0xad, 0xe0, 0x3e, 0x10, 0xb5, 0x18, 0x3f, 0xa2, 0xc9, 0xa4, 0xba,
- 0xa6, 0x8e, 0xe5, 0xbd, 0x2b, 0x2d, 0x2b, 0xbe, 0x53, 0xce, 0xc9, 0xbb,
- 0x15, 0x80, 0xd8, 0x3e, 0xc6, 0x9c, 0x38, 0xbe, 0x22, 0x2b, 0x8b, 0xbd,
- 0x55, 0x54, 0xd3, 0xbe, 0x2a, 0x21, 0xdc, 0x3d, 0x1e, 0x2e, 0x1c, 0xbf,
- 0xeb, 0x23, 0x62, 0xbd, 0xf3, 0xdd, 0x98, 0xbe, 0x99, 0x3e, 0x3f, 0x3e,
- 0x0d, 0xed, 0xe0, 0x3c, 0x50, 0x7b, 0x15, 0xbe, 0x3e, 0xc7, 0xeb, 0x3d,
- 0x20, 0x7c, 0x15, 0xbe, 0xab, 0xda, 0xba, 0x3c, 0xdb, 0x00, 0x0c, 0xbe,
- 0x32, 0xdc, 0xaa, 0xbe, 0x9c, 0x41, 0x3a, 0xbf, 0x89, 0x01, 0x51, 0xbe,
- 0x1d, 0xdf, 0x13, 0xbe, 0x97, 0x26, 0x9e, 0x3d, 0x2c, 0x6c, 0x18, 0xbc,
- 0x71, 0xf6, 0x3f, 0x3e, 0x94, 0x1e, 0xf2, 0x3e, 0x62, 0xcd, 0xdb, 0xbd,
- 0xdf, 0x5d, 0xb2, 0xbd, 0x36, 0x4f, 0xe5, 0xbe, 0x48, 0x00, 0x6e, 0xbe,
- 0x19, 0xc8, 0x04, 0x3f, 0x5c, 0x50, 0x80, 0x3e, 0xe5, 0xba, 0x42, 0xbd,
- 0x19, 0x44, 0x25, 0x3d, 0xff, 0x79, 0x72, 0x3e, 0xeb, 0x43, 0x93, 0xbe,
- 0x35, 0x68, 0x03, 0xbe, 0xe5, 0x15, 0x01, 0xbe, 0x48, 0x1f, 0x9c, 0xbd,
- 0x4b, 0xf3, 0x37, 0x3e, 0x5f, 0xdb, 0xc5, 0x3d, 0xe4, 0x55, 0xc1, 0x3d,
- 0x94, 0x18, 0x4b, 0x3e, 0x90, 0x61, 0x12, 0x3d, 0x0c, 0x33, 0x25, 0xbd,
- 0xbd, 0xe9, 0xa9, 0xbc, 0xc7, 0xc6, 0x5b, 0xbd, 0x9a, 0x84, 0x0c, 0x3f,
- 0xbc, 0x16, 0xbc, 0xbd, 0xf8, 0x93, 0x8d, 0xbd, 0x94, 0xe4, 0x29, 0xbe,
- 0xc8, 0x74, 0x76, 0xbe, 0x0f, 0x3c, 0x82, 0xbe, 0xbf, 0x0f, 0xb0, 0xbc,
- 0xea, 0x41, 0x78, 0xbd, 0xfd, 0xb8, 0x3a, 0x3e, 0x73, 0x20, 0xec, 0x3e,
- 0x9f, 0x0d, 0x88, 0x3d, 0x68, 0xfe, 0xdf, 0x3b, 0x55, 0xf8, 0xe9, 0xbd,
- 0x98, 0x46, 0x49, 0x3d, 0x27, 0xa1, 0x0c, 0xbe, 0x8f, 0x5e, 0x7a, 0xbe,
- 0x51, 0x10, 0x12, 0xbe, 0xf2, 0xaf, 0x4b, 0x3d, 0x0a, 0xdc, 0x65, 0x3e,
- 0x0a, 0xfc, 0xbe, 0x3e, 0xd1, 0x54, 0x93, 0xbd, 0xc7, 0x0f, 0x9f, 0x3e,
- 0x81, 0x16, 0x67, 0x3d, 0x8f, 0x55, 0xbd, 0x3d, 0x59, 0x6b, 0x81, 0x3c,
- 0x0f, 0x57, 0x0d, 0xbe, 0xee, 0x7a, 0x4d, 0xbe, 0xcb, 0x8b, 0x86, 0xbe,
- 0x4d, 0x4f, 0x26, 0xbd, 0xfc, 0xe7, 0x9c, 0xbd, 0x73, 0xd4, 0xa3, 0xbd,
- 0x77, 0x9e, 0x23, 0xbf, 0x9f, 0x15, 0x86, 0xbd, 0xa0, 0xf4, 0xb3, 0x3e,
- 0xab, 0x2a, 0x00, 0xbd, 0xda, 0xde, 0x9c, 0xbe, 0x32, 0x6b, 0xa4, 0xbd,
- 0x6b, 0x63, 0x2f, 0xbe, 0x22, 0xfd, 0x7e, 0xbe, 0x95, 0xba, 0x1e, 0xbe,
- 0x24, 0x35, 0x88, 0x3e, 0xac, 0xcb, 0x82, 0xbd, 0xc0, 0xbc, 0xb9, 0xbe,
- 0x8f, 0x13, 0x0c, 0xbc, 0xce, 0x7f, 0xbf, 0xbd, 0x1b, 0x8e, 0xc9, 0x3d,
- 0x20, 0xfa, 0x5e, 0xbe, 0x64, 0x22, 0xe4, 0xbe, 0x8d, 0x23, 0x10, 0xbe,
- 0x58, 0xe9, 0x49, 0xbe, 0x94, 0x0d, 0x8a, 0xbe, 0x34, 0x20, 0x9b, 0x3d,
- 0xcf, 0x14, 0x0b, 0xbe, 0xd7, 0x5c, 0x70, 0xbe, 0xe2, 0x0d, 0x20, 0x3e,
- 0x3a, 0x2e, 0xb7, 0x3d, 0x38, 0x18, 0x98, 0xbd, 0x79, 0x1a, 0x62, 0xbc,
- 0xc9, 0xcf, 0x50, 0x3c, 0x31, 0x13, 0xb3, 0xbd, 0x23, 0x0a, 0x39, 0x3e,
- 0xa7, 0xf3, 0x6d, 0xbe, 0x92, 0x16, 0xb5, 0x3e, 0xb5, 0x95, 0x0a, 0x3f,
- 0x6c, 0x96, 0x27, 0xbe, 0xf8, 0x18, 0xa1, 0x3e, 0x30, 0x94, 0xdf, 0xbe,
- 0x1c, 0x66, 0x00, 0xbe, 0xd0, 0xe8, 0x45, 0x3c, 0xa6, 0x24, 0x2e, 0xbe,
- 0x37, 0x07, 0x31, 0x3d, 0x13, 0x63, 0x85, 0x3b, 0x48, 0xd2, 0x8f, 0xbd,
- 0xa6, 0xf4, 0xbd, 0xbd, 0x09, 0x97, 0x12, 0x3f, 0xfb, 0xe4, 0x42, 0x3e,
- 0x3d, 0xa8, 0x68, 0x3c, 0x27, 0x42, 0x7e, 0xbc, 0xff, 0xe2, 0xb3, 0xbd,
- 0x42, 0xb0, 0x56, 0x3d, 0x96, 0xee, 0xaf, 0x3b, 0xb8, 0xe3, 0xa1, 0xbd,
- 0xd9, 0x01, 0x02, 0x3e, 0xf4, 0xf8, 0x2e, 0x3d, 0x7a, 0x08, 0x24, 0x3e,
- 0x48, 0xd9, 0x6a, 0x3c, 0x7e, 0x27, 0xf4, 0x3c, 0x88, 0x73, 0x86, 0xbd,
- 0x3c, 0x84, 0x8c, 0xbc, 0x1e, 0x3d, 0x38, 0xbd, 0xd8, 0x25, 0xc0, 0xbd,
- 0x4b, 0xf8, 0xb2, 0xbd, 0xce, 0x77, 0x06, 0xbd, 0xf7, 0x9a, 0xc2, 0xbe,
- 0xe8, 0x64, 0x6e, 0xbd, 0xaa, 0xa6, 0x38, 0xbe, 0x65, 0x7b, 0xe6, 0xbd,
- 0xdb, 0x92, 0x7b, 0x3e, 0x66, 0x8b, 0x0b, 0xbe, 0xf4, 0x19, 0xc6, 0xbd,
- 0x73, 0xd3, 0x18, 0xbd, 0x26, 0xd4, 0x31, 0x3d, 0x63, 0xe0, 0x09, 0x3d,
- 0x64, 0x85, 0x1b, 0xbd, 0x8d, 0xb3, 0x3f, 0x3d, 0x7f, 0xab, 0x18, 0xbe,
- 0xcc, 0x6c, 0x9b, 0xba, 0xd0, 0x11, 0x4b, 0x3d, 0x93, 0xeb, 0xa8, 0x3e,
- 0xfe, 0xb7, 0x6e, 0xbd, 0x8f, 0xb8, 0x2a, 0xbe, 0x1e, 0xcb, 0x1d, 0x3e,
- 0x3e, 0xb1, 0xdf, 0xbd, 0xb7, 0xb9, 0x6d, 0xbd, 0x75, 0xd4, 0xb4, 0xbd,
- 0x03, 0xd8, 0x11, 0xbe, 0x8b, 0xdd, 0x78, 0x3d, 0xe6, 0x4f, 0xe2, 0x3c,
- 0x03, 0x45, 0xbf, 0xbe, 0x92, 0xc6, 0x03, 0xbe, 0xfa, 0xf9, 0x62, 0xbe,
- 0xa1, 0xb8, 0x4c, 0xbe, 0x53, 0x97, 0x20, 0xbe, 0x36, 0x36, 0xd7, 0xbe,
- 0xfc, 0x8b, 0xaf, 0x3c, 0x96, 0x96, 0xc6, 0xbd, 0x9b, 0x44, 0x4b, 0x3e,
- 0x63, 0x73, 0x3d, 0xbd, 0x21, 0xa6, 0x2b, 0xbe, 0xd0, 0x98, 0x9b, 0xbe,
- 0xa9, 0x78, 0x31, 0x3e, 0xe2, 0xa8, 0xa4, 0xbd, 0xe6, 0x05, 0x12, 0xbb,
- 0x5c, 0xed, 0x60, 0xbd, 0x46, 0x9d, 0x8a, 0xbe, 0x69, 0xdb, 0x09, 0x3b,
- 0xa8, 0xb8, 0xfd, 0x3c, 0x5b, 0x1d, 0xa5, 0x3c, 0x90, 0x41, 0xbf, 0xbe,
- 0x23, 0xfe, 0x29, 0x3b, 0x47, 0x0c, 0x88, 0xbe, 0x65, 0xde, 0x56, 0xbd,
- 0x30, 0xa7, 0x51, 0x3e, 0xf9, 0xe6, 0x5e, 0xbe, 0x8f, 0x81, 0x1e, 0xbe,
- 0x24, 0x1b, 0x94, 0x3e, 0x15, 0xb5, 0xca, 0x3e, 0xfd, 0xbd, 0xdf, 0xbd,
- 0xd3, 0xe6, 0x6b, 0x3e, 0x6a, 0x87, 0xef, 0xbe, 0x6e, 0x6a, 0x81, 0x3b,
- 0x3c, 0x46, 0xc8, 0x3d, 0x46, 0x40, 0xa3, 0xbe, 0x95, 0x83, 0x24, 0xbe,
- 0xcc, 0x66, 0x12, 0x3e, 0xea, 0x47, 0x91, 0x3d, 0x57, 0x0c, 0xd2, 0xbe,
- 0x02, 0x5a, 0x4d, 0x3e, 0x96, 0x7b, 0x09, 0xbd, 0x91, 0x28, 0x23, 0x3e,
- 0x71, 0xa7, 0x9b, 0x3d, 0xd3, 0x93, 0xfe, 0xbd, 0xe6, 0x2a, 0x87, 0x3e,
- 0xe3, 0x0c, 0x9c, 0xbe, 0xee, 0x76, 0x35, 0x3c, 0x09, 0x33, 0x02, 0xbe,
- 0xfa, 0xa1, 0xd0, 0x3d, 0x6f, 0x77, 0x85, 0xbd, 0x5b, 0x88, 0x20, 0x3d,
- 0xa2, 0x2e, 0x91, 0xbd, 0x78, 0x6a, 0x40, 0x3c, 0x93, 0x3f, 0x8b, 0xbd,
- 0x4a, 0xc3, 0x33, 0x3d, 0xda, 0xbc, 0xa2, 0x3d, 0x7a, 0x6a, 0xf7, 0xbc,
- 0x7e, 0x60, 0x60, 0xbd, 0x8e, 0xa7, 0xee, 0xbd, 0x37, 0xae, 0x38, 0x3c,
- 0x6a, 0x14, 0x44, 0x3d, 0x97, 0xeb, 0x92, 0xbd, 0xb7, 0xf1, 0x3f, 0x3d,
- 0xe2, 0xa3, 0x31, 0xbc, 0x30, 0x4d, 0x54, 0xbe, 0xd5, 0x06, 0x49, 0x3d,
- 0x20, 0x8f, 0xf9, 0x3c, 0x77, 0x94, 0xa9, 0x3d, 0xb5, 0x9a, 0x6d, 0x3c,
- 0x54, 0x6b, 0x66, 0x3e, 0x7f, 0x09, 0x5d, 0x3d, 0x30, 0x30, 0x4c, 0xbd,
- 0x33, 0x59, 0x05, 0xbe, 0x70, 0x8f, 0x7d, 0x3c, 0x20, 0xed, 0x3a, 0xbe,
- 0xf1, 0x59, 0x89, 0xbe, 0xa1, 0xb2, 0x3c, 0xbd, 0x65, 0xc9, 0xbb, 0x3d,
- 0x83, 0xe1, 0x32, 0x3c, 0x6f, 0xbe, 0xd6, 0x3e, 0x57, 0xc0, 0x1e, 0x3e,
- 0xdb, 0xd8, 0x93, 0xbd, 0xa0, 0x7c, 0xfc, 0x3c, 0x22, 0x07, 0x2b, 0xbd,
- 0x5c, 0xba, 0x45, 0xbd, 0x1e, 0x61, 0x8d, 0x3d, 0x7d, 0x59, 0xed, 0xbd,
- 0x5f, 0x65, 0x1a, 0xbe, 0x7d, 0x3a, 0x72, 0x3e, 0x9c, 0xdd, 0x18, 0x3c,
- 0xda, 0xf8, 0x8f, 0xbe, 0x01, 0x41, 0x0c, 0xbc, 0xee, 0xbc, 0x38, 0x3d,
- 0x9f, 0x92, 0x9a, 0xbd, 0xed, 0xbd, 0x90, 0xbe, 0xbe, 0x06, 0x15, 0x3e,
- 0xf9, 0x40, 0x16, 0xbe, 0x2a, 0xab, 0x2d, 0xbe, 0xd7, 0x59, 0x39, 0xbe,
- 0x6a, 0x92, 0xed, 0xbc, 0x69, 0xcb, 0x04, 0x3e, 0x8e, 0xd1, 0x52, 0x3d,
- 0xf9, 0x8c, 0xeb, 0xbe, 0xb1, 0x0c, 0x8a, 0x3d, 0xe7, 0xfb, 0x95, 0xbe,
- 0xd3, 0x10, 0x42, 0x3e, 0x50, 0x9e, 0xa3, 0x3d, 0xc3, 0x57, 0x25, 0xbe,
- 0x5e, 0x9c, 0x82, 0x3d, 0x54, 0x2a, 0xab, 0xbd, 0xa1, 0x30, 0x7e, 0x3d,
- 0x40, 0x3d, 0xc1, 0x3c, 0xdc, 0xda, 0x94, 0x3e, 0x4c, 0x68, 0x8b, 0x3e,
- 0xba, 0xf6, 0xdf, 0x3e, 0xa7, 0xf0, 0x6e, 0xbd, 0xf0, 0x30, 0x3a, 0xba,
- 0x27, 0xd5, 0xa8, 0x3c, 0xaf, 0x5f, 0xa8, 0x3e, 0x96, 0xe2, 0x00, 0x3e,
- 0x39, 0xaf, 0xb9, 0xbd, 0x86, 0x80, 0xfd, 0x3d, 0xdf, 0x04, 0x9b, 0x3e,
- 0x4b, 0x32, 0x25, 0xbe, 0xac, 0xf0, 0x84, 0x3e, 0x99, 0xaf, 0x97, 0x3c,
- 0x0d, 0x13, 0xbc, 0x3e, 0x09, 0x68, 0x27, 0xbc, 0x28, 0x6a, 0x92, 0x3c,
- 0x6c, 0x3c, 0x0d, 0x3f, 0x05, 0x23, 0xea, 0x3e, 0x6f, 0x43, 0x1a, 0xbf,
- 0x58, 0x6f, 0x85, 0x3f, 0x3d, 0x20, 0x1e, 0x3c, 0x89, 0x34, 0xdf, 0x3e,
- 0x35, 0xb3, 0xfc, 0xbd, 0xbe, 0xd5, 0x13, 0x3e, 0xfe, 0xfa, 0x03, 0xbe,
- 0xac, 0x3f, 0xd4, 0xbd, 0x8a, 0x28, 0xa1, 0xbf, 0x9f, 0x8b, 0x51, 0xbd,
- 0xc7, 0x6e, 0xbd, 0x3e, 0xf1, 0x4b, 0x8a, 0xbf, 0xca, 0xe6, 0xa4, 0x3e,
- 0x99, 0xc9, 0xcf, 0x3d, 0x2b, 0x18, 0x81, 0xbd, 0x56, 0xad, 0x23, 0x3e,
- 0xbf, 0x74, 0xf5, 0x3d, 0x17, 0xf9, 0x59, 0xbc, 0x79, 0xea, 0x59, 0x3f,
- 0x5c, 0x1b, 0x14, 0xbe, 0xbc, 0x06, 0x42, 0x3f, 0xbe, 0xd1, 0xdf, 0xbe,
- 0x07, 0x9b, 0x5b, 0xbc, 0xad, 0xef, 0x02, 0x3c, 0x1f, 0x42, 0x05, 0x3f,
- 0x56, 0xeb, 0xcb, 0xbb, 0x58, 0xe6, 0x76, 0xbe, 0xb4, 0xef, 0xc8, 0x3d,
- 0xdb, 0x3b, 0x14, 0xbe, 0xaa, 0x78, 0xaa, 0x3d, 0xa5, 0xd7, 0x18, 0x3e,
- 0x87, 0x27, 0x2d, 0xbc, 0x99, 0x42, 0x4c, 0x3d, 0xe7, 0x91, 0x53, 0x3e,
- 0x75, 0xb8, 0x98, 0x3d, 0x7c, 0x1e, 0x66, 0x3f, 0x0e, 0x4f, 0x1b, 0xbe,
- 0x95, 0xd5, 0x8e, 0xbd, 0xed, 0x3e, 0xe8, 0x3e, 0x90, 0xd0, 0x96, 0x3e,
- 0xd5, 0x56, 0x99, 0x3e, 0x1b, 0x16, 0xc2, 0xbd, 0xbd, 0x23, 0x14, 0xbc,
- 0xa6, 0x4e, 0x8a, 0xbc, 0xd7, 0x5d, 0x1d, 0xbf, 0x73, 0xbc, 0xda, 0x3e,
- 0xde, 0x18, 0x63, 0xbe, 0x98, 0x1c, 0x3a, 0x3b, 0xfe, 0x36, 0x18, 0xbf,
- 0x36, 0xa9, 0x9b, 0xbc, 0xf4, 0xef, 0x82, 0xbe, 0x20, 0x7b, 0x39, 0xbe,
- 0x74, 0x73, 0x75, 0x3e, 0xff, 0xf9, 0x11, 0xbe, 0x58, 0x44, 0x01, 0xbe,
- 0xf5, 0x46, 0xbf, 0xbd, 0x8a, 0x87, 0xc2, 0x3d, 0x2f, 0xf8, 0xdb, 0xbd,
- 0xf9, 0xcc, 0xcd, 0xb9, 0xb4, 0x6c, 0x9a, 0xbe, 0x81, 0xfe, 0x8d, 0x3d,
- 0x9e, 0x28, 0xdb, 0xbe, 0x4e, 0x3a, 0x1e, 0xbf, 0x5e, 0xc4, 0x4f, 0xbb,
- 0x39, 0xf3, 0xab, 0xbe, 0x42, 0x4b, 0x3f, 0x3d, 0xcb, 0x36, 0xb6, 0xbe,
- 0xf7, 0x0d, 0xe7, 0x3d, 0xbf, 0x9f, 0x0d, 0xbe, 0x13, 0x81, 0x84, 0x3d,
- 0x8b, 0x97, 0x76, 0xbc, 0x4c, 0x44, 0x3e, 0x3e, 0xc7, 0x04, 0x9e, 0xbe,
- 0x3c, 0x38, 0xc5, 0xbe, 0x30, 0x7b, 0x7e, 0x3d, 0xfa, 0xe6, 0x89, 0x3e,
- 0x1b, 0xb9, 0xf1, 0x3e, 0xda, 0xbc, 0xd4, 0x3d, 0x70, 0xdb, 0x1c, 0xbe,
- 0x4e, 0x3d, 0xcd, 0x3d, 0xf3, 0xfb, 0x85, 0xbd, 0x1b, 0xa7, 0xa1, 0x3e,
- 0xa4, 0x5a, 0x2d, 0xbe, 0x29, 0x20, 0x1f, 0x3f, 0xbd, 0x64, 0xbe, 0x3e,
- 0xa4, 0x1d, 0xda, 0xbf, 0x7e, 0x83, 0x37, 0x3e, 0x98, 0x8f, 0x29, 0xbc,
- 0x8b, 0xda, 0x1a, 0xbc, 0xeb, 0x72, 0x3c, 0x3d, 0xb0, 0xb2, 0xf9, 0xbe,
- 0xbf, 0x8f, 0xa1, 0x3d, 0x5d, 0xef, 0xd8, 0xbd, 0x16, 0x72, 0x16, 0xbf,
- 0x78, 0x1d, 0x6b, 0x3d, 0x35, 0x52, 0x67, 0xbe, 0x81, 0x00, 0xb6, 0xbd,
- 0xae, 0x95, 0x45, 0xbc, 0xf2, 0x5e, 0xcd, 0x3c, 0xa1, 0x33, 0xbc, 0x3d,
- 0x4e, 0x12, 0x7e, 0x3c, 0x95, 0x96, 0xe9, 0xbb, 0xaa, 0x28, 0x2f, 0x3e,
- 0x81, 0x48, 0x1f, 0x3e, 0xd6, 0xe1, 0x4b, 0x3d, 0x08, 0x87, 0x5c, 0xbd,
- 0x89, 0xcc, 0x3d, 0x3d, 0xc7, 0x94, 0xaf, 0xbd, 0x5a, 0x4d, 0x08, 0xbd,
- 0x0c, 0xaa, 0x82, 0xbe, 0x2b, 0xc0, 0x53, 0xbd, 0x90, 0xf7, 0xc5, 0xbd,
- 0x35, 0xbc, 0x9e, 0xbe, 0xb4, 0xdf, 0xaf, 0x3d, 0xc7, 0x96, 0x02, 0x3c,
- 0xd4, 0x09, 0xae, 0x3c, 0xda, 0xd5, 0x3b, 0xbe, 0x4c, 0x33, 0x2a, 0xbe,
- 0x45, 0xc4, 0x85, 0xbe, 0xd5, 0x15, 0xb4, 0x3d, 0x4b, 0xea, 0xe9, 0xbc,
- 0xe1, 0x74, 0xa7, 0xbb, 0xf5, 0x07, 0x9d, 0x3d, 0xa5, 0xc6, 0x8e, 0x3d,
- 0xa3, 0x31, 0xa6, 0xbd, 0xb9, 0xa9, 0x3a, 0xbe, 0x0f, 0xaa, 0xb8, 0xbe,
- 0x19, 0xbe, 0xf6, 0xbd, 0x04, 0x34, 0x5e, 0xbd, 0x75, 0x51, 0x06, 0xbe,
- 0xb2, 0xb6, 0x89, 0xbd, 0x8b, 0xfe, 0x6e, 0xbd, 0xec, 0x9c, 0xb7, 0x3d,
- 0xce, 0x36, 0x70, 0xbd, 0x22, 0xad, 0x50, 0xbb, 0xec, 0xfc, 0x3c, 0xbe,
- 0x49, 0xb0, 0xac, 0x3e, 0xc3, 0x8d, 0xaa, 0xbd, 0x46, 0xbd, 0x6b, 0xbe,
- 0x4e, 0xb6, 0x37, 0xbe, 0x32, 0xa4, 0x27, 0x3e, 0x6e, 0xe7, 0xc8, 0xbe,
- 0x23, 0xac, 0x46, 0xbe, 0x4e, 0xff, 0x01, 0xbc, 0xaa, 0x73, 0xfb, 0x3d,
- 0xb8, 0x5e, 0x55, 0xbe, 0x02, 0xf1, 0x13, 0x3c, 0xd1, 0xd6, 0x15, 0x3e,
- 0xba, 0xe0, 0x16, 0xbe, 0x76, 0xe2, 0x55, 0x3d, 0xa1, 0x17, 0x36, 0xbd,
- 0xf8, 0x7f, 0x55, 0x3d, 0x40, 0x62, 0x6a, 0x3e, 0xad, 0x83, 0x88, 0x3d,
- 0x76, 0xd1, 0x98, 0xbe, 0x70, 0x66, 0x5d, 0x3b, 0xf1, 0xd5, 0x61, 0x3e,
- 0x2b, 0x60, 0x21, 0xbd, 0xaf, 0x65, 0x11, 0xbd, 0x44, 0x32, 0xfa, 0xbd,
- 0x6b, 0xe3, 0xaf, 0x3c, 0x90, 0x38, 0x3e, 0x3e, 0x52, 0x23, 0x9a, 0xbd,
- 0x68, 0x4a, 0x56, 0x3e, 0x50, 0xf0, 0x53, 0xbe, 0x63, 0xcb, 0xe6, 0xbe,
- 0x8d, 0xee, 0x82, 0xbd, 0xf3, 0xd1, 0xa5, 0xbe, 0x66, 0x1b, 0xbd, 0x3d,
- 0x01, 0xbc, 0xcb, 0x3d, 0x31, 0x5a, 0x6a, 0xbd, 0xf3, 0x1e, 0xac, 0x3d,
- 0x3f, 0x4d, 0x05, 0x3e, 0xc8, 0x94, 0x1a, 0xbd, 0x33, 0xdf, 0xdd, 0xbd,
- 0xd1, 0x05, 0xbb, 0xbd, 0x49, 0xe1, 0x82, 0xbd, 0x48, 0xb9, 0x99, 0xbe,
- 0x8a, 0x4e, 0x99, 0x3d, 0x27, 0xb2, 0x86, 0x3c, 0x4b, 0xfb, 0x54, 0x3c,
- 0x2e, 0xd9, 0xf1, 0x3a, 0x53, 0x0a, 0x1b, 0xbe, 0x19, 0xf6, 0xa5, 0xbe,
- 0xfa, 0x97, 0x64, 0xbd, 0x22, 0x9d, 0xc7, 0x3d, 0x86, 0xd2, 0x1a, 0xbd,
- 0x22, 0x4e, 0xf9, 0x3d, 0x0a, 0xc3, 0xae, 0x3b, 0x9d, 0x43, 0x8c, 0x3c,
- 0x5f, 0x8e, 0x81, 0x3c, 0x35, 0x63, 0xa6, 0xbd, 0x62, 0x4d, 0x51, 0x3e,
- 0x88, 0x4d, 0xa6, 0xbd, 0xf6, 0xdf, 0xc6, 0xbe, 0x57, 0x35, 0x3e, 0x3c,
- 0x1f, 0x7d, 0x9a, 0x3c, 0x64, 0x04, 0x61, 0xbd, 0x4d, 0x22, 0xf0, 0xbb,
- 0x1e, 0x0f, 0x4f, 0xbe, 0x56, 0x6b, 0x1d, 0xbe, 0x4e, 0xd4, 0x46, 0x3e,
- 0x93, 0xd5, 0xb7, 0x3e, 0xd5, 0xef, 0x52, 0x3f, 0xc2, 0x6f, 0x59, 0xbe,
- 0xb2, 0x14, 0x3c, 0xbe, 0xa5, 0xdc, 0xe6, 0x3e, 0x3e, 0x12, 0x64, 0x3e,
- 0xe6, 0xaf, 0xa0, 0xbd, 0x41, 0x54, 0x23, 0x3f, 0x67, 0xd2, 0xec, 0x3c,
- 0x17, 0x91, 0x7d, 0xbe, 0xad, 0x9b, 0x05, 0x3e, 0x04, 0xc7, 0x6d, 0xbd,
- 0x16, 0x46, 0xba, 0xbe, 0x8c, 0x9f, 0x2c, 0xbf, 0x69, 0x80, 0x4c, 0xbf,
- 0xea, 0x23, 0x00, 0xbf, 0x67, 0x86, 0x6c, 0xbc, 0xcf, 0x91, 0x83, 0xbe,
- 0xa1, 0x63, 0x83, 0xbe, 0xf4, 0x69, 0x8d, 0xbe, 0x25, 0x15, 0x8c, 0xbd,
- 0x4f, 0x75, 0x16, 0x3d, 0x15, 0xf0, 0x0f, 0x3f, 0xcd, 0x7e, 0xa1, 0x3c,
- 0x63, 0x9b, 0x50, 0xbd, 0xb6, 0xe1, 0x24, 0xbe, 0x1d, 0xcc, 0x8a, 0xbe,
- 0x13, 0xaf, 0x83, 0x3c, 0x85, 0xd5, 0xc8, 0xbb, 0x4e, 0xed, 0x27, 0x3b,
- 0x79, 0xf5, 0xf1, 0x3e, 0xd7, 0x5a, 0x32, 0xbe, 0x7b, 0xe5, 0x5e, 0x3e,
- 0x26, 0x08, 0xc3, 0x3d, 0xec, 0x72, 0x42, 0x3a, 0x8a, 0x9d, 0x30, 0xbd,
- 0x1e, 0x8f, 0xae, 0x3a, 0x45, 0x46, 0x83, 0x3e, 0x4b, 0xbc, 0xdc, 0xbd,
- 0x84, 0x0d, 0xc0, 0xbd, 0x40, 0x50, 0x6b, 0xbe, 0x9f, 0xe3, 0x9a, 0xbe,
- 0xc2, 0xa6, 0x2c, 0x3d, 0x18, 0x79, 0x12, 0x3e, 0xf9, 0xfb, 0xb3, 0x3c,
- 0x60, 0xf0, 0xbd, 0xbd, 0xa2, 0x4a, 0x85, 0x3d, 0xc5, 0x26, 0x87, 0xbf,
- 0x0b, 0x8a, 0xa4, 0x3f, 0xc4, 0x75, 0x3d, 0xbe, 0x10, 0x9c, 0x8a, 0x3c,
- 0x2c, 0x1f, 0xec, 0x3d, 0xd9, 0x23, 0x43, 0xbf, 0xc4, 0xa7, 0x1f, 0xbe,
- 0x22, 0x07, 0x23, 0x3f, 0xdb, 0x6e, 0xfe, 0x3d, 0x64, 0x8d, 0xda, 0x3e,
- 0x31, 0xf4, 0x03, 0xbe, 0xd7, 0xc9, 0xbf, 0xbe, 0xce, 0x58, 0x54, 0x3e,
- 0xe9, 0x3b, 0x4c, 0xbe, 0x87, 0x82, 0x93, 0x3d, 0xa4, 0xa2, 0xf2, 0xbd,
- 0x39, 0x66, 0x94, 0x3e, 0xfc, 0x62, 0x1b, 0x3d, 0x72, 0xde, 0x11, 0xbd,
- 0xe8, 0xb5, 0xe5, 0x3d, 0x76, 0xb5, 0x20, 0x3e, 0x4f, 0xb6, 0x0a, 0x3e,
- 0x4e, 0x3e, 0xdb, 0xbc, 0x77, 0x39, 0x2a, 0x3c, 0x56, 0xba, 0x33, 0xbe,
- 0x8f, 0x35, 0x11, 0xbe, 0x8f, 0xe8, 0x49, 0x3e, 0x40, 0xa2, 0x71, 0x3f,
- 0xe4, 0x1e, 0x3e, 0xbe, 0x56, 0x2d, 0x88, 0x3d, 0x9f, 0xb7, 0x0b, 0x3e,
- 0xc6, 0xa1, 0xd4, 0x3e, 0xe9, 0x68, 0xd0, 0x3d, 0x48, 0x74, 0x17, 0x3e,
- 0x54, 0x48, 0x81, 0x3d, 0x79, 0x9c, 0xf0, 0x3d, 0xc8, 0x4e, 0x08, 0x3e,
- 0xe9, 0x91, 0xdc, 0xbd, 0x5f, 0xc6, 0x60, 0xbe, 0x53, 0xd1, 0x15, 0x3f,
- 0xcf, 0x2a, 0x02, 0xbe, 0x14, 0xb1, 0x78, 0x3e, 0xd3, 0x6d, 0xee, 0xbd,
- 0x41, 0x3e, 0xc1, 0x3e, 0xf0, 0xcf, 0x2e, 0x3f, 0xd2, 0x35, 0x94, 0x3e,
- 0x48, 0x12, 0xc1, 0xbd, 0x06, 0x7c, 0x65, 0xbd, 0xec, 0xa6, 0x81, 0x3d,
- 0xf3, 0xab, 0xf2, 0xbd, 0x88, 0x3c, 0x56, 0xbd, 0xa4, 0x34, 0x94, 0xbd,
- 0xd5, 0x30, 0x42, 0x3e, 0x64, 0xad, 0xb8, 0xbc, 0x1a, 0x89, 0x82, 0xbe,
- 0xc6, 0xeb, 0xfc, 0x3d, 0xe3, 0x6d, 0x30, 0xbe, 0xa4, 0xbe, 0x39, 0xbe,
- 0x76, 0x80, 0xc6, 0x3d, 0x6f, 0xe0, 0xeb, 0xbd, 0x18, 0xd3, 0xba, 0xbd,
- 0xcd, 0x73, 0x82, 0xbb, 0x79, 0x49, 0xc2, 0xbd, 0x25, 0x98, 0x18, 0x3d,
- 0x67, 0xd2, 0x42, 0xbe, 0x87, 0xb4, 0x26, 0xbe, 0x73, 0x76, 0x26, 0x3e,
- 0x30, 0x15, 0xea, 0x3d, 0x8e, 0xf4, 0x2b, 0xbe, 0x5c, 0x01, 0x52, 0x3e,
- 0xd1, 0xba, 0xe4, 0xbd, 0x73, 0x91, 0x17, 0xbe, 0x8e, 0x04, 0x69, 0xbd,
- 0xf5, 0x38, 0xa4, 0xbe, 0x68, 0x9d, 0xb1, 0x3e, 0x39, 0x08, 0x5c, 0x3e,
- 0x6d, 0x22, 0xff, 0xbd, 0x4b, 0x08, 0x16, 0x3e, 0xe2, 0x5b, 0xf8, 0xbe,
- 0xb5, 0x53, 0xc2, 0x3d, 0x00, 0x52, 0x03, 0xbe, 0x28, 0xe1, 0x69, 0xbe,
- 0xf7, 0xb7, 0x95, 0xbd, 0xaf, 0x62, 0xb1, 0x3d, 0x82, 0x22, 0x8d, 0xbd,
- 0xaa, 0x9c, 0xaf, 0x3d, 0x11, 0x5f, 0x7a, 0x3e, 0x70, 0x4b, 0xbe, 0xbc,
- 0x43, 0xfe, 0x09, 0xbe, 0x61, 0x20, 0xb6, 0xbd, 0xa0, 0xb1, 0xb5, 0xbd,
- 0x34, 0xb0, 0xdf, 0xbc, 0x0f, 0xe2, 0xb3, 0xbd, 0x6b, 0x0b, 0x1a, 0xbd,
- 0xf3, 0x0d, 0x73, 0x3c, 0x17, 0x22, 0x47, 0x3d, 0x30, 0xf4, 0xc6, 0xbc,
- 0x68, 0x12, 0xbc, 0xbc, 0x3b, 0x05, 0xf9, 0x3d, 0x9e, 0xdb, 0x51, 0xbe,
- 0x12, 0xcb, 0xa4, 0x3d, 0x96, 0x65, 0xb8, 0xbd, 0x78, 0xbd, 0x53, 0x3d,
- 0x09, 0xc1, 0x3f, 0xbd, 0x16, 0x48, 0x3d, 0x3b, 0x35, 0x06, 0xb0, 0xbe,
- 0xc6, 0x30, 0xb7, 0x3d, 0xb7, 0x43, 0x23, 0xbe, 0xf0, 0xca, 0xcd, 0x3d,
- 0xc0, 0x96, 0x66, 0x3e, 0x7a, 0xfd, 0xb3, 0x3d, 0x36, 0xc5, 0xb0, 0xbd,
- 0x10, 0x4e, 0xae, 0xbb, 0x26, 0x8b, 0x2b, 0x3e, 0xfa, 0x33, 0x88, 0xbd,
- 0xd5, 0xc3, 0x13, 0x3c, 0x35, 0xfc, 0x1d, 0x3d, 0xde, 0x59, 0xca, 0xbd,
- 0xd8, 0xb4, 0x14, 0x3e, 0xa3, 0x85, 0x94, 0xbc, 0x87, 0x49, 0xb0, 0x3e,
- 0x2c, 0x06, 0xd8, 0xbb, 0xd3, 0x66, 0xf7, 0xbd, 0x6e, 0x7c, 0x5a, 0x3e,
- 0x63, 0x73, 0x4a, 0xbd, 0x6a, 0x1d, 0xd5, 0xbc, 0x74, 0xea, 0x05, 0x3d,
- 0x13, 0x49, 0xcf, 0x3d, 0x06, 0x2d, 0x49, 0x3e, 0xd9, 0x10, 0xfb, 0x3c,
- 0x75, 0xcc, 0x0f, 0xbf, 0xd9, 0x10, 0x10, 0xbe, 0xfa, 0xa2, 0xf0, 0xbc,
- 0x90, 0x4c, 0x62, 0xbe, 0x1d, 0x99, 0xe9, 0x3d, 0x38, 0x12, 0xbd, 0xbe,
- 0x98, 0x2a, 0x6f, 0x3d, 0xf8, 0x5b, 0x4d, 0x3d, 0xa2, 0x81, 0x38, 0x3e,
- 0xc1, 0xb3, 0xc9, 0xbb, 0x02, 0x63, 0xb5, 0x3d, 0x6d, 0xa9, 0x86, 0xbd,
- 0x35, 0xf9, 0xb4, 0xbd, 0xa9, 0x3a, 0x02, 0xbe, 0x53, 0x7c, 0x2b, 0xbd,
- 0x49, 0x81, 0xf3, 0xbd, 0x7f, 0x48, 0x43, 0xbe, 0xfa, 0x01, 0x01, 0x3d,
- 0x40, 0xc1, 0x9d, 0xbb, 0x81, 0x4f, 0x2b, 0x3d, 0xac, 0x56, 0xb2, 0xbe,
- 0x3a, 0x30, 0xe4, 0xbc, 0x7b, 0xac, 0xcf, 0xbc, 0x97, 0xe5, 0x02, 0xbe,
- 0x43, 0xbb, 0x31, 0x3e, 0xf3, 0x86, 0x2d, 0xbe, 0x49, 0xd2, 0x44, 0xbe,
- 0x10, 0xda, 0x87, 0x3e, 0xea, 0x47, 0xbf, 0x3e, 0x10, 0xbe, 0x80, 0xbe,
- 0x56, 0x68, 0xa0, 0x3e, 0x74, 0x8e, 0xa7, 0xbe, 0xcb, 0xd5, 0x5f, 0xbe,
- 0x88, 0x7c, 0x92, 0x3d, 0xc9, 0x19, 0x86, 0xbe, 0x10, 0x26, 0xb0, 0xbd,
- 0x8a, 0x90, 0xa4, 0xbd, 0x62, 0x6c, 0x46, 0x3d, 0xf8, 0xeb, 0x6a, 0xbe,
- 0xbd, 0x30, 0x90, 0x3e, 0x35, 0x90, 0x85, 0x3d, 0x0b, 0x9c, 0x6e, 0x3e,
- 0x4e, 0x47, 0x07, 0x3c, 0x60, 0x49, 0xd5, 0xbd, 0xd4, 0x44, 0x70, 0x3e,
- 0x31, 0xd2, 0x8d, 0xbe, 0x3a, 0x38, 0x0a, 0x3e, 0xfc, 0xcb, 0xcb, 0x3c,
- 0x39, 0x4b, 0xcc, 0xbd, 0xcb, 0x95, 0x53, 0xbe, 0xed, 0xf6, 0x7d, 0x3e,
- 0x12, 0x04, 0xa9, 0x3c, 0xc6, 0x82, 0x08, 0x3e, 0x57, 0x83, 0xe2, 0xbd,
- 0xad, 0x55, 0xeb, 0xbd, 0x5b, 0xad, 0x08, 0xbe, 0xd0, 0x13, 0xb4, 0x3c,
- 0x3b, 0xae, 0xc4, 0x3d, 0x59, 0x4c, 0xa3, 0xbd, 0x73, 0xa0, 0xb5, 0x3c,
- 0x41, 0xac, 0xff, 0x3d, 0x22, 0x5d, 0xa6, 0x3d, 0xac, 0xbd, 0x34, 0xbd,
- 0xa9, 0xef, 0xa7, 0xbd, 0xcd, 0x72, 0x8f, 0x3d, 0x5e, 0x71, 0x16, 0xbe,
- 0x32, 0x39, 0x62, 0xbc, 0x22, 0x7d, 0x90, 0xbd, 0xc0, 0x38, 0x50, 0x3e,
- 0xcd, 0x22, 0x8e, 0x3d, 0xa2, 0x6a, 0xa0, 0xbd, 0x11, 0x31, 0xce, 0xbd,
- 0xe8, 0x10, 0xc2, 0xbc, 0xa3, 0x5d, 0x02, 0x3e, 0xc9, 0xe7, 0x84, 0xbd,
- 0x87, 0x6a, 0xaa, 0xbd, 0xc5, 0x64, 0x2b, 0xbd, 0x52, 0xf3, 0x7e, 0x3d,
- 0x8f, 0xfe, 0x73, 0xb9, 0xba, 0x1b, 0x9d, 0x3e, 0x89, 0x4b, 0x71, 0x3e,
- 0xc3, 0x1b, 0xd8, 0xbd, 0x70, 0x54, 0xfb, 0xbd, 0xf2, 0xb3, 0x03, 0xbe,
- 0x4d, 0x33, 0x54, 0xbd, 0x95, 0xb8, 0x12, 0x3e, 0x8e, 0xe4, 0x23, 0x3d,
- 0xb2, 0x34, 0x1d, 0xbe, 0x66, 0x0d, 0x3b, 0x3e, 0xa6, 0x8a, 0x78, 0x3d,
- 0xe4, 0xd7, 0xcc, 0xbd, 0x28, 0x44, 0x89, 0xbc, 0xad, 0xdc, 0x92, 0xbd,
- 0x59, 0xa6, 0x2a, 0xbe, 0x86, 0xf3, 0x49, 0xbd, 0xfe, 0x04, 0xda, 0x3c,
- 0xc1, 0xb8, 0xbc, 0xbd, 0x6c, 0x17, 0x7b, 0xbd, 0xde, 0x64, 0x6b, 0xbd,
- 0x33, 0xd6, 0x31, 0x3d, 0x2e, 0x4a, 0x43, 0x3e, 0x55, 0x6b, 0x24, 0x3d,
- 0x51, 0xb2, 0xe1, 0xbe, 0x6e, 0xa4, 0x83, 0xbc, 0x14, 0x1c, 0x96, 0xbd,
- 0x7f, 0xa8, 0x9f, 0x3d, 0xf3, 0x0e, 0xf0, 0x3d, 0x09, 0xf0, 0x98, 0xbe,
- 0xd7, 0x6a, 0x1d, 0xbe, 0x4f, 0x38, 0x09, 0x3e, 0xb3, 0x00, 0xc3, 0xbc,
- 0xe6, 0x01, 0xd6, 0xbd, 0x72, 0xce, 0x48, 0x3e, 0xc9, 0xac, 0x07, 0x3e,
- 0xdc, 0x26, 0x2f, 0x3e, 0xb2, 0x83, 0x72, 0x3d, 0xf7, 0xbb, 0xb7, 0x3d,
- 0x92, 0xbc, 0x5f, 0xbd, 0xf3, 0x1f, 0x7c, 0x3e, 0x70, 0x84, 0x61, 0xbd,
- 0xed, 0xe0, 0x13, 0x3e, 0xae, 0xfb, 0x60, 0x3d, 0xe2, 0xeb, 0x23, 0x3e,
- 0xc0, 0xc6, 0x48, 0x3f, 0x13, 0x05, 0x9b, 0x3e, 0x1c, 0xfb, 0x37, 0xbd,
- 0x3a, 0x5d, 0xea, 0x3e, 0xf7, 0x82, 0x40, 0x3e, 0x83, 0x84, 0x93, 0xbe,
- 0xda, 0x8e, 0x78, 0xbd, 0x56, 0x70, 0x2f, 0x3f, 0xe6, 0x39, 0xe0, 0xbf,
- 0xe4, 0xd9, 0x89, 0x3f, 0x74, 0xa8, 0xaf, 0x3e, 0x32, 0x88, 0xbb, 0x3f,
- 0x80, 0x81, 0xcc, 0x3e, 0xf2, 0x78, 0x76, 0x3e, 0x14, 0x48, 0xce, 0x3d,
- 0xbc, 0xd0, 0x82, 0xbe, 0x16, 0x4f, 0xc9, 0xbf, 0xeb, 0x36, 0x0d, 0x3e,
- 0x64, 0xe6, 0x89, 0x3e, 0x34, 0x9f, 0x81, 0x3e, 0x8a, 0x7f, 0xc5, 0x3e,
- 0xf0, 0x83, 0x65, 0xbf, 0xc3, 0x19, 0xe2, 0xbd, 0x11, 0x41, 0x2a, 0x3f,
- 0x6f, 0x0f, 0x4c, 0xbd, 0xe8, 0x80, 0x69, 0xbe, 0x08, 0x0d, 0x1b, 0x3e,
- 0xc5, 0x85, 0x02, 0xbe, 0xbc, 0xb5, 0x83, 0x3e, 0x44, 0xa8, 0x8f, 0xbf,
- 0x26, 0x93, 0xab, 0x3d, 0x75, 0xdb, 0x17, 0xbd, 0x88, 0x3d, 0xfd, 0x3e,
- 0x98, 0x16, 0x7a, 0x3e, 0x9a, 0x0c, 0x85, 0x3e, 0xbf, 0xac, 0xa8, 0x3d,
- 0x86, 0x3c, 0xb0, 0xbe, 0xf6, 0x9e, 0xfb, 0x3e, 0xfb, 0x41, 0x30, 0x3f,
- 0xab, 0xc3, 0x69, 0x3d, 0x01, 0x31, 0x06, 0x3e, 0xf1, 0xa3, 0xa4, 0x3e,
- 0xc3, 0xba, 0x01, 0x3f, 0xf6, 0xe0, 0x18, 0x3e, 0xbd, 0x19, 0x0d, 0xbf,
- 0x30, 0x5a, 0xe1, 0xbe, 0x53, 0x75, 0x8d, 0x3f, 0xa0, 0x85, 0x1f, 0x3f,
- 0xc2, 0x6d, 0x28, 0x3f, 0xf3, 0xbe, 0x8c, 0xbc, 0x19, 0x20, 0x81, 0xbe,
- 0xbe, 0xcb, 0x5c, 0xbe, 0xcf, 0x60, 0xcb, 0xbe, 0x17, 0x27, 0x1a, 0x3f,
- 0xc7, 0xdf, 0x09, 0x3f, 0x8b, 0x3e, 0x64, 0xbe, 0x1c, 0x3b, 0x99, 0xbf,
- 0x6f, 0x4f, 0xcf, 0x3c, 0x3e, 0xe7, 0x03, 0xbe, 0x1a, 0xd0, 0x3a, 0xbe,
- 0x99, 0xb8, 0x3c, 0x3f, 0xde, 0xf3, 0xf2, 0xbd, 0x5e, 0x57, 0xe1, 0xbf,
- 0x09, 0x0c, 0x6f, 0x3d, 0x34, 0x25, 0xeb, 0x3e, 0x11, 0x22, 0xc4, 0x3e,
- 0x3f, 0x45, 0xab, 0x3d, 0x1c, 0x91, 0xe1, 0x3e, 0x47, 0x42, 0xa3, 0xbd,
- 0xc9, 0x81, 0x78, 0x3f, 0x19, 0x90, 0x12, 0x3e, 0x0b, 0x20, 0x4a, 0xbe,
- 0x7c, 0xe3, 0x9c, 0xbe, 0xeb, 0x07, 0xeb, 0x3d, 0x10, 0x9a, 0x81, 0xbe,
- 0x7a, 0x91, 0xcf, 0xbd, 0xb2, 0x0e, 0x59, 0x3e, 0xb3, 0x5d, 0xd5, 0xbd,
- 0xde, 0x74, 0xea, 0xbd, 0x19, 0x1e, 0x3f, 0x3f, 0xf6, 0x17, 0xa1, 0x3d,
- 0xbe, 0x5c, 0x7a, 0xbf, 0xd2, 0x6f, 0xb2, 0x3c, 0x55, 0x93, 0x15, 0xbe,
- 0x49, 0x2c, 0xc0, 0xbe, 0xb7, 0x90, 0xed, 0xbd, 0xaa, 0x8c, 0x15, 0xbc,
- 0xf4, 0x21, 0xc7, 0x3d, 0x8b, 0x12, 0x14, 0x3e, 0x49, 0xef, 0x2e, 0x3d,
- 0x45, 0x6c, 0x6a, 0x3d, 0x89, 0x70, 0x77, 0x3f, 0x06, 0x2a, 0xf3, 0xbe,
- 0xe2, 0xfa, 0x39, 0xbc, 0x55, 0xf7, 0xe9, 0xbc, 0x81, 0x25, 0xdc, 0xbd,
- 0xd8, 0x47, 0x04, 0xbf, 0x91, 0xa4, 0xe2, 0x3c, 0x57, 0xc7, 0xdc, 0xbe,
- 0x1e, 0x7a, 0x30, 0xbe, 0x15, 0x2c, 0x94, 0xbe, 0x3f, 0x77, 0xfb, 0xbf,
- 0x18, 0x83, 0x2e, 0x3d, 0x1f, 0xf2, 0x0a, 0x3c, 0x89, 0xc9, 0xbf, 0xba,
- 0xd6, 0xa2, 0x10, 0xbe, 0x63, 0x65, 0x29, 0xbd, 0xa1, 0x0f, 0x24, 0x3e,
- 0x3e, 0xc3, 0xc5, 0x3c, 0x9b, 0xbf, 0x1e, 0x3d, 0xc1, 0xfe, 0x96, 0x3d,
- 0x95, 0xcf, 0xdd, 0x3d, 0x37, 0x59, 0xe8, 0x3d, 0xf9, 0xa9, 0x78, 0x3d,
- 0x03, 0x01, 0xca, 0xbd, 0xf3, 0x21, 0x0b, 0x3d, 0xbc, 0x85, 0x80, 0xbd,
- 0x75, 0x0b, 0x07, 0xbe, 0x55, 0x64, 0x53, 0xbe, 0x84, 0x4f, 0x0e, 0xbd,
- 0xb5, 0xcd, 0x3b, 0xbe, 0xab, 0x45, 0x90, 0x3d, 0x07, 0x32, 0x48, 0xbb,
- 0xeb, 0xeb, 0xea, 0xbd, 0xcc, 0xaa, 0x30, 0xbe, 0x2a, 0x6d, 0x2f, 0x3d,
- 0x13, 0xdf, 0x9b, 0xbe, 0xae, 0xaf, 0x4d, 0xbd, 0x9c, 0x19, 0xb3, 0xbd,
- 0xfe, 0xc0, 0xf3, 0xbc, 0xb4, 0x55, 0x56, 0xbd, 0x21, 0x9e, 0xca, 0x3d,
- 0x21, 0x5b, 0x32, 0xbc, 0x29, 0x51, 0xfb, 0x3b, 0xef, 0x10, 0xc4, 0xbe,
- 0xcd, 0xf1, 0x20, 0xbd, 0x96, 0xb3, 0xa1, 0xbd, 0xf2, 0xbc, 0x3f, 0xbe,
- 0x21, 0x05, 0x24, 0xbd, 0x4e, 0x79, 0x02, 0x3d, 0xdb, 0x8f, 0xcd, 0x3c,
- 0xd7, 0xce, 0x8d, 0x3d, 0x62, 0x64, 0xa2, 0xbd, 0xc1, 0xf7, 0xcc, 0xbe,
- 0x7e, 0x9f, 0xba, 0x3e, 0x7f, 0x12, 0x0c, 0x3e, 0x13, 0x8e, 0x67, 0xbe,
- 0x22, 0xac, 0x0e, 0xbe, 0x4f, 0xf3, 0x83, 0xbc, 0xb5, 0x52, 0xfb, 0xbe,
- 0x5a, 0x6c, 0x32, 0xbe, 0xac, 0x0e, 0xa8, 0xbd, 0x9f, 0x4b, 0x13, 0x3d,
- 0x71, 0x5f, 0xc8, 0xbd, 0xc1, 0xc2, 0x26, 0xbe, 0xa1, 0x42, 0xdd, 0x3d,
- 0x92, 0x81, 0x15, 0xbb, 0xfc, 0xcd, 0xe4, 0xbd, 0xe5, 0x22, 0xa4, 0x3d,
- 0x7a, 0x77, 0xc2, 0xbb, 0x92, 0x1c, 0xf6, 0xbc, 0x96, 0x6f, 0x8f, 0xbd,
- 0x55, 0x7b, 0x9c, 0xbe, 0x79, 0xc2, 0x91, 0xbb, 0x91, 0x03, 0x3c, 0x3e,
- 0x7f, 0xf8, 0xec, 0xbd, 0x19, 0x22, 0x1d, 0x3e, 0x6f, 0x47, 0xf5, 0xbd,
- 0xfb, 0xea, 0xd2, 0xbd, 0x6c, 0xe5, 0x12, 0x3e, 0xfd, 0x45, 0xaa, 0xbd,
- 0x2a, 0x19, 0x0e, 0x3e, 0x7e, 0xeb, 0x96, 0xbd, 0xca, 0xf1, 0x78, 0xbe,
- 0xa6, 0x3e, 0x99, 0xbc, 0x4e, 0x78, 0x94, 0xbe, 0xab, 0x3b, 0x2c, 0x3e,
- 0x3c, 0x18, 0xf1, 0xbd, 0x02, 0x4e, 0x07, 0x3e, 0x63, 0xfa, 0x12, 0xbc,
- 0x47, 0x35, 0x2b, 0xbb, 0x3e, 0xf1, 0xdc, 0x3d, 0x57, 0x18, 0x9b, 0xbc,
- 0x8b, 0x39, 0xf8, 0xbd, 0xbe, 0xcf, 0x09, 0xbe, 0xf0, 0x2c, 0x77, 0xbe,
- 0xea, 0x9b, 0x8e, 0x3d, 0x61, 0xcd, 0xc6, 0xbd, 0x00, 0xa9, 0x62, 0x3e,
- 0xe2, 0x4c, 0x90, 0xbc, 0xd4, 0x68, 0x45, 0x3d, 0xae, 0x69, 0x66, 0xbe,
- 0x38, 0x2e, 0x10, 0xbe, 0x9a, 0xa3, 0x9f, 0x3d, 0xe4, 0xd3, 0x14, 0x3e,
- 0xc9, 0x57, 0x02, 0x3e, 0x5b, 0xfb, 0x63, 0xbe, 0xf2, 0xc1, 0xf6, 0xbd,
- 0xfc, 0x81, 0x3e, 0x3e, 0xd7, 0x80, 0x20, 0xbd, 0x0b, 0x91, 0x0e, 0xbd,
- 0x06, 0x55, 0x10, 0xbe, 0x65, 0x3f, 0xc8, 0xbe, 0x8f, 0xf2, 0xae, 0x3d,
- 0x62, 0x1d, 0x24, 0xbd, 0xd5, 0xd2, 0xa6, 0xbb, 0xd7, 0xf9, 0x2e, 0xbe,
- 0x7a, 0xc0, 0x15, 0xbe, 0x4f, 0xfa, 0x8e, 0xbd, 0xff, 0xfa, 0x0a, 0x3c,
- 0x61, 0x04, 0xb1, 0x3e, 0x97, 0x92, 0x5c, 0x3f, 0xf8, 0x6d, 0x02, 0xbe,
- 0x69, 0x00, 0x5b, 0x3d, 0xbd, 0x0b, 0xda, 0x3e, 0x6b, 0x18, 0x7e, 0x3e,
- 0x47, 0xaa, 0x31, 0xbd, 0xa8, 0x80, 0xf4, 0x3e, 0x50, 0x75, 0xb8, 0xbd,
- 0xcd, 0xcc, 0xb0, 0xbe, 0xf1, 0x87, 0x72, 0xbd, 0xb4, 0x88, 0x6f, 0xbe,
- 0x42, 0x1b, 0x10, 0xbf, 0xee, 0xaa, 0x37, 0xbf, 0xf7, 0x50, 0x47, 0xbf,
- 0x5a, 0x1b, 0xc4, 0xbe, 0xfd, 0xf4, 0x8a, 0x3c, 0xe3, 0x4c, 0x12, 0xbe,
- 0x08, 0x76, 0xa5, 0xbe, 0x56, 0xae, 0x8f, 0xbe, 0xde, 0xb8, 0x74, 0xbd,
- 0xd5, 0xb3, 0x04, 0xbe, 0x49, 0x9f, 0x14, 0x3f, 0x27, 0x3c, 0x82, 0x3e,
- 0xfb, 0xbe, 0x81, 0xbd, 0x2f, 0x85, 0x8e, 0xbd, 0x03, 0x60, 0x3e, 0xbe,
- 0x3a, 0x11, 0x14, 0xbd, 0x46, 0xb7, 0x8b, 0x3d, 0x40, 0x74, 0x29, 0xbe,
- 0xbe, 0x8f, 0xb9, 0x3e, 0xac, 0x46, 0x38, 0xbd, 0xe3, 0x5d, 0xa2, 0x3e,
- 0x7d, 0xb6, 0x53, 0xbd, 0xd3, 0x66, 0x0d, 0xbd, 0x66, 0x3f, 0x74, 0x3d,
- 0xcb, 0xce, 0xf6, 0xbd, 0x2e, 0x19, 0xa1, 0x3e, 0x8d, 0x58, 0xec, 0xbd,
- 0x43, 0xcb, 0x7c, 0xbc, 0x86, 0xc0, 0x9a, 0xbe, 0x3b, 0xb8, 0xd3, 0xbe,
- 0xf2, 0x60, 0x71, 0x3e, 0xd8, 0xf8, 0x7d, 0x3d, 0xcb, 0xe9, 0x91, 0xba,
- 0xec, 0xa1, 0x03, 0xbe, 0x71, 0x7f, 0x6b, 0x3d, 0xef, 0x8f, 0x5f, 0xbf,
- 0x01, 0x50, 0xb1, 0x3f, 0x3c, 0xec, 0x7d, 0xbc, 0xc3, 0x6d, 0x0f, 0x3e,
- 0xcb, 0xc0, 0xd2, 0x3d, 0x73, 0x64, 0x2c, 0xbf, 0x00, 0xd4, 0xa1, 0xbd,
- 0x54, 0xdb, 0x1c, 0x3f, 0x83, 0xe3, 0xda, 0xbc, 0x36, 0x80, 0x9d, 0x3e,
- 0x07, 0x44, 0x1f, 0xbe, 0x2b, 0x65, 0x8b, 0xbe, 0xef, 0x20, 0x02, 0x3e,
- 0x11, 0x30, 0x1c, 0xbd, 0x64, 0xd3, 0x3b, 0x3d, 0xe8, 0x7f, 0x69, 0xbd,
- 0xc0, 0xed, 0x68, 0x3e, 0xc5, 0xfe, 0x50, 0x3d, 0xf4, 0x81, 0x8e, 0xbe,
- 0x18, 0x2f, 0x12, 0xbe, 0x98, 0xa8, 0xe4, 0x3c, 0x0f, 0xc6, 0xbb, 0xba,
- 0xc2, 0xb4, 0x5c, 0xbd, 0xb5, 0xe9, 0x30, 0x3e, 0xc2, 0xe6, 0xa8, 0x3d,
- 0x32, 0xd3, 0x55, 0xbc, 0xe9, 0x99, 0xbb, 0x3e, 0xde, 0x69, 0x81, 0x3f,
- 0x86, 0xb2, 0x63, 0xbd, 0xe8, 0xbf, 0xb6, 0x3d, 0x5d, 0x0a, 0xd1, 0xbc,
- 0x37, 0x9c, 0x7e, 0x3e, 0x3a, 0x67, 0x01, 0x3c, 0x08, 0xd2, 0x33, 0x3e,
- 0x6d, 0xd3, 0x8c, 0xbd, 0x4d, 0x03, 0x6f, 0x3c, 0x08, 0x4f, 0xa9, 0x3d,
- 0x14, 0xca, 0xb1, 0xbd, 0x1d, 0x28, 0x1e, 0xbe, 0x03, 0x5d, 0x05, 0x3f,
- 0x85, 0x8a, 0x16, 0xbd, 0xd4, 0x54, 0x21, 0x3e, 0x57, 0x4d, 0x8b, 0x3d,
- 0x68, 0xa3, 0x02, 0x3f, 0xc2, 0x8b, 0x49, 0x3f, 0xcc, 0x2b, 0x19, 0x3e,
- 0xb4, 0xc5, 0x27, 0x3d, 0xc1, 0xcb, 0xb0, 0xbd, 0x32, 0x41, 0x21, 0x3e,
- 0xfa, 0xf4, 0x06, 0xbe, 0x98, 0xc2, 0x8b, 0xbd, 0xd9, 0x6e, 0x68, 0xbe,
- 0xd5, 0xcc, 0x94, 0x3e, 0xc9, 0x19, 0x87, 0x3c, 0x9e, 0x56, 0x78, 0xbe,
- 0xdf, 0x7a, 0xf1, 0xbd, 0x55, 0xfd, 0x6d, 0xbd, 0x49, 0x74, 0x90, 0xbd,
- 0x15, 0xcd, 0xa4, 0x3d, 0x9e, 0xe3, 0xeb, 0xbd, 0x6d, 0x3c, 0x8a, 0xbd,
- 0x47, 0x05, 0x70, 0xbe, 0x48, 0x41, 0x9c, 0x3c, 0x85, 0x1c, 0x75, 0x3c,
- 0x28, 0x85, 0x91, 0x3d, 0x11, 0x48, 0xcb, 0xbd, 0x3e, 0xc8, 0x69, 0x3e,
- 0x90, 0xf5, 0x90, 0xbd, 0xed, 0x48, 0x21, 0xbe, 0xda, 0x89, 0xed, 0xbc,
- 0xe1, 0x2e, 0x5f, 0xbe, 0xb2, 0xbe, 0x46, 0xbd, 0x05, 0x1f, 0xea, 0x3d,
- 0x9a, 0xc2, 0x77, 0xbe, 0x74, 0x1b, 0x13, 0x3e, 0x84, 0xce, 0xa4, 0x3e,
- 0xa8, 0x2c, 0x58, 0xbd, 0x62, 0x2b, 0x93, 0x3c, 0x62, 0x42, 0xf3, 0xbe,
- 0x47, 0xa2, 0xd0, 0x3d, 0xe3, 0xf2, 0x4d, 0x3d, 0x82, 0x30, 0x09, 0xbe,
- 0x0b, 0xcc, 0xad, 0xbc, 0x8e, 0x7e, 0x31, 0x3e, 0x97, 0x50, 0x2f, 0xbe,
- 0x6d, 0xbd, 0x9b, 0x3c, 0x55, 0xc2, 0xdd, 0x3e, 0xa2, 0x2b, 0x34, 0xbc,
- 0x70, 0xd8, 0x01, 0xbe, 0x23, 0x05, 0x9a, 0x3d, 0x0c, 0xc5, 0x33, 0xbe,
- 0xfa, 0xb0, 0x23, 0x3e, 0x70, 0x1b, 0x8d, 0x3d, 0xa8, 0xd7, 0x8b, 0x3d,
- 0xb4, 0x6a, 0xc4, 0x3d, 0x20, 0x7d, 0x08, 0x3d, 0xd3, 0xa5, 0x2d, 0x3e,
- 0xb9, 0x8a, 0xfe, 0x3d, 0x51, 0x12, 0x7f, 0x3d, 0x94, 0xa4, 0x82, 0xbe,
- 0x60, 0x79, 0xae, 0x3d, 0x58, 0xbd, 0xa8, 0xbd, 0x6d, 0x83, 0x8e, 0x3d,
- 0xcb, 0x72, 0x3c, 0x3a, 0x94, 0xb5, 0xf0, 0xbd, 0xfb, 0xeb, 0x64, 0xbe,
- 0xa6, 0xf8, 0xc3, 0x3d, 0x9e, 0x41, 0xc3, 0xbd, 0xed, 0xae, 0xf7, 0x3b,
- 0xaf, 0x02, 0x50, 0x3e, 0x35, 0x1d, 0x8a, 0xbd, 0xf6, 0x33, 0x53, 0x3e,
- 0x8b, 0xf0, 0x4b, 0xbe, 0x0f, 0x3a, 0x0f, 0x3e, 0xe0, 0xb9, 0x2a, 0x3d,
- 0x7b, 0x5f, 0x5b, 0xbd, 0x16, 0xbc, 0x5b, 0x3e, 0xb0, 0x12, 0xb9, 0xbd,
- 0x1d, 0xe8, 0x9f, 0x3e, 0x21, 0xaa, 0x07, 0xbe, 0x20, 0x0b, 0x36, 0x3e,
- 0xea, 0x50, 0xe9, 0xbd, 0x2c, 0x6f, 0x72, 0xbe, 0xbb, 0x0e, 0x3f, 0x3e,
- 0x1e, 0x0e, 0x47, 0xbe, 0xfe, 0x74, 0x37, 0xbd, 0x65, 0x97, 0x1f, 0x3d,
- 0x14, 0x40, 0xe1, 0x3d, 0x0d, 0x5b, 0x42, 0x3e, 0x49, 0xe9, 0x03, 0x3e,
- 0x64, 0x07, 0x0a, 0xbf, 0x1b, 0xbe, 0x92, 0x3d, 0x4e, 0xed, 0x25, 0xbd,
- 0x1a, 0x68, 0xb0, 0x3d, 0xf7, 0x4f, 0x0b, 0xbe, 0xf9, 0x1f, 0xb1, 0xbe,
- 0xe5, 0x85, 0xec, 0x3d, 0xa0, 0xa7, 0xed, 0xbc, 0xd7, 0xfb, 0x07, 0x3e,
- 0xa9, 0x0b, 0xd5, 0xbd, 0x99, 0x57, 0xc5, 0x3d, 0x4b, 0xb0, 0xdb, 0xbd,
- 0xe1, 0xcc, 0x62, 0xbe, 0xbf, 0xe4, 0x1c, 0xbe, 0x30, 0xbf, 0x4d, 0x3d,
- 0xfa, 0xe4, 0xa7, 0x3d, 0x46, 0xee, 0xd7, 0xbe, 0xf0, 0x2d, 0xb6, 0xbc,
- 0x42, 0x61, 0x2a, 0x3d, 0xdf, 0x60, 0xb5, 0xbd, 0xf3, 0x77, 0x2b, 0xbe,
- 0xe6, 0x84, 0x82, 0x3d, 0xcb, 0x56, 0x7e, 0xbe, 0x90, 0xc5, 0x30, 0xbe,
- 0x36, 0x61, 0x78, 0x3d, 0xb7, 0x14, 0x3d, 0xbe, 0x9f, 0x0c, 0x9a, 0xbe,
- 0x2f, 0x8e, 0xaa, 0x3e, 0x4e, 0xe1, 0x7e, 0x3e, 0x79, 0x8b, 0x7b, 0xbe,
- 0x45, 0xb7, 0x55, 0x3e, 0x7a, 0xde, 0xa0, 0xbe, 0x38, 0x7e, 0x96, 0xbe,
- 0x36, 0x3a, 0xf5, 0xbd, 0x62, 0x74, 0x3b, 0xbe, 0x33, 0x83, 0xd0, 0xbd,
- 0xfc, 0x80, 0xb7, 0x38, 0x7c, 0xb2, 0x4a, 0xbd, 0x1d, 0x0a, 0x9a, 0xbe,
- 0x7f, 0x6d, 0x43, 0x3e, 0x94, 0x0e, 0x51, 0xbd, 0xb6, 0xc3, 0xe9, 0x3d,
- 0x7e, 0x48, 0xb5, 0xbc, 0x8d, 0x70, 0xa3, 0xbd, 0x20, 0x93, 0x1c, 0x3e,
- 0x41, 0x06, 0x9e, 0xbe, 0xc2, 0x66, 0x01, 0xbe, 0x70, 0x61, 0x06, 0xbe,
- 0xe4, 0xaf, 0xbe, 0xbb, 0xd3, 0x02, 0x2a, 0xbd, 0xbb, 0x43, 0xaf, 0x3c,
- 0x91, 0x7f, 0x39, 0x3d, 0xed, 0x5f, 0x17, 0x3e, 0x43, 0xa0, 0x2e, 0xba,
- 0x4c, 0x6c, 0x82, 0x3c, 0x55, 0xe4, 0x14, 0x3e, 0xf0, 0xd5, 0x72, 0xbd,
- 0xd9, 0x0c, 0xa8, 0xbd, 0x54, 0x62, 0x63, 0xbe, 0x0a, 0x55, 0xce, 0x3c,
- 0xba, 0x42, 0xbe, 0x3c, 0x50, 0x8f, 0xf8, 0x3d, 0x61, 0x0e, 0x25, 0xbd,
- 0x74, 0x2e, 0xfd, 0xbd, 0x10, 0xe9, 0x87, 0xbd, 0x89, 0x21, 0xe2, 0xbd,
- 0x11, 0x13, 0x94, 0x3b, 0x26, 0x4a, 0x2b, 0x3e, 0x12, 0x07, 0x65, 0x3e,
- 0xc5, 0xea, 0xf3, 0x3d, 0x49, 0x22, 0x15, 0xbc, 0x08, 0xfd, 0x0d, 0x3c,
- 0x91, 0x0e, 0x18, 0xbe, 0xa3, 0xd1, 0x87, 0xbd, 0x87, 0x0b, 0x03, 0xbe,
- 0x62, 0xaf, 0xfd, 0xbb, 0x46, 0x7a, 0x2c, 0xbe, 0x51, 0x29, 0x93, 0x3e,
- 0x48, 0x78, 0xc8, 0x3c, 0xa9, 0x9f, 0x0e, 0x3e, 0xd3, 0x07, 0x2f, 0x3d,
- 0x42, 0xea, 0x80, 0xbe, 0xa7, 0x14, 0x2b, 0x3d, 0xba, 0xf0, 0x35, 0xbd,
- 0x04, 0x42, 0xdd, 0x3d, 0x34, 0x88, 0xb8, 0x3d, 0x71, 0x6e, 0x28, 0xbe,
- 0x37, 0x35, 0xce, 0xbd, 0xc4, 0x56, 0xa7, 0x3e, 0x7d, 0x4c, 0xf8, 0x3c,
- 0x83, 0x43, 0x36, 0x3c, 0xf5, 0xdc, 0xd1, 0xbd, 0x85, 0xee, 0x59, 0xbe,
- 0xff, 0x87, 0xc9, 0xbd, 0xf2, 0xd2, 0xb8, 0xbd, 0x0e, 0x82, 0x5c, 0x3d,
- 0x45, 0xeb, 0x86, 0xbd, 0x61, 0x6a, 0x69, 0xbe, 0xb2, 0x1b, 0x62, 0x3d,
- 0xac, 0xd3, 0x6e, 0x3c, 0xd4, 0x68, 0xa8, 0x3e, 0x5a, 0x2f, 0x21, 0x3e,
- 0x21, 0x34, 0xaf, 0xbe, 0x7c, 0xb8, 0x0f, 0xbd, 0x47, 0x6a, 0x0b, 0xbe,
- 0x26, 0xb8, 0xde, 0xbc, 0xbf, 0x8f, 0x75, 0xbd, 0xcf, 0x41, 0x6f, 0xbe,
- 0xa4, 0x8d, 0x53, 0xbd, 0xf2, 0xac, 0x32, 0x3d, 0x13, 0xf2, 0x18, 0xbe,
- 0x83, 0x7b, 0x5a, 0xbd, 0xea, 0xc3, 0xd2, 0x3e, 0xae, 0xb5, 0xbe, 0xbc,
- 0xf8, 0xff, 0x8b, 0x3e, 0xfd, 0x12, 0xcd, 0x3d, 0xbb, 0x40, 0x5d, 0x3c,
- 0xa4, 0x6b, 0x0d, 0x3e, 0x45, 0xa4, 0x3f, 0x3e, 0x40, 0x13, 0xb0, 0x3d,
- 0xb3, 0x3d, 0x16, 0x3c, 0x11, 0x1e, 0xc9, 0xbd, 0x10, 0x4a, 0x32, 0x3e,
- 0xd8, 0x11, 0xd6, 0x3d, 0xfb, 0x29, 0x7e, 0x3e, 0xc7, 0xab, 0x6a, 0xbe,
- 0x16, 0x20, 0x9c, 0x3e, 0xc7, 0x11, 0x09, 0xbe, 0x55, 0x7f, 0xca, 0x3d,
- 0x69, 0x79, 0xb9, 0x3e, 0x68, 0x38, 0xd9, 0x3e, 0x64, 0x44, 0x90, 0x3c,
- 0x0d, 0x18, 0x8e, 0x3f, 0x89, 0x4d, 0x10, 0x3e, 0x52, 0xc9, 0xeb, 0x3e,
- 0x87, 0x65, 0x5d, 0x3e, 0xb4, 0xb1, 0xb9, 0x3e, 0x0c, 0xac, 0xf2, 0xbd,
- 0x34, 0x52, 0xcf, 0xbe, 0x66, 0x17, 0xa7, 0xbf, 0x06, 0x3e, 0x5a, 0x3e,
- 0xf6, 0xd4, 0x00, 0x3f, 0xc6, 0x56, 0xf3, 0xbe, 0xc6, 0xb0, 0xac, 0x3e,
- 0xed, 0x9d, 0x3b, 0xbd, 0xe8, 0x9d, 0x00, 0xbe, 0xd1, 0x31, 0x22, 0xbe,
- 0xa3, 0x2a, 0x93, 0xbc, 0xf9, 0x9f, 0x97, 0x3e, 0x97, 0x90, 0x2c, 0x3f,
- 0x5a, 0xa1, 0x18, 0xbe, 0xb7, 0xf8, 0x06, 0x3f, 0x9a, 0xd7, 0xa2, 0x3c,
- 0x01, 0x84, 0xb1, 0xbd, 0x52, 0x24, 0xa4, 0xbc, 0x88, 0xd6, 0xe0, 0x3e,
- 0xd2, 0x88, 0x3d, 0xbd, 0xd2, 0x2f, 0x8e, 0x3e, 0x8c, 0x70, 0x3e, 0xbc,
- 0x79, 0x5c, 0xc4, 0x3e, 0xd0, 0x19, 0x33, 0x3e, 0x7f, 0x59, 0x72, 0x3f,
- 0x08, 0xd7, 0x94, 0x3e, 0x70, 0x3b, 0xae, 0x3c, 0xf0, 0x71, 0xb4, 0x3d,
- 0x63, 0x82, 0xcd, 0x3d, 0x5d, 0xa9, 0x8f, 0x3e, 0x69, 0xf1, 0x30, 0xbe,
- 0x3e, 0xc9, 0x0f, 0x3e, 0x7a, 0xb6, 0x15, 0x3f, 0xb4, 0x51, 0x8c, 0x3e,
- 0xa3, 0xef, 0x8c, 0x3e, 0xf5, 0xc4, 0x66, 0xbe, 0x31, 0x66, 0x43, 0xbe,
- 0xdf, 0xf1, 0x57, 0xbc, 0x87, 0x25, 0x16, 0xbf, 0xb5, 0x89, 0x08, 0x3f,
- 0x14, 0x2a, 0x00, 0x3f, 0x15, 0x54, 0xac, 0xbd, 0xda, 0x97, 0x68, 0xbf,
- 0x8b, 0xc2, 0x28, 0xbe, 0x05, 0x1b, 0xc7, 0xbe, 0xd4, 0xa6, 0xaf, 0x3d,
- 0x67, 0x18, 0xdb, 0x3e, 0xe9, 0x0e, 0x00, 0x3e, 0x66, 0x8c, 0x3a, 0xbf,
- 0xbe, 0x71, 0x90, 0x3e, 0xc7, 0x98, 0xb9, 0x3e, 0x25, 0x1d, 0x6a, 0xbd,
- 0xc4, 0x77, 0x20, 0x3e, 0xc1, 0xf5, 0xb7, 0xbc, 0x52, 0x14, 0xc7, 0x3d,
- 0xa1, 0x66, 0x93, 0x3f, 0x57, 0xf6, 0x08, 0xbf, 0x13, 0xe6, 0x97, 0xbd,
- 0x55, 0xc6, 0xbc, 0x3d, 0x25, 0x3b, 0x91, 0x3d, 0x82, 0xfd, 0xf6, 0xbe,
- 0x3b, 0x1b, 0xe8, 0xbd, 0x66, 0x22, 0x84, 0xbd, 0x69, 0xe1, 0x47, 0x3e,
- 0xde, 0xb7, 0xaf, 0xbc, 0xd5, 0x5c, 0x82, 0x3e, 0x16, 0xae, 0xa4, 0xbe,
- 0x87, 0x38, 0x09, 0xbd, 0xdd, 0x6a, 0xe5, 0xbd, 0xc6, 0x4d, 0x8d, 0xbd,
- 0xd4, 0x17, 0xbb, 0xbe, 0x93, 0x32, 0x79, 0xbd, 0x53, 0x5c, 0x2f, 0xbf,
- 0x63, 0xc0, 0x4b, 0xbe, 0x9f, 0x9c, 0xa2, 0x3e, 0x77, 0xcf, 0xaf, 0x3e,
- 0x0f, 0xf9, 0x17, 0xbe, 0x7c, 0x43, 0x82, 0x3e, 0x2d, 0xbe, 0x99, 0xbe,
- 0xa5, 0xa9, 0xc9, 0xbf, 0xdf, 0x55, 0xd8, 0x3e, 0x82, 0x36, 0x35, 0x3d,
- 0x02, 0xaf, 0x19, 0xbf, 0x41, 0xfe, 0x65, 0x3e, 0x7d, 0x3f, 0x8b, 0xbe,
- 0x71, 0x48, 0x79, 0x3d, 0xae, 0xb3, 0xd8, 0xbe, 0x82, 0x00, 0xc1, 0xbe,
- 0x22, 0xf4, 0x01, 0xbe, 0x5a, 0x72, 0xa5, 0xbd, 0x7b, 0x53, 0xc4, 0xbc,
- 0x72, 0xde, 0x7f, 0x3c, 0x72, 0xbd, 0x0e, 0xbe, 0xa0, 0xe5, 0xb9, 0x3d,
- 0x2a, 0xac, 0x7d, 0xbd, 0xa1, 0x1f, 0x91, 0xbd, 0x28, 0x49, 0xd3, 0x3d,
- 0x99, 0x55, 0x8b, 0x3d, 0x80, 0x2c, 0x8d, 0xbd, 0x85, 0xee, 0x43, 0x3e,
- 0xf5, 0x42, 0x7d, 0xbd, 0x89, 0x43, 0xe5, 0x3c, 0xbb, 0xea, 0x06, 0xbe,
- 0xb1, 0x12, 0x55, 0xbe, 0xe1, 0xfa, 0x7c, 0x3d, 0x43, 0x4a, 0x39, 0x3e,
- 0xdf, 0x91, 0x5f, 0xbe, 0x4e, 0x79, 0x32, 0x3e, 0x4b, 0xf0, 0xc7, 0x3d,
- 0x43, 0xf0, 0x83, 0x3d, 0x66, 0xde, 0x77, 0xbd, 0xeb, 0x54, 0x79, 0xbd,
- 0xc0, 0xbb, 0x86, 0xbe, 0xf4, 0xc6, 0x59, 0x3b, 0xb6, 0x61, 0x60, 0x3a,
- 0xf3, 0x4b, 0x02, 0x3d, 0x0b, 0xf5, 0x2a, 0x3e, 0xb7, 0x9c, 0xf7, 0x3d,
- 0x86, 0xd8, 0xc5, 0x3d, 0x38, 0x9c, 0x8e, 0xbd, 0x50, 0xe4, 0x23, 0xbe,
- 0x89, 0xf4, 0xe5, 0xbd, 0x40, 0xfe, 0x0f, 0x3d, 0x8a, 0xe1, 0x38, 0xbe,
- 0x12, 0xed, 0x6c, 0xbe, 0x5c, 0x5d, 0x86, 0x3d, 0x4b, 0x7e, 0x94, 0x3d,
- 0x9c, 0xa0, 0xf7, 0xbd, 0xfe, 0x48, 0x03, 0xbe, 0x71, 0x99, 0xb6, 0xbe,
- 0x87, 0x7c, 0x91, 0x3e, 0x3c, 0x0e, 0xa3, 0xbd, 0xab, 0xd2, 0x2f, 0xbe,
- 0x2d, 0xac, 0xe9, 0xbd, 0x78, 0x2f, 0x45, 0x3d, 0x41, 0x2f, 0xd4, 0xbe,
- 0x58, 0x14, 0x8d, 0xbe, 0x6a, 0xa3, 0x36, 0xbd, 0x5b, 0x09, 0x18, 0xbb,
- 0x01, 0xef, 0x6e, 0x3d, 0x6e, 0xe3, 0x2c, 0xbe, 0xed, 0xaa, 0xcd, 0xbd,
- 0xec, 0x5e, 0x92, 0x3b, 0x69, 0x0a, 0xcc, 0xbd, 0xf1, 0x7a, 0xde, 0xbd,
- 0xea, 0xa2, 0x8e, 0x3d, 0x3e, 0x8c, 0x0f, 0xbc, 0xac, 0x32, 0x6a, 0xbd,
- 0xbb, 0x93, 0xca, 0xbe, 0x1f, 0xaa, 0x0b, 0xbd, 0x8d, 0x2f, 0x67, 0x3e,
- 0xc3, 0xfc, 0x20, 0xba, 0x60, 0x2f, 0xeb, 0xbd, 0x98, 0x87, 0x0c, 0x3c,
- 0x18, 0x27, 0x40, 0xbe, 0x9f, 0x3d, 0xdd, 0x3d, 0x30, 0x90, 0x64, 0xbe,
- 0xb6, 0x01, 0x6c, 0x3d, 0x85, 0xb0, 0xd0, 0x3c, 0xe8, 0xc8, 0x39, 0xbe,
- 0x43, 0x4c, 0x8f, 0xbd, 0xca, 0x32, 0x12, 0xbe, 0xcc, 0x13, 0x0b, 0x3e,
- 0x8c, 0x79, 0xcb, 0xbd, 0x8a, 0x75, 0xef, 0x3d, 0xa6, 0xdf, 0x9a, 0xbc,
- 0x5e, 0x38, 0xc9, 0xbd, 0xc9, 0x65, 0x0a, 0xbe, 0x84, 0xba, 0x1a, 0x3c,
- 0xd1, 0x53, 0x10, 0x3e, 0xda, 0xe2, 0xc9, 0x3d, 0xe5, 0x93, 0x2b, 0xbd,
- 0xc0, 0x29, 0xe8, 0xbd, 0xaa, 0x45, 0xe6, 0x3b, 0x9a, 0xc5, 0x87, 0x3b,
- 0x65, 0xe0, 0x2a, 0xbd, 0xe3, 0xbc, 0x7e, 0xbb, 0x9d, 0x95, 0x99, 0xbe,
- 0xd1, 0x97, 0x1a, 0xbe, 0x04, 0xec, 0x34, 0x3d, 0x36, 0xc8, 0x96, 0x3d,
- 0x6f, 0xb8, 0x1d, 0x3e, 0x5a, 0x62, 0x97, 0xbe, 0x93, 0xe2, 0x4d, 0xbe,
- 0x45, 0xd1, 0x44, 0x39, 0x71, 0x1d, 0x0f, 0x3e, 0x0d, 0x7c, 0x3b, 0x3e,
- 0x09, 0xbd, 0x37, 0xbe, 0x84, 0xdc, 0xf1, 0xbe, 0x8e, 0x50, 0x45, 0xbd,
- 0xa9, 0xb5, 0xd9, 0xbd, 0xef, 0x9b, 0x05, 0xbd, 0x4f, 0xe9, 0xa4, 0xbd,
- 0x1a, 0x1b, 0x2a, 0xbe, 0x06, 0x8a, 0x3a, 0xbe, 0xf3, 0x9c, 0xe5, 0x3d,
- 0x01, 0x7e, 0x21, 0x3e, 0x03, 0x04, 0x2c, 0x3f, 0x47, 0x59, 0x0f, 0xbd,
- 0xbf, 0xc8, 0xb2, 0xbc, 0x67, 0x3e, 0x08, 0x3f, 0x0a, 0x6a, 0x7c, 0x3e,
- 0x5f, 0x94, 0x97, 0x3d, 0x99, 0x99, 0x21, 0x3f, 0x51, 0x17, 0x13, 0xbd,
- 0x49, 0xb4, 0x69, 0xbe, 0xc8, 0x27, 0x0f, 0xbd, 0x3a, 0xcd, 0x5f, 0xbe,
- 0xd2, 0xbc, 0xa0, 0xbe, 0x26, 0x00, 0x25, 0xbf, 0x21, 0x6c, 0x77, 0xbf,
- 0x34, 0x5f, 0xdc, 0xbe, 0x14, 0xb9, 0x99, 0x3c, 0x67, 0x6b, 0x83, 0xbd,
- 0x7c, 0x1a, 0xd6, 0xbe, 0xaa, 0xf3, 0xe9, 0xbe, 0x2a, 0x0c, 0xe8, 0xbd,
- 0xc3, 0x12, 0x2a, 0xbb, 0x99, 0xc3, 0xd3, 0x3e, 0x41, 0x5d, 0x81, 0x3e,
- 0x84, 0x72, 0x92, 0x3d, 0x2c, 0xfd, 0x81, 0x3d, 0x85, 0xb3, 0x66, 0xbe,
- 0x0b, 0x57, 0x9d, 0xbd, 0xb2, 0x4a, 0x91, 0xbb, 0x8f, 0xdc, 0x86, 0xbd,
- 0x09, 0x23, 0xf0, 0x3e, 0xc6, 0x8b, 0x85, 0xbe, 0xaf, 0x6f, 0x22, 0x3e,
- 0x34, 0xb9, 0xb5, 0xbc, 0x76, 0x51, 0x4f, 0xbd, 0xb0, 0xf0, 0x23, 0xbd,
- 0x38, 0x22, 0x41, 0x3d, 0x32, 0x0e, 0xb5, 0x3e, 0xd7, 0xd9, 0xb8, 0x3d,
- 0xc7, 0x36, 0x29, 0xbe, 0xc3, 0x5b, 0xa9, 0xbe, 0x5d, 0xfc, 0xa8, 0xbe,
- 0xde, 0x89, 0x6a, 0x3e, 0xe1, 0xef, 0x62, 0x3e, 0x6c, 0xb4, 0x4a, 0xbe,
- 0x87, 0x32, 0x4d, 0xbe, 0x75, 0x55, 0xf1, 0x3d, 0x3d, 0x17, 0x61, 0xbf,
- 0xb1, 0x93, 0x9c, 0x3f, 0x94, 0x35, 0x36, 0xbd, 0xbd, 0x5e, 0x33, 0xbd,
- 0x8a, 0xed, 0x5e, 0x3e, 0xbb, 0x01, 0x3d, 0xbf, 0x1d, 0xbf, 0x16, 0x3d,
- 0xe6, 0x33, 0x16, 0x3f, 0xaa, 0xc7, 0xe9, 0xbd, 0x46, 0x82, 0xc4, 0x3e,
- 0x84, 0x30, 0x43, 0xbd, 0xa9, 0x64, 0xf3, 0xbe, 0xe0, 0x91, 0x64, 0x3e,
- 0x26, 0xa6, 0x83, 0xbe, 0x78, 0x3a, 0xc0, 0x3d, 0xe4, 0x67, 0x45, 0xbd,
- 0x66, 0xb0, 0x50, 0x3e, 0x08, 0x9d, 0x0d, 0xbc, 0x73, 0x2f, 0x54, 0xbe,
- 0x70, 0x80, 0xbf, 0x3d, 0xb3, 0x0e, 0xae, 0xbd, 0x56, 0xd9, 0x02, 0x3e,
- 0xcf, 0x70, 0x6a, 0xbe, 0xfd, 0xe3, 0x28, 0x3d, 0xf0, 0x13, 0xe0, 0xbd,
- 0x91, 0x0b, 0x95, 0x3d, 0x03, 0x6d, 0x7f, 0x3e, 0x2a, 0xf3, 0x63, 0x3f,
- 0xf2, 0x37, 0x88, 0x3d, 0x35, 0x6d, 0x25, 0xbe, 0xf3, 0x5e, 0x8d, 0xbd,
- 0xa4, 0xc7, 0x4f, 0x3e, 0x9c, 0x14, 0xd5, 0x3d, 0xe0, 0x67, 0xed, 0x3d,
- 0x78, 0xa9, 0xcc, 0xbd, 0x78, 0x4a, 0xe6, 0xbc, 0x52, 0x8c, 0xef, 0x3d,
- 0xd8, 0x94, 0xb9, 0xbd, 0x30, 0x89, 0x8d, 0xbe, 0x7f, 0xb6, 0x2a, 0x3f,
- 0xd2, 0xe9, 0x66, 0xbd, 0x8a, 0x80, 0xe1, 0x3d, 0xdf, 0x88, 0x03, 0xbe,
- 0x56, 0x2d, 0xf6, 0x3e, 0x86, 0xd2, 0x3d, 0x3f, 0xdc, 0xbc, 0xad, 0x3e,
- 0x85, 0x84, 0x9c, 0xbc, 0xbd, 0x4c, 0x2c, 0xbd, 0x15, 0x8a, 0x88, 0xbd,
- 0x76, 0x29, 0xf2, 0x3d, 0x99, 0x90, 0x8a, 0xbe, 0xb9, 0x45, 0x2f, 0xbd,
- 0xc0, 0xd5, 0x77, 0x3e, 0xc2, 0x44, 0xe6, 0xbd, 0xd9, 0x85, 0xe2, 0xbe,
- 0x0f, 0x1a, 0x5b, 0xbb, 0xfd, 0xc4, 0xa3, 0x3d, 0x52, 0x35, 0xb3, 0xbe,
- 0x1b, 0xcf, 0xae, 0xbd, 0x1b, 0xa8, 0x43, 0xbd, 0x71, 0x4b, 0xd9, 0xbd,
- 0xdd, 0x0b, 0x2c, 0xbd, 0x4c, 0x55, 0x35, 0x3e, 0xda, 0x57, 0x78, 0xbd,
- 0xde, 0xda, 0x84, 0xbd, 0x16, 0xb6, 0xd2, 0x3d, 0x2b, 0x2b, 0x27, 0x3d,
- 0x94, 0x68, 0x15, 0xb9, 0xf4, 0x24, 0x3e, 0xbe, 0xdc, 0xd4, 0x2c, 0xbc,
- 0xcd, 0xd3, 0x3e, 0xbe, 0x68, 0x42, 0x0b, 0x3e, 0xfb, 0x99, 0x5d, 0x3d,
- 0x11, 0x7a, 0x90, 0xbe, 0x85, 0xf5, 0xb0, 0x3d, 0xcc, 0xdb, 0x80, 0x3e,
- 0xab, 0x48, 0xee, 0xbd, 0x58, 0x4c, 0x97, 0xbd, 0xc3, 0x07, 0xbd, 0xbe,
- 0xf5, 0xc2, 0x99, 0x3b, 0x8c, 0xd5, 0xd5, 0x3d, 0x6d, 0x0b, 0xe2, 0x3d,
- 0x99, 0x69, 0x35, 0xbd, 0x8f, 0xdd, 0x3a, 0x3e, 0x89, 0x52, 0xfb, 0xbd,
- 0xef, 0x6a, 0x3f, 0xbd, 0xae, 0xc2, 0x97, 0x3e, 0xdf, 0x39, 0x63, 0xbd,
- 0x71, 0xf2, 0x5c, 0xbd, 0x6e, 0x04, 0x7a, 0xbd, 0x8b, 0x04, 0x06, 0xba,
- 0x5b, 0xc5, 0x91, 0xbc, 0x87, 0xc6, 0x5c, 0x3d, 0x99, 0xee, 0xb9, 0xbd,
- 0xb1, 0xfd, 0xdf, 0xbd, 0x98, 0xaf, 0x5f, 0x3c, 0x78, 0x52, 0x40, 0x3e,
- 0xc5, 0x29, 0x24, 0x3e, 0x81, 0xb8, 0x5d, 0x3e, 0x6f, 0xe5, 0x12, 0xbe,
- 0xfe, 0x26, 0x68, 0x3d, 0xce, 0x6b, 0x05, 0xbe, 0xff, 0x07, 0xd9, 0xbc,
- 0xb7, 0x93, 0x55, 0xbd, 0x0e, 0x7d, 0xe2, 0x3d, 0x8c, 0xad, 0x07, 0xbe,
- 0x78, 0x4f, 0x3b, 0xbe, 0x25, 0xd7, 0x6a, 0x3d, 0x58, 0x02, 0xf3, 0x3d,
- 0xb2, 0x51, 0x4d, 0x3e, 0x69, 0x4a, 0x06, 0xbe, 0xcd, 0xeb, 0x0a, 0xbd,
- 0x5e, 0x2c, 0xca, 0xbd, 0xbc, 0x18, 0x48, 0x3d, 0x54, 0xdd, 0x40, 0x3d,
- 0x9f, 0xb9, 0x92, 0xbd, 0x5a, 0x1a, 0x01, 0x3e, 0x3f, 0x0d, 0xfb, 0xbd,
- 0x7b, 0x21, 0xaa, 0x3b, 0x11, 0xcf, 0xf4, 0xbc, 0x89, 0xfa, 0x93, 0x3e,
- 0x98, 0xe3, 0xe8, 0xbd, 0xec, 0x5b, 0x95, 0xbd, 0x52, 0xd5, 0xaf, 0x3c,
- 0xb3, 0xfb, 0x89, 0x3b, 0xe0, 0xbd, 0x4d, 0x3d, 0x11, 0x9b, 0xb2, 0xbc,
- 0x9e, 0x83, 0x30, 0x3d, 0x2c, 0x24, 0xc8, 0x3c, 0x1f, 0xad, 0x30, 0x3c,
- 0x84, 0x2c, 0xda, 0xbe, 0x36, 0x83, 0x03, 0xbe, 0xa1, 0x16, 0x82, 0xbe,
- 0x1d, 0x3e, 0xc8, 0xbc, 0xc0, 0x9c, 0x86, 0x3d, 0x00, 0x00, 0xb2, 0xbe,
- 0x75, 0x27, 0x8d, 0xbd, 0x56, 0x8c, 0x67, 0x3d, 0xcf, 0x01, 0xb4, 0xbd,
- 0x3a, 0x87, 0x87, 0xbd, 0xad, 0x2b, 0xb2, 0xbd, 0x31, 0xc0, 0x15, 0xbe,
- 0xa4, 0x7b, 0x0d, 0xbd, 0xb5, 0x5a, 0xaa, 0xbd, 0x78, 0x29, 0xbd, 0xbd,
- 0xeb, 0x61, 0x3c, 0xbd, 0xc7, 0x5f, 0x97, 0xbe, 0x40, 0xf1, 0x21, 0xbe,
- 0x3d, 0xc1, 0x2b, 0xbe, 0xa4, 0x28, 0xa5, 0x3d, 0x00, 0x53, 0x69, 0xbe,
- 0x74, 0x2b, 0x71, 0xbd, 0x2e, 0xe4, 0xe9, 0xbd, 0x3e, 0x2c, 0x1e, 0xbe,
- 0xef, 0x35, 0xf5, 0x3d, 0xc0, 0x24, 0xe4, 0x3d, 0x65, 0x31, 0xb3, 0xbe,
- 0x68, 0x47, 0x8f, 0x3e, 0x4c, 0x80, 0xb7, 0x3d, 0x37, 0x0d, 0x25, 0xbe,
- 0xf4, 0x17, 0x38, 0x3e, 0x18, 0x8f, 0x1e, 0xbe, 0xea, 0x0a, 0xa5, 0xbe,
- 0x3b, 0xd3, 0xe0, 0xbc, 0x45, 0x4a, 0xe0, 0xbc, 0xae, 0x63, 0x7c, 0x3d,
- 0x07, 0x68, 0xb2, 0x3d, 0x3c, 0xfc, 0x06, 0x3e, 0xb6, 0x4f, 0xa8, 0xbe,
- 0xed, 0xe6, 0x88, 0x3e, 0x37, 0xca, 0x8a, 0xbd, 0xf6, 0x4d, 0xb8, 0xbc,
- 0x80, 0xd0, 0x84, 0x3c, 0xd2, 0x85, 0x46, 0xbd, 0x60, 0xb8, 0x52, 0x3e,
- 0x2e, 0x93, 0x12, 0xbe, 0x55, 0xed, 0xd2, 0xbb, 0x5d, 0x4e, 0x58, 0xbe,
- 0x60, 0x48, 0xa3, 0xbc, 0x15, 0x9f, 0x3d, 0xbe, 0x5c, 0xa0, 0x91, 0x3d,
- 0x20, 0xec, 0x1b, 0xbe, 0xc6, 0x54, 0x10, 0x3d, 0x39, 0xa3, 0x37, 0xbd,
- 0xa3, 0x57, 0x78, 0xbd, 0x62, 0xce, 0x2f, 0x3d, 0x4d, 0x22, 0x5b, 0xbe,
- 0xce, 0xe9, 0xb3, 0xbd, 0xb9, 0x72, 0x8a, 0xbe, 0x4c, 0x7e, 0x05, 0x3e,
- 0xac, 0xf4, 0xc0, 0x3d, 0xf0, 0xf6, 0xeb, 0xbd, 0x77, 0x01, 0xa0, 0xbb,
- 0xdb, 0x89, 0xc2, 0x3d, 0xa6, 0x6f, 0x91, 0xb9, 0xe0, 0xb9, 0x2c, 0xbc,
- 0xaf, 0x48, 0x5a, 0xbd, 0xf0, 0x20, 0xa2, 0x3d, 0xcb, 0x44, 0x28, 0x3e,
- 0x7a, 0x50, 0xaf, 0x3b, 0x95, 0xf0, 0xc9, 0xba, 0xd1, 0xd4, 0xd8, 0xbd,
- 0x4d, 0x7b, 0xe6, 0xbd, 0xb4, 0x05, 0xa4, 0xbb, 0x34, 0x17, 0x17, 0xbd,
- 0x03, 0xfe, 0x2b, 0x3e, 0xeb, 0x89, 0x7a, 0x3d, 0x0c, 0x3e, 0x11, 0x3e,
- 0x7b, 0xcf, 0x14, 0xbe, 0x39, 0xcb, 0x93, 0x3e, 0x9d, 0x43, 0x48, 0x3d,
- 0xa7, 0x2d, 0xea, 0xbd, 0x3a, 0xd6, 0x77, 0xbd, 0xd9, 0x49, 0x97, 0xbd,
- 0x6a, 0xea, 0xeb, 0xbd, 0xd8, 0xf0, 0x31, 0x3e, 0x54, 0x18, 0xde, 0xbd,
- 0x4c, 0xe6, 0x7e, 0xbe, 0x4c, 0x5b, 0x3b, 0x3e, 0xa8, 0x18, 0x6e, 0xbd,
- 0x9b, 0xa7, 0xf2, 0x3d, 0xcd, 0xb9, 0x66, 0xbe, 0xb6, 0x77, 0xe2, 0xbd,
- 0x3a, 0xb8, 0xb3, 0xbd, 0xc9, 0x60, 0xab, 0x3b, 0x77, 0xe2, 0x14, 0xbd,
- 0x31, 0x42, 0x06, 0xbd, 0xd5, 0x0b, 0x4f, 0xbe, 0x21, 0xda, 0x61, 0xbe,
- 0xaf, 0x1b, 0x92, 0xbd, 0xf1, 0xbd, 0x53, 0x3e, 0xea, 0xcc, 0x8e, 0xbc,
- 0xcc, 0xd4, 0x8a, 0xbe, 0x47, 0xca, 0xb4, 0x3d, 0xe3, 0x3c, 0x0c, 0xbd,
- 0xb4, 0x5c, 0x19, 0x3d, 0xc2, 0x8c, 0xa5, 0x3c, 0x4c, 0xfa, 0x35, 0xbc,
- 0x55, 0x10, 0x41, 0xbe, 0x9b, 0xa3, 0xbb, 0xbd, 0xf4, 0x05, 0x26, 0xbd,
- 0x26, 0xca, 0xae, 0xbd, 0xe3, 0xac, 0xa0, 0x3e, 0x09, 0x62, 0x0a, 0xbe,
- 0xa1, 0xa5, 0xa8, 0x3e, 0x6f, 0xcc, 0x4c, 0xbe, 0xf2, 0xaa, 0x6b, 0x3d,
- 0xf6, 0x7f, 0xc0, 0x3a, 0xcc, 0x96, 0x02, 0x3d, 0x10, 0xe4, 0xd9, 0x3d,
- 0x42, 0xa4, 0x00, 0x3e, 0x88, 0x3d, 0x03, 0x3b, 0x57, 0x48, 0x0b, 0x3e,
- 0x3b, 0x35, 0x53, 0x3f, 0x6f, 0x3e, 0x2f, 0x3d, 0xad, 0x2b, 0xdd, 0xbd,
- 0x47, 0x01, 0xa6, 0xbe, 0xfb, 0x47, 0x8f, 0x3d, 0x42, 0xa0, 0x53, 0x3e,
- 0xe2, 0xb7, 0xad, 0x3e, 0x48, 0x44, 0xe9, 0xbd, 0xe6, 0x35, 0x16, 0xbf,
- 0xef, 0xee, 0x57, 0x3f, 0xbf, 0x87, 0x4f, 0xbe, 0xf8, 0x3b, 0x38, 0xbe,
- 0xa4, 0x1d, 0x58, 0x3e, 0x73, 0x59, 0x00, 0x3f, 0x9e, 0x86, 0xf4, 0x3c,
- 0xce, 0xeb, 0x2d, 0xbf, 0x12, 0x9d, 0x5a, 0xbd, 0xa7, 0x7c, 0x06, 0xbf,
- 0xb0, 0xf2, 0xda, 0x3e, 0x62, 0xef, 0x78, 0xbe, 0x8b, 0x0b, 0x35, 0x3f,
- 0xab, 0xdc, 0x97, 0x3e, 0xff, 0xc8, 0x5c, 0x3d, 0x7a, 0x56, 0xc2, 0x3d,
- 0xd5, 0x49, 0x52, 0xbe, 0x7d, 0x1f, 0x23, 0x3e, 0x3f, 0xfb, 0xf4, 0x3d,
- 0xf8, 0xd8, 0x89, 0xbc, 0x48, 0xf6, 0x9b, 0x3e, 0xe0, 0xf9, 0x3f, 0x3f,
- 0x14, 0x2c, 0x94, 0x3d, 0x1f, 0xd8, 0x6b, 0xbd, 0x90, 0x1a, 0x15, 0x3e,
- 0x2b, 0x20, 0x07, 0x3c, 0x73, 0x08, 0x91, 0x3e, 0x35, 0x91, 0x10, 0x3b,
- 0xb4, 0x50, 0xf2, 0x3e, 0x46, 0x6a, 0xa5, 0x3e, 0x3a, 0xa3, 0xff, 0x3d,
- 0x2c, 0x8a, 0x00, 0xbe, 0x67, 0x49, 0x12, 0xbe, 0x88, 0xe1, 0x81, 0xbe,
- 0x67, 0xf9, 0x85, 0x3e, 0xdc, 0x26, 0x36, 0xbe, 0x8e, 0xe2, 0x9d, 0xbd,
- 0x33, 0xff, 0xcb, 0x3d, 0xdb, 0x84, 0x98, 0x3e, 0x66, 0x97, 0xd3, 0x3e,
- 0x80, 0xf0, 0x37, 0xbe, 0x02, 0x7e, 0x2b, 0xbd, 0xa8, 0xfa, 0x03, 0xbe,
- 0x88, 0xbc, 0x7a, 0x3d, 0x36, 0x70, 0xa4, 0xbe, 0xf9, 0x0b, 0xac, 0xbd,
- 0x2c, 0x9c, 0x56, 0x3e, 0x4d, 0x1f, 0x5f, 0x3c, 0xd5, 0x66, 0x29, 0x3e,
- 0x27, 0x22, 0xcb, 0xbd, 0x4d, 0xe8, 0x10, 0xbe, 0x5d, 0x5a, 0xd7, 0xbd,
- 0xfd, 0x2e, 0x30, 0x3f, 0x83, 0x59, 0x07, 0xbc, 0x16, 0x8b, 0x9d, 0xbf,
- 0x1c, 0x94, 0x58, 0x3e, 0x7b, 0x00, 0xa0, 0x3d, 0x6d, 0xe7, 0x74, 0x3d,
- 0xbe, 0x47, 0x84, 0x3e, 0x72, 0xaf, 0x1e, 0x3e, 0x3d, 0xe0, 0x60, 0x3d,
- 0xcd, 0xf3, 0x98, 0x3f, 0xda, 0x29, 0x3a, 0xbe, 0x75, 0x5a, 0x6f, 0x3e,
- 0x42, 0x8e, 0xb7, 0xbd, 0x58, 0x6b, 0x04, 0x3e, 0x32, 0x14, 0x2f, 0xbe,
- 0x13, 0x27, 0x91, 0x3b, 0xad, 0x1e, 0xca, 0x3d, 0x73, 0x20, 0x1a, 0xbe,
- 0xdf, 0xf0, 0xd7, 0xbc, 0xea, 0x2a, 0xf5, 0x3e, 0x3a, 0x88, 0x41, 0xbf,
- 0x26, 0x49, 0xc5, 0x3e, 0xd0, 0xc2, 0x7e, 0x3d, 0x22, 0xde, 0x92, 0xbe,
- 0x5f, 0xb9, 0xc9, 0x3e, 0x96, 0x9e, 0x45, 0x3c, 0x5d, 0x0c, 0xa6, 0xbf,
- 0xb3, 0x75, 0x6a, 0x3e, 0x88, 0x46, 0xbc, 0x3e, 0xdd, 0x8a, 0xc6, 0x3e,
- 0xbc, 0x89, 0xab, 0x3c, 0x02, 0x17, 0xbd, 0x3d, 0x58, 0xd1, 0xe3, 0x3d,
- 0xf9, 0x27, 0x5d, 0xbf, 0xb0, 0x64, 0x39, 0x3e, 0x14, 0xa9, 0x00, 0x3d,
- 0xd5, 0xf8, 0x61, 0xbe, 0x6d, 0xc0, 0x1c, 0xbb, 0x12, 0x9c, 0x49, 0xbe,
- 0xfc, 0x50, 0x53, 0x3c, 0x0d, 0xc2, 0x3b, 0xbe, 0x4e, 0x2e, 0xa8, 0xbe,
- 0xea, 0x74, 0xae, 0xbd, 0xdf, 0x6a, 0x49, 0x3d, 0x92, 0x50, 0x9b, 0xbc,
- 0x5e, 0x31, 0xfa, 0xbc, 0xa9, 0x95, 0x57, 0xbe, 0xee, 0x53, 0x3e, 0x3e,
- 0x88, 0x38, 0x1b, 0xbe, 0x77, 0x20, 0x3b, 0xbd, 0x25, 0x1b, 0x39, 0x3e,
- 0xa1, 0xdb, 0xbc, 0x3d, 0xf7, 0x07, 0x1e, 0x3e, 0x69, 0xe6, 0xf1, 0x3d,
- 0x52, 0xbe, 0xde, 0xbc, 0x26, 0x50, 0x5f, 0xbd, 0xa8, 0x54, 0x3f, 0xbe,
- 0xd8, 0x26, 0x7d, 0xbe, 0xb4, 0xf7, 0x55, 0xbc, 0xfb, 0x2f, 0x3d, 0x3e,
- 0x23, 0x13, 0xb3, 0xbc, 0xd9, 0xde, 0xa0, 0xbb, 0x7e, 0xd2, 0x4b, 0xbd,
- 0x11, 0x1c, 0x07, 0x3d, 0x7b, 0x54, 0xcf, 0x3c, 0x69, 0x63, 0x49, 0xbd,
- 0x34, 0x0e, 0x89, 0xbe, 0xbd, 0x80, 0x2d, 0xbb, 0x4d, 0xc5, 0xa9, 0xbd,
- 0xf5, 0x95, 0xd8, 0x3d, 0x05, 0x67, 0x4e, 0x3e, 0x15, 0xb6, 0x6e, 0x3d,
- 0x16, 0xee, 0xda, 0xbc, 0x9a, 0x78, 0xd3, 0xbd, 0x3f, 0xe0, 0xbc, 0xbe,
- 0xe5, 0xd7, 0x4f, 0xbe, 0xe8, 0xdd, 0x18, 0xbe, 0x83, 0x69, 0xac, 0xbd,
- 0xf9, 0xba, 0xff, 0xbd, 0xfd, 0x6c, 0x7f, 0x3d, 0x56, 0x75, 0xf7, 0x3c,
- 0x4b, 0x35, 0x90, 0x3d, 0x71, 0xa6, 0xb0, 0x3b, 0x70, 0xed, 0x95, 0xbe,
- 0xd7, 0xff, 0x90, 0x3e, 0x81, 0xc7, 0x0e, 0xbd, 0x75, 0x20, 0x54, 0xbe,
- 0xc6, 0xa3, 0x0e, 0x3e, 0xa0, 0x3c, 0x6f, 0x3d, 0x2e, 0x81, 0x03, 0xbf,
- 0xc7, 0xe8, 0x73, 0xbe, 0x33, 0xb2, 0x11, 0x3d, 0x3b, 0xbf, 0xb4, 0x3d,
- 0x48, 0xab, 0x83, 0x3d, 0xfd, 0x3f, 0xad, 0x3d, 0xe6, 0x1d, 0x6e, 0x3d,
- 0xff, 0x02, 0x20, 0xba, 0xc9, 0xf9, 0xe4, 0x3d, 0x40, 0xa8, 0x50, 0x3d,
- 0x16, 0xca, 0x28, 0xbe, 0xe1, 0xb4, 0x24, 0x3e, 0x84, 0x6e, 0x19, 0xbe,
- 0x30, 0x27, 0xb1, 0xbe, 0x44, 0x20, 0x95, 0xbd, 0x49, 0xda, 0x73, 0x3e,
- 0x8d, 0x4f, 0xf5, 0xbd, 0xea, 0xa9, 0x9f, 0xbd, 0xb1, 0x30, 0x94, 0xbc,
- 0xb4, 0xf8, 0x3b, 0xbe, 0x00, 0x35, 0xd8, 0x3d, 0x0f, 0x86, 0x1a, 0xbe,
- 0x37, 0x26, 0xa8, 0xbc, 0xdd, 0xf4, 0x50, 0xbe, 0x2c, 0x53, 0x74, 0xbe,
- 0x32, 0xc7, 0x8c, 0xbc, 0x9b, 0xe6, 0xb8, 0xbe, 0xaa, 0x35, 0xd5, 0xbc,
- 0x81, 0xb9, 0xb4, 0x3d, 0xeb, 0xa2, 0x24, 0x3e, 0x8f, 0xde, 0xcf, 0xbd,
- 0xee, 0x3e, 0xb4, 0xbd, 0x76, 0x7f, 0x20, 0xbe, 0x5f, 0x31, 0x05, 0xbe,
- 0x1f, 0x50, 0x86, 0x3d, 0x3a, 0xea, 0xa4, 0x3d, 0xc0, 0x32, 0xa6, 0xbe,
- 0x84, 0x92, 0x4e, 0xbd, 0x0f, 0x1d, 0x52, 0xbb, 0xd7, 0x7b, 0xef, 0x3d,
- 0x9e, 0x4c, 0x36, 0x3d, 0xc5, 0x4e, 0x41, 0xbd, 0x98, 0x18, 0x80, 0xbe,
- 0x13, 0x34, 0x0d, 0xbe, 0xfb, 0x78, 0x19, 0x3d, 0x4d, 0x8d, 0x84, 0xbc,
- 0xc1, 0xd0, 0xe6, 0x3d, 0xcc, 0x59, 0x7c, 0xbe, 0x7e, 0xaf, 0x43, 0xbb,
- 0x36, 0x4c, 0x0b, 0xbd, 0x07, 0x2e, 0x96, 0x3d, 0x06, 0x3b, 0xb1, 0xbd,
- 0xa6, 0xf5, 0x8c, 0xbd, 0xcf, 0x62, 0xc2, 0xbe, 0x34, 0x3b, 0xa1, 0x3d,
- 0xc9, 0x2e, 0x98, 0x3d, 0xb7, 0x2d, 0x17, 0xbb, 0x9a, 0xbb, 0xbd, 0xbd,
- 0x8c, 0xca, 0x56, 0xbe, 0xb3, 0x4a, 0x66, 0xbc, 0x8f, 0x16, 0x01, 0x3d,
- 0x3d, 0x51, 0x28, 0x3e, 0x87, 0xd4, 0x35, 0x3f, 0x48, 0x4d, 0x3e, 0xbe,
- 0xd0, 0x06, 0x82, 0xbd, 0x6d, 0xb4, 0x06, 0x3f, 0xf0, 0x1b, 0x52, 0x3e,
- 0xd5, 0x55, 0x69, 0x3d, 0x8d, 0x04, 0x29, 0x3f, 0xce, 0xc4, 0xe2, 0x3d,
- 0xe5, 0xe1, 0xae, 0xbe, 0xaa, 0x22, 0x98, 0x3d, 0x34, 0x31, 0x1c, 0xbe,
- 0x2b, 0x06, 0x03, 0xbf, 0x85, 0xbb, 0x22, 0xbf, 0x7f, 0xfd, 0x40, 0xbf,
- 0x12, 0xec, 0xd1, 0xbe, 0xff, 0x4c, 0x38, 0xbe, 0x6f, 0x8a, 0x54, 0xbe,
- 0xa7, 0x48, 0xa5, 0xbe, 0xfe, 0x93, 0x9b, 0xbe, 0xac, 0x9b, 0xbe, 0xbd,
- 0x4d, 0x5c, 0xc5, 0x3b, 0x15, 0x6e, 0x0e, 0x3f, 0xf0, 0x6d, 0x01, 0x3d,
- 0xee, 0xac, 0xbb, 0x3d, 0x3e, 0x03, 0x91, 0xbd, 0x6f, 0x00, 0xf9, 0xbd,
- 0xdb, 0x31, 0x42, 0x3d, 0x0d, 0x21, 0x34, 0xbe, 0xe6, 0xa7, 0x70, 0xbd,
- 0x7c, 0x06, 0xd4, 0x3e, 0x1b, 0xe3, 0xb4, 0xbc, 0x09, 0x97, 0x28, 0x3e,
- 0xd6, 0x3b, 0xfd, 0xbd, 0xbd, 0x2a, 0x21, 0xbe, 0x44, 0x87, 0x1e, 0x3d,
- 0x25, 0x7d, 0xfd, 0xbd, 0xe2, 0x5e, 0x8f, 0x3e, 0xab, 0xe2, 0xc6, 0x3c,
- 0x10, 0x24, 0x5f, 0x3d, 0x27, 0xe9, 0xb1, 0xbe, 0x59, 0x68, 0xb9, 0xbe,
- 0x85, 0xba, 0x8d, 0x3e, 0x56, 0x7a, 0x94, 0x3d, 0xcf, 0xbc, 0x24, 0xbe,
- 0x7b, 0x77, 0x99, 0xbe, 0x8e, 0x18, 0xb6, 0xbd, 0x6b, 0x48, 0x62, 0xbf,
- 0xd7, 0x93, 0xb4, 0x3f, 0x26, 0x06, 0xbe, 0xbd, 0x47, 0x4b, 0x6a, 0x3e,
- 0xa7, 0x4b, 0x4f, 0x3e, 0xcf, 0xda, 0x5f, 0xbf, 0xcf, 0xbc, 0x1c, 0x3d,
- 0xc2, 0xbe, 0x3a, 0x3f, 0x96, 0x37, 0x8a, 0xbd, 0x7f, 0x14, 0x8b, 0x3e,
- 0x8f, 0x89, 0xa9, 0xbc, 0x13, 0xb7, 0xe7, 0xbe, 0x8f, 0x23, 0x7f, 0x3e,
- 0x2a, 0xe4, 0x80, 0xbe, 0xa2, 0x5f, 0x87, 0x3b, 0x11, 0x59, 0xdd, 0xbd,
- 0xb5, 0x84, 0xdd, 0x3e, 0x39, 0x3c, 0xfc, 0xbd, 0xad, 0xd7, 0x6f, 0xbe,
- 0x29, 0xca, 0x97, 0xbc, 0x3c, 0xc7, 0x93, 0xbd, 0x91, 0x12, 0xec, 0xbc,
- 0xd6, 0x58, 0x1b, 0x3d, 0x89, 0xb5, 0xa3, 0x3d, 0x48, 0x26, 0x01, 0xbe,
- 0x47, 0x1b, 0xef, 0xbc, 0x43, 0x79, 0xbe, 0x3e, 0x56, 0x8e, 0x8a, 0x3f,
- 0x76, 0xf0, 0x70, 0xbd, 0x84, 0x97, 0x23, 0x3d, 0xff, 0x27, 0xe2, 0x3c,
- 0xee, 0xb5, 0xb2, 0x3e, 0x95, 0x92, 0x2d, 0x3d, 0xf7, 0x40, 0x8a, 0x3e,
- 0x51, 0x66, 0x75, 0xba, 0x14, 0xe1, 0x97, 0x3d, 0x8a, 0x76, 0x57, 0x3e,
- 0xb7, 0x3d, 0xa0, 0x3b, 0x93, 0xbb, 0x0f, 0xbe, 0x91, 0x4e, 0x1a, 0x3f,
- 0xb6, 0x48, 0x42, 0x3d, 0xbc, 0xc8, 0x53, 0x3e, 0x5f, 0x59, 0x26, 0xbe,
- 0x58, 0x27, 0xea, 0x3e, 0x72, 0x37, 0x46, 0x3f, 0x62, 0xfb, 0x71, 0x3e,
- 0x6a, 0x2b, 0xf7, 0x3c, 0xa0, 0xef, 0x5a, 0xbe, 0x14, 0x0b, 0x56, 0xbd,
- 0xa0, 0xfd, 0xf2, 0x3c, 0xab, 0xf0, 0x33, 0xbd, 0x5d, 0x1e, 0x27, 0xbc,
- 0x13, 0x74, 0xba, 0x3e, 0xe7, 0x70, 0xb3, 0xbd, 0x93, 0xea, 0x07, 0xbf,
- 0x6b, 0x5c, 0xb7, 0xbe, 0x03, 0xd7, 0x94, 0x3c, 0xd5, 0x68, 0x7f, 0xbe,
- 0x60, 0xd5, 0x4e, 0xbe, 0x99, 0x77, 0xe0, 0xbc, 0xa9, 0x9b, 0x9f, 0xbe,
- 0x91, 0x54, 0x7d, 0xbe, 0x6e, 0x98, 0x4c, 0x3e, 0x31, 0xd9, 0xd3, 0x3b,
- 0x21, 0xfa, 0xf9, 0x3c, 0x10, 0xbc, 0x59, 0x3d, 0x32, 0xba, 0x71, 0x3e,
- 0xad, 0xfa, 0x6a, 0xbc, 0x84, 0x07, 0x70, 0xbb, 0x92, 0x13, 0x86, 0x3d,
- 0x9a, 0x5e, 0xb5, 0xbd, 0xf1, 0x20, 0x00, 0xbc, 0xc9, 0xa3, 0xfa, 0x3d,
- 0xbb, 0x89, 0x4a, 0xbe, 0xe1, 0x69, 0x04, 0x3e, 0x11, 0x4a, 0x0b, 0x3e,
- 0xbe, 0x8f, 0x48, 0x3c, 0x8a, 0x1b, 0xb3, 0xbd, 0xb3, 0xe4, 0x18, 0xbf,
- 0xcd, 0xdf, 0x13, 0xbe, 0xe2, 0x31, 0xe5, 0xbd, 0xc5, 0x7d, 0xb1, 0xbc,
- 0x97, 0x80, 0x20, 0xbc, 0x7c, 0x7d, 0xcd, 0xbd, 0x69, 0xf9, 0x62, 0xbe,
- 0xaf, 0x08, 0xff, 0xbd, 0x9e, 0x4e, 0x9f, 0x3e, 0xe1, 0xd1, 0x10, 0xbe,
- 0x28, 0xd8, 0xb6, 0x3c, 0x02, 0xa2, 0x3b, 0xbd, 0x9c, 0xfb, 0x4e, 0xbe,
- 0x43, 0x61, 0x4e, 0x3e, 0x46, 0x02, 0xa9, 0x3c, 0x8e, 0x86, 0xfc, 0xbd,
- 0xe1, 0x04, 0x00, 0xbe, 0x3e, 0x26, 0xb9, 0x3d, 0xfe, 0x24, 0x1d, 0x3e,
- 0x23, 0x11, 0xe5, 0x3d, 0xd6, 0xb2, 0x97, 0x3d, 0x9b, 0x68, 0xa5, 0xbe,
- 0x46, 0x33, 0xac, 0x3d, 0x64, 0x58, 0x4e, 0xbe, 0x85, 0x89, 0x33, 0x3e,
- 0xb5, 0x01, 0x07, 0xbd, 0x27, 0xf3, 0xae, 0x3d, 0xeb, 0xfd, 0x48, 0xbe,
- 0x0f, 0x6e, 0xb1, 0xbd, 0x30, 0x9d, 0xaf, 0xbc, 0x9b, 0x4e, 0xb5, 0x3d,
- 0x54, 0xa6, 0x17, 0x3e, 0x95, 0xea, 0xb9, 0xbd, 0x30, 0x3e, 0x8b, 0x3e,
- 0x8d, 0x15, 0x54, 0xbe, 0x9c, 0x42, 0x1f, 0x3e, 0xe1, 0xda, 0x9e, 0x3d,
- 0x1c, 0xb5, 0xca, 0xbd, 0x94, 0x9b, 0xf2, 0x3d, 0xcd, 0x15, 0x61, 0xbc,
- 0x31, 0xfc, 0x42, 0x3e, 0xf6, 0xca, 0x3c, 0xbe, 0xec, 0x03, 0x64, 0x3e,
- 0xac, 0x4a, 0x3f, 0xbe, 0x27, 0x27, 0x3e, 0xbd, 0xdb, 0x28, 0x3b, 0x3d,
- 0xbe, 0xce, 0x97, 0xbd, 0x0e, 0x8e, 0xda, 0xbb, 0x68, 0xe9, 0xde, 0xbd,
- 0xf0, 0xe2, 0x26, 0xbe, 0xde, 0x86, 0x70, 0x39, 0x51, 0xc4, 0x70, 0x3e,
- 0x5b, 0x9c, 0x3e, 0xbf, 0x30, 0x7e, 0x4f, 0x3b, 0x53, 0x6e, 0x11, 0xbd,
- 0x44, 0x5c, 0x1a, 0xbe, 0xc1, 0x60, 0x79, 0xbc, 0xb4, 0x1f, 0x66, 0xbe,
- 0xca, 0x11, 0x05, 0x3d, 0xfc, 0xe1, 0x96, 0xbd, 0xe5, 0xab, 0xdc, 0x3c,
- 0x23, 0xcd, 0xb6, 0xbd, 0xca, 0xec, 0xe8, 0xbd, 0x65, 0x86, 0x6c, 0xbe,
- 0x69, 0x51, 0x15, 0xbe, 0xf2, 0x9d, 0x70, 0xbe, 0x8d, 0x8f, 0xeb, 0xbd,
- 0xe7, 0x89, 0x56, 0xbd, 0x7d, 0x6b, 0x18, 0xbe, 0xd5, 0x94, 0xbb, 0xbd,
- 0x59, 0xff, 0x9a, 0xba, 0x8c, 0x15, 0x2a, 0xbd, 0xb7, 0x6f, 0xc0, 0xbe,
- 0x64, 0x70, 0x12, 0x3e, 0xf9, 0x4c, 0x63, 0xbe, 0xf6, 0x94, 0x36, 0xbe,
- 0x48, 0x56, 0x92, 0x3e, 0xb6, 0x5c, 0x46, 0x3d, 0x2d, 0xf7, 0x27, 0xbe,
- 0xee, 0x90, 0xd1, 0x3c, 0x40, 0x1b, 0x0b, 0xbe, 0xf0, 0x56, 0x00, 0xbd,
- 0xf5, 0x8d, 0x97, 0xbb, 0x6f, 0xd2, 0x26, 0xbd, 0xf3, 0x2b, 0xf2, 0xbe,
- 0x95, 0x3f, 0x18, 0xbe, 0x09, 0x19, 0x16, 0xbe, 0x79, 0x44, 0x88, 0x3d,
- 0x94, 0xd9, 0xad, 0x3d, 0x28, 0x11, 0x53, 0x3e, 0x72, 0xbe, 0x89, 0xbe,
- 0xde, 0xa1, 0x46, 0x3e, 0x20, 0x57, 0xcd, 0x3d, 0x66, 0x77, 0xfe, 0x3c,
- 0xd8, 0x3f, 0xd7, 0x3d, 0x6a, 0xd1, 0x52, 0x3e, 0x2b, 0x91, 0x27, 0x3e,
- 0x1b, 0x36, 0x8b, 0xbe, 0x86, 0x04, 0x42, 0xbe, 0x49, 0x84, 0xe1, 0x3d,
- 0x60, 0x49, 0xe0, 0xbc, 0xc1, 0x6e, 0xa6, 0xbe, 0xcb, 0x91, 0xe9, 0x3c,
- 0x34, 0x96, 0x90, 0xbd, 0xb1, 0x63, 0xcb, 0xbd, 0x36, 0xf9, 0x25, 0x3e,
- 0xa9, 0x92, 0x16, 0xbd, 0x9d, 0xee, 0xa7, 0xbd, 0x83, 0x95, 0xb4, 0x3c,
- 0x51, 0x87, 0x21, 0xbe, 0x2a, 0x4e, 0x67, 0xbe, 0x47, 0x77, 0xc1, 0xbd,
- 0x58, 0x4b, 0x48, 0xbd, 0x5f, 0xf7, 0xbc, 0xbd, 0x63, 0xb0, 0xc3, 0x3a,
- 0xf8, 0xf1, 0xe2, 0x3d, 0x48, 0xed, 0x9a, 0xbd, 0xc2, 0xb2, 0xef, 0x3d,
- 0x82, 0xcd, 0xbe, 0x3c, 0x95, 0x71, 0x1a, 0x3d, 0xc2, 0xa5, 0x8b, 0x3d,
- 0xe0, 0x87, 0xf4, 0xbd, 0x67, 0x8e, 0x8c, 0x3d, 0x6d, 0x9b, 0x0f, 0xbe,
- 0x0b, 0x65, 0x09, 0xbe, 0x04, 0x0c, 0x42, 0xbe, 0xae, 0x98, 0x1d, 0x3d,
- 0x4f, 0xac, 0xa9, 0x3b, 0xe5, 0x17, 0xc9, 0x3c, 0xfa, 0x32, 0xc6, 0x3d,
- 0x8d, 0x36, 0x47, 0xbb, 0x4b, 0x72, 0x39, 0x3e, 0x6a, 0xaf, 0xfb, 0x3d,
- 0x27, 0x05, 0x5c, 0xbd, 0xc7, 0x67, 0xa8, 0x3c, 0x46, 0x4d, 0x10, 0x3e,
- 0xdc, 0x1a, 0xab, 0xbd, 0x76, 0xd9, 0x2f, 0x3d, 0x9e, 0x71, 0x8d, 0xbe,
- 0xd3, 0x22, 0x82, 0xbe, 0x69, 0x3d, 0x39, 0x3e, 0x51, 0x21, 0x3a, 0x3d,
- 0x76, 0x51, 0x9a, 0xbc, 0x59, 0x5a, 0x37, 0xbe, 0x43, 0x5a, 0x15, 0xbe,
- 0xb9, 0x92, 0xbd, 0xbd, 0xdd, 0x41, 0xb8, 0xbc, 0x84, 0x97, 0xa7, 0x3d,
- 0xaf, 0xe2, 0x0b, 0xbe, 0x9a, 0x6e, 0x9a, 0xbd, 0x04, 0x5e, 0x6b, 0xbd,
- 0x9c, 0x03, 0x3e, 0x3c, 0x70, 0x55, 0x5f, 0x3e, 0x16, 0x03, 0xef, 0xbd,
- 0x96, 0x5f, 0x95, 0xbe, 0x5f, 0xbf, 0x16, 0xbe, 0xd8, 0x62, 0xf4, 0xbb,
- 0x01, 0x3e, 0xa9, 0x3d, 0xef, 0x3e, 0xcd, 0xbd, 0xed, 0x10, 0x90, 0xbe,
- 0xcd, 0x3f, 0xa9, 0x3b, 0xce, 0xb0, 0x99, 0x3d, 0x27, 0x06, 0x3f, 0xbe,
- 0xdd, 0x0b, 0xa4, 0x3d, 0xec, 0x4c, 0xd4, 0x3e, 0x1c, 0x59, 0xed, 0xbd,
- 0x9f, 0xae, 0xeb, 0x3d, 0xf1, 0xaf, 0xb0, 0xbd, 0x94, 0x4a, 0x63, 0x3d,
- 0x9c, 0x91, 0xd6, 0xbd, 0x70, 0xff, 0x16, 0xbe, 0xb6, 0xe0, 0x2a, 0x3e,
- 0x6d, 0xa9, 0xb1, 0x3d, 0x08, 0x9b, 0xa3, 0x3c, 0xbd, 0x54, 0x79, 0x3d,
- 0x33, 0xe8, 0x17, 0x3f, 0xa1, 0xfd, 0x5e, 0x3d, 0x07, 0x76, 0x94, 0xbd,
- 0x90, 0x9d, 0xd7, 0xbe, 0x1f, 0x75, 0x62, 0xbe, 0x25, 0xf4, 0xe6, 0xbd,
- 0xf9, 0x4f, 0xd5, 0x3e, 0x2b, 0x29, 0xee, 0xbc, 0xb8, 0x6d, 0x6b, 0x3d,
- 0x55, 0xee, 0x3c, 0x3f, 0xbd, 0x7d, 0x81, 0x3d, 0x4d, 0x91, 0x08, 0x3d,
- 0x58, 0x08, 0x88, 0x3d, 0x2c, 0xff, 0xb6, 0x3e, 0x8e, 0x84, 0xe3, 0x3c,
- 0x3c, 0xe1, 0x9d, 0xbe, 0xc6, 0x15, 0x25, 0x3e, 0x3d, 0x3a, 0x4d, 0xbe,
- 0xc4, 0xf5, 0xa3, 0x3e, 0xa3, 0xf4, 0xb6, 0xbe, 0xea, 0xf1, 0xff, 0xbc,
- 0x6f, 0x03, 0x92, 0x3c, 0xab, 0x78, 0x39, 0xbb, 0xb5, 0x6f, 0x1f, 0x3e,
- 0x45, 0xc7, 0x8a, 0xbe, 0x80, 0xab, 0x01, 0x3f, 0x93, 0x12, 0x48, 0x3e,
- 0x72, 0x2a, 0xef, 0x3c, 0xd4, 0x5c, 0x04, 0x3e, 0x31, 0x9a, 0xfd, 0xbe,
- 0xd0, 0x3a, 0x99, 0xbd, 0xa5, 0x0f, 0x9b, 0x3d, 0x1f, 0xc6, 0xdf, 0x3e,
- 0x76, 0x73, 0x90, 0xbc, 0x55, 0x18, 0x11, 0x3f, 0x74, 0x54, 0xcc, 0xbd,
- 0xcb, 0xc9, 0xad, 0x3e, 0x66, 0x76, 0x9b, 0x3e, 0xb7, 0xea, 0x6c, 0x3e,
- 0x7c, 0x72, 0x1f, 0xbe, 0x10, 0x07, 0xc0, 0xbd, 0x8a, 0xd2, 0x46, 0x3d,
- 0xba, 0x4c, 0x94, 0x3e, 0xe0, 0x35, 0x2e, 0x3f, 0xa9, 0x77, 0x2d, 0x3e,
- 0x3b, 0xe5, 0xe2, 0x3e, 0x57, 0x22, 0x56, 0xbd, 0xfe, 0xbf, 0x8e, 0x3e,
- 0x0c, 0x93, 0xfe, 0x3d, 0x9e, 0x59, 0xbd, 0xbd, 0x0f, 0xbb, 0xbd, 0xbd,
- 0x1d, 0x7a, 0xb8, 0xbe, 0x74, 0x22, 0x0f, 0xbf, 0x4b, 0xf2, 0x3d, 0xbe,
- 0x54, 0x75, 0x70, 0x3e, 0x95, 0xa2, 0xc1, 0xbe, 0x15, 0x7c, 0x40, 0xbe,
- 0xe7, 0x44, 0xc1, 0xbc, 0x2b, 0x14, 0x66, 0xbe, 0x8d, 0x4c, 0x06, 0xbe,
- 0xd3, 0xad, 0x94, 0xbc, 0x78, 0x79, 0x62, 0x3a, 0xc3, 0x38, 0x7c, 0x3e,
- 0x22, 0xd6, 0xa5, 0x3e, 0xf9, 0xd5, 0x14, 0xbe, 0x53, 0x8f, 0x42, 0x3d,
- 0x1b, 0x70, 0x65, 0x3e, 0x3e, 0x54, 0x13, 0xbe, 0x39, 0xc2, 0x0e, 0xbe,
- 0x4c, 0x9b, 0x32, 0x3e, 0x76, 0xac, 0xd1, 0xbe, 0xe0, 0x6e, 0x09, 0x3f,
- 0x49, 0xe5, 0x5c, 0xbb, 0xae, 0x91, 0x94, 0x3e, 0x7c, 0xa2, 0xc1, 0xbe,
- 0x94, 0xdb, 0x03, 0xbe, 0xf9, 0xf0, 0x90, 0x3e, 0xa9, 0x96, 0xec, 0xbd,
- 0xe0, 0x81, 0xdb, 0xbd, 0xcf, 0x08, 0x54, 0xbe, 0xc9, 0x4c, 0x8d, 0xbf,
- 0xbf, 0x3f, 0x90, 0xbe, 0x39, 0xe6, 0x8b, 0xbd, 0xf8, 0xac, 0x01, 0x3f,
- 0x99, 0x52, 0xbc, 0x3e, 0xe3, 0x46, 0x33, 0xbd, 0x8e, 0x77, 0x3a, 0x3e,
- 0xdb, 0x09, 0x0e, 0xbe, 0x06, 0xa8, 0x0f, 0x3e, 0x3c, 0x65, 0xd0, 0x3e,
- 0x96, 0x25, 0xfc, 0x3b, 0xcf, 0x41, 0x1c, 0xbe, 0xb4, 0xd0, 0xca, 0x3b,
- 0x36, 0xab, 0xb3, 0xbf, 0x00, 0xe0, 0xba, 0x3e, 0xec, 0x3d, 0x22, 0x3d,
- 0xd4, 0x3a, 0xb2, 0xbe, 0xd3, 0x17, 0xe0, 0xbc, 0xfc, 0x64, 0x87, 0xbe,
- 0x55, 0x6f, 0xcf, 0xbd, 0xa4, 0x11, 0x39, 0xbe, 0x5d, 0x91, 0x31, 0xbf,
- 0xc1, 0xe7, 0x54, 0xbd, 0xf5, 0x32, 0x06, 0x3e, 0x08, 0xa5, 0xd5, 0x3d,
- 0x07, 0x25, 0x24, 0x3d, 0xe5, 0x78, 0x37, 0xbe, 0xfe, 0xff, 0x32, 0x3e,
- 0xa0, 0xe5, 0xdd, 0x3d, 0x42, 0x3b, 0xe3, 0xbd, 0x46, 0xbf, 0x4c, 0xbd,
- 0xd2, 0x28, 0x07, 0x3e, 0xb3, 0xd4, 0x0f, 0x3e, 0xd9, 0xf0, 0xb0, 0x3d,
- 0xa3, 0xeb, 0x6b, 0xbd, 0x2b, 0x9e, 0xf5, 0xbc, 0xdb, 0x67, 0x3f, 0xbe,
- 0x54, 0xcb, 0x5c, 0xbe, 0x3c, 0x3e, 0x21, 0xbe, 0x98, 0x82, 0xd5, 0xbc,
- 0x28, 0x6b, 0x48, 0xbe, 0xfc, 0x0c, 0x98, 0xbd, 0x18, 0x70, 0x81, 0x3c,
- 0xe8, 0xf0, 0x50, 0xbe, 0x2b, 0x3e, 0x6a, 0xbe, 0xc6, 0x32, 0x83, 0xbc,
- 0xbc, 0xef, 0x58, 0xbe, 0x9b, 0x3c, 0x7b, 0x3d, 0x95, 0x7a, 0xc3, 0xbd,
- 0x6b, 0x75, 0x98, 0xbd, 0xc4, 0x3a, 0x20, 0x3e, 0x07, 0xa3, 0x29, 0x3d,
- 0x76, 0x36, 0x5f, 0xbc, 0x12, 0xad, 0x0f, 0x3d, 0x38, 0xdf, 0x46, 0xbe,
- 0xf4, 0x84, 0x69, 0xbe, 0xb5, 0xbd, 0xd2, 0x3d, 0xad, 0x5d, 0x7d, 0x3d,
- 0x05, 0x7c, 0xab, 0xbe, 0x12, 0x07, 0x8a, 0xbd, 0x9f, 0x1e, 0xde, 0x3d,
- 0x7f, 0x3d, 0x8f, 0xbd, 0xf4, 0x97, 0x15, 0xbd, 0xd3, 0xb6, 0x35, 0xbe,
- 0xdb, 0xd3, 0xc5, 0x3e, 0xb2, 0xaf, 0xa8, 0x3d, 0x6a, 0x6c, 0x64, 0xbe,
- 0x59, 0x34, 0x1e, 0x3d, 0xf6, 0xe3, 0x19, 0x3e, 0x4d, 0x36, 0xe2, 0xbe,
- 0x96, 0x71, 0x26, 0xbe, 0xb0, 0x20, 0x11, 0xbe, 0xe0, 0x51, 0xe4, 0xbd,
- 0x53, 0x4c, 0x25, 0x3d, 0xb6, 0x94, 0x0f, 0xbd, 0x81, 0x42, 0x7a, 0x3d,
- 0xee, 0xd9, 0xae, 0x3d, 0x9f, 0xdc, 0x59, 0x3c, 0xbf, 0x49, 0x33, 0x3e,
- 0xdb, 0x05, 0x21, 0xbe, 0x8c, 0x1a, 0xfa, 0xbc, 0x26, 0x76, 0x04, 0xbe,
- 0x0e, 0x55, 0x88, 0xbe, 0x5d, 0x6b, 0x8c, 0x3d, 0x50, 0xc6, 0xc3, 0xbd,
- 0xfd, 0xea, 0x81, 0x3d, 0x53, 0xbc, 0x33, 0xbd, 0x02, 0x33, 0xc1, 0xbd,
- 0xe9, 0xd8, 0x0d, 0xbe, 0xf3, 0x81, 0x8c, 0x3d, 0x0b, 0xfc, 0x38, 0xbe,
- 0x9b, 0xca, 0x46, 0x3c, 0xcb, 0x9f, 0x9a, 0xbc, 0x32, 0x82, 0x8d, 0xbe,
- 0x84, 0x6a, 0x8d, 0xbc, 0xba, 0x9f, 0xa7, 0xbe, 0xa3, 0x89, 0x58, 0xbd,
- 0xcd, 0x57, 0x8a, 0xbd, 0xeb, 0x79, 0xbf, 0x3d, 0xf9, 0x1a, 0x8b, 0x3d,
- 0x3c, 0x98, 0x63, 0x3c, 0x90, 0x64, 0x8e, 0xbc, 0xfb, 0x0d, 0x06, 0x3c,
- 0xd7, 0x78, 0x65, 0xbd, 0x43, 0x3f, 0x75, 0xbd, 0xd8, 0xe9, 0xb2, 0xbe,
- 0x37, 0x53, 0x12, 0x3d, 0x38, 0x8c, 0xa3, 0x3d, 0x58, 0x19, 0x50, 0x3c,
- 0x2f, 0xf8, 0xc6, 0xbc, 0x83, 0x08, 0xb2, 0x3d, 0xfe, 0x4d, 0x75, 0x3c,
- 0x8f, 0x25, 0x29, 0xbe, 0xec, 0x1f, 0xe1, 0x3b, 0xb5, 0x82, 0x05, 0x3e,
- 0xfe, 0x73, 0x0c, 0xbc, 0xbc, 0xb5, 0x13, 0xbf, 0x79, 0x36, 0xd1, 0xbd,
- 0xd0, 0x0d, 0x0c, 0xbd, 0xc2, 0x24, 0x04, 0x3e, 0x20, 0xe7, 0xd2, 0x3d,
- 0x2a, 0x87, 0x2b, 0x3d, 0xde, 0x9e, 0xdd, 0xbe, 0x19, 0x04, 0xd8, 0x3d,
- 0x24, 0x5c, 0x5a, 0x3d, 0xe8, 0x01, 0x08, 0x3d, 0x35, 0x15, 0x38, 0x3c,
- 0x1c, 0x81, 0xa1, 0xbe, 0x07, 0x49, 0x84, 0xbd, 0x3d, 0xab, 0x83, 0x3c,
- 0x31, 0x74, 0xa9, 0x3e, 0x57, 0x5c, 0x29, 0x3f, 0x1e, 0x7b, 0xba, 0xbd,
- 0x9e, 0x04, 0xdb, 0xbc, 0x69, 0x7f, 0x0b, 0x3f, 0x97, 0xb2, 0xa6, 0x3e,
- 0x79, 0xd6, 0x11, 0xbe, 0x96, 0x6c, 0xfa, 0x3e, 0x4b, 0xaa, 0xdb, 0x3d,
- 0xf5, 0x90, 0x98, 0xbe, 0xb5, 0x40, 0x30, 0x3e, 0x9c, 0x92, 0x7a, 0xbe,
- 0x2a, 0xc3, 0xfb, 0xbe, 0xd7, 0xef, 0x4d, 0xbf, 0x39, 0xbe, 0x59, 0xbf,
- 0x36, 0x24, 0xab, 0xbe, 0x38, 0x4d, 0x2b, 0x3d, 0xd7, 0x67, 0xa7, 0xbc,
- 0x28, 0x6a, 0xa3, 0xbe, 0xd0, 0x75, 0x93, 0xbe, 0x14, 0xe4, 0x96, 0xbe,
- 0xf4, 0x6f, 0xd0, 0x3c, 0xfb, 0x27, 0xc1, 0x3e, 0xe5, 0xc7, 0x4a, 0x3e,
- 0x76, 0xac, 0xf2, 0xbd, 0xce, 0xcd, 0xeb, 0xbd, 0x05, 0x20, 0x4d, 0xbe,
- 0xaf, 0x35, 0x93, 0xbd, 0x94, 0x84, 0x8a, 0xbc, 0x4f, 0x37, 0x9f, 0xbd,
- 0x4f, 0xce, 0x03, 0x3f, 0x2f, 0x8f, 0x8d, 0xbe, 0x0f, 0x4e, 0x82, 0x3e,
- 0xc3, 0xcd, 0x2e, 0xbd, 0xd7, 0x98, 0x9f, 0xbd, 0x16, 0xeb, 0xfb, 0xbd,
- 0x90, 0x41, 0xa6, 0x3d, 0x62, 0x60, 0x8a, 0x3e, 0x4e, 0x9f, 0xa6, 0xbd,
- 0x7c, 0x9e, 0x22, 0x3d, 0xe5, 0xce, 0xc7, 0xbd, 0xb8, 0x97, 0x76, 0xbe,
- 0x7e, 0x75, 0x18, 0x3e, 0x63, 0xc7, 0x15, 0x3e, 0x0e, 0xa3, 0xd5, 0xbb,
- 0xa7, 0x2d, 0x33, 0xbe, 0x07, 0x30, 0x2a, 0xbd, 0x4e, 0xb7, 0x89, 0xbf,
- 0x11, 0xec, 0xb3, 0x3f, 0x9c, 0x5b, 0x54, 0xbe, 0x75, 0x3f, 0x5d, 0xbc,
- 0xa5, 0xb0, 0x2c, 0x3d, 0x59, 0x2e, 0x44, 0xbf, 0xd9, 0xa5, 0x9b, 0xbc,
- 0xca, 0x7f, 0x02, 0x3f, 0x74, 0x7c, 0x1f, 0xbe, 0x1e, 0xd9, 0x82, 0x3e,
- 0xf7, 0x7e, 0x25, 0xbe, 0x4d, 0x18, 0xd5, 0xbe, 0x53, 0x34, 0xf5, 0x3d,
- 0x41, 0xe1, 0xc3, 0xbc, 0x63, 0x5a, 0x0c, 0x3e, 0xc8, 0xcf, 0x04, 0x3d,
- 0xaf, 0x21, 0xda, 0x3e, 0x0a, 0xd2, 0x37, 0xbe, 0x8e, 0xef, 0x86, 0xbd,
- 0xcd, 0xcf, 0x0e, 0xbe, 0xa4, 0xfe, 0xb5, 0x3d, 0x23, 0xfe, 0x0a, 0x3e,
- 0xbd, 0x6d, 0x1f, 0xbe, 0xa0, 0x8f, 0x4b, 0x3e, 0x06, 0x01, 0xe0, 0xbd,
- 0xef, 0x04, 0x02, 0xbe, 0x51, 0x9a, 0xbd, 0x3e, 0xdb, 0xfb, 0x87, 0x3f,
- 0x6e, 0x64, 0x89, 0x3c, 0xf4, 0x6a, 0xcb, 0xbd, 0x3d, 0xc8, 0x31, 0x3e,
- 0xa5, 0xa9, 0x7c, 0x3e, 0xad, 0x6e, 0xc6, 0x3d, 0x30, 0xf0, 0x98, 0x3d,
- 0x4d, 0x24, 0x3a, 0xbe, 0xa9, 0xf1, 0xee, 0x3d, 0xe8, 0x19, 0x23, 0x3e,
- 0x37, 0xf7, 0xcc, 0xbd, 0x8e, 0x41, 0x7a, 0xbe, 0xa3, 0x96, 0x0a, 0x3f,
- 0xe3, 0xe2, 0x77, 0xbd, 0x09, 0x4a, 0xa8, 0x3e, 0xfd, 0x42, 0x15, 0xbe,
- 0xb8, 0xfb, 0xd2, 0x3e, 0xd8, 0x74, 0x21, 0x3f, 0x34, 0x63, 0x3c, 0x3e,
- 0x8a, 0x93, 0x23, 0xbb, 0xd0, 0xf2, 0x42, 0xbe, 0xef, 0xe5, 0x94, 0x3d,
- 0x61, 0x19, 0x32, 0x3e, 0x84, 0xde, 0x7d, 0xbd, 0x7e, 0xae, 0x11, 0xbe,
- 0xb5, 0xba, 0xa9, 0x3e, 0x65, 0x65, 0x66, 0xbd, 0x41, 0xe8, 0xc4, 0xbe,
- 0x50, 0xd1, 0x3d, 0xbe, 0x2e, 0x40, 0x70, 0xbd, 0xef, 0xe2, 0x86, 0xbe,
- 0x18, 0xd7, 0x26, 0x3d, 0xb9, 0xdd, 0xc7, 0x3d, 0x4c, 0x6e, 0xd1, 0xbe,
- 0xbe, 0x4e, 0x40, 0xbe, 0x9f, 0xb7, 0x8d, 0x3d, 0x9a, 0x5b, 0x5f, 0xbd,
- 0xde, 0xc1, 0x90, 0x3d, 0x09, 0x77, 0xc6, 0x3d, 0xa6, 0xeb, 0x49, 0x3c,
- 0xd3, 0x70, 0x87, 0x3d, 0x62, 0x92, 0xe8, 0x3d, 0x2d, 0x1a, 0xfa, 0xbd,
- 0xa0, 0x70, 0xee, 0xbd, 0x22, 0xb5, 0x2f, 0x3a, 0x18, 0x1f, 0xbf, 0xbd,
- 0xba, 0x60, 0x8f, 0xbe, 0xff, 0xf5, 0x6b, 0x3d, 0x00, 0x69, 0x16, 0x3e,
- 0xe4, 0x05, 0x07, 0xbd, 0x87, 0xa7, 0xc7, 0xbd, 0xb1, 0x32, 0x33, 0xbf,
- 0xa3, 0xd1, 0xd4, 0x3d, 0x2f, 0xad, 0xe1, 0xbd, 0xf3, 0xb6, 0x44, 0x3d,
- 0xfd, 0x1b, 0x11, 0xbe, 0x14, 0xff, 0x09, 0x3d, 0xc0, 0xf0, 0x01, 0xbe,
- 0xbf, 0x2a, 0xe1, 0xbc, 0xd5, 0xb7, 0xa2, 0x3d, 0xf4, 0x93, 0xc5, 0xbc,
- 0xe1, 0x70, 0xc8, 0xbc, 0x69, 0x06, 0x6e, 0xbd, 0x1e, 0x17, 0xc4, 0xbc,
- 0x8c, 0x5e, 0x9b, 0x3d, 0xfb, 0xba, 0xd2, 0x3d, 0xef, 0xc0, 0xb7, 0xbb,
- 0x32, 0xc6, 0x72, 0x3c, 0xd7, 0x35, 0x01, 0xbe, 0xf0, 0xe3, 0x2b, 0x3d,
- 0xbe, 0x62, 0x2d, 0x3e, 0x10, 0xf0, 0x27, 0xbe, 0x84, 0x56, 0xa1, 0xbd,
- 0x3f, 0x56, 0xa6, 0x3d, 0x04, 0x98, 0xb5, 0xbc, 0xba, 0x11, 0x2e, 0x3e,
- 0x21, 0xf6, 0x20, 0xbc, 0xb2, 0xc1, 0x6e, 0xba, 0xeb, 0x85, 0xcd, 0xbb,
- 0x08, 0xd8, 0xa8, 0xbd, 0x84, 0x70, 0x2e, 0x3e, 0x41, 0x07, 0x1c, 0xbd,
- 0x2e, 0x44, 0x70, 0x3e, 0x34, 0xac, 0x41, 0xbb, 0x0e, 0xe7, 0xf1, 0xbc,
- 0xdb, 0x83, 0xab, 0xbc, 0xf3, 0x17, 0x41, 0x3d, 0x1f, 0x2b, 0xaa, 0x3d,
- 0x05, 0x4f, 0x5c, 0xbe, 0x14, 0x03, 0x8b, 0xbe, 0xec, 0x3f, 0x03, 0x3b,
- 0xdc, 0xf3, 0x3a, 0x3d, 0x62, 0xfc, 0xa7, 0xbd, 0x45, 0x2c, 0x39, 0xbd,
- 0x90, 0xd8, 0xc6, 0xbd, 0x50, 0xfd, 0xd0, 0x3c, 0x86, 0x14, 0x32, 0xbe,
- 0xec, 0x83, 0x8b, 0x3d, 0x06, 0x54, 0x0f, 0xbe, 0x0c, 0x6f, 0x03, 0xbe,
- 0xcf, 0x28, 0x92, 0x3d, 0xe0, 0xd4, 0x49, 0x3d, 0x3b, 0x06, 0x43, 0x3e,
- 0x6c, 0xfa, 0x15, 0xbf, 0x50, 0xf2, 0x15, 0xbe, 0x2d, 0xd5, 0xeb, 0xbd,
- 0x04, 0x12, 0xab, 0xbd, 0x4c, 0xe4, 0xad, 0xbd, 0xd3, 0x10, 0xe5, 0xbe,
- 0x4e, 0xd5, 0x96, 0xbe, 0xaf, 0x7c, 0x7a, 0xbc, 0xbf, 0x00, 0x85, 0xbe,
- 0x7b, 0x9a, 0x2b, 0xbe, 0x4d, 0xc1, 0x12, 0x3e, 0x31, 0xb8, 0x51, 0xbe,
- 0x5d, 0xd1, 0xaf, 0xbd, 0x54, 0x11, 0x9e, 0x3d, 0xb9, 0xc0, 0xcc, 0xbd,
- 0xd2, 0x4d, 0xb9, 0xbe, 0x09, 0x41, 0x73, 0xbe, 0x1e, 0xbd, 0x37, 0xbc,
- 0x00, 0xd0, 0x27, 0xbe, 0xea, 0x7c, 0x25, 0x3e, 0x30, 0xbb, 0x81, 0xbe,
- 0x2e, 0xe3, 0xed, 0x3d, 0x68, 0x89, 0xea, 0xbd, 0x3e, 0x46, 0xb3, 0xbd,
- 0x01, 0x5a, 0xc9, 0x3e, 0x36, 0x58, 0x47, 0x3e, 0xf6, 0x32, 0x73, 0xbd,
- 0x20, 0xb5, 0x7f, 0x3e, 0x74, 0xbf, 0xc2, 0xbc, 0xaf, 0x5a, 0xcf, 0x3d,
- 0xb7, 0xca, 0x0e, 0x3d, 0x91, 0x40, 0x12, 0xbd, 0x22, 0xb6, 0x08, 0xbf,
- 0x88, 0xe0, 0x12, 0x3e, 0xe1, 0x0d, 0x6b, 0x3c, 0x4c, 0x24, 0x09, 0xbe,
- 0xfe, 0xde, 0xa7, 0x3d, 0x8c, 0x1e, 0x18, 0x3e, 0x91, 0x08, 0xcc, 0xbe,
- 0x6e, 0xe5, 0x26, 0x3e, 0x47, 0xc7, 0x0d, 0x3e, 0x2a, 0x08, 0x94, 0x3d,
- 0x1e, 0x92, 0x43, 0xbe, 0x7c, 0x47, 0x2d, 0x3e, 0x26, 0x91, 0x85, 0xbd,
- 0xdb, 0x99, 0x6b, 0xbe, 0x5c, 0x78, 0xad, 0xbe, 0x8d, 0x18, 0x53, 0xbe,
- 0xf0, 0xc5, 0x10, 0xbe, 0xee, 0x7a, 0x4f, 0xbd, 0x6c, 0x5e, 0x9f, 0xbd,
- 0x01, 0x00, 0x27, 0x3d, 0xca, 0x60, 0xa7, 0x3c, 0xe2, 0x71, 0x8c, 0x3e,
- 0x28, 0xd1, 0x0b, 0x3e, 0x2e, 0xb6, 0xb5, 0xbd, 0xa3, 0x6e, 0xb8, 0xbd,
- 0x76, 0x39, 0x58, 0xbb, 0x20, 0xc2, 0x8e, 0xbd, 0x67, 0x7b, 0x12, 0x3e,
- 0xea, 0x7b, 0xdf, 0xbc, 0xb0, 0x9f, 0x01, 0xbd, 0xed, 0x82, 0xc7, 0xbd,
- 0xc6, 0x9d, 0xeb, 0x3d, 0x69, 0xce, 0x86, 0xbd, 0xf8, 0x7b, 0xc5, 0x3c,
- 0x99, 0x4e, 0xaa, 0xbd, 0x59, 0xe1, 0x4d, 0x3c, 0xf2, 0xfd, 0x94, 0x3d,
- 0xa5, 0x42, 0x18, 0x3e, 0x1b, 0xd7, 0x76, 0xbe, 0x3a, 0x09, 0xc8, 0xbd,
- 0x97, 0xd1, 0x9b, 0x3d, 0xf7, 0x33, 0x11, 0xbe, 0x90, 0xd6, 0x1d, 0xbe,
- 0x1e, 0x2e, 0x89, 0xbd, 0xb2, 0x3b, 0xdd, 0x3c, 0x4d, 0x29, 0x9b, 0x3e,
- 0x6d, 0x75, 0xe5, 0xbc, 0x46, 0x2c, 0x52, 0x3e, 0xfe, 0x68, 0x00, 0x3e,
- 0x14, 0xc6, 0x23, 0xbe, 0xb8, 0x96, 0x82, 0xbc, 0x1e, 0x92, 0x5b, 0x3d,
- 0xc7, 0x69, 0x78, 0x3d, 0x08, 0xb2, 0x80, 0x3d, 0x37, 0xf9, 0x1f, 0xbe,
- 0x16, 0x4c, 0xfa, 0xbd, 0x3e, 0x68, 0xe1, 0x3d, 0x68, 0x45, 0x1b, 0xbe,
- 0xee, 0xc1, 0xca, 0x3c, 0xdd, 0x70, 0x8a, 0xbd, 0x79, 0x5d, 0x06, 0xbd,
- 0xa4, 0xae, 0x71, 0xbd, 0x8f, 0xfc, 0x0b, 0x3e, 0x7a, 0xfc, 0x42, 0x3e,
- 0x76, 0x4b, 0x59, 0xbd, 0x1f, 0x76, 0xc0, 0xbd, 0x94, 0xa3, 0x6c, 0xbe,
- 0x6d, 0xc3, 0xc5, 0xbd, 0x80, 0x21, 0x1b, 0x3e, 0xd5, 0xc9, 0x06, 0x3e,
- 0x11, 0x8a, 0x1d, 0xbe, 0x71, 0xc2, 0xa2, 0xbb, 0x42, 0xb5, 0x01, 0xbe,
- 0x10, 0xd1, 0xb7, 0xbd, 0x04, 0x3b, 0x19, 0xbe, 0x01, 0x8b, 0xce, 0xbe,
- 0x61, 0x55, 0x12, 0xbe, 0xc0, 0x78, 0x05, 0xbd, 0xcd, 0xbb, 0x81, 0xbe,
- 0x59, 0x22, 0xcc, 0x3d, 0x35, 0xea, 0xd3, 0x3e, 0x2a, 0xdb, 0x94, 0xbe,
- 0xd2, 0xdb, 0xb4, 0x3d, 0xa8, 0xb7, 0x01, 0x3e, 0x35, 0x5c, 0x47, 0xbd,
- 0xf8, 0xad, 0x9e, 0xbe, 0xeb, 0x11, 0x54, 0x3e, 0x5d, 0x58, 0x9a, 0x3e,
- 0x52, 0x71, 0x28, 0x3d, 0x03, 0x44, 0xee, 0x3d, 0xc8, 0xf7, 0x2d, 0x3e,
- 0x5a, 0xbd, 0x73, 0x3f, 0xfe, 0xb2, 0x62, 0xbd, 0x31, 0x39, 0x59, 0xbe,
- 0x00, 0xbb, 0x79, 0xbf, 0xe2, 0x63, 0x23, 0xbe, 0xf9, 0xe8, 0x12, 0x3e,
- 0xa3, 0xc8, 0xe2, 0xbc, 0x2f, 0xc8, 0x8a, 0xbe, 0x35, 0xe3, 0xa1, 0xbe,
- 0x0c, 0x08, 0x9f, 0x3e, 0x4a, 0xb9, 0x0d, 0x3f, 0x01, 0x4d, 0x27, 0x3f,
- 0x0f, 0x1a, 0x19, 0xbe, 0xd8, 0xa4, 0x32, 0xbd, 0x6e, 0x20, 0x19, 0x3e,
- 0x50, 0x4c, 0x6f, 0x3e, 0x8a, 0x62, 0xdd, 0x3d, 0x04, 0xd6, 0x78, 0xbf,
- 0x21, 0x70, 0xf2, 0x3d, 0xc2, 0x4d, 0x6d, 0xbe, 0xf6, 0x7d, 0x1c, 0x3e,
- 0x5c, 0x66, 0xb8, 0xbe, 0x3b, 0xcf, 0xfe, 0x3d, 0x9b, 0xaf, 0x5b, 0xbd,
- 0xab, 0x5b, 0xe3, 0xbd, 0x08, 0x52, 0x08, 0x3f, 0x5d, 0x5d, 0xfa, 0x3e,
- 0x3a, 0xa6, 0x8b, 0xbb, 0x6d, 0xd7, 0xe2, 0xbc, 0xbd, 0x7f, 0xcb, 0xbd,
- 0x51, 0xa7, 0x67, 0xbc, 0xd2, 0xc2, 0x83, 0x3e, 0x72, 0x5f, 0xfc, 0x3e,
- 0xee, 0x95, 0x53, 0xbd, 0x6c, 0x4e, 0x93, 0x3f, 0x6a, 0xa0, 0x1f, 0x3d,
- 0xd6, 0x62, 0x94, 0x3c, 0x33, 0x21, 0x00, 0xbe, 0xce, 0x0a, 0x81, 0x3e,
- 0x62, 0xf5, 0xdb, 0xbd, 0x51, 0xcc, 0x2d, 0xbd, 0xdf, 0x1e, 0x7d, 0xbd,
- 0x5b, 0x16, 0xd1, 0xbc, 0xed, 0xac, 0xf2, 0x3e, 0xe7, 0x3b, 0x58, 0x3e,
- 0xf5, 0x23, 0x3f, 0x3b, 0x5e, 0xea, 0x95, 0xbe, 0xe2, 0x74, 0x10, 0xbe,
- 0x0b, 0xeb, 0xbe, 0xbe, 0x1e, 0xbf, 0xa3, 0xbe, 0x9f, 0x54, 0x99, 0x3d,
- 0xe6, 0x65, 0xcf, 0xbe, 0xdc, 0x3a, 0x00, 0xbf, 0xce, 0x52, 0xc0, 0x3e,
- 0x56, 0x5a, 0x2a, 0x3f, 0x42, 0xa7, 0x47, 0xbf, 0xaa, 0xae, 0xcc, 0x3e,
- 0x0d, 0xff, 0x3e, 0x3d, 0x0f, 0x2f, 0xce, 0x3d, 0xab, 0xb0, 0x5a, 0x3b,
- 0x80, 0xdd, 0x84, 0xbc, 0x30, 0x1d, 0x92, 0xbd, 0xda, 0x58, 0x39, 0xbf,
- 0x3f, 0x67, 0x48, 0x3e, 0xac, 0x11, 0xfd, 0xbd, 0x3d, 0x21, 0x4c, 0x3f,
- 0x19, 0xf3, 0xa4, 0x3e, 0x25, 0x1b, 0x51, 0xbe, 0x28, 0x69, 0x8c, 0x3d,
- 0x74, 0xc4, 0x72, 0x3e, 0xa4, 0x86, 0x4b, 0xbe, 0xe1, 0x03, 0xb1, 0x3e,
- 0xbd, 0x47, 0x06, 0xbe, 0x1d, 0x77, 0xd5, 0x3d, 0x08, 0x85, 0x26, 0xbf,
- 0xed, 0xa2, 0x0f, 0x3d, 0x69, 0x37, 0x20, 0xbe, 0xd9, 0x80, 0x69, 0xbd,
- 0x77, 0x91, 0xb5, 0xbd, 0xfd, 0xd9, 0xdd, 0xbe, 0x46, 0xe4, 0xb3, 0xbe,
- 0xee, 0xbe, 0x11, 0x3e, 0x91, 0xa1, 0x16, 0xbd, 0x3a, 0x48, 0xbb, 0x3e,
- 0x5f, 0x43, 0x2b, 0x3f, 0xa5, 0xe6, 0xb8, 0xbd, 0x66, 0x07, 0xd3, 0xbd,
- 0x37, 0x3a, 0x8b, 0xbc, 0x62, 0x30, 0xf9, 0x3b, 0xe6, 0xd4, 0x04, 0x3e,
- 0x8d, 0x56, 0x27, 0xbe, 0x48, 0x00, 0x48, 0xbe, 0xe8, 0x8f, 0x04, 0x3e,
- 0x41, 0x8c, 0xbf, 0xbf, 0xf6, 0xf3, 0x13, 0xbe, 0x3a, 0xe9, 0xc0, 0xba,
- 0xb3, 0x0f, 0xd7, 0xbe, 0x1a, 0xba, 0x35, 0xbb, 0xe8, 0xe6, 0x96, 0xbe,
- 0xa2, 0xd1, 0x60, 0xbe, 0x2a, 0x33, 0x55, 0xbe, 0x08, 0x6b, 0xbb, 0xbe,
- 0x41, 0xe9, 0xa0, 0x3d, 0xe3, 0xd7, 0x3c, 0xbd, 0xa9, 0x47, 0xa9, 0x3d,
- 0x3b, 0x4d, 0xae, 0xbb, 0x68, 0xf4, 0x56, 0xbe, 0xc3, 0x28, 0xa9, 0xbe,
- 0xf2, 0x4b, 0xd6, 0x3d, 0xba, 0x05, 0xa1, 0x3d, 0x52, 0xc5, 0xcc, 0x3d,
- 0x3a, 0x21, 0x07, 0xbe, 0x9f, 0xdd, 0x91, 0x3d, 0xcf, 0x68, 0xab, 0x3c,
- 0xb3, 0xfd, 0x3f, 0xbe, 0x24, 0xa2, 0x2c, 0xbd, 0x9d, 0xab, 0xcc, 0xbb,
- 0x97, 0xf6, 0x36, 0xbe, 0xb3, 0x3b, 0x5a, 0x3a, 0xd7, 0xa2, 0x6e, 0x3d,
- 0xb8, 0xcb, 0x31, 0xbe, 0x32, 0x6e, 0xa3, 0xbc, 0xf0, 0xaa, 0xdc, 0xbc,
- 0xb0, 0x75, 0xd3, 0xbd, 0xf5, 0x91, 0x14, 0xbc, 0xc7, 0x95, 0x2d, 0x3d,
- 0xaf, 0x99, 0xf8, 0xbc, 0x24, 0x23, 0xd4, 0xbb, 0x3c, 0x27, 0xdb, 0xbc,
- 0x64, 0x0c, 0x64, 0xbc, 0x20, 0xdd, 0xc7, 0x3c, 0x75, 0x2a, 0x8a, 0x3d,
- 0x45, 0x32, 0xb2, 0x3d, 0xb2, 0xc6, 0x22, 0xbd, 0xc5, 0xe6, 0x43, 0xbe,
- 0xff, 0x14, 0xf0, 0xbd, 0x7e, 0x38, 0xd7, 0x3d, 0x74, 0x3a, 0x31, 0x3d,
- 0xf5, 0x83, 0xc8, 0xbe, 0x72, 0xc0, 0x13, 0xbc, 0xa3, 0x87, 0x93, 0x3d,
- 0x1f, 0xfa, 0xcd, 0xbc, 0xaf, 0x26, 0x47, 0xbe, 0x49, 0xc2, 0xcb, 0xbd,
- 0x51, 0xd3, 0x85, 0x3e, 0xb8, 0x6d, 0x03, 0x3d, 0x64, 0x91, 0xd9, 0xbd,
- 0x84, 0x39, 0x0b, 0x3d, 0xd6, 0x63, 0xcb, 0x3c, 0xc3, 0x7a, 0x5e, 0xbe,
- 0x00, 0x4c, 0xee, 0xbd, 0x85, 0x0c, 0xea, 0xbd, 0xdf, 0xcd, 0x49, 0xbe,
- 0x18, 0x7a, 0x87, 0xbd, 0xe5, 0xd5, 0x16, 0xbe, 0x57, 0x77, 0xe4, 0x3d,
- 0x8c, 0x9e, 0x31, 0x3c, 0x29, 0xef, 0x91, 0xbd, 0xec, 0x13, 0xad, 0x3d,
- 0x94, 0xb2, 0x9c, 0xbd, 0x07, 0x73, 0x15, 0x3c, 0x7f, 0x9a, 0xb3, 0xbd,
- 0xa1, 0xde, 0xc9, 0xbd, 0xdc, 0xe9, 0xb1, 0xbd, 0x36, 0xfc, 0xcf, 0xbd,
- 0x08, 0x57, 0xbe, 0x3c, 0x1a, 0xba, 0xfd, 0xbd, 0x1d, 0x30, 0x12, 0x3e,
- 0xa6, 0x60, 0x01, 0xbe, 0x88, 0xa4, 0x76, 0xbd, 0xcf, 0x27, 0x12, 0xbe,
- 0x50, 0xed, 0x6e, 0x3d, 0x1b, 0xb0, 0xc1, 0xbd, 0x3b, 0xa5, 0x2b, 0xbd,
- 0x00, 0x85, 0xbd, 0x3c, 0xab, 0x5c, 0x4b, 0xbe, 0x00, 0x38, 0x05, 0xbc,
- 0xe7, 0xae, 0x28, 0xbd, 0x53, 0x7c, 0xe1, 0x3d, 0x61, 0x19, 0x1b, 0x3e,
- 0x6a, 0xf3, 0xdf, 0x3a, 0x47, 0x8a, 0x03, 0xbe, 0x16, 0x68, 0x91, 0x3d,
- 0xba, 0x3c, 0xfc, 0x3c, 0x52, 0x1b, 0xf4, 0xbd, 0x72, 0xaf, 0x8c, 0x3c,
- 0xd3, 0xe3, 0x16, 0xbb, 0xab, 0x46, 0x37, 0xbe, 0x3f, 0x98, 0x2a, 0x3d,
- 0x7e, 0x90, 0x45, 0xbe, 0x8c, 0x92, 0x62, 0xbe, 0x98, 0x4f, 0x6c, 0x3d,
- 0x72, 0x7f, 0x34, 0x3d, 0xe1, 0x4e, 0x3b, 0xbc, 0xe1, 0x79, 0xba, 0x3d,
- 0x3c, 0x7e, 0x93, 0x3d, 0xd4, 0xa0, 0x1f, 0xbf, 0x93, 0x65, 0x29, 0xbd,
- 0xb5, 0x22, 0xcc, 0xbe, 0xb7, 0x40, 0xe4, 0xbb, 0xf4, 0x1e, 0xe8, 0xbc,
- 0x15, 0xf2, 0x22, 0x3d, 0x45, 0xba, 0xde, 0xbe, 0x7a, 0x74, 0xaf, 0x3d,
- 0x8f, 0x28, 0x6c, 0xbd, 0x86, 0xfe, 0x1d, 0xbd, 0xe0, 0xa5, 0x61, 0xbd,
- 0xc5, 0x37, 0x87, 0xbe, 0x7e, 0xd9, 0x6d, 0xbe, 0x84, 0x5b, 0x74, 0xbe,
- 0x88, 0x94, 0x64, 0x3e, 0x8c, 0xd1, 0x30, 0x3f, 0x79, 0xec, 0x50, 0xbd,
- 0x4a, 0x4e, 0xec, 0xbd, 0x7d, 0xd1, 0xa8, 0x3e, 0xcb, 0x8f, 0x02, 0xbc,
- 0xfb, 0xd6, 0x87, 0x3d, 0x3a, 0x7b, 0xed, 0x3e, 0x60, 0x23, 0x1f, 0xbd,
- 0x32, 0xfb, 0x5f, 0xbd, 0x27, 0x36, 0x8f, 0x3d, 0x77, 0xec, 0x1d, 0xbd,
- 0xa2, 0x38, 0xe4, 0xbe, 0xba, 0x8e, 0x33, 0xbf, 0x95, 0x4c, 0x81, 0xbf,
- 0x32, 0x37, 0xcd, 0xbe, 0x69, 0x7f, 0xc1, 0xbc, 0x2f, 0x8c, 0x48, 0xbe,
- 0x8d, 0xfe, 0x62, 0xbe, 0x7d, 0xc3, 0x64, 0xbe, 0x09, 0x62, 0x94, 0xbd,
- 0x1f, 0x18, 0x16, 0xbe, 0x4d, 0x83, 0x23, 0x3f, 0xdd, 0xc1, 0x89, 0x3d,
- 0x86, 0x82, 0xe3, 0xbd, 0xd6, 0xa6, 0xed, 0xbd, 0x3a, 0xbd, 0x94, 0xbe,
- 0x13, 0xfd, 0x03, 0xbe, 0xd2, 0xb8, 0x0b, 0xbe, 0x57, 0x27, 0x7e, 0xbd,
- 0x3b, 0xa6, 0xcb, 0x3e, 0x5a, 0x5d, 0x8d, 0xbe, 0x4b, 0xf5, 0x8b, 0x3e,
- 0xd7, 0x92, 0x01, 0xbe, 0xfb, 0xff, 0x2d, 0xbd, 0xa6, 0xd5, 0x18, 0xbe,
- 0x18, 0xa1, 0x3f, 0xbe, 0xe6, 0x03, 0x89, 0x3e, 0xcd, 0x09, 0x13, 0x3e,
- 0x67, 0x57, 0x11, 0xbe, 0x75, 0xe1, 0x79, 0xbe, 0xbe, 0x16, 0xe7, 0xbd,
- 0x02, 0xd0, 0xd4, 0x3e, 0xb0, 0xd5, 0x04, 0x3e, 0xe7, 0xa8, 0xb2, 0xbd,
- 0x08, 0xb0, 0xfb, 0xbd, 0xa8, 0x1c, 0x22, 0xbe, 0x52, 0xa4, 0x52, 0xbf,
- 0xc5, 0xe2, 0x95, 0x3f, 0xae, 0xee, 0x87, 0x3d, 0xdd, 0xc7, 0xcc, 0x3d,
- 0xee, 0x08, 0x78, 0x3e, 0x68, 0x49, 0x52, 0xbf, 0x2b, 0x1d, 0x13, 0x3d,
- 0x1d, 0x33, 0xe0, 0x3e, 0x9a, 0x56, 0x33, 0x3d, 0x37, 0xa4, 0x8e, 0x3e,
- 0x4c, 0xb2, 0xb9, 0x3c, 0x6d, 0xf2, 0xbe, 0xbe, 0xfe, 0x02, 0x22, 0x3e,
- 0x8b, 0xa8, 0xdc, 0xbd, 0x16, 0xc5, 0x88, 0xbe, 0xec, 0x3b, 0x0c, 0xbe,
- 0x61, 0x51, 0xc7, 0x3d, 0xc3, 0x01, 0x4c, 0xbd, 0xba, 0x45, 0x69, 0xbd,
- 0x4c, 0x2c, 0x54, 0xbd, 0x38, 0x0e, 0xe3, 0xbc, 0x35, 0x9b, 0x26, 0xbe,
- 0x82, 0x93, 0x0b, 0xbe, 0xd7, 0xd5, 0x01, 0x3e, 0x8b, 0x8b, 0x09, 0x3d,
- 0xc1, 0x6e, 0x82, 0x3b, 0x1a, 0xfb, 0xfc, 0x39, 0x8f, 0x8a, 0x89, 0x3f,
- 0x54, 0xb3, 0xf7, 0xbd, 0x33, 0xb9, 0xd4, 0x3d, 0x07, 0x16, 0xc5, 0x3e,
- 0xc4, 0x9e, 0x68, 0x3e, 0x22, 0x53, 0x27, 0x3d, 0x5a, 0xb4, 0x80, 0x3c,
- 0xda, 0x8d, 0x1b, 0xbe, 0xf0, 0x42, 0xc8, 0xbd, 0x37, 0x62, 0x24, 0xbd,
- 0x08, 0x50, 0xa8, 0xbd, 0x21, 0x06, 0xe8, 0xbd, 0x66, 0xf6, 0x12, 0x3f,
- 0x2f, 0xd0, 0xdd, 0xbc, 0xa1, 0x32, 0x81, 0x3e, 0x09, 0xd6, 0x16, 0xbe,
- 0x4d, 0x08, 0x47, 0x3e, 0x49, 0x0c, 0x0b, 0x3f, 0xc1, 0x71, 0x3e, 0x3e,
- 0x2d, 0x4a, 0xb9, 0xbd, 0x84, 0x62, 0x92, 0xbe, 0x50, 0x0a, 0x3a, 0x3e,
- 0x5c, 0xe0, 0xb1, 0x3d, 0xec, 0xf5, 0x8d, 0xbd, 0xe6, 0x17, 0x56, 0xbe,
- 0x18, 0xe9, 0x49, 0x3e, 0xd5, 0xf1, 0xd6, 0x3d, 0xc9, 0x2e, 0x03, 0xbf,
- 0x1a, 0x7f, 0xfb, 0xbd, 0x2c, 0xaa, 0x17, 0xbe, 0x72, 0x73, 0x59, 0xbe,
- 0xe9, 0x8c, 0xaf, 0x3d, 0x26, 0xed, 0x25, 0x3e, 0x79, 0x6c, 0xe8, 0xbe,
- 0xe4, 0xbc, 0x81, 0xbd, 0x60, 0x96, 0x03, 0x3e, 0x5f, 0x90, 0xe0, 0x3d,
- 0xc1, 0x45, 0x1b, 0x3d, 0x55, 0xd1, 0x08, 0x3e, 0x79, 0x04, 0x8e, 0x3b,
- 0xaf, 0x0c, 0x93, 0x3d, 0x73, 0x99, 0x1e, 0x3e, 0x13, 0x15, 0xa5, 0xbd,
- 0x82, 0x34, 0x27, 0xbd, 0x31, 0xda, 0xc0, 0xbd, 0x10, 0x11, 0xe5, 0x3d,
- 0x1c, 0xbf, 0x4c, 0xbd, 0x76, 0x67, 0xef, 0x3d, 0xb5, 0x8a, 0x8d, 0x3d,
- 0xec, 0x66, 0xb6, 0xbd, 0xf3, 0x0a, 0xa1, 0x3d, 0x5f, 0xca, 0x08, 0xbf,
- 0x37, 0x01, 0x2b, 0xbd, 0x9e, 0x12, 0x79, 0x3c, 0x3a, 0xc1, 0x74, 0x3e,
- 0xaf, 0x0a, 0xe2, 0xbd, 0xbd, 0x60, 0xff, 0xbd, 0x11, 0xd9, 0xa2, 0xbd,
- 0x88, 0x8f, 0x92, 0x3b, 0xcf, 0x05, 0x52, 0x3e, 0x17, 0xe1, 0x9d, 0x3d,
- 0x8c, 0xa2, 0x5d, 0x3d, 0x2f, 0x4c, 0xef, 0xbd, 0x99, 0xa2, 0x40, 0xbb,
- 0x60, 0xe6, 0x4e, 0x3d, 0x35, 0x20, 0xd7, 0x3d, 0x37, 0xee, 0x2f, 0xbd,
- 0x17, 0x2f, 0x4d, 0x3c, 0x90, 0xfc, 0x95, 0xbd, 0x48, 0xc5, 0xec, 0x3d,
- 0xde, 0x63, 0x3b, 0x3e, 0x57, 0x31, 0xd3, 0xbe, 0x46, 0x26, 0xdc, 0xbd,
- 0x8b, 0xce, 0x22, 0x3e, 0x88, 0xb7, 0x65, 0x3d, 0x30, 0xc9, 0x95, 0x3d,
- 0x62, 0x84, 0xa1, 0x3d, 0x10, 0x3d, 0xa1, 0x3d, 0xe4, 0x17, 0x43, 0x3d,
- 0x7c, 0xde, 0xf1, 0xbc, 0x57, 0xdd, 0xe1, 0xbd, 0x3e, 0xd1, 0x82, 0x3d,
- 0x63, 0x42, 0xfd, 0x3d, 0x3a, 0xda, 0x1b, 0xbc, 0x1b, 0x0c, 0x53, 0xbe,
- 0xc5, 0x6a, 0xf5, 0xbd, 0x5e, 0x48, 0xd1, 0xbb, 0xcf, 0x7f, 0x06, 0xbb,
- 0x81, 0x53, 0x0b, 0xbe, 0x9f, 0xc0, 0x86, 0xbe, 0x78, 0xf0, 0xcb, 0xbb,
- 0xfe, 0xbc, 0x88, 0xbc, 0x00, 0xcc, 0x5a, 0x3e, 0xac, 0xfb, 0x62, 0xba,
- 0x26, 0x73, 0x45, 0xbd, 0xfe, 0xa2, 0x23, 0x3d, 0x43, 0xab, 0x64, 0xbe,
- 0x88, 0x50, 0xa8, 0x3d, 0xb5, 0x1c, 0x1d, 0xbe, 0xbd, 0xd5, 0x71, 0xbd,
- 0xeb, 0x8b, 0xef, 0xbd, 0x49, 0xf6, 0xb2, 0xbd, 0xc0, 0xd3, 0x92, 0x3d,
- 0xae, 0xd7, 0xac, 0xbe, 0xd1, 0x56, 0xd0, 0x3d, 0xac, 0x9a, 0xb4, 0xbc,
- 0x63, 0xe6, 0x5c, 0xbe, 0x6a, 0xa5, 0x2b, 0xbe, 0x89, 0xbf, 0x92, 0xbe,
- 0x49, 0x95, 0xba, 0xbd, 0x80, 0x5d, 0xf5, 0xbd, 0x03, 0x66, 0x1b, 0xbe,
- 0x65, 0x50, 0x6d, 0xbd, 0xec, 0x6b, 0xa3, 0x3d, 0xe3, 0xeb, 0x90, 0xbc,
- 0x19, 0xf9, 0x38, 0xbe, 0x2b, 0xa0, 0x87, 0xbd, 0xbc, 0x90, 0xab, 0xbd,
- 0x5b, 0x72, 0x9e, 0xbc, 0x86, 0xc4, 0x4f, 0xbe, 0x0f, 0x4d, 0xa8, 0xbe,
- 0x71, 0x63, 0x1b, 0xbd, 0x2c, 0xc3, 0x34, 0x3e, 0x82, 0x87, 0x9c, 0xbe,
- 0x50, 0xe4, 0x5d, 0x3e, 0x93, 0xe2, 0x76, 0x3d, 0x36, 0x11, 0x17, 0xbe,
- 0x12, 0x86, 0xcf, 0x3d, 0xdf, 0xfd, 0x84, 0xbc, 0x17, 0x59, 0x53, 0xbe,
- 0x3a, 0x4b, 0x63, 0x3e, 0x89, 0x23, 0x4f, 0xbd, 0xac, 0xaf, 0xa7, 0x3d,
- 0x06, 0x85, 0x08, 0x3d, 0x9d, 0x87, 0xa6, 0x3d, 0x13, 0x2b, 0xe3, 0xbe,
- 0xf9, 0xfe, 0xf7, 0x3d, 0x13, 0xa1, 0xfb, 0xbd, 0x33, 0x97, 0xb4, 0xbd,
- 0x4c, 0xf9, 0x48, 0x3d, 0x2c, 0xd8, 0xda, 0x3d, 0xee, 0x10, 0xe4, 0xbe,
- 0xf6, 0x0c, 0x12, 0x3e, 0x77, 0x33, 0x29, 0x3e, 0x02, 0x68, 0x96, 0x3d,
- 0xea, 0x2e, 0x54, 0x3d, 0xf5, 0xc0, 0x1a, 0x3e, 0x8e, 0xa3, 0x16, 0x3e,
- 0x45, 0x2b, 0x53, 0x3b, 0x50, 0x0b, 0x27, 0xbd, 0xa8, 0x67, 0x35, 0x3d,
- 0xc3, 0x5f, 0x60, 0x3d, 0x5b, 0xc5, 0xc3, 0xbd, 0x58, 0x91, 0x03, 0x3e,
- 0xaa, 0xdb, 0x19, 0xbe, 0xa4, 0x48, 0x57, 0x3d, 0xea, 0xbb, 0xa7, 0x3e,
- 0x06, 0x29, 0xdc, 0xbd, 0xc0, 0x1d, 0xb7, 0xbd, 0xe6, 0x9d, 0xc2, 0x3c,
- 0x9a, 0x7b, 0x65, 0xbc, 0x16, 0xb1, 0x26, 0xbe, 0x66, 0xcc, 0x18, 0x3e,
- 0xed, 0xfd, 0xc5, 0x3d, 0xbc, 0xdd, 0xb3, 0xbd, 0x94, 0x68, 0x95, 0x3d,
- 0xdc, 0x9e, 0x47, 0x3e, 0x95, 0x92, 0x3d, 0xbe, 0xb9, 0x6f, 0x08, 0x3e,
- 0x45, 0x1c, 0x9e, 0xbc, 0x95, 0xa7, 0xac, 0xbd, 0x9e, 0xc0, 0x43, 0x3e,
- 0x64, 0x70, 0x9e, 0x3c, 0xa9, 0x71, 0xc5, 0xbe, 0x0f, 0xae, 0xf1, 0xbd,
- 0xe9, 0xda, 0x37, 0x3e, 0x22, 0x54, 0xe6, 0xbd, 0xdf, 0x01, 0x91, 0x3d,
- 0x04, 0xcf, 0x23, 0xbd, 0x21, 0x5e, 0xcc, 0x3d, 0x4c, 0xd1, 0x68, 0x3e,
- 0x76, 0x87, 0x5b, 0x3d, 0xf5, 0x30, 0x71, 0x3e, 0xc3, 0xad, 0xec, 0x3d,
- 0x2a, 0x11, 0xaa, 0xbd, 0x26, 0x6c, 0x0b, 0xbe, 0x08, 0x66, 0x83, 0xbd,
- 0x09, 0xf6, 0x12, 0xbe, 0x6b, 0x89, 0x11, 0xbd, 0xf7, 0xea, 0x55, 0xbe,
- 0x27, 0xed, 0xa4, 0xbd, 0x9f, 0x9b, 0xf9, 0x3c, 0x23, 0x57, 0x0b, 0xbe,
- 0x92, 0xd2, 0x02, 0x3d, 0x6b, 0x5c, 0x40, 0xbd, 0xa6, 0x04, 0x68, 0x3d,
- 0x15, 0xe8, 0x12, 0xbe, 0xbf, 0xc1, 0x33, 0x3e, 0x80, 0x51, 0x10, 0x3d,
- 0x13, 0x58, 0x1b, 0x3d, 0x8b, 0xd5, 0xc4, 0xbc, 0x6c, 0xef, 0xa9, 0x3d,
- 0x19, 0xc1, 0xd4, 0xbb, 0x2e, 0x57, 0x47, 0x3e, 0xad, 0x58, 0xa4, 0x3d,
- 0x50, 0xce, 0x8d, 0xbd, 0xdd, 0xbd, 0x5f, 0x3d, 0xc9, 0xd3, 0x22, 0xbe,
- 0xac, 0x6c, 0x40, 0x3e, 0x0c, 0x99, 0x6f, 0xbd, 0x2c, 0x32, 0x93, 0xbe,
- 0x17, 0xaa, 0xdd, 0xbd, 0x7f, 0xa3, 0x46, 0xbd, 0xb9, 0x37, 0xb7, 0xbe,
- 0xaa, 0x89, 0xd9, 0x3d, 0x03, 0x2b, 0x9f, 0x3e, 0x23, 0x98, 0x5c, 0xbe,
- 0xf8, 0x7d, 0xe6, 0x3c, 0x0b, 0x58, 0x8f, 0x3d, 0x53, 0x78, 0xfd, 0xbd,
- 0x58, 0x70, 0x07, 0xbe, 0x35, 0x70, 0x62, 0x3e, 0x89, 0xb1, 0x39, 0x3e,
- 0x33, 0x98, 0x93, 0x3b, 0x60, 0x78, 0x0d, 0x3d, 0x75, 0x21, 0xf1, 0x3d,
- 0xaa, 0x7c, 0x13, 0x3e, 0xe7, 0x92, 0x23, 0x3e, 0xd6, 0x59, 0x61, 0xbe,
- 0x1f, 0xeb, 0x48, 0xbf, 0xe7, 0x43, 0x45, 0xbb, 0x41, 0x10, 0x0c, 0x3f,
- 0x2a, 0x3a, 0x54, 0x3d, 0x5c, 0xeb, 0x83, 0xbf, 0x39, 0xb0, 0x3f, 0xbf,
- 0x29, 0xaf, 0x24, 0x3f, 0xbd, 0x6b, 0x31, 0xbd, 0x4c, 0x9c, 0xb6, 0x3e,
- 0xea, 0xd3, 0x30, 0xbe, 0x59, 0x48, 0xfa, 0xbe, 0xdd, 0xa0, 0xfd, 0x3d,
- 0x74, 0x86, 0x74, 0xbe, 0xa4, 0x18, 0xe6, 0xbe, 0x84, 0x3b, 0x67, 0xbf,
- 0x9f, 0x03, 0x8f, 0x3d, 0xb5, 0xa2, 0x26, 0x3e, 0x9a, 0x95, 0x67, 0x3e,
- 0x49, 0xa1, 0x9c, 0xbe, 0x7d, 0xed, 0x65, 0xbc, 0xa6, 0xa0, 0xfe, 0xbd,
- 0x56, 0x86, 0x7a, 0x3d, 0x64, 0x45, 0x2d, 0x3e, 0xfd, 0x7d, 0xf7, 0x3e,
- 0xc0, 0xd4, 0x0a, 0xbd, 0x0b, 0xe2, 0xc3, 0xbe, 0xdb, 0x7a, 0x1e, 0xbd,
- 0x31, 0xd0, 0x63, 0x3c, 0xc3, 0xaa, 0xda, 0xbb, 0x91, 0x6a, 0xd5, 0x3e,
- 0xfc, 0x3d, 0x96, 0xbc, 0xef, 0xc8, 0x06, 0x3f, 0x4c, 0x46, 0xe4, 0x3d,
- 0xce, 0xca, 0xef, 0x3d, 0x7a, 0xb1, 0xab, 0xbe, 0x86, 0xee, 0x7e, 0x3e,
- 0xe9, 0x0e, 0xa5, 0x3d, 0x35, 0xae, 0xa2, 0x3d, 0x41, 0xc6, 0x7c, 0x3e,
- 0x3e, 0xbe, 0xf3, 0xbe, 0xee, 0xbd, 0xbe, 0xbd, 0x74, 0xac, 0x15, 0x3e,
- 0x86, 0xb3, 0xb7, 0xbd, 0x9d, 0x64, 0x6c, 0x3e, 0x4b, 0xcf, 0x45, 0x3d,
- 0x89, 0x65, 0x16, 0xbe, 0xad, 0xb3, 0x9e, 0x3d, 0x12, 0x26, 0x20, 0x3e,
- 0x07, 0x33, 0x8c, 0xbd, 0x15, 0x75, 0x7f, 0xbe, 0xc8, 0xc9, 0xdd, 0x3e,
- 0x02, 0x7c, 0x69, 0x3e, 0xea, 0x72, 0x4e, 0xbf, 0x5d, 0x30, 0x2e, 0x3f,
- 0xec, 0x24, 0xc6, 0xbd, 0x12, 0x20, 0x7b, 0xbe, 0xa6, 0xe5, 0x4b, 0x3e,
- 0xcf, 0x2b, 0x64, 0x3e, 0xf8, 0x4a, 0x51, 0x3d, 0xb3, 0x6e, 0x8b, 0xbe,
- 0xdc, 0x86, 0x69, 0x3e, 0x8d, 0x0e, 0x05, 0x3d, 0xf6, 0x22, 0x8d, 0x3f,
- 0x0a, 0xac, 0xfc, 0x3e, 0x10, 0x3b, 0x0a, 0x3d, 0x73, 0x30, 0xf3, 0x3d,
- 0x2d, 0xdd, 0x33, 0x3f, 0x7a, 0xfd, 0xe6, 0x3d, 0x00, 0xef, 0xca, 0x3d,
- 0xda, 0x2b, 0xe5, 0x3c, 0xd3, 0xf6, 0xdc, 0xbc, 0xaf, 0xd3, 0x4b, 0xbf,
- 0x9b, 0x7e, 0xf2, 0xbc, 0x82, 0x78, 0x16, 0xbe, 0x4a, 0xb5, 0xa0, 0x3d,
- 0xbd, 0xcc, 0x8c, 0x3c, 0xec, 0xea, 0xfa, 0xbd, 0xda, 0x53, 0x6d, 0x3d,
- 0x61, 0x60, 0x0d, 0x3e, 0x7a, 0x74, 0x9c, 0xbd, 0xaa, 0x99, 0x08, 0x3e,
- 0x8e, 0xbe, 0x64, 0x3f, 0xd1, 0x7f, 0x1e, 0xbd, 0xee, 0xf7, 0x34, 0xbf,
- 0x0b, 0x8d, 0x1f, 0x3e, 0x58, 0xf1, 0x87, 0xbc, 0xf7, 0xeb, 0x5b, 0x3e,
- 0xa2, 0x5b, 0xd0, 0xbd, 0xdb, 0xab, 0x09, 0xbd, 0x47, 0x3f, 0xa5, 0x3e,
- 0xde, 0x15, 0xa6, 0xbe, 0x0e, 0xe1, 0xc9, 0xbe, 0xb3, 0x6f, 0x83, 0x3d,
- 0x2a, 0xac, 0xae, 0xbe, 0xea, 0x0c, 0xb6, 0x3c, 0x4f, 0xd5, 0xce, 0x3e,
- 0xea, 0x8f, 0xaf, 0x3c, 0xf6, 0x0e, 0x5e, 0xbe, 0x2c, 0xec, 0xb2, 0xbd,
- 0x67, 0x45, 0xec, 0xbc, 0xcc, 0x9e, 0x12, 0x3d, 0x15, 0x63, 0x7f, 0x3c,
- 0x82, 0x44, 0x12, 0xbd, 0x5f, 0x59, 0x18, 0xbe, 0xc8, 0xdf, 0xb2, 0xbe,
- 0xe1, 0xcd, 0xee, 0xbb, 0x37, 0x55, 0x4a, 0xbd, 0x9d, 0xb1, 0x3a, 0xbb,
- 0xc1, 0x42, 0x4a, 0x3d, 0xa7, 0x05, 0xb5, 0xbd, 0x92, 0xbd, 0x27, 0x3e,
- 0xe6, 0xeb, 0x78, 0x3c, 0x18, 0x26, 0x10, 0xb8, 0x23, 0x41, 0x37, 0xbe,
- 0x04, 0xf3, 0x0e, 0x3d, 0x1e, 0x4d, 0x54, 0xbe, 0xa4, 0x71, 0x15, 0x3e,
- 0x77, 0x16, 0x6b, 0xbe, 0x14, 0x26, 0x68, 0x3c, 0x02, 0xdb, 0xc1, 0xbc,
- 0x55, 0xa1, 0xdb, 0x3d, 0x20, 0xff, 0xc6, 0xbd, 0xfc, 0x4d, 0xca, 0x3c,
- 0xaf, 0xbf, 0xcf, 0xbd, 0x3a, 0xde, 0xa7, 0xbd, 0x28, 0xc9, 0xa8, 0xbb,
- 0xf1, 0x7c, 0x6f, 0xbd, 0x9a, 0xdb, 0x08, 0x3d, 0xd3, 0xcb, 0x93, 0x3d,
- 0x39, 0x8c, 0x4f, 0xbd, 0x9f, 0x68, 0x35, 0x3d, 0xd3, 0x37, 0x30, 0xbe,
- 0xf7, 0x92, 0x5b, 0xbc, 0xdb, 0xd4, 0x7f, 0x3d, 0x00, 0x62, 0x32, 0xbe,
- 0x77, 0xec, 0x9e, 0xbe, 0xb7, 0x64, 0x8a, 0xbd, 0xa7, 0x3c, 0x34, 0x3d,
- 0x21, 0x97, 0x05, 0xbd, 0xb7, 0x6a, 0xa2, 0xbd, 0x1c, 0x90, 0x45, 0xbb,
- 0xb8, 0x4c, 0xa2, 0x3d, 0xff, 0x72, 0x3c, 0x3b, 0x9d, 0xd1, 0x95, 0xbc,
- 0x2c, 0xed, 0x3b, 0xbe, 0x8d, 0x8a, 0x8e, 0xbd, 0x8b, 0xfd, 0xc6, 0xbe,
- 0x4c, 0xcb, 0xd4, 0xbd, 0x85, 0x48, 0xb7, 0x3c, 0x67, 0x3e, 0xf4, 0xbd,
- 0xa3, 0xe1, 0xb2, 0xbd, 0x5f, 0xe6, 0x20, 0xbd, 0x7c, 0x8d, 0x92, 0x3d,
- 0x01, 0x80, 0xd0, 0x3d, 0x4f, 0x3b, 0xd8, 0x3d, 0x4e, 0xae, 0xed, 0xbc,
- 0xa0, 0xf4, 0xa0, 0xbb, 0xb7, 0x47, 0xaa, 0x3d, 0x76, 0xb9, 0x84, 0x3d,
- 0x56, 0x33, 0x6f, 0xbe, 0x2f, 0x40, 0xf2, 0xbd, 0x45, 0xc0, 0x3a, 0xbe,
- 0x42, 0x84, 0xfd, 0x3d, 0xff, 0x53, 0x87, 0x3c, 0xfa, 0x12, 0xd4, 0x3b,
- 0x14, 0x36, 0xf8, 0xbd, 0x3f, 0x9d, 0x96, 0xbe, 0x3a, 0x35, 0x91, 0xbc,
- 0x1a, 0xdd, 0xc3, 0x3d, 0x31, 0x8d, 0x99, 0xbd, 0x4c, 0xdf, 0xe2, 0xbd,
- 0xa0, 0x33, 0x84, 0x3d, 0x13, 0xdf, 0x90, 0xbd, 0x4e, 0xcc, 0xf4, 0x3d,
- 0xd9, 0xf5, 0x91, 0x3d, 0xee, 0xc8, 0x5c, 0xbe, 0x8d, 0x06, 0x17, 0x3e,
- 0xd0, 0xc0, 0xcf, 0x3c, 0xe7, 0xec, 0xc7, 0x3a, 0x3d, 0xa5, 0x01, 0x3e,
- 0x89, 0x53, 0x4e, 0x3d, 0xfc, 0xe3, 0xd0, 0x3d, 0x8f, 0x4a, 0x62, 0x3d,
- 0x22, 0x18, 0xcc, 0x3c, 0x55, 0x92, 0xbd, 0x3c, 0xcc, 0xab, 0x9c, 0xbd,
- 0xee, 0x1c, 0x20, 0xbe, 0xcf, 0x72, 0x65, 0xbd, 0xc4, 0xbf, 0x3b, 0x3b,
- 0x34, 0x9e, 0x20, 0xbe, 0x68, 0x28, 0x63, 0x3d, 0x6d, 0x0f, 0x8c, 0x3c,
- 0x03, 0x34, 0x36, 0x3e, 0xf1, 0x98, 0x0b, 0xbf, 0x3f, 0x97, 0x1e, 0xbe,
- 0xdf, 0x2f, 0x7c, 0xbe, 0xc4, 0xd5, 0xcc, 0xbb, 0xff, 0xd1, 0x21, 0x3d,
- 0x64, 0xa8, 0x0d, 0x3d, 0xea, 0x32, 0x8e, 0xbe, 0xd5, 0x67, 0xe5, 0x3d,
- 0x8f, 0x7d, 0xcb, 0xbb, 0xae, 0xbd, 0x17, 0xbc, 0x7b, 0x45, 0x83, 0x3d,
- 0x51, 0xba, 0x0b, 0xbe, 0x8d, 0xc3, 0x3a, 0xbe, 0xed, 0x2d, 0x8f, 0xbe,
- 0xdc, 0x26, 0xc7, 0x3e, 0xda, 0xdf, 0xf7, 0x3e, 0x8b, 0xed, 0x9a, 0xbd,
- 0x9c, 0x50, 0x83, 0xbe, 0x22, 0x23, 0xa4, 0x3e, 0xdf, 0x3e, 0xc6, 0x3c,
- 0xaf, 0x2f, 0xed, 0xbd, 0xa6, 0x70, 0xa8, 0x3e, 0x4e, 0xd5, 0x06, 0x3d,
- 0xa3, 0x1d, 0xdf, 0xbc, 0xf8, 0xcd, 0x59, 0x3e, 0x03, 0xc2, 0x91, 0xbe,
- 0xe0, 0xb2, 0x8b, 0xbe, 0x8e, 0xee, 0x25, 0xbf, 0xdf, 0xb7, 0x51, 0xbf,
- 0x35, 0x33, 0x2c, 0xbe, 0x19, 0xe2, 0xa9, 0xbd, 0xf3, 0x70, 0x97, 0xbd,
- 0xe1, 0xa7, 0xc7, 0xbd, 0xc1, 0xf7, 0x0a, 0xbe, 0xe9, 0xea, 0x51, 0xbe,
- 0x6c, 0x0f, 0xbe, 0x3d, 0x9f, 0x90, 0xdb, 0x3e, 0x58, 0x04, 0x84, 0x3e,
- 0xa0, 0x47, 0xdd, 0x3c, 0x38, 0xea, 0x25, 0x3d, 0x7a, 0xcd, 0xa4, 0xbe,
- 0x5c, 0xd9, 0x47, 0xbd, 0xce, 0xd8, 0x0d, 0xbe, 0xc9, 0x4b, 0x6a, 0x3d,
- 0x5b, 0xa1, 0x03, 0x3f, 0x1b, 0x1a, 0xfe, 0xbd, 0x7a, 0x0a, 0x51, 0x3e,
- 0x76, 0x9b, 0x6f, 0x3d, 0x71, 0x84, 0x06, 0xbe, 0x4b, 0x25, 0x6b, 0xbc,
- 0xb8, 0x6e, 0x99, 0xbe, 0x17, 0x93, 0xd3, 0x3e, 0x17, 0x43, 0x33, 0x3e,
- 0x58, 0x29, 0xa0, 0x3d, 0x99, 0x67, 0x1e, 0xbf, 0x6e, 0xb0, 0xa8, 0xbe,
- 0x84, 0x13, 0x29, 0x3e, 0xb5, 0x81, 0x19, 0xbe, 0x40, 0xcf, 0xd9, 0x3d,
- 0x07, 0x07, 0x6f, 0xbe, 0xcc, 0x7a, 0x06, 0x3e, 0xba, 0xd0, 0x84, 0xbf,
- 0xbe, 0x5d, 0x79, 0x3f, 0xa2, 0xd0, 0x1b, 0xbe, 0xa6, 0x87, 0x87, 0x3e,
- 0xf6, 0xfc, 0x72, 0x3e, 0x3d, 0x26, 0x40, 0xbf, 0x0f, 0x1b, 0x35, 0x3e,
- 0x34, 0x1e, 0x04, 0x3f, 0x21, 0x04, 0xf6, 0x3c, 0xd7, 0x7e, 0x0e, 0x3d,
- 0xa0, 0x76, 0x01, 0xbe, 0x40, 0x93, 0x2b, 0xbe, 0xe9, 0x39, 0x2d, 0x3e,
- 0x40, 0x81, 0xfa, 0xbd, 0xfc, 0x8c, 0x3e, 0xbe, 0x93, 0x8b, 0x2f, 0xbd,
- 0x79, 0xa4, 0x2a, 0x3e, 0x27, 0xdd, 0x55, 0xbc, 0xf0, 0xe0, 0x69, 0xbe,
- 0x20, 0x6b, 0xc7, 0xbd, 0xa1, 0xd9, 0x5f, 0xbc, 0x71, 0x3f, 0xb4, 0x3d,
- 0x2f, 0x83, 0x40, 0xbe, 0xf3, 0x45, 0x07, 0x3d, 0x81, 0x12, 0xd2, 0x3d,
- 0xec, 0xdd, 0xac, 0xbd, 0xf9, 0x72, 0xa8, 0x3d, 0xf1, 0x27, 0x92, 0x3f,
- 0x0c, 0xba, 0x1b, 0xbd, 0xff, 0x59, 0xcf, 0x3d, 0x3a, 0xc6, 0x89, 0x3e,
- 0x09, 0xd5, 0x28, 0x3e, 0x45, 0x37, 0x2f, 0x3d, 0x1d, 0x9c, 0x5c, 0xbd,
- 0xd5, 0x61, 0xf0, 0x3b, 0x45, 0xe8, 0x12, 0xbe, 0x13, 0x3e, 0xf0, 0xbd,
- 0x08, 0xa1, 0xc0, 0x3d, 0xb9, 0xe2, 0xa8, 0xbe, 0xeb, 0x1a, 0xa4, 0x3e,
- 0xd0, 0x78, 0xb2, 0xbb, 0xf2, 0x44, 0xbd, 0x3e, 0x70, 0x7c, 0x71, 0x3d,
- 0x9a, 0xc8, 0xe3, 0x3e, 0xf8, 0x85, 0x0f, 0x3f, 0x34, 0x7d, 0x8c, 0x3e,
- 0x14, 0x6d, 0xf9, 0x3d, 0x2b, 0x71, 0x80, 0xbe, 0xff, 0x65, 0x75, 0x3d,
- 0x3a, 0x1f, 0x3d, 0xbe, 0x4e, 0xf8, 0x14, 0x3e, 0xed, 0x0b, 0x8e, 0xbd,
- 0xa7, 0xa7, 0x0e, 0x3d, 0x91, 0x32, 0xf9, 0xbd, 0x01, 0x26, 0x81, 0xbe,
- 0xa5, 0x4e, 0xb0, 0xbe, 0x60, 0x06, 0x44, 0xbd, 0xb8, 0x1c, 0x2a, 0xbd,
- 0x3d, 0x3f, 0xad, 0xbc, 0x0e, 0xd8, 0x7e, 0xbd, 0x28, 0xb8, 0xd0, 0xbe,
- 0x0b, 0x12, 0x37, 0xbe, 0x1c, 0xd4, 0x7b, 0x3e, 0xb1, 0xff, 0x2f, 0x3d,
- 0x42, 0x7f, 0x0f, 0xbe, 0xf7, 0x27, 0x50, 0x3e, 0x03, 0x26, 0xf5, 0x3d,
- 0x4a, 0x79, 0x93, 0xbc, 0x84, 0x1c, 0x00, 0xbe, 0x23, 0xb8, 0xc4, 0x3d,
- 0x9b, 0xb1, 0xf3, 0xbc, 0x52, 0x82, 0x1c, 0x3e, 0x7e, 0x63, 0x09, 0xbe,
- 0x89, 0x3f, 0x44, 0xbd, 0xcd, 0xa5, 0x93, 0x3d, 0x45, 0x4e, 0xbd, 0x3d,
- 0x4e, 0x93, 0xac, 0xbd, 0x01, 0xc0, 0x48, 0xbe, 0xbe, 0xa5, 0x06, 0xbf,
- 0x8a, 0x53, 0xf4, 0xbd, 0x96, 0xf3, 0x03, 0xbe, 0xf4, 0x76, 0x32, 0x3e,
- 0x55, 0x4f, 0xf1, 0xbb, 0x27, 0x3b, 0xea, 0xbd, 0xe0, 0x54, 0x48, 0xbd,
- 0x81, 0x7c, 0x01, 0xbe, 0xf0, 0xbc, 0x6f, 0x3e, 0x43, 0xe2, 0x85, 0xbd,
- 0x00, 0xcd, 0x1a, 0x3e, 0x7c, 0x2c, 0xad, 0xbc, 0xdc, 0x80, 0x8c, 0x3d,
- 0x46, 0x2b, 0x45, 0x3e, 0xc7, 0x4f, 0x4b, 0x3e, 0xac, 0x1f, 0x20, 0x3e,
- 0xc8, 0x27, 0x8d, 0xbd, 0x73, 0x67, 0x2c, 0x3e, 0x93, 0xb7, 0xb2, 0xbd,
- 0x3a, 0xcf, 0x1c, 0x3d, 0xdd, 0x09, 0x2f, 0xbe, 0x9f, 0xb8, 0xbb, 0xbe,
- 0xfe, 0xdd, 0xdb, 0x3d, 0xd2, 0xd9, 0x21, 0x3e, 0xbb, 0xfe, 0xf6, 0x3d,
- 0x8d, 0x0e, 0x11, 0x3e, 0xce, 0xdb, 0x11, 0xbd, 0x67, 0x8c, 0x11, 0xbd,
- 0xaf, 0x18, 0x18, 0xbe, 0x84, 0x5e, 0xd1, 0xbd, 0x55, 0x8b, 0xf7, 0xbd,
- 0xa2, 0x3d, 0x39, 0x3e, 0x30, 0x3b, 0xa1, 0x3c, 0xc8, 0x0b, 0xbd, 0xbe,
- 0xfe, 0x18, 0x1c, 0xbe, 0x2e, 0xb5, 0x2f, 0x3d, 0x60, 0xb7, 0xbe, 0xbd,
- 0x93, 0xa6, 0x83, 0xbd, 0x38, 0xb3, 0x0e, 0xbf, 0x22, 0x2e, 0x47, 0x3b,
- 0x3c, 0xb4, 0xf2, 0xbc, 0x8b, 0x80, 0x97, 0x3e, 0x24, 0x30, 0x4e, 0x3c,
- 0x0f, 0x94, 0x10, 0xbe, 0xfb, 0x10, 0xf2, 0x3d, 0x5d, 0xeb, 0x31, 0xbe,
- 0xcb, 0xad, 0x6c, 0xbd, 0x97, 0x11, 0x76, 0x3d, 0xc8, 0xe6, 0x9b, 0x3d,
- 0x67, 0x0b, 0x73, 0x3d, 0x9c, 0xd8, 0x22, 0xbe, 0x57, 0x1b, 0x59, 0xbe,
- 0xaa, 0xb9, 0x02, 0xbf, 0xa7, 0x8f, 0x28, 0xbd, 0x74, 0x7f, 0x07, 0xbd,
- 0xb3, 0xd9, 0x9c, 0xbe, 0x02, 0x3e, 0xa8, 0x3c, 0xab, 0x09, 0xca, 0xbe,
- 0xff, 0x49, 0x02, 0xbe, 0xec, 0x5a, 0xc1, 0xbd, 0xe8, 0x91, 0x8f, 0xbe,
- 0x31, 0xae, 0xd7, 0xbd, 0xd6, 0x8a, 0x84, 0xbc, 0xef, 0x56, 0x24, 0xbd,
- 0x9a, 0xc3, 0xb2, 0xbc, 0x6d, 0xc6, 0x71, 0x3e, 0x94, 0x87, 0x45, 0xbe,
- 0xa0, 0x5b, 0x59, 0xbe, 0xe3, 0x6e, 0x6a, 0xbe, 0xdd, 0xfc, 0xb9, 0xbe,
- 0x1a, 0x36, 0x59, 0xbe, 0xa0, 0xa7, 0x29, 0x3e, 0x28, 0x06, 0x37, 0xbe,
- 0xd6, 0x96, 0x2b, 0x3d, 0x65, 0xb9, 0x9f, 0xbd, 0xce, 0xd9, 0x43, 0xbe,
- 0xe6, 0xab, 0xa3, 0x3c, 0xeb, 0xe8, 0x4e, 0xbd, 0xe2, 0x57, 0x8a, 0xbe,
- 0xb7, 0x93, 0x3b, 0x3d, 0xec, 0xf6, 0xc9, 0x3d, 0x5b, 0xe7, 0x8a, 0xbd,
- 0x9c, 0xd3, 0xf0, 0x3d, 0x74, 0x2b, 0xe4, 0xbd, 0x25, 0x9c, 0x2d, 0xbe,
- 0x92, 0x8a, 0x50, 0xbd, 0xa4, 0xea, 0x03, 0xbe, 0x0e, 0x0c, 0x69, 0x3c,
- 0x3e, 0x09, 0x3e, 0x3d, 0xea, 0x31, 0xf6, 0x3c, 0xd9, 0x92, 0x54, 0xbe,
- 0x30, 0xc5, 0xfe, 0x3d, 0x9b, 0xbf, 0x8a, 0x3d, 0x72, 0x89, 0x19, 0xbe,
- 0xc2, 0xb8, 0x38, 0x3e, 0x39, 0xe9, 0x47, 0x3e, 0xf8, 0x94, 0x94, 0xbd,
- 0xcf, 0xf5, 0x6e, 0xbe, 0xdc, 0x05, 0x1c, 0xbe, 0x02, 0xc8, 0xf4, 0x3b,
- 0x38, 0x46, 0x8c, 0xbd, 0xe4, 0x8f, 0x8f, 0xbe, 0x7e, 0x1d, 0x96, 0xbd,
- 0xbe, 0x8d, 0x59, 0xbd, 0x9a, 0x53, 0x61, 0xbc, 0x36, 0x98, 0x73, 0x3e,
- 0x85, 0x17, 0x89, 0x3c, 0x67, 0xcd, 0x07, 0xbd, 0x76, 0x36, 0xfb, 0xbc,
- 0x84, 0x03, 0x11, 0x3d, 0x3f, 0xd4, 0x71, 0xbc, 0xb7, 0x70, 0x3f, 0x3e,
- 0x2e, 0xef, 0x41, 0x3d, 0x57, 0x56, 0xd7, 0xbd, 0x4f, 0xec, 0xb5, 0xbd,
- 0xee, 0xf4, 0x3b, 0x3e, 0x52, 0xab, 0xdb, 0x3b, 0xb2, 0x8e, 0x2c, 0x3e,
- 0x8b, 0x88, 0x51, 0xbd, 0x67, 0x8a, 0x12, 0x3e, 0x13, 0x62, 0x05, 0x3e,
- 0xf7, 0x9f, 0x59, 0x3c, 0xc8, 0xca, 0x48, 0xbe, 0x09, 0xc2, 0x65, 0xbe,
- 0x07, 0xe3, 0x4d, 0x3c, 0xcf, 0x70, 0x86, 0xbd, 0xf6, 0xf8, 0xe5, 0xbc,
- 0xb5, 0x3f, 0x9c, 0x3c, 0x67, 0xfa, 0x60, 0x3e, 0xf8, 0xae, 0x9f, 0x3e,
- 0xad, 0xb5, 0x09, 0xbe, 0x2c, 0xb7, 0x94, 0x3d, 0xbf, 0x0d, 0x95, 0xbd,
- 0x5a, 0x4f, 0x50, 0xbe, 0xf6, 0x96, 0xed, 0x3d, 0xcc, 0x41, 0xa0, 0xbe,
- 0x97, 0xd6, 0xa3, 0x3d, 0x60, 0xe8, 0xc6, 0x3d, 0xf4, 0x35, 0x9d, 0xbd,
- 0xa7, 0xf3, 0xbc, 0xbd, 0x54, 0x0b, 0xa8, 0xbe, 0x56, 0x47, 0x3e, 0xbe,
- 0x37, 0xdd, 0x49, 0xbc, 0x8a, 0x09, 0x80, 0xbd, 0x0e, 0x14, 0x01, 0xbe,
- 0xdb, 0xc1, 0xb3, 0x3c, 0x2f, 0xe8, 0x7c, 0x3e, 0x62, 0x31, 0x50, 0xbe,
- 0x1a, 0x73, 0x17, 0xbd, 0x56, 0xc5, 0x10, 0xbd, 0x9d, 0xad, 0x04, 0x3d,
- 0xfa, 0x61, 0x42, 0xbd, 0xc9, 0xc5, 0x05, 0x3d, 0x29, 0xa7, 0xd7, 0x3d,
- 0x84, 0xf6, 0x64, 0x3c, 0x9e, 0x46, 0x3b, 0x3c, 0x32, 0x2a, 0xc0, 0xbd,
- 0x10, 0x32, 0xcd, 0x3d, 0xc3, 0xf8, 0x27, 0xbe, 0xbc, 0x73, 0xcb, 0xbd,
- 0xe8, 0x0f, 0xd8, 0x3c, 0x1c, 0xb4, 0x83, 0x3c, 0xce, 0x3d, 0x8e, 0xbe,
- 0xbe, 0x56, 0x00, 0xbe, 0x4b, 0x31, 0x63, 0x3e, 0xc7, 0x19, 0x2f, 0xbe,
- 0x68, 0xcd, 0x13, 0x3d, 0x13, 0x22, 0x68, 0x3e, 0xb9, 0x3c, 0x27, 0xbe,
- 0xe0, 0xf2, 0x08, 0xbe, 0xd8, 0x04, 0x15, 0x3e, 0xe8, 0xf7, 0x59, 0x3d,
- 0x1f, 0x2c, 0xa9, 0x3c, 0x19, 0x9d, 0x0e, 0x3d, 0x80, 0x0e, 0x07, 0x3d,
- 0x24, 0x74, 0x90, 0xbe, 0xc4, 0x6e, 0x64, 0x3e, 0x8c, 0x3e, 0xe0, 0xbd,
- 0x9a, 0x40, 0x55, 0xbd, 0x60, 0xd4, 0xb1, 0x3e, 0x9d, 0x64, 0x92, 0x3e,
- 0xa3, 0x32, 0x1a, 0x3e, 0xd3, 0xcf, 0x79, 0xbe, 0x0e, 0x52, 0x70, 0x3e,
- 0x3b, 0x2f, 0x36, 0x3f, 0x6c, 0xa2, 0xe9, 0x3d, 0x60, 0xc3, 0xb9, 0x3e,
- 0x18, 0xd8, 0xc8, 0xbd, 0xb4, 0x1f, 0x53, 0x3e, 0xc8, 0x05, 0x62, 0x3e,
- 0x7c, 0x8e, 0xd8, 0xbe, 0x38, 0x2e, 0x3b, 0xbf, 0xb3, 0x15, 0x9b, 0xbc,
- 0xba, 0x8d, 0x79, 0x3e, 0xe6, 0xdd, 0xdc, 0xbe, 0x00, 0xcc, 0xce, 0x3e,
- 0x26, 0x81, 0x82, 0xbe, 0xa9, 0xb5, 0xad, 0xbd, 0x92, 0x67, 0x85, 0x3c,
- 0xe0, 0xe0, 0xd2, 0x3d, 0x67, 0x50, 0xfd, 0x3e, 0xe3, 0xb5, 0xc1, 0x3e,
- 0xa3, 0x70, 0x81, 0x3c, 0x44, 0x3b, 0x69, 0xbe, 0x9f, 0x8a, 0xad, 0xbe,
- 0x19, 0x4d, 0xc8, 0x3d, 0xc2, 0x62, 0xc3, 0x3d, 0x37, 0x77, 0x96, 0x3e,
- 0x54, 0x7e, 0x60, 0x3d, 0xa1, 0xd7, 0x44, 0x3e, 0xa1, 0x2f, 0xaf, 0x3c,
- 0xbb, 0x87, 0x5c, 0xbe, 0xe7, 0xba, 0xa7, 0xbe, 0xf0, 0x47, 0x0b, 0x3e,
- 0x5f, 0x73, 0x33, 0x3e, 0x73, 0xee, 0x2f, 0xbe, 0x6c, 0x04, 0x39, 0x3e,
- 0x90, 0xbf, 0x35, 0xbf, 0x2c, 0x77, 0x4c, 0xbe, 0xe7, 0x5d, 0x79, 0xbe,
- 0x8a, 0x5f, 0xb6, 0x3e, 0xe2, 0x2d, 0xe9, 0xbe, 0x5e, 0xbd, 0x8e, 0x3e,
- 0x01, 0x0d, 0xc2, 0xbe, 0x30, 0x83, 0xaf, 0x3b, 0xd5, 0x38, 0xa4, 0xbc,
- 0x3b, 0x0b, 0xea, 0x3d, 0x4e, 0xe0, 0x28, 0x3d, 0xa2, 0x19, 0x2f, 0x3e,
- 0x54, 0x1f, 0xae, 0x3e, 0x33, 0xd2, 0x15, 0xbf, 0xe9, 0x11, 0x7c, 0xbe,
- 0xac, 0xf9, 0xa2, 0x3d, 0xbf, 0x64, 0xe3, 0xbe, 0x6b, 0xec, 0x5e, 0x3e,
- 0x83, 0xd2, 0x9c, 0x3e, 0x0d, 0x03, 0xd3, 0x3d, 0xac, 0xf6, 0x0e, 0xbe,
- 0x7d, 0xdc, 0x9d, 0x3d, 0x46, 0x62, 0x0e, 0xbf, 0x8b, 0x9c, 0x41, 0x3f,
- 0xd9, 0xf3, 0xb4, 0x3d, 0x58, 0xa9, 0x79, 0x3e, 0x88, 0x0f, 0xe4, 0x3d,
- 0x96, 0xeb, 0xa5, 0xbe, 0xb2, 0xce, 0xb5, 0x3e, 0x21, 0x99, 0x7f, 0xbd,
- 0x8d, 0xba, 0xab, 0xbd, 0xd2, 0x02, 0x43, 0x3c, 0x01, 0x1d, 0xa8, 0xbd,
- 0xb7, 0x2f, 0x9d, 0x3d, 0xf7, 0xdc, 0x60, 0xbd, 0x9a, 0x6a, 0x46, 0x3d,
- 0x71, 0x38, 0xa3, 0xbd, 0xc4, 0xcc, 0x66, 0xbe, 0x38, 0x71, 0xd5, 0xbe,
- 0xe9, 0xc0, 0xeb, 0x3e, 0x93, 0x82, 0xb8, 0xbd, 0x1d, 0x3b, 0xf1, 0x3d,
- 0xbb, 0xd5, 0x03, 0x3f, 0xd9, 0xae, 0x16, 0xbd, 0x3a, 0xbc, 0x69, 0xbe,
- 0x3e, 0xaf, 0xb1, 0x3c, 0x95, 0x4f, 0xc9, 0xbd, 0x15, 0xe0, 0x24, 0x3e,
- 0x55, 0x08, 0xcf, 0xbc, 0xba, 0x82, 0x96, 0x3e, 0xf9, 0x8e, 0x99, 0xbe,
- 0xa5, 0x43, 0xdb, 0xbe, 0x18, 0x55, 0x57, 0x3d, 0x66, 0x7d, 0xca, 0xbd,
- 0x51, 0xbe, 0x2d, 0xbe, 0x14, 0xe5, 0x12, 0xbf, 0xf1, 0xa8, 0x67, 0x3f,
- 0x5d, 0x9f, 0xa4, 0x3d, 0x11, 0xf4, 0x61, 0xbe, 0x23, 0x2a, 0x92, 0xbc,
- 0x86, 0xbe, 0x53, 0xbe, 0x7d, 0x47, 0xc5, 0x3d, 0xf4, 0xd4, 0x22, 0x3d,
- 0xc9, 0xa7, 0xbe, 0xbd, 0x89, 0x9e, 0x36, 0xbe, 0x90, 0xf6, 0x77, 0xbe,
- 0xaf, 0x39, 0x6f, 0x3d, 0x84, 0xdb, 0x0a, 0x3d, 0x5c, 0xe5, 0x55, 0x3d,
- 0x2f, 0x67, 0xdb, 0xbd, 0xc1, 0x97, 0xbd, 0xba, 0x66, 0x49, 0x3c, 0x3e,
- 0xa5, 0x30, 0x69, 0xbd, 0x07, 0x4f, 0xf4, 0xbd, 0x63, 0x96, 0x82, 0xbd,
- 0xf2, 0x17, 0xaa, 0x3c, 0x3f, 0xc9, 0xbf, 0xbd, 0xf1, 0x31, 0x86, 0x3d,
- 0x80, 0x11, 0x30, 0x3a, 0xce, 0x05, 0x9c, 0x3d, 0x4d, 0x33, 0x47, 0x3c,
- 0x19, 0xab, 0x6f, 0x3c, 0x7f, 0x1b, 0x9f, 0x3c, 0x5d, 0xd9, 0xce, 0xbd,
- 0x12, 0xf0, 0x31, 0xbe, 0xf6, 0xe6, 0xe9, 0xbd, 0x5a, 0x06, 0xda, 0x3d,
- 0xf6, 0x5b, 0x1c, 0x3e, 0x8c, 0xc8, 0x2c, 0x3e, 0xc5, 0x76, 0x1a, 0x3e,
- 0xcc, 0x9e, 0x03, 0xbe, 0x85, 0x00, 0x73, 0xbd, 0xe2, 0xd1, 0x01, 0xbe,
- 0x53, 0xc8, 0xc5, 0xbb, 0x69, 0x85, 0x1b, 0xbd, 0x14, 0xdd, 0xcc, 0xbd,
- 0xff, 0x98, 0x0b, 0xbf, 0x71, 0x03, 0xa2, 0xbd, 0xed, 0xdb, 0x77, 0x3d,
- 0x66, 0x21, 0x12, 0x3e, 0xff, 0xf0, 0xbc, 0x3d, 0x9f, 0xc5, 0x96, 0xbc,
- 0x0a, 0x45, 0x7d, 0xbc, 0x40, 0x4f, 0xca, 0xbd, 0x34, 0x69, 0x3b, 0xbe,
- 0xd2, 0x72, 0x51, 0xbe, 0x91, 0xa7, 0x84, 0xbe, 0x31, 0x97, 0x24, 0xbf,
- 0xc2, 0xf4, 0x03, 0xbe, 0x4b, 0xa3, 0x8a, 0xbd, 0x42, 0xa1, 0x82, 0xbe,
- 0x39, 0x01, 0x44, 0xbd, 0xd3, 0xea, 0x06, 0x3e, 0x77, 0x70, 0x60, 0x3d,
- 0x36, 0x72, 0xc7, 0xbc, 0xe8, 0xc3, 0x97, 0x3d, 0x94, 0x47, 0xd3, 0xbd,
- 0x61, 0x79, 0xbc, 0x3d, 0x38, 0x81, 0xbf, 0x3d, 0x30, 0xdd, 0x18, 0x3e,
- 0x3d, 0xfa, 0x0f, 0xbe, 0xc3, 0x22, 0x6c, 0x3d, 0xa9, 0xd0, 0xe5, 0xbe,
- 0x88, 0xfd, 0x99, 0xba, 0x1a, 0x4b, 0xdd, 0x3b, 0x3b, 0xc6, 0x03, 0xbe,
- 0xc8, 0x63, 0xce, 0xbc, 0x19, 0x40, 0x02, 0xbe, 0x03, 0xa6, 0x95, 0xbd,
- 0xd1, 0x0c, 0x31, 0xbd, 0x49, 0x53, 0xcf, 0x3d, 0x1b, 0x84, 0x91, 0x3d,
- 0x8e, 0x86, 0x0c, 0xbb, 0x3b, 0x3c, 0x64, 0xbd, 0xb4, 0x36, 0x33, 0xbd,
- 0x95, 0xee, 0xa7, 0xbd, 0x95, 0xe4, 0x53, 0xbd, 0x73, 0x2d, 0x42, 0x3e,
- 0x0a, 0x68, 0x95, 0xbd, 0xf4, 0xe0, 0x58, 0x3d, 0x84, 0xc4, 0x3a, 0x3e,
- 0x0b, 0x3d, 0x6e, 0x3d, 0x99, 0x46, 0x3f, 0x3d, 0x4e, 0xfd, 0x70, 0xbd,
- 0xac, 0xca, 0x25, 0xbd, 0xad, 0xdd, 0x4a, 0x3d, 0x5c, 0x45, 0xe5, 0x3c,
- 0x3a, 0xca, 0xbc, 0x3c, 0x7d, 0x94, 0xcd, 0x3c, 0x5a, 0xb2, 0x08, 0xbd,
- 0x27, 0x8f, 0xd3, 0x3c, 0xd8, 0x24, 0x9e, 0x3b, 0xa8, 0x1a, 0x48, 0x3d,
- 0x36, 0xca, 0x90, 0x3c, 0xb0, 0x16, 0x06, 0xbf, 0x42, 0xb0, 0x18, 0xbc,
- 0x6f, 0xe3, 0xc7, 0xbd, 0xca, 0x31, 0x41, 0x3d, 0xf7, 0xec, 0x0a, 0x3e,
- 0x83, 0x8f, 0xae, 0xbd, 0x3b, 0x86, 0xda, 0xbe, 0x19, 0x1d, 0x70, 0xbc,
- 0x46, 0xa4, 0x02, 0x3b, 0xfe, 0x80, 0x7f, 0x3d, 0xc1, 0xe9, 0xd2, 0xbb,
- 0x18, 0xc8, 0x69, 0xbe, 0x96, 0x1d, 0x53, 0xbe, 0x60, 0x19, 0x8f, 0xbe,
- 0x5b, 0x12, 0x02, 0x3f, 0x57, 0xe3, 0x30, 0x3f, 0x80, 0xca, 0x76, 0x3c,
- 0x1f, 0xf8, 0x53, 0xbb, 0xc5, 0x94, 0xcb, 0x3e, 0xbf, 0xb9, 0x0a, 0x3c,
- 0x07, 0xf1, 0x55, 0xbe, 0xec, 0x23, 0x13, 0x3f, 0x17, 0x80, 0x7c, 0x3d,
- 0x63, 0xd3, 0x65, 0xbe, 0xc6, 0xbd, 0x72, 0x3d, 0x5c, 0xf6, 0x35, 0x3c,
- 0x4c, 0x38, 0xc9, 0xbe, 0x0b, 0x4a, 0x5b, 0xbf, 0x8e, 0x52, 0x33, 0xbf,
- 0x2a, 0x42, 0x9a, 0xbe, 0xd2, 0x13, 0xf0, 0xbd, 0xc6, 0xb7, 0xb6, 0xbe,
- 0x78, 0xad, 0x9c, 0xbd, 0xcd, 0x1f, 0x8d, 0xbe, 0xf0, 0xd0, 0x00, 0x3d,
- 0xdb, 0xcb, 0xb7, 0x3d, 0xac, 0xe6, 0x9c, 0x3e, 0x79, 0x8f, 0x93, 0x3e,
- 0x97, 0x1e, 0xe9, 0xbd, 0xa6, 0x0d, 0xfb, 0xbd, 0xb1, 0x21, 0x09, 0x3e,
- 0x0a, 0xea, 0xf4, 0x3d, 0xe2, 0xe2, 0xa5, 0xbc, 0x70, 0xd3, 0xc7, 0xbd,
- 0x84, 0x18, 0xc7, 0x3e, 0x15, 0xdd, 0x05, 0xbd, 0x7a, 0x98, 0x40, 0x3e,
- 0x26, 0x21, 0xac, 0x3d, 0xd1, 0x1e, 0x05, 0xbe, 0x02, 0xf5, 0x76, 0xbd,
- 0x43, 0x2f, 0x44, 0xbe, 0xde, 0xb0, 0x19, 0x3f, 0x69, 0xe6, 0xa4, 0x3d,
- 0xac, 0x77, 0xb4, 0xbc, 0x6e, 0x24, 0x86, 0xbe, 0x9a, 0xa3, 0xe9, 0xbe,
- 0x5d, 0x0a, 0x31, 0x3e, 0x5f, 0xd6, 0x2d, 0x3e, 0x8a, 0x9c, 0x2e, 0xbc,
- 0xda, 0xfb, 0x09, 0xbe, 0x1c, 0x2c, 0x0e, 0x3e, 0xb6, 0x49, 0x73, 0xbf,
- 0x60, 0x4c, 0x83, 0x3f, 0x96, 0x54, 0x85, 0x3d, 0x40, 0xff, 0xfa, 0xbd,
- 0xf6, 0xf7, 0xc3, 0x3c, 0xfe, 0x79, 0x23, 0xbf, 0x1b, 0x2b, 0xa0, 0x3d,
- 0xab, 0xa0, 0x01, 0x3f, 0x7f, 0xb1, 0x9f, 0x3d, 0x92, 0xde, 0xab, 0xbe,
- 0xb0, 0xb7, 0xe1, 0xbd, 0x87, 0x96, 0x71, 0xbe, 0xf9, 0x1b, 0x35, 0x3e,
- 0x20, 0x68, 0x58, 0xbd, 0xc3, 0xfd, 0x0a, 0xbf, 0x9f, 0x64, 0x59, 0xbb,
- 0xc4, 0x7b, 0x8b, 0x3e, 0x36, 0xfe, 0x0d, 0xbe, 0xf4, 0xb1, 0x07, 0xbe,
- 0xca, 0x88, 0x66, 0xbd, 0x82, 0x1d, 0x45, 0x3d, 0x50, 0x64, 0x69, 0x3e,
- 0xb3, 0x2b, 0x08, 0x3d, 0x5e, 0x30, 0x0d, 0xbd, 0x9f, 0xa2, 0x5a, 0xbc,
- 0xf4, 0xe5, 0x06, 0xbe, 0xe2, 0xe3, 0x9f, 0x3e, 0xfd, 0xec, 0x71, 0x3f,
- 0x59, 0xee, 0xad, 0x3d, 0x13, 0x1b, 0x00, 0xbd, 0x6c, 0x3c, 0xb8, 0x3e,
- 0xd0, 0x75, 0x7e, 0xbc, 0x54, 0xe6, 0x31, 0xbd, 0x6f, 0x7d, 0x39, 0x3e,
- 0xb7, 0x71, 0xad, 0xbd, 0x42, 0x20, 0x0a, 0x3e, 0x0f, 0x9d, 0xcc, 0x3d,
- 0x33, 0xc1, 0x30, 0xbe, 0x79, 0xd0, 0x9d, 0xbe, 0x46, 0xb4, 0xbc, 0x3e,
- 0x60, 0x5e, 0x36, 0xbe, 0x00, 0x06, 0xb6, 0x3e, 0xa3, 0x3f, 0x0e, 0x3d,
- 0x80, 0x9f, 0x84, 0xbe, 0x43, 0x78, 0x28, 0x3f, 0x37, 0xfc, 0xda, 0x3d,
- 0x09, 0xba, 0xbc, 0xbd, 0x10, 0x62, 0xa6, 0xbd, 0xf5, 0xfe, 0x69, 0x3d,
- 0x2d, 0x6b, 0x93, 0xbe, 0x19, 0x9a, 0x41, 0xbd, 0x81, 0x68, 0x33, 0xbe,
- 0x2f, 0x90, 0xe2, 0xbd, 0xc3, 0x43, 0x8e, 0xbd, 0xec, 0xd2, 0xe8, 0xbe,
- 0x6c, 0xef, 0x9c, 0xbe, 0x8d, 0x8e, 0x2c, 0x3d, 0x11, 0x03, 0x2b, 0xbe,
- 0x1d, 0xea, 0xc7, 0x3d, 0xe3, 0xa2, 0xe0, 0xbd, 0xe9, 0x38, 0x81, 0xbe,
- 0x3f, 0xb1, 0x91, 0x3c, 0xca, 0x4a, 0x1b, 0x3d, 0x5a, 0x6c, 0xaf, 0x3c,
- 0x02, 0x41, 0x43, 0xbe, 0x0f, 0x3f, 0xef, 0x3c, 0xe7, 0x52, 0x64, 0x3e,
- 0xcf, 0xaa, 0xa3, 0x3d, 0x70, 0xe3, 0x7c, 0x3d, 0x25, 0x4c, 0xc5, 0x3d,
- 0x9e, 0x3e, 0x65, 0xbd, 0x6e, 0x71, 0x58, 0x3d, 0x9d, 0x5a, 0x0d, 0xbe,
- 0x89, 0xb8, 0x11, 0xbe, 0x8b, 0x9a, 0x1d, 0xbe, 0x4b, 0x6c, 0x6b, 0x3e,
- 0x3a, 0x8e, 0xee, 0x3d, 0x8d, 0xd4, 0x16, 0x3d, 0x76, 0x3c, 0x1e, 0xbf,
- 0xe4, 0xd6, 0x03, 0xbe, 0xc4, 0xf4, 0x12, 0xbe, 0x3e, 0x00, 0x78, 0x3e,
- 0x4f, 0xce, 0x36, 0x3d, 0x52, 0x00, 0xf7, 0xbd, 0x97, 0x2b, 0x40, 0xbe,
- 0xd7, 0xe8, 0x22, 0xbd, 0xc7, 0x5f, 0x05, 0x3d, 0xca, 0x9b, 0x2d, 0x3d,
- 0xa9, 0x5b, 0xdd, 0xbd, 0xe7, 0xe0, 0xe1, 0x3c, 0x4e, 0x0d, 0xb2, 0xbb,
- 0x27, 0xf9, 0x55, 0x3e, 0x29, 0xde, 0x63, 0x3d, 0x00, 0x87, 0x96, 0xbd,
- 0x64, 0xed, 0x12, 0x3e, 0xe0, 0xca, 0x0e, 0x3e, 0x0a, 0xd5, 0x78, 0xbd,
- 0x3a, 0x59, 0x44, 0xbe, 0xb2, 0x53, 0x83, 0xbe, 0xbc, 0x26, 0x84, 0xbe,
- 0x3f, 0x67, 0x5f, 0x3e, 0x69, 0x7d, 0x7d, 0x3e, 0x20, 0x19, 0x17, 0xbd,
- 0xcf, 0xc1, 0x8d, 0x3c, 0xe5, 0xce, 0x81, 0x3d, 0x3d, 0x6a, 0x4e, 0xbe,
- 0x26, 0x76, 0x57, 0xbc, 0x6b, 0x70, 0xf2, 0x3c, 0xba, 0x7f, 0x47, 0xbd,
- 0x87, 0xa3, 0x6b, 0x3d, 0xe7, 0x38, 0xb1, 0xbd, 0x90, 0x35, 0xd1, 0xbe,
- 0xcb, 0xfc, 0x88, 0x3d, 0x2c, 0xd7, 0xd4, 0xbc, 0x7c, 0x4f, 0xf1, 0xbc,
- 0x9d, 0xcb, 0xdd, 0x3d, 0x81, 0xd8, 0xd4, 0xbe, 0x3f, 0x8e, 0x6c, 0xbd,
- 0x0e, 0xc0, 0x89, 0xbe, 0x9f, 0x26, 0x6e, 0x3e, 0xe7, 0x76, 0x03, 0x3e,
- 0x4f, 0x9b, 0x9a, 0xbd, 0xe5, 0xa7, 0x39, 0x3e, 0xbc, 0x65, 0x32, 0xbd,
- 0x80, 0x96, 0x46, 0x3d, 0xbd, 0x7f, 0x15, 0xbd, 0xce, 0xfa, 0xbc, 0xbd,
- 0x26, 0x8e, 0x19, 0xbe, 0x1a, 0xc8, 0xa6, 0x3d, 0x2c, 0x29, 0x5f, 0xbe,
- 0x55, 0x12, 0xde, 0xbe, 0x43, 0xf4, 0xc3, 0x3d, 0x91, 0xa7, 0xe2, 0xbc,
- 0xc1, 0x42, 0xb0, 0xbe, 0xb2, 0xc9, 0xa8, 0xbd, 0x33, 0x6f, 0xe9, 0xbe,
- 0x24, 0x3f, 0xbb, 0xbd, 0x06, 0x1a, 0x2c, 0x3d, 0xc5, 0xdd, 0x0e, 0x3d,
- 0x6f, 0x69, 0x0c, 0xbe, 0x39, 0x4d, 0x38, 0xbe, 0x9a, 0x39, 0x96, 0xbd,
- 0xea, 0x50, 0x5d, 0xbd, 0x4a, 0x5f, 0x68, 0x3e, 0xaf, 0x2b, 0xf1, 0xbd,
- 0x45, 0x78, 0x69, 0xbe, 0x26, 0xff, 0x99, 0xbe, 0x8d, 0x7b, 0x3e, 0xbe,
- 0x10, 0xe3, 0x65, 0xbe, 0x72, 0x1f, 0x0c, 0x3e, 0x3d, 0x09, 0xb6, 0xbe,
- 0x23, 0x6b, 0xaa, 0xbe, 0x79, 0xcf, 0x16, 0x3b, 0x36, 0x6b, 0x05, 0x3c,
- 0x77, 0xbb, 0x33, 0x3d, 0xc7, 0x77, 0x29, 0x3e, 0x13, 0xa0, 0x88, 0xbe,
- 0xd5, 0xa3, 0x61, 0x3e, 0x78, 0xac, 0x50, 0xbd, 0xd9, 0x62, 0x90, 0x3e,
- 0xee, 0xef, 0x01, 0x3d, 0xe8, 0xae, 0x95, 0x3d, 0xb5, 0xce, 0x81, 0xbe,
- 0xf4, 0xee, 0x0d, 0x3e, 0xb5, 0x64, 0xbb, 0x3d, 0xe4, 0x88, 0x08, 0x3e,
- 0xf8, 0x7a, 0xd4, 0x3d, 0x68, 0x38, 0x34, 0xbc, 0x2e, 0x04, 0xed, 0x3d,
- 0x51, 0x28, 0x87, 0x3d, 0xd2, 0xeb, 0x82, 0x3e, 0x12, 0xe3, 0x5b, 0x3b,
- 0xe6, 0xc2, 0xdd, 0xbd, 0x89, 0x5c, 0x16, 0x3e, 0xa6, 0x7d, 0x3c, 0xbc,
- 0xb8, 0x6a, 0x10, 0xbe, 0x54, 0xeb, 0x78, 0xbe, 0xcd, 0x43, 0xa5, 0xbd,
- 0xe5, 0x81, 0xf2, 0x3d, 0xb2, 0x02, 0x84, 0xbe, 0x8f, 0x0c, 0x0e, 0xbe,
- 0x0c, 0xa0, 0x9a, 0x3d, 0x81, 0xbd, 0x96, 0xbd, 0x49, 0x51, 0x88, 0x3e,
- 0xee, 0x90, 0xc9, 0x3d, 0x86, 0x6b, 0xfe, 0xbd, 0xa0, 0xc4, 0xa1, 0xbd,
- 0xa2, 0x40, 0x6c, 0xbc, 0xbe, 0x10, 0x6d, 0xbe, 0x4b, 0xae, 0x23, 0x3e,
- 0xc3, 0x2a, 0x56, 0xbd, 0x8d, 0x6b, 0x8c, 0x3d, 0x54, 0x63, 0x1a, 0xbe,
- 0x66, 0x4e, 0x96, 0x3e, 0x44, 0xee, 0x12, 0x3e, 0x19, 0xa5, 0xb8, 0xbc,
- 0x72, 0xb1, 0xb9, 0xbd, 0x68, 0xfb, 0x66, 0x3e, 0x07, 0xbb, 0x3d, 0x3e,
- 0xef, 0x61, 0xa7, 0x3d, 0x71, 0x89, 0x94, 0xbe, 0x35, 0x64, 0x6a, 0xbe,
- 0x5c, 0x4f, 0x25, 0x3e, 0x05, 0xbd, 0xab, 0x3d, 0x87, 0x7d, 0x6b, 0xbd,
- 0x41, 0x08, 0x21, 0xbd, 0x8c, 0xb5, 0x53, 0x3e, 0xd1, 0x22, 0x5a, 0x3e,
- 0xa3, 0x90, 0xb6, 0xbc, 0xbe, 0x9a, 0x2b, 0x3c, 0x1e, 0xf2, 0x71, 0x3a,
- 0x38, 0x37, 0x01, 0xbe, 0x0c, 0x2e, 0xc0, 0x3d, 0x20, 0xf0, 0xdd, 0xbe,
- 0x44, 0x2b, 0x34, 0xbe, 0x04, 0xcd, 0x75, 0xbe, 0xec, 0xc8, 0x71, 0xbd,
- 0xdc, 0x70, 0x5a, 0xbc, 0x0d, 0xc1, 0x50, 0xbe, 0x48, 0x28, 0x50, 0xbd,
- 0x56, 0xa9, 0xc7, 0xbd, 0xf7, 0x6a, 0x9e, 0x3d, 0x5f, 0x07, 0xbb, 0xbd,
- 0x5d, 0x69, 0xe6, 0xbc, 0x49, 0x9e, 0xa4, 0x3d, 0x21, 0x1f, 0xbb, 0x3d,
- 0x88, 0xb4, 0x3b, 0x3d, 0x40, 0x27, 0xc0, 0x3d, 0x27, 0x9b, 0x85, 0xbd,
- 0x15, 0x65, 0x63, 0x3b, 0x56, 0x3e, 0x0b, 0x3e, 0x89, 0x0b, 0x4f, 0xbd,
- 0xf8, 0x51, 0xd2, 0xbd, 0xe9, 0x99, 0xc8, 0xbd, 0xc8, 0xef, 0x40, 0xbe,
- 0x33, 0x4e, 0xa4, 0x3d, 0xb6, 0x41, 0x0f, 0xbd, 0xde, 0x74, 0xbd, 0xbc,
- 0x68, 0xc0, 0xa9, 0xbd, 0x68, 0x4e, 0xe6, 0xbd, 0xbf, 0x93, 0x03, 0xbe,
- 0xf9, 0x6b, 0x0d, 0xbd, 0x8c, 0x08, 0x01, 0x3e, 0xb6, 0xd5, 0x56, 0xbd,
- 0x83, 0x07, 0x14, 0x3d, 0x47, 0xa6, 0x59, 0x3e, 0x94, 0xa3, 0x86, 0x3d,
- 0x14, 0x9a, 0x5f, 0xbe, 0x43, 0x24, 0x9a, 0x3e, 0x1b, 0xb0, 0x20, 0x3e,
- 0x79, 0x9e, 0x66, 0x3d, 0x85, 0x83, 0x13, 0x3e, 0x61, 0x5b, 0xec, 0xbd,
- 0x97, 0x51, 0x31, 0xbd, 0x74, 0xe8, 0xcc, 0x3e, 0x3b, 0xe8, 0xc6, 0x3b,
- 0xb7, 0xf3, 0x82, 0x3e, 0x70, 0x6d, 0x1f, 0x3f, 0xba, 0x9e, 0xad, 0x3d,
- 0xd0, 0x65, 0xcf, 0xbe, 0x91, 0x69, 0x09, 0xbe, 0xd5, 0xa3, 0x31, 0xbf,
- 0x7d, 0x72, 0x07, 0x3f, 0xdf, 0x92, 0xe9, 0xbd, 0x6e, 0xd3, 0x4a, 0x3e,
- 0x50, 0xb9, 0x19, 0xbe, 0x59, 0x89, 0x48, 0x3f, 0x5c, 0x66, 0x2f, 0xbc,
- 0x41, 0x56, 0x99, 0x3b, 0xdf, 0xff, 0x8f, 0xbe, 0xd6, 0xe1, 0x0e, 0xbf,
- 0x0c, 0xdc, 0x9b, 0x3e, 0x0e, 0x2e, 0x11, 0xbf, 0x3b, 0x53, 0x17, 0x3f,
- 0xf8, 0xa7, 0x81, 0xbe, 0x88, 0x2e, 0x71, 0x3e, 0x61, 0x1d, 0x6d, 0x3e,
- 0x53, 0x94, 0x23, 0xbe, 0x91, 0x2f, 0x01, 0x3f, 0xbb, 0x85, 0x70, 0x3e,
- 0xd1, 0xea, 0xa0, 0x3d, 0xa8, 0x05, 0x14, 0xbf, 0x26, 0xbc, 0x64, 0x3c,
- 0xc2, 0x75, 0x88, 0xbd, 0xee, 0xed, 0xc3, 0xbd, 0xe3, 0x3e, 0xef, 0x3e,
- 0xb9, 0x60, 0x02, 0x3e, 0x50, 0x1b, 0x27, 0x3f, 0xca, 0x99, 0x81, 0xbd,
- 0x71, 0x13, 0xdf, 0xbd, 0x8c, 0x73, 0x93, 0xbe, 0xb7, 0x45, 0x0f, 0x3d,
- 0xb5, 0x58, 0x9e, 0x3d, 0xfd, 0xc7, 0x9c, 0x3d, 0xd0, 0xed, 0x5e, 0x3e,
- 0x24, 0xf6, 0x31, 0xbf, 0x4b, 0xe1, 0x91, 0xbe, 0xf0, 0x42, 0x1b, 0xbe,
- 0xea, 0x8e, 0x07, 0x3f, 0x29, 0x2b, 0x41, 0xbf, 0xc7, 0x82, 0xee, 0x3e,
- 0xab, 0xa9, 0xbb, 0xbe, 0x89, 0x49, 0xd0, 0x3d, 0x1b, 0x42, 0x2a, 0xbe,
- 0x3e, 0xe7, 0xed, 0xbe, 0x59, 0x11, 0x42, 0x3e, 0x37, 0x37, 0x30, 0xbd,
- 0x8d, 0x70, 0xb3, 0x3b, 0x76, 0x6d, 0x3f, 0xbe, 0xf7, 0x76, 0xca, 0xbe,
- 0x7d, 0x6c, 0xb3, 0x3c, 0xa0, 0x54, 0xbd, 0xbe, 0xb8, 0xc0, 0x73, 0xbd,
- 0xcc, 0xd8, 0x28, 0x3e, 0x32, 0x49, 0x81, 0x3d, 0xb8, 0x47, 0x91, 0xbd,
- 0x3e, 0x37, 0x12, 0x3d, 0xe6, 0xd8, 0xbd, 0xbe, 0xcf, 0x5d, 0x34, 0x3f,
- 0xf9, 0x25, 0x21, 0x3e, 0xc0, 0xae, 0x55, 0x3e, 0x71, 0x7e, 0xf3, 0xbd,
- 0x91, 0x85, 0x24, 0x3f, 0xa8, 0x43, 0xac, 0xbd, 0xfd, 0xd3, 0x0d, 0x3f,
- 0x41, 0xad, 0x93, 0xbd, 0xaa, 0x65, 0x64, 0xbe, 0xe7, 0x64, 0xb3, 0x3e,
- 0x1e, 0x5d, 0x83, 0x3d, 0xb7, 0x7e, 0xe5, 0x3a, 0x67, 0x0f, 0x91, 0x3e,
- 0x19, 0xb6, 0x0b, 0x3e, 0x37, 0x9c, 0x45, 0x3e, 0x6c, 0xf3, 0xd6, 0xbe,
- 0xb8, 0xd4, 0xb9, 0x3e, 0x04, 0x93, 0xda, 0xbd, 0x73, 0x77, 0x15, 0x3f,
- 0x8b, 0x2c, 0x0f, 0x3f, 0x01, 0xb9, 0x16, 0xbd, 0xb6, 0xf1, 0x91, 0x3c,
- 0x3e, 0x7a, 0xca, 0xbb, 0xd1, 0x32, 0x8f, 0x3b, 0xb3, 0x4c, 0x79, 0x3e,
- 0x87, 0x2c, 0xa5, 0x3d, 0x24, 0x32, 0x99, 0xbe, 0xf5, 0xec, 0x71, 0x3d,
- 0xb3, 0x2a, 0x71, 0xbf, 0x1f, 0x7e, 0xa4, 0xbe, 0x11, 0x2c, 0xde, 0x3d,
- 0xcd, 0xa7, 0xa2, 0x3d, 0xcd, 0xe6, 0x80, 0xbe, 0x2a, 0xc1, 0x5f, 0x3f,
- 0x2b, 0x17, 0x9c, 0x3d, 0xcf, 0xb8, 0x30, 0xbe, 0xb2, 0xda, 0xdc, 0xbd,
- 0xcf, 0x68, 0x41, 0xbe, 0xc1, 0x94, 0x5f, 0x3d, 0xc0, 0x6f, 0xf8, 0x3d,
- 0xa5, 0x9f, 0x41, 0x3d, 0xe0, 0xff, 0x44, 0x3c, 0x0a, 0x49, 0xd9, 0xbe,
- 0x07, 0x14, 0x84, 0xbd, 0x38, 0xfe, 0x43, 0xbd, 0x7c, 0x9d, 0x33, 0x3c,
- 0xa8, 0x13, 0x98, 0xbd, 0xc2, 0x61, 0x4e, 0x3c, 0x69, 0xad, 0x0d, 0x3e,
- 0x3c, 0x42, 0x27, 0x3e, 0x59, 0x45, 0x32, 0x3d, 0xae, 0x9f, 0x1a, 0xbe,
- 0x9f, 0x79, 0x8d, 0xbd, 0xed, 0x12, 0x28, 0xbd, 0xe5, 0x52, 0x1b, 0xbc,
- 0xd8, 0xff, 0xd3, 0x3d, 0x71, 0x37, 0x8c, 0xbd, 0xa8, 0x50, 0x67, 0xbd,
- 0x1a, 0x0e, 0x95, 0xbd, 0xe3, 0x75, 0x3d, 0xbd, 0xf8, 0x0c, 0x87, 0x3d,
- 0xed, 0xb9, 0x46, 0xbe, 0x9d, 0x3d, 0x56, 0x3d, 0xb9, 0x56, 0x82, 0xbd,
- 0x0e, 0xab, 0x24, 0xbd, 0xd3, 0x08, 0x93, 0x3d, 0x2d, 0x06, 0xe1, 0x3d,
- 0xf6, 0xf4, 0xbf, 0x3d, 0xf9, 0x7b, 0xaa, 0xbd, 0x32, 0x7d, 0x2c, 0xbd,
- 0x5d, 0x85, 0x28, 0xbe, 0x92, 0x7e, 0x53, 0xbe, 0x5c, 0x9f, 0xa5, 0x3c,
- 0x28, 0xf0, 0x1c, 0xbf, 0x3c, 0x3c, 0x11, 0xbc, 0xe1, 0x73, 0x23, 0xbd,
- 0x6f, 0xc2, 0x98, 0x3d, 0x82, 0xe2, 0x0a, 0x3c, 0x07, 0x02, 0x75, 0xbc,
- 0x6c, 0xc2, 0xb7, 0xbd, 0x4c, 0x44, 0x87, 0x3b, 0x1c, 0xe7, 0x44, 0xbd,
- 0xb7, 0x13, 0x43, 0xbe, 0xd0, 0x0d, 0x04, 0xbe, 0x13, 0x02, 0x06, 0xbf,
- 0x39, 0x8e, 0xfb, 0x3c, 0x24, 0x0c, 0xf2, 0xbd, 0xdd, 0xf4, 0xc2, 0x3d,
- 0x70, 0xd2, 0x81, 0x3d, 0x8c, 0x4b, 0x1b, 0xbc, 0xbd, 0xa6, 0xd5, 0x3d,
- 0x0f, 0xd2, 0xa0, 0xbc, 0x06, 0xfa, 0x0d, 0x3e, 0xd1, 0x9c, 0x8b, 0x3d,
- 0x4e, 0xf7, 0x35, 0x3d, 0xa3, 0x6b, 0x7f, 0x3d, 0x08, 0xac, 0x23, 0xbe,
- 0x10, 0x01, 0xb6, 0x3d, 0x44, 0x05, 0x49, 0x3c, 0xfb, 0x9b, 0x0d, 0xbf,
- 0x56, 0xd1, 0x04, 0xbd, 0x8d, 0x98, 0x93, 0x3d, 0x0c, 0xbf, 0xb3, 0x3c,
- 0x54, 0x9e, 0x83, 0x3d, 0xe5, 0xcc, 0xc1, 0xbe, 0x85, 0x6b, 0x2c, 0x3c,
- 0x80, 0x77, 0x8d, 0xbd, 0x43, 0xa9, 0x69, 0x3d, 0x21, 0xa2, 0x4b, 0xbe,
- 0x20, 0x15, 0x23, 0xbe, 0xe6, 0x98, 0x97, 0x3c, 0x13, 0xbe, 0x13, 0xbe,
- 0x41, 0x89, 0xa2, 0x3c, 0x45, 0x0b, 0x3f, 0xbe, 0xc3, 0xbb, 0x4d, 0xbe,
- 0x7a, 0xc0, 0x9a, 0x3d, 0xd2, 0x16, 0x71, 0xbe, 0x6f, 0xec, 0x41, 0x3e,
- 0x49, 0xfd, 0x0d, 0x3d, 0xb1, 0x5a, 0xa5, 0x3c, 0x38, 0xb6, 0x4a, 0x3c,
- 0x5a, 0x65, 0x7e, 0x3d, 0x66, 0x00, 0xcb, 0xbc, 0x47, 0x3d, 0x03, 0x3e,
- 0xb5, 0xd4, 0x15, 0xbd, 0xa1, 0x57, 0xb9, 0x3d, 0x38, 0xb2, 0xba, 0x3d,
- 0xfe, 0xe8, 0xae, 0xbd, 0xe9, 0xd4, 0x61, 0x3d, 0x41, 0x7f, 0xe3, 0x3d,
- 0x3f, 0x0d, 0xea, 0xbc, 0x6b, 0x0a, 0xda, 0xbe, 0x44, 0xaa, 0x58, 0x3d,
- 0x70, 0x61, 0x73, 0xbe, 0xe2, 0xc4, 0x0d, 0x3d, 0xc3, 0x3e, 0x12, 0x3e,
- 0x56, 0x89, 0x79, 0xbd, 0x72, 0x3e, 0x92, 0xbe, 0x7c, 0xda, 0x13, 0x3e,
- 0xfb, 0xa8, 0x23, 0xbe, 0xc3, 0xc9, 0x23, 0x3e, 0x7f, 0xfe, 0x40, 0x3d,
- 0x85, 0x75, 0xf3, 0xbd, 0x2f, 0xc9, 0x3a, 0xbd, 0x6a, 0x6e, 0x97, 0xbe,
- 0x0d, 0xb7, 0x83, 0x3e, 0xbb, 0xf4, 0x07, 0x3f, 0x0a, 0x14, 0x16, 0xbd,
- 0x2f, 0xf5, 0xec, 0xbb, 0x09, 0x25, 0xd8, 0x3e, 0x91, 0xf4, 0x46, 0x3e,
- 0x4f, 0x24, 0x05, 0xbe, 0x66, 0x3c, 0xf0, 0x3e, 0xc9, 0x98, 0x18, 0x3e,
- 0x80, 0x1b, 0xa2, 0x3c, 0xed, 0x9b, 0xfd, 0xbc, 0xf9, 0xb6, 0x23, 0xbe,
- 0xdf, 0xbe, 0xbc, 0xbe, 0x2d, 0x31, 0x20, 0xbf, 0x07, 0x27, 0x5e, 0xbf,
- 0x1b, 0x9f, 0xd4, 0xbb, 0x71, 0xec, 0xc9, 0xbd, 0x5c, 0x30, 0x85, 0xbe,
- 0xea, 0xef, 0x37, 0xbe, 0xa9, 0x44, 0x1e, 0xbe, 0x17, 0x2a, 0x25, 0xbd,
- 0xca, 0x23, 0xcd, 0xbd, 0xea, 0xe1, 0x84, 0x3e, 0xda, 0x53, 0x23, 0x3d,
- 0xa8, 0x98, 0xa4, 0xbd, 0x08, 0x13, 0x94, 0x3d, 0xf9, 0x42, 0x36, 0x3d,
- 0x9c, 0x49, 0x1f, 0xbd, 0x29, 0x16, 0x04, 0x3e, 0x7b, 0x25, 0xf8, 0xbd,
- 0xe1, 0x08, 0x90, 0x3e, 0x22, 0xfa, 0x24, 0xbe, 0x2a, 0x5b, 0xb8, 0x3e,
- 0x13, 0xc3, 0x0c, 0xbe, 0x32, 0x44, 0xfa, 0xbd, 0x4c, 0x46, 0x40, 0x3d,
- 0x95, 0x0d, 0xe6, 0xbe, 0xba, 0x57, 0x8e, 0x3e, 0x5c, 0xfe, 0x59, 0xbc,
- 0x1b, 0x16, 0xa7, 0x3d, 0x2b, 0x38, 0xbb, 0xbe, 0xd4, 0x1b, 0x65, 0xbe,
- 0x34, 0xb6, 0xa8, 0x3e, 0x13, 0x59, 0x21, 0x3c, 0xd8, 0x0f, 0x8d, 0x3d,
- 0xe8, 0x0e, 0xfb, 0xbc, 0xbc, 0x92, 0xf1, 0x3c, 0x99, 0xed, 0x84, 0xbf,
- 0x4b, 0xe1, 0x66, 0x3f, 0x90, 0xd9, 0x12, 0x3d, 0x61, 0xa2, 0x9a, 0xbe,
- 0x8f, 0xa8, 0x8f, 0x3e, 0x4a, 0xb9, 0x06, 0xbf, 0x59, 0x0d, 0x91, 0xbd,
- 0x1e, 0x2b, 0x23, 0x3f, 0x53, 0x72, 0x01, 0x3e, 0x31, 0xf2, 0xd3, 0xbe,
- 0x92, 0x1c, 0x9d, 0xbd, 0x5b, 0x27, 0x27, 0xbe, 0x3e, 0xd2, 0x91, 0x3e,
- 0xc9, 0x93, 0x2e, 0xbe, 0x2b, 0xf5, 0x2d, 0xbf, 0x52, 0xda, 0xab, 0xbd,
- 0xaa, 0xc9, 0x37, 0x3e, 0xb1, 0x3c, 0x1c, 0xbd, 0x5f, 0x7c, 0x59, 0xbe,
- 0x2f, 0x49, 0xa6, 0xbd, 0x01, 0xd3, 0xf5, 0xbc, 0xc6, 0xef, 0xa4, 0x3e,
- 0x0e, 0x8c, 0x07, 0x3d, 0x89, 0xbd, 0xcc, 0xbd, 0x3f, 0x8a, 0x44, 0xbe,
- 0x16, 0xc0, 0x60, 0xbd, 0x13, 0x09, 0x37, 0x3e, 0x23, 0x17, 0x32, 0x3f,
- 0x8d, 0x3e, 0x72, 0x3c, 0x69, 0x7f, 0x00, 0x3d, 0x86, 0x9c, 0xcf, 0x3e,
- 0x17, 0x27, 0x8d, 0x3e, 0x62, 0x02, 0x56, 0xbc, 0x59, 0x48, 0x26, 0xbe,
- 0x17, 0x76, 0x9d, 0x3c, 0xee, 0xfa, 0xf0, 0x3d, 0xf5, 0xce, 0x21, 0x3e,
- 0xa3, 0xa6, 0x60, 0x3d, 0xd3, 0xc7, 0x3e, 0xbe, 0x16, 0xd9, 0x78, 0x3e,
- 0x08, 0x58, 0x2e, 0xbd, 0xae, 0x7d, 0x03, 0x3f, 0x4b, 0x5f, 0x8d, 0xbd,
- 0x0b, 0xe1, 0xb9, 0x3c, 0x8d, 0xc0, 0xfe, 0x3e, 0x58, 0x05, 0xa6, 0x3e,
- 0x52, 0x41, 0x57, 0x3d, 0x33, 0x0b, 0xe8, 0xbd, 0x54, 0x06, 0x56, 0xbd,
- 0xa2, 0x22, 0xa9, 0xbe, 0x6a, 0x50, 0xb6, 0xbd, 0x08, 0xa0, 0x8e, 0xbe,
- 0x5d, 0x7f, 0x21, 0xbc, 0x41, 0x9b, 0x92, 0x3d, 0xe7, 0xff, 0x88, 0xbe,
- 0x4a, 0x83, 0x80, 0xbe, 0xa8, 0x2f, 0x83, 0x3b, 0x38, 0x69, 0xe7, 0xbd,
- 0xdb, 0x9b, 0x44, 0xbd, 0xb0, 0xe5, 0xdc, 0xbd, 0x27, 0x6c, 0xbb, 0xbe,
- 0x07, 0xa0, 0x19, 0x3c, 0x3b, 0xa6, 0x78, 0x3e, 0xd4, 0x9a, 0xfe, 0x3c,
- 0x04, 0xbd, 0x98, 0xbd, 0x5f, 0x5a, 0x68, 0x3e, 0x78, 0x89, 0xb5, 0x3d,
- 0x1d, 0xe6, 0x8a, 0xbd, 0x9a, 0x0b, 0x09, 0x3e, 0x1a, 0x21, 0xaf, 0x3d,
- 0x45, 0x84, 0xd8, 0x3c, 0x5e, 0xa2, 0xe0, 0xbd, 0x42, 0xa3, 0x27, 0xbd,
- 0x11, 0x77, 0x96, 0xbd, 0xd9, 0xc1, 0x6a, 0xbd, 0xd5, 0x9b, 0x24, 0x3e,
- 0x67, 0x65, 0xc6, 0x3d, 0xb3, 0x38, 0x95, 0xbc, 0x2f, 0x76, 0x8d, 0xbe,
- 0xb2, 0x93, 0x68, 0x3d, 0xab, 0xdd, 0x13, 0xbe, 0x59, 0xfa, 0x90, 0x3d,
- 0xbf, 0x29, 0x2d, 0x3d, 0x69, 0xd7, 0x2f, 0xbe, 0xd6, 0x19, 0xa3, 0xbd,
- 0x5b, 0x7f, 0xaa, 0x3c, 0x91, 0x45, 0x64, 0xbd, 0xdd, 0xf6, 0x01, 0xbe,
- 0x46, 0x09, 0x6c, 0xbd, 0x3c, 0xbe, 0x3d, 0x3d, 0x88, 0xbb, 0xb5, 0xbd,
- 0xfe, 0xd4, 0x21, 0x3e, 0x8c, 0x56, 0x01, 0x3e, 0x07, 0x96, 0x9e, 0x3d,
- 0x21, 0xa7, 0xb5, 0x3d, 0x6c, 0x58, 0x56, 0x3d, 0x14, 0x9a, 0x51, 0x3c,
- 0x35, 0x74, 0xba, 0xbd, 0x30, 0x6e, 0xa7, 0xbc, 0xb1, 0xd5, 0x75, 0xbe,
- 0x20, 0x10, 0x20, 0xbd, 0xb6, 0xa3, 0x06, 0x3e, 0xe0, 0xd8, 0x9b, 0xbd,
- 0x52, 0x23, 0xcf, 0xbb, 0x3e, 0xa0, 0x68, 0x3e, 0xc8, 0xa8, 0x62, 0xbe,
- 0x72, 0x9d, 0x3c, 0x3c, 0x4c, 0xc4, 0x3f, 0x3d, 0x91, 0x07, 0x5b, 0xbe,
- 0xc0, 0x24, 0x10, 0x3e, 0x4a, 0x54, 0x16, 0xbe, 0x9f, 0x78, 0x34, 0xbd,
- 0x08, 0x3e, 0x30, 0xbd, 0xc1, 0x2e, 0x38, 0xbe, 0x97, 0x39, 0xd1, 0xbd,
- 0xaf, 0x23, 0x2a, 0xbd, 0x2f, 0xa9, 0xa1, 0xbe, 0x21, 0xf9, 0xe5, 0xbd,
- 0x0d, 0x3d, 0x7b, 0xbe, 0x8a, 0x6f, 0x2d, 0x3e, 0x10, 0xf8, 0x4d, 0x3d,
- 0x67, 0xdc, 0x1a, 0xbe, 0x6e, 0x91, 0x15, 0x3e, 0x6a, 0x01, 0xab, 0xbd,
- 0xde, 0x3f, 0xdf, 0xbd, 0xc9, 0xb6, 0xda, 0x3d, 0x83, 0x39, 0x4b, 0xbd,
- 0x88, 0x23, 0x6b, 0xbd, 0xac, 0xdd, 0x07, 0xbe, 0x31, 0x27, 0x8b, 0xbd,
- 0x26, 0x24, 0xad, 0xbe, 0x54, 0x6d, 0xa7, 0xbc, 0x5c, 0x12, 0x10, 0xbd,
- 0x3a, 0x89, 0xd3, 0xbe, 0x87, 0xc6, 0x22, 0x3d, 0x58, 0x21, 0x2c, 0xbe,
- 0x68, 0x75, 0x1d, 0xbd, 0x08, 0xe9, 0xab, 0x3d, 0x22, 0xe1, 0x57, 0xbd,
- 0x0a, 0xcb, 0x8b, 0x3d, 0xdc, 0xac, 0x11, 0x3d, 0x65, 0xf4, 0xf2, 0x3d,
- 0x11, 0x92, 0x86, 0xbc, 0x33, 0x5a, 0x47, 0x3e, 0x11, 0x27, 0x1d, 0xbe,
- 0x4c, 0xfd, 0x1a, 0xbe, 0xb7, 0x1c, 0x5e, 0xbe, 0xe0, 0x6f, 0x66, 0xbe,
- 0xba, 0x00, 0xaf, 0xbc, 0x0c, 0x97, 0x2e, 0x3b, 0xec, 0xa7, 0xa4, 0xbe,
- 0xcc, 0x1f, 0xa7, 0xbe, 0xee, 0xfe, 0x2f, 0xbe, 0xdf, 0xe3, 0xe1, 0x3c,
- 0x1c, 0x02, 0x23, 0xbd, 0x84, 0x3a, 0xf9, 0x3d, 0x98, 0xa2, 0x69, 0xbe,
- 0x09, 0x31, 0x88, 0x3e, 0x36, 0x62, 0xb1, 0x3c, 0x55, 0x75, 0xdb, 0x3d,
- 0x3c, 0xb9, 0xd8, 0x3d, 0xb7, 0x89, 0x02, 0x3e, 0xec, 0x13, 0xab, 0xbe,
- 0xc3, 0x4d, 0x91, 0x3c, 0x63, 0xc9, 0xb0, 0xbd, 0xd6, 0x3b, 0xb0, 0xbd,
- 0xa4, 0x66, 0xf7, 0xbd, 0xbd, 0xdc, 0x28, 0xbd, 0x58, 0xe5, 0x4c, 0xbe,
- 0x5c, 0x4c, 0x0e, 0x3e, 0xd9, 0xe3, 0x8e, 0x3e, 0x33, 0x2e, 0x2e, 0x3d,
- 0x49, 0x2e, 0xa0, 0x3d, 0xf4, 0x5c, 0xb7, 0xbc, 0xe2, 0x48, 0x04, 0xbd,
- 0x95, 0x54, 0x56, 0xbe, 0x4b, 0xb0, 0xc0, 0xbd, 0xa7, 0xa2, 0xd7, 0xbd,
- 0x35, 0xaa, 0x2f, 0xbd, 0xb8, 0x64, 0xa7, 0xbe, 0xec, 0x3a, 0x95, 0xbe,
- 0xd2, 0x86, 0x06, 0xbe, 0x14, 0xd7, 0x0c, 0x3d, 0x22, 0xbf, 0xb1, 0x3e,
- 0x67, 0x02, 0x95, 0xbd, 0x3b, 0x45, 0xda, 0xbd, 0xf8, 0x24, 0x85, 0xbd,
- 0xc5, 0x0d, 0x64, 0x3d, 0xe0, 0xf9, 0x05, 0xbe, 0x51, 0xeb, 0xa6, 0x3e,
- 0xf7, 0x88, 0x13, 0xbd, 0xe8, 0xa6, 0xe7, 0xbd, 0x9a, 0xc0, 0xa7, 0x3b,
- 0xe4, 0x33, 0x3a, 0x3e, 0xf5, 0x29, 0x0a, 0x3e, 0x38, 0x55, 0x2a, 0x3e,
- 0x98, 0xa1, 0xdb, 0xbc, 0x97, 0x8d, 0xc7, 0x3d, 0x91, 0x3b, 0x87, 0x3d,
- 0x08, 0x88, 0xf2, 0x3c, 0x75, 0xf3, 0x5d, 0xbe, 0x13, 0x7a, 0x21, 0xbe,
- 0x2b, 0x9d, 0x7b, 0x3d, 0x09, 0x01, 0xab, 0x3c, 0x2f, 0xb3, 0x1c, 0x3e,
- 0x85, 0xa6, 0x17, 0xbe, 0x00, 0xa5, 0x3a, 0x3e, 0x6f, 0xd1, 0x58, 0x3e,
- 0xe7, 0x52, 0xd0, 0xbd, 0x77, 0x36, 0x0e, 0x3d, 0x81, 0x97, 0x48, 0xbe,
- 0xef, 0x1d, 0xca, 0xbd, 0x86, 0x8e, 0x74, 0xbd, 0x0b, 0x36, 0xa3, 0xbd,
- 0x77, 0x4d, 0xf5, 0x3c, 0x07, 0xf6, 0x51, 0xbd, 0xd3, 0xf1, 0xc8, 0x3d,
- 0xd8, 0xeb, 0x57, 0x3d, 0x78, 0xa2, 0x14, 0xbe, 0xac, 0x40, 0xe8, 0x3b,
- 0x1c, 0x64, 0x1d, 0xbe, 0x83, 0x6c, 0xb2, 0x3e, 0xc0, 0xf0, 0xd3, 0xbd,
- 0x3c, 0xac, 0xa6, 0x3d, 0x53, 0x7c, 0xd1, 0x3d, 0xb1, 0x48, 0x47, 0xbe,
- 0xaf, 0xc7, 0x92, 0x3d, 0xfd, 0x8d, 0xc8, 0xbd, 0x9a, 0xac, 0xc8, 0x3d,
- 0x62, 0x96, 0xe5, 0xbd, 0xbd, 0x70, 0x09, 0xbe, 0x9b, 0x15, 0xdd, 0x3d,
- 0xe4, 0x66, 0xa8, 0xbd, 0xdd, 0x02, 0x86, 0xbb, 0x87, 0x2c, 0x9d, 0xbc,
- 0xa9, 0x87, 0xee, 0x3c, 0xaa, 0xfd, 0x3a, 0x3d, 0x4b, 0x6c, 0x79, 0x3c,
- 0xd8, 0x14, 0x4e, 0x3d, 0xf2, 0x4f, 0xf1, 0x3c, 0x3b, 0xbb, 0x70, 0xbe,
- 0x3f, 0x9e, 0x13, 0xbd, 0xef, 0x27, 0x79, 0x3d, 0x1c, 0x89, 0x71, 0x3d,
- 0x6b, 0xd6, 0x4b, 0xbe, 0xcd, 0xd1, 0xf0, 0x3e, 0xcc, 0x92, 0x00, 0xbe,
- 0xd6, 0x46, 0xf1, 0xbd, 0x5f, 0x79, 0xaf, 0xbd, 0xb7, 0x50, 0x65, 0xbe,
- 0xfd, 0x34, 0x51, 0xbd, 0xcc, 0x50, 0x34, 0x3e, 0x89, 0x27, 0xd6, 0xbd,
- 0xa6, 0x04, 0x0d, 0xbe, 0x7d, 0x10, 0x3b, 0xbe, 0xa7, 0xe2, 0x94, 0x3d,
- 0x60, 0x16, 0xc8, 0x3d, 0xe2, 0x29, 0x2e, 0x3f, 0xe4, 0x1a, 0x50, 0x3e,
- 0x89, 0x0f, 0x15, 0xbd, 0x19, 0x34, 0xad, 0x3e, 0x09, 0xdf, 0x97, 0xbe,
- 0xb6, 0xc5, 0x64, 0x3e, 0x95, 0x0c, 0x1c, 0xbd, 0x10, 0xa4, 0xa7, 0xbe,
- 0x50, 0xf2, 0xe3, 0x3d, 0x05, 0x3b, 0x10, 0x3f, 0xe6, 0xf8, 0x96, 0x3e,
- 0x09, 0xdb, 0x0e, 0x3e, 0x21, 0xd8, 0xe2, 0xbe, 0xbb, 0x9a, 0x91, 0xbf,
- 0x50, 0xb1, 0x24, 0x3e, 0x1c, 0x5e, 0x13, 0x3f, 0x4f, 0x8e, 0x08, 0x3f,
- 0x50, 0x8d, 0x40, 0xbe, 0xfd, 0x2b, 0x44, 0x3e, 0x72, 0xcb, 0xed, 0x3e,
- 0x3a, 0x9b, 0xad, 0x3d, 0xd2, 0x05, 0x44, 0x3d, 0xee, 0x90, 0xa2, 0x3d,
- 0xf7, 0x88, 0x2b, 0xbd, 0x3c, 0x22, 0x05, 0xbe, 0xbd, 0xc3, 0x6e, 0xbd,
- 0x41, 0xc5, 0x47, 0xbd, 0x1a, 0x6c, 0x9b, 0xbd, 0x92, 0x33, 0xec, 0x3e,
- 0xfe, 0xfd, 0x2e, 0x3e, 0x7f, 0x3e, 0xa3, 0x3e, 0x2b, 0x59, 0xb1, 0x3d,
- 0xbe, 0xbd, 0xca, 0xbd, 0xd9, 0x44, 0x82, 0x3d, 0xd5, 0x85, 0xa7, 0xbe,
- 0xd3, 0x88, 0x4a, 0xbe, 0x63, 0x60, 0x16, 0xbe, 0x70, 0xc3, 0x3c, 0xbd,
- 0xd1, 0xde, 0x0c, 0xbf, 0x27, 0x7f, 0xbc, 0xbe, 0xca, 0x22, 0x06, 0xbe,
- 0x50, 0xc3, 0x9f, 0x3e, 0x4c, 0x8c, 0x10, 0xbf, 0x9c, 0x96, 0xcc, 0x3e,
- 0xf2, 0xb3, 0x10, 0xbf, 0x3d, 0x9d, 0x7d, 0xbb, 0xd6, 0x0c, 0xf8, 0x3d,
- 0xd6, 0x73, 0xb3, 0xbe, 0x3e, 0xcd, 0x88, 0x3e, 0xc0, 0x07, 0xb3, 0xbe,
- 0x40, 0x0d, 0x55, 0xbf, 0x17, 0xed, 0xc4, 0xbe, 0x0e, 0xcb, 0x48, 0x3e,
- 0x41, 0xc0, 0x2c, 0x3d, 0xcb, 0xb1, 0x62, 0xbc, 0xcc, 0x99, 0x92, 0xbd,
- 0x65, 0xd3, 0x73, 0x3d, 0x83, 0xb0, 0x17, 0xbd, 0x05, 0x43, 0xd1, 0xbd,
- 0x4a, 0x8c, 0x38, 0x3e, 0x7a, 0x43, 0x0f, 0xbe, 0xa4, 0xe8, 0x15, 0x3f,
- 0x66, 0xb4, 0x62, 0xbd, 0xa4, 0x63, 0x01, 0x3e, 0x59, 0x6e, 0x8d, 0x3d,
- 0x76, 0xfd, 0x05, 0xbe, 0x16, 0x61, 0x21, 0xbe, 0x43, 0x55, 0xbb, 0x3e,
- 0xf0, 0xac, 0xa8, 0x3d, 0xe7, 0x66, 0x69, 0xbd, 0xa7, 0x3a, 0x81, 0x3f,
- 0xd8, 0x24, 0xfd, 0xbd, 0x1a, 0xf4, 0x12, 0xbe, 0x63, 0x4d, 0x8b, 0x3e,
- 0x1e, 0x30, 0x25, 0x3b, 0xed, 0x71, 0xd6, 0x3e, 0x35, 0x7e, 0x13, 0xbe,
- 0xde, 0xbf, 0x6c, 0xbe, 0x8a, 0x99, 0xe6, 0xbd, 0xd6, 0x5d, 0x39, 0x3f,
- 0x90, 0x47, 0xcb, 0x3d, 0x79, 0x80, 0xdd, 0xbc, 0x08, 0x78, 0xd6, 0xbe,
- 0xa5, 0xcf, 0x3e, 0x3d, 0x4d, 0x0d, 0x29, 0xbe, 0x61, 0xcb, 0x80, 0xbd,
- 0xe3, 0x16, 0xbe, 0xbc, 0x93, 0x93, 0x91, 0xbe, 0x8c, 0xc8, 0x9a, 0xbe,
- 0xe1, 0x2d, 0x37, 0x3f, 0xc9, 0xdb, 0x6d, 0xbe, 0xbc, 0xe1, 0xdd, 0xbd,
- 0x8c, 0x5f, 0x6c, 0x3d, 0x13, 0x5e, 0x21, 0xbe, 0x19, 0x9e, 0xc2, 0x3d,
- 0x38, 0x26, 0x50, 0xbe, 0x2f, 0xa8, 0x06, 0xbe, 0xa4, 0x8c, 0x4a, 0xbd,
- 0x9e, 0xc2, 0x1d, 0xbe, 0x50, 0xe7, 0x17, 0x3d, 0xb4, 0x8b, 0x27, 0xbe,
- 0x27, 0x76, 0xca, 0xbc, 0xa4, 0xc5, 0x24, 0xbd, 0x3d, 0x5b, 0x3a, 0xbe,
- 0xe0, 0x0a, 0x46, 0xbc, 0x7f, 0x24, 0xca, 0xbc, 0x65, 0x69, 0x22, 0xbd,
- 0xac, 0x9b, 0x67, 0x3c, 0xb4, 0xbd, 0x1c, 0xbe, 0x0f, 0x0c, 0xe8, 0x3d,
- 0xea, 0xb6, 0xd9, 0xbb, 0x15, 0xb9, 0x9e, 0xbb, 0x02, 0x25, 0x0f, 0xbe,
- 0x2f, 0x51, 0xae, 0x3c, 0xa6, 0x41, 0xed, 0xbd, 0x98, 0x62, 0xd2, 0x3d,
- 0x80, 0x28, 0xcf, 0xbc, 0x8a, 0xde, 0xf3, 0xbc, 0xdd, 0x1f, 0x1e, 0xbe,
- 0x2e, 0x7b, 0x90, 0xbc, 0x19, 0xac, 0x1b, 0xbe, 0xd8, 0xcd, 0x52, 0xbe,
- 0x80, 0x8b, 0x7f, 0x3d, 0x12, 0x62, 0x0b, 0xbc, 0x9b, 0x7d, 0x58, 0xbc,
- 0x60, 0x88, 0xfa, 0xbd, 0xb2, 0xef, 0x94, 0x3d, 0xe1, 0xb6, 0xf1, 0x3d,
- 0x3b, 0x13, 0xd9, 0x3d, 0xcd, 0x0d, 0x3e, 0x3c, 0xce, 0x3d, 0x35, 0xbe,
- 0x29, 0xb3, 0x21, 0xbe, 0x57, 0x5c, 0xd3, 0xbe, 0xe9, 0xd4, 0xca, 0xbd,
- 0xdd, 0x57, 0xb6, 0xbe, 0x6e, 0x72, 0x27, 0xbd, 0x68, 0xcf, 0x39, 0xbc,
- 0xaa, 0x26, 0x27, 0xbe, 0x83, 0xcf, 0xfb, 0x3c, 0xb4, 0xa7, 0x6a, 0x3d,
- 0xbd, 0x1f, 0xf5, 0x3c, 0x18, 0xc7, 0x56, 0xbb, 0xb3, 0x8e, 0xa2, 0xbd,
- 0x93, 0xff, 0x40, 0xbe, 0x87, 0x24, 0x29, 0xbc, 0x09, 0xe8, 0x1f, 0xbf,
- 0x9d, 0x90, 0x8f, 0x3a, 0x76, 0xa9, 0x12, 0x3e, 0xd8, 0x84, 0xe4, 0xbd,
- 0x04, 0xd2, 0x26, 0xbc, 0xd4, 0xfd, 0x0b, 0x3e, 0x98, 0xc6, 0x96, 0x3d,
- 0xe5, 0xd9, 0xe7, 0x3d, 0x78, 0xe9, 0x76, 0x3c, 0xe2, 0xb8, 0xee, 0x3c,
- 0xb1, 0x9d, 0xe5, 0xbd, 0x99, 0xbc, 0x9e, 0x3c, 0x43, 0xd7, 0x04, 0xbe,
- 0x1d, 0x5e, 0x56, 0xbe, 0xdb, 0xae, 0x2c, 0x3c, 0x01, 0xe3, 0x9a, 0xbd,
- 0x4d, 0xfa, 0xe6, 0x3d, 0xa4, 0x0a, 0xbb, 0x3d, 0x96, 0x43, 0x86, 0x3d,
- 0xef, 0xf8, 0xeb, 0x3c, 0x43, 0xb0, 0xc9, 0xbe, 0xaf, 0x3a, 0x09, 0xbe,
- 0xb5, 0x9b, 0x23, 0xbc, 0x5f, 0x77, 0x64, 0xbd, 0xb2, 0x5e, 0x81, 0xbe,
- 0x7a, 0xf7, 0x32, 0xbd, 0xb5, 0x64, 0x18, 0x3d, 0xaa, 0x0e, 0x1a, 0xbd,
- 0x3c, 0xc7, 0xb4, 0xbd, 0x34, 0x47, 0x28, 0xbe, 0xe2, 0xf8, 0x81, 0x3d,
- 0x23, 0x03, 0xee, 0xbc, 0xad, 0xfe, 0x83, 0xbe, 0x15, 0x7a, 0x61, 0x3d,
- 0x88, 0xf4, 0xf6, 0x3d, 0xc7, 0xd7, 0x00, 0xbe, 0x42, 0xf2, 0x0c, 0x3e,
- 0x10, 0x13, 0xa2, 0x3d, 0x9c, 0xf8, 0xbe, 0xbd, 0x4a, 0x0f, 0x16, 0x3d,
- 0x92, 0x68, 0xae, 0xbd, 0x5b, 0xc2, 0x6f, 0xbe, 0x4b, 0x72, 0x6f, 0x3d,
- 0xa7, 0x62, 0x45, 0xbd, 0x4c, 0x22, 0xa4, 0x3a, 0x0a, 0x40, 0xfc, 0x3b,
- 0x7c, 0xc7, 0xdd, 0x3c, 0xc4, 0x6a, 0x60, 0xbe, 0x79, 0x8f, 0xf8, 0x3c,
- 0x2f, 0x9f, 0x75, 0xbc, 0x28, 0x4e, 0x93, 0xbc, 0xa0, 0x6a, 0xb8, 0x3c,
- 0x5d, 0xb3, 0xb5, 0xbd, 0x33, 0x0d, 0xbf, 0xbe, 0x12, 0x11, 0xb5, 0x3d,
- 0x92, 0xd8, 0x99, 0xbe, 0xcc, 0xdf, 0x49, 0x3e, 0x63, 0x87, 0x1f, 0x3d,
- 0xd4, 0x2a, 0x36, 0xbe, 0xcb, 0xcb, 0x80, 0xbd, 0xea, 0x6e, 0x85, 0xbe,
- 0x00, 0xf0, 0xd2, 0x3e, 0x3f, 0x07, 0xea, 0x3e, 0xb2, 0xc2, 0x49, 0xbe,
- 0x27, 0x76, 0x2e, 0xbc, 0xab, 0x4a, 0xbc, 0x3e, 0x1c, 0xc4, 0xd7, 0x3d,
- 0x89, 0x2f, 0x80, 0x3a, 0xf6, 0x22, 0xd4, 0x3e, 0x00, 0x44, 0x10, 0xbd,
- 0x5d, 0x79, 0x89, 0xba, 0x13, 0x2b, 0xbe, 0xbd, 0x80, 0x78, 0x06, 0xbe,
- 0xb7, 0xda, 0xe9, 0xbe, 0x95, 0x96, 0x01, 0xbf, 0xaf, 0xb0, 0x75, 0xbf,
- 0xd2, 0x92, 0x07, 0xbe, 0xd7, 0xbb, 0x05, 0xbd, 0x75, 0x13, 0xa7, 0xbe,
- 0xef, 0x08, 0x8b, 0x3c, 0xa3, 0x62, 0xba, 0xbd, 0xd5, 0x29, 0x10, 0xbe,
- 0x3b, 0x0a, 0xd8, 0xbd, 0xfc, 0x86, 0x88, 0x3d, 0x9f, 0xc5, 0x58, 0x3e,
- 0xab, 0x9a, 0x17, 0x3c, 0xc3, 0xd5, 0x15, 0xbe, 0x2e, 0xc5, 0x26, 0x3e,
- 0x65, 0xf3, 0x4a, 0x3d, 0x7a, 0x7a, 0x96, 0xbe, 0x52, 0xef, 0xed, 0x3d,
- 0xf9, 0xe2, 0xc0, 0x3e, 0x3c, 0x46, 0x59, 0x3b, 0x94, 0xab, 0x83, 0x3e,
- 0xd8, 0xc6, 0x20, 0xbd, 0xa8, 0x67, 0x31, 0x3d, 0x0c, 0x8b, 0x13, 0x3e,
- 0x81, 0x4f, 0xef, 0xbe, 0xe0, 0xbc, 0x9c, 0x3e, 0x89, 0x23, 0xc3, 0x3c,
- 0x0e, 0x0f, 0x68, 0xbc, 0x28, 0x1c, 0xd8, 0xbe, 0x16, 0xb5, 0x83, 0xbe,
- 0x7a, 0x3e, 0xa5, 0x3e, 0x61, 0xab, 0x2e, 0x3e, 0x5b, 0x2b, 0xc1, 0xbc,
- 0x2d, 0xe6, 0x92, 0xbe, 0x39, 0xd7, 0x1d, 0x3e, 0x3e, 0x9a, 0x70, 0xbf,
- 0x8d, 0x83, 0x4b, 0x3f, 0x73, 0x96, 0x90, 0xbc, 0x50, 0x3c, 0x89, 0xbd,
- 0xd8, 0x9d, 0x9b, 0x3d, 0x15, 0xb4, 0x24, 0xbf, 0x39, 0xc8, 0x49, 0xbe,
- 0x90, 0x20, 0x2d, 0x3f, 0x66, 0xb0, 0x05, 0xbe, 0x0a, 0x4b, 0xd3, 0xbc,
- 0x7c, 0x73, 0x80, 0xbe, 0xd0, 0xa2, 0x47, 0xbe, 0x3e, 0x1d, 0x21, 0x3e,
- 0x59, 0xb6, 0x88, 0xbd, 0x59, 0x51, 0x31, 0xbf, 0x57, 0x67, 0x2b, 0xbe,
- 0x99, 0xdd, 0xb6, 0x3e, 0x4a, 0x7a, 0x94, 0x3d, 0xf5, 0xd1, 0x2f, 0xbe,
- 0xcd, 0x67, 0x93, 0x3d, 0x5c, 0x29, 0x04, 0x3e, 0x37, 0x0f, 0x90, 0x3e,
- 0x6a, 0xf1, 0xd8, 0xbd, 0xc9, 0x74, 0xdb, 0x3c, 0x4c, 0xc0, 0x95, 0xbd,
- 0xac, 0x68, 0x80, 0xbd, 0x01, 0x0b, 0x48, 0x3d, 0xa5, 0xb7, 0x29, 0x3f,
- 0x80, 0x0a, 0x15, 0x3e, 0xb9, 0x67, 0x98, 0xbc, 0xbd, 0x44, 0xf7, 0x3d,
- 0x12, 0x29, 0xce, 0x3e, 0x48, 0x6f, 0x59, 0xbd, 0x74, 0x24, 0x2f, 0xbb,
- 0xf4, 0xfb, 0x7e, 0x3d, 0x67, 0x95, 0x40, 0xbd, 0x87, 0xd4, 0x82, 0xbd,
- 0x20, 0x05, 0x01, 0xbe, 0xb3, 0x4b, 0x99, 0xbe, 0x37, 0xea, 0xbe, 0x3e,
- 0xd0, 0x99, 0x3e, 0x3e, 0x9e, 0xae, 0x07, 0x3f, 0x4e, 0xca, 0xb6, 0xbd,
- 0x7f, 0x3e, 0x62, 0xbe, 0x68, 0x5e, 0x19, 0x3d, 0xee, 0xee, 0xee, 0x3d,
- 0x01, 0x30, 0x6c, 0xbd, 0x37, 0xb5, 0x25, 0xbe, 0xe7, 0xb3, 0x2a, 0x3e,
- 0x8a, 0x3a, 0xf0, 0xbe, 0xe2, 0xb3, 0x3a, 0x3d, 0x35, 0x29, 0x89, 0xbe,
- 0x8b, 0x2f, 0xea, 0xbd, 0x62, 0x8f, 0x08, 0xbe, 0xe9, 0x8b, 0xdb, 0xbd,
- 0xe8, 0xb8, 0x1e, 0xbe, 0x4a, 0x77, 0x64, 0x3d, 0xef, 0xa4, 0x54, 0xbe,
- 0x66, 0x82, 0x01, 0xbe, 0xe0, 0x89, 0x3c, 0x3b, 0x33, 0x06, 0x07, 0xbf,
- 0x4b, 0x5c, 0xcd, 0xbd, 0x6f, 0xb8, 0x01, 0x3e, 0x04, 0xe3, 0x12, 0xbd,
- 0x1f, 0xbb, 0x40, 0xbe, 0xd0, 0x7d, 0xfd, 0x3d, 0x72, 0x13, 0xba, 0x3d,
- 0x51, 0x03, 0xcd, 0x3d, 0x12, 0x68, 0x90, 0x3e, 0x55, 0xf6, 0x68, 0x3d,
- 0x5d, 0x1b, 0xd1, 0xbd, 0x04, 0x8d, 0x45, 0x3d, 0x56, 0x25, 0x85, 0xbe,
- 0x94, 0xae, 0x37, 0xbe, 0x24, 0x82, 0x19, 0xbe, 0x89, 0x0d, 0x00, 0x3e,
- 0xca, 0xf1, 0x1f, 0xbe, 0xde, 0x54, 0x02, 0xbb, 0xfa, 0xcf, 0x11, 0xbf,
- 0x76, 0xfb, 0x16, 0xbe, 0xcb, 0x78, 0x22, 0xbe, 0xc5, 0xb4, 0x19, 0x3d,
- 0xfa, 0xe3, 0x9c, 0xbd, 0x2d, 0x6d, 0x73, 0x3c, 0x91, 0xc0, 0x54, 0xbe,
- 0x1e, 0x03, 0x12, 0xbd, 0xba, 0xf7, 0xe1, 0x3c, 0xca, 0xbe, 0x8f, 0xbe,
- 0x56, 0x61, 0xc7, 0xbd, 0x97, 0xa0, 0xab, 0xbc, 0x60, 0xb2, 0x22, 0xbe,
- 0x1c, 0x43, 0xf3, 0xbd, 0xcc, 0x51, 0xb1, 0x3d, 0x2f, 0xc9, 0xaf, 0x3d,
- 0xb1, 0xe1, 0x8e, 0x3c, 0x98, 0xc4, 0xa7, 0xbb, 0xe0, 0x3d, 0x49, 0xbe,
- 0x0b, 0x70, 0x19, 0xbe, 0xa6, 0x5e, 0xf2, 0xbd, 0xa4, 0x73, 0x5e, 0xbe,
- 0x1f, 0xb7, 0xc6, 0x3d, 0xe2, 0xce, 0x03, 0x3d, 0x11, 0xc2, 0x71, 0xbe,
- 0xa7, 0xd6, 0x72, 0xbd, 0xc1, 0xfb, 0x2c, 0x3e, 0x3e, 0x75, 0x4e, 0xbe,
- 0x2e, 0xe9, 0x72, 0xbd, 0xba, 0x72, 0xfe, 0xbd, 0x92, 0xe7, 0xdf, 0xbc,
- 0xfb, 0x21, 0x95, 0x3e, 0x41, 0xf8, 0x67, 0x3d, 0x0f, 0xb2, 0x97, 0xbc,
- 0x7d, 0xa4, 0x14, 0xbe, 0x02, 0x6e, 0xfd, 0x3c, 0xc5, 0x1e, 0x38, 0xbd,
- 0x32, 0x14, 0xcc, 0x3d, 0x4c, 0x38, 0xaf, 0xbe, 0x8f, 0x05, 0x95, 0x3d,
- 0x54, 0xf5, 0xee, 0xbe, 0x65, 0x80, 0xc3, 0x3e, 0xb3, 0x1e, 0xa5, 0x3d,
- 0xff, 0x85, 0xf7, 0xbd, 0x0b, 0x79, 0x75, 0x3d, 0x09, 0xf4, 0x13, 0x3e,
- 0x9d, 0xb5, 0xcc, 0x3c, 0x86, 0x73, 0xe5, 0xbd, 0xc4, 0x64, 0x6e, 0xbe,
- 0xf7, 0x53, 0x1e, 0xbd, 0x97, 0x57, 0x55, 0xbe, 0xc4, 0x6f, 0x29, 0xbd,
- 0x8b, 0x1b, 0x4d, 0xbe, 0x15, 0x88, 0x26, 0xbd, 0xa5, 0x53, 0x1f, 0x3e,
- 0x5f, 0xba, 0x37, 0xbe, 0x99, 0xb3, 0x7e, 0xbd, 0x08, 0x11, 0xd2, 0xbe,
- 0xc6, 0xe6, 0x23, 0x3c, 0x1b, 0x2b, 0x96, 0xbd, 0x10, 0x44, 0x88, 0xbe,
- 0xae, 0x4f, 0x0f, 0xbd, 0x3f, 0xf1, 0x33, 0xbd, 0x51, 0xca, 0x39, 0xbe,
- 0x9b, 0x60, 0x60, 0xbd, 0xcb, 0x82, 0x0d, 0x3e, 0x58, 0x93, 0xcc, 0xbc,
- 0x95, 0x26, 0x60, 0xbe, 0xe4, 0x70, 0x9f, 0xbe, 0x25, 0x4a, 0x9d, 0xbd,
- 0x65, 0xfa, 0xea, 0x3b, 0xd8, 0x01, 0x65, 0x3e, 0x45, 0x92, 0xac, 0xbe,
- 0xa6, 0xb5, 0xd0, 0xbe, 0x99, 0xc0, 0x55, 0x3c, 0x07, 0xff, 0xc1, 0xbd,
- 0xf0, 0xd7, 0x0f, 0x3d, 0x2f, 0xb8, 0xb8, 0x3d, 0x2c, 0x54, 0xa3, 0xbc,
- 0x4d, 0x58, 0x5c, 0x3e, 0xb5, 0x01, 0x62, 0xbd, 0x3c, 0xec, 0x82, 0xbe,
- 0xf8, 0x95, 0xa9, 0x3d, 0x84, 0x0a, 0x7c, 0x3d, 0x20, 0x17, 0xda, 0xbe,
- 0x4d, 0xd4, 0x44, 0x3d, 0x45, 0xd5, 0x28, 0xbd, 0x6e, 0x94, 0x1b, 0x3d,
- 0xe0, 0x09, 0xee, 0xbd, 0x59, 0x45, 0x94, 0xbd, 0xcf, 0xf2, 0x0e, 0xbe,
- 0xe3, 0xee, 0x6a, 0x3e, 0x3a, 0xd6, 0xd8, 0x3e, 0x8e, 0x7d, 0x12, 0xbd,
- 0x3f, 0xa7, 0x64, 0xbd, 0x2b, 0xbc, 0xc7, 0xbd, 0x39, 0xdd, 0x53, 0xbe,
- 0xab, 0x31, 0x1c, 0xbe, 0x2f, 0x51, 0x3b, 0xbe, 0x1c, 0xdc, 0x06, 0xbe,
- 0x1f, 0xb7, 0xdc, 0xbd, 0xbe, 0xcd, 0x11, 0xbe, 0xa4, 0xf4, 0xbc, 0xbe,
- 0xa3, 0x8b, 0xeb, 0x3d, 0x2b, 0x3a, 0x39, 0xbe, 0xf6, 0x32, 0xf5, 0x3b,
- 0xe4, 0x81, 0xbf, 0xbd, 0x98, 0x3c, 0x03, 0xbe, 0x75, 0xd5, 0xea, 0xba,
- 0xc6, 0xb9, 0xbe, 0xbd, 0xe8, 0xcc, 0x54, 0xbe, 0xf7, 0xf9, 0x01, 0x3e,
- 0xca, 0x30, 0xee, 0x3b, 0x39, 0x84, 0x25, 0xbe, 0x69, 0xc5, 0xc1, 0x3d,
- 0xcf, 0x42, 0xb1, 0x3d, 0x70, 0x8d, 0x54, 0x3e, 0x45, 0x20, 0x8e, 0x3d,
- 0x35, 0x69, 0x14, 0xbe, 0x6a, 0x2b, 0x7c, 0x3d, 0xe3, 0xbe, 0x53, 0xbe,
- 0xcd, 0xc3, 0xab, 0x3d, 0x49, 0x42, 0x19, 0xbe, 0x41, 0x18, 0x09, 0xbd,
- 0x52, 0x09, 0x9a, 0xbd, 0xa6, 0xd3, 0x68, 0xbd, 0xbb, 0x9d, 0x17, 0x3e,
- 0xea, 0x01, 0xe9, 0xbc, 0x7c, 0x9c, 0x2c, 0x3e, 0xc0, 0xe6, 0xdf, 0xbb,
- 0x59, 0xb4, 0x8e, 0x3d, 0xff, 0x44, 0x5f, 0x3e, 0xd0, 0x00, 0x3c, 0xbe,
- 0x4e, 0x30, 0x4e, 0x3d, 0x8a, 0xec, 0xbb, 0xbb, 0x2c, 0x4b, 0x1f, 0xbe,
- 0x77, 0xb1, 0x4a, 0xbd, 0xf5, 0x0c, 0xf2, 0xbd, 0xce, 0xc5, 0x71, 0x3d,
- 0xe4, 0x03, 0x7d, 0x3d, 0x94, 0xa1, 0x84, 0xbe, 0x4f, 0x95, 0xd5, 0x3d,
- 0xf2, 0x8c, 0xfd, 0xbe, 0x6e, 0x4f, 0x9c, 0x3e, 0x50, 0xa7, 0xf6, 0x3b,
- 0x11, 0x8f, 0x45, 0xbe, 0xd8, 0x00, 0x08, 0x3e, 0x10, 0xe6, 0x5f, 0x3b,
- 0xd8, 0x2b, 0x6f, 0xbd, 0x6c, 0xc0, 0xc7, 0xbd, 0xab, 0x7c, 0xc4, 0x3b,
- 0x00, 0x41, 0xab, 0x3d, 0x5b, 0x43, 0xd1, 0xbd, 0x9d, 0x1d, 0xf7, 0x3d,
- 0x43, 0x64, 0x58, 0xbe, 0x35, 0x04, 0x36, 0xbc, 0xa0, 0x50, 0xb7, 0xbd,
- 0x45, 0x00, 0x65, 0xbc, 0x5b, 0xb2, 0x85, 0xbd, 0x60, 0xc9, 0x9a, 0xbd,
- 0x62, 0x99, 0x48, 0xbd, 0xab, 0xbb, 0xa5, 0x3c, 0x6a, 0x77, 0x87, 0xbd,
- 0xc3, 0x1d, 0x83, 0xbc, 0xd1, 0x77, 0x8a, 0x3d, 0xe5, 0x8f, 0xdb, 0x3d,
- 0x3c, 0x79, 0x22, 0xbe, 0xba, 0x95, 0x32, 0x3e, 0x11, 0xf0, 0x20, 0xbe,
- 0xec, 0xb6, 0xf7, 0xbd, 0xfa, 0x54, 0x69, 0x3e, 0x88, 0x4c, 0x5f, 0xbe,
- 0xb4, 0x97, 0x3c, 0xbd, 0x70, 0x4c, 0x1e, 0x3e, 0x4e, 0x96, 0x7b, 0x3e,
- 0x54, 0x3f, 0x7f, 0xbe, 0x58, 0xd5, 0x83, 0x3e, 0xd4, 0x0c, 0x97, 0xbd,
- 0x4d, 0x57, 0x67, 0x3e, 0x29, 0x56, 0x36, 0x3f, 0xcd, 0x01, 0x6e, 0x3e,
- 0x38, 0x24, 0xd9, 0x3e, 0x3b, 0x12, 0x7a, 0x3e, 0x55, 0x2b, 0x12, 0xbf,
- 0xf3, 0xf5, 0xae, 0x3d, 0x3b, 0xe2, 0x6e, 0xbe, 0x9d, 0x68, 0x2d, 0xbf,
- 0x11, 0xc3, 0x06, 0xbd, 0xae, 0x5b, 0xa6, 0x3e, 0xf3, 0x0f, 0x6b, 0x3e,
- 0xb3, 0xf5, 0x20, 0xbe, 0x73, 0x6b, 0x0f, 0xbe, 0xc7, 0x08, 0x39, 0xbf,
- 0x5a, 0x4f, 0xa5, 0xbe, 0x3f, 0x24, 0x35, 0x3f, 0xa9, 0x3e, 0x03, 0x3d,
- 0x0f, 0x87, 0x45, 0x3e, 0xce, 0xe9, 0x9e, 0x3e, 0xd4, 0x7b, 0x67, 0x3e,
- 0x77, 0x2c, 0x1f, 0x3c, 0x20, 0x03, 0xc0, 0x3e, 0xf9, 0xdd, 0x3d, 0xbf,
- 0xf1, 0xbc, 0x44, 0xbd, 0xa9, 0xa3, 0x36, 0xbf, 0x1a, 0x09, 0xb5, 0xbe,
- 0x13, 0x16, 0xd1, 0xbd, 0xf5, 0x25, 0xa6, 0x3d, 0xa9, 0xc1, 0x00, 0xbd,
- 0x5a, 0xc3, 0xb1, 0x3e, 0x4c, 0xf8, 0x16, 0x3f, 0xe8, 0x78, 0x81, 0x3e,
- 0xe3, 0x09, 0xf2, 0x3e, 0x4e, 0x8d, 0x08, 0xbe, 0xa5, 0x48, 0x89, 0xbe,
- 0x6e, 0xb9, 0x2a, 0x3e, 0xa9, 0x4a, 0xf1, 0xbd, 0x69, 0x3e, 0x20, 0xbe,
- 0xd7, 0xe5, 0xe1, 0xbd, 0x6d, 0x43, 0xbc, 0xbe, 0x80, 0xce, 0x0a, 0xbe,
- 0xcc, 0x4f, 0x1a, 0x3f, 0xf1, 0xa4, 0x8d, 0x3e, 0x10, 0x94, 0xaa, 0x3b,
- 0x59, 0x17, 0x66, 0xbf, 0x87, 0x47, 0x48, 0x3d, 0xf6, 0x82, 0xed, 0xbd,
- 0x36, 0xe8, 0x1b, 0xbe, 0xe8, 0xda, 0x1c, 0xbe, 0x89, 0x23, 0x0a, 0xbe,
- 0x6a, 0x75, 0xb6, 0xbe, 0x98, 0xce, 0x2a, 0xbf, 0xda, 0xc9, 0x2d, 0x3c,
- 0xcf, 0xd3, 0x95, 0xbd, 0x2c, 0x7a, 0xf2, 0x3e, 0x2c, 0xa3, 0x81, 0xbe,
- 0xda, 0xc1, 0x0b, 0xbe, 0x09, 0xbb, 0xfd, 0x3d, 0x99, 0xf6, 0x6f, 0xbc,
- 0xf8, 0xee, 0x43, 0xbc, 0x48, 0x9b, 0x58, 0x3d, 0x4d, 0x9e, 0xa5, 0x3c,
- 0x27, 0x6c, 0x10, 0x3f, 0x06, 0xbe, 0x36, 0x3d, 0x95, 0x57, 0x08, 0x3d,
- 0xe3, 0x40, 0x4c, 0x3e, 0x18, 0x05, 0x73, 0xbe, 0x5e, 0xc2, 0x92, 0xbe,
- 0xc6, 0xf8, 0x21, 0xbe, 0x75, 0xd1, 0x75, 0xbe, 0x83, 0x48, 0x6b, 0x3e,
- 0x11, 0x2b, 0x28, 0x3e, 0xaa, 0x05, 0x2c, 0xbd, 0x08, 0x1f, 0xdb, 0x3d,
- 0x26, 0x5e, 0xaa, 0xbd, 0xf6, 0x4e, 0xa5, 0x3e, 0x47, 0x0b, 0x0f, 0xbc,
- 0xf9, 0x7f, 0xab, 0xbc, 0x57, 0x32, 0x14, 0xbd, 0x6d, 0xb4, 0x24, 0x3f,
- 0xb5, 0xb6, 0x6b, 0xbe, 0x38, 0xd9, 0x04, 0x3e, 0xa0, 0x55, 0x20, 0x3f,
- 0xd3, 0x05, 0x85, 0x3d, 0xfe, 0x65, 0x30, 0x3d, 0x4d, 0xe1, 0xa7, 0xbd,
- 0x50, 0x89, 0xd2, 0x3d, 0x72, 0x4c, 0x1e, 0x3d, 0x05, 0x7f, 0xac, 0xbe,
- 0xc3, 0x49, 0x01, 0x3f, 0x8d, 0x0e, 0xc5, 0xbe, 0x72, 0xdd, 0xc9, 0xbc,
- 0xcd, 0x9e, 0xc1, 0x3d, 0xb4, 0x42, 0x62, 0x3d, 0xad, 0x62, 0x59, 0xbe,
- 0x05, 0x24, 0x8d, 0x3d, 0x80, 0x95, 0x37, 0xbe, 0x77, 0x08, 0x02, 0xbf,
- 0x09, 0x7b, 0x71, 0xbe, 0xc7, 0xd3, 0x73, 0x3e, 0x1f, 0xab, 0x52, 0x3d,
- 0xf6, 0x6c, 0xb1, 0xbc, 0xf3, 0x72, 0x8b, 0xbd, 0x5e, 0x76, 0xe7, 0xbd,
- 0x23, 0x23, 0xcd, 0x3d, 0xaf, 0x96, 0x8e, 0xbc, 0x7c, 0x33, 0xe1, 0xbd,
- 0x93, 0x57, 0xe9, 0xbc, 0xfd, 0x72, 0x14, 0x3c, 0xbc, 0x64, 0xf1, 0x3d,
- 0xeb, 0x4d, 0x0e, 0xbe, 0xb0, 0xbb, 0x89, 0xbc, 0x42, 0xed, 0xd0, 0x3c,
- 0x30, 0x99, 0xc9, 0x3d, 0xa2, 0x05, 0x67, 0xbd, 0x1f, 0x63, 0xee, 0x3c,
- 0x83, 0xd5, 0xa3, 0x3d, 0x02, 0x68, 0x4a, 0xbe, 0x4d, 0x6d, 0x9c, 0xbe,
- 0xf0, 0x3d, 0x82, 0xbd, 0xda, 0x4c, 0x15, 0x3e, 0x20, 0x2d, 0xfc, 0xbe,
- 0xfc, 0x18, 0xe3, 0xbc, 0x52, 0x09, 0xa3, 0x3c, 0xe2, 0xaa, 0x29, 0xbd,
- 0x2a, 0xf9, 0x96, 0x3d, 0x82, 0xf8, 0x06, 0x3d, 0xd0, 0xbe, 0x1d, 0x3d,
- 0xda, 0x6c, 0xae, 0x3c, 0x1f, 0x43, 0xcb, 0x3c, 0xdb, 0xaf, 0x5d, 0xbe,
- 0x12, 0xe9, 0xb9, 0x3d, 0xf9, 0x4a, 0x85, 0xbe, 0xbf, 0x54, 0xec, 0x3c,
- 0x49, 0xe0, 0xb6, 0xbe, 0x07, 0xb9, 0xe3, 0x3c, 0x48, 0xf4, 0xf0, 0x3d,
- 0x70, 0xc9, 0xf0, 0xbc, 0x6a, 0xc3, 0xa8, 0x3c, 0x57, 0xc1, 0xac, 0x3b,
- 0xb4, 0xcd, 0x23, 0xbd, 0x89, 0xde, 0x17, 0x3d, 0x70, 0x09, 0xe6, 0x3d,
- 0x35, 0x95, 0x26, 0xbe, 0xba, 0x56, 0x0a, 0x3d, 0xe1, 0xa5, 0x31, 0xbf,
- 0x18, 0xf0, 0xea, 0x3d, 0xca, 0xeb, 0xd7, 0x3c, 0x90, 0x70, 0x47, 0xbe,
- 0x7c, 0xef, 0x7f, 0xbd, 0x07, 0xc6, 0x32, 0x3e, 0xb5, 0x38, 0xab, 0x3c,
- 0x04, 0xcd, 0x1a, 0xbc, 0xf6, 0xd6, 0x46, 0x3d, 0xbf, 0x0a, 0x94, 0x3c,
- 0xcb, 0x15, 0x83, 0x3c, 0x0f, 0x02, 0x91, 0xbb, 0x41, 0xcf, 0x95, 0x3c,
- 0x56, 0x15, 0xb8, 0xbe, 0xba, 0x04, 0xf8, 0x3d, 0x03, 0x9f, 0xbf, 0x3c,
- 0x38, 0xce, 0x6f, 0xbd, 0x88, 0xcb, 0x77, 0xbc, 0x99, 0xc1, 0x81, 0xbd,
- 0x81, 0xae, 0x38, 0xbe, 0x54, 0x2b, 0xb7, 0xbe, 0xe0, 0x17, 0x54, 0xbe,
- 0x6d, 0xff, 0x7b, 0xbe, 0xf5, 0x1f, 0xf5, 0x3d, 0x06, 0x7c, 0xc3, 0xbc,
- 0xa6, 0x15, 0x99, 0x3c, 0xdb, 0xea, 0x59, 0xbe, 0xda, 0x3e, 0x98, 0x3b,
- 0xea, 0xd3, 0xe4, 0xbc, 0x92, 0x09, 0x95, 0xbd, 0xf5, 0x04, 0x39, 0xbe,
- 0xef, 0xfd, 0xac, 0xbd, 0x72, 0x94, 0x5b, 0xbe, 0x5f, 0x6e, 0x5f, 0xbd,
- 0xc2, 0x55, 0xc4, 0x3d, 0xde, 0x4a, 0x3e, 0x3d, 0x09, 0xe5, 0x01, 0xbe,
- 0xe1, 0x0d, 0x7e, 0xbd, 0xa5, 0x94, 0x86, 0xbd, 0x70, 0xcc, 0xf3, 0x3c,
- 0xdd, 0x83, 0xb5, 0xbd, 0x07, 0x4e, 0x23, 0xbe, 0xb8, 0xe8, 0x02, 0xbc,
- 0x60, 0x4b, 0x46, 0xbd, 0x44, 0x3d, 0x2a, 0xbd, 0x1a, 0x2d, 0x30, 0x3e,
- 0xfc, 0x52, 0x61, 0x3a, 0xd4, 0x73, 0x06, 0xbe, 0x7e, 0x1a, 0x5e, 0xbd,
- 0xf6, 0x4f, 0xd3, 0xbd, 0xa9, 0x50, 0xa7, 0xbc, 0x6e, 0x3b, 0xc8, 0x3d,
- 0x5a, 0xc8, 0x44, 0xbc, 0x33, 0xd8, 0xaf, 0xbe, 0xb2, 0xde, 0x35, 0x3d,
- 0x82, 0x86, 0x51, 0xbe, 0xbe, 0x27, 0xd7, 0x3b, 0x89, 0x04, 0x7e, 0xbc,
- 0x63, 0xb6, 0x45, 0x3e, 0x56, 0x87, 0x81, 0xbd, 0x51, 0x89, 0x0d, 0xbd,
- 0xd8, 0x31, 0x0b, 0x3e, 0xdd, 0x49, 0x06, 0x3f, 0xdb, 0x46, 0x0a, 0xbf,
- 0xd2, 0xcf, 0xa0, 0xbd, 0xf2, 0x5e, 0x00, 0x3f, 0x74, 0xd6, 0xc9, 0xbd,
- 0xcd, 0x47, 0x6a, 0xbe, 0x7e, 0x6b, 0x02, 0x3f, 0x92, 0x2c, 0xe4, 0xbd,
- 0x3e, 0x8a, 0xb4, 0xbd, 0xe4, 0xd6, 0x8f, 0xbd, 0x7d, 0xb0, 0x8a, 0x3c,
- 0x0c, 0xb9, 0x33, 0xbe, 0x9a, 0x2a, 0x1d, 0xbf, 0xfa, 0x84, 0x77, 0xbf,
- 0xa6, 0x48, 0x00, 0x3d, 0xf2, 0x55, 0x2b, 0xbe, 0x2e, 0xa1, 0xc9, 0xbe,
- 0x11, 0x12, 0xeb, 0xbc, 0x29, 0x3e, 0xb3, 0x3d, 0x30, 0x84, 0x43, 0x3d,
- 0x05, 0x75, 0x65, 0xbd, 0x1e, 0xfa, 0x9d, 0x3e, 0x22, 0x5b, 0xe7, 0xbd,
- 0x90, 0xf9, 0xeb, 0xbd, 0xff, 0x5e, 0x84, 0xbd, 0xa6, 0xb4, 0x2a, 0xbd,
- 0xf9, 0xc2, 0x40, 0xbd, 0xb2, 0x4d, 0x8f, 0x3c, 0x15, 0xe2, 0x80, 0x3c,
- 0xda, 0x1e, 0xde, 0x3e, 0x21, 0xcd, 0x82, 0x3c, 0xcd, 0x1a, 0xcd, 0x3e,
- 0x87, 0xae, 0x77, 0xbd, 0xbc, 0xdc, 0x16, 0xbe, 0x97, 0x93, 0x20, 0x3e,
- 0x85, 0x03, 0xd0, 0xbe, 0x4b, 0x96, 0x4a, 0x3e, 0x83, 0xc9, 0xc7, 0x3d,
- 0x83, 0xb9, 0x6c, 0x3e, 0xc8, 0x5f, 0x9c, 0xbe, 0x40, 0xd5, 0xcc, 0xbe,
- 0x03, 0x41, 0xf7, 0x3c, 0xcc, 0x0b, 0x51, 0x3e, 0x45, 0xae, 0x01, 0xbd,
- 0xb2, 0x42, 0x5f, 0xbe, 0x52, 0xc2, 0x26, 0x3e, 0x62, 0x54, 0x84, 0xbf,
- 0xeb, 0xd2, 0x43, 0x3f, 0x02, 0xd1, 0x49, 0xbe, 0xbf, 0xd7, 0xb5, 0xbd,
- 0x0e, 0xa4, 0x9c, 0x3d, 0xee, 0x79, 0xf2, 0xbe, 0x39, 0x10, 0xef, 0xbd,
- 0x5e, 0xff, 0x0d, 0x3f, 0xfb, 0xd7, 0xee, 0xbc, 0x36, 0xa2, 0xd7, 0xbd,
- 0x83, 0x37, 0x59, 0xbe, 0xa4, 0x22, 0x4c, 0xbe, 0x51, 0xe7, 0xcd, 0xba,
- 0x5b, 0x32, 0x8f, 0x3c, 0xf3, 0x9f, 0x03, 0xbf, 0xe7, 0x58, 0x33, 0xbe,
- 0x7c, 0xd4, 0xc9, 0xbd, 0x2c, 0xba, 0x23, 0x3e, 0x9c, 0xb9, 0x52, 0xbd,
- 0xe8, 0x0b, 0x50, 0xbd, 0x03, 0x7e, 0x82, 0x3d, 0xcd, 0x14, 0x91, 0x3e,
- 0x1e, 0x81, 0x77, 0xbe, 0x8c, 0xf1, 0x12, 0x3e, 0xcb, 0xae, 0x44, 0xbc,
- 0x5a, 0xd2, 0x38, 0xbd, 0x19, 0x66, 0x35, 0x3e, 0xce, 0x06, 0xdc, 0x3e,
- 0x26, 0xf9, 0xbc, 0x3d, 0x2b, 0xbd, 0x90, 0x3c, 0x0a, 0x11, 0x63, 0x3e,
- 0xd9, 0x2b, 0x03, 0x3f, 0xaa, 0x6c, 0x2f, 0xbe, 0x43, 0x96, 0xcb, 0x3d,
- 0x5c, 0x90, 0x8d, 0x3d, 0x17, 0x1d, 0x33, 0xbd, 0x3d, 0xbe, 0x0d, 0x3e,
- 0xef, 0xb1, 0x67, 0x3d, 0xc9, 0xc2, 0xd4, 0xbe, 0xb3, 0x1c, 0x16, 0x3e,
- 0x08, 0x14, 0x42, 0x3e, 0x7b, 0x3f, 0xd3, 0x3e, 0x39, 0x22, 0xca, 0x3a,
- 0x17, 0x2f, 0xc8, 0xbd, 0xd4, 0x38, 0xe1, 0x3c, 0x43, 0x11, 0x83, 0x3e,
- 0xf4, 0x34, 0x88, 0xbb, 0xc4, 0xb3, 0x37, 0xbe, 0x4e, 0xc3, 0xdc, 0x3b,
- 0x0f, 0x06, 0x95, 0xbe, 0x16, 0x6c, 0x98, 0x3d, 0x63, 0xed, 0x8b, 0xbe,
- 0x23, 0x89, 0x5e, 0xbe, 0xf3, 0xb2, 0x13, 0xbd, 0x7d, 0xf2, 0x6b, 0xbe,
- 0x65, 0xe8, 0x39, 0xbe, 0xfa, 0x7e, 0x1e, 0xbd, 0xba, 0xb5, 0x32, 0xbe,
- 0xd6, 0x2b, 0x3b, 0xbe, 0x03, 0xd9, 0xaa, 0x3d, 0xec, 0x0c, 0xab, 0xbe,
- 0xcc, 0x41, 0x21, 0xbe, 0xb9, 0xe4, 0xec, 0xbc, 0xe4, 0x80, 0x68, 0x3d,
- 0x69, 0xb0, 0x4d, 0xbe, 0x9b, 0x4e, 0x76, 0x3c, 0xcd, 0xca, 0x7f, 0x3e,
- 0x66, 0x64, 0x01, 0x3e, 0x62, 0x7e, 0xd0, 0x3e, 0x82, 0x7d, 0x57, 0x3d,
- 0xd3, 0xb4, 0x2d, 0x3e, 0x4f, 0x08, 0x58, 0x3c, 0xc9, 0xaa, 0x86, 0xbe,
- 0xa3, 0x64, 0x56, 0xbd, 0x78, 0x5f, 0x2c, 0xbd, 0x6e, 0x79, 0xa6, 0x3c,
- 0xa3, 0x67, 0xe6, 0x3b, 0xb3, 0xdb, 0x2b, 0xbd, 0x4c, 0xcf, 0xce, 0xbe,
- 0x15, 0xcd, 0x10, 0xbe, 0x3b, 0x98, 0x0a, 0xbe, 0xd3, 0xeb, 0xcc, 0xbb,
- 0x16, 0x7f, 0x83, 0x3c, 0x64, 0x95, 0xb0, 0xbd, 0x8c, 0x81, 0x58, 0xbe,
- 0x76, 0x9e, 0x6b, 0xbd, 0x9f, 0xac, 0x29, 0xbd, 0x88, 0x54, 0xc5, 0xbe,
- 0xa2, 0x77, 0x97, 0xbe, 0x82, 0x7b, 0xab, 0xbc, 0xf4, 0x85, 0x9a, 0x3d,
- 0x1b, 0xbe, 0x07, 0xbd, 0x22, 0x82, 0x93, 0x3e, 0x37, 0x7f, 0xb2, 0xbe,
- 0x20, 0x72, 0x03, 0x3e, 0xe2, 0x66, 0xa5, 0xbd, 0x87, 0x2d, 0x00, 0xbe,
- 0xaf, 0x55, 0x8a, 0xbe, 0xa0, 0xae, 0x1f, 0xbe, 0x76, 0x97, 0x4b, 0xbe,
- 0x90, 0x59, 0x7d, 0x3c, 0x36, 0x52, 0x94, 0xbd, 0x5e, 0x0a, 0x57, 0xbd,
- 0x79, 0xa4, 0x15, 0xbe, 0x82, 0x5e, 0x6d, 0x3d, 0x0d, 0x8a, 0x38, 0xbe,
- 0x81, 0x0e, 0x2b, 0x3c, 0x26, 0xdc, 0x93, 0xbd, 0x62, 0x3d, 0x1b, 0xbe,
- 0x76, 0xdc, 0x99, 0x3e, 0x4d, 0x4d, 0x9f, 0x3d, 0xb9, 0x5f, 0xfd, 0x3c,
- 0x94, 0xad, 0xbf, 0xbd, 0x24, 0xde, 0x8c, 0xbe, 0x5a, 0x82, 0xd0, 0xbd,
- 0x19, 0x64, 0x76, 0x3d, 0x2a, 0xb7, 0x48, 0xbe, 0xe0, 0x4e, 0xf3, 0xbd,
- 0xe8, 0x25, 0x39, 0xbf, 0x92, 0xda, 0xf6, 0x3d, 0xd7, 0x32, 0x08, 0xbd,
- 0xbf, 0x4d, 0xbe, 0xbc, 0x88, 0xc1, 0x79, 0x3d, 0x3d, 0xb5, 0x05, 0x3e,
- 0x71, 0x9a, 0xde, 0xbd, 0x2f, 0x3b, 0x02, 0x3d, 0x1e, 0x2d, 0x88, 0xbd,
- 0x66, 0x01, 0xad, 0xbd, 0x46, 0x6f, 0xe0, 0xbe, 0xd8, 0xc0, 0xb3, 0xbd,
- 0x76, 0x2a, 0x1f, 0xbe, 0x7f, 0x91, 0xee, 0x3c, 0x83, 0xb4, 0xa6, 0x3d,
- 0x52, 0xcb, 0x94, 0xbe, 0xcc, 0x6c, 0x19, 0xbe, 0x70, 0x8b, 0x0d, 0xbf,
- 0x34, 0x0a, 0x3e, 0xbe, 0x5b, 0x67, 0x71, 0xbd, 0x27, 0x04, 0x91, 0xbe,
- 0xd7, 0x24, 0xf4, 0xbc, 0x78, 0x5c, 0x83, 0xbe, 0x61, 0x17, 0x01, 0xbe,
- 0xd8, 0x92, 0x38, 0x3e, 0x8a, 0x8f, 0xa6, 0x3d, 0xd7, 0xb8, 0x1c, 0xbe,
- 0xfe, 0xed, 0x3e, 0xbe, 0xc3, 0x0d, 0x89, 0xbe, 0x11, 0x04, 0xc9, 0xbe,
- 0x94, 0x97, 0x41, 0xbe, 0x0c, 0x3e, 0xa3, 0x3e, 0x06, 0xc8, 0xa1, 0xbe,
- 0x10, 0x15, 0x01, 0xbf, 0x1c, 0x15, 0x04, 0xbe, 0xa1, 0xf1, 0x1b, 0xbe,
- 0xa1, 0xe4, 0x87, 0x3d, 0x71, 0xf3, 0x1e, 0xbc, 0xd7, 0xc8, 0x18, 0xbe,
- 0x9f, 0x2d, 0xee, 0x3e, 0x1c, 0xbc, 0x88, 0xbd, 0xdb, 0x23, 0x0b, 0xbe,
- 0x26, 0x55, 0x97, 0xbe, 0xb5, 0x8a, 0xf3, 0xbd, 0xfd, 0x74, 0xde, 0xbe,
- 0x86, 0x1e, 0x00, 0x3d, 0x23, 0x30, 0xa4, 0xbe, 0xba, 0xd0, 0x31, 0x3d,
- 0xa5, 0x36, 0xe4, 0x3d, 0x79, 0xc4, 0xf1, 0xbd, 0x09, 0x25, 0xc2, 0xbd,
- 0x4e, 0xfa, 0x7c, 0x3e, 0x72, 0xf4, 0xfa, 0x3e, 0x53, 0x9a, 0xe0, 0x3d,
- 0x25, 0xca, 0x46, 0xbe, 0xd9, 0x18, 0x39, 0xbc, 0x25, 0x48, 0xfb, 0xbd,
- 0x80, 0x33, 0x37, 0xbe, 0x5b, 0xcc, 0x76, 0xbe, 0x18, 0x7b, 0x5b, 0x3d,
- 0x34, 0x44, 0xb2, 0x3d, 0xad, 0xb0, 0x3c, 0xbe, 0x4e, 0x09, 0x94, 0xbe,
- 0x5f, 0x37, 0xe5, 0xbc, 0x15, 0x55, 0x43, 0xbe, 0xf0, 0xbd, 0x5d, 0xbc,
- 0x40, 0x71, 0x7a, 0xbd, 0x9e, 0x02, 0x17, 0xbe, 0x50, 0xf6, 0x48, 0xbe,
- 0x19, 0xbe, 0xb8, 0x3c, 0x16, 0x11, 0xa5, 0xbe, 0x27, 0xba, 0x78, 0x3d,
- 0xe4, 0x56, 0x4b, 0xbe, 0xd1, 0x27, 0x5e, 0xbd, 0x2e, 0xee, 0xb4, 0x3d,
- 0x39, 0xae, 0x03, 0xbd, 0x80, 0xaa, 0x7c, 0x3d, 0x7d, 0xea, 0xef, 0xbe,
- 0xbf, 0x5c, 0x87, 0x3d, 0x43, 0xd6, 0x7d, 0x3d, 0xaa, 0x6c, 0x13, 0xbe,
- 0x85, 0x30, 0x05, 0xbd, 0xe6, 0x5c, 0xa3, 0xbe, 0x02, 0x9d, 0x91, 0x3c,
- 0x46, 0xd1, 0xf7, 0xbc, 0x6b, 0x00, 0x6d, 0xbe, 0x87, 0x45, 0x20, 0x3e,
- 0xec, 0x20, 0x5d, 0xbd, 0xf0, 0x09, 0x91, 0x3e, 0x74, 0x14, 0x1c, 0xbd,
- 0x63, 0x80, 0x59, 0xbd, 0xa1, 0x26, 0xf5, 0xbb, 0x70, 0xba, 0xe5, 0xbc,
- 0x20, 0xdf, 0x1a, 0x3e, 0x7c, 0xc0, 0xee, 0x3d, 0x5a, 0x55, 0xcd, 0xbd,
- 0x70, 0x98, 0x9e, 0x3d, 0xd5, 0xd3, 0x82, 0xbd, 0x69, 0xc4, 0x94, 0x3d,
- 0x93, 0xdd, 0x16, 0x3e, 0x7a, 0x0a, 0x52, 0xbe, 0xe2, 0xfb, 0x5d, 0xbd,
- 0x71, 0x0a, 0x2e, 0xbf, 0x8a, 0x34, 0x3e, 0x3e, 0x06, 0x0a, 0xfe, 0xbd,
- 0x48, 0x69, 0x7a, 0xbd, 0xc8, 0x35, 0x7c, 0xbd, 0xc2, 0xce, 0x2c, 0xbd,
- 0xa2, 0xf0, 0x19, 0x3d, 0xfc, 0xba, 0x65, 0xbd, 0x04, 0xca, 0x2a, 0xbd,
- 0x9a, 0xf8, 0xad, 0x3d, 0x0d, 0x78, 0xda, 0xbe, 0x65, 0xe6, 0xe3, 0x3d,
- 0xde, 0x6b, 0x29, 0xbe, 0x22, 0x2d, 0x04, 0x3c, 0xae, 0x0e, 0xe2, 0xbd,
- 0x05, 0xe6, 0x15, 0xbc, 0xfc, 0xc6, 0x93, 0xbd, 0x7f, 0xfe, 0xa0, 0xbe,
- 0x0a, 0x47, 0x35, 0xbe, 0xa2, 0xe0, 0x49, 0x3d, 0xd3, 0x9e, 0x8b, 0xbd,
- 0x37, 0xa7, 0xd2, 0x3d, 0x14, 0x45, 0x7f, 0x3d, 0x09, 0x7f, 0x4e, 0x3d,
- 0x3f, 0xe5, 0xeb, 0xbd, 0xa4, 0x90, 0x98, 0x3e, 0xeb, 0xb4, 0x01, 0xbe,
- 0xa3, 0x00, 0x43, 0xbd, 0xb0, 0x7a, 0x58, 0x3e, 0x7f, 0xd1, 0xb5, 0xbe,
- 0xec, 0x9e, 0xd8, 0x3d, 0x7d, 0xd1, 0xc9, 0x3d, 0xe2, 0x94, 0xca, 0x3d,
- 0x67, 0x15, 0x2b, 0xbe, 0xf2, 0x68, 0xc8, 0x3d, 0x2a, 0x80, 0x89, 0xbd,
- 0x00, 0xea, 0x3f, 0x3f, 0x5b, 0xb4, 0x56, 0x3e, 0xa5, 0x1a, 0x95, 0x3d,
- 0xe4, 0x40, 0x07, 0xbe, 0x06, 0xf1, 0x04, 0x3f, 0x98, 0x8a, 0x0f, 0xbf,
- 0x1c, 0x4b, 0x97, 0x3d, 0xa8, 0x05, 0xd4, 0x3e, 0x4e, 0x26, 0x2e, 0xbf,
- 0x38, 0x87, 0xdc, 0x3d, 0xa3, 0xda, 0x21, 0x3f, 0xd6, 0xbc, 0xae, 0x3d,
- 0xd0, 0xff, 0xa0, 0xbe, 0x2d, 0x54, 0x3c, 0x3c, 0xe4, 0x71, 0x91, 0xbd,
- 0x4f, 0x77, 0x01, 0x3f, 0xc5, 0x77, 0x42, 0xbf, 0x9f, 0x00, 0xcc, 0xbe,
- 0x81, 0xb4, 0x24, 0x3e, 0x0c, 0xa5, 0xbb, 0x3c, 0x26, 0xaa, 0x54, 0x3e,
- 0x8e, 0xdd, 0x06, 0x3e, 0x95, 0x3d, 0x79, 0x3e, 0xc7, 0x73, 0x89, 0xbe,
- 0xdd, 0x94, 0xc7, 0xbc, 0x73, 0x17, 0x0a, 0x3f, 0xce, 0xae, 0x99, 0xbe,
- 0x6a, 0x94, 0xa7, 0x3d, 0x08, 0x99, 0xca, 0xbd, 0x0c, 0x0a, 0xc4, 0x3e,
- 0x1e, 0x12, 0xb4, 0xbd, 0x41, 0xaf, 0xcf, 0x3e, 0x3f, 0xcd, 0xdc, 0xbd,
- 0x3e, 0xf7, 0xdc, 0xbc, 0x08, 0xb0, 0x57, 0xbe, 0xa1, 0xb6, 0xf6, 0x3d,
- 0x0e, 0x04, 0x22, 0xbe, 0xc5, 0x24, 0x3b, 0x3e, 0xb9, 0x9d, 0x08, 0xbf,
- 0xad, 0x4f, 0x26, 0xbf, 0xa3, 0x81, 0x7e, 0xbe, 0xa4, 0xbe, 0xe0, 0xbc,
- 0xa7, 0x55, 0x82, 0x3e, 0x5d, 0xb0, 0x2b, 0xbd, 0xd4, 0xd8, 0xb1, 0x3d,
- 0x5b, 0x9d, 0x5d, 0xbe, 0xa6, 0xbc, 0x02, 0x3e, 0x45, 0x98, 0x41, 0xbe,
- 0x5d, 0x84, 0xbc, 0x3d, 0x8a, 0x62, 0xf1, 0xbe, 0x36, 0xd4, 0x06, 0xbf,
- 0xb2, 0xe3, 0xb8, 0x3e, 0xc4, 0xde, 0x9a, 0xbd, 0xd9, 0xda, 0xbd, 0x3d,
- 0xf0, 0x09, 0x45, 0x3e, 0x88, 0x0d, 0xd4, 0xbd, 0xef, 0x61, 0xe5, 0xbd,
- 0x56, 0xa4, 0x2a, 0x3e, 0x32, 0x2e, 0x4e, 0x3b, 0x51, 0xcc, 0x39, 0xbe,
- 0xff, 0x1f, 0xb2, 0x3d, 0x99, 0xb9, 0x2e, 0x3c, 0xc4, 0x30, 0xdf, 0x3e,
- 0x49, 0xe3, 0x59, 0x3c, 0x4f, 0x3e, 0x91, 0x3e, 0xef, 0x3f, 0x1a, 0xbd,
- 0xb6, 0x42, 0xa7, 0x3e, 0xda, 0x75, 0x92, 0xbe, 0x3e, 0x68, 0xc1, 0x3d,
- 0x00, 0x82, 0x2d, 0xbe, 0xeb, 0x9d, 0x36, 0xbe, 0x78, 0x7b, 0xa6, 0x3e,
- 0x01, 0x47, 0x98, 0x3d, 0xac, 0x2a, 0x59, 0xbd, 0xbd, 0xe8, 0xaa, 0x3b,
- 0x05, 0xc2, 0x0b, 0x3e, 0xdf, 0xcb, 0x56, 0x3e, 0x7f, 0x8a, 0x03, 0xbd,
- 0x6f, 0x2c, 0x85, 0xbc, 0xfb, 0x9c, 0x09, 0x3e, 0xc7, 0xa1, 0x80, 0x3e,
- 0x75, 0x52, 0x98, 0x3e, 0x75, 0x48, 0x3e, 0x3d, 0x68, 0x86, 0xb3, 0x3d,
- 0x90, 0x4d, 0xcc, 0x3d, 0x3a, 0x39, 0x8d, 0x3e, 0x9f, 0x55, 0x91, 0x3e,
- 0x84, 0xa1, 0x0a, 0xbd, 0x27, 0xca, 0x98, 0x3e, 0x95, 0x26, 0xf4, 0xbd,
- 0x0f, 0xc8, 0x5a, 0xbe, 0xeb, 0x61, 0x5d, 0xbf, 0xb3, 0xb6, 0xe7, 0xbd,
- 0x96, 0xc7, 0x1c, 0xbd, 0x47, 0x9f, 0xd5, 0xbe, 0x5e, 0x51, 0x05, 0x3e,
- 0x23, 0xd3, 0xb3, 0xbc, 0x7c, 0x4c, 0x8a, 0xbe, 0x49, 0x45, 0x19, 0xbe,
- 0x3d, 0xc2, 0xbf, 0xbd, 0x06, 0xb3, 0x98, 0x3e, 0xc8, 0x46, 0x03, 0xbe,
- 0x03, 0x75, 0xd7, 0xbc, 0x10, 0xe8, 0xb0, 0x3d, 0x5e, 0xd3, 0x24, 0xbe,
- 0xc2, 0xbf, 0x13, 0x3e, 0xf6, 0x82, 0xfa, 0x3d, 0x34, 0x4d, 0x2a, 0xbe,
- 0xda, 0x8b, 0x1e, 0xbe, 0x9f, 0x5a, 0xed, 0xbd, 0x7e, 0x61, 0xe8, 0x3d,
- 0xc9, 0xd2, 0xc8, 0xbd, 0x0b, 0xf3, 0x8f, 0x3d, 0x2d, 0x2c, 0xd3, 0x3c,
- 0xf0, 0x34, 0x80, 0xbd, 0xb1, 0x92, 0x22, 0xbe, 0x33, 0xcb, 0xb6, 0xbd,
- 0x30, 0x4b, 0x3c, 0x3d, 0x9e, 0xcd, 0x71, 0x3c, 0x21, 0x83, 0x83, 0xbe,
- 0xb5, 0x2a, 0x2d, 0x3d, 0x8c, 0x0a, 0xbd, 0x3d, 0xf9, 0x09, 0x0f, 0xbf,
- 0xf7, 0xd1, 0xdc, 0x3d, 0x3f, 0xd9, 0x66, 0xbc, 0xad, 0x62, 0x92, 0xbd,
- 0x99, 0xca, 0x6e, 0xbd, 0x77, 0x0f, 0x50, 0x3c, 0x9d, 0xd3, 0x8e, 0x3d,
- 0x0a, 0xcf, 0x20, 0x3c, 0xb5, 0x53, 0x42, 0xbe, 0x99, 0x60, 0xbc, 0xbd,
- 0x73, 0xf7, 0xc9, 0x3c, 0x1d, 0x17, 0x2b, 0xbe, 0x49, 0x25, 0x42, 0xbe,
- 0xbc, 0x98, 0xbc, 0xbe, 0x61, 0x3d, 0x9d, 0x3d, 0x8b, 0x41, 0xa4, 0x3d,
- 0x92, 0x03, 0x48, 0xbe, 0xc0, 0x32, 0x38, 0x3d, 0x53, 0xfd, 0xff, 0x3d,
- 0x12, 0x00, 0x4b, 0xbd, 0xd6, 0x13, 0x90, 0x3c, 0x05, 0x45, 0x76, 0xbe,
- 0x1b, 0xff, 0x0c, 0xbf, 0xb3, 0x4b, 0x8a, 0xbd, 0x6d, 0xcb, 0x2e, 0xbf,
- 0xf7, 0x09, 0xab, 0x3c, 0x33, 0x5d, 0x43, 0x3d, 0x20, 0xf8, 0xc5, 0x3c,
- 0x41, 0x87, 0x28, 0xbd, 0x9b, 0x69, 0x24, 0x3d, 0xe4, 0x97, 0x93, 0x3d,
- 0xec, 0x5a, 0x82, 0xbc, 0x72, 0x58, 0xaa, 0xbc, 0xc9, 0x80, 0xff, 0xbc,
- 0x26, 0xc8, 0x14, 0x3e, 0xed, 0x6e, 0x1c, 0xbe, 0x07, 0x92, 0x84, 0xbe,
- 0xb9, 0xd2, 0x9e, 0xbe, 0x73, 0xb4, 0x19, 0xbd, 0x4c, 0xc2, 0x3b, 0x3c,
- 0x3f, 0xf2, 0xa0, 0xbc, 0x5a, 0x4b, 0x55, 0x3d, 0xfd, 0x5a, 0x09, 0xbe,
- 0xd8, 0xac, 0x4c, 0xbe, 0x61, 0xc5, 0x25, 0xbe, 0x59, 0xc4, 0x06, 0xbe,
- 0x82, 0x0d, 0x11, 0xbf, 0x48, 0x4a, 0x7f, 0xb9, 0xd7, 0xcc, 0xb6, 0xbe,
- 0xe3, 0x68, 0xa1, 0xbd, 0x05, 0x53, 0xac, 0xbd, 0xd9, 0xca, 0x96, 0xbd,
- 0xdf, 0xca, 0x1f, 0xbe, 0xe2, 0x1b, 0x5e, 0xbc, 0xd9, 0x23, 0x3c, 0xbe,
- 0x2b, 0x87, 0x1d, 0xbe, 0x0a, 0x66, 0x2a, 0xbe, 0xd1, 0x2e, 0x2e, 0xbd,
- 0xbd, 0xd9, 0x4a, 0xbc, 0xc8, 0xe7, 0x31, 0xbc, 0xd3, 0x65, 0xc4, 0xbc,
- 0xb3, 0x94, 0xf1, 0xbc, 0x58, 0x4b, 0xdf, 0xbc, 0xfe, 0x80, 0xda, 0xbd,
- 0x02, 0x41, 0x8b, 0x3d, 0xa4, 0xc5, 0x04, 0xbe, 0x35, 0x31, 0xab, 0xbd,
- 0x89, 0x32, 0xb0, 0x3c, 0x80, 0x4d, 0x37, 0xbe, 0x72, 0xb5, 0xe9, 0x3d,
- 0xaf, 0x00, 0x3d, 0xbd, 0xfd, 0x89, 0xb9, 0xbe, 0xcf, 0x2c, 0x85, 0x3d,
- 0x56, 0x97, 0x21, 0xbe, 0x1d, 0xdd, 0x7c, 0xbe, 0xba, 0x08, 0x30, 0x3e,
- 0x1d, 0xb6, 0x8d, 0x3c, 0x97, 0x0d, 0x84, 0xbe, 0x3f, 0xa0, 0x21, 0x3d,
- 0xc4, 0x7a, 0x34, 0xbe, 0x02, 0x26, 0x93, 0x3c, 0x47, 0x87, 0x52, 0xbe,
- 0x96, 0xfb, 0x8a, 0x3d, 0xae, 0x71, 0x7a, 0xbe, 0x6f, 0x5a, 0xcd, 0xbd,
- 0x9d, 0x53, 0xc8, 0x3e, 0xe9, 0x56, 0x53, 0x3e, 0xd3, 0xc3, 0xfa, 0xbe,
- 0x5e, 0x4e, 0x1c, 0xbe, 0x42, 0x9d, 0xee, 0x3e, 0x14, 0xb7, 0x5c, 0x3d,
- 0x46, 0x59, 0x22, 0xbe, 0x99, 0x38, 0xee, 0x3e, 0x82, 0x79, 0x64, 0xbd,
- 0xfe, 0x01, 0xb5, 0xbd, 0x7a, 0x8f, 0x8b, 0x3d, 0x8d, 0xef, 0xd1, 0x3d,
- 0x99, 0xc4, 0x9b, 0xbe, 0x13, 0x9c, 0x0a, 0xbf, 0x42, 0xa3, 0x93, 0xbf,
- 0xea, 0x87, 0xb1, 0x3e, 0xe2, 0xa8, 0x59, 0xbe, 0x39, 0xe3, 0x11, 0xbf,
- 0xda, 0x09, 0x04, 0xbe, 0xd5, 0x54, 0x25, 0x3c, 0xed, 0xf3, 0x76, 0xbd,
- 0x79, 0xf2, 0xd6, 0xbd, 0xc9, 0x61, 0x5b, 0x3e, 0xff, 0x12, 0xf4, 0xbd,
- 0x41, 0x19, 0x0b, 0x3d, 0x81, 0x08, 0x8b, 0x3d, 0x7e, 0xcb, 0xbe, 0xbd,
- 0x46, 0xd3, 0xeb, 0x3c, 0x8a, 0x39, 0xdb, 0xbd, 0xbe, 0xad, 0x1a, 0x3e,
- 0x56, 0x1d, 0x0c, 0x3f, 0xb9, 0xc6, 0xd8, 0x3d, 0x10, 0xe9, 0x25, 0x3e,
- 0xaf, 0xc1, 0x42, 0xbe, 0x8c, 0x72, 0x87, 0xbd, 0xfd, 0x02, 0x85, 0xbc,
- 0xd9, 0xe4, 0x12, 0xbf, 0x51, 0x4d, 0xae, 0x3e, 0x3e, 0x02, 0x45, 0xbe,
- 0x7d, 0xde, 0xf6, 0x3d, 0xe4, 0x8c, 0xbb, 0xbe, 0x92, 0xf3, 0xfe, 0xbe,
- 0x3c, 0xa8, 0x10, 0x3e, 0x99, 0xde, 0xce, 0x3d, 0x7b, 0x22, 0x1d, 0xbe,
- 0x43, 0xab, 0x99, 0xbc, 0x06, 0x10, 0x05, 0x3d, 0xf5, 0x44, 0x7f, 0xbf,
- 0xec, 0xf3, 0x26, 0x3f, 0x7d, 0xde, 0x10, 0xbe, 0x82, 0xc1, 0xe6, 0xbc,
- 0xf4, 0x5f, 0x81, 0xbb, 0x78, 0xb3, 0xf1, 0xbe, 0x0b, 0xec, 0x7b, 0xbe,
- 0x60, 0xe9, 0x06, 0x3f, 0x61, 0xbe, 0x14, 0x3c, 0x24, 0x5b, 0xba, 0xbd,
- 0xb4, 0x98, 0x27, 0xbc, 0x0b, 0x44, 0x9f, 0xbd, 0x76, 0x95, 0x5d, 0x3d,
- 0x0b, 0x5b, 0xe8, 0x3d, 0x54, 0xd0, 0x27, 0xbf, 0x84, 0x50, 0x79, 0xbd,
- 0xd4, 0x9a, 0x95, 0xbe, 0xa1, 0x23, 0x1d, 0x3d, 0x55, 0x48, 0x51, 0xbe,
- 0x14, 0x55, 0x3d, 0xbe, 0x26, 0x9e, 0x95, 0x3d, 0xdc, 0x09, 0x35, 0x3d,
- 0x2a, 0xf1, 0x67, 0xbd, 0x87, 0xfc, 0x6b, 0xbd, 0xce, 0x06, 0x20, 0xbd,
- 0x93, 0xfe, 0x0d, 0xbe, 0x73, 0x45, 0xfb, 0x3d, 0x40, 0xf3, 0x80, 0x3e,
- 0x32, 0x02, 0xf0, 0x3c, 0x65, 0xe8, 0xcc, 0xbd, 0xc5, 0x26, 0xd5, 0x3d,
- 0x56, 0xd6, 0xb9, 0x3e, 0x4c, 0x5a, 0x4b, 0x3d, 0xbe, 0xb9, 0x00, 0xbe,
- 0x7a, 0x42, 0xca, 0xbd, 0x70, 0xab, 0x57, 0x3d, 0x55, 0xf7, 0xc9, 0x3d,
- 0xf7, 0xa2, 0xc0, 0xbd, 0xe9, 0xfd, 0x23, 0xbf, 0x56, 0xbf, 0xa2, 0x3e,
- 0x56, 0xde, 0x0e, 0x3e, 0x21, 0xaf, 0xac, 0x3e, 0xce, 0xd6, 0xa4, 0xbc,
- 0x58, 0xbb, 0x1b, 0xbe, 0x6d, 0x8d, 0x51, 0xbd, 0x97, 0x4f, 0x4e, 0x3d,
- 0xdb, 0x32, 0xad, 0x3d, 0x1c, 0x8f, 0x76, 0xbe, 0x70, 0x5d, 0x92, 0x3c,
- 0x0f, 0xd3, 0x28, 0xbe, 0x89, 0x4b, 0x93, 0x3d, 0x26, 0x8c, 0xc8, 0xbd,
- 0x25, 0x0f, 0x3c, 0xbe, 0x8f, 0xb1, 0x4c, 0xbe, 0xc1, 0x03, 0x69, 0xbd,
- 0x1b, 0x9a, 0x8b, 0x3e, 0xd6, 0x60, 0x31, 0x3f, 0x87, 0x9d, 0x14, 0xbd,
- 0x1e, 0x7e, 0xa7, 0xbb, 0x59, 0xef, 0xda, 0x3e, 0x20, 0x1b, 0xfb, 0x3c,
- 0xbc, 0xf3, 0xad, 0xbd, 0x9a, 0xde, 0x0a, 0x3f, 0x7f, 0x29, 0x24, 0xbd,
- 0xd2, 0x41, 0x03, 0xbe, 0x92, 0x25, 0xe7, 0x3d, 0xf6, 0x59, 0x65, 0xbe,
- 0x45, 0xde, 0xe9, 0xbe, 0xfb, 0x7d, 0x54, 0xbf, 0xc4, 0x99, 0x6c, 0xbf,
- 0xf1, 0x7c, 0x41, 0xbe, 0x30, 0x4d, 0x2d, 0xbe, 0x36, 0x4f, 0x43, 0xbe,
- 0x6a, 0xfb, 0x6e, 0xbe, 0x85, 0x99, 0x3d, 0xbe, 0x31, 0x5d, 0xa3, 0xbd,
- 0x41, 0xc4, 0xad, 0x3c, 0xc4, 0x88, 0xed, 0x3e, 0xea, 0xa4, 0x97, 0x3e,
- 0xc5, 0x2b, 0x32, 0xbe, 0x8f, 0x4d, 0xb6, 0xbd, 0x64, 0x29, 0xe5, 0xbd,
- 0xd3, 0x9c, 0xc6, 0x3c, 0xfc, 0xca, 0x05, 0xbc, 0xa7, 0xff, 0xef, 0x3d,
- 0x76, 0xa9, 0xd8, 0x3e, 0xd5, 0x00, 0x6e, 0xbe, 0x6c, 0x7e, 0xcc, 0x3e,
- 0xb8, 0x99, 0x9c, 0xbd, 0xfb, 0xd7, 0x6b, 0xbd, 0x09, 0x96, 0x2e, 0xbd,
- 0xf1, 0xb6, 0x74, 0xbd, 0x03, 0xfa, 0x6d, 0x3e, 0x18, 0x17, 0x14, 0xbc,
- 0x69, 0x5b, 0x8e, 0xbd, 0xf0, 0xc4, 0xdc, 0xbe, 0x26, 0xf7, 0x05, 0xbf,
- 0x42, 0x68, 0xb6, 0x3e, 0xa9, 0xdf, 0xa1, 0x3d, 0xc3, 0x31, 0x25, 0xbe,
- 0xe9, 0x9d, 0x4e, 0xbe, 0x79, 0xdf, 0xeb, 0xbc, 0xa6, 0x25, 0x7a, 0xbf,
- 0x66, 0x9d, 0xa1, 0x3f, 0xde, 0xd2, 0xde, 0xbc, 0x81, 0x2b, 0x03, 0x3e,
- 0x2d, 0x79, 0x16, 0x3e, 0x1c, 0x8b, 0x47, 0xbf, 0xa1, 0xf8, 0x2c, 0x3c,
- 0x55, 0x02, 0x3d, 0x3f, 0x17, 0x80, 0x9e, 0xbd, 0x80, 0x69, 0x97, 0x3e,
- 0x3f, 0x96, 0x39, 0xbe, 0x16, 0x85, 0xa3, 0xbe, 0xe2, 0xb5, 0x77, 0x3e,
- 0x1a, 0xf7, 0x6e, 0xbe, 0xe6, 0xc7, 0x7e, 0xbe, 0x2f, 0x0f, 0x43, 0xbe,
- 0x68, 0x99, 0xca, 0x3e, 0x12, 0xc6, 0xd2, 0xbd, 0x8f, 0xb3, 0x8e, 0xbe,
- 0x84, 0x1f, 0x58, 0xbd, 0x63, 0x53, 0xee, 0x3d, 0x6e, 0x5d, 0x34, 0x3e,
- 0xe7, 0x77, 0x0a, 0x3d, 0x5c, 0x65, 0x58, 0x3d, 0x58, 0x52, 0xb4, 0xbd,
- 0xdd, 0x42, 0x7b, 0x3c, 0x82, 0xd8, 0x47, 0x3d, 0x0f, 0xbf, 0x5b, 0x3f,
- 0x88, 0x87, 0x25, 0xbe, 0xe3, 0x0e, 0xf6, 0xbd, 0x4e, 0x23, 0xdd, 0x3d,
- 0xee, 0xbf, 0x05, 0x3e, 0x56, 0xfb, 0x2e, 0xbe, 0x6b, 0x4f, 0x67, 0xbc,
- 0xfe, 0xb1, 0x14, 0xbe, 0xec, 0x25, 0xbc, 0xbd, 0xac, 0x1b, 0xc9, 0x3c,
- 0xec, 0x66, 0xd1, 0xbd, 0xb7, 0x84, 0x30, 0xbe, 0x54, 0x49, 0xfc, 0x3e,
- 0xf9, 0x96, 0x42, 0x3d, 0xdb, 0xbc, 0xa8, 0x3e, 0x2d, 0x59, 0xa2, 0xbd,
- 0x25, 0x89, 0x03, 0x3f, 0x1f, 0x0a, 0x0e, 0x3f, 0x8d, 0xf7, 0x3c, 0x3e,
- 0xfe, 0x85, 0x72, 0xbb, 0x8a, 0x3d, 0x9b, 0xbe, 0xf1, 0x96, 0xde, 0x3d,
- 0xb7, 0xc4, 0x25, 0x3e, 0x7a, 0x59, 0x8b, 0x3e, 0x6c, 0xd8, 0xd0, 0xbd,
- 0xef, 0x9f, 0x65, 0xbf, 0xce, 0xa2, 0x07, 0x3f, 0xac, 0x31, 0x59, 0x3e,
- 0xce, 0xe4, 0x15, 0x3e, 0x66, 0x46, 0x6d, 0xbe, 0x49, 0x79, 0xb2, 0xbe,
- 0xb7, 0xea, 0x2d, 0x3f, 0x88, 0xce, 0x8a, 0xbe, 0xfb, 0xef, 0xd0, 0xbd,
- 0xdc, 0xad, 0x4a, 0xbd, 0xc4, 0x14, 0xe6, 0xbd, 0xe4, 0xee, 0xbd, 0x3d,
- 0x3d, 0xea, 0xf8, 0xbe, 0x3e, 0x92, 0x82, 0xbd, 0x36, 0x08, 0x81, 0xbf,
- 0x20, 0xe9, 0x60, 0x3b, 0xd1, 0xfd, 0xe4, 0xbc, 0xf2, 0x64, 0xc8, 0x3e,
- 0xef, 0x78, 0x73, 0x3e, 0x7e, 0xec, 0x35, 0x3e, 0x26, 0xaa, 0xec, 0x3e,
- 0xa2, 0x76, 0xf4, 0xbd, 0x10, 0x44, 0x90, 0x3e, 0xe9, 0xbf, 0xd8, 0x3e,
- 0xc5, 0x29, 0x1f, 0xbe, 0x7b, 0xaf, 0x2f, 0x3e, 0xb5, 0x6f, 0x8d, 0x3e,
- 0x57, 0x1f, 0x11, 0xbe, 0x4e, 0x1d, 0x8b, 0x3c, 0x2f, 0x37, 0xd5, 0x3e,
- 0x1e, 0x62, 0x4b, 0x3e, 0x44, 0x29, 0x75, 0x3e, 0x18, 0x79, 0xca, 0xbb,
- 0x61, 0xcf, 0xfa, 0x3d, 0x57, 0x6d, 0x33, 0x3e, 0x5c, 0x4f, 0xaf, 0xbe,
- 0x47, 0xf2, 0x80, 0x3d, 0xd6, 0x7b, 0x87, 0xbd, 0xb3, 0xf1, 0xf4, 0x3c,
- 0x9c, 0x12, 0x2d, 0xbe, 0xb0, 0xa7, 0x45, 0xbe, 0xc4, 0xdf, 0x21, 0x3d,
- 0x79, 0x0e, 0xde, 0x3e, 0xeb, 0xf5, 0xa0, 0xbe, 0xa5, 0x1c, 0xc8, 0x3e,
- 0x3c, 0x57, 0x92, 0xbe, 0x84, 0x7a, 0x5d, 0x3c, 0xa1, 0xe1, 0xaa, 0xbe,
- 0x35, 0x45, 0xe3, 0xbe, 0x1f, 0xb3, 0x42, 0xbe, 0x24, 0x53, 0x3b, 0xbd,
- 0x50, 0xed, 0xd7, 0xbe, 0x88, 0x83, 0xdd, 0xbe, 0x4e, 0x3c, 0x33, 0x3f,
- 0xcb, 0xa7, 0x17, 0xbe, 0x52, 0x46, 0x88, 0xbe, 0x56, 0x7f, 0x86, 0xbe,
- 0xd0, 0x2a, 0x90, 0xbc, 0xf4, 0x34, 0x49, 0xbd, 0x57, 0xe6, 0x52, 0xbe,
- 0x32, 0xf4, 0x75, 0x3e, 0xc9, 0xf7, 0x8f, 0xbe, 0x27, 0x53, 0x49, 0x3e,
- 0xac, 0x84, 0xc7, 0x3d, 0x3d, 0xbd, 0xc5, 0x3e, 0x52, 0x3b, 0x15, 0x3d,
- 0x66, 0x1b, 0x17, 0x3e, 0x32, 0x2d, 0x06, 0x3c, 0x52, 0xbe, 0x33, 0x3e,
- 0xc7, 0xd7, 0x1e, 0x3c, 0xae, 0x4e, 0x67, 0xbd, 0xb2, 0x43, 0x72, 0xbc,
- 0x33, 0xec, 0xa9, 0x3d, 0x37, 0xc2, 0xe5, 0x3c, 0xb8, 0x46, 0xa4, 0x3b,
- 0x15, 0xf7, 0x8d, 0xbd, 0xca, 0xc5, 0xd1, 0x3e, 0xc5, 0x1e, 0xc9, 0xbd,
- 0x6c, 0x82, 0x0d, 0x3f, 0x00, 0x25, 0xb7, 0x3c, 0x71, 0x05, 0xc2, 0x3e,
- 0x86, 0xc0, 0xfa, 0x3e, 0x30, 0xf4, 0xe1, 0xbc, 0xf0, 0xf9, 0xda, 0xbe,
- 0x86, 0x44, 0x98, 0xbd, 0x9e, 0xb9, 0x12, 0x3e, 0x0b, 0xdb, 0xc4, 0x3e,
- 0x41, 0x8c, 0x6d, 0xbd, 0xe2, 0xcf, 0x94, 0xbd, 0x76, 0x9a, 0x5a, 0x3e,
- 0xa5, 0x58, 0x2c, 0x3e, 0xcf, 0xe1, 0x9d, 0x3e, 0x03, 0xaa, 0xcd, 0x3b,
- 0x88, 0x01, 0xa1, 0xbe, 0xbf, 0xce, 0x31, 0x3e, 0xc1, 0xb1, 0x42, 0x3e,
- 0xba, 0xb3, 0x34, 0xbe, 0x83, 0xbc, 0xdd, 0xbe, 0xde, 0xa5, 0x9c, 0x3e,
- 0x88, 0xdf, 0x80, 0xbe, 0x63, 0x65, 0x24, 0x3e, 0xa4, 0x95, 0x6b, 0x3e,
- 0xba, 0xa6, 0x98, 0x3c, 0x27, 0xc4, 0xdc, 0x3c, 0xb4, 0xd7, 0x0d, 0x3e,
- 0xfd, 0xf4, 0xd4, 0xbe, 0x28, 0x3d, 0x74, 0xbf, 0xcc, 0x25, 0xde, 0x3b,
- 0x89, 0x81, 0xca, 0xbf, 0x99, 0x40, 0x33, 0xbe, 0xe5, 0x4c, 0x93, 0xbe,
- 0x25, 0x47, 0x77, 0x3c, 0x89, 0xb1, 0xe2, 0xbd, 0x0c, 0x40, 0x08, 0xbe,
- 0xf4, 0x5f, 0xd6, 0x3c, 0x1c, 0x2c, 0x33, 0xbe, 0xb2, 0x89, 0xc7, 0x3e,
- 0x77, 0x6a, 0x89, 0x3d, 0x4c, 0x16, 0x21, 0x3e, 0x53, 0x48, 0xc7, 0xbe,
- 0x3b, 0x53, 0x17, 0xbd, 0xa3, 0x47, 0x04, 0xbe, 0xd4, 0xc2, 0x3c, 0x3c,
- 0x2b, 0x1f, 0x62, 0xbd, 0xaf, 0x6b, 0x24, 0x3d, 0x7b, 0x9c, 0x72, 0xbe,
- 0x5d, 0x9a, 0x7f, 0xbd, 0x7a, 0xec, 0x82, 0x3e, 0x5c, 0xda, 0x82, 0xbb,
- 0x6e, 0x72, 0x0e, 0xbe, 0xa2, 0x7b, 0xef, 0x3d, 0x0f, 0x3f, 0x1b, 0xbd,
- 0x7f, 0xf8, 0x31, 0xbe, 0x84, 0x59, 0xfa, 0x3d, 0x16, 0x0f, 0x15, 0x3e,
- 0x18, 0x60, 0x88, 0x3d, 0xb3, 0x39, 0x5a, 0x3e, 0x3b, 0x86, 0x28, 0xbe,
- 0x69, 0x12, 0x1d, 0xbe, 0xd5, 0x58, 0xf7, 0xbd, 0xcb, 0x95, 0x6a, 0x3e,
- 0x61, 0xf0, 0x87, 0xbe, 0xb3, 0x02, 0x41, 0xbf, 0x12, 0xe7, 0x88, 0xbe,
- 0xf8, 0xdc, 0xbb, 0x3e, 0x59, 0xdc, 0x03, 0xbf, 0x35, 0x91, 0x44, 0x3d,
- 0x06, 0x21, 0x5b, 0xbe, 0x40, 0xf8, 0x22, 0xbd, 0x43, 0x88, 0x39, 0xbe,
- 0x4d, 0xff, 0xa9, 0xbe, 0x90, 0xe6, 0x91, 0xbc, 0xf2, 0xec, 0x5b, 0x3d,
- 0xde, 0x7a, 0x7d, 0xbe, 0x29, 0xec, 0xbc, 0x3e, 0x34, 0xf9, 0xa7, 0xbf,
- 0x4f, 0x2e, 0xe9, 0xbc, 0x30, 0x93, 0x04, 0x3e, 0xda, 0x8f, 0x4b, 0xbe,
- 0x98, 0xba, 0x31, 0xbe, 0xfa, 0xf1, 0x66, 0xbd, 0x5d, 0x11, 0xca, 0xbc,
- 0x05, 0x68, 0x9e, 0x3e, 0x56, 0xf4, 0x91, 0x3d, 0xb6, 0xaf, 0x86, 0xbe,
- 0xde, 0x42, 0xaf, 0xbd, 0x3d, 0x6f, 0xd3, 0xbe, 0x62, 0xb1, 0xa8, 0x3d,
- 0xeb, 0x16, 0xa3, 0x3e, 0xdc, 0x52, 0x14, 0xbf, 0x4d, 0x74, 0x1c, 0xbd,
- 0x28, 0xc7, 0x79, 0x3c, 0x6a, 0x83, 0x56, 0x3e, 0xdb, 0x18, 0x09, 0x3d,
- 0xd3, 0x85, 0x13, 0xbc, 0x06, 0x21, 0x80, 0x3d, 0x3a, 0x8d, 0x43, 0xbe,
- 0xd1, 0xd2, 0x5a, 0x3c, 0xa4, 0x05, 0x40, 0xbe, 0x2a, 0xba, 0xcd, 0xbe,
- 0xa8, 0x44, 0x86, 0x3d, 0x5b, 0x99, 0x68, 0xbd, 0x62, 0x1a, 0xb4, 0x3d,
- 0xfc, 0x3f, 0x1f, 0xbe, 0x2d, 0x37, 0xc9, 0xbd, 0x1d, 0x54, 0x94, 0xbe,
- 0x52, 0xa4, 0x56, 0xbe, 0x30, 0x9b, 0x15, 0xbd, 0x3a, 0xcc, 0x7b, 0xbd,
- 0x30, 0x95, 0x04, 0xbd, 0x31, 0xb5, 0xb9, 0xbf, 0x9c, 0x49, 0xaf, 0xbf,
- 0x49, 0x9c, 0xe5, 0x3d, 0xb5, 0xb4, 0xac, 0x3d, 0x48, 0xc8, 0x16, 0x3e,
- 0xb7, 0x12, 0x37, 0xbd, 0x13, 0xa5, 0x88, 0x3e, 0x1b, 0xe4, 0x0c, 0x3e,
- 0x84, 0x33, 0x25, 0x3e, 0x09, 0xc2, 0x5e, 0x3e, 0xf7, 0x9b, 0x8b, 0xbf,
- 0xaa, 0xf0, 0x66, 0x3e, 0x7b, 0x54, 0xb2, 0x3d, 0xe5, 0xb2, 0x38, 0xbe,
- 0xb0, 0xe4, 0x39, 0x3e, 0x1c, 0xa2, 0x0b, 0xbe, 0x1d, 0x4a, 0x30, 0x3d,
- 0x40, 0x97, 0x56, 0x3e, 0xa2, 0xa5, 0xc5, 0x3d, 0x21, 0xe4, 0x51, 0x3e,
- 0x19, 0xf7, 0xf1, 0x3d, 0xdd, 0xe1, 0xb6, 0x3e, 0xba, 0xa5, 0x8d, 0xbd,
- 0x73, 0xb1, 0x1e, 0xbe, 0x87, 0x85, 0x18, 0x3f, 0xeb, 0x60, 0x41, 0xbd,
- 0xd7, 0xc1, 0x22, 0xbe, 0x78, 0xd7, 0x08, 0xbe, 0xfe, 0x3b, 0x8d, 0xbc,
- 0x5c, 0xba, 0x5a, 0xbe, 0x01, 0x22, 0x06, 0xbf, 0x56, 0x21, 0x71, 0xbe,
- 0x1b, 0xaf, 0xd5, 0x3c, 0x57, 0x2d, 0x3a, 0x3c, 0xe1, 0xdc, 0x29, 0xbe,
- 0x2c, 0xdd, 0xc1, 0x3d, 0x1e, 0xd8, 0xa6, 0xbe, 0xc8, 0xc8, 0x11, 0xbe,
- 0x26, 0xf1, 0xd9, 0xbd, 0x70, 0x21, 0xeb, 0x3d, 0x8b, 0xfa, 0x8e, 0xbe,
- 0xde, 0x74, 0x26, 0xbe, 0x32, 0x00, 0x91, 0x3c, 0x47, 0xeb, 0xa2, 0xbe,
- 0x54, 0xf2, 0xc8, 0x3d, 0xad, 0xa2, 0x31, 0x3d, 0x2a, 0xb1, 0x18, 0x3d,
- 0x8d, 0x79, 0x58, 0x3d, 0xe8, 0x3b, 0x6b, 0xbd, 0x17, 0x93, 0xc2, 0x3e,
- 0xfd, 0x6d, 0x22, 0xbd, 0x07, 0xbc, 0x2a, 0x3d, 0x15, 0xdf, 0x0f, 0x3e,
- 0x6f, 0x4f, 0xb0, 0xbe, 0xf9, 0x64, 0x7b, 0x3e, 0x0b, 0xda, 0x46, 0x3d,
- 0x12, 0x4c, 0x7b, 0xbd, 0x96, 0x62, 0x0b, 0x3d, 0x77, 0xd3, 0x88, 0xbd,
- 0x6e, 0xe6, 0xb5, 0xbd, 0x99, 0xe1, 0x38, 0x3e, 0x78, 0x81, 0x82, 0x3d,
- 0x23, 0x5d, 0x11, 0x3d, 0x88, 0xc3, 0x28, 0xbd, 0x36, 0xc2, 0x20, 0xbf,
- 0x80, 0x5f, 0x85, 0x3f, 0xa6, 0x12, 0xbb, 0xbe, 0xcb, 0xb9, 0x16, 0xbe,
- 0x39, 0x0e, 0x93, 0x3e, 0x47, 0xa6, 0xa6, 0xbe, 0xbc, 0x7c, 0xf7, 0xbc,
- 0xa1, 0x59, 0x77, 0x3f, 0x32, 0x32, 0x9f, 0xbd, 0x92, 0x99, 0xe4, 0xbd,
- 0x5c, 0xff, 0x24, 0xbe, 0x0b, 0xd6, 0x74, 0xbe, 0x9a, 0x50, 0x8d, 0xbd,
- 0x94, 0x42, 0xa2, 0xbb, 0xd3, 0x5e, 0x51, 0xbc, 0xdf, 0x3b, 0x66, 0xbe,
- 0xcd, 0x65, 0xad, 0x3e, 0x82, 0x74, 0x3d, 0xbc, 0x10, 0x7f, 0xda, 0x3d,
- 0xad, 0x82, 0x8f, 0x3d, 0x77, 0xc7, 0x85, 0x3e, 0x87, 0x85, 0x2d, 0x3e,
- 0xa6, 0xac, 0xc8, 0x3d, 0x5b, 0xee, 0x18, 0xbb, 0x00, 0xfd, 0x03, 0xbe,
- 0xac, 0xe1, 0xb9, 0xbd, 0x1c, 0x76, 0xd8, 0x3e, 0xf0, 0xf9, 0x1f, 0xbe,
- 0x81, 0x02, 0x44, 0x3e, 0xbb, 0x29, 0xcd, 0xbd, 0x07, 0x0d, 0x12, 0xbe,
- 0x63, 0x10, 0xce, 0x3d, 0x6e, 0xf0, 0x90, 0x3c, 0xf0, 0x60, 0x8a, 0x3e,
- 0x50, 0xfb, 0x1e, 0xbe, 0x02, 0xe5, 0x63, 0xbd, 0x4a, 0x9c, 0x24, 0x3e,
- 0x06, 0x73, 0xba, 0x3d, 0x43, 0xd2, 0x67, 0x3e, 0xdc, 0xe6, 0x11, 0x3e,
- 0xf3, 0x58, 0xe6, 0xbe, 0xf2, 0xfc, 0x82, 0x3e, 0x76, 0xbf, 0x63, 0xbe,
- 0x98, 0x45, 0x0a, 0xbe, 0x64, 0x15, 0x85, 0xbe, 0x2f, 0x6a, 0x1f, 0x3f,
- 0x6a, 0xe5, 0x41, 0xbe, 0x30, 0x8b, 0xc2, 0x3d, 0xc0, 0x6f, 0x6b, 0xbe,
- 0x92, 0xa2, 0x4e, 0xbd, 0x4b, 0x4f, 0xd7, 0xbd, 0x8e, 0xdb, 0xe8, 0xbd,
- 0xc4, 0x11, 0x61, 0xbb, 0xf7, 0xc7, 0x65, 0x3d, 0x00, 0x25, 0x55, 0xbd,
- 0x00, 0x5c, 0x02, 0x3e, 0xaa, 0x29, 0x99, 0xbd, 0xcb, 0x68, 0x73, 0x3e,
- 0xed, 0xc6, 0x5d, 0xbe, 0x90, 0xb4, 0x78, 0x3e, 0x70, 0xb2, 0xcc, 0x3e,
- 0x46, 0xec, 0x1b, 0x3d, 0x8a, 0xf3, 0xc7, 0x3e, 0x06, 0x1c, 0x52, 0x3d,
- 0xc3, 0x4a, 0x79, 0x3e, 0x46, 0x69, 0xc3, 0xbe, 0xc8, 0xa1, 0x15, 0xbe,
- 0xc5, 0xa0, 0xf2, 0xbe, 0xd7, 0xff, 0x8b, 0xbd, 0xc6, 0x14, 0x1d, 0xbe,
- 0x58, 0xd2, 0x1d, 0x3d, 0xad, 0xc3, 0x2d, 0xbd, 0x38, 0x5a, 0x8c, 0xbe,
- 0xdf, 0x7e, 0x53, 0x3d, 0x40, 0x23, 0xb5, 0x3e, 0x36, 0x25, 0xdc, 0xbe,
- 0x5d, 0xff, 0x6c, 0x3d, 0x46, 0x57, 0x3c, 0x3d, 0x2c, 0xf7, 0x69, 0xbd,
- 0x76, 0x6f, 0x32, 0xbd, 0x5c, 0x3f, 0x5e, 0xbe, 0xc4, 0x72, 0x39, 0xbe,
- 0x2b, 0xeb, 0x57, 0x3e, 0x7c, 0x5a, 0x4d, 0x3e, 0xbc, 0x7b, 0x4e, 0xbe,
- 0x85, 0x90, 0x2f, 0xbe, 0xbe, 0x4d, 0x28, 0xbc, 0x2b, 0x86, 0x19, 0x3d,
- 0xac, 0x80, 0x7a, 0x3d, 0xbd, 0x97, 0x16, 0xbd, 0x24, 0xb9, 0x8e, 0xbd,
- 0x7d, 0x38, 0xbd, 0x3d, 0xcd, 0x55, 0xd6, 0x3e, 0x3b, 0x17, 0x5c, 0xbe,
- 0x2e, 0x98, 0x6d, 0x3c, 0xbb, 0xa3, 0xe4, 0x3e, 0x0a, 0x2c, 0x3e, 0x3e,
- 0xdf, 0x8c, 0xb2, 0x3e, 0x70, 0xd9, 0x82, 0x3e, 0x10, 0xf1, 0x5e, 0x3d,
- 0x9a, 0x03, 0x74, 0x3c, 0x7a, 0xe8, 0x8c, 0x3e, 0x1f, 0x27, 0x36, 0xbc,
- 0x4a, 0x65, 0xb7, 0x3e, 0x72, 0xeb, 0x9a, 0xbe, 0x26, 0x0c, 0x70, 0xbe,
- 0x13, 0x7c, 0x28, 0x3e, 0x31, 0xe8, 0x04, 0x3d, 0x1e, 0x7d, 0x7d, 0xbc,
- 0x6f, 0xc4, 0x9c, 0x3e, 0xa0, 0x13, 0xbd, 0xbd, 0x56, 0xef, 0x47, 0xbe,
- 0x95, 0x80, 0xbb, 0xbd, 0xef, 0xde, 0x01, 0x3e, 0x14, 0x11, 0xec, 0x3c,
- 0x21, 0xaf, 0xe7, 0x3d, 0x5d, 0x3e, 0xbc, 0xbe, 0x53, 0x92, 0x27, 0xbe,
- 0x47, 0x47, 0x82, 0xbe, 0xe0, 0x52, 0xdd, 0x3d, 0x60, 0xa6, 0xa6, 0x3e,
- 0x92, 0x1f, 0xf7, 0x3d, 0xe3, 0xcc, 0x47, 0xbe, 0x86, 0xed, 0x8a, 0xbe,
- 0x10, 0xfb, 0x05, 0xbe, 0x56, 0xc2, 0x62, 0xbe, 0x7d, 0x39, 0x36, 0xbe,
- 0xa1, 0xa7, 0x3f, 0xbd, 0x33, 0xd0, 0x55, 0x3e, 0xa8, 0xf4, 0xaf, 0xbe,
- 0xb6, 0x24, 0x9f, 0x3d, 0x3e, 0x1c, 0x70, 0x3c, 0x38, 0x99, 0xac, 0x3e,
- 0xf5, 0xf5, 0xb7, 0x3d, 0x8b, 0x0e, 0xe2, 0x3d, 0x83, 0x14, 0xe2, 0x3e,
- 0x9e, 0x67, 0x05, 0xbd, 0x3b, 0xcd, 0x2a, 0xbe, 0x16, 0xe7, 0x9c, 0x3c,
- 0x89, 0x59, 0xba, 0x3d, 0x57, 0xcc, 0x80, 0xbe, 0x23, 0x2f, 0x63, 0xbe,
- 0x3e, 0xef, 0x97, 0xbe, 0x16, 0xd4, 0x89, 0xbd, 0xfa, 0xf0, 0xaa, 0xbb,
- 0x5c, 0x07, 0x32, 0xbe, 0x1c, 0x18, 0xad, 0xbe, 0xd3, 0x2e, 0x1b, 0x3e,
- 0xbb, 0x96, 0x6e, 0xbe, 0xb9, 0x49, 0x25, 0xbe, 0x3f, 0x48, 0x81, 0x3d,
- 0x6e, 0x4a, 0x2d, 0x3d, 0x4e, 0x84, 0xc7, 0xbd, 0xd6, 0x33, 0x01, 0x3d,
- 0xc7, 0x37, 0xf0, 0x3c, 0x37, 0x80, 0x00, 0xbe, 0x0a, 0xe6, 0x48, 0xbe,
- 0xdd, 0x7e, 0xcb, 0xbd, 0x6c, 0x86, 0xb0, 0x3d, 0xcb, 0x43, 0x6f, 0x3e,
- 0xe3, 0x40, 0xf7, 0xbd, 0x9e, 0xb2, 0x96, 0xbd, 0x13, 0xef, 0xf0, 0xbc,
- 0x21, 0xa7, 0x8d, 0x3e, 0x16, 0xdd, 0x54, 0x3e, 0x4a, 0x7d, 0xf6, 0xbd,
- 0x91, 0xc6, 0x3b, 0x3e, 0x9f, 0xf1, 0x84, 0xbe, 0x61, 0x3c, 0x0f, 0x3d,
- 0xa5, 0xba, 0xe9, 0x3d, 0xfa, 0x27, 0x1d, 0x3d, 0x23, 0x62, 0x20, 0xbe,
- 0x2f, 0x26, 0xd2, 0x3d, 0x48, 0x56, 0x18, 0x3d, 0x9b, 0x4f, 0x0a, 0xbe,
- 0xe8, 0xcf, 0x04, 0x3e, 0xeb, 0x74, 0xed, 0x3d, 0x3d, 0x63, 0xa3, 0x3e,
- 0x92, 0x57, 0x44, 0xbd, 0xd8, 0xd9, 0x5f, 0xbe, 0x80, 0x77, 0xe1, 0xbe,
- 0x54, 0x86, 0x15, 0xbe, 0xb3, 0x3a, 0xfb, 0xbd, 0xdb, 0x60, 0x67, 0xbe,
- 0xf5, 0x71, 0x9c, 0xbd, 0x10, 0xb8, 0xb6, 0xbd, 0x5f, 0xa9, 0x16, 0x3c,
- 0x66, 0x9c, 0x95, 0xbd, 0xd4, 0x35, 0x45, 0x3e, 0x5c, 0x18, 0xe6, 0xbc,
- 0x96, 0xde, 0xbb, 0x3d, 0x12, 0x5d, 0x42, 0x3c, 0x16, 0x13, 0x08, 0xbd,
- 0x74, 0xa2, 0x0a, 0xbe, 0x89, 0x9b, 0x55, 0x3e, 0xf0, 0x52, 0xe2, 0xbe,
- 0xf9, 0xa5, 0x4c, 0x3e, 0x6c, 0x1f, 0xa3, 0xbe, 0xc0, 0x1f, 0x4d, 0x3e,
- 0x6c, 0x15, 0xb9, 0xbd, 0x6a, 0x94, 0xb4, 0xbd, 0x93, 0xc8, 0x44, 0xbe,
- 0xe6, 0x8f, 0x9e, 0xbd, 0x8b, 0xc0, 0x05, 0x3e, 0x22, 0x7d, 0xb4, 0x3d,
- 0x6b, 0xc1, 0x1e, 0xbe, 0x96, 0xfb, 0xf0, 0xbe, 0x70, 0x32, 0x89, 0xbe,
- 0x08, 0x93, 0x0d, 0x3e, 0xf7, 0x71, 0x49, 0xbe, 0x29, 0x22, 0xb1, 0xbd,
- 0xcc, 0x60, 0x88, 0x3e, 0xa0, 0x1a, 0x7f, 0x3c, 0x8b, 0xe3, 0x84, 0x3d,
- 0xe8, 0xa4, 0x31, 0xbe, 0xf9, 0x23, 0x1a, 0xbd, 0x7b, 0xec, 0x03, 0x3d,
- 0xe4, 0x55, 0x86, 0xbc, 0xf2, 0x1e, 0x51, 0x3e, 0x71, 0x24, 0xc1, 0xbd,
- 0xad, 0x8e, 0x1a, 0xbe, 0x15, 0xab, 0xb3, 0xbe, 0xcd, 0x6e, 0x8b, 0x3e,
- 0xd0, 0x98, 0x25, 0xbe, 0x27, 0xca, 0x8d, 0xbe, 0xf6, 0xbc, 0x07, 0xbe,
- 0xce, 0xa8, 0xbe, 0x3d, 0xec, 0x29, 0x68, 0xbe, 0xa2, 0xe4, 0x41, 0xbe,
- 0x2e, 0x8a, 0x4b, 0xbe, 0xfe, 0x21, 0xde, 0xba, 0xb2, 0x2e, 0xc2, 0xbd,
- 0xb2, 0x17, 0x15, 0x3d, 0x21, 0x2a, 0x1f, 0xbb, 0x75, 0xb7, 0x9e, 0xbd,
- 0x1c, 0x1e, 0x8d, 0x3c, 0x18, 0x6e, 0xea, 0x3d, 0x9e, 0x62, 0x72, 0x3d,
- 0xf5, 0x33, 0x94, 0xbc, 0x01, 0x6e, 0xb3, 0xbc, 0x87, 0x64, 0x17, 0x3c,
- 0xd8, 0xdc, 0xdf, 0xbd, 0x17, 0xc2, 0xc5, 0xbd, 0x35, 0x8b, 0x26, 0xbe,
- 0x9d, 0x5a, 0xb1, 0xbe, 0xe1, 0x1f, 0xaf, 0xbd, 0x62, 0x2d, 0x35, 0xbe,
- 0x96, 0x30, 0xbf, 0xbd, 0xd7, 0x6b, 0x1d, 0xbe, 0x9a, 0x60, 0xb7, 0x3d,
- 0xb9, 0x63, 0x1a, 0xbd, 0xa6, 0x58, 0x4e, 0x3d, 0xb5, 0x8a, 0x4d, 0x3d,
- 0x1e, 0x5c, 0x48, 0xbe, 0x1f, 0xcd, 0x35, 0x3e, 0xe6, 0x84, 0x35, 0xbe,
- 0xa1, 0xd7, 0xb8, 0xbb, 0x27, 0x9f, 0xb7, 0xbc, 0x62, 0xcc, 0x17, 0x3e,
- 0x37, 0x89, 0x8b, 0x3e, 0x83, 0x61, 0xb4, 0x3e, 0xa1, 0x03, 0x12, 0xbf,
- 0xc7, 0x91, 0xb5, 0x3d, 0xf5, 0x56, 0x21, 0xbc, 0x12, 0x17, 0xd7, 0xbd,
- 0x5e, 0x80, 0xa2, 0x3e, 0xa1, 0x2d, 0x01, 0x3e, 0x18, 0x83, 0x1d, 0xbd,
- 0x66, 0x4d, 0x0b, 0x3e, 0xfb, 0x6e, 0x91, 0xbe, 0x9e, 0xfa, 0x8d, 0xbd,
- 0xe9, 0x47, 0x78, 0xbc, 0xa9, 0x44, 0xdb, 0x3d, 0x15, 0xdb, 0xe9, 0xbd,
- 0x7d, 0x47, 0xb4, 0xbd, 0xa0, 0x2a, 0xa5, 0xbd, 0x96, 0x9c, 0x15, 0xbe,
- 0x87, 0xbe, 0x1a, 0x3e, 0x1a, 0xfe, 0xcc, 0xbd, 0x3d, 0xae, 0x66, 0xbd,
- 0xe4, 0xaa, 0xcf, 0x3d, 0xed, 0xc7, 0xe2, 0xbe, 0x90, 0x84, 0x95, 0xbe,
- 0x74, 0x18, 0x91, 0xbd, 0x64, 0x47, 0x40, 0xbd, 0x4e, 0x0b, 0x5b, 0xbe,
- 0x15, 0x14, 0xc8, 0x3d, 0x5b, 0xed, 0xa4, 0xbd, 0xe7, 0xd1, 0xac, 0xbc,
- 0x01, 0x22, 0xe0, 0xbc, 0x0f, 0xb2, 0x90, 0xbe, 0xa4, 0x38, 0x95, 0xbd,
- 0x80, 0x9c, 0xa7, 0x3d, 0xa4, 0x82, 0x96, 0x3d, 0xa8, 0xff, 0x80, 0x3a,
- 0x84, 0xf6, 0xa5, 0x39, 0x49, 0x1a, 0x89, 0x3e, 0xee, 0x56, 0xf1, 0xbe,
- 0x19, 0xc6, 0xc8, 0xbd, 0x81, 0x9e, 0x83, 0xbc, 0x27, 0x37, 0x45, 0x3e,
- 0x42, 0xa0, 0x56, 0xbe, 0xdd, 0x5f, 0xbb, 0xbd, 0x17, 0x32, 0xb6, 0xbd,
- 0xac, 0xf2, 0x8c, 0xbe, 0x72, 0x8e, 0xcf, 0xbe, 0xc9, 0x2b, 0xbd, 0x3e,
- 0xf6, 0xee, 0xbb, 0xbe, 0x61, 0x59, 0x9b, 0xbe, 0xe4, 0xe3, 0xb5, 0xbe,
- 0x12, 0x0d, 0xfe, 0xbd, 0xfd, 0xeb, 0xd4, 0x3e, 0xa6, 0x52, 0xcf, 0xbd,
- 0xc4, 0x84, 0x8f, 0xbd, 0x08, 0x22, 0x9e, 0x3d, 0x61, 0xbb, 0x7b, 0x3d,
- 0x66, 0x84, 0x46, 0x3c, 0xbf, 0x28, 0x17, 0xbe, 0x34, 0xef, 0x95, 0x3c,
- 0xaa, 0x76, 0xc6, 0x3c, 0xe2, 0xf9, 0x6c, 0x3e, 0x4b, 0xc7, 0x00, 0xbe,
- 0x0e, 0xb8, 0xa7, 0xbe, 0xb4, 0x9c, 0x12, 0xbe, 0x90, 0x4d, 0x1d, 0x3e,
- 0x7e, 0x47, 0xa8, 0xbc, 0x41, 0xf1, 0x47, 0xbe, 0x32, 0x2b, 0x60, 0xbe,
- 0xce, 0x6e, 0xd7, 0xbd, 0xf5, 0x36, 0x4f, 0xbe, 0x58, 0xe0, 0xcf, 0xbb,
- 0x8f, 0x35, 0xb8, 0x3d, 0xe2, 0x99, 0x00, 0x3e, 0x04, 0x69, 0x9d, 0xbe,
- 0x6e, 0xbb, 0x13, 0xbe, 0xb7, 0x47, 0x03, 0x3e, 0x69, 0x0f, 0xf6, 0xbd,
- 0x53, 0x47, 0x26, 0x3e, 0x15, 0x47, 0x98, 0xbd, 0x24, 0x1b, 0x22, 0xbe,
- 0xc9, 0xe6, 0x36, 0x3d, 0x66, 0x1a, 0x55, 0x3d, 0x52, 0x0d, 0x2a, 0xbd,
- 0x0c, 0x47, 0x80, 0x3d, 0xda, 0x76, 0xbc, 0x3e, 0x96, 0x0b, 0x4a, 0x3e,
- 0x1f, 0x75, 0x8d, 0x3d, 0xf8, 0xd9, 0xf7, 0x3d, 0xa3, 0xc6, 0x69, 0x3d,
- 0xfd, 0x6a, 0x04, 0xbe, 0xe9, 0x25, 0xa9, 0xbe, 0xfe, 0xfc, 0xcf, 0x3d,
- 0xeb, 0x99, 0x30, 0xbd, 0xac, 0x8a, 0x81, 0xbc, 0x7f, 0xe7, 0x86, 0x3e,
- 0x3a, 0xf1, 0xa4, 0x3d, 0x32, 0x8c, 0x33, 0xbe, 0xda, 0x22, 0xa0, 0x3d,
- 0xb3, 0xf3, 0xba, 0xbc, 0x27, 0x33, 0x8b, 0x3e, 0xb9, 0x67, 0x22, 0xbe,
- 0x4f, 0xf0, 0x38, 0x3e, 0x59, 0x8c, 0xab, 0x3e, 0x76, 0x6e, 0xa1, 0xbe,
- 0xfa, 0x6a, 0x2b, 0x3e, 0x4d, 0x7a, 0xc8, 0x3d, 0xac, 0x03, 0xc0, 0xbd,
- 0xbd, 0x59, 0x57, 0xbe, 0x73, 0xb9, 0xde, 0x3e, 0x7d, 0x3b, 0x3e, 0x3e,
- 0x2a, 0x1b, 0x00, 0xbf, 0x86, 0xdc, 0xe3, 0xbe, 0xde, 0x94, 0xaf, 0x3d,
- 0x54, 0xad, 0x12, 0x3f, 0x4d, 0x94, 0xd7, 0xbe, 0x9f, 0x4c, 0x8d, 0xbc,
- 0x21, 0x77, 0x9e, 0xbe, 0x0a, 0xbe, 0x47, 0xbd, 0xd0, 0x30, 0x8f, 0xbd,
- 0x03, 0xfe, 0x82, 0xbc, 0x7f, 0x00, 0xf7, 0x3e, 0xd2, 0x27, 0x25, 0x3f,
- 0x52, 0x2f, 0x50, 0x3d, 0x58, 0x9f, 0xc2, 0x3e, 0x3e, 0x98, 0x49, 0x3f,
- 0x6f, 0x95, 0xd4, 0x3c, 0x06, 0xdc, 0x4b, 0x3d, 0xe3, 0x5b, 0x6c, 0x3e,
- 0xf5, 0x5b, 0x84, 0x3e, 0x56, 0x7b, 0x0b, 0xbf, 0x9a, 0x6d, 0x0d, 0x3e,
- 0xa7, 0xad, 0x39, 0xbe, 0x32, 0xdc, 0xf4, 0xbd, 0xee, 0x79, 0x7b, 0x3a,
- 0xa8, 0xe6, 0x81, 0xbd, 0xfe, 0xdb, 0x8e, 0x3d, 0xd7, 0x4b, 0x86, 0xbd,
- 0x8a, 0x9b, 0x03, 0xbe, 0x59, 0x7a, 0x23, 0xbe, 0x59, 0xb3, 0xea, 0xbd,
- 0x4a, 0x82, 0x0f, 0x3e, 0x61, 0xec, 0x99, 0x3b, 0x42, 0x35, 0x7c, 0x3e,
- 0x01, 0xb7, 0x9c, 0xbe, 0x5c, 0x51, 0x65, 0x3e, 0x2e, 0x4d, 0xc2, 0xbd,
- 0xf5, 0xdb, 0xba, 0xbe, 0x98, 0x4e, 0x93, 0x3e, 0x5d, 0x3b, 0x75, 0xbd,
- 0xb1, 0xfb, 0x1e, 0xbe, 0xc2, 0xfd, 0x8b, 0xbc, 0x1d, 0x92, 0x79, 0xbe,
- 0xd1, 0x87, 0x6b, 0x3e, 0x3a, 0xd3, 0xa3, 0xbe, 0xe1, 0x16, 0x5d, 0xbd,
- 0x1b, 0xa5, 0xfe, 0x3e, 0xe0, 0xd9, 0xb0, 0x3b, 0xd6, 0x07, 0x0d, 0xbf,
- 0x6e, 0xc8, 0xc3, 0x3d, 0x7f, 0x84, 0x10, 0xbe, 0xec, 0x34, 0xe4, 0x3e,
- 0xf6, 0xec, 0x12, 0xbd, 0x5d, 0xbc, 0x8b, 0xbe, 0xd0, 0x08, 0x28, 0xbe,
- 0x23, 0xa7, 0x28, 0xbc, 0x0f, 0xfa, 0x3b, 0x3e, 0xc2, 0x2a, 0x1b, 0x3d,
- 0xdf, 0xc7, 0x4a, 0xbe, 0x6b, 0xf8, 0xec, 0x3e, 0x56, 0x95, 0x53, 0xbe,
- 0xa8, 0xe9, 0x59, 0x3c, 0x14, 0x6c, 0x4c, 0x3c, 0x9b, 0x63, 0x14, 0xbe,
- 0xc7, 0x9b, 0x62, 0x3d, 0x23, 0x11, 0x95, 0xbe, 0x74, 0x12, 0xd5, 0xbc,
- 0x00, 0x1a, 0x19, 0x3f, 0x3a, 0x26, 0x0a, 0xbe, 0xbe, 0x8e, 0xb1, 0x3e,
- 0x1f, 0x0c, 0xf5, 0xbe, 0xe0, 0x48, 0xdb, 0xbd, 0x06, 0x3e, 0xd1, 0xbd,
- 0x89, 0x51, 0x0e, 0x3e, 0x01, 0x88, 0xda, 0xbd, 0x5f, 0x04, 0x96, 0xbd,
- 0xfb, 0x08, 0xbc, 0x3d, 0x11, 0xc4, 0xb3, 0x3e, 0xdf, 0x52, 0x79, 0xbe,
- 0x87, 0x7c, 0x31, 0xbf, 0x63, 0xf1, 0xbc, 0x3e, 0xf1, 0xf9, 0x1c, 0xbe,
- 0x36, 0x15, 0xa1, 0x3d, 0x83, 0xdd, 0x01, 0xbe, 0x5a, 0xeb, 0xa3, 0x3d,
- 0x3f, 0xb3, 0x9b, 0x3c, 0x0c, 0xbc, 0x55, 0x3e, 0x3e, 0x87, 0x91, 0xbe,
- 0x79, 0xa3, 0xbb, 0xbd, 0x73, 0xc4, 0x42, 0x3d, 0xde, 0xc7, 0x17, 0xbc,
- 0x14, 0x6a, 0x03, 0xbe, 0xfb, 0x8b, 0xa5, 0x3d, 0x0a, 0xd4, 0x49, 0x3e,
- 0xc0, 0xde, 0x11, 0xbe, 0xb8, 0x18, 0x0d, 0x3d, 0xe6, 0x8c, 0xcc, 0x3c,
- 0x71, 0x23, 0x5c, 0x3d, 0x79, 0x4e, 0x73, 0x3d, 0x25, 0xc5, 0x33, 0xbe,
- 0x14, 0xde, 0x47, 0x3d, 0xce, 0x03, 0x12, 0xbe, 0xaa, 0xe9, 0xf1, 0x3a,
- 0x0e, 0xc1, 0x18, 0x3c, 0x34, 0x70, 0x70, 0x3e, 0x9b, 0x4a, 0x28, 0xbc,
- 0xd0, 0x8e, 0x42, 0xbe, 0x99, 0xee, 0xf2, 0x3d, 0xef, 0x58, 0x1f, 0x3c,
- 0x93, 0x5d, 0xa7, 0xbd, 0x96, 0x50, 0xce, 0x3d, 0x52, 0xcc, 0x24, 0xbe,
- 0xb1, 0xc6, 0x33, 0xbd, 0x63, 0x09, 0x41, 0xbe, 0x8c, 0xc5, 0x41, 0xbd,
- 0x09, 0x54, 0xc7, 0xbd, 0x59, 0xd5, 0x41, 0xbc, 0x2c, 0x3f, 0x51, 0x3e,
- 0xba, 0x39, 0x5f, 0x3d, 0x38, 0xf9, 0x20, 0xbe, 0x9d, 0x07, 0x99, 0xbe,
- 0x3b, 0x07, 0xa1, 0xbd, 0x58, 0x0c, 0x27, 0x3e, 0x66, 0x54, 0x14, 0xbd,
- 0x19, 0xb3, 0x80, 0xbd, 0xc8, 0xb2, 0xea, 0xbc, 0x98, 0x29, 0xc5, 0x3c,
- 0x33, 0x55, 0xa7, 0xbd, 0x4d, 0x5d, 0x94, 0xbd, 0xcd, 0xbb, 0x8b, 0xbe,
- 0xc7, 0x18, 0xca, 0xbd, 0x39, 0x35, 0xd8, 0x3d, 0x2e, 0x54, 0x21, 0xbf,
- 0x8f, 0xfc, 0x8b, 0xbd, 0xd9, 0x6a, 0x01, 0xbe, 0x0e, 0xde, 0x3d, 0xbd,
- 0x05, 0xec, 0xbd, 0xbd, 0x21, 0x82, 0xa3, 0xbb, 0xf8, 0x1d, 0x86, 0x3d,
- 0xb7, 0xab, 0x21, 0xbc, 0xad, 0x30, 0x13, 0x3e, 0xbc, 0x18, 0xdb, 0xbd,
- 0xfb, 0xe8, 0x60, 0x3d, 0x17, 0x5f, 0xf3, 0xbd, 0xb1, 0xd9, 0x5d, 0xbe,
- 0x7d, 0x96, 0x62, 0xbd, 0x71, 0x8e, 0x94, 0xbc, 0xef, 0xd1, 0x47, 0xbe,
- 0x15, 0xd7, 0x83, 0xbe, 0x04, 0xea, 0x7d, 0xbd, 0x4c, 0xb3, 0x1b, 0xbf,
- 0x29, 0xd0, 0x6a, 0xbe, 0x87, 0x2d, 0xe1, 0xbd, 0x53, 0x05, 0x9e, 0xbd,
- 0x9a, 0xad, 0x12, 0xbd, 0x49, 0x34, 0x7b, 0x3c, 0x57, 0xf6, 0x3a, 0xbe,
- 0x67, 0x52, 0x5d, 0x3d, 0xb7, 0xc9, 0x3d, 0x3e, 0xc0, 0x15, 0x2a, 0xbe,
- 0x6a, 0xf7, 0x8a, 0xbd, 0xfb, 0xea, 0xb7, 0xbc, 0x9b, 0xa2, 0xa9, 0x3c,
- 0xd8, 0xb8, 0x3b, 0x3c, 0x63, 0xed, 0x65, 0xbe, 0xae, 0x53, 0xa3, 0xbd,
- 0xb8, 0xac, 0x4e, 0xbd, 0x41, 0x0e, 0xc6, 0xbc, 0x70, 0x2c, 0xb3, 0xbe,
- 0x95, 0xd8, 0x92, 0x3e, 0x66, 0x8c, 0xd7, 0xbd, 0x31, 0x65, 0x8f, 0x3c,
- 0xa0, 0x06, 0xbc, 0xbd, 0xc8, 0xd4, 0x16, 0x3b, 0xc1, 0x60, 0x0b, 0xbe,
- 0xdd, 0xb8, 0x48, 0x3d, 0x9c, 0x7d, 0x96, 0x3d, 0x4f, 0x21, 0xcf, 0xbd,
- 0x8e, 0xca, 0x59, 0x3d, 0x05, 0x42, 0x0b, 0x3e, 0x63, 0xae, 0x28, 0xbd,
- 0x7c, 0x08, 0xf4, 0x3d, 0xbd, 0x6a, 0x43, 0x3e, 0x90, 0x2e, 0x7c, 0xbd,
- 0x67, 0xb3, 0x0d, 0x3d, 0xc9, 0xb0, 0xbb, 0xbe, 0xee, 0xb1, 0x1d, 0xbd,
- 0x3b, 0x2a, 0x22, 0xbc, 0xfc, 0x2a, 0x15, 0xbc, 0x6a, 0x67, 0xa8, 0x3b,
- 0x2d, 0x77, 0x0c, 0x3e, 0x08, 0xd6, 0x6a, 0x3e, 0x26, 0x9a, 0x45, 0xbe,
- 0xc9, 0xde, 0xb0, 0x3e, 0x80, 0xbb, 0xc2, 0x3d, 0xde, 0x87, 0xf2, 0xbd,
- 0x20, 0x28, 0xf0, 0x3e, 0x89, 0xc6, 0x56, 0x3e, 0xb6, 0x5c, 0xb6, 0x3e,
- 0x90, 0xa8, 0xa1, 0x3c, 0xaf, 0x7d, 0xcd, 0x3e, 0x2f, 0x86, 0x76, 0x3c,
- 0x31, 0xe4, 0x76, 0xbd, 0xf3, 0xa5, 0xfe, 0x3e, 0x70, 0xf4, 0x65, 0xbe,
- 0xe7, 0xf4, 0x20, 0xbe, 0xe2, 0xfc, 0x5d, 0xbe, 0xcf, 0x9a, 0xba, 0x3d,
- 0x78, 0xb8, 0xf6, 0xbd, 0xe3, 0x65, 0xff, 0xbe, 0xda, 0xd8, 0x9e, 0xbe,
- 0xb8, 0x5e, 0xe2, 0x3d, 0x03, 0xdb, 0x08, 0xbe, 0xba, 0x0c, 0xb4, 0xbe,
- 0xaf, 0x65, 0x17, 0x3d, 0x4e, 0x2b, 0x9b, 0xbe, 0x1c, 0x0a, 0x2c, 0xbe,
- 0x3a, 0x1d, 0xfe, 0x3b, 0x61, 0xab, 0x7f, 0x3d, 0x01, 0xe8, 0x5d, 0xbe,
- 0x40, 0x32, 0x2b, 0xbe, 0xe4, 0x47, 0x2c, 0xbb, 0x5d, 0xf1, 0x0c, 0xbe,
- 0x89, 0x74, 0x5d, 0x3d, 0xb1, 0x0f, 0x8d, 0x3d, 0x94, 0x63, 0x02, 0xbe,
- 0xeb, 0xb9, 0xaf, 0xbd, 0x30, 0xc9, 0x8d, 0xbe, 0xdc, 0x5b, 0x02, 0x3f,
- 0x4e, 0xcb, 0xae, 0xbc, 0x46, 0x1d, 0xf7, 0xbb, 0xad, 0xa5, 0xca, 0xbd,
- 0x3e, 0xe6, 0x7a, 0xbe, 0xbe, 0xf3, 0xec, 0x3e, 0xce, 0x8d, 0x99, 0x3d,
- 0xf5, 0xeb, 0x07, 0xbc, 0xe9, 0xc6, 0x5c, 0x3e, 0xc9, 0x90, 0xd7, 0xbd,
- 0xb3, 0xc3, 0x15, 0x3d, 0x09, 0xa6, 0x13, 0x3e, 0xb8, 0x7c, 0x2e, 0xbd,
- 0xcb, 0xfa, 0xc8, 0xba, 0x88, 0x25, 0x91, 0xbd, 0x81, 0xc3, 0x29, 0xbf,
- 0x74, 0xd8, 0x8c, 0x3f, 0x40, 0x0d, 0xb9, 0xbe, 0xef, 0x9e, 0xd5, 0xbe,
- 0x66, 0xe6, 0xb0, 0x3d, 0xf8, 0x10, 0x00, 0xbf, 0x1c, 0x05, 0x32, 0xbe,
- 0xe5, 0x7a, 0x4a, 0x3f, 0x9c, 0xe4, 0xc3, 0xbd, 0x04, 0xc2, 0xd2, 0x3d,
- 0xca, 0xff, 0x97, 0xbe, 0x63, 0x7a, 0x50, 0xbe, 0xd3, 0x34, 0x0f, 0x3d,
- 0xf9, 0xa4, 0xc9, 0xbd, 0xd4, 0x0c, 0x91, 0xbd, 0x5d, 0x8b, 0xf0, 0x3b,
- 0xb0, 0x95, 0x04, 0x3f, 0x32, 0x46, 0xb8, 0x3c, 0xe3, 0xbf, 0x1d, 0x3e,
- 0x63, 0x35, 0x8e, 0x3d, 0x6e, 0x83, 0x7f, 0x3e, 0xba, 0xca, 0xda, 0x3e,
- 0x52, 0x78, 0x87, 0xbd, 0xbe, 0x4a, 0x23, 0xbe, 0xb0, 0xfc, 0x2e, 0xbe,
- 0xa4, 0xc2, 0xad, 0xbd, 0x0a, 0x34, 0xe6, 0x3e, 0x4b, 0x91, 0x64, 0xbe,
- 0x66, 0x80, 0x5e, 0x3d, 0xa9, 0xb6, 0x82, 0x3d, 0x40, 0x24, 0x34, 0x3d,
- 0xcf, 0xc1, 0xee, 0x3d, 0x97, 0xab, 0xde, 0x3d, 0x71, 0x6d, 0x3f, 0x3e,
- 0xb0, 0xf9, 0x9c, 0xbd, 0x71, 0x08, 0x76, 0xbd, 0x46, 0xb8, 0x4e, 0x3e,
- 0xf3, 0x74, 0xc1, 0x3d, 0x94, 0xf1, 0xdb, 0x3c, 0x5e, 0x18, 0x43, 0xbd,
- 0xa7, 0xb1, 0x06, 0xbf, 0x7b, 0x92, 0x49, 0x3e, 0x05, 0x97, 0x47, 0xbe,
- 0xaa, 0x8a, 0x6e, 0xbd, 0xfb, 0x7b, 0x44, 0xbe, 0xfc, 0x5b, 0x03, 0x3f,
- 0xdc, 0x16, 0x54, 0xbe, 0x1e, 0x3d, 0xb4, 0xbd, 0x66, 0xfe, 0x67, 0xbe,
- 0x0c, 0x83, 0xa7, 0xbb, 0x2b, 0xc1, 0x0a, 0xbe, 0x94, 0xda, 0x5d, 0xbe,
- 0x78, 0x34, 0x16, 0x3e, 0x3f, 0x41, 0x84, 0xbe, 0x52, 0x67, 0x27, 0xbd,
- 0x37, 0x13, 0x3b, 0x3d, 0xc2, 0x11, 0x5e, 0xbd, 0xad, 0x12, 0x92, 0xbc,
- 0x34, 0x66, 0x17, 0x3e, 0x45, 0x8f, 0x1b, 0xbd, 0x85, 0x03, 0xa4, 0xbd,
- 0x19, 0x89, 0x02, 0x3e, 0xc8, 0x96, 0xdf, 0x3d, 0x22, 0xa0, 0x82, 0xbe,
- 0x1b, 0x41, 0x1b, 0x3e, 0xac, 0x3c, 0x94, 0xbe, 0x70, 0xcf, 0x15, 0x3e,
- 0x6a, 0x0b, 0x49, 0x3e, 0x27, 0x60, 0x41, 0xbd, 0x30, 0x14, 0x8a, 0xbe,
- 0x2d, 0xcc, 0x54, 0x3e, 0x94, 0x7a, 0x23, 0xbd, 0x0c, 0x88, 0x6d, 0xbe,
- 0x72, 0x68, 0x0b, 0x3e, 0xcb, 0xd8, 0xe2, 0x3d, 0xed, 0x2d, 0x75, 0x3e,
- 0xc2, 0xd4, 0xb5, 0x3c, 0x0c, 0xb5, 0x0c, 0xbe, 0xba, 0x09, 0xf5, 0xbe,
- 0xe1, 0x03, 0xdd, 0x3a, 0xd0, 0x2b, 0xc1, 0xbd, 0x63, 0x64, 0x8b, 0xbe,
- 0xa7, 0x5f, 0xcb, 0xbc, 0x6a, 0x09, 0xbf, 0x3c, 0x89, 0x22, 0x7b, 0xbc,
- 0xf0, 0x01, 0x2c, 0xbe, 0x0b, 0x0d, 0x2b, 0x3e, 0x89, 0x1a, 0xf5, 0x3d,
- 0x26, 0x5f, 0xa9, 0xbd, 0xcb, 0x62, 0xc5, 0xbc, 0xb1, 0x43, 0x01, 0xbe,
- 0xee, 0x99, 0x2d, 0xbe, 0x48, 0x80, 0x12, 0x3e, 0x19, 0xcc, 0x92, 0xbd,
- 0x9d, 0x7c, 0x97, 0x3e, 0x7f, 0x81, 0x7d, 0xbe, 0x64, 0x1a, 0x47, 0x3c,
- 0x78, 0x4f, 0x4a, 0x3d, 0xae, 0x23, 0xbd, 0xbd, 0xa8, 0x4c, 0xf3, 0x3b,
- 0x32, 0xe8, 0x64, 0xbe, 0x65, 0x43, 0x5e, 0xbd, 0x69, 0xd9, 0x56, 0x3e,
- 0x81, 0x66, 0xcd, 0xbd, 0xc8, 0x8d, 0xb7, 0xbe, 0x72, 0x8e, 0xb5, 0xbe,
- 0x0b, 0xd2, 0xe5, 0x3c, 0x7a, 0xf7, 0x50, 0x3b, 0x7b, 0xc6, 0x40, 0xbe,
- 0xb4, 0xe2, 0xf0, 0x3d, 0x7f, 0x47, 0x01, 0xbe, 0x35, 0xca, 0x65, 0xbc,
- 0x45, 0x71, 0x17, 0xbd, 0x21, 0x3d, 0xe7, 0xbb, 0x68, 0x3c, 0xaf, 0xbd,
- 0x55, 0x45, 0x23, 0x3d, 0x47, 0xfe, 0xcf, 0xbd, 0x0a, 0x98, 0x39, 0xbe,
- 0xad, 0x0b, 0xd7, 0x3d, 0xb8, 0xa6, 0x13, 0xbe, 0x15, 0x98, 0x4f, 0x3c,
- 0xf7, 0x8c, 0x8f, 0xbb, 0x07, 0x05, 0x0f, 0xbd, 0xa3, 0x28, 0x94, 0x3c,
- 0x6e, 0x18, 0x96, 0x3c, 0xbc, 0xa6, 0x69, 0xbe, 0xab, 0x1b, 0x84, 0xbc,
- 0x45, 0x40, 0xf3, 0xbd, 0xd3, 0x9c, 0x42, 0xbe, 0xbd, 0xbe, 0x1e, 0xbe,
- 0x2f, 0x12, 0x0b, 0xbe, 0x09, 0xb9, 0x00, 0x3e, 0x77, 0xb1, 0xa4, 0xbd,
- 0xd0, 0x37, 0xed, 0x3d, 0xde, 0xae, 0xa4, 0xbd, 0xcd, 0xeb, 0x08, 0xbe,
- 0xf9, 0x8a, 0x68, 0xbd, 0xcb, 0x28, 0x5e, 0xbd, 0x75, 0xdf, 0x1e, 0x3e,
- 0xa6, 0x9d, 0x8e, 0xbd, 0x81, 0x19, 0x8f, 0xbd, 0x7e, 0xc4, 0xa0, 0x3d,
- 0x23, 0x81, 0x83, 0xbe, 0xbb, 0x4f, 0xc3, 0x3b, 0xf5, 0xad, 0xd9, 0xbd,
- 0x0e, 0x78, 0xc2, 0xbd, 0xd6, 0x5d, 0xa5, 0xbe, 0xf9, 0xa1, 0xb7, 0x3b,
- 0x22, 0xe5, 0xeb, 0xbd, 0xc0, 0x5d, 0x1a, 0x3d, 0xbb, 0xcb, 0x2b, 0x3c,
- 0xfe, 0x9d, 0xa4, 0xbe, 0x99, 0x46, 0x8e, 0x3e, 0xfd, 0xb1, 0x4a, 0xbe,
- 0xfc, 0x9c, 0xaf, 0xbd, 0x35, 0x7e, 0x4c, 0xbe, 0xbe, 0xe1, 0x38, 0x3e,
- 0xe7, 0x12, 0xed, 0x3e, 0x2c, 0xf4, 0xe9, 0x3d, 0x2e, 0xd1, 0x24, 0xbf,
- 0x9a, 0xc9, 0x54, 0xbd, 0xc1, 0xa1, 0x89, 0xbe, 0x4d, 0x1d, 0x89, 0xbd,
- 0xdf, 0xfb, 0xb7, 0x3e, 0xe5, 0x95, 0xc8, 0xbd, 0x65, 0x41, 0x6f, 0xbe,
- 0xc9, 0x4f, 0x90, 0x3e, 0x5f, 0x4e, 0xe2, 0xbe, 0xc7, 0x3f, 0x60, 0xbe,
- 0xf4, 0x53, 0x07, 0x3e, 0x84, 0xf0, 0x20, 0xbe, 0x91, 0x31, 0x47, 0xbc,
- 0x18, 0x21, 0x2c, 0xbe, 0xda, 0x98, 0x45, 0xbc, 0xcd, 0xde, 0x97, 0xbe,
- 0x3f, 0x18, 0x08, 0x3e, 0x18, 0x81, 0x25, 0xbc, 0x45, 0x2f, 0xb3, 0xba,
- 0x27, 0x6b, 0xef, 0x3d, 0xfd, 0xa6, 0xf1, 0xbe, 0x3e, 0xf3, 0x38, 0xbe,
- 0x63, 0xe0, 0x09, 0x3d, 0x0e, 0xff, 0x30, 0xbc, 0xda, 0x4d, 0x05, 0xbe,
- 0x4d, 0x9a, 0xfe, 0x3c, 0xd6, 0xf9, 0x2d, 0xbe, 0xc9, 0x40, 0x7a, 0x3d,
- 0x82, 0x9e, 0x98, 0x3d, 0x2a, 0x0f, 0x05, 0xbe, 0x2a, 0x2c, 0x87, 0xbe,
- 0x71, 0x59, 0x5e, 0x3d, 0xd4, 0x9a, 0x1e, 0x3d, 0xc7, 0x51, 0x21, 0xbd,
- 0xd7, 0x75, 0x02, 0x3e, 0x82, 0x4f, 0x0d, 0x3e, 0x92, 0x5f, 0x69, 0xbe,
- 0x84, 0x38, 0xef, 0xbd, 0x96, 0xf0, 0x83, 0xbe, 0xd2, 0x75, 0x10, 0xbc,
- 0x30, 0xb0, 0x3d, 0xbd, 0xc3, 0xb6, 0x15, 0xbe, 0x59, 0x01, 0xc0, 0xbb,
- 0xe2, 0x05, 0x6c, 0xbc, 0xac, 0x8e, 0xca, 0xbe, 0xbd, 0x06, 0x5a, 0x3e,
- 0xcd, 0x34, 0x94, 0xbe, 0xc5, 0x82, 0xb1, 0xbd, 0x59, 0x34, 0xa7, 0xbe,
- 0x68, 0x05, 0xd0, 0xbd, 0x2a, 0xc6, 0x32, 0x3e, 0x94, 0x87, 0x84, 0xbe,
- 0x22, 0xbe, 0x24, 0xbe, 0x5d, 0x7d, 0xe6, 0xbd, 0xee, 0x40, 0x82, 0xbd,
- 0x7d, 0x17, 0xb4, 0xbd, 0x87, 0xe4, 0x36, 0xbe, 0x06, 0x4e, 0x6a, 0x3d,
- 0x9b, 0xbb, 0x37, 0x3e, 0x49, 0x08, 0xd5, 0x3d, 0x68, 0xfb, 0x64, 0x3b,
- 0xb1, 0x2c, 0xee, 0xbe, 0xcf, 0x57, 0xc3, 0xbe, 0x5b, 0xac, 0x45, 0x3e,
- 0x9a, 0x12, 0x37, 0xbe, 0x0f, 0x65, 0xe4, 0xbd, 0xa6, 0xa0, 0x3a, 0xbd,
- 0x53, 0x73, 0xd9, 0xbd, 0x73, 0x64, 0xc4, 0xbd, 0x53, 0xbc, 0xee, 0xbc,
- 0x6a, 0x0c, 0x18, 0xbd, 0x5a, 0x6d, 0x03, 0xbe, 0xae, 0x53, 0xaa, 0xbe,
- 0x34, 0x41, 0xa4, 0xbc, 0xfa, 0x34, 0x19, 0xbe, 0x3a, 0x6f, 0x6a, 0xbd,
- 0xd5, 0x93, 0x85, 0xbd, 0xcb, 0x45, 0xc4, 0xbc, 0x7b, 0x8e, 0x05, 0x3b,
- 0x00, 0x52, 0x70, 0xbd, 0x29, 0x1d, 0x12, 0xbc, 0x8f, 0x66, 0xe4, 0xbd,
- 0x9c, 0x9a, 0x80, 0xbd, 0xaf, 0x37, 0x9f, 0x3e, 0x4d, 0x73, 0x3e, 0x3e,
- 0xdc, 0x0d, 0x98, 0xbd, 0xb2, 0xe1, 0x9d, 0x3d, 0x65, 0xf2, 0x2f, 0xbe,
- 0xc6, 0x17, 0x69, 0x3c, 0x28, 0xef, 0xa0, 0xbd, 0x3d, 0xb8, 0xc6, 0xbd,
- 0xf0, 0xcb, 0xfb, 0xbd, 0x3c, 0xe3, 0xe1, 0x3d, 0xe0, 0x82, 0xaa, 0x3e,
- 0xe3, 0x2a, 0x32, 0x3e, 0xd0, 0x16, 0x8e, 0x3e, 0xe8, 0x97, 0x69, 0x3c,
- 0x5d, 0x4a, 0x85, 0x3f, 0xff, 0x84, 0x04, 0x3f, 0x65, 0x30, 0x09, 0xbf,
- 0xf1, 0xd6, 0xe9, 0x3e, 0x3d, 0x42, 0x1a, 0x3f, 0x5c, 0x74, 0x63, 0xbf,
- 0x32, 0xbc, 0x15, 0x3f, 0x70, 0x4c, 0xb9, 0x3e, 0x12, 0x14, 0x9e, 0xba,
- 0x49, 0xce, 0xb3, 0x3e, 0x51, 0xc4, 0x81, 0x3f, 0x2e, 0xc6, 0xdc, 0x3d,
- 0xeb, 0x01, 0xe6, 0x3c, 0xaf, 0x77, 0xa7, 0xbf, 0x8f, 0x00, 0x86, 0x3d,
- 0x04, 0x67, 0x74, 0x3e, 0x33, 0xd9, 0x45, 0xbe, 0xac, 0xa9, 0x95, 0xbe,
- 0x30, 0x4a, 0x47, 0xbf, 0xb2, 0x98, 0x33, 0xbe, 0xf4, 0x5f, 0x5e, 0xbd,
- 0xa9, 0x18, 0xb6, 0xbd, 0xfd, 0x3a, 0xaa, 0xbd, 0x3c, 0x40, 0xc9, 0x3e,
- 0x16, 0x7d, 0xee, 0x3d, 0xfe, 0x18, 0xdb, 0xbe, 0x5d, 0x08, 0x85, 0xbf,
- 0xee, 0x73, 0xaf, 0xbd, 0x2e, 0xc3, 0x08, 0xbe, 0x45, 0x2a, 0x0a, 0xbe,
- 0x95, 0xbc, 0xe5, 0x3b, 0x28, 0x4d, 0x4d, 0x3f, 0x59, 0xb7, 0xaf, 0xbb,
- 0x20, 0xd8, 0x23, 0x3c, 0xf8, 0x92, 0x45, 0xbf, 0xe7, 0x82, 0x9e, 0x3f,
- 0xeb, 0x4a, 0x54, 0x3e, 0x27, 0xe5, 0xae, 0xbd, 0x6e, 0x5d, 0x15, 0xbe,
- 0x46, 0xab, 0x08, 0xbf, 0xbc, 0x7f, 0xb3, 0x3e, 0x2f, 0x8d, 0x96, 0x3d,
- 0x2f, 0xbb, 0xaa, 0x3e, 0xf4, 0x5c, 0x9d, 0xbe, 0x8b, 0x82, 0x2a, 0xbe,
- 0xd3, 0xe3, 0x80, 0xbe, 0xb7, 0x99, 0x92, 0xbd, 0x11, 0x5a, 0x55, 0xbe,
- 0x3b, 0x78, 0xca, 0xbe, 0x28, 0x8b, 0xe7, 0xbd, 0x17, 0xb1, 0x83, 0xba,
- 0x53, 0x86, 0xa1, 0x3e, 0xaf, 0x31, 0x9b, 0xbe, 0xa9, 0xe8, 0x36, 0xbd,
- 0xf5, 0xf3, 0x40, 0x3e, 0xdd, 0xf4, 0x55, 0x3d, 0x0b, 0xe3, 0x49, 0xbd,
- 0x99, 0xfd, 0x04, 0xbd, 0x80, 0x1d, 0xfc, 0xbb, 0x87, 0x67, 0xd4, 0xbe,
- 0x0c, 0xca, 0xc1, 0xbd, 0xf2, 0x27, 0x28, 0xbc, 0xd4, 0xea, 0xe5, 0x3e,
- 0x70, 0x3b, 0xfd, 0x3d, 0xaf, 0xf7, 0x0d, 0x3f, 0x3e, 0x85, 0x4e, 0xbe,
- 0x8a, 0x6f, 0x62, 0x3f, 0x87, 0x03, 0xa8, 0x3e, 0xfa, 0x5e, 0x03, 0xbe,
- 0xb6, 0xa3, 0xf7, 0xbe, 0x85, 0x35, 0x9a, 0xbc, 0x3f, 0x71, 0xe9, 0xbd,
- 0x8a, 0xb9, 0xd9, 0x3d, 0x17, 0xa9, 0xa3, 0xbd, 0xc2, 0x26, 0x6b, 0xbd,
- 0x42, 0x90, 0x32, 0xbe, 0x5f, 0xbd, 0x96, 0x3d, 0xdf, 0x0d, 0x22, 0xbe,
- 0xa8, 0x61, 0x4f, 0xbf, 0xc3, 0xc4, 0xb8, 0xbd, 0xe8, 0xab, 0xf7, 0x3d,
- 0x17, 0xe2, 0xdf, 0xbd, 0x05, 0x72, 0xfc, 0xbb, 0x9e, 0x60, 0x03, 0xbc,
- 0xb6, 0x98, 0xc8, 0x3d, 0x45, 0x3c, 0xdf, 0x3d, 0xf6, 0x91, 0xc2, 0x3e,
- 0x31, 0xce, 0x26, 0x3e, 0xc2, 0x16, 0x8d, 0xbd, 0xfa, 0x3f, 0x20, 0xbf,
- 0x0c, 0xdb, 0x90, 0xbf, 0xd4, 0xc0, 0x85, 0x3e, 0xd9, 0x7c, 0x38, 0xbd,
- 0x4e, 0xe9, 0xaf, 0x3d, 0x04, 0x3d, 0x87, 0xbd, 0x7e, 0x6c, 0x97, 0x3e,
- 0xad, 0x1a, 0xa1, 0x3d, 0x56, 0x56, 0x45, 0x3d, 0x58, 0x17, 0x06, 0xc0,
- 0x10, 0x95, 0x23, 0xbe, 0xf6, 0x15, 0xf6, 0xbd, 0x8d, 0x78, 0x8a, 0x3d,
- 0x6b, 0xcf, 0x88, 0xbc, 0x53, 0xe6, 0x77, 0x3d, 0xec, 0xdd, 0x0c, 0x3e,
- 0x24, 0xa1, 0x9a, 0x3d, 0xd3, 0x28, 0xe9, 0x3d, 0xe7, 0x35, 0x58, 0x3d,
- 0xd2, 0x3c, 0x9f, 0x3d, 0xee, 0xa0, 0xb8, 0x3d, 0x74, 0x58, 0x2b, 0xbe,
- 0x47, 0x60, 0x6e, 0x3d, 0xe7, 0xc0, 0x3b, 0xbe, 0xe6, 0xb7, 0x7c, 0xbe,
- 0xa6, 0x9b, 0x3f, 0x3e, 0xfe, 0x3a, 0x12, 0x3e, 0xc5, 0x36, 0x27, 0xbd,
- 0xf9, 0x4a, 0x36, 0xbe, 0xcf, 0xdf, 0xa3, 0xbd, 0x5d, 0x49, 0x33, 0xbd,
- 0x42, 0x33, 0x21, 0xbc, 0x89, 0x4d, 0xe2, 0xbd, 0x2b, 0xa0, 0xae, 0xbe,
- 0x5b, 0x55, 0xb4, 0xbc, 0x88, 0xc1, 0xb8, 0xbd, 0x0b, 0x2c, 0xe1, 0x3d,
- 0x2f, 0x5d, 0xa0, 0x3c, 0x05, 0xcd, 0x7b, 0xbe, 0xef, 0x80, 0x38, 0x3e,
- 0xf4, 0xae, 0x9a, 0x3d, 0x35, 0x16, 0x09, 0x3d, 0x50, 0xba, 0xe1, 0xbd,
- 0x1a, 0xcc, 0x96, 0xbd, 0xce, 0x13, 0xb1, 0x3d, 0xca, 0x4a, 0xf9, 0xbd,
- 0x5f, 0x8b, 0xea, 0xbd, 0xc5, 0xe9, 0x60, 0x3c, 0xe9, 0x3b, 0x08, 0x3c,
- 0xd9, 0x4f, 0xb7, 0x3d, 0xd0, 0x97, 0x81, 0x3d, 0xcb, 0x7f, 0x38, 0xbe,
- 0xe4, 0x78, 0x22, 0xbe, 0xda, 0x9b, 0x78, 0xbd, 0x0c, 0xb1, 0x1a, 0xbf,
- 0x8a, 0x49, 0x1d, 0x3c, 0xfa, 0xda, 0xf3, 0x3b, 0xf1, 0x7f, 0xf9, 0xbd,
- 0x95, 0x54, 0xb9, 0x3d, 0x1d, 0x97, 0x40, 0x3e, 0x57, 0xa1, 0x14, 0xbd,
- 0x9e, 0xaf, 0x26, 0xbe, 0x8e, 0xe3, 0x34, 0x3e, 0x15, 0xa3, 0x23, 0x3e,
- 0xcc, 0x6e, 0xfe, 0x3c, 0x1c, 0xdb, 0x3a, 0xbe, 0x25, 0x3e, 0x4e, 0xbe,
- 0xa1, 0x67, 0x81, 0xbd, 0x15, 0x5b, 0xb7, 0x3b, 0x47, 0x0e, 0x08, 0xbd,
- 0x5b, 0xbf, 0xb7, 0xbe, 0xf8, 0x95, 0xb9, 0xbd, 0x66, 0x2c, 0xf8, 0xbe,
- 0x1b, 0x71, 0x1f, 0xbe, 0x86, 0xe5, 0xc2, 0xbc, 0xf6, 0xea, 0xe0, 0x39,
- 0xcf, 0xc1, 0x13, 0x3e, 0x86, 0xf4, 0xc9, 0x3d, 0xc0, 0x9e, 0x58, 0xbd,
- 0x4d, 0xf9, 0x2b, 0xbd, 0x8b, 0x8a, 0x1d, 0x3e, 0x4d, 0xd4, 0x0b, 0xbe,
- 0x6f, 0x1a, 0xab, 0xbc, 0x93, 0x22, 0x8a, 0xbc, 0x7b, 0x6f, 0x71, 0xbd,
- 0x99, 0x69, 0x07, 0xbe, 0xa3, 0x6d, 0x5e, 0x3d, 0xe9, 0xc3, 0x80, 0x3c,
- 0xce, 0xce, 0x66, 0xbd, 0x90, 0x06, 0xae, 0x3d, 0x7c, 0x56, 0x64, 0xbe,
- 0xfc, 0x04, 0x97, 0x3e, 0xc7, 0xfa, 0x5a, 0x3d, 0x9f, 0x35, 0x38, 0x3e,
- 0xbd, 0xc4, 0x5c, 0xbd, 0x8e, 0xee, 0x0f, 0xbd, 0x01, 0x19, 0x01, 0xbe,
- 0x1c, 0xeb, 0xd7, 0xbd, 0xf2, 0xa8, 0xc3, 0x3c, 0xc4, 0x12, 0x9c, 0xbd,
- 0x80, 0x4c, 0x79, 0x3d, 0x94, 0x25, 0x86, 0x3c, 0x66, 0x3e, 0x0d, 0x3e,
- 0xe7, 0xe6, 0x4d, 0x3e, 0xf5, 0xea, 0x93, 0x3e, 0x15, 0xf7, 0x7c, 0xbd,
- 0xbe, 0x31, 0x5f, 0xbe, 0x11, 0x44, 0xc8, 0xbe, 0x2b, 0xfc, 0x25, 0x3d,
- 0x4c, 0x78, 0x81, 0xbc, 0xc4, 0x1f, 0xa0, 0xbc, 0xc8, 0xd4, 0x94, 0xbd,
- 0xda, 0x89, 0x2e, 0x3e, 0x9b, 0xf5, 0x83, 0x3e, 0xab, 0x81, 0xc0, 0xbc,
- 0x21, 0x53, 0x8e, 0x3e, 0x62, 0x60, 0xac, 0x3d, 0x0d, 0xa4, 0x38, 0xbd,
- 0x22, 0x99, 0xe9, 0x3e, 0x61, 0x5a, 0x57, 0x3e, 0xb1, 0x6a, 0x40, 0x3e,
- 0xe3, 0x53, 0x05, 0x3d, 0x0b, 0xbd, 0xde, 0x3e, 0x65, 0x21, 0x7c, 0x3d,
- 0x65, 0x86, 0xc3, 0x3d, 0x65, 0x75, 0x18, 0x3f, 0x92, 0x8a, 0x09, 0xbe,
- 0x19, 0x4a, 0x82, 0xbd, 0x50, 0xbf, 0x1c, 0xbe, 0x63, 0xf7, 0x99, 0x3d,
- 0x43, 0x52, 0xdf, 0xbd, 0xab, 0x60, 0xf1, 0xbe, 0x62, 0xff, 0xb7, 0xbe,
- 0x4f, 0xd8, 0x31, 0x3e, 0x0a, 0xdb, 0xe6, 0xbd, 0x8b, 0xa8, 0x06, 0xbe,
- 0x27, 0x79, 0xb6, 0xbd, 0xe4, 0x4c, 0xbe, 0xbe, 0x68, 0xe7, 0xb8, 0xbe,
- 0x46, 0x7c, 0x01, 0xbe, 0xe3, 0xca, 0x32, 0x3d, 0xb7, 0xc3, 0x1d, 0xbe,
- 0x2c, 0xb4, 0xb5, 0xbd, 0x9f, 0x49, 0x3a, 0xbe, 0x6f, 0xa0, 0xf4, 0xbd,
- 0x6d, 0x82, 0x7f, 0x3d, 0x64, 0xae, 0x2b, 0x3e, 0x3d, 0xc8, 0x95, 0xbd,
- 0x20, 0x23, 0x09, 0xbc, 0xa6, 0xee, 0x61, 0xbd, 0x43, 0xf0, 0xc5, 0x3e,
- 0x14, 0xb9, 0x6f, 0xbd, 0x13, 0xed, 0x79, 0x3c, 0x69, 0x49, 0xb5, 0xbd,
- 0x65, 0x4b, 0x72, 0xbe, 0xf0, 0xa3, 0x9a, 0x3e, 0xca, 0x1b, 0x59, 0x3c,
- 0x3c, 0x62, 0x12, 0xbe, 0x9d, 0x84, 0x16, 0x3e, 0x09, 0x46, 0xa4, 0xbd,
- 0x0e, 0x68, 0x67, 0xbc, 0xba, 0x21, 0x89, 0x3e, 0xdd, 0x04, 0x62, 0x3d,
- 0x7f, 0x6a, 0x89, 0x3c, 0x28, 0xca, 0x35, 0x3d, 0x11, 0x71, 0x30, 0xbf,
- 0xb3, 0x11, 0x5b, 0x3f, 0xe1, 0x6c, 0xdc, 0xbe, 0x71, 0x43, 0xbe, 0xbe,
- 0x9c, 0x6b, 0x56, 0x3d, 0x97, 0x44, 0xfc, 0xbe, 0xbc, 0xd4, 0x81, 0xbd,
- 0xe9, 0xa4, 0x48, 0x3f, 0x02, 0x83, 0xba, 0x3d, 0xf2, 0x0a, 0xf6, 0x3d,
- 0xc6, 0xb2, 0x10, 0xbd, 0x02, 0x30, 0xf2, 0xbd, 0x59, 0xa3, 0x01, 0x3d,
- 0xd7, 0x34, 0xcf, 0xbd, 0xce, 0xa1, 0x02, 0xbe, 0x55, 0x86, 0x72, 0xbc,
- 0x34, 0xd0, 0xe8, 0x3e, 0x31, 0x9e, 0xf6, 0xbd, 0x0e, 0xdd, 0xa9, 0x3d,
- 0x1a, 0x04, 0x9e, 0xbd, 0x66, 0xd5, 0x68, 0x3d, 0x78, 0xaf, 0xc0, 0x3e,
- 0x0c, 0xab, 0xe9, 0x3d, 0x65, 0xf9, 0x37, 0xbe, 0x14, 0x06, 0x9f, 0xbd,
- 0x0b, 0x76, 0x65, 0xbd, 0x92, 0x1f, 0x8a, 0x3e, 0x98, 0x87, 0x39, 0xbe,
- 0x6c, 0xce, 0x1d, 0x3d, 0x73, 0x22, 0xcf, 0x3c, 0x38, 0x5f, 0xa7, 0xbd,
- 0xd7, 0x42, 0x2d, 0x3e, 0xa5, 0xb0, 0x70, 0xbd, 0x0c, 0x13, 0xcf, 0x3d,
- 0x58, 0x14, 0xb0, 0xbc, 0x83, 0xe9, 0x89, 0xbc, 0x5c, 0x79, 0x07, 0x3e,
- 0x36, 0xe6, 0xbb, 0xbd, 0x10, 0x2c, 0x8a, 0x3e, 0xf0, 0x50, 0xfb, 0xbd,
- 0x8d, 0x6e, 0x04, 0xbf, 0xd1, 0xa6, 0x18, 0x3e, 0x67, 0x3d, 0x0e, 0x3d,
- 0x19, 0x02, 0x2c, 0xbe, 0x6d, 0x0e, 0xb2, 0xbe, 0xa1, 0xe3, 0x2a, 0x3f,
- 0x2e, 0x4a, 0x31, 0xbe, 0xb8, 0x44, 0xd7, 0xbb, 0x53, 0xcc, 0x79, 0xbe,
- 0x2a, 0xab, 0x80, 0xbc, 0x5e, 0x78, 0xfb, 0xbd, 0x30, 0x4f, 0x14, 0xbe,
- 0x04, 0x79, 0x22, 0x3d, 0xf7, 0xf1, 0x21, 0xbe, 0x72, 0xf0, 0x04, 0x3c,
- 0x64, 0xd7, 0x32, 0x3c, 0x04, 0x76, 0xa9, 0xbe, 0x8e, 0xc6, 0x5b, 0x3e,
- 0x7e, 0x8d, 0x0b, 0xbd, 0x41, 0xa5, 0x89, 0x3c, 0xa3, 0x5c, 0x60, 0xbe,
- 0xa3, 0xa6, 0xf7, 0xbc, 0x62, 0xb2, 0xdf, 0xbd, 0xa0, 0xc8, 0x86, 0xbe,
- 0xa9, 0x68, 0xa1, 0x3d, 0xa4, 0xdd, 0xa2, 0xbe, 0x89, 0x23, 0x56, 0x3e,
- 0x14, 0xca, 0x7d, 0x3d, 0x7d, 0xc9, 0x70, 0xbd, 0xf9, 0x62, 0x7b, 0xbe,
- 0x28, 0xfe, 0x27, 0x3d, 0x7c, 0x59, 0x99, 0xbd, 0xf7, 0x1e, 0x23, 0xbe,
- 0xc7, 0x7c, 0x11, 0x3e, 0x8b, 0xba, 0x36, 0x3e, 0x45, 0xb7, 0x06, 0x3e,
- 0xaf, 0x98, 0x98, 0x3d, 0x2a, 0xe8, 0x79, 0xbe, 0x69, 0x40, 0xf5, 0xbe,
- 0xb6, 0xf9, 0xc6, 0xbd, 0x8d, 0x25, 0x9e, 0xbd, 0xe3, 0x9a, 0x9a, 0xbe,
- 0x0a, 0x3c, 0xa0, 0x39, 0xd6, 0xe7, 0xad, 0x3d, 0x98, 0x9b, 0x84, 0x3d,
- 0xa4, 0x88, 0x1d, 0xbe, 0x32, 0xcd, 0x3b, 0x3e, 0x93, 0xad, 0xfb, 0x3c,
- 0xcd, 0x47, 0xb0, 0x3d, 0x81, 0x6b, 0xb9, 0x3d, 0x2d, 0xca, 0x8f, 0xbd,
- 0xbd, 0x3e, 0x13, 0xbe, 0x9d, 0xce, 0x93, 0x3d, 0xe9, 0xc8, 0x8d, 0xbd,
- 0xab, 0xdf, 0x9a, 0x3e, 0xa3, 0x5c, 0x1b, 0xbe, 0xcd, 0xdb, 0xd8, 0x3d,
- 0x43, 0xc9, 0x7d, 0x3d, 0x61, 0xa9, 0xb9, 0xbd, 0x19, 0x95, 0xa6, 0xbd,
- 0x94, 0x20, 0x96, 0xbe, 0x5f, 0x3c, 0x2b, 0x3e, 0x97, 0xa5, 0x20, 0x3e,
- 0xc5, 0x36, 0x3c, 0xbe, 0x15, 0xdb, 0x07, 0xbf, 0x44, 0xf4, 0x96, 0xbe,
- 0x81, 0x37, 0xda, 0x3b, 0x74, 0x1b, 0x94, 0x3c, 0x8d, 0x2e, 0x3b, 0x3c,
- 0x7b, 0x2f, 0x36, 0x3e, 0x5c, 0xfa, 0xe7, 0xbd, 0x12, 0xc7, 0x81, 0xbb,
- 0xe5, 0x4e, 0x0e, 0xbe, 0x96, 0xc7, 0xb1, 0xbd, 0x14, 0x29, 0x39, 0xbe,
- 0x28, 0x2d, 0x61, 0xbd, 0xef, 0xcd, 0x2a, 0xbd, 0xa8, 0x82, 0x28, 0xbe,
- 0x79, 0x1d, 0x77, 0xbd, 0xb7, 0x52, 0xba, 0xbd, 0xd0, 0xa1, 0x65, 0x3e,
- 0x32, 0x52, 0x64, 0xbe, 0x2a, 0x91, 0xaf, 0xbc, 0x5a, 0x9e, 0x26, 0x3d,
- 0xce, 0x43, 0xef, 0xbd, 0x89, 0xef, 0x07, 0xbe, 0x33, 0x20, 0x60, 0x3c,
- 0x6a, 0x2e, 0x42, 0xbd, 0xcb, 0x43, 0xa2, 0xba, 0x6d, 0x48, 0x41, 0xbe,
- 0xf1, 0xdf, 0x3c, 0xbe, 0xe8, 0x76, 0xde, 0xbc, 0x24, 0xca, 0x5c, 0xbe,
- 0xfa, 0x09, 0x4e, 0xbb, 0x11, 0x8f, 0xd0, 0xbd, 0x05, 0xf6, 0x00, 0x3e,
- 0xc1, 0x15, 0xbf, 0x3d, 0x26, 0x72, 0x12, 0xbe, 0x88, 0xd0, 0x94, 0x3d,
- 0xa1, 0xe2, 0xcf, 0x3c, 0x41, 0xe2, 0x92, 0x3d, 0x22, 0x53, 0xa3, 0x3d,
- 0x23, 0x82, 0x83, 0xbe, 0x8a, 0x30, 0x59, 0xbd, 0x91, 0xd1, 0x9c, 0xbd,
- 0x3a, 0x3a, 0x7d, 0xbe, 0x0d, 0xdc, 0xaf, 0xbe, 0x2e, 0x42, 0x07, 0x3e,
- 0xae, 0x56, 0x7c, 0x3c, 0x22, 0x45, 0x98, 0x3d, 0xfc, 0xc7, 0x33, 0xbe,
- 0x5b, 0xb5, 0x7c, 0xbe, 0x95, 0x17, 0x1a, 0x3e, 0x52, 0xb7, 0xe4, 0x3c,
- 0x27, 0xe8, 0xda, 0x3d, 0xa5, 0xe7, 0x77, 0xbe, 0xc6, 0x98, 0x64, 0x3c,
- 0x0e, 0xee, 0xae, 0x3e, 0x87, 0x0e, 0xa5, 0xbd, 0x25, 0x3a, 0x23, 0xbf,
- 0x1e, 0xcf, 0xb5, 0x3d, 0xa8, 0x36, 0x88, 0xbd, 0x3b, 0x3d, 0xe6, 0x3d,
- 0xc8, 0x6f, 0x6c, 0x3e, 0x84, 0xea, 0x0c, 0xbd, 0x2a, 0xb0, 0xa1, 0xbd,
- 0xad, 0x41, 0xbf, 0x3d, 0x1e, 0x62, 0xce, 0xbe, 0x6e, 0x9b, 0x2f, 0xbe,
- 0x6a, 0x54, 0x4b, 0x3d, 0xa2, 0x3b, 0xa2, 0xbd, 0xa5, 0x9f, 0xaa, 0x3d,
- 0xa5, 0x32, 0x2c, 0xbe, 0x8f, 0x85, 0xdf, 0xbd, 0xc6, 0x62, 0xba, 0xbe,
- 0x8b, 0x61, 0xc9, 0xbd, 0xbe, 0x2e, 0x8e, 0x3d, 0xe6, 0x9c, 0x58, 0x3d,
- 0x06, 0x3b, 0xa0, 0xbd, 0x37, 0xe1, 0xc3, 0xbe, 0x62, 0xca, 0xaf, 0xbe,
- 0xc2, 0x14, 0x0c, 0xbd, 0x57, 0x17, 0x94, 0xbd, 0xa7, 0xaa, 0x83, 0xbe,
- 0x7f, 0x6c, 0x9a, 0x3d, 0x15, 0xbc, 0xb5, 0xbd, 0x6f, 0x06, 0x3f, 0x3c,
- 0x44, 0xcf, 0x5e, 0xbc, 0x62, 0xa7, 0x19, 0xbd, 0x59, 0x5c, 0x90, 0xbe,
- 0xad, 0x1f, 0x83, 0xbd, 0xd4, 0x46, 0x6e, 0x3b, 0xb4, 0xcb, 0x09, 0x3d,
- 0x4d, 0xe8, 0x40, 0x3e, 0x00, 0xf3, 0x6b, 0x3d, 0xdc, 0x9f, 0x19, 0xbd,
- 0x33, 0x3b, 0x81, 0xbe, 0x97, 0x5f, 0x13, 0xbe, 0x55, 0x9f, 0x21, 0x3e,
- 0x52, 0xe9, 0x58, 0xbe, 0x90, 0xc1, 0x81, 0xbe, 0x4d, 0xdb, 0x21, 0xbe,
- 0x97, 0x17, 0x63, 0xbd, 0x60, 0x74, 0x59, 0xbe, 0x73, 0x1f, 0x4c, 0x3e,
- 0xfd, 0x48, 0x1c, 0xbe, 0x44, 0x4f, 0x5f, 0xbe, 0xc7, 0x56, 0x95, 0xbe,
- 0x03, 0x32, 0xbe, 0xbc, 0x22, 0xc8, 0x50, 0x3e, 0xc5, 0x31, 0x01, 0xbd,
- 0x13, 0xe3, 0x1a, 0xbe, 0x89, 0xf4, 0x85, 0xbd, 0x24, 0xaf, 0x0d, 0xbe,
- 0xda, 0xa7, 0xee, 0x3c, 0x72, 0x84, 0x03, 0xbe, 0xdc, 0x08, 0x05, 0xbd,
- 0x52, 0x0e, 0x2d, 0x3e, 0xc5, 0x8c, 0x20, 0x3e, 0xe9, 0x66, 0x04, 0xbe,
- 0xeb, 0x86, 0x15, 0xbe, 0xe5, 0xb3, 0xb5, 0xbd, 0x9a, 0x8a, 0x43, 0x3e,
- 0x46, 0x23, 0x5b, 0xbe, 0xc5, 0x36, 0xb2, 0x3d, 0x7d, 0x23, 0xb2, 0x3d,
- 0xd5, 0x8b, 0xb1, 0x3d, 0x1c, 0x15, 0x77, 0xbc, 0xc9, 0x69, 0x30, 0xbe,
- 0x00, 0x3f, 0xeb, 0x3c, 0x38, 0xae, 0x4b, 0x3e, 0x80, 0xfd, 0x84, 0xbe,
- 0xe8, 0x30, 0x06, 0xbe, 0x74, 0x8b, 0x00, 0xbd, 0xca, 0xac, 0x85, 0xbe,
- 0x48, 0xe0, 0x32, 0x3e, 0x6e, 0x5b, 0xe6, 0xbd, 0x53, 0x61, 0x54, 0x3d,
- 0xbb, 0x07, 0x65, 0xbc, 0xd6, 0xbf, 0x81, 0xbd, 0xa2, 0x7b, 0x80, 0xbd,
- 0x85, 0x3b, 0xf6, 0xbb, 0x55, 0xff, 0x19, 0x3e, 0xac, 0x41, 0x51, 0x3c,
- 0x65, 0x1c, 0xb5, 0xbd, 0x03, 0x62, 0xd5, 0x3d, 0x11, 0x36, 0xb8, 0xbb,
- 0x37, 0x82, 0x69, 0xbd, 0x8a, 0x0a, 0x20, 0xbe, 0xad, 0xf2, 0xb7, 0x3c,
- 0x13, 0xdf, 0x6b, 0xbe, 0x39, 0x5d, 0xad, 0x3d, 0xd8, 0x2b, 0x80, 0x3e,
- 0x54, 0x82, 0xb3, 0x3d, 0xd2, 0x27, 0x1e, 0x3d, 0x50, 0xb0, 0xb0, 0xbd,
- 0xb9, 0x51, 0xbd, 0x3e, 0x16, 0x6b, 0xbe, 0x3e, 0xa1, 0x42, 0x2a, 0x3f,
- 0xef, 0x0a, 0xda, 0x3d, 0x2d, 0x0f, 0x64, 0xbe, 0xf8, 0xd8, 0x0e, 0xbf,
- 0x42, 0x1d, 0x8e, 0xbd, 0x28, 0xcd, 0x0a, 0x3f, 0x5e, 0x39, 0x64, 0xbd,
- 0x77, 0x5c, 0x86, 0x3e, 0x5f, 0x04, 0x77, 0x3e, 0x74, 0x3e, 0x0e, 0xbe,
- 0xc7, 0xd9, 0xaa, 0xbe, 0x5e, 0x0a, 0x3b, 0xbf, 0x50, 0x4c, 0xf3, 0xbe,
- 0x8c, 0xa6, 0x39, 0x3e, 0x1e, 0xdd, 0x3c, 0xbe, 0x65, 0x32, 0xfb, 0x3a,
- 0x1e, 0x15, 0x26, 0x3d, 0xd9, 0xbe, 0x12, 0x3d, 0x28, 0xde, 0x68, 0xbe,
- 0x50, 0xe8, 0x17, 0xbd, 0x06, 0xf0, 0x35, 0xbe, 0xaf, 0x81, 0x3e, 0x3e,
- 0xde, 0xdc, 0x11, 0xbd, 0xe1, 0x8a, 0x97, 0x3c, 0xb9, 0xa1, 0x03, 0x3e,
- 0x93, 0xba, 0x8e, 0xbd, 0x0d, 0xff, 0xa2, 0xbd, 0xbc, 0xa8, 0x82, 0xbd,
- 0xb9, 0x0e, 0x1c, 0xbe, 0xcc, 0xb9, 0x5f, 0x3f, 0x48, 0x4a, 0xb2, 0xbd,
- 0xef, 0x6c, 0x0b, 0xbd, 0x68, 0xc0, 0xce, 0xbe, 0x53, 0x07, 0xb8, 0x3c,
- 0x56, 0x93, 0xa1, 0xbc, 0x52, 0xc7, 0xee, 0x3d, 0x40, 0x7f, 0xfe, 0x3d,
- 0xff, 0x13, 0x16, 0xbc, 0x44, 0x10, 0xa6, 0x3d, 0x1e, 0x28, 0x4e, 0xbd,
- 0xd9, 0xfe, 0x24, 0x3f, 0xd5, 0x79, 0x68, 0x3e, 0xa0, 0xd6, 0x74, 0xbe,
- 0xd2, 0x98, 0x24, 0xbe, 0x15, 0xe0, 0x42, 0x3e, 0x28, 0xc8, 0x10, 0xbc,
- 0xd4, 0xba, 0x84, 0x3d, 0x5f, 0xbd, 0x4d, 0xbe, 0x37, 0x3f, 0x04, 0xbe,
- 0x9e, 0x4d, 0x30, 0x3e, 0x5f, 0x51, 0x0b, 0xbe, 0x11, 0x98, 0x89, 0xbd,
- 0x43, 0x18, 0x10, 0x3e, 0x65, 0xa9, 0x72, 0xbd, 0x92, 0x0c, 0xed, 0xbd,
- 0x7b, 0x34, 0x14, 0x3c, 0x80, 0xc5, 0x31, 0x3b, 0xd2, 0xb0, 0x38, 0x3c,
- 0x36, 0x92, 0x1d, 0xbe, 0x15, 0xe1, 0xfc, 0x3c, 0x4b, 0x03, 0x3e, 0x3e,
- 0x37, 0x10, 0x00, 0x3e, 0xc0, 0x63, 0x70, 0xbe, 0x7c, 0xb4, 0x2d, 0xbc,
- 0x0f, 0x34, 0x57, 0x3f, 0xff, 0xda, 0x0c, 0x3e, 0xf5, 0x0f, 0xc0, 0x3d,
- 0x0e, 0xdb, 0x59, 0xbe, 0x7e, 0xed, 0xfc, 0x3e, 0xff, 0x7d, 0x1c, 0x3f,
- 0xa9, 0x03, 0xb8, 0x3b, 0x53, 0x2b, 0x86, 0x3b, 0x9b, 0x8b, 0xf0, 0x3d,
- 0xf5, 0x56, 0x3b, 0x3d, 0x49, 0xc8, 0x19, 0x3f, 0x43, 0xef, 0x2f, 0xbe,
- 0x9e, 0x5f, 0xa0, 0xbc, 0xf6, 0x0e, 0x8a, 0xbc, 0x7e, 0xd7, 0xba, 0x3e,
- 0x1f, 0x2e, 0x61, 0x3e, 0xeb, 0x47, 0x6c, 0xbc, 0x4a, 0x24, 0x64, 0x3e,
- 0x20, 0xa8, 0xdb, 0xbd, 0xfa, 0x99, 0xc1, 0x3b, 0xf4, 0x7f, 0x9a, 0x3d,
- 0x3f, 0x78, 0xf5, 0x3d, 0x80, 0x96, 0x94, 0x3d, 0x01, 0x85, 0xfc, 0xbe,
- 0xf0, 0x04, 0x2f, 0xbf, 0x70, 0x4c, 0xa5, 0xbc, 0x17, 0x80, 0x2e, 0xbe,
- 0xdc, 0xc9, 0x5d, 0xbd, 0xc6, 0x72, 0x88, 0xbd, 0xbc, 0x81, 0x29, 0x3f,
- 0x04, 0x58, 0x5d, 0x3c, 0xa1, 0xe6, 0x07, 0x3f, 0x4e, 0x33, 0xb7, 0xbf,
- 0xe6, 0x28, 0x18, 0x3b, 0x36, 0xad, 0xe7, 0xbd, 0x3e, 0xcd, 0x14, 0x3d,
- 0x0e, 0x9e, 0x77, 0x3d, 0xf0, 0x94, 0x01, 0x3e, 0x67, 0xc4, 0xe8, 0x3d,
- 0x5a, 0x61, 0x61, 0xbd, 0x6d, 0x01, 0xfa, 0xbc, 0x6b, 0xdf, 0x2f, 0xbe,
- 0x5b, 0xd4, 0x35, 0xbc, 0x10, 0xbf, 0x8c, 0x3d, 0xf0, 0xaf, 0xc2, 0xbd,
- 0x74, 0x96, 0x52, 0x3d, 0x2f, 0x5f, 0xa8, 0xbd, 0x0c, 0x43, 0x29, 0xbe,
- 0xe3, 0xa7, 0x9b, 0x3b, 0x70, 0x45, 0x13, 0x3e, 0x59, 0xb1, 0x8d, 0x3d,
- 0x55, 0xe7, 0x0e, 0x3d, 0xdb, 0x1f, 0x3b, 0xbd, 0x10, 0xcb, 0x61, 0xbe,
- 0x32, 0x34, 0x68, 0xbd, 0xea, 0x65, 0xcc, 0xbd, 0xef, 0xc0, 0xa9, 0xbe,
- 0x71, 0x90, 0x06, 0xbe, 0x53, 0xa3, 0x8f, 0xbd, 0x3b, 0xfd, 0x9c, 0xbd,
- 0x13, 0x37, 0x21, 0xbd, 0x5c, 0x81, 0x14, 0xbe, 0x32, 0x6c, 0xbe, 0x3d,
- 0x6e, 0xae, 0x47, 0x3b, 0xa2, 0xd1, 0xe3, 0x3c, 0xe2, 0x0f, 0xc0, 0xbe,
- 0x87, 0x32, 0x14, 0x3e, 0x5f, 0x97, 0x16, 0x3e, 0x3a, 0xac, 0x22, 0x3d,
- 0xd5, 0x96, 0x92, 0x3c, 0xed, 0xfe, 0xbc, 0x3a, 0xb5, 0xfc, 0x15, 0x3e,
- 0x6d, 0x3d, 0x82, 0x3d, 0x8d, 0x6d, 0x39, 0x3e, 0x25, 0x95, 0x9b, 0xbe,
- 0x77, 0x69, 0xb6, 0x3c, 0xfe, 0xf6, 0xad, 0x3d, 0x12, 0x23, 0xc0, 0xbe,
- 0x22, 0x21, 0xa7, 0xbd, 0xa0, 0x45, 0x2b, 0xbd, 0x67, 0x4d, 0x76, 0xbd,
- 0x0c, 0x85, 0x0a, 0xbc, 0x54, 0xf5, 0x47, 0x3e, 0x43, 0x87, 0xfd, 0xbd,
- 0xaf, 0x1b, 0xe5, 0xbd, 0x8e, 0xf3, 0xe7, 0x3d, 0x60, 0x0f, 0x8e, 0x3c,
- 0xe9, 0xe0, 0xf3, 0x3c, 0x30, 0xdb, 0x0a, 0xbe, 0x21, 0xee, 0xb0, 0xbe,
- 0xdf, 0x0c, 0x7a, 0x3c, 0x94, 0xb1, 0x73, 0x3d, 0x00, 0x07, 0x11, 0xbe,
- 0x6f, 0x38, 0xa4, 0xbd, 0xc4, 0xdc, 0x0b, 0xbd, 0x95, 0x16, 0x23, 0xbf,
- 0xec, 0x92, 0x32, 0xbe, 0x8a, 0x97, 0x78, 0xbe, 0x4c, 0x29, 0x90, 0xbd,
- 0x60, 0xe2, 0xbf, 0x3d, 0x04, 0xae, 0x96, 0x3d, 0xbb, 0x50, 0x28, 0xbe,
- 0x8b, 0xb6, 0x1e, 0x3e, 0xee, 0x93, 0xf3, 0x3d, 0x9c, 0xfc, 0xb4, 0xbe,
- 0x57, 0x26, 0x9a, 0x3d, 0x11, 0xfe, 0x4f, 0xbc, 0x27, 0xb9, 0xf8, 0xbd,
- 0x53, 0xe1, 0x25, 0xbd, 0x35, 0x9a, 0xd1, 0xbd, 0x01, 0xa5, 0x04, 0x3d,
- 0x8b, 0x60, 0xb3, 0x3d, 0xb7, 0x0b, 0x29, 0x3e, 0x69, 0x25, 0x68, 0xbe,
- 0xa1, 0x4e, 0x81, 0x3e, 0x00, 0x88, 0x29, 0x3d, 0x85, 0x0a, 0xcc, 0x3d,
- 0x26, 0x2c, 0xda, 0xbd, 0x72, 0x29, 0x26, 0x3d, 0xd5, 0x4d, 0xbb, 0xbc,
- 0x2c, 0x33, 0xdc, 0xbd, 0xa5, 0xb0, 0x3d, 0xbe, 0x09, 0x59, 0x5e, 0xbc,
- 0x90, 0x73, 0xa7, 0x3c, 0x9d, 0x11, 0x6a, 0xbc, 0xe5, 0x73, 0x45, 0xbc,
- 0x2f, 0x9e, 0x1b, 0x3e, 0x0f, 0x3b, 0xab, 0x3e, 0xe9, 0xaf, 0x25, 0x3d,
- 0x02, 0x6e, 0x2a, 0xbe, 0x7e, 0x72, 0xc3, 0xbe, 0xa8, 0xb3, 0xca, 0xbd,
- 0xb0, 0x74, 0xba, 0xbc, 0xc1, 0x5e, 0xef, 0x3c, 0xd6, 0x3c, 0x82, 0xbb,
- 0x54, 0x56, 0x59, 0x3e, 0x47, 0xe3, 0xa4, 0x3e, 0x5f, 0x12, 0x85, 0xbe,
- 0xf9, 0x64, 0xb1, 0x3e, 0x73, 0x5a, 0x7b, 0xbc, 0x43, 0xb2, 0xd9, 0x3d,
- 0xe6, 0x01, 0x97, 0x3e, 0xec, 0xc0, 0xf1, 0x3d, 0xd0, 0xa3, 0xa9, 0x3e,
- 0x93, 0x71, 0xce, 0x3d, 0xd7, 0x96, 0xbb, 0x3e, 0x06, 0x5d, 0x08, 0x3d,
- 0xb5, 0x4b, 0x9d, 0xbd, 0x17, 0x09, 0x23, 0x3f, 0x92, 0x00, 0x81, 0xbe,
- 0x4d, 0xe7, 0x40, 0xbd, 0x20, 0x9d, 0x30, 0xbe, 0x01, 0xea, 0x7e, 0x3e,
- 0xbb, 0x32, 0x2d, 0xbe, 0x59, 0x37, 0xf4, 0xbe, 0xb2, 0xe8, 0x59, 0xbe,
- 0x3d, 0x71, 0xf7, 0x3d, 0xe7, 0xd8, 0x09, 0xbc, 0xff, 0x03, 0x0c, 0xbe,
- 0xe0, 0x90, 0x8c, 0xba, 0x1c, 0x24, 0x60, 0xbe, 0xbc, 0xb7, 0x9c, 0xbe,
- 0xfa, 0x26, 0x00, 0x3d, 0x35, 0x98, 0xa6, 0x3c, 0xf0, 0x94, 0xfc, 0xbd,
- 0xf6, 0xbf, 0x81, 0x3d, 0x78, 0x52, 0xaa, 0xbd, 0x2a, 0xc9, 0x75, 0xbe,
- 0xee, 0x11, 0x38, 0xbd, 0xdd, 0x2b, 0x0f, 0x3e, 0x1f, 0x68, 0x1c, 0xbd,
- 0x15, 0x3b, 0x30, 0x3d, 0xd1, 0x66, 0x18, 0xbe, 0x6c, 0xfb, 0x00, 0x3f,
- 0xa5, 0x13, 0xa1, 0x3c, 0x6c, 0xb5, 0x77, 0x3d, 0x13, 0xe0, 0x49, 0x39,
- 0x3e, 0xfa, 0x3e, 0xbe, 0x84, 0xa6, 0xde, 0x3e, 0xf1, 0x89, 0xa8, 0xbd,
- 0x0d, 0xe4, 0xb6, 0xbd, 0xd0, 0xd3, 0xc3, 0xbc, 0xaa, 0x7a, 0x51, 0xbe,
- 0x28, 0x41, 0xdd, 0xbd, 0x85, 0xe6, 0x7c, 0x3e, 0xb8, 0xb1, 0x3b, 0xbe,
- 0x18, 0x1c, 0x01, 0x3e, 0x8c, 0x4f, 0xb2, 0xbc, 0x8e, 0xa2, 0x21, 0xbf,
- 0x19, 0x8a, 0x56, 0x3f, 0x0f, 0x4c, 0xd0, 0xbe, 0xc9, 0x56, 0x3d, 0xbe,
- 0x03, 0x62, 0x81, 0x3e, 0xcd, 0x4a, 0xf4, 0xbe, 0xf0, 0x60, 0x59, 0xbb,
- 0xcb, 0xd7, 0x4d, 0x3f, 0x29, 0xbe, 0xaf, 0xbd, 0x07, 0x39, 0x23, 0xbd,
- 0xdf, 0xe2, 0xe9, 0xbd, 0xc9, 0xec, 0x84, 0xbe, 0x23, 0x94, 0xa6, 0xbd,
- 0x94, 0x85, 0xc3, 0x3d, 0x96, 0xcb, 0xd4, 0xbd, 0xb8, 0xcc, 0xd9, 0xbd,
- 0x04, 0x1c, 0x00, 0x3f, 0x6d, 0x00, 0xba, 0xbc, 0xc6, 0xb0, 0x85, 0x3d,
- 0xdd, 0x17, 0x11, 0xbe, 0x08, 0xe7, 0x6b, 0x3b, 0x1f, 0x76, 0x36, 0x3e,
- 0x61, 0xb0, 0x9d, 0xbd, 0x4f, 0xab, 0xb4, 0xbd, 0xa6, 0xd2, 0xeb, 0x3c,
- 0x49, 0xd5, 0x3a, 0x3d, 0x5c, 0x44, 0xd4, 0x3e, 0xb5, 0x00, 0x43, 0xbe,
- 0x09, 0x32, 0x4a, 0x3e, 0x4f, 0xac, 0xfb, 0xbc, 0x2c, 0x4c, 0xed, 0x3b,
- 0x97, 0x36, 0xac, 0xbc, 0x8d, 0x5d, 0x03, 0x3e, 0xa7, 0x2f, 0x76, 0x3e,
- 0xeb, 0xd4, 0x06, 0xbe, 0xa9, 0x6d, 0xa5, 0x3d, 0xbb, 0x69, 0x8e, 0x3e,
- 0x4d, 0x44, 0x2e, 0x3d, 0x10, 0x82, 0x68, 0x3d, 0x02, 0x2c, 0x2b, 0x3d,
- 0xe1, 0xf1, 0x8e, 0xbe, 0x04, 0x4d, 0x87, 0x3e, 0x1f, 0xf1, 0x5c, 0xbe,
- 0x15, 0xfd, 0xd9, 0xbd, 0x61, 0x55, 0x51, 0xbe, 0xef, 0xf9, 0x34, 0x3f,
- 0x8e, 0x7c, 0x10, 0xbe, 0xae, 0xe1, 0x9f, 0x3d, 0xe9, 0xe7, 0x6c, 0xbd,
- 0xba, 0xe8, 0x7f, 0x3d, 0x4a, 0x8a, 0x02, 0x3e, 0xa6, 0xbc, 0x05, 0xbd,
- 0x2a, 0x04, 0x19, 0x3d, 0xa5, 0x89, 0xa6, 0xbe, 0x12, 0x49, 0xc6, 0xbd,
- 0xc0, 0xf8, 0x43, 0xbe, 0x83, 0xf4, 0xfb, 0xbd, 0xd4, 0xa1, 0x08, 0x3e,
- 0xec, 0x9f, 0x8a, 0xbd, 0x71, 0x9b, 0x8e, 0x3d, 0xd1, 0x80, 0x1c, 0xbe,
- 0x30, 0xb2, 0xb4, 0xbb, 0xab, 0xa7, 0xc9, 0xbd, 0xd3, 0x94, 0x8b, 0xbe,
- 0x72, 0x9c, 0xb1, 0x3c, 0x0f, 0x1e, 0xaa, 0xbe, 0x56, 0xc7, 0x6e, 0x3e,
- 0x52, 0x75, 0xa1, 0x3d, 0xf4, 0x21, 0xf7, 0x3d, 0x4d, 0x61, 0xf8, 0xbd,
- 0x9d, 0x7c, 0xb2, 0xbb, 0x32, 0xb5, 0x57, 0x3b, 0x8e, 0xa3, 0xa6, 0xbd,
- 0x69, 0x1c, 0x98, 0x3d, 0xcc, 0xd5, 0x6e, 0x3e, 0x2c, 0x66, 0x1c, 0x3e,
- 0xa9, 0xf9, 0xd9, 0x3d, 0x39, 0x75, 0x95, 0xbe, 0x2a, 0x6e, 0x99, 0xbe,
- 0x7a, 0x43, 0x0c, 0x3c, 0xc3, 0xd2, 0x07, 0xbe, 0x04, 0x56, 0xa7, 0xbe,
- 0x85, 0xab, 0x5f, 0x3c, 0x74, 0x1a, 0xb3, 0x3d, 0xcf, 0x3c, 0x2f, 0xbc,
- 0x52, 0x12, 0xea, 0xbc, 0x78, 0xdc, 0xc7, 0x3d, 0xef, 0x98, 0xca, 0xbd,
- 0x20, 0x5a, 0x13, 0xbc, 0xf1, 0xc4, 0x64, 0x3d, 0x93, 0xcb, 0xf8, 0xbd,
- 0xce, 0xf6, 0x31, 0xbe, 0x12, 0xd8, 0xab, 0xbc, 0x81, 0x75, 0x8a, 0x3e,
- 0x39, 0x43, 0x97, 0x3e, 0xfa, 0xdb, 0x05, 0xbe, 0x51, 0xeb, 0x4b, 0xbc,
- 0x02, 0x42, 0xe8, 0xbd, 0x7d, 0x2d, 0x06, 0xbe, 0xa4, 0x6f, 0x22, 0xbd,
- 0x21, 0x39, 0xaa, 0xbd, 0x55, 0x5f, 0xdc, 0x3d, 0x88, 0xdc, 0x3e, 0x3d,
- 0x7b, 0x78, 0x61, 0xbd, 0xcb, 0x97, 0xb2, 0xbe, 0x19, 0xa7, 0x95, 0xbe,
- 0x61, 0x00, 0x1a, 0x3d, 0x65, 0xc0, 0x33, 0x3d, 0x8e, 0x5e, 0x71, 0xbe,
- 0x1f, 0x20, 0x48, 0x3e, 0xe0, 0xea, 0xf2, 0x3d, 0xe9, 0xb8, 0x2a, 0xbe,
- 0x39, 0x2c, 0xe3, 0xbc, 0x4c, 0x5a, 0xc1, 0xbd, 0x90, 0x0f, 0x4b, 0x3c,
- 0xf8, 0x90, 0x06, 0xbe, 0x0e, 0x71, 0xaf, 0xbd, 0xb3, 0xc8, 0x0f, 0x3d,
- 0xaf, 0xaa, 0xfb, 0xbb, 0x5a, 0xfe, 0x22, 0x3c, 0xcc, 0xb0, 0x96, 0x3d,
- 0x0e, 0x67, 0x29, 0xbe, 0xa1, 0x69, 0xf6, 0xbd, 0xb3, 0x58, 0x48, 0xbe,
- 0x6d, 0x6f, 0xe8, 0x3d, 0x82, 0x72, 0x5e, 0xbd, 0x59, 0x02, 0x43, 0xbe,
- 0xac, 0xe6, 0x80, 0xbd, 0xd8, 0x5b, 0xeb, 0xbd, 0x20, 0x44, 0x12, 0xbe,
- 0x0f, 0x7d, 0x0c, 0x3c, 0x59, 0x12, 0x89, 0x3d, 0x42, 0x96, 0x71, 0xbe,
- 0x90, 0x7c, 0x2a, 0x3e, 0x80, 0xdc, 0xa4, 0xbc, 0xce, 0xbe, 0x2e, 0x3d,
- 0x99, 0x8f, 0x19, 0xbe, 0x3e, 0x82, 0x81, 0x3c, 0xb4, 0x74, 0x88, 0xbd,
- 0x26, 0x7e, 0xee, 0xbd, 0xda, 0xcd, 0xfd, 0xbc, 0xff, 0x6c, 0x01, 0x3d,
- 0x2e, 0x09, 0xe1, 0xbd, 0x6d, 0xce, 0x58, 0xbd, 0x1d, 0x4c, 0xf9, 0xbd,
- 0x8c, 0xd3, 0x78, 0xbe, 0xd6, 0x14, 0x99, 0xbe, 0x7d, 0x12, 0x05, 0x3e,
- 0x2e, 0xf6, 0x77, 0xbe, 0xd2, 0x6f, 0xa9, 0x3d, 0x62, 0xd9, 0x83, 0xbe,
- 0x56, 0xa3, 0xa2, 0xbe, 0x70, 0xb8, 0x63, 0x3e, 0x86, 0x37, 0xc0, 0xbd,
- 0x33, 0xbd, 0x28, 0xbd, 0xf4, 0xe3, 0xdf, 0xbd, 0x36, 0x97, 0x92, 0x3d,
- 0x6d, 0xeb, 0xa9, 0x3e, 0x2c, 0x2e, 0x72, 0xbd, 0x9b, 0x00, 0x05, 0xbf,
- 0xde, 0x81, 0x51, 0x3d, 0x2b, 0xfe, 0xe9, 0xbd, 0x1e, 0x08, 0x26, 0x3c,
- 0x6c, 0x74, 0x0b, 0x3e, 0x79, 0xa4, 0x37, 0xbe, 0x8a, 0xda, 0xa0, 0xbe,
- 0xba, 0x43, 0xd4, 0xbb, 0x5f, 0xda, 0x99, 0xbe, 0x30, 0x02, 0xef, 0x3d,
- 0x11, 0xee, 0xdd, 0x3d, 0xbd, 0x01, 0x87, 0x3d, 0xa2, 0x39, 0x2d, 0xbe,
- 0x9a, 0x69, 0x0b, 0xbe, 0xb1, 0x0a, 0xd1, 0xbd, 0x3d, 0xe1, 0xe3, 0xbd,
- 0x72, 0x80, 0x9b, 0xbd, 0x76, 0x82, 0xd5, 0x3b, 0x77, 0x60, 0x8d, 0x3d,
- 0x1c, 0xe8, 0xe2, 0xbd, 0x13, 0xa1, 0xc5, 0xbe, 0x0e, 0x51, 0x05, 0xbe,
- 0xc5, 0x92, 0x55, 0x3d, 0xb6, 0xd5, 0x22, 0xbe, 0x40, 0xd3, 0x6f, 0xbe,
- 0xec, 0xba, 0x97, 0x3c, 0x8c, 0x0b, 0xe2, 0x3d, 0xa3, 0x63, 0x00, 0xbe,
- 0x0a, 0x23, 0x54, 0xbd, 0x5c, 0x56, 0x07, 0xbe, 0x24, 0x55, 0x58, 0xbe,
- 0x2a, 0x19, 0xb7, 0x3d, 0x6d, 0x24, 0x15, 0x3c, 0x27, 0xb2, 0xcf, 0x3d,
- 0x35, 0x88, 0x42, 0x3e, 0x2b, 0xe6, 0x2b, 0xbd, 0x50, 0x39, 0x8b, 0x3e,
- 0xcf, 0xd4, 0x22, 0xbe, 0x26, 0xd0, 0x24, 0xbd, 0x9b, 0x92, 0x04, 0x3e,
- 0x1e, 0xb9, 0x91, 0xbd, 0x37, 0xa5, 0x3b, 0xbe, 0x24, 0x34, 0x21, 0xbe,
- 0x44, 0x03, 0x67, 0xbe, 0xc0, 0xc4, 0x3f, 0xbe, 0x36, 0xf0, 0xbb, 0x3d,
- 0xda, 0x48, 0xf3, 0xbd, 0x03, 0x70, 0x76, 0xbe, 0x88, 0x31, 0xc0, 0xbe,
- 0x5f, 0x2f, 0x35, 0xbe, 0xb6, 0x5a, 0x12, 0x3e, 0x6e, 0x7b, 0xe9, 0xbd,
- 0x53, 0xc0, 0x1c, 0xbe, 0x2e, 0xf3, 0xc2, 0xbd, 0xcc, 0xbd, 0x77, 0xbe,
- 0xff, 0xb5, 0x15, 0xbe, 0xaa, 0x04, 0x89, 0x3d, 0x91, 0xd3, 0x57, 0xbc,
- 0x73, 0xce, 0x2b, 0xbc, 0x79, 0x8a, 0x46, 0xbb, 0x15, 0xe9, 0xec, 0xbd,
- 0x57, 0xcb, 0xdf, 0xbd, 0x8b, 0xc8, 0x6a, 0xbe, 0x8a, 0x6e, 0xf2, 0xbb,
- 0x5c, 0x09, 0x50, 0xbe, 0x2d, 0x37, 0xf5, 0x3b, 0x55, 0xb2, 0x78, 0x3c,
- 0x08, 0xd9, 0xf1, 0xbd, 0x07, 0xc2, 0x06, 0xbe, 0x67, 0xb4, 0x0c, 0x3d,
- 0xcc, 0xd8, 0x8e, 0x3d, 0x3d, 0x0c, 0xe0, 0x3c, 0x34, 0x7d, 0x1e, 0xbe,
- 0xdb, 0xc0, 0x81, 0xbe, 0x9e, 0x23, 0xfc, 0x3d, 0x77, 0x41, 0x43, 0xbe,
- 0x45, 0xf3, 0x6a, 0x3d, 0xf5, 0x53, 0x48, 0xbd, 0xcf, 0x69, 0x8a, 0x3d,
- 0xd7, 0x54, 0x3e, 0xbd, 0x3c, 0x78, 0x4c, 0xbe, 0x7d, 0x07, 0xcf, 0x3c,
- 0x07, 0x70, 0x42, 0x3c, 0xab, 0x57, 0xcd, 0x3d, 0xde, 0xaf, 0x61, 0xbd,
- 0xbf, 0x58, 0xa0, 0x3d, 0xd0, 0x72, 0xcb, 0x3c, 0xd8, 0x20, 0x00, 0xbd,
- 0x09, 0xfb, 0x24, 0xbd, 0xc9, 0x8d, 0xb3, 0xbe, 0xa5, 0x05, 0x0f, 0x3e,
- 0xd3, 0x84, 0x12, 0xbe, 0x30, 0xf7, 0xd5, 0xbc, 0xe5, 0x08, 0xc2, 0x3d,
- 0x99, 0xf2, 0x0a, 0xbe, 0xa5, 0xb5, 0x02, 0x3e, 0x5c, 0x7f, 0xa9, 0x3d,
- 0x1d, 0x6a, 0x32, 0xbe, 0x3e, 0x7a, 0x87, 0x3e, 0xd3, 0xfe, 0x09, 0x3f,
- 0x6b, 0x35, 0x6e, 0x3f, 0x60, 0x11, 0x71, 0x3f, 0x9d, 0xa3, 0xe9, 0x3d,
- 0xe9, 0x50, 0x87, 0xbe, 0x4a, 0x01, 0x15, 0x3e, 0xda, 0x8c, 0x21, 0xbe,
- 0x40, 0x1d, 0x4f, 0x3e, 0xdf, 0xae, 0x9b, 0x3e, 0xe3, 0xc9, 0x8a, 0xbd,
- 0xcd, 0xb8, 0x43, 0xbe, 0x80, 0xda, 0x8d, 0xbf, 0xf7, 0xb3, 0x44, 0xbe,
- 0x7c, 0xaf, 0xb7, 0xbe, 0xad, 0xc3, 0x70, 0xbe, 0x07, 0x2d, 0x85, 0xbe,
- 0x61, 0xc7, 0x17, 0x3e, 0xad, 0xfc, 0xa1, 0xbd, 0x67, 0xff, 0xa8, 0xbe,
- 0x4c, 0x54, 0x95, 0x3a, 0x56, 0x43, 0xe7, 0x3e, 0xda, 0xb7, 0xdf, 0xbd,
- 0xac, 0x80, 0x28, 0x3d, 0x1b, 0xe0, 0x17, 0xbe, 0x9d, 0x35, 0xcc, 0x3e,
- 0x03, 0x93, 0x9d, 0x3d, 0x73, 0x72, 0xda, 0x3d, 0xad, 0x46, 0xbb, 0xbc,
- 0x53, 0x24, 0x39, 0x3d, 0x6b, 0xd2, 0x05, 0x3f, 0x68, 0x67, 0xb8, 0xbd,
- 0xc8, 0x18, 0xd5, 0x3d, 0x64, 0x13, 0x8e, 0xbe, 0x7c, 0x07, 0xbd, 0x3e,
- 0x09, 0x3a, 0x4e, 0xbc, 0xd1, 0x71, 0x4a, 0x3d, 0xe3, 0x15, 0x67, 0x3e,
- 0x08, 0x9d, 0x0a, 0xbd, 0x34, 0xff, 0x4d, 0x3f, 0xdd, 0x08, 0xdf, 0x3c,
- 0x75, 0x02, 0x03, 0x3e, 0x04, 0x20, 0x43, 0xbe, 0x04, 0xe8, 0xa0, 0x3c,
- 0xf1, 0x84, 0xc3, 0xbe, 0x27, 0x6d, 0x0b, 0xbe, 0x20, 0x60, 0x6d, 0x3d,
- 0x36, 0xf1, 0x15, 0x3e, 0x57, 0x8e, 0x11, 0xbe, 0x22, 0x97, 0x1b, 0x3e,
- 0xc4, 0xce, 0x02, 0x3f, 0x22, 0x5e, 0x75, 0xbe, 0xd7, 0xc5, 0x22, 0xbe,
- 0xb5, 0xb3, 0x56, 0x3e, 0x29, 0x34, 0xd8, 0xbe, 0xdc, 0x5e, 0x1a, 0xbd,
- 0x5a, 0x30, 0x57, 0xbe, 0x88, 0x11, 0xcb, 0x3c, 0xd9, 0x60, 0x09, 0x3d,
- 0xac, 0xff, 0xed, 0xbc, 0x6b, 0x51, 0x4f, 0xbe, 0x94, 0xbe, 0x95, 0x3e,
- 0x05, 0x41, 0xa8, 0x3e, 0x58, 0xa7, 0xf4, 0xbe, 0x84, 0x7c, 0x08, 0xbd,
- 0xe4, 0x9f, 0xc2, 0x3d, 0x6e, 0x6d, 0xc1, 0x3e, 0x4f, 0xb6, 0x71, 0x3e,
- 0x74, 0x03, 0xfe, 0xbc, 0x84, 0xea, 0x8e, 0x3e, 0xea, 0xad, 0x67, 0x3e,
- 0x06, 0x00, 0x68, 0x3d, 0x1d, 0x13, 0x4f, 0x3d, 0x6a, 0x93, 0x45, 0xbe,
- 0xe1, 0x1f, 0x01, 0xbe, 0xe0, 0x92, 0x7c, 0xbe, 0xfd, 0x27, 0xd3, 0xbe,
- 0x41, 0x12, 0x34, 0xbe, 0x62, 0x47, 0xc5, 0x3d, 0x52, 0x3b, 0x25, 0x3f,
- 0x20, 0x5a, 0x0c, 0xbf, 0xdb, 0x43, 0xe6, 0xbc, 0xa0, 0xd2, 0xaf, 0x3c,
- 0xc6, 0x16, 0xbe, 0xbd, 0x3c, 0x66, 0xf7, 0x3d, 0xab, 0x81, 0x6a, 0xbc,
- 0x1f, 0x39, 0xf1, 0xbd, 0x3e, 0xa6, 0xe8, 0x3d, 0xe1, 0x7f, 0x26, 0x3d,
- 0x2c, 0x5f, 0x4f, 0xbf, 0x82, 0xf0, 0x95, 0xbe, 0xe1, 0x61, 0x8c, 0xbd,
- 0x87, 0xef, 0x42, 0xbe, 0x69, 0x17, 0xe6, 0xbd, 0xbb, 0xb6, 0x16, 0xbd,
- 0x85, 0xee, 0x05, 0xbe, 0x45, 0xac, 0x17, 0x3e, 0xce, 0x54, 0x41, 0xbf,
- 0xb1, 0x72, 0x1c, 0xbe, 0x0b, 0xff, 0x2d, 0xbe, 0x7e, 0x79, 0xdd, 0xbd,
- 0x30, 0x69, 0x8b, 0xbd, 0x8e, 0xf0, 0x1e, 0x3e, 0xc4, 0x4f, 0xce, 0x3d,
- 0xc2, 0x0f, 0x01, 0x3e, 0x81, 0x55, 0xc1, 0x3d, 0x15, 0x29, 0xa8, 0xbb,
- 0xb8, 0x43, 0x7c, 0xbd, 0xad, 0x23, 0x65, 0x3b, 0x3a, 0x4b, 0xb3, 0xbd,
- 0x36, 0x3f, 0x0e, 0x3e, 0xd3, 0x4a, 0x6c, 0xbd, 0x0b, 0x34, 0x19, 0xbd,
- 0x60, 0x8e, 0x4c, 0x3e, 0x76, 0x41, 0x60, 0x3c, 0x2d, 0xe3, 0xa4, 0xbd,
- 0xbc, 0x3b, 0x42, 0xbd, 0xc9, 0x23, 0x08, 0xbc, 0x2f, 0xeb, 0xfd, 0xbd,
- 0xc1, 0x3a, 0x6f, 0x3a, 0x79, 0x36, 0x0c, 0xbe, 0x36, 0x69, 0xb4, 0xbd,
- 0x64, 0xf6, 0x00, 0xbe, 0x6a, 0xdb, 0x2d, 0x3d, 0xfd, 0x5a, 0x12, 0x3e,
- 0xb5, 0x37, 0xd5, 0xbd, 0x9a, 0x95, 0x8d, 0xbe, 0xff, 0x3e, 0xe9, 0x3c,
- 0x24, 0x81, 0xf8, 0xbd, 0xd6, 0xca, 0x1f, 0xbe, 0xf5, 0x56, 0x4b, 0xbe,
- 0x6d, 0x55, 0x0b, 0x3d, 0x46, 0xaa, 0xa6, 0xbb, 0x5d, 0x45, 0x51, 0xbe,
- 0x3e, 0x61, 0x19, 0x3d, 0x5e, 0x26, 0x6d, 0x3d, 0x58, 0x95, 0x80, 0xbc,
- 0x3e, 0x45, 0xc8, 0x3c, 0xeb, 0xf0, 0x2b, 0xbd, 0x3e, 0xc2, 0x29, 0xbe,
- 0xa3, 0x67, 0x09, 0xbc, 0xc9, 0xdb, 0x52, 0xbd, 0xb0, 0xa4, 0x8c, 0xbe,
- 0x31, 0x0a, 0x71, 0x3e, 0x1c, 0x08, 0xa7, 0xbd, 0x46, 0x11, 0x95, 0xbd,
- 0xcc, 0x19, 0x4a, 0x3e, 0x20, 0x02, 0xa5, 0x3d, 0x65, 0xee, 0x89, 0xbb,
- 0x8c, 0xad, 0xde, 0xbc, 0xa7, 0xf0, 0xb8, 0xbc, 0x9b, 0xb4, 0x17, 0x3e,
- 0x1c, 0x95, 0x8a, 0xbd, 0x1e, 0xb4, 0x95, 0xbe, 0x0d, 0xeb, 0x3a, 0xbe,
- 0xc1, 0x02, 0xa4, 0xbc, 0xf0, 0xe4, 0x6d, 0xbd, 0xad, 0x40, 0x09, 0x3a,
- 0x6b, 0x55, 0xcd, 0xbe, 0xa8, 0x16, 0x0a, 0xbe, 0x5a, 0x39, 0x23, 0xbf,
- 0xb7, 0x1b, 0x52, 0xbd, 0x1c, 0xc0, 0xf7, 0xbc, 0xbf, 0x20, 0x06, 0xbe,
- 0xb2, 0x88, 0x19, 0xbd, 0x6a, 0x23, 0xbf, 0x3d, 0xd4, 0xca, 0x2a, 0xbe,
- 0xcc, 0xb1, 0x84, 0x3d, 0x2b, 0x70, 0x1a, 0x3e, 0x02, 0x2b, 0x84, 0xbe,
- 0x48, 0x76, 0x05, 0x3d, 0x06, 0x5b, 0x95, 0xbd, 0x8b, 0x79, 0x02, 0xbe,
- 0x02, 0x49, 0xfa, 0xbd, 0xd0, 0xce, 0x68, 0xbe, 0x83, 0x9f, 0x71, 0xbc,
- 0x2a, 0x74, 0x6f, 0x3d, 0x0e, 0xad, 0xbf, 0xbd, 0xbd, 0x3b, 0x98, 0xbe,
- 0x52, 0x7d, 0xa6, 0x3d, 0x7d, 0xa7, 0x04, 0xbd, 0xe7, 0xd1, 0x8c, 0x3d,
- 0x21, 0x3d, 0xd5, 0xbd, 0x69, 0x23, 0xc5, 0xbc, 0xf8, 0xb6, 0x3b, 0x3d,
- 0x35, 0x66, 0x29, 0xbe, 0xd6, 0x5c, 0x6b, 0xbc, 0xac, 0xd8, 0x96, 0xbd,
- 0x17, 0xe5, 0xee, 0x3d, 0x9b, 0xd1, 0x46, 0x3d, 0xb4, 0x59, 0x1d, 0xbd,
- 0x87, 0x6b, 0x75, 0x3d, 0xc2, 0xd6, 0x9d, 0x3d, 0xb8, 0x63, 0x8e, 0x3d,
- 0x23, 0x9d, 0x12, 0x3d, 0xff, 0x91, 0xb8, 0xbe, 0x20, 0x6f, 0x38, 0xbb,
- 0x13, 0x2f, 0x90, 0x3d, 0x8b, 0x53, 0xc4, 0xbd, 0x3f, 0x0c, 0x2e, 0x3d,
- 0x43, 0xb9, 0x68, 0x3d, 0xf1, 0x40, 0x97, 0x3e, 0x11, 0x09, 0x60, 0xbd,
- 0x6e, 0x85, 0x57, 0x3e, 0x7f, 0xae, 0x45, 0xbd, 0x23, 0x93, 0x42, 0xbd,
- 0x8a, 0x33, 0x41, 0x3e, 0xf5, 0x69, 0x25, 0x3e, 0x29, 0x71, 0x8e, 0x3e,
- 0x68, 0x72, 0x10, 0x3e, 0x8b, 0xd4, 0xb3, 0x3e, 0x26, 0x77, 0x0f, 0x3e,
- 0x71, 0x5f, 0x8f, 0x3d, 0x0d, 0x58, 0x04, 0x3f, 0xf2, 0x8f, 0x5a, 0x3c,
- 0xf9, 0xb7, 0x65, 0xbe, 0x18, 0x28, 0xb8, 0xbe, 0x39, 0x74, 0x63, 0x3c,
- 0xfa, 0xc6, 0x69, 0xbe, 0x97, 0xe4, 0xf1, 0xbe, 0x7f, 0x27, 0x04, 0xbe,
- 0x79, 0x1d, 0xee, 0x3d, 0x5d, 0x31, 0xf9, 0xbd, 0xee, 0x94, 0x82, 0xbe,
- 0xc7, 0xf2, 0xe9, 0x3c, 0x5e, 0x17, 0xcc, 0xbe, 0x5c, 0xfa, 0xb9, 0xbe,
- 0x92, 0x10, 0x37, 0x3d, 0x6f, 0x37, 0x63, 0x3c, 0x04, 0xcc, 0x89, 0xbe,
- 0x05, 0x75, 0x70, 0xbd, 0xe7, 0xb8, 0xad, 0xbd, 0xbc, 0x41, 0x32, 0xbe,
- 0xf3, 0x5c, 0x0d, 0x3e, 0x68, 0xff, 0xb7, 0x3d, 0x31, 0xd1, 0x0d, 0xbd,
- 0x35, 0xe6, 0xe9, 0xbd, 0x32, 0x0a, 0x68, 0xbe, 0xbd, 0xd8, 0x03, 0x3f,
- 0x49, 0xea, 0x24, 0xbd, 0x17, 0xb1, 0x30, 0x3e, 0x83, 0x2e, 0xbf, 0xbd,
- 0xea, 0xd1, 0x7e, 0xbe, 0x08, 0x90, 0xf1, 0x3e, 0xc1, 0x1a, 0x0c, 0xbe,
- 0xf7, 0x4d, 0x33, 0xbd, 0xc1, 0x79, 0xfa, 0x3d, 0x62, 0x9f, 0x28, 0xbc,
- 0xac, 0xdc, 0xc9, 0xbd, 0x5d, 0xd5, 0x48, 0x3e, 0x08, 0xda, 0x05, 0xbe,
- 0x42, 0x99, 0x00, 0x3e, 0x17, 0xc3, 0x78, 0x3c, 0xc1, 0x30, 0x0e, 0xbf,
- 0x8f, 0xfb, 0x72, 0x3f, 0xdf, 0x84, 0xe9, 0xbe, 0xb1, 0x3d, 0xb2, 0xbe,
- 0xeb, 0x14, 0x92, 0x3e, 0x91, 0x4a, 0xf7, 0xbe, 0xf2, 0x19, 0xdd, 0xbd,
- 0x3f, 0x3d, 0x50, 0x3f, 0xca, 0x3d, 0xe1, 0xbd, 0x6e, 0x65, 0x8b, 0x3c,
- 0x76, 0xaa, 0xf7, 0xbc, 0x14, 0x0e, 0x5d, 0xbd, 0x4d, 0xaf, 0x85, 0x3d,
- 0x3f, 0x94, 0x5d, 0xbd, 0xe4, 0xc4, 0x60, 0xbd, 0xc3, 0x4e, 0x54, 0xbd,
- 0x31, 0x4d, 0xf1, 0x3e, 0x72, 0x88, 0x1a, 0x3c, 0x47, 0x07, 0xd5, 0xbc,
- 0x28, 0x4d, 0xa9, 0xbd, 0xb9, 0x79, 0x89, 0x3e, 0xae, 0x06, 0x8e, 0x3e,
- 0x06, 0x42, 0xab, 0x3d, 0x89, 0xab, 0x31, 0xbd, 0xa1, 0xc2, 0x0a, 0x3d,
- 0x05, 0xca, 0x98, 0x3c, 0x31, 0x2c, 0x93, 0x3e, 0xee, 0xbe, 0xcb, 0xbe,
- 0xc1, 0x61, 0x8b, 0x3c, 0xc8, 0x67, 0x11, 0xbe, 0x0a, 0x2d, 0xf5, 0xbd,
- 0xa0, 0xbc, 0x5d, 0x3e, 0xd8, 0x1b, 0x7f, 0x3d, 0xdf, 0xc5, 0x18, 0x3e,
- 0x56, 0x11, 0x72, 0xbd, 0x30, 0x3f, 0xee, 0xbd, 0x97, 0x35, 0x6c, 0x3e,
- 0xb1, 0x8e, 0x13, 0xbe, 0x77, 0x8d, 0x96, 0x3d, 0xe1, 0x95, 0xbd, 0xbd,
- 0x47, 0x60, 0xbd, 0xbe, 0xc9, 0xb2, 0xad, 0x3e, 0xb6, 0x93, 0xb5, 0xbd,
- 0x5d, 0x73, 0x44, 0xbe, 0xff, 0x93, 0x82, 0xbe, 0xa7, 0x49, 0x24, 0x3f,
- 0x35, 0x66, 0x83, 0xbe, 0x16, 0x58, 0x17, 0x3e, 0x45, 0x78, 0x69, 0xbd,
- 0xbe, 0xf2, 0xba, 0xbd, 0xd9, 0x7f, 0xb8, 0x3d, 0xbd, 0x44, 0x03, 0xbd,
- 0x07, 0x38, 0x22, 0x3d, 0x3b, 0xa0, 0x98, 0xbe, 0x78, 0xe1, 0x6f, 0xbe,
- 0xc4, 0x43, 0x27, 0xbe, 0x8e, 0xff, 0x6b, 0xbe, 0xb1, 0xe5, 0x22, 0x3e,
- 0xe5, 0x8c, 0x48, 0x3e, 0xe1, 0x34, 0xae, 0x3e, 0x75, 0x76, 0x8d, 0x3c,
- 0x63, 0x0f, 0xee, 0xbd, 0x86, 0x7c, 0xf8, 0x3d, 0x15, 0x99, 0xa1, 0xbe,
- 0x0d, 0x56, 0xd6, 0xbd, 0x24, 0xc4, 0x9e, 0xbe, 0xe7, 0x47, 0x94, 0x3d,
- 0x10, 0x97, 0x45, 0x3e, 0xfc, 0x0a, 0x45, 0x3e, 0x86, 0xc8, 0xf3, 0xbd,
- 0x72, 0xb5, 0x25, 0xbe, 0x24, 0xde, 0x2b, 0xbe, 0xd5, 0xe6, 0x31, 0xbe,
- 0xf4, 0x82, 0xc1, 0xbd, 0x7e, 0xe4, 0x99, 0xbd, 0x50, 0xca, 0x33, 0x3d,
- 0xab, 0xea, 0xc5, 0xbd, 0xa1, 0x96, 0x1e, 0xbe, 0x7d, 0x9c, 0x05, 0xbf,
- 0xae, 0x24, 0xb1, 0x3c, 0x5c, 0x0c, 0xf2, 0xbd, 0xd3, 0xe1, 0xa0, 0xbe,
- 0x8d, 0xce, 0x0b, 0xbd, 0x6b, 0x79, 0x85, 0x3d, 0x07, 0xf3, 0xcf, 0xbd,
- 0xb5, 0xf7, 0x1e, 0xbe, 0xfb, 0x0d, 0x83, 0x3d, 0xa8, 0x4a, 0xab, 0x3d,
- 0x6e, 0x66, 0x22, 0x3d, 0x49, 0xdf, 0x67, 0x3d, 0xf3, 0xd7, 0xdc, 0xbc,
- 0xea, 0x31, 0x3a, 0xbe, 0x56, 0xfd, 0x06, 0xbe, 0x00, 0x7f, 0xab, 0x3e,
- 0xcc, 0xa1, 0xd9, 0x3e, 0xc6, 0x09, 0x7e, 0xbd, 0x73, 0x34, 0x1c, 0xbe,
- 0x54, 0x4d, 0xfb, 0x3d, 0x95, 0xba, 0x92, 0xbe, 0xcb, 0x12, 0xbf, 0xbd,
- 0xe9, 0x53, 0x9e, 0xbe, 0x99, 0xaa, 0xc3, 0x3d, 0x02, 0x95, 0xf1, 0xbd,
- 0x6a, 0xee, 0x56, 0x3e, 0xfa, 0x43, 0xb5, 0xbe, 0x89, 0x39, 0xaa, 0xbe,
- 0xf4, 0x5c, 0xf8, 0x3b, 0x0f, 0x84, 0x01, 0x3e, 0x5c, 0x05, 0x6c, 0xbd,
- 0x14, 0xf2, 0x46, 0x3e, 0x20, 0xe6, 0x85, 0x3c, 0x39, 0x20, 0xcc, 0xbd,
- 0x76, 0xcc, 0x24, 0xbe, 0x61, 0xf7, 0xa6, 0x3c, 0xdf, 0x71, 0xe3, 0x3d,
- 0xd6, 0xfb, 0x43, 0xbd, 0x87, 0xa0, 0x48, 0xbe, 0x43, 0x02, 0x2f, 0xbe,
- 0xd9, 0x33, 0xd4, 0x3c, 0x07, 0xfa, 0xaf, 0xbd, 0xdf, 0xdd, 0xff, 0xbd,
- 0x22, 0xf9, 0xc1, 0xbc, 0xf6, 0x29, 0xce, 0x3c, 0xad, 0xc8, 0x65, 0xbe,
- 0xf7, 0x2a, 0x40, 0x3c, 0x54, 0xa5, 0x2b, 0xbe, 0x64, 0x82, 0x0a, 0xbe,
- 0xe2, 0x0e, 0x82, 0x3d, 0x65, 0xb1, 0x66, 0xbd, 0x6c, 0x66, 0xbf, 0xbe,
- 0x99, 0x8e, 0xbd, 0xbe, 0xff, 0x18, 0xbe, 0xbd, 0x8a, 0xce, 0x34, 0xbe,
- 0x73, 0x51, 0x00, 0x3e, 0xe4, 0xb5, 0xdd, 0x3d, 0x94, 0x60, 0x63, 0x3d,
- 0x79, 0x61, 0xda, 0xbd, 0x1a, 0xf8, 0xfb, 0xbd, 0x21, 0xeb, 0x72, 0xbd,
- 0x9e, 0xa9, 0xfe, 0xbd, 0x49, 0x29, 0x83, 0x3d, 0x73, 0x0e, 0x29, 0x3b,
- 0xd3, 0x66, 0x76, 0xbe, 0x01, 0x51, 0xdd, 0x3c, 0x67, 0x17, 0x87, 0x3d,
- 0xcf, 0xb4, 0xae, 0xbd, 0x6b, 0x23, 0xa8, 0xbe, 0x25, 0x8b, 0xcb, 0xbc,
- 0xa7, 0xe9, 0x36, 0xbd, 0x9d, 0x67, 0x50, 0xbd, 0x6b, 0x18, 0x90, 0xbe,
- 0xf1, 0x88, 0x03, 0xbe, 0xdb, 0xbf, 0x31, 0x3e, 0x98, 0x1f, 0x54, 0xbe,
- 0x2d, 0xb2, 0xe9, 0x3d, 0x57, 0xd7, 0x25, 0xbe, 0xa0, 0x53, 0x34, 0x3d,
- 0x51, 0xfe, 0xcb, 0x3e, 0xfc, 0x0f, 0xd7, 0xbd, 0x73, 0x46, 0x29, 0xbe,
- 0xdd, 0x70, 0x0e, 0x3e, 0x18, 0x54, 0xf1, 0xbc, 0x92, 0x88, 0xc7, 0x3b,
- 0xfe, 0x2e, 0x42, 0x3e, 0xec, 0x1d, 0xb2, 0x3d, 0x97, 0x84, 0xef, 0xbd,
- 0xe6, 0x69, 0x01, 0x3e, 0xa3, 0x3d, 0x5a, 0xbe, 0x4a, 0x1b, 0xbf, 0xbd,
- 0xbb, 0xa3, 0xdb, 0x3d, 0xff, 0x84, 0xb8, 0xbd, 0xa5, 0xfc, 0xe6, 0xbd,
- 0x80, 0xd8, 0xe8, 0xbd, 0x5d, 0xff, 0xa8, 0x3d, 0xae, 0x27, 0x86, 0xbe,
- 0xac, 0xe5, 0xd0, 0xbd, 0x26, 0x66, 0x09, 0x3d, 0xcf, 0xaf, 0x55, 0xbd,
- 0x09, 0xe6, 0x40, 0x3c, 0x1a, 0x9f, 0xdc, 0xbe, 0xfa, 0x24, 0x0a, 0xbe,
- 0xee, 0x13, 0x00, 0xbe, 0x50, 0x84, 0x9f, 0xbd, 0xe7, 0xcf, 0xa4, 0xbe,
- 0x3d, 0xb6, 0xdb, 0xbd, 0x08, 0xd2, 0x1e, 0x3e, 0x08, 0x3c, 0x85, 0x3d,
- 0x18, 0x32, 0xf7, 0xbd, 0x31, 0x46, 0xfc, 0xbd, 0xfb, 0x01, 0xb0, 0xbd,
- 0x4d, 0x7a, 0xa7, 0x3d, 0x4a, 0x11, 0xb0, 0x3c, 0xc4, 0x3f, 0x2a, 0xbe,
- 0x82, 0xc7, 0x0f, 0x3e, 0x84, 0xa8, 0xbd, 0x3d, 0xfe, 0x25, 0x3e, 0x3e,
- 0xee, 0x65, 0x0d, 0xbe, 0x83, 0xc9, 0x23, 0xbd, 0x21, 0x92, 0x61, 0xbd,
- 0x47, 0xaf, 0x55, 0xbe, 0x27, 0x0b, 0x17, 0xbe, 0xae, 0x8d, 0x3b, 0xbe,
- 0x3c, 0x29, 0xaf, 0xbd, 0xa4, 0xa9, 0xf9, 0xbd, 0x8e, 0xa2, 0x29, 0x3d,
- 0xdf, 0x4a, 0xaf, 0x3d, 0x6f, 0xf5, 0x0e, 0xbe, 0x6f, 0x00, 0x80, 0xbe,
- 0x20, 0x1b, 0xce, 0x3d, 0xb1, 0x37, 0x80, 0xbb, 0x8b, 0x42, 0x76, 0x3b,
- 0x8b, 0x1f, 0x87, 0x3c, 0xf4, 0x45, 0xc9, 0xbc, 0x35, 0x40, 0x2a, 0xbe,
- 0x27, 0x04, 0x9c, 0x3d, 0xdf, 0x36, 0x14, 0xbd, 0x49, 0x0f, 0xa4, 0x3d,
- 0x97, 0xe8, 0x5f, 0x3d, 0xb8, 0xd7, 0x6c, 0x3b, 0xd8, 0x77, 0x87, 0x3c,
- 0x6e, 0x82, 0x1f, 0xbe, 0xae, 0x1d, 0x25, 0xbe, 0xfc, 0xf9, 0x1a, 0xbe,
- 0xa7, 0xcf, 0x01, 0xbd, 0x24, 0xc6, 0xac, 0x3a, 0x0a, 0x61, 0xba, 0x3b,
- 0x54, 0x6a, 0x9b, 0x3c, 0xcf, 0x42, 0xb9, 0xbc, 0xab, 0x98, 0x00, 0xbe,
- 0x45, 0xdd, 0x9e, 0x3d, 0x76, 0x96, 0x1b, 0x3e, 0x0a, 0xd0, 0x31, 0xbe,
- 0x91, 0x1d, 0x6e, 0xbe, 0x1a, 0xb6, 0x45, 0x3d, 0x6b, 0xd9, 0xab, 0xbe,
- 0xf0, 0x47, 0x02, 0x3e, 0xeb, 0x4d, 0x95, 0x3c, 0x7e, 0x89, 0x59, 0x3c,
- 0x82, 0xdc, 0x9c, 0xbb, 0xd3, 0x5f, 0x75, 0xbd, 0xd9, 0xb5, 0x37, 0x3d,
- 0x4e, 0x26, 0x87, 0x3d, 0x3f, 0x50, 0xa5, 0xbc, 0xfa, 0x8d, 0x54, 0x3d,
- 0xf0, 0xf6, 0xaa, 0xbd, 0x53, 0xc2, 0x75, 0x3e, 0x7a, 0x78, 0x44, 0xbe,
- 0x07, 0x6b, 0xd8, 0xbd, 0x1c, 0x62, 0x0c, 0xbe, 0xc2, 0x8a, 0x26, 0x3e,
- 0x42, 0xa2, 0x62, 0xbe, 0xb6, 0xf6, 0x75, 0x3d, 0xab, 0xde, 0xd5, 0x3c,
- 0xde, 0x6d, 0x29, 0xbe, 0x9b, 0x71, 0x94, 0xbd, 0xb5, 0xf8, 0x87, 0xbd,
- 0xf4, 0xe0, 0xd6, 0x3d, 0x31, 0xdf, 0xd3, 0xbc, 0x5e, 0x00, 0x92, 0x3e,
- 0x2d, 0xc4, 0x6c, 0x3e, 0x55, 0x01, 0xd0, 0x3d, 0x7a, 0x9b, 0x90, 0xbe,
- 0x2e, 0x38, 0x3d, 0xbe, 0x0e, 0xf1, 0xbc, 0x3d, 0x05, 0x16, 0xcd, 0xbe,
- 0xef, 0x38, 0x16, 0x3e, 0xb3, 0xdb, 0x87, 0xbd, 0x79, 0x8a, 0xd1, 0x3c,
- 0x65, 0x09, 0x12, 0xbd, 0x0c, 0x86, 0x95, 0xbf, 0x31, 0xe8, 0x18, 0xbe,
- 0x87, 0x80, 0x58, 0x3e, 0x52, 0x3e, 0xc7, 0xbe, 0xbf, 0x3a, 0x3c, 0xbd,
- 0xfc, 0x0b, 0xf4, 0xbe, 0x42, 0x6a, 0x91, 0xbd, 0x9e, 0xe5, 0x6d, 0xbe,
- 0x44, 0x7a, 0x96, 0x3d, 0x62, 0x12, 0x03, 0x3f, 0xf8, 0xeb, 0xcb, 0x3e,
- 0xeb, 0x65, 0xc5, 0xbc, 0x40, 0x50, 0x07, 0x3f, 0x84, 0x47, 0xf0, 0x3d,
- 0xb6, 0x33, 0x04, 0xbe, 0xf2, 0xba, 0x30, 0xbd, 0x4f, 0x11, 0x64, 0xbd,
- 0x16, 0x08, 0xa0, 0xbc, 0xdc, 0xd8, 0x2c, 0x3e, 0x09, 0x03, 0x49, 0xbd,
- 0xc6, 0x78, 0x32, 0xbd, 0x34, 0x9b, 0xe5, 0x3b, 0x01, 0x0c, 0xcb, 0x3e,
- 0x0b, 0x0e, 0x70, 0x3d, 0xcb, 0xc5, 0x1a, 0xbd, 0x11, 0x47, 0x1e, 0x3b,
- 0x62, 0x03, 0x59, 0xbe, 0x31, 0x0b, 0xa7, 0x3e, 0x39, 0x45, 0x03, 0x3d,
- 0xe0, 0xb9, 0x9c, 0xbe, 0x75, 0x13, 0x35, 0xbc, 0x30, 0x97, 0x10, 0xbe,
- 0x56, 0x18, 0xfc, 0xbe, 0x76, 0xd4, 0x2d, 0x3b, 0x90, 0xe1, 0xcf, 0xbc,
- 0xfc, 0x65, 0x92, 0x3e, 0x8e, 0x17, 0xd8, 0xbe, 0x12, 0x0e, 0xc7, 0x3e,
- 0xb2, 0x5e, 0x47, 0x3e, 0xfb, 0x9a, 0xfe, 0xbd, 0x90, 0xdf, 0x60, 0xbe,
- 0xad, 0x5c, 0x7b, 0x3e, 0x1c, 0x64, 0xb8, 0xbe, 0xb8, 0xf0, 0xfa, 0xbc,
- 0x2d, 0x09, 0x2b, 0x3f, 0x70, 0x94, 0xec, 0x3c, 0x2f, 0xd7, 0x0c, 0x3e,
- 0x2c, 0xf9, 0x12, 0xbe, 0x09, 0x83, 0x80, 0xbd, 0x49, 0xee, 0xb1, 0x3e,
- 0xd3, 0x78, 0xb3, 0x3e, 0x50, 0x30, 0x9b, 0xbe, 0xf2, 0xe6, 0x99, 0xbe,
- 0x10, 0x38, 0xab, 0x3e, 0xe4, 0xdc, 0x0e, 0xbe, 0x0c, 0x6f, 0x06, 0x3f,
- 0x94, 0x86, 0xca, 0xbc, 0x9c, 0x11, 0x6d, 0x3e, 0x31, 0x37, 0x14, 0x3f,
- 0x8f, 0x9c, 0x0e, 0xbe, 0x12, 0x96, 0xc9, 0xbd, 0x91, 0x87, 0xab, 0xbd,
- 0x21, 0x6c, 0x09, 0xbe, 0xe7, 0x7c, 0xda, 0xbe, 0x87, 0xcb, 0x43, 0xbe,
- 0xed, 0xff, 0x13, 0x3e, 0x30, 0x4d, 0xd1, 0x3d, 0x7c, 0xa1, 0x95, 0xbd,
- 0x49, 0xa3, 0xaa, 0xbe, 0x5c, 0x41, 0xbe, 0x3d, 0xe6, 0x01, 0x30, 0x3f,
- 0x32, 0x19, 0xa3, 0xbc, 0x0a, 0x30, 0x15, 0x3e, 0xe1, 0xa5, 0x08, 0x3e,
- 0x16, 0x3a, 0x65, 0xbc, 0xfc, 0x1b, 0x2c, 0x3d, 0x93, 0x41, 0x3f, 0xbe,
- 0x04, 0x68, 0x8e, 0xbf, 0x26, 0x98, 0x8d, 0x3e, 0x41, 0x0f, 0x37, 0x3d,
- 0x92, 0xf9, 0xa2, 0xbd, 0x8b, 0xe5, 0xdd, 0xbd, 0x33, 0xc4, 0x05, 0x3e,
- 0x84, 0x5f, 0x28, 0x3c, 0x14, 0xd5, 0xef, 0x3e, 0x11, 0x67, 0x25, 0xbf,
- 0xf1, 0xc4, 0x25, 0xbe, 0xe7, 0xc5, 0xd1, 0xbd, 0x87, 0xea, 0x88, 0xbd,
- 0xba, 0xb9, 0xcf, 0x3d, 0x97, 0x6b, 0xf1, 0xbc, 0x0f, 0xff, 0x53, 0x3e,
- 0xb9, 0xbf, 0xa2, 0x3d, 0x78, 0xf5, 0x2f, 0x3d, 0xba, 0x2b, 0xf9, 0x3c,
- 0x42, 0xbe, 0x0b, 0xbe, 0x10, 0xad, 0xa4, 0x3d, 0x3d, 0xfa, 0x7c, 0xbd,
- 0xb9, 0xde, 0x63, 0xbd, 0xfa, 0xbd, 0xba, 0xbd, 0x01, 0xf2, 0x7e, 0xbe,
- 0xc6, 0x24, 0xee, 0x3d, 0x25, 0xad, 0x50, 0xbc, 0x57, 0xb9, 0x0c, 0x3e,
- 0xcd, 0xbf, 0xf5, 0x3c, 0x6e, 0xdc, 0x8a, 0x3d, 0xf0, 0x08, 0x84, 0x3d,
- 0xf9, 0x3e, 0x44, 0x3d, 0xce, 0x4a, 0x45, 0xbe, 0x9a, 0x58, 0x87, 0xbe,
- 0xd6, 0x63, 0x64, 0x3d, 0x23, 0xef, 0x0f, 0x3e, 0x19, 0x0a, 0x66, 0x3d,
- 0x6e, 0x83, 0xdc, 0x3d, 0xc7, 0x03, 0x4f, 0xbe, 0xbd, 0xde, 0x9c, 0x3c,
- 0x78, 0x02, 0xc9, 0x3d, 0x4c, 0x4e, 0x05, 0xbe, 0x7d, 0x95, 0xbc, 0xbe,
- 0xde, 0x8c, 0xfe, 0x3d, 0xfe, 0x11, 0x24, 0x3e, 0x25, 0x26, 0x53, 0x3c,
- 0xc7, 0xd1, 0x95, 0xbc, 0xfb, 0xa4, 0xf0, 0xbd, 0x0f, 0x24, 0x9b, 0x3d,
- 0x3d, 0x97, 0x41, 0xbe, 0x16, 0x9e, 0xf2, 0xbb, 0xa1, 0xbc, 0x15, 0xbe,
- 0xed, 0xda, 0x72, 0x3d, 0x54, 0xc1, 0x22, 0xbd, 0x02, 0xac, 0xac, 0xbe,
- 0x54, 0xe9, 0x84, 0x3e, 0xde, 0xb8, 0x26, 0xbe, 0x3c, 0x42, 0xc6, 0xbc,
- 0xf6, 0xbb, 0xc7, 0x3d, 0x9c, 0x27, 0x87, 0x3d, 0x28, 0x59, 0x61, 0x3d,
- 0xa7, 0x5e, 0x81, 0x3d, 0x6d, 0x2c, 0x3f, 0x3e, 0xca, 0x89, 0xf4, 0x3d,
- 0x5c, 0x44, 0x33, 0xbe, 0x5c, 0xad, 0x0e, 0xbe, 0x28, 0xf8, 0x39, 0xbe,
- 0x1f, 0x9f, 0xb9, 0x3d, 0x08, 0x86, 0x35, 0xbe, 0xd7, 0xea, 0x54, 0xbd,
- 0x65, 0x21, 0x3c, 0xbe, 0x68, 0x21, 0x7f, 0x3d, 0xdf, 0x4f, 0xbe, 0xbe,
- 0x64, 0x5a, 0x76, 0xbe, 0xf2, 0x0a, 0x73, 0xbe, 0x07, 0x42, 0x50, 0xbc,
- 0xbd, 0x3a, 0xda, 0xbd, 0x3d, 0x83, 0xda, 0xbd, 0x58, 0xb9, 0x20, 0xbe,
- 0xe8, 0x97, 0x2d, 0x3e, 0xf9, 0xaa, 0xb5, 0x3d, 0x1b, 0x98, 0xf8, 0x3c,
- 0x63, 0x46, 0xba, 0x3d, 0x4d, 0x8d, 0x30, 0xbd, 0x51, 0xf8, 0x1e, 0xbe,
- 0xb3, 0xf1, 0x6e, 0x3d, 0x5e, 0xad, 0x22, 0xbd, 0xcb, 0x5f, 0xdc, 0xbd,
- 0xcd, 0x18, 0xcb, 0xbd, 0xce, 0xfc, 0x0e, 0xbe, 0x9b, 0x62, 0x05, 0xbe,
- 0xd1, 0xd9, 0x9c, 0x3e, 0x88, 0xcf, 0xc7, 0xbd, 0xb4, 0xf1, 0xe2, 0x3d,
- 0x12, 0xf7, 0x30, 0x3d, 0xec, 0x00, 0x0a, 0xbe, 0x9a, 0xf5, 0x43, 0xbe,
- 0xe2, 0xca, 0x8a, 0x3c, 0xd1, 0x26, 0x1e, 0xbe, 0xfe, 0xfa, 0xb0, 0xbc,
- 0xd9, 0x5c, 0xea, 0xbd, 0x66, 0x55, 0x19, 0x3d, 0x3a, 0xba, 0x10, 0x3c,
- 0x9f, 0x1f, 0x08, 0x3e, 0x7c, 0xad, 0xe9, 0x3d, 0x95, 0x7d, 0xdd, 0x3c,
- 0xc8, 0xd7, 0x13, 0x3d, 0x61, 0x76, 0x63, 0xbe, 0x94, 0x65, 0xcf, 0xbd,
- 0x53, 0xf1, 0xdf, 0xbd, 0x9b, 0x6c, 0x2a, 0x3d, 0x0a, 0x9c, 0x27, 0xbc,
- 0x62, 0x48, 0x69, 0x3e, 0x80, 0x22, 0x25, 0x3e, 0xcb, 0xa8, 0xe6, 0xba,
- 0x79, 0x98, 0x89, 0x3e, 0xc8, 0xba, 0xc5, 0x3d, 0x6d, 0xcf, 0x54, 0xbd,
- 0xbc, 0x00, 0xa9, 0x3e, 0xb4, 0x4e, 0xa3, 0x3d, 0x07, 0x0f, 0x12, 0x3e,
- 0xc0, 0xc7, 0x19, 0x3c, 0x25, 0x8d, 0xea, 0x3e, 0x12, 0x36, 0x79, 0xba,
- 0xe1, 0xba, 0x87, 0x3c, 0xb7, 0x00, 0x25, 0x3f, 0xe3, 0xe8, 0xe4, 0xbd,
- 0xa3, 0xce, 0x76, 0xbe, 0x98, 0xac, 0x29, 0xbe, 0xbf, 0x85, 0xbf, 0x3c,
- 0x66, 0x89, 0x94, 0xbe, 0x3b, 0xfe, 0x2b, 0xbf, 0x94, 0x26, 0x85, 0xbe,
- 0x31, 0x16, 0x9b, 0xbc, 0x25, 0xf0, 0x28, 0x3d, 0x96, 0xfb, 0xe1, 0xbd,
- 0x05, 0x2d, 0x90, 0x3d, 0x62, 0xcd, 0xd2, 0xbe, 0xde, 0x99, 0x27, 0xbe,
- 0xe4, 0xbb, 0xb0, 0xbd, 0x15, 0x92, 0x1a, 0xbd, 0x47, 0x43, 0x4d, 0xbe,
- 0x29, 0x69, 0x34, 0x3d, 0x6d, 0x04, 0xa4, 0xbd, 0x59, 0x8d, 0x01, 0xbe,
- 0x64, 0xe7, 0x03, 0x3d, 0x79, 0x25, 0xf0, 0x3d, 0xf9, 0x86, 0x1b, 0xbe,
- 0xed, 0xb5, 0x3a, 0xbe, 0x9c, 0xf4, 0x2e, 0xbd, 0x19, 0x84, 0xfa, 0x3e,
- 0xab, 0x3e, 0xa3, 0xbd, 0xfb, 0x1f, 0x3b, 0x3e, 0x5e, 0x01, 0x0d, 0xbd,
- 0x37, 0x7b, 0xbe, 0xbe, 0x0c, 0x8b, 0xbc, 0x3e, 0x3c, 0x56, 0xa9, 0x3d,
- 0xae, 0xf1, 0x10, 0xbe, 0xef, 0x9d, 0x53, 0x3e, 0xc8, 0x8c, 0x2c, 0xbe,
- 0xa2, 0xd9, 0x54, 0x3b, 0x33, 0x3d, 0x99, 0x3d, 0xb6, 0x6f, 0x98, 0xbc,
- 0x63, 0x5e, 0x23, 0x3e, 0x21, 0x54, 0xc3, 0xbd, 0xa1, 0x07, 0x2e, 0xbf,
- 0xdd, 0x07, 0x72, 0x3f, 0xec, 0x57, 0xa4, 0xbe, 0x6d, 0xef, 0x19, 0xbe,
- 0x66, 0x31, 0x9f, 0x3d, 0x87, 0xac, 0xdd, 0xbe, 0x3e, 0xd5, 0x8d, 0xbd,
- 0x17, 0xe6, 0x76, 0x3f, 0xf8, 0x3d, 0xb1, 0x3c, 0xda, 0xbe, 0xd1, 0xbd,
- 0x4e, 0x25, 0x8e, 0xbd, 0x98, 0x90, 0xb1, 0xbc, 0x30, 0x09, 0xc0, 0x3b,
- 0xde, 0x0d, 0x48, 0xbc, 0xa0, 0xa5, 0x0c, 0xbe, 0x78, 0xd1, 0x30, 0xbe,
- 0x0c, 0x74, 0x01, 0x3f, 0x39, 0x9a, 0xdd, 0x3d, 0xb7, 0xf2, 0x4f, 0xbd,
- 0x59, 0x9e, 0x1b, 0xbe, 0x59, 0x2f, 0x88, 0x3d, 0xfa, 0x01, 0x5a, 0x3e,
- 0x98, 0x73, 0x97, 0xbd, 0x55, 0x99, 0x6f, 0xbd, 0xee, 0xf8, 0x0b, 0xbc,
- 0xb5, 0x27, 0x04, 0xbd, 0x7e, 0xdd, 0x87, 0x3e, 0x4e, 0xf4, 0xa0, 0xbe,
- 0xe8, 0x60, 0x07, 0x3d, 0x00, 0xf3, 0x25, 0xbd, 0x08, 0xe1, 0x0d, 0xbe,
- 0x9b, 0x25, 0xd1, 0x3d, 0x1f, 0x89, 0xbe, 0x3c, 0xf3, 0xfa, 0x29, 0x3e,
- 0x56, 0x76, 0xed, 0xbd, 0xf5, 0xb6, 0x23, 0xbd, 0x6e, 0x4e, 0x23, 0x3e,
- 0xd9, 0xc0, 0x72, 0x3c, 0x74, 0x14, 0x29, 0x3d, 0xc5, 0xe8, 0xa9, 0xbd,
- 0xed, 0xbb, 0x04, 0xbf, 0x21, 0x6c, 0xb4, 0x3e, 0xae, 0xc8, 0xc1, 0xbd,
- 0xa0, 0xc0, 0x28, 0x3d, 0xf5, 0x2d, 0xe8, 0xbe, 0xdb, 0xc7, 0x1f, 0x3f,
- 0x81, 0x0f, 0x5c, 0x3a, 0x86, 0x3a, 0x3c, 0xbb, 0x62, 0x75, 0x01, 0xbe,
- 0x8e, 0x80, 0xc1, 0x3c, 0x57, 0x48, 0xc1, 0x3d, 0x36, 0x92, 0x6f, 0xbd,
- 0x42, 0xf9, 0x0a, 0x3d, 0xf0, 0xec, 0x2d, 0xbe, 0x80, 0x75, 0x73, 0xbe,
- 0x75, 0x95, 0x37, 0xbe, 0x35, 0xa3, 0xa6, 0xbe, 0x54, 0x92, 0x34, 0x3e,
- 0x63, 0x37, 0x47, 0x3e, 0x6c, 0x44, 0x8d, 0x3e, 0x42, 0x91, 0x81, 0xbe,
- 0xc9, 0x25, 0xb3, 0x3d, 0x8f, 0x91, 0x04, 0x3e, 0xf0, 0x05, 0xa6, 0xbe,
- 0x28, 0xcb, 0xc5, 0xbc, 0x19, 0x27, 0x7a, 0xbe, 0x93, 0xff, 0x4a, 0x3e,
- 0xb8, 0x1f, 0x05, 0x3e, 0x1a, 0xd5, 0x91, 0xbc, 0x95, 0xa1, 0x21, 0xbe,
- 0x69, 0x04, 0x38, 0xbe, 0x79, 0x93, 0x42, 0xbe, 0x4b, 0xa1, 0xa0, 0xbe,
- 0x50, 0xe0, 0x19, 0xbd, 0x65, 0x30, 0x6f, 0x3d, 0x1a, 0x73, 0x2d, 0xbe,
- 0xcf, 0x54, 0x59, 0xbd, 0x2d, 0xbf, 0x53, 0xbd, 0x43, 0xa9, 0x1c, 0xbf,
- 0x7b, 0x37, 0x20, 0xbc, 0xf3, 0x42, 0x06, 0x3d, 0xc4, 0xac, 0x55, 0xbe,
- 0x6d, 0xfb, 0x3c, 0xbd, 0xbb, 0x66, 0xb9, 0x3d, 0xd9, 0x4e, 0xab, 0x3c,
- 0x11, 0x23, 0x2a, 0xbd, 0xf1, 0xc2, 0x27, 0x3e, 0x6f, 0x23, 0x3c, 0xbd,
- 0x81, 0x73, 0x12, 0xbe, 0x6f, 0xe4, 0xf4, 0xba, 0x1d, 0xd5, 0x3f, 0x3d,
- 0xdc, 0xcf, 0xbb, 0xbd, 0x72, 0xfe, 0x78, 0xbd, 0x77, 0x59, 0xb7, 0x3e,
- 0x5d, 0x0a, 0xcf, 0x3d, 0x1f, 0x9e, 0x06, 0xbe, 0xfc, 0x2d, 0xec, 0xbd,
- 0x73, 0xb4, 0x77, 0x3d, 0xd5, 0x24, 0xfc, 0xbd, 0x8e, 0xf9, 0x10, 0x3d,
- 0xb3, 0xbc, 0x27, 0xbe, 0xc6, 0xd1, 0x32, 0xbd, 0x1f, 0xbd, 0x5e, 0x3d,
- 0x24, 0x3f, 0x40, 0x3e, 0x84, 0xce, 0xae, 0xbe, 0x0f, 0x3e, 0x7f, 0xbe,
- 0x3c, 0xa1, 0x97, 0x3d, 0xfe, 0x98, 0xf9, 0x3a, 0xa3, 0xd3, 0x67, 0xbe,
- 0x09, 0x57, 0x84, 0x3d, 0xa0, 0x0f, 0x7e, 0x3c, 0x68, 0x58, 0x3c, 0xbd,
- 0x26, 0x84, 0xcf, 0x3c, 0xe0, 0x50, 0x20, 0x3d, 0x7d, 0x63, 0x76, 0xbd,
- 0x65, 0xbe, 0x23, 0xbd, 0x3f, 0xd4, 0x39, 0x3c, 0x9f, 0x01, 0x69, 0xbd,
- 0x26, 0xeb, 0x5b, 0x3d, 0xfc, 0xfe, 0x22, 0x3e, 0x29, 0x6d, 0x1a, 0xbd,
- 0x1c, 0x9f, 0x67, 0xbe, 0x72, 0xcd, 0xa9, 0x3d, 0xf7, 0x14, 0x20, 0xb9,
- 0x14, 0x16, 0x90, 0x3d, 0xe5, 0x36, 0x83, 0xbe, 0x00, 0x6c, 0x45, 0x3c,
- 0x47, 0x3b, 0x98, 0x3d, 0x8a, 0xb5, 0xd7, 0x3d, 0xca, 0x11, 0x81, 0xbe,
- 0xb2, 0xa9, 0x95, 0xbe, 0xad, 0xe3, 0xb1, 0xbc, 0x92, 0x19, 0x62, 0xbe,
- 0x36, 0xa1, 0x4b, 0x3e, 0x1d, 0x4c, 0xab, 0xbd, 0x70, 0x6b, 0x2e, 0xbd,
- 0xbb, 0x9c, 0x88, 0x3c, 0x58, 0x91, 0x0e, 0xbe, 0xc3, 0x6b, 0x45, 0x3c,
- 0xfb, 0x7f, 0x8e, 0xbd, 0x8d, 0xb0, 0x09, 0x3e, 0x46, 0xdf, 0x16, 0x3d,
- 0x76, 0xff, 0x52, 0xbd, 0x1f, 0x9e, 0xa8, 0x3d, 0x3b, 0x1a, 0x0b, 0xbe,
- 0x76, 0x0e, 0x2a, 0xbe, 0x37, 0x97, 0xc9, 0x3b, 0x49, 0x1b, 0xbf, 0x3d,
- 0xe0, 0x08, 0x0a, 0x3d, 0x29, 0xc8, 0xf0, 0x3d, 0x76, 0x0d, 0xbd, 0x3b,
- 0xcf, 0x0b, 0x87, 0xbe, 0xe6, 0xf5, 0x03, 0x3e, 0xc6, 0x1f, 0x2c, 0xbd,
- 0xae, 0x57, 0x2b, 0x3d, 0xab, 0x24, 0x06, 0xbe, 0x27, 0x24, 0xbb, 0xbd,
- 0x96, 0xc0, 0x55, 0x3d, 0xb0, 0x29, 0xbe, 0x3d, 0x62, 0xa5, 0x5f, 0xbd,
- 0x84, 0x14, 0x0c, 0xbe, 0xbd, 0x12, 0xef, 0xbc, 0x95, 0xed, 0x2d, 0xbe,
- 0x9f, 0xaa, 0x21, 0x3e, 0xee, 0x43, 0x04, 0xbe, 0xb1, 0x05, 0x9f, 0xbe,
- 0xa9, 0x88, 0x5c, 0xbd, 0x98, 0x90, 0x03, 0xbf, 0xc8, 0xd6, 0xeb, 0x3c,
- 0xcc, 0x69, 0x19, 0x3d, 0x36, 0x66, 0x02, 0xbe, 0xf7, 0xfe, 0x04, 0xbe,
- 0xa9, 0x9c, 0x9b, 0xbd, 0x45, 0x3c, 0x45, 0xbe, 0x2a, 0xfa, 0x96, 0xbe,
- 0x42, 0x78, 0xb1, 0xba, 0xa7, 0xde, 0x27, 0x3e, 0xb9, 0x55, 0x2d, 0xbe,
- 0x53, 0xdf, 0x10, 0xbc, 0xa0, 0x3f, 0x0b, 0xbe, 0x87, 0xa8, 0xf7, 0xbe,
- 0x69, 0x78, 0x1f, 0xbe, 0xc7, 0x90, 0x5b, 0xbe, 0xac, 0x0f, 0x21, 0xbc,
- 0x34, 0x2f, 0x15, 0xbd, 0x4c, 0x9c, 0xde, 0xbc, 0xd1, 0x23, 0x88, 0xbd,
- 0x17, 0x05, 0xfb, 0xbd, 0x63, 0x02, 0x84, 0xbe, 0xc1, 0xeb, 0x48, 0xbe,
- 0x7a, 0x65, 0x6c, 0xbd, 0x2c, 0xe1, 0x32, 0x3d, 0x16, 0x9e, 0x6e, 0x3d,
- 0xaf, 0x0d, 0x85, 0x3e, 0x61, 0xf3, 0xab, 0x3a, 0x7a, 0xcc, 0xc6, 0x3e,
- 0x0e, 0x94, 0x6a, 0xbd, 0x4b, 0xa5, 0x28, 0xbe, 0xb0, 0xdf, 0x6a, 0xbd,
- 0x46, 0xc9, 0x91, 0xbd, 0x9e, 0xd0, 0x19, 0xbe, 0xc1, 0x78, 0xad, 0xbc,
- 0x2b, 0x6c, 0x9f, 0xbe, 0x2b, 0x98, 0xf8, 0x3c, 0xe1, 0xeb, 0xf8, 0x3d,
- 0xc6, 0xd7, 0xf1, 0xbc, 0xa8, 0x6e, 0x1b, 0xbe, 0x81, 0x2f, 0x11, 0xbe,
- 0xc2, 0x38, 0xdc, 0x3c, 0x85, 0xa9, 0x04, 0x3e, 0x7f, 0xbe, 0x92, 0xbc,
- 0x6e, 0x28, 0x8c, 0xbe, 0x22, 0xd7, 0x91, 0xbd, 0xb2, 0x06, 0x0d, 0xbe,
- 0xc5, 0x0a, 0x37, 0x3d, 0xc5, 0xc4, 0xea, 0xbd, 0xeb, 0xbe, 0x42, 0x3e,
- 0x88, 0xe0, 0xf5, 0xbb, 0x08, 0xbf, 0x88, 0xbc, 0x61, 0x59, 0x63, 0xbe,
- 0x7d, 0x7c, 0xff, 0xbd, 0x20, 0x22, 0x5f, 0x3e, 0x93, 0x1f, 0xd9, 0xbc,
- 0xde, 0x42, 0x79, 0x3c, 0x58, 0x40, 0x56, 0xbd, 0x9a, 0xc6, 0xf5, 0x3c,
- 0xcb, 0x9f, 0xfe, 0xbb, 0x8f, 0x34, 0xad, 0x3b, 0xcf, 0x48, 0x46, 0xbe,
- 0xd2, 0xed, 0xbf, 0x3d, 0xd1, 0xb3, 0x8d, 0x3e, 0x33, 0xd8, 0x81, 0xbe,
- 0xdc, 0x3a, 0xfd, 0xbe, 0x3f, 0xc0, 0x06, 0xbe, 0x3b, 0x26, 0x7b, 0xbe,
- 0xf4, 0x05, 0x64, 0x3e, 0xda, 0x01, 0xdc, 0x3d, 0x1e, 0x0b, 0x74, 0xbd,
- 0x8c, 0x77, 0x74, 0xbd, 0xc6, 0x88, 0x33, 0xbe, 0x01, 0xf2, 0xe4, 0x3d,
- 0x5e, 0xf5, 0xd6, 0x3d, 0xa7, 0x64, 0xb6, 0xbd, 0xcf, 0x6f, 0x14, 0x3e,
- 0xe3, 0x70, 0x6d, 0xbe, 0xeb, 0x6e, 0x39, 0x3e, 0xfb, 0x78, 0xb0, 0x3c,
- 0xdc, 0xe7, 0xce, 0x3c, 0x7b, 0x22, 0xc4, 0xbd, 0x20, 0x03, 0x93, 0xbd,
- 0x3c, 0x19, 0xeb, 0xbd, 0x2a, 0x40, 0x3b, 0x3e, 0x17, 0x68, 0x86, 0x3c,
- 0x1f, 0x5a, 0xee, 0xbd, 0xeb, 0x19, 0xbc, 0xbd, 0xb0, 0xdc, 0xff, 0xbb,
- 0x22, 0xbe, 0x2b, 0xbc, 0xd2, 0x75, 0xf7, 0x3d, 0xce, 0xd2, 0xca, 0x3e,
- 0x70, 0x7b, 0x82, 0xbd, 0xbb, 0x73, 0x31, 0x3f, 0x15, 0x21, 0x24, 0xbd,
- 0x17, 0xe9, 0x97, 0x3e, 0x57, 0xe8, 0x33, 0xbf, 0x6c, 0x3d, 0x09, 0xbf,
- 0xf6, 0xd9, 0x3d, 0xbe, 0x0b, 0xff, 0xe7, 0xbd, 0x05, 0x49, 0x6d, 0x3e,
- 0xab, 0x3d, 0x94, 0x3c, 0xa9, 0x37, 0x06, 0xbe, 0x90, 0x16, 0x9b, 0xbe,
- 0x96, 0xd3, 0x0b, 0x3e, 0xa7, 0x53, 0x92, 0xbd, 0x7d, 0xab, 0x9c, 0xbe,
- 0x9b, 0xab, 0x10, 0xbe, 0x1f, 0x65, 0x4e, 0x3a, 0x39, 0x80, 0x30, 0xbd,
- 0x5e, 0xd8, 0x0c, 0x3d, 0x96, 0xa6, 0x86, 0xbe, 0x32, 0x92, 0xa2, 0x3e,
- 0xbc, 0x01, 0x3d, 0xbe, 0x6a, 0x77, 0xc5, 0x3e, 0xaf, 0x70, 0x34, 0x3e,
- 0x56, 0xe7, 0x9a, 0xbd, 0xa9, 0x62, 0x3f, 0x3e, 0x89, 0x83, 0x26, 0xbe,
- 0x62, 0xa4, 0x0d, 0xbe, 0x77, 0x4b, 0x81, 0x3e, 0xb5, 0x85, 0x98, 0x3d,
- 0x48, 0xef, 0x32, 0x3d, 0x92, 0x77, 0x3b, 0xbe, 0x5c, 0x97, 0xad, 0xbe,
- 0xab, 0xe5, 0x8c, 0x3d, 0x44, 0x0a, 0xb5, 0xbd, 0x06, 0xc2, 0x5b, 0x3e,
- 0x24, 0xa3, 0xe4, 0xbe, 0xec, 0x1b, 0x96, 0xbd, 0x99, 0xc3, 0xc0, 0xbe,
- 0x54, 0x23, 0x63, 0x3e, 0xa6, 0xd8, 0xea, 0xbe, 0x5e, 0x04, 0x44, 0xbe,
- 0xe5, 0xb8, 0x28, 0xbf, 0xfc, 0x95, 0x33, 0xbc, 0x1c, 0x6a, 0x40, 0xbd,
- 0xca, 0x24, 0x85, 0x3e, 0xfb, 0xa1, 0xc7, 0xbc, 0xef, 0x91, 0x21, 0x3e,
- 0x36, 0x90, 0x5c, 0x3e, 0xdf, 0x83, 0xe0, 0x3c, 0xc3, 0x12, 0x89, 0xbd,
- 0xba, 0x1b, 0x95, 0x3e, 0xd2, 0x0b, 0xfc, 0xbe, 0xb4, 0x90, 0x67, 0x3d,
- 0xb0, 0x95, 0x84, 0x3e, 0xb4, 0x4e, 0x5d, 0x3d, 0x34, 0xa9, 0x35, 0x3e,
- 0xdd, 0xae, 0x04, 0x3e, 0x89, 0x00, 0x30, 0xba, 0x98, 0xfd, 0xbf, 0x3d,
- 0xc4, 0x34, 0x2d, 0x3e, 0x56, 0x4f, 0x66, 0xbe, 0x4a, 0x93, 0x33, 0xbe,
- 0x1e, 0x54, 0xf1, 0x3e, 0x93, 0xf5, 0x48, 0xbe, 0x3e, 0xbf, 0x69, 0x3d,
- 0xbd, 0xc3, 0x36, 0x3c, 0x13, 0x72, 0x00, 0x3e, 0x2e, 0x29, 0x7d, 0xbe,
- 0x44, 0xbf, 0xdd, 0x3c, 0x66, 0xe5, 0xaf, 0xbd, 0x15, 0xaa, 0x96, 0xbd,
- 0xdc, 0xd6, 0xbe, 0xbd, 0x4f, 0xa7, 0xd5, 0xbd, 0x1a, 0xe5, 0x2c, 0xbd,
- 0x15, 0x47, 0x98, 0x3d, 0x39, 0x1c, 0xaf, 0xbd, 0xc3, 0x0b, 0xf1, 0xbc,
- 0x2b, 0x0f, 0x19, 0x3e, 0xad, 0x41, 0x43, 0x3c, 0xfc, 0xe9, 0x65, 0x3e,
- 0x08, 0x38, 0x6b, 0x3d, 0x97, 0xe9, 0xbf, 0xbd, 0xa5, 0xd7, 0xab, 0x3d,
- 0xea, 0xcc, 0x31, 0xbd, 0x12, 0x96, 0xad, 0x3e, 0x6e, 0x36, 0xa1, 0xbe,
- 0x15, 0xaf, 0xe9, 0xbe, 0xfa, 0xe6, 0x42, 0xbe, 0x53, 0x80, 0x2c, 0xbc,
- 0xfd, 0x69, 0x06, 0x3e, 0x3f, 0x08, 0x25, 0xbe, 0x8a, 0x70, 0x19, 0x3e,
- 0x9f, 0xb2, 0xa5, 0x3d, 0xb4, 0x49, 0x3e, 0x3f, 0x5a, 0x8b, 0x7f, 0x3e,
- 0xea, 0xb7, 0xb1, 0xbd, 0x1f, 0xa0, 0x8c, 0xbe, 0x35, 0x7f, 0x08, 0xbe,
- 0xd0, 0xac, 0x50, 0x3d, 0xda, 0x53, 0xbc, 0xbd, 0x5a, 0xdc, 0xa9, 0x3d,
- 0x33, 0x15, 0x17, 0xbe, 0x70, 0x33, 0xff, 0xbc, 0x42, 0x3c, 0x84, 0xbc,
- 0xb5, 0x69, 0xe5, 0x3c, 0x78, 0x6b, 0xf4, 0x3c, 0x17, 0xe3, 0xef, 0x3d,
- 0x97, 0xe3, 0x94, 0xbd, 0x7b, 0x10, 0x1a, 0xbd, 0x5e, 0x75, 0xe7, 0x3b,
- 0x0e, 0xb5, 0x20, 0x3d, 0xf1, 0x66, 0x30, 0xbc, 0xf2, 0xc7, 0xb8, 0xbd,
- 0x64, 0xef, 0xd8, 0xbd, 0x6f, 0xca, 0x06, 0xbe, 0xde, 0x22, 0x52, 0xbe,
- 0x1a, 0x4f, 0x3b, 0xbd, 0xc7, 0x49, 0xea, 0x3b, 0x0d, 0xe1, 0xad, 0xbd,
- 0x30, 0xee, 0x5b, 0xbd, 0x69, 0x16, 0x12, 0x3e, 0xeb, 0x48, 0x80, 0x3c,
- 0xdb, 0x25, 0xcc, 0x3d, 0x7e, 0x2a, 0x10, 0xbe, 0x64, 0xad, 0x7c, 0x3d,
- 0xcf, 0x32, 0xe1, 0xbd, 0x31, 0x88, 0x0e, 0x3d, 0x06, 0x33, 0x81, 0xbe,
- 0x42, 0x0d, 0x6c, 0xbd, 0xc1, 0x55, 0xc8, 0xbb, 0x7b, 0x5f, 0x57, 0xbd,
- 0xc9, 0x29, 0x4f, 0xbd, 0x7e, 0xc9, 0xd7, 0x3d, 0x7d, 0xdf, 0x16, 0xbd,
- 0xf5, 0x77, 0x99, 0xbd, 0x00, 0xd0, 0xe7, 0xbd, 0x4a, 0x2f, 0x6b, 0xbd,
- 0x54, 0x8e, 0xc4, 0x3c, 0x50, 0xf8, 0x3a, 0xbb, 0x41, 0x8d, 0xac, 0xbe,
- 0xe5, 0x9c, 0x84, 0x3e, 0x49, 0x13, 0x0a, 0x3e, 0xbc, 0x4c, 0x18, 0xbe,
- 0x64, 0x15, 0x92, 0xbc, 0x36, 0xc9, 0xc5, 0xbd, 0x03, 0x3f, 0x0e, 0x3d,
- 0xf8, 0x74, 0x56, 0xbc, 0x15, 0xac, 0xd6, 0x3c, 0x84, 0x67, 0xce, 0x3d,
- 0xbe, 0x38, 0xb3, 0xbd, 0x9a, 0xd2, 0x84, 0xbe, 0xae, 0xf6, 0x8a, 0xbe,
- 0x41, 0xca, 0x1e, 0xbe, 0x88, 0xbc, 0x8a, 0x3d, 0x26, 0x4a, 0xde, 0xbd,
- 0xf3, 0x9c, 0x20, 0xbe, 0xe8, 0xf0, 0xb3, 0x3d, 0x46, 0xd0, 0x24, 0xbe,
- 0x71, 0xc7, 0xf4, 0xbd, 0x92, 0x1e, 0x0a, 0xbe, 0xbc, 0x80, 0x99, 0xbd,
- 0xb0, 0x8e, 0xed, 0xbd, 0x28, 0x3c, 0xa3, 0xbd, 0x48, 0x82, 0xc7, 0xbd,
- 0xc6, 0x23, 0x87, 0x3c, 0x2f, 0x5d, 0x2e, 0x3e, 0x30, 0x49, 0x54, 0xbe,
- 0x98, 0x6a, 0x76, 0xbd, 0x8c, 0x95, 0x87, 0xbd, 0x1a, 0x04, 0x99, 0xbe,
- 0x8d, 0x71, 0xa7, 0xbd, 0xf7, 0xb9, 0xea, 0xbb, 0x81, 0xd6, 0x23, 0xbe,
- 0x12, 0xf3, 0x96, 0x3d, 0x45, 0xff, 0x9d, 0x3b, 0xf3, 0x18, 0x75, 0xbe,
- 0xfa, 0x30, 0x97, 0x3d, 0x5c, 0x51, 0x62, 0xbc, 0xbe, 0xf2, 0x29, 0x3e,
- 0x8a, 0xae, 0xa8, 0xbd, 0x40, 0xdf, 0x57, 0xbd, 0x81, 0x7e, 0x92, 0xbd,
- 0x67, 0xce, 0x15, 0xbe, 0x62, 0x5a, 0xb3, 0xbd, 0xbd, 0xe4, 0x56, 0xbd,
- 0xc6, 0x4f, 0x11, 0xbd, 0xa4, 0x77, 0x00, 0x3e, 0x79, 0xb3, 0xf5, 0x3c,
- 0x22, 0x25, 0x1d, 0x3e, 0xe3, 0x03, 0x77, 0x3e, 0x8b, 0x8e, 0x0e, 0xbe,
- 0x34, 0xc9, 0x63, 0xbd, 0xae, 0xe8, 0xa2, 0xbe, 0xbb, 0x63, 0x96, 0xbe,
- 0xf8, 0x73, 0x28, 0xbe, 0x16, 0x8e, 0xe5, 0xba, 0x0c, 0x41, 0x5d, 0xbc,
- 0xfe, 0x36, 0x11, 0x3c, 0xb4, 0xe4, 0x7f, 0x3e, 0x12, 0x41, 0x3f, 0xbe,
- 0xe4, 0xcd, 0x57, 0x3e, 0xb8, 0xd0, 0x9c, 0xbd, 0x8a, 0xf9, 0x7c, 0xbd,
- 0xa4, 0x70, 0x93, 0x3e, 0x94, 0x26, 0x7d, 0x3e, 0x27, 0x07, 0x70, 0x3e,
- 0x1f, 0xe6, 0x18, 0x3d, 0x82, 0xe8, 0x93, 0x3e, 0x20, 0xa5, 0x97, 0x3d,
- 0xfc, 0xf6, 0x1a, 0xbe, 0xd7, 0x09, 0xed, 0x3e, 0xb7, 0x0c, 0xc1, 0xbd,
- 0xcb, 0xb7, 0x3b, 0xbe, 0xc3, 0x74, 0x93, 0xbe, 0x24, 0xfe, 0x8c, 0x3c,
- 0x1a, 0xe2, 0xc6, 0xbe, 0x5a, 0x29, 0x02, 0xbf, 0x37, 0xf2, 0x4a, 0xbe,
- 0x1a, 0xbc, 0x8a, 0x3b, 0x3c, 0x10, 0x64, 0xbe, 0xa8, 0xb5, 0xab, 0xbe,
- 0x91, 0x16, 0xe6, 0x3c, 0xe2, 0x1c, 0xb2, 0xbe, 0x37, 0xac, 0x1b, 0xbe,
- 0x3e, 0x40, 0x1d, 0xbc, 0x91, 0x5f, 0x55, 0x3e, 0x41, 0x62, 0xc3, 0xbd,
- 0x7e, 0x57, 0xa6, 0xbd, 0xbf, 0x03, 0x29, 0xbe, 0xee, 0x9b, 0x36, 0xbe,
- 0x38, 0xdb, 0x03, 0xbe, 0xde, 0x03, 0x62, 0x3e, 0x63, 0x9e, 0x8d, 0x3c,
- 0x0d, 0x44, 0x23, 0xbc, 0xf2, 0x59, 0xf7, 0xbd, 0x28, 0x0b, 0xb4, 0x3e,
- 0x3b, 0x35, 0x0a, 0xbe, 0x75, 0xd7, 0xab, 0x3c, 0x87, 0x97, 0x06, 0x3e,
- 0x0a, 0xd7, 0x85, 0xbc, 0xc9, 0x02, 0x86, 0x3e, 0xf6, 0xae, 0x43, 0x3d,
- 0x24, 0x0c, 0x76, 0x3d, 0x04, 0x71, 0x24, 0x3e, 0xf6, 0x9d, 0xe5, 0xbd,
- 0x8d, 0x7d, 0x18, 0xbe, 0xe9, 0xfd, 0x43, 0x3e, 0xa2, 0xa9, 0xa8, 0xbd,
- 0x5a, 0xab, 0x90, 0x3d, 0x3f, 0xf0, 0x8e, 0x3d, 0x8d, 0xaa, 0x34, 0xbf,
- 0x38, 0x33, 0x84, 0x3f, 0xc9, 0x3e, 0xa7, 0xbe, 0xb0, 0xf0, 0xa5, 0xbd,
- 0x20, 0xdb, 0x7e, 0x3e, 0x1b, 0x7f, 0xd6, 0xbe, 0x23, 0xea, 0x35, 0x3d,
- 0xf9, 0x72, 0x60, 0x3f, 0x08, 0x54, 0xf9, 0x3d, 0x4d, 0x14, 0x04, 0x3e,
- 0xfa, 0xca, 0x7d, 0xbe, 0x5a, 0x08, 0x91, 0xbe, 0xb4, 0x2d, 0xf6, 0xbd,
- 0xfd, 0x92, 0x84, 0xbd, 0x72, 0x22, 0xb1, 0xbd, 0x75, 0xb7, 0x0d, 0xbe,
- 0x24, 0x79, 0xc0, 0x3e, 0x66, 0x8b, 0x43, 0x3c, 0x11, 0x1b, 0x13, 0x3d,
- 0xd8, 0xab, 0x07, 0xbe, 0x1b, 0x2b, 0x33, 0x3e, 0x4c, 0x68, 0x94, 0x3e,
- 0x80, 0x7b, 0x2e, 0xbd, 0x8f, 0xcd, 0x72, 0xbe, 0x67, 0x44, 0x5f, 0xbd,
- 0x8e, 0xa2, 0xea, 0xbd, 0x32, 0x61, 0x98, 0x3e, 0x17, 0x46, 0x25, 0xbe,
- 0xf3, 0xe5, 0x14, 0x3d, 0x7f, 0x10, 0xee, 0x3d, 0x41, 0x45, 0x48, 0x3e,
- 0xd8, 0xef, 0xbf, 0x3c, 0xbd, 0xce, 0x7c, 0xbd, 0xdf, 0x00, 0x11, 0xbd,
- 0x61, 0x29, 0xe6, 0xbd, 0xd4, 0xdb, 0x3e, 0xbd, 0x14, 0x63, 0xd0, 0x3d,
- 0xbf, 0x69, 0x74, 0x3d, 0x7b, 0x57, 0xf8, 0x3d, 0xc5, 0x74, 0x7e, 0xbd,
- 0xa7, 0xad, 0xac, 0xbe, 0x8f, 0x6e, 0x3a, 0x3e, 0x6d, 0x96, 0x74, 0x3d,
- 0x7f, 0xf7, 0x89, 0x3c, 0x78, 0xca, 0x92, 0xbe, 0x9a, 0x82, 0x05, 0x3f,
- 0x82, 0x6a, 0xb0, 0x3c, 0x83, 0x17, 0x22, 0x3c, 0x4d, 0x87, 0x2c, 0xbe,
- 0x20, 0x15, 0x68, 0xbe, 0xc6, 0x55, 0x3f, 0x3e, 0xa0, 0x31, 0x1f, 0xbe,
- 0xf7, 0x4d, 0xf6, 0xbc, 0xab, 0x30, 0x17, 0xbe, 0x2f, 0xc5, 0xb8, 0xbd,
- 0x03, 0xb8, 0x6f, 0xbd, 0xd8, 0x31, 0x00, 0xbe, 0x3b, 0x32, 0x45, 0x3e,
- 0x7d, 0xd2, 0x47, 0x3e, 0xe7, 0xaa, 0x37, 0x3e, 0xcb, 0xf4, 0x4f, 0xbd,
- 0xfa, 0x02, 0xe3, 0xbd, 0x26, 0x33, 0xef, 0xba, 0xce, 0x88, 0x80, 0xbe,
- 0x78, 0xd4, 0xba, 0xbd, 0x7a, 0x20, 0x8c, 0xbe, 0x08, 0xe0, 0x1f, 0x3e,
- 0x7d, 0x43, 0x21, 0xbe, 0x78, 0x9a, 0xe7, 0x3d, 0xf6, 0x7b, 0x49, 0xbe,
- 0xd5, 0x1c, 0x39, 0xbe, 0xec, 0xd3, 0x20, 0xbe, 0xf9, 0x4a, 0x8e, 0xbe,
- 0x2a, 0xdc, 0x6e, 0x3d, 0xe0, 0x10, 0x20, 0x3d, 0x52, 0xe1, 0x38, 0xbd,
- 0xff, 0x78, 0xe5, 0x3c, 0x7f, 0xc4, 0xc0, 0x3d, 0x0c, 0xda, 0x03, 0xbf,
- 0x99, 0x3e, 0xe5, 0xbb, 0x88, 0x12, 0x65, 0x3d, 0xc1, 0xe7, 0x3f, 0xbd,
- 0x4a, 0x93, 0x80, 0xbe, 0xbb, 0x97, 0x31, 0xbc, 0x27, 0xb0, 0xc3, 0xbd,
- 0x15, 0x9e, 0x98, 0xbc, 0x9f, 0x1d, 0xde, 0xbc, 0x6e, 0x4e, 0x62, 0xbd,
- 0xd8, 0x93, 0xcf, 0xbd, 0xba, 0x47, 0x17, 0xbe, 0x80, 0x57, 0x9e, 0x3d,
- 0xfb, 0xe1, 0x9e, 0xbd, 0x7c, 0x6b, 0x49, 0x3c, 0xd5, 0x8b, 0x9e, 0x3e,
- 0x1a, 0xba, 0x25, 0x3e, 0xbc, 0xbf, 0x57, 0xbe, 0x63, 0xd9, 0x15, 0x3d,
- 0x1c, 0x4a, 0x31, 0x3d, 0x74, 0xf4, 0x00, 0xbe, 0xbd, 0x5a, 0x43, 0xbc,
- 0x5e, 0x39, 0xc4, 0xbd, 0xc2, 0x22, 0x95, 0x3e, 0xb8, 0x23, 0xd8, 0xbd,
- 0xfb, 0x96, 0xa2, 0x3d, 0x67, 0x53, 0xc6, 0xbd, 0x8b, 0x42, 0x1e, 0xbe,
- 0xb5, 0x7a, 0xec, 0xbd, 0x97, 0x31, 0xc6, 0x3d, 0x78, 0x21, 0x79, 0xbc,
- 0xb3, 0x48, 0x39, 0x3e, 0x18, 0x6f, 0xd4, 0x3d, 0x10, 0xd1, 0x2e, 0xbd,
- 0xe0, 0x30, 0x5b, 0x3d, 0xeb, 0xdf, 0x8f, 0xbd, 0xe7, 0xfc, 0xad, 0x3b,
- 0x99, 0x24, 0xe7, 0xbb, 0x2d, 0x00, 0xab, 0xbc, 0xd3, 0x34, 0x73, 0xbd,
- 0x68, 0xe1, 0x3d, 0xbe, 0x88, 0x97, 0x5d, 0x3e, 0x50, 0x13, 0xd4, 0xbd,
- 0xd6, 0x47, 0x53, 0xbd, 0x72, 0x3c, 0xbb, 0xbd, 0xa0, 0x0e, 0x3e, 0xbe,
- 0xc4, 0x21, 0x0d, 0x3e, 0x7d, 0x0a, 0x36, 0xbd, 0xbc, 0x3a, 0x23, 0xbd,
- 0x8e, 0x7f, 0x80, 0xbd, 0x1e, 0x73, 0x91, 0xbb, 0x32, 0xe0, 0xd0, 0xbd,
- 0xcc, 0x8c, 0xdf, 0xbe, 0xeb, 0x5c, 0x0a, 0xbe, 0xe9, 0x2e, 0x2b, 0xbe,
- 0x29, 0x79, 0x0c, 0x3e, 0x8a, 0xd3, 0x96, 0xbd, 0xce, 0x64, 0x87, 0xbb,
- 0xae, 0xc0, 0x4e, 0x3d, 0xd0, 0xbf, 0x6e, 0x3c, 0x77, 0x7b, 0x9d, 0x3d,
- 0x7d, 0x94, 0x2c, 0x3d, 0x88, 0x18, 0x04, 0x3b, 0xd1, 0x00, 0xa5, 0xbd,
- 0xb8, 0x65, 0xea, 0xbd, 0x61, 0xc4, 0xb2, 0xbd, 0xf3, 0x3c, 0xee, 0xbd,
- 0xb7, 0x64, 0x09, 0xbe, 0xf0, 0xac, 0xd2, 0xbd, 0x3b, 0xb7, 0xd2, 0xbb,
- 0x4f, 0x29, 0x3a, 0xbe, 0x12, 0x4c, 0x63, 0xbd, 0xc7, 0xdc, 0xad, 0xbe,
- 0x2e, 0xab, 0x84, 0xbe, 0x53, 0xed, 0x82, 0x3e, 0x7a, 0x51, 0x4d, 0xbe,
- 0x5d, 0xd2, 0xcd, 0x3c, 0xcb, 0x2d, 0xe8, 0xbd, 0x49, 0x13, 0x95, 0x3e,
- 0x21, 0xcc, 0x2d, 0x3e, 0x5d, 0xac, 0x1f, 0xbe, 0x88, 0x74, 0x51, 0x3d,
- 0x56, 0xe8, 0xaa, 0xbd, 0xbf, 0xe9, 0x37, 0xbe, 0xe0, 0x6d, 0x89, 0xbe,
- 0x12, 0x91, 0x62, 0xbd, 0xae, 0x6d, 0x19, 0xbc, 0x70, 0xf1, 0xdd, 0xbd,
- 0x4b, 0x2c, 0x88, 0x3c, 0xb5, 0x10, 0xf9, 0xbe, 0x5c, 0xde, 0x20, 0x3e,
- 0x36, 0xc0, 0xa1, 0x3d, 0x33, 0x98, 0xa5, 0xbb, 0xb3, 0x4f, 0x52, 0xbe,
- 0xe9, 0x26, 0xd6, 0xbd, 0xf5, 0xfc, 0xdc, 0xbd, 0xbd, 0x7a, 0x7c, 0xbe,
- 0x6f, 0x6c, 0xd0, 0xbd, 0x51, 0xfb, 0x37, 0x3e, 0xa7, 0x90, 0xc9, 0x3d,
- 0x36, 0xbb, 0x31, 0xbd, 0xb5, 0x78, 0x69, 0xbd, 0x8c, 0x3b, 0x89, 0xbc,
- 0x34, 0x34, 0x8a, 0x3d, 0x92, 0xd4, 0x07, 0xbd, 0x75, 0xa7, 0xd7, 0xbb,
- 0xbe, 0x19, 0xb2, 0x3b, 0xf3, 0x15, 0x48, 0x3e, 0x63, 0x9d, 0x3a, 0xbc,
- 0xee, 0x41, 0xf2, 0x3d, 0xb7, 0x25, 0x8a, 0xbe, 0x1d, 0x7e, 0x4e, 0xbe,
- 0x45, 0x5f, 0xde, 0xbd, 0x30, 0xad, 0xcb, 0xba, 0x11, 0x1b, 0x21, 0xbe,
- 0x17, 0xc5, 0xae, 0xbd, 0x12, 0x72, 0x08, 0xbe, 0xa7, 0x1e, 0xdd, 0x3e,
- 0xef, 0x0b, 0x71, 0xbe, 0xbb, 0x2f, 0x42, 0xbe, 0x6a, 0x64, 0xc3, 0xbd,
- 0x6b, 0xb4, 0x04, 0xbe, 0x40, 0x11, 0x76, 0xbe, 0xd3, 0x78, 0x6d, 0x3d,
- 0xb9, 0x72, 0x6b, 0xbe, 0xf0, 0x41, 0x62, 0xbd, 0xff, 0xf2, 0xad, 0xbd,
- 0x73, 0xad, 0xd0, 0xbd, 0x3c, 0x46, 0x04, 0xbc, 0x3b, 0x46, 0x4f, 0xbe,
- 0x1a, 0xa5, 0x03, 0xbe, 0x92, 0x31, 0xcc, 0x3d, 0x1e, 0x6d, 0x05, 0xbe,
- 0x37, 0x58, 0xe0, 0xbd, 0x00, 0xa9, 0x64, 0x3d, 0x14, 0x4d, 0x11, 0x3d,
- 0x8e, 0xb7, 0x93, 0x3d, 0x98, 0xf4, 0x27, 0xbe, 0x72, 0x6f, 0x51, 0xbd,
- 0x62, 0xdf, 0xea, 0xbd, 0xc1, 0xa0, 0x2d, 0xbc, 0x64, 0xab, 0x00, 0xbe,
- 0xe6, 0x73, 0x38, 0xbd, 0xe0, 0x3a, 0x82, 0x3e, 0x4a, 0x2b, 0x2b, 0x3d,
- 0x08, 0x3a, 0x7e, 0x3d, 0xdf, 0x2b, 0xd3, 0x3d, 0x75, 0xd3, 0x03, 0xbe,
- 0xb7, 0x64, 0xad, 0x3d, 0x64, 0x35, 0x82, 0xbe, 0x33, 0xfc, 0xb2, 0xbc,
- 0x07, 0x1b, 0xbe, 0xbd, 0xa3, 0xa4, 0x6a, 0x3e, 0xb7, 0x32, 0x99, 0xbe,
- 0xf7, 0x1b, 0xe2, 0xbe, 0x02, 0x10, 0xbf, 0xbc, 0x66, 0xe8, 0x6d, 0xbe,
- 0x30, 0xf0, 0x90, 0x3e, 0x06, 0x18, 0xa1, 0x3c, 0x0f, 0x4e, 0x76, 0xbd,
- 0xb5, 0xce, 0x19, 0xbd, 0x19, 0x7e, 0xb4, 0xbd, 0xf6, 0xc9, 0x9b, 0xbd,
- 0xf1, 0xa0, 0x3a, 0x3d, 0x82, 0x6d, 0x03, 0xbe, 0x9c, 0xd4, 0x76, 0xbe,
- 0xa3, 0xf3, 0x43, 0xbd, 0x40, 0xff, 0x0b, 0xbd, 0x77, 0x4d, 0x38, 0xbe,
- 0xc0, 0x7a, 0xac, 0x3d, 0x78, 0xa3, 0xd0, 0xbd, 0xde, 0x3a, 0xae, 0xbd,
- 0xd3, 0x1a, 0x87, 0xbb, 0x27, 0x5b, 0x5b, 0x3c, 0x2b, 0xb0, 0x40, 0x3e,
- 0x41, 0xbe, 0x4d, 0x3c, 0xab, 0x65, 0xa3, 0xbe, 0x18, 0x9e, 0x2b, 0xbd,
- 0xfb, 0x7a, 0x62, 0x3d, 0x04, 0x82, 0x17, 0xbe, 0x53, 0xa9, 0x07, 0x3f,
- 0x11, 0x17, 0x2c, 0xbe, 0x75, 0xcc, 0xa4, 0x3f, 0x87, 0x5b, 0x9e, 0x3e,
- 0xf1, 0x78, 0x3a, 0x3e, 0x34, 0x6e, 0x95, 0xbe, 0xf9, 0xb8, 0x0b, 0xbf,
- 0x69, 0x4d, 0x72, 0x3e, 0xb7, 0x63, 0x20, 0xbe, 0xba, 0x6a, 0x0c, 0x3e,
- 0xe2, 0x4d, 0xf7, 0xbe, 0xc1, 0xd8, 0x43, 0xbe, 0x13, 0x72, 0xfa, 0xbe,
- 0xb1, 0x9b, 0x01, 0x3e, 0xe2, 0x82, 0xed, 0x3c, 0x75, 0xf5, 0x1e, 0xbf,
- 0x30, 0x2d, 0xd5, 0xbc, 0xaa, 0xd2, 0xc4, 0xbc, 0x5e, 0x95, 0x40, 0x3d,
- 0x4c, 0x78, 0xf3, 0x3b, 0xec, 0x68, 0x84, 0x3e, 0xa2, 0x94, 0x00, 0x3f,
- 0xf2, 0xe8, 0x86, 0xbd, 0xee, 0x84, 0x98, 0x3e, 0xd8, 0x65, 0x22, 0x3b,
- 0x93, 0x5a, 0xe6, 0xbd, 0x08, 0x17, 0x99, 0x3c, 0x7c, 0x5c, 0x7d, 0xbe,
- 0xe5, 0xfb, 0x07, 0x3d, 0x8c, 0x7b, 0x16, 0xbe, 0x33, 0x31, 0x0e, 0xbe,
- 0xf5, 0xc2, 0x6e, 0x3c, 0xe5, 0xa0, 0xa1, 0x3e, 0x81, 0xb0, 0x5a, 0xbe,
- 0xc3, 0x6d, 0xb7, 0x3e, 0xb2, 0x32, 0xd8, 0x3c, 0x86, 0x5f, 0x11, 0x3e,
- 0xee, 0xed, 0x26, 0xbd, 0x8d, 0x31, 0x88, 0xbe, 0x09, 0xa8, 0x8a, 0xbe,
- 0x87, 0x30, 0xf0, 0x3d, 0x3a, 0x77, 0x98, 0xbe, 0x76, 0x0d, 0x69, 0xbe,
- 0x64, 0x60, 0x8a, 0xbe, 0x02, 0xe6, 0xba, 0xbe, 0xfc, 0x6a, 0xf3, 0x3c,
- 0xa8, 0x0c, 0xf4, 0xbe, 0x0e, 0x7d, 0xcc, 0xbe, 0xa4, 0x13, 0x94, 0x3e,
- 0x4f, 0xba, 0xf5, 0x3c, 0x1e, 0x58, 0x47, 0x3e, 0x55, 0x11, 0x6d, 0x3d,
- 0x31, 0x5d, 0x88, 0x3d, 0xfd, 0x63, 0xd4, 0x3d, 0x6e, 0x47, 0x9a, 0x3c,
- 0x8e, 0x4a, 0xa8, 0x3e, 0xbc, 0xb8, 0xe5, 0xbd, 0xf1, 0xf1, 0x3e, 0x3e,
- 0xd6, 0x40, 0x48, 0xbd, 0x5b, 0x4a, 0x54, 0xbe, 0xd2, 0x1c, 0x2d, 0x3e,
- 0xd0, 0x9e, 0x96, 0x3c, 0x67, 0x51, 0x65, 0xbf, 0x68, 0x95, 0x69, 0xbd,
- 0x53, 0x57, 0x86, 0xbe, 0x97, 0x3e, 0x28, 0xbd, 0xc0, 0xd8, 0xda, 0x3c,
- 0x2d, 0x02, 0x45, 0xbe, 0xe6, 0x43, 0xb1, 0xbe, 0x18, 0xef, 0x27, 0xbe,
- 0x11, 0x39, 0xac, 0x3d, 0xf7, 0x62, 0x52, 0xbc, 0xe1, 0x61, 0x03, 0xbd,
- 0x93, 0xa6, 0xae, 0x3d, 0x09, 0x14, 0x4d, 0xbf, 0x7c, 0x99, 0x6b, 0xbd,
- 0xf7, 0xa8, 0x6d, 0x3e, 0x29, 0x3f, 0xa8, 0x3c, 0xff, 0xf8, 0x85, 0xbd,
- 0xce, 0xa8, 0x29, 0xbf, 0xf0, 0x6b, 0xf9, 0xbd, 0x63, 0x10, 0x99, 0x3d,
- 0xe5, 0x8e, 0xef, 0x3d, 0xed, 0xae, 0x84, 0xbb, 0x84, 0xf7, 0x10, 0x3d,
- 0x34, 0x9c, 0x82, 0x3d, 0x97, 0xd4, 0xd2, 0x3d, 0x6b, 0xfe, 0x5f, 0xbf,
- 0x79, 0x62, 0xdb, 0xbc, 0x29, 0x4a, 0xc8, 0xbe, 0x5f, 0x10, 0x67, 0x3d,
- 0x6a, 0xe5, 0xd9, 0x3d, 0x4b, 0x88, 0xb8, 0xbd, 0x67, 0x78, 0xa2, 0x3e,
- 0x36, 0x69, 0x95, 0x3d, 0x26, 0xa1, 0xd0, 0xbe, 0x40, 0x70, 0x3f, 0xbe,
- 0x3b, 0x0e, 0x28, 0xbe, 0x2f, 0x30, 0xbf, 0xbd, 0x1c, 0x84, 0xf3, 0x3c,
- 0x0a, 0x32, 0x77, 0x3d, 0xe5, 0x7c, 0xf4, 0x3d, 0x10, 0xbd, 0xae, 0x3e,
- 0x5b, 0x76, 0xb4, 0x3d, 0x12, 0x17, 0x57, 0x3d, 0xbf, 0x99, 0x13, 0xbd,
- 0x44, 0xf8, 0x15, 0x39, 0x2a, 0xc6, 0x8d, 0x3d, 0x44, 0xf3, 0xab, 0xbd,
- 0x56, 0xde, 0xd8, 0xbc, 0xa2, 0x58, 0x81, 0x3d, 0x94, 0x53, 0xf5, 0xbd,
- 0x35, 0xac, 0x04, 0x3c, 0xee, 0x8c, 0xf0, 0x3d, 0x9e, 0xa3, 0x05, 0x3e,
- 0xfb, 0xac, 0xa0, 0x3d, 0x63, 0xae, 0xf5, 0x3d, 0xfd, 0xad, 0xf8, 0xbd,
- 0x8e, 0x37, 0x0b, 0xbe, 0x2f, 0xab, 0xf7, 0xbd, 0xf2, 0x11, 0xd9, 0xbc,
- 0x05, 0x16, 0xc9, 0xbd, 0x38, 0x6e, 0x0e, 0xbd, 0x07, 0x28, 0x5c, 0x3d,
- 0x5f, 0xd3, 0xf5, 0xbd, 0xe6, 0xf1, 0x8f, 0xbd, 0xb4, 0xb4, 0x80, 0x3e,
- 0x40, 0x8e, 0x24, 0xbe, 0x06, 0x30, 0x3c, 0x3d, 0x0b, 0xe1, 0xb9, 0x3b,
- 0xc3, 0xbb, 0x0a, 0x3d, 0x00, 0x78, 0xcd, 0xbc, 0xac, 0x4a, 0x27, 0xbe,
- 0x1c, 0x2e, 0xa9, 0x3c, 0xe6, 0xd3, 0xd7, 0xbc, 0x1b, 0xba, 0xbb, 0x3b,
- 0x54, 0xab, 0x63, 0x3c, 0x17, 0x06, 0x89, 0x3d, 0xb4, 0x34, 0x79, 0x3d,
- 0x7f, 0x66, 0xa7, 0x3d, 0x58, 0xc0, 0x4f, 0xbe, 0xbf, 0x6b, 0x00, 0xbe,
- 0xe9, 0xe9, 0x58, 0xbc, 0xe7, 0xb0, 0x72, 0xbe, 0xff, 0x5c, 0x53, 0xbe,
- 0x46, 0xa3, 0x2b, 0xbc, 0xa9, 0xea, 0x60, 0xbd, 0xa0, 0x81, 0x7b, 0x3d,
- 0x0a, 0x12, 0x21, 0x3b, 0xfa, 0x49, 0x67, 0x3e, 0x78, 0x1c, 0x53, 0xbd,
- 0x25, 0xce, 0x8e, 0x3d, 0x6c, 0xe4, 0x84, 0xbe, 0x9a, 0x90, 0xb7, 0xbd,
- 0xbd, 0x3a, 0x82, 0xbe, 0x4e, 0x42, 0xba, 0x3d, 0xe4, 0x2f, 0xcd, 0xbd,
- 0x7a, 0x00, 0x4b, 0xbe, 0xcc, 0x87, 0xf5, 0x3d, 0x5e, 0xee, 0x8c, 0xbe,
- 0xb6, 0x06, 0x96, 0xbd, 0xa8, 0x4c, 0x86, 0xbc, 0xd6, 0x72, 0x8a, 0x3d,
- 0xd1, 0x9b, 0x63, 0xbd, 0x63, 0xb3, 0x31, 0xbe, 0xa6, 0xbb, 0x19, 0xbe,
- 0x55, 0x8e, 0x07, 0x3e, 0xe3, 0xc2, 0x9d, 0x3e, 0x0d, 0xb5, 0x92, 0xbd,
- 0x04, 0x19, 0xe4, 0xbd, 0x19, 0xc8, 0x90, 0x3d, 0xc2, 0xfd, 0x34, 0xbe,
- 0x1d, 0xd5, 0xa7, 0x3d, 0xb4, 0xe6, 0x02, 0xbe, 0x35, 0x5d, 0x11, 0xbe,
- 0x95, 0xb2, 0xb5, 0xbc, 0xa8, 0x28, 0xf3, 0xbc, 0xc5, 0xfc, 0x62, 0xbe,
- 0x78, 0x64, 0x27, 0xbd, 0x7c, 0xdf, 0x16, 0x3d, 0xac, 0x53, 0xc2, 0x3d,
- 0x26, 0x6a, 0xe0, 0x3d, 0x3c, 0x10, 0x83, 0x3d, 0x74, 0x7b, 0x83, 0xbd,
- 0xde, 0x99, 0x5b, 0xbe, 0xf3, 0xdd, 0x5b, 0xbc, 0xca, 0x2a, 0x46, 0xbe,
- 0xb4, 0xce, 0x12, 0xbe, 0xab, 0x8a, 0xbb, 0x3d, 0x4a, 0x4e, 0x04, 0x3d,
- 0xd0, 0x9a, 0xec, 0x3c, 0x1c, 0xc0, 0xba, 0x3d, 0x64, 0x66, 0x15, 0x3d,
- 0xfe, 0xac, 0x08, 0xbd, 0xcc, 0xa5, 0x44, 0xbe, 0x5f, 0x4a, 0x74, 0xbe,
- 0xbb, 0xbc, 0x21, 0xbe, 0x5a, 0x23, 0xcd, 0xbc, 0x74, 0xbb, 0xa3, 0x3d,
- 0x08, 0x0d, 0xef, 0x3b, 0x17, 0x06, 0x86, 0x3e, 0x83, 0xab, 0x71, 0xbd,
- 0xf2, 0x63, 0xaa, 0x3e, 0x4e, 0x8c, 0x44, 0x3d, 0x33, 0x02, 0x71, 0xbc,
- 0xce, 0x27, 0xbf, 0x3e, 0x4b, 0x92, 0x8a, 0x3e, 0x2f, 0x09, 0x91, 0x3e,
- 0x47, 0x34, 0x68, 0x3d, 0x16, 0x73, 0x1a, 0x3f, 0xef, 0x28, 0xdf, 0x3c,
- 0x28, 0x30, 0xdc, 0x3c, 0xc9, 0x5a, 0x32, 0x3f, 0x17, 0xc4, 0x54, 0xbe,
- 0xcc, 0x7c, 0x74, 0xbd, 0xd2, 0xaa, 0xdd, 0xbe, 0x02, 0xa8, 0x4d, 0x3e,
- 0x19, 0x1f, 0x9a, 0xbe, 0x0e, 0x98, 0x30, 0xbf, 0xe7, 0x98, 0x6d, 0xbe,
- 0xbe, 0x8d, 0x0c, 0xbc, 0xbd, 0x27, 0xac, 0xbc, 0x5e, 0x46, 0x35, 0xbd,
- 0xa9, 0x9b, 0x7d, 0x3d, 0x30, 0x98, 0xef, 0xbe, 0xdc, 0x1c, 0x85, 0xbe,
- 0x79, 0xb6, 0x36, 0xbd, 0x22, 0x3b, 0xa0, 0x3d, 0xd1, 0x54, 0x63, 0xbd,
- 0xe3, 0x41, 0xf5, 0xbd, 0xa8, 0xf8, 0x58, 0xbe, 0x4b, 0x98, 0x2d, 0xbe,
- 0x26, 0x26, 0xeb, 0x3c, 0xf9, 0xa7, 0x91, 0x3e, 0xaf, 0xa5, 0x11, 0x3d,
- 0x1f, 0x39, 0x18, 0x3d, 0x53, 0xc9, 0xe6, 0xbe, 0x93, 0xd9, 0x1b, 0x3e,
- 0xf5, 0xe8, 0xc9, 0xbc, 0x21, 0xef, 0xa5, 0xbd, 0xc2, 0xba, 0xf8, 0x3d,
- 0xdb, 0x29, 0x2e, 0xbe, 0x0a, 0xeb, 0xc2, 0x3e, 0xcd, 0xb9, 0x22, 0x3e,
- 0x9c, 0xf2, 0x0d, 0xbe, 0xd6, 0xc5, 0x9f, 0x3d, 0x17, 0x53, 0x98, 0xbe,
- 0x76, 0xd7, 0xed, 0xbd, 0xef, 0x25, 0x37, 0x3e, 0xdd, 0xd2, 0x49, 0x3d,
- 0xb8, 0xf7, 0x65, 0x3b, 0x9e, 0xa8, 0x86, 0x3e, 0x19, 0x63, 0x3e, 0xbf,
- 0xb0, 0x18, 0x81, 0x3f, 0xdb, 0x7d, 0xc1, 0xbd, 0x23, 0x23, 0x0c, 0xbd,
- 0x1d, 0xc8, 0xdb, 0x3b, 0x76, 0xed, 0xcc, 0xbe, 0x2f, 0x79, 0x67, 0x3d,
- 0x38, 0x5f, 0x3b, 0x3f, 0x0d, 0x34, 0x83, 0xbd, 0xf1, 0xba, 0x7c, 0x3e,
- 0xfb, 0x10, 0x84, 0xbe, 0xd4, 0x14, 0x5c, 0xbd, 0xd0, 0xeb, 0x27, 0x3d,
- 0xa5, 0xee, 0x38, 0xbe, 0x9e, 0x2a, 0x2c, 0xbe, 0x7a, 0xde, 0xe3, 0xbc,
- 0xe1, 0xb8, 0x89, 0x3e, 0xfc, 0x3d, 0x39, 0xbc, 0x17, 0xfe, 0x67, 0x3e,
- 0xe3, 0x21, 0xa9, 0xbc, 0xc5, 0x96, 0x9c, 0x3e, 0x96, 0x24, 0xd5, 0x3e,
- 0xcc, 0xaf, 0xef, 0x3d, 0x8f, 0x40, 0x58, 0xbe, 0xaf, 0x73, 0x15, 0xbe,
- 0x9f, 0xd0, 0xa4, 0xbd, 0x4a, 0x60, 0x9d, 0x3e, 0x4d, 0x1b, 0x34, 0xbe,
- 0xa0, 0xea, 0x29, 0x3d, 0x2c, 0x66, 0x32, 0x3d, 0x19, 0xaf, 0xa1, 0xbd,
- 0x7f, 0x29, 0x14, 0x3d, 0x28, 0x8b, 0x01, 0x3e, 0x09, 0x56, 0xc0, 0x3d,
- 0x61, 0x74, 0x00, 0xbe, 0xb1, 0x34, 0x01, 0xbe, 0x69, 0xc5, 0x78, 0x3e,
- 0x9d, 0x6b, 0xe5, 0xbd, 0x6a, 0x99, 0xa5, 0x3e, 0x7c, 0x74, 0x6f, 0x3d,
- 0xc2, 0x9d, 0xd1, 0xbe, 0x84, 0x63, 0x2c, 0x3e, 0x6e, 0xb6, 0x4f, 0x3d,
- 0x63, 0xce, 0x67, 0xbd, 0x22, 0xbb, 0x1b, 0xbe, 0x54, 0x59, 0xe7, 0x3e,
- 0x03, 0x52, 0xa7, 0xbd, 0x5d, 0x15, 0xf1, 0x3d, 0x00, 0xe9, 0x81, 0xbe,
- 0x20, 0xc6, 0x47, 0x3d, 0x80, 0x0c, 0x2d, 0x3e, 0x83, 0xd8, 0x9e, 0xbe,
- 0x8c, 0xdc, 0xf5, 0xbd, 0x7c, 0x9d, 0xdb, 0x3c, 0x88, 0x15, 0x3c, 0xbe,
- 0xcd, 0xc2, 0xe4, 0x3b, 0x9b, 0xd4, 0xd4, 0xbe, 0x55, 0x00, 0x0c, 0x3e,
- 0x3f, 0x82, 0x1c, 0x3e, 0xfe, 0x06, 0x4a, 0x3e, 0x8c, 0xf5, 0x9f, 0xbe,
- 0x18, 0x8f, 0x67, 0xbd, 0x4e, 0x6a, 0xfb, 0x3d, 0xf7, 0xe7, 0x5e, 0xbe,
- 0xcd, 0xaa, 0x52, 0x3c, 0xc7, 0xb9, 0x6c, 0xbe, 0x8c, 0xa6, 0x70, 0x3e,
- 0x8e, 0x9e, 0xda, 0xbd, 0xa2, 0x43, 0x14, 0xbd, 0x67, 0x39, 0x73, 0xbe,
- 0xc7, 0xf6, 0x5c, 0xbc, 0xf1, 0x51, 0x57, 0x3c, 0xf0, 0x11, 0x04, 0xbe,
- 0x2e, 0xaa, 0x77, 0xbd, 0xdb, 0x21, 0x0c, 0x3e, 0xf1, 0xd0, 0x4c, 0x3d,
- 0xf3, 0xb3, 0xed, 0x3d, 0x69, 0x24, 0x79, 0x3c, 0x5d, 0x06, 0x3d, 0xbe,
- 0xf1, 0x14, 0xf6, 0x3d, 0x3f, 0x19, 0xf3, 0x3c, 0x19, 0x87, 0x41, 0xbe,
- 0x99, 0x84, 0xac, 0x3d, 0x52, 0xd7, 0x72, 0xbd, 0x87, 0xb9, 0xab, 0x3d,
- 0x5f, 0xc7, 0xda, 0xbd, 0x9c, 0xf3, 0x10, 0x3d, 0x3c, 0x4e, 0x30, 0x3d,
- 0x7a, 0xef, 0x74, 0x3d, 0xa1, 0x35, 0x1a, 0xbe, 0x72, 0x5a, 0xd5, 0x3c,
- 0x2f, 0x78, 0x74, 0xbe, 0x4a, 0x3d, 0xb2, 0x3c, 0x22, 0x7b, 0x05, 0xbf,
- 0xf4, 0x58, 0x92, 0x3d, 0xe7, 0x89, 0xdc, 0xbd, 0xb5, 0xbe, 0x3e, 0x3e,
- 0x1e, 0xd9, 0x97, 0x3e, 0x4e, 0x5a, 0x12, 0xbd, 0x5f, 0x62, 0xaf, 0xbd,
- 0x56, 0xfb, 0x28, 0xbe, 0x8d, 0xb3, 0x57, 0x3e, 0x8d, 0x1e, 0x96, 0xbc,
- 0x53, 0xe8, 0x31, 0x3e, 0x7c, 0x78, 0x2a, 0xbe, 0x8d, 0xc0, 0xd6, 0xbd,
- 0x54, 0xee, 0x2b, 0xbe, 0x00, 0x7b, 0x14, 0xbd, 0xaf, 0xa2, 0xb6, 0xbc,
- 0xe9, 0x15, 0x4b, 0x3e, 0xf0, 0x52, 0x4d, 0xbd, 0xc6, 0x14, 0xa6, 0x3d,
- 0x95, 0xf8, 0x87, 0xbc, 0x3a, 0xee, 0x1f, 0xbe, 0x87, 0xc7, 0xad, 0x3c,
- 0xfc, 0xaf, 0xbc, 0xbd, 0x29, 0xfd, 0x7a, 0x3e, 0x5b, 0xd0, 0x8e, 0x3d,
- 0x59, 0xe6, 0x97, 0xbe, 0xaf, 0xe0, 0x17, 0xbe, 0x4a, 0xd0, 0x3f, 0x3d,
- 0xb5, 0xe3, 0x01, 0xbd, 0x93, 0xfd, 0x9b, 0xbd, 0x02, 0x79, 0xbd, 0xbd,
- 0x18, 0x44, 0x19, 0xbe, 0x1b, 0x9f, 0x13, 0xbe, 0x86, 0x1e, 0x1f, 0xbe,
- 0x4c, 0xcc, 0x95, 0xbd, 0xeb, 0xd4, 0xe4, 0xbd, 0x83, 0x8e, 0x23, 0xbe,
- 0x53, 0x21, 0xb0, 0xbe, 0xd7, 0x0d, 0x64, 0xbd, 0x13, 0x3e, 0x41, 0xbe,
- 0x1f, 0xcb, 0xb8, 0x3d, 0xeb, 0x46, 0x5d, 0x3d, 0x82, 0x3c, 0x0e, 0xbd,
- 0x3a, 0x2d, 0xea, 0xbd, 0x5f, 0x12, 0x83, 0xbd, 0xb5, 0x4f, 0x00, 0xbd,
- 0xd3, 0x89, 0x22, 0xbe, 0x71, 0x25, 0x48, 0xbb, 0x6c, 0x46, 0x28, 0x3e,
- 0x5f, 0x24, 0xa1, 0x3b, 0x85, 0x57, 0x44, 0xbe, 0x2a, 0x94, 0x52, 0xbe,
- 0xc8, 0xb6, 0xd9, 0xbd, 0xf8, 0x65, 0xb5, 0x3d, 0xb4, 0x54, 0x04, 0xbe,
- 0xc3, 0xa1, 0x92, 0xbd, 0x06, 0x05, 0x1f, 0x3d, 0x81, 0xa5, 0xee, 0xbb,
- 0x5b, 0x61, 0x67, 0xbe, 0x04, 0xa3, 0x87, 0x3e, 0x39, 0xa5, 0xf9, 0xbd,
- 0x42, 0x68, 0xdd, 0xbc, 0x5d, 0xc3, 0xc8, 0xbd, 0xbe, 0xf2, 0xa8, 0xbd,
- 0x27, 0x56, 0x2a, 0x3e, 0x75, 0x55, 0x39, 0xbe, 0xd2, 0x38, 0x77, 0x3d,
- 0x53, 0xa2, 0xad, 0xbd, 0x81, 0xd1, 0xba, 0xbd, 0xc0, 0x6f, 0xd1, 0xbe,
- 0x16, 0x46, 0xa2, 0x3d, 0x75, 0x60, 0x86, 0xbd, 0xd5, 0xda, 0xb0, 0xbc,
- 0xb9, 0xd2, 0x9d, 0x3e, 0xb6, 0x5c, 0xe5, 0xbe, 0x2e, 0xac, 0xa0, 0x3e,
- 0x5e, 0x7b, 0xa8, 0x3d, 0xb4, 0xbe, 0x00, 0x3d, 0xf1, 0xd5, 0x37, 0xbe,
- 0x61, 0xde, 0xf0, 0xbd, 0x03, 0x31, 0x10, 0x3d, 0x23, 0x65, 0x1a, 0x3d,
- 0x8c, 0x65, 0x9a, 0xba, 0xf9, 0x6f, 0x8e, 0x3d, 0x68, 0x6b, 0x0c, 0xbd,
- 0xa8, 0xfe, 0x42, 0x3d, 0x8e, 0xcd, 0x1c, 0x3e, 0x26, 0xcf, 0x11, 0xbe,
- 0x32, 0xe8, 0x9d, 0x3d, 0xd0, 0x3f, 0x17, 0x3c, 0xbe, 0x76, 0xbb, 0xbd,
- 0xcf, 0xe4, 0x29, 0xbe, 0x5b, 0x4c, 0xf6, 0x3d, 0x1e, 0x5b, 0xd2, 0x3d,
- 0x33, 0xb1, 0x9d, 0xbd, 0xe0, 0x3f, 0xc5, 0xbe, 0xea, 0x55, 0xa6, 0x3c,
- 0x36, 0x38, 0x7a, 0x3d, 0x4a, 0xc7, 0xa1, 0x3d, 0xc1, 0xbf, 0x25, 0xbc,
- 0xde, 0x3a, 0x1e, 0x3d, 0x7f, 0xd3, 0x99, 0xbd, 0x5c, 0x6d, 0xc8, 0xbe,
- 0x4d, 0x57, 0xd3, 0xbd, 0xed, 0x01, 0xdc, 0xbd, 0x9a, 0xc1, 0x31, 0x3e,
- 0xe3, 0x21, 0x54, 0x3e, 0x67, 0x9e, 0x39, 0xbe, 0x82, 0xc4, 0xbc, 0xbd,
- 0x05, 0x06, 0x29, 0x3d, 0x12, 0x8b, 0xbd, 0xbd, 0xa4, 0xe6, 0x34, 0x3e,
- 0x02, 0xc7, 0xd6, 0xbd, 0xbd, 0xde, 0xba, 0x3d, 0xa2, 0x0d, 0x78, 0xbe,
- 0xf8, 0x80, 0x60, 0x3d, 0x43, 0x86, 0xd3, 0xbb, 0x0a, 0x0b, 0x0c, 0xbe,
- 0x20, 0xa8, 0x89, 0xbe, 0xc0, 0x1d, 0x07, 0x3b, 0x32, 0x81, 0x9d, 0x3b,
- 0x71, 0x88, 0x07, 0xbd, 0x3f, 0x13, 0xc9, 0x3b, 0xa5, 0x8b, 0xfa, 0x3d,
- 0xc8, 0xc3, 0x06, 0x3d, 0x52, 0x8a, 0xb8, 0x3e, 0xa7, 0x8d, 0xd3, 0xbd,
- 0xe7, 0x39, 0xcd, 0x3c, 0x2a, 0x29, 0x38, 0x3d, 0x51, 0xab, 0x94, 0xbd,
- 0xc4, 0x47, 0xae, 0x3c, 0xbc, 0x25, 0x44, 0xbe, 0xf2, 0x97, 0x80, 0xbe,
- 0xbf, 0xcd, 0x5c, 0x3d, 0xf9, 0x97, 0x83, 0xbe, 0x64, 0x0e, 0xe5, 0xbb,
- 0xf2, 0xb8, 0xbb, 0xbd, 0x6b, 0xf3, 0x5f, 0xbd, 0x9b, 0x06, 0x91, 0xbe,
- 0x2b, 0xc0, 0x88, 0xbe, 0x88, 0x70, 0xf4, 0x3d, 0xd1, 0x2f, 0xa0, 0xbe,
- 0x16, 0xf3, 0x2d, 0x3e, 0x0d, 0x94, 0x83, 0xbd, 0x2f, 0x08, 0xe8, 0x3d,
- 0xbd, 0x1f, 0x14, 0xbe, 0xf5, 0x0a, 0xd0, 0xbd, 0x85, 0x62, 0x22, 0xbc,
- 0xc7, 0xd4, 0xb6, 0x3d, 0x88, 0xf5, 0x18, 0x3d, 0xff, 0xa2, 0x89, 0x3d,
- 0x82, 0xee, 0x18, 0xbd, 0x65, 0xd3, 0x95, 0x3d, 0x5f, 0x1d, 0xca, 0xbd,
- 0xb2, 0xf0, 0x16, 0xbe, 0x73, 0x36, 0xa0, 0x3d, 0x84, 0xa1, 0x1d, 0xbd,
- 0xe2, 0x7f, 0xf7, 0xbd, 0xf2, 0x8b, 0x7e, 0x3d, 0xd0, 0x70, 0x39, 0x3e,
- 0x4e, 0xff, 0xa0, 0xbd, 0xf0, 0x4e, 0x18, 0xbe, 0x4b, 0xce, 0x89, 0xbd,
- 0xc7, 0x13, 0x00, 0x3f, 0x97, 0x82, 0xd1, 0x3e, 0xaa, 0x8d, 0xb8, 0x3e,
- 0xba, 0x1f, 0x16, 0x3d, 0xae, 0x3d, 0x89, 0x3f, 0x11, 0x38, 0x19, 0xbe,
- 0xc7, 0x9c, 0x03, 0x3e, 0x74, 0x71, 0xab, 0xbd, 0x80, 0x9f, 0x83, 0xbf,
- 0xd9, 0xc6, 0x32, 0x3e, 0x71, 0x4a, 0x1a, 0x3f, 0xaa, 0x5b, 0xad, 0x3d,
- 0xbf, 0xab, 0x2c, 0xbe, 0x2b, 0x7e, 0xc6, 0xbe, 0x5a, 0xc2, 0x8a, 0xbf,
- 0x30, 0x14, 0x4c, 0xbd, 0xb0, 0xd1, 0x88, 0xbe, 0xf0, 0x89, 0xc5, 0xbe,
- 0xba, 0x7d, 0xe7, 0x3d, 0x0d, 0x5e, 0x03, 0xbe, 0x72, 0xc3, 0xe6, 0xbc,
- 0x20, 0x87, 0x1c, 0xbe, 0x52, 0xc4, 0xce, 0x3e, 0x11, 0xdd, 0x92, 0x3e,
- 0x70, 0xff, 0x80, 0x3d, 0x93, 0x67, 0xec, 0x3d, 0xa8, 0x04, 0x9d, 0x3d,
- 0x6c, 0xa4, 0x05, 0xbc, 0x26, 0x15, 0x93, 0xbd, 0x50, 0x35, 0x81, 0x3d,
- 0x60, 0xfe, 0x92, 0x3d, 0xd7, 0x8b, 0xe3, 0xbe, 0xee, 0xf6, 0x8b, 0xbd,
- 0x39, 0x8f, 0xc3, 0x3d, 0x05, 0xc9, 0xe7, 0xbe, 0x54, 0x59, 0x99, 0xbe,
- 0x75, 0x23, 0x4c, 0xbd, 0xc7, 0xb5, 0x1a, 0x3e, 0x02, 0x07, 0x67, 0xbc,
- 0x55, 0x35, 0x27, 0xbe, 0x36, 0x42, 0x73, 0xbd, 0x9e, 0xe3, 0xa3, 0xbd,
- 0xe5, 0x3d, 0x98, 0xbd, 0x56, 0xe9, 0x87, 0x3d, 0xfd, 0xc7, 0x86, 0xbd,
- 0x5b, 0x95, 0x24, 0x3e, 0xa6, 0xc2, 0x54, 0x3e, 0x86, 0xc8, 0x12, 0x3d,
- 0x17, 0xae, 0x55, 0x3e, 0xa5, 0x25, 0x57, 0xbe, 0xb5, 0xd9, 0xb2, 0xbe,
- 0xc2, 0xfe, 0x05, 0x3e, 0xed, 0x89, 0xef, 0xbd, 0x51, 0x87, 0x19, 0xbc,
- 0xe3, 0x48, 0x6b, 0x3e, 0x7d, 0x2e, 0x52, 0x3e, 0x0d, 0xa8, 0x77, 0xbd,
- 0x23, 0x53, 0xd3, 0x3e, 0xf8, 0x33, 0xd5, 0x3d, 0x33, 0xef, 0x28, 0x3e,
- 0xd5, 0xfa, 0x94, 0x3d, 0xfc, 0xd9, 0x27, 0xbd, 0x33, 0x3a, 0xd0, 0xbd,
- 0x07, 0x71, 0x88, 0x3d, 0x90, 0x84, 0x12, 0xbf, 0x4c, 0x54, 0x24, 0xbd,
- 0xd1, 0x99, 0xa3, 0xbd, 0x1c, 0xf9, 0xa6, 0xbd, 0x44, 0xce, 0x71, 0x3e,
- 0x33, 0x83, 0xbb, 0xbc, 0xf0, 0x5a, 0x03, 0x3e, 0xc6, 0x95, 0x32, 0xbe,
- 0xfd, 0xb2, 0x19, 0xbe, 0x83, 0x7c, 0xdf, 0xbd, 0x93, 0x7c, 0xe0, 0xba,
- 0x78, 0xaa, 0x8e, 0xbd, 0xcd, 0x02, 0x8c, 0xbe, 0x4f, 0x52, 0x60, 0xbe,
- 0x73, 0x01, 0x51, 0x3f, 0x4c, 0x68, 0x61, 0x3d, 0xdb, 0x06, 0xca, 0x3e,
- 0x56, 0xc9, 0x31, 0xbe, 0xa8, 0xbf, 0x07, 0x3e, 0x06, 0x2e, 0x0c, 0x3f,
- 0xa2, 0xa2, 0x99, 0x3d, 0xff, 0x20, 0xc1, 0x3c, 0xfd, 0xce, 0x3d, 0x3e,
- 0x39, 0xaa, 0x8e, 0x3d, 0x7e, 0x1c, 0xa9, 0x3e, 0x18, 0x45, 0xe7, 0xbe,
- 0x75, 0x87, 0x5a, 0x3c, 0xb3, 0xf5, 0x3b, 0xbf, 0x58, 0xe7, 0x27, 0xbd,
- 0x0e, 0xb4, 0xac, 0x3d, 0x88, 0x9e, 0x30, 0xbc, 0xf7, 0x39, 0x6f, 0x3d,
- 0xac, 0xc2, 0x11, 0xbe, 0x65, 0xca, 0x8c, 0x3d, 0x01, 0x25, 0x89, 0x3e,
- 0x79, 0xc2, 0x22, 0x3e, 0x76, 0x05, 0x83, 0xbe, 0x55, 0x7a, 0xe9, 0xbc,
- 0x88, 0xf1, 0xb3, 0xbc, 0xd2, 0x06, 0x29, 0x3d, 0x0f, 0xe8, 0x2c, 0xbe,
- 0x14, 0xb4, 0xe3, 0xbc, 0x3b, 0x47, 0x87, 0x3d, 0x64, 0xdf, 0xff, 0x39,
- 0xcb, 0x4d, 0x06, 0xbd, 0x4b, 0xba, 0xd0, 0xbc, 0xce, 0x51, 0x68, 0xbe,
- 0x3a, 0x24, 0xe9, 0xbd, 0x04, 0xfd, 0xd8, 0x3d, 0xae, 0x0f, 0x94, 0xbb,
- 0xd1, 0x3b, 0xa4, 0xbd, 0x84, 0x69, 0xe6, 0x3d, 0x04, 0x65, 0x8f, 0xbd,
- 0xfd, 0x79, 0xd9, 0x3d, 0xab, 0x79, 0xbf, 0x3d, 0x89, 0x6d, 0x8a, 0xbd,
- 0x85, 0x56, 0x7b, 0x3d, 0x5a, 0x6a, 0xc2, 0xbd, 0x4d, 0x37, 0xb9, 0x3d,
- 0x80, 0x3a, 0xca, 0xbd, 0x5f, 0xa6, 0x08, 0xbd, 0x78, 0x91, 0x07, 0x3c,
- 0x94, 0xb3, 0xa1, 0x3d, 0xa6, 0x92, 0x0a, 0x3e, 0x3b, 0xd7, 0x2d, 0xbd,
- 0xb1, 0x9a, 0xab, 0x3d, 0xa1, 0xd1, 0x1a, 0xbe, 0xad, 0xd9, 0x3d, 0x3c,
- 0x4e, 0xdb, 0xd2, 0xbd, 0x34, 0x3b, 0x70, 0xbe, 0xf6, 0x7c, 0x1b, 0xbe,
- 0xac, 0x33, 0x67, 0x3c, 0x04, 0x08, 0x33, 0xbd, 0xef, 0x71, 0xca, 0x3d,
- 0xab, 0x2f, 0x05, 0x3e, 0x4f, 0xee, 0x19, 0xbe, 0x92, 0xdf, 0x89, 0xbc,
- 0xd0, 0x78, 0x4d, 0xbe, 0xcd, 0x16, 0xf4, 0x3d, 0x3e, 0x4e, 0x15, 0xbe,
- 0x3a, 0xce, 0x20, 0x3e, 0xff, 0xe9, 0x4a, 0xbd, 0x0c, 0x7b, 0xc6, 0xbd,
- 0xb1, 0x84, 0x0f, 0xbe, 0x68, 0x64, 0xcb, 0xbc, 0x78, 0xcc, 0xee, 0x3d,
- 0x09, 0x00, 0xc7, 0x3d, 0x2a, 0xb4, 0x39, 0x3d, 0x38, 0x4b, 0x94, 0xbd,
- 0xc9, 0x03, 0x2b, 0x3d, 0xcf, 0x13, 0x12, 0xbe, 0x0c, 0x53, 0x5f, 0xbd,
- 0xbb, 0xe7, 0x02, 0xbe, 0x8f, 0x27, 0x69, 0x3d, 0x5e, 0x8b, 0xe8, 0xbd,
- 0xf9, 0x2f, 0x6d, 0xbd, 0xac, 0x06, 0xcd, 0x3d, 0x98, 0x48, 0x25, 0x3c,
- 0x64, 0xdc, 0x6f, 0xbd, 0x2c, 0xef, 0xa0, 0xbd, 0x1d, 0x0e, 0x22, 0xbe,
- 0xcb, 0xdf, 0x31, 0xbd, 0x7b, 0x85, 0x08, 0x3d, 0x9d, 0x19, 0x85, 0x3b,
- 0x0e, 0x53, 0x26, 0x3e, 0x60, 0x00, 0x94, 0xbe, 0xd2, 0xe8, 0x07, 0xbd,
- 0xe6, 0x56, 0x39, 0xbe, 0x3f, 0xab, 0xe9, 0xbd, 0x5c, 0xb6, 0xef, 0xbc,
- 0xcf, 0x1c, 0xd3, 0xbd, 0x43, 0x66, 0x91, 0xbd, 0x98, 0x7c, 0x9f, 0xbd,
- 0xa5, 0x5d, 0x52, 0xbd, 0xc6, 0xb2, 0x50, 0x3d, 0x55, 0x9c, 0xc4, 0xbd,
- 0xf5, 0x8d, 0x44, 0x3d, 0x73, 0x36, 0x9a, 0x3d, 0x89, 0x4f, 0x81, 0x3e,
- 0x33, 0x27, 0x27, 0xbe, 0x61, 0x3f, 0x53, 0xbc, 0x14, 0xcd, 0x3e, 0xbe,
- 0xce, 0xa3, 0x7c, 0x3d, 0x1d, 0x57, 0x8f, 0xbc, 0x68, 0x3a, 0x01, 0xbe,
- 0x81, 0x51, 0xc9, 0xbd, 0xc3, 0x24, 0x96, 0x3d, 0x50, 0xe9, 0xb4, 0xbd,
- 0x1c, 0xb8, 0x5b, 0xbc, 0x63, 0xff, 0xe2, 0xbd, 0xe8, 0xf6, 0xb3, 0x3d,
- 0xea, 0x56, 0xf5, 0xbd, 0xe9, 0xa7, 0xf4, 0xbd, 0xdb, 0xe4, 0xa8, 0xbe,
- 0x79, 0xb3, 0xb4, 0xbd, 0x1a, 0x96, 0xaa, 0xbd, 0x69, 0x47, 0xf1, 0xbc,
- 0xda, 0xb4, 0x7e, 0x3e, 0x81, 0xc6, 0x6a, 0x3e, 0x70, 0xbb, 0x7c, 0xbd,
- 0x92, 0x35, 0x8e, 0x3e, 0x62, 0xba, 0xcb, 0xbd, 0x39, 0xff, 0x31, 0xbe,
- 0xc7, 0xd6, 0xd8, 0x3e, 0xb8, 0x5d, 0xb0, 0x3e, 0x58, 0x78, 0x93, 0x3e,
- 0xfd, 0xd6, 0xd6, 0x3c, 0xd8, 0x85, 0xc9, 0x3e, 0xe4, 0xde, 0xbe, 0xba,
- 0x08, 0x13, 0xf1, 0xbd, 0x52, 0x23, 0x2c, 0x3f, 0x29, 0x37, 0x16, 0xbe,
- 0x5f, 0xe7, 0xc3, 0xbd, 0x5e, 0x03, 0xad, 0xbe, 0x7a, 0x4e, 0x2a, 0x3e,
- 0x72, 0x17, 0xe4, 0xbe, 0xd8, 0x9d, 0xec, 0xbe, 0xf4, 0x15, 0x2a, 0xbe,
- 0x5b, 0xad, 0x02, 0x3e, 0x52, 0x3f, 0x18, 0xbd, 0xb0, 0xd7, 0x08, 0xbd,
- 0x75, 0x56, 0x9d, 0x3d, 0xc1, 0xa8, 0xcf, 0xbe, 0x99, 0x40, 0x95, 0xbe,
- 0x13, 0x99, 0xad, 0xbd, 0x9b, 0xec, 0x79, 0x3e, 0x2f, 0x9a, 0x50, 0xbe,
- 0x71, 0x84, 0x93, 0x3a, 0xf8, 0x29, 0x2a, 0xbe, 0x80, 0xfa, 0x0f, 0xbe,
- 0x1b, 0xce, 0x6d, 0x3d, 0xc0, 0x6c, 0xd6, 0xbc, 0x93, 0x0b, 0xe6, 0xbd,
- 0x4d, 0x90, 0x68, 0x3d, 0xbc, 0x7e, 0x45, 0xbe, 0xab, 0xdc, 0x5b, 0x3e,
- 0xc8, 0xde, 0xa0, 0x3d, 0x35, 0x15, 0xdb, 0xbd, 0x73, 0x32, 0x4e, 0x3e,
- 0x9c, 0x4e, 0x91, 0xbe, 0x09, 0x91, 0x01, 0x3f, 0xe9, 0xf9, 0xdb, 0xbe,
- 0x76, 0x7e, 0x1d, 0xbd, 0xa6, 0xb8, 0xd0, 0x3d, 0x79, 0x4d, 0x1c, 0xbe,
- 0x2d, 0xc7, 0xf3, 0xbd, 0x52, 0x04, 0x51, 0xbb, 0x4b, 0x5f, 0x36, 0xbe,
- 0xe6, 0xde, 0xd9, 0x3c, 0xef, 0x08, 0xf5, 0x3d, 0x0a, 0x1d, 0x26, 0xbf,
- 0xd6, 0x41, 0x63, 0x3f, 0x19, 0x30, 0x03, 0xbe, 0x5a, 0x9b, 0x32, 0xbe,
- 0xec, 0x4e, 0x03, 0x3e, 0x98, 0xbb, 0x4f, 0xbe, 0x29, 0x3a, 0xea, 0xbc,
- 0xbc, 0xd4, 0x25, 0x3f, 0x90, 0xa7, 0x07, 0x3e, 0x7e, 0x06, 0x5f, 0x3e,
- 0x09, 0xe8, 0x37, 0xbd, 0x35, 0x19, 0x17, 0xbe, 0xab, 0xb0, 0xaf, 0x3c,
- 0x71, 0x73, 0xda, 0xbd, 0x2d, 0x71, 0x27, 0xbe, 0xa2, 0xff, 0x46, 0xbe,
- 0x92, 0x7b, 0x8b, 0x3e, 0xcd, 0xc1, 0x5e, 0xbe, 0xb4, 0x00, 0x1c, 0x3d,
- 0x6a, 0xa1, 0x54, 0xbe, 0x5a, 0x0d, 0x7a, 0x3e, 0xcc, 0x38, 0xd0, 0x3e,
- 0xe8, 0x24, 0x0d, 0xbd, 0xcb, 0x73, 0x34, 0xbe, 0x1f, 0xaa, 0xcd, 0xbd,
- 0x7b, 0xc2, 0x28, 0xbe, 0xfc, 0x18, 0xba, 0x3e, 0x85, 0x12, 0x9c, 0xbe,
- 0x9f, 0xe6, 0xef, 0xbc, 0x07, 0x6c, 0x95, 0x3d, 0x14, 0x28, 0x76, 0xbd,
- 0xa5, 0xc8, 0xb0, 0x3d, 0x89, 0xc5, 0x95, 0xbd, 0x9f, 0x65, 0x54, 0x3c,
- 0xaf, 0x63, 0x48, 0xbe, 0x34, 0x80, 0xd5, 0x3c, 0x17, 0x11, 0x4d, 0x3e,
- 0x89, 0x2a, 0xf1, 0xbd, 0x96, 0x03, 0x8b, 0x3e, 0x06, 0x5c, 0x0a, 0x3d,
- 0x40, 0x48, 0xfd, 0xbe, 0x8b, 0x6d, 0xbc, 0x3d, 0xc0, 0x32, 0x14, 0x3d,
- 0xdb, 0x5d, 0xcf, 0x3d, 0x57, 0x13, 0x03, 0xbd, 0x74, 0x79, 0xf5, 0x3e,
- 0x65, 0xce, 0xbe, 0xbd, 0x0c, 0xb3, 0xde, 0xbd, 0x24, 0x6e, 0x34, 0xbe,
- 0xae, 0x1c, 0xd6, 0xbd, 0x4c, 0xd4, 0x85, 0x3e, 0x1b, 0xe6, 0x78, 0xbe,
- 0x89, 0x30, 0x08, 0xbe, 0xa3, 0x41, 0xc1, 0xbd, 0x8f, 0x1d, 0x66, 0xbe,
- 0xbd, 0x4f, 0xda, 0xbd, 0x56, 0xaf, 0xb1, 0xbe, 0xde, 0x09, 0xf0, 0x3d,
- 0x50, 0x37, 0x53, 0x3d, 0xe6, 0x71, 0x9b, 0x3d, 0xb1, 0xf3, 0x04, 0xbe,
- 0x7b, 0x58, 0x36, 0xbe, 0x34, 0x86, 0x42, 0x3e, 0xa0, 0xed, 0x1a, 0xbd,
- 0xe4, 0x34, 0x46, 0x3e, 0x66, 0xd9, 0xca, 0x3a, 0x82, 0x6b, 0x09, 0x3e,
- 0x23, 0x01, 0x43, 0xbe, 0x86, 0x3d, 0x14, 0x3d, 0xc4, 0x66, 0xa8, 0xbd,
- 0x3c, 0x08, 0x61, 0x3c, 0xa6, 0x38, 0x15, 0xbe, 0x7f, 0x93, 0x9d, 0x3a,
- 0xf5, 0xab, 0x83, 0x3d, 0x41, 0x5d, 0x69, 0x3e, 0xdd, 0x7a, 0x84, 0x3d,
- 0x28, 0x8d, 0x3f, 0xbc, 0x3b, 0x69, 0xb4, 0x3d, 0xf5, 0x36, 0x0e, 0xbd,
- 0xcc, 0x9a, 0x87, 0xbb, 0x91, 0xbc, 0xce, 0xbc, 0x93, 0xec, 0x0a, 0xbe,
- 0xc8, 0x0c, 0x15, 0x3d, 0x95, 0x0a, 0xe5, 0xbd, 0x78, 0xc9, 0x08, 0xbe,
- 0xe6, 0xbf, 0xa4, 0xbd, 0x5c, 0x3f, 0x0b, 0x3d, 0x46, 0xd8, 0xe3, 0x3d,
- 0x83, 0xeb, 0xf1, 0xbd, 0xbc, 0x08, 0x9b, 0xbd, 0x16, 0xef, 0x0f, 0x3d,
- 0xe0, 0xc7, 0xcf, 0xbc, 0x78, 0x6f, 0xcd, 0xbc, 0x65, 0x34, 0x6c, 0xbe,
- 0xe6, 0x46, 0xf6, 0x3d, 0xf8, 0x03, 0x86, 0xbc, 0x16, 0x72, 0xbc, 0xbc,
- 0x77, 0xf3, 0xa1, 0x3e, 0xe2, 0xaf, 0xa9, 0x3d, 0x01, 0x9e, 0x12, 0xbd,
- 0xb8, 0x4f, 0xc9, 0xbd, 0xab, 0x44, 0x9f, 0x3d, 0xd1, 0xe7, 0xe8, 0xbd,
- 0xfc, 0xbe, 0x86, 0x3e, 0x98, 0x3b, 0xba, 0xbd, 0x46, 0x36, 0xfa, 0xbd,
- 0x79, 0xb2, 0xe3, 0xbd, 0x93, 0x6f, 0xf7, 0xbc, 0x02, 0x70, 0x00, 0xbe,
- 0x4c, 0xce, 0x2a, 0x3e, 0x24, 0x9c, 0x9f, 0xbc, 0x0c, 0x2a, 0x39, 0x3d,
- 0x07, 0xc4, 0x03, 0x3e, 0x30, 0x4c, 0x40, 0xbe, 0x30, 0x3a, 0x56, 0x3c,
- 0x6f, 0x7a, 0x92, 0x3d, 0x94, 0x1b, 0x41, 0x3e, 0xf5, 0xa4, 0xcd, 0xbd,
- 0xec, 0x89, 0x7b, 0xbe, 0x96, 0x9f, 0x82, 0x3d, 0x28, 0x7d, 0x3a, 0xbd,
- 0x8f, 0xa5, 0x82, 0xbd, 0x33, 0x79, 0x52, 0xbd, 0xfa, 0xc2, 0xc8, 0xbd,
- 0x0e, 0xc1, 0x5b, 0xbd, 0x1a, 0x92, 0x46, 0xbd, 0x6f, 0x4f, 0x99, 0x3d,
- 0x40, 0xa2, 0x92, 0x3d, 0xfb, 0x13, 0x44, 0xbc, 0xa3, 0x8d, 0x5f, 0xbe,
- 0x8d, 0x83, 0xd5, 0xbd, 0x9a, 0x4e, 0xfb, 0xbb, 0xc1, 0x81, 0xc1, 0xbe,
- 0xfd, 0x30, 0x00, 0x3d, 0xeb, 0x57, 0xd7, 0xbd, 0x5e, 0xf1, 0xcb, 0xbc,
- 0x69, 0xd8, 0x80, 0xbd, 0x5e, 0x9b, 0x94, 0xbd, 0x16, 0xbb, 0x9d, 0x3e,
- 0x6f, 0x73, 0x02, 0xbe, 0x9b, 0x72, 0x4a, 0xbe, 0xb0, 0x9c, 0x57, 0xbd,
- 0xd7, 0xd5, 0x57, 0x3d, 0xc4, 0xfa, 0x0b, 0x3d, 0xea, 0xf9, 0x88, 0xbd,
- 0xd5, 0x5f, 0x04, 0xbd, 0xbc, 0x9c, 0xac, 0xbd, 0x03, 0x21, 0x1b, 0x3c,
- 0xad, 0x69, 0x8a, 0x3c, 0x15, 0x04, 0x60, 0x3e, 0xf6, 0xfd, 0xa9, 0x3d,
- 0x05, 0x3d, 0x87, 0xbe, 0xa3, 0x4c, 0x18, 0x3e, 0xa0, 0xaa, 0x24, 0x3c,
- 0xaa, 0x62, 0xcc, 0xbd, 0x18, 0x8b, 0x51, 0xbe, 0x9c, 0x56, 0x9a, 0xbe,
- 0xa1, 0xcd, 0x0a, 0xbd, 0xbb, 0x0a, 0xf9, 0xbd, 0xdd, 0x9a, 0xa7, 0x3d,
- 0x0e, 0xc6, 0x1e, 0x3d, 0x1a, 0x48, 0x5c, 0xbe, 0x0c, 0xeb, 0x8c, 0xbe,
- 0x22, 0x64, 0x1f, 0x3e, 0x1d, 0xd1, 0x18, 0xbd, 0xb0, 0x82, 0x9a, 0xbd,
- 0xaf, 0xf2, 0x72, 0x3d, 0xb6, 0xd2, 0xc0, 0x3c, 0x59, 0xb3, 0x93, 0x3e,
- 0x0a, 0xc5, 0xfd, 0x3b, 0xbe, 0xb2, 0x23, 0x3d, 0x38, 0xaa, 0x1f, 0xbe,
- 0x0f, 0xcf, 0x6d, 0xbd, 0x54, 0x83, 0x7b, 0xbc, 0x9a, 0x5d, 0xce, 0xbd,
- 0x7f, 0x7a, 0x9c, 0xbd, 0xfd, 0x12, 0xf8, 0x3d, 0xc6, 0x39, 0x88, 0xbd,
- 0x1b, 0xe6, 0xc2, 0x3d, 0x25, 0x64, 0xc2, 0x3e, 0x47, 0x34, 0x64, 0xbd,
- 0x89, 0x84, 0x36, 0x3d, 0x07, 0x5b, 0xbb, 0xbc, 0xd6, 0x05, 0x70, 0x3d,
- 0xd6, 0x75, 0x03, 0x3c, 0x2c, 0x26, 0x1e, 0x3d, 0xde, 0x2c, 0xf0, 0xbd,
- 0x61, 0x68, 0x12, 0xbe, 0x53, 0xbf, 0x75, 0xbe, 0x7d, 0xd7, 0xfe, 0xbd,
- 0xca, 0x9c, 0x9f, 0xba, 0xe2, 0xb4, 0x02, 0x3e, 0x1a, 0xa2, 0x89, 0x3d,
- 0xc4, 0xb3, 0x2d, 0x3e, 0x47, 0x12, 0x89, 0xbd, 0x5c, 0xa5, 0x97, 0xbe,
- 0xb6, 0x93, 0x9c, 0xbc, 0xc5, 0xdb, 0x83, 0x3d, 0x25, 0x03, 0x81, 0x3d,
- 0x9f, 0x76, 0x38, 0x3e, 0x81, 0x7b, 0x17, 0xbe, 0x0e, 0xd6, 0x86, 0xbe,
- 0x0b, 0xfd, 0x65, 0xbe, 0xdf, 0x16, 0xa8, 0x3d, 0x03, 0x34, 0x8c, 0x3e,
- 0x95, 0x5e, 0x1c, 0xbe, 0xf5, 0xf8, 0x93, 0xbd, 0xf5, 0x2a, 0x82, 0xbe,
- 0xa7, 0x22, 0xbd, 0xbd, 0xd7, 0xc3, 0x11, 0xbd, 0xd5, 0x86, 0xb1, 0x3c,
- 0xa5, 0x9a, 0xa2, 0xbd, 0x36, 0x16, 0xc0, 0xbd, 0x47, 0x4d, 0x1a, 0xbd,
- 0x42, 0xa4, 0xea, 0xbd, 0x22, 0x07, 0xec, 0xbc, 0x3c, 0x4a, 0xc8, 0x3d,
- 0xf2, 0x3a, 0x4c, 0x3a, 0x66, 0x0f, 0x66, 0x3e, 0x28, 0xc9, 0x08, 0xbe,
- 0x69, 0x4c, 0x50, 0x3e, 0x73, 0xc6, 0x86, 0x3d, 0x21, 0x1e, 0x24, 0x3c,
- 0xb4, 0xde, 0x63, 0xbd, 0x69, 0x0e, 0x55, 0xbe, 0xe5, 0x30, 0x01, 0xbe,
- 0xd4, 0xd3, 0xd2, 0x3d, 0xc2, 0xe1, 0x4b, 0xbe, 0x7f, 0xa3, 0x3c, 0xbd,
- 0xc9, 0x18, 0xe4, 0x3d, 0xb9, 0xdf, 0x73, 0xbd, 0xad, 0x07, 0x3b, 0xbe,
- 0xcb, 0xe0, 0x3b, 0xbd, 0x9c, 0xae, 0x10, 0xbe, 0xef, 0xce, 0x7a, 0xbd,
- 0x1f, 0x90, 0x1f, 0x3d, 0x39, 0x79, 0x9f, 0xbd, 0x98, 0xb5, 0xba, 0xbd,
- 0x90, 0x5c, 0x47, 0x3d, 0xe6, 0x99, 0xec, 0xbd, 0xe7, 0xaa, 0x1c, 0x3d,
- 0x97, 0x81, 0xc9, 0x3d, 0x72, 0xa6, 0xd9, 0xbd, 0x3a, 0x09, 0x03, 0x3e,
- 0x57, 0xa8, 0x4a, 0xbe, 0x25, 0x2d, 0x8d, 0x3d, 0x8c, 0x08, 0x23, 0xbe,
- 0x5f, 0xbe, 0x93, 0x3d, 0xc5, 0x10, 0x99, 0x3d, 0xe4, 0x58, 0xb3, 0xbc,
- 0xdb, 0x7b, 0x87, 0xbd, 0xea, 0x66, 0x56, 0x3d, 0xba, 0x8e, 0x80, 0xbc,
- 0xbe, 0xb0, 0x05, 0x3e, 0x7b, 0x8b, 0x97, 0x3d, 0x50, 0x0f, 0x91, 0xbc,
- 0x22, 0x45, 0x1a, 0xbd, 0x15, 0xa3, 0xb3, 0x3e, 0x9c, 0xdf, 0x31, 0x3e,
- 0x7b, 0x62, 0x6b, 0xbd, 0xa7, 0x88, 0x95, 0x3e, 0x38, 0x5d, 0xa3, 0x3e,
- 0xa5, 0xa4, 0xd7, 0x3d, 0x3c, 0x0c, 0x55, 0xbc, 0xc4, 0xcf, 0x81, 0xbf,
- 0xbd, 0x53, 0x9d, 0x3e, 0xfb, 0xca, 0x11, 0xbd, 0x5d, 0xee, 0x8a, 0xbc,
- 0xbf, 0xe0, 0x87, 0x3e, 0x09, 0xc2, 0xf4, 0xbe, 0x15, 0x58, 0x86, 0xbf,
- 0x71, 0x27, 0x8c, 0x3d, 0x2d, 0x65, 0xcb, 0xbd, 0xca, 0xd3, 0xb8, 0xbe,
- 0xd9, 0x02, 0x1b, 0xbe, 0xf6, 0xad, 0xc0, 0x3c, 0x91, 0xb8, 0x4f, 0xbe,
- 0xa2, 0xdc, 0x93, 0x3b, 0x31, 0x93, 0x8a, 0x3e, 0x58, 0x1b, 0x42, 0x3d,
- 0x22, 0x46, 0xef, 0xbd, 0x92, 0xbe, 0x92, 0xbe, 0x67, 0x25, 0xa2, 0x3e,
- 0x9d, 0x86, 0x82, 0x3d, 0x26, 0x82, 0x42, 0xbc, 0x6d, 0x61, 0x2c, 0x3d,
- 0xba, 0x07, 0x08, 0xbe, 0x2d, 0xff, 0x2b, 0x3e, 0x48, 0x28, 0xd1, 0xbd,
- 0xad, 0x8d, 0x5e, 0xbc, 0x8a, 0x23, 0x02, 0xbf, 0xec, 0x47, 0xa4, 0xbe,
- 0x8d, 0x65, 0x99, 0x3e, 0xad, 0x48, 0x6e, 0x3c, 0x7e, 0xe2, 0x1f, 0x3e,
- 0xac, 0x1d, 0x0b, 0xbe, 0xc2, 0xb9, 0x0c, 0xbf, 0xeb, 0x6d, 0xb0, 0xbd,
- 0x38, 0x75, 0x65, 0x3c, 0x1e, 0x74, 0x15, 0x3e, 0x27, 0x06, 0x37, 0xbe,
- 0xb8, 0xba, 0x25, 0xbf, 0x17, 0x71, 0xd4, 0xbc, 0xed, 0x1c, 0xd7, 0xbc,
- 0x04, 0xbb, 0x1f, 0x3f, 0xfc, 0x4c, 0x7f, 0xbe, 0xe2, 0x42, 0xa0, 0x3d,
- 0x5e, 0x4d, 0x88, 0x3e, 0xc0, 0x56, 0x4e, 0xbe, 0x7e, 0x96, 0xf6, 0x3c,
- 0x1f, 0xdc, 0xf0, 0x3d, 0x09, 0x9e, 0x91, 0x3e, 0xc6, 0x63, 0x71, 0xbd,
- 0x83, 0x5c, 0x87, 0x3d, 0xf0, 0x0f, 0xc5, 0x3d, 0x0c, 0x25, 0x1f, 0x3e,
- 0x5c, 0x48, 0xc3, 0x3d, 0xa1, 0xc1, 0x84, 0xbd, 0x67, 0x17, 0x45, 0x3d,
- 0xe3, 0x8a, 0x01, 0x3f, 0x9c, 0x4b, 0x4f, 0xbf, 0xa4, 0x40, 0x06, 0xbe,
- 0xd3, 0xa5, 0xd1, 0x3e, 0x4c, 0x05, 0xb1, 0xba, 0x0d, 0xb7, 0x71, 0xbe,
- 0x20, 0x08, 0xbd, 0x3d, 0x6e, 0x87, 0x07, 0x3e, 0x6f, 0xbc, 0x9d, 0x3e,
- 0x9f, 0x2b, 0xad, 0xbd, 0xab, 0xd6, 0xdd, 0x3d, 0x20, 0x66, 0x8c, 0x3d,
- 0x9c, 0xab, 0xd0, 0xbc, 0xca, 0xea, 0x01, 0xbe, 0xc6, 0xf4, 0x5a, 0xbe,
- 0xc0, 0x90, 0x2f, 0x3e, 0x51, 0x08, 0x90, 0xbd, 0x7f, 0x54, 0x8c, 0x3e,
- 0x73, 0x03, 0x67, 0xbd, 0xb6, 0x85, 0x9f, 0x3d, 0xde, 0x91, 0x2c, 0x3e,
- 0xcd, 0xf5, 0x45, 0x3e, 0xc1, 0x19, 0x0d, 0x3e, 0x33, 0xc5, 0x50, 0x3e,
- 0xe4, 0xd9, 0x8d, 0xbd, 0xa1, 0x8f, 0x84, 0x3e, 0x8b, 0x10, 0x23, 0xbf,
- 0x89, 0xb9, 0x8a, 0xbe, 0x02, 0x31, 0x36, 0xbf, 0xb5, 0xaf, 0x57, 0x3d,
- 0x90, 0xca, 0xa8, 0x3d, 0x4b, 0xef, 0x60, 0xbe, 0x5e, 0x14, 0xdb, 0x3e,
- 0x82, 0xc1, 0xca, 0xbc, 0xe6, 0xd8, 0xb6, 0xbc, 0x80, 0x5d, 0xe5, 0x3e,
- 0xd1, 0x0c, 0x8d, 0x3e, 0xb6, 0x0c, 0x03, 0xbe, 0xa7, 0xae, 0x4c, 0xbd,
- 0xfc, 0x81, 0x1f, 0x3d, 0xe1, 0x62, 0x16, 0x3e, 0x4f, 0x79, 0xc7, 0xbd,
- 0x5e, 0x01, 0xab, 0x3d, 0xcf, 0x44, 0x0b, 0x3e, 0x05, 0x5d, 0xcd, 0x3c,
- 0x4f, 0x09, 0xf7, 0xbd, 0x6e, 0xef, 0x92, 0x3d, 0xce, 0x7d, 0x72, 0x3d,
- 0x1d, 0x5c, 0x3b, 0x3e, 0x72, 0x79, 0x4d, 0x3e, 0xda, 0x54, 0x6e, 0xbd,
- 0x10, 0x59, 0x20, 0xbe, 0x10, 0x2c, 0xea, 0x3d, 0x3d, 0x8d, 0x31, 0xbe,
- 0xf5, 0x53, 0xdf, 0x3c, 0xff, 0xf6, 0xb2, 0x3c, 0xcf, 0x6c, 0x5a, 0xbe,
- 0x94, 0x06, 0x23, 0xbe, 0xca, 0x45, 0x20, 0xbe, 0xf8, 0x88, 0xa1, 0x3d,
- 0x70, 0x7a, 0x9c, 0xbc, 0x86, 0xf7, 0x49, 0xbd, 0x44, 0x68, 0x25, 0x3e,
- 0xc9, 0x39, 0xae, 0xbd, 0x3b, 0x0e, 0x61, 0x3e, 0x6b, 0x5f, 0x44, 0x3e,
- 0x27, 0x6d, 0xdf, 0xbd, 0x9a, 0xad, 0x4a, 0xbe, 0x9b, 0xf1, 0x45, 0xbe,
- 0x94, 0x9b, 0x44, 0xbc, 0xed, 0x1d, 0x94, 0xbe, 0x82, 0x72, 0x35, 0xbb,
- 0x81, 0xb7, 0x81, 0xbd, 0x9d, 0xef, 0xb6, 0x3c, 0x8c, 0x71, 0x4d, 0x3d,
- 0xb3, 0x5c, 0xc7, 0xbc, 0x10, 0xb9, 0xf2, 0xbd, 0x89, 0x3d, 0x8e, 0x3c,
- 0x75, 0x00, 0x14, 0x3e, 0xfc, 0x45, 0xb8, 0x3a, 0x1f, 0xe8, 0x3b, 0xbe,
- 0xc3, 0x19, 0x52, 0x3d, 0x65, 0xc5, 0x2f, 0xbe, 0x01, 0x21, 0xb9, 0x3d,
- 0xa7, 0xe8, 0x8a, 0x3c, 0xde, 0x92, 0x8b, 0x3e, 0xcb, 0x1a, 0x24, 0x3d,
- 0x8a, 0x55, 0x28, 0xbe, 0x6b, 0x15, 0x33, 0x3e, 0xa3, 0x06, 0x5d, 0xbc,
- 0x0c, 0x99, 0xa9, 0xbd, 0x12, 0xc2, 0x79, 0x3d, 0x68, 0x57, 0xaa, 0xbe,
- 0x97, 0xe2, 0x33, 0xbd, 0x06, 0x29, 0x01, 0x3e, 0x80, 0xe7, 0xe7, 0x3d,
- 0x71, 0x89, 0x01, 0xbe, 0x30, 0x8f, 0xa6, 0xbc, 0xe0, 0x35, 0xec, 0xbd,
- 0x87, 0xb6, 0x1b, 0xbe, 0xdf, 0xfa, 0x40, 0xbd, 0xc9, 0x9c, 0x1e, 0x3d,
- 0x39, 0x1a, 0x3e, 0xbd, 0x50, 0xaf, 0x19, 0x3e, 0xff, 0xd3, 0x5c, 0xbe,
- 0xbc, 0xe6, 0x2a, 0x3d, 0x5d, 0x0c, 0x91, 0xbd, 0x09, 0xbf, 0x1a, 0xbe,
- 0x81, 0x5b, 0x20, 0x3d, 0xa2, 0xf0, 0x22, 0xbd, 0xa8, 0x50, 0xd8, 0xbd,
- 0x4d, 0x97, 0xf0, 0x3d, 0x08, 0x0e, 0x01, 0xbe, 0xcb, 0xa7, 0x9e, 0x3d,
- 0x60, 0x2c, 0x0f, 0x3c, 0xd5, 0x20, 0x7b, 0x3e, 0x4d, 0x2d, 0x6d, 0xbc,
- 0xb3, 0x24, 0x05, 0xbd, 0x10, 0xb3, 0x18, 0xbe, 0xbf, 0x43, 0x50, 0x3d,
- 0xb1, 0x8b, 0x31, 0xbd, 0x07, 0x57, 0x93, 0x3c, 0x7c, 0xb3, 0xd8, 0xbd,
- 0x74, 0x7f, 0x4a, 0xbd, 0x8d, 0x8e, 0x47, 0x3c, 0x66, 0x5d, 0xc3, 0xbc,
- 0x55, 0x3c, 0x9f, 0xbd, 0x90, 0x5f, 0x12, 0x3e, 0x15, 0x7e, 0x03, 0x3e,
- 0x2a, 0x0a, 0x80, 0x3b, 0x41, 0x86, 0x6f, 0xbe, 0xa4, 0x8f, 0x17, 0xbb,
- 0x2e, 0x71, 0x25, 0xbe, 0xcf, 0x01, 0x64, 0xbe, 0x45, 0x58, 0xe3, 0xbe,
- 0xf7, 0x5a, 0x4a, 0xbe, 0x26, 0x8a, 0x10, 0x3e, 0xa6, 0xee, 0xdb, 0x3d,
- 0xdf, 0x8a, 0xda, 0x39, 0xe8, 0x4c, 0x2a, 0x3e, 0x95, 0xeb, 0x02, 0xbe,
- 0xe9, 0x09, 0x5b, 0x3e, 0xed, 0x8e, 0xdb, 0x3d, 0xd5, 0x47, 0xb2, 0xbe,
- 0x72, 0x54, 0xfb, 0x3e, 0xe4, 0x18, 0x03, 0x3f, 0x07, 0x69, 0x1b, 0x3e,
- 0x18, 0x3e, 0x25, 0x3d, 0xc1, 0xb1, 0x8e, 0x3e, 0xc0, 0x6e, 0x0a, 0x3e,
- 0x7a, 0xd5, 0x4e, 0xbd, 0x54, 0x0a, 0x12, 0x3f, 0x1e, 0xb9, 0x7a, 0x3d,
- 0x27, 0x1d, 0xb9, 0xbd, 0xd5, 0xce, 0x68, 0xbe, 0xdf, 0x1e, 0xfb, 0x3c,
- 0x3e, 0x17, 0xe8, 0xbe, 0x01, 0x64, 0xd0, 0xbe, 0x2d, 0x3b, 0x82, 0xbe,
- 0xd5, 0x37, 0x7c, 0xbc, 0x08, 0xcc, 0xd7, 0xbc, 0xe9, 0xf6, 0x07, 0xbe,
- 0x25, 0x22, 0x9e, 0xbc, 0xd4, 0x24, 0x06, 0xbf, 0xed, 0x09, 0x7a, 0xbe,
- 0xfe, 0x5f, 0x3e, 0xbd, 0xf4, 0x32, 0xa4, 0x3e, 0x60, 0xef, 0x36, 0xbe,
- 0xdd, 0xf5, 0xad, 0xbc, 0x14, 0x72, 0x47, 0x3d, 0x72, 0xa9, 0x9b, 0xbd,
- 0x44, 0x89, 0xf7, 0x3c, 0xa7, 0xd8, 0x61, 0x3c, 0x3b, 0x21, 0xd3, 0xbd,
- 0x67, 0xe3, 0x27, 0xbe, 0xf1, 0x39, 0x90, 0xbe, 0x75, 0x6e, 0xbd, 0x3e,
- 0x60, 0x47, 0x2a, 0x3d, 0x9f, 0xeb, 0x07, 0x3d, 0xc3, 0xe5, 0x13, 0x3e,
- 0xa9, 0xf1, 0x4c, 0xbe, 0xe3, 0x29, 0x2f, 0x3f, 0xbb, 0x1f, 0x8c, 0xbe,
- 0x9c, 0x4a, 0x2e, 0xbd, 0xb5, 0xda, 0x60, 0x3e, 0x38, 0x05, 0xf6, 0x3b,
- 0x4c, 0x26, 0x86, 0x3d, 0x36, 0x75, 0xd7, 0x3e, 0x8c, 0x15, 0x5e, 0xbe,
- 0xde, 0x6c, 0x0c, 0xbe, 0x12, 0xfd, 0x28, 0x3d, 0x6c, 0x57, 0x58, 0xbf,
- 0x27, 0x45, 0x70, 0x3f, 0x26, 0x1d, 0xe3, 0xbd, 0x21, 0x6b, 0x03, 0xbe,
- 0xe5, 0x65, 0x67, 0xbc, 0xfb, 0x83, 0xd4, 0xbd, 0x39, 0xe9, 0xd6, 0xbd,
- 0x22, 0xb6, 0x3f, 0x3f, 0xd8, 0xa9, 0x02, 0x3d, 0x6c, 0x82, 0xb2, 0x3d,
- 0x0c, 0x09, 0xf2, 0xbd, 0xbf, 0x7a, 0x1c, 0xbe, 0xb6, 0x1c, 0xb0, 0xbc,
- 0xe9, 0x17, 0xdb, 0xbd, 0xf0, 0xfc, 0xb8, 0x3d, 0xa8, 0x9c, 0xf8, 0xbd,
- 0xf2, 0x05, 0x0b, 0x3e, 0x4f, 0xb8, 0x3c, 0xbe, 0x00, 0x81, 0x06, 0x3e,
- 0x39, 0x39, 0x70, 0xbe, 0x50, 0xf8, 0x93, 0x3e, 0x40, 0x47, 0xa1, 0x3e,
- 0x57, 0x4c, 0xcb, 0xbd, 0xa8, 0x47, 0x17, 0xbe, 0x4c, 0x9c, 0xbc, 0xbd,
- 0xbf, 0xb7, 0xe4, 0x3d, 0x28, 0xec, 0x9d, 0x3e, 0xa6, 0x4e, 0xa3, 0xbe,
- 0x5d, 0xa8, 0x8d, 0xbd, 0xc7, 0xc8, 0xf4, 0xbc, 0x0e, 0x8c, 0x4f, 0xbc,
- 0x8b, 0xb0, 0x3c, 0x3e, 0x11, 0xf2, 0x76, 0x3c, 0xb5, 0x6d, 0x89, 0xbd,
- 0xd3, 0x6f, 0x15, 0xbe, 0x14, 0xeb, 0xd0, 0x3d, 0xd6, 0xe4, 0x84, 0x3e,
- 0x17, 0xd3, 0xfd, 0xbd, 0x9d, 0xb7, 0x58, 0x3e, 0xd4, 0xac, 0x8a, 0x3e,
- 0x7c, 0x54, 0x9c, 0xbe, 0x7d, 0x01, 0x2b, 0x3e, 0xdb, 0x1f, 0x91, 0xbd,
- 0x17, 0xba, 0x24, 0xbd, 0x91, 0x52, 0x52, 0xbd, 0x2c, 0x55, 0xe1, 0x3e,
- 0x2d, 0xce, 0x59, 0xbb, 0xed, 0xe3, 0xac, 0x3d, 0xc2, 0xf7, 0x1a, 0x3c,
- 0x50, 0x65, 0x7e, 0xbc, 0x3e, 0x85, 0x9c, 0x3e, 0x9b, 0xec, 0x53, 0xbe,
- 0x9c, 0x29, 0xa5, 0x3c, 0xf5, 0x01, 0x17, 0xbe, 0x15, 0x4f, 0x98, 0xbe,
- 0x21, 0xf4, 0x43, 0xbe, 0xba, 0x44, 0x94, 0xbe, 0x69, 0x55, 0x9e, 0x3e,
- 0x61, 0x37, 0xf4, 0x3d, 0xef, 0xe1, 0x99, 0xbd, 0x6c, 0x00, 0x65, 0xbe,
- 0x08, 0xd7, 0x52, 0xbe, 0x8d, 0x63, 0xea, 0xbd, 0xcf, 0xf8, 0x7c, 0xbe,
- 0x9b, 0xf4, 0x3e, 0x3c, 0x1b, 0x14, 0x5c, 0xbe, 0x74, 0xd5, 0xc7, 0x3c,
- 0x97, 0x0a, 0xde, 0x3d, 0x57, 0x8e, 0x02, 0x3d, 0x49, 0xe3, 0xa9, 0xbe,
- 0x38, 0xfc, 0x5f, 0x3c, 0x3c, 0xf6, 0xa7, 0xbd, 0xac, 0x98, 0x39, 0xbd,
- 0x8c, 0x7d, 0x21, 0x3e, 0x68, 0x31, 0x17, 0x3e, 0xcb, 0xc8, 0xbc, 0x3d,
- 0x8d, 0xff, 0xcb, 0xbd, 0x0d, 0xf6, 0xe9, 0x3d, 0xd6, 0x8d, 0x1c, 0xbe,
- 0xb7, 0xe0, 0x0b, 0xbd, 0x4e, 0xe7, 0x02, 0xbe, 0x26, 0x40, 0xd1, 0x3d,
- 0x71, 0x01, 0xef, 0x3d, 0x1a, 0x98, 0xc0, 0xba, 0xe4, 0x41, 0x3f, 0xbd,
- 0xd5, 0x4f, 0x41, 0x3c, 0x1c, 0x20, 0xe3, 0xbd, 0xe9, 0x67, 0x89, 0xbd,
- 0xbc, 0x07, 0x78, 0xbd, 0xf6, 0xdb, 0xfb, 0xbc, 0xf7, 0x76, 0x34, 0x3e,
- 0x7a, 0xa4, 0x0c, 0xbe, 0xec, 0x56, 0xf4, 0xbd, 0xad, 0x60, 0x99, 0xbe,
- 0xc5, 0x09, 0x1e, 0xbd, 0x2f, 0x1b, 0x30, 0x3e, 0x28, 0xb6, 0x81, 0xbd,
- 0xaa, 0x0d, 0x6c, 0x3e, 0x2d, 0x4b, 0x39, 0xbd, 0xfc, 0x45, 0x9a, 0x3d,
- 0xed, 0x11, 0x27, 0x3e, 0x1c, 0x0b, 0xa8, 0xbd, 0x38, 0xbc, 0x93, 0xbd,
- 0x87, 0x31, 0x8c, 0x3d, 0xec, 0x97, 0xc9, 0xbd, 0xa5, 0x82, 0x10, 0xbd,
- 0x84, 0xf7, 0x5a, 0x3d, 0x5c, 0xea, 0x82, 0xbd, 0x42, 0xdd, 0x09, 0xbc,
- 0x22, 0xbe, 0xe6, 0x3e, 0x15, 0x21, 0x94, 0xbd, 0x1a, 0x68, 0x24, 0x3e,
- 0x2a, 0x13, 0xeb, 0x39, 0xc1, 0xbf, 0x87, 0x3d, 0xc8, 0x06, 0x01, 0x3e,
- 0x40, 0x13, 0x96, 0xbd, 0xac, 0x0c, 0x65, 0x3e, 0xfa, 0x0b, 0xe2, 0xbd,
- 0xad, 0xf2, 0x9d, 0xbe, 0xed, 0x29, 0xba, 0xbd, 0xab, 0xa1, 0xa6, 0xbd,
- 0x8f, 0x64, 0x2d, 0xbe, 0x15, 0xa5, 0x71, 0x3c, 0x4b, 0xcb, 0x50, 0x3e,
- 0xe7, 0x93, 0xd4, 0x3d, 0xc0, 0x62, 0x83, 0xbe, 0x01, 0x25, 0x67, 0x3b,
- 0xd5, 0x48, 0x84, 0xbc, 0xe6, 0xee, 0x9e, 0x3d, 0xb1, 0x9e, 0x46, 0x3d,
- 0xef, 0x38, 0x51, 0xbe, 0x51, 0x91, 0xdd, 0xbb, 0xee, 0x0e, 0x50, 0xbe,
- 0xdf, 0x40, 0xaa, 0x3c, 0x9b, 0x71, 0xe6, 0xbd, 0x36, 0x16, 0x6f, 0x3e,
- 0x3b, 0x15, 0x29, 0xbd, 0x4b, 0x5c, 0xde, 0xbd, 0x94, 0xc9, 0x2e, 0xbc,
- 0xeb, 0xde, 0xb8, 0x3c, 0xc5, 0xab, 0x82, 0xbe, 0xf0, 0x5c, 0x37, 0x3e,
- 0x75, 0x70, 0xb1, 0xbd, 0x78, 0x61, 0x9a, 0xbd, 0xd6, 0x2b, 0x00, 0x3d,
- 0x4a, 0xca, 0x62, 0xbe, 0x68, 0x47, 0xa2, 0x3d, 0x95, 0xc1, 0x04, 0x3e,
- 0x41, 0x95, 0x3b, 0xbe, 0x3a, 0x5b, 0x16, 0x3e, 0x8b, 0xe3, 0x9f, 0xbd,
- 0x30, 0x4a, 0x17, 0xbe, 0xfd, 0xf8, 0x5c, 0x3e, 0x27, 0xa2, 0x1d, 0xbe,
- 0x34, 0x34, 0x16, 0xbe, 0xd2, 0xc4, 0xaf, 0x3b, 0x69, 0xef, 0x7f, 0xbe,
- 0x35, 0x59, 0x69, 0x3d, 0x18, 0xfa, 0x93, 0xbd, 0xb4, 0x5f, 0x2a, 0x3d,
- 0xf6, 0x4d, 0x9e, 0x3d, 0xb0, 0x5f, 0x84, 0xbe, 0x51, 0xc2, 0x84, 0xbe,
- 0x56, 0xe4, 0x1b, 0xbe, 0xa9, 0x0c, 0x00, 0xbe, 0x32, 0x81, 0x88, 0xbe,
- 0x1a, 0x84, 0x9b, 0x3c, 0x5e, 0x8d, 0x17, 0xbe, 0x72, 0x7e, 0x3a, 0xbd,
- 0xf1, 0x37, 0xa4, 0xbd, 0x2a, 0x3a, 0x06, 0xbe, 0x78, 0xc8, 0x6a, 0xbe,
- 0x1a, 0x09, 0xfb, 0xbd, 0x78, 0x54, 0xef, 0xbd, 0xaf, 0x6b, 0xbb, 0xbd,
- 0x5e, 0x73, 0x40, 0x3e, 0xaa, 0x3a, 0x02, 0xbd, 0x66, 0x43, 0x5d, 0xba,
- 0xd3, 0x39, 0x04, 0xbe, 0xd6, 0x5a, 0xb0, 0x3d, 0x0c, 0xc8, 0xb2, 0xbe,
- 0xae, 0x33, 0x54, 0xbd, 0x1e, 0x4b, 0x4e, 0x3d, 0xda, 0x64, 0x16, 0xbe,
- 0x49, 0x2b, 0xa7, 0xbc, 0x71, 0xcf, 0x84, 0x3e, 0xe9, 0x65, 0x1c, 0xbe,
- 0xa0, 0x62, 0x10, 0xbe, 0xf9, 0xd8, 0xa7, 0xbe, 0xee, 0x92, 0x91, 0x3d,
- 0x3b, 0xea, 0x57, 0xbc, 0x11, 0xf0, 0xaa, 0xbd, 0xf8, 0xca, 0x00, 0x3c,
- 0x55, 0x5b, 0xc6, 0x3d, 0xf7, 0x28, 0x30, 0x3d, 0x6d, 0xa4, 0xa7, 0xbd,
- 0xa6, 0x76, 0x8c, 0x3d, 0xde, 0xe7, 0x98, 0x3e, 0x63, 0xfa, 0x0c, 0x3e,
- 0x58, 0x71, 0xd3, 0x3d, 0x31, 0x70, 0x3e, 0xbe, 0x2e, 0xd5, 0xf1, 0xbd,
- 0x12, 0x37, 0xc0, 0xbd, 0x07, 0x65, 0x3e, 0x3d, 0xb7, 0x90, 0x84, 0x3d,
- 0x78, 0x70, 0x73, 0xbe, 0xf4, 0xa4, 0xb5, 0x3d, 0x20, 0xce, 0xa0, 0xbe,
- 0x63, 0xbe, 0x83, 0x3d, 0xef, 0x6f, 0xd8, 0x3d, 0x5b, 0xfd, 0x06, 0xbe,
- 0xbd, 0x0b, 0xc3, 0xbd, 0xb6, 0x0d, 0x8e, 0x3d, 0x02, 0x3d, 0x4e, 0x3d,
- 0xa0, 0xc1, 0xa9, 0xbc, 0x40, 0x85, 0x43, 0xbe, 0x32, 0x80, 0x2e, 0x3d,
- 0x6e, 0x3b, 0x32, 0xba, 0x6c, 0x91, 0x1e, 0x3e, 0x8d, 0xe8, 0xe0, 0xbb,
- 0x33, 0x6b, 0x1d, 0xbe, 0x8f, 0x85, 0x95, 0x3d, 0xd6, 0xdd, 0x9a, 0xbd,
- 0x76, 0x74, 0x9d, 0xbd, 0xb0, 0x13, 0x2e, 0xbe, 0x57, 0x12, 0xe2, 0xbd,
- 0x25, 0xcd, 0x4c, 0x3c, 0x6a, 0x64, 0x6e, 0xbe, 0x80, 0x57, 0x1b, 0xbe,
- 0x60, 0x8f, 0xa9, 0x3d, 0xbd, 0x3e, 0x14, 0xbd, 0x9a, 0xa7, 0x96, 0xbd,
- 0x7d, 0x2e, 0x3f, 0xbe, 0x69, 0xb5, 0x07, 0xbe, 0xe6, 0xef, 0x11, 0xbe,
- 0x92, 0xb6, 0xe7, 0x3b, 0x6d, 0xa3, 0xd3, 0xbc, 0x2d, 0x61, 0x8f, 0x3e,
- 0x06, 0xeb, 0xad, 0xbc, 0x96, 0xde, 0xb5, 0x3d, 0xcb, 0x15, 0x85, 0xbd,
- 0xae, 0xef, 0x20, 0x3d, 0xa1, 0xf1, 0x88, 0x3d, 0xe9, 0x22, 0xe2, 0x3d,
- 0x96, 0x74, 0x4d, 0xbe, 0xf0, 0x9b, 0x1d, 0xbb, 0x8f, 0x11, 0x57, 0xbe,
- 0x02, 0x9c, 0x02, 0xbe, 0x9d, 0xa0, 0x74, 0xbd, 0xca, 0xcc, 0x1d, 0xbd,
- 0x41, 0xc9, 0x2b, 0xbe, 0x50, 0xd2, 0x54, 0x3e, 0x77, 0x45, 0x1f, 0x3e,
- 0x3b, 0xf1, 0x1a, 0x3d, 0xff, 0x6f, 0xfd, 0x3d, 0xf7, 0x3f, 0x5a, 0xbd,
- 0x6d, 0x1f, 0x3c, 0xbd, 0x74, 0xde, 0x82, 0x3e, 0x10, 0x86, 0x06, 0xbe,
- 0x6d, 0x89, 0x7e, 0xbe, 0x6f, 0x04, 0x2e, 0x3c, 0x31, 0x4a, 0xca, 0x3e,
- 0x9d, 0xa6, 0x83, 0xbd, 0xf8, 0x8c, 0x25, 0x3f, 0xa1, 0x26, 0x58, 0xbf,
- 0x6f, 0xf1, 0x30, 0x3e, 0xb7, 0x45, 0x45, 0x3e, 0xf7, 0xe2, 0x97, 0x3d,
- 0x8c, 0x98, 0xd0, 0x3c, 0x0f, 0x2f, 0x0b, 0xbf, 0x27, 0x90, 0xb6, 0xbf,
- 0xcf, 0x28, 0x7c, 0x3e, 0xe4, 0x99, 0x88, 0xbd, 0xc3, 0xf1, 0x23, 0xbe,
- 0x52, 0x95, 0x69, 0x3e, 0x60, 0x9b, 0xf0, 0xbd, 0x6f, 0xae, 0x0f, 0x3c,
- 0xf0, 0x52, 0xd8, 0xbd, 0xb7, 0x21, 0x1d, 0x3e, 0x11, 0x78, 0x07, 0x3f,
- 0xd8, 0x7a, 0x7e, 0x3b, 0x6e, 0x4b, 0x71, 0x3d, 0x02, 0x06, 0x9a, 0x3d,
- 0xf0, 0xb3, 0x6f, 0x3d, 0xfd, 0x5a, 0x4f, 0xbd, 0x7b, 0x80, 0x5b, 0xbd,
- 0xa1, 0x79, 0x92, 0xbc, 0x0b, 0xb9, 0x8e, 0x3e, 0x47, 0xfa, 0x66, 0x3c,
- 0xac, 0x57, 0x16, 0x3c, 0x9c, 0xe9, 0xa1, 0xbe, 0xff, 0x20, 0xd6, 0xbd,
- 0xff, 0x5a, 0x0e, 0x3e, 0x2f, 0x39, 0xe0, 0x3d, 0x8c, 0x77, 0xf9, 0x3d,
- 0xa1, 0x44, 0xef, 0xbe, 0x44, 0x58, 0x80, 0xbe, 0xef, 0xd8, 0x18, 0xbe,
- 0x82, 0x2f, 0x4b, 0x3e, 0x4e, 0x98, 0x22, 0x3e, 0x74, 0xe2, 0x80, 0xbe,
- 0x8b, 0xba, 0x2a, 0xbf, 0x06, 0xde, 0x04, 0xbe, 0x41, 0x99, 0xac, 0x3d,
- 0xa3, 0x72, 0x39, 0x3f, 0x30, 0xbe, 0xc3, 0xbe, 0x29, 0x66, 0x14, 0x3e,
- 0xfe, 0x4e, 0xd7, 0xbe, 0xdc, 0x3f, 0xa9, 0xbe, 0xaa, 0xc8, 0x54, 0xbe,
- 0xdc, 0xda, 0x2a, 0x3e, 0x6e, 0x62, 0x72, 0xbe, 0x0a, 0x7d, 0x0a, 0x3e,
- 0x01, 0x69, 0xaa, 0x3e, 0x90, 0x30, 0x7f, 0xbd, 0x92, 0x64, 0x0f, 0x3e,
- 0xfa, 0x67, 0x0d, 0xbd, 0xe1, 0x60, 0x19, 0xbd, 0x0c, 0xa5, 0xba, 0x3c,
- 0x30, 0x1a, 0x7d, 0x3e, 0xd3, 0x7b, 0xea, 0xbe, 0xa5, 0xfb, 0x35, 0xbe,
- 0x2d, 0xd6, 0x07, 0x3f, 0x85, 0xa1, 0xb4, 0x3c, 0xa4, 0xcf, 0xe9, 0xbe,
- 0x14, 0x41, 0xde, 0xbd, 0x50, 0xea, 0xb1, 0xbc, 0xf3, 0xc2, 0x3f, 0x3f,
- 0xf0, 0x1f, 0x9e, 0xbd, 0x93, 0xde, 0xa3, 0xbd, 0x8f, 0xbc, 0x8d, 0xbd,
- 0x00, 0xf5, 0x93, 0x3d, 0x96, 0x38, 0x04, 0xbd, 0x4b, 0xd9, 0x5c, 0x3d,
- 0x12, 0x7b, 0xce, 0x3e, 0xd5, 0x99, 0xa5, 0x3d, 0x25, 0x79, 0x0f, 0x3e,
- 0xed, 0x24, 0x36, 0xbe, 0xac, 0x2f, 0xcc, 0x3d, 0x91, 0x43, 0x43, 0x3f,
- 0xca, 0x18, 0x0a, 0x3e, 0xf1, 0x2e, 0x9a, 0x3d, 0xd6, 0x20, 0x07, 0xbd,
- 0xb8, 0xac, 0xfc, 0x3d, 0x72, 0xe4, 0xaf, 0xbe, 0xc0, 0x13, 0xd6, 0x3d,
- 0x72, 0xe1, 0x61, 0xbf, 0xe8, 0xb4, 0x8e, 0xbe, 0xaf, 0xb6, 0x1b, 0x3e,
- 0x61, 0xd7, 0x49, 0x3d, 0x15, 0xd7, 0x52, 0xbe, 0x11, 0x1c, 0x1c, 0x3e,
- 0xea, 0x0c, 0x21, 0xbe, 0x24, 0x77, 0xec, 0xbc, 0xcc, 0x8e, 0xc3, 0x3e,
- 0xb4, 0xe4, 0x63, 0x3d, 0xbf, 0x46, 0x21, 0x3d, 0xb7, 0x60, 0xeb, 0xbd,
- 0xde, 0xfd, 0x0c, 0x3b, 0xa3, 0xa7, 0x1f, 0x3e, 0x84, 0x1b, 0xbd, 0xbe,
- 0xce, 0x89, 0x5b, 0x3d, 0x7f, 0x1e, 0x01, 0x3e, 0x68, 0xe2, 0x0b, 0xbd,
- 0xd2, 0x05, 0xb3, 0xbc, 0x76, 0x11, 0xab, 0x3d, 0x1e, 0xa3, 0x22, 0x3d,
- 0xc0, 0x49, 0x2d, 0xbe, 0x00, 0xbe, 0x29, 0x3d, 0xfc, 0x89, 0xc1, 0xbd,
- 0xee, 0xa1, 0xbf, 0x3d, 0x82, 0x53, 0x5d, 0x3c, 0xc5, 0x29, 0x83, 0x3d,
- 0xaf, 0x90, 0x05, 0x3e, 0x96, 0x56, 0xab, 0x3b, 0x2f, 0x59, 0x49, 0xbe,
- 0xfa, 0x24, 0x98, 0x3d, 0x5f, 0x03, 0x69, 0xbe, 0x9a, 0xf7, 0x8b, 0x3d,
- 0x72, 0x2b, 0x0f, 0x3e, 0xda, 0xb1, 0x94, 0x3d, 0x21, 0x7a, 0x21, 0x3b,
- 0x57, 0x79, 0xc5, 0x3d, 0x7c, 0x08, 0x87, 0x3e, 0x12, 0x1d, 0xb6, 0xbd,
- 0x01, 0xdc, 0x1e, 0xbe, 0xab, 0x0c, 0x9f, 0x3d, 0xe5, 0x0f, 0x89, 0x3d,
- 0xf2, 0x71, 0x96, 0x3d, 0xdc, 0x1b, 0xdf, 0xbe, 0x75, 0x95, 0x3a, 0xbe,
- 0x81, 0x4b, 0x96, 0xbc, 0xb4, 0xa0, 0xc4, 0x3d, 0xfb, 0x48, 0x33, 0x3e,
- 0xf6, 0x22, 0x2f, 0xbe, 0xf8, 0x66, 0xdb, 0xbd, 0x55, 0x7a, 0xa3, 0x3d,
- 0xbc, 0xc1, 0x3c, 0xbd, 0x0f, 0xbc, 0x3c, 0xbd, 0x46, 0x3f, 0xe3, 0xbd,
- 0x8f, 0x51, 0x97, 0x3d, 0x69, 0x46, 0x45, 0x3d, 0x5f, 0x65, 0x0c, 0xbe,
- 0xa4, 0xba, 0x1e, 0xbe, 0xf7, 0x51, 0xc9, 0x3e, 0x2b, 0x00, 0x11, 0x3e,
- 0x29, 0xdb, 0xdf, 0xbb, 0xb9, 0xdf, 0x1f, 0x3e, 0xda, 0x4a, 0x47, 0xbd,
- 0xd6, 0xec, 0xa4, 0x3c, 0xe4, 0xcc, 0xd7, 0xbd, 0xba, 0x0a, 0x95, 0xbe,
- 0xc2, 0xe4, 0xdf, 0xbd, 0xd7, 0xf9, 0x35, 0xbc, 0x46, 0xa5, 0x33, 0xbd,
- 0xab, 0x80, 0x8a, 0xbd, 0x9c, 0xc1, 0x3b, 0xbd, 0x67, 0x1b, 0x14, 0x3d,
- 0xb9, 0x6a, 0x0a, 0xbd, 0xf9, 0xe8, 0xd3, 0xbd, 0x9b, 0x57, 0x94, 0x3d,
- 0x81, 0xb7, 0x8c, 0xbd, 0x8a, 0x98, 0xdb, 0x3a, 0x27, 0x8b, 0x13, 0xbe,
- 0x16, 0xb8, 0xcd, 0xbd, 0x1b, 0x60, 0x3a, 0x3b, 0x0c, 0x22, 0x39, 0x3d,
- 0x1a, 0x02, 0x5b, 0xbb, 0x44, 0x7b, 0x05, 0xbe, 0x10, 0xb2, 0x78, 0xbd,
- 0xc3, 0x24, 0x7b, 0xbd, 0x1e, 0xb9, 0xfa, 0xbd, 0x77, 0xef, 0x83, 0xbd,
- 0xf9, 0x94, 0xce, 0xbd, 0x01, 0x95, 0xb6, 0x3d, 0x7d, 0x19, 0x3a, 0xbe,
- 0x36, 0x2e, 0xbd, 0x3c, 0x08, 0xfe, 0xbf, 0x3d, 0xce, 0x81, 0x8d, 0x3e,
- 0x4d, 0x8e, 0xae, 0xbc, 0x5b, 0x58, 0x59, 0x3d, 0x6d, 0x92, 0x95, 0x3d,
- 0xbd, 0x5f, 0x67, 0x3e, 0x92, 0xc7, 0xe5, 0x3d, 0xdc, 0x4d, 0x8f, 0xbd,
- 0x60, 0x55, 0xd0, 0xbd, 0x3c, 0x78, 0x93, 0x3d, 0x42, 0xac, 0x9c, 0x3d,
- 0x0f, 0xe8, 0xd9, 0x3c, 0x7a, 0xe5, 0x08, 0xbe, 0xea, 0x96, 0x38, 0xbd,
- 0x7d, 0x19, 0xbc, 0x3d, 0x22, 0xc1, 0x3a, 0xbe, 0x37, 0xe8, 0x86, 0xbe,
- 0x9b, 0x05, 0xef, 0xbd, 0x83, 0xe4, 0x03, 0xbe, 0x84, 0xec, 0x01, 0x3b,
- 0xc5, 0x4d, 0x3d, 0x3e, 0xcc, 0xb5, 0x49, 0x3e, 0xad, 0xe0, 0x08, 0xbe,
- 0x73, 0x6a, 0xdc, 0x3e, 0x1c, 0xc8, 0x14, 0x3e, 0xee, 0x0c, 0x05, 0xbf,
- 0x8a, 0x49, 0x10, 0x3f, 0x6a, 0x71, 0x21, 0x3f, 0xa8, 0x70, 0x8a, 0x3e,
- 0x89, 0x2f, 0xd3, 0x3d, 0x4a, 0xe8, 0xd3, 0x3e, 0x10, 0x76, 0x95, 0x3c,
- 0xe7, 0xd0, 0xad, 0xbd, 0x82, 0x02, 0x0f, 0x3f, 0x46, 0xad, 0x23, 0xbe,
- 0xea, 0x32, 0x2a, 0xbe, 0xb0, 0x52, 0x59, 0xbe, 0xef, 0x43, 0x09, 0x3d,
- 0x1e, 0x90, 0xba, 0xbe, 0x26, 0xec, 0x17, 0xbf, 0x18, 0x08, 0x3a, 0xbe,
- 0x22, 0xb0, 0x9b, 0xbd, 0x80, 0xd5, 0x4b, 0xbe, 0x80, 0xda, 0x23, 0xbd,
- 0x7c, 0xf1, 0x99, 0x3d, 0x2b, 0x89, 0xca, 0xbe, 0x56, 0x58, 0xed, 0xbd,
- 0xc7, 0x47, 0x00, 0x3e, 0x73, 0x1f, 0xca, 0x3e, 0xc9, 0x4d, 0xf3, 0xbe,
- 0x61, 0xbc, 0x42, 0x3c, 0xdd, 0xe0, 0x65, 0xbe, 0x9c, 0x8e, 0x2f, 0xbe,
- 0x95, 0xdd, 0x30, 0x3e, 0xb5, 0x9e, 0xcb, 0x3b, 0x7e, 0xc2, 0xbf, 0xbd,
- 0xb9, 0x60, 0x6f, 0xbd, 0xca, 0x4d, 0x58, 0xbe, 0x4d, 0x66, 0xa6, 0x3e,
- 0xd2, 0x4b, 0x08, 0xbe, 0x27, 0xa1, 0x6a, 0x3c, 0x80, 0xcb, 0x06, 0x3e,
- 0x3c, 0xdb, 0xaa, 0xbe, 0x4c, 0x51, 0xbe, 0x3e, 0xc8, 0x8a, 0x4a, 0xbe,
- 0x1b, 0x45, 0xe6, 0xbd, 0xef, 0x3e, 0x8e, 0x3e, 0x6e, 0x15, 0x8b, 0xbe,
- 0x9e, 0x3e, 0xbf, 0xbc, 0xe4, 0x87, 0x9f, 0x3e, 0xf3, 0x78, 0xe4, 0x3c,
- 0x78, 0xfa, 0xd4, 0xbd, 0x3e, 0x70, 0xe3, 0xbd, 0x1b, 0xd1, 0x5f, 0xbf,
- 0x3f, 0x31, 0x2a, 0x3f, 0x03, 0xd4, 0xa6, 0x3d, 0x4a, 0x4f, 0x65, 0xbe,
- 0xd7, 0x23, 0x00, 0x3e, 0x76, 0xb6, 0x4d, 0xbe, 0x78, 0x88, 0xf3, 0xbd,
- 0x6e, 0xc6, 0x34, 0x3f, 0x9e, 0xd7, 0xcb, 0xbd, 0x96, 0xe4, 0xc4, 0x3d,
- 0xd9, 0xa4, 0xc2, 0x3c, 0xba, 0x1b, 0x7e, 0xbe, 0xc6, 0x76, 0xf9, 0xbc,
- 0x58, 0x30, 0x88, 0xbd, 0x40, 0x48, 0xe1, 0xbd, 0xcb, 0x72, 0x90, 0xbc,
- 0x0d, 0x2d, 0x94, 0xbe, 0xee, 0xaa, 0x2b, 0xbe, 0xf8, 0x73, 0x9a, 0xbd,
- 0xcb, 0x3a, 0xd0, 0xbc, 0xa8, 0x79, 0x40, 0x3e, 0x3a, 0xe9, 0x71, 0x3e,
- 0x39, 0x87, 0x20, 0xbe, 0xdd, 0xeb, 0xe2, 0x3c, 0xa5, 0x63, 0x04, 0xbe,
- 0xcb, 0x62, 0x76, 0xbd, 0xc8, 0x4c, 0xca, 0x3e, 0xb4, 0x9e, 0x4a, 0xbe,
- 0x57, 0xb3, 0x6e, 0xbd, 0x36, 0x35, 0xfa, 0x3d, 0xcb, 0xc7, 0x80, 0x3d,
- 0x4e, 0xd4, 0xb7, 0x3d, 0x5e, 0x10, 0x4a, 0x3c, 0x70, 0x88, 0x30, 0x3e,
- 0x1d, 0x0b, 0x10, 0xbe, 0x8d, 0xe0, 0x1d, 0xbe, 0x81, 0xfc, 0x77, 0xbd,
- 0x0c, 0xa4, 0x9a, 0x3d, 0x63, 0x1b, 0x77, 0xbd, 0xb6, 0x90, 0xa1, 0x3d,
- 0x6a, 0x91, 0xf6, 0xbe, 0x7d, 0x96, 0xeb, 0x3c, 0xbe, 0xc0, 0xe6, 0xbd,
- 0xce, 0xb9, 0x6f, 0x3c, 0x0a, 0x7e, 0x3b, 0xbe, 0x99, 0x5e, 0x90, 0x3e,
- 0x06, 0x1b, 0xe5, 0xbb, 0xbf, 0xbe, 0x3a, 0x3d, 0xcd, 0x99, 0x93, 0xbe,
- 0x8a, 0x7b, 0xd1, 0x3d, 0xa0, 0xaa, 0x12, 0x3e, 0x71, 0x75, 0xf3, 0xbd,
- 0xe9, 0x21, 0x49, 0xbd, 0xbf, 0xd4, 0x1f, 0xbd, 0x38, 0x05, 0x51, 0xbe,
- 0x7f, 0xb8, 0x90, 0xbe, 0x02, 0x6c, 0xa4, 0xbe, 0xd9, 0xea, 0x2c, 0xbd,
- 0x54, 0x99, 0x01, 0x3e, 0x9e, 0x85, 0x15, 0xbe, 0xb8, 0x5b, 0x10, 0xbe,
- 0x26, 0xcd, 0x07, 0xbe, 0x40, 0xe3, 0x56, 0x3d, 0x42, 0x36, 0x13, 0xbd,
- 0x81, 0x84, 0x08, 0x3d, 0x05, 0x7d, 0x47, 0xbe, 0x28, 0xe8, 0x80, 0xbd,
- 0x0d, 0x18, 0x4b, 0x3e, 0x4c, 0x5f, 0x1b, 0x3e, 0xa4, 0xf8, 0x74, 0xbe,
- 0xa2, 0xcc, 0x63, 0xbd, 0x59, 0x70, 0x02, 0xbd, 0x58, 0x47, 0x4e, 0xbe,
- 0x0a, 0x18, 0x5a, 0xbc, 0x5e, 0x2b, 0xfa, 0x3c, 0x09, 0xcd, 0x80, 0x3c,
- 0xc1, 0x4d, 0x91, 0xba, 0x37, 0xdd, 0x2d, 0xbd, 0xea, 0xf3, 0x24, 0xbe,
- 0xf7, 0x9d, 0x1d, 0xbe, 0x6a, 0x7e, 0x32, 0xbd, 0x07, 0xed, 0x80, 0xbb,
- 0x94, 0x03, 0x09, 0x3d, 0xd2, 0x4d, 0xf1, 0x3d, 0xca, 0xe2, 0x3f, 0xbe,
- 0xef, 0xd8, 0x03, 0xbe, 0xf1, 0x48, 0x4d, 0xbe, 0x1f, 0x7a, 0x72, 0xbb,
- 0x9b, 0x85, 0x3f, 0xbc, 0xab, 0xc3, 0x23, 0xbe, 0xda, 0xe6, 0x62, 0xbd,
- 0x30, 0x20, 0x80, 0xbe, 0x03, 0xdd, 0x23, 0xbe, 0x40, 0xf5, 0xec, 0xbd,
- 0x45, 0xd5, 0x0f, 0x3d, 0x06, 0x68, 0x4a, 0xbc, 0xe8, 0x38, 0x85, 0x3e,
- 0xae, 0x51, 0x38, 0x3d, 0xa7, 0x9c, 0xe5, 0x3d, 0x52, 0x0a, 0x63, 0xbc,
- 0xc8, 0x14, 0xf5, 0x3d, 0x41, 0x24, 0xfb, 0xbe, 0xf4, 0xcb, 0x95, 0xbe,
- 0x44, 0x28, 0x85, 0xbd, 0x6a, 0xcc, 0xe1, 0x3d, 0x0d, 0x12, 0x59, 0xbe,
- 0x3a, 0xfe, 0x32, 0xbd, 0xa2, 0x7d, 0x73, 0xbd, 0x66, 0xfe, 0xe5, 0xbd,
- 0x89, 0x54, 0xbd, 0x3e, 0x78, 0x3f, 0x88, 0x3d, 0x79, 0xc5, 0x75, 0x3d,
- 0x91, 0x02, 0x9b, 0x3d, 0x10, 0xa5, 0x15, 0xbe, 0xf7, 0x94, 0xa2, 0xbd,
- 0x29, 0xe4, 0x13, 0xbd, 0x25, 0xa4, 0x7c, 0x3e, 0x3b, 0x9c, 0x94, 0x3d,
- 0x01, 0x9b, 0x06, 0xbe, 0xc1, 0x07, 0x10, 0xbe, 0x45, 0x67, 0x00, 0xbe,
- 0x4a, 0xf4, 0x8e, 0xbd, 0xbb, 0x63, 0xc5, 0x3d, 0x59, 0x2e, 0x17, 0x3e,
- 0x0a, 0xed, 0xa2, 0x3d, 0xd5, 0x2d, 0x93, 0xbd, 0x9d, 0x2c, 0xd5, 0xbc,
- 0x9c, 0x26, 0x17, 0xbe, 0xe0, 0x1f, 0x7a, 0xbd, 0xb3, 0x0f, 0x42, 0xbe,
- 0xea, 0xa9, 0x2f, 0xbe, 0xc8, 0x77, 0xa0, 0xbd, 0xd6, 0x67, 0xad, 0xbe,
- 0xa3, 0x05, 0x71, 0xbd, 0x3a, 0x96, 0x91, 0xbb, 0x5a, 0x37, 0x96, 0x3e,
- 0x8b, 0x88, 0xcf, 0xbb, 0x3a, 0x21, 0x1f, 0xbe, 0x5e, 0xfe, 0x76, 0xbe,
- 0xa8, 0xd3, 0x86, 0x3d, 0x12, 0x74, 0x5e, 0xbe, 0x2d, 0xea, 0x16, 0x3e,
- 0x53, 0x6d, 0x86, 0x3e, 0xbb, 0x7f, 0xa3, 0xbd, 0xc7, 0x7f, 0x13, 0xbc,
- 0x61, 0xe3, 0x05, 0xbe, 0xd0, 0x5e, 0x26, 0x3d, 0x32, 0xac, 0x0b, 0x3e,
- 0x5b, 0x53, 0xdd, 0xbd, 0xc6, 0x1f, 0x2d, 0x3e, 0xcb, 0xe4, 0xf9, 0xbd,
- 0x29, 0xbc, 0xf4, 0x3d, 0x1f, 0x22, 0x2e, 0x3e, 0x35, 0xf2, 0x2e, 0xbe,
- 0xef, 0xb2, 0x09, 0xbe, 0xf2, 0x14, 0xc4, 0xbd, 0xfa, 0x6e, 0x0f, 0xbe,
- 0xf4, 0x3d, 0x54, 0xbe, 0xf2, 0x0b, 0x16, 0xbd, 0xbc, 0xd7, 0x07, 0x3d,
- 0x34, 0x77, 0x8f, 0xba, 0x21, 0x3a, 0x27, 0xbe, 0xd7, 0x1c, 0x61, 0xbe,
- 0xcb, 0xc4, 0xa6, 0xbd, 0x99, 0xcc, 0x15, 0xbd, 0x9c, 0xd5, 0xe6, 0xbd,
- 0x44, 0xc4, 0x34, 0x3d, 0x4f, 0x3a, 0x02, 0x3c, 0xab, 0x2e, 0x09, 0xbe,
- 0x6b, 0x75, 0x05, 0x3e, 0xf3, 0x69, 0x9f, 0x3d, 0xeb, 0x22, 0xa0, 0xbd,
- 0x5d, 0xf2, 0x4b, 0xbe, 0x9d, 0x37, 0x41, 0xbd, 0xc7, 0xf6, 0x9c, 0x3c,
- 0x66, 0x3a, 0x31, 0x3d, 0x47, 0x05, 0x53, 0xbd, 0x5c, 0xbf, 0x33, 0x3e,
- 0x6a, 0x98, 0xd3, 0x3d, 0xb9, 0xa0, 0xdc, 0x3c, 0x8d, 0x48, 0xa5, 0xbe,
- 0x27, 0x6a, 0x0d, 0xbd, 0x24, 0x06, 0x25, 0xbe, 0x6a, 0xac, 0xcf, 0x3d,
- 0xa3, 0xc8, 0x30, 0xbc, 0x7f, 0x13, 0x48, 0x3e, 0x16, 0x32, 0x1b, 0xbe,
- 0x1e, 0x50, 0x3e, 0xbc, 0x34, 0x51, 0xac, 0xbe, 0x35, 0xf4, 0x6b, 0x3d,
- 0xc6, 0x8b, 0x8e, 0x3d, 0xc7, 0x43, 0x24, 0xbe, 0x9a, 0x40, 0xc4, 0xbd,
- 0x04, 0xd4, 0x06, 0xbc, 0x3e, 0xcf, 0x05, 0x3d, 0x16, 0x93, 0x37, 0xbe,
- 0xf1, 0x85, 0x1c, 0x3e, 0xb2, 0xd6, 0x5b, 0x3e, 0x72, 0x7d, 0x45, 0x3d,
- 0xe4, 0x13, 0x87, 0x3d, 0xed, 0xf8, 0x3b, 0xbe, 0x9f, 0xd1, 0x48, 0xbe,
- 0xf2, 0xc5, 0xc6, 0x3d, 0x07, 0x9e, 0xc3, 0xbe, 0x58, 0x01, 0xf3, 0x3c,
- 0xba, 0x33, 0xab, 0xbd, 0xd0, 0x2c, 0x16, 0x3e, 0x07, 0xcd, 0x6f, 0xbe,
- 0x36, 0x7d, 0x8a, 0xbd, 0x7c, 0xa4, 0x83, 0xbd, 0xbf, 0xd1, 0x57, 0xbb,
- 0x38, 0x3f, 0x5b, 0xbd, 0x7c, 0x1d, 0xf0, 0x3d, 0xaf, 0x37, 0x27, 0x3d,
- 0xff, 0xf3, 0x15, 0x3e, 0x0e, 0x6c, 0x2d, 0x3c, 0x62, 0x18, 0xf3, 0x3c,
- 0x83, 0x1f, 0x20, 0xbe, 0x2f, 0x12, 0xf2, 0x3d, 0x91, 0xa1, 0x0c, 0xbe,
- 0x14, 0xd4, 0xef, 0x3d, 0xe6, 0x35, 0xd0, 0x3d, 0x44, 0x0f, 0xb8, 0xbd,
- 0x28, 0xed, 0x23, 0xbd, 0x2d, 0x94, 0x4a, 0x3d, 0xd1, 0x29, 0x89, 0x3d,
- 0x5e, 0x55, 0xc5, 0xbd, 0x57, 0x4e, 0x26, 0xbd, 0x91, 0x7c, 0x16, 0xbe,
- 0xad, 0x7c, 0xfb, 0x3d, 0x1a, 0x85, 0xb4, 0xbc, 0x9e, 0xc5, 0xaa, 0xbb,
- 0x07, 0x8c, 0x0e, 0xbe, 0xe4, 0xa7, 0x51, 0x3d, 0x69, 0x73, 0x13, 0xbe,
- 0x72, 0x2b, 0x7f, 0xbd, 0xfb, 0x98, 0x6e, 0x3d, 0x03, 0xcd, 0xbc, 0x3e,
- 0xc7, 0x10, 0xcd, 0x3d, 0xac, 0x51, 0xde, 0xbd, 0x85, 0x00, 0xab, 0xbd,
- 0x5a, 0xa7, 0x83, 0xbc, 0x5b, 0x42, 0xc3, 0xbd, 0x3f, 0x45, 0x89, 0x3e,
- 0xb7, 0xd1, 0x8b, 0xbe, 0x54, 0xd5, 0x75, 0x3d, 0xbd, 0xc8, 0x27, 0xbe,
- 0x33, 0x16, 0x1a, 0xbd, 0x1f, 0x05, 0x74, 0x3d, 0x91, 0xf0, 0x0b, 0x3e,
- 0xe0, 0x1f, 0x46, 0xbe, 0x93, 0x2f, 0x83, 0x3e, 0xe0, 0xf3, 0x9d, 0x3d,
- 0x91, 0x6d, 0xb6, 0x3e, 0xe6, 0x0b, 0x0d, 0xbe, 0x32, 0xcf, 0x60, 0x3d,
- 0xc2, 0x37, 0x14, 0xbf, 0xba, 0x4a, 0x50, 0x3e, 0x9e, 0xeb, 0x5f, 0xbe,
- 0x40, 0x7b, 0x94, 0xbe, 0x48, 0x41, 0xe4, 0xbe, 0xd8, 0x22, 0x80, 0x3e,
- 0x01, 0x6d, 0xaf, 0xbe, 0x8d, 0x1c, 0xf6, 0x3e, 0x3a, 0x04, 0x05, 0xbf,
- 0x36, 0x8c, 0xf4, 0xbc, 0xf6, 0x6d, 0xee, 0x3b, 0xd7, 0xf6, 0x00, 0x3e,
- 0x8b, 0xe9, 0x19, 0xbe, 0x7c, 0x5c, 0x8a, 0xbd, 0xfd, 0x25, 0x2b, 0xbf,
- 0x79, 0x5b, 0x12, 0xbe, 0x59, 0x48, 0x82, 0x3d, 0x81, 0x65, 0x34, 0x3d,
- 0x8a, 0xe6, 0xcb, 0x3d, 0x02, 0xce, 0xd2, 0xbd, 0xf3, 0xbb, 0x9b, 0xbd,
- 0x5f, 0x5a, 0x1f, 0x3c, 0x3e, 0xbd, 0x82, 0xbd, 0x33, 0xae, 0x66, 0x3e,
- 0x71, 0x3d, 0x03, 0x3e, 0x68, 0xb7, 0xb1, 0x3d, 0x06, 0x78, 0x5e, 0xbe,
- 0x79, 0x79, 0xfc, 0xbd, 0xf6, 0x92, 0xb8, 0x3d, 0xe4, 0x31, 0x78, 0xbd,
- 0x12, 0xf8, 0x0e, 0x3d, 0xd9, 0x8a, 0x8a, 0x3e, 0x1a, 0x82, 0x1e, 0x3d,
- 0x70, 0x6b, 0xe6, 0x3c, 0x79, 0xaa, 0x2f, 0xbd, 0xe3, 0x0e, 0x7f, 0x3e,
- 0x4f, 0xc3, 0xbc, 0x3d, 0xd9, 0x34, 0xe3, 0x3d, 0x29, 0xb3, 0xe5, 0xbc,
- 0x02, 0x71, 0x91, 0xbd, 0x90, 0x23, 0xaa, 0x3e, 0x3a, 0x6f, 0x89, 0x3d,
- 0xd9, 0x8c, 0x16, 0x3e, 0x97, 0x41, 0x27, 0x3f, 0x29, 0x3c, 0xbb, 0xbe,
- 0xf1, 0x7f, 0x36, 0xbf, 0x04, 0xcc, 0x1e, 0x3e, 0xfd, 0x74, 0x04, 0xbe,
- 0x1f, 0x67, 0xc8, 0x3e, 0x8b, 0xf5, 0xbd, 0x3d, 0xa3, 0x87, 0x0d, 0xbe,
- 0xa9, 0xf3, 0x09, 0xbe, 0x2e, 0x58, 0x50, 0xbe, 0xe7, 0x63, 0xde, 0xbd,
- 0x31, 0x9a, 0xc2, 0x3e, 0x48, 0x29, 0xf0, 0x3d, 0x28, 0xe8, 0xa5, 0xbc,
- 0xce, 0xbb, 0xd6, 0xbc, 0x78, 0x85, 0x29, 0x3d, 0xd4, 0xd8, 0xd2, 0x3e,
- 0xb3, 0x3c, 0x19, 0xbe, 0xdc, 0x0b, 0x1f, 0xbe, 0x79, 0x2c, 0x4c, 0xbe,
- 0x72, 0x10, 0xed, 0x3e, 0x9b, 0x40, 0x04, 0xbe, 0xb5, 0xb1, 0x69, 0x3d,
- 0x0e, 0x5c, 0x85, 0xbe, 0x20, 0xed, 0x2e, 0x3e, 0x96, 0x83, 0x99, 0xbe,
- 0x5a, 0xde, 0x7a, 0x3a, 0xae, 0x93, 0x60, 0x3d, 0x30, 0x4d, 0xfb, 0x3e,
- 0x1e, 0x33, 0x26, 0xbd, 0xee, 0x5b, 0x05, 0x3e, 0xe4, 0x20, 0xbd, 0x3d,
- 0xbd, 0xd5, 0xd9, 0x3c, 0x9a, 0x5a, 0x6f, 0xbe, 0x90, 0xf3, 0xb1, 0x3d,
- 0x0c, 0x28, 0x26, 0xbe, 0x6f, 0x62, 0x9c, 0xbd, 0xee, 0x16, 0x1a, 0x3e,
- 0xca, 0x78, 0x72, 0xbe, 0xbe, 0x5f, 0x18, 0x3d, 0xe7, 0x5e, 0x1d, 0x3f,
- 0x72, 0x13, 0x98, 0x3e, 0x5b, 0xbc, 0x40, 0xbe, 0x89, 0x11, 0x1c, 0xbe,
- 0x52, 0x53, 0x93, 0xbd, 0x06, 0x0f, 0x07, 0xbf, 0xbc, 0xc0, 0x57, 0x3e,
- 0xd4, 0xb2, 0xfa, 0x3e, 0xdb, 0xbb, 0x74, 0xbd, 0x82, 0x8a, 0x0d, 0xbd,
- 0xe8, 0x8a, 0xfc, 0x3d, 0x55, 0x26, 0xf0, 0xbc, 0x49, 0xb5, 0xa9, 0x3e,
- 0x48, 0x85, 0xd8, 0x3d, 0x31, 0xff, 0x66, 0xbe, 0x09, 0xc8, 0xb8, 0x3d,
- 0x0b, 0x6c, 0x39, 0x3e, 0x19, 0x98, 0x1e, 0xbe, 0x22, 0x58, 0xbb, 0xbd,
- 0xa1, 0x66, 0xdf, 0x3a, 0xf5, 0xc7, 0x14, 0x3e, 0xaf, 0x94, 0x78, 0xbe,
- 0x4a, 0x00, 0x3b, 0x3e, 0x19, 0x76, 0xb8, 0xbc, 0x00, 0x97, 0xb7, 0xbd,
- 0x19, 0x39, 0x42, 0xbe, 0xc1, 0x70, 0x6c, 0x3e, 0xbe, 0xea, 0x07, 0x3e,
- 0x1f, 0x31, 0x1a, 0xbe, 0x03, 0xe8, 0x48, 0xbc, 0x2c, 0xa3, 0x6a, 0xbd,
- 0x48, 0x72, 0x0c, 0x3d, 0x54, 0x35, 0x8b, 0xbd, 0x3f, 0x6d, 0x9b, 0x3c,
- 0x0a, 0x62, 0xdc, 0x3c, 0xcd, 0xee, 0x6d, 0xbd, 0x31, 0xdc, 0xc6, 0x3d,
- 0xd8, 0x6c, 0x70, 0xbe, 0x76, 0xbe, 0x14, 0xbe, 0x19, 0xed, 0x81, 0x3d,
- 0x46, 0x88, 0x8d, 0xbd, 0xaf, 0xbe, 0x42, 0xbe, 0xd7, 0x64, 0xf1, 0xbc,
- 0x25, 0x2c, 0xba, 0x3b, 0xba, 0x0b, 0x4e, 0x3d, 0xab, 0x42, 0x5b, 0x3d,
- 0xa4, 0x00, 0x14, 0xbe, 0xb0, 0x9c, 0xe6, 0xbd, 0x34, 0xab, 0x15, 0xbe,
- 0x0c, 0x9f, 0x46, 0x3d, 0xa1, 0x42, 0xfd, 0xbd, 0x43, 0xbb, 0x33, 0xbe,
- 0xe5, 0x75, 0xbe, 0xbb, 0x07, 0xfb, 0xfc, 0x3b, 0xed, 0xb7, 0x20, 0x3e,
- 0x46, 0x66, 0x1a, 0xbe, 0xce, 0xd1, 0x80, 0xbd, 0xea, 0x74, 0xf0, 0x3c,
- 0x10, 0x20, 0x7a, 0xbd, 0x23, 0xc8, 0xa3, 0x3d, 0x94, 0xac, 0x5f, 0x3d,
- 0xed, 0xec, 0x23, 0x3e, 0xc8, 0x9a, 0xfc, 0x3d, 0xf3, 0x4f, 0x6f, 0xbe,
- 0x85, 0x5a, 0x10, 0x3e, 0x7e, 0x0f, 0x48, 0x3e, 0x85, 0x0f, 0xbf, 0x3c,
- 0x85, 0xd4, 0xee, 0x3c, 0x51, 0x6a, 0xe0, 0xbe, 0x2d, 0x30, 0xdd, 0x3c,
- 0x22, 0xc6, 0x9c, 0xbd, 0xdf, 0x70, 0x1d, 0xbe, 0x86, 0xac, 0x7a, 0xbe,
- 0x0f, 0x86, 0x2d, 0xbe, 0x6b, 0x63, 0xe5, 0x3b, 0x21, 0xf6, 0x31, 0xbd,
- 0xe9, 0xa6, 0x1a, 0xbe, 0x26, 0xfc, 0xe9, 0xbd, 0x92, 0x4a, 0x29, 0x3d,
- 0x79, 0xf4, 0x30, 0xbe, 0x16, 0xa4, 0x97, 0xbe, 0x0c, 0x73, 0x8b, 0x3d,
- 0xd2, 0x00, 0x19, 0x3e, 0xbf, 0xc2, 0x82, 0x3e, 0xaa, 0x03, 0x3b, 0xbe,
- 0x4f, 0x59, 0xc5, 0xbd, 0x38, 0x02, 0xb0, 0x3c, 0x86, 0x87, 0x42, 0xbd,
- 0x3c, 0x7a, 0xf9, 0x3c, 0x7a, 0x03, 0xf6, 0xbd, 0x76, 0x15, 0x4b, 0x3e,
- 0x99, 0x2d, 0xe3, 0x3d, 0x45, 0x88, 0xef, 0xbd, 0xf9, 0xc8, 0xbe, 0xbd,
- 0xfa, 0xcd, 0xc2, 0x3d, 0xed, 0x7c, 0xda, 0x3d, 0xad, 0xf4, 0x2e, 0xbe,
- 0x77, 0xbc, 0x82, 0x3d, 0xf5, 0x06, 0x9d, 0xbd, 0x7f, 0x20, 0x89, 0x3e,
- 0x94, 0xaf, 0x42, 0x3c, 0x01, 0x5f, 0xa7, 0xbd, 0x46, 0xc8, 0x09, 0x3e,
- 0xaa, 0x4b, 0x55, 0x3e, 0xf8, 0xae, 0xcb, 0xbd, 0x08, 0x25, 0x1f, 0x3c,
- 0x0e, 0x6e, 0xca, 0xbc, 0xc2, 0x6c, 0xc2, 0xbd, 0x94, 0x74, 0x77, 0x3e,
- 0xc3, 0x63, 0xa0, 0xbd, 0x9c, 0xd3, 0x36, 0xbd, 0x20, 0xe4, 0xc6, 0x3c,
- 0xc3, 0xc8, 0x23, 0x3d, 0x93, 0xec, 0x20, 0xbe, 0x0d, 0xd6, 0xbb, 0xbe,
- 0xfa, 0x49, 0x27, 0x3d, 0x5d, 0x9c, 0xe2, 0xbc, 0x3c, 0x0c, 0x56, 0x3d,
- 0xd4, 0x53, 0x8a, 0x3e, 0x23, 0xb8, 0x5e, 0x3e, 0xe5, 0x38, 0xf8, 0xbc,
- 0x3b, 0xab, 0x7c, 0x3e, 0x46, 0x44, 0x87, 0xbd, 0xcf, 0xb8, 0xdc, 0xbe,
- 0x5d, 0xe9, 0x55, 0x3e, 0x14, 0x43, 0xd2, 0x3e, 0x5a, 0x78, 0xae, 0x3c,
- 0xdf, 0x07, 0x58, 0xbd, 0xe2, 0xd1, 0xd1, 0x3e, 0xa8, 0xa8, 0x7b, 0x3e,
- 0xeb, 0xb7, 0xe5, 0xbd, 0x35, 0xc8, 0x07, 0x3f, 0x51, 0x42, 0x10, 0x3e,
- 0x8f, 0x4d, 0x4e, 0xbd, 0x04, 0x6a, 0x10, 0xbd, 0xc9, 0x79, 0x22, 0x3c,
- 0x01, 0x71, 0x81, 0xbd, 0x34, 0x41, 0x06, 0xbf, 0x84, 0x64, 0xe9, 0xbd,
- 0x66, 0xc4, 0x39, 0xbe, 0xca, 0xb5, 0x23, 0x3c, 0x8f, 0x7c, 0x87, 0xbd,
- 0x75, 0xb3, 0x04, 0x3c, 0x59, 0xd4, 0x06, 0xbf, 0x6a, 0xe3, 0x27, 0xbe,
- 0x86, 0x92, 0x06, 0xbb, 0xfc, 0x24, 0x2b, 0x3e, 0x42, 0x8e, 0x5a, 0xbe,
- 0x04, 0x2b, 0xdf, 0x3d, 0x7f, 0x66, 0xe6, 0xbd, 0x2f, 0x6e, 0x2c, 0xbd,
- 0xbe, 0x6b, 0x5c, 0xbd, 0xd4, 0xc6, 0x22, 0x3e, 0xb0, 0x67, 0x41, 0xbe,
- 0x50, 0xd9, 0xf9, 0x3c, 0x2b, 0xdd, 0xa1, 0xbe, 0xb1, 0x1a, 0x12, 0x3f,
- 0xb3, 0x2a, 0xfc, 0xbd, 0x8a, 0xa9, 0x40, 0xbd, 0xb7, 0xd9, 0x7b, 0xbc,
- 0x5d, 0x23, 0x46, 0xbe, 0xee, 0xea, 0x99, 0x3e, 0x5c, 0x38, 0xe5, 0xbb,
- 0xd2, 0xb5, 0x07, 0xbd, 0xc7, 0x5e, 0x34, 0x3e, 0xad, 0x87, 0x9d, 0xbe,
- 0x27, 0xfc, 0x06, 0x3e, 0x6d, 0xb1, 0x6c, 0x3e, 0xce, 0x2c, 0x7a, 0xbd,
- 0x2a, 0xa8, 0x96, 0x3d, 0xba, 0x63, 0x9f, 0xbe, 0x71, 0xb7, 0x51, 0xbf,
- 0xf2, 0x5f, 0x43, 0x3f, 0x4d, 0x70, 0xed, 0x3b, 0xd4, 0x3d, 0xe5, 0xbd,
- 0xc2, 0x26, 0xce, 0xbd, 0xa0, 0xd7, 0x95, 0xbe, 0x97, 0x41, 0x45, 0x3d,
- 0x14, 0x9b, 0x53, 0x3f, 0x00, 0xd6, 0x0e, 0xba, 0x54, 0xe4, 0xf9, 0x3d,
- 0x90, 0xe8, 0x25, 0xbe, 0x31, 0x65, 0x5d, 0xbe, 0x3c, 0xce, 0xf6, 0xbd,
- 0x95, 0x4b, 0xf2, 0xbd, 0x42, 0x86, 0x76, 0xbe, 0xa6, 0x92, 0x3a, 0x3c,
- 0x21, 0x51, 0x18, 0xbe, 0x0a, 0xaa, 0x8a, 0xbe, 0x43, 0x49, 0x3a, 0xbc,
- 0xe1, 0xe8, 0x3d, 0xbe, 0x4d, 0xaf, 0x8f, 0x3e, 0x53, 0x8c, 0x9f, 0x3e,
- 0x3a, 0x69, 0xb5, 0xbc, 0x7f, 0xfb, 0xeb, 0xbc, 0xb1, 0x47, 0x46, 0xbe,
- 0x7b, 0x72, 0x3a, 0x3c, 0xb5, 0x42, 0x40, 0x3e, 0xef, 0x66, 0x5c, 0xbd,
- 0x52, 0xbb, 0x11, 0xbe, 0x70, 0x8c, 0x90, 0xbd, 0x55, 0x58, 0xb5, 0xba,
- 0x92, 0x62, 0xa4, 0x3d, 0x45, 0xb1, 0xbc, 0xbd, 0x55, 0x04, 0x2b, 0x3e,
- 0x04, 0x49, 0x05, 0xbe, 0x5a, 0xce, 0x4e, 0xbd, 0x75, 0xe6, 0xa0, 0x3b,
- 0xa7, 0xf0, 0x81, 0xbd, 0x95, 0xa6, 0x90, 0xbd, 0x7e, 0xae, 0x3e, 0x3e,
- 0x5d, 0xee, 0x5f, 0xbd, 0x83, 0x8c, 0xa0, 0x3d, 0x3f, 0x23, 0x4b, 0xbe,
- 0x7b, 0x9d, 0x38, 0xbe, 0xbf, 0x57, 0xa3, 0x3b, 0x0c, 0x66, 0xe6, 0x3d,
- 0xe6, 0x1a, 0x62, 0xbc, 0x64, 0xfe, 0x94, 0xbd, 0x37, 0xa8, 0x85, 0xbe,
- 0x7b, 0xd5, 0x6e, 0xbc, 0xed, 0x52, 0x33, 0xbc, 0xe5, 0x74, 0x57, 0x3d,
- 0x4b, 0xcb, 0x36, 0xbe, 0x4e, 0xb4, 0x31, 0xbd, 0x05, 0xc3, 0x44, 0xbe,
- 0x00, 0xe9, 0x32, 0xbe, 0xde, 0x38, 0xd5, 0xbe, 0x77, 0x4b, 0x30, 0x3e,
- 0x04, 0x35, 0x1e, 0x3e, 0xb9, 0xb7, 0x6b, 0x3d, 0x71, 0x7a, 0x88, 0x3e,
- 0x5f, 0x8e, 0x82, 0xbe, 0x92, 0xf6, 0x38, 0xbe, 0x33, 0xb5, 0xb3, 0xbd,
- 0x31, 0x32, 0x33, 0x3e, 0xfc, 0x11, 0x65, 0xbe, 0x54, 0xf4, 0x3e, 0x3e,
- 0x8e, 0x1a, 0x3d, 0x3e, 0xd0, 0x81, 0x2e, 0x3e, 0x0e, 0x6d, 0xfb, 0xbd,
- 0x42, 0x07, 0x44, 0x3d, 0xb7, 0x13, 0x1e, 0xbd, 0x0d, 0xb7, 0x41, 0x3c,
- 0x03, 0x8c, 0xf5, 0xbd, 0x05, 0xca, 0x4f, 0x3e, 0x3a, 0x3f, 0x12, 0x3e,
- 0x61, 0x70, 0xe7, 0x3d, 0xda, 0x42, 0x4d, 0xbc, 0xf8, 0x3a, 0x64, 0x3d,
- 0xe5, 0xfc, 0xa7, 0x3d, 0x19, 0x8d, 0x3c, 0xbe, 0xe9, 0x85, 0xbb, 0xbd,
- 0x24, 0x62, 0xc6, 0xbd, 0x05, 0x4e, 0x94, 0x3e, 0xd6, 0xea, 0x52, 0xbe,
- 0x47, 0x91, 0x4e, 0xbe, 0xdd, 0x83, 0xff, 0x3c, 0x52, 0x2d, 0xef, 0xbb,
- 0x5e, 0x81, 0xc6, 0xbd, 0xee, 0x51, 0x0f, 0x3d, 0x3a, 0xb2, 0xaf, 0xbd,
- 0x16, 0xdb, 0x54, 0xbe, 0x47, 0xa6, 0xa7, 0xbe, 0xd7, 0xf4, 0x25, 0xbe,
- 0x49, 0x61, 0xf7, 0x3d, 0xf3, 0x50, 0x14, 0x3e, 0x0a, 0x8b, 0xc2, 0x3c,
- 0x3f, 0x97, 0xce, 0x3d, 0x7b, 0x85, 0xa8, 0x3d, 0x79, 0x46, 0x3f, 0xbd,
- 0x0c, 0x66, 0x37, 0x3e, 0xac, 0x57, 0xc3, 0xbe, 0x84, 0x6e, 0x28, 0xbe,
- 0x62, 0xb1, 0x32, 0x3d, 0x15, 0xa3, 0xae, 0x3d, 0xcb, 0x88, 0x90, 0xbd,
- 0x71, 0x4a, 0x8a, 0xbd, 0x04, 0x8e, 0xd1, 0x3d, 0x70, 0x5e, 0x81, 0x3d,
- 0xff, 0x21, 0x6a, 0x3e, 0xea, 0x9d, 0xa6, 0x3d, 0x9a, 0x3b, 0x66, 0x3e,
- 0x9a, 0xa2, 0x9f, 0x3d, 0x59, 0x95, 0xca, 0x3d, 0xd6, 0xc7, 0xe9, 0xbd,
- 0xfc, 0xec, 0x4d, 0xbd, 0x9b, 0x9a, 0x22, 0x3e, 0x65, 0xc6, 0xc7, 0x3d,
- 0x6b, 0xa6, 0xc5, 0xbe, 0x90, 0x16, 0xb7, 0x3d, 0xc3, 0xe2, 0x10, 0x3d,
- 0xc4, 0x37, 0x50, 0xbe, 0x8c, 0x74, 0x20, 0xbd, 0x64, 0x0a, 0x30, 0xbe,
- 0x46, 0xcc, 0x93, 0xbd, 0xdc, 0x59, 0xbd, 0x3d, 0x21, 0xab, 0x80, 0x3d,
- 0x6f, 0x63, 0xe5, 0xbd, 0x64, 0x8a, 0x5f, 0xbe, 0xd6, 0x0e, 0x85, 0xbe,
- 0xf4, 0xc2, 0x4b, 0xbd, 0x8b, 0x3d, 0x8a, 0x3d, 0xa6, 0x88, 0xda, 0xbd,
- 0xd3, 0xa8, 0x13, 0x3e, 0x8e, 0x64, 0xc8, 0x3d, 0x10, 0x27, 0x5e, 0x3e,
- 0x35, 0x30, 0x16, 0xbd, 0x2d, 0xab, 0x55, 0xbd, 0x71, 0x18, 0xf0, 0xbd,
- 0x38, 0x26, 0x20, 0x3d, 0x38, 0xe2, 0x93, 0xbe, 0x83, 0xb3, 0xb9, 0x3e,
- 0x0f, 0xdb, 0xae, 0xbd, 0x80, 0xd8, 0x3b, 0xbe, 0xe3, 0xc1, 0xe0, 0xbd,
- 0x86, 0x73, 0x60, 0xbd, 0x6f, 0x5a, 0x0f, 0xbe, 0xdc, 0x78, 0xbf, 0xbc,
- 0x7c, 0xa2, 0xd0, 0xbd, 0xea, 0x6d, 0x5e, 0x3e, 0x31, 0xcc, 0x1c, 0x3c,
- 0xa5, 0x52, 0x1e, 0x3e, 0x85, 0x9c, 0xad, 0x3d, 0xb9, 0x2c, 0x0c, 0x3c,
- 0x22, 0x53, 0x97, 0xbd, 0xed, 0xf8, 0x6e, 0xbd, 0x55, 0xf8, 0x1d, 0xbe,
- 0xfb, 0x62, 0x51, 0xbd, 0xb7, 0x80, 0x15, 0xbe, 0x4d, 0xeb, 0x24, 0x3e,
- 0xf9, 0xf2, 0xa6, 0xbd, 0x04, 0xc9, 0xe8, 0xbc, 0x3d, 0x44, 0x20, 0x3e,
- 0xf0, 0x29, 0xdc, 0xbd, 0x65, 0x68, 0x34, 0xbd, 0x85, 0xcb, 0x6f, 0x3c,
- 0xd4, 0x6f, 0xe4, 0x3c, 0x80, 0xde, 0x5d, 0xbe, 0x76, 0x31, 0xef, 0x3b,
- 0x05, 0x3b, 0x10, 0x3c, 0xb7, 0x27, 0x41, 0xbe, 0x45, 0x0d, 0x62, 0xbe,
- 0x90, 0x7b, 0xce, 0x3d, 0x40, 0xb7, 0x04, 0x3d, 0x73, 0xa9, 0x78, 0xbe,
- 0x1a, 0x03, 0x23, 0x3e, 0xee, 0x59, 0x02, 0x3e, 0xb9, 0xa3, 0xd2, 0x3e,
- 0xc9, 0xac, 0x7f, 0x3b, 0xb7, 0x77, 0x8a, 0x3d, 0x13, 0xcd, 0x9f, 0xbe,
- 0x93, 0x23, 0x06, 0xbe, 0x3a, 0x9f, 0xda, 0xbc, 0x67, 0x10, 0x29, 0xbd,
- 0x51, 0x23, 0x15, 0xbe, 0x66, 0x04, 0x8a, 0x3e, 0x75, 0x2d, 0x97, 0xbd,
- 0xf3, 0x32, 0x0f, 0xbe, 0x03, 0xb6, 0x1f, 0xbe, 0x27, 0x87, 0xb7, 0x3d,
- 0xab, 0x87, 0x9f, 0xbd, 0xec, 0x7e, 0x72, 0xbc, 0x2a, 0xd3, 0x09, 0x3b,
- 0xb1, 0x81, 0xf9, 0x3d, 0x13, 0xf5, 0x53, 0xbd, 0xec, 0xd8, 0x3f, 0xbd,
- 0xcc, 0x2e, 0x14, 0x3e, 0x5f, 0xb8, 0xb4, 0x3e, 0x07, 0x29, 0xa6, 0xbd,
- 0x08, 0xea, 0xc7, 0x3c, 0x5c, 0xb6, 0x49, 0xbe, 0xbb, 0xdf, 0x55, 0xbe,
- 0xc9, 0xb8, 0x01, 0x3c, 0x10, 0x46, 0xba, 0xbe, 0x4f, 0x66, 0x47, 0x3e,
- 0x94, 0x69, 0x37, 0xbd, 0x57, 0x1a, 0xc8, 0xbd, 0x06, 0x8a, 0x64, 0x3c,
- 0xb7, 0xcf, 0xd1, 0xbd, 0x87, 0xe6, 0x07, 0xbe, 0x2d, 0x41, 0xe4, 0x3c,
- 0xf7, 0x33, 0x9e, 0x3d, 0xec, 0x17, 0x8b, 0xbd, 0xb2, 0x08, 0xdd, 0x3d,
- 0x20, 0x70, 0xe3, 0xbd, 0x1b, 0xec, 0x16, 0xbe, 0x76, 0x72, 0x24, 0xbe,
- 0xbc, 0x18, 0x15, 0x3e, 0x2c, 0x81, 0xf4, 0x3d, 0x69, 0x27, 0x2d, 0xbd,
- 0xcb, 0xaa, 0x83, 0xbc, 0xc9, 0xbf, 0x8b, 0x3d, 0x59, 0xed, 0x38, 0xbd,
- 0x3c, 0xea, 0xb5, 0xbd, 0xcd, 0x25, 0xba, 0xbd, 0x87, 0x02, 0x26, 0xbc,
- 0x5f, 0x24, 0x7b, 0xbd, 0xc5, 0xc6, 0x1a, 0x3d, 0xb9, 0x24, 0x99, 0xbc,
- 0x9a, 0xe4, 0x05, 0xbe, 0x40, 0x91, 0x7c, 0xbe, 0xbf, 0x05, 0x01, 0xbe,
- 0x16, 0x8a, 0x03, 0xbe, 0x99, 0xaf, 0x3e, 0xbd, 0x7f, 0x45, 0x99, 0xbe,
- 0x54, 0x1d, 0x18, 0xbd, 0xde, 0x7f, 0xba, 0xbc, 0x12, 0xfd, 0x4e, 0x3e,
- 0xd7, 0x7a, 0xc9, 0xbb, 0xa7, 0xee, 0x66, 0xbe, 0x40, 0x95, 0xad, 0xbe,
- 0x02, 0x00, 0x2e, 0xbe, 0xd0, 0xbd, 0xe7, 0x3c, 0x7f, 0xa8, 0xa4, 0x3d,
- 0x4e, 0xdb, 0x8e, 0xbe, 0x6f, 0x0e, 0xd4, 0x3d, 0x2a, 0xf9, 0x0e, 0xbe,
- 0x83, 0x0d, 0x19, 0x3c, 0xa7, 0xda, 0xe8, 0x3a, 0x5a, 0x00, 0x7e, 0xbd,
- 0x23, 0x51, 0xbc, 0xbd, 0xff, 0xc5, 0x0f, 0x3e, 0x71, 0x4e, 0xd3, 0xbd,
- 0xcb, 0x8d, 0xe9, 0x3e, 0x52, 0x2c, 0x82, 0xbe, 0xbf, 0x39, 0x0d, 0x3c,
- 0xc7, 0x4c, 0x56, 0xbd, 0xf7, 0xfe, 0x6c, 0x3e, 0x66, 0xa0, 0xcf, 0x3e,
- 0x0c, 0xe1, 0x2a, 0x3f, 0x36, 0x81, 0xe6, 0x3e, 0x45, 0xf2, 0xa2, 0x3d,
- 0x11, 0xf1, 0x3a, 0x3f, 0x25, 0xff, 0x10, 0x3f, 0x56, 0x1c, 0xeb, 0xbe,
- 0x03, 0x53, 0xbb, 0x3d, 0x54, 0x83, 0xcf, 0x3e, 0x9c, 0xc0, 0xf6, 0xbd,
- 0x8a, 0x8d, 0x28, 0xbf, 0x63, 0xa6, 0xc2, 0xbe, 0x5a, 0xcc, 0x3d, 0xbf,
- 0xba, 0x5a, 0x0c, 0xbe, 0xf4, 0x03, 0x9e, 0xbe, 0x79, 0x51, 0x2b, 0x3e,
- 0x5e, 0xb4, 0x90, 0xbc, 0x4b, 0x6d, 0xdf, 0xbd, 0xc6, 0x5d, 0x8a, 0x3d,
- 0x21, 0x52, 0x05, 0xbd, 0x18, 0xdc, 0xc1, 0xbe, 0x7f, 0x02, 0x0b, 0xbf,
- 0x96, 0xd2, 0x9c, 0x3d, 0xc8, 0x88, 0x1f, 0xbe, 0x4e, 0xd2, 0xb6, 0x3e,
- 0xf9, 0xa8, 0x90, 0x3d, 0x0e, 0x7f, 0x68, 0x3d, 0x80, 0xe4, 0x10, 0x3e,
- 0x23, 0x42, 0x3a, 0x3e, 0x51, 0x02, 0x55, 0xbd, 0x64, 0x99, 0x13, 0x3c,
- 0xb1, 0xbf, 0xef, 0x3d, 0xaf, 0x1d, 0xd1, 0xbe, 0xe1, 0x7b, 0xe1, 0xbd,
- 0x73, 0xa1, 0x5b, 0x3d, 0x18, 0x52, 0xc6, 0x3d, 0x94, 0x34, 0xa6, 0x3d,
- 0xd4, 0xa9, 0x26, 0x3e, 0x68, 0x08, 0xc7, 0x3e, 0x19, 0x3f, 0x81, 0xbd,
- 0x9f, 0x20, 0x5b, 0xbe, 0x95, 0x7b, 0x16, 0x3f, 0x62, 0xe3, 0xdb, 0xbe,
- 0x4f, 0x5f, 0x01, 0xbe, 0x67, 0x7c, 0x9f, 0x39, 0x8e, 0xd2, 0xa6, 0xbd,
- 0x88, 0xa8, 0xdc, 0xbd, 0x71, 0xa2, 0xb2, 0xbd, 0xab, 0x62, 0x36, 0xbf,
- 0xcc, 0x10, 0x2b, 0x3f, 0xe9, 0xff, 0xcf, 0xbe, 0x33, 0xca, 0xac, 0x3d,
- 0xd2, 0xd8, 0x78, 0x3e, 0x5e, 0x2c, 0x33, 0xbe, 0x21, 0xd3, 0xde, 0x3d,
- 0x4f, 0x37, 0xc2, 0x3e, 0x14, 0x4c, 0x9a, 0x3d, 0xfe, 0x9b, 0xa2, 0xbe,
- 0x3c, 0x4b, 0xf2, 0xbd, 0x68, 0xcc, 0xd5, 0xbc, 0xee, 0x01, 0xbb, 0x3e,
- 0xa3, 0x53, 0xb5, 0x3d, 0x73, 0xad, 0x33, 0x3e, 0xef, 0x25, 0x77, 0xbc,
- 0x78, 0xae, 0x0f, 0xbf, 0x68, 0x84, 0xfd, 0x3d, 0x7c, 0x07, 0x8d, 0x3c,
- 0x86, 0x01, 0x3b, 0xbb, 0x7d, 0x3b, 0x78, 0x3e, 0x30, 0x19, 0x15, 0xbe,
- 0x69, 0x45, 0x8b, 0xbd, 0xd6, 0xdf, 0x81, 0x3d, 0x1a, 0x48, 0xae, 0xbc,
- 0xb8, 0x5e, 0x86, 0xbd, 0x05, 0xf4, 0x4e, 0x3e, 0x0c, 0x79, 0x66, 0xbb,
- 0xb5, 0x1a, 0xf3, 0x3e, 0x63, 0xdc, 0xcf, 0x3d, 0x22, 0xd7, 0xe2, 0x3c,
- 0xdc, 0x8e, 0x22, 0xbe, 0xf8, 0x0b, 0x94, 0x3d, 0x3c, 0x80, 0x21, 0x3f,
- 0xa2, 0xf9, 0x6f, 0x3e, 0x03, 0x61, 0xea, 0x3d, 0x6c, 0xdf, 0x7f, 0x3e,
- 0xc9, 0xc6, 0x0b, 0x3e, 0x40, 0x7d, 0xc3, 0x3f, 0x94, 0x16, 0x14, 0x3f,
- 0x0f, 0x7b, 0x5f, 0xbf, 0x8a, 0xba, 0x07, 0x3e, 0xf8, 0xff, 0x25, 0x3e,
- 0x65, 0xa7, 0x6d, 0xbd, 0x06, 0x6b, 0xd0, 0x3d, 0x09, 0xb5, 0xe0, 0x3e,
- 0xa3, 0xe8, 0x22, 0xbe, 0x2d, 0x56, 0x05, 0x3f, 0x7c, 0x39, 0xb7, 0x3e,
- 0xf8, 0x40, 0x0e, 0x3e, 0xe7, 0xe7, 0xa1, 0xbe, 0x70, 0xe6, 0x17, 0xbc,
- 0x73, 0x9c, 0x18, 0xbd, 0x8d, 0x07, 0x28, 0x3e, 0x5c, 0x04, 0x29, 0x3d,
- 0xc3, 0xae, 0xed, 0x3d, 0x8f, 0x98, 0x88, 0xbd, 0x4e, 0x91, 0x27, 0x3d,
- 0xe7, 0x4f, 0x9e, 0xbd, 0x1f, 0x48, 0xfc, 0x3d, 0x45, 0x26, 0x48, 0x3e,
- 0xb1, 0x16, 0x3a, 0xbe, 0x6a, 0x6e, 0x8d, 0xbe, 0xf1, 0x72, 0x1f, 0xbe,
- 0xac, 0xb2, 0x88, 0xbc, 0x9c, 0x19, 0x63, 0xbd, 0x4b, 0xb3, 0xc5, 0x3b,
- 0x24, 0x21, 0xac, 0xbb, 0x2f, 0x84, 0xc1, 0xbd, 0x3c, 0x61, 0x3d, 0x3e,
- 0xe7, 0x13, 0x8d, 0xbd, 0x3d, 0xdf, 0xfa, 0xbd, 0xc5, 0x72, 0xe9, 0x3d,
- 0x0c, 0x44, 0xba, 0x3d, 0x59, 0x07, 0x37, 0xbe, 0x7f, 0x98, 0xa6, 0xbd,
- 0x22, 0x20, 0xbc, 0xbd, 0x79, 0x64, 0x1a, 0x3e, 0xb5, 0xc6, 0x18, 0x3e,
- 0xaf, 0xc3, 0x99, 0xbb, 0x4e, 0x48, 0x70, 0x3d, 0x49, 0x2b, 0xfb, 0x3d,
- 0x8f, 0x9d, 0x65, 0xbd, 0x4d, 0xde, 0xf8, 0xbd, 0xcd, 0x90, 0x34, 0xbe,
- 0x03, 0x75, 0x85, 0xbd, 0x01, 0xb0, 0x2e, 0x3e, 0x74, 0xce, 0x3f, 0x3e,
- 0xf3, 0x93, 0x9f, 0xbe, 0x76, 0xf1, 0xf8, 0xbd, 0x44, 0x38, 0xa2, 0xbd,
- 0xdf, 0xc6, 0x09, 0xbe, 0xdb, 0x91, 0x49, 0x3d, 0xc9, 0x79, 0xae, 0x3d,
- 0x52, 0x84, 0xa4, 0xbd, 0x25, 0xc6, 0x2c, 0x3e, 0x1c, 0xe4, 0xad, 0xbe,
- 0x14, 0x10, 0x58, 0x3e, 0x49, 0xd5, 0xca, 0x3e, 0x1f, 0x1d, 0x9a, 0x3c,
- 0x50, 0xd6, 0x15, 0x3d, 0x2e, 0x0f, 0x16, 0xbf, 0x9f, 0xdc, 0xb9, 0xbd,
- 0x99, 0x34, 0x64, 0x3c, 0x4e, 0x32, 0x4a, 0xbe, 0x6b, 0x89, 0xc1, 0xbc,
- 0x7d, 0xae, 0xd6, 0xbd, 0x02, 0xf6, 0x5e, 0x3d, 0xa3, 0xf7, 0x0f, 0xbe,
- 0xfb, 0x72, 0x65, 0x3d, 0x38, 0x0e, 0xa4, 0x3c, 0xd0, 0x60, 0x54, 0x3e,
- 0x17, 0xba, 0x50, 0xbe, 0xc5, 0x0f, 0xf0, 0xbd, 0x06, 0x57, 0x8d, 0xbd,
- 0xab, 0x71, 0xb6, 0x3d, 0x88, 0x46, 0x44, 0x3e, 0xee, 0x73, 0xd2, 0xbd,
- 0x45, 0xb7, 0x76, 0xbe, 0x33, 0x35, 0x2a, 0xbe, 0xa3, 0xcf, 0x06, 0x3e,
- 0x5d, 0x7f, 0x43, 0x3c, 0xa1, 0x86, 0x12, 0xbe, 0xbc, 0x68, 0x19, 0x3d,
- 0x4b, 0xa6, 0x02, 0x3d, 0x0b, 0x36, 0x91, 0xbb, 0xaa, 0x72, 0x0b, 0x3a,
- 0xa2, 0x1e, 0x55, 0xbd, 0x52, 0x8a, 0x5f, 0x3e, 0x74, 0x27, 0x6c, 0x3c,
- 0x3a, 0xb3, 0x67, 0x3c, 0x8d, 0x58, 0xef, 0xbd, 0x44, 0xe9, 0x3d, 0x3e,
- 0x57, 0xb5, 0x75, 0x3e, 0x72, 0xa1, 0x37, 0x3e, 0xe0, 0xd4, 0x9d, 0x3e,
- 0x99, 0x6c, 0x89, 0x3e, 0x59, 0x87, 0x44, 0xbe, 0xc5, 0xdf, 0x46, 0xbe,
- 0x36, 0x27, 0x5d, 0x3d, 0xe9, 0xc7, 0x4f, 0xbe, 0x94, 0xa2, 0x0b, 0x3e,
- 0x42, 0xa9, 0x38, 0xbd, 0x80, 0xcd, 0xe6, 0xbd, 0x30, 0xf2, 0x3f, 0xbe,
- 0xc8, 0xe8, 0xda, 0xbd, 0x62, 0xb5, 0xab, 0xbd, 0x24, 0x0f, 0x06, 0xbe,
- 0x08, 0x37, 0x61, 0xbd, 0xdf, 0x62, 0xee, 0xbd, 0x98, 0x87, 0x6c, 0xbd,
- 0xa8, 0xc8, 0x60, 0x3e, 0x80, 0xb1, 0x2c, 0x3e, 0x06, 0x08, 0xc1, 0x3c,
- 0xc9, 0x01, 0x6b, 0x3e, 0x66, 0x5e, 0xec, 0xbd, 0x4b, 0x26, 0x3c, 0xbe,
- 0xa5, 0xbf, 0x32, 0x3e, 0x3d, 0xc6, 0x8e, 0x3d, 0x91, 0xf3, 0x35, 0xbd,
- 0xce, 0x17, 0xce, 0xbd, 0x2a, 0xba, 0xf1, 0x3e, 0xca, 0xdb, 0xfe, 0x3e,
- 0xbe, 0x18, 0x44, 0x3d, 0x54, 0x81, 0xc5, 0x3e, 0x15, 0x8e, 0xc4, 0x3d,
- 0xaa, 0xa0, 0xec, 0xbc, 0xe5, 0x52, 0x98, 0xbe, 0x5e, 0xca, 0x07, 0x3e,
- 0xed, 0x19, 0xad, 0xbd, 0x1e, 0xeb, 0x0f, 0xbf, 0x5c, 0x51, 0xd0, 0xbd,
- 0x75, 0xff, 0xef, 0xbd, 0x7a, 0xab, 0x67, 0xbe, 0x1f, 0x10, 0x46, 0xbe,
- 0x2c, 0x77, 0x12, 0xbe, 0xb6, 0xd9, 0x21, 0xbf, 0x35, 0x8d, 0x74, 0xbd,
- 0x16, 0x54, 0xa1, 0xbd, 0x6c, 0x58, 0x26, 0x3e, 0x86, 0xd3, 0x61, 0xbe,
- 0x27, 0x8b, 0x0d, 0x3d, 0x3c, 0x72, 0x15, 0xbe, 0x5e, 0x17, 0x09, 0xbe,
- 0x5c, 0xcc, 0xd3, 0x3d, 0xc0, 0x43, 0x4b, 0x3e, 0xa7, 0x31, 0x8b, 0xbd,
- 0x2b, 0x06, 0x54, 0xbe, 0x17, 0x9e, 0x55, 0xbe, 0xe3, 0xd7, 0x25, 0x3f,
- 0x59, 0xcd, 0x9c, 0xbd, 0x34, 0xc1, 0xa4, 0x3d, 0x72, 0xcb, 0x04, 0x3e,
- 0x65, 0xfe, 0x11, 0xbf, 0x3e, 0x6e, 0x8b, 0x3e, 0xa1, 0x54, 0xa5, 0x3c,
- 0xc7, 0xbe, 0x39, 0x3e, 0x97, 0xad, 0x8c, 0x3e, 0xf4, 0xae, 0x3b, 0xbe,
- 0xd3, 0x89, 0x7b, 0x3d, 0xf8, 0x80, 0xc4, 0x3e, 0xd4, 0xce, 0x3b, 0xbd,
- 0x60, 0xa6, 0x90, 0x3d, 0xce, 0x40, 0xb2, 0xbe, 0xe4, 0xfc, 0x1a, 0xbf,
- 0xb4, 0xaf, 0xce, 0x3e, 0xa4, 0x9a, 0x5e, 0xbe, 0xfd, 0x02, 0x31, 0xbc,
- 0x4c, 0xb0, 0xc6, 0x3d, 0x26, 0x21, 0x40, 0xbe, 0xc1, 0x37, 0x85, 0x3d,
- 0x9a, 0x02, 0x43, 0x3f, 0x40, 0x26, 0x17, 0x3c, 0x9b, 0x1d, 0xab, 0x3e,
- 0xb8, 0xcc, 0x85, 0xbd, 0xcd, 0x92, 0x88, 0xbe, 0xee, 0x03, 0x26, 0xbe,
- 0x38, 0x88, 0x1e, 0xbd, 0x5b, 0x03, 0x5b, 0xbe, 0x8c, 0x69, 0xb4, 0xbc,
- 0x41, 0xbb, 0x12, 0xbf, 0x16, 0xa8, 0x81, 0xbe, 0x9b, 0x9f, 0x2c, 0xbe,
- 0x93, 0x5a, 0x8b, 0xbe, 0xa4, 0xd2, 0x78, 0x3e, 0x76, 0xfa, 0x5a, 0x3e,
- 0x11, 0x29, 0x13, 0xbe, 0x97, 0xc6, 0x80, 0xbd, 0x5c, 0xa5, 0xce, 0xbd,
- 0x67, 0x45, 0x8d, 0x3a, 0xdf, 0xfc, 0x95, 0x3e, 0x3f, 0xd3, 0x9a, 0xbe,
- 0x88, 0xb1, 0x62, 0x3d, 0x92, 0x34, 0x09, 0xbe, 0x9d, 0x90, 0x84, 0x3b,
- 0xc3, 0x40, 0x40, 0x3e, 0x92, 0x6b, 0x4d, 0x3d, 0x38, 0x93, 0x8c, 0x3e,
- 0xde, 0x19, 0xad, 0x3d, 0x72, 0xc1, 0x87, 0xbd, 0xc1, 0xbf, 0xdd, 0xbc,
- 0xbf, 0xa0, 0x50, 0xbd, 0x25, 0xe0, 0x8a, 0xbd, 0xd8, 0x18, 0x9a, 0x3e,
- 0x6e, 0x7f, 0x67, 0xbd, 0xba, 0x90, 0x42, 0x3c, 0x17, 0x49, 0xa5, 0xbd,
- 0x21, 0xd4, 0xd1, 0x3d, 0x8a, 0xc0, 0x1a, 0xbe, 0x50, 0x6b, 0x98, 0x3e,
- 0x8a, 0xcb, 0xda, 0x3b, 0x8b, 0x7e, 0x3c, 0xbd, 0x6a, 0x6a, 0xe1, 0xbe,
- 0xe8, 0x82, 0x39, 0x3e, 0xaa, 0x91, 0x91, 0x3e, 0xcd, 0x32, 0x09, 0x3c,
- 0x61, 0xfe, 0x81, 0x3e, 0xe1, 0xeb, 0xce, 0x3d, 0xbc, 0x61, 0x3c, 0xbe,
- 0x7a, 0x1c, 0x99, 0x3e, 0x52, 0xc4, 0x26, 0x3e, 0x6f, 0x66, 0xbf, 0x3e,
- 0x8c, 0xe1, 0xe5, 0xbb, 0xb1, 0x4f, 0xb7, 0x3e, 0xdf, 0xa1, 0x55, 0xbc,
- 0x80, 0x4f, 0x92, 0x3d, 0xa1, 0xf2, 0x18, 0x3f, 0x4d, 0x5a, 0x3a, 0x3d,
- 0x59, 0x19, 0x20, 0xbd, 0xfe, 0x96, 0xcd, 0xbe, 0x59, 0x96, 0x87, 0x3e,
- 0x08, 0x31, 0x0b, 0xbe, 0xbd, 0x6b, 0x1a, 0xbf, 0x48, 0xc3, 0x65, 0xbe,
- 0xae, 0xc9, 0x52, 0x3e, 0xb0, 0x7f, 0x06, 0xbd, 0x5f, 0x0b, 0x15, 0xbe,
- 0x2b, 0xc4, 0xec, 0xbd, 0xe1, 0xbb, 0xbd, 0xbe, 0x6b, 0x7c, 0x49, 0xbe,
- 0x7e, 0x95, 0x9d, 0xbd, 0x2a, 0x9e, 0x82, 0x3e, 0xd8, 0x90, 0x80, 0xbe,
- 0x8a, 0x4c, 0xdd, 0x3d, 0x8e, 0xce, 0xc7, 0xbd, 0xb2, 0xdc, 0x8f, 0xbd,
- 0x80, 0x2d, 0xcc, 0xbc, 0xb6, 0x0c, 0x70, 0x3e, 0x5e, 0x3d, 0xac, 0x3c,
- 0xba, 0x37, 0xfc, 0xbd, 0x37, 0xea, 0xb5, 0xbe, 0x6d, 0x1d, 0xbf, 0x3e,
- 0x5f, 0xb8, 0x3a, 0xbe, 0xd2, 0x5a, 0x06, 0x3e, 0x9f, 0x0a, 0x0b, 0x3e,
- 0x76, 0x37, 0x76, 0xbe, 0xf6, 0x04, 0xb8, 0x3e, 0x73, 0x76, 0x14, 0xbd,
- 0x88, 0x30, 0x37, 0xbe, 0xb2, 0xa2, 0xac, 0x3c, 0x0c, 0x6f, 0x32, 0xbe,
- 0xd7, 0xe7, 0x26, 0xbe, 0x4d, 0x99, 0x94, 0x3e, 0xe0, 0xc6, 0x59, 0xbd,
- 0x4d, 0x99, 0xf8, 0x3c, 0x66, 0x07, 0xa0, 0xbd, 0x17, 0x41, 0x63, 0xbf,
- 0xed, 0xa5, 0x52, 0x3f, 0x49, 0x2a, 0x09, 0xbe, 0x8a, 0xf5, 0x82, 0xbe,
- 0x4e, 0xa4, 0x07, 0x3d, 0xe0, 0x16, 0x69, 0xbe, 0x35, 0x71, 0x62, 0xbe,
- 0xdf, 0x64, 0x57, 0x3f, 0x40, 0x1a, 0xbf, 0x3b, 0x95, 0xd7, 0xb4, 0xbc,
- 0x4f, 0x37, 0x8e, 0xbe, 0x39, 0x93, 0x3d, 0xbe, 0x51, 0x21, 0x29, 0xbe,
- 0x42, 0x3b, 0xb1, 0xbd, 0xdb, 0x49, 0x5e, 0xbe, 0xe1, 0xb7, 0x6e, 0xbd,
- 0xb6, 0x80, 0x5f, 0x3e, 0x9d, 0x2c, 0x22, 0xbe, 0x86, 0xd3, 0x0c, 0x3e,
- 0xa5, 0x67, 0x2c, 0xbe, 0xf2, 0x5e, 0xff, 0x3d, 0x0f, 0x1d, 0x59, 0x3e,
- 0xdd, 0xfe, 0x67, 0xbd, 0x39, 0x23, 0x72, 0xbe, 0x07, 0x62, 0x95, 0xbc,
- 0x8d, 0xc4, 0x90, 0x3d, 0x7d, 0x89, 0x65, 0x3e, 0x76, 0x3b, 0x67, 0xbe,
- 0x79, 0x6e, 0x21, 0x3e, 0x2f, 0x53, 0x02, 0xbc, 0xc2, 0x7f, 0x92, 0xbd,
- 0xcf, 0x73, 0x29, 0x3e, 0xd2, 0x9d, 0xfd, 0xbd, 0x16, 0x4a, 0x1c, 0x3d,
- 0x6f, 0xc8, 0xfc, 0xbd, 0xd7, 0xc7, 0x07, 0xbe, 0xb6, 0xde, 0x6a, 0x3e,
- 0xec, 0xbb, 0xd8, 0x3d, 0x4f, 0xb3, 0x07, 0x3d, 0xa5, 0x14, 0x92, 0xbd,
- 0x28, 0x0c, 0xe1, 0xbe, 0x37, 0x47, 0x93, 0x3d, 0x9e, 0xe9, 0x0a, 0xbe,
- 0xbb, 0x96, 0xc0, 0xbd, 0x43, 0x91, 0x3f, 0xbe, 0xc9, 0xae, 0xda, 0x3e,
- 0x50, 0x01, 0x2e, 0xbe, 0xcd, 0x11, 0x14, 0x3d, 0xff, 0x92, 0xa5, 0xbe,
- 0x6a, 0x60, 0xa5, 0x3d, 0xac, 0x00, 0x60, 0x3c, 0xdf, 0x91, 0x43, 0xbc,
- 0x47, 0x33, 0xba, 0xbc, 0xc4, 0xae, 0x91, 0xbd, 0xb4, 0xec, 0xd8, 0x3e,
- 0xd7, 0x7f, 0x85, 0xbd, 0x2b, 0x2f, 0x28, 0x3d, 0x82, 0xc1, 0xc1, 0xbc,
- 0x4c, 0x20, 0x6e, 0x3e, 0x78, 0x56, 0xb4, 0xbd, 0x1b, 0xff, 0x8a, 0xbf,
- 0xdf, 0xc4, 0xa3, 0x3e, 0xdf, 0x58, 0x3c, 0xbe, 0xce, 0xd4, 0x26, 0xbe,
- 0x7a, 0xe5, 0xf4, 0xbc, 0x3b, 0x6e, 0x28, 0xbf, 0x48, 0x3b, 0x74, 0xbf,
- 0x92, 0x72, 0x1b, 0x3e, 0x78, 0x87, 0x0b, 0xbe, 0x10, 0xfc, 0x88, 0xbe,
- 0xba, 0xf2, 0x8e, 0x3e, 0x4e, 0xc8, 0x1a, 0xbe, 0x69, 0x47, 0xc4, 0xbe,
- 0x87, 0x58, 0x84, 0xbd, 0xc2, 0x39, 0x37, 0xbe, 0xa5, 0xc4, 0xa8, 0x3e,
- 0x14, 0x48, 0x04, 0xbe, 0xb5, 0x6f, 0xb3, 0x3e, 0x07, 0x3a, 0x8f, 0x3e,
- 0xfc, 0x54, 0x43, 0x3d, 0x1b, 0x51, 0x0c, 0xbe, 0xdb, 0x9c, 0x07, 0xbd,
- 0x38, 0xa4, 0x0a, 0xbe, 0xcd, 0x78, 0x13, 0x3f, 0x14, 0xbb, 0x9f, 0x3d,
- 0xb9, 0xf9, 0x20, 0xbe, 0x64, 0xce, 0x20, 0xbf, 0xed, 0x7c, 0x5b, 0x3e,
- 0x22, 0x4f, 0xb3, 0x3b, 0x79, 0x81, 0xed, 0x3c, 0xca, 0x7b, 0xbc, 0xbd,
- 0x7c, 0x97, 0x8e, 0xbe, 0x5d, 0x7e, 0x36, 0xbe, 0x57, 0xba, 0x81, 0x3d,
- 0xfb, 0x8c, 0xda, 0x3d, 0xa7, 0x5f, 0xd4, 0x3e, 0x02, 0x06, 0xf3, 0xbe,
- 0x07, 0x45, 0x33, 0xbf, 0x9d, 0x35, 0x4c, 0x3d, 0x1a, 0xc7, 0xaa, 0x3c,
- 0xc6, 0x0a, 0x15, 0x3f, 0x39, 0x21, 0x1f, 0xbd, 0x94, 0x0a, 0x62, 0xbb,
- 0x8f, 0x93, 0x36, 0xbe, 0xfe, 0x13, 0x43, 0x3b, 0xda, 0xa9, 0x90, 0xbc,
- 0x32, 0x5a, 0x5a, 0x3e, 0x72, 0xf5, 0x18, 0x3e, 0x8f, 0x1b, 0xe6, 0xbd,
- 0x17, 0xa3, 0x84, 0x3e, 0xa6, 0x40, 0xf3, 0xbd, 0xf2, 0x6a, 0x1a, 0x3e,
- 0xe7, 0x6b, 0xba, 0xbc, 0x54, 0xd8, 0xd7, 0xbd, 0x1f, 0x46, 0x04, 0xbe,
- 0x43, 0xf8, 0x00, 0x3f, 0xda, 0x9f, 0xbb, 0xbd, 0xd5, 0x77, 0xb6, 0xbd,
- 0x64, 0x0f, 0x3e, 0x3e, 0xfa, 0x33, 0xc7, 0xbb, 0x40, 0x83, 0x81, 0x3e,
- 0x73, 0xe9, 0x30, 0x3d, 0xf4, 0x92, 0x66, 0xbe, 0x91, 0x34, 0x47, 0x3f,
- 0x19, 0x5f, 0x13, 0xbe, 0x03, 0x94, 0x10, 0xbd, 0xb1, 0x4b, 0x25, 0x3c,
- 0x8d, 0xa2, 0x37, 0xbe, 0x48, 0xb3, 0xb6, 0xbe, 0x6c, 0xfa, 0x6b, 0xbe,
- 0x47, 0xe6, 0xa7, 0x3e, 0x14, 0x91, 0x9f, 0xbc, 0xf4, 0xaa, 0x96, 0x3c,
- 0x9d, 0xbd, 0xc8, 0xbd, 0x28, 0x02, 0xcf, 0xbd, 0xc3, 0x2c, 0x0e, 0x3f,
- 0x46, 0x72, 0x70, 0x3e, 0x8b, 0x63, 0x16, 0x3e, 0xe9, 0x29, 0xc7, 0x3d,
- 0x23, 0x00, 0xa2, 0xbc, 0x7c, 0x86, 0xd0, 0xbd, 0xcc, 0xfe, 0xd7, 0xbc,
- 0xab, 0xc2, 0x27, 0x3e, 0x18, 0xf0, 0x1f, 0x3c, 0x18, 0x48, 0x0a, 0x3e,
- 0xdc, 0xf8, 0xa0, 0xbd, 0x69, 0xfa, 0x11, 0xbe, 0xa6, 0xfb, 0x1a, 0x3f,
- 0x49, 0xfc, 0x4e, 0xbe, 0x10, 0x33, 0x77, 0xbe, 0x8e, 0x7b, 0x00, 0xbe,
- 0xd0, 0x73, 0xc2, 0x3e, 0x26, 0x80, 0x7f, 0x3e, 0x95, 0x5b, 0x12, 0x3d,
- 0xb7, 0x6a, 0xe1, 0x3d, 0xcc, 0xce, 0x87, 0xbd, 0x5f, 0x8f, 0x45, 0xbe,
- 0xc5, 0xcf, 0x24, 0xbe, 0x32, 0xf0, 0x18, 0xbf, 0x9e, 0xe9, 0xbd, 0xbd,
- 0x18, 0x34, 0x9d, 0x3d, 0x60, 0xfa, 0x33, 0xbe, 0xc6, 0x75, 0xa5, 0x3e,
- 0xf6, 0xb5, 0xa0, 0xbe, 0xb2, 0x7a, 0x13, 0x3e, 0x8c, 0xcc, 0x0c, 0x3c,
- 0x5d, 0x71, 0x3f, 0x3e, 0x12, 0xba, 0x93, 0xbe, 0xf9, 0xd5, 0xa6, 0x3d,
- 0x47, 0x3a, 0x91, 0x3d, 0x93, 0x68, 0x3f, 0xbe, 0x98, 0x10, 0xbd, 0x3d,
- 0x1c, 0xde, 0x9c, 0x3d, 0x79, 0x98, 0x9a, 0xbd, 0x93, 0x98, 0xcc, 0xbd,
- 0x96, 0x8c, 0xbc, 0x3c, 0xc7, 0xd5, 0x8e, 0xbf, 0x75, 0xe8, 0x54, 0x3e,
- 0xac, 0x8f, 0x2a, 0x3d, 0x74, 0xa1, 0x0e, 0x3e, 0xc1, 0xe8, 0x20, 0xbc,
- 0x35, 0x6c, 0x0e, 0xbd, 0xa2, 0xa3, 0x7b, 0xbd, 0x7b, 0xd8, 0xc0, 0x3d,
- 0xa8, 0x1f, 0x15, 0xbe, 0xa9, 0x2f, 0xe7, 0xbe, 0xb7, 0xdf, 0x00, 0x3d,
- 0x7a, 0x7d, 0xc8, 0xbd, 0x70, 0x5d, 0x63, 0xbc, 0x71, 0xcd, 0xc4, 0x3d,
- 0x56, 0x87, 0x70, 0x3d, 0x5c, 0x23, 0x6e, 0xbd, 0xa0, 0xfb, 0x89, 0xbe,
- 0x8b, 0x56, 0x39, 0x3c, 0xd8, 0x83, 0x17, 0xbf, 0x9d, 0xbc, 0x7b, 0xbe,
- 0xba, 0x03, 0x92, 0xbe, 0xde, 0x2f, 0x4e, 0x3e, 0x23, 0xcd, 0x46, 0x3e,
- 0x30, 0xb6, 0xbf, 0x3d, 0xed, 0x3e, 0x80, 0x3c, 0x41, 0x63, 0xbb, 0xbd,
- 0xfa, 0xee, 0x04, 0xbe, 0x37, 0x8b, 0x6c, 0xbe, 0xb6, 0xc7, 0xaf, 0x3c,
- 0x2f, 0x05, 0x1d, 0x3d, 0x9b, 0x4c, 0xad, 0x3d, 0x40, 0xad, 0x45, 0xbe,
- 0xd8, 0xc2, 0x27, 0xbe, 0xea, 0xe5, 0xb0, 0x3e, 0x7e, 0xc5, 0xdf, 0x3c,
- 0x7b, 0xa8, 0x3c, 0xbc, 0xff, 0x25, 0xbc, 0xbd, 0x97, 0x67, 0x43, 0x3e,
- 0xd6, 0x10, 0x30, 0x3d, 0xf7, 0x56, 0x8a, 0x3e, 0xc0, 0xc5, 0x3b, 0xbe,
- 0xf9, 0x51, 0x26, 0x3d, 0x14, 0x19, 0xb9, 0xbe, 0xa3, 0xa1, 0x4c, 0x3d,
- 0x2f, 0xeb, 0xa2, 0xbf, 0x82, 0xf4, 0xc9, 0x3c, 0xc7, 0xa2, 0xa8, 0xbe,
- 0xf1, 0xe9, 0x51, 0xbe, 0x74, 0xf1, 0xaa, 0x3e, 0x05, 0xe1, 0x1e, 0xbd,
- 0x95, 0x07, 0x27, 0xbd, 0x4d, 0x4a, 0xbf, 0xbd, 0xb1, 0x7f, 0x2c, 0x3d,
- 0xeb, 0xc7, 0x10, 0xbe, 0xf5, 0xa0, 0xb6, 0x3c, 0x91, 0x25, 0xad, 0xbd,
- 0x0d, 0xbc, 0xe5, 0x3c, 0xa8, 0x78, 0x52, 0x3d, 0xbd, 0x90, 0x97, 0xbd,
- 0xa5, 0x62, 0x1f, 0x3c, 0xa6, 0x50, 0xb7, 0xbd, 0x75, 0x3a, 0xe8, 0x3d,
- 0xb8, 0x80, 0x43, 0x3e, 0x90, 0xb7, 0x8e, 0xbd, 0xb2, 0xef, 0x59, 0xbe,
- 0x94, 0x3f, 0xc5, 0xbc, 0x19, 0xb8, 0x07, 0xbf, 0xc3, 0xb2, 0x09, 0xbf,
- 0x05, 0x38, 0xc3, 0x3e, 0x31, 0x97, 0xdc, 0x3d, 0x75, 0x72, 0xc9, 0xbd,
- 0x2b, 0xaf, 0xa4, 0xbd, 0x96, 0x51, 0x0c, 0xbe, 0xc4, 0x16, 0x79, 0xbe,
- 0x31, 0xea, 0x05, 0xbe, 0x50, 0x8f, 0x37, 0x3e, 0x33, 0xd3, 0x2e, 0xbf,
+ 0x00, 0xd6, 0x85, 0xbd, 0xc4, 0x03, 0x40, 0xbe, 0xfd, 0x2b, 0xcb, 0xbc,
+ 0x8c, 0x54, 0x5e, 0x3d, 0x63, 0x7e, 0x9f, 0x3d, 0x48, 0xc3, 0x15, 0xbd,
+ 0x6c, 0x9d, 0x07, 0x3e, 0x0d, 0x14, 0xe0, 0x3d, 0xb2, 0xa9, 0x05, 0x3e,
+ 0x02, 0x2f, 0x50, 0x3e, 0xea, 0x3b, 0x74, 0x3d, 0x5e, 0x99, 0x49, 0x3d,
+ 0xf9, 0x8e, 0x9b, 0xbd, 0xbf, 0x61, 0x08, 0xbe, 0xad, 0x9e, 0x59, 0x3e,
+ 0xd8, 0xe1, 0xe5, 0xbd, 0xc4, 0x68, 0x21, 0x3d, 0x26, 0x14, 0x13, 0xbe,
+ 0x1a, 0xa7, 0x23, 0x3d, 0x37, 0xe7, 0x0e, 0xbc, 0xc7, 0x10, 0x22, 0xbc,
+ 0xfe, 0x56, 0xa8, 0xbd, 0x60, 0x66, 0x99, 0xbd, 0x38, 0x49, 0xd1, 0xbc,
+ 0x1e, 0xcc, 0xc2, 0xbd, 0x19, 0xe3, 0xbc, 0x3d, 0xdb, 0x1b, 0x25, 0x3e,
+ 0x29, 0x27, 0x33, 0x3e, 0xf9, 0x50, 0x73, 0xbe, 0x78, 0xbc, 0x11, 0xbd,
+ 0xff, 0x59, 0x5b, 0x3c, 0x45, 0x95, 0x00, 0xbe, 0xd8, 0xa7, 0x55, 0xbd,
+ 0x3d, 0x37, 0x05, 0xbe, 0x00, 0x2b, 0x44, 0xbc, 0x45, 0xb3, 0x24, 0xbe,
+ 0x75, 0x29, 0x54, 0x3d, 0x3b, 0x08, 0x4d, 0xbc, 0x09, 0xf0, 0xca, 0x3d,
+ 0xc2, 0xd6, 0x3b, 0xbd, 0x57, 0x7f, 0x64, 0xbe, 0x33, 0x5b, 0x33, 0xbd,
+ 0x9e, 0xca, 0xa3, 0xbd, 0xac, 0x05, 0x69, 0xbd, 0x78, 0x8f, 0xf1, 0x3d,
+ 0x3a, 0xbb, 0xdf, 0x3d, 0x92, 0xa0, 0x13, 0xbe, 0x6f, 0x33, 0x72, 0xbd,
+ 0x98, 0x33, 0x36, 0xbe, 0xd1, 0x2b, 0x19, 0x3d, 0x2d, 0x82, 0xd5, 0x3d,
+ 0xc0, 0xff, 0x2c, 0xbd, 0xbb, 0xca, 0xb2, 0x3c, 0x21, 0xa9, 0x08, 0x3e,
+ 0xad, 0x7e, 0x2e, 0xbe, 0xc6, 0xba, 0x0f, 0xbe, 0xaf, 0x04, 0x31, 0xbe,
+ 0x70, 0x85, 0x20, 0x3e, 0xd4, 0x81, 0x4a, 0xbe, 0xfb, 0xd8, 0x32, 0x3c,
+ 0x6c, 0xe1, 0xac, 0x3d, 0x0b, 0xbc, 0xa4, 0xbc, 0xf0, 0x21, 0x0e, 0x3e,
+ 0xce, 0x53, 0x86, 0xbd, 0x95, 0xff, 0xda, 0x3d, 0x0d, 0x3b, 0xad, 0xbe,
+ 0x89, 0x3d, 0xd9, 0x3d, 0x0d, 0xc2, 0xde, 0xbd, 0x20, 0x6b, 0x45, 0x3d,
+ 0x3a, 0x82, 0x19, 0x3e, 0x6d, 0x92, 0x89, 0xbd, 0x89, 0xdb, 0x89, 0xbe,
+ 0x41, 0xbe, 0xb7, 0xbd, 0x70, 0x04, 0xd3, 0xbd, 0x16, 0x38, 0x9e, 0xbc,
+ 0xb1, 0x4c, 0x11, 0x3e, 0x32, 0x3a, 0x14, 0xbe, 0xdf, 0x57, 0x6e, 0xbd,
+ 0x9a, 0xf0, 0x66, 0x3d, 0x49, 0x4c, 0x80, 0x3d, 0x01, 0xde, 0xbf, 0xbd,
+ 0xa1, 0x10, 0xbd, 0x3d, 0x9c, 0x0a, 0xb8, 0x3d, 0xbf, 0x86, 0x02, 0x3d,
+ 0xd4, 0x33, 0x00, 0xbe, 0xdd, 0xbf, 0x16, 0x3e, 0x84, 0xce, 0x65, 0x3e,
+ 0xee, 0x63, 0x0b, 0x3e, 0x14, 0x56, 0x0f, 0xbd, 0x6c, 0x83, 0xd4, 0x3d,
+ 0x00, 0x13, 0x6f, 0xbd, 0x72, 0xc5, 0xf7, 0xbd, 0xbc, 0x93, 0x0f, 0x3c,
+ 0xfc, 0xcf, 0xae, 0x3d, 0xdb, 0x0a, 0x05, 0xbc, 0x9c, 0x2e, 0xea, 0x3d,
+ 0x42, 0x00, 0x76, 0xbe, 0x46, 0x50, 0x9e, 0xbd, 0x1c, 0x65, 0xcf, 0x3c,
+ 0x26, 0x3a, 0x06, 0x3e, 0xac, 0xea, 0xde, 0x3d, 0x18, 0x33, 0x8f, 0xbd,
+ 0x91, 0xc4, 0x75, 0x3d, 0x9e, 0xf4, 0x85, 0xbd, 0xf9, 0xa9, 0xaa, 0x3d,
+ 0xa0, 0xcb, 0x82, 0xbe, 0xeb, 0x35, 0x68, 0xbb, 0x19, 0xc9, 0xaa, 0x3d,
+ 0x43, 0x98, 0xf5, 0xbd, 0x8d, 0xe4, 0x42, 0x3c, 0xc1, 0x0e, 0xb3, 0x3d,
+ 0x00, 0xb6, 0x7a, 0xbe, 0x4c, 0xd4, 0x2b, 0x3e, 0x8c, 0x86, 0x60, 0x3c,
+ 0x93, 0x8e, 0xe9, 0xbb, 0x49, 0x60, 0x59, 0xbe, 0x71, 0x43, 0x19, 0xbc,
+ 0x51, 0x28, 0xa9, 0x3d, 0xae, 0x02, 0x87, 0xbd, 0x50, 0xb8, 0x64, 0x3e,
+ 0x0e, 0x2a, 0x7f, 0x3c, 0x63, 0x2f, 0x9c, 0x39, 0x8e, 0x3c, 0x18, 0x3d,
+ 0x7f, 0xeb, 0x91, 0x3c, 0x27, 0x05, 0x57, 0x3e, 0xef, 0x82, 0x45, 0x3e,
+ 0x18, 0xba, 0xb7, 0x37, 0xd2, 0xd4, 0x02, 0xbd, 0xa7, 0x51, 0x99, 0xbd,
+ 0x2f, 0x4d, 0x9f, 0x3d, 0x18, 0x09, 0xde, 0xbc, 0x15, 0xe4, 0xaa, 0x3d,
+ 0xf7, 0x05, 0x29, 0xbe, 0x79, 0xee, 0xad, 0xbd, 0xf9, 0xfd, 0xc3, 0x3d,
+ 0xb0, 0x08, 0xf0, 0x3d, 0xc3, 0x09, 0x08, 0xbd, 0x4a, 0x2c, 0x3f, 0xbd,
+ 0xb7, 0x27, 0x09, 0xbe, 0x44, 0x97, 0x9e, 0x3d, 0xbc, 0xfd, 0xda, 0xbc,
+ 0xc1, 0x34, 0x92, 0x3c, 0xe9, 0x3a, 0xf5, 0x3d, 0x7c, 0x84, 0x41, 0x3d,
+ 0x3f, 0xac, 0x24, 0x3e, 0x0b, 0x65, 0x04, 0xbd, 0x8f, 0x41, 0x1a, 0xbe,
+ 0x66, 0x4e, 0x86, 0x3d, 0x7b, 0x66, 0xb6, 0xbd, 0x87, 0x53, 0x03, 0xbd,
+ 0xf8, 0x2c, 0xd4, 0xbd, 0xa3, 0x7d, 0xc0, 0xbc, 0xc3, 0xa1, 0x3b, 0xbe,
+ 0x5d, 0x5e, 0x66, 0xbd, 0xb5, 0x2c, 0x2b, 0x3c, 0x35, 0x32, 0x17, 0x3d,
+ 0xaa, 0xc2, 0x28, 0x3c, 0x89, 0x78, 0x62, 0xbe, 0x33, 0xa9, 0x78, 0xbc,
+ 0x86, 0x3f, 0x39, 0xbe, 0x42, 0x2f, 0x26, 0xbe, 0xb4, 0x92, 0x16, 0xbd,
+ 0xc2, 0x48, 0xa7, 0xbd, 0x63, 0xea, 0x3d, 0x3c, 0x4e, 0xd9, 0x89, 0x3d,
+ 0x9d, 0x20, 0xb1, 0xbd, 0xa1, 0x4c, 0xd1, 0x3c, 0x41, 0x41, 0xce, 0x3d,
+ 0xeb, 0x2f, 0x1d, 0x3e, 0xdd, 0x44, 0x66, 0x3e, 0x8f, 0x21, 0x10, 0x3e,
+ 0xd5, 0xe1, 0x99, 0xbe, 0x96, 0x4e, 0xaa, 0xbd, 0x85, 0x45, 0x29, 0xbe,
+ 0xe3, 0x19, 0x00, 0xbd, 0xfc, 0x1c, 0x4f, 0xbe, 0xfe, 0x26, 0xbf, 0x3c,
+ 0x1a, 0xd5, 0x99, 0xbc, 0xd3, 0x34, 0xbc, 0xbd, 0x8b, 0xc8, 0xed, 0x3d,
+ 0x5e, 0x74, 0x9f, 0x3c, 0x21, 0x68, 0x85, 0x3d, 0x8f, 0xfd, 0xc9, 0xbe,
+ 0x9f, 0x33, 0xbe, 0xbd, 0x20, 0xfc, 0xa4, 0xbc, 0xdb, 0x4a, 0x3c, 0xbe,
+ 0x9e, 0x9a, 0x05, 0x3e, 0xe3, 0x4d, 0x1e, 0xba, 0xb7, 0xfc, 0x06, 0xbe,
+ 0x90, 0x5c, 0xcd, 0x3c, 0xf6, 0xb2, 0x87, 0x3d, 0xa0, 0x0a, 0xa1, 0x3c,
+ 0x38, 0xce, 0xcc, 0x3d, 0xf6, 0x39, 0x78, 0x3d, 0x86, 0xed, 0xc1, 0x3d,
+ 0x62, 0xfc, 0xc9, 0x3d, 0x4e, 0x0b, 0x4e, 0x3d, 0x23, 0x58, 0xb8, 0xbc,
+ 0x3e, 0x36, 0x50, 0xbd, 0x20, 0x3f, 0xdc, 0xbd, 0xcd, 0x88, 0x11, 0xbe,
+ 0xa9, 0xf1, 0x46, 0xbe, 0x8e, 0x8d, 0x22, 0xbd, 0x0c, 0x1b, 0x58, 0x3e,
+ 0x70, 0x3e, 0xcb, 0x3c, 0xf3, 0x7a, 0x95, 0x3d, 0xec, 0xa1, 0x95, 0x3d,
+ 0x00, 0x3d, 0x4d, 0x3d, 0x5f, 0x36, 0x56, 0xbe, 0xb6, 0x69, 0xe3, 0x3d,
+ 0x48, 0x18, 0x44, 0x3e, 0x1c, 0x51, 0x1f, 0x3d, 0x7e, 0x42, 0xf3, 0x3d,
+ 0x54, 0x38, 0x6b, 0xbe, 0x78, 0x99, 0x35, 0xbe, 0x6c, 0x9c, 0x90, 0xbd,
+ 0x05, 0xc8, 0x72, 0x3d, 0xe0, 0x9b, 0xb6, 0x3d, 0x1f, 0x81, 0xef, 0xbd,
+ 0x3b, 0x0a, 0xeb, 0x3c, 0xd5, 0xa4, 0x05, 0xbd, 0x1f, 0xaa, 0xcf, 0x3d,
+ 0x41, 0xc9, 0x24, 0xbe, 0xb2, 0x25, 0xde, 0xbd, 0x1d, 0x3b, 0xee, 0x3d,
+ 0x82, 0x67, 0xcb, 0x3d, 0x91, 0x38, 0xd0, 0xbc, 0x5e, 0x46, 0x3a, 0xbd,
+ 0x01, 0xb1, 0x0f, 0xbe, 0x44, 0xab, 0x0c, 0xbd, 0x18, 0x7c, 0x61, 0x3c,
+ 0x56, 0x2c, 0xd1, 0xbd, 0xa4, 0x89, 0x24, 0xbd, 0x04, 0xf4, 0x1b, 0xbe,
+ 0xa0, 0x95, 0xc2, 0xbc, 0xc2, 0x2f, 0x9d, 0xbd, 0xa6, 0x11, 0x96, 0xbd,
+ 0x2c, 0x6f, 0x0b, 0x3d, 0xb2, 0xfe, 0x40, 0xbd, 0x58, 0x07, 0xd5, 0xbc,
+ 0x00, 0x0f, 0x29, 0xba, 0xce, 0x97, 0xfd, 0xbd, 0x42, 0x07, 0x9e, 0x3d,
+ 0x36, 0x8e, 0xc8, 0x3d, 0x21, 0x3d, 0x07, 0x3e, 0x9a, 0xec, 0xf3, 0x3d,
+ 0x8c, 0xec, 0xf1, 0xbd, 0xaa, 0x91, 0x35, 0xbd, 0x66, 0x85, 0xf6, 0xbd,
+ 0x20, 0x29, 0x52, 0x3c, 0xc0, 0x0d, 0x83, 0x3c, 0x44, 0x12, 0x09, 0xbe,
+ 0x86, 0xa7, 0xf6, 0x3d, 0x21, 0x6d, 0xd4, 0xbd, 0x94, 0xd9, 0x93, 0x3d,
+ 0xe0, 0x23, 0xf3, 0x3b, 0xa8, 0x3a, 0xe3, 0x3c, 0x01, 0xbc, 0xce, 0xbd,
+ 0xcb, 0x2e, 0x0e, 0xbe, 0xc0, 0x80, 0x48, 0x3b, 0x14, 0xf5, 0x6c, 0x3d,
+ 0x5a, 0x2a, 0x9f, 0xbd, 0xb0, 0xd3, 0x25, 0x3d, 0x28, 0x64, 0xe4, 0xbd,
+ 0x70, 0x13, 0xc9, 0x3d, 0xe0, 0x5c, 0x37, 0x3d, 0xea, 0x9f, 0x7f, 0xbd,
+ 0xba, 0x15, 0x49, 0xbd, 0xeb, 0x6a, 0xb6, 0xbd, 0x3e, 0xef, 0xf9, 0x3d,
+ 0x8c, 0x33, 0xd4, 0x3d, 0x15, 0x23, 0xfe, 0xbd, 0xca, 0x12, 0xe3, 0xbd,
+ 0xb3, 0x70, 0x08, 0x3e, 0x58, 0xda, 0xed, 0x3c, 0x18, 0xdc, 0xe0, 0xbd,
+ 0x00, 0x90, 0x6a, 0x38, 0xaa, 0x19, 0x4b, 0xbd, 0xdb, 0x86, 0x07, 0x3e,
+ 0x2c, 0x8f, 0x4a, 0x3d, 0xdd, 0x11, 0x08, 0x3e, 0xfa, 0xdd, 0x48, 0xbd,
+ 0x0c, 0xbc, 0xf1, 0xbd, 0x76, 0x54, 0xb0, 0xbd, 0x90, 0x19, 0x9a, 0x3d,
+ 0x2f, 0x22, 0x04, 0x3e, 0x20, 0xa8, 0x1b, 0x3d, 0x1b, 0x53, 0x0d, 0x3e,
+ 0x6c, 0x54, 0x83, 0xbd, 0x33, 0x20, 0x04, 0x3e, 0x10, 0x99, 0x85, 0x3d,
+ 0x38, 0xf9, 0xd9, 0xbc, 0x90, 0xda, 0xd3, 0x3c, 0x54, 0x83, 0x65, 0x3d,
+ 0xda, 0xa7, 0xcf, 0x3d, 0x74, 0x56, 0x90, 0x3d, 0xdb, 0xb2, 0x0c, 0x3e,
+ 0x0c, 0xf1, 0x4e, 0x3d, 0xd0, 0xeb, 0x42, 0xbd, 0x48, 0x26, 0x9e, 0xbd,
+ 0x84, 0x80, 0x37, 0x3d, 0x00, 0xff, 0x47, 0x3c, 0x78, 0x5f, 0x13, 0x3d,
+ 0x16, 0xaa, 0x1f, 0xbd, 0xba, 0xcc, 0xbd, 0x3d, 0xd0, 0xb0, 0x07, 0xbe,
+ 0x50, 0x2b, 0x57, 0xbd, 0xe4, 0x8b, 0x28, 0xbd, 0x55, 0xba, 0x87, 0xbd,
+ 0x2a, 0x68, 0xc1, 0x3d, 0x56, 0x93, 0xef, 0xbd, 0xe6, 0xce, 0xd7, 0x3d,
+ 0x6c, 0xcc, 0x98, 0x3d, 0x56, 0x4a, 0xff, 0x3d, 0xe3, 0x04, 0x08, 0x3e,
+ 0xc0, 0xb0, 0xd8, 0xbc, 0xe8, 0x91, 0xaa, 0xbc, 0x88, 0x15, 0x17, 0x3d,
+ 0x82, 0x8a, 0xbc, 0xbd, 0x5e, 0xfb, 0x7e, 0xbd, 0x08, 0x2c, 0xb6, 0x3d,
+ 0xe7, 0xda, 0x86, 0xbd, 0x6c, 0xd2, 0xfb, 0xbd, 0x2e, 0x85, 0x7e, 0xbd,
+ 0xc4, 0xa4, 0xd8, 0xbd, 0x58, 0x5d, 0xf6, 0xbc, 0x40, 0xc7, 0xc8, 0x3d,
+ 0x04, 0xce, 0x0e, 0x3d, 0xf0, 0x21, 0x5c, 0x3d, 0x80, 0x35, 0x5a, 0x3c,
+ 0x20, 0x6e, 0x5a, 0xbc, 0x3c, 0x7c, 0x24, 0xbd, 0x4e, 0x39, 0x3a, 0xbd,
+ 0x14, 0x8b, 0xda, 0xbc, 0x20, 0x3d, 0x75, 0xbd, 0xa3, 0xe8, 0x82, 0xbd,
+ 0xe9, 0x4c, 0x07, 0x3e, 0xee, 0xea, 0x52, 0xbd, 0x9a, 0xfe, 0xe7, 0x3d,
+ 0x50, 0x7a, 0x6e, 0xbd, 0xbf, 0x9d, 0x07, 0x3e, 0xa0, 0x97, 0x7b, 0xbd,
+ 0x3f, 0x52, 0x0b, 0xbe, 0x6c, 0x68, 0x59, 0xbd, 0x07, 0x52, 0x00, 0x3e,
+ 0xd6, 0xe7, 0xb9, 0x3d, 0xb2, 0xd5, 0xe9, 0x3d, 0x2a, 0xfe, 0xd3, 0x3d,
+ 0x5a, 0x2f, 0xe9, 0xbd, 0xda, 0xad, 0xb4, 0xbd, 0x39, 0x76, 0xb7, 0xbd,
+ 0x67, 0x1b, 0xca, 0xbd, 0x77, 0xd2, 0x0a, 0x3d, 0x9e, 0xff, 0x59, 0xbd,
+ 0xbb, 0x08, 0xb3, 0x3c, 0xab, 0xab, 0x05, 0x3d, 0xb8, 0x7c, 0xdf, 0x3c,
+ 0xaf, 0x4e, 0xe1, 0xbe, 0xff, 0xba, 0x0b, 0xbe, 0xe4, 0xa6, 0xce, 0xbd,
+ 0x24, 0x76, 0xaf, 0xbc, 0x04, 0xb4, 0xe7, 0xbd, 0x31, 0x92, 0xb2, 0x3d,
+ 0x92, 0x4b, 0xae, 0x3c, 0x5d, 0x0b, 0xb4, 0xbd, 0x1e, 0x67, 0x5f, 0x3d,
+ 0xef, 0x93, 0x5a, 0x3c, 0x6b, 0x80, 0xaa, 0xbd, 0x4a, 0x9d, 0xdf, 0x3c,
+ 0xc6, 0x36, 0x82, 0x3b, 0x79, 0x73, 0xfa, 0xbd, 0x13, 0x6a, 0xa7, 0xbc,
+ 0x7e, 0xac, 0x7d, 0xbc, 0xa3, 0x83, 0xc0, 0x3d, 0xd7, 0xc1, 0x3b, 0xbe,
+ 0x59, 0x40, 0x04, 0xbd, 0x7e, 0x97, 0xf8, 0xbd, 0xc3, 0x83, 0x67, 0xbd,
+ 0xe0, 0x78, 0x60, 0x3d, 0xf1, 0x29, 0xa6, 0xbd, 0xb4, 0xfd, 0xfe, 0x3c,
+ 0x74, 0x79, 0x8f, 0xbd, 0x6e, 0xa4, 0xca, 0x3d, 0x2b, 0x77, 0xcd, 0xbd,
+ 0x3b, 0xec, 0x56, 0x3d, 0xa2, 0x7c, 0xea, 0xbe, 0x6c, 0x2c, 0x00, 0xbe,
+ 0x69, 0x0a, 0xc4, 0xbd, 0x97, 0x7d, 0xd8, 0x3c, 0x05, 0xd7, 0xd1, 0xbe,
+ 0x78, 0x4b, 0x9f, 0x3d, 0x44, 0xd4, 0xe1, 0x3b, 0xb4, 0x35, 0xb0, 0x3d,
+ 0xfb, 0x24, 0xb3, 0x3d, 0x6c, 0x4c, 0xfd, 0x3c, 0x57, 0x68, 0x7c, 0x3d,
+ 0x30, 0xbe, 0x1e, 0xbd, 0xe6, 0x3e, 0xeb, 0x3b, 0x91, 0x09, 0xde, 0x3d,
+ 0xdd, 0x16, 0x48, 0x3d, 0xe7, 0x72, 0xcc, 0x3c, 0xbb, 0x37, 0x19, 0x3d,
+ 0xdd, 0x5d, 0x76, 0x3d, 0x53, 0x1f, 0xee, 0xbc, 0x41, 0x04, 0xd5, 0xbd,
+ 0x3c, 0x34, 0x07, 0x3e, 0x5b, 0xcb, 0xc5, 0x3d, 0xb7, 0x92, 0xad, 0xbd,
+ 0xec, 0x11, 0xa5, 0xbd, 0xd0, 0x59, 0xe1, 0xbd, 0xfe, 0x4f, 0x46, 0xbe,
+ 0xfb, 0xff, 0xc2, 0x3c, 0x39, 0x5e, 0x38, 0xbd, 0x1c, 0x4e, 0x90, 0x3d,
+ 0x73, 0x1e, 0x03, 0x3d, 0x8d, 0xf2, 0x41, 0x3c, 0x6c, 0x0f, 0x68, 0x3e,
+ 0x5f, 0x36, 0x3a, 0x3d, 0xa4, 0x76, 0x00, 0x3e, 0xc1, 0x5c, 0xc7, 0xbd,
+ 0x3c, 0xce, 0xa8, 0x3d, 0xfe, 0xc8, 0x7d, 0xbd, 0x15, 0x3b, 0x02, 0x3e,
+ 0x92, 0x7d, 0x7c, 0x3d, 0x14, 0xec, 0x97, 0xbe, 0xe7, 0x01, 0x50, 0xbb,
+ 0x79, 0x74, 0x3f, 0xbc, 0x9f, 0x42, 0x81, 0x3d, 0x69, 0x0f, 0x0f, 0xbe,
+ 0x08, 0xe0, 0x9b, 0xbb, 0xdc, 0x6c, 0x38, 0xbe, 0x4a, 0xb4, 0x01, 0x3e,
+ 0x08, 0x44, 0xc7, 0x3d, 0x3c, 0x4c, 0xd4, 0xbe, 0x05, 0xf8, 0xe6, 0x3d,
+ 0x10, 0x58, 0xa6, 0xbd, 0x3c, 0xa0, 0x73, 0xbd, 0x96, 0xaa, 0xd2, 0xbd,
+ 0xfc, 0x92, 0x4d, 0x3d, 0xe8, 0x96, 0xbf, 0xbe, 0xae, 0xf0, 0x18, 0xbd,
+ 0xac, 0xf6, 0x1c, 0x3e, 0x9f, 0x5a, 0x39, 0x3d, 0xec, 0x82, 0x34, 0xbd,
+ 0x86, 0x53, 0xc8, 0x3a, 0x9d, 0xcb, 0x06, 0xbe, 0xc9, 0x7d, 0x0a, 0xbe,
+ 0x33, 0xaa, 0x0f, 0x3e, 0x5d, 0x7d, 0xc1, 0x3d, 0x26, 0xbd, 0x50, 0xbd,
+ 0x3b, 0xd4, 0xd8, 0x3d, 0x85, 0x3e, 0xcf, 0xbd, 0x21, 0x30, 0xcd, 0xbd,
+ 0x5c, 0xac, 0x0b, 0xbe, 0x18, 0x23, 0xfe, 0x3d, 0x85, 0x76, 0xa7, 0xbd,
+ 0x64, 0xe4, 0x0c, 0x3d, 0xc9, 0x78, 0x45, 0xbd, 0xf1, 0x0b, 0x0f, 0x3e,
+ 0xbf, 0xdd, 0xed, 0xbd, 0x5c, 0x6a, 0x04, 0xbe, 0x05, 0x4b, 0x9d, 0x3d,
+ 0x17, 0x4a, 0x0b, 0x3e, 0x13, 0x5b, 0x16, 0xbc, 0x96, 0xf5, 0xb4, 0xbd,
+ 0x2c, 0x16, 0xda, 0xbe, 0x34, 0xdb, 0xc2, 0xbd, 0x59, 0x8d, 0xa1, 0x3d,
+ 0x8a, 0x95, 0xfb, 0xbd, 0x65, 0x3f, 0xf3, 0xbd, 0xfb, 0xef, 0xc0, 0xbd,
+ 0xcb, 0x9d, 0x2d, 0xbd, 0x78, 0x5a, 0x90, 0x3d, 0x74, 0x4f, 0xe9, 0xbd,
+ 0xa6, 0xdc, 0xc8, 0xbc, 0x35, 0x60, 0xc5, 0xbd, 0xde, 0x18, 0xd9, 0xbe,
+ 0xe1, 0x9e, 0xbc, 0x3d, 0xe4, 0xed, 0x9b, 0x3d, 0x09, 0x58, 0x5e, 0x3d,
+ 0x11, 0xc3, 0x3c, 0x3e, 0x45, 0x60, 0x9c, 0xba, 0x2a, 0xad, 0x88, 0x3e,
+ 0x9b, 0xc5, 0x9e, 0xbe, 0xe1, 0xf5, 0xfa, 0xbd, 0xf7, 0x82, 0xe3, 0xbc,
+ 0xf3, 0x06, 0x16, 0xbf, 0x7f, 0x38, 0x6e, 0x3e, 0xd6, 0xd7, 0x13, 0x3d,
+ 0xb4, 0x00, 0x53, 0xbe, 0x83, 0x19, 0xcd, 0xbc, 0x2e, 0x4e, 0xeb, 0x3c,
+ 0x88, 0xa1, 0x48, 0xbd, 0xa2, 0xdf, 0x1f, 0xbd, 0x41, 0x48, 0x29, 0x3d,
+ 0x2c, 0xef, 0x10, 0x3f, 0x0b, 0x17, 0x91, 0xbd, 0xc7, 0xd6, 0x78, 0xbd,
+ 0x2f, 0x80, 0xfd, 0x3e, 0xe1, 0xe9, 0x99, 0xbd, 0xd2, 0xbc, 0x04, 0x3e,
+ 0x37, 0xd4, 0x7f, 0xbe, 0x4b, 0xca, 0xab, 0x3d, 0xdd, 0x54, 0x5e, 0xbe,
+ 0xe8, 0x13, 0xff, 0x3c, 0xe8, 0x53, 0x0a, 0x3e, 0x9d, 0x94, 0x15, 0x3d,
+ 0xa7, 0xc8, 0xbf, 0xbd, 0xf4, 0xcd, 0x83, 0xbe, 0xe7, 0x22, 0x8a, 0xbe,
+ 0x6d, 0x4d, 0xfb, 0xbd, 0xe1, 0x12, 0x72, 0x3d, 0x86, 0x0c, 0xa5, 0x3e,
+ 0x95, 0xed, 0x0f, 0x3d, 0xcc, 0x6e, 0x50, 0xbe, 0x3f, 0xc2, 0xac, 0xbe,
+ 0x24, 0x56, 0xb0, 0xbe, 0x6c, 0xe0, 0x72, 0xbe, 0x66, 0x8d, 0x18, 0xbd,
+ 0xd9, 0x52, 0xf6, 0x3e, 0xe1, 0xbc, 0x19, 0xbd, 0x39, 0xd4, 0x89, 0xbe,
+ 0xa2, 0x23, 0xdc, 0xbd, 0xa3, 0x84, 0xb4, 0x3e, 0xb8, 0xe1, 0xc5, 0xbd,
+ 0xef, 0x66, 0x99, 0xbd, 0xbb, 0x5f, 0xb0, 0xbe, 0xdd, 0x2c, 0x3d, 0xbe,
+ 0xca, 0x5e, 0xba, 0xbe, 0xa3, 0xa9, 0xbb, 0x3e, 0xfc, 0xa2, 0x7a, 0xbe,
+ 0x41, 0xbc, 0x01, 0x3f, 0x13, 0xc6, 0x52, 0xbe, 0x9a, 0xed, 0x98, 0x3e,
+ 0xfd, 0x87, 0xbd, 0x3e, 0x9e, 0x49, 0x37, 0xbe, 0x07, 0x61, 0x6f, 0xbe,
+ 0xe8, 0xef, 0x82, 0x3e, 0xc4, 0x53, 0x89, 0xbc, 0xf9, 0x0f, 0xaa, 0x3e,
+ 0x67, 0xc5, 0x98, 0xbe, 0x76, 0x18, 0x52, 0xbd, 0x59, 0x4f, 0x10, 0x3e,
+ 0xe5, 0x9f, 0xf4, 0x3e, 0xc7, 0x56, 0x27, 0xbe, 0xb6, 0x47, 0x01, 0x3e,
+ 0xb3, 0xce, 0x64, 0xbd, 0xb5, 0xcd, 0x0a, 0xbb, 0x14, 0xb8, 0x5f, 0xbe,
+ 0x6d, 0x71, 0xde, 0x3d, 0x88, 0xbf, 0x7a, 0xbd, 0x1f, 0xe6, 0x04, 0x3f,
+ 0xa6, 0x5d, 0x11, 0x3e, 0x75, 0x21, 0xcc, 0xbe, 0x0d, 0xfd, 0x94, 0xbe,
+ 0xe7, 0x2b, 0x92, 0x3e, 0x30, 0xfa, 0x5a, 0xbd, 0xc0, 0x3e, 0xfd, 0xbe,
+ 0x9e, 0x94, 0x98, 0xbe, 0x27, 0xe9, 0x0f, 0xbe, 0xcc, 0xb1, 0xcd, 0xbe,
+ 0x8b, 0x4f, 0x2a, 0x3e, 0xed, 0xc4, 0x4d, 0x3e, 0x31, 0x4b, 0x84, 0x3e,
+ 0x7d, 0x47, 0x73, 0x3e, 0xa4, 0xea, 0xb8, 0x3c, 0xf6, 0x3c, 0x71, 0x3e,
+ 0x2b, 0xd3, 0xc6, 0xbe, 0xc2, 0xaa, 0xff, 0xbe, 0x0c, 0x69, 0x9e, 0xbe,
+ 0x66, 0x4d, 0xab, 0x3d, 0xf5, 0xe9, 0xec, 0x3e, 0x6a, 0x3a, 0xab, 0xbd,
+ 0x14, 0xee, 0x16, 0x3c, 0x99, 0xc4, 0xba, 0x3d, 0x7d, 0x68, 0x0c, 0xbf,
+ 0xdd, 0x4b, 0x11, 0xbe, 0xaa, 0x88, 0x17, 0xbf, 0x58, 0x87, 0xa7, 0x3c,
+ 0xd1, 0xbe, 0xbc, 0x3e, 0xd8, 0xf7, 0xab, 0x3e, 0x98, 0xac, 0x8b, 0xbc,
+ 0x81, 0x6f, 0xa4, 0x3d, 0x61, 0xec, 0xab, 0x3d, 0xdf, 0x02, 0xdd, 0xbe,
+ 0x9c, 0x31, 0xd6, 0xbd, 0x6e, 0xf3, 0x78, 0x3d, 0xd4, 0xcd, 0x0d, 0x3e,
+ 0x5f, 0x46, 0x83, 0xbd, 0x73, 0x7a, 0x2d, 0x3e, 0xc3, 0xa1, 0xc5, 0x3d,
+ 0xb1, 0x76, 0x22, 0x3d, 0xf5, 0xea, 0xdc, 0x3d, 0x9d, 0x00, 0xfd, 0xbc,
+ 0x92, 0x52, 0x20, 0xbd, 0x7e, 0x16, 0x64, 0x3d, 0xab, 0xbc, 0x62, 0x3c,
+ 0x41, 0xad, 0xc8, 0x3d, 0xe2, 0x37, 0x71, 0xbd, 0x5b, 0x00, 0x0d, 0x3d,
+ 0x5b, 0x2e, 0x13, 0xbe, 0x0a, 0x20, 0xa2, 0x3c, 0xbb, 0x7a, 0xac, 0x3d,
+ 0x1b, 0x82, 0x66, 0x3d, 0xe7, 0x1e, 0x81, 0xbb, 0xcc, 0xba, 0x9b, 0x3d,
+ 0xb9, 0xae, 0x4d, 0xbd, 0xd7, 0x1a, 0xda, 0x3d, 0xd5, 0x32, 0x27, 0xbe,
+ 0x34, 0x28, 0xab, 0x3d, 0xc7, 0xd5, 0x03, 0x3e, 0x5c, 0x0b, 0xce, 0x3d,
+ 0x79, 0x75, 0x43, 0x3d, 0x9c, 0x20, 0x8b, 0xbd, 0xa1, 0x62, 0xea, 0xbd,
+ 0x09, 0x87, 0xd4, 0x3d, 0xe3, 0xa3, 0xfd, 0xbd, 0x5e, 0x80, 0x9f, 0x3d,
+ 0x6c, 0x64, 0x4d, 0xbe, 0x91, 0xe5, 0xe8, 0x3d, 0xd2, 0x99, 0x68, 0x3d,
+ 0x2d, 0xdd, 0xf9, 0xbd, 0x34, 0xc7, 0x07, 0x3d, 0xed, 0x1e, 0x14, 0x3e,
+ 0xc8, 0x80, 0x98, 0x3d, 0x1e, 0x9e, 0xa0, 0x3d, 0xad, 0xa3, 0x70, 0x3d,
+ 0xea, 0x47, 0xbf, 0xbc, 0x2c, 0xc9, 0x1d, 0xbe, 0xbc, 0xe4, 0x2b, 0xbd,
+ 0xf2, 0x39, 0x0b, 0x3d, 0x57, 0x5c, 0x1c, 0x3e, 0x4d, 0x5a, 0x76, 0x3d,
+ 0xc1, 0xd2, 0xdb, 0xbd, 0x8e, 0x48, 0xdb, 0xbd, 0x49, 0x15, 0x85, 0x3d,
+ 0x8f, 0xe7, 0xd0, 0x3d, 0x0a, 0xca, 0x03, 0x3d, 0x37, 0x3a, 0x0c, 0xbd,
+ 0xe6, 0xdb, 0x0a, 0x3b, 0xd0, 0x7d, 0x15, 0xbe, 0xa3, 0x27, 0x26, 0xbe,
+ 0x85, 0x47, 0x64, 0xbd, 0x88, 0x4c, 0x63, 0xbe, 0xd6, 0xa7, 0x57, 0x3d,
+ 0x0f, 0x83, 0xa0, 0x3d, 0x65, 0x5f, 0x8f, 0xbc, 0x65, 0x94, 0xe1, 0x3d,
+ 0x6e, 0x98, 0x7a, 0xbd, 0x09, 0x2a, 0x95, 0xbd, 0x24, 0x56, 0xd0, 0xbe,
+ 0x39, 0x35, 0xfc, 0x3d, 0xc2, 0xf1, 0x3b, 0xbd, 0x7a, 0x89, 0x1d, 0xbe,
+ 0xcc, 0xdc, 0x10, 0xbe, 0x21, 0xa3, 0x0e, 0xbe, 0x17, 0x2a, 0x8e, 0xbe,
+ 0x68, 0x0b, 0xa2, 0x3d, 0x6a, 0x40, 0x0b, 0x3e, 0x53, 0x74, 0xbd, 0xbd,
+ 0x63, 0x91, 0x8e, 0x3c, 0x4e, 0xba, 0xa1, 0x3d, 0xf9, 0x27, 0xf2, 0x3d,
+ 0x71, 0x93, 0xc2, 0xbb, 0x60, 0x5c, 0x22, 0xbd, 0x3b, 0x3f, 0x14, 0xbc,
+ 0x39, 0x99, 0x2c, 0xbc, 0x39, 0x46, 0x18, 0x3e, 0x84, 0x87, 0x9a, 0xbd,
+ 0xa7, 0xfb, 0x9b, 0xbd, 0xb2, 0x24, 0xdd, 0x3d, 0x55, 0x0d, 0xfa, 0x3c,
+ 0xc4, 0x13, 0x43, 0x3d, 0xa0, 0x58, 0xd4, 0xbd, 0x19, 0x45, 0x14, 0xbd,
+ 0x83, 0x41, 0xe0, 0xbb, 0xba, 0x29, 0xa3, 0xbc, 0x95, 0x19, 0xe0, 0xba,
+ 0xb8, 0x65, 0xe2, 0x3d, 0x09, 0x16, 0xc7, 0xbd, 0x95, 0xd5, 0xf5, 0x3d,
+ 0x06, 0x62, 0xc3, 0xbd, 0x73, 0x36, 0xf6, 0xbc, 0xaa, 0x88, 0xa0, 0xbd,
+ 0x5a, 0x4b, 0x07, 0x3e, 0xf5, 0x05, 0x94, 0xbc, 0x38, 0x41, 0x8d, 0x3d,
+ 0xdd, 0x57, 0x70, 0x3d, 0xae, 0xf1, 0xe2, 0xbd, 0x9a, 0xcb, 0x57, 0xbd,
+ 0xe2, 0xa9, 0x60, 0xbe, 0xae, 0xfa, 0x2a, 0xbe, 0x61, 0x6d, 0x8f, 0x3d,
+ 0x88, 0x15, 0x2a, 0xbc, 0xaa, 0x7b, 0x00, 0x3e, 0x7f, 0x45, 0x85, 0x3d,
+ 0xd4, 0xac, 0x38, 0xbe, 0x30, 0x4f, 0xad, 0xbd, 0x11, 0x06, 0xfc, 0xbc,
+ 0x41, 0x7a, 0x01, 0xbc, 0x41, 0xa9, 0x8f, 0xbd, 0x57, 0x83, 0x08, 0xbe,
+ 0xae, 0x55, 0xdb, 0xbc, 0x4f, 0xcc, 0xa1, 0xbd, 0xee, 0x2d, 0x3f, 0x3e,
+ 0x12, 0xf0, 0x25, 0xbe, 0x85, 0xc6, 0xeb, 0x3d, 0x9b, 0xa2, 0xad, 0x3d,
+ 0x49, 0x93, 0x46, 0xbd, 0x5e, 0x6e, 0x1b, 0x3d, 0x77, 0x77, 0x1a, 0x3e,
+ 0x5d, 0x46, 0x1d, 0x3e, 0x4e, 0x04, 0x09, 0xbe, 0xaf, 0x42, 0x21, 0xbe,
+ 0xbc, 0x98, 0xfb, 0x3c, 0xee, 0x16, 0x3c, 0x3d, 0x12, 0x4a, 0x23, 0x3e,
+ 0xd2, 0x4e, 0x6b, 0x3d, 0xc7, 0x9a, 0xa6, 0xbd, 0x8e, 0xa3, 0x3b, 0xbc,
+ 0x68, 0x90, 0xb8, 0x3d, 0x4c, 0x77, 0x12, 0x3e, 0x81, 0x73, 0xcf, 0x3c,
+ 0x6a, 0xce, 0xb2, 0xbc, 0xbb, 0xb7, 0xc2, 0x3d, 0x43, 0x58, 0x5e, 0xbc,
+ 0x32, 0xd0, 0xb5, 0x3d, 0x5d, 0x77, 0x03, 0xbe, 0x52, 0x11, 0xc8, 0xbd,
+ 0x35, 0x00, 0x94, 0x38, 0x1e, 0x3a, 0x16, 0xbe, 0x7a, 0x05, 0x73, 0xbd,
+ 0xe9, 0x84, 0xe4, 0xbd, 0xf6, 0x67, 0x9e, 0xbd, 0xef, 0x52, 0x84, 0xbd,
+ 0xba, 0x4c, 0x0f, 0xbe, 0x03, 0x40, 0x4b, 0xbc, 0xa9, 0xd8, 0x10, 0xbd,
+ 0xec, 0x4b, 0x73, 0x3d, 0x62, 0x35, 0xbc, 0xbc, 0x1e, 0x75, 0x96, 0xbd,
+ 0x0e, 0xfa, 0xa3, 0xbd, 0x8c, 0xf7, 0x7e, 0xbd, 0xf2, 0xe3, 0x1b, 0xbc,
+ 0x2f, 0xab, 0x06, 0x3d, 0xae, 0x2b, 0x33, 0xbe, 0x75, 0xa4, 0x4a, 0xbb,
+ 0x06, 0xcf, 0xb9, 0x3d, 0x8d, 0x77, 0x81, 0x3d, 0x21, 0x41, 0x74, 0x3d,
+ 0xaf, 0x37, 0xb4, 0x3c, 0x91, 0x5d, 0x11, 0xbe, 0x4f, 0x7a, 0x1f, 0x3d,
+ 0xcb, 0x25, 0x28, 0x3e, 0xd1, 0x31, 0x46, 0x3e, 0x7d, 0x4b, 0xbd, 0x3d,
+ 0xec, 0x84, 0xf3, 0xbd, 0x69, 0xe2, 0xbc, 0xbd, 0x44, 0x0c, 0x94, 0xbd,
+ 0x23, 0x08, 0x9a, 0x3d, 0x1d, 0x28, 0x8c, 0xbc, 0x8a, 0xfd, 0xef, 0xbd,
+ 0xbd, 0xec, 0xea, 0xbd, 0x2c, 0x18, 0xc5, 0xbd, 0xff, 0x44, 0xeb, 0x3c,
+ 0xed, 0xa1, 0x96, 0xbd, 0x1a, 0x51, 0x65, 0x3c, 0xda, 0xfa, 0xf4, 0xbe,
+ 0x0c, 0x67, 0x93, 0x3d, 0x64, 0xa3, 0x2c, 0xbe, 0xf5, 0xd7, 0x8c, 0xbd,
+ 0xd9, 0xcf, 0xb6, 0xbc, 0xb7, 0x58, 0x9b, 0x3d, 0xde, 0xdd, 0xdd, 0xbd,
+ 0x30, 0xe5, 0xfd, 0xba, 0xb3, 0xce, 0x82, 0x3d, 0xd6, 0xd7, 0x18, 0xbe,
+ 0x95, 0x5a, 0x17, 0xbd, 0xdc, 0x8c, 0xcd, 0xbd, 0xb1, 0xee, 0xc6, 0xbd,
+ 0x22, 0xac, 0xcc, 0xbd, 0x0e, 0xca, 0x23, 0x3d, 0x0e, 0x34, 0xf8, 0xbd,
+ 0xec, 0x3b, 0x0c, 0xbe, 0x4c, 0xd5, 0x65, 0x3d, 0xe4, 0x5f, 0x1c, 0xbe,
+ 0x97, 0xa6, 0xc5, 0x3d, 0x24, 0xed, 0xb3, 0x3c, 0xc8, 0x0d, 0x95, 0x3c,
+ 0xdd, 0x1f, 0xfd, 0xbc, 0x1e, 0x50, 0x4e, 0x3d, 0xeb, 0xf6, 0xc1, 0x3d,
+ 0x09, 0x60, 0x9b, 0x3d, 0x8e, 0xeb, 0xae, 0xbc, 0x43, 0x00, 0x6d, 0xbd,
+ 0x7c, 0x46, 0xd0, 0x3d, 0xc5, 0x6b, 0xce, 0xbd, 0x99, 0xaf, 0xbe, 0xbc,
+ 0xaa, 0xdc, 0x50, 0x3d, 0xdf, 0xc2, 0x03, 0x3d, 0xcd, 0x9c, 0xc7, 0xbc,
+ 0x68, 0x93, 0xca, 0x3c, 0x4b, 0x47, 0x3e, 0x3e, 0x9c, 0x1d, 0x9a, 0x3d,
+ 0x81, 0xf4, 0xd3, 0x3c, 0x5c, 0x5c, 0x90, 0xbd, 0x2a, 0x98, 0x03, 0x3e,
+ 0x22, 0xee, 0x08, 0xbe, 0x0e, 0xe3, 0xb9, 0xbd, 0x6d, 0x1f, 0x0f, 0xbd,
+ 0x4f, 0x89, 0xad, 0x3d, 0x74, 0x10, 0x5b, 0xbc, 0xaf, 0x6b, 0xfb, 0x3d,
+ 0xb8, 0x61, 0x4e, 0xbe, 0xcb, 0x32, 0x2a, 0x3d, 0xc9, 0x33, 0x26, 0xbe,
+ 0x28, 0xce, 0x18, 0x3d, 0xa2, 0xd7, 0x35, 0xbe, 0x5e, 0xe1, 0x68, 0xbb,
+ 0x24, 0x24, 0xbc, 0xbe, 0x7b, 0x32, 0xfb, 0x3e, 0x56, 0x8e, 0xe8, 0xbe,
+ 0x78, 0xd7, 0x32, 0xbf, 0x9a, 0xf5, 0x70, 0xbf, 0x4a, 0xe7, 0xae, 0x3d,
+ 0x14, 0x90, 0x8c, 0x3d, 0x18, 0x82, 0x1c, 0xbf, 0x70, 0x46, 0xb7, 0xbe,
+ 0x63, 0xc7, 0xee, 0xbe, 0xc5, 0x10, 0x3a, 0xbe, 0x2f, 0xca, 0x9e, 0xbd,
+ 0xe0, 0x49, 0x17, 0xbf, 0xf9, 0xae, 0x6a, 0x3d, 0x76, 0xe1, 0xb2, 0xbe,
+ 0xb7, 0x97, 0x78, 0x3f, 0xad, 0x97, 0xd5, 0x3d, 0x8b, 0x8b, 0x82, 0xbd,
+ 0x2c, 0x4c, 0x94, 0x3e, 0x46, 0xe9, 0xf4, 0x3e, 0xcf, 0x90, 0xbe, 0x3e,
+ 0x4d, 0xc4, 0x16, 0x3f, 0xf1, 0x58, 0xbc, 0x3e, 0x01, 0xe2, 0x62, 0xbd,
+ 0xa2, 0x5b, 0x74, 0x3e, 0xf1, 0x6e, 0x44, 0xbd, 0x47, 0x23, 0xa5, 0xbf,
+ 0xa5, 0xae, 0xe0, 0xbe, 0x11, 0x8a, 0x10, 0x3e, 0xab, 0x4d, 0xa3, 0x3c,
+ 0x74, 0xe9, 0xdd, 0xbe, 0x91, 0x46, 0x7a, 0x3d, 0xea, 0x95, 0x32, 0xbe,
+ 0xf1, 0xe6, 0xf3, 0x3e, 0xd0, 0x2e, 0x4a, 0x3d, 0xf3, 0xc0, 0x6f, 0xbe,
+ 0x0c, 0x69, 0x70, 0x3e, 0x2b, 0xc3, 0xad, 0xbd, 0x00, 0x69, 0xde, 0xbe,
+ 0xe6, 0xbe, 0xb5, 0x3e, 0xd2, 0x87, 0x55, 0x3f, 0x3b, 0xfd, 0x21, 0x3f,
+ 0x5c, 0x5c, 0x08, 0x3d, 0x80, 0x1d, 0xd1, 0x3d, 0xda, 0x22, 0xa1, 0x3e,
+ 0x24, 0x3e, 0x5f, 0xbe, 0x2e, 0xbd, 0xdf, 0x3e, 0x16, 0x44, 0xaf, 0x3e,
+ 0x6e, 0x80, 0x10, 0x3f, 0xca, 0x60, 0xaf, 0xbe, 0x9b, 0x2a, 0xfa, 0xbd,
+ 0xa6, 0xe2, 0x85, 0xbf, 0xe2, 0x19, 0xb7, 0xbe, 0x09, 0xa9, 0x26, 0xbe,
+ 0x93, 0x7c, 0x13, 0x3f, 0x8b, 0xab, 0x43, 0xbe, 0xc5, 0x1b, 0xab, 0x3e,
+ 0x1a, 0x21, 0xd5, 0xbe, 0x6f, 0xe0, 0x8a, 0x3e, 0x87, 0x13, 0xc0, 0xbd,
+ 0xed, 0x33, 0x0b, 0x3e, 0x1e, 0x80, 0x04, 0xbf, 0x06, 0x96, 0xbe, 0xbd,
+ 0x9b, 0x36, 0xb7, 0x3d, 0x8d, 0xd9, 0x03, 0x3e, 0x9f, 0xb1, 0x92, 0x3e,
+ 0xef, 0xa5, 0xd4, 0xbe, 0x3d, 0xcb, 0xc5, 0x3e, 0x19, 0x38, 0x05, 0x3f,
+ 0x49, 0x33, 0x24, 0xbf, 0x8b, 0xfa, 0xaf, 0x3e, 0x0d, 0x45, 0x0d, 0xbd,
+ 0x32, 0xe4, 0x9c, 0xbd, 0xd5, 0x35, 0x6c, 0x3e, 0x5b, 0x5e, 0xe7, 0xbe,
+ 0x42, 0xaa, 0x42, 0xbf, 0xaa, 0x83, 0x3d, 0xbe, 0x2a, 0x6e, 0x12, 0xbe,
+ 0x54, 0x46, 0x66, 0xbe, 0x14, 0x93, 0x8d, 0xbd, 0x0d, 0x5a, 0x1b, 0x3f,
+ 0x64, 0xdd, 0x7a, 0xbd, 0x27, 0x7d, 0x51, 0xbf, 0xe2, 0xb6, 0xe1, 0xbe,
+ 0x44, 0xc5, 0x36, 0x3e, 0x21, 0xf2, 0x43, 0x3c, 0x85, 0x94, 0x22, 0xbe,
+ 0xa9, 0xb3, 0x2a, 0xbf, 0x5b, 0x35, 0x83, 0xbd, 0x90, 0xff, 0x4b, 0x3f,
+ 0x2b, 0x8a, 0xce, 0x3e, 0x37, 0xfe, 0x12, 0x3f, 0x79, 0xc0, 0xd0, 0x3e,
+ 0x5a, 0x2c, 0x34, 0xbf, 0x53, 0x49, 0xbb, 0xbe, 0x73, 0x23, 0x29, 0xbf,
+ 0x26, 0x69, 0xd8, 0x3e, 0xc4, 0xa2, 0x8e, 0xbd, 0x8d, 0xec, 0xe7, 0xbd,
+ 0x7c, 0x89, 0xa8, 0x3e, 0x1e, 0x1d, 0xab, 0x3d, 0x9f, 0x2f, 0x3a, 0xbe,
+ 0x6e, 0x40, 0xde, 0xbd, 0xd0, 0x1a, 0xc1, 0xbc, 0x2c, 0x32, 0xc2, 0x3d,
+ 0xcf, 0x92, 0x47, 0x3f, 0x46, 0xda, 0x3a, 0x3c, 0x14, 0x55, 0xff, 0x3e,
+ 0x5a, 0xed, 0xc8, 0x3d, 0x34, 0xe8, 0x10, 0x3f, 0x4b, 0x3b, 0xc2, 0x3c,
+ 0x51, 0xa7, 0x94, 0x3d, 0xb7, 0x9d, 0x81, 0xbf, 0x7f, 0xc6, 0x8e, 0x3e,
+ 0x12, 0x75, 0x89, 0xbc, 0x7e, 0x51, 0xeb, 0xbd, 0x95, 0x25, 0x20, 0x3f,
+ 0xb7, 0x31, 0xf1, 0xbd, 0x5b, 0x74, 0xae, 0xbd, 0x90, 0xc2, 0x05, 0xbe,
+ 0xe1, 0x52, 0x20, 0xbe, 0x77, 0xac, 0xb0, 0x3c, 0x0c, 0xaf, 0x1d, 0xbe,
+ 0xca, 0x19, 0xcf, 0xbe, 0xc2, 0x0e, 0x1a, 0xbe, 0x56, 0x5d, 0x0f, 0xbd,
+ 0xbf, 0xf4, 0x1f, 0xbe, 0xc6, 0x8a, 0x6b, 0x3c, 0x42, 0x6d, 0xbb, 0x3b,
+ 0xdc, 0x08, 0xf8, 0x3d, 0x13, 0xcc, 0xa6, 0x3d, 0x4e, 0xe1, 0xfd, 0xbc,
+ 0xde, 0xc1, 0xad, 0xb9, 0xaa, 0xed, 0xfc, 0xbd, 0xa0, 0xf6, 0x1a, 0xbe,
+ 0x84, 0xe9, 0x0b, 0xbe, 0x98, 0x92, 0x91, 0x3d, 0x19, 0x4c, 0x2b, 0x3d,
+ 0x6e, 0x08, 0x6e, 0xbd, 0x80, 0x87, 0xad, 0xbd, 0xd8, 0xd3, 0x79, 0x3d,
+ 0x29, 0xa8, 0xac, 0x3d, 0x28, 0x6c, 0x10, 0xbe, 0x09, 0x5e, 0xc1, 0x3d,
+ 0x7b, 0x72, 0xdf, 0xbd, 0x3c, 0x6e, 0x2d, 0xbe, 0xb4, 0x06, 0x0b, 0xbd,
+ 0x11, 0xb8, 0x10, 0x3e, 0xcc, 0x9b, 0x8e, 0xbc, 0x6c, 0xc8, 0x8c, 0xbd,
+ 0xcf, 0x3f, 0x81, 0x3d, 0xe4, 0x92, 0x82, 0xbe, 0x13, 0xf4, 0xcb, 0x3d,
+ 0xf3, 0x60, 0xbc, 0xbc, 0x7c, 0xde, 0xa9, 0xbc, 0xbf, 0x8c, 0xb6, 0xbe,
+ 0x52, 0x43, 0xe7, 0xba, 0x94, 0x00, 0x80, 0xbc, 0x08, 0xa7, 0xa1, 0x3d,
+ 0x26, 0xc5, 0x93, 0xbd, 0x3c, 0xc8, 0x67, 0xbd, 0x17, 0xdf, 0x14, 0xbc,
+ 0xc2, 0x0e, 0x54, 0x3d, 0x26, 0xa1, 0x9a, 0xbd, 0x24, 0x5d, 0xb5, 0xbd,
+ 0x52, 0xd1, 0xb0, 0x3c, 0xb0, 0x9f, 0x73, 0xbd, 0x4c, 0x92, 0x8b, 0xbb,
+ 0xb8, 0xc3, 0xa2, 0xbc, 0xe2, 0xdb, 0x84, 0x3d, 0xff, 0x15, 0x99, 0x3d,
+ 0x47, 0x66, 0xb2, 0xbb, 0x68, 0x38, 0x67, 0x3d, 0x87, 0x78, 0x03, 0xbd,
+ 0x2a, 0xdd, 0xeb, 0x3c, 0x8d, 0x82, 0x87, 0x3d, 0x06, 0x9b, 0xcd, 0xbd,
+ 0x31, 0x8b, 0x8f, 0xbd, 0x41, 0x39, 0x29, 0x3d, 0x8c, 0xc3, 0x10, 0x3e,
+ 0x31, 0xd3, 0xbb, 0xbd, 0x88, 0xa3, 0x30, 0xbe, 0x59, 0x47, 0x64, 0xbd,
+ 0xb0, 0x0c, 0x5e, 0xbd, 0x6e, 0x57, 0x50, 0xbd, 0x1c, 0xe4, 0xca, 0x3d,
+ 0x76, 0x08, 0xf0, 0x3d, 0xf0, 0xab, 0x13, 0xbd, 0x41, 0x73, 0x09, 0x3e,
+ 0x65, 0x27, 0xb6, 0xbd, 0xb8, 0x75, 0x6c, 0xbe, 0x36, 0x56, 0x26, 0xbd,
+ 0x73, 0xe9, 0x51, 0x3d, 0x22, 0x02, 0x98, 0x3d, 0xa4, 0x78, 0x9d, 0x3b,
+ 0x55, 0x6a, 0x32, 0x3d, 0x92, 0x9e, 0x3d, 0xbe, 0x26, 0x46, 0x9e, 0x3d,
+ 0x83, 0x8c, 0xd1, 0x3d, 0x5c, 0x33, 0xa6, 0xbe, 0x21, 0xb6, 0x20, 0xbd,
+ 0xc6, 0x2a, 0x3b, 0xbc, 0xe2, 0x4e, 0xa8, 0x3d, 0x3f, 0x4c, 0xbf, 0x3d,
+ 0x01, 0x22, 0xf0, 0xbb, 0x93, 0x06, 0xc1, 0xbe, 0x74, 0x3f, 0xf2, 0x3c,
+ 0x5b, 0xd0, 0xf2, 0xbd, 0xa5, 0x8a, 0xd4, 0xbd, 0x87, 0x2c, 0x9b, 0x3d,
+ 0x9e, 0x41, 0x90, 0x3d, 0x33, 0x56, 0x35, 0xbd, 0xc6, 0xd8, 0xa3, 0x3d,
+ 0x3d, 0xa0, 0xec, 0x3c, 0x70, 0x53, 0x2e, 0x3e, 0x56, 0x1d, 0x5e, 0xbd,
+ 0xd1, 0xcf, 0x86, 0xbd, 0x7a, 0x78, 0xcc, 0x3c, 0x97, 0x8e, 0x2c, 0x3c,
+ 0xfe, 0x8c, 0x71, 0x3d, 0x0c, 0xcc, 0xcb, 0xbb, 0x7e, 0xe8, 0xc6, 0x3d,
+ 0x5a, 0xf1, 0x23, 0xbe, 0xdb, 0x00, 0xdf, 0xbd, 0x72, 0x47, 0xd1, 0xbd,
+ 0x69, 0x05, 0x4f, 0xbc, 0x33, 0xad, 0xc6, 0x3d, 0x40, 0xf3, 0xd6, 0x3d,
+ 0x66, 0x5f, 0x58, 0x3d, 0x79, 0xf5, 0xe1, 0xbd, 0x7a, 0x0e, 0x55, 0xbe,
+ 0x10, 0x47, 0xd0, 0xbe, 0xf6, 0x3d, 0x9c, 0x3c, 0xa8, 0x51, 0x62, 0x3d,
+ 0xdf, 0x09, 0x03, 0x3a, 0xef, 0x8b, 0xab, 0xbe, 0x27, 0x82, 0x87, 0xbd,
+ 0xc9, 0x0d, 0x79, 0xbe, 0x53, 0xff, 0x3d, 0x3e, 0xc0, 0xb5, 0xa8, 0xbd,
+ 0x23, 0xe7, 0x26, 0xbe, 0x00, 0xc8, 0x3e, 0xbe, 0x96, 0x49, 0xda, 0xbe,
+ 0x32, 0x6b, 0x3a, 0x3e, 0x34, 0x54, 0xae, 0x3d, 0x8c, 0x7a, 0x09, 0x3e,
+ 0x8c, 0xe2, 0xc3, 0x3e, 0x1a, 0xfc, 0x0b, 0x3d, 0xb0, 0xf6, 0xd2, 0x3e,
+ 0x77, 0xf7, 0x3a, 0xbe, 0x38, 0x74, 0xc4, 0xbc, 0x3e, 0xd0, 0x4e, 0xbe,
+ 0xbd, 0x31, 0x1b, 0xbf, 0x18, 0x9e, 0xbc, 0x3e, 0x59, 0x3e, 0xfe, 0xbd,
+ 0xe6, 0x85, 0xe2, 0xbd, 0xe8, 0xae, 0xa0, 0xbb, 0x83, 0x9b, 0x07, 0xb9,
+ 0xf4, 0x3b, 0xf8, 0xbc, 0xaa, 0x85, 0x0b, 0xbe, 0x62, 0x0e, 0x2c, 0x3e,
+ 0xd7, 0x3a, 0xe5, 0x3e, 0x5f, 0x2c, 0xa0, 0xbd, 0xec, 0xe9, 0xa2, 0x3b,
+ 0x72, 0x26, 0x0b, 0x3f, 0x39, 0xcc, 0x2e, 0xbe, 0x52, 0x90, 0xa3, 0x3e,
+ 0xe1, 0x50, 0x77, 0xbe, 0x14, 0xc2, 0xd9, 0xbc, 0xa8, 0x00, 0x38, 0xbd,
+ 0x84, 0xcc, 0xe3, 0xbd, 0x14, 0x09, 0xa6, 0x3d, 0xc5, 0x16, 0x89, 0xbd,
+ 0xb4, 0x66, 0x84, 0xbe, 0x0c, 0xc6, 0xbe, 0xbe, 0x4d, 0x6e, 0x7a, 0xbe,
+ 0x55, 0xc1, 0x46, 0xbd, 0x95, 0xa7, 0x08, 0xbe, 0x18, 0xec, 0xd8, 0x3e,
+ 0xb9, 0x9a, 0x36, 0xbe, 0x97, 0xb6, 0xce, 0xbe, 0xf7, 0x3c, 0xcc, 0xbe,
+ 0x9b, 0xf3, 0x2c, 0xbe, 0xfa, 0x9c, 0x85, 0xbe, 0x9d, 0x5c, 0x2b, 0x3c,
+ 0xe6, 0x12, 0xc5, 0x3e, 0xcc, 0xc4, 0x23, 0x3e, 0xc7, 0x3c, 0xbd, 0xbe,
+ 0x06, 0xa4, 0x45, 0xbe, 0x51, 0x1a, 0xa2, 0x3e, 0x10, 0x97, 0x00, 0xbe,
+ 0xb0, 0x76, 0x85, 0xbc, 0xae, 0x19, 0x15, 0xbe, 0xf0, 0x93, 0xdc, 0x3c,
+ 0xc8, 0x97, 0xb7, 0xbe, 0x81, 0x33, 0xbc, 0x3e, 0xf4, 0x22, 0x95, 0xbe,
+ 0xae, 0xce, 0x19, 0x3f, 0x79, 0x57, 0x01, 0xbe, 0xb0, 0xe4, 0x4e, 0x3e,
+ 0x33, 0xd4, 0x38, 0x3e, 0x25, 0x70, 0x00, 0xbd, 0xc3, 0xfa, 0x5a, 0xbe,
+ 0x94, 0x1b, 0x5b, 0x3d, 0x62, 0x96, 0x91, 0xbc, 0xa0, 0xab, 0xa0, 0x3d,
+ 0xdf, 0x2b, 0x80, 0xbe, 0xd5, 0x06, 0xac, 0x3d, 0x37, 0xe5, 0xbb, 0x3e,
+ 0x39, 0x8c, 0xe4, 0x3e, 0x20, 0x06, 0xa9, 0x3d, 0xbc, 0x8c, 0x96, 0xbd,
+ 0x7d, 0x89, 0xe6, 0x3b, 0x2f, 0xba, 0x07, 0x3e, 0x7b, 0x15, 0xcf, 0xbe,
+ 0x16, 0x35, 0x00, 0x3d, 0xa9, 0xef, 0xa3, 0xbd, 0xa1, 0x9f, 0xfd, 0x3e,
+ 0xe2, 0x82, 0x60, 0x3e, 0x93, 0x43, 0xf1, 0xbe, 0xd1, 0x5f, 0xc4, 0xbe,
+ 0xaa, 0x77, 0x09, 0x3e, 0xee, 0x27, 0x54, 0x3d, 0xd0, 0xde, 0xa6, 0xbe,
+ 0x44, 0x46, 0xb5, 0xbe, 0xca, 0x6f, 0xa6, 0xbe, 0x36, 0xfd, 0xa1, 0xbe,
+ 0x59, 0x23, 0x97, 0x3d, 0xa1, 0x18, 0x44, 0x3d, 0xe8, 0x6b, 0x72, 0x3e,
+ 0x85, 0x75, 0x68, 0x3e, 0x3c, 0x0d, 0x7c, 0x3d, 0xc6, 0x3e, 0x83, 0x3e,
+ 0x8b, 0x64, 0xbb, 0xbe, 0x5b, 0xf1, 0xa1, 0xbe, 0x90, 0xb3, 0x5c, 0xbe,
+ 0xa1, 0x18, 0xf9, 0xbd, 0x93, 0x6b, 0xaa, 0x3e, 0x83, 0x5d, 0x3f, 0xbe,
+ 0x62, 0x2c, 0x3d, 0xbe, 0xbf, 0x74, 0x78, 0x3d, 0xd2, 0xe5, 0x08, 0xbf,
+ 0x65, 0xd6, 0x6a, 0xbc, 0x8a, 0xd2, 0x13, 0xbf, 0xc4, 0xdb, 0x18, 0x3d,
+ 0x21, 0xdc, 0x9e, 0x3e, 0x1d, 0x6b, 0x13, 0x3e, 0x47, 0xca, 0xaf, 0x3b,
+ 0xa7, 0x5f, 0x59, 0x3d, 0x03, 0xfe, 0x16, 0x3d, 0x3c, 0x84, 0x8f, 0xbe,
+ 0xbb, 0xef, 0xee, 0x3d, 0x90, 0x44, 0xb0, 0xbd, 0x72, 0xe0, 0x58, 0x3d,
+ 0x87, 0x47, 0x2b, 0xbe, 0x30, 0xc2, 0x94, 0x3d, 0xe2, 0x84, 0x9e, 0xbd,
+ 0xf8, 0xb3, 0x66, 0x3d, 0xf6, 0xd5, 0xba, 0x3c, 0x5c, 0x12, 0x44, 0x3c,
+ 0x05, 0xb5, 0xef, 0x3d, 0xdd, 0x25, 0x2a, 0xbe, 0x13, 0x27, 0x9c, 0xbd,
+ 0x93, 0x55, 0x1d, 0xbe, 0x36, 0xc3, 0x21, 0xbc, 0x90, 0xf9, 0x48, 0xbd,
+ 0x23, 0xc2, 0x04, 0xb9, 0x9b, 0x1e, 0x0f, 0xbe, 0x61, 0xf4, 0x85, 0xbc,
+ 0x3f, 0x25, 0xb9, 0x3d, 0x7c, 0xfa, 0xf0, 0x3c, 0x14, 0x8c, 0x78, 0xbd,
+ 0x81, 0xf9, 0x62, 0x3d, 0x72, 0xfb, 0x81, 0x3c, 0xfb, 0x6e, 0x09, 0xbd,
+ 0xa7, 0xbc, 0x36, 0xbb, 0x4c, 0x3e, 0xb9, 0x3d, 0x02, 0x68, 0xb4, 0xbc,
+ 0xd2, 0xcb, 0x10, 0xbc, 0x8d, 0x97, 0x9a, 0x3c, 0x7d, 0x9c, 0xab, 0x3d,
+ 0xbb, 0x75, 0x94, 0x3d, 0xe5, 0x59, 0xe7, 0xbd, 0x07, 0x5a, 0x12, 0x3e,
+ 0x1a, 0x30, 0xe3, 0x3c, 0x78, 0x5b, 0x31, 0xbc, 0x7c, 0xe6, 0x1b, 0xbb,
+ 0x4b, 0xcf, 0xfa, 0xbd, 0x73, 0x87, 0x03, 0xbe, 0x22, 0x56, 0x00, 0x3e,
+ 0xf7, 0x19, 0xa3, 0x3d, 0x90, 0x3f, 0xe2, 0xbc, 0x02, 0x23, 0x88, 0x3d,
+ 0xff, 0x7f, 0xfa, 0x3b, 0x92, 0x9b, 0x1b, 0xbe, 0xd0, 0x80, 0xeb, 0xbd,
+ 0x68, 0x46, 0xb2, 0x3d, 0x86, 0x71, 0xc0, 0xbd, 0x09, 0x5d, 0x05, 0x3e,
+ 0xa8, 0xef, 0x00, 0xbe, 0x89, 0x86, 0x29, 0x3e, 0xfb, 0x4e, 0xbd, 0xbc,
+ 0xcb, 0xc5, 0xd3, 0xbd, 0x0c, 0x04, 0xd4, 0xbd, 0x9c, 0x71, 0xaf, 0xbd,
+ 0x37, 0xc0, 0x17, 0xbe, 0x67, 0x1b, 0xd9, 0xbd, 0xa5, 0xe7, 0xe6, 0x3b,
+ 0x08, 0x2a, 0xec, 0x3d, 0x79, 0x6f, 0x52, 0xbd, 0x62, 0x1c, 0xb8, 0xbd,
+ 0x35, 0x62, 0xc3, 0x3d, 0xf4, 0x99, 0xf1, 0x3d, 0x0b, 0x11, 0x28, 0x3e,
+ 0x41, 0xa0, 0x58, 0xbd, 0xfb, 0xff, 0xdc, 0xbc, 0x82, 0x04, 0x0b, 0xbf,
+ 0x4b, 0x04, 0x53, 0x3d, 0x08, 0xfc, 0x8a, 0xbd, 0x0f, 0xfa, 0xe5, 0xbc,
+ 0xe9, 0xad, 0x06, 0xbe, 0x53, 0xf3, 0x48, 0xbd, 0xcb, 0xf4, 0x00, 0xbe,
+ 0x66, 0x45, 0xbb, 0x3d, 0x62, 0xcf, 0x7f, 0xbc, 0xe7, 0x44, 0xa5, 0xbd,
+ 0x8a, 0xaf, 0x39, 0x3d, 0x72, 0xe6, 0x40, 0x3d, 0x4d, 0x11, 0x96, 0xbd,
+ 0xd2, 0x77, 0xb9, 0xbd, 0x0b, 0x84, 0x7a, 0x3d, 0x80, 0xa9, 0xb1, 0xbd,
+ 0xa6, 0xe4, 0x2b, 0x3c, 0x2b, 0xdf, 0x97, 0x3d, 0x4d, 0xea, 0x54, 0x3c,
+ 0xb9, 0x6b, 0x7d, 0xbb, 0x5a, 0xb1, 0x07, 0x3d, 0x72, 0x05, 0x6a, 0x3d,
+ 0x13, 0x20, 0xfb, 0xbd, 0xb0, 0x13, 0xe7, 0xbd, 0x86, 0x33, 0xf9, 0x3d,
+ 0xac, 0xa6, 0x09, 0x3e, 0x93, 0x03, 0x34, 0xbd, 0x7e, 0x57, 0xb5, 0xbd,
+ 0x49, 0xf9, 0xf8, 0x3d, 0x98, 0xa6, 0x39, 0xbd, 0x14, 0x5d, 0xc9, 0xbd,
+ 0x00, 0xf5, 0x94, 0xbd, 0xfb, 0x9f, 0xeb, 0xbc, 0x32, 0xfe, 0x2c, 0xbe,
+ 0x12, 0x08, 0x40, 0xbd, 0x84, 0xc5, 0x5c, 0x3e, 0x2c, 0x8e, 0xd5, 0x3d,
+ 0xf5, 0xd2, 0xd9, 0x3d, 0xe9, 0x45, 0x25, 0xbd, 0x30, 0xc9, 0x17, 0x3e,
+ 0xb9, 0x4e, 0x25, 0xbe, 0xf5, 0xb9, 0xc5, 0xbd, 0x07, 0xb3, 0x3d, 0xbc,
+ 0x6c, 0x1c, 0xd9, 0x3d, 0x26, 0xcc, 0x85, 0xbc, 0xd0, 0x66, 0x8f, 0xbd,
+ 0x7a, 0xcb, 0x7d, 0xbd, 0x43, 0x7e, 0xff, 0x3d, 0xb1, 0xc3, 0x52, 0xbe,
+ 0xa9, 0x82, 0x3a, 0x3e, 0x0f, 0x2a, 0xce, 0xbd, 0x55, 0xa6, 0xda, 0x3d,
+ 0x86, 0x1b, 0xcc, 0x3d, 0x0f, 0x15, 0x03, 0x3e, 0xda, 0x3b, 0xb4, 0xbd,
+ 0x60, 0xaf, 0x2d, 0xbd, 0x83, 0x89, 0x21, 0xbc, 0x1d, 0xa8, 0xe4, 0x3b,
+ 0x55, 0xf6, 0x2e, 0x3e, 0x65, 0x35, 0x0c, 0x3e, 0xd2, 0x46, 0x3a, 0x3d,
+ 0x49, 0xcd, 0xce, 0x3d, 0x1b, 0x3b, 0xc8, 0xbd, 0x70, 0x14, 0x07, 0xbe,
+ 0x80, 0x1f, 0x8b, 0x3d, 0x90, 0xbc, 0x08, 0xbe, 0x0a, 0x52, 0x36, 0xbd,
+ 0xed, 0x66, 0xe5, 0xbd, 0x61, 0xe9, 0x62, 0xbd, 0xde, 0xbb, 0xb3, 0x3b,
+ 0x18, 0x75, 0xc9, 0xbc, 0x38, 0x5a, 0xe3, 0x3c, 0xe9, 0x9f, 0x07, 0xbe,
+ 0x82, 0x73, 0xc3, 0x3d, 0xa3, 0x2d, 0xcd, 0x3d, 0x07, 0xa6, 0xd8, 0x3d,
+ 0x98, 0xb5, 0xe9, 0xbc, 0x64, 0x3f, 0xad, 0xbc, 0xa6, 0xdc, 0x06, 0x3e,
+ 0x47, 0x20, 0xe7, 0x3d, 0xc3, 0xb6, 0xd5, 0xbd, 0xe9, 0xc9, 0x86, 0x3d,
+ 0xf3, 0x5a, 0x68, 0xbd, 0xf9, 0x26, 0xd4, 0xbc, 0x92, 0x9b, 0xa3, 0xbd,
+ 0xd1, 0x38, 0xc4, 0xbd, 0xcb, 0xd2, 0xb8, 0xbd, 0xa6, 0xb5, 0x4c, 0xbd,
+ 0x92, 0x4c, 0x35, 0xbb, 0x1a, 0x70, 0xe3, 0x3d, 0x46, 0x55, 0x7e, 0xbd,
+ 0xe5, 0xb9, 0xe6, 0x3d, 0x86, 0x4f, 0x9e, 0xbd, 0x2a, 0x2a, 0x07, 0x3e,
+ 0xa2, 0x86, 0xf2, 0xbd, 0x0f, 0x69, 0xa1, 0x3d, 0xf8, 0x1f, 0xb9, 0x3d,
+ 0xf0, 0xf0, 0x4f, 0xbd, 0xcc, 0x63, 0x77, 0x3d, 0x1c, 0x17, 0x97, 0xbd,
+ 0x52, 0xc5, 0xf1, 0x3d, 0x33, 0xa2, 0x21, 0x3e, 0x9a, 0x10, 0xa4, 0x3d,
+ 0x8d, 0xd9, 0x86, 0xbd, 0x46, 0xaa, 0xc2, 0xbd, 0x3a, 0x7a, 0x75, 0xbd,
+ 0x47, 0x91, 0xec, 0xbd, 0xdf, 0x6f, 0x93, 0xbd, 0x12, 0x6b, 0x61, 0xbd,
+ 0x88, 0x5d, 0xab, 0x3d, 0x8e, 0x1b, 0x0a, 0xbe, 0xba, 0x1b, 0x07, 0xbe,
+ 0x93, 0xef, 0xbe, 0xbd, 0xda, 0x6e, 0xe1, 0xbc, 0x92, 0x06, 0x50, 0xbd,
+ 0x2b, 0xc2, 0x36, 0xbd, 0xdc, 0x0b, 0xe3, 0xbd, 0x44, 0x51, 0xfd, 0xbe,
+ 0x33, 0x47, 0x26, 0xbc, 0xb8, 0xba, 0xb4, 0x3d, 0xfb, 0xe8, 0xaf, 0xbd,
+ 0x80, 0x66, 0xe6, 0xbd, 0x83, 0xa9, 0xa1, 0xbd, 0x7c, 0xc9, 0x79, 0x3c,
+ 0x42, 0x67, 0xad, 0x3d, 0x4c, 0xf0, 0xad, 0xbd, 0x59, 0x7b, 0xd1, 0x3d,
+ 0x80, 0x98, 0x2a, 0xbd, 0xa1, 0x7b, 0xdc, 0xbc, 0xea, 0xbc, 0xb9, 0xbb,
+ 0xb3, 0x24, 0x94, 0x3b, 0xa0, 0x74, 0x78, 0x3c, 0xf2, 0x81, 0x11, 0xbd,
+ 0x3a, 0xe9, 0xfa, 0xbd, 0x3d, 0x0f, 0xdd, 0x3d, 0x67, 0xe3, 0x6c, 0xbc,
+ 0x22, 0x2e, 0xbc, 0x3d, 0xff, 0x71, 0x29, 0x3e, 0x8a, 0xab, 0x97, 0xbd,
+ 0xd5, 0x68, 0x97, 0xbd, 0x30, 0xb8, 0xde, 0x3d, 0xcc, 0xde, 0x70, 0xbc,
+ 0x31, 0xaa, 0xa0, 0x3d, 0x4f, 0x85, 0x53, 0xbb, 0x46, 0x5e, 0x40, 0xbb,
+ 0xcb, 0xde, 0x3a, 0xbc, 0xc9, 0x71, 0xf5, 0x3b, 0x8a, 0x8d, 0xb6, 0xbd,
+ 0xbc, 0xf6, 0xd0, 0x3d, 0x3e, 0xce, 0x48, 0xbe, 0x70, 0x47, 0x3e, 0x3c,
+ 0x43, 0x5f, 0x3b, 0x3e, 0xd2, 0xa7, 0x90, 0xbc, 0xa4, 0xae, 0x92, 0x3d,
+ 0x1b, 0xa3, 0x92, 0xbd, 0xd1, 0x66, 0xb3, 0xbc, 0x47, 0x85, 0x3f, 0xbd,
+ 0x07, 0x64, 0x26, 0xbd, 0x3e, 0x16, 0x47, 0xbd, 0x34, 0x04, 0x43, 0x3e,
+ 0x49, 0x1f, 0xf8, 0x3d, 0xf6, 0x6a, 0xe8, 0x3d, 0xc0, 0xa4, 0xa2, 0x3d,
+ 0xc7, 0xc4, 0xc4, 0xbd, 0xa9, 0x1a, 0x08, 0x3e, 0x06, 0x33, 0xe6, 0xbd,
+ 0xf3, 0x74, 0x07, 0x3e, 0x61, 0x89, 0x05, 0xbe, 0x79, 0x35, 0x9b, 0x3d,
+ 0x7c, 0x7e, 0x85, 0x3d, 0x92, 0xbe, 0x25, 0x3e, 0x10, 0xe1, 0xe2, 0xbe,
+ 0x58, 0x3c, 0x41, 0xbf, 0x2d, 0x60, 0x1d, 0xbf, 0x1c, 0x9f, 0x4e, 0xbc,
+ 0xcf, 0x6b, 0xf6, 0x3e, 0x23, 0xfa, 0x47, 0xbf, 0x0b, 0x23, 0x09, 0xbf,
+ 0x1c, 0x83, 0x46, 0xbf, 0x2e, 0x24, 0xd9, 0x3c, 0x9b, 0xed, 0xb3, 0x3c,
+ 0xa9, 0xa5, 0x41, 0xbe, 0x20, 0x58, 0x36, 0xbc, 0xd4, 0xfd, 0x29, 0xbe,
+ 0xb1, 0x0e, 0xcb, 0x3e, 0xf5, 0x3b, 0x9d, 0xbd, 0xe2, 0x09, 0x96, 0x3d,
+ 0x34, 0x3d, 0xcc, 0xbd, 0xac, 0x1b, 0x6a, 0x3f, 0x69, 0xf6, 0xd4, 0x3e,
+ 0x0f, 0x23, 0x07, 0x3f, 0x6c, 0xe9, 0x39, 0x3f, 0xd3, 0xaa, 0x74, 0x3d,
+ 0xf1, 0x0e, 0x3e, 0x3f, 0xb3, 0x90, 0x8f, 0xbd, 0x48, 0x76, 0x62, 0xbf,
+ 0x7d, 0x39, 0x46, 0x3e, 0xa9, 0x22, 0xb5, 0x3e, 0x9e, 0x3d, 0x47, 0x3c,
+ 0xf5, 0x5e, 0x2c, 0xbe, 0x50, 0xb2, 0xac, 0x3e, 0x98, 0x3f, 0xc4, 0xbe,
+ 0x5b, 0x47, 0x33, 0x3e, 0x57, 0x67, 0xc1, 0x3e, 0x21, 0x82, 0x3d, 0xbe,
+ 0xb7, 0x1c, 0x92, 0x3d, 0xb3, 0xdd, 0xd0, 0xbe, 0xf3, 0xff, 0xd8, 0x3d,
+ 0x17, 0x6c, 0xa2, 0x3e, 0xad, 0x56, 0xef, 0xbd, 0xe4, 0xb0, 0x93, 0x3e,
+ 0x62, 0x38, 0x1c, 0x3e, 0xe9, 0x7c, 0xc6, 0xba, 0x02, 0x89, 0x21, 0x3f,
+ 0x52, 0xad, 0xfc, 0xbe, 0x1b, 0x29, 0xba, 0x3e, 0x2e, 0x42, 0x93, 0xbc,
+ 0x80, 0xb5, 0xe6, 0x3e, 0xa6, 0x13, 0xf1, 0x3c, 0x49, 0x1b, 0x09, 0x3e,
+ 0xd2, 0xec, 0x6f, 0xbf, 0xdc, 0x9f, 0x12, 0x3e, 0x0b, 0x37, 0xec, 0xbe,
+ 0x55, 0xcf, 0x0d, 0x3e, 0xb8, 0xf7, 0x77, 0x3e, 0x34, 0x9b, 0x10, 0x3f,
+ 0xcc, 0xb3, 0x19, 0xbf, 0x07, 0x03, 0x7b, 0x3e, 0x0f, 0xa2, 0x3f, 0xbe,
+ 0x47, 0x99, 0xc4, 0x3e, 0x3a, 0xbd, 0xf6, 0xbe, 0x42, 0x9f, 0xee, 0x3e,
+ 0xb0, 0xfb, 0x4e, 0x3c, 0xa5, 0x86, 0x1d, 0xbe, 0x19, 0x50, 0x24, 0x3e,
+ 0x0b, 0x35, 0xc5, 0xbc, 0xd8, 0xe4, 0xe4, 0xba, 0x42, 0xcb, 0xe5, 0x3e,
+ 0x4e, 0x58, 0x6c, 0xbe, 0x3c, 0x41, 0xe3, 0x3e, 0xe4, 0x77, 0x95, 0xbc,
+ 0xad, 0x9c, 0x96, 0x3e, 0xc9, 0x91, 0xaa, 0x3e, 0x9b, 0x05, 0x26, 0xbf,
+ 0x78, 0xbb, 0x80, 0xbe, 0x69, 0xce, 0xa3, 0xbd, 0xee, 0x14, 0x15, 0xbe,
+ 0x76, 0x7b, 0x06, 0xbf, 0xe6, 0x5b, 0x22, 0x3d, 0xbb, 0xb8, 0x46, 0x3e,
+ 0xd2, 0xad, 0xec, 0xbd, 0xdc, 0x2e, 0x98, 0xbd, 0xbd, 0x3f, 0xac, 0xbe,
+ 0x0d, 0x42, 0x8b, 0x3e, 0xf2, 0x4a, 0xa3, 0x3d, 0xeb, 0x17, 0x61, 0xbe,
+ 0x87, 0xc7, 0x0b, 0xbf, 0x4e, 0xcb, 0x92, 0x3e, 0x0e, 0xed, 0xae, 0x3e,
+ 0x6f, 0xe4, 0xaa, 0x3e, 0x6b, 0x55, 0x19, 0x3e, 0x7e, 0xfb, 0x86, 0x3e,
+ 0x0b, 0xc4, 0x26, 0xbf, 0x4e, 0xa2, 0x97, 0xbe, 0x9c, 0x9a, 0xd2, 0xbe,
+ 0xcb, 0x88, 0xd0, 0x3e, 0xa5, 0x88, 0xca, 0x3d, 0x7c, 0x27, 0x0f, 0x3e,
+ 0x99, 0x6b, 0x34, 0x3e, 0xff, 0x90, 0x8e, 0xbe, 0xce, 0xd3, 0xa5, 0x3f,
+ 0xbf, 0x85, 0x35, 0x3e, 0xa7, 0x88, 0xfd, 0x3d, 0x32, 0xb4, 0xa4, 0x3e,
+ 0xc0, 0x1a, 0x7f, 0x3e, 0xa9, 0xd5, 0x07, 0xbe, 0x99, 0xe9, 0x11, 0x3f,
+ 0x82, 0xb1, 0x05, 0xbe, 0x2a, 0xf7, 0xdd, 0x3d, 0x11, 0xb0, 0x62, 0x3e,
+ 0x73, 0x83, 0x07, 0x3f, 0xc3, 0x37, 0x88, 0xbf, 0x0c, 0x65, 0x39, 0x3e,
+ 0x4f, 0xe6, 0xea, 0x3e, 0x8c, 0xe2, 0x3a, 0xbe, 0x55, 0x9b, 0xfb, 0x3e,
+ 0x3e, 0x9e, 0xd6, 0x3c, 0x79, 0x85, 0xb3, 0x3d, 0xa6, 0x71, 0xc6, 0x3d,
+ 0x15, 0x5f, 0x8a, 0xbd, 0xba, 0xeb, 0x7a, 0x3c, 0x9c, 0x73, 0x47, 0xbe,
+ 0x09, 0x46, 0x9c, 0xbe, 0xf4, 0x8e, 0xae, 0xbb, 0x63, 0x7c, 0xe4, 0x3c,
+ 0xb9, 0x66, 0x53, 0x3d, 0x20, 0xc7, 0xca, 0xbc, 0xd2, 0x1f, 0x1c, 0xbe,
+ 0xb5, 0x82, 0xd9, 0x3d, 0xbf, 0xfd, 0x18, 0xbe, 0x45, 0x1f, 0xe8, 0xbd,
+ 0x14, 0x32, 0x52, 0x3d, 0x70, 0xa8, 0x09, 0xbe, 0xac, 0x13, 0x39, 0xbe,
+ 0x4f, 0xd1, 0x44, 0x3d, 0xc2, 0xe0, 0x7c, 0xbd, 0x0c, 0xaa, 0xb8, 0xbd,
+ 0x38, 0x65, 0xb8, 0xbd, 0xd7, 0x4a, 0xec, 0x3c, 0xd6, 0x07, 0x15, 0xbe,
+ 0xff, 0x24, 0xf9, 0xbd, 0x05, 0xf0, 0x45, 0xbe, 0x59, 0x61, 0xbd, 0x3c,
+ 0x66, 0xf0, 0xf7, 0xbd, 0x56, 0x98, 0x08, 0xbe, 0xda, 0x45, 0xfd, 0x3c,
+ 0xcf, 0x11, 0x87, 0xbc, 0x50, 0xf4, 0x86, 0x3d, 0x7e, 0x06, 0x13, 0xbe,
+ 0x5b, 0x31, 0x8d, 0xbd, 0x01, 0xc7, 0x03, 0xbe, 0x59, 0x6f, 0xe0, 0xbd,
+ 0x63, 0xf2, 0xba, 0x3d, 0xf7, 0xba, 0xf4, 0xbc, 0x90, 0xf7, 0x7c, 0xbe,
+ 0x6c, 0xc0, 0x06, 0xbe, 0xe0, 0x2c, 0xd4, 0xbd, 0xef, 0x6f, 0x3e, 0x3d,
+ 0x7a, 0xa9, 0xa4, 0xbd, 0x74, 0x65, 0x1b, 0xbe, 0x1c, 0x12, 0xda, 0x3d,
+ 0x9a, 0x63, 0x93, 0x3d, 0x8b, 0xf3, 0x12, 0x3d, 0xfe, 0x5f, 0x17, 0xbd,
+ 0x95, 0x63, 0xfa, 0x3d, 0x02, 0x98, 0x9f, 0x3d, 0x2e, 0xf6, 0x15, 0xbe,
+ 0x62, 0xca, 0xa0, 0xbd, 0xf6, 0x0b, 0x38, 0xbd, 0x75, 0x21, 0xe0, 0x3d,
+ 0x22, 0x10, 0x0b, 0x3d, 0x4a, 0x4a, 0x5c, 0x3d, 0xeb, 0xce, 0x56, 0xbe,
+ 0x80, 0x7c, 0xdb, 0xbc, 0x2f, 0x2a, 0x10, 0xbe, 0x1d, 0x9c, 0x3c, 0xbe,
+ 0x4f, 0x62, 0x65, 0x3d, 0xae, 0xcd, 0xd0, 0x3d, 0xe6, 0x23, 0xd6, 0xbd,
+ 0x42, 0xf4, 0x05, 0x3d, 0xbd, 0x65, 0xb2, 0x3c, 0x5a, 0xae, 0x41, 0x3e,
+ 0x57, 0x55, 0xb2, 0x3d, 0x64, 0x89, 0xe8, 0x3d, 0x55, 0xbe, 0x25, 0xbd,
+ 0xd4, 0x89, 0xf0, 0x3c, 0xa7, 0xda, 0x8b, 0x3d, 0x7e, 0xfc, 0xd2, 0xbd,
+ 0x85, 0xf0, 0xff, 0x3c, 0x32, 0xcb, 0x95, 0x3d, 0xab, 0x1f, 0x91, 0x3d,
+ 0x95, 0xdb, 0x21, 0x3d, 0x24, 0x5d, 0x0e, 0xbe, 0x69, 0xab, 0xbb, 0x3d,
+ 0x0c, 0x2b, 0x1d, 0xbe, 0xeb, 0xfe, 0xad, 0xbd, 0x8a, 0x60, 0x44, 0x3d,
+ 0xf5, 0xf8, 0xaa, 0xbd, 0xa0, 0x4c, 0x30, 0xbe, 0xff, 0x25, 0x1b, 0x3d,
+ 0xc9, 0x29, 0xde, 0xbd, 0x97, 0x62, 0xee, 0x3d, 0xce, 0x99, 0xad, 0xbb,
+ 0xdf, 0x99, 0xac, 0x3c, 0x7f, 0x81, 0x63, 0xbe, 0x9a, 0xb8, 0x16, 0x3c,
+ 0xbd, 0x3a, 0xc0, 0x3d, 0x09, 0xfb, 0xe0, 0x3d, 0x7b, 0x3d, 0x98, 0xbd,
+ 0xa8, 0x72, 0xbe, 0xbc, 0xbf, 0xfd, 0x82, 0xbc, 0xc5, 0x23, 0x12, 0x3d,
+ 0x0b, 0xed, 0x84, 0x3d, 0x31, 0xf0, 0xcc, 0xbc, 0xf8, 0x7f, 0xd5, 0x3d,
+ 0xbb, 0x9e, 0xc2, 0x3d, 0x5f, 0xae, 0xb6, 0xbc, 0x7b, 0x41, 0x19, 0xbe,
+ 0x67, 0x23, 0x03, 0xbe, 0x25, 0x73, 0xa3, 0xbd, 0xf6, 0x03, 0xbd, 0xbd,
+ 0x04, 0x9f, 0x85, 0x3c, 0xe9, 0xe4, 0x89, 0xbb, 0xff, 0x4f, 0xb4, 0x3d,
+ 0x72, 0xea, 0x9f, 0xbc, 0x9b, 0x1c, 0x12, 0x3e, 0xea, 0x26, 0xde, 0xbd,
+ 0xc4, 0x0d, 0x97, 0x3c, 0xaf, 0x78, 0x9e, 0x3d, 0x1a, 0xed, 0x2c, 0xbe,
+ 0xb6, 0xa0, 0x34, 0xbd, 0xbd, 0xe0, 0x05, 0x3e, 0x97, 0x88, 0x50, 0x3d,
+ 0xd9, 0x3e, 0xd4, 0x3c, 0x41, 0xca, 0x2d, 0xbe, 0xb9, 0x30, 0xc0, 0xbd,
+ 0x2d, 0xed, 0x37, 0xbe, 0x3d, 0x0f, 0x18, 0x3e, 0x31, 0xaa, 0xb6, 0xbc,
+ 0x2d, 0xba, 0x0d, 0xbe, 0x4b, 0xe7, 0x8b, 0xbb, 0x9a, 0x93, 0xe2, 0xbe,
+ 0xb3, 0x38, 0x8a, 0x3d, 0x38, 0x0a, 0x74, 0x3d, 0x8a, 0xee, 0x0a, 0x3e,
+ 0x76, 0xa5, 0xcf, 0x3e, 0xdc, 0xab, 0xe8, 0x3d, 0x10, 0xb6, 0xc8, 0x3e,
+ 0x1d, 0x23, 0x9c, 0xbe, 0x2d, 0x28, 0x25, 0xbd, 0x5e, 0x56, 0x35, 0xbe,
+ 0x6d, 0x4d, 0x18, 0xbf, 0x6c, 0xda, 0x9e, 0x3e, 0x31, 0xd4, 0xcc, 0x3d,
+ 0xcc, 0x38, 0x87, 0xbd, 0xdd, 0xdc, 0xaf, 0xbd, 0x00, 0x16, 0xe6, 0xbd,
+ 0xd3, 0xcd, 0x4a, 0x3e, 0x9c, 0x9a, 0x67, 0x3d, 0xe3, 0x3f, 0x8b, 0x3d,
+ 0xeb, 0x1a, 0xd1, 0x3e, 0x03, 0xfd, 0x6c, 0x3d, 0x11, 0x16, 0xa5, 0x3d,
+ 0xdf, 0x27, 0x02, 0x3f, 0xdb, 0x3e, 0xa4, 0xbd, 0x4c, 0xe6, 0x87, 0x3e,
+ 0xa7, 0xa9, 0x6b, 0xbe, 0xac, 0x54, 0x5d, 0xbd, 0xae, 0xed, 0x61, 0xbd,
+ 0x1e, 0xe3, 0xf0, 0xbd, 0xbf, 0x2c, 0xa6, 0xbc, 0x6b, 0xc6, 0x26, 0x3e,
+ 0xad, 0x66, 0xe1, 0xbd, 0x26, 0x5c, 0xcb, 0xbe, 0x2c, 0x2e, 0xe0, 0xbe,
+ 0xc1, 0x1a, 0x45, 0xbe, 0x08, 0x9f, 0x88, 0x3d, 0xa4, 0x22, 0xd4, 0x3e,
+ 0x72, 0x31, 0xb5, 0x3b, 0x6a, 0xfc, 0x4e, 0xbe, 0x2b, 0xb9, 0x7d, 0xbe,
+ 0x45, 0xc1, 0x93, 0xbe, 0x56, 0x50, 0x92, 0xbe, 0xcd, 0xa5, 0x13, 0xbe,
+ 0xcf, 0xd8, 0xe5, 0x3e, 0x77, 0x5d, 0xdd, 0x3b, 0x47, 0x9c, 0xc5, 0xbe,
+ 0x06, 0x25, 0x30, 0xbe, 0xc7, 0x0c, 0xb8, 0x3e, 0x8a, 0x17, 0x9a, 0x3d,
+ 0x6e, 0x0b, 0xf7, 0x3c, 0x32, 0x33, 0x17, 0xbe, 0x26, 0xc3, 0x98, 0x3d,
+ 0x53, 0xe8, 0x57, 0xbe, 0x31, 0xf7, 0x86, 0x3e, 0xc4, 0xa5, 0x44, 0xbe,
+ 0x34, 0x35, 0xbf, 0x3e, 0x2f, 0xfe, 0xc3, 0xbd, 0xf2, 0xe3, 0x2a, 0x3e,
+ 0x49, 0x34, 0xda, 0x3e, 0x97, 0xab, 0xdd, 0xbd, 0x84, 0x7e, 0x62, 0x3c,
+ 0x13, 0x3a, 0xf6, 0x3d, 0x36, 0x4d, 0x24, 0x3d, 0x90, 0xd2, 0xd6, 0x3d,
+ 0x6a, 0x3c, 0x40, 0xbe, 0xa6, 0x16, 0x43, 0x3d, 0x7d, 0x58, 0xb4, 0x3e,
+ 0xa9, 0xec, 0xc3, 0x3e, 0xf1, 0x62, 0x10, 0xbd, 0xf4, 0xa4, 0x05, 0x3b,
+ 0x6c, 0xc3, 0x07, 0x3d, 0xb4, 0x6f, 0x02, 0x3e, 0x2f, 0xdd, 0xd2, 0xbe,
+ 0x3d, 0xad, 0x07, 0x3e, 0xae, 0xb2, 0x18, 0x3e, 0xb7, 0xbc, 0xd5, 0x3e,
+ 0x58, 0x29, 0x4a, 0x3e, 0x41, 0x7f, 0x96, 0xbe, 0x8f, 0xb7, 0x42, 0xbe,
+ 0xcd, 0x96, 0xa8, 0x3e, 0xe4, 0xa1, 0x19, 0xbd, 0x3a, 0xec, 0xbf, 0xbe,
+ 0x15, 0xbd, 0xe9, 0xbd, 0xd8, 0xf5, 0xb7, 0xbd, 0xe6, 0x1a, 0x07, 0xbe,
+ 0x9f, 0x45, 0x43, 0x3e, 0xb3, 0x34, 0x51, 0xbc, 0x06, 0x4a, 0x72, 0x3e,
+ 0x5a, 0xf7, 0xaf, 0x3e, 0xd6, 0x5b, 0x22, 0x3d, 0x99, 0xe9, 0x46, 0x3d,
+ 0xe3, 0xe8, 0xcf, 0xbe, 0xd2, 0x32, 0xee, 0xbe, 0x1e, 0x10, 0xa1, 0xbe,
+ 0x8d, 0x53, 0x4a, 0xbd, 0x7b, 0x21, 0xe4, 0x3e, 0x0f, 0xb6, 0x53, 0xbe,
+ 0xf0, 0x4e, 0x95, 0xbd, 0xc0, 0xa0, 0x42, 0x3d, 0x5b, 0xfe, 0xe2, 0xbe,
+ 0xb9, 0xcb, 0x81, 0xbd, 0xd1, 0xd0, 0xf9, 0xbe, 0xf6, 0x58, 0x8e, 0x3d,
+ 0xc7, 0x39, 0xd5, 0x3e, 0xe6, 0x3d, 0xbc, 0x3e, 0x7a, 0x7a, 0x34, 0x3c,
+ 0x2a, 0xcc, 0x93, 0xbc, 0x23, 0xf2, 0xe0, 0x3d, 0x46, 0xf7, 0x4a, 0xbe,
+ 0xc6, 0x27, 0x76, 0xbd, 0x1c, 0x09, 0x0a, 0x3e, 0x29, 0x30, 0x90, 0xbc,
+ 0x86, 0x80, 0x76, 0xbe, 0x0b, 0x43, 0xe6, 0x3d, 0x41, 0x7a, 0xcd, 0xbd,
+ 0xc8, 0x65, 0xc2, 0x3d, 0x2a, 0x65, 0xd3, 0xbd, 0xee, 0x65, 0x09, 0xbe,
+ 0x10, 0xd2, 0x27, 0xbd, 0x24, 0xc2, 0x21, 0xbd, 0xf2, 0x00, 0x52, 0x3d,
+ 0x3d, 0xfa, 0x16, 0xbd, 0x74, 0x5e, 0x34, 0xbd, 0xa7, 0x30, 0xd6, 0x3d,
+ 0x90, 0x69, 0x43, 0x3c, 0x9a, 0x4e, 0x0f, 0xbd, 0xe0, 0x63, 0x28, 0xbe,
+ 0xd7, 0x6b, 0xfd, 0x3d, 0x2e, 0x0b, 0x58, 0xbd, 0xee, 0x75, 0x19, 0xbe,
+ 0xe8, 0xcd, 0xd8, 0x3d, 0xd4, 0x76, 0x58, 0x3e, 0x97, 0x48, 0xd4, 0xbd,
+ 0x1f, 0xcd, 0xc2, 0xbc, 0x50, 0x52, 0xe2, 0x3d, 0x95, 0x51, 0x98, 0xbd,
+ 0x25, 0x5a, 0xaa, 0xbb, 0xfc, 0x7c, 0x6c, 0xbc, 0x7a, 0x3c, 0x96, 0xbd,
+ 0x13, 0x52, 0x98, 0xbd, 0x0e, 0x3a, 0x67, 0xbe, 0x94, 0x82, 0xcb, 0x3d,
+ 0x56, 0xfd, 0x8d, 0x3d, 0x0d, 0x41, 0x0b, 0x3e, 0x88, 0xf1, 0xa1, 0x3d,
+ 0xfa, 0xe9, 0x4e, 0xbd, 0x1e, 0x26, 0xc0, 0x3c, 0xae, 0xa6, 0x2d, 0xbd,
+ 0x1f, 0xa8, 0xab, 0x3d, 0x77, 0x2e, 0x52, 0xbd, 0x5a, 0x73, 0xe0, 0xbd,
+ 0xde, 0x2d, 0x1b, 0xbe, 0x24, 0xa9, 0x6a, 0xbd, 0x27, 0xee, 0x15, 0xbd,
+ 0xa2, 0xa9, 0xd4, 0x3c, 0xe2, 0x4e, 0x6a, 0x3d, 0x40, 0x48, 0x83, 0xbc,
+ 0x85, 0xb9, 0xa4, 0x3d, 0xef, 0x90, 0x33, 0x3d, 0x8e, 0xbb, 0x80, 0xbd,
+ 0xa5, 0x08, 0x01, 0xbe, 0x28, 0xaf, 0x40, 0xbd, 0x76, 0xaf, 0x9f, 0xbd,
+ 0x7d, 0x14, 0xe7, 0xbd, 0xe4, 0xae, 0xd8, 0x3a, 0x58, 0x14, 0xb1, 0x3d,
+ 0x70, 0x78, 0xc6, 0xbc, 0x95, 0x59, 0x00, 0xbe, 0x40, 0xf5, 0xb7, 0xbd,
+ 0xd7, 0xf1, 0x28, 0x3e, 0x26, 0xa1, 0x1e, 0xbe, 0x4f, 0xb4, 0xec, 0xbd,
+ 0x32, 0x8c, 0xac, 0x3d, 0xb6, 0x0d, 0x2b, 0xbd, 0x93, 0x23, 0xdc, 0xbe,
+ 0x0e, 0x6a, 0x1e, 0xbe, 0xde, 0x91, 0x01, 0x3e, 0xb4, 0xd6, 0x49, 0x3c,
+ 0x70, 0x3f, 0x47, 0x3d, 0x74, 0x93, 0xd1, 0x3d, 0xac, 0x4a, 0xf1, 0x3c,
+ 0x69, 0x13, 0x22, 0x3e, 0xc5, 0x1a, 0xd0, 0xbd, 0xc9, 0xb6, 0x96, 0x3d,
+ 0x3d, 0x0c, 0xce, 0xbd, 0x20, 0xa6, 0x1d, 0xbe, 0xc4, 0xfe, 0xbe, 0x3d,
+ 0xe0, 0xb5, 0x86, 0x3d, 0xeb, 0xd1, 0xbb, 0xbd, 0xd6, 0x96, 0x59, 0x3b,
+ 0x84, 0x48, 0xec, 0xbc, 0xbc, 0x08, 0xb0, 0xbd, 0x32, 0x0e, 0x70, 0x3c,
+ 0x0a, 0x1b, 0x87, 0x3d, 0x5d, 0xec, 0xf3, 0xbc, 0x1c, 0x3e, 0x29, 0x3d,
+ 0xe7, 0x5e, 0x97, 0x3d, 0x78, 0x7e, 0xdf, 0xbd, 0x7d, 0xe9, 0xed, 0xbd,
+ 0xa5, 0x9f, 0xb3, 0xbd, 0xfe, 0x18, 0x1b, 0xbe, 0x84, 0xe6, 0x17, 0x3e,
+ 0xe1, 0x97, 0x30, 0xbe, 0x4d, 0x53, 0x36, 0xbe, 0x99, 0xf2, 0x2b, 0xbe,
+ 0xc1, 0xc6, 0x42, 0x3d, 0xba, 0x15, 0x40, 0xbe, 0xd5, 0x9c, 0x1e, 0xbe,
+ 0x35, 0xf4, 0x95, 0xbd, 0x6b, 0xec, 0x27, 0x3e, 0x5f, 0x41, 0x0e, 0x3c,
+ 0x53, 0x1e, 0xc7, 0xbc, 0x57, 0xc9, 0x25, 0x3d, 0xa0, 0x9e, 0x08, 0x3d,
+ 0x3a, 0xc5, 0x5a, 0xbd, 0x2b, 0xbd, 0xee, 0xbd, 0x6f, 0x73, 0x68, 0x3d,
+ 0x45, 0xf4, 0xf5, 0xbd, 0xa0, 0x07, 0xcf, 0x3b, 0x76, 0xab, 0xc2, 0x3c,
+ 0xd0, 0xb1, 0x38, 0xbc, 0xde, 0xa0, 0x27, 0xbc, 0x59, 0x29, 0x0d, 0xbd,
+ 0xb4, 0xef, 0xa8, 0x3d, 0x26, 0xf8, 0x20, 0xbd, 0xc4, 0x2f, 0x0f, 0xbd,
+ 0x01, 0xd0, 0xf1, 0xbd, 0x9a, 0x47, 0xd0, 0x3c, 0x6f, 0x52, 0xe1, 0x3d,
+ 0x8b, 0x5a, 0xa7, 0xbd, 0x7d, 0x25, 0x0f, 0xbd, 0x82, 0x7e, 0x7d, 0x3d,
+ 0x97, 0x36, 0x7f, 0x3d, 0x52, 0x6d, 0xcf, 0x3d, 0x08, 0x4b, 0x03, 0x3e,
+ 0x76, 0x58, 0x8a, 0x3d, 0xd7, 0xfb, 0x3b, 0xbe, 0x34, 0xa6, 0x31, 0xbd,
+ 0x7b, 0x76, 0x3c, 0xbc, 0x61, 0x4b, 0x9b, 0x3d, 0x84, 0x01, 0x96, 0xbc,
+ 0x5e, 0x9d, 0x98, 0xbd, 0xe6, 0x21, 0xe0, 0x3c, 0x02, 0x98, 0x89, 0x3d,
+ 0x8e, 0x44, 0xbc, 0xbd, 0xf8, 0xfe, 0xe4, 0x3d, 0xf1, 0x21, 0x6e, 0xbd,
+ 0xb4, 0xd5, 0xea, 0x3d, 0xe9, 0x69, 0x66, 0x3d, 0xa7, 0x9b, 0x86, 0x3d,
+ 0xb5, 0x53, 0x79, 0xbd, 0x60, 0xb8, 0xe0, 0x3d, 0x77, 0x7d, 0x66, 0x3d,
+ 0x7e, 0x9f, 0xce, 0xbd, 0x4e, 0xdc, 0x40, 0xbe, 0x14, 0xdc, 0x1d, 0x3c,
+ 0x58, 0xbd, 0x42, 0x3d, 0x74, 0xae, 0x07, 0xbe, 0x2a, 0xf0, 0x7d, 0x3d,
+ 0xe2, 0xeb, 0x9f, 0xbd, 0x64, 0x07, 0xcf, 0xbd, 0xb6, 0xfe, 0xcc, 0xbd,
+ 0x76, 0xaf, 0x44, 0xbd, 0xf2, 0x8e, 0xc0, 0x3d, 0x84, 0x62, 0xdd, 0xbc,
+ 0xeb, 0x3a, 0xca, 0x3d, 0x7d, 0xa4, 0x09, 0xbd, 0x8d, 0x51, 0x93, 0xba,
+ 0xb2, 0xff, 0x9f, 0x3c, 0x9a, 0x30, 0x3c, 0xbd, 0x91, 0x40, 0x7a, 0xbd,
+ 0xd1, 0x4b, 0xe2, 0x3d, 0xcd, 0x58, 0x3c, 0x3d, 0x70, 0xfe, 0x87, 0x3d,
+ 0x0d, 0xb8, 0x0f, 0x3e, 0xa7, 0x3a, 0xfe, 0x3b, 0xe4, 0xba, 0x9a, 0xbd,
+ 0x5b, 0x10, 0xae, 0xbd, 0x49, 0x56, 0xd5, 0xbd, 0x3f, 0x0b, 0x56, 0x3c,
+ 0xd6, 0xf5, 0x07, 0xbd, 0x9f, 0x9c, 0xb5, 0xbd, 0x40, 0x13, 0xb9, 0x3d,
+ 0xf0, 0x78, 0xf3, 0x3d, 0x75, 0x0d, 0xe6, 0xbd, 0x77, 0x68, 0x24, 0x3d,
+ 0x70, 0x75, 0xb5, 0x3d, 0xcd, 0xdd, 0x76, 0x3d, 0x4a, 0x38, 0x52, 0xbd,
+ 0x99, 0xfc, 0x9c, 0xbc, 0xf4, 0xbb, 0xf0, 0x3d, 0x55, 0x8b, 0xc4, 0xbe,
+ 0x45, 0x24, 0xc4, 0x3c, 0x04, 0x35, 0x09, 0x3e, 0x72, 0x90, 0xdb, 0xbc,
+ 0x8f, 0xb2, 0x34, 0xbe, 0x84, 0x70, 0xc0, 0x3d, 0x72, 0xda, 0xfd, 0xbd,
+ 0xfd, 0xbb, 0x89, 0x3d, 0x05, 0x21, 0x2e, 0x3d, 0xe5, 0xe9, 0x0b, 0x3e,
+ 0xe7, 0x66, 0x9f, 0x3d, 0xf0, 0x46, 0xba, 0xbc, 0x80, 0xa7, 0xff, 0xbd,
+ 0xa9, 0x07, 0xeb, 0x3b, 0x7d, 0xe6, 0xe3, 0xbd, 0xcc, 0x9c, 0x80, 0xbd,
+ 0xe6, 0xc8, 0x54, 0x3d, 0x5e, 0xa0, 0xd3, 0xbd, 0x28, 0xaf, 0x33, 0xbe,
+ 0xe6, 0x77, 0x36, 0x3e, 0x6e, 0xa0, 0x1e, 0x3e, 0x9c, 0x82, 0x0e, 0x3d,
+ 0xa5, 0xe3, 0xc9, 0x3d, 0x4f, 0x2c, 0x00, 0x3e, 0x0d, 0xc8, 0xbb, 0xbd,
+ 0x05, 0x6f, 0x52, 0xbd, 0x2c, 0x83, 0x43, 0xbd, 0x35, 0x3c, 0xdc, 0xbb,
+ 0x9d, 0x96, 0xfb, 0xbd, 0x17, 0xfb, 0xe8, 0x3c, 0x3c, 0x71, 0x84, 0x3d,
+ 0xbd, 0x50, 0xf2, 0x3d, 0x82, 0xb5, 0x77, 0xbe, 0xf8, 0x4a, 0x6e, 0xbd,
+ 0x4b, 0x87, 0x2d, 0xbc, 0x7f, 0xf0, 0xf5, 0x3d, 0x61, 0xb2, 0x2b, 0x3e,
+ 0x6b, 0x50, 0x50, 0x3c, 0xbe, 0xc3, 0xb3, 0x3d, 0x73, 0xbd, 0xa2, 0xbc,
+ 0x6f, 0x6f, 0x2f, 0xbe, 0xf1, 0x6c, 0x13, 0xbd, 0xc1, 0xd7, 0x58, 0xbd,
+ 0x2d, 0x4e, 0xb7, 0x3d, 0xad, 0xb7, 0x08, 0x3e, 0xce, 0x09, 0x25, 0x3d,
+ 0x4a, 0x3a, 0x1b, 0xbe, 0xac, 0x07, 0x80, 0xbd, 0x79, 0xce, 0x0f, 0xbe,
+ 0xbc, 0x83, 0xf4, 0x3d, 0x55, 0x7c, 0x9c, 0x3d, 0x3a, 0x4f, 0x86, 0xbd,
+ 0xb9, 0xf0, 0x2d, 0xbe, 0xe7, 0xee, 0xee, 0x3d, 0x67, 0xfe, 0x1f, 0xbe,
+ 0x94, 0x7b, 0x1d, 0xbf, 0xd3, 0x7b, 0x34, 0xbf, 0x14, 0x57, 0xe0, 0x3d,
+ 0x60, 0x36, 0x3f, 0x3f, 0x33, 0xea, 0x95, 0xbe, 0x14, 0x5a, 0x9a, 0xbe,
+ 0xaa, 0x0d, 0xe5, 0xbe, 0x15, 0xbc, 0xe7, 0xba, 0x42, 0x27, 0xe3, 0xbd,
+ 0x55, 0xd7, 0x08, 0xbe, 0xa1, 0x17, 0x1d, 0xbe, 0x03, 0x38, 0x0e, 0xbe,
+ 0x42, 0x6a, 0x0c, 0x3f, 0x0f, 0x9f, 0x54, 0xbc, 0xd1, 0x96, 0x20, 0xbe,
+ 0xc5, 0xcf, 0x58, 0x3e, 0xf6, 0x41, 0xbd, 0x3e, 0x9a, 0x12, 0x45, 0x3e,
+ 0xbc, 0xfa, 0x78, 0x3c, 0xf5, 0x6a, 0x4e, 0xbd, 0x14, 0x13, 0x1c, 0xbe,
+ 0x02, 0x54, 0xbe, 0x3e, 0x40, 0x21, 0x5a, 0x3e, 0x08, 0x5d, 0xf6, 0xbe,
+ 0x49, 0x47, 0x57, 0xbe, 0x56, 0xc0, 0xd6, 0x3e, 0xa4, 0x49, 0xa6, 0xbe,
+ 0xd5, 0x60, 0xba, 0x3d, 0x84, 0x1b, 0x20, 0x3d, 0xad, 0xe5, 0xfa, 0xbe,
+ 0x79, 0xcc, 0xcf, 0x3e, 0xe6, 0x96, 0xc5, 0x3e, 0x54, 0xcf, 0xe8, 0x3d,
+ 0x78, 0x36, 0x33, 0x3d, 0x0f, 0x1b, 0xdd, 0xbd, 0x7a, 0xc8, 0x05, 0x3e,
+ 0xa2, 0xcd, 0x18, 0x3d, 0x52, 0x80, 0x37, 0x3e, 0x19, 0x47, 0x06, 0x3f,
+ 0xa7, 0x3c, 0x28, 0x3b, 0x9e, 0x09, 0xe4, 0xbd, 0x17, 0xf7, 0x63, 0x3e,
+ 0x62, 0x75, 0xe3, 0xbe, 0xab, 0xca, 0x28, 0x3d, 0x70, 0x27, 0x9c, 0x3d,
+ 0x81, 0x64, 0x8a, 0x3d, 0xad, 0x25, 0xaa, 0x3e, 0xd5, 0xa4, 0x13, 0xba,
+ 0xbf, 0x13, 0xc1, 0xbe, 0x72, 0x3b, 0x55, 0xbe, 0x17, 0x3f, 0x9a, 0xbe,
+ 0x3f, 0xca, 0x85, 0x3e, 0x24, 0x73, 0xbc, 0x3d, 0x16, 0x12, 0xaa, 0x3e,
+ 0xa5, 0xd6, 0xaf, 0xbe, 0x84, 0x0c, 0x9e, 0x3e, 0xb9, 0x4b, 0xa2, 0x3d,
+ 0x41, 0xa9, 0x0b, 0x3e, 0xa9, 0x04, 0x92, 0xbe, 0xff, 0x6f, 0x12, 0xbd,
+ 0x58, 0x67, 0x46, 0xbe, 0xf9, 0xbf, 0x31, 0xbd, 0x3b, 0xc3, 0x9a, 0x3e,
+ 0x85, 0x92, 0x21, 0xbe, 0xcf, 0xa4, 0x13, 0x3e, 0x31, 0x7e, 0xbd, 0x3e,
+ 0x79, 0x31, 0x98, 0xbe, 0xff, 0x57, 0x0e, 0x3e, 0x7f, 0xd1, 0x10, 0x3e,
+ 0xa2, 0x52, 0x62, 0xbd, 0xc5, 0x33, 0x64, 0x3e, 0xaf, 0xdb, 0x1f, 0xbf,
+ 0x08, 0x1d, 0xd0, 0xbe, 0xf0, 0xb7, 0x3e, 0xbe, 0x39, 0xec, 0x86, 0xbe,
+ 0xe2, 0x2b, 0xc4, 0xbe, 0x39, 0x0f, 0x0f, 0xbd, 0xf7, 0x2a, 0xc4, 0x3d,
+ 0x58, 0x8b, 0xa2, 0xbe, 0x1f, 0xf7, 0x44, 0xbe, 0x9e, 0x21, 0x14, 0xbd,
+ 0xa5, 0xe2, 0x6d, 0x3e, 0xcd, 0x7f, 0xfd, 0x3d, 0x6f, 0x39, 0x2f, 0xbe,
+ 0x17, 0xc1, 0x21, 0xbf, 0xdc, 0x2d, 0x34, 0x3e, 0x2d, 0x01, 0x21, 0x3e,
+ 0x55, 0xb5, 0x4f, 0x3e, 0xd4, 0x9e, 0x8b, 0xbd, 0xba, 0xc4, 0x54, 0x3e,
+ 0x2e, 0xa9, 0x2a, 0xbe, 0x4c, 0x73, 0x8c, 0x3d, 0x58, 0x75, 0x3e, 0x3e,
+ 0x3c, 0x56, 0x92, 0x3d, 0x8f, 0x2b, 0x22, 0x3e, 0x38, 0x44, 0x8a, 0x3d,
+ 0x2f, 0x48, 0xae, 0xbe, 0x2f, 0x41, 0x2f, 0x3f, 0xb6, 0xc5, 0x73, 0x3f,
+ 0xeb, 0xad, 0x24, 0xbc, 0x29, 0xae, 0x41, 0xbc, 0x99, 0xec, 0x56, 0x3e,
+ 0x6f, 0x02, 0xec, 0x3e, 0x63, 0x90, 0x25, 0xbd, 0x42, 0xb6, 0x9e, 0x3d,
+ 0x60, 0x83, 0x0b, 0xbe, 0x04, 0x9b, 0x44, 0x3e, 0x52, 0x3b, 0xbf, 0xbd,
+ 0x48, 0x84, 0x32, 0x3f, 0x3b, 0x78, 0x2e, 0xbf, 0x08, 0xf5, 0xbb, 0xbc,
+ 0x4c, 0xbb, 0x47, 0x3e, 0xc9, 0xfd, 0x2a, 0xbe, 0x14, 0x27, 0xa5, 0x3e,
+ 0xf4, 0x27, 0x08, 0xbe, 0xde, 0x5f, 0x52, 0xbb, 0xe4, 0x2f, 0xe6, 0x3d,
+ 0xb8, 0x24, 0x06, 0x3d, 0xf8, 0x68, 0xd1, 0xbd, 0xa1, 0x3b, 0x6d, 0xbe,
+ 0x0e, 0x00, 0xa0, 0xbe, 0xed, 0x93, 0xa7, 0xbd, 0xc8, 0xc8, 0xde, 0x3d,
+ 0x3b, 0x6a, 0x79, 0x3d, 0xf3, 0x7f, 0xf3, 0xbd, 0x5f, 0x42, 0x0d, 0xbd,
+ 0xff, 0xc0, 0xd5, 0x3c, 0x75, 0x77, 0xa1, 0xbd, 0x90, 0x5d, 0xf9, 0x3d,
+ 0x19, 0xda, 0xd6, 0x3d, 0xe0, 0x69, 0xc3, 0x3c, 0x8c, 0xf0, 0x29, 0xbe,
+ 0x88, 0x16, 0x9b, 0xbb, 0x82, 0x0d, 0xa2, 0xbd, 0xa4, 0x4c, 0xca, 0xbd,
+ 0xf3, 0xcd, 0x8a, 0xbd, 0x71, 0x56, 0x3d, 0xbe, 0xa2, 0xb1, 0x2b, 0x3d,
+ 0x00, 0x76, 0xe7, 0xbd, 0x80, 0x44, 0x2a, 0xbe, 0x53, 0xbe, 0xb2, 0xbc,
+ 0x92, 0xbc, 0xe2, 0xbd, 0x14, 0xcd, 0xa8, 0x3c, 0x77, 0x44, 0x48, 0xbe,
+ 0x6e, 0xf2, 0xfb, 0x3d, 0x03, 0xea, 0x23, 0xbd, 0xf7, 0x5b, 0x07, 0xbe,
+ 0x77, 0x82, 0x03, 0xbe, 0xec, 0xf5, 0xa2, 0xbe, 0x4e, 0x65, 0xbe, 0x3d,
+ 0x35, 0xc2, 0x59, 0xbd, 0xaf, 0xe9, 0x45, 0x3d, 0xfe, 0x1c, 0x42, 0xbe,
+ 0xeb, 0xd9, 0x40, 0xbd, 0x6f, 0xa3, 0xeb, 0x3c, 0xb4, 0x68, 0x14, 0xbd,
+ 0x20, 0x38, 0xa3, 0x3d, 0x34, 0xb7, 0x79, 0xbd, 0xa1, 0x80, 0xfb, 0xbd,
+ 0xf9, 0xe5, 0xcd, 0x3d, 0x61, 0x65, 0x2f, 0x3c, 0xd8, 0x02, 0x68, 0xbd,
+ 0x12, 0x5b, 0x7c, 0xbc, 0x6b, 0xce, 0xcf, 0xbd, 0x8f, 0x02, 0xe7, 0x3d,
+ 0x32, 0x92, 0x0d, 0xbd, 0xd2, 0xfa, 0x3c, 0xbb, 0x3d, 0x14, 0xee, 0x3d,
+ 0x6c, 0x0f, 0xd2, 0x3d, 0xd6, 0x7a, 0xab, 0xbd, 0xda, 0xca, 0x90, 0x3c,
+ 0x21, 0x18, 0xac, 0xbc, 0x1b, 0xd8, 0x6c, 0x3d, 0x3b, 0xf9, 0x6b, 0xbd,
+ 0x84, 0x8d, 0x45, 0xbd, 0x9e, 0x04, 0xba, 0xbd, 0x9a, 0x77, 0xdd, 0xbd,
+ 0xe1, 0x95, 0x21, 0x3d, 0x00, 0x3c, 0x8b, 0xbd, 0x6f, 0xed, 0xa1, 0xbd,
+ 0xe8, 0x3b, 0x68, 0xbd, 0x36, 0x2f, 0x81, 0xbd, 0x13, 0xee, 0xcf, 0x3d,
+ 0xbb, 0xb2, 0x35, 0xbd, 0x3a, 0x22, 0x16, 0xbe, 0x79, 0x04, 0xfb, 0xbd,
+ 0x49, 0xad, 0xbe, 0x3c, 0x0d, 0x87, 0x5f, 0xbe, 0x86, 0x5d, 0x0c, 0xbe,
+ 0x0c, 0x7c, 0x88, 0x3d, 0xb8, 0x1f, 0xe2, 0xbc, 0x42, 0x55, 0x73, 0x3d,
+ 0x0d, 0x4c, 0xe6, 0xbd, 0x39, 0x8b, 0xb2, 0x3d, 0x83, 0x9b, 0x03, 0x3e,
+ 0x12, 0x66, 0xb2, 0x3d, 0x20, 0x6d, 0xbb, 0xbe, 0x76, 0x6e, 0x66, 0xbd,
+ 0x01, 0x29, 0x5f, 0x3d, 0x10, 0x2a, 0xc6, 0xbd, 0x50, 0x4a, 0x8d, 0xbd,
+ 0xa7, 0x3f, 0xd9, 0x3d, 0x90, 0x5e, 0x4a, 0xbe, 0x27, 0x95, 0xe0, 0x3d,
+ 0x56, 0x2e, 0xc9, 0x3b, 0x3d, 0x0a, 0x01, 0xbd, 0xd4, 0xbe, 0xd8, 0xbb,
+ 0x52, 0xd5, 0x97, 0x3d, 0x57, 0x28, 0x2e, 0xbe, 0xf9, 0xc7, 0xbc, 0x3d,
+ 0x6e, 0xab, 0x93, 0xbd, 0xce, 0x75, 0x35, 0xbc, 0x30, 0xad, 0xa9, 0x3d,
+ 0x82, 0x2f, 0xf4, 0x3d, 0x57, 0x29, 0x46, 0xbd, 0xdc, 0x25, 0x22, 0xbd,
+ 0x7c, 0xcc, 0x2e, 0xbd, 0x62, 0x54, 0x9e, 0xbd, 0xf7, 0xe2, 0x25, 0x3d,
+ 0xa2, 0x26, 0xcf, 0xbd, 0x26, 0x5e, 0x28, 0xbe, 0x22, 0x9c, 0xf2, 0xbd,
+ 0x26, 0xe9, 0xb7, 0xbd, 0xe5, 0xff, 0x06, 0xbd, 0xdc, 0x00, 0x9e, 0x3d,
+ 0x91, 0xcd, 0xd5, 0x3d, 0x03, 0x78, 0x66, 0xbc, 0x42, 0x10, 0x61, 0xbe,
+ 0x0a, 0x92, 0xc2, 0xbe, 0xcc, 0x29, 0x42, 0xbc, 0xa8, 0xa8, 0xfd, 0xbd,
+ 0xbf, 0x47, 0x48, 0xbd, 0xbf, 0x18, 0x59, 0xbe, 0x69, 0x24, 0xf1, 0xbd,
+ 0x63, 0x06, 0x9c, 0xbd, 0xac, 0x68, 0x0e, 0xbb, 0x4c, 0xb2, 0xfb, 0xbd,
+ 0x8f, 0xbc, 0x43, 0xbd, 0x96, 0x69, 0x48, 0xbd, 0x14, 0xd6, 0xd4, 0xbe,
+ 0x54, 0x39, 0x22, 0x3e, 0x81, 0x59, 0x25, 0xbe, 0xa5, 0xcc, 0x53, 0xbd,
+ 0x6f, 0xe1, 0x59, 0x3e, 0x42, 0x71, 0x77, 0xbd, 0xad, 0x22, 0x57, 0x3e,
+ 0xb1, 0x65, 0x88, 0xbe, 0xa9, 0x91, 0xce, 0x3d, 0xef, 0x4e, 0xfa, 0xbd,
+ 0xa9, 0xdc, 0x02, 0xbf, 0x76, 0x30, 0xdb, 0x3e, 0x09, 0x50, 0xc7, 0xbc,
+ 0xf6, 0xaf, 0x58, 0xbe, 0xdc, 0x5f, 0x5e, 0x3c, 0x5b, 0x55, 0x8d, 0xbd,
+ 0x1b, 0x6e, 0x2d, 0x3e, 0x41, 0x67, 0x89, 0x3c, 0x1c, 0x60, 0x4d, 0x3e,
+ 0x4f, 0xc8, 0xd4, 0x3e, 0x30, 0x07, 0xe5, 0xbc, 0x4b, 0x7b, 0xed, 0x3d,
+ 0xa1, 0xe4, 0x05, 0x3f, 0xcd, 0x46, 0x0a, 0x3a, 0xba, 0x2e, 0x81, 0x3e,
+ 0xdb, 0x04, 0xc1, 0xbe, 0x5d, 0x6f, 0xb7, 0x3c, 0x18, 0xe2, 0x76, 0xbd,
+ 0xb4, 0xdb, 0x2a, 0xbc, 0x64, 0xae, 0x3f, 0x3e, 0x60, 0x1d, 0x2f, 0xbc,
+ 0x26, 0xa8, 0xfb, 0xbd, 0xf1, 0x88, 0x1d, 0xbe, 0x10, 0x30, 0xce, 0xbe,
+ 0x0b, 0xe8, 0x5d, 0xbe, 0x5b, 0x5a, 0x1d, 0xbe, 0x98, 0x1d, 0xe3, 0x3e,
+ 0xb7, 0xb5, 0x46, 0xbe, 0x82, 0xf5, 0x3c, 0xbe, 0x2d, 0x08, 0x44, 0xbe,
+ 0xef, 0x93, 0xef, 0xbd, 0xba, 0x4a, 0x99, 0xbe, 0xdd, 0x74, 0x06, 0xbd,
+ 0xed, 0x3f, 0xf2, 0x3e, 0xe7, 0xa1, 0xc3, 0xbc, 0xc2, 0x4d, 0x9a, 0xbe,
+ 0x17, 0xef, 0xe2, 0xbb, 0xa1, 0x93, 0xb7, 0x3e, 0xad, 0xae, 0x7f, 0x3d,
+ 0x4c, 0xca, 0x10, 0x3e, 0xe1, 0xd2, 0xaf, 0xbe, 0xb0, 0xa3, 0x2d, 0xbe,
+ 0x62, 0xe6, 0xbe, 0xbe, 0x57, 0xdc, 0xbe, 0x3e, 0xfe, 0x83, 0xbb, 0xbe,
+ 0x3a, 0x70, 0x11, 0x3f, 0x47, 0x57, 0x6b, 0xbe, 0xc2, 0x7a, 0xb0, 0x3e,
+ 0x3b, 0xae, 0x3e, 0x3e, 0x43, 0x9c, 0x35, 0xbe, 0x29, 0xfd, 0x2c, 0xbe,
+ 0x19, 0xc8, 0x6f, 0x3e, 0xea, 0x9c, 0x66, 0x3c, 0x76, 0x92, 0xed, 0x3d,
+ 0x3d, 0xd9, 0xb9, 0xbe, 0x00, 0xaf, 0xa7, 0xbc, 0x89, 0xb1, 0xa5, 0x3e,
+ 0x78, 0xeb, 0x05, 0x3f, 0x66, 0xca, 0xc0, 0xbd, 0x20, 0xd6, 0x8b, 0xbd,
+ 0x2d, 0xc2, 0x76, 0xbd, 0xfd, 0x77, 0xf1, 0xbd, 0x03, 0xeb, 0xcf, 0xbe,
+ 0x59, 0xeb, 0xf9, 0x3d, 0x0a, 0x88, 0x70, 0x3c, 0xbb, 0x61, 0xa4, 0x3e,
+ 0x1c, 0x4e, 0x9d, 0x3b, 0x5b, 0x05, 0xa4, 0xbe, 0x42, 0x73, 0x93, 0xbe,
+ 0xdb, 0xea, 0x99, 0x3e, 0x13, 0xaf, 0x3d, 0xbe, 0x58, 0x73, 0xf8, 0xbe,
+ 0xfc, 0xcd, 0xb0, 0xbe, 0x89, 0xb9, 0x34, 0xbe, 0x06, 0x7e, 0x23, 0xbe,
+ 0x99, 0xcd, 0x26, 0x3e, 0x33, 0x48, 0x27, 0x3e, 0xd4, 0xa9, 0x95, 0x3e,
+ 0x69, 0xd7, 0xab, 0x3e, 0xf6, 0x1e, 0xb9, 0x3d, 0x0c, 0x98, 0xb1, 0x3d,
+ 0xf3, 0x75, 0x93, 0xbe, 0xce, 0xa8, 0xb0, 0xbe, 0x19, 0xba, 0x03, 0xbe,
+ 0x04, 0xcc, 0x91, 0x3d, 0xfe, 0x56, 0x81, 0x3e, 0x2b, 0x05, 0x53, 0xbd,
+ 0x86, 0xa4, 0x42, 0xbe, 0x64, 0x11, 0x15, 0x3e, 0x5b, 0x2e, 0xb8, 0xbe,
+ 0x5e, 0x05, 0x8a, 0x3c, 0xa6, 0x69, 0x05, 0xbf, 0x3d, 0xb6, 0x69, 0xbd,
+ 0xa1, 0xdd, 0xb2, 0x3e, 0x69, 0xc1, 0x5c, 0x3e, 0x5a, 0x32, 0x71, 0x3c,
+ 0xc2, 0x7b, 0x93, 0x3c, 0xd5, 0xee, 0x9f, 0xbb, 0x8f, 0x71, 0xcc, 0xbe,
+ 0x6e, 0x1c, 0x34, 0x3d, 0xc8, 0x62, 0xbd, 0x3d, 0xcb, 0x79, 0xa3, 0xbc,
+ 0xbf, 0x0f, 0x5f, 0xbe, 0xad, 0xd1, 0x38, 0xbd, 0x0f, 0x41, 0xfb, 0x3d,
+ 0x9a, 0x9e, 0x20, 0xbd, 0xf2, 0xfe, 0x4f, 0x3d, 0x08, 0xfc, 0x50, 0xbd,
+ 0x5e, 0xe0, 0xfb, 0xbd, 0xbc, 0xc5, 0x9f, 0xbd, 0x6e, 0xea, 0x16, 0xbe,
+ 0xf1, 0x94, 0xca, 0x3c, 0x38, 0xff, 0xfb, 0xbd, 0x23, 0xff, 0x19, 0xbe,
+ 0xac, 0x64, 0x48, 0x3d, 0x1f, 0xcd, 0x10, 0xbe, 0x4d, 0x76, 0xe1, 0xbd,
+ 0xa1, 0x93, 0x23, 0x3e, 0x8f, 0xcf, 0x96, 0xbd, 0x64, 0x34, 0x0a, 0x3d,
+ 0x83, 0xf2, 0xed, 0x3d, 0x9e, 0x84, 0xe4, 0x3d, 0x1a, 0xa4, 0x48, 0xbd,
+ 0x95, 0xb4, 0x83, 0xbd, 0x86, 0x3f, 0x07, 0xbe, 0x42, 0xf1, 0x0c, 0x3c,
+ 0xb5, 0x42, 0x29, 0xbc, 0x17, 0xd8, 0x90, 0xbd, 0xde, 0xdd, 0xac, 0xbc,
+ 0xce, 0xb6, 0x8c, 0x3d, 0xc0, 0x81, 0x33, 0xbe, 0x4d, 0x4b, 0xdd, 0x3d,
+ 0x21, 0x55, 0xf6, 0x3d, 0xa3, 0x6b, 0x16, 0x3e, 0xb5, 0x02, 0x14, 0x3e,
+ 0xbd, 0x68, 0x66, 0xbd, 0xf0, 0x7a, 0xb5, 0xbd, 0xce, 0xdf, 0xc6, 0x3d,
+ 0x00, 0x8b, 0x2b, 0xbd, 0x37, 0x93, 0xb8, 0xbc, 0x9a, 0x15, 0x18, 0x3e,
+ 0xf7, 0x68, 0x27, 0xbe, 0x26, 0xc1, 0x1a, 0xbc, 0x56, 0xaf, 0x2c, 0x3c,
+ 0x45, 0x15, 0x4f, 0xbd, 0x83, 0x3f, 0xe3, 0x3d, 0xae, 0x1d, 0xd8, 0xbd,
+ 0x69, 0x24, 0x65, 0xbd, 0x7b, 0x26, 0x0e, 0x3e, 0x9f, 0x63, 0x44, 0x3d,
+ 0x97, 0x29, 0x4c, 0x3d, 0xf7, 0x54, 0x17, 0xbd, 0x32, 0x67, 0x30, 0xbe,
+ 0xfc, 0xf3, 0xd7, 0x3d, 0x7c, 0xb6, 0xe8, 0x3d, 0xa9, 0x69, 0xb1, 0x3d,
+ 0x43, 0x72, 0xec, 0x3d, 0x73, 0x6c, 0xa2, 0x3d, 0x3e, 0x90, 0x17, 0xbe,
+ 0xa3, 0x12, 0xbf, 0xbc, 0x02, 0xfe, 0x1b, 0xbc, 0x26, 0x9e, 0x07, 0x3e,
+ 0xa0, 0xa9, 0x7d, 0xbd, 0x08, 0xe4, 0x43, 0x3d, 0x30, 0xc1, 0x42, 0xbe,
+ 0x01, 0x59, 0x0e, 0xbe, 0x12, 0x3c, 0x9f, 0x3d, 0xce, 0xa0, 0x46, 0x3e,
+ 0x2a, 0x6c, 0xe0, 0xbd, 0xb2, 0x26, 0xa4, 0x3d, 0x54, 0xe0, 0xd4, 0x3d,
+ 0xcd, 0xa0, 0x1b, 0x3c, 0xee, 0x33, 0x52, 0x3d, 0xc1, 0x3f, 0xe5, 0x3d,
+ 0xdd, 0xa4, 0x8d, 0xbd, 0x4e, 0x46, 0x8c, 0x3d, 0x44, 0x0c, 0x58, 0x3d,
+ 0x03, 0xf5, 0x26, 0xbe, 0x9b, 0xcd, 0xbb, 0xbd, 0x66, 0xe8, 0x75, 0x3d,
+ 0xab, 0x83, 0xac, 0x3d, 0xe5, 0xd8, 0x09, 0x3c, 0x66, 0x5a, 0x8b, 0x3d,
+ 0xd3, 0xba, 0x9c, 0xbd, 0xde, 0xfc, 0x2f, 0x3e, 0xc0, 0x09, 0xa7, 0xbd,
+ 0x71, 0xf9, 0x1b, 0xbe, 0xa8, 0xf1, 0x7c, 0xbd, 0xcc, 0xd7, 0xf8, 0xbb,
+ 0x19, 0x3a, 0xe5, 0x3c, 0xef, 0x23, 0x0f, 0x3d, 0x15, 0xed, 0x95, 0xbc,
+ 0x74, 0x46, 0x1d, 0xbd, 0xa4, 0x9f, 0x5d, 0x3d, 0xee, 0x21, 0x15, 0xbd,
+ 0xf4, 0x64, 0x3a, 0x3d, 0xfb, 0xbf, 0x80, 0xbe, 0x82, 0xf0, 0xb5, 0xbd,
+ 0x18, 0x48, 0x09, 0x3e, 0x33, 0xa7, 0x31, 0x3d, 0xff, 0x16, 0x14, 0x3e,
+ 0x3b, 0x81, 0x00, 0xbe, 0x82, 0x7b, 0x7c, 0xbd, 0x54, 0x10, 0xce, 0x3d,
+ 0xbb, 0x81, 0x23, 0xbe, 0x2d, 0x87, 0xd5, 0x3c, 0x3f, 0x12, 0x0f, 0x3e,
+ 0x12, 0x2b, 0xb9, 0xbd, 0xa3, 0xcf, 0x1f, 0x3e, 0x5f, 0x2f, 0xe0, 0x3d,
+ 0x6e, 0xac, 0x00, 0xbd, 0xe5, 0x08, 0x0a, 0xbe, 0xc9, 0xf0, 0x39, 0xbe,
+ 0xe3, 0xce, 0xd0, 0x3d, 0x71, 0xdc, 0xe0, 0xbd, 0x7a, 0xfe, 0xe1, 0x3d,
+ 0x55, 0xbd, 0xc4, 0x3d, 0xcd, 0xcd, 0x44, 0x3e, 0xe9, 0x04, 0xad, 0x3d,
+ 0xc3, 0xf1, 0x3d, 0x3d, 0x36, 0xb8, 0x0a, 0xbe, 0xe3, 0x88, 0x5f, 0xbd,
+ 0x38, 0x7e, 0xaa, 0x3d, 0xd4, 0x54, 0x88, 0xbd, 0x1b, 0xf4, 0xda, 0xbc,
+ 0x49, 0x1e, 0x07, 0x3d, 0x05, 0xe9, 0x2a, 0xbe, 0xb2, 0x68, 0x1e, 0xbe,
+ 0x7c, 0x19, 0x05, 0xbe, 0x37, 0x8e, 0x47, 0xbd, 0xc1, 0x9f, 0x11, 0xbc,
+ 0x23, 0xfe, 0x82, 0x3d, 0x6e, 0xc3, 0xc3, 0x3d, 0x18, 0xed, 0x54, 0x3c,
+ 0x9d, 0xfe, 0x29, 0x3e, 0x17, 0x54, 0x8b, 0x39, 0x14, 0x77, 0x03, 0x3c,
+ 0x6e, 0x36, 0xf5, 0xbd, 0x42, 0xa5, 0x26, 0x3e, 0xac, 0x60, 0x3d, 0x3d,
+ 0xa0, 0x39, 0xbf, 0xbc, 0x30, 0x55, 0xd5, 0xbd, 0x12, 0x4f, 0xe6, 0x3b,
+ 0x42, 0x29, 0xf0, 0x3d, 0x52, 0x87, 0xa6, 0xbd, 0x94, 0x7e, 0x99, 0xbc,
+ 0x61, 0x70, 0x1b, 0xbe, 0x2b, 0x38, 0xe2, 0xbd, 0x37, 0x46, 0x14, 0x3d,
+ 0x2f, 0x7d, 0x07, 0x3e, 0x3a, 0x65, 0x04, 0x3e, 0x00, 0xa8, 0x80, 0xbd,
+ 0x5d, 0x4e, 0xfd, 0x3b, 0x69, 0xe1, 0x30, 0xbe, 0x06, 0x25, 0x0a, 0x3c,
+ 0x1d, 0xb5, 0x6f, 0xbc, 0x1c, 0xc4, 0x46, 0xbd, 0x5d, 0x6e, 0x94, 0x3b,
+ 0x0b, 0x15, 0x70, 0xbd, 0xa3, 0xcc, 0xde, 0x3b, 0x2f, 0xfc, 0x05, 0xbe,
+ 0x1b, 0xd8, 0xa2, 0xbd, 0x81, 0xfb, 0x6d, 0xbd, 0x60, 0x47, 0x48, 0xbd,
+ 0xbb, 0xca, 0x2a, 0x3c, 0xcf, 0xb9, 0x50, 0x3e, 0xa8, 0x25, 0x84, 0xbd,
+ 0x1c, 0xf1, 0xa1, 0xbd, 0x22, 0xe0, 0x9c, 0xbd, 0xe2, 0x2b, 0x9f, 0xbd,
+ 0xba, 0x5d, 0xba, 0xbc, 0xfa, 0x28, 0xb6, 0xbd, 0x04, 0xd0, 0x04, 0xbd,
+ 0xcd, 0xe6, 0x9e, 0xbd, 0x15, 0x5e, 0xaf, 0x3d, 0x76, 0x2e, 0x80, 0xbb,
+ 0xa3, 0xf8, 0x28, 0xbc, 0x85, 0xda, 0xd6, 0x3d, 0xf8, 0x38, 0xe7, 0xbd,
+ 0x04, 0x14, 0x77, 0x3c, 0x40, 0x9a, 0x6f, 0x3d, 0x89, 0xf7, 0xa5, 0xbe,
+ 0x01, 0xe3, 0x37, 0xbe, 0x1a, 0xd9, 0x4b, 0xbd, 0x12, 0xdd, 0xd9, 0x3d,
+ 0xca, 0x3a, 0x13, 0xbe, 0xa3, 0xf3, 0xca, 0x3c, 0x81, 0x4b, 0xb2, 0x3a,
+ 0xeb, 0x1b, 0xfc, 0x3d, 0x1a, 0xb4, 0xd5, 0x3d, 0x95, 0x5d, 0x24, 0x3e,
+ 0xba, 0xfe, 0x21, 0xbe, 0x30, 0x8f, 0xd5, 0xbd, 0x2b, 0x6a, 0x0b, 0xbe,
+ 0xf1, 0xfc, 0xe5, 0xbc, 0x41, 0x24, 0xe2, 0xbd, 0x7a, 0x15, 0xc9, 0x3d,
+ 0x99, 0x6b, 0xcb, 0x3d, 0xd0, 0x2c, 0xe1, 0x3d, 0x47, 0xf4, 0xbf, 0x3d,
+ 0xa9, 0x50, 0x20, 0x3d, 0xe9, 0x2b, 0x94, 0x3c, 0x58, 0x50, 0xac, 0x3d,
+ 0x77, 0x72, 0x40, 0x3d, 0xb9, 0xc7, 0xc1, 0x3d, 0xa9, 0x52, 0xa1, 0x3d,
+ 0xb4, 0xe0, 0x78, 0xbc, 0xcd, 0x21, 0x04, 0xbe, 0x71, 0xb5, 0x39, 0x3d,
+ 0xfa, 0xd2, 0xd0, 0xbd, 0x20, 0xd9, 0x55, 0xbd, 0xda, 0x73, 0x99, 0x3d,
+ 0x79, 0x91, 0xc2, 0xbc, 0x67, 0xd9, 0x3f, 0xbe, 0x53, 0xb3, 0x53, 0xbd,
+ 0x89, 0xa9, 0x18, 0x3e, 0xbf, 0x82, 0x7f, 0x3d, 0xcd, 0xf5, 0x64, 0xbd,
+ 0x7f, 0x43, 0x04, 0xbe, 0xad, 0x4b, 0x17, 0x3e, 0x7e, 0xca, 0x44, 0xbc,
+ 0xcb, 0x44, 0x71, 0x3d, 0xc8, 0xa6, 0xc8, 0x3d, 0x75, 0x36, 0xc9, 0x3d,
+ 0x2f, 0xdc, 0x18, 0xbe, 0x07, 0xbe, 0x13, 0x3e, 0x5d, 0xb5, 0xc7, 0xbc,
+ 0xf9, 0xfb, 0xa7, 0xbd, 0xf5, 0x1e, 0xeb, 0x3d, 0xc3, 0x93, 0x5f, 0xbe,
+ 0x16, 0x70, 0x5c, 0xbc, 0x20, 0xd1, 0x90, 0xbd, 0x7a, 0x41, 0xf1, 0x3d,
+ 0x44, 0x85, 0x0e, 0xbe, 0x33, 0xd8, 0x43, 0x3d, 0x56, 0x97, 0x19, 0x3e,
+ 0x08, 0x4a, 0xdf, 0xbe, 0xc8, 0xc1, 0x07, 0xbe, 0xc5, 0xc8, 0xc1, 0x3d,
+ 0xed, 0x27, 0x13, 0x3e, 0x76, 0xba, 0x95, 0xbc, 0x12, 0x24, 0xaf, 0x3e,
+ 0xa5, 0x4f, 0xdb, 0xbc, 0xe9, 0x74, 0x0f, 0xbe, 0xaa, 0x78, 0x7f, 0xbe,
+ 0x75, 0x70, 0x0a, 0xbe, 0x69, 0x79, 0x2f, 0xbd, 0xfd, 0x12, 0x48, 0x3d,
+ 0x77, 0x5b, 0xc3, 0x3d, 0x2c, 0xd0, 0xb2, 0xbc, 0x80, 0x15, 0xf4, 0xbd,
+ 0x4a, 0x35, 0x7f, 0x3e, 0x7d, 0x79, 0x13, 0xbe, 0x8e, 0xa4, 0x71, 0x3d,
+ 0xe2, 0x0e, 0xf7, 0xbd, 0x42, 0xdc, 0xe1, 0xbe, 0x11, 0x5f, 0x3e, 0x3d,
+ 0xf7, 0x62, 0xa7, 0x3e, 0xdd, 0x2e, 0x88, 0x3e, 0x54, 0xa0, 0xda, 0xbe,
+ 0xf0, 0x41, 0x09, 0xbe, 0xfc, 0xce, 0x5f, 0x3e, 0xfe, 0xe8, 0xf8, 0xbd,
+ 0xe1, 0x65, 0x95, 0xbd, 0x3f, 0x33, 0x8a, 0xbd, 0xcb, 0xa6, 0x55, 0xbe,
+ 0x40, 0x42, 0x65, 0x3e, 0xb7, 0xb8, 0xdd, 0x3d, 0xa5, 0x6b, 0x77, 0x3e,
+ 0xfd, 0x45, 0x09, 0x3e, 0x97, 0x00, 0xd5, 0x3e, 0x4d, 0x26, 0x5c, 0x3e,
+ 0x31, 0xd4, 0x02, 0x3e, 0x07, 0x7d, 0xdb, 0x3d, 0x10, 0x5a, 0xca, 0x3c,
+ 0x70, 0x79, 0xaa, 0x3c, 0xef, 0xf2, 0x30, 0xbe, 0xfc, 0x4f, 0x21, 0x3c,
+ 0x53, 0xe9, 0x5f, 0x3e, 0x10, 0xc5, 0x61, 0x3e, 0xb7, 0x3e, 0x1d, 0x3e,
+ 0xbb, 0x0b, 0x29, 0x3e, 0x65, 0xe0, 0x9f, 0x3e, 0x30, 0x05, 0x95, 0x3d,
+ 0x5e, 0xfd, 0x47, 0xbe, 0x0f, 0x96, 0x3e, 0x3e, 0x21, 0x2b, 0x19, 0x3e,
+ 0x7e, 0x31, 0x4b, 0x3e, 0x42, 0x51, 0xfa, 0x3c, 0xcf, 0x70, 0x9f, 0x3e,
+ 0xed, 0x1e, 0x97, 0xbd, 0xac, 0x51, 0x3a, 0x3e, 0xc9, 0x08, 0x0c, 0x3d,
+ 0x1e, 0x4a, 0x0b, 0x3e, 0x0e, 0x2c, 0x9f, 0xbe, 0x16, 0x46, 0x1d, 0x3e,
+ 0x4b, 0xcc, 0x53, 0xbe, 0x28, 0xd1, 0xd9, 0x3d, 0x50, 0xc9, 0x02, 0xbe,
+ 0x0f, 0x63, 0x9e, 0xbd, 0x3f, 0xdf, 0x0d, 0xbe, 0xcf, 0x75, 0x73, 0xbe,
+ 0x09, 0x3b, 0x3f, 0xbe, 0xc4, 0x2e, 0xf0, 0x3d, 0x9d, 0xc7, 0x04, 0x3e,
+ 0x75, 0x98, 0xa5, 0xbe, 0xf1, 0xd3, 0x80, 0x3b, 0x57, 0xff, 0xe4, 0xbe,
+ 0x17, 0x9c, 0x5b, 0xbd, 0xe1, 0x5e, 0x1c, 0xbe, 0x00, 0xb8, 0x1e, 0xbe,
+ 0x31, 0x85, 0xa3, 0xbe, 0xfc, 0x31, 0x0f, 0x3e, 0xe0, 0x04, 0x87, 0x3d,
+ 0x7a, 0xd8, 0xcf, 0xbe, 0xd5, 0x4c, 0xcc, 0xbe, 0x2d, 0x3a, 0x0e, 0x3e,
+ 0xe2, 0x63, 0xec, 0x3d, 0xaf, 0xf8, 0x02, 0x3e, 0xa5, 0x9e, 0x2b, 0xbe,
+ 0x22, 0x30, 0x38, 0xbe, 0x52, 0x7c, 0x10, 0x3e, 0x78, 0x3f, 0x58, 0x3d,
+ 0x1e, 0x66, 0x21, 0x3e, 0x3a, 0x63, 0x03, 0x3f, 0xe0, 0x9b, 0x01, 0x3e,
+ 0x7e, 0xab, 0x16, 0x3e, 0x86, 0x6c, 0x37, 0x3d, 0xa8, 0x28, 0xa0, 0xbe,
+ 0xb9, 0x24, 0xe5, 0xbe, 0x7f, 0x0e, 0x3d, 0x3e, 0x13, 0xd0, 0xde, 0xbd,
+ 0x7d, 0xfd, 0xb7, 0x3d, 0x18, 0xec, 0x32, 0x3f, 0x9e, 0xfc, 0x7c, 0x3d,
+ 0xb5, 0xd6, 0x33, 0xbe, 0x82, 0x0e, 0x65, 0xbe, 0x98, 0x8c, 0xf0, 0x3e,
+ 0x9d, 0x4a, 0x90, 0x3d, 0xf6, 0x7f, 0x3c, 0xbc, 0x8e, 0x8d, 0x98, 0xbe,
+ 0xb3, 0x44, 0xa2, 0x3d, 0x60, 0xde, 0xef, 0x3e, 0x61, 0x61, 0xd0, 0xbd,
+ 0xe6, 0x51, 0x02, 0xbe, 0x98, 0x76, 0x2f, 0xbe, 0x9f, 0xb9, 0x88, 0x3e,
+ 0x2b, 0x61, 0x4e, 0x3e, 0xbf, 0x17, 0xa4, 0x3c, 0xf7, 0xdb, 0x42, 0xbd,
+ 0x92, 0xe5, 0x2f, 0xbe, 0xeb, 0xa9, 0x76, 0x3d, 0x97, 0x02, 0x14, 0xbd,
+ 0x32, 0xb0, 0x95, 0x3d, 0x96, 0x3d, 0xff, 0x3d, 0x20, 0x80, 0x2d, 0xbe,
+ 0x2f, 0x97, 0x9d, 0xbe, 0x02, 0x8d, 0x6b, 0xbd, 0xf1, 0xde, 0x84, 0x3d,
+ 0xfa, 0x2a, 0x12, 0x3c, 0x0d, 0x64, 0x93, 0x3d, 0x1d, 0x12, 0x89, 0xbc,
+ 0x6e, 0x5b, 0x03, 0xbe, 0x66, 0xcc, 0xf9, 0xbc, 0x65, 0x3c, 0xa7, 0x3d,
+ 0x6b, 0xa9, 0xd9, 0x3c, 0x75, 0xac, 0xc2, 0x3d, 0x60, 0xd6, 0xe6, 0xbd,
+ 0x68, 0x8b, 0xa6, 0x3d, 0x71, 0xd2, 0x0a, 0x3e, 0x37, 0x8c, 0xd9, 0xbd,
+ 0x68, 0xaa, 0x75, 0x3d, 0x7e, 0x6c, 0xe5, 0xbd, 0x6c, 0x0d, 0x22, 0x3d,
+ 0xe6, 0xed, 0x24, 0xbd, 0x42, 0x22, 0x39, 0xbe, 0x89, 0x4c, 0xbb, 0xbd,
+ 0x1d, 0x75, 0xb6, 0x3d, 0x36, 0xf5, 0xe4, 0xbd, 0x9a, 0x13, 0x24, 0xbe,
+ 0xfd, 0x94, 0xc5, 0xbd, 0x8f, 0xea, 0xdc, 0xbd, 0x6a, 0x63, 0x00, 0x3e,
+ 0xe7, 0x1d, 0xc0, 0x3d, 0x0c, 0x40, 0xa9, 0xbe, 0x49, 0x77, 0xd0, 0xbd,
+ 0xdd, 0x8b, 0x9f, 0xbd, 0x40, 0xe7, 0xe4, 0x3d, 0x9d, 0x31, 0xf1, 0xbd,
+ 0xa4, 0xd6, 0x9e, 0x3c, 0x3e, 0xf4, 0x07, 0x3e, 0xd3, 0x84, 0x1a, 0x3b,
+ 0x5d, 0x62, 0x90, 0xbd, 0x78, 0x17, 0x60, 0x3d, 0x56, 0x4a, 0x20, 0x3c,
+ 0xbc, 0xd0, 0xec, 0xbc, 0x56, 0x3e, 0x08, 0x3e, 0xde, 0x3c, 0xb7, 0xbd,
+ 0xc0, 0xc6, 0xed, 0xbd, 0x05, 0xdb, 0x35, 0xbd, 0x1b, 0x90, 0x19, 0xbe,
+ 0x39, 0xdc, 0xcb, 0x3d, 0x28, 0xe1, 0x81, 0xbd, 0x56, 0xdc, 0x0f, 0x3d,
+ 0x76, 0xa0, 0x12, 0xbe, 0x2d, 0x50, 0xbe, 0xbd, 0x4f, 0x21, 0x4f, 0xbe,
+ 0x11, 0xee, 0xa3, 0x3c, 0x36, 0x98, 0xde, 0x3d, 0x4e, 0x12, 0x84, 0x3c,
+ 0xa0, 0xa2, 0x84, 0xbd, 0x22, 0x78, 0x8c, 0x3d, 0xd8, 0x77, 0xd9, 0xbd,
+ 0x92, 0xc4, 0x73, 0x3d, 0x3d, 0xe5, 0x87, 0xbd, 0x33, 0xae, 0x3b, 0x3d,
+ 0x35, 0x0f, 0x91, 0x3d, 0x4c, 0xe2, 0xaa, 0x3d, 0xa2, 0xf5, 0xb2, 0x3d,
+ 0xc4, 0xb6, 0x9c, 0x3d, 0x83, 0x81, 0x08, 0xbe, 0x6b, 0x65, 0x88, 0x3b,
+ 0x65, 0x49, 0xec, 0xbc, 0xa5, 0xdb, 0x65, 0xbe, 0xf2, 0x2c, 0xdb, 0x3d,
+ 0xe9, 0x27, 0xab, 0xbd, 0x6e, 0x75, 0x8a, 0xbd, 0x2a, 0x20, 0x8a, 0xbd,
+ 0xff, 0x79, 0x98, 0x3d, 0x9f, 0x96, 0x62, 0x3d, 0xb6, 0xa3, 0x3a, 0xbd,
+ 0x03, 0xc9, 0x14, 0xbd, 0x53, 0x71, 0xc4, 0xbe, 0x4c, 0x33, 0x4c, 0x3d,
+ 0x85, 0xef, 0x4c, 0xbd, 0x8a, 0x2f, 0xe2, 0xbd, 0xbf, 0x0a, 0xd7, 0xbd,
+ 0x73, 0x48, 0x7a, 0xbd, 0x3a, 0x89, 0x70, 0xbd, 0xce, 0x05, 0xbd, 0x3d,
+ 0xbf, 0xba, 0x90, 0xbd, 0x96, 0xd6, 0x13, 0x3e, 0xc2, 0x9d, 0x98, 0xbd,
+ 0x32, 0x69, 0xe5, 0x3d, 0x32, 0x96, 0x5a, 0xbc, 0x01, 0x06, 0x3c, 0x3c,
+ 0x73, 0x60, 0x3e, 0xbd, 0xf1, 0xc6, 0x8a, 0x3d, 0xc3, 0x0f, 0x9b, 0xbc,
+ 0xea, 0xe8, 0xd2, 0xbd, 0x2d, 0x39, 0x14, 0xbd, 0xfd, 0xce, 0x19, 0xbe,
+ 0x31, 0x0e, 0xe7, 0xbd, 0xe3, 0x78, 0x0d, 0xbe, 0xe3, 0x7f, 0x0d, 0xbd,
+ 0x94, 0x8b, 0x32, 0x3d, 0xf6, 0xf0, 0xf3, 0xbd, 0xff, 0x56, 0x0f, 0x3c,
+ 0xe0, 0xd5, 0xa3, 0xbd, 0x61, 0x33, 0xc0, 0xbd, 0xaa, 0x76, 0x72, 0xbd,
+ 0xf1, 0x64, 0x40, 0xbd, 0x9e, 0x8d, 0x9b, 0xbd, 0x94, 0x5b, 0xc1, 0xbd,
+ 0xbe, 0xb8, 0xc8, 0xbe, 0x9c, 0xce, 0xd3, 0xbb, 0xcd, 0x62, 0x28, 0x3d,
+ 0x0f, 0xb7, 0x81, 0x3c, 0x85, 0xfa, 0xb3, 0xbe, 0xd3, 0x72, 0x90, 0x3d,
+ 0xbd, 0xd8, 0x28, 0xbe, 0xfc, 0x25, 0xc2, 0xbc, 0xe0, 0xf9, 0x19, 0xbd,
+ 0xf8, 0xe5, 0x55, 0xbc, 0x4c, 0x31, 0x64, 0xbe, 0x0a, 0x4a, 0xe0, 0xbe,
+ 0x28, 0x40, 0x7a, 0x3e, 0x35, 0xdf, 0x4b, 0x3d, 0xe5, 0x9c, 0x64, 0x3d,
+ 0x73, 0xda, 0x61, 0x3e, 0x81, 0xc0, 0xde, 0xbb, 0x21, 0x87, 0x63, 0x3e,
+ 0x65, 0x28, 0xae, 0xbe, 0x43, 0xb8, 0xe3, 0x3d, 0xda, 0x85, 0xce, 0xbd,
+ 0xf1, 0xe8, 0x07, 0xbf, 0x97, 0x27, 0x52, 0x3e, 0x43, 0x86, 0xb0, 0x3d,
+ 0x22, 0xc6, 0x99, 0xbe, 0x2b, 0x88, 0x31, 0xbe, 0xb9, 0xd1, 0xa3, 0x3d,
+ 0x12, 0xce, 0xf5, 0xbc, 0xd9, 0x4e, 0xed, 0x3d, 0x2c, 0x30, 0x55, 0x3e,
+ 0x75, 0x84, 0xf5, 0x3e, 0x97, 0xed, 0x20, 0xbb, 0xcf, 0x5e, 0xa0, 0xbd,
+ 0xe2, 0xd7, 0x98, 0x3e, 0x71, 0x6a, 0x2e, 0xbe, 0x28, 0x88, 0x99, 0x3e,
+ 0x03, 0x0f, 0xd8, 0xbe, 0xe3, 0x41, 0x7d, 0x3d, 0xf3, 0x9d, 0x9d, 0xbc,
+ 0xe0, 0x13, 0x0c, 0x3d, 0x1a, 0xd4, 0x09, 0x3e, 0x6d, 0x76, 0x27, 0xbd,
+ 0x61, 0x57, 0xc6, 0xbd, 0x6e, 0x81, 0x17, 0xbe, 0x0b, 0xef, 0x83, 0xbe,
+ 0x77, 0xb2, 0x2a, 0xbe, 0x50, 0xde, 0xc1, 0xbd, 0x0a, 0x06, 0x90, 0x3e,
+ 0x0c, 0x69, 0x59, 0xbc, 0xf1, 0x12, 0xc6, 0xbe, 0x9a, 0xe5, 0x15, 0xbe,
+ 0xab, 0xe1, 0x2c, 0xbe, 0xc8, 0xdf, 0x86, 0xbe, 0x40, 0xe2, 0xcf, 0x3d,
+ 0xdb, 0xa4, 0xc1, 0x3e, 0x8c, 0x21, 0x2f, 0xbb, 0x15, 0x41, 0xc1, 0xbe,
+ 0x18, 0xd9, 0x03, 0xbe, 0xc9, 0x67, 0x82, 0x3e, 0xf6, 0x27, 0x16, 0x3d,
+ 0x3c, 0xd0, 0xe9, 0xbd, 0x33, 0x1d, 0xab, 0xbe, 0x2d, 0x00, 0x6f, 0x3d,
+ 0xea, 0x4e, 0xb2, 0xbe, 0x07, 0xb3, 0xc5, 0x3e, 0x2e, 0x6c, 0xb7, 0xbe,
+ 0x73, 0x8d, 0x10, 0x3f, 0xa3, 0x6d, 0x8d, 0xbe, 0x8a, 0xe6, 0x95, 0x3e,
+ 0xb3, 0x7c, 0x8e, 0x3e, 0x79, 0xcc, 0x8b, 0xbe, 0x71, 0x14, 0x99, 0xbc,
+ 0x3d, 0x3d, 0x2f, 0x3e, 0xa6, 0x71, 0xe3, 0x39, 0xa2, 0x6f, 0x50, 0x3e,
+ 0x92, 0xdc, 0x4f, 0xbe, 0x13, 0xdc, 0xc7, 0xbd, 0x81, 0x41, 0xb7, 0x3e,
+ 0x85, 0xaa, 0xdc, 0x3e, 0x57, 0x8f, 0xe4, 0xbd, 0x10, 0xc5, 0xaa, 0x3d,
+ 0x98, 0xb6, 0x06, 0x3e, 0xf2, 0x7d, 0x84, 0x3d, 0x29, 0xc3, 0x96, 0xbe,
+ 0x86, 0xdc, 0x3c, 0x3d, 0x79, 0xa4, 0xdd, 0x3b, 0x9b, 0x78, 0xd5, 0x3e,
+ 0x96, 0xf4, 0x34, 0x3e, 0xd7, 0xa6, 0xb9, 0xbe, 0xdd, 0x84, 0xc6, 0xbe,
+ 0x5b, 0xb1, 0xa5, 0x3e, 0xda, 0x62, 0xcc, 0xbd, 0x74, 0x2a, 0xeb, 0xbe,
+ 0x4f, 0xdd, 0xf1, 0xbd, 0x7a, 0x19, 0x85, 0xbe, 0xf2, 0x18, 0x38, 0xbe,
+ 0x1e, 0x1c, 0x06, 0x3d, 0xd7, 0xbf, 0x43, 0x3d, 0xbf, 0xfe, 0xbe, 0x3e,
+ 0xbd, 0x54, 0x93, 0x3e, 0x64, 0xee, 0xa1, 0x3d, 0xbb, 0x67, 0x6f, 0x3d,
+ 0x9d, 0x95, 0xf8, 0xbe, 0x84, 0x4d, 0x09, 0xbf, 0x4b, 0x80, 0x13, 0xbe,
+ 0x6e, 0x58, 0xc1, 0x3c, 0xba, 0xbe, 0x71, 0x3e, 0xca, 0x81, 0x99, 0xbe,
+ 0x62, 0xae, 0x5e, 0xbe, 0xad, 0x51, 0x64, 0x3d, 0xe8, 0xc2, 0x01, 0xbf,
+ 0x6a, 0x99, 0x2a, 0xbd, 0x03, 0x97, 0xeb, 0xbe, 0x4e, 0x58, 0x1a, 0x3d,
+ 0xc1, 0x36, 0xca, 0x3e, 0x6f, 0xdf, 0x00, 0x3e, 0xfe, 0x70, 0x3a, 0xbe,
+ 0x46, 0x2b, 0x04, 0x3e, 0x39, 0xc2, 0x78, 0x3d, 0xeb, 0xfd, 0xb7, 0xbe,
+ 0x77, 0x76, 0xd3, 0xbd, 0x32, 0x7e, 0xa1, 0x3d, 0x08, 0x22, 0x37, 0x3c,
+ 0xef, 0x69, 0x2e, 0xbe, 0xaf, 0xa9, 0x87, 0x3c, 0xea, 0x97, 0x8a, 0xbc,
+ 0xc2, 0xe6, 0x75, 0x3e, 0x7c, 0x9e, 0x8d, 0xbb, 0x9a, 0x0a, 0xc8, 0xbd,
+ 0xbc, 0xb4, 0xa6, 0x3d, 0x3e, 0x9f, 0x07, 0xbe, 0x8a, 0x00, 0x2c, 0xbe,
+ 0xa0, 0x1c, 0x0f, 0x3d, 0x67, 0x58, 0x1f, 0xbe, 0xde, 0x89, 0xfb, 0xbd,
+ 0xfb, 0xed, 0x0f, 0x3e, 0x84, 0x82, 0x0a, 0xbe, 0x57, 0xc9, 0x45, 0x3d,
+ 0x5a, 0xae, 0xd9, 0x3d, 0xd7, 0xc8, 0xae, 0xbd, 0x99, 0x44, 0xa3, 0x3d,
+ 0x06, 0x57, 0x60, 0xbe, 0x5d, 0xd1, 0x4e, 0xbe, 0x24, 0x69, 0xd7, 0x3c,
+ 0x7b, 0xec, 0xee, 0xbd, 0x61, 0x18, 0xcd, 0x3c, 0xad, 0xbc, 0xbb, 0x3d,
+ 0x69, 0xb4, 0x27, 0xbd, 0x15, 0x71, 0xcb, 0xbd, 0x2b, 0xb6, 0x1e, 0x3d,
+ 0x9f, 0x7d, 0x4e, 0x3d, 0x50, 0xca, 0x9d, 0xbc, 0x92, 0x0c, 0x10, 0xbe,
+ 0xf3, 0x1a, 0x05, 0x3e, 0xb1, 0x21, 0xcd, 0x3b, 0x19, 0xf2, 0x65, 0xbd,
+ 0x08, 0x62, 0xe0, 0x3d, 0xe3, 0xf4, 0xf2, 0xbd, 0x63, 0xae, 0x13, 0xbe,
+ 0xcf, 0x60, 0x9d, 0xbd, 0x72, 0xfb, 0xd9, 0x3d, 0xd8, 0x4c, 0x85, 0x3d,
+ 0xde, 0x3d, 0x5b, 0xbe, 0x2b, 0x9c, 0xbc, 0x3c, 0x21, 0x97, 0x7a, 0xbd,
+ 0xdc, 0x13, 0x3e, 0xbe, 0xdc, 0x29, 0x46, 0x3c, 0xfb, 0x9e, 0xef, 0xbd,
+ 0x59, 0xac, 0xf3, 0x3d, 0x70, 0x49, 0xe0, 0x3d, 0xa9, 0xf8, 0x3a, 0x3d,
+ 0x11, 0x0a, 0xff, 0x3d, 0x42, 0x19, 0x54, 0xbd, 0x88, 0xd7, 0x12, 0xbd,
+ 0x16, 0x0d, 0x5a, 0x3d, 0x87, 0x45, 0x03, 0x3e, 0x1f, 0x52, 0xdf, 0x3c,
+ 0xc4, 0x60, 0xac, 0xb8, 0x40, 0x05, 0xd1, 0xbd, 0x32, 0xf8, 0xd8, 0xbd,
+ 0xaf, 0xb8, 0x97, 0x3d, 0x9b, 0xa5, 0x9a, 0x3d, 0xf4, 0x8a, 0xa0, 0xbd,
+ 0x69, 0xb8, 0xe3, 0x3d, 0x24, 0x59, 0x59, 0x3d, 0x68, 0x7a, 0x5f, 0xbe,
+ 0x79, 0x1a, 0xa8, 0xbd, 0xc9, 0x26, 0xc5, 0x3d, 0x7b, 0xba, 0x6d, 0x3d,
+ 0x96, 0x1e, 0x6c, 0xbd, 0xd8, 0xb6, 0x4d, 0x3e, 0x74, 0x68, 0x5e, 0x3e,
+ 0xf1, 0xc0, 0x19, 0x3e, 0x95, 0x96, 0x92, 0x3d, 0x03, 0x41, 0xb1, 0xbd,
+ 0x72, 0x94, 0xa6, 0xbc, 0xba, 0xf0, 0x08, 0xbd, 0xd5, 0x87, 0x11, 0x3c,
+ 0xd2, 0x96, 0x5c, 0xbe, 0x1a, 0xdf, 0x6c, 0x3d, 0xab, 0xdd, 0xcd, 0x3d,
+ 0x53, 0x26, 0x49, 0x3d, 0xf7, 0x17, 0x21, 0xbd, 0xcd, 0x3b, 0x5d, 0x3d,
+ 0x27, 0x6b, 0x62, 0xbd, 0x9c, 0x7c, 0x0f, 0xbe, 0x83, 0x30, 0xe5, 0x3d,
+ 0x40, 0x8e, 0x14, 0x3d, 0x85, 0x95, 0x7f, 0x3d, 0xe1, 0xcc, 0xaa, 0xbc,
+ 0x64, 0x3b, 0xf0, 0x3d, 0x9f, 0x5d, 0xa0, 0x3d, 0x5f, 0xd7, 0xa9, 0xbd,
+ 0xd0, 0xf4, 0x8f, 0xbd, 0x93, 0x0d, 0x50, 0xbe, 0xc5, 0xff, 0xc6, 0xbd,
+ 0x13, 0x17, 0xad, 0xbd, 0xe1, 0x8c, 0x1c, 0xbe, 0xa2, 0xcc, 0x9b, 0xbd,
+ 0xce, 0xab, 0xcd, 0x3d, 0xd1, 0xec, 0xe0, 0xbd, 0xee, 0xd2, 0xcc, 0x3c,
+ 0x03, 0x9e, 0xfa, 0xbd, 0x48, 0xec, 0x04, 0x3e, 0x91, 0x43, 0x7b, 0x3d,
+ 0xd1, 0x81, 0x4d, 0xbe, 0xaf, 0x84, 0xdd, 0xbd, 0x13, 0xa7, 0xc2, 0x3d,
+ 0xde, 0x1f, 0x50, 0xbd, 0x23, 0x8f, 0x21, 0x3e, 0x6f, 0x97, 0xd1, 0xbc,
+ 0xdb, 0xf3, 0x18, 0x3d, 0x47, 0xa3, 0x50, 0xbd, 0xf8, 0xe3, 0x5a, 0x3e,
+ 0x8f, 0x14, 0x9d, 0x3d, 0xcc, 0xe1, 0x3b, 0x3d, 0xa0, 0x3b, 0xa1, 0x3d,
+ 0xdd, 0x7a, 0xac, 0xbd, 0x45, 0x7a, 0x4d, 0x3e, 0x38, 0xfb, 0x35, 0xbe,
+ 0x87, 0xfb, 0x62, 0xbe, 0x32, 0x22, 0xec, 0x3c, 0x42, 0xd6, 0x31, 0xbe,
+ 0xea, 0xf6, 0xd4, 0x3c, 0x49, 0x10, 0x20, 0x3e, 0xc6, 0x2a, 0xf7, 0xbd,
+ 0xdc, 0xaa, 0x29, 0xbd, 0xf6, 0x36, 0xdd, 0xbd, 0x8b, 0x10, 0xae, 0x3d,
+ 0x05, 0x15, 0xbd, 0x3d, 0x8c, 0x22, 0xdb, 0x3d, 0xae, 0x58, 0xf1, 0xbd,
+ 0x93, 0x13, 0x1e, 0x3e, 0xf4, 0xe9, 0x7f, 0x3d, 0xe4, 0x0c, 0x10, 0x3e,
+ 0xd2, 0xaf, 0xeb, 0xbc, 0xc9, 0x85, 0x45, 0xbe, 0xb6, 0xdd, 0x1e, 0x3e,
+ 0x71, 0xf1, 0xa8, 0xbd, 0x4b, 0x70, 0x30, 0xbe, 0x43, 0x71, 0xe4, 0x3d,
+ 0xb5, 0x42, 0x9a, 0x3d, 0x27, 0xeb, 0xe5, 0x3c, 0xee, 0x57, 0xc1, 0xbc,
+ 0x85, 0x61, 0x39, 0x3d, 0x12, 0xfe, 0x2c, 0x3e, 0x15, 0x59, 0xd6, 0x3d,
+ 0x87, 0xde, 0x6a, 0x3d, 0xa0, 0x47, 0x54, 0xbe, 0x34, 0x50, 0x1c, 0x3d,
+ 0x29, 0xaf, 0x11, 0x3e, 0xca, 0x01, 0x93, 0x3d, 0x91, 0xcd, 0x17, 0x3e,
+ 0x8d, 0x91, 0x8a, 0x3d, 0x77, 0x22, 0x37, 0x3d, 0xeb, 0x00, 0xf3, 0x3d,
+ 0x98, 0x60, 0x0e, 0xbe, 0x46, 0x8f, 0xf4, 0x3d, 0x35, 0x0f, 0xa3, 0xbd,
+ 0xc4, 0x03, 0x3e, 0xbe, 0xb4, 0x32, 0x9b, 0xbc, 0x0a, 0x10, 0xb7, 0xbd,
+ 0x44, 0xc7, 0x41, 0xbe, 0xb1, 0x59, 0xa0, 0x3d, 0x73, 0x91, 0x9a, 0x3c,
+ 0xde, 0xaf, 0x19, 0x3d, 0x27, 0x12, 0x26, 0x3e, 0x95, 0x24, 0xe7, 0xbd,
+ 0x11, 0xfd, 0x24, 0x3e, 0xce, 0x79, 0x08, 0xbe, 0x17, 0x48, 0xbd, 0xbd,
+ 0xea, 0xf4, 0xf5, 0x3d, 0x1b, 0xe4, 0xa2, 0x3c, 0x28, 0x7a, 0xfc, 0xbd,
+ 0xd1, 0x31, 0xe2, 0x3c, 0x7a, 0xde, 0xb2, 0x3d, 0x67, 0xf8, 0x04, 0xbe,
+ 0x15, 0x0e, 0x2a, 0x3e, 0x26, 0xba, 0x7d, 0x3d, 0xa6, 0x4e, 0x7e, 0x3d,
+ 0x7e, 0x94, 0xdd, 0x3b, 0x0d, 0x6c, 0xf9, 0xbc, 0xf6, 0x86, 0x3a, 0xbe,
+ 0x4c, 0x1e, 0x75, 0x3d, 0x00, 0x48, 0xf2, 0xbc, 0x26, 0x4c, 0xdc, 0x3d,
+ 0x61, 0xbd, 0x27, 0xbe, 0x0b, 0x47, 0xc9, 0x3c, 0xe5, 0xbb, 0x88, 0x3d,
+ 0xad, 0x8d, 0xf7, 0x3b, 0x7f, 0x79, 0xce, 0xbd, 0xe9, 0x73, 0x05, 0xbd,
+ 0x32, 0x4c, 0xd1, 0x3d, 0xeb, 0x0c, 0x20, 0xbe, 0xe5, 0x16, 0xb2, 0x3d,
+ 0xbf, 0x4d, 0xcf, 0xbd, 0xc9, 0xd8, 0x28, 0xbe, 0xa2, 0xe1, 0xfe, 0xbd,
+ 0x6d, 0x2e, 0x47, 0x3d, 0xfa, 0x3d, 0x0d, 0x3d, 0xe2, 0xcb, 0xe4, 0xbd,
+ 0x33, 0x45, 0xa8, 0x3d, 0xf4, 0xaf, 0x1a, 0x3c, 0xdc, 0x5f, 0x81, 0xbd,
+ 0x56, 0xb0, 0xd4, 0xbd, 0xd8, 0xbe, 0xf5, 0x3d, 0x95, 0x16, 0x88, 0xbc,
+ 0xf6, 0xe1, 0xa2, 0x3d, 0x87, 0xfd, 0x44, 0xbd, 0x3c, 0x43, 0xb5, 0xbb,
+ 0xd6, 0xdb, 0x00, 0xbe, 0xbf, 0x5e, 0x02, 0xbe, 0xb3, 0xb7, 0xeb, 0xbd,
+ 0x09, 0x49, 0xb6, 0x3d, 0x13, 0xd8, 0x35, 0xbe, 0x3a, 0xb2, 0xf2, 0xbd,
+ 0xc9, 0x04, 0x1c, 0xbe, 0x5f, 0x25, 0x91, 0xbc, 0xc5, 0x5b, 0x46, 0xbd,
+ 0x65, 0x9a, 0x8f, 0x3d, 0x40, 0x20, 0xb8, 0x3d, 0xeb, 0x5b, 0xe7, 0xbd,
+ 0xa9, 0xb1, 0x34, 0xbe, 0x88, 0x0e, 0xf9, 0xbc, 0x40, 0xce, 0x5b, 0xbd,
+ 0x4e, 0x27, 0xde, 0xbd, 0xb9, 0xed, 0x2e, 0x3e, 0x7c, 0x28, 0x26, 0x3d,
+ 0xaf, 0x62, 0xa9, 0xbd, 0xf6, 0xe8, 0xe4, 0xbd, 0xca, 0xf0, 0x1f, 0x3d,
+ 0x92, 0xd0, 0x8f, 0x3b, 0xde, 0x7f, 0x1f, 0x3e, 0x01, 0xf8, 0x00, 0x3e,
+ 0x8d, 0x2e, 0x93, 0xbe, 0x14, 0x32, 0x77, 0xbe, 0x8c, 0xf7, 0x34, 0x3d,
+ 0xff, 0xe4, 0xbc, 0xbe, 0x5f, 0x51, 0x5c, 0xbe, 0x33, 0x9f, 0xe1, 0xbd,
+ 0xee, 0xd2, 0x88, 0xbe, 0xd5, 0xb9, 0x45, 0x3e, 0xc5, 0x43, 0xa5, 0x3d,
+ 0xa1, 0x4b, 0x73, 0x3e, 0x2f, 0x03, 0x60, 0x3c, 0x62, 0x37, 0x51, 0x3d,
+ 0x5f, 0x66, 0xbb, 0xbe, 0x54, 0x2d, 0x12, 0x3e, 0xc3, 0x8b, 0x04, 0x3e,
+ 0x1a, 0xfb, 0x71, 0x3e, 0x45, 0xd1, 0xbc, 0x3d, 0xde, 0xe5, 0xd6, 0xbe,
+ 0x1a, 0x7b, 0xaa, 0x3e, 0xd1, 0x26, 0x29, 0x3e, 0xeb, 0x9f, 0x6c, 0x3e,
+ 0x64, 0xc2, 0x6b, 0x3e, 0x0f, 0xaf, 0x3e, 0xbf, 0x6e, 0xbd, 0x2f, 0x3d,
+ 0xe1, 0xe6, 0x0d, 0x3f, 0x5a, 0x89, 0x3f, 0xbe, 0x5e, 0xc5, 0x19, 0xbf,
+ 0x85, 0x65, 0x13, 0x3e, 0xdd, 0x26, 0xa9, 0x3e, 0x4f, 0x15, 0x96, 0xbe,
+ 0x98, 0x74, 0x64, 0xbe, 0xd7, 0x06, 0x48, 0xbe, 0x61, 0xe7, 0x67, 0xbc,
+ 0x32, 0x9f, 0x6c, 0x3d, 0x25, 0x4e, 0xa3, 0x3e, 0xfc, 0x51, 0xf6, 0x3e,
+ 0x68, 0xf7, 0x9b, 0x3d, 0xae, 0xa0, 0xf0, 0x3e, 0xed, 0x65, 0x43, 0x3e,
+ 0x7d, 0x93, 0x0e, 0x3e, 0xe1, 0x2d, 0xb5, 0x3d, 0xcc, 0x1c, 0x86, 0xbd,
+ 0xd4, 0xdf, 0x7c, 0xbe, 0xed, 0x80, 0x6a, 0xbd, 0x5d, 0x1e, 0x2d, 0x3e,
+ 0x98, 0x13, 0x3e, 0x3c, 0x2b, 0x06, 0x95, 0x3e, 0x15, 0x91, 0x61, 0x3e,
+ 0x28, 0xce, 0x30, 0x3e, 0xc3, 0x5d, 0x3a, 0x3e, 0x38, 0xa8, 0x87, 0x3d,
+ 0x68, 0xe8, 0x66, 0xbd, 0x53, 0xce, 0x1a, 0x3f, 0x79, 0xc4, 0x6c, 0xbe,
+ 0x7b, 0x47, 0x3b, 0xbe, 0x5c, 0x54, 0x56, 0xbe, 0x54, 0x07, 0x83, 0x3e,
+ 0xd6, 0xf9, 0xf7, 0xbd, 0xd6, 0xf9, 0x9d, 0x3d, 0xc6, 0xb1, 0x68, 0x3d,
+ 0x81, 0x3d, 0x2a, 0x3e, 0x7c, 0xaf, 0x11, 0xbe, 0x90, 0xa5, 0x07, 0x3f,
+ 0x16, 0x63, 0xc2, 0xbe, 0x18, 0x04, 0xfa, 0x3c, 0x22, 0x7e, 0xa0, 0x3d,
+ 0xe4, 0xc9, 0xa3, 0xbe, 0xd0, 0xb2, 0x1c, 0xbd, 0x2e, 0xa5, 0x37, 0xbe,
+ 0x04, 0xdd, 0x86, 0xbb, 0xf3, 0x59, 0x5b, 0x3d, 0x7f, 0xdb, 0xab, 0xbc,
+ 0x9f, 0x0a, 0xbd, 0xbe, 0x80, 0x58, 0xbd, 0xbd, 0x77, 0x3f, 0x69, 0xbe,
+ 0x5a, 0x66, 0x7a, 0xbd, 0xf2, 0x1d, 0x11, 0xbd, 0x1b, 0x02, 0x24, 0xbe,
+ 0x3d, 0xba, 0x6a, 0xbe, 0x1c, 0x4a, 0x96, 0x3e, 0xb6, 0x4f, 0xd7, 0x3d,
+ 0x01, 0x45, 0xc8, 0xbd, 0x91, 0x52, 0x84, 0xbe, 0x9f, 0xf2, 0x34, 0xbd,
+ 0x63, 0x94, 0x84, 0xbe, 0xd0, 0x8a, 0x7a, 0xbd, 0xff, 0x70, 0x4e, 0x3e,
+ 0xd2, 0xc9, 0xbb, 0xbd, 0xa5, 0x53, 0x98, 0x3d, 0xce, 0xfe, 0xd3, 0x3d,
+ 0x2c, 0x41, 0x52, 0x3e, 0x5c, 0x75, 0xd2, 0x3d, 0x24, 0xd1, 0xef, 0x3d,
+ 0xc6, 0xac, 0xf5, 0x3d, 0x7c, 0x3b, 0x0f, 0xbe, 0x00, 0xd7, 0x15, 0xbf,
+ 0x65, 0x6b, 0x92, 0x3c, 0x30, 0x20, 0x8c, 0x3e, 0xfe, 0xcf, 0xc0, 0x3b,
+ 0x16, 0x9b, 0xb6, 0x3e, 0x78, 0xc2, 0x94, 0x3e, 0x2a, 0x60, 0x34, 0xbf,
+ 0xcc, 0x99, 0x9d, 0xbd, 0x26, 0x06, 0xee, 0xbe, 0x18, 0xba, 0x9b, 0x3e,
+ 0xda, 0x85, 0x52, 0x3e, 0xc9, 0x9f, 0xe0, 0xbd, 0xdd, 0x55, 0xda, 0x3d,
+ 0x8e, 0x18, 0x8d, 0x3c, 0x4d, 0x72, 0xc7, 0x3e, 0x80, 0xab, 0xd2, 0x3d,
+ 0x12, 0xb1, 0xdb, 0xbe, 0x36, 0x51, 0xf9, 0xbd, 0xdc, 0x06, 0x64, 0x3e,
+ 0xca, 0x23, 0x29, 0x3c, 0x1e, 0x76, 0xb0, 0xbe, 0x50, 0x38, 0x9b, 0xbc,
+ 0x39, 0x9a, 0x0d, 0xbe, 0xa0, 0xf8, 0xbe, 0xbd, 0xfe, 0xf9, 0xd8, 0x3d,
+ 0xeb, 0xf1, 0x9e, 0x3d, 0x72, 0x49, 0xc8, 0xbd, 0x46, 0xf0, 0xba, 0xbd,
+ 0x18, 0x69, 0x57, 0xbe, 0x70, 0x3c, 0x2e, 0x3e, 0x46, 0xbd, 0x27, 0x3d,
+ 0x55, 0xaa, 0x89, 0xbd, 0xbd, 0x86, 0x26, 0xbd, 0x12, 0x17, 0x26, 0x3d,
+ 0xdf, 0xeb, 0x8f, 0x3d, 0x89, 0xe7, 0x09, 0xbe, 0x08, 0x69, 0xce, 0xbd,
+ 0xe6, 0xd5, 0x7e, 0x3d, 0x83, 0x1b, 0xa1, 0x3b, 0x51, 0x34, 0x66, 0xbd,
+ 0x1e, 0x98, 0xad, 0x3b, 0xfe, 0xaa, 0xe5, 0xbd, 0x0d, 0x54, 0x51, 0xbd,
+ 0xe4, 0x2b, 0x06, 0xbd, 0x45, 0xb5, 0xb9, 0xbe, 0x35, 0x58, 0x0b, 0xbe,
+ 0x53, 0xad, 0xe0, 0xbd, 0xb2, 0x05, 0xb0, 0xbc, 0x0f, 0x43, 0xd4, 0xbd,
+ 0xe6, 0x0d, 0x12, 0x3e, 0xbe, 0xda, 0xad, 0x3d, 0xe2, 0x6c, 0x94, 0xbd,
+ 0xb8, 0xa2, 0xf6, 0xbd, 0x9d, 0x12, 0x12, 0xbc, 0x48, 0x5f, 0xac, 0x3b,
+ 0x93, 0xbe, 0x21, 0x3d, 0xc3, 0xa6, 0x36, 0xbe, 0xd8, 0xd7, 0xff, 0x3d,
+ 0xe3, 0xf0, 0xfc, 0xbd, 0xc3, 0xf2, 0x8a, 0x3c, 0x2b, 0xd0, 0x2b, 0xbe,
+ 0xea, 0xc0, 0xef, 0xbd, 0xae, 0x15, 0xc2, 0x3d, 0x01, 0x41, 0xec, 0xbd,
+ 0xdb, 0x11, 0x25, 0xbe, 0x6d, 0xff, 0xd6, 0x3b, 0xeb, 0x04, 0x23, 0xbe,
+ 0xd8, 0x26, 0xf2, 0x3d, 0xbb, 0x9b, 0x23, 0xbd, 0x7a, 0x6f, 0x7d, 0x3d,
+ 0x98, 0x9b, 0xa4, 0x3d, 0x6e, 0xd7, 0x34, 0x3d, 0xea, 0xea, 0x07, 0x3d,
+ 0xcd, 0xdf, 0x3e, 0xbd, 0xd0, 0x1f, 0x1b, 0x3e, 0x6b, 0xae, 0x6e, 0xbc,
+ 0xe4, 0x79, 0x53, 0x3d, 0xc3, 0x1d, 0x5e, 0x3d, 0xfc, 0xea, 0x0e, 0x3d,
+ 0x8b, 0x24, 0x3c, 0xbc, 0x80, 0x4c, 0x24, 0xbe, 0xf4, 0xfe, 0xe9, 0xbd,
+ 0x17, 0xc5, 0xbf, 0x3d, 0x1c, 0x89, 0x7f, 0xbd, 0xfb, 0x11, 0x88, 0x3d,
+ 0xd4, 0x02, 0x8a, 0xbd, 0x00, 0x1a, 0xc3, 0xbd, 0xe4, 0x43, 0x34, 0x3d,
+ 0x5e, 0x35, 0xb8, 0x3c, 0x35, 0x38, 0x2f, 0x3c, 0x5d, 0xbf, 0x20, 0xbe,
+ 0x73, 0x3f, 0xac, 0xbc, 0x3e, 0x17, 0xf6, 0xbd, 0x27, 0xb7, 0x31, 0xbe,
+ 0x22, 0xfe, 0x74, 0xbd, 0x1f, 0x07, 0xba, 0xbb, 0xc1, 0xf7, 0xcb, 0x3d,
+ 0x23, 0x29, 0x4b, 0x3c, 0x52, 0xee, 0x33, 0xbd, 0x81, 0x68, 0xc0, 0x3d,
+ 0x73, 0x45, 0x19, 0xbe, 0x4b, 0xe7, 0x10, 0x3e, 0x57, 0xfc, 0x7a, 0xbd,
+ 0x4b, 0x30, 0xc6, 0xbd, 0x9a, 0xc3, 0xc1, 0xbe, 0x5d, 0x01, 0x7b, 0x3d,
+ 0xe3, 0x07, 0x02, 0xbe, 0xb8, 0x5a, 0x3d, 0xbe, 0x5d, 0xac, 0x14, 0x3e,
+ 0x0d, 0xd1, 0x9b, 0x3c, 0x58, 0x8d, 0x11, 0xbe, 0x95, 0xe9, 0xbc, 0x3d,
+ 0xeb, 0xdd, 0x1e, 0xbe, 0xfe, 0x76, 0xce, 0xbc, 0x8a, 0x50, 0xde, 0x3d,
+ 0x3f, 0x65, 0x69, 0x3d, 0x09, 0xaa, 0x92, 0xbe, 0xdc, 0xfd, 0xd8, 0xb9,
+ 0xd8, 0x91, 0x01, 0xbe, 0x7f, 0x20, 0x4c, 0xbc, 0x02, 0x2c, 0xfd, 0xbd,
+ 0xd9, 0x16, 0x5e, 0xbd, 0x15, 0x0e, 0x09, 0x3d, 0xad, 0xe6, 0x4e, 0x3d,
+ 0x4a, 0x9e, 0x00, 0x3d, 0xc6, 0x7b, 0x93, 0x3d, 0x8a, 0x6f, 0x16, 0xbe,
+ 0xcb, 0x91, 0x87, 0xbd, 0x86, 0x7f, 0xc2, 0xbc, 0x9b, 0x67, 0xc1, 0xbd,
+ 0x0e, 0x86, 0xf0, 0x3d, 0x8d, 0xb2, 0x88, 0xbc, 0xe5, 0x24, 0x22, 0x3d,
+ 0x4a, 0xdf, 0xe3, 0x3d, 0x9d, 0x86, 0x1e, 0x3e, 0xe7, 0x50, 0xf2, 0x3d,
+ 0x70, 0xb8, 0x8c, 0xbe, 0x7e, 0x5a, 0xaf, 0x3d, 0xcf, 0x01, 0xb7, 0xbc,
+ 0x69, 0x3a, 0x2a, 0xbd, 0xd6, 0x1a, 0x00, 0xbe, 0xd3, 0xdb, 0xa5, 0xbd,
+ 0x7b, 0xe7, 0x0c, 0xbe, 0x90, 0xc4, 0x64, 0x3e, 0x90, 0x60, 0xf3, 0xbd,
+ 0x88, 0x77, 0x78, 0xbe, 0xce, 0x3a, 0xa9, 0xbd, 0x4f, 0x4d, 0x41, 0xbe,
+ 0x35, 0xab, 0x25, 0x3e, 0x59, 0xbf, 0xa9, 0x3d, 0x02, 0xe0, 0xbb, 0x3d,
+ 0x7b, 0x2a, 0xb7, 0x3e, 0x24, 0xf2, 0x51, 0x3d, 0xca, 0x77, 0x7e, 0x3e,
+ 0x67, 0x04, 0xa0, 0xbe, 0x2f, 0x97, 0xd7, 0xbd, 0x7a, 0x27, 0xf7, 0xbc,
+ 0xbe, 0xca, 0xfd, 0xbe, 0xa4, 0x80, 0xa1, 0x3e, 0x05, 0x66, 0x6d, 0x3e,
+ 0x1a, 0x03, 0xe0, 0xbd, 0x2c, 0xce, 0x75, 0xbd, 0xc2, 0x58, 0x5b, 0xbd,
+ 0xbc, 0x2d, 0x89, 0x3e, 0x5e, 0x00, 0x14, 0xbe, 0xd9, 0xc5, 0x4a, 0x3e,
+ 0x9f, 0x7b, 0xff, 0x3e, 0x47, 0x50, 0xed, 0xbb, 0x73, 0xa0, 0x8c, 0xbc,
+ 0x2f, 0xde, 0x05, 0x3f, 0x51, 0x85, 0x1a, 0xbe, 0x48, 0x4c, 0x4d, 0x3e,
+ 0x65, 0x9e, 0xd6, 0xbe, 0xe7, 0x0c, 0xff, 0xbc, 0x81, 0x1b, 0x7c, 0xbe,
+ 0x9a, 0x6b, 0xcb, 0xbd, 0xfb, 0x88, 0x24, 0x3e, 0x53, 0x50, 0xf2, 0xbc,
+ 0x5b, 0x54, 0x63, 0xbe, 0x6d, 0xab, 0xa0, 0xbe, 0xcf, 0x29, 0x36, 0xbe,
+ 0x7a, 0x9d, 0x8a, 0xbe, 0x40, 0xb6, 0x41, 0xbe, 0xec, 0xdb, 0xa1, 0x3e,
+ 0xb8, 0x00, 0xde, 0x3c, 0xb3, 0x9f, 0x82, 0xbe, 0xf4, 0xa4, 0x91, 0xbe,
+ 0xdf, 0x08, 0xac, 0xbe, 0x0c, 0x17, 0x9b, 0xbe, 0x32, 0x52, 0x3b, 0xbd,
+ 0xa2, 0x5d, 0xf6, 0x3e, 0x83, 0x95, 0x37, 0x3e, 0x61, 0x0b, 0x88, 0xbe,
+ 0x9b, 0x1e, 0xc1, 0xbd, 0xf1, 0x45, 0xc0, 0x3e, 0xd5, 0x05, 0x3f, 0xbe,
+ 0x2b, 0x4a, 0x7a, 0x3c, 0x14, 0x3a, 0xcf, 0xbd, 0x3c, 0x2a, 0x41, 0xbd,
+ 0xa1, 0xb2, 0xbd, 0xbd, 0x39, 0x3f, 0xe6, 0x3d, 0xd6, 0x5c, 0xcb, 0xbe,
+ 0x11, 0x95, 0x15, 0x3f, 0x51, 0xb1, 0x38, 0xbe, 0xf8, 0x1d, 0x29, 0x3e,
+ 0xa9, 0x72, 0xc3, 0x3e, 0x12, 0x77, 0x76, 0xbe, 0x15, 0xe3, 0x0e, 0x3d,
+ 0xe8, 0x82, 0x52, 0x3d, 0xb0, 0x8b, 0xd0, 0xbd, 0x13, 0xe3, 0x68, 0x3e,
+ 0x80, 0x97, 0x56, 0xbe, 0x8a, 0x8c, 0x8d, 0xbd, 0x18, 0xb0, 0x37, 0x3e,
+ 0x59, 0xb0, 0x06, 0x3f, 0xcd, 0x17, 0xaf, 0x3c, 0xd1, 0xdd, 0xd8, 0xbd,
+ 0x33, 0x08, 0x94, 0xbd, 0xb5, 0xaf, 0x7e, 0x3c, 0x5d, 0x76, 0x46, 0xbe,
+ 0x28, 0xb4, 0x83, 0xbc, 0xd0, 0x4c, 0xbd, 0x3d, 0xff, 0xe3, 0x76, 0x3e,
+ 0x95, 0xf7, 0x94, 0x3d, 0xe6, 0xbb, 0x9b, 0xbe, 0x7a, 0x9d, 0x9a, 0xbe,
+ 0x6f, 0xcc, 0xab, 0x3e, 0x59, 0x8b, 0x79, 0xbd, 0x6f, 0xc0, 0x8f, 0xbe,
+ 0x9c, 0xc7, 0x91, 0xbe, 0x79, 0xe7, 0x48, 0xbe, 0x77, 0xcc, 0x40, 0xbe,
+ 0x0d, 0x12, 0x54, 0x3d, 0x78, 0x05, 0xb8, 0x3d, 0xa9, 0x48, 0xd7, 0x3d,
+ 0x08, 0x9f, 0x34, 0x3e, 0xab, 0xf1, 0x9e, 0xbd, 0x66, 0x01, 0x1c, 0x3e,
+ 0xa6, 0x6f, 0x37, 0xbe, 0x92, 0xc1, 0xd1, 0xbe, 0x02, 0x4a, 0xa2, 0xbd,
+ 0xf9, 0xe8, 0xef, 0xbd, 0x00, 0xfe, 0x89, 0x3e, 0x4d, 0x0f, 0xd3, 0x3c,
+ 0xd1, 0x28, 0xaf, 0xbd, 0x67, 0x7d, 0x0d, 0xbd, 0x0e, 0xbd, 0xea, 0xbe,
+ 0xa2, 0xc8, 0x14, 0xbd, 0x12, 0x79, 0x09, 0xbf, 0xfe, 0xe5, 0x96, 0x3d,
+ 0xef, 0x35, 0xc9, 0x3e, 0x9d, 0xf4, 0xc5, 0x3e, 0x0c, 0x1a, 0x75, 0x3e,
+ 0x64, 0x06, 0x85, 0xbd, 0xfd, 0x39, 0x5d, 0x3e, 0x22, 0x70, 0x98, 0xbe,
+ 0x63, 0xe1, 0xb0, 0x3d, 0x50, 0xd6, 0x11, 0xbe, 0x00, 0x8b, 0xb7, 0xbd,
+ 0xc9, 0xd1, 0x03, 0xbd, 0xfc, 0x4a, 0x20, 0xbe, 0x84, 0x3c, 0xa6, 0x3d,
+ 0xa6, 0xad, 0x0e, 0x3e, 0x57, 0xfc, 0x11, 0xbd, 0x2a, 0x78, 0x2b, 0x3d,
+ 0x99, 0xf0, 0xe6, 0xbd, 0xf6, 0x3d, 0x9b, 0xbd, 0xde, 0xd8, 0xd9, 0xbd,
+ 0xf5, 0x88, 0xae, 0xbd, 0x70, 0x07, 0x1c, 0xbe, 0xa5, 0xa2, 0xbe, 0xbd,
+ 0x47, 0xfb, 0x24, 0x3e, 0x7e, 0x04, 0xb6, 0x3c, 0x11, 0x72, 0x24, 0x3e,
+ 0x96, 0x78, 0xb8, 0xbc, 0x8f, 0xcc, 0xfe, 0xbd, 0x14, 0x2a, 0xaf, 0x3d,
+ 0x74, 0xfb, 0x23, 0xbe, 0x66, 0x02, 0x3c, 0xbe, 0x5a, 0x8f, 0x20, 0x3d,
+ 0x5b, 0xa1, 0xa9, 0xbd, 0xd7, 0x1d, 0x33, 0xbe, 0x6c, 0xaf, 0x84, 0x3d,
+ 0xa2, 0x4c, 0x99, 0xbc, 0x85, 0x0d, 0x39, 0x3e, 0x5b, 0x8e, 0xc4, 0x3d,
+ 0xfd, 0x95, 0x09, 0x3e, 0xcd, 0xc5, 0x07, 0xbe, 0x11, 0xc9, 0x1e, 0xbe,
+ 0x2c, 0xfc, 0x10, 0x3e, 0x61, 0x22, 0x09, 0xbe, 0xdb, 0x41, 0x5a, 0x3e,
+ 0x04, 0x89, 0x88, 0xbd, 0x76, 0x6a, 0xd6, 0x3c, 0x5e, 0xc0, 0x1d, 0xbd,
+ 0x4c, 0xf3, 0x18, 0xbd, 0xe6, 0xa5, 0x13, 0x3e, 0x88, 0x68, 0x2c, 0x3e,
+ 0xcd, 0x74, 0x32, 0xbe, 0xcd, 0x03, 0xc6, 0x3d, 0xb4, 0xbb, 0x33, 0x3d,
+ 0x62, 0x80, 0xe0, 0xbd, 0xb5, 0xf7, 0x27, 0xbd, 0x2a, 0x7b, 0xa2, 0xbd,
+ 0x6b, 0xa2, 0x12, 0xbe, 0xbb, 0xbd, 0xa6, 0xbb, 0x64, 0x8b, 0xf9, 0x3d,
+ 0x84, 0x5e, 0x75, 0xbd, 0x83, 0x57, 0xb2, 0xbc, 0x9f, 0x11, 0xf8, 0xbb,
+ 0x72, 0x44, 0xf5, 0x3d, 0xba, 0x65, 0x40, 0x3e, 0x55, 0x36, 0x09, 0x3e,
+ 0x18, 0xb4, 0x40, 0x3c, 0x75, 0xfd, 0x18, 0x3e, 0x81, 0x99, 0xca, 0xbc,
+ 0x12, 0x09, 0x92, 0x3c, 0x7a, 0x57, 0x2e, 0x3d, 0x4d, 0xa6, 0x4c, 0x3e,
+ 0xe0, 0x3e, 0x4d, 0xbb, 0x65, 0x08, 0xd7, 0x3d, 0x20, 0x75, 0x96, 0xbe,
+ 0x34, 0x7a, 0x76, 0xbd, 0xcb, 0x2a, 0xb8, 0xbd, 0x5e, 0x65, 0xfe, 0x3d,
+ 0xdd, 0xe6, 0xcf, 0xbd, 0xee, 0x50, 0xe6, 0xbb, 0x65, 0x2b, 0x54, 0x3e,
+ 0xf6, 0xed, 0xb6, 0x3b, 0xe3, 0x0d, 0x96, 0xbc, 0xdd, 0x82, 0xcb, 0xbd,
+ 0xe4, 0x42, 0xb3, 0x3d, 0xba, 0x55, 0x0c, 0xbe, 0x28, 0x3b, 0xcc, 0xbb,
+ 0x0c, 0xea, 0x10, 0xbe, 0x56, 0xd2, 0x13, 0xbd, 0xb7, 0x8b, 0xe5, 0xbc,
+ 0x6e, 0xf2, 0x81, 0x3d, 0x66, 0x6d, 0xe3, 0x3d, 0xc5, 0xa5, 0xbe, 0x3b,
+ 0x1d, 0x45, 0x2f, 0x3d, 0x39, 0xaa, 0x80, 0xbd, 0xf3, 0xf4, 0x13, 0xbc,
+ 0xa9, 0x5f, 0x79, 0xbd, 0xf3, 0x73, 0xc5, 0x3d, 0xf1, 0xc5, 0x0e, 0x3c,
+ 0x1f, 0x1b, 0x7f, 0x3e, 0x16, 0x0c, 0x43, 0xbe, 0xf8, 0xc2, 0xa1, 0x3d,
+ 0x6f, 0x9d, 0x55, 0x3d, 0xaa, 0xd1, 0x24, 0xbd, 0x5f, 0x39, 0x93, 0x3d,
+ 0xe5, 0x7c, 0x45, 0x3d, 0x2a, 0xde, 0x4a, 0xbd, 0xee, 0xb1, 0x30, 0xbe,
+ 0x15, 0x07, 0x53, 0xbe, 0x24, 0xe3, 0xdb, 0xbd, 0xd5, 0x7b, 0x16, 0xbd,
+ 0x48, 0x34, 0xdc, 0xbd, 0xf3, 0x62, 0x8c, 0xbc, 0xc1, 0x21, 0x94, 0x3d,
+ 0x02, 0x95, 0x94, 0x3d, 0xf1, 0x79, 0x31, 0xbe, 0x74, 0x59, 0xe3, 0x3d,
+ 0x8c, 0x59, 0xfd, 0xbd, 0x96, 0x78, 0x53, 0xbd, 0xd3, 0xab, 0xba, 0x3c,
+ 0xad, 0x0d, 0x4a, 0x3d, 0x26, 0x6f, 0x85, 0x3d, 0xeb, 0x4b, 0x59, 0x3d,
+ 0x20, 0x97, 0x9b, 0xbc, 0x1b, 0x20, 0xb0, 0xbd, 0x1c, 0xb8, 0x9b, 0x3d,
+ 0x71, 0xd2, 0x48, 0x3d, 0xd4, 0xd0, 0x29, 0xbe, 0x66, 0x0a, 0x99, 0x3d,
+ 0x20, 0x62, 0x26, 0xbe, 0x9d, 0x88, 0xaa, 0xbd, 0x88, 0xa7, 0x29, 0xbd,
+ 0xd7, 0xe1, 0x1d, 0x3e, 0x52, 0x9a, 0xaa, 0x3d, 0x87, 0x3a, 0xd1, 0x3d,
+ 0xb1, 0x9e, 0x3a, 0xbd, 0x34, 0x37, 0x6c, 0x3d, 0xd6, 0xd1, 0xae, 0x3d,
+ 0xf2, 0x28, 0x5a, 0x3d, 0x56, 0x58, 0x0b, 0xbe, 0xf3, 0xfb, 0x7e, 0xbd,
+ 0x23, 0xec, 0x30, 0x3e, 0x29, 0x0f, 0xf6, 0xbd, 0x6d, 0xcb, 0x56, 0x3e,
+ 0xf8, 0x7f, 0xad, 0x3c, 0x8c, 0x0e, 0xe7, 0x3c, 0xbe, 0x3a, 0xc9, 0xbd,
+ 0xab, 0xeb, 0x2e, 0xbd, 0x36, 0x25, 0xa8, 0x3c, 0x0f, 0xb2, 0xfb, 0xbc,
+ 0xf6, 0x96, 0x42, 0xbe, 0xd7, 0x57, 0x92, 0xbd, 0x9d, 0x8e, 0xa7, 0x3c,
+ 0xb9, 0xbe, 0x57, 0xbd, 0x02, 0x1e, 0x72, 0xbd, 0xd9, 0xb7, 0x88, 0xbd,
+ 0xeb, 0xf8, 0xc1, 0xbc, 0x27, 0xae, 0x69, 0x3d, 0x3b, 0x26, 0x75, 0xbd,
+ 0xb4, 0xce, 0xdf, 0x3d, 0x6e, 0xf6, 0xc4, 0xbd, 0x42, 0xe4, 0xa7, 0x3d,
+ 0xb6, 0x93, 0x73, 0x3d, 0x1e, 0x15, 0x25, 0xbe, 0xa5, 0x72, 0x86, 0x3d,
+ 0xad, 0x0b, 0x0b, 0xbd, 0xcf, 0x16, 0x02, 0x3d, 0x9f, 0xf3, 0x86, 0xbc,
+ 0x51, 0x86, 0x35, 0xbe, 0xac, 0x11, 0x49, 0x3d, 0xf2, 0xe5, 0xd7, 0xbc,
+ 0x5e, 0xdd, 0x65, 0xbd, 0x58, 0xf3, 0xf4, 0xbd, 0xb1, 0x6c, 0x14, 0xba,
+ 0x69, 0xa4, 0xe8, 0x3d, 0x9c, 0xb2, 0x51, 0xbc, 0x6e, 0x80, 0x9c, 0x3d,
+ 0x38, 0x59, 0x11, 0xbc, 0x19, 0xb7, 0xd7, 0xbd, 0xf2, 0xaf, 0x89, 0xbd,
+ 0xc0, 0x56, 0x86, 0x3d, 0x40, 0xc9, 0xe0, 0x3d, 0x7c, 0x1f, 0x72, 0xbc,
+ 0xe3, 0x41, 0xe5, 0xbd, 0x2e, 0x38, 0x56, 0x3d, 0x64, 0x90, 0x74, 0xbd,
+ 0x9d, 0x49, 0xcf, 0xbd, 0x31, 0x18, 0x69, 0x3c, 0xad, 0xfa, 0x6a, 0x3e,
+ 0xf9, 0xac, 0x94, 0x3d, 0x33, 0xea, 0x03, 0x3d, 0xdc, 0xbf, 0xc8, 0xbd,
+ 0x2f, 0x1d, 0xbe, 0xbd, 0x8f, 0x4e, 0x01, 0xbe, 0x23, 0x35, 0x09, 0x3e,
+ 0xb9, 0x25, 0x92, 0xbd, 0x1a, 0xbb, 0x33, 0x3e, 0xb0, 0xdd, 0x68, 0x3e,
+ 0x70, 0xd6, 0xdd, 0x3d, 0xc1, 0xc9, 0xd3, 0x3d, 0x96, 0x6a, 0x73, 0xbc,
+ 0x15, 0x78, 0xe2, 0xbc, 0x4e, 0x9a, 0xdd, 0x3b, 0x2e, 0x39, 0x29, 0xbe,
+ 0x22, 0xd4, 0x86, 0x3c, 0x6c, 0x8b, 0x91, 0xbd, 0x1d, 0x03, 0x20, 0x3e,
+ 0xa4, 0xde, 0xfd, 0xbd, 0xaa, 0x42, 0xf1, 0x3c, 0xa5, 0x23, 0x1a, 0x3d,
+ 0xdf, 0x47, 0x6e, 0x3e, 0xdd, 0x18, 0xa9, 0x3c, 0x15, 0x4c, 0xbd, 0xbd,
+ 0x42, 0x9f, 0xbc, 0xbd, 0x84, 0x30, 0x61, 0x3d, 0x15, 0x0b, 0x64, 0x3d,
+ 0xf0, 0xea, 0x2a, 0x3e, 0xcb, 0x7c, 0xf5, 0xbd, 0x7d, 0x9d, 0x0d, 0x3e,
+ 0x47, 0x16, 0x67, 0x3c, 0x56, 0xb7, 0x2b, 0x3d, 0x11, 0xfc, 0x95, 0x3d,
+ 0xe7, 0x49, 0x7b, 0x3d, 0xd0, 0x03, 0x8e, 0xbd, 0x9b, 0x95, 0xd4, 0xbc,
+ 0x51, 0x17, 0xb9, 0xbd, 0x60, 0xeb, 0x4f, 0xbe, 0x89, 0xf6, 0x0c, 0x3e,
+ 0x1e, 0x64, 0xad, 0x3d, 0x67, 0x4a, 0x2a, 0x3e, 0x97, 0xb8, 0xf1, 0xbd,
+ 0x68, 0xbf, 0x02, 0x3d, 0x5c, 0xe3, 0xa8, 0xbd, 0x66, 0xf0, 0xc5, 0x3c,
+ 0x9b, 0xb3, 0xc0, 0x3d, 0x0d, 0x57, 0xf1, 0xbd, 0x9d, 0x38, 0xf8, 0xbd,
+ 0x49, 0x61, 0x34, 0xbe, 0xad, 0x7b, 0x0e, 0x3c, 0xc8, 0xf6, 0x88, 0x3e,
+ 0xae, 0x06, 0x32, 0xbe, 0x52, 0x48, 0xe2, 0x3c, 0xb0, 0x1e, 0xcf, 0x3d,
+ 0x80, 0x49, 0x93, 0x3d, 0x14, 0x53, 0xfb, 0xbd, 0xdc, 0x84, 0xf1, 0x3d,
+ 0x23, 0x03, 0xcc, 0xbe, 0x18, 0x0f, 0x80, 0xbd, 0x9f, 0xa7, 0x3d, 0xbd,
+ 0x8b, 0x10, 0x2f, 0xbe, 0x3f, 0x84, 0xea, 0x3d, 0xc1, 0x9e, 0x91, 0x3e,
+ 0x37, 0x5e, 0x10, 0x3e, 0x24, 0x6a, 0x5d, 0xbd, 0xde, 0xba, 0x58, 0xbe,
+ 0xd1, 0x74, 0x8c, 0xbe, 0xc4, 0x6b, 0x37, 0xbd, 0x48, 0x85, 0xd1, 0x3c,
+ 0x7e, 0xc8, 0x4c, 0xbe, 0xa6, 0x77, 0xe3, 0x3c, 0x11, 0x31, 0x0f, 0xbe,
+ 0xab, 0xd6, 0xaa, 0x3e, 0x57, 0x67, 0x1c, 0xbe, 0x2b, 0x5f, 0x90, 0x3e,
+ 0x22, 0xc7, 0x7c, 0x3e, 0x66, 0x6d, 0xe1, 0x3e, 0x30, 0xdd, 0x09, 0x3e,
+ 0x01, 0xcf, 0x46, 0x3d, 0x27, 0x1f, 0xce, 0x3e, 0xce, 0x30, 0x19, 0xbf,
+ 0x6b, 0xd0, 0xa3, 0xbc, 0x34, 0x48, 0x82, 0x3e, 0xb4, 0xbf, 0x02, 0x3e,
+ 0x1c, 0x39, 0x74, 0xbe, 0x0f, 0xab, 0xfc, 0xbd, 0xb1, 0x0d, 0x19, 0xbe,
+ 0xd9, 0x45, 0x00, 0x3e, 0xbe, 0x98, 0xcd, 0x3d, 0xe1, 0xd5, 0x9a, 0xbd,
+ 0xfe, 0x01, 0x97, 0x3e, 0x9c, 0x1e, 0x9a, 0x3e, 0xba, 0x68, 0xdf, 0xbc,
+ 0x7c, 0x44, 0x19, 0x3d, 0x0c, 0x1e, 0xb9, 0x3e, 0xe9, 0x11, 0x2a, 0x3e,
+ 0xa1, 0x71, 0x2b, 0x3e, 0x92, 0xeb, 0x8a, 0x3e, 0xc2, 0x2d, 0x19, 0x3e,
+ 0xa1, 0x98, 0xaa, 0xbd, 0xa6, 0x94, 0x9a, 0x3d, 0xc5, 0x9b, 0x06, 0x3f,
+ 0x9d, 0xa3, 0x96, 0x3e, 0x61, 0x48, 0x9e, 0xbd, 0x17, 0x4d, 0xf6, 0xbc,
+ 0x36, 0x0c, 0xab, 0xbd, 0xf1, 0x9b, 0x54, 0x3e, 0x6e, 0xec, 0x9c, 0xbd,
+ 0xa2, 0x3e, 0x95, 0x3b, 0x86, 0xaf, 0x65, 0x3d, 0xe8, 0xba, 0x9b, 0x3d,
+ 0x0b, 0xfd, 0x4e, 0x3d, 0x8e, 0x92, 0x9b, 0x3e, 0xce, 0x45, 0x18, 0xbe,
+ 0x2d, 0x1c, 0x14, 0x3d, 0x43, 0x1d, 0xc3, 0xbe, 0xbf, 0x38, 0xaa, 0x3d,
+ 0x73, 0x33, 0x8c, 0xbe, 0x55, 0xfe, 0x73, 0x3d, 0x41, 0x23, 0xb6, 0x3e,
+ 0xe1, 0x25, 0x60, 0xbe, 0x7f, 0x7d, 0x42, 0xbe, 0xf6, 0x1d, 0x12, 0x3e,
+ 0x0a, 0xb4, 0xd5, 0xbd, 0xdb, 0xb1, 0x8f, 0x3c, 0x37, 0x52, 0x41, 0x3d,
+ 0xc9, 0xf7, 0x11, 0xbf, 0xbd, 0xcf, 0xb0, 0xbd, 0xa9, 0xc8, 0x82, 0x3d,
+ 0x2b, 0xc1, 0x41, 0xbc, 0x87, 0xc8, 0x72, 0xbd, 0x58, 0xa9, 0x9b, 0xbd,
+ 0x63, 0x05, 0xa5, 0xbd, 0x25, 0x9e, 0xc3, 0xbd, 0x19, 0x9c, 0xa1, 0x3e,
+ 0xb3, 0xce, 0x0e, 0xbd, 0x10, 0xfe, 0xc8, 0x3d, 0xb4, 0xad, 0xa1, 0xbc,
+ 0x8e, 0xfe, 0x8c, 0x3e, 0xa9, 0x44, 0xf3, 0x3d, 0x31, 0xaf, 0x27, 0x3e,
+ 0x52, 0x53, 0x51, 0x3e, 0x33, 0x48, 0xf6, 0xbc, 0x30, 0x5b, 0x81, 0x3e,
+ 0xbe, 0x54, 0x34, 0x3e, 0x11, 0xcc, 0xdb, 0xbd, 0xf7, 0xa8, 0x17, 0x3e,
+ 0xe9, 0x94, 0xa4, 0xbd, 0xf9, 0x2f, 0x3a, 0x3d, 0xf3, 0xc7, 0xc6, 0xbe,
+ 0x9b, 0xbc, 0xbe, 0xbd, 0xf2, 0x74, 0x5a, 0xbd, 0x45, 0x29, 0x24, 0xbe,
+ 0x46, 0x3a, 0x2a, 0x3f, 0xb5, 0xdd, 0xb8, 0xbe, 0x46, 0xe2, 0x3a, 0xbe,
+ 0xac, 0x8b, 0x0b, 0xbc, 0x09, 0xb5, 0xd7, 0xbe, 0x57, 0x1b, 0x6f, 0x3e,
+ 0xc9, 0xfb, 0x49, 0x3e, 0xa5, 0xac, 0x00, 0xbd, 0x1c, 0x25, 0x2d, 0x3e,
+ 0xf6, 0x0b, 0xd5, 0x3d, 0x27, 0xd7, 0x6c, 0x3e, 0x4b, 0xc7, 0xcc, 0x3d,
+ 0xeb, 0x2d, 0x6a, 0xbe, 0x3e, 0x54, 0x62, 0xbb, 0xd1, 0x09, 0xa6, 0x3e,
+ 0x6b, 0x50, 0x6c, 0x3e, 0xec, 0x5d, 0xce, 0xbd, 0xc4, 0xa1, 0x89, 0x3e,
+ 0x20, 0xfe, 0xfd, 0xbd, 0x18, 0x09, 0x2c, 0xbe, 0xea, 0x4b, 0x74, 0xbc,
+ 0xbf, 0x6e, 0x7a, 0x3c, 0xff, 0x8e, 0x12, 0x3e, 0x40, 0x7f, 0x81, 0xbe,
+ 0x2a, 0xa3, 0x34, 0xbe, 0x04, 0x2a, 0x83, 0xbd, 0xd3, 0xbc, 0xee, 0xbb,
+ 0xe7, 0x6b, 0xc3, 0x3d, 0xf3, 0x5b, 0x50, 0x3d, 0xd2, 0xde, 0xbd, 0xbd,
+ 0xca, 0xce, 0xbe, 0xbd, 0xbe, 0xc7, 0xbe, 0x3d, 0x9a, 0xcf, 0x58, 0x3d,
+ 0x06, 0x72, 0x10, 0xbe, 0x9c, 0x0e, 0x06, 0x3e, 0x5c, 0x00, 0xfc, 0xbc,
+ 0xce, 0xc7, 0x96, 0xbd, 0x5c, 0x32, 0xb6, 0x3d, 0x28, 0xb1, 0x60, 0xbd,
+ 0x06, 0x91, 0xfe, 0x3d, 0x6f, 0x0c, 0x5b, 0xbe, 0x13, 0x37, 0xa4, 0x3d,
+ 0x26, 0x3a, 0x8e, 0x3c, 0x08, 0xf5, 0xe0, 0xbd, 0x97, 0x24, 0x3b, 0xbd,
+ 0xde, 0x0f, 0xa1, 0xbd, 0xca, 0x2b, 0x85, 0x3d, 0xce, 0x48, 0x24, 0xbe,
+ 0x3e, 0x46, 0x39, 0x3d, 0x05, 0xc6, 0xe1, 0x3d, 0x48, 0x20, 0x87, 0x3d,
+ 0xc3, 0x2a, 0x6a, 0x3d, 0x25, 0xdc, 0x64, 0xbd, 0xa6, 0x25, 0x37, 0x3d,
+ 0x9b, 0x24, 0x8c, 0xbd, 0xc4, 0x3d, 0xc0, 0xbd, 0x3e, 0x3f, 0xcd, 0xbb,
+ 0xc0, 0x79, 0x02, 0x3e, 0x16, 0xde, 0xe9, 0x3c, 0xa7, 0xd3, 0x0d, 0xbd,
+ 0x77, 0xbe, 0x12, 0xbe, 0xf0, 0x02, 0x2b, 0x3d, 0xba, 0x83, 0x9d, 0xbd,
+ 0x55, 0x44, 0x11, 0xbe, 0x72, 0x2e, 0x7b, 0x3d, 0x01, 0xcb, 0x13, 0x3d,
+ 0xd2, 0x6b, 0x7c, 0xbd, 0x38, 0x43, 0xb0, 0xbc, 0x04, 0x0e, 0x26, 0x3d,
+ 0x5c, 0x99, 0x02, 0x3c, 0xd8, 0xcf, 0x01, 0x3e, 0x92, 0x91, 0x94, 0x3d,
+ 0xf6, 0x77, 0xf8, 0x3d, 0x84, 0x4d, 0x9b, 0xbc, 0x21, 0xf7, 0xac, 0x3d,
+ 0x00, 0x6f, 0x47, 0xbd, 0x78, 0x2c, 0xf3, 0xbd, 0x3e, 0x43, 0x97, 0x3d,
+ 0xd8, 0xbc, 0xeb, 0xbd, 0x31, 0xb6, 0x04, 0xbd, 0x5a, 0x18, 0x89, 0x3d,
+ 0xc5, 0xd9, 0x50, 0x3d, 0x4e, 0x88, 0x08, 0x3e, 0x54, 0xe2, 0xa9, 0x3d,
+ 0x2f, 0x6d, 0x94, 0x3d, 0xf5, 0xdf, 0xc6, 0xbc, 0x9e, 0xfb, 0xb9, 0xbd,
+ 0x51, 0xf4, 0xaa, 0x3d, 0x0a, 0xec, 0xa1, 0xbe, 0x1e, 0xad, 0x22, 0x3c,
+ 0x93, 0x46, 0xcb, 0x3a, 0x49, 0xab, 0x94, 0xbc, 0x40, 0xb4, 0x93, 0xbd,
+ 0x56, 0x0b, 0x8e, 0xbd, 0x86, 0x44, 0xec, 0xbd, 0xea, 0xbd, 0x69, 0x3c,
+ 0x91, 0xc0, 0x34, 0xbc, 0xe2, 0xf9, 0xf4, 0x3d, 0x90, 0x89, 0xde, 0x3c,
+ 0x34, 0x18, 0x84, 0x3d, 0x13, 0x8e, 0xb8, 0xbe, 0x0e, 0xd2, 0xc9, 0xbc,
+ 0xcc, 0x3f, 0x3b, 0x3d, 0xa4, 0x66, 0xdb, 0xbd, 0xae, 0x81, 0x56, 0x3d,
+ 0xd4, 0xc0, 0x88, 0x3d, 0x1e, 0xc0, 0xa1, 0x3d, 0x89, 0x36, 0x92, 0xbb,
+ 0x27, 0x22, 0xcf, 0xbc, 0x47, 0xec, 0x15, 0xbe, 0x50, 0x80, 0x14, 0x3c,
+ 0x36, 0xcc, 0x3b, 0xbd, 0x47, 0x76, 0x43, 0xbd, 0x35, 0xc4, 0xbb, 0x3d,
+ 0xed, 0x4f, 0x12, 0xbd, 0xfa, 0xc0, 0x09, 0x3c, 0xb0, 0xfe, 0xf0, 0xbd,
+ 0x5b, 0x59, 0x89, 0xbd, 0x79, 0x74, 0xaf, 0x3d, 0xfc, 0x2b, 0x6a, 0xbd,
+ 0x7b, 0x55, 0xa8, 0x3c, 0x9b, 0xdc, 0x96, 0xbd, 0x17, 0x21, 0x6a, 0xbd,
+ 0x5e, 0xff, 0x0d, 0x3d, 0x83, 0xc2, 0x18, 0x3d, 0x87, 0x39, 0x43, 0xbc,
+ 0xb7, 0x41, 0xf4, 0xbd, 0xa9, 0x86, 0x82, 0x3d, 0xbc, 0x9f, 0x1e, 0xbd,
+ 0x4c, 0x32, 0x0f, 0xbe, 0xfc, 0xa2, 0x64, 0xbc, 0x36, 0xb9, 0x0b, 0x3e,
+ 0x29, 0x7e, 0xd3, 0xbe, 0xa1, 0x18, 0x05, 0xbe, 0xf8, 0x1d, 0xc7, 0xbd,
+ 0x98, 0x32, 0xbb, 0x3b, 0xba, 0xd6, 0x4e, 0xbe, 0x20, 0x20, 0x00, 0x3e,
+ 0xb9, 0x60, 0x22, 0xbd, 0xd1, 0xec, 0x85, 0x3d, 0x90, 0xa3, 0xf5, 0xbd,
+ 0x05, 0x20, 0xc4, 0xbd, 0xa9, 0x29, 0x92, 0xbd, 0x7e, 0xef, 0x72, 0xbe,
+ 0x9c, 0x55, 0xfa, 0x3d, 0x7c, 0x26, 0xa8, 0xbd, 0x9a, 0xe7, 0x04, 0x3d,
+ 0x0c, 0xcf, 0x11, 0x3e, 0x6d, 0xbc, 0xa5, 0xbd, 0x84, 0x38, 0x48, 0x3e,
+ 0x84, 0x5f, 0x76, 0xbe, 0xa3, 0xf5, 0xab, 0xbd, 0x32, 0x03, 0x68, 0xbc,
+ 0xca, 0x48, 0x9f, 0xbe, 0x35, 0xe6, 0x66, 0x3e, 0x70, 0xa5, 0xe4, 0x3d,
+ 0x8e, 0x1c, 0xb5, 0xbd, 0x40, 0x2e, 0x38, 0xbd, 0x69, 0xf4, 0x36, 0xbd,
+ 0x9b, 0xdc, 0xee, 0x3d, 0x1b, 0x80, 0xbb, 0xbb, 0xe8, 0xdc, 0x31, 0x3e,
+ 0xb2, 0x6e, 0xef, 0x3e, 0x53, 0xd2, 0xfb, 0x3d, 0xc8, 0xc8, 0xfb, 0xbc,
+ 0xa8, 0x34, 0x92, 0x3e, 0x12, 0x09, 0x36, 0xbd, 0x7a, 0x75, 0xaf, 0x3d,
+ 0x85, 0xb7, 0xeb, 0xbe, 0x62, 0xc9, 0x4a, 0xbe, 0xa0, 0x86, 0x7e, 0xbe,
+ 0x8a, 0xbb, 0x54, 0xbc, 0x16, 0x5a, 0xd2, 0x3d, 0x59, 0x12, 0x87, 0x3d,
+ 0x1b, 0x9f, 0xd9, 0xbd, 0x7e, 0x18, 0xcf, 0xbe, 0xac, 0x3d, 0xb3, 0xbe,
+ 0x98, 0x87, 0xab, 0xbc, 0xb2, 0x54, 0xee, 0xbd, 0xbc, 0x34, 0xa7, 0x3e,
+ 0xc2, 0xb5, 0x64, 0x3d, 0x88, 0x26, 0xb7, 0xbe, 0x48, 0x39, 0xb3, 0xbe,
+ 0x48, 0x5f, 0x9b, 0xbe, 0xed, 0xfd, 0x73, 0xbe, 0x14, 0xc8, 0x58, 0x3d,
+ 0x3b, 0xef, 0xc6, 0x3e, 0x5b, 0x50, 0x29, 0x3e, 0x4a, 0x7d, 0xa2, 0xbe,
+ 0x95, 0x4e, 0x09, 0xbe, 0x8e, 0x09, 0x73, 0x3e, 0x1c, 0x4d, 0xb8, 0x3d,
+ 0xac, 0xaf, 0x3a, 0x3e, 0xb7, 0x7d, 0x5f, 0xbe, 0xc5, 0x36, 0x14, 0xbd,
+ 0x86, 0x8f, 0x6c, 0xbc, 0xd8, 0x31, 0x1a, 0x3e, 0x10, 0x48, 0x26, 0xbe,
+ 0x01, 0x12, 0x5b, 0x3e, 0x81, 0x75, 0xa8, 0xbd, 0xfd, 0x38, 0x1e, 0x3e,
+ 0x81, 0x63, 0x98, 0x3e, 0xc7, 0xfe, 0x99, 0xbd, 0x88, 0x32, 0x97, 0x3d,
+ 0x5f, 0x5e, 0x8b, 0x3d, 0xed, 0xbe, 0x87, 0xbd, 0x5b, 0x6d, 0x81, 0x3e,
+ 0xfd, 0x70, 0x44, 0xbc, 0x1a, 0xe7, 0x5e, 0xbe, 0x8f, 0xbd, 0xf7, 0x3d,
+ 0x4c, 0x5c, 0xe5, 0x3e, 0x9e, 0xd8, 0xc5, 0x3c, 0x8e, 0xa1, 0x40, 0xbd,
+ 0xb7, 0xb7, 0xb4, 0x3d, 0x36, 0xa3, 0x56, 0xbd, 0x24, 0xe9, 0x9a, 0xbe,
+ 0xb5, 0x65, 0x35, 0x3e, 0x2b, 0x68, 0x9a, 0xbd, 0xaa, 0x78, 0xd7, 0x3e,
+ 0x8f, 0x57, 0x9f, 0x3d, 0x59, 0xe5, 0x8c, 0xbe, 0x6a, 0x00, 0x25, 0xbe,
+ 0x26, 0xbe, 0xb3, 0x3d, 0x2b, 0xb0, 0xe6, 0xbd, 0x49, 0xae, 0xd7, 0xbe,
+ 0x24, 0x97, 0xb2, 0x3b, 0xfb, 0xc0, 0xd4, 0xbb, 0x52, 0xaf, 0x0c, 0xbe,
+ 0x0e, 0xcf, 0x85, 0x3e, 0xe1, 0x30, 0xd5, 0x3d, 0xca, 0x50, 0x9c, 0x3e,
+ 0x05, 0x94, 0xb8, 0x3d, 0xa9, 0xc3, 0xac, 0x3d, 0xc8, 0xaf, 0x65, 0x3e,
+ 0x4f, 0x28, 0x39, 0xbe, 0x52, 0x23, 0xd8, 0xbe, 0x53, 0x06, 0xfb, 0xbc,
+ 0x8b, 0xdc, 0x91, 0xbc, 0x66, 0xf3, 0x9c, 0x3e, 0xe2, 0x5f, 0xfd, 0xbd,
+ 0xa0, 0xb8, 0x2d, 0xbe, 0xd6, 0x3c, 0x19, 0xbc, 0x26, 0x55, 0x6c, 0xbe,
+ 0x16, 0x20, 0x03, 0xbd, 0x06, 0xf3, 0xc8, 0xbe, 0x33, 0xce, 0x9f, 0xbc,
+ 0xef, 0x23, 0xcc, 0x3d, 0x48, 0x21, 0x65, 0x3e, 0x7d, 0x0d, 0x69, 0x3d,
+ 0x11, 0x17, 0x0d, 0xbe, 0xfc, 0xbd, 0xd4, 0xbd, 0x34, 0x3f, 0x88, 0xbe,
+ 0x89, 0xc0, 0x87, 0x3c, 0x39, 0x82, 0x58, 0xbb, 0x07, 0x55, 0xa0, 0x3d,
+ 0x10, 0x13, 0xf9, 0x3c, 0xfa, 0x78, 0x99, 0x3d, 0x56, 0xb0, 0x9a, 0x3c,
+ 0x96, 0x71, 0xa9, 0xbd, 0x76, 0x78, 0x20, 0xbd, 0x2d, 0xd9, 0x06, 0x3e,
+ 0xd8, 0xc6, 0x65, 0xbc, 0xd4, 0x21, 0x89, 0xbd, 0x74, 0x95, 0xc8, 0x3d,
+ 0xa1, 0x6a, 0xee, 0xbd, 0xbe, 0xb2, 0x26, 0xbe, 0xba, 0xcb, 0xc6, 0xbd,
+ 0x98, 0x9b, 0xf1, 0x3d, 0x81, 0xa9, 0xa0, 0xbc, 0xae, 0xb5, 0xab, 0x3d,
+ 0xf1, 0xb0, 0x92, 0xbd, 0xe2, 0x61, 0x2b, 0xbe, 0x0a, 0x61, 0xd9, 0xbd,
+ 0x02, 0x3d, 0x81, 0x3d, 0xc5, 0xd4, 0x0a, 0xbe, 0xe2, 0xe5, 0xd6, 0xbc,
+ 0xbf, 0x30, 0xbd, 0x3d, 0xb4, 0x31, 0x68, 0xbc, 0x87, 0x61, 0x01, 0x3e,
+ 0x7b, 0x1c, 0x71, 0xbd, 0x82, 0xbb, 0x00, 0x3d, 0x60, 0xa0, 0x93, 0x3d,
+ 0x4c, 0x66, 0xb7, 0xbd, 0xc0, 0xbc, 0x7e, 0xbd, 0xd6, 0x08, 0x8d, 0xbd,
+ 0xf1, 0xed, 0x43, 0x3d, 0xb8, 0x8a, 0x40, 0x3e, 0x40, 0xfc, 0x91, 0xbd,
+ 0x53, 0xab, 0xeb, 0xbc, 0xf0, 0x9f, 0x76, 0xbd, 0x66, 0xab, 0x1c, 0xbd,
+ 0x13, 0x08, 0x78, 0xbd, 0x14, 0x56, 0xf5, 0x3d, 0x23, 0x71, 0xcb, 0x3d,
+ 0x68, 0x1c, 0xb8, 0x3c, 0x92, 0x6c, 0x35, 0x3c, 0x05, 0x6c, 0x98, 0xbd,
+ 0xf7, 0x12, 0xad, 0xbd, 0x6c, 0x8f, 0xe8, 0x3d, 0xb2, 0xa4, 0x44, 0x3d,
+ 0xba, 0x66, 0x80, 0x3d, 0xe7, 0x76, 0x8e, 0xbd, 0x2a, 0x3a, 0x66, 0xbc,
+ 0xa3, 0x7d, 0x13, 0x3d, 0xb8, 0x3e, 0x5b, 0xbd, 0xd6, 0x43, 0x33, 0xbc,
+ 0x90, 0x5d, 0x51, 0xbd, 0x68, 0xab, 0x86, 0xbd, 0xcc, 0x38, 0xcf, 0x3c,
+ 0xb2, 0xf0, 0x41, 0xbc, 0x31, 0x40, 0x51, 0x3e, 0x75, 0x03, 0xd8, 0x3d,
+ 0x8e, 0x2a, 0x38, 0x3e, 0xdd, 0x6b, 0xeb, 0xbb, 0x5c, 0x80, 0x17, 0x3e,
+ 0x20, 0x16, 0x02, 0xbe, 0x9f, 0xa1, 0xed, 0x3d, 0x81, 0x42, 0x64, 0xbc,
+ 0x1a, 0x1d, 0x19, 0xbe, 0xa5, 0x11, 0x5d, 0xbd, 0xff, 0xa4, 0xa9, 0x3c,
+ 0x48, 0xa6, 0x3d, 0xbe, 0x7d, 0xcc, 0xde, 0xbc, 0x06, 0xd4, 0x59, 0x3e,
+ 0x99, 0x1a, 0xc3, 0x3d, 0x0a, 0x90, 0x34, 0xbd, 0xdd, 0x44, 0x53, 0xbc,
+ 0xd6, 0x91, 0x19, 0x3b, 0x72, 0x3e, 0x88, 0xbd, 0x09, 0x24, 0x85, 0xbd,
+ 0xf5, 0x1a, 0xaf, 0xbc, 0xb6, 0x3a, 0x8b, 0x3d, 0x85, 0xf4, 0xff, 0xbd,
+ 0x22, 0x2e, 0xf0, 0xbd, 0xa7, 0x9c, 0xab, 0x3d, 0x3d, 0x56, 0x67, 0x3c,
+ 0xf2, 0x11, 0x4b, 0xbe, 0x2a, 0xb6, 0x18, 0x3e, 0xe6, 0x9f, 0x48, 0x3e,
+ 0x5a, 0x8a, 0xbf, 0xbd, 0x02, 0x0a, 0x45, 0xbb, 0xe6, 0x03, 0x90, 0x3d,
+ 0xb4, 0x73, 0x37, 0x3e, 0x7e, 0xce, 0x2e, 0xbe, 0xd9, 0xa3, 0x53, 0xbc,
+ 0x70, 0x46, 0x12, 0xbe, 0xb6, 0x2c, 0x9e, 0xbe, 0x85, 0x16, 0xf3, 0xbd,
+ 0x6d, 0x2b, 0x88, 0xbd, 0xa1, 0xb3, 0x7e, 0xbe, 0x44, 0xbc, 0x94, 0x3d,
+ 0x64, 0x86, 0x5a, 0xbd, 0x22, 0xbd, 0x93, 0xbd, 0x6f, 0xbc, 0x91, 0x3d,
+ 0xf7, 0xdf, 0x0c, 0xbe, 0x51, 0x4e, 0xd9, 0x3d, 0x93, 0x91, 0x0b, 0x3e,
+ 0xc3, 0x2b, 0xbb, 0x3d, 0x66, 0x4f, 0x11, 0xbe, 0xa4, 0x5d, 0x4d, 0x3d,
+ 0xb7, 0xe3, 0x7d, 0x3d, 0xd2, 0x74, 0x87, 0xbc, 0xa3, 0xcd, 0xdb, 0xbd,
+ 0xfb, 0xcb, 0x63, 0x3d, 0x4f, 0xa3, 0xc5, 0x3d, 0x89, 0x0e, 0x74, 0x3d,
+ 0xc7, 0x8d, 0x63, 0xbc, 0xf3, 0x6f, 0x6f, 0xbd, 0x9e, 0x40, 0x37, 0x3c,
+ 0x97, 0x4c, 0x64, 0xbe, 0xb4, 0xc4, 0x16, 0xbd, 0xc7, 0xdb, 0x15, 0xbe,
+ 0x9b, 0xd8, 0xca, 0xbd, 0xc4, 0xcb, 0xa5, 0xbd, 0xb8, 0xbb, 0x47, 0x3d,
+ 0xfc, 0x57, 0x16, 0x3d, 0x94, 0x76, 0xb4, 0x3d, 0x52, 0x56, 0xb8, 0x3d,
+ 0xc9, 0x30, 0xad, 0xbd, 0x4a, 0xcd, 0x10, 0xbd, 0xee, 0x29, 0xe2, 0x3d,
+ 0x35, 0x06, 0xb1, 0xbd, 0x52, 0x93, 0x04, 0xbd, 0xa0, 0xe1, 0xc4, 0xbd,
+ 0x0b, 0xec, 0x11, 0xbd, 0xa7, 0x33, 0x57, 0x3d, 0x86, 0xfa, 0xe8, 0xbd,
+ 0x25, 0xf1, 0x1d, 0x3e, 0x05, 0x4c, 0x86, 0xbd, 0x9b, 0x0c, 0x79, 0x3d,
+ 0xad, 0x81, 0x48, 0x3d, 0xe3, 0x1c, 0xab, 0xbd, 0xc1, 0x2d, 0x3f, 0x3c,
+ 0x18, 0x69, 0x27, 0xbd, 0x42, 0x49, 0x6a, 0x3d, 0xb6, 0xee, 0xf9, 0xbd,
+ 0x55, 0x80, 0xf4, 0x3d, 0x97, 0xb7, 0x95, 0x3b, 0xb9, 0x6d, 0x8b, 0x3d,
+ 0xac, 0x6e, 0x8a, 0xbd, 0x2a, 0x4d, 0x62, 0xbd, 0x50, 0x5a, 0x55, 0xbd,
+ 0x77, 0x38, 0x15, 0x3e, 0x60, 0xf1, 0x16, 0x3e, 0xad, 0x09, 0x1f, 0x3e,
+ 0xe7, 0xb3, 0xdb, 0xbb, 0x5e, 0xfb, 0x25, 0xbe, 0x7c, 0xd5, 0x02, 0xbe,
+ 0xb9, 0x21, 0x18, 0x3d, 0x8e, 0x8b, 0xd8, 0x3d, 0x02, 0x4b, 0x09, 0x3e,
+ 0x85, 0x24, 0x20, 0xbc, 0x0d, 0xf7, 0x06, 0x3e, 0xa4, 0xa7, 0xed, 0x3c,
+ 0x49, 0xc1, 0x8c, 0xbd, 0x4e, 0x6f, 0x04, 0x3e, 0x9a, 0x33, 0x8a, 0xbb,
+ 0x15, 0x08, 0x10, 0xbd, 0x81, 0x62, 0x13, 0x3e, 0xd3, 0xbd, 0xfd, 0x3d,
+ 0xf8, 0xd4, 0x0a, 0xbe, 0x87, 0xcd, 0x52, 0xbe, 0x23, 0x7a, 0xb6, 0x3d,
+ 0x21, 0x9d, 0xf9, 0x3b, 0x90, 0xe1, 0xae, 0x3d, 0x65, 0x17, 0xc2, 0xbd,
+ 0x51, 0x5c, 0x11, 0xbd, 0x1e, 0xb6, 0xa3, 0x3d, 0xf1, 0x3d, 0x95, 0xbd,
+ 0x1a, 0xf3, 0x0f, 0x3e, 0x0c, 0x46, 0x80, 0x3d, 0xa2, 0x14, 0x33, 0x3e,
+ 0x5f, 0xae, 0x72, 0x3d, 0x8d, 0xea, 0x0f, 0x3d, 0x52, 0x2c, 0x8e, 0xbb,
+ 0x19, 0xbd, 0x83, 0x3d, 0x08, 0x53, 0x13, 0x3e, 0xba, 0x3a, 0x06, 0x3d,
+ 0x12, 0x8f, 0x23, 0xbe, 0x48, 0x21, 0x7f, 0xbd, 0x36, 0xfb, 0x6c, 0x3e,
+ 0xed, 0xc6, 0xc4, 0xbd, 0x2f, 0x00, 0x72, 0xbc, 0x1d, 0xcc, 0x00, 0xbc,
+ 0x6c, 0xe6, 0xc1, 0x3d, 0x4b, 0x35, 0xb7, 0x3c, 0x85, 0xc9, 0x8b, 0xbd,
+ 0xc1, 0xfd, 0xe9, 0xbd, 0x69, 0x61, 0x1f, 0xbe, 0xcc, 0xb8, 0x72, 0x3d,
+ 0xba, 0x9c, 0xd9, 0xbd, 0x13, 0xf2, 0xd8, 0xbd, 0x3c, 0xbd, 0xbe, 0xbd,
+ 0x7c, 0xd3, 0x6f, 0xbe, 0xfb, 0x3d, 0xd6, 0xbc, 0xa3, 0x4a, 0x17, 0xbd,
+ 0x43, 0x7b, 0x54, 0x3d, 0xc3, 0x1e, 0x4e, 0x3d, 0x8f, 0x8c, 0x35, 0x3c,
+ 0xdf, 0xab, 0x39, 0xbc, 0x46, 0xed, 0x76, 0xbd, 0xc2, 0x71, 0x22, 0xbb,
+ 0x9f, 0x00, 0x1a, 0xbe, 0x08, 0x64, 0x5d, 0xbe, 0x15, 0xb5, 0xb2, 0xbd,
+ 0x77, 0xb2, 0x9b, 0xbd, 0xdd, 0x06, 0xb4, 0xbd, 0xaa, 0xd0, 0x5f, 0xbd,
+ 0x56, 0x66, 0x49, 0x3d, 0x0a, 0x66, 0x4e, 0xbd, 0x4c, 0x70, 0x87, 0x3d,
+ 0xd3, 0xd0, 0x69, 0x3d, 0x88, 0xf6, 0x46, 0x3d, 0x78, 0xb4, 0xa0, 0xbd,
+ 0x97, 0x36, 0x10, 0x3e, 0x82, 0x88, 0x06, 0xbc, 0xfc, 0x39, 0xcd, 0xbd,
+ 0x36, 0xfa, 0x75, 0xbc, 0x6f, 0x40, 0xf7, 0x3d, 0xb5, 0x0c, 0xf8, 0xbc,
+ 0x84, 0x25, 0x50, 0xbc, 0x0c, 0x8f, 0x34, 0xbc, 0x73, 0x7b, 0xbc, 0x3d,
+ 0xc8, 0x19, 0x2f, 0xbe, 0x2b, 0x0f, 0x8e, 0x3d, 0x52, 0x32, 0xa5, 0xbd,
+ 0xef, 0x8e, 0x57, 0xbe, 0x25, 0xb4, 0xca, 0xbd, 0x46, 0x63, 0xee, 0xbc,
+ 0x4c, 0xdc, 0x8f, 0x3e, 0x64, 0xfc, 0x3c, 0x3d, 0xbf, 0x45, 0x27, 0x3d,
+ 0xb6, 0x9e, 0xb9, 0x3d, 0xa2, 0x4d, 0x8f, 0x3e, 0xb1, 0xc6, 0xeb, 0x3d,
+ 0x79, 0x31, 0x66, 0x3e, 0xab, 0x7c, 0x54, 0xbd, 0xcc, 0xbd, 0x75, 0xbd,
+ 0xd5, 0x10, 0xd7, 0xbe, 0x97, 0xbc, 0xd4, 0xbd, 0xd8, 0xc3, 0x37, 0xbe,
+ 0xcc, 0x64, 0xc6, 0xbd, 0x60, 0x08, 0xb1, 0x3d, 0x18, 0x74, 0x5b, 0xbe,
+ 0x0d, 0x6c, 0x2b, 0x3e, 0xcf, 0xb7, 0x14, 0xbe, 0x9e, 0xf0, 0x9e, 0x3e,
+ 0x3e, 0x5e, 0x1c, 0x3e, 0x91, 0x85, 0xed, 0x3a, 0xa7, 0x36, 0xda, 0x3d,
+ 0x44, 0xcd, 0x89, 0x3d, 0x32, 0x33, 0x58, 0x3e, 0x34, 0x3e, 0x8a, 0xbe,
+ 0x11, 0x77, 0xd8, 0xbd, 0x37, 0xd7, 0x8f, 0xbe, 0xff, 0x69, 0x35, 0xbe,
+ 0x01, 0xcb, 0xe4, 0xbd, 0xec, 0x56, 0x0e, 0xbc, 0xea, 0xa3, 0xd6, 0xbc,
+ 0x24, 0x34, 0x0d, 0x3d, 0x22, 0xd9, 0x41, 0x3d, 0xaa, 0xca, 0xe7, 0xbe,
+ 0xc8, 0x1b, 0x37, 0x3e, 0x25, 0xdb, 0x3a, 0xbe, 0xfe, 0x92, 0x73, 0x3e,
+ 0x26, 0xb3, 0xcb, 0xbc, 0x7d, 0xd4, 0x1c, 0x3e, 0xa0, 0x8b, 0xa8, 0x3d,
+ 0x84, 0xf6, 0x63, 0x3e, 0xfb, 0x8d, 0x7c, 0x3e, 0xa4, 0xaf, 0xf0, 0xbd,
+ 0x2e, 0x5a, 0x4f, 0x3e, 0xef, 0x0a, 0x91, 0xbe, 0xd4, 0xa7, 0x8e, 0x3e,
+ 0x99, 0xd7, 0x56, 0x3e, 0x79, 0xc7, 0x39, 0x3e, 0x78, 0x8b, 0xcc, 0x3d,
+ 0x37, 0x52, 0xe5, 0x3d, 0xc8, 0x23, 0xb3, 0x3c, 0xb0, 0x66, 0x9a, 0x3e,
+ 0xa1, 0x85, 0xa0, 0xbc, 0x26, 0x15, 0x3e, 0xbd, 0x6f, 0xd6, 0xc1, 0xbc,
+ 0x2a, 0xfb, 0x8f, 0xbd, 0xb3, 0xc6, 0x2c, 0x3c, 0x60, 0xf7, 0xff, 0xbd,
+ 0x6b, 0xcc, 0x4e, 0x3e, 0xc1, 0x56, 0x29, 0xbd, 0xf1, 0xc2, 0x47, 0xbe,
+ 0xc6, 0x9f, 0xeb, 0xbd, 0xb1, 0x3a, 0x86, 0x3e, 0x8b, 0x0e, 0xb4, 0x3e,
+ 0xb8, 0xdb, 0x18, 0xbe, 0x9a, 0xe5, 0xae, 0xbe, 0x58, 0x10, 0x1c, 0x3e,
+ 0x61, 0x47, 0xf6, 0x3c, 0x77, 0x02, 0x81, 0x3e, 0x5c, 0x3a, 0xc3, 0xbe,
+ 0x3f, 0x3b, 0xdc, 0xbd, 0x8e, 0x03, 0x0b, 0x3d, 0x1f, 0x2f, 0xbc, 0xbb,
+ 0x47, 0xa3, 0x05, 0xbe, 0x7a, 0x19, 0x21, 0x3e, 0xce, 0xad, 0xb9, 0xbe,
+ 0x79, 0x22, 0xf5, 0x3c, 0x7f, 0xef, 0x73, 0x3d, 0x90, 0x8e, 0x32, 0x3e,
+ 0x54, 0xa7, 0xb1, 0x3e, 0x7f, 0x47, 0x9c, 0xbd, 0x1d, 0xbd, 0x91, 0xbd,
+ 0xf9, 0x6b, 0x1f, 0xbe, 0x56, 0xd7, 0x74, 0x3e, 0x24, 0x29, 0xeb, 0x3e,
+ 0x3b, 0xfd, 0xcd, 0x3d, 0x0e, 0x25, 0xbf, 0x3c, 0x48, 0x39, 0x45, 0x3e,
+ 0x3d, 0x79, 0x07, 0xbe, 0x5d, 0x68, 0x90, 0xbc, 0xda, 0x88, 0xb1, 0xbd,
+ 0x48, 0x45, 0x7f, 0x3d, 0x4c, 0x36, 0xa5, 0x3d, 0xb7, 0xc6, 0x6f, 0xbe,
+ 0x26, 0x43, 0xdc, 0xbe, 0xe8, 0x77, 0x0e, 0xbe, 0x5f, 0xa3, 0x51, 0x3e,
+ 0xaa, 0xf5, 0xc4, 0x3e, 0xd1, 0xc9, 0x39, 0xbe, 0x5b, 0x3c, 0xed, 0xbe,
+ 0x24, 0x5f, 0x4d, 0xbc, 0xa5, 0xb7, 0xee, 0xbe, 0x39, 0x4c, 0x1c, 0x3e,
+ 0xf7, 0xb3, 0xf4, 0x3d, 0xf0, 0x57, 0xf7, 0xbd, 0x07, 0x2a, 0xe8, 0x3e,
+ 0x31, 0xa9, 0x8b, 0xbd, 0xc4, 0x11, 0x47, 0xbd, 0x81, 0x6b, 0x15, 0x3d,
+ 0x82, 0xdb, 0x9f, 0x3c, 0x65, 0xdc, 0xa6, 0xbc, 0xd6, 0x78, 0x61, 0x3e,
+ 0x0a, 0xca, 0xdc, 0x3e, 0xa0, 0x7a, 0x7e, 0xbe, 0xcd, 0x11, 0x03, 0x3d,
+ 0x38, 0x08, 0x13, 0xbe, 0x9c, 0xa9, 0x1c, 0xbc, 0xda, 0x82, 0x38, 0xbd,
+ 0xdb, 0xfd, 0xe9, 0xbd, 0x3f, 0x92, 0xdb, 0xbd, 0xf3, 0xdd, 0xf3, 0xbd,
+ 0x31, 0xbf, 0xe1, 0xbd, 0x07, 0xa1, 0x99, 0x3d, 0xec, 0xd4, 0xdc, 0xbd,
+ 0xe2, 0xd9, 0xaf, 0xbb, 0x97, 0xb8, 0xc3, 0x3d, 0x50, 0x7a, 0x9a, 0xbd,
+ 0x3a, 0x58, 0xa6, 0x3c, 0xc9, 0xd8, 0xda, 0x3d, 0x81, 0x93, 0xd3, 0x3d,
+ 0xde, 0xf0, 0x24, 0xbc, 0xa9, 0x0d, 0xdc, 0xbd, 0x3a, 0x33, 0x4b, 0x3e,
+ 0x57, 0xbf, 0xfa, 0x3d, 0xab, 0x42, 0x6f, 0x3d, 0x73, 0x24, 0x05, 0xbe,
+ 0xe7, 0xc3, 0x0d, 0x3e, 0xe1, 0xba, 0xfc, 0x3d, 0x00, 0xdf, 0xff, 0xbd,
+ 0x9b, 0x88, 0x10, 0xbd, 0x7e, 0xc1, 0xee, 0xbd, 0xa5, 0xf6, 0x0a, 0x3e,
+ 0x9b, 0x07, 0x01, 0xbd, 0x6f, 0x12, 0x3f, 0xbe, 0x58, 0x39, 0xe0, 0xbd,
+ 0x9a, 0x88, 0xce, 0xbc, 0xf4, 0x56, 0xc6, 0x3d, 0xa8, 0x24, 0xee, 0x3d,
+ 0x0c, 0x4a, 0x10, 0x3d, 0xe6, 0xc8, 0x27, 0xbe, 0xff, 0xd6, 0x48, 0x3d,
+ 0x1c, 0xce, 0x19, 0x3d, 0x25, 0xd3, 0x2c, 0xbe, 0x9c, 0xdb, 0x3b, 0xbe,
+ 0x3c, 0x9c, 0x84, 0x3d, 0xe7, 0xaf, 0xce, 0xbd, 0x3b, 0xea, 0x7d, 0xbc,
+ 0xb7, 0xa0, 0x06, 0xbe, 0x55, 0xad, 0x2d, 0x3e, 0xcd, 0xd1, 0x96, 0xbd,
+ 0x34, 0xc6, 0x6c, 0x3d, 0x24, 0x80, 0x69, 0x3c, 0xf6, 0x38, 0xd4, 0x3d,
+ 0xe3, 0x8d, 0xd7, 0x3b, 0xd7, 0x6f, 0xc8, 0xbe, 0xeb, 0x91, 0x09, 0xbe,
+ 0x09, 0x30, 0x56, 0x3d, 0x7b, 0x29, 0x74, 0xbd, 0x69, 0x4e, 0xd4, 0x3c,
+ 0x24, 0x19, 0x94, 0xbd, 0x66, 0xe8, 0x1e, 0xbe, 0xbb, 0x35, 0x59, 0xbd,
+ 0x0b, 0xe0, 0xc0, 0x3d, 0xfc, 0xac, 0x4a, 0xbd, 0xad, 0xd7, 0x83, 0xbd,
+ 0x97, 0x33, 0xbd, 0xbd, 0xc5, 0xb5, 0xaa, 0x3d, 0x71, 0x66, 0xd1, 0xbd,
+ 0xd5, 0xf0, 0x6d, 0xbc, 0x4b, 0x09, 0xba, 0x3c, 0x33, 0x18, 0x92, 0xbb,
+ 0x61, 0x3a, 0x51, 0xbd, 0x04, 0xb8, 0x0b, 0xbd, 0xac, 0x30, 0x74, 0xbc,
+ 0x79, 0x1f, 0xa0, 0x3c, 0xe6, 0xb2, 0x8f, 0xbd, 0x64, 0x95, 0x81, 0x3d,
+ 0x3e, 0x12, 0x55, 0xbd, 0x8f, 0x34, 0x41, 0xbe, 0x43, 0x29, 0x5c, 0xbd,
+ 0xd8, 0x8e, 0x85, 0xbd, 0x93, 0x0b, 0xf2, 0xbd, 0xb9, 0x2d, 0x92, 0x3d,
+ 0xdd, 0xc3, 0xc8, 0x3c, 0xdf, 0xd6, 0xad, 0x3d, 0x9a, 0xb5, 0x0c, 0xbe,
+ 0x1e, 0x5a, 0x90, 0x3d, 0x91, 0x96, 0x0a, 0xbe, 0x73, 0x41, 0x59, 0x3c,
+ 0xf0, 0x52, 0x84, 0xbd, 0x8f, 0x0a, 0x92, 0x3c, 0x78, 0x48, 0x89, 0xbc,
+ 0x41, 0xea, 0x8a, 0x3d, 0xdd, 0xb6, 0x19, 0xbe, 0x06, 0x0b, 0xe4, 0x3c,
+ 0x81, 0x82, 0x0c, 0x3c, 0x10, 0x67, 0xd4, 0x3b, 0x61, 0x2e, 0xc2, 0xbb,
+ 0x2c, 0x96, 0x75, 0x3d, 0xa4, 0x49, 0x20, 0xbe, 0x61, 0x77, 0xd9, 0xbb,
+ 0x26, 0xee, 0xb3, 0x3d, 0x21, 0xd3, 0x2b, 0x3d, 0x3d, 0xea, 0x2c, 0x3e,
+ 0x32, 0xf5, 0x2b, 0x3d, 0x30, 0x90, 0xa9, 0x3c, 0xd4, 0x39, 0xae, 0xbd,
+ 0x07, 0x08, 0x0b, 0xbe, 0xba, 0x2e, 0xaa, 0xbd, 0x44, 0x07, 0x4c, 0xbc,
+ 0x37, 0x60, 0x49, 0xbc, 0xd9, 0x14, 0xa8, 0xbc, 0xa7, 0xc3, 0xfc, 0xbc,
+ 0x45, 0x9b, 0x16, 0xbd, 0x61, 0x65, 0xa2, 0xbd, 0x73, 0xa4, 0x27, 0x3d,
+ 0x04, 0xb5, 0x31, 0x3d, 0x8e, 0x43, 0x36, 0xbd, 0x32, 0x6e, 0x5c, 0x3d,
+ 0x00, 0x14, 0xa8, 0xbe, 0xb7, 0x58, 0x00, 0xbe, 0xcc, 0xf7, 0x86, 0x3d,
+ 0xc6, 0xc8, 0x58, 0xbc, 0x72, 0x68, 0x6f, 0x3d, 0x48, 0x3b, 0x13, 0x3e,
+ 0x8c, 0xf0, 0x15, 0xbe, 0xb6, 0xf5, 0xc8, 0x3d, 0x43, 0x04, 0x87, 0xbc,
+ 0xc2, 0xc9, 0xf1, 0xbd, 0x33, 0x84, 0xe5, 0xbd, 0x30, 0x4b, 0xa1, 0xbe,
+ 0xb9, 0x5a, 0x2d, 0x3e, 0xcb, 0x83, 0xa4, 0x3d, 0xf5, 0xd0, 0x19, 0x3e,
+ 0xa1, 0xb5, 0xac, 0x3e, 0x9a, 0x90, 0xbb, 0x3d, 0x16, 0x26, 0xd5, 0x3e,
+ 0xe1, 0xc8, 0x7f, 0xbe, 0x95, 0x47, 0xa9, 0xbd, 0x67, 0x74, 0xbe, 0xbd,
+ 0xca, 0xe0, 0xdd, 0xbe, 0x18, 0x11, 0xbe, 0x3c, 0x4e, 0x68, 0x89, 0x3d,
+ 0x12, 0x46, 0x8c, 0xbe, 0x1b, 0x81, 0x93, 0xbe, 0xbe, 0x42, 0x6f, 0xbe,
+ 0xd8, 0xcd, 0xbc, 0x3e, 0x59, 0x1f, 0x16, 0xbe, 0x1a, 0x9f, 0xb2, 0x3d,
+ 0x06, 0x53, 0x8a, 0x3e, 0x6e, 0x4b, 0x4c, 0x3d, 0x2c, 0xc5, 0xe5, 0xbd,
+ 0x91, 0xb1, 0xd9, 0x3e, 0x21, 0x30, 0x0f, 0x3c, 0x63, 0x3d, 0xad, 0x3e,
+ 0x74, 0x72, 0x53, 0xbe, 0x07, 0x9a, 0xae, 0x3d, 0xc9, 0x15, 0xc7, 0xbd,
+ 0x02, 0x1a, 0x1f, 0xbd, 0x8d, 0x4d, 0x82, 0xbb, 0xf5, 0x29, 0xc6, 0xbd,
+ 0xe8, 0x2d, 0x01, 0xbe, 0xd2, 0x58, 0x4f, 0xbe, 0x91, 0xec, 0xa9, 0xbe,
+ 0xf1, 0xaf, 0x88, 0x3d, 0x6b, 0x8e, 0xd1, 0x3d, 0xdc, 0x13, 0xc8, 0x3e,
+ 0xc0, 0xc2, 0x3e, 0xbe, 0xd3, 0x2a, 0x25, 0xbe, 0x02, 0xde, 0x5d, 0xbe,
+ 0x53, 0xdc, 0x99, 0xbe, 0x8b, 0x0f, 0x96, 0xbe, 0x60, 0x36, 0x09, 0x3d,
+ 0x15, 0x86, 0xff, 0x3d, 0x0a, 0x08, 0xc2, 0x3a, 0x4e, 0x43, 0xb7, 0xbd,
+ 0x2e, 0x32, 0x74, 0xbd, 0xb8, 0x64, 0xa8, 0x3d, 0x92, 0xf2, 0x12, 0x3e,
+ 0x62, 0xc8, 0x4c, 0x3d, 0xcd, 0x85, 0xbe, 0xbd, 0xa3, 0xb4, 0x36, 0x3c,
+ 0xae, 0x5d, 0x5b, 0xbe, 0xc1, 0x7b, 0xa1, 0x3e, 0x6e, 0x1e, 0x3a, 0xbe,
+ 0x9a, 0x7d, 0x80, 0x3e, 0xb1, 0x85, 0x4d, 0xbe, 0x62, 0x26, 0x0a, 0x3d,
+ 0xcd, 0xad, 0x71, 0x3d, 0x38, 0xe5, 0xdf, 0xbd, 0x98, 0x29, 0xdd, 0xbd,
+ 0xf6, 0xc2, 0x04, 0x3e, 0x1d, 0xd7, 0x10, 0x3d, 0x40, 0xf2, 0x9f, 0x3e,
+ 0x75, 0x32, 0xe3, 0xbd, 0x5a, 0x6e, 0x07, 0xbc, 0xd6, 0xee, 0xca, 0x3d,
+ 0x56, 0x0d, 0x08, 0x3f, 0x66, 0x4e, 0x9b, 0xbd, 0xde, 0x12, 0x38, 0xbe,
+ 0x68, 0x4d, 0x10, 0xbd, 0x73, 0x4d, 0xa8, 0xbd, 0x42, 0x5c, 0xd8, 0xbe,
+ 0x81, 0x1a, 0x99, 0x3d, 0x05, 0xac, 0x90, 0x3d, 0x3b, 0x7b, 0xfa, 0x3e,
+ 0x8f, 0x33, 0x7b, 0xba, 0x32, 0x4d, 0x29, 0xbe, 0xf1, 0x36, 0x07, 0x3c,
+ 0x70, 0x62, 0x85, 0x3e, 0x6b, 0x8c, 0x18, 0xbe, 0x7e, 0x66, 0x81, 0xbe,
+ 0x0d, 0x1c, 0x71, 0xbe, 0x9d, 0xf7, 0x0f, 0xbe, 0xd3, 0xe6, 0xd0, 0xbd,
+ 0xe0, 0x32, 0x31, 0x3e, 0x93, 0x30, 0x58, 0xbe, 0xd7, 0x57, 0xb7, 0x3d,
+ 0x8f, 0x32, 0xe5, 0x3d, 0xe6, 0x75, 0x23, 0xbd, 0x09, 0xaa, 0x34, 0x3e,
+ 0xd7, 0x64, 0x0b, 0xbe, 0xd2, 0x0c, 0x10, 0xbe, 0x9f, 0x35, 0x8e, 0xbe,
+ 0x07, 0xab, 0xab, 0xbd, 0xe9, 0x44, 0x21, 0x3e, 0x03, 0x34, 0x1a, 0xbd,
+ 0x8b, 0x65, 0x13, 0xbe, 0x99, 0x47, 0x5c, 0x3d, 0xf9, 0xb6, 0x60, 0xbe,
+ 0x87, 0x0e, 0xb3, 0xbd, 0xbc, 0xb5, 0xe5, 0xbe, 0xe0, 0x81, 0x1e, 0xbd,
+ 0x6e, 0x9a, 0x6f, 0x3e, 0xf0, 0x50, 0x80, 0x3e, 0x6a, 0x41, 0x06, 0x3e,
+ 0x98, 0x08, 0x9e, 0xbd, 0x0f, 0xd0, 0x79, 0x3d, 0x46, 0x67, 0x7b, 0xbe,
+ 0x9a, 0xb2, 0x77, 0xbd, 0x8f, 0x07, 0x32, 0xbe, 0xd9, 0x66, 0xd5, 0xbd,
+ 0xb2, 0xd8, 0xe0, 0xbd, 0xa1, 0x07, 0xbd, 0x3c, 0x4f, 0x83, 0x19, 0x3e,
+ 0xe9, 0xb9, 0x3b, 0xbe, 0x11, 0x6e, 0x6e, 0xbb, 0x44, 0x08, 0x0b, 0x3e,
+ 0xb9, 0xa6, 0x91, 0x3d, 0x1a, 0x7a, 0x3f, 0xbe, 0x25, 0xa9, 0x02, 0xbe,
+ 0xd8, 0xea, 0x96, 0x3d, 0xe7, 0x04, 0x02, 0xbe, 0x00, 0x10, 0xbc, 0xbd,
+ 0x6f, 0x15, 0xe4, 0xbd, 0xc0, 0xc2, 0x83, 0x3b, 0x94, 0xf5, 0x8a, 0xbe,
+ 0x62, 0x31, 0x7e, 0x3c, 0xaa, 0xf3, 0x5f, 0xbe, 0x47, 0xdf, 0xc4, 0x3c,
+ 0x02, 0x45, 0xc5, 0x3c, 0x8b, 0xf0, 0x4e, 0xbd, 0xff, 0x9b, 0xb4, 0x3d,
+ 0x99, 0x5f, 0xd2, 0x3d, 0x25, 0x86, 0xee, 0x3d, 0xe4, 0x84, 0xca, 0x3c,
+ 0x15, 0x7a, 0x4e, 0xbd, 0x8d, 0xd1, 0xc6, 0xbd, 0x5d, 0xc5, 0x9b, 0x3d,
+ 0xbd, 0x45, 0xbf, 0x3d, 0x5a, 0xf6, 0xf7, 0xbc, 0x0e, 0x00, 0x7d, 0xbd,
+ 0xbd, 0x75, 0x24, 0x3e, 0x02, 0xc9, 0xe6, 0x3d, 0x26, 0x22, 0xde, 0x3c,
+ 0x51, 0x8c, 0x01, 0xbd, 0x4d, 0x20, 0x05, 0xbe, 0xcc, 0x4f, 0xee, 0x3a,
+ 0xb8, 0x01, 0xb3, 0xbd, 0xa4, 0x4f, 0xfb, 0x3d, 0xbe, 0xad, 0x3b, 0xbd,
+ 0x12, 0x02, 0xd8, 0x3d, 0x37, 0x51, 0x8e, 0x3d, 0x8f, 0x09, 0xd6, 0x3d,
+ 0x57, 0xdf, 0xe7, 0x3c, 0x38, 0xe8, 0xeb, 0xbc, 0x7a, 0x60, 0x3d, 0x3d,
+ 0xfc, 0xb1, 0xbb, 0xbd, 0xb7, 0xfc, 0xc8, 0x3d, 0xa5, 0x8f, 0x04, 0xbd,
+ 0xb7, 0xc0, 0xfa, 0xbd, 0x5b, 0xf1, 0x08, 0xbd, 0x68, 0xf5, 0x50, 0xbd,
+ 0xa0, 0xae, 0x20, 0xbd, 0x21, 0xed, 0xa0, 0xbd, 0xa0, 0x01, 0x58, 0xbe,
+ 0xf8, 0xf4, 0x26, 0x39, 0xb5, 0xb3, 0x3b, 0x3e, 0x00, 0xe3, 0xbd, 0xbd,
+ 0x7b, 0xda, 0xac, 0x3d, 0x3e, 0xbf, 0x13, 0x3e, 0xd0, 0xa6, 0xa8, 0x3d,
+ 0x10, 0x32, 0xa5, 0x3d, 0x05, 0x45, 0xb4, 0xbc, 0x7e, 0x2c, 0xe9, 0xbd,
+ 0xae, 0x09, 0xa4, 0xbd, 0xc1, 0xef, 0xdb, 0x3d, 0x75, 0x37, 0xc6, 0xbd,
+ 0xf0, 0xdc, 0xa5, 0xbd, 0xea, 0x96, 0x1b, 0xbe, 0x97, 0xb5, 0x60, 0xbd,
+ 0x61, 0xa8, 0xcb, 0x3d, 0xf3, 0xbc, 0xac, 0xbd, 0x56, 0xf5, 0x0f, 0x3d,
+ 0xda, 0x2f, 0xff, 0x3d, 0x84, 0x07, 0x99, 0xbd, 0x11, 0xc6, 0x6f, 0x3c,
+ 0xf2, 0xef, 0x97, 0xbd, 0x65, 0x8d, 0x80, 0x3c, 0x19, 0x95, 0x0c, 0x3e,
+ 0xfc, 0x12, 0xf7, 0xbd, 0xa7, 0x99, 0xbf, 0x3d, 0xdd, 0xaf, 0x85, 0xbd,
+ 0x50, 0x27, 0x5d, 0xbe, 0xe2, 0xdf, 0x6f, 0xbc, 0xbd, 0xa7, 0x92, 0x3d,
+ 0x1f, 0x94, 0x30, 0xbe, 0x19, 0xb0, 0x98, 0xbd, 0xc5, 0x4b, 0xc1, 0x3d,
+ 0x12, 0x23, 0x03, 0x3d, 0x99, 0xa8, 0x12, 0xbd, 0x22, 0xe7, 0x22, 0x3e,
+ 0x78, 0x7b, 0x60, 0xbd, 0x4b, 0xb3, 0x0c, 0xbe, 0x81, 0x89, 0x90, 0x3d,
+ 0xf9, 0x97, 0xf7, 0xbd, 0xe6, 0x71, 0x36, 0x3d, 0x81, 0xbe, 0xcc, 0xbd,
+ 0x88, 0xae, 0x42, 0x3d, 0xff, 0x52, 0x59, 0xbd, 0x86, 0x6e, 0x5a, 0x3d,
+ 0x74, 0x6e, 0x60, 0x3b, 0xa8, 0x09, 0xe3, 0x3d, 0xfa, 0x06, 0xb8, 0x3c,
+ 0xbd, 0xd3, 0xa6, 0x3d, 0xba, 0x4e, 0xd7, 0x3d, 0xad, 0x57, 0x03, 0x3e,
+ 0xe2, 0xb4, 0xd2, 0x3d, 0x64, 0xe1, 0xc6, 0x3d, 0xdf, 0xa6, 0xff, 0xbd,
+ 0x25, 0x07, 0x25, 0xbe, 0x57, 0x1b, 0x9f, 0x3c, 0xe5, 0x2a, 0x9b, 0xbc,
+ 0x8e, 0xa6, 0xc7, 0x3d, 0xe8, 0x34, 0x12, 0x3e, 0x3c, 0x99, 0x8f, 0xb9,
+ 0x7e, 0x85, 0x42, 0xbd, 0x93, 0x67, 0x4e, 0xbe, 0xd3, 0x85, 0x8b, 0x3d,
+ 0xcb, 0xe3, 0x21, 0x3e, 0x83, 0xce, 0xee, 0xbd, 0x4a, 0xa0, 0xf2, 0x3d,
+ 0x41, 0xe2, 0x65, 0xbe, 0x0d, 0xcb, 0x01, 0xbe, 0xe3, 0xd6, 0x1a, 0xbd,
+ 0x20, 0x91, 0xe0, 0x3d, 0x4d, 0x44, 0xe6, 0xbd, 0xd4, 0x76, 0x9f, 0x3d,
+ 0x25, 0x43, 0x29, 0xbd, 0x16, 0x3c, 0xe3, 0x3d, 0x51, 0x5b, 0x99, 0x3b,
+ 0xc3, 0xaa, 0xd3, 0xbb, 0x46, 0x3c, 0xd1, 0x3d, 0xaf, 0x54, 0x5a, 0xbe,
+ 0xc8, 0x80, 0x0c, 0x3e, 0xa6, 0x99, 0xe0, 0xbe, 0xc0, 0x07, 0xf0, 0x3d,
+ 0xc8, 0x69, 0x86, 0x3d, 0x0f, 0x6d, 0x23, 0xbe, 0x9b, 0x2a, 0xba, 0xbd,
+ 0x91, 0x0d, 0x93, 0xbd, 0x6d, 0x40, 0x92, 0x3d, 0xf7, 0x43, 0xfc, 0xbd,
+ 0xfa, 0x44, 0x90, 0x3d, 0x3d, 0x53, 0xfd, 0x3c, 0x24, 0x4b, 0x86, 0xbc,
+ 0x3f, 0x54, 0x9c, 0x3d, 0xdb, 0x5c, 0x02, 0x3e, 0x3f, 0x87, 0xbe, 0xbd,
+ 0x5f, 0x45, 0xfc, 0x3d, 0xf0, 0x4f, 0xfd, 0x3d, 0xab, 0x20, 0x8e, 0xbd,
+ 0x3f, 0x1e, 0x43, 0x3d, 0xf6, 0xf3, 0xf0, 0x3d, 0x9a, 0x91, 0xdf, 0xbc,
+ 0x6a, 0xf9, 0xae, 0x3d, 0xc4, 0x36, 0xb0, 0x3d, 0x40, 0x4a, 0x8f, 0xbd,
+ 0x2e, 0x72, 0x80, 0x3d, 0x8d, 0x05, 0x51, 0x3e, 0x61, 0x34, 0x8d, 0xbd,
+ 0x9d, 0x0a, 0xfb, 0x3c, 0x70, 0xde, 0xa4, 0xbc, 0x21, 0x0a, 0xc5, 0xbc,
+ 0x36, 0x9e, 0xea, 0x3d, 0x23, 0x57, 0xec, 0xbd, 0x81, 0x0c, 0xbd, 0x3a,
+ 0x55, 0x4e, 0x13, 0x3d, 0x78, 0x0f, 0xb8, 0xbd, 0xbd, 0x07, 0x18, 0xbe,
+ 0xaf, 0x21, 0xe2, 0x3d, 0xef, 0x1a, 0x92, 0xbd, 0xe0, 0xca, 0x6f, 0xbe,
+ 0xeb, 0x30, 0xcf, 0xbd, 0x83, 0xb8, 0xe5, 0x3d, 0xd0, 0x7b, 0x2d, 0x3d,
+ 0x6e, 0xbc, 0x66, 0xbd, 0x28, 0x3b, 0xa4, 0xbc, 0x4c, 0x74, 0x89, 0xbd,
+ 0x05, 0x38, 0x2a, 0xbe, 0xcb, 0x4a, 0x1e, 0x3c, 0xd1, 0xd2, 0x1a, 0xbe,
+ 0x9c, 0x60, 0x22, 0xbe, 0xdf, 0x35, 0x88, 0x3d, 0x19, 0x20, 0x20, 0xbe,
+ 0x25, 0x5f, 0xb8, 0xbd, 0x98, 0xc8, 0x4b, 0xbe, 0x20, 0xcd, 0x49, 0x3d,
+ 0x83, 0xf3, 0x10, 0xbe, 0x03, 0xaa, 0xa7, 0x3d, 0x9e, 0xaf, 0xf6, 0x3d,
+ 0x07, 0xb0, 0xe9, 0xbd, 0xe2, 0xe5, 0x41, 0x3d, 0x63, 0x5a, 0xf9, 0x3c,
+ 0xa0, 0xeb, 0xac, 0x3d, 0x17, 0xa9, 0xe7, 0xbd, 0xac, 0xfd, 0x21, 0xbd,
+ 0x17, 0xcb, 0xfd, 0xbd, 0x35, 0x0b, 0x40, 0x3d, 0xbf, 0x32, 0xdb, 0xbd,
+ 0xfb, 0x08, 0x4b, 0xbe, 0x09, 0xd1, 0x85, 0x3d, 0xcf, 0x42, 0xc7, 0xbd,
+ 0xd2, 0x3f, 0x71, 0x3d, 0x27, 0x02, 0x8b, 0xbd, 0xcd, 0x8b, 0xb9, 0xbd,
+ 0xc7, 0x34, 0xc1, 0x3d, 0xd2, 0xcc, 0x08, 0xbe, 0xc9, 0x50, 0x6e, 0x3c,
+ 0x6c, 0x3b, 0x67, 0xbd, 0x65, 0x1f, 0x3f, 0xba, 0x5f, 0xe0, 0xbd, 0xbd,
+ 0x11, 0x75, 0x13, 0xbd, 0x59, 0xf5, 0xc6, 0xbd, 0x82, 0x2d, 0x05, 0xbe,
+ 0x91, 0x27, 0x40, 0x3d, 0x93, 0xeb, 0x32, 0x3d, 0x54, 0x15, 0x7f, 0x3d,
+ 0x95, 0x99, 0x28, 0xbe, 0xa4, 0xb1, 0x96, 0x3d, 0x5e, 0x95, 0xb6, 0x3d,
+ 0x8e, 0xc8, 0x9d, 0xbc, 0xb7, 0xf3, 0x85, 0xbb, 0x6c, 0x78, 0x5d, 0xbd,
+ 0x15, 0xce, 0x08, 0x3d, 0xf4, 0x7a, 0x98, 0x3d, 0x5d, 0xf5, 0xef, 0xbc,
+ 0x5b, 0x84, 0x17, 0x3c, 0xd9, 0x3f, 0x8d, 0xbc, 0xc1, 0x1e, 0xdc, 0x3d,
+ 0x7c, 0xe0, 0x9b, 0x3d, 0x07, 0xfa, 0x80, 0x3e, 0x11, 0xd5, 0x6b, 0x3c,
+ 0x71, 0xab, 0xdd, 0xbd, 0x49, 0x60, 0x15, 0xbe, 0xba, 0xb0, 0xb0, 0xbd,
+ 0x9d, 0x2c, 0x47, 0x3d, 0xce, 0x6d, 0x17, 0xbb, 0xa1, 0x57, 0xc9, 0xbc,
+ 0x10, 0x88, 0x84, 0xbc, 0xa0, 0xf2, 0x4f, 0x3e, 0x4e, 0xb9, 0xbc, 0xbd,
+ 0x06, 0xf8, 0xa5, 0x3e, 0xa0, 0x50, 0x75, 0xbd, 0xf9, 0xae, 0x68, 0x3d,
+ 0xf1, 0x52, 0xd9, 0xbe, 0x41, 0xcd, 0x16, 0x3d, 0x41, 0x48, 0xc2, 0xbc,
+ 0xcd, 0x17, 0x98, 0xbd, 0xe8, 0x7e, 0x7a, 0xbd, 0xb9, 0x32, 0x99, 0xbd,
+ 0x6d, 0x5e, 0x9a, 0x3e, 0x6a, 0x6f, 0x81, 0xbe, 0xa2, 0xfd, 0x41, 0x3e,
+ 0xfc, 0x0f, 0x07, 0x3e, 0x67, 0xe8, 0x23, 0xbe, 0x5a, 0x8d, 0x5f, 0xbd,
+ 0xf8, 0xf7, 0x4b, 0xbe, 0x3e, 0xbe, 0x8a, 0x3d, 0x49, 0x93, 0x14, 0xbe,
+ 0xe0, 0xd3, 0x87, 0xbd, 0x5a, 0xae, 0x4b, 0xbe, 0x69, 0x86, 0x94, 0x3d,
+ 0x92, 0x47, 0x3a, 0xbe, 0x60, 0xb2, 0x2b, 0xbd, 0xc1, 0x1d, 0xab, 0xbd,
+ 0xe2, 0xcf, 0x12, 0x3e, 0xc2, 0xa4, 0x44, 0xbd, 0x5b, 0x59, 0x35, 0xbe,
+ 0x76, 0xa5, 0xab, 0xbd, 0xcc, 0x24, 0x3f, 0xbe, 0xb1, 0xa5, 0xc4, 0xbb,
+ 0x93, 0xd9, 0x78, 0xbd, 0xa3, 0x33, 0xd2, 0x3e, 0x2e, 0x45, 0xdb, 0xbd,
+ 0xf1, 0x2e, 0x3d, 0x3e, 0xb2, 0xf5, 0x98, 0x3d, 0x68, 0x64, 0x74, 0x3d,
+ 0xb0, 0x00, 0x12, 0x3e, 0xfe, 0xbc, 0x55, 0xbe, 0xcb, 0x66, 0x68, 0x3e,
+ 0xba, 0xd5, 0x39, 0x3e, 0xc6, 0x15, 0x2e, 0xbe, 0x7f, 0xa6, 0x2a, 0x3e,
+ 0xf7, 0x25, 0xd9, 0xbd, 0x89, 0x98, 0x3e, 0xbe, 0x43, 0xd9, 0x49, 0xbd,
+ 0x76, 0xba, 0x3e, 0xbd, 0xf7, 0xab, 0x01, 0xbe, 0x07, 0x2a, 0x64, 0xbd,
+ 0x38, 0x04, 0x43, 0xbe, 0xfd, 0x2b, 0x32, 0x3e, 0x53, 0xdb, 0x83, 0x3c,
+ 0xea, 0x4f, 0x10, 0xbd, 0x3e, 0x55, 0x80, 0x3d, 0x2c, 0xc8, 0x7b, 0xbf,
+ 0xb1, 0xce, 0xe0, 0xbd, 0xa6, 0x0f, 0xa2, 0x3e, 0xd8, 0x4b, 0x5f, 0x3e,
+ 0xc3, 0x30, 0xb7, 0xbe, 0xd5, 0xd9, 0x89, 0xbe, 0xfa, 0x0f, 0x29, 0xbc,
+ 0x86, 0x32, 0xba, 0xbd, 0xcd, 0x7b, 0x8c, 0x3e, 0x87, 0x55, 0x41, 0xbe,
+ 0x3d, 0x1f, 0x67, 0xbd, 0x45, 0xbd, 0x9e, 0x3d, 0x3b, 0x16, 0x8c, 0x3d,
+ 0x1d, 0x70, 0x56, 0x3c, 0x98, 0xe1, 0x13, 0x3d, 0xfe, 0xcb, 0xd0, 0xbe,
+ 0x8c, 0x21, 0xa6, 0xbd, 0x46, 0xd6, 0x06, 0xbe, 0xfb, 0xbe, 0xb1, 0x3e,
+ 0x23, 0x85, 0x09, 0x3e, 0x0e, 0x15, 0x3b, 0xbf, 0x06, 0xdb, 0x12, 0xbe,
+ 0xcc, 0x5b, 0x38, 0xbe, 0xfc, 0x8f, 0x20, 0x3e, 0x91, 0x74, 0x38, 0x3e,
+ 0x37, 0x36, 0x51, 0xbc, 0x27, 0x29, 0x48, 0xbd, 0xee, 0x9e, 0x5b, 0x3d,
+ 0xb5, 0x3f, 0x74, 0xbb, 0x8c, 0xe8, 0xf0, 0xbd, 0x63, 0x95, 0x18, 0x3e,
+ 0x23, 0xab, 0x0f, 0x3d, 0x74, 0xea, 0xfd, 0x3d, 0x80, 0xe7, 0x43, 0xbe,
+ 0xbf, 0x2c, 0x2e, 0xbe, 0x6d, 0xfc, 0x40, 0xbe, 0x58, 0xe1, 0xd5, 0x3b,
+ 0xbd, 0x1e, 0x5b, 0x3d, 0xdb, 0xae, 0xb4, 0x3d, 0x1d, 0x5b, 0x78, 0xbf,
+ 0x35, 0x63, 0xdd, 0xbc, 0x26, 0xfa, 0x20, 0xbe, 0x9a, 0x3f, 0x98, 0xbc,
+ 0xfc, 0x9e, 0x2f, 0x3e, 0x5d, 0x5e, 0xd7, 0xbd, 0x4a, 0x41, 0x62, 0xbe,
+ 0xd1, 0x10, 0xe1, 0xbd, 0xd0, 0xfd, 0xbb, 0xbd, 0x0e, 0xc1, 0x4d, 0xbe,
+ 0xc7, 0x89, 0x60, 0xbe, 0x91, 0x10, 0x9a, 0x3c, 0xde, 0xfc, 0x95, 0x3e,
+ 0x16, 0x42, 0xd7, 0x3d, 0xa6, 0x85, 0x10, 0xbe, 0xb5, 0x7d, 0x61, 0x3e,
+ 0x34, 0xf4, 0x26, 0x3e, 0x0d, 0x50, 0xc3, 0x3d, 0xf3, 0x9b, 0x77, 0xbd,
+ 0x24, 0xed, 0x36, 0x3e, 0x85, 0x5c, 0xce, 0xbb, 0x66, 0xd1, 0x9f, 0xbd,
+ 0xa5, 0x7e, 0xe6, 0xbe, 0xdf, 0x79, 0x09, 0xbe, 0x89, 0xa9, 0x89, 0x3d,
+ 0x15, 0x8d, 0xa1, 0xbd, 0xf9, 0x99, 0x3d, 0x3c, 0xd7, 0x35, 0x7c, 0xbb,
+ 0x87, 0xdf, 0xc6, 0xbd, 0xc2, 0xb1, 0xed, 0x3b, 0xb7, 0x0e, 0x07, 0x3d,
+ 0xc6, 0x6e, 0x39, 0xbd, 0xa0, 0x51, 0xb0, 0xbd, 0x61, 0xce, 0xdf, 0xbe,
+ 0x2f, 0x65, 0x36, 0xbd, 0xb6, 0x26, 0x1b, 0xbd, 0xc5, 0xfe, 0x9e, 0x3d,
+ 0x94, 0x1a, 0x58, 0x3d, 0xe7, 0xe8, 0x71, 0xbd, 0xfa, 0x86, 0xdd, 0x3c,
+ 0x25, 0x1a, 0x43, 0xbd, 0x9c, 0xcf, 0xcb, 0xbd, 0x0f, 0x32, 0xe6, 0x3d,
+ 0x4b, 0xd1, 0x86, 0x3d, 0x3d, 0x63, 0xec, 0xbc, 0xe8, 0x7e, 0x14, 0x3e,
+ 0x95, 0x5b, 0x94, 0x3d, 0xd8, 0x6f, 0xb6, 0xbd, 0xff, 0xec, 0x42, 0x3e,
+ 0x2d, 0xd8, 0x2e, 0xbd, 0xa1, 0x92, 0x58, 0xbe, 0xf4, 0xcd, 0x97, 0x3d,
+ 0x89, 0x42, 0xa7, 0x3c, 0xd5, 0x30, 0x73, 0xbd, 0xe8, 0xdf, 0x0d, 0xbe,
+ 0xe3, 0x72, 0xee, 0xbc, 0x49, 0xc5, 0x28, 0x3d, 0x4c, 0xd5, 0xc7, 0x3d,
+ 0x2d, 0x26, 0x8b, 0x3d, 0xb9, 0x24, 0x5f, 0xbd, 0x60, 0x4e, 0xa2, 0xbc,
+ 0xf3, 0x62, 0x94, 0xbc, 0xfe, 0x33, 0x5c, 0x3d, 0xcf, 0x44, 0x88, 0xbc,
+ 0xb3, 0x75, 0xc1, 0xbd, 0xe6, 0x10, 0x9a, 0xbe, 0x26, 0x0b, 0xd8, 0xbd,
+ 0x1a, 0x0b, 0xe5, 0x39, 0x69, 0xf1, 0x11, 0xbe, 0x20, 0x52, 0x9c, 0x3d,
+ 0x6e, 0x9d, 0xab, 0x3d, 0x96, 0xe3, 0x43, 0xbe, 0xf7, 0x42, 0x7d, 0x3d,
+ 0xf6, 0x99, 0xe0, 0x3c, 0xdb, 0x9e, 0x80, 0xbd, 0x10, 0x41, 0x32, 0x3b,
+ 0xf2, 0xd3, 0x99, 0xbd, 0x10, 0xda, 0xc8, 0x3c, 0x32, 0x05, 0x59, 0xbd,
+ 0x62, 0x4d, 0xf1, 0x3c, 0x8d, 0xd3, 0xf0, 0x3d, 0xaf, 0x24, 0xa8, 0x3c,
+ 0x1e, 0xe0, 0x31, 0x3d, 0xa3, 0xb9, 0x7f, 0x3d, 0x88, 0xfe, 0x84, 0xbe,
+ 0x04, 0xae, 0x75, 0x3d, 0x9f, 0x4d, 0x85, 0xbc, 0x68, 0xb5, 0xed, 0x3c,
+ 0x7d, 0xac, 0x27, 0xbe, 0xfb, 0xf8, 0x0a, 0xbe, 0x07, 0x83, 0x18, 0xbe,
+ 0xcf, 0xa7, 0x73, 0x3d, 0xd1, 0x75, 0x86, 0xbd, 0xde, 0x9b, 0x76, 0xbd,
+ 0x96, 0x90, 0x44, 0x3d, 0x45, 0x00, 0x0e, 0xbe, 0xab, 0x58, 0xa9, 0x3d,
+ 0xb1, 0xc5, 0xa5, 0xbd, 0xcf, 0x8d, 0x88, 0xbc, 0x8d, 0x7e, 0xa2, 0xbd,
+ 0x48, 0x4b, 0x7b, 0xbd, 0x2c, 0x36, 0x21, 0x3d, 0x3c, 0xaf, 0x8a, 0x3d,
+ 0x4d, 0xbc, 0x15, 0xbd, 0x75, 0x81, 0xf5, 0xbc, 0x93, 0x42, 0x25, 0xbd,
+ 0x79, 0x0f, 0xd1, 0x3c, 0x47, 0xbf, 0xae, 0x3d, 0xbd, 0xd5, 0x64, 0xbd,
+ 0x10, 0x9b, 0x7f, 0xbd, 0x6d, 0xc5, 0xad, 0xbd, 0x5a, 0xca, 0xc1, 0x3d,
+ 0xfe, 0xae, 0x02, 0x3e, 0xbf, 0x17, 0x9e, 0xbc, 0x59, 0xc7, 0x07, 0x3e,
+ 0x9d, 0x10, 0x09, 0xbc, 0x02, 0x23, 0x17, 0x3d, 0x18, 0xa8, 0x4c, 0x3c,
+ 0xaa, 0x24, 0xbb, 0xbd, 0x9a, 0xbc, 0xd4, 0x3d, 0x2a, 0xb7, 0xac, 0xbc,
+ 0x0a, 0x70, 0xd9, 0x3d, 0x14, 0x6f, 0x81, 0xbd, 0xef, 0xb5, 0x18, 0x3d,
+ 0xc2, 0xfd, 0xe8, 0x3d, 0xae, 0xbb, 0xb2, 0x3d, 0xb1, 0x3e, 0x5f, 0xbd,
+ 0x06, 0x90, 0x94, 0xbd, 0x22, 0x9e, 0x99, 0x3d, 0x39, 0x0a, 0x00, 0xbd,
+ 0xdf, 0x3d, 0xb1, 0xbe, 0x17, 0x2f, 0x23, 0xbc, 0x94, 0x7c, 0x49, 0xbd,
+ 0xe7, 0x4d, 0xed, 0xbc, 0x80, 0xe0, 0xa5, 0xbd, 0x52, 0x6b, 0x55, 0x3e,
+ 0x1d, 0x53, 0xc5, 0xbd, 0x3a, 0xb1, 0x8a, 0x3d, 0x13, 0x30, 0x11, 0xbb,
+ 0x70, 0x06, 0x6d, 0xbe, 0x81, 0x06, 0x38, 0xbe, 0x14, 0x12, 0x0f, 0xbe,
+ 0x25, 0xd1, 0x19, 0x3e, 0xa3, 0x3d, 0xaf, 0x3d, 0xb5, 0x32, 0x02, 0x3e,
+ 0x9d, 0xeb, 0x50, 0x3e, 0x39, 0x2d, 0x39, 0x3d, 0x6f, 0x02, 0xd4, 0x3e,
+ 0xd2, 0x35, 0xe6, 0xbe, 0xaf, 0x16, 0x90, 0x3d, 0xe5, 0xfb, 0x0e, 0xbd,
+ 0x78, 0xe5, 0xac, 0xbe, 0xa1, 0x2d, 0x50, 0xbe, 0xde, 0x19, 0x86, 0xbc,
+ 0x0a, 0x04, 0x23, 0xbe, 0xfb, 0x46, 0xc0, 0xbd, 0xe2, 0x67, 0x22, 0xbc,
+ 0x01, 0x86, 0x7e, 0x3e, 0x3b, 0x9e, 0xeb, 0xbd, 0xd8, 0x37, 0x91, 0x3e,
+ 0xdb, 0x93, 0x01, 0x3f, 0x78, 0xe0, 0xa7, 0x3c, 0x8e, 0x30, 0xe4, 0x3d,
+ 0x93, 0xa1, 0xd5, 0x3e, 0xa1, 0xdd, 0x13, 0xbd, 0x99, 0x76, 0x16, 0x3e,
+ 0xa4, 0x4b, 0xed, 0xbe, 0xa8, 0xc4, 0xab, 0x3d, 0x5d, 0x94, 0x95, 0xbe,
+ 0x90, 0x8c, 0x8d, 0xbb, 0xc0, 0x0d, 0x38, 0xbe, 0xbb, 0xd5, 0xf2, 0xbc,
+ 0x3c, 0x43, 0x05, 0xbe, 0x06, 0x3f, 0xb8, 0xbe, 0x1f, 0xab, 0x28, 0xbe,
+ 0x3b, 0x92, 0xdc, 0x3d, 0x19, 0x0b, 0x99, 0xbd, 0x4d, 0x6e, 0xcb, 0x3e,
+ 0x80, 0x84, 0xbc, 0x3c, 0x3e, 0x2c, 0x94, 0xbe, 0x6d, 0x1d, 0xa5, 0xbe,
+ 0x3b, 0xf9, 0x94, 0xbe, 0x09, 0x43, 0x9d, 0xbe, 0x13, 0x46, 0xaf, 0xbc,
+ 0x10, 0xf5, 0x67, 0x3e, 0x16, 0x18, 0x13, 0x3e, 0xec, 0x52, 0x2a, 0xbe,
+ 0xcb, 0xd4, 0xd2, 0xbd, 0x4e, 0x97, 0xab, 0xbd, 0x47, 0x32, 0x73, 0xbe,
+ 0x34, 0xed, 0x19, 0x3e, 0xe4, 0xfa, 0x67, 0xbe, 0xf9, 0x2a, 0x95, 0xbd,
+ 0x97, 0xe1, 0x2a, 0xbe, 0x9d, 0x85, 0xce, 0x3d, 0xd3, 0xf4, 0xa2, 0xbd,
+ 0x0b, 0x9f, 0x9f, 0x3e, 0x17, 0xb7, 0x80, 0xbe, 0xfb, 0x31, 0xba, 0xbc,
+ 0x54, 0x36, 0xc6, 0x3e, 0xfb, 0xc5, 0xc1, 0xbd, 0xbe, 0xa4, 0x49, 0xbe,
+ 0x16, 0x0d, 0x6e, 0x3e, 0xdb, 0x33, 0x42, 0xbe, 0x0c, 0x02, 0xca, 0x3d,
+ 0x4c, 0x30, 0x72, 0xbe, 0xb6, 0x11, 0x37, 0xbe, 0x74, 0x70, 0x1e, 0x3e,
+ 0xc3, 0xdd, 0xa7, 0x3e, 0xd3, 0x76, 0x55, 0x3d, 0xbe, 0xa4, 0xb7, 0xbc,
+ 0xa4, 0x7e, 0x4b, 0x3d, 0x95, 0xda, 0x23, 0x3d, 0xe5, 0xab, 0x5a, 0xbe,
+ 0xe1, 0x6f, 0x8e, 0x3e, 0x1b, 0x4a, 0x0f, 0xbe, 0xad, 0x21, 0x86, 0x3e,
+ 0xe7, 0x7f, 0x55, 0xbe, 0x01, 0x28, 0x97, 0xbe, 0xd4, 0xe7, 0xa2, 0xbe,
+ 0x32, 0xb4, 0x3c, 0x3e, 0xb5, 0x37, 0x0c, 0xbe, 0x06, 0x1c, 0xa2, 0xbe,
+ 0xa3, 0xf8, 0xbb, 0xbd, 0xd4, 0x93, 0x09, 0x3e, 0x20, 0xe5, 0xb1, 0xbe,
+ 0x42, 0xb4, 0x94, 0x3e, 0xfa, 0xc2, 0x08, 0xbe, 0xe0, 0x84, 0x4e, 0x3e,
+ 0x0e, 0x16, 0x86, 0x3e, 0x6f, 0x0f, 0x61, 0x3e, 0x4f, 0x47, 0xdf, 0x3c,
+ 0xdf, 0xdf, 0x75, 0xbd, 0x9a, 0x1f, 0x65, 0xbe, 0xf6, 0x13, 0x87, 0xbe,
+ 0xaf, 0x55, 0xfe, 0xbc, 0xad, 0x70, 0xfd, 0x3d, 0x8a, 0x6c, 0xd0, 0x3a,
+ 0x04, 0x71, 0x9e, 0xbb, 0xc6, 0xaa, 0x82, 0x3d, 0xdc, 0x53, 0xaf, 0xbe,
+ 0x1a, 0x6f, 0x3b, 0x39, 0x1e, 0x1d, 0x00, 0xbf, 0x8c, 0xe5, 0x98, 0x3b,
+ 0x2e, 0xee, 0x08, 0x3e, 0xcc, 0x49, 0xfd, 0x3d, 0x9a, 0x6e, 0x4e, 0xbe,
+ 0xab, 0xc1, 0x81, 0xbd, 0x0a, 0x81, 0x55, 0x3e, 0xde, 0xaf, 0x7d, 0xbe,
+ 0x4e, 0x52, 0x84, 0xbe, 0x92, 0xaf, 0x22, 0xbd, 0xd0, 0x2a, 0xf6, 0x3d,
+ 0x62, 0xc2, 0xa0, 0xbc, 0x01, 0x85, 0x06, 0xbe, 0xcd, 0x57, 0xa4, 0x3d,
+ 0x73, 0x22, 0x80, 0xbd, 0x6a, 0x35, 0xff, 0x3d, 0x53, 0x89, 0xa4, 0x3d,
+ 0x43, 0xb6, 0xa1, 0x3d, 0x48, 0xf9, 0x00, 0xbc, 0xd3, 0x35, 0xe3, 0xbd,
+ 0x11, 0x18, 0x8f, 0x3c, 0xda, 0x86, 0x7a, 0xbd, 0x32, 0x4f, 0xc4, 0x3d,
+ 0x05, 0x07, 0x1d, 0x3d, 0x77, 0x94, 0x61, 0xbd, 0x79, 0xcb, 0x95, 0xbe,
+ 0x6c, 0x62, 0x02, 0xba, 0x24, 0x19, 0x29, 0xbe, 0x70, 0x66, 0xe9, 0xbd,
+ 0x04, 0xbf, 0xe7, 0xbd, 0xf8, 0xf5, 0x1a, 0xbe, 0x45, 0x0c, 0x87, 0x3d,
+ 0x13, 0x29, 0xfe, 0xbc, 0xfc, 0x7a, 0x10, 0xbe, 0x07, 0x59, 0xc4, 0x3b,
+ 0x81, 0x37, 0x16, 0xbe, 0x6d, 0x64, 0xdb, 0xbd, 0xdb, 0x5f, 0xe2, 0xbc,
+ 0x78, 0xd7, 0x9b, 0xbd, 0x60, 0x1f, 0x05, 0xbe, 0xa9, 0x9d, 0xbe, 0x3d,
+ 0xc7, 0xde, 0x1a, 0x3e, 0xc5, 0x1f, 0x5a, 0x3e, 0xda, 0x10, 0x5d, 0xbc,
+ 0x28, 0x5e, 0xf8, 0xbb, 0xc1, 0xa0, 0xfa, 0xbd, 0xef, 0xbb, 0xd2, 0x3d,
+ 0xde, 0xf9, 0xcf, 0xbc, 0x3a, 0x29, 0x85, 0x3c, 0x46, 0xd3, 0xbf, 0x3d,
+ 0xa4, 0x4a, 0xf0, 0x3d, 0x6d, 0xdb, 0x1a, 0xbd, 0xa9, 0x01, 0xf0, 0x3c,
+ 0xb0, 0x86, 0x21, 0xbe, 0xa5, 0x91, 0x76, 0x3c, 0x6c, 0xd8, 0xdc, 0xbd,
+ 0x90, 0xfb, 0x50, 0xbc, 0xa6, 0x6b, 0x04, 0xbd, 0xde, 0x41, 0x3a, 0x3d,
+ 0xf1, 0x8e, 0x1e, 0xbe, 0x47, 0x30, 0x78, 0x3d, 0x82, 0xb4, 0x26, 0xbe,
+ 0x0e, 0x41, 0x96, 0x3d, 0x63, 0x37, 0x15, 0x3d, 0x66, 0x83, 0x3c, 0xbe,
+ 0x61, 0x71, 0xfd, 0xbd, 0x06, 0xbf, 0xbb, 0x3b, 0xdc, 0x36, 0xe0, 0x3c,
+ 0x43, 0xc7, 0x73, 0x3b, 0xe2, 0x55, 0xc0, 0x3d, 0xd5, 0xf4, 0x1e, 0xbd,
+ 0x86, 0x28, 0xf9, 0xbd, 0xef, 0x67, 0x80, 0x3d, 0x8b, 0xbc, 0x0d, 0xbe,
+ 0x97, 0x6b, 0x10, 0xbe, 0x41, 0xe0, 0x6d, 0x3d, 0x0f, 0x12, 0x91, 0xbd,
+ 0xc6, 0xc4, 0x61, 0xbd, 0x45, 0xdb, 0x94, 0xbb, 0x00, 0xcf, 0xa1, 0x3d,
+ 0x55, 0x44, 0xca, 0x3d, 0x5a, 0x98, 0x67, 0x3e, 0x83, 0xe2, 0xb8, 0xbd,
+ 0x39, 0xfb, 0x98, 0xbb, 0x33, 0x66, 0xaa, 0x3c, 0x74, 0xf0, 0xa9, 0xbd,
+ 0x29, 0x4c, 0x9d, 0xbd, 0x60, 0x3c, 0x80, 0xbd, 0xb2, 0x77, 0x62, 0xbd,
+ 0xcb, 0xa2, 0x9a, 0xba, 0x9b, 0x52, 0x2f, 0x3e, 0xef, 0x6e, 0x4d, 0xbb,
+ 0xfc, 0x6a, 0xba, 0xbd, 0xb6, 0xb1, 0x08, 0x3d, 0x86, 0xc8, 0xa7, 0x3c,
+ 0x04, 0x76, 0x1f, 0xbe, 0xe4, 0x63, 0x76, 0x3e, 0x91, 0x5e, 0x85, 0xbd,
+ 0x0f, 0xbe, 0x37, 0xbd, 0x19, 0x7a, 0x88, 0x3d, 0xb0, 0x80, 0x19, 0x3e,
+ 0x06, 0xb9, 0x89, 0x39, 0xe0, 0xce, 0xe0, 0xbd, 0x60, 0x68, 0x7e, 0x3d,
+ 0x2d, 0xdc, 0xb5, 0xbd, 0x80, 0x00, 0x55, 0xbe, 0x47, 0x28, 0x03, 0x3c,
+ 0xb8, 0xa7, 0x1a, 0x3d, 0x13, 0x3e, 0xec, 0xbd, 0xbe, 0xc5, 0x1c, 0x3d,
+ 0x60, 0x1a, 0xf7, 0xbd, 0x3d, 0x1e, 0xd4, 0xbc, 0x82, 0x20, 0x8e, 0x3d,
+ 0x00, 0x58, 0xef, 0xbb, 0xc3, 0x76, 0xa3, 0x3d, 0x21, 0x09, 0x0c, 0x3d,
+ 0x7d, 0xd9, 0x99, 0xbd, 0xa6, 0x3b, 0x0a, 0x3d, 0xf4, 0xa2, 0xa0, 0x3d,
+ 0xaa, 0xec, 0x62, 0xbd, 0x6d, 0xb6, 0x6c, 0xbd, 0x8f, 0xc3, 0xb4, 0xbc,
+ 0x0f, 0x89, 0x62, 0xbc, 0xaf, 0x0c, 0x37, 0xbd, 0x03, 0xa3, 0x98, 0xbd,
+ 0x14, 0x47, 0x26, 0xbe, 0xef, 0xd6, 0xb8, 0xbd, 0x08, 0x1b, 0x8e, 0xbd,
+ 0x5b, 0x28, 0x8a, 0x3d, 0x9d, 0x34, 0x3b, 0xbd, 0x0d, 0x2e, 0x37, 0x3d,
+ 0x7b, 0xbc, 0x23, 0xbe, 0x1d, 0x0d, 0x27, 0x3e, 0xfb, 0x1b, 0x52, 0xbd,
+ 0x0f, 0xb3, 0xe4, 0x3d, 0xed, 0x49, 0x8e, 0xbd, 0x25, 0x3a, 0x53, 0x3d,
+ 0xdd, 0x0c, 0xfb, 0x3c, 0xe4, 0x05, 0xfb, 0x3d, 0x62, 0xa4, 0xe4, 0x3d,
+ 0xed, 0xf2, 0x17, 0x3e, 0x79, 0x84, 0x08, 0xbd, 0x42, 0x8e, 0x6b, 0xbe,
+ 0xd2, 0xda, 0xa4, 0x3d, 0xa4, 0xa5, 0x96, 0xbe, 0x5b, 0x2e, 0x62, 0xbd,
+ 0xb4, 0x5d, 0x2c, 0xbc, 0x40, 0x6a, 0xc7, 0xbd, 0x09, 0x72, 0xff, 0xbc,
+ 0x7c, 0xaf, 0xa9, 0xbd, 0x42, 0x60, 0x7d, 0x3b, 0x83, 0x5a, 0x84, 0x3b,
+ 0x85, 0xfc, 0x2e, 0xbc, 0x37, 0xea, 0xcc, 0x3d, 0x83, 0xf3, 0xe1, 0xbd,
+ 0x15, 0x80, 0xf7, 0xbc, 0xae, 0xb1, 0x01, 0xbe, 0x0d, 0x3c, 0xba, 0xbd,
+ 0xeb, 0x60, 0x83, 0xbb, 0xed, 0x43, 0x99, 0x3d, 0x51, 0xbd, 0xb0, 0xbd,
+ 0x3f, 0xb3, 0x16, 0xbe, 0xf3, 0x9b, 0x82, 0x3d, 0x8b, 0xa0, 0x68, 0x3d,
+ 0xf3, 0x55, 0xa8, 0x3d, 0xde, 0xd3, 0x00, 0x3e, 0x80, 0xf5, 0xa3, 0xbc,
+ 0x22, 0x0e, 0xec, 0x3d, 0x5f, 0x2a, 0xa6, 0xbd, 0xf2, 0x77, 0xb3, 0x3d,
+ 0xea, 0x2b, 0xce, 0x3b, 0x2a, 0x4d, 0x04, 0x3b, 0xb2, 0xab, 0x61, 0x3d,
+ 0x78, 0x29, 0xc1, 0x3c, 0x1a, 0x9f, 0xcd, 0x3d, 0x77, 0xec, 0xab, 0x3d,
+ 0xd7, 0x3b, 0x82, 0x39, 0xd7, 0x28, 0x7d, 0xbc, 0x87, 0x9d, 0x30, 0x3d,
+ 0x75, 0x33, 0x29, 0xbd, 0xce, 0xfe, 0xc6, 0xbc, 0x86, 0xc8, 0x58, 0xbd,
+ 0x18, 0x84, 0x2e, 0x3d, 0xe1, 0xde, 0x19, 0x3e, 0xec, 0x2c, 0x88, 0xbb,
+ 0x43, 0xc0, 0x26, 0x3d, 0x91, 0x5f, 0xec, 0xbc, 0x8f, 0xb1, 0x88, 0x3d,
+ 0x41, 0x3f, 0xf1, 0x3c, 0x62, 0xa7, 0x90, 0x3d, 0x71, 0x63, 0x1b, 0xbe,
+ 0xec, 0x08, 0x9a, 0xbd, 0x65, 0x87, 0xe5, 0x3d, 0xd3, 0x52, 0x52, 0xbe,
+ 0x27, 0xf5, 0x9c, 0xbd, 0xda, 0x5b, 0x01, 0xbe, 0xe7, 0x08, 0x53, 0x3e,
+ 0xb8, 0x82, 0x47, 0xbd, 0x97, 0x28, 0xc3, 0x3b, 0xc7, 0xed, 0x19, 0x3a,
+ 0xcd, 0x08, 0xea, 0xbd, 0xfb, 0xbb, 0x1f, 0xbe, 0xe1, 0xe8, 0x21, 0x3c,
+ 0x03, 0xf6, 0x89, 0xbd, 0x5a, 0x41, 0x40, 0x3d, 0xe9, 0x8a, 0x9e, 0x3d,
+ 0x3f, 0x56, 0x32, 0xbe, 0x75, 0x09, 0x52, 0x3e, 0x94, 0xdc, 0xb6, 0x3d,
+ 0x27, 0x18, 0x9a, 0xbd, 0xec, 0xff, 0xf8, 0x3d, 0xbf, 0x9f, 0x4b, 0xbd,
+ 0xf4, 0x87, 0xc3, 0x3d, 0xa4, 0x52, 0x64, 0x3e, 0x74, 0x9c, 0x43, 0xbd,
+ 0x97, 0xf0, 0xe2, 0xbd, 0xd4, 0x67, 0x3a, 0x3e, 0x72, 0x4f, 0xbe, 0xbc,
+ 0x61, 0x12, 0xb7, 0xbd, 0xe1, 0xc5, 0x26, 0xbe, 0xaa, 0x59, 0xb7, 0xbc,
+ 0xbd, 0x8c, 0xb9, 0xbd, 0x15, 0xe6, 0x5d, 0x3d, 0x1c, 0xc6, 0x66, 0xbd,
+ 0x2b, 0x50, 0xd7, 0x3b, 0x3b, 0x91, 0xea, 0xbd, 0x70, 0x1b, 0xa9, 0x3d,
+ 0xad, 0xf7, 0x9a, 0xbd, 0xc8, 0x9f, 0xf4, 0x3d, 0x53, 0xfa, 0xe0, 0x3c,
+ 0xd2, 0x01, 0x57, 0x3e, 0x20, 0xbd, 0x74, 0xbc, 0xbc, 0x0f, 0x2e, 0xbe,
+ 0xea, 0xe6, 0x10, 0xbe, 0x5f, 0x92, 0x7e, 0x3d, 0xbe, 0xb7, 0xd6, 0xbd,
+ 0x76, 0x59, 0xcd, 0xbc, 0xd3, 0x8b, 0xb6, 0xbd, 0x94, 0xee, 0x4a, 0xbd,
+ 0x26, 0x75, 0x1c, 0xbd, 0xbc, 0x0a, 0x3f, 0xbe, 0xb5, 0x74, 0x93, 0xbc,
+ 0x5f, 0x7e, 0x91, 0xbd, 0x39, 0xbf, 0x91, 0x3d, 0x36, 0xe7, 0x1a, 0x3e,
+ 0x88, 0x08, 0xca, 0x3d, 0x29, 0x55, 0x0c, 0x3c, 0xe4, 0x08, 0x04, 0x3d,
+ 0x0e, 0x96, 0xc0, 0x3d, 0xc8, 0xa8, 0xbf, 0x3e, 0xcd, 0x27, 0x21, 0x3e,
+ 0xd6, 0x54, 0xf3, 0x3d, 0x3b, 0xd4, 0x25, 0x3e, 0x0f, 0x7f, 0x95, 0x3d,
+ 0x04, 0x09, 0x54, 0xbe, 0x39, 0x47, 0xf7, 0xbd, 0x0b, 0xcb, 0xce, 0xbd,
+ 0x80, 0xa5, 0x89, 0xbd, 0x6e, 0xb4, 0xe4, 0xbd, 0xf8, 0xc1, 0x00, 0xbe,
+ 0x49, 0xfa, 0x0b, 0x3e, 0x3c, 0x8f, 0xa7, 0x3d, 0x9f, 0x47, 0x70, 0xbd,
+ 0x73, 0x23, 0x27, 0x3e, 0xff, 0x1e, 0x14, 0xbd, 0x05, 0x21, 0x65, 0xba,
+ 0x64, 0x5e, 0xf7, 0x3c, 0xf2, 0x40, 0xad, 0x3d, 0x5a, 0xef, 0xb8, 0xbd,
+ 0x4a, 0x09, 0x30, 0x3e, 0x09, 0x6a, 0x19, 0xbf, 0xb2, 0x1a, 0x84, 0xbe,
+ 0x6f, 0x01, 0xa7, 0xbe, 0x57, 0x62, 0xe6, 0xbd, 0x1b, 0x29, 0xee, 0x3e,
+ 0x3b, 0x67, 0xf0, 0xbd, 0x7f, 0x0a, 0xd0, 0x3d, 0x42, 0xd3, 0x0a, 0xbd,
+ 0x71, 0x1c, 0x96, 0xbd, 0x07, 0xb0, 0x1b, 0xbe, 0x2c, 0x57, 0xc7, 0x3d,
+ 0x8f, 0xb6, 0xf4, 0x3d, 0x7a, 0xdc, 0xd1, 0x3e, 0xce, 0x0f, 0x6b, 0xbe,
+ 0x04, 0xde, 0x19, 0x3d, 0x02, 0x3f, 0x3c, 0x3e, 0xcc, 0x0f, 0x59, 0x3e,
+ 0x33, 0x61, 0x21, 0x3e, 0x4a, 0xca, 0xa8, 0xbd, 0x92, 0x93, 0xb2, 0x3d,
+ 0x7a, 0x16, 0x2e, 0xbe, 0x8e, 0x30, 0xe2, 0x3c, 0x35, 0xb1, 0x11, 0xbe,
+ 0xa3, 0x9a, 0x77, 0x3e, 0x7d, 0xf2, 0x4e, 0xbe, 0x51, 0x33, 0xbc, 0x3e,
+ 0x1e, 0xea, 0xfd, 0xbd, 0xc7, 0xc1, 0xce, 0x3d, 0xd8, 0xa0, 0x40, 0xbe,
+ 0xb5, 0xc0, 0xa9, 0x3d, 0x72, 0xb0, 0x22, 0xbe, 0x73, 0xb1, 0xf4, 0x3c,
+ 0x60, 0x7d, 0x06, 0xbe, 0x2a, 0x14, 0x9a, 0x3d, 0xc5, 0xec, 0x25, 0xbf,
+ 0x1e, 0xa0, 0x2f, 0xbe, 0x73, 0x70, 0x27, 0x3e, 0xca, 0xc5, 0x39, 0x3c,
+ 0x73, 0xef, 0x39, 0x3e, 0x15, 0xf2, 0x48, 0xbe, 0x6b, 0x00, 0x36, 0xbe,
+ 0x6e, 0x6e, 0x49, 0x3d, 0xb0, 0xdc, 0xb1, 0x3d, 0x61, 0x33, 0xaa, 0xbd,
+ 0xed, 0x61, 0x8a, 0xbe, 0x01, 0xf0, 0xe2, 0xbd, 0x55, 0xc2, 0x28, 0xbe,
+ 0x3a, 0xa9, 0x26, 0x3c, 0x7a, 0x35, 0xee, 0x3d, 0xa3, 0xf4, 0x64, 0xbe,
+ 0x03, 0x94, 0xc2, 0xbd, 0x6a, 0xb1, 0x8d, 0x3e, 0x89, 0x69, 0xed, 0x3d,
+ 0x32, 0x11, 0xad, 0x3e, 0x00, 0xf4, 0x77, 0xbe, 0xbc, 0xb3, 0x09, 0xbd,
+ 0x56, 0x9e, 0x0f, 0x3d, 0x57, 0xc6, 0xb3, 0x3e, 0x85, 0xd2, 0x92, 0x3c,
+ 0x8c, 0x27, 0x95, 0xba, 0xc0, 0x35, 0x42, 0xbd, 0x9b, 0x8e, 0x29, 0xbd,
+ 0xee, 0xeb, 0x9f, 0xbe, 0xc3, 0xbb, 0xd2, 0xbd, 0xd6, 0xb1, 0x1b, 0x3b,
+ 0x1c, 0x7d, 0x59, 0xbd, 0x26, 0xb4, 0x29, 0x3e, 0x96, 0x93, 0x44, 0xbe,
+ 0x29, 0xfd, 0xaf, 0xbc, 0x16, 0x2f, 0x8a, 0xbe, 0x74, 0xd3, 0xa5, 0x3e,
+ 0x44, 0x5a, 0xb6, 0x3e, 0xe3, 0xfd, 0x06, 0xbf, 0xa4, 0x54, 0xbc, 0xbe,
+ 0x52, 0x4a, 0x87, 0x3c, 0x6e, 0xb5, 0xde, 0xbe, 0x56, 0xff, 0xac, 0x3e,
+ 0x87, 0x33, 0x89, 0x3d, 0x6d, 0x04, 0x3b, 0x3e, 0xe1, 0xd4, 0x37, 0xbe,
+ 0x4f, 0xec, 0xd8, 0xbd, 0xc0, 0xf5, 0x1a, 0x3e, 0x99, 0xf7, 0x0d, 0xbe,
+ 0xbb, 0x62, 0xbf, 0x3d, 0x7b, 0x6d, 0x68, 0xbd, 0x9d, 0xfb, 0x01, 0xbe,
+ 0xe0, 0xff, 0x38, 0x3e, 0x5e, 0x37, 0x8a, 0x3c, 0x7b, 0x1d, 0xe2, 0xbd,
+ 0xbb, 0x36, 0x94, 0xbd, 0x69, 0x5c, 0x2f, 0x3b, 0x9b, 0x08, 0x43, 0x3c,
+ 0x79, 0xf7, 0x58, 0x3d, 0x2d, 0xfb, 0x71, 0x3d, 0xb7, 0x13, 0xfb, 0xbc,
+ 0xe5, 0x24, 0xb4, 0xbe, 0x60, 0x0b, 0xbb, 0x3d, 0xd2, 0xf2, 0xf0, 0xbc,
+ 0x67, 0x0d, 0xa2, 0xbd, 0xc4, 0x69, 0x06, 0x3e, 0x42, 0x7e, 0x8e, 0x3c,
+ 0xef, 0xf1, 0xd0, 0x3d, 0xb8, 0x6a, 0x02, 0x3e, 0x96, 0x52, 0x8e, 0xbb,
+ 0x6c, 0x4f, 0x94, 0xbb, 0x28, 0x59, 0x59, 0xbd, 0xad, 0x91, 0x50, 0xbe,
+ 0x48, 0xe0, 0xc6, 0x3c, 0xe0, 0x76, 0x10, 0x3d, 0x8f, 0xc5, 0x5b, 0xbe,
+ 0x33, 0xe7, 0x61, 0xbd, 0x2b, 0xcb, 0xaf, 0x3d, 0x38, 0x54, 0x1a, 0xbe,
+ 0xec, 0xdf, 0xa4, 0xbd, 0x43, 0x9e, 0x08, 0xbe, 0xab, 0xbe, 0xa8, 0x3d,
+ 0x6e, 0xfb, 0xdc, 0x3d, 0x21, 0xe4, 0x6c, 0xbe, 0x9b, 0x27, 0xc0, 0xbc,
+ 0x07, 0xdd, 0xe4, 0xbc, 0x7c, 0xd7, 0x8e, 0xbe, 0xb1, 0x52, 0x5a, 0xbd,
+ 0xd0, 0x4a, 0x76, 0xbc, 0x29, 0xd3, 0x2b, 0xbe, 0xc5, 0x57, 0xde, 0x3d,
+ 0x17, 0xac, 0xd3, 0xbc, 0x2f, 0x16, 0x70, 0xbc, 0x51, 0xfe, 0x1d, 0x3c,
+ 0xbc, 0x51, 0xc1, 0x3c, 0x6d, 0xbc, 0xed, 0xbd, 0xcd, 0xb1, 0xd5, 0x3d,
+ 0x19, 0x87, 0x00, 0xbc, 0x90, 0xf2, 0x45, 0xbe, 0x1c, 0xb8, 0x4d, 0xbd,
+ 0xeb, 0xe5, 0x08, 0x3e, 0x05, 0x7f, 0x8e, 0xbd, 0x0b, 0xfd, 0x0e, 0x3e,
+ 0x82, 0xdd, 0x94, 0x3d, 0x2a, 0xc0, 0xa8, 0xbe, 0x1e, 0x6d, 0xf1, 0x3d,
+ 0xc6, 0xba, 0xc8, 0xbc, 0x5f, 0x2f, 0x72, 0xbc, 0xd9, 0xfb, 0x3c, 0xbd,
+ 0xc9, 0xd3, 0xdb, 0xbc, 0x2f, 0xcf, 0x0a, 0xbe, 0xeb, 0x7f, 0x21, 0xbe,
+ 0x96, 0x18, 0x0b, 0x3e, 0x36, 0x9c, 0xd3, 0x3d, 0x67, 0xd3, 0xb6, 0x3d,
+ 0xab, 0xae, 0x5d, 0x3c, 0x41, 0x17, 0x83, 0xbd, 0x76, 0x82, 0x9b, 0x3c,
+ 0x05, 0xb1, 0xd1, 0x3c, 0x77, 0x63, 0x6a, 0x3d, 0x71, 0x97, 0x85, 0xbb,
+ 0xa2, 0xdc, 0x52, 0xbd, 0x7b, 0x6d, 0x8e, 0x3d, 0x51, 0x96, 0x4a, 0xbe,
+ 0xa8, 0x19, 0x87, 0x3c, 0xa3, 0x80, 0x0c, 0xbe, 0xa8, 0xc3, 0x38, 0xbd,
+ 0xf0, 0x43, 0x90, 0xbd, 0x65, 0x79, 0x2b, 0xbe, 0x6a, 0xc6, 0xe1, 0x3d,
+ 0x36, 0x90, 0x11, 0xbd, 0x76, 0x80, 0x80, 0x3d, 0xff, 0x06, 0x97, 0x3a,
+ 0xec, 0x60, 0x31, 0x3d, 0x92, 0x0c, 0xca, 0x3d, 0xfe, 0x13, 0x25, 0x3d,
+ 0xf2, 0xd9, 0x86, 0x3d, 0x7a, 0x22, 0x46, 0xbd, 0xdd, 0xce, 0x8b, 0x3d,
+ 0x39, 0xed, 0x73, 0x3c, 0xe5, 0xf7, 0xd9, 0x3d, 0x63, 0x90, 0x8d, 0xbd,
+ 0xf1, 0x45, 0x36, 0x3d, 0x44, 0xaa, 0x15, 0xbe, 0x79, 0x31, 0xc1, 0x3d,
+ 0x66, 0x70, 0xff, 0xbd, 0x37, 0xaa, 0x8e, 0xbd, 0x89, 0xb6, 0x9f, 0x3d,
+ 0x46, 0x99, 0x44, 0xbd, 0x41, 0x58, 0x1f, 0xbe, 0x68, 0xfb, 0x23, 0xbc,
+ 0xf1, 0xfc, 0xab, 0x3c, 0x30, 0xe8, 0x12, 0x3e, 0x04, 0x3f, 0x0b, 0x3e,
+ 0x14, 0x20, 0x5c, 0xbd, 0xc2, 0x67, 0xae, 0x3d, 0x3e, 0x4e, 0xc9, 0xbd,
+ 0xff, 0xd2, 0xaa, 0x3c, 0x0f, 0x74, 0x27, 0xbd, 0xbf, 0xc0, 0x90, 0x3c,
+ 0xc2, 0xaa, 0xc7, 0x3c, 0xa1, 0x7a, 0x1c, 0x3e, 0x55, 0x9f, 0x08, 0x3d,
+ 0x95, 0xd6, 0x6f, 0xbd, 0x78, 0xc9, 0x62, 0xbd, 0xf0, 0x60, 0x09, 0xbe,
+ 0xa3, 0x62, 0x06, 0x3d, 0x68, 0xab, 0x87, 0x3d, 0xd1, 0x5e, 0x44, 0xbe,
+ 0x76, 0x15, 0xaa, 0xbe, 0x11, 0x19, 0x5d, 0xbe, 0x7c, 0x6a, 0xab, 0x3d,
+ 0x7b, 0x44, 0xb9, 0xbd, 0xdf, 0xbc, 0xf7, 0xbd, 0xf7, 0xc8, 0x5d, 0x3e,
+ 0x20, 0x5b, 0x98, 0x3d, 0x3b, 0xb5, 0xf7, 0x3d, 0x4e, 0x30, 0x0c, 0xbe,
+ 0x22, 0x4e, 0x9c, 0xbd, 0x10, 0x50, 0xae, 0xbc, 0x85, 0x17, 0xbd, 0xbd,
+ 0xe6, 0x8c, 0xb2, 0x3e, 0x07, 0xaa, 0xee, 0xbc, 0x36, 0xc6, 0xb3, 0x3d,
+ 0x9b, 0x9c, 0x38, 0x3e, 0x27, 0xc6, 0xad, 0x3d, 0xc4, 0xe8, 0x75, 0x3e,
+ 0xe9, 0x38, 0x70, 0xbe, 0x7d, 0x73, 0x07, 0x3e, 0x07, 0x42, 0xdf, 0xbd,
+ 0xee, 0x79, 0x4c, 0xbe, 0x97, 0xdf, 0xed, 0xbb, 0x64, 0x02, 0x04, 0xbe,
+ 0x61, 0x71, 0x30, 0xbe, 0xef, 0xda, 0xc6, 0x3c, 0x2d, 0x26, 0x04, 0x3e,
+ 0x92, 0xdb, 0x62, 0xbd, 0xa2, 0x34, 0x2f, 0xbe, 0xe2, 0x81, 0x67, 0x3e,
+ 0x9b, 0x8f, 0x07, 0x3f, 0x22, 0x32, 0xc4, 0x3d, 0xb2, 0x1b, 0xf9, 0x3c,
+ 0x6d, 0x19, 0x46, 0x3e, 0x4e, 0x32, 0x8c, 0xbe, 0x3d, 0x3e, 0xce, 0x3d,
+ 0x88, 0xab, 0x02, 0xbf, 0x0c, 0x16, 0x1a, 0x3e, 0xd5, 0x90, 0x0e, 0xbe,
+ 0x35, 0xa6, 0xc3, 0x3d, 0x59, 0x53, 0xf6, 0x3c, 0x0b, 0x48, 0x7a, 0xbd,
+ 0xb8, 0x4e, 0x21, 0xbe, 0x47, 0x8f, 0xe2, 0xbe, 0x8f, 0xa8, 0x33, 0xbe,
+ 0x29, 0xde, 0xa8, 0xbc, 0x05, 0x25, 0x27, 0xbc, 0xdf, 0xec, 0x75, 0x3e,
+ 0x83, 0x65, 0x0d, 0x3e, 0x0b, 0x9e, 0x44, 0xbe, 0x2a, 0xc9, 0x78, 0xbe,
+ 0x49, 0x41, 0x2c, 0xbe, 0xcb, 0xd7, 0xb4, 0xbb, 0x57, 0x94, 0x5b, 0xba,
+ 0xa4, 0x80, 0x00, 0x3e, 0xb8, 0x67, 0xc7, 0xbb, 0x4c, 0x64, 0xf1, 0xbd,
+ 0xbf, 0xa1, 0xab, 0xbe, 0xde, 0x6c, 0x1f, 0xbd, 0x2c, 0xfc, 0x49, 0xbd,
+ 0xe0, 0xb5, 0xb0, 0x3e, 0xad, 0x4e, 0x25, 0xbd, 0x93, 0x4c, 0x5b, 0x3d,
+ 0x74, 0x07, 0x3f, 0xbc, 0xc5, 0xf6, 0x46, 0x3e, 0x1d, 0xd3, 0x6e, 0x3c,
+ 0x0f, 0x8b, 0x61, 0x3e, 0xba, 0xb4, 0x6a, 0xbe, 0x39, 0x09, 0xdd, 0xbc,
+ 0x03, 0x68, 0xab, 0x3e, 0x34, 0x13, 0xc1, 0xbd, 0x30, 0x17, 0x7c, 0xbe,
+ 0x08, 0x00, 0x96, 0x3c, 0x47, 0x8a, 0xcd, 0xbd, 0x69, 0xde, 0x2e, 0x3e,
+ 0x83, 0x93, 0x16, 0xbe, 0x9c, 0x76, 0xa5, 0x3d, 0xf1, 0x29, 0xac, 0x3e,
+ 0x75, 0xdf, 0xe6, 0x3e, 0x97, 0xd8, 0x02, 0x3e, 0x3b, 0xf5, 0x01, 0xbe,
+ 0x1b, 0x0c, 0x6d, 0x3e, 0xc3, 0x62, 0x1f, 0x3d, 0x4d, 0x24, 0x55, 0xbe,
+ 0x46, 0xb2, 0x17, 0x3e, 0x19, 0xaf, 0x47, 0x3c, 0x67, 0x36, 0xaf, 0x3e,
+ 0xa7, 0x33, 0xe5, 0xbd, 0xe7, 0xcf, 0xe6, 0xbe, 0xbc, 0xb7, 0x56, 0xbe,
+ 0x2d, 0x8b, 0x5a, 0x3e, 0xd1, 0xbc, 0x8a, 0x3c, 0xae, 0x5b, 0xa6, 0xbe,
+ 0xf3, 0x06, 0x17, 0xbe, 0x03, 0x9c, 0x70, 0xbd, 0x2f, 0x6a, 0x31, 0xbe,
+ 0xd9, 0x35, 0x3a, 0x3e, 0x81, 0x9f, 0x50, 0xbe, 0x7f, 0x9d, 0x12, 0x3e,
+ 0xbb, 0xd4, 0x47, 0xbc, 0x1c, 0x1a, 0xbd, 0x3d, 0x8c, 0x1d, 0xb8, 0x3d,
+ 0x56, 0xe8, 0xab, 0xbd, 0xfb, 0x59, 0x58, 0xbe, 0xba, 0xb0, 0x2a, 0xbe,
+ 0xda, 0xc9, 0x19, 0x3b, 0xa6, 0xe7, 0x59, 0x3e, 0x09, 0xba, 0xe9, 0xbd,
+ 0xf0, 0x19, 0xd5, 0xbd, 0xb0, 0x31, 0x82, 0xbb, 0x98, 0x8d, 0x67, 0xbe,
+ 0x24, 0x45, 0xf8, 0x3d, 0x76, 0xb9, 0x6f, 0xbe, 0x39, 0xd8, 0x69, 0x3e,
+ 0x94, 0xd5, 0xe2, 0x3d, 0x38, 0xb4, 0x92, 0x3e, 0x06, 0x6d, 0x10, 0xbe,
+ 0x1c, 0xa0, 0xa3, 0xbd, 0xc7, 0x8e, 0x20, 0xbe, 0xd7, 0x1d, 0x62, 0xbe,
+ 0x31, 0xc1, 0xb6, 0xbd, 0xa2, 0x58, 0xf4, 0x3c, 0x43, 0x2d, 0x13, 0x3d,
+ 0x51, 0x84, 0xf3, 0x3d, 0xcc, 0xc6, 0x7a, 0x3d, 0x4c, 0x43, 0x16, 0xbe,
+ 0x8b, 0x7f, 0xdb, 0x3d, 0x6f, 0xa2, 0xaf, 0x3d, 0x5b, 0xda, 0xb7, 0xbd,
+ 0xa2, 0x76, 0xd3, 0xbd, 0x49, 0xc1, 0x49, 0xbe, 0xd6, 0x96, 0x5f, 0x3d,
+ 0x84, 0x23, 0x9d, 0x3d, 0x5c, 0x38, 0xb5, 0x3d, 0x54, 0x94, 0xb6, 0x3d,
+ 0x04, 0x4b, 0x96, 0x3d, 0xab, 0xd4, 0x01, 0x3e, 0x5b, 0xb2, 0xe5, 0xbd,
+ 0x60, 0xd3, 0xb4, 0x3d, 0xa6, 0x5f, 0xf1, 0xbd, 0xac, 0xff, 0xc2, 0xbd,
+ 0xee, 0x42, 0x99, 0x3d, 0x1f, 0xe3, 0x6f, 0x3d, 0xb2, 0x02, 0x14, 0x3c,
+ 0x3b, 0x07, 0x16, 0x3c, 0x0c, 0x8f, 0x1e, 0xb9, 0xa4, 0x5f, 0x4b, 0xbd,
+ 0x8f, 0x3a, 0xc8, 0x3d, 0xf6, 0xdb, 0x53, 0x3e, 0x11, 0xe0, 0xfe, 0x3c,
+ 0xdf, 0xa6, 0x49, 0x3d, 0x38, 0x39, 0x62, 0xbe, 0xec, 0xb8, 0xf8, 0xbd,
+ 0x0b, 0x7d, 0xf8, 0x3c, 0x64, 0x2f, 0xac, 0xbc, 0x46, 0xdd, 0x19, 0xbd,
+ 0xa5, 0xbb, 0xce, 0xbd, 0xd1, 0x83, 0x1f, 0xbe, 0x6d, 0xf9, 0xe8, 0x3d,
+ 0xb9, 0x33, 0x15, 0x3e, 0xbb, 0x98, 0xfd, 0xbc, 0xe3, 0xc3, 0xd8, 0x3d,
+ 0x45, 0x76, 0xf7, 0x3d, 0x9c, 0x64, 0x66, 0xbe, 0x84, 0x89, 0x2a, 0x3c,
+ 0xf9, 0x4f, 0x54, 0x3d, 0x08, 0xe6, 0x26, 0x3e, 0xda, 0xf8, 0xdb, 0xbd,
+ 0xad, 0x2c, 0x06, 0xbd, 0x28, 0x03, 0x0f, 0xbd, 0xea, 0xa0, 0x31, 0x3d,
+ 0x31, 0xe6, 0x63, 0x3d, 0x70, 0x70, 0xb6, 0x3c, 0x8c, 0x8a, 0x85, 0x3c,
+ 0xc9, 0x15, 0xda, 0xbd, 0xd3, 0xc1, 0xb1, 0xbc, 0x3b, 0x5a, 0x03, 0xbe,
+ 0x31, 0x9b, 0x8a, 0xbd, 0xcb, 0xb7, 0x4c, 0x3e, 0xa9, 0x1b, 0xcd, 0xbd,
+ 0x5c, 0xa3, 0x0c, 0xbe, 0x29, 0x47, 0xa0, 0xbd, 0xcf, 0x36, 0x44, 0xbe,
+ 0xd0, 0x11, 0x3b, 0xbd, 0x81, 0x91, 0xf1, 0xbd, 0x9b, 0x87, 0x7b, 0x3e,
+ 0xe1, 0x69, 0x61, 0x3d, 0x6a, 0x77, 0x25, 0xbe, 0xd9, 0x6e, 0xcb, 0x3d,
+ 0x0b, 0xc5, 0x27, 0xbd, 0xd9, 0x76, 0x96, 0x3c, 0xf4, 0x4d, 0xbf, 0xbc,
+ 0xc5, 0x87, 0x4f, 0x3e, 0xb4, 0x88, 0x19, 0x3e, 0x0a, 0xe5, 0x03, 0xbe,
+ 0x48, 0x58, 0x3d, 0x3d, 0xf7, 0x18, 0xd3, 0x3c, 0xa7, 0x07, 0xa2, 0xbd,
+ 0xbc, 0x54, 0xf1, 0xbd, 0xf6, 0x1a, 0x8b, 0x3d, 0xa7, 0x69, 0xdd, 0x3d,
+ 0x71, 0xcd, 0x95, 0x3d, 0x84, 0x70, 0x1d, 0xbe, 0xb6, 0xa2, 0xe2, 0xbc,
+ 0x87, 0x79, 0xe8, 0xbd, 0xbb, 0xd1, 0xcb, 0x3c, 0x5b, 0xba, 0x11, 0x3e,
+ 0x23, 0x50, 0x73, 0xbd, 0x7c, 0x2c, 0x3a, 0xbd, 0x58, 0x05, 0x88, 0x3c,
+ 0x40, 0x78, 0x2d, 0xbe, 0x81, 0xf6, 0xa0, 0xbd, 0x26, 0x1f, 0xc5, 0x3d,
+ 0xe5, 0x41, 0x0f, 0x3d, 0x38, 0x05, 0xbd, 0xbc, 0x60, 0x30, 0x41, 0xbc,
+ 0x5a, 0x93, 0x85, 0x3d, 0x16, 0x2f, 0x85, 0xbe, 0xb9, 0x08, 0xbb, 0xbd,
+ 0xc2, 0x35, 0xb7, 0x3c, 0xfe, 0xdf, 0x0b, 0x3c, 0x82, 0x91, 0xd0, 0x3d,
+ 0x78, 0x2a, 0xa6, 0xbd, 0x36, 0x7b, 0xd4, 0xbd, 0x64, 0xca, 0xb5, 0x3c,
+ 0x78, 0xff, 0x82, 0x3e, 0xf4, 0x01, 0x82, 0xbd, 0xae, 0x46, 0x3d, 0xbe,
+ 0x25, 0x6a, 0xba, 0xba, 0xa9, 0xe1, 0xe4, 0x3d, 0x62, 0xf0, 0x12, 0x3e,
+ 0x90, 0x74, 0xca, 0xbd, 0xbe, 0x9c, 0x04, 0xbe, 0x50, 0xf2, 0x4a, 0x3d,
+ 0xd3, 0xa7, 0x16, 0x3e, 0x49, 0x9f, 0x12, 0xbd, 0x4a, 0xe8, 0xe9, 0x3d,
+ 0x77, 0xaf, 0x13, 0x3e, 0x60, 0xca, 0xca, 0x3c, 0x5d, 0xa3, 0xe7, 0x3c,
+ 0xb5, 0xdf, 0xa0, 0xbd, 0xc6, 0xe3, 0x31, 0xbe, 0xf0, 0xe9, 0x0d, 0x3d,
+ 0x6d, 0x6b, 0x51, 0xbb, 0x2d, 0x2d, 0x58, 0x3c, 0x5d, 0xaa, 0xa0, 0x3d,
+ 0x3d, 0x87, 0x18, 0x3e, 0x11, 0x2e, 0x11, 0xbe, 0xc0, 0x57, 0x4e, 0xbd,
+ 0x15, 0x25, 0x28, 0x3c, 0xa2, 0xef, 0x4e, 0x3c, 0x67, 0x61, 0x94, 0xba,
+ 0x90, 0x7f, 0x3c, 0xbd, 0xe3, 0x38, 0x61, 0xbd, 0x7e, 0x34, 0x79, 0xbe,
+ 0x06, 0xae, 0x61, 0x3e, 0x73, 0xcb, 0x6c, 0xbe, 0xd9, 0x8a, 0x5c, 0xbe,
+ 0x15, 0xa6, 0x0e, 0xbe, 0x4e, 0xff, 0x34, 0xbd, 0x67, 0x97, 0xb8, 0x3d,
+ 0x7f, 0x08, 0x6d, 0x3c, 0xe0, 0x4a, 0xf3, 0xbd, 0xe5, 0x00, 0x50, 0xbc,
+ 0xaf, 0x01, 0xbe, 0xbd, 0xfd, 0xbe, 0x19, 0xbb, 0xaf, 0xb3, 0x8d, 0x39,
+ 0xf3, 0x79, 0x40, 0x3d, 0xb1, 0x86, 0x42, 0xbe, 0xc5, 0xee, 0x54, 0x3d,
+ 0x39, 0xf4, 0x69, 0xbd, 0x48, 0x8f, 0xc4, 0xbd, 0xd6, 0xbc, 0x31, 0xbe,
+ 0x9e, 0x0f, 0x0b, 0x3d, 0x08, 0xf2, 0xb3, 0xbd, 0xee, 0x16, 0xb1, 0x3c,
+ 0x59, 0x8e, 0xb3, 0x3d, 0x59, 0x10, 0x8d, 0xbd, 0xa1, 0xc2, 0xea, 0x3b,
+ 0x1d, 0x74, 0x9d, 0x3e, 0xcd, 0x81, 0x7b, 0x3b, 0xec, 0x6d, 0xab, 0xbd,
+ 0x44, 0x13, 0x83, 0x3c, 0xdb, 0x6d, 0xe7, 0x3d, 0x3c, 0x3a, 0xaf, 0xbd,
+ 0xf8, 0xdb, 0x11, 0x3d, 0xdc, 0x9c, 0xb1, 0xbd, 0x5a, 0x52, 0xd8, 0xbd,
+ 0xb8, 0x2a, 0xda, 0xbc, 0x47, 0xce, 0xc1, 0x3d, 0xc2, 0xee, 0xb1, 0x3d,
+ 0xa7, 0x4a, 0xf8, 0x3c, 0xab, 0x8e, 0xae, 0x3d, 0xfd, 0x20, 0x13, 0xbe,
+ 0x4e, 0xec, 0xc6, 0x3d, 0x4f, 0xe8, 0x3a, 0x3e, 0x53, 0xf3, 0x9d, 0x3d,
+ 0x80, 0x52, 0x51, 0xbe, 0x35, 0xd5, 0x2d, 0xbe, 0x12, 0x3a, 0xb2, 0xbe,
+ 0xa7, 0xc3, 0x01, 0xbe, 0x17, 0x9f, 0x02, 0x3e, 0x45, 0xd8, 0x0c, 0x3e,
+ 0x39, 0x4d, 0x50, 0xbc, 0xb7, 0x9e, 0x80, 0xbb, 0x63, 0xe3, 0xc9, 0x3d,
+ 0x84, 0x89, 0x89, 0x3d, 0xb4, 0xfb, 0x7a, 0xbd, 0xc5, 0x3e, 0xfa, 0xbd,
+ 0x6e, 0x3e, 0x15, 0x3e, 0xa2, 0x72, 0xaa, 0xbd, 0xff, 0x52, 0xd3, 0xbc,
+ 0x56, 0xbe, 0x38, 0xbe, 0x16, 0xbe, 0xf9, 0xbc, 0x64, 0xea, 0xfa, 0xbd,
+ 0xa5, 0xaa, 0x23, 0x3d, 0x4c, 0x46, 0xcb, 0xbd, 0x72, 0x1c, 0x7f, 0x3d,
+ 0x44, 0xbe, 0x14, 0xbd, 0xf8, 0x39, 0x30, 0xbe, 0xf0, 0x3f, 0xf1, 0xbd,
+ 0x68, 0x96, 0xc5, 0xbd, 0x7c, 0x39, 0x39, 0x3e, 0xdb, 0xaa, 0x81, 0x3d,
+ 0xf1, 0x74, 0xae, 0xbc, 0x66, 0x2d, 0x17, 0x3c, 0xb4, 0x66, 0xee, 0x3d,
+ 0x1f, 0x71, 0xe3, 0x3c, 0x75, 0x92, 0x64, 0x3d, 0xbb, 0x8b, 0x85, 0x3c,
+ 0xd2, 0xe2, 0xf9, 0xbd, 0x60, 0x26, 0x00, 0x3d, 0xc2, 0x2c, 0xdc, 0xbd,
+ 0xc1, 0x46, 0xae, 0x3d, 0xc1, 0xb4, 0x61, 0xbd, 0x1b, 0x40, 0x90, 0xbd,
+ 0xa3, 0x40, 0xad, 0x3b, 0xf3, 0x66, 0xd3, 0xbd, 0x7e, 0xb5, 0x94, 0x3d,
+ 0xd1, 0xd0, 0x3e, 0xbd, 0x15, 0xf6, 0x29, 0xbe, 0x0e, 0x84, 0x55, 0x3e,
+ 0x43, 0xc4, 0x56, 0x3e, 0x9b, 0xf1, 0xbe, 0x3d, 0x84, 0x31, 0x22, 0xbe,
+ 0x3e, 0x57, 0x85, 0x3d, 0xf5, 0xdb, 0xc2, 0xbd, 0x1e, 0x49, 0x89, 0x3d,
+ 0xdd, 0xc5, 0xaf, 0xbb, 0x0e, 0x97, 0x12, 0xbe, 0x16, 0x87, 0x4b, 0xbd,
+ 0x24, 0x06, 0x86, 0x3d, 0x3f, 0x75, 0xd3, 0xbd, 0x4e, 0x43, 0xe7, 0x3d,
+ 0x3d, 0xf5, 0xeb, 0x3d, 0x2d, 0x00, 0x99, 0xbd, 0x1c, 0xc6, 0x43, 0x3e,
+ 0xe2, 0x28, 0x0f, 0xbf, 0xbe, 0x44, 0x0c, 0x3e, 0xf7, 0xb6, 0x46, 0x3e,
+ 0x5e, 0x64, 0xc9, 0xbd, 0xee, 0x51, 0x2c, 0x3e, 0x09, 0xf4, 0xd3, 0x3d,
+ 0x17, 0xd3, 0xa4, 0xbd, 0xee, 0xcc, 0xb7, 0x3d, 0x85, 0xbd, 0x80, 0x3e,
+ 0x69, 0xaa, 0x11, 0x3e, 0x7e, 0x6f, 0xeb, 0xbd, 0x42, 0xd2, 0xde, 0x3e,
+ 0x90, 0x3d, 0xd7, 0xbd, 0x28, 0x49, 0xa6, 0xbc, 0x58, 0xd3, 0xb9, 0xbb,
+ 0x39, 0x98, 0xfc, 0x3d, 0x40, 0xc0, 0x44, 0x3c, 0xa0, 0x16, 0x4b, 0xbe,
+ 0x8f, 0xef, 0xcd, 0x3d, 0x8d, 0x8b, 0x6e, 0xbc, 0x16, 0x4d, 0xee, 0xbd,
+ 0x8c, 0xba, 0xb0, 0xbc, 0x0d, 0xaf, 0xde, 0xbd, 0xa3, 0xc9, 0x85, 0x3c,
+ 0x33, 0x94, 0x13, 0x3f, 0xc3, 0x74, 0xa0, 0xbe, 0x00, 0x07, 0xff, 0xbe,
+ 0xdd, 0xc2, 0x21, 0xbe, 0xb3, 0x27, 0x44, 0xbd, 0x1a, 0xd1, 0xf4, 0xbb,
+ 0x20, 0x77, 0xb8, 0xbe, 0x1f, 0x90, 0xe7, 0xbd, 0xa1, 0xf8, 0x57, 0x3d,
+ 0xa1, 0x7d, 0xa8, 0xbd, 0x11, 0x56, 0x06, 0x3e, 0x63, 0x6c, 0x60, 0xbd,
+ 0xbe, 0xfa, 0x5c, 0xbe, 0x43, 0xbc, 0xb9, 0x3d, 0x8b, 0x84, 0x59, 0xbe,
+ 0x85, 0x83, 0x1a, 0x3e, 0xbe, 0xf7, 0xa6, 0xbd, 0xaa, 0x07, 0x98, 0x3d,
+ 0xb7, 0x45, 0x03, 0xbd, 0x7b, 0xef, 0x99, 0xbe, 0x26, 0xfe, 0x51, 0xbe,
+ 0xd5, 0x83, 0xf4, 0xbd, 0x1a, 0xa3, 0xd7, 0xbd, 0xa7, 0x9a, 0x29, 0x3e,
+ 0xbc, 0xd9, 0x83, 0xbd, 0x23, 0x8d, 0x01, 0x3e, 0x04, 0xb8, 0xbb, 0x3e,
+ 0x6f, 0x51, 0x68, 0xbe, 0x1d, 0x60, 0xbc, 0x3d, 0x54, 0x21, 0xc0, 0x3e,
+ 0x67, 0x30, 0x65, 0x3e, 0x49, 0x2b, 0x35, 0xbd, 0x71, 0x02, 0x11, 0x3c,
+ 0xed, 0x2a, 0xb3, 0x3e, 0x6c, 0xa2, 0x61, 0xbe, 0x0d, 0x0e, 0x4e, 0xbe,
+ 0x42, 0xe6, 0x6b, 0xbe, 0x1c, 0x49, 0x68, 0xbe, 0x75, 0xc7, 0x93, 0xbd,
+ 0x56, 0xf2, 0xb9, 0x3d, 0xe1, 0x30, 0x39, 0xbd, 0x25, 0xdd, 0x28, 0xbe,
+ 0x03, 0x7b, 0x98, 0xbd, 0x48, 0xf7, 0xad, 0xbd, 0x3e, 0x80, 0xfc, 0xbc,
+ 0x00, 0x1d, 0xb3, 0xbe, 0x19, 0xaa, 0xb4, 0xbd, 0xc1, 0x05, 0xfe, 0xbe,
+ 0xc5, 0xe6, 0x2c, 0x3e, 0xb1, 0xaa, 0xcd, 0xbd, 0xa4, 0x55, 0x04, 0x3d,
+ 0x83, 0x22, 0xb2, 0xbe, 0x96, 0xb8, 0x32, 0x3d, 0x5b, 0xd0, 0x3a, 0xbe,
+ 0xa3, 0xc2, 0x90, 0xbc, 0xd3, 0x54, 0x12, 0xbf, 0x18, 0xf6, 0xb6, 0x3e,
+ 0x74, 0x40, 0x04, 0xbd, 0x9b, 0xcb, 0x63, 0x3e, 0xa4, 0x1c, 0x48, 0xbe,
+ 0x7c, 0x67, 0x0a, 0x3e, 0x67, 0x60, 0x88, 0x3d, 0x74, 0x33, 0xcb, 0xbe,
+ 0xa7, 0xdf, 0xcf, 0xbd, 0x2f, 0xca, 0x30, 0xbc, 0x0b, 0x32, 0x11, 0x3e,
+ 0x7f, 0x8f, 0x67, 0x3e, 0xee, 0xaf, 0xa8, 0x3c, 0x44, 0xe7, 0x4c, 0xbe,
+ 0x5b, 0x0f, 0x80, 0xbe, 0xd5, 0xaf, 0xfa, 0x3d, 0x18, 0x8c, 0x5f, 0x3e,
+ 0x44, 0x49, 0x05, 0xbd, 0x90, 0x4a, 0x45, 0xbe, 0xc9, 0x9f, 0x08, 0x3f,
+ 0x1e, 0xe5, 0x13, 0x3d, 0xed, 0xb7, 0x89, 0xbe, 0x8c, 0x78, 0xa2, 0x3e,
+ 0x5e, 0x43, 0x42, 0x3c, 0x3a, 0xe7, 0x19, 0xbd, 0xe7, 0x12, 0x9a, 0x3e,
+ 0x49, 0xe3, 0x1e, 0x3d, 0xfa, 0xce, 0x11, 0xbd, 0x32, 0xda, 0xa8, 0x3d,
+ 0x5f, 0x93, 0x8c, 0xbd, 0xcd, 0x80, 0xc2, 0xbd, 0xad, 0x7d, 0x35, 0xbe,
+ 0xc2, 0xf0, 0xac, 0x3c, 0x92, 0x67, 0x0e, 0xbf, 0xa7, 0x59, 0x97, 0x3b,
+ 0x5d, 0xed, 0x48, 0x3d, 0x5b, 0x81, 0x50, 0x3d, 0xed, 0xcc, 0x30, 0xbd,
+ 0xf7, 0x80, 0x0e, 0x3e, 0x1d, 0xf6, 0x94, 0x3d, 0x72, 0xaf, 0x1c, 0x3d,
+ 0x78, 0x9e, 0x66, 0xbe, 0xcf, 0x3d, 0xa0, 0xbd, 0xc9, 0xe6, 0xf8, 0x3c,
+ 0x42, 0x47, 0xe8, 0xbd, 0xd3, 0x33, 0x2c, 0xbd, 0xb5, 0xc5, 0x1d, 0x3e,
+ 0xd3, 0x03, 0x87, 0x3c, 0xee, 0xa1, 0x83, 0xbc, 0x44, 0xe5, 0x8a, 0xbd,
+ 0xe4, 0x01, 0xff, 0x3b, 0x64, 0x08, 0x85, 0x3d, 0x79, 0x86, 0x0d, 0xbe,
+ 0x21, 0x83, 0x05, 0x3e, 0x06, 0x83, 0x90, 0x3c, 0xeb, 0xba, 0x34, 0xbe,
+ 0xec, 0xcd, 0xe0, 0x3b, 0x02, 0xc5, 0x5a, 0xbc, 0x0c, 0x60, 0x15, 0xbe,
+ 0x9d, 0xb1, 0xdb, 0x3d, 0x66, 0x67, 0xb5, 0x3d, 0x17, 0x8c, 0x1d, 0xbd,
+ 0x0b, 0x52, 0x2e, 0xbd, 0x6a, 0x1f, 0x84, 0xbb, 0x29, 0xe7, 0x04, 0xbd,
+ 0x97, 0x6c, 0x5f, 0xbd, 0x5d, 0x8d, 0x01, 0xbe, 0x34, 0x9a, 0xf8, 0x3c,
+ 0xd2, 0xec, 0xb0, 0x3c, 0xa9, 0x29, 0x29, 0xbe, 0xc2, 0xe5, 0x81, 0xbe,
+ 0x37, 0x09, 0x75, 0x3d, 0xd9, 0x0e, 0x86, 0xbd, 0x8b, 0xe4, 0x4a, 0xbd,
+ 0x3d, 0x3e, 0xbf, 0x3d, 0x37, 0xb8, 0x3f, 0x3d, 0x1d, 0x2e, 0xa3, 0xbd,
+ 0x3a, 0x5b, 0xd2, 0xbc, 0x2b, 0x66, 0x6c, 0xbe, 0xbe, 0x8c, 0x89, 0xbc,
+ 0x89, 0x87, 0xe6, 0x3b, 0xb8, 0xd1, 0xc0, 0xbc, 0x55, 0xe2, 0x2f, 0xbd,
+ 0x00, 0x08, 0x9d, 0xbd, 0x28, 0xdd, 0x02, 0xbe, 0xaa, 0xfb, 0x37, 0x3d,
+ 0xf4, 0x84, 0xcc, 0xbd, 0x18, 0x3d, 0x40, 0xbd, 0x62, 0x30, 0x7a, 0x3c,
+ 0x09, 0xb9, 0x88, 0x3d, 0x0f, 0xe0, 0x8b, 0xbc, 0xf7, 0x0e, 0x0f, 0x3e,
+ 0xea, 0x95, 0x26, 0xbd, 0xba, 0xbe, 0x22, 0x3e, 0x91, 0xdc, 0x9e, 0x3d,
+ 0xb8, 0xcf, 0xba, 0xbd, 0xe6, 0x6a, 0xe0, 0xbd, 0xc5, 0x0e, 0xf4, 0xbe,
+ 0xb7, 0xe6, 0xaa, 0x3d, 0x0f, 0x58, 0x35, 0x3b, 0x93, 0x40, 0xdc, 0x3a,
+ 0xba, 0x6e, 0x52, 0xbd, 0x80, 0x83, 0x9a, 0xbd, 0xfe, 0x71, 0x26, 0xbe,
+ 0x47, 0x6c, 0x3c, 0x3d, 0xe9, 0xa3, 0x81, 0xbd, 0xab, 0x44, 0x6c, 0x3d,
+ 0xb7, 0x86, 0x35, 0xbd, 0xc8, 0x37, 0xec, 0xbc, 0x2b, 0xe1, 0xc4, 0x3d,
+ 0x03, 0x86, 0xbb, 0x3d, 0xdd, 0xdb, 0xfe, 0xbd, 0xad, 0xc7, 0x52, 0xbd,
+ 0x18, 0x91, 0x26, 0x3d, 0xf8, 0x41, 0x1e, 0x3d, 0x8f, 0x00, 0x85, 0x3d,
+ 0x64, 0x04, 0x20, 0x3d, 0xcb, 0x74, 0xd1, 0xbe, 0xa0, 0xcf, 0x68, 0x3d,
+ 0x1e, 0x01, 0xa0, 0xbd, 0xea, 0xed, 0xdf, 0xbc, 0x7a, 0xac, 0xe0, 0x3d,
+ 0x88, 0xd3, 0xaf, 0xbd, 0x15, 0x5d, 0x47, 0xbe, 0x14, 0xd2, 0xc4, 0xbd,
+ 0xd7, 0x0a, 0x98, 0x3d, 0x3c, 0xde, 0xae, 0xbc, 0xc2, 0xbf, 0x52, 0x3c,
+ 0xc9, 0xbb, 0x09, 0x3d, 0x40, 0xff, 0xb6, 0x3d, 0xc5, 0xc0, 0x51, 0x3d,
+ 0xda, 0xad, 0xd9, 0xbc, 0xbb, 0x66, 0x3e, 0x3d, 0xb9, 0xcf, 0x38, 0xbd,
+ 0x2d, 0x84, 0xec, 0xbd, 0x8b, 0x23, 0x05, 0x3d, 0x19, 0x10, 0x69, 0x3d,
+ 0x7e, 0xc9, 0x07, 0xbd, 0xe0, 0x49, 0x35, 0x3d, 0xb0, 0x13, 0x47, 0x3d,
+ 0x4e, 0x74, 0x26, 0x3e, 0xe3, 0xe6, 0x5b, 0x3d, 0xce, 0x03, 0xc1, 0xbd,
+ 0x26, 0xae, 0x94, 0xbd, 0xf8, 0xf6, 0x0f, 0x3d, 0x91, 0xe9, 0x0d, 0x3e,
+ 0xad, 0x4b, 0xea, 0x3b, 0x04, 0x76, 0x80, 0x3d, 0x73, 0x22, 0xfb, 0xbd,
+ 0xbe, 0x5f, 0xb0, 0xbe, 0x04, 0x64, 0x8b, 0x3d, 0x28, 0x31, 0xdb, 0xbc,
+ 0xa4, 0x63, 0xde, 0xbd, 0xec, 0x65, 0xb3, 0x3d, 0xc5, 0x68, 0x27, 0x3e,
+ 0x40, 0x91, 0x2b, 0x3e, 0x43, 0x63, 0x9e, 0x3e, 0x03, 0x5f, 0xca, 0xbc,
+ 0x56, 0xcf, 0x6d, 0xbe, 0x1c, 0xc3, 0xc2, 0x3d, 0x88, 0x1e, 0x77, 0xbe,
+ 0x41, 0x1e, 0x24, 0x3e, 0x0e, 0x0b, 0xca, 0xbc, 0x9b, 0x82, 0x25, 0x3e,
+ 0xef, 0x9d, 0x2b, 0x3e, 0x8e, 0xcd, 0xf4, 0xbd, 0x3f, 0xdf, 0x14, 0x3f,
+ 0x9d, 0x02, 0xcc, 0xbe, 0xcd, 0x12, 0x05, 0xbe, 0xbc, 0x57, 0xcd, 0xbd,
+ 0xaa, 0x13, 0x39, 0xbe, 0x9a, 0x47, 0x59, 0x3c, 0x65, 0x97, 0x58, 0xbe,
+ 0xd9, 0x50, 0xa3, 0xbd, 0x30, 0xc4, 0xf3, 0xbd, 0x93, 0xae, 0xf3, 0x3d,
+ 0xae, 0xe4, 0x20, 0x3e, 0x47, 0x83, 0xb3, 0xbd, 0x3c, 0xdf, 0xbc, 0x3e,
+ 0x84, 0x54, 0xea, 0x3e, 0x19, 0x03, 0x2a, 0x3e, 0xa1, 0x38, 0x36, 0x3e,
+ 0xe7, 0xf8, 0x60, 0x3e, 0xd9, 0xcf, 0x30, 0xbd, 0xd1, 0x07, 0x8b, 0x3d,
+ 0x98, 0x19, 0xfa, 0xbe, 0xc0, 0x4d, 0x85, 0xbd, 0x4c, 0x7f, 0x47, 0xbd,
+ 0x1f, 0x10, 0xe0, 0x3d, 0x5f, 0x14, 0x5a, 0xbd, 0x69, 0x52, 0xf0, 0x3d,
+ 0x50, 0x63, 0x86, 0xbe, 0xe7, 0x19, 0xbd, 0xbe, 0x8f, 0xc7, 0x8a, 0xbe,
+ 0xb4, 0x0b, 0x8b, 0x3e, 0xfd, 0xf3, 0x84, 0xbe, 0xd0, 0xa6, 0x1f, 0x3e,
+ 0x80, 0x90, 0xc8, 0xbc, 0x52, 0x46, 0xc9, 0xbe, 0xa7, 0x56, 0x71, 0xbd,
+ 0x4d, 0x0a, 0x6b, 0xbe, 0x0e, 0xfa, 0x8a, 0xbd, 0x33, 0x6a, 0x37, 0x3e,
+ 0xa7, 0xb6, 0x46, 0x3e, 0xfc, 0x66, 0x66, 0x3e, 0x51, 0x1b, 0x32, 0xbe,
+ 0x21, 0x3d, 0xc7, 0xbe, 0x06, 0xf3, 0xb3, 0x3e, 0x23, 0x9a, 0x0b, 0xbe,
+ 0x6c, 0xdd, 0xa8, 0x3e, 0x82, 0x4e, 0x43, 0xbe, 0xc3, 0xf6, 0x91, 0x3d,
+ 0x57, 0x81, 0x83, 0xbe, 0xf8, 0x08, 0xa4, 0x3e, 0x6f, 0x3e, 0xb2, 0xbe,
+ 0x98, 0x11, 0x9f, 0x3e, 0xe3, 0x54, 0xb7, 0xbe, 0xd6, 0xce, 0xc1, 0xbd,
+ 0xc9, 0x67, 0x2d, 0x3e, 0xfa, 0x96, 0x2c, 0xbe, 0x00, 0xa6, 0x3e, 0xbd,
+ 0x0e, 0x5a, 0x61, 0x3e, 0x17, 0xde, 0xe5, 0xbd, 0x7d, 0x0f, 0x83, 0x3d,
+ 0xf3, 0x58, 0xee, 0xbd, 0x95, 0xa9, 0x00, 0xbe, 0x01, 0x38, 0x44, 0x3e,
+ 0x1f, 0x30, 0x04, 0x3f, 0x93, 0x75, 0x4e, 0xbd, 0xdf, 0xf5, 0xc6, 0xbc,
+ 0x37, 0x39, 0x86, 0x3d, 0xa6, 0x4c, 0xaf, 0xbd, 0xc3, 0x5f, 0x04, 0xbf,
+ 0x46, 0x79, 0xac, 0x3e, 0x37, 0x05, 0x93, 0x3d, 0xc0, 0x25, 0x9a, 0x3e,
+ 0x60, 0x92, 0xec, 0xbd, 0xac, 0xfd, 0x9e, 0xbe, 0xae, 0x57, 0x66, 0xbe,
+ 0x8b, 0xda, 0x71, 0x3e, 0xca, 0xe4, 0x16, 0xbe, 0x37, 0xa2, 0xcf, 0xbe,
+ 0x01, 0x10, 0x1f, 0xbe, 0x07, 0x53, 0xa3, 0xbd, 0x1d, 0x9d, 0xc4, 0xbe,
+ 0xb3, 0xca, 0xcd, 0x3e, 0xfe, 0xc2, 0x18, 0xbe, 0xb2, 0xae, 0x5f, 0xbb,
+ 0x51, 0x5c, 0x43, 0x3e, 0xcd, 0xf0, 0x1f, 0x3e, 0xc5, 0xfb, 0x21, 0x3e,
+ 0x71, 0xe8, 0x71, 0xbd, 0xbd, 0x57, 0x61, 0xbe, 0x31, 0x27, 0x0c, 0xbe,
+ 0xaa, 0x67, 0x9c, 0xbd, 0xf9, 0xce, 0xd6, 0x3d, 0xb2, 0xa1, 0x63, 0xbe,
+ 0x0d, 0x6f, 0x69, 0x3c, 0x5b, 0xf6, 0x99, 0x3d, 0x4f, 0xe0, 0x1d, 0xbe,
+ 0x7c, 0xa9, 0x90, 0x3d, 0xaa, 0x3f, 0xfa, 0xbe, 0x2d, 0x5f, 0x6e, 0x3e,
+ 0x7f, 0x6d, 0xe7, 0xbc, 0xcd, 0x96, 0x9c, 0x3e, 0x1d, 0x20, 0xd9, 0xbc,
+ 0x13, 0x5d, 0xc3, 0xbc, 0xe5, 0x36, 0x65, 0xbe, 0xa9, 0xc1, 0x99, 0xbe,
+ 0x34, 0xd2, 0xd1, 0x38, 0x63, 0xae, 0x06, 0xbd, 0xb0, 0x0e, 0x74, 0xbd,
+ 0x84, 0x03, 0x2f, 0xbd, 0xab, 0x9a, 0x6c, 0x3d, 0x03, 0x0a, 0x39, 0xbe,
+ 0x91, 0xbc, 0xd8, 0x3d, 0x67, 0x5a, 0x59, 0x3b, 0xc5, 0x36, 0xc0, 0x3d,
+ 0x0e, 0xe0, 0x39, 0x3e, 0x08, 0x55, 0x21, 0x3d, 0xb5, 0x06, 0x6a, 0xbc,
+ 0x8b, 0xa6, 0xba, 0x3d, 0x5e, 0xac, 0x04, 0x3e, 0xc9, 0x71, 0xc5, 0xbd,
+ 0x97, 0xb2, 0xf0, 0x3d, 0x63, 0x2b, 0x57, 0xbd, 0x40, 0x3f, 0xa1, 0x3d,
+ 0x10, 0x3c, 0xb6, 0xbd, 0xe6, 0x6f, 0x51, 0x3d, 0x72, 0x90, 0x26, 0x3d,
+ 0x24, 0xc2, 0xb1, 0xbd, 0x09, 0x56, 0xe3, 0x3c, 0xf8, 0x94, 0xee, 0x3d,
+ 0x6e, 0xd4, 0xc2, 0xbc, 0xc9, 0xb1, 0x1e, 0x3d, 0xd7, 0xf7, 0x7c, 0xbd,
+ 0xc8, 0x09, 0xfd, 0xbd, 0x36, 0x4f, 0x56, 0x3e, 0x5c, 0x0e, 0x1d, 0x3e,
+ 0xd9, 0xf7, 0x89, 0x3d, 0xff, 0xae, 0x50, 0xbd, 0xa6, 0xa1, 0x01, 0x3d,
+ 0xaf, 0xd6, 0x9a, 0x3d, 0x0c, 0x12, 0xd9, 0x3d, 0xf9, 0x95, 0x26, 0xbd,
+ 0x04, 0xd4, 0x0e, 0xbc, 0xba, 0x4a, 0x27, 0xbc, 0xe2, 0x44, 0x19, 0xb9,
+ 0x95, 0x76, 0x31, 0xbb, 0x75, 0xfd, 0xa3, 0xbd, 0x20, 0x08, 0x11, 0xbe,
+ 0xcd, 0x22, 0x28, 0xbe, 0x95, 0x68, 0x10, 0xbc, 0xd0, 0xf3, 0xe1, 0x3d,
+ 0xb3, 0xc5, 0x36, 0xbe, 0xa1, 0x5d, 0x0e, 0x3e, 0xcc, 0x51, 0x86, 0xbd,
+ 0x8a, 0x4a, 0x65, 0xbd, 0x8f, 0x6b, 0x52, 0x3d, 0xe2, 0x21, 0x7e, 0xbd,
+ 0x2e, 0xeb, 0x0f, 0x3d, 0x23, 0x78, 0x80, 0xbe, 0x75, 0xa0, 0x22, 0x3d,
+ 0xac, 0x20, 0x79, 0x3d, 0xda, 0xd0, 0xf3, 0x3d, 0xe6, 0xdc, 0xf1, 0x3c,
+ 0xab, 0x3d, 0xc2, 0xbd, 0x41, 0x0c, 0xe1, 0xbd, 0x9e, 0x41, 0xdc, 0xbd,
+ 0x37, 0x8e, 0x37, 0xbe, 0x4c, 0xba, 0x21, 0x3d, 0x47, 0x8c, 0x7d, 0xbe,
+ 0x89, 0x14, 0x28, 0xbe, 0x65, 0x3a, 0xfe, 0xbc, 0xc7, 0xfc, 0x09, 0x3e,
+ 0xae, 0x1d, 0x1e, 0xbe, 0x3e, 0xcc, 0xb2, 0x3d, 0x12, 0xa3, 0x96, 0xbd,
+ 0x3f, 0x37, 0x49, 0xbd, 0xda, 0xfd, 0xbc, 0xbd, 0x3a, 0x34, 0x03, 0xbe,
+ 0x0d, 0x08, 0x53, 0x3c, 0xfc, 0xee, 0x8c, 0x3d, 0x76, 0xee, 0x36, 0xbd,
+ 0x80, 0x03, 0x20, 0xbe, 0xa0, 0xfb, 0x24, 0x3d, 0xe5, 0xb7, 0xce, 0xbd,
+ 0x13, 0xd1, 0x8f, 0x3d, 0x25, 0xe0, 0xed, 0x3d, 0xf0, 0x1c, 0xc2, 0x3d,
+ 0x62, 0x9c, 0xf8, 0xbc, 0x2b, 0x66, 0xbc, 0xbd, 0x5f, 0xf5, 0x44, 0x3c,
+ 0x50, 0xa5, 0x6f, 0x3d, 0x23, 0x27, 0x27, 0x3e, 0x67, 0xe6, 0x29, 0xbe,
+ 0x6b, 0x40, 0x30, 0xbd, 0x11, 0x75, 0x57, 0x3a, 0x56, 0xd7, 0x5c, 0xbd,
+ 0xdf, 0x58, 0x44, 0xbe, 0xe3, 0x70, 0x64, 0xbe, 0xaa, 0x40, 0xba, 0x3d,
+ 0x1a, 0x55, 0x9d, 0xbd, 0x39, 0x40, 0x54, 0xbd, 0x4b, 0x9a, 0x0c, 0xbe,
+ 0x72, 0xcb, 0x01, 0x3e, 0x52, 0xd9, 0x19, 0xbd, 0xec, 0x89, 0x99, 0xbd,
+ 0x6d, 0x26, 0x1f, 0x3d, 0xd3, 0xce, 0xc0, 0xbd, 0xa4, 0x2f, 0x1e, 0x3c,
+ 0xd2, 0xa3, 0x66, 0xbc, 0xfc, 0xd4, 0x13, 0xbe, 0x90, 0xa7, 0x36, 0xbe,
+ 0x56, 0x8e, 0x9c, 0x3e, 0xbc, 0x57, 0xb2, 0x3c, 0xec, 0x99, 0x01, 0x3e,
+ 0xdd, 0x02, 0xad, 0xbd, 0x25, 0xa4, 0x19, 0xbe, 0xf3, 0xca, 0xe4, 0xba,
+ 0xa2, 0xe3, 0xc8, 0x3c, 0x0f, 0x4c, 0x8e, 0x3d, 0x45, 0x6c, 0x93, 0x3d,
+ 0xff, 0x38, 0xb5, 0xbd, 0xe7, 0x49, 0x25, 0x3e, 0xd6, 0xfc, 0x13, 0xbd,
+ 0x12, 0x79, 0x3d, 0xbe, 0x3b, 0x2f, 0x13, 0xbe, 0x74, 0x28, 0x06, 0x3d,
+ 0xbc, 0xa5, 0xe9, 0xbc, 0xd2, 0xfc, 0x2c, 0xbe, 0x8d, 0x77, 0x94, 0xbb,
+ 0xe3, 0x33, 0x8c, 0xbd, 0x51, 0x60, 0xd0, 0x3d, 0xbd, 0x3a, 0xb9, 0x3d,
+ 0x07, 0x8a, 0x1c, 0x3d, 0x81, 0xd0, 0xde, 0x3d, 0xb4, 0xb1, 0x0f, 0x3e,
+ 0x35, 0x2b, 0x95, 0xbd, 0xd8, 0x2e, 0xe6, 0xbd, 0x29, 0x9e, 0x39, 0xbd,
+ 0x41, 0x6e, 0x78, 0xbc, 0xea, 0x2e, 0xa1, 0xbd, 0x01, 0x76, 0xca, 0x3d,
+ 0xd0, 0x09, 0xa4, 0x3d, 0xba, 0x0b, 0xcd, 0xbc, 0x24, 0xa2, 0xba, 0x3b,
+ 0xad, 0xf1, 0xa6, 0xbd, 0xf8, 0x3a, 0xb0, 0x3d, 0x33, 0x18, 0x07, 0x3e,
+ 0x41, 0x2e, 0x6d, 0xbd, 0x69, 0xea, 0xf7, 0xbd, 0x2d, 0x2b, 0x9a, 0xbc,
+ 0x20, 0xe0, 0xd9, 0xbc, 0xf9, 0x54, 0x81, 0x3e, 0xa0, 0x23, 0xcd, 0xbd,
+ 0xd2, 0xb7, 0x88, 0x3c, 0xf6, 0xce, 0xca, 0xbd, 0x97, 0x97, 0xd6, 0x3c,
+ 0x84, 0xd4, 0x9e, 0xbc, 0x25, 0xbb, 0x54, 0x3e, 0xe1, 0xc9, 0xac, 0x3b,
+ 0x7c, 0x3b, 0x70, 0xbd, 0x59, 0xcd, 0x9a, 0x3d, 0x2c, 0xf6, 0x83, 0x3e,
+ 0x71, 0xa4, 0x99, 0xbc, 0xf4, 0xfb, 0xe7, 0x3d, 0xc3, 0x57, 0x92, 0x3d,
+ 0xbf, 0x4c, 0x14, 0xbe, 0x5a, 0xa2, 0x4d, 0xbd, 0x07, 0xc4, 0x48, 0x3d,
+ 0x2e, 0x88, 0x63, 0xbd, 0x1e, 0xfb, 0x00, 0x3e, 0xa6, 0x8f, 0x73, 0x3d,
+ 0xa8, 0x1d, 0x49, 0xbd, 0x78, 0x51, 0xb4, 0x3d, 0x83, 0x72, 0xa3, 0x3d,
+ 0x37, 0x22, 0x51, 0x3e, 0x14, 0x34, 0x41, 0xbe, 0x24, 0x3d, 0xf4, 0xbc,
+ 0x91, 0x1a, 0x66, 0x3e, 0xdd, 0x0a, 0xad, 0x3d, 0xa5, 0xca, 0xc7, 0xbd,
+ 0x4f, 0x31, 0x77, 0xbd, 0x15, 0x14, 0x3e, 0xbe, 0x94, 0x3d, 0x7e, 0xbd,
+ 0xd0, 0x25, 0xb9, 0xbd, 0x5a, 0x6a, 0x85, 0x3d, 0xad, 0x65, 0x95, 0xbe,
+ 0x76, 0x02, 0xd4, 0xbd, 0x14, 0x69, 0x87, 0xbc, 0x02, 0x8f, 0x97, 0xbd,
+ 0x40, 0x87, 0xdc, 0xbd, 0xfb, 0x90, 0x92, 0xbd, 0x03, 0x61, 0x6c, 0xbd,
+ 0xc7, 0x21, 0x8e, 0xbd, 0xd4, 0x53, 0xa0, 0xbc, 0xfa, 0x53, 0x8b, 0xbd,
+ 0xe9, 0x34, 0xb3, 0x3d, 0xa3, 0x9c, 0x20, 0x3e, 0x1b, 0xc9, 0x04, 0xbd,
+ 0xa3, 0x6c, 0xd9, 0xb9, 0x1e, 0x70, 0x23, 0xbc, 0x35, 0x2b, 0xd6, 0xbd,
+ 0x8e, 0x2a, 0x10, 0xbd, 0x45, 0xef, 0x3a, 0x3d, 0x1e, 0xf8, 0x97, 0xbd,
+ 0x4f, 0x12, 0x22, 0xbd, 0x05, 0x9c, 0xc4, 0xbd, 0x18, 0xbf, 0xdb, 0x3c,
+ 0x63, 0xd5, 0xba, 0xbd, 0x32, 0x76, 0x94, 0xbc, 0x54, 0x8b, 0x06, 0xbe,
+ 0x93, 0x65, 0x34, 0x3d, 0x8f, 0xf9, 0x74, 0x3e, 0x34, 0x2a, 0x84, 0x3d,
+ 0x83, 0x4b, 0x47, 0xbe, 0x94, 0xdb, 0x88, 0xbe, 0x2f, 0xa6, 0xa9, 0xbc,
+ 0x48, 0xf3, 0xb0, 0xbd, 0x9a, 0x71, 0x7a, 0xbd, 0x9a, 0x0c, 0xd8, 0xbc,
+ 0x89, 0x1f, 0x08, 0x3e, 0x90, 0x2d, 0x5f, 0xbd, 0xa5, 0x73, 0xb1, 0xbc,
+ 0xc7, 0x14, 0xb7, 0x3d, 0x4d, 0x3f, 0x3a, 0xbe, 0xc0, 0x4e, 0x91, 0x3d,
+ 0xa4, 0x4e, 0x9d, 0xbb, 0x61, 0xa4, 0xad, 0xbd, 0x6e, 0xc5, 0x17, 0xbe,
+ 0x03, 0x39, 0x74, 0x3e, 0x82, 0xad, 0x48, 0x3d, 0xe5, 0x3f, 0x16, 0x3d,
+ 0xdd, 0xc9, 0x70, 0xbc, 0x0b, 0x22, 0xd8, 0xbd, 0xe4, 0x79, 0x17, 0xbe,
+ 0xee, 0xef, 0x14, 0x3e, 0xc8, 0xbb, 0x15, 0xbd, 0x86, 0x1d, 0x08, 0x3e,
+ 0x52, 0x16, 0x8a, 0xbc, 0x11, 0xb3, 0x10, 0x3e, 0x46, 0xe8, 0xf5, 0x3d,
+ 0xb3, 0xee, 0xcb, 0xbc, 0xf1, 0x58, 0x17, 0x3d, 0xf0, 0x4a, 0x16, 0x3c,
+ 0xd3, 0xef, 0xb4, 0xbe, 0xc9, 0x8e, 0x7f, 0x3c, 0x64, 0x94, 0x6a, 0xbe,
+ 0xed, 0xf1, 0x77, 0xbe, 0x41, 0x90, 0x05, 0x3e, 0xbf, 0xde, 0xd9, 0x3e,
+ 0x0d, 0x63, 0x23, 0xbe, 0x95, 0x71, 0xc2, 0x3d, 0xa2, 0x70, 0xaf, 0x3e,
+ 0x65, 0x36, 0x7e, 0xbe, 0xf4, 0x22, 0xe8, 0xbd, 0x66, 0xa2, 0xc3, 0x3d,
+ 0x15, 0xb3, 0x1c, 0xbd, 0x94, 0x7f, 0x9e, 0x3d, 0x7c, 0x6e, 0x09, 0xbe,
+ 0x1c, 0xc9, 0x01, 0x3f, 0x66, 0x66, 0x02, 0xbe, 0x77, 0x9d, 0xf2, 0x3d,
+ 0xa5, 0x23, 0x81, 0x3e, 0x96, 0x24, 0x17, 0xbc, 0xb9, 0xc3, 0xee, 0xbc,
+ 0xd0, 0x8c, 0xbd, 0x3d, 0x52, 0xe4, 0xc8, 0x3b, 0x21, 0x8a, 0x8d, 0xbe,
+ 0xcc, 0x97, 0x09, 0x3d, 0x1d, 0x4c, 0xaa, 0xbd, 0xaf, 0xcb, 0x96, 0xbe,
+ 0x5c, 0x45, 0x20, 0xbf, 0x85, 0x83, 0x02, 0xbe, 0x41, 0x0f, 0x03, 0x3e,
+ 0x32, 0xa7, 0x15, 0x3e, 0x15, 0xa1, 0x2a, 0xbe, 0xdb, 0x70, 0x59, 0xbc,
+ 0xfc, 0x04, 0x36, 0x3a, 0x8e, 0x51, 0xcf, 0x3d, 0xcc, 0x0b, 0x1a, 0xbe,
+ 0xb3, 0x3d, 0x76, 0x3e, 0x5e, 0x82, 0xb5, 0x3e, 0x7d, 0x84, 0xa3, 0x3d,
+ 0xed, 0xc6, 0x5c, 0xbd, 0xec, 0x12, 0xc0, 0x3e, 0x6d, 0x8a, 0x54, 0x3e,
+ 0xe2, 0xb5, 0x5d, 0x3d, 0x24, 0x12, 0x90, 0xbe, 0x4a, 0x75, 0x86, 0xbe,
+ 0x1d, 0xce, 0xae, 0x3d, 0xde, 0x7e, 0xcd, 0xbd, 0xc0, 0x29, 0xff, 0xbd,
+ 0xc8, 0x31, 0xa3, 0xbe, 0x7f, 0xf4, 0x9e, 0xbd, 0x72, 0x0a, 0xa4, 0x3e,
+ 0x4e, 0x8a, 0x07, 0x3e, 0xd3, 0x8b, 0x86, 0x3e, 0x3d, 0x6c, 0xdd, 0x3e,
+ 0x84, 0x9b, 0x10, 0x3d, 0x1c, 0xf5, 0x58, 0x3e, 0x0a, 0x4e, 0xbd, 0x3d,
+ 0x7d, 0x65, 0x91, 0x3e, 0x22, 0x18, 0xf0, 0xbd, 0xf9, 0x43, 0xa3, 0x3d,
+ 0xbe, 0x68, 0xb3, 0xbe, 0x5a, 0x40, 0x18, 0xbe, 0xf6, 0x4f, 0x1d, 0xbe,
+ 0x84, 0xab, 0x3c, 0x3e, 0x1f, 0x39, 0x5d, 0xbe, 0x01, 0x90, 0xad, 0xbd,
+ 0xcf, 0x70, 0x23, 0x3e, 0x28, 0x11, 0xef, 0xbd, 0x9d, 0x88, 0x5b, 0xbe,
+ 0xa8, 0xfe, 0xf2, 0xbc, 0x8d, 0xc4, 0x09, 0xbe, 0x44, 0xce, 0x04, 0xbf,
+ 0x71, 0x1c, 0xa9, 0xbd, 0x71, 0x97, 0x49, 0xbd, 0x02, 0x3f, 0x72, 0xbe,
+ 0xf5, 0x4b, 0xd6, 0xbc, 0xcc, 0xb0, 0xea, 0x3e, 0xa0, 0xcf, 0x85, 0x3e,
+ 0xae, 0xfe, 0x32, 0xbc, 0x28, 0xa0, 0x1e, 0xbf, 0x82, 0x95, 0xa3, 0xbd,
+ 0x11, 0xfa, 0xbb, 0x3d, 0xf6, 0x2b, 0xae, 0x3e, 0x42, 0x0e, 0xd3, 0x3d,
+ 0x8a, 0xa4, 0x89, 0x3b, 0x8e, 0x89, 0x80, 0xbc, 0x84, 0x1b, 0x1a, 0x3d,
+ 0xc7, 0x25, 0x2a, 0xbe, 0x12, 0x4d, 0x7b, 0xbd, 0xe7, 0x9b, 0x37, 0x3e,
+ 0x44, 0x69, 0x21, 0xbe, 0xd7, 0x2d, 0x2c, 0x3e, 0x9f, 0xa8, 0xe8, 0xbe,
+ 0x7a, 0x67, 0xe6, 0xbe, 0x07, 0xd8, 0xa1, 0xbe, 0xb9, 0xe7, 0x52, 0x3e,
+ 0xdf, 0x22, 0xc6, 0x3e, 0xf0, 0x63, 0x5a, 0xbd, 0xdf, 0x54, 0x51, 0xbe,
+ 0xfb, 0xc8, 0xfd, 0xbd, 0xe5, 0x5f, 0xa7, 0xbe, 0xd7, 0xfd, 0x6b, 0x3e,
+ 0x8c, 0x11, 0x9a, 0xbe, 0xd4, 0x4b, 0x52, 0x3e, 0x58, 0x31, 0xf8, 0x3e,
+ 0xe4, 0x2c, 0xc3, 0x3d, 0xb5, 0x55, 0x74, 0x3e, 0x60, 0xf4, 0xff, 0xbd,
+ 0x87, 0xe8, 0xa6, 0x3a, 0x47, 0x06, 0x74, 0xbe, 0xc7, 0xc9, 0x94, 0x3e,
+ 0x23, 0x15, 0x7f, 0xbe, 0x62, 0x3b, 0x20, 0xbe, 0x2e, 0x8b, 0x14, 0x3e,
+ 0xa9, 0x56, 0x45, 0xbe, 0x87, 0x36, 0x75, 0x3d, 0xe2, 0x72, 0xef, 0x3c,
+ 0x4a, 0x7c, 0xba, 0xbd, 0xee, 0x7b, 0xcb, 0x3d, 0x5c, 0xca, 0x1a, 0xbc,
+ 0xf8, 0x82, 0xb1, 0xbd, 0xb2, 0x3f, 0x0f, 0x3e, 0xd8, 0xa9, 0x6f, 0xbd,
+ 0x1a, 0xe9, 0xcc, 0x3d, 0x8a, 0x81, 0x1d, 0xbe, 0x4d, 0x1c, 0x90, 0x3d,
+ 0x4d, 0xac, 0xff, 0x3d, 0x42, 0x03, 0x26, 0xbd, 0x8e, 0x40, 0x05, 0x3e,
+ 0x8d, 0xdd, 0xe2, 0x3d, 0xbb, 0x69, 0xc0, 0x3d, 0x7a, 0x2d, 0x16, 0xbe,
+ 0x0e, 0xc9, 0xa5, 0x3d, 0xcf, 0x55, 0x99, 0xbd, 0xba, 0x96, 0xd5, 0xbd,
+ 0x5c, 0xda, 0xf9, 0x3b, 0x40, 0x8a, 0x25, 0x3d, 0x32, 0x7b, 0x80, 0xbd,
+ 0x99, 0x5c, 0xd9, 0xbc, 0x33, 0x0f, 0xab, 0x3d, 0x19, 0x40, 0x75, 0x3d,
+ 0x5b, 0x0c, 0xe5, 0xbd, 0xcd, 0x48, 0x9e, 0x3e, 0x94, 0x63, 0xc5, 0xbd,
+ 0x00, 0x24, 0x17, 0xbd, 0xd0, 0xf8, 0xcd, 0xbc, 0x06, 0x91, 0x0b, 0xbe,
+ 0xc8, 0x6b, 0x92, 0xbd, 0xca, 0xb8, 0xa0, 0xbc, 0x58, 0x6c, 0x39, 0xbd,
+ 0xf8, 0xa8, 0xcd, 0xbd, 0x8f, 0x52, 0xc0, 0xbc, 0x39, 0xf5, 0xa0, 0x3d,
+ 0x8c, 0xf9, 0x1e, 0x3d, 0x6a, 0x9f, 0xeb, 0xbb, 0x25, 0xda, 0x07, 0xbc,
+ 0x37, 0x14, 0x25, 0xbe, 0x07, 0x43, 0x33, 0x3e, 0x09, 0x55, 0x4e, 0xbd,
+ 0xcb, 0xb4, 0x2d, 0xbe, 0x57, 0x37, 0x9f, 0xbc, 0x66, 0x73, 0x9d, 0xbd,
+ 0xb3, 0xb7, 0xcc, 0xbd, 0x4d, 0x51, 0xcb, 0x3c, 0x30, 0xc1, 0x1e, 0x3c,
+ 0x6d, 0x36, 0x13, 0xbd, 0x4b, 0xa2, 0x3b, 0xbe, 0xab, 0x29, 0x57, 0xbd,
+ 0x87, 0xc8, 0x88, 0xbb, 0xf3, 0x71, 0x8d, 0x3c, 0x50, 0x7a, 0xc1, 0x3d,
+ 0x64, 0x01, 0xfe, 0xbc, 0x29, 0xd5, 0x83, 0xbe, 0xce, 0xe5, 0xbb, 0x3c,
+ 0x3b, 0x05, 0xa9, 0x3d, 0x78, 0xff, 0x8b, 0x3d, 0xd8, 0xe1, 0x0a, 0xbe,
+ 0x6f, 0x34, 0x08, 0x3d, 0x29, 0xa1, 0xba, 0xbd, 0xa8, 0xe2, 0xa0, 0xbb,
+ 0x32, 0x11, 0x1e, 0x3d, 0x92, 0xeb, 0x60, 0xbd, 0x8c, 0x42, 0xc8, 0xbd,
+ 0xaf, 0x38, 0x72, 0xbd, 0xf4, 0xe3, 0x8d, 0xbd, 0x25, 0x2e, 0x19, 0xbe,
+ 0xfe, 0x2b, 0xb4, 0x3d, 0x52, 0xad, 0xb9, 0x3d, 0x60, 0x1e, 0xe3, 0xbb,
+ 0xe6, 0x9b, 0x38, 0xbc, 0x17, 0x59, 0x04, 0xbe, 0x87, 0x87, 0x99, 0x3d,
+ 0xe9, 0x27, 0x19, 0x3e, 0x44, 0x27, 0x7c, 0x3d, 0xf2, 0xce, 0x09, 0xbe,
+ 0x45, 0x42, 0x32, 0x3d, 0xd2, 0x69, 0x38, 0xbe, 0xb4, 0xea, 0x03, 0xbd,
+ 0x87, 0x0b, 0x00, 0x3e, 0x06, 0x00, 0xf3, 0x3d, 0x6c, 0x95, 0x2a, 0xbe,
+ 0xc4, 0x2b, 0xd5, 0xbd, 0xbf, 0x1f, 0xe9, 0x3d, 0x52, 0x7f, 0x91, 0x3c,
+ 0x96, 0x38, 0x86, 0xbd, 0x90, 0x1e, 0x56, 0xbe, 0xb1, 0x2b, 0x0f, 0xbe,
+ 0x96, 0xf8, 0xe9, 0xbb, 0x89, 0xdb, 0xd5, 0xbc, 0x11, 0x40, 0xf7, 0x3d,
+ 0x96, 0x12, 0xdf, 0xbb, 0xa5, 0xc3, 0xf7, 0x3c, 0x64, 0xad, 0xec, 0x39,
+ 0x34, 0x33, 0x9e, 0x3d, 0x6c, 0x4f, 0x04, 0x3d, 0x54, 0xaf, 0x36, 0xbe,
+ 0x67, 0x54, 0x03, 0xbd, 0x4d, 0x33, 0xc9, 0x3d, 0x9d, 0x2f, 0x44, 0xbe,
+ 0xc0, 0x30, 0x6e, 0xbd, 0xcc, 0x0f, 0xd8, 0xb9, 0x08, 0xaf, 0xc2, 0x3d,
+ 0xac, 0x19, 0xe4, 0x3d, 0xae, 0xd5, 0x84, 0xbd, 0xfc, 0x2e, 0x1c, 0xbe,
+ 0xb5, 0xad, 0xae, 0xbc, 0x20, 0xce, 0xd5, 0xbc, 0x04, 0x45, 0xe1, 0x3d,
+ 0x1b, 0x4c, 0x7f, 0xbe, 0x8b, 0x76, 0x02, 0x3e, 0xe7, 0x5b, 0xa4, 0x3d,
+ 0xab, 0x51, 0x76, 0xbd, 0x5f, 0x90, 0x41, 0xbd, 0x10, 0x04, 0x8c, 0x3d,
+ 0x4d, 0x48, 0x2e, 0x3e, 0x45, 0x1d, 0x6f, 0x3e, 0xab, 0x8a, 0x3f, 0xbe,
+ 0x9b, 0x8a, 0x4d, 0xbe, 0x82, 0x16, 0x6f, 0x3e, 0xe3, 0xe4, 0xa3, 0xbe,
+ 0xc3, 0x29, 0x8d, 0x3e, 0xe9, 0x1f, 0xf0, 0x3c, 0x73, 0xc4, 0x4f, 0x3e,
+ 0x6f, 0xfb, 0xbf, 0x3e, 0x30, 0x48, 0x03, 0x3e, 0xae, 0x66, 0xdf, 0x3e,
+ 0x7f, 0x3a, 0x9b, 0xbd, 0x12, 0x57, 0xee, 0x3c, 0x30, 0xcb, 0x10, 0xbc,
+ 0xbb, 0x05, 0x25, 0xbe, 0x45, 0x9a, 0xaf, 0xbd, 0x98, 0x7c, 0x10, 0x3e,
+ 0x9d, 0x4b, 0x66, 0xbe, 0x93, 0x3c, 0x9b, 0x3d, 0x1d, 0xde, 0x9e, 0x3d,
+ 0xcc, 0x58, 0x6e, 0x3e, 0x71, 0x09, 0x59, 0x3c, 0xa9, 0x21, 0x47, 0x3e,
+ 0x7b, 0xb7, 0x94, 0x3e, 0x44, 0x20, 0xaf, 0x3e, 0x8e, 0x84, 0xbc, 0xbd,
+ 0xeb, 0xfe, 0xc9, 0x3e, 0x94, 0x6b, 0x85, 0xbe, 0x5c, 0x4e, 0x9c, 0x3d,
+ 0x4d, 0xb6, 0xb0, 0xbe, 0xd3, 0xbd, 0x5c, 0x3e, 0x9d, 0xfc, 0x40, 0x3d,
+ 0x7e, 0xbe, 0xe5, 0x3c, 0xae, 0xbd, 0x0a, 0xbd, 0x94, 0xca, 0x82, 0x3e,
+ 0xde, 0xdb, 0x63, 0xbd, 0x70, 0xb6, 0xb4, 0xbe, 0xf4, 0xb8, 0x59, 0xbe,
+ 0x5b, 0x4d, 0x40, 0xbe, 0x47, 0xcf, 0x1d, 0x3c, 0x41, 0x19, 0x34, 0x3e,
+ 0x53, 0xbc, 0x4b, 0x3b, 0x30, 0x6f, 0xcc, 0xbd, 0x16, 0x18, 0xcf, 0xbd,
+ 0x6b, 0x62, 0x99, 0xbe, 0xc7, 0xd7, 0xdd, 0xbc, 0xc3, 0xeb, 0xc6, 0xbd,
+ 0x6f, 0x73, 0xdb, 0x3e, 0x44, 0xb2, 0xb3, 0xbd, 0x6e, 0x0e, 0x5f, 0xbd,
+ 0x9e, 0xdb, 0xdb, 0xbd, 0x8d, 0x06, 0xb6, 0x3d, 0xab, 0x22, 0xc0, 0x3d,
+ 0x35, 0x7d, 0x10, 0x3d, 0xae, 0xc7, 0x15, 0xbe, 0x14, 0x49, 0x1b, 0xbe,
+ 0x97, 0x67, 0x61, 0xbe, 0xe6, 0xb7, 0xf3, 0x3d, 0xff, 0x03, 0x49, 0xbe,
+ 0xe7, 0x27, 0x94, 0x3d, 0x6a, 0x82, 0x35, 0xbe, 0x37, 0x81, 0x52, 0xbd,
+ 0x7f, 0x22, 0x9e, 0x3e, 0x4e, 0x73, 0x4c, 0xbe, 0xa3, 0xea, 0x6d, 0xbe,
+ 0xed, 0xd1, 0x48, 0x3e, 0xc5, 0x06, 0x1d, 0xbe, 0x14, 0xf3, 0x40, 0x3c,
+ 0x06, 0x55, 0xe1, 0xba, 0xb6, 0x66, 0x3b, 0x3e, 0x18, 0x46, 0x1e, 0x3e,
+ 0x92, 0xaa, 0x8b, 0x3e, 0xbb, 0xfe, 0x21, 0xbe, 0x2a, 0x1f, 0x05, 0x3e,
+ 0xef, 0xe2, 0x3b, 0x3d, 0xdf, 0x67, 0x00, 0xbe, 0xb2, 0x67, 0x40, 0xbe,
+ 0xea, 0xb7, 0x20, 0x3e, 0x63, 0x9e, 0xa2, 0x3c, 0xae, 0x5d, 0x62, 0x3e,
+ 0xb1, 0x74, 0x10, 0xbe, 0xd0, 0xff, 0x1e, 0xbe, 0xff, 0xb3, 0xb7, 0xbd,
+ 0x2c, 0xba, 0x24, 0x3e, 0x14, 0x22, 0x87, 0x3d, 0x5c, 0xa7, 0x97, 0xbe,
+ 0x4e, 0xf7, 0x76, 0xbe, 0x97, 0x7d, 0xa8, 0xbc, 0x98, 0x53, 0xab, 0xbe,
+ 0xb8, 0x95, 0x21, 0x3e, 0xe8, 0x78, 0x54, 0xbd, 0x5f, 0xab, 0x8c, 0x3d,
+ 0x8f, 0xec, 0x9b, 0x3e, 0x25, 0xdc, 0x88, 0x3e, 0x0a, 0x5f, 0x18, 0x3e,
+ 0xfe, 0x6e, 0xee, 0xbd, 0x05, 0xa8, 0x8e, 0xbe, 0x38, 0xf4, 0xfa, 0xbb,
+ 0xe5, 0xe1, 0x9e, 0xbb, 0x34, 0x40, 0xa5, 0x3d, 0x78, 0x94, 0xd8, 0xbb,
+ 0xb9, 0xd9, 0x50, 0xbd, 0x2f, 0x4a, 0xca, 0x3c, 0x08, 0x21, 0x1c, 0xbe,
+ 0xe9, 0xa1, 0x33, 0x3c, 0x76, 0x9f, 0x77, 0xbe, 0xd7, 0x0a, 0x42, 0x3d,
+ 0x8f, 0xa5, 0x7a, 0x3e, 0x80, 0xa5, 0x97, 0x3e, 0xf8, 0x9f, 0x62, 0x3e,
+ 0x06, 0xc1, 0x06, 0xbe, 0x7e, 0xfc, 0x07, 0x3e, 0xe5, 0xa4, 0xaf, 0xbe,
+ 0xd3, 0x9b, 0x9c, 0xbd, 0xa7, 0x62, 0xb5, 0xbe, 0x35, 0x98, 0x6d, 0xbd,
+ 0xdc, 0xc9, 0xde, 0xbb, 0x8d, 0x9a, 0x10, 0x3d, 0x22, 0xa5, 0xb7, 0xbc,
+ 0x3f, 0x69, 0x7c, 0xbe, 0x28, 0x2e, 0x12, 0xbd, 0xcc, 0x8b, 0xe5, 0xbe,
+ 0xaf, 0x5b, 0x4d, 0x3e, 0x89, 0xab, 0x5e, 0x3d, 0xfc, 0x67, 0xa8, 0x3c,
+ 0x33, 0x03, 0xad, 0x3e, 0x89, 0x89, 0xf0, 0xbc, 0x71, 0x31, 0xc8, 0x3e,
+ 0x0a, 0x9f, 0xba, 0xbe, 0x7e, 0x43, 0x50, 0xbd, 0xad, 0x8c, 0xad, 0xbd,
+ 0xbf, 0x53, 0x1a, 0xbf, 0xcc, 0x03, 0x7e, 0x3e, 0x23, 0x1e, 0x47, 0xbc,
+ 0xfe, 0x02, 0x60, 0xbe, 0xb4, 0x27, 0x8a, 0xbd, 0xab, 0x86, 0x86, 0x3d,
+ 0x9b, 0x5c, 0x50, 0x3e, 0xfa, 0xd5, 0xcc, 0xbd, 0xb8, 0xc4, 0x89, 0x3e,
+ 0x73, 0x5d, 0xa7, 0x3e, 0xf2, 0x2c, 0xe9, 0x3d, 0xc4, 0x0d, 0x85, 0x3d,
+ 0x97, 0xbd, 0xb4, 0x3e, 0x6f, 0xa1, 0xa5, 0xbc, 0xd6, 0xc3, 0x47, 0x3e,
+ 0x64, 0x92, 0xd1, 0xbe, 0xf3, 0xbf, 0xf8, 0xbd, 0x93, 0x8f, 0x28, 0xbe,
+ 0x29, 0x46, 0x33, 0xbc, 0xe4, 0xb0, 0xc5, 0x3d, 0xcc, 0x81, 0x25, 0xbd,
+ 0x43, 0x94, 0x89, 0xbe, 0x79, 0x32, 0x8e, 0xbe, 0xf3, 0x62, 0xac, 0xbe,
+ 0x80, 0xef, 0x19, 0xbe, 0xe9, 0xe8, 0xdf, 0xbb, 0xb0, 0x7c, 0x79, 0x3e,
+ 0x63, 0x2d, 0xf6, 0xbc, 0x3b, 0xc7, 0xb7, 0xbe, 0x44, 0x0a, 0x96, 0xbe,
+ 0x0b, 0x03, 0x53, 0xbe, 0x02, 0x0d, 0x21, 0xbe, 0xd2, 0x27, 0x93, 0x3d,
+ 0x4a, 0x5f, 0x85, 0x3e, 0xcc, 0x6b, 0x02, 0x3e, 0x51, 0xa1, 0x99, 0xbe,
+ 0x8f, 0xf8, 0x57, 0xbe, 0x94, 0xbb, 0xaa, 0x3e, 0x5f, 0x22, 0x9c, 0x3d,
+ 0x81, 0x7f, 0xa4, 0xb9, 0x00, 0xe4, 0x04, 0xbe, 0xe2, 0xee, 0x66, 0xbd,
+ 0xe5, 0x3f, 0xdd, 0xbd, 0xf6, 0xb6, 0x8c, 0x3e, 0x46, 0xb0, 0xbb, 0xbe,
+ 0x1a, 0xfd, 0x11, 0x3f, 0xc1, 0x9a, 0x8f, 0xbe, 0x6e, 0x40, 0x94, 0x3e,
+ 0x4e, 0xd2, 0x7a, 0x3e, 0xe6, 0xbe, 0x8e, 0xbd, 0x2c, 0xdd, 0x0d, 0xbe,
+ 0xeb, 0x07, 0x08, 0x3e, 0x88, 0x67, 0x6a, 0xbd, 0x1b, 0x33, 0xe8, 0x3d,
+ 0x70, 0x32, 0xaf, 0xbe, 0xf7, 0xdf, 0x96, 0xbd, 0x03, 0x68, 0x8c, 0x3e,
+ 0x19, 0x78, 0x18, 0x3f, 0xfe, 0xba, 0xec, 0xbd, 0x53, 0x57, 0xc1, 0xbc,
+ 0x98, 0xa0, 0xa8, 0xbd, 0x9f, 0x46, 0x5b, 0x3d, 0x12, 0xe1, 0xf5, 0xbe,
+ 0x71, 0xc3, 0x09, 0x3e, 0x15, 0x27, 0x46, 0xbd, 0x11, 0x42, 0xbd, 0x3e,
+ 0x91, 0xd0, 0xac, 0x3c, 0x63, 0xf2, 0xeb, 0xbe, 0xe6, 0x68, 0x9d, 0xbe,
+ 0x90, 0x91, 0xb4, 0x3e, 0xa9, 0x54, 0x4c, 0xbd, 0xc6, 0x6b, 0x89, 0xbe,
+ 0xa4, 0x1e, 0x34, 0xbe, 0x0c, 0x62, 0xb5, 0xbd, 0xc0, 0x76, 0xb6, 0xbe,
+ 0x91, 0x5f, 0x24, 0x3e, 0x01, 0xb7, 0xf9, 0x39, 0x0a, 0xda, 0xa8, 0x3e,
+ 0x3a, 0xa2, 0x9d, 0x3e, 0x86, 0x4d, 0x51, 0xbd, 0xa0, 0x73, 0xe3, 0x3c,
+ 0x6a, 0x79, 0xdd, 0xbe, 0x69, 0x11, 0x0a, 0xbf, 0xbc, 0xd5, 0x85, 0xbe,
+ 0xcd, 0xef, 0xb2, 0xbd, 0x41, 0xb4, 0xb1, 0x3e, 0xa1, 0x4a, 0x6c, 0xbe,
+ 0x55, 0xe1, 0x92, 0xbb, 0x61, 0xb8, 0x87, 0xbd, 0xed, 0xa2, 0xd3, 0xbe,
+ 0x54, 0xad, 0xa0, 0xbd, 0xea, 0x8f, 0xbb, 0xbe, 0x53, 0xde, 0x94, 0x3d,
+ 0x3e, 0xa1, 0x82, 0x3e, 0xff, 0x7d, 0x82, 0x3e, 0xd9, 0x51, 0x7a, 0xbd,
+ 0xf4, 0x58, 0x36, 0xbd, 0x06, 0x01, 0x82, 0xbd, 0x38, 0xf0, 0xbf, 0xbe,
+ 0x7f, 0x2a, 0x8d, 0xbe, 0xd6, 0x88, 0x5f, 0xbe, 0x9d, 0x55, 0xed, 0x3d,
+ 0x56, 0xe1, 0x54, 0xbe, 0x8c, 0xd6, 0x74, 0x3d, 0x4e, 0x2f, 0xd8, 0x3d,
+ 0x55, 0x84, 0xdd, 0x3c, 0x3b, 0x96, 0x53, 0x3e, 0xb1, 0xe9, 0xca, 0x3d,
+ 0x27, 0xf7, 0x37, 0x3d, 0x8a, 0x9f, 0x77, 0xbe, 0xcb, 0xb0, 0xff, 0x3d,
+ 0x75, 0x09, 0xe5, 0xbd, 0xb8, 0x9b, 0xba, 0x3d, 0xde, 0x4c, 0x90, 0x3e,
+ 0xa2, 0x77, 0xdb, 0xbd, 0x80, 0xd2, 0x01, 0xbe, 0xf0, 0xee, 0x7c, 0xbe,
+ 0xa6, 0x37, 0x81, 0xbc, 0x89, 0x0b, 0xbc, 0x3e, 0xaa, 0x7f, 0xde, 0x3e,
+ 0xc8, 0x91, 0x4a, 0x3c, 0x7c, 0x7a, 0x4b, 0xbe, 0x2c, 0x13, 0x17, 0x3e,
+ 0xb1, 0x3e, 0xcf, 0x3e, 0x5a, 0x3f, 0x56, 0x3e, 0x26, 0xea, 0x42, 0xbe,
+ 0x08, 0x2f, 0xb5, 0x3e, 0x0b, 0xb7, 0x3e, 0xbe, 0x1d, 0xcf, 0x7f, 0xbe,
+ 0x70, 0x62, 0xa0, 0x3d, 0x7a, 0x8f, 0xd2, 0xbd, 0x6d, 0x46, 0xca, 0xbc,
+ 0xfa, 0xd3, 0x89, 0xbd, 0xaf, 0x21, 0x14, 0x3e, 0xc8, 0xb7, 0x5f, 0xbe,
+ 0xc3, 0x06, 0x2d, 0x3e, 0xed, 0xc2, 0x84, 0x3e, 0xf8, 0x0c, 0xcc, 0xbd,
+ 0x51, 0x32, 0x6c, 0xbd, 0x4f, 0x60, 0x59, 0xbd, 0xef, 0x13, 0xc8, 0xbc,
+ 0x3f, 0x43, 0x56, 0x3e, 0xde, 0xb1, 0x44, 0x3e, 0x22, 0x5b, 0xc9, 0x3e,
+ 0x06, 0x2f, 0x3f, 0xbd, 0x3f, 0xf0, 0x91, 0xbe, 0xa4, 0xa5, 0x21, 0xbe,
+ 0x29, 0xf8, 0x9a, 0xbc, 0x1d, 0xe4, 0xcf, 0xbd, 0xfd, 0x1a, 0x30, 0x3e,
+ 0xe5, 0x11, 0x76, 0x3d, 0xb3, 0x8a, 0xb1, 0x3e, 0x24, 0xc8, 0x83, 0x3d,
+ 0xc8, 0x6e, 0x6f, 0xbd, 0xcf, 0x68, 0x4d, 0x3e, 0xde, 0x9f, 0x96, 0x3d,
+ 0x98, 0x9b, 0xb7, 0x3d, 0xe8, 0x01, 0x49, 0x3e, 0x47, 0xf3, 0x9d, 0xbc,
+ 0x6d, 0x15, 0x60, 0xbd, 0xc9, 0x96, 0x12, 0x3d, 0x2f, 0x4b, 0x3e, 0xbe,
+ 0x31, 0xbf, 0x1c, 0xbd, 0xca, 0x5d, 0xdf, 0x3d, 0xb7, 0x74, 0x06, 0x3e,
+ 0xa9, 0xb2, 0x59, 0x3e, 0xf5, 0x5e, 0x27, 0xbe, 0x3f, 0xe6, 0x57, 0xbc,
+ 0x47, 0x47, 0x25, 0xbc, 0x8e, 0xcb, 0x99, 0x3e, 0x9e, 0x45, 0x08, 0x3e,
+ 0xac, 0x24, 0xab, 0xbe, 0x1c, 0x9a, 0x51, 0x3e, 0xf1, 0x87, 0x3f, 0xbe,
+ 0xbd, 0xfa, 0xf7, 0x3c, 0x11, 0xad, 0x30, 0x3d, 0x6d, 0x16, 0x74, 0xbe,
+ 0x5d, 0x5c, 0xf3, 0xbc, 0xda, 0xf8, 0xd0, 0x3d, 0xa4, 0x42, 0xc4, 0xbd,
+ 0x12, 0x04, 0xaf, 0xbd, 0xb4, 0x09, 0x31, 0xbf, 0xa5, 0xca, 0x63, 0x3e,
+ 0xf2, 0x00, 0x47, 0x3d, 0x17, 0xa5, 0x1d, 0x3e, 0x70, 0x91, 0x87, 0xbd,
+ 0x09, 0x85, 0x69, 0x3e, 0x42, 0xfd, 0x42, 0x3e, 0xb5, 0x29, 0x51, 0xbd,
+ 0x31, 0x0e, 0x8e, 0xbc, 0x34, 0x5b, 0x19, 0xbd, 0xd0, 0x29, 0x8b, 0x3d,
+ 0xec, 0x36, 0x31, 0x3e, 0x41, 0x73, 0x19, 0x3c, 0x1d, 0xcb, 0x9c, 0xbd,
+ 0x2f, 0x4b, 0xdb, 0xbd, 0x1c, 0x2c, 0x1c, 0x3d, 0xac, 0xe6, 0x47, 0x3e,
+ 0xb4, 0xc4, 0xc1, 0x3d, 0x5e, 0x2d, 0x46, 0xbd, 0xd1, 0xaf, 0x99, 0xbe,
+ 0x90, 0xdf, 0xac, 0x3c, 0x3b, 0x39, 0x6e, 0xbe, 0x1f, 0xa4, 0x98, 0x3d,
+ 0x6a, 0x94, 0x1d, 0x3d, 0xcb, 0x39, 0x2e, 0x3d, 0x7f, 0x73, 0x8a, 0xbe,
+ 0x96, 0x11, 0x33, 0x3c, 0xa7, 0x9d, 0x78, 0xbe, 0x92, 0xaf, 0x70, 0x3e,
+ 0x8b, 0xcb, 0xb3, 0x3d, 0x61, 0xc4, 0x03, 0x3e, 0x75, 0x15, 0x4b, 0x3e,
+ 0x2a, 0xa4, 0x8e, 0x3e, 0xf6, 0xa2, 0x80, 0xbe, 0x45, 0x2f, 0xf0, 0xbd,
+ 0xe0, 0xb2, 0x8e, 0xbb, 0x89, 0x30, 0x0a, 0x3e, 0x6f, 0x1f, 0x84, 0xbd,
+ 0x50, 0x8c, 0x94, 0x3d, 0x9a, 0xc2, 0x8c, 0x3d, 0x68, 0x4a, 0xff, 0x3c,
+ 0xe2, 0xe8, 0xd9, 0x3d, 0x1a, 0x5e, 0xc2, 0x3d, 0xa0, 0xc6, 0xe0, 0x3b,
+ 0x92, 0xd8, 0xe7, 0xbd, 0x71, 0x6e, 0x01, 0xbe, 0x70, 0x4e, 0x07, 0x3d,
+ 0x96, 0x4c, 0xb5, 0xbd, 0x1c, 0x9a, 0x97, 0x3d, 0xfc, 0x2a, 0x17, 0x3d,
+ 0x5c, 0x84, 0xfb, 0xbc, 0xb8, 0x74, 0xa9, 0x3c, 0xc0, 0xd8, 0x3c, 0xbc,
+ 0xac, 0xfd, 0xbf, 0xbc, 0x39, 0xcb, 0x06, 0x3e, 0xa6, 0xb6, 0xfe, 0x3d,
+ 0x34, 0xfa, 0xf2, 0xbc, 0xa6, 0xd2, 0xb5, 0x3d, 0x58, 0xff, 0x0f, 0x3d,
+ 0xda, 0xdf, 0x02, 0xbe, 0x9e, 0xf7, 0xf7, 0xbd, 0x42, 0x8b, 0xa4, 0xbd,
+ 0x25, 0x82, 0x0d, 0xbe, 0xb0, 0x95, 0x1a, 0x3d, 0x60, 0xed, 0xb5, 0xbd,
+ 0x14, 0xb1, 0x85, 0x3d, 0xe8, 0x32, 0x7d, 0xbd, 0x42, 0xa6, 0xe9, 0x3d,
+ 0xb6, 0xd0, 0xa3, 0xbd, 0xc0, 0x15, 0xea, 0x3c, 0x30, 0x46, 0xd1, 0xbd,
+ 0x27, 0xa6, 0x03, 0x3e, 0xd2, 0x18, 0x38, 0xbd, 0x73, 0xad, 0x97, 0xbd,
+ 0x06, 0xfa, 0x8b, 0x3d, 0x14, 0xd3, 0x33, 0xbd, 0x80, 0x64, 0x5b, 0x3c,
+ 0xca, 0x0f, 0xbe, 0x3d, 0x08, 0x17, 0xfe, 0xbc, 0x06, 0x5a, 0xa1, 0xbd,
+ 0xe0, 0xde, 0x7c, 0xbd, 0x80, 0x1d, 0xef, 0xbd, 0xe4, 0x4b, 0x76, 0x3d,
+ 0x8e, 0x7e, 0x1e, 0xbd, 0x4e, 0x59, 0xf0, 0xbd, 0xc6, 0x82, 0x78, 0xbd,
+ 0x44, 0xc7, 0x1f, 0xbd, 0xb4, 0xde, 0x73, 0x3d, 0x68, 0x51, 0xd7, 0x3c,
+ 0x18, 0xf6, 0x74, 0x3d, 0x56, 0x4c, 0xbb, 0xbd, 0x80, 0x9f, 0x39, 0x3c,
+ 0x98, 0x1c, 0xb9, 0x3c, 0x80, 0xfa, 0x87, 0xbd, 0xf8, 0xda, 0x06, 0xbd,
+ 0x68, 0xba, 0x99, 0x3d, 0xf0, 0xcf, 0xde, 0x3d, 0x98, 0x34, 0xb9, 0x3c,
+ 0xea, 0xc7, 0xc1, 0xbd, 0x32, 0xff, 0x64, 0xbd, 0x88, 0xbe, 0x2c, 0x3d,
+ 0x3c, 0x71, 0x45, 0xbd, 0x75, 0x64, 0xca, 0xbd, 0xc8, 0x57, 0x4f, 0x3d,
+ 0x6e, 0x51, 0x14, 0xbd, 0x36, 0xe7, 0xff, 0xbd, 0x13, 0xc4, 0xb4, 0xbd,
+ 0x89, 0x29, 0x02, 0x3e, 0xd8, 0x1e, 0x08, 0xbd, 0x10, 0xf4, 0xf3, 0xbd,
+ 0xed, 0x2b, 0xdc, 0xbd, 0x10, 0xee, 0x00, 0xbd, 0x70, 0xc8, 0x6b, 0xbd,
+ 0x84, 0x01, 0x8b, 0xbd, 0x51, 0x8b, 0x8e, 0xbd, 0xb0, 0x8f, 0x7e, 0x3d,
+ 0xc1, 0x1a, 0x01, 0x3e, 0xe0, 0x2d, 0x15, 0xbd, 0x9c, 0x19, 0x05, 0x3d,
+ 0xdc, 0xd8, 0xe1, 0xbd, 0xde, 0x10, 0x8b, 0x3d, 0xdd, 0x9a, 0xb7, 0xbd,
+ 0x6e, 0xa7, 0x5a, 0xbd, 0xc0, 0x58, 0xaa, 0xbd, 0x88, 0x50, 0x09, 0x3d,
+ 0x0e, 0x5c, 0x04, 0xbd, 0xa8, 0xd1, 0xa3, 0x3c, 0xd4, 0x0e, 0xa3, 0x3d,
+ 0x05, 0x02, 0x0b, 0x3e, 0xec, 0x07, 0x22, 0x3d, 0x9a, 0x55, 0x7e, 0xbd,
+ 0xd6, 0x93, 0x29, 0xbd, 0x4e, 0xc3, 0xfe, 0x3d, 0xf4, 0xad, 0xa3, 0x3d,
+ 0x32, 0xbd, 0x8e, 0x3d, 0x1f, 0x9e, 0x0d, 0x3e, 0x1f, 0xc7, 0x00, 0xbe,
+ 0xa6, 0x26, 0xe5, 0x3d, 0x80, 0x68, 0xed, 0xbd, 0x17, 0xbf, 0x04, 0x3e,
+ 0x84, 0x6c, 0x8a, 0xbd, 0x4c, 0xb6, 0x27, 0x3d, 0x3b, 0xfd, 0x01, 0x3e,
+ 0x6f, 0x06, 0x8a, 0xbd, 0xaf, 0x43, 0x02, 0x3e, 0xd7, 0xfc, 0xb7, 0xbd,
+ 0xaf, 0x6e, 0x04, 0x3e, 0x50, 0x30, 0xbc, 0x3c, 0xe0, 0x3f, 0xe6, 0xbb,
+ 0x2c, 0x8c, 0x10, 0xbd, 0x64, 0x66, 0x33, 0x3d, 0x9c, 0x62, 0x6f, 0xbd,
+ 0x02, 0xa0, 0x13, 0x3e, 0xd1, 0xe9, 0xce, 0xbc, 0xbf, 0x0f, 0x8e, 0x3d,
+ 0xa4, 0x17, 0xbd, 0xbc, 0xd1, 0x73, 0x14, 0x3e, 0x43, 0x07, 0x52, 0x3e,
+ 0xae, 0x9d, 0xc4, 0x3d, 0xf5, 0x90, 0xef, 0x3d, 0x82, 0xa4, 0x11, 0x3d,
+ 0x55, 0xa1, 0x90, 0x3d, 0xcf, 0x8d, 0x1f, 0x3d, 0x5b, 0xb2, 0xc7, 0x3d,
+ 0x43, 0x44, 0x32, 0x3e, 0x13, 0x3c, 0xf3, 0x3d, 0x82, 0x6c, 0x1f, 0x3d,
+ 0x9b, 0x46, 0x00, 0x3d, 0x2f, 0x03, 0xa5, 0x3d, 0x3d, 0x7d, 0x30, 0xbd,
+ 0x7d, 0x50, 0xb6, 0xbe, 0xfe, 0xfa, 0xbb, 0x3d, 0xe3, 0x70, 0x61, 0x3d,
+ 0x44, 0x21, 0xab, 0x3d, 0x2e, 0xf8, 0xca, 0xbd, 0xf3, 0x7e, 0xc7, 0xbb,
+ 0x45, 0xdf, 0x80, 0x3d, 0xca, 0x3b, 0xa1, 0x3d, 0x5e, 0xea, 0xdb, 0xbd,
+ 0x7f, 0xcf, 0xab, 0x3e, 0xec, 0x10, 0x82, 0x3d, 0x38, 0x8d, 0x4a, 0x3d,
+ 0x9a, 0x52, 0x3a, 0x3e, 0x08, 0x59, 0xdc, 0xbc, 0x3c, 0xf6, 0xc9, 0x3e,
+ 0xa0, 0x2e, 0x68, 0xbe, 0xfd, 0x16, 0x22, 0x3e, 0xed, 0x88, 0x1d, 0xbc,
+ 0xa0, 0xf0, 0xdf, 0xbc, 0x75, 0x71, 0x1b, 0x3d, 0xc8, 0xf0, 0x58, 0x3d,
+ 0xe7, 0x11, 0xbc, 0x3d, 0x29, 0x6f, 0xec, 0xbd, 0xb7, 0x3b, 0x7b, 0xbe,
+ 0x69, 0x5c, 0xdc, 0xbc, 0xd8, 0x36, 0x44, 0xbe, 0x19, 0x8a, 0x8c, 0x3e,
+ 0xae, 0xcd, 0x02, 0x3e, 0xa1, 0xa4, 0x07, 0xbe, 0x14, 0xbb, 0x63, 0x3d,
+ 0x98, 0xd5, 0x13, 0xbe, 0x0c, 0x69, 0x8d, 0xbd, 0x72, 0xd4, 0x73, 0xbd,
+ 0x19, 0xd7, 0x48, 0x3e, 0xa6, 0x66, 0xb3, 0x3e, 0x84, 0xe3, 0xda, 0xbd,
+ 0x8f, 0x5d, 0xa1, 0xbe, 0x51, 0xba, 0x46, 0xbd, 0xd9, 0x4c, 0xd5, 0xbc,
+ 0xa1, 0x98, 0x33, 0x3d, 0x38, 0x9d, 0x86, 0xbe, 0x98, 0xb0, 0x1b, 0xbc,
+ 0x5e, 0x62, 0x11, 0xbd, 0x19, 0x9e, 0x36, 0x3e, 0x6c, 0x52, 0x1b, 0xbe,
+ 0x54, 0xd0, 0x61, 0x3e, 0x40, 0x2d, 0x66, 0xbe, 0xcd, 0xf6, 0x0e, 0x3e,
+ 0x6d, 0xf8, 0x8d, 0xbc, 0x95, 0x8d, 0x17, 0xbe, 0x35, 0x02, 0x09, 0xbc,
+ 0x21, 0x06, 0xdc, 0x3c, 0x2f, 0xb6, 0x8b, 0x3e, 0x0e, 0xa6, 0xab, 0xbd,
+ 0x82, 0x9e, 0x58, 0xbe, 0xd5, 0x0d, 0x36, 0xbd, 0xb0, 0xe0, 0xf9, 0x3d,
+ 0x15, 0x7c, 0x5c, 0x3e, 0x1b, 0xd2, 0xca, 0xbc, 0x86, 0x6f, 0x2a, 0x3e,
+ 0x07, 0x03, 0x07, 0x3e, 0x16, 0xb4, 0xb9, 0x3d, 0x04, 0x6a, 0xaf, 0x3c,
+ 0xb7, 0x81, 0x36, 0x3e, 0x91, 0xa0, 0x8e, 0x3d, 0xe5, 0xdd, 0x2b, 0xbd,
+ 0x71, 0x6b, 0xd9, 0xbd, 0x44, 0xce, 0x99, 0xbe, 0x86, 0x89, 0xd3, 0xbd,
+ 0x32, 0x44, 0xa4, 0x3d, 0x78, 0xac, 0x42, 0xbe, 0x6f, 0x87, 0x5e, 0xbe,
+ 0x00, 0x8f, 0xa4, 0xbe, 0x2e, 0x1b, 0x88, 0xbc, 0x36, 0xe2, 0x65, 0xbe,
+ 0xaa, 0xf6, 0x0c, 0xbe, 0x05, 0xd8, 0x99, 0x3d, 0x17, 0x2b, 0x0a, 0x3e,
+ 0xcb, 0x32, 0x71, 0x3e, 0x81, 0xdb, 0x29, 0xbc, 0xc3, 0x85, 0x77, 0x3e,
+ 0x00, 0xf9, 0x52, 0x3e, 0x86, 0xe2, 0x9b, 0xbe, 0xf7, 0x91, 0x59, 0xbe,
+ 0x8e, 0x15, 0xde, 0x3c, 0x65, 0xa5, 0xab, 0xbd, 0x52, 0x47, 0x4d, 0x3e,
+ 0xb2, 0x85, 0xea, 0xbd, 0xb9, 0xfb, 0x92, 0x3c, 0x0a, 0xd3, 0x9f, 0xbe,
+ 0xef, 0xd3, 0xe1, 0x3c, 0xbf, 0xdb, 0xa7, 0x3b, 0x94, 0x01, 0xa5, 0x3d,
+ 0xeb, 0x43, 0x51, 0x3d, 0xf2, 0x3e, 0x82, 0x3e, 0x9e, 0xab, 0xb0, 0x3b,
+ 0x1a, 0x33, 0xf3, 0x3d, 0x62, 0xcd, 0x15, 0x3e, 0x3c, 0xf8, 0x95, 0xbe,
+ 0x5d, 0x2d, 0x3d, 0xbd, 0x5b, 0x99, 0x78, 0xbc, 0xb5, 0x39, 0x5c, 0x3e,
+ 0xee, 0x74, 0xd5, 0x3d, 0x02, 0x99, 0x1d, 0x3e, 0xb9, 0x77, 0x61, 0x3e,
+ 0xde, 0x22, 0x78, 0x3d, 0xfc, 0xd2, 0x00, 0xbc, 0xd4, 0x3a, 0x28, 0x3e,
+ 0xbf, 0xb1, 0x1d, 0x3d, 0x13, 0x76, 0xa7, 0xbc, 0x84, 0xd7, 0xec, 0xbd,
+ 0x4a, 0x81, 0x6c, 0xbe, 0x2b, 0x64, 0x05, 0x3d, 0x55, 0xda, 0x13, 0x3c,
+ 0x6b, 0x2a, 0x99, 0xbd, 0xcb, 0xe2, 0xb8, 0xbb, 0xab, 0x6d, 0x0f, 0x3d,
+ 0x78, 0x25, 0xf4, 0x3c, 0xa6, 0xdb, 0xe6, 0xbd, 0xb7, 0x7d, 0xf8, 0x3d,
+ 0x84, 0x76, 0x65, 0x3e, 0xeb, 0x37, 0x40, 0x3d, 0x31, 0x9e, 0x0e, 0xbc,
+ 0x77, 0x7c, 0x4a, 0xbe, 0xa1, 0x81, 0xe5, 0x3d, 0xa5, 0xbc, 0x24, 0xbe,
+ 0x5b, 0x1b, 0x01, 0xbe, 0x88, 0xa3, 0xb5, 0x3c, 0x51, 0xb5, 0x61, 0xbe,
+ 0x0e, 0x9b, 0x6a, 0xbe, 0xfe, 0xdf, 0x14, 0xbe, 0x0e, 0x3e, 0x9f, 0x3e,
+ 0x2e, 0x12, 0x16, 0xbd, 0xd7, 0x38, 0x7f, 0xbd, 0x30, 0x43, 0x98, 0xbd,
+ 0xc8, 0x02, 0x2b, 0xbc, 0x72, 0x2a, 0x82, 0xbd, 0xa0, 0x3a, 0xfb, 0xbd,
+ 0x25, 0xd3, 0x07, 0x3e, 0xad, 0xc4, 0xae, 0x3d, 0xca, 0x57, 0x6c, 0xbe,
+ 0xce, 0xab, 0x8c, 0xbe, 0x1c, 0x2c, 0x11, 0x3e, 0x8d, 0xd6, 0x77, 0x3e,
+ 0xd9, 0xb7, 0x67, 0x3e, 0xd4, 0x62, 0x0a, 0xbe, 0x36, 0x36, 0x16, 0x3e,
+ 0x9a, 0x90, 0x92, 0xbd, 0x1d, 0xdc, 0x99, 0xbe, 0x0d, 0xad, 0x10, 0xbe,
+ 0x9d, 0xcf, 0xc3, 0x3d, 0x7b, 0xec, 0x2a, 0xbe, 0xea, 0x92, 0xdb, 0xbd,
+ 0xad, 0x8e, 0x78, 0xbd, 0xe0, 0xde, 0x28, 0xbd, 0xed, 0x81, 0xc6, 0xbd,
+ 0x76, 0xca, 0x0a, 0x3e, 0xb3, 0xf7, 0xb1, 0x3c, 0x62, 0x99, 0x02, 0xbe,
+ 0x9e, 0xfa, 0xf1, 0x3d, 0xcf, 0xf8, 0x34, 0xbe, 0xc1, 0x29, 0xf2, 0x3d,
+ 0x59, 0xf0, 0xb6, 0xbd, 0x32, 0x77, 0x95, 0xbd, 0x03, 0x9a, 0x91, 0x3d,
+ 0x3f, 0x3b, 0xb4, 0xbd, 0xb7, 0x03, 0x99, 0xbd, 0x8d, 0x81, 0x41, 0xbd,
+ 0xb4, 0xd6, 0x45, 0x3e, 0xf9, 0x5e, 0x1e, 0x3e, 0xe2, 0xe2, 0xfd, 0xbd,
+ 0x7a, 0x4f, 0x4c, 0xbe, 0xff, 0x5c, 0xff, 0xbd, 0x43, 0x58, 0x1d, 0x3e,
+ 0x45, 0x9f, 0x89, 0x3c, 0x69, 0xc5, 0x92, 0x3d, 0x01, 0xa7, 0x93, 0x3d,
+ 0xdb, 0x29, 0x8e, 0x3d, 0xfd, 0x95, 0x84, 0x3e, 0x4b, 0x37, 0x11, 0x3d,
+ 0x85, 0xe6, 0x88, 0x3d, 0xac, 0x53, 0xa4, 0xbd, 0x88, 0x12, 0xe2, 0xbd,
+ 0x02, 0x3d, 0x1e, 0xbd, 0xf7, 0xf7, 0x2b, 0xbe, 0x16, 0x6a, 0x01, 0xbe,
+ 0x96, 0xe4, 0x9e, 0x3d, 0xb0, 0x0f, 0x49, 0xbe, 0x7b, 0x51, 0xd3, 0xbd,
+ 0xd9, 0xd7, 0x75, 0xbe, 0xe8, 0xf6, 0xa0, 0x3d, 0x6c, 0x4d, 0x74, 0xbd,
+ 0x05, 0xbd, 0xe3, 0xbd, 0x0b, 0x95, 0x28, 0x3e, 0x91, 0x47, 0x50, 0xbe,
+ 0xab, 0x2c, 0x80, 0x3e, 0x81, 0x15, 0xdf, 0x3d, 0x04, 0x8f, 0x13, 0x3e,
+ 0xbc, 0x8d, 0xa5, 0x3e, 0xe1, 0x4f, 0x81, 0xbe, 0x68, 0xed, 0x6f, 0xbd,
+ 0x47, 0xc0, 0x1c, 0xbc, 0x49, 0x8c, 0x9c, 0x3d, 0x9f, 0xdd, 0x6e, 0x3d,
+ 0xcb, 0xb9, 0xb0, 0xbd, 0x75, 0x31, 0xe1, 0xbb, 0x62, 0x77, 0x0a, 0xbe,
+ 0x9c, 0x7e, 0xc6, 0xbd, 0x9d, 0x7b, 0x4a, 0x3e, 0x94, 0x7f, 0xfb, 0xbd,
+ 0xa7, 0xec, 0x36, 0xbd, 0x1b, 0xaf, 0x5b, 0x3e, 0xd9, 0x35, 0x69, 0xbd,
+ 0x90, 0x56, 0x54, 0xbe, 0xb5, 0x87, 0x01, 0x3e, 0x3f, 0x59, 0xdc, 0xbd,
+ 0xe3, 0xee, 0x0d, 0xbe, 0xae, 0xdf, 0xd8, 0x3d, 0x5e, 0x24, 0x98, 0xbd,
+ 0x12, 0x4f, 0xf4, 0xbd, 0xc3, 0xab, 0xf1, 0xbd, 0xf9, 0x2c, 0x57, 0x3d,
+ 0xec, 0x91, 0x11, 0x3b, 0x40, 0xe9, 0x38, 0x3d, 0x99, 0x84, 0x2e, 0x3e,
+ 0x72, 0xde, 0x84, 0xbc, 0x13, 0x9b, 0xa5, 0xbc, 0x5a, 0x80, 0x83, 0x3d,
+ 0x2f, 0x9e, 0x56, 0x3d, 0x78, 0x38, 0x5e, 0xbd, 0x10, 0x50, 0x09, 0xbe,
+ 0x86, 0xcc, 0x17, 0xbe, 0x02, 0x2d, 0x35, 0xbd, 0x14, 0x7f, 0xa6, 0x3d,
+ 0x15, 0xcf, 0x78, 0xbc, 0x15, 0x86, 0x12, 0xbe, 0x51, 0x6e, 0xd3, 0xbd,
+ 0x38, 0x7b, 0x0e, 0xbe, 0x51, 0x4e, 0x57, 0x3e, 0x09, 0xe3, 0x2a, 0x3d,
+ 0x34, 0x3e, 0x1b, 0xbc, 0x44, 0xc1, 0xdf, 0x3d, 0xbd, 0x9b, 0x89, 0x3d,
+ 0x7c, 0x4c, 0xd7, 0x3d, 0xff, 0x40, 0x10, 0xbe, 0x9c, 0x8a, 0x36, 0x3e,
+ 0x01, 0xf1, 0xdb, 0x3d, 0xe8, 0xbf, 0x19, 0xbe, 0x17, 0x9f, 0xba, 0xbc,
+ 0x0f, 0x31, 0xb6, 0x3d, 0xc0, 0xe1, 0xd9, 0x3d, 0x5f, 0x4c, 0x0b, 0xbc,
+ 0xfd, 0xee, 0x82, 0x3d, 0x3e, 0x6e, 0xc0, 0xbd, 0x49, 0x49, 0x24, 0x3c,
+ 0x83, 0xe0, 0x8c, 0x3d, 0x74, 0xe9, 0xb5, 0xbc, 0xde, 0x1c, 0xb2, 0x3d,
+ 0x1c, 0xee, 0x54, 0xbc, 0x4d, 0x16, 0xf1, 0x3d, 0x0e, 0x49, 0x94, 0xbd,
+ 0xbe, 0xc0, 0x0d, 0xbe, 0x71, 0xec, 0xe6, 0x3d, 0xdf, 0x12, 0x8b, 0x3d,
+ 0x36, 0x83, 0x40, 0x3b, 0xf6, 0x64, 0xb0, 0x3d, 0x02, 0x7a, 0xd3, 0x3d,
+ 0x3d, 0x27, 0x02, 0x3e, 0x21, 0x67, 0x48, 0xbd, 0x48, 0xbd, 0x99, 0xbd,
+ 0x13, 0x8d, 0x0e, 0xbe, 0x4e, 0x9a, 0x50, 0x3e, 0x6f, 0x2f, 0x90, 0x3d,
+ 0x2f, 0xa5, 0x3d, 0x3c, 0x9b, 0x66, 0xdb, 0xbd, 0x1d, 0x68, 0xd8, 0x3d,
+ 0xa9, 0x27, 0x6f, 0xbe, 0x0c, 0x28, 0x10, 0x3b, 0xe8, 0x18, 0x3f, 0xbc,
+ 0xce, 0x6f, 0x4c, 0x3e, 0x54, 0x8b, 0x18, 0xbd, 0x51, 0x90, 0x32, 0x3e,
+ 0xca, 0xa1, 0x50, 0xbd, 0xf8, 0x21, 0xbf, 0x3d, 0x30, 0xc0, 0x28, 0x3c,
+ 0x18, 0xcc, 0x73, 0x3c, 0x18, 0x38, 0x08, 0x3a, 0xd0, 0xdf, 0xf9, 0xbc,
+ 0xa7, 0xc5, 0x2a, 0xbd, 0xd7, 0x4c, 0x58, 0x3d, 0xb9, 0xc1, 0xaf, 0x3d,
+ 0x6f, 0x9d, 0x2b, 0x3d, 0x3b, 0x47, 0xdb, 0x3c, 0xfc, 0xbd, 0x92, 0xbd,
+ 0xca, 0xd7, 0xcc, 0x3d, 0x9b, 0x87, 0x49, 0xbd, 0xde, 0x30, 0x63, 0xbe,
+ 0x52, 0x39, 0x5f, 0xbe, 0x48, 0x50, 0xe6, 0xbd, 0x9e, 0xbf, 0x5a, 0x3e,
+ 0x74, 0x0e, 0xae, 0x3d, 0xfe, 0x49, 0xba, 0xbd, 0x46, 0xde, 0x71, 0x3d,
+ 0x73, 0x1a, 0x80, 0x3d, 0xce, 0x6d, 0x30, 0x3c, 0x56, 0x1c, 0x63, 0xbd,
+ 0x7c, 0x38, 0x7d, 0x3d, 0x7e, 0xe8, 0x8f, 0xbe, 0x51, 0xba, 0x78, 0x3b,
+ 0xec, 0xb8, 0xa5, 0xbd, 0xf2, 0x81, 0x24, 0xbe, 0x22, 0x36, 0x31, 0xbd,
+ 0x48, 0x78, 0x12, 0xbe, 0xb4, 0x59, 0x0f, 0x3b, 0x04, 0x61, 0xbf, 0xbd,
+ 0xc8, 0x16, 0x46, 0xbe, 0xa0, 0x1c, 0x05, 0x3e, 0x2a, 0xdb, 0x99, 0x3c,
+ 0x1f, 0x59, 0x5e, 0xbd, 0x4d, 0x6d, 0x22, 0x3d, 0x55, 0xc1, 0x13, 0xbe,
+ 0xaa, 0xb2, 0xc8, 0x3d, 0x5e, 0x0d, 0x13, 0xbe, 0x18, 0xed, 0x22, 0x3e,
+ 0x90, 0x82, 0x7a, 0xbd, 0xc6, 0xd4, 0x09, 0xbe, 0xf5, 0xb5, 0x07, 0x3d,
+ 0xae, 0xc3, 0x8c, 0xbd, 0xd6, 0xc5, 0x34, 0x3e, 0x61, 0xd8, 0x05, 0x3e,
+ 0x4b, 0x92, 0x36, 0x3e, 0xb7, 0xe2, 0x29, 0x3e, 0x8d, 0x9a, 0xf6, 0xbd,
+ 0xde, 0x8f, 0x92, 0xbd, 0xb1, 0x67, 0x36, 0x3e, 0xb3, 0x09, 0x05, 0xbd,
+ 0xb4, 0x3d, 0x9a, 0xbd, 0x09, 0xd5, 0xae, 0x3d, 0x46, 0x11, 0x0d, 0xbe,
+ 0xbd, 0x95, 0xe8, 0xbd, 0xd4, 0x23, 0x08, 0x3d, 0xb4, 0x5e, 0xb4, 0x3d,
+ 0xd8, 0x72, 0xbb, 0xbd, 0xa4, 0xe0, 0xfa, 0xbd, 0x23, 0xba, 0x21, 0xba,
+ 0xd6, 0x76, 0x7a, 0x3d, 0x9b, 0x2f, 0xfd, 0xbd, 0xee, 0x80, 0x8f, 0x3c,
+ 0xce, 0x42, 0x11, 0xbe, 0x98, 0xb8, 0x91, 0x3d, 0x0f, 0x98, 0x07, 0xbe,
+ 0x1c, 0x8d, 0x4a, 0xbe, 0x94, 0x1b, 0x32, 0x3d, 0xdd, 0x77, 0xa8, 0x3d,
+ 0xb4, 0xa8, 0xa6, 0xbd, 0x93, 0x44, 0x10, 0x3e, 0xbc, 0x4a, 0x02, 0x3a,
+ 0xc4, 0x65, 0xda, 0xbd, 0x3a, 0x2b, 0xe4, 0xbd, 0x28, 0xed, 0xef, 0xbc,
+ 0x56, 0x9c, 0xa6, 0x3d, 0x73, 0x99, 0x14, 0xbe, 0x96, 0x95, 0x6e, 0x3e,
+ 0x71, 0x01, 0xc2, 0x3d, 0x7a, 0xda, 0xf7, 0x3b, 0xdd, 0x99, 0xc3, 0x3d,
+ 0x42, 0xd7, 0x3d, 0xbd, 0x2e, 0xa4, 0x0e, 0x3e, 0x5a, 0xc1, 0x08, 0x3d,
+ 0x58, 0x64, 0x24, 0xbe, 0xac, 0xe7, 0x87, 0x3c, 0x6c, 0x5b, 0xc2, 0x3c,
+ 0x0f, 0x73, 0xa7, 0x3d, 0x0f, 0x94, 0xd8, 0x3d, 0x37, 0x23, 0x03, 0xbe,
+ 0xbc, 0x74, 0xc8, 0x3d, 0x0b, 0xbb, 0x91, 0xbd, 0xec, 0x67, 0x70, 0xba,
+ 0xc3, 0x0a, 0x98, 0xbd, 0xc5, 0xcd, 0x04, 0x3e, 0x0d, 0xe8, 0x2b, 0xbc,
+ 0x10, 0x6a, 0xcc, 0x3c, 0x06, 0x22, 0x93, 0x3d, 0x56, 0x57, 0x88, 0x3d,
+ 0x12, 0x98, 0x6b, 0x3e, 0x6c, 0x48, 0x20, 0xbe, 0x2d, 0xfa, 0xe1, 0xbc,
+ 0x5d, 0x98, 0x1c, 0xbe, 0x86, 0xa4, 0x14, 0x3e, 0xc4, 0x2d, 0x46, 0x3d,
+ 0x05, 0xf9, 0xd8, 0x3d, 0xf6, 0x65, 0x66, 0xbd, 0x1b, 0xec, 0x9b, 0x3d,
+ 0x20, 0x6d, 0x3b, 0xbd, 0x75, 0xfa, 0x7f, 0x3d, 0x7c, 0x21, 0x23, 0xbc,
+ 0xf5, 0xf9, 0x05, 0x3e, 0xff, 0xc2, 0x83, 0xbd, 0x8b, 0x3f, 0x03, 0x3e,
+ 0x99, 0xec, 0x0f, 0x3e, 0x80, 0xd7, 0xa2, 0xbd, 0x4c, 0x3d, 0xf0, 0xbd,
+ 0x02, 0x80, 0xb5, 0xbd, 0x20, 0x32, 0x15, 0x3e, 0x66, 0xd5, 0x0a, 0x3c,
+ 0x44, 0x9b, 0xbf, 0x3d, 0x93, 0x94, 0xd9, 0x3d, 0x33, 0xd8, 0xef, 0x3d,
+ 0x28, 0xf9, 0x03, 0xbd, 0x62, 0xe2, 0x8e, 0x3d, 0x3a, 0xd3, 0x06, 0xbd,
+ 0xe0, 0x98, 0x09, 0x3e, 0x65, 0x7d, 0x05, 0xbe, 0x9e, 0x79, 0x84, 0xbe,
+ 0x3c, 0x48, 0x67, 0xbe, 0xa8, 0xf3, 0x98, 0x3d, 0xce, 0x20, 0x53, 0x3e,
+ 0x04, 0x6c, 0x17, 0x3e, 0x19, 0x0a, 0xbc, 0xbb, 0x2a, 0x2a, 0x6d, 0x3c,
+ 0xc5, 0xd9, 0x8a, 0x3e, 0xca, 0xcc, 0x89, 0x3d, 0x31, 0x94, 0x15, 0xbe,
+ 0x62, 0xae, 0x6c, 0x3e, 0x9c, 0x68, 0xbd, 0xbe, 0xf8, 0xb6, 0xf5, 0xbd,
+ 0x43, 0xc6, 0x02, 0x3e, 0xe7, 0xe2, 0xf8, 0x3c, 0xec, 0xa2, 0xb3, 0x3d,
+ 0xba, 0x2d, 0x23, 0xbe, 0x5c, 0x07, 0xe9, 0xbd, 0x0c, 0xd7, 0xc2, 0xbd,
+ 0x3e, 0x2f, 0x59, 0xbe, 0xe4, 0x1c, 0x0d, 0xbd, 0x51, 0x0b, 0xba, 0x3c,
+ 0x49, 0xf2, 0xec, 0x3d, 0x3e, 0x57, 0xae, 0x3d, 0xf4, 0xe8, 0xb4, 0xbe,
+ 0xe6, 0xbe, 0xd7, 0x3d, 0x1e, 0x3e, 0x18, 0xbe, 0x9e, 0x65, 0xcd, 0xbc,
+ 0x9d, 0x1d, 0xa7, 0xbd, 0x67, 0xa2, 0xbc, 0xbd, 0x6c, 0x82, 0xe2, 0xbd,
+ 0xc5, 0xb7, 0x05, 0xbe, 0x92, 0x82, 0xa0, 0xbd, 0xdc, 0xe3, 0x8f, 0xba,
+ 0x6c, 0xc0, 0x95, 0xbd, 0x79, 0x9a, 0x2e, 0x3e, 0xbe, 0xb9, 0x99, 0xbd,
+ 0x1f, 0x49, 0xf7, 0x3e, 0x6d, 0x22, 0xc1, 0x3e, 0xc1, 0xc5, 0x75, 0xbd,
+ 0x8b, 0xa3, 0x39, 0xbf, 0xa3, 0xd4, 0xcb, 0xbe, 0x13, 0xfa, 0x93, 0xbd,
+ 0xf1, 0xe0, 0x02, 0xbe, 0xc5, 0xef, 0xb6, 0xbe, 0x19, 0xd9, 0xc4, 0x3e,
+ 0x7b, 0xff, 0x6e, 0xbd, 0x0e, 0xea, 0x4a, 0xbe, 0xab, 0x5d, 0x32, 0x3d,
+ 0xa0, 0x29, 0x6a, 0x3e, 0xa7, 0x20, 0x2e, 0xbe, 0xa3, 0x40, 0x13, 0xbe,
+ 0x11, 0x42, 0x90, 0x3e, 0xad, 0x24, 0xba, 0xbd, 0x96, 0x32, 0xe3, 0x3d,
+ 0xcd, 0xfd, 0x0e, 0xbe, 0x20, 0x6c, 0xa6, 0xbc, 0x6f, 0xb2, 0xe1, 0xbe,
+ 0xe9, 0xf7, 0xa8, 0x3e, 0x9e, 0x74, 0x72, 0x3d, 0xb6, 0x1f, 0xc0, 0xbd,
+ 0xfd, 0x8e, 0x89, 0xbd, 0xf7, 0xb1, 0xb3, 0xbd, 0x6f, 0x0d, 0xc7, 0xbe,
+ 0xe5, 0xfa, 0x19, 0xbf, 0xa0, 0xf2, 0xb6, 0x3e, 0x57, 0xa5, 0x8f, 0x3e,
+ 0xba, 0xcb, 0x3c, 0x3d, 0xe4, 0xd2, 0xa2, 0xbd, 0xac, 0xe6, 0x29, 0xbf,
+ 0xea, 0x57, 0xa4, 0xbc, 0xa1, 0x87, 0x94, 0x3c, 0xbb, 0x4a, 0x8e, 0xbd,
+ 0x3c, 0xc8, 0x11, 0x3e, 0xf9, 0xe7, 0x81, 0x3d, 0xeb, 0xd4, 0x2e, 0xbc,
+ 0x25, 0xcb, 0x47, 0x3e, 0xa5, 0x7d, 0xe2, 0x3d, 0xa6, 0x32, 0x86, 0x3e,
+ 0xad, 0xb5, 0x50, 0xbe, 0x3f, 0x57, 0xc5, 0xbd, 0xb6, 0xa3, 0x02, 0x3f,
+ 0x76, 0xf5, 0xb0, 0xbe, 0xec, 0x09, 0xce, 0x3e, 0xf0, 0xb2, 0xbb, 0x3d,
+ 0xd4, 0xc1, 0x0a, 0x3e, 0x2c, 0x4f, 0x65, 0x3d, 0xfc, 0x1c, 0x48, 0x3d,
+ 0xfe, 0xab, 0x97, 0x3e, 0x47, 0x9a, 0x86, 0xbe, 0x70, 0x03, 0x80, 0xbe,
+ 0xba, 0xa8, 0xb0, 0xbd, 0xbb, 0x54, 0x28, 0x3d, 0x52, 0xff, 0x79, 0xbc,
+ 0x15, 0xd7, 0x57, 0xbe, 0xb6, 0xaa, 0xf5, 0x3d, 0x12, 0xd8, 0x12, 0x3e,
+ 0x79, 0xde, 0x7e, 0x3d, 0xd6, 0xa9, 0xbd, 0xbd, 0x0a, 0x99, 0xa0, 0x3e,
+ 0xd2, 0x87, 0x9a, 0x3e, 0x5d, 0xe1, 0x5a, 0x3b, 0x2c, 0x11, 0xbe, 0x3e,
+ 0x81, 0x08, 0xc2, 0xbd, 0x9c, 0x15, 0xc4, 0x3e, 0x27, 0xdb, 0x8f, 0x3e,
+ 0x56, 0x0d, 0x2d, 0xbe, 0x82, 0x90, 0xa4, 0xbd, 0xd6, 0xa2, 0xdb, 0x3e,
+ 0x76, 0x77, 0x02, 0xbf, 0xaf, 0x45, 0x01, 0xbe, 0x72, 0x0b, 0xda, 0x3d,
+ 0x91, 0x45, 0x04, 0x3f, 0xc3, 0xe8, 0x2f, 0x3d, 0x30, 0x96, 0x8e, 0x3e,
+ 0xc0, 0x31, 0x87, 0xbe, 0xdc, 0x08, 0xd8, 0xbe, 0xb5, 0x11, 0xd1, 0x3e,
+ 0x3a, 0xb0, 0x05, 0xbe, 0xf4, 0x7e, 0xd2, 0x3d, 0xfe, 0x48, 0x67, 0x3e,
+ 0x2e, 0xfe, 0xa0, 0x3d, 0x8b, 0x52, 0xf4, 0x3d, 0xe3, 0x7b, 0x30, 0x3e,
+ 0xad, 0x75, 0xca, 0xbe, 0x91, 0x17, 0x00, 0xbd, 0xe5, 0x4b, 0xa5, 0x3d,
+ 0xe2, 0x06, 0xf2, 0xbd, 0x14, 0x8c, 0xc0, 0xbd, 0x20, 0xb3, 0x0c, 0xbe,
+ 0x12, 0x8e, 0xc4, 0xbc, 0x8f, 0xf9, 0xae, 0xbe, 0x02, 0x51, 0xdc, 0xbd,
+ 0x2a, 0xe4, 0x32, 0x3f, 0x45, 0xf5, 0x61, 0x3e, 0x22, 0xfc, 0x07, 0xbf,
+ 0xf6, 0x90, 0x05, 0xbd, 0x89, 0xa5, 0x1e, 0xbe, 0xb7, 0x08, 0x63, 0xbf,
+ 0x62, 0x06, 0xeb, 0x3d, 0x67, 0x51, 0xbc, 0xbd, 0xd0, 0xdb, 0x39, 0xbe,
+ 0x35, 0x7e, 0x87, 0x3e, 0x73, 0x00, 0xc3, 0xbd, 0xa7, 0xc4, 0x3e, 0xbe,
+ 0xc0, 0xdd, 0xea, 0x3a, 0x70, 0x4d, 0x31, 0xbe, 0x75, 0x88, 0xa6, 0x3e,
+ 0x2b, 0x20, 0x0b, 0xbd, 0x18, 0x32, 0x57, 0x3d, 0x23, 0x23, 0x85, 0x3e,
+ 0xe2, 0xf2, 0xb0, 0x3e, 0x08, 0xa3, 0xa8, 0x3e, 0x9b, 0x7d, 0x5c, 0x3c,
+ 0x94, 0xb8, 0x08, 0xbe, 0x21, 0xa5, 0x2d, 0xbd, 0x61, 0xf3, 0xaa, 0xbd,
+ 0x6f, 0x85, 0xab, 0x3d, 0x36, 0x4a, 0xa3, 0xbc, 0xe6, 0x4b, 0xb8, 0xbc,
+ 0x7e, 0xaf, 0x2f, 0xbd, 0x04, 0xc3, 0x24, 0xbc, 0xc1, 0x7e, 0x46, 0xbd,
+ 0xbe, 0xd6, 0xc8, 0x3d, 0x2d, 0x46, 0x10, 0x3e, 0x2f, 0x43, 0x17, 0xbe,
+ 0x8c, 0xab, 0x81, 0x3d, 0x89, 0xf5, 0x07, 0xbe, 0x92, 0x4a, 0x0d, 0x3b,
+ 0xc2, 0x66, 0x94, 0xbd, 0xf5, 0xf3, 0x98, 0xbd, 0x44, 0x74, 0xc2, 0xbd,
+ 0x44, 0x4a, 0xd8, 0x3d, 0x20, 0xea, 0xc7, 0xbd, 0x77, 0x0e, 0x0a, 0xbe,
+ 0xe3, 0x4c, 0xb3, 0x3c, 0xe7, 0xe8, 0xe0, 0xbd, 0x46, 0xbe, 0x0b, 0xbe,
+ 0x08, 0xd9, 0x42, 0xbe, 0xd6, 0x9c, 0xc2, 0xbd, 0x9b, 0x29, 0xab, 0x3d,
+ 0x55, 0x60, 0xf6, 0xbd, 0x07, 0x4c, 0xd4, 0x3d, 0x0d, 0x50, 0x33, 0x3e,
+ 0x8e, 0xef, 0x21, 0xbd, 0xf2, 0x52, 0x98, 0xbb, 0x16, 0xca, 0x9a, 0xbd,
+ 0x2f, 0x7a, 0x98, 0xbd, 0xfa, 0x5c, 0x1c, 0x3d, 0x79, 0xd7, 0xb8, 0xbd,
+ 0x69, 0x30, 0x20, 0xbd, 0x1b, 0xcc, 0x0c, 0x3c, 0x87, 0x15, 0x6e, 0x3d,
+ 0x07, 0xb8, 0xb0, 0xbc, 0x08, 0x2f, 0xdb, 0x3d, 0x55, 0x2c, 0x94, 0x3c,
+ 0x06, 0x6b, 0xd9, 0x3d, 0x55, 0x01, 0x00, 0xbe, 0x42, 0xf8, 0x19, 0x3d,
+ 0x0b, 0xf7, 0x7d, 0x3d, 0x7c, 0x6c, 0x67, 0x3d, 0xc8, 0xe3, 0x09, 0xbe,
+ 0x91, 0x74, 0xa2, 0x3d, 0x32, 0xb5, 0xf3, 0x3d, 0xfc, 0x28, 0xed, 0x3c,
+ 0xef, 0x98, 0xcf, 0x3d, 0xfb, 0x81, 0x41, 0xbd, 0x94, 0xf6, 0xba, 0xbd,
+ 0x8b, 0x07, 0x10, 0xbc, 0x72, 0x65, 0x88, 0xbd, 0xd9, 0x64, 0xca, 0xbc,
+ 0x0d, 0x9c, 0x98, 0xbd, 0x50, 0x5e, 0x0f, 0x3d, 0x5d, 0xa0, 0xe0, 0xbd,
+ 0x1b, 0xb3, 0xda, 0x3d, 0x81, 0x60, 0x08, 0xbe, 0xba, 0x3d, 0x06, 0xbe,
+ 0xa9, 0x17, 0x8a, 0xbd, 0x24, 0x9a, 0x47, 0xbd, 0x8d, 0x4a, 0x07, 0x3d,
+ 0xe9, 0x71, 0x6d, 0xbd, 0xa4, 0x8b, 0xe5, 0x3a, 0x35, 0x34, 0x77, 0xbc,
+ 0x06, 0xec, 0x14, 0xbe, 0x47, 0x2a, 0xff, 0x3c, 0xf3, 0xa0, 0xc7, 0xbd,
+ 0x28, 0xb2, 0xaf, 0x3d, 0xb5, 0x1f, 0x8c, 0x3b, 0x12, 0x05, 0x9a, 0x3d,
+ 0x59, 0x98, 0x82, 0x3d, 0x6c, 0x70, 0xb3, 0xba, 0x62, 0x48, 0xa7, 0xbd,
+ 0x59, 0x1d, 0xef, 0x3d, 0x5b, 0x48, 0x09, 0xbe, 0xc3, 0x70, 0xfc, 0xbd,
+ 0x7d, 0xc8, 0x2f, 0x3d, 0xe6, 0x55, 0x8b, 0xbd, 0x13, 0x83, 0x0e, 0xbe,
+ 0x9d, 0xe0, 0xac, 0xbd, 0x65, 0xdb, 0x45, 0x3d, 0x9e, 0x47, 0xe5, 0x3d,
+ 0x84, 0xe5, 0x2a, 0xbd, 0x1f, 0x53, 0x7e, 0xbc, 0x93, 0x6b, 0xd8, 0x3d,
+ 0xbf, 0xda, 0xec, 0xbc, 0x5a, 0xe3, 0x95, 0xbd, 0x5e, 0x41, 0xb3, 0x3d,
+ 0x18, 0x74, 0xc6, 0x3d, 0x96, 0x9f, 0x62, 0x3c, 0xea, 0x50, 0x63, 0xbd,
+ 0x15, 0x87, 0x02, 0xbd, 0xb6, 0x15, 0x4c, 0xbd, 0x9c, 0xa8, 0x63, 0x3d,
+ 0x55, 0x0c, 0xdf, 0x3d, 0xa3, 0x8c, 0xe4, 0xbd, 0x1d, 0x6c, 0xbb, 0x3d,
+ 0x50, 0x62, 0x55, 0xbd, 0x2e, 0xac, 0x40, 0xbe, 0xa0, 0x7f, 0x4a, 0xbd,
+ 0x0e, 0x39, 0xab, 0xbd, 0x1e, 0x1f, 0x15, 0xbe, 0x80, 0x89, 0x43, 0x3d,
+ 0x16, 0x78, 0x4c, 0xbd, 0x3a, 0x12, 0xc6, 0x3d, 0xfd, 0x59, 0xc3, 0x3d,
+ 0xfa, 0x66, 0xac, 0x3d, 0x33, 0xe5, 0xf9, 0x3c, 0x35, 0x75, 0xcc, 0x3d,
+ 0x8a, 0x0e, 0x93, 0x3d, 0x93, 0x30, 0x68, 0xbd, 0xda, 0xff, 0xec, 0x3d,
+ 0xf1, 0x57, 0xcc, 0xbd, 0x1b, 0x67, 0xf9, 0x3b, 0x39, 0x31, 0x8f, 0x3d,
+ 0xc3, 0x1c, 0x54, 0xbe, 0x76, 0x4c, 0xd0, 0x3d, 0x54, 0x50, 0x2a, 0xbc,
+ 0x72, 0xac, 0x33, 0xbd, 0xe5, 0x94, 0x3f, 0xbd, 0xdf, 0xfa, 0x13, 0xbe,
+ 0x62, 0x73, 0x17, 0x3e, 0x9b, 0xe9, 0x31, 0x3d, 0xaf, 0x8a, 0x86, 0xbd,
+ 0x8f, 0xe8, 0xb1, 0x3d, 0x1b, 0x77, 0x0a, 0x3e, 0xff, 0x83, 0x3b, 0xbe,
+ 0x44, 0x76, 0xc8, 0x3c, 0x13, 0x2e, 0xf5, 0xbd, 0xd0, 0xb0, 0x46, 0xbe,
+ 0x24, 0x6d, 0x65, 0xbe, 0xdd, 0xc1, 0xb2, 0x3e, 0x53, 0xb6, 0x82, 0x3e,
+ 0x6f, 0x02, 0x27, 0x3e, 0x71, 0xc6, 0x69, 0xbd, 0x87, 0x03, 0x04, 0x3d,
+ 0xbd, 0x4b, 0xce, 0xba, 0x99, 0x99, 0x39, 0x3d, 0x6d, 0x1b, 0x4e, 0xbc,
+ 0xab, 0x82, 0x9a, 0x3e, 0xca, 0xdc, 0xaf, 0x3d, 0x59, 0xbd, 0xc3, 0x3d,
+ 0x6c, 0xd9, 0xbb, 0xbb, 0x17, 0xd7, 0x27, 0xbe, 0x5d, 0x6a, 0x9d, 0x3e,
+ 0x93, 0xde, 0xc3, 0xbe, 0xd9, 0x44, 0xde, 0xbd, 0x42, 0xa1, 0x22, 0xbd,
+ 0x20, 0xf8, 0x1c, 0xbe, 0x0f, 0x23, 0x32, 0xbd, 0x80, 0xce, 0x93, 0x3d,
+ 0xae, 0xb0, 0x72, 0x3d, 0xeb, 0xc3, 0x93, 0xbe, 0x9c, 0xd9, 0x05, 0xbe,
+ 0xbf, 0x09, 0x31, 0xbd, 0x18, 0x9e, 0x04, 0x3d, 0x30, 0x4d, 0x16, 0x3e,
+ 0x6b, 0x48, 0xa5, 0x3d, 0x9b, 0xc2, 0xe4, 0xbd, 0xb2, 0xfc, 0x02, 0x3e,
+ 0xa8, 0xe4, 0x0e, 0xbd, 0x9a, 0xc2, 0xc4, 0xbd, 0x56, 0x35, 0xd2, 0xbd,
+ 0x8f, 0x52, 0x49, 0x3e, 0x18, 0x5c, 0x7a, 0x3e, 0xa0, 0x57, 0xe4, 0x3d,
+ 0x15, 0x31, 0xab, 0xbe, 0x35, 0x9d, 0xe6, 0x3b, 0xea, 0x7e, 0x9e, 0xbc,
+ 0x94, 0x48, 0xd8, 0x3c, 0x0c, 0xa3, 0x54, 0xbe, 0x86, 0x08, 0x65, 0xbd,
+ 0xc5, 0xac, 0x1d, 0xbe, 0x31, 0x09, 0x38, 0x3e, 0xae, 0x61, 0xfa, 0xbd,
+ 0x76, 0x58, 0x02, 0x3e, 0xb0, 0xeb, 0x43, 0xbe, 0x7c, 0x67, 0x9b, 0xbc,
+ 0x9d, 0x47, 0xb0, 0x3d, 0x67, 0x21, 0x6f, 0xbe, 0x60, 0x3f, 0x45, 0xbe,
+ 0x5e, 0x20, 0xd0, 0x3d, 0x8c, 0x47, 0x4f, 0x3e, 0x9b, 0xb0, 0x1e, 0xbe,
+ 0xa5, 0xa9, 0x7f, 0xbe, 0x27, 0xea, 0x4a, 0x3d, 0x55, 0xff, 0x66, 0x3e,
+ 0x6b, 0x0e, 0x7b, 0x3e, 0xec, 0x2a, 0x95, 0x3a, 0x11, 0x59, 0x02, 0x3e,
+ 0x8d, 0xff, 0xe5, 0x3c, 0x91, 0x1d, 0xda, 0xbc, 0xf4, 0x2c, 0xf2, 0xbd,
+ 0x99, 0x92, 0xf9, 0x3d, 0xc1, 0xd6, 0xb6, 0xbd, 0x66, 0xe7, 0x26, 0x3e,
+ 0x3c, 0xb1, 0xf9, 0x3d, 0x99, 0xb5, 0xa1, 0xbe, 0xe0, 0x70, 0x8b, 0xbe,
+ 0xb7, 0xa6, 0x4b, 0x3d, 0xf3, 0x27, 0xd8, 0xbc, 0x2c, 0x1d, 0xf1, 0xbd,
+ 0xc2, 0x78, 0xa9, 0xbe, 0x82, 0x45, 0x81, 0xbd, 0xe5, 0x94, 0x91, 0xbe,
+ 0xc6, 0xa6, 0xe7, 0xbd, 0x75, 0x34, 0xfa, 0x3d, 0x06, 0xab, 0x85, 0x3e,
+ 0xc9, 0xb7, 0x7e, 0x3d, 0x8b, 0xb8, 0x7f, 0x3d, 0xd2, 0xaa, 0xe2, 0x3d,
+ 0x92, 0x0f, 0x22, 0x3e, 0xa1, 0xa4, 0x15, 0xbe, 0xd3, 0x42, 0x1f, 0xbe,
+ 0x5d, 0x2f, 0x0c, 0x3e, 0xbb, 0xc0, 0xa2, 0x3b, 0xcd, 0xe5, 0xc1, 0x3d,
+ 0xb0, 0x00, 0x9b, 0x3d, 0x79, 0x9d, 0x86, 0x3d, 0x56, 0x48, 0x83, 0xbe,
+ 0x8e, 0x3b, 0xbc, 0x3d, 0x8e, 0x69, 0x24, 0x3c, 0x6c, 0x94, 0x07, 0x3e,
+ 0xc6, 0x98, 0x0f, 0x3e, 0x61, 0x50, 0x93, 0x3d, 0x01, 0xff, 0x5c, 0x3d,
+ 0x05, 0x05, 0x2d, 0x3e, 0x81, 0x99, 0xfb, 0x3d, 0x06, 0xfe, 0xc3, 0xbe,
+ 0x0a, 0x88, 0xc7, 0xbd, 0xe7, 0x88, 0x5e, 0x3e, 0x00, 0x9c, 0xca, 0x3c,
+ 0x94, 0xf9, 0x2e, 0xbe, 0xc0, 0xdb, 0xc5, 0x3c, 0x31, 0x63, 0xc5, 0xbd,
+ 0x78, 0x7d, 0x49, 0xbd, 0x87, 0xdd, 0xd5, 0xbd, 0x2c, 0xb9, 0xb7, 0x3d,
+ 0x10, 0x19, 0x09, 0xbd, 0x12, 0x00, 0xc2, 0xbd, 0x9b, 0xdd, 0x18, 0x3c,
+ 0x79, 0xcd, 0x85, 0xbd, 0xc1, 0x19, 0xf5, 0xbc, 0x47, 0x00, 0x3f, 0xbd,
+ 0x30, 0x25, 0x74, 0x3d, 0x7d, 0x1e, 0xd1, 0xbd, 0x4c, 0x6c, 0x0a, 0xbc,
+ 0x5e, 0x46, 0xd2, 0xbc, 0x9a, 0xea, 0x08, 0xbd, 0xdc, 0x7e, 0x37, 0xbd,
+ 0x40, 0x22, 0xae, 0x3d, 0x60, 0x74, 0x6f, 0x3d, 0x18, 0xec, 0x92, 0x3d,
+ 0x32, 0xbc, 0x9b, 0x3d, 0xbe, 0xbf, 0x82, 0xbc, 0x8f, 0xff, 0x05, 0xbe,
+ 0xa5, 0x8b, 0xfd, 0x39, 0xd2, 0x13, 0x92, 0x3d, 0xf5, 0x6a, 0x70, 0x3e,
+ 0x27, 0x87, 0xda, 0xbc, 0x69, 0xd5, 0xf7, 0x3c, 0x98, 0x4d, 0x21, 0x3c,
+ 0x57, 0xba, 0x11, 0x3e, 0xb7, 0x85, 0x40, 0xbd, 0x6f, 0x83, 0x0b, 0xbe,
+ 0x24, 0xce, 0x47, 0xbe, 0x27, 0x7f, 0xa8, 0x3b, 0x0d, 0x31, 0x01, 0xbe,
+ 0xe4, 0x42, 0x39, 0xbd, 0xf7, 0xcf, 0x35, 0x3d, 0xa5, 0x9b, 0x97, 0x3d,
+ 0xbb, 0x3a, 0x26, 0x3e, 0xec, 0x7a, 0xac, 0xbd, 0x93, 0x38, 0x33, 0x3d,
+ 0x36, 0xe5, 0x33, 0xbe, 0x10, 0x0c, 0x8b, 0x3d, 0x70, 0x46, 0x5e, 0x3d,
+ 0x42, 0x70, 0xcc, 0xbd, 0x05, 0x3e, 0xa5, 0xbd, 0x10, 0x0e, 0xa4, 0x3d,
+ 0xa1, 0xf0, 0x05, 0x3e, 0xc3, 0xfe, 0xa6, 0x3c, 0xca, 0x28, 0x09, 0xbd,
+ 0x01, 0x8a, 0xa7, 0xbd, 0x18, 0x2a, 0xf7, 0x3c, 0x47, 0xa7, 0xac, 0x3d,
+ 0x06, 0x47, 0xa5, 0xbd, 0x63, 0xf4, 0x70, 0xbd, 0xf7, 0x4d, 0x86, 0xbd,
+ 0x12, 0xb5, 0x5c, 0x3d, 0xce, 0x01, 0x8b, 0x3d, 0x05, 0xd7, 0x36, 0x3e,
+ 0xb2, 0x0b, 0x0d, 0x3e, 0xa0, 0xf9, 0x20, 0xbe, 0xfa, 0xb6, 0x61, 0x3e,
+ 0xda, 0x39, 0x0c, 0x3e, 0xa0, 0xca, 0xff, 0x3d, 0xd9, 0xca, 0x17, 0x3c,
+ 0xde, 0xa6, 0x56, 0xbd, 0x39, 0x80, 0x2a, 0xbd, 0xef, 0xae, 0x99, 0xbd,
+ 0xc7, 0x40, 0xaf, 0x3d, 0x9b, 0xfb, 0x04, 0xbd, 0xef, 0xa4, 0xbf, 0xbc,
+ 0xfe, 0x49, 0xc5, 0xbb, 0xf7, 0x82, 0x65, 0xbd, 0x39, 0x06, 0xde, 0x3d,
+ 0xfb, 0x1e, 0x2f, 0x3e, 0xcc, 0x14, 0x0d, 0x3d, 0x65, 0xe9, 0x9d, 0x3c,
+ 0x8e, 0xd1, 0x04, 0x3d, 0x98, 0xd6, 0xb0, 0xbd, 0xe9, 0x9b, 0x32, 0x3e,
+ 0xf7, 0x68, 0x42, 0x3d, 0xec, 0xdd, 0x79, 0x3d, 0x0c, 0xb1, 0x50, 0x3e,
+ 0x1c, 0x9c, 0x40, 0x3e, 0x0a, 0x66, 0xfd, 0x3c, 0x8a, 0x25, 0xd4, 0xbd,
+ 0x77, 0x05, 0x70, 0x3e, 0x8d, 0xe9, 0x6f, 0xbe, 0xae, 0x06, 0xa0, 0x3c,
+ 0x81, 0xbb, 0xc5, 0x3c, 0x55, 0x42, 0xb2, 0x3d, 0xdb, 0xb9, 0x67, 0x3d,
+ 0xe8, 0x28, 0xad, 0x3c, 0x86, 0x0f, 0xc3, 0xbd, 0x22, 0xd4, 0xb4, 0xbd,
+ 0x63, 0xda, 0x1d, 0xbe, 0x83, 0xc1, 0x9e, 0xbd, 0x2d, 0x10, 0x72, 0xbc,
+ 0xdb, 0x18, 0xb0, 0x3d, 0xf5, 0xcf, 0x1a, 0xbe, 0x01, 0xba, 0x31, 0xbe,
+ 0xba, 0xce, 0x85, 0x3d, 0x31, 0x24, 0x9e, 0x3d, 0x8b, 0x6c, 0xa9, 0x3d,
+ 0xee, 0xbf, 0xd3, 0x3c, 0xcd, 0x18, 0x17, 0xbe, 0x92, 0x37, 0x06, 0xbe,
+ 0x67, 0xcb, 0x7c, 0xbe, 0x1e, 0xa1, 0xc2, 0x3b, 0x7c, 0xa5, 0xac, 0x3c,
+ 0x69, 0x6d, 0xc2, 0xbc, 0xfc, 0x5a, 0x15, 0x3d, 0xd2, 0x0e, 0x6d, 0xbd,
+ 0xfc, 0x7f, 0xec, 0x3d, 0xa5, 0x24, 0x34, 0x3d, 0xe3, 0x5a, 0x54, 0x3b,
+ 0xb3, 0xbe, 0xcc, 0x3d, 0x43, 0xe1, 0x7b, 0xbd, 0x00, 0xe0, 0x59, 0x3d,
+ 0xc8, 0x53, 0xfc, 0x3d, 0xff, 0xac, 0xa2, 0xbd, 0x5d, 0x8c, 0x3e, 0xbd,
+ 0xf3, 0x1d, 0x9b, 0x3d, 0x45, 0xed, 0xe0, 0x3c, 0x5f, 0xbf, 0x8b, 0x3c,
+ 0xc6, 0x75, 0x3b, 0xbe, 0x61, 0x2c, 0x71, 0xbd, 0x18, 0x64, 0x23, 0xbe,
+ 0x7e, 0xe6, 0x04, 0x3b, 0x59, 0xb6, 0xd2, 0x3c, 0x09, 0x53, 0xf0, 0xbb,
+ 0x99, 0x84, 0xb7, 0xbd, 0x2e, 0x4b, 0x0f, 0xbe, 0xa6, 0x8e, 0x01, 0x3e,
+ 0xc4, 0xfd, 0xf1, 0x3c, 0x7a, 0x27, 0x28, 0x3e, 0x96, 0xc2, 0x91, 0xbd,
+ 0xfe, 0x73, 0x26, 0x3c, 0x20, 0x1a, 0x05, 0x3d, 0x8e, 0x82, 0x1e, 0xbd,
+ 0x67, 0x3c, 0x8d, 0xbd, 0x5c, 0xc3, 0x16, 0xbe, 0x5b, 0xde, 0xb3, 0x3c,
+ 0x7f, 0x57, 0x24, 0x3e, 0x9e, 0x0c, 0x28, 0x3d, 0x71, 0x63, 0xc6, 0x3d,
+ 0x86, 0xc7, 0x59, 0xbd, 0xd3, 0xf9, 0x95, 0xbc, 0x1c, 0x90, 0xfe, 0xbd,
+ 0x3e, 0x97, 0x2b, 0xbe, 0xcd, 0xd9, 0xbc, 0xbd, 0x6d, 0xbe, 0x64, 0x3c,
+ 0x20, 0x2e, 0x01, 0xbd, 0x33, 0x4a, 0x83, 0xbd, 0xc9, 0xe1, 0xfe, 0xbd,
+ 0x63, 0xe3, 0xdd, 0x3d, 0x75, 0xd8, 0x12, 0x3d, 0xe7, 0x7d, 0x9b, 0x3d,
+ 0xa8, 0x1b, 0x31, 0xbe, 0xd4, 0x11, 0x89, 0x3e, 0x8a, 0x09, 0xc6, 0x3b,
+ 0x2b, 0xa7, 0xdf, 0xbc, 0xc2, 0x3b, 0x5d, 0xbd, 0x9a, 0x65, 0x5e, 0x3c,
+ 0xa5, 0xbb, 0x9e, 0xbd, 0x0b, 0xfd, 0x0a, 0xbe, 0xab, 0x5e, 0xda, 0x3d,
+ 0x5c, 0x24, 0xaa, 0xbb, 0x41, 0x92, 0xf1, 0x3d, 0x10, 0x47, 0xb3, 0xbc,
+ 0xb4, 0x9f, 0x91, 0x3d, 0x2c, 0xe5, 0x37, 0xbe, 0xf3, 0x5e, 0x75, 0x3d,
+ 0x97, 0x0b, 0xa4, 0x3c, 0x1a, 0x1e, 0x89, 0x3d, 0xa5, 0x52, 0x00, 0xbd,
+ 0x24, 0x55, 0x9c, 0x3d, 0x9c, 0x20, 0xdf, 0xbd, 0xb1, 0x98, 0x37, 0x3d,
+ 0x0a, 0x36, 0xf4, 0x3c, 0xfb, 0x3c, 0x92, 0x3c, 0xf0, 0x78, 0x14, 0x3e,
+ 0x08, 0x2b, 0xce, 0xbd, 0xbd, 0xab, 0x4f, 0x3d, 0x81, 0x45, 0xdc, 0xbd,
+ 0xac, 0xae, 0x48, 0x3d, 0x08, 0x59, 0xfb, 0xbd, 0x20, 0x07, 0x1c, 0xbd,
+ 0xb0, 0xc6, 0xae, 0x3d, 0x9e, 0xae, 0x82, 0xbd, 0x72, 0x1e, 0xe7, 0xba,
+ 0xc9, 0x3c, 0x20, 0x3e, 0x9f, 0x4b, 0xd1, 0xbd, 0x5b, 0xcf, 0x23, 0xbe,
+ 0xed, 0x6a, 0x68, 0xbe, 0x2e, 0xa4, 0x62, 0xbd, 0x7f, 0x7a, 0x0a, 0x3d,
+ 0xb6, 0x81, 0x45, 0x3e, 0x42, 0x3c, 0xc5, 0xbd, 0xad, 0x47, 0x90, 0xbb,
+ 0x4e, 0xca, 0xce, 0x3d, 0x0c, 0x35, 0x8d, 0xbb, 0xdf, 0xe9, 0x36, 0xbd,
+ 0x10, 0x24, 0xf1, 0x3d, 0xa5, 0x9b, 0x1c, 0xbe, 0x15, 0x35, 0x01, 0x3b,
+ 0xc1, 0xba, 0xee, 0xbd, 0xbf, 0xbb, 0x51, 0xbd, 0xff, 0x01, 0x6a, 0x3d,
+ 0xd8, 0xd4, 0xf5, 0x3c, 0xca, 0xa8, 0xc7, 0xbd, 0xaa, 0x60, 0xc5, 0xbd,
+ 0x31, 0xdb, 0x7c, 0xbe, 0x41, 0x75, 0xbe, 0xbb, 0x6c, 0x24, 0x61, 0x3d,
+ 0xbf, 0xee, 0xf9, 0xbd, 0xae, 0x3f, 0xa6, 0xbd, 0xdd, 0xad, 0x77, 0xbe,
+ 0x25, 0x52, 0x90, 0xbc, 0x98, 0xfa, 0x55, 0xbc, 0x5c, 0xf2, 0x31, 0x3e,
+ 0x3e, 0x2e, 0xc7, 0x3c, 0x43, 0x3b, 0x29, 0xbe, 0x5c, 0xb3, 0xc5, 0xbd,
+ 0xf1, 0x7c, 0x5a, 0xbe, 0x34, 0x79, 0xf7, 0xbc, 0x4d, 0x3a, 0x76, 0xbd,
+ 0x14, 0xec, 0x2d, 0x3e, 0xaa, 0xef, 0x04, 0x3e, 0xa7, 0x1a, 0x09, 0xbc,
+ 0x9b, 0xcb, 0xb0, 0x3e, 0x84, 0xb3, 0xe8, 0x3e, 0xbf, 0x20, 0xab, 0xbd,
+ 0xb2, 0xd1, 0x1d, 0xbf, 0x19, 0xc3, 0x5c, 0xbf, 0x8a, 0x41, 0xb6, 0xbd,
+ 0xaf, 0x34, 0xd1, 0xbe, 0x88, 0x24, 0x2a, 0xbc, 0xcf, 0xd0, 0x5c, 0x3e,
+ 0x43, 0x7f, 0x81, 0xbe, 0x2f, 0x06, 0xaf, 0xbd, 0x77, 0xe0, 0xc8, 0x3d,
+ 0x97, 0x74, 0x8d, 0xbe, 0xb1, 0x43, 0x3f, 0xbc, 0x37, 0xe1, 0x5f, 0xbe,
+ 0xb8, 0x2e, 0xfd, 0x3e, 0x1d, 0x64, 0xbd, 0xbd, 0xcd, 0xf8, 0x82, 0x3d,
+ 0x90, 0x6d, 0x91, 0x3d, 0x8a, 0x95, 0xb3, 0x3e, 0x83, 0x29, 0xd9, 0xbe,
+ 0x8a, 0x46, 0x45, 0x3f, 0xcc, 0x80, 0xe9, 0xbd, 0x1d, 0xa5, 0xed, 0xbd,
+ 0x09, 0xd3, 0x0e, 0x3d, 0xb2, 0x79, 0xdf, 0x3c, 0x4b, 0xf7, 0x93, 0xbe,
+ 0x7a, 0x6c, 0xb0, 0xbe, 0xa3, 0xd3, 0x92, 0x3e, 0xd1, 0x30, 0xe8, 0x3e,
+ 0x5c, 0x44, 0x1e, 0xbe, 0x8f, 0xa0, 0x84, 0xbe, 0xb2, 0xa0, 0x07, 0xbf,
+ 0xff, 0xa5, 0xcd, 0xbd, 0xf5, 0xab, 0x29, 0x3d, 0x02, 0xd3, 0x0b, 0x3e,
+ 0xc5, 0x6c, 0x0d, 0x3d, 0x1b, 0x22, 0x31, 0xbd, 0x51, 0x67, 0x9e, 0x3c,
+ 0xf3, 0x00, 0x92, 0x3e, 0x5d, 0xb5, 0xd9, 0x3e, 0x33, 0xee, 0xb1, 0x3e,
+ 0x0a, 0x48, 0xcb, 0xbd, 0xe7, 0x1c, 0x87, 0x3d, 0x87, 0xd9, 0xf9, 0x3e,
+ 0x49, 0x42, 0x8e, 0xbe, 0xeb, 0x2f, 0x27, 0x3f, 0xb4, 0x9e, 0x39, 0x3e,
+ 0xb5, 0x4a, 0x33, 0x3f, 0x53, 0x8f, 0xf3, 0x3d, 0x70, 0x2d, 0x31, 0x3c,
+ 0xd8, 0x4b, 0x26, 0xbe, 0xcf, 0x14, 0x63, 0x3c, 0x80, 0xbf, 0x14, 0xbe,
+ 0x06, 0x92, 0x47, 0x3d, 0x19, 0x26, 0xa6, 0xbd, 0x6f, 0x2d, 0xf0, 0x3d,
+ 0xb8, 0x79, 0x5d, 0x3d, 0x4a, 0xba, 0x6d, 0xbe, 0x90, 0x1f, 0xf8, 0xbd,
+ 0xe5, 0xcd, 0xa6, 0x3e, 0x1a, 0x5b, 0xe6, 0xbe, 0x32, 0xce, 0x24, 0x3e,
+ 0x87, 0xb7, 0x4c, 0xbd, 0x01, 0xd4, 0x3a, 0x3e, 0x40, 0xde, 0xd4, 0x3e,
+ 0x5b, 0x81, 0xa6, 0xbe, 0x20, 0xf1, 0x2a, 0x3e, 0x71, 0x4b, 0x2d, 0x3f,
+ 0x3c, 0x57, 0x42, 0xbf, 0xeb, 0x16, 0x2f, 0x3e, 0xee, 0x9a, 0x4f, 0x3e,
+ 0x63, 0x03, 0xaa, 0xbd, 0x99, 0x1e, 0xb7, 0x3d, 0xf3, 0x4d, 0xa0, 0xbd,
+ 0xa5, 0x6c, 0x7e, 0x3e, 0xaa, 0x23, 0x06, 0x3e, 0xc0, 0xb1, 0xd2, 0x3e,
+ 0xfc, 0x8c, 0xf6, 0xbe, 0x00, 0xb1, 0x14, 0xbe, 0x6c, 0x01, 0x22, 0x3f,
+ 0x35, 0x33, 0xe3, 0xbd, 0xd1, 0x54, 0x02, 0x3d, 0x30, 0xcd, 0xab, 0xbe,
+ 0x6a, 0x7a, 0x13, 0x3e, 0xd0, 0xa3, 0x20, 0xbe, 0x54, 0x14, 0x23, 0x3e,
+ 0x03, 0xe0, 0x8d, 0xbf, 0x52, 0x90, 0x2a, 0x3e, 0x0c, 0x20, 0x15, 0x3f,
+ 0x64, 0x74, 0x02, 0x3e, 0x78, 0xde, 0x8d, 0x3e, 0x4d, 0xb2, 0xe7, 0x3d,
+ 0x76, 0x87, 0xa5, 0xbe, 0x24, 0x5a, 0x42, 0xbe, 0xdf, 0x12, 0x16, 0xbf,
+ 0x7a, 0xab, 0xd7, 0x3e, 0x75, 0x2e, 0xb5, 0x3d, 0x47, 0x09, 0x2d, 0xbe,
+ 0x90, 0x0a, 0x18, 0x3e, 0x88, 0xea, 0x4e, 0xbc, 0xef, 0x80, 0xe1, 0xbe,
+ 0xc1, 0x88, 0x26, 0x3d, 0xe5, 0xf5, 0x96, 0x3d, 0xa2, 0x7d, 0x99, 0x3d,
+ 0x73, 0xc3, 0x5a, 0x3e, 0xc1, 0x39, 0xf4, 0xbd, 0x39, 0x87, 0x39, 0x3e,
+ 0x3c, 0x9b, 0x8e, 0xbd, 0xe4, 0x1d, 0x15, 0x3e, 0x10, 0x9c, 0x06, 0x3f,
+ 0x8e, 0xfa, 0x7e, 0x3d, 0x90, 0x6e, 0x81, 0xbe, 0x57, 0xab, 0x51, 0x3c,
+ 0x61, 0x5b, 0xaa, 0x3d, 0xa9, 0xe7, 0x10, 0xbf, 0x88, 0xbd, 0x6a, 0x3e,
+ 0x1e, 0x94, 0xcc, 0x3d, 0x23, 0x78, 0xbc, 0x3c, 0xa4, 0x85, 0xde, 0x3d,
+ 0x2a, 0x3e, 0xd5, 0x3d, 0x58, 0x94, 0xd0, 0x3b, 0x66, 0xca, 0x29, 0x3e,
+ 0x6d, 0xa8, 0xb7, 0xbd, 0x41, 0xb0, 0xc6, 0xbd, 0x87, 0xd1, 0x96, 0x3d,
+ 0x3f, 0xeb, 0xb8, 0x3d, 0x15, 0x9d, 0x40, 0x3d, 0xfd, 0x93, 0x92, 0xbe,
+ 0x9d, 0x63, 0xd1, 0xbd, 0x1a, 0xc5, 0xe3, 0xbd, 0xa7, 0x34, 0xc9, 0xbb,
+ 0x61, 0x02, 0xcf, 0x3d, 0xde, 0xa7, 0x00, 0xbe, 0x11, 0x51, 0xa1, 0xbd,
+ 0x57, 0x70, 0x00, 0x3e, 0xda, 0x78, 0x90, 0x3c, 0x48, 0x5c, 0x61, 0xbe,
+ 0x92, 0xa6, 0xa3, 0x3d, 0x62, 0x14, 0x16, 0xbe, 0xe0, 0xca, 0x19, 0xbe,
+ 0x71, 0xab, 0x05, 0x3d, 0xe7, 0x33, 0xe7, 0x3c, 0x56, 0xe7, 0x20, 0xbe,
+ 0xb3, 0x45, 0x15, 0xbe, 0x0d, 0xc6, 0x72, 0xbc, 0x38, 0xc4, 0xbb, 0xbd,
+ 0xa9, 0x1a, 0xbd, 0xbd, 0xe7, 0xc4, 0x0d, 0x3d, 0xfa, 0x97, 0x0e, 0xbe,
+ 0x4c, 0x36, 0xff, 0xbb, 0x40, 0xbf, 0x31, 0x3e, 0x89, 0xc7, 0x56, 0xbe,
+ 0x8a, 0xa8, 0xd4, 0xbd, 0xea, 0xe9, 0x07, 0xbe, 0xe5, 0x7f, 0xf7, 0xbc,
+ 0x12, 0xcd, 0xb4, 0x3d, 0x03, 0xbd, 0x19, 0x3d, 0x3e, 0xea, 0xfd, 0x3d,
+ 0xcd, 0x0d, 0x60, 0xbd, 0xb5, 0xc3, 0x85, 0x3d, 0x47, 0x01, 0x53, 0xbd,
+ 0x8e, 0x3a, 0xcb, 0xbd, 0xa4, 0xdc, 0x6d, 0xbd, 0x56, 0x7f, 0xfe, 0x3c,
+ 0xed, 0x77, 0xdc, 0xbd, 0x87, 0xfe, 0xf1, 0xbd, 0xdf, 0xcb, 0xe9, 0x3d,
+ 0x68, 0x17, 0xdc, 0xbd, 0xc7, 0x72, 0x44, 0x3d, 0xcc, 0xf2, 0x09, 0xbe,
+ 0x03, 0x09, 0x07, 0x3e, 0xe9, 0xf0, 0x8b, 0xbd, 0x53, 0x04, 0x64, 0x3d,
+ 0x6b, 0x4a, 0x16, 0xbd, 0xf6, 0x90, 0xcf, 0xbc, 0xc7, 0x9b, 0x81, 0x3d,
+ 0x75, 0x18, 0xae, 0x3c, 0x48, 0x31, 0xee, 0xbc, 0xc6, 0x10, 0xd5, 0xbc,
+ 0x73, 0x74, 0xe1, 0xbd, 0xf7, 0x91, 0x82, 0xbd, 0x99, 0x29, 0x79, 0x3d,
+ 0x67, 0xb4, 0xf3, 0xba, 0x02, 0xbc, 0x91, 0xbd, 0xb0, 0xd0, 0xe3, 0xbd,
+ 0x46, 0x4e, 0x9f, 0x3d, 0x89, 0x20, 0x94, 0x3d, 0xbc, 0x84, 0x14, 0xbd,
+ 0xed, 0x55, 0x31, 0x3d, 0x71, 0x0c, 0xe8, 0x3c, 0xb8, 0x2e, 0xc5, 0x3d,
+ 0x39, 0x41, 0xf3, 0x3c, 0xd6, 0x51, 0x9a, 0x3c, 0x2f, 0xec, 0xa2, 0xbd,
+ 0xa7, 0x5f, 0xd1, 0xbb, 0xca, 0xa7, 0x9e, 0x3d, 0x87, 0x3d, 0x01, 0x3e,
+ 0x59, 0x9f, 0xae, 0xbd, 0x50, 0x48, 0x15, 0xb9, 0x69, 0xe6, 0xc7, 0x3c,
+ 0x77, 0xf0, 0x13, 0xbe, 0xf1, 0xf4, 0xad, 0x3d, 0xbc, 0xe1, 0xa4, 0x3d,
+ 0x1c, 0x8f, 0xaa, 0xbd, 0x87, 0x90, 0x0a, 0xbe, 0x21, 0xad, 0x93, 0xbc,
+ 0xe9, 0xb2, 0x2f, 0xbd, 0x49, 0x0a, 0x28, 0x3e, 0xff, 0xaa, 0xfb, 0xbd,
+ 0x44, 0x9b, 0xd4, 0xbd, 0x48, 0x5d, 0x05, 0xbe, 0x10, 0x57, 0x88, 0x3d,
+ 0x0a, 0xdf, 0x82, 0xbd, 0x9e, 0xc7, 0xf3, 0xbd, 0xa3, 0x0e, 0x10, 0xbe,
+ 0xf7, 0x0f, 0x44, 0x3c, 0x90, 0xc9, 0xe7, 0x3c, 0xf1, 0x77, 0xfe, 0x3c,
+ 0x19, 0x51, 0x92, 0x3d, 0x2d, 0x9d, 0x05, 0xbe, 0x3a, 0xd6, 0x8c, 0x3d,
+ 0xcb, 0xb6, 0x24, 0xbc, 0x46, 0x82, 0xec, 0xbd, 0xab, 0x23, 0x97, 0xbd,
+ 0x24, 0x65, 0x9f, 0xbd, 0x21, 0x43, 0x90, 0xbd, 0xad, 0x0f, 0xd3, 0x3d,
+ 0x31, 0x18, 0x78, 0xbd, 0xed, 0xef, 0x0d, 0xbe, 0x3d, 0x5a, 0x8f, 0x3d,
+ 0x45, 0x0e, 0x16, 0x3d, 0xa7, 0xc0, 0x5d, 0x3d, 0xcb, 0x91, 0xf1, 0xbd,
+ 0x0f, 0x4b, 0xaa, 0x3d, 0xad, 0x27, 0xf6, 0x3b, 0x7f, 0x44, 0x52, 0x3e,
+ 0x4e, 0xd7, 0xd0, 0xbd, 0x20, 0x60, 0xd3, 0x3d, 0x70, 0x4a, 0x57, 0x3c,
+ 0x2f, 0x1c, 0xcf, 0xbc, 0x28, 0x4e, 0x40, 0x3e, 0x19, 0xcc, 0x6d, 0xbd,
+ 0x29, 0x32, 0xd9, 0x3d, 0x33, 0x69, 0x06, 0xbe, 0x28, 0x06, 0xba, 0x3c,
+ 0xb7, 0x5f, 0x1e, 0x3e, 0xa7, 0x04, 0x9f, 0x3d, 0x36, 0xa3, 0x22, 0xbe,
+ 0xa6, 0x00, 0x49, 0x3d, 0x7c, 0x52, 0x10, 0xbe, 0x4f, 0x28, 0x13, 0xbe,
+ 0x93, 0x04, 0x88, 0xbe, 0xdb, 0x39, 0x1b, 0x3e, 0xc1, 0xd4, 0xcf, 0x3d,
+ 0xb6, 0x59, 0x80, 0x3d, 0x17, 0xa7, 0x42, 0xbd, 0x7c, 0xf9, 0x8a, 0xbd,
+ 0x36, 0xaf, 0x1b, 0xbe, 0xc4, 0x74, 0x0a, 0x3e, 0xf7, 0xc6, 0x6a, 0xbe,
+ 0x68, 0x2e, 0xfb, 0x3d, 0x96, 0x28, 0x5e, 0xbd, 0xa0, 0xeb, 0x45, 0x3d,
+ 0xb8, 0xca, 0x35, 0x3e, 0x7b, 0xe9, 0x2f, 0xbe, 0x73, 0x58, 0x26, 0x3e,
+ 0x6a, 0xb6, 0xed, 0xbe, 0x8c, 0x22, 0xa0, 0xbd, 0xe5, 0x07, 0x2b, 0xbd,
+ 0xcb, 0xb9, 0x50, 0xbe, 0xb8, 0xa7, 0xf3, 0x3c, 0x07, 0x5e, 0x06, 0x3d,
+ 0xd7, 0xb1, 0x17, 0x3d, 0x3b, 0x3f, 0x39, 0xbe, 0xb1, 0x9e, 0x39, 0xbe,
+ 0xf5, 0x60, 0xe1, 0xbd, 0x01, 0x0e, 0x69, 0xbd, 0x09, 0xee, 0x8b, 0x3e,
+ 0x13, 0x6f, 0x53, 0xbc, 0xf8, 0x4e, 0x89, 0xbe, 0x51, 0x85, 0x21, 0x3e,
+ 0xfb, 0x9c, 0x99, 0xbd, 0x79, 0x33, 0x10, 0x3d, 0x30, 0x0b, 0x3b, 0x3d,
+ 0xcf, 0x5f, 0xc9, 0x3e, 0xea, 0x7b, 0xc0, 0x3e, 0x71, 0xbc, 0x0c, 0xbe,
+ 0x2b, 0x89, 0xa7, 0xbd, 0x28, 0x74, 0x1e, 0xbd, 0x4e, 0xd8, 0x32, 0xbd,
+ 0xa6, 0x43, 0xf3, 0x3d, 0x6c, 0x69, 0xb6, 0xbe, 0x84, 0x3f, 0x14, 0xbd,
+ 0x0a, 0x01, 0x14, 0xbd, 0x1d, 0x29, 0x48, 0x3e, 0x30, 0xf9, 0x93, 0xbd,
+ 0xf8, 0x49, 0x60, 0x3e, 0xce, 0x2d, 0x44, 0xbd, 0xf2, 0x85, 0xef, 0x3d,
+ 0xac, 0xd5, 0x53, 0x3c, 0x3d, 0xd4, 0x30, 0xbe, 0xc9, 0xe9, 0x56, 0xbd,
+ 0x8e, 0x71, 0x1a, 0x3e, 0x72, 0xde, 0x88, 0x3e, 0x29, 0xc7, 0x40, 0xbe,
+ 0x6e, 0x7b, 0xe0, 0xbe, 0xdb, 0x46, 0x43, 0x3d, 0x5c, 0xaa, 0x9f, 0x3e,
+ 0x5f, 0xfc, 0x32, 0x3e, 0x30, 0x9d, 0x29, 0xbd, 0x2d, 0x04, 0x94, 0x3d,
+ 0xe5, 0x9e, 0xc1, 0xbd, 0x1b, 0x3f, 0xcd, 0x3b, 0xb5, 0xf7, 0xa9, 0xba,
+ 0xbd, 0xca, 0x3c, 0x3e, 0x8f, 0x5a, 0x8f, 0xbc, 0x3d, 0x15, 0xa7, 0x3d,
+ 0x87, 0x9e, 0xe6, 0x3d, 0xf2, 0x7d, 0x26, 0xbe, 0xa2, 0xb4, 0x9c, 0xbe,
+ 0x55, 0x00, 0x44, 0x3d, 0xfa, 0x6b, 0x53, 0xbe, 0x14, 0xe5, 0xcb, 0xbd,
+ 0x39, 0xaa, 0x83, 0xbe, 0xb2, 0x5c, 0x2f, 0x3e, 0x3a, 0x0c, 0x49, 0xbe,
+ 0x30, 0xe8, 0x02, 0xbe, 0x30, 0xac, 0x34, 0x3e, 0x11, 0x89, 0x50, 0x3c,
+ 0xcc, 0x7a, 0x8e, 0x3e, 0x9d, 0x2a, 0xb0, 0x3d, 0x13, 0x91, 0xbe, 0x3c,
+ 0xec, 0xb3, 0x6d, 0x3e, 0xda, 0x1f, 0xb5, 0xbe, 0x9b, 0xf4, 0x3f, 0xbe,
+ 0xc6, 0x56, 0x92, 0xbd, 0x34, 0x97, 0x16, 0xbe, 0x6c, 0x3c, 0x0a, 0x3b,
+ 0x84, 0x7b, 0x87, 0x3d, 0xf9, 0x51, 0x8c, 0x3d, 0x9a, 0x7d, 0xa4, 0xbe,
+ 0xac, 0xc1, 0xc0, 0x3d, 0x49, 0x70, 0x87, 0x3d, 0x02, 0x4c, 0xa0, 0x3d,
+ 0x37, 0xcc, 0xb3, 0xbd, 0x14, 0x3f, 0x7b, 0x3d, 0x02, 0xd7, 0x19, 0x3e,
+ 0x01, 0x89, 0x51, 0x3e, 0xbf, 0x81, 0xf5, 0x3a, 0x94, 0xe1, 0x8b, 0xbe,
+ 0xba, 0x95, 0x1d, 0x3d, 0x4c, 0xc7, 0x21, 0x3e, 0x0f, 0x1f, 0xd8, 0x3d,
+ 0x0d, 0x4a, 0xab, 0xbd, 0xf6, 0x75, 0xb2, 0xbd, 0x2a, 0xff, 0xc7, 0xbd,
+ 0xb1, 0x11, 0x19, 0x3e, 0x61, 0x94, 0xbc, 0xbc, 0x47, 0x0e, 0xab, 0x3d,
+ 0x16, 0xce, 0xb2, 0x3d, 0xad, 0x52, 0x2e, 0xbe, 0x8c, 0xca, 0x95, 0xbb,
+ 0xc5, 0x55, 0x60, 0x3d, 0x8a, 0x02, 0x70, 0xbd, 0xbe, 0xda, 0x8f, 0xbc,
+ 0x01, 0x70, 0xb7, 0xbd, 0xfd, 0x5f, 0xa0, 0x3d, 0x65, 0x22, 0x66, 0x3d,
+ 0xb6, 0xf4, 0x07, 0xbe, 0x03, 0xd2, 0xa9, 0xbd, 0x18, 0x08, 0x3c, 0xbc,
+ 0x02, 0x4b, 0xe0, 0xbd, 0x2b, 0xc7, 0xe7, 0xba, 0x72, 0x3f, 0x0b, 0xbe,
+ 0xb5, 0x86, 0x03, 0xbc, 0x7b, 0xeb, 0x79, 0x3d, 0xae, 0x58, 0x35, 0x3d,
+ 0xdb, 0x46, 0xe8, 0xbd, 0xfd, 0x8d, 0x62, 0x3d, 0xbe, 0x65, 0x18, 0x3e,
+ 0x12, 0x5d, 0x2c, 0xbd, 0xf5, 0xd2, 0x89, 0x3b, 0xc0, 0x77, 0x7a, 0xbc,
+ 0xec, 0x89, 0x20, 0x3e, 0x7a, 0xf8, 0xd4, 0x3c, 0x52, 0xc0, 0xc3, 0x3d,
+ 0xaf, 0x17, 0xea, 0xbd, 0xef, 0x08, 0xe9, 0xbb, 0x6a, 0x96, 0x1a, 0xbe,
+ 0x3a, 0xf5, 0x9c, 0x3d, 0xa2, 0x37, 0x02, 0x3e, 0x05, 0x6f, 0x47, 0x3b,
+ 0x78, 0x1d, 0x16, 0x3e, 0xe3, 0x4a, 0xb4, 0x3c, 0x67, 0xda, 0xbd, 0x3d,
+ 0xef, 0xad, 0xc6, 0xbd, 0xa2, 0x5b, 0xd7, 0x3d, 0x84, 0xee, 0x3a, 0x3e,
+ 0x68, 0x58, 0xed, 0xbd, 0x48, 0x3a, 0x18, 0xbe, 0xa7, 0xf5, 0xa3, 0x3d,
+ 0xea, 0x34, 0xdd, 0xbd, 0x78, 0xe3, 0xe1, 0x3c, 0x8e, 0x69, 0x3f, 0x3c,
+ 0x26, 0xdf, 0x2e, 0x3d, 0xa6, 0xba, 0x41, 0x3e, 0xd0, 0xa7, 0x5f, 0x3d,
+ 0xaf, 0xfa, 0xe3, 0x3d, 0x9a, 0x58, 0x31, 0xbe, 0x09, 0xcb, 0xcb, 0xbd,
+ 0x9f, 0x56, 0x94, 0xbd, 0x34, 0xde, 0x33, 0x3c, 0x4a, 0xd7, 0x93, 0xbc,
+ 0x4d, 0x8d, 0x90, 0xbb, 0xda, 0xab, 0xd5, 0xbd, 0xf8, 0x2b, 0x34, 0x3e,
+ 0xdf, 0x6b, 0x90, 0xbd, 0x99, 0xd5, 0xd2, 0x3d, 0x2f, 0x52, 0x3e, 0x3e,
+ 0xde, 0x78, 0x15, 0xbe, 0x10, 0xcf, 0x85, 0x3c, 0x02, 0x98, 0xda, 0xbd,
+ 0x30, 0xd1, 0x23, 0x3d, 0x4c, 0x35, 0x11, 0xbe, 0xe1, 0x0a, 0xc9, 0x3d,
+ 0xfb, 0xb2, 0x0b, 0xbd, 0x2e, 0xd7, 0x1c, 0xbe, 0x6a, 0x82, 0xc5, 0xbd,
+ 0xfd, 0x16, 0xff, 0x3d, 0x16, 0x5b, 0x21, 0x3d, 0x46, 0x38, 0xc6, 0xbd,
+ 0x2f, 0x91, 0xb9, 0xbc, 0x25, 0xf6, 0x81, 0x3b, 0xc5, 0x6e, 0x7f, 0x3e,
+ 0x11, 0x64, 0x0d, 0x3e, 0xda, 0x95, 0xd2, 0x3d, 0x66, 0x10, 0x41, 0x3e,
+ 0x58, 0x03, 0x87, 0x3d, 0x12, 0x48, 0x85, 0xbd, 0x9a, 0xa4, 0x36, 0x3e,
+ 0xc1, 0xda, 0xaa, 0x3c, 0x22, 0x3c, 0x44, 0xbe, 0x1f, 0x4d, 0xca, 0x3c,
+ 0x05, 0x25, 0x1e, 0xbe, 0xe5, 0x46, 0xe5, 0xbd, 0xf4, 0x9e, 0xce, 0xbc,
+ 0x47, 0xcb, 0xaa, 0xbd, 0xe4, 0x3a, 0xbc, 0xbd, 0x3c, 0x9b, 0x1e, 0xbe,
+ 0xae, 0x43, 0xb5, 0xbd, 0x5d, 0x0c, 0x47, 0xbd, 0x4b, 0x2d, 0xb4, 0x3d,
+ 0x6e, 0x4b, 0x35, 0xbb, 0x69, 0xe0, 0xcd, 0xbc, 0xd3, 0xcd, 0xb0, 0xbe,
+ 0xa3, 0x89, 0x06, 0xbe, 0x69, 0xa7, 0xf4, 0xbd, 0xa0, 0x70, 0xe8, 0x3d,
+ 0x3f, 0x93, 0x06, 0xbe, 0x4f, 0xf9, 0x17, 0xbe, 0x7f, 0x35, 0xa4, 0x3d,
+ 0x5d, 0xe8, 0xc5, 0xbd, 0x94, 0x91, 0x93, 0x3d, 0x02, 0x57, 0x17, 0x3b,
+ 0xc3, 0x3c, 0xaa, 0xbd, 0x68, 0xb0, 0x92, 0xbd, 0x30, 0x36, 0xbb, 0x3d,
+ 0x69, 0x18, 0xf7, 0xbc, 0x56, 0x30, 0x97, 0x3d, 0x0f, 0x0f, 0xf4, 0xbd,
+ 0xe9, 0x42, 0x24, 0xbe, 0x8e, 0xa4, 0x8b, 0x3d, 0x40, 0xe1, 0x0e, 0x3b,
+ 0x0f, 0x26, 0xb8, 0xbc, 0xfe, 0x8d, 0xf7, 0x3d, 0x43, 0x9b, 0xfc, 0xbb,
+ 0x2e, 0x26, 0xaf, 0xbd, 0x15, 0xf0, 0x60, 0xbd, 0x9e, 0xc6, 0x03, 0x3e,
+ 0xf0, 0x64, 0xa2, 0xbc, 0x09, 0x44, 0xeb, 0xbb, 0x73, 0x63, 0x17, 0x3d,
+ 0x84, 0x91, 0x2f, 0x3e, 0xaa, 0xa9, 0x46, 0xbc, 0xd5, 0xa6, 0x25, 0x3d,
+ 0x32, 0xef, 0x89, 0x3d, 0xa9, 0xa3, 0xe3, 0x3d, 0x8f, 0x17, 0x42, 0x3e,
+ 0x36, 0x70, 0x1f, 0xbe, 0x8a, 0x52, 0x47, 0x3d, 0x58, 0x9b, 0xc5, 0x3d,
+ 0x88, 0xf8, 0x8d, 0x3d, 0x9d, 0x73, 0x07, 0xbe, 0xa2, 0x5d, 0x4e, 0xbe,
+ 0x9f, 0x4d, 0xe8, 0xbd, 0x31, 0x68, 0x1c, 0xbd, 0x8f, 0x34, 0x30, 0x3d,
+ 0x27, 0x4f, 0x09, 0x3e, 0xc4, 0xf3, 0x4d, 0xbe, 0x50, 0xa8, 0x91, 0xbd,
+ 0xa5, 0x86, 0x39, 0x3d, 0x5e, 0x43, 0xf0, 0x3d, 0x7f, 0xd6, 0xd0, 0xbd,
+ 0xf7, 0x34, 0x83, 0x3d, 0x6e, 0x20, 0x8b, 0xbc, 0x22, 0x25, 0xac, 0xbd,
+ 0x6c, 0xec, 0x3e, 0xbd, 0xb5, 0x44, 0x18, 0x3e, 0x4f, 0x93, 0xf0, 0x3d,
+ 0xaf, 0x9e, 0xd5, 0x3d, 0xb9, 0xef, 0xeb, 0x3d, 0x7d, 0x18, 0x07, 0x3e,
+ 0xe7, 0xf1, 0xea, 0xbc, 0x00, 0xda, 0xf8, 0x3c, 0xbe, 0xb4, 0x85, 0x3d,
+ 0xa0, 0x59, 0xa0, 0xbd, 0x86, 0xa7, 0x24, 0xbe, 0x49, 0xb4, 0x49, 0x3e,
+ 0xa5, 0x59, 0x89, 0x3c, 0x6d, 0x8b, 0xad, 0xbd, 0x07, 0x9e, 0x47, 0xbd,
+ 0x43, 0xc4, 0xd9, 0xbd, 0xeb, 0x47, 0x0d, 0x3d, 0x72, 0x97, 0x42, 0x3e,
+ 0x5c, 0xf5, 0xcf, 0xb9, 0xd4, 0x1e, 0x36, 0x3d, 0x29, 0xc0, 0xc8, 0x3d,
+ 0x2f, 0x88, 0x8f, 0xbd, 0xe1, 0x32, 0x1b, 0x3e, 0xe4, 0x6c, 0x8a, 0x3d,
+ 0xa2, 0x01, 0x38, 0x3e, 0x74, 0xe7, 0xf8, 0xbd, 0xe6, 0x1d, 0x1a, 0x3d,
+ 0x9f, 0x44, 0xa9, 0xbd, 0xaa, 0x60, 0x37, 0x3d, 0xf1, 0x6f, 0x0e, 0x3e,
+ 0xd2, 0xe5, 0xbb, 0x3c, 0xeb, 0xbf, 0xa5, 0xbd, 0x83, 0x9b, 0x1e, 0x3d,
+ 0x7e, 0xe2, 0xb1, 0xbb, 0x8b, 0xda, 0x6e, 0x3d, 0xeb, 0x97, 0xbe, 0xbd,
+ 0xd6, 0x4b, 0x0a, 0x3c, 0x88, 0x80, 0x2c, 0xbd, 0xa5, 0xef, 0x0e, 0xbe,
+ 0x45, 0xfe, 0x52, 0xbc, 0x37, 0x36, 0x83, 0x3d, 0x64, 0x20, 0xf7, 0x3c,
+ 0xf0, 0x1c, 0x8e, 0xbd, 0x72, 0x28, 0x96, 0xbd, 0xdb, 0xa5, 0xee, 0xbb,
+ 0x05, 0xe7, 0x41, 0x3e, 0x33, 0xe4, 0x62, 0xbd, 0xb5, 0x2f, 0xa1, 0x3d,
+ 0xed, 0xdb, 0xcd, 0xbd, 0x01, 0xb3, 0x29, 0xbe, 0x82, 0x62, 0x1e, 0x3e,
+ 0x65, 0x50, 0x18, 0x3d, 0x7f, 0x9a, 0x86, 0xbe, 0xaa, 0x76, 0x92, 0xbd,
+ 0x39, 0x0b, 0x99, 0xbd, 0x69, 0xee, 0x19, 0xbd, 0xb4, 0x54, 0xc1, 0xbd,
+ 0x6d, 0x35, 0x21, 0xbe, 0x1a, 0x14, 0x93, 0x3d, 0x82, 0xff, 0x1f, 0xbe,
+ 0x2a, 0xdb, 0x5c, 0xbd, 0x79, 0x8e, 0xf8, 0xbb, 0xea, 0x31, 0x0a, 0xbd,
+ 0x15, 0xaf, 0x02, 0xbd, 0x14, 0x76, 0xa5, 0xbc, 0xf3, 0x4a, 0x8d, 0xbe,
+ 0x46, 0x74, 0xde, 0xbd, 0xe1, 0x2a, 0xca, 0xbd, 0x6f, 0x12, 0x57, 0x3e,
+ 0xc4, 0x19, 0x36, 0xbd, 0xe3, 0xc4, 0xad, 0xbd, 0x7b, 0xe9, 0x8e, 0xbd,
+ 0x33, 0x29, 0xee, 0xbd, 0xbf, 0x18, 0x55, 0xbd, 0x79, 0xa0, 0x84, 0x3d,
+ 0x50, 0x44, 0x2e, 0x3e, 0xb7, 0x4b, 0x9d, 0x3b, 0xea, 0x8b, 0x0b, 0x3d,
+ 0x4b, 0x29, 0xbb, 0x3d, 0xe3, 0x77, 0x8a, 0x3e, 0x6e, 0xa9, 0x92, 0xbc,
+ 0xde, 0x47, 0x2e, 0xbf, 0x1f, 0xdd, 0x4c, 0xbf, 0xa0, 0xdd, 0xd9, 0xbd,
+ 0x55, 0xa5, 0xa2, 0x3d, 0x8b, 0x4d, 0x0a, 0x3e, 0xbb, 0x7a, 0xae, 0x3e,
+ 0x52, 0x9f, 0xb8, 0xbe, 0x47, 0xd5, 0x7c, 0xbe, 0xd2, 0xf2, 0x6f, 0xbe,
+ 0x7d, 0x38, 0x99, 0xbe, 0xdc, 0x80, 0x8e, 0x3d, 0xa7, 0xe7, 0x0f, 0xbe,
+ 0x7a, 0xe0, 0x25, 0x3f, 0xf7, 0x73, 0xa4, 0x3d, 0xba, 0x7a, 0xdc, 0xbd,
+ 0x7e, 0xef, 0xdb, 0xbd, 0xa0, 0x62, 0x26, 0x3f, 0xf1, 0xb7, 0x63, 0xbe,
+ 0x20, 0x77, 0x25, 0x3f, 0xc0, 0x49, 0x50, 0xbd, 0x14, 0xe5, 0xc0, 0xbd,
+ 0x09, 0x57, 0x3e, 0xbe, 0x4d, 0x12, 0xec, 0xbd, 0xf8, 0xcc, 0x98, 0xbe,
+ 0x8a, 0x14, 0x1f, 0xbd, 0xd1, 0xb2, 0x6f, 0x3e, 0x1b, 0xa4, 0xd8, 0x3c,
+ 0x80, 0x9e, 0x58, 0xbe, 0xce, 0xd3, 0x20, 0x3c, 0xec, 0x5d, 0xb2, 0xbe,
+ 0xe9, 0x1a, 0x07, 0xbd, 0x4c, 0x54, 0x0d, 0xbe, 0x98, 0xe2, 0x5e, 0x3d,
+ 0x88, 0x6a, 0x05, 0x39, 0x42, 0xd0, 0x78, 0xbd, 0x26, 0x5b, 0xf0, 0x3d,
+ 0x12, 0x33, 0xdd, 0x3e, 0xec, 0xfe, 0xf6, 0x3e, 0x17, 0x24, 0xd8, 0x3e,
+ 0xec, 0xec, 0x89, 0xbd, 0xe4, 0x64, 0xb2, 0xbd, 0x4d, 0x6a, 0x66, 0x3e,
+ 0x19, 0x8c, 0x67, 0xbe, 0x1d, 0x3b, 0x14, 0x3f, 0xb1, 0xaf, 0xe1, 0x3b,
+ 0xce, 0xb7, 0x07, 0x3f, 0x74, 0x31, 0x82, 0x3e, 0x1d, 0x42, 0x42, 0xbd,
+ 0x70, 0xe8, 0x03, 0xbf, 0x5a, 0xc6, 0x81, 0x3e, 0x72, 0xd4, 0x95, 0x3d,
+ 0xc0, 0x04, 0x28, 0x3e, 0x2a, 0xb3, 0x84, 0xbe, 0xed, 0x61, 0xb1, 0xbb,
+ 0xfd, 0x65, 0x4d, 0x3e, 0xf1, 0xf9, 0x11, 0xbe, 0xca, 0x4f, 0x41, 0xbe,
+ 0x53, 0xeb, 0xd6, 0x3e, 0xdc, 0x28, 0x14, 0xbf, 0xd7, 0x0f, 0x44, 0x3e,
+ 0x68, 0x60, 0x0d, 0x3c, 0xc2, 0xca, 0x80, 0xbc, 0xd4, 0x12, 0x8a, 0x3e,
+ 0x82, 0xd9, 0xf1, 0xbe, 0xe2, 0x68, 0x9d, 0x3e, 0xea, 0xdc, 0xf1, 0x3e,
+ 0xf9, 0xd3, 0x2b, 0xbf, 0x83, 0x98, 0xa3, 0x3e, 0x65, 0x19, 0x10, 0xbe,
+ 0x67, 0xac, 0x73, 0xbd, 0x9e, 0xba, 0x8a, 0x3d, 0x13, 0x1e, 0x98, 0xbe,
+ 0xcb, 0x0d, 0x60, 0x3e, 0xee, 0x84, 0x69, 0x3a, 0xb2, 0x7c, 0xf7, 0x3e,
+ 0x1f, 0x76, 0x0e, 0xbf, 0x69, 0xc5, 0x18, 0x3e, 0x6c, 0x62, 0x35, 0x3f,
+ 0xb1, 0x3a, 0xe2, 0xbc, 0x92, 0x69, 0xd1, 0x3c, 0xb7, 0x9f, 0x01, 0xbf,
+ 0xfa, 0x83, 0xee, 0x3d, 0xcf, 0x58, 0x7f, 0xbe, 0xaa, 0x41, 0x08, 0x3e,
+ 0x41, 0xaf, 0x7b, 0xbf, 0x79, 0xd0, 0xf5, 0x3c, 0xc0, 0x78, 0x34, 0x3f,
+ 0x02, 0x57, 0x8b, 0x3c, 0x84, 0xd9, 0xe3, 0x3e, 0xfe, 0xd3, 0xf2, 0x3d,
+ 0xd0, 0xb3, 0x46, 0xbe, 0x14, 0x5f, 0x7b, 0xbd, 0x0d, 0xef, 0x08, 0xbf,
+ 0x2b, 0xe6, 0x40, 0x3e, 0x01, 0x14, 0x36, 0x3d, 0x51, 0xfc, 0xea, 0xbd,
+ 0x44, 0x30, 0xcb, 0x3e, 0x4b, 0xa5, 0x51, 0x3c, 0x5e, 0x46, 0xf1, 0xbd,
+ 0x3a, 0x52, 0x4c, 0x3d, 0x8f, 0xdd, 0x80, 0xbd, 0x7b, 0xf7, 0x0f, 0x3e,
+ 0xcf, 0x3f, 0xc5, 0x3b, 0x9a, 0x2a, 0x94, 0x3d, 0xc3, 0xea, 0xc1, 0x3d,
+ 0xe2, 0x1a, 0xa8, 0xbd, 0xbb, 0x76, 0xf2, 0x3e, 0x2d, 0xeb, 0xc1, 0x3e,
+ 0x21, 0x2a, 0xb1, 0x3e, 0xc3, 0x23, 0xb6, 0xbe, 0x10, 0x08, 0xf6, 0xbd,
+ 0x54, 0x07, 0xb2, 0xbe, 0x94, 0x01, 0x3f, 0xbf, 0x25, 0x3e, 0xa8, 0x3e,
+ 0x9c, 0x41, 0xf3, 0x3d, 0x19, 0x31, 0x0e, 0xbe, 0xc9, 0xdb, 0x06, 0xbe,
+ 0x64, 0x53, 0xd5, 0x3b, 0x37, 0x63, 0x91, 0x3d, 0x60, 0x71, 0xed, 0x3d,
+ 0x41, 0x82, 0x5a, 0x3c, 0xf4, 0x99, 0x2a, 0xbd, 0xc1, 0x31, 0xdd, 0x3c,
+ 0x66, 0x7d, 0x60, 0x3d, 0x47, 0x14, 0xf4, 0xbd, 0x29, 0x02, 0x78, 0xbe,
+ 0x6a, 0xe5, 0xc8, 0xbc, 0x92, 0x45, 0x03, 0xbe, 0xf1, 0x32, 0x4f, 0xbe,
+ 0x56, 0x44, 0xf6, 0x3c, 0xee, 0xbe, 0x37, 0xbc, 0xa6, 0x0c, 0x88, 0xbd,
+ 0xf8, 0x20, 0x86, 0x3d, 0xcb, 0x77, 0x67, 0xbd, 0xe1, 0x39, 0x07, 0xbe,
+ 0x1d, 0x9c, 0x08, 0x3d, 0xb1, 0xcf, 0x39, 0xbe, 0x76, 0x78, 0xbc, 0xbd,
+ 0x8a, 0x29, 0x3e, 0xbe, 0xd7, 0xc6, 0x7d, 0xbd, 0x77, 0xe2, 0xba, 0xbc,
+ 0x19, 0x7f, 0xb9, 0xbc, 0x46, 0x3a, 0xe8, 0xbc, 0x4a, 0x16, 0x09, 0x3e,
+ 0x43, 0x28, 0xbf, 0x3d, 0x83, 0xf3, 0x13, 0x3c, 0x4f, 0xe0, 0x15, 0xbe,
+ 0x5a, 0x35, 0x29, 0x3d, 0xe6, 0xd6, 0xb6, 0x3d, 0xc2, 0x16, 0x66, 0xbd,
+ 0x5e, 0x7c, 0xd3, 0x3c, 0x7d, 0x90, 0x01, 0xbe, 0x65, 0x42, 0x85, 0x3c,
+ 0x40, 0xd8, 0xa7, 0xbd, 0xab, 0x88, 0x00, 0xbe, 0x16, 0x1d, 0xd4, 0xbd,
+ 0x1f, 0xb9, 0xb8, 0x3c, 0x83, 0x8d, 0xf6, 0xbd, 0xe8, 0x2f, 0x74, 0x3d,
+ 0x6a, 0x24, 0xdc, 0x3d, 0x2f, 0x27, 0x6b, 0x3d, 0x44, 0x6c, 0x3f, 0xbe,
+ 0x11, 0xb1, 0x68, 0xbd, 0xa8, 0x17, 0xc1, 0xbd, 0x9c, 0x01, 0x71, 0xbd,
+ 0x01, 0x7e, 0x04, 0x3d, 0x9d, 0x78, 0xdd, 0xbd, 0x7a, 0x92, 0xe5, 0xbd,
+ 0xf1, 0x3d, 0x10, 0x3d, 0x21, 0x74, 0xc9, 0x3c, 0x04, 0x6c, 0x11, 0x3e,
+ 0x1c, 0x09, 0x10, 0x3d, 0x0d, 0xf2, 0x83, 0x3d, 0x61, 0xf6, 0x03, 0xbe,
+ 0xf2, 0x52, 0xa0, 0xbc, 0xf0, 0x82, 0xdb, 0x3c, 0x7a, 0x4b, 0xf1, 0xbd,
+ 0x50, 0xbd, 0x37, 0xbd, 0x89, 0x8a, 0x15, 0x3e, 0x3b, 0x22, 0xbb, 0xbd,
+ 0xc6, 0x98, 0xb8, 0x3d, 0x82, 0xf3, 0xe5, 0xbb, 0xa2, 0x34, 0x5a, 0x3c,
+ 0x05, 0x01, 0xfd, 0x3d, 0xf5, 0xc0, 0x09, 0x3e, 0xe1, 0x29, 0xe3, 0x3d,
+ 0xeb, 0x9a, 0x04, 0xbe, 0x03, 0x04, 0xbd, 0xbd, 0x59, 0xa1, 0x85, 0x3c,
+ 0x31, 0x8a, 0x70, 0x3d, 0x89, 0x78, 0xa9, 0xbd, 0x94, 0x3d, 0xbd, 0x3d,
+ 0xb1, 0xff, 0x29, 0xbd, 0xf4, 0x2b, 0x52, 0x3d, 0xfb, 0x61, 0x07, 0xbe,
+ 0xf5, 0x24, 0x7c, 0x3d, 0x5d, 0xb1, 0x36, 0xbd, 0xee, 0x00, 0x9f, 0x3d,
+ 0xa4, 0xf1, 0xf0, 0x3d, 0xbf, 0x55, 0x0a, 0x3c, 0x92, 0xd5, 0xab, 0x3d,
+ 0xa3, 0x2d, 0x5f, 0xbd, 0xbf, 0x93, 0x85, 0x3d, 0xd5, 0x96, 0x08, 0xbe,
+ 0x37, 0x1e, 0xc4, 0x3d, 0xf6, 0x37, 0x9c, 0xbd, 0xcd, 0xcf, 0xcc, 0x3d,
+ 0xef, 0x72, 0x09, 0xbd, 0x07, 0x45, 0x75, 0x3d, 0x92, 0x1d, 0xb8, 0xba,
+ 0x3c, 0x8d, 0x0b, 0x3d, 0xc8, 0x07, 0x0a, 0x3d, 0x57, 0x0c, 0xc6, 0x3b,
+ 0xe6, 0x8d, 0xac, 0xbc, 0x38, 0x30, 0x98, 0x3c, 0xc3, 0x2b, 0x07, 0x3e,
+ 0x08, 0x68, 0xd1, 0x3d, 0x2e, 0x23, 0x3c, 0xbe, 0x39, 0x0c, 0xfc, 0x3c,
+ 0x5b, 0x39, 0xc1, 0x3d, 0x46, 0x84, 0xcb, 0xbd, 0x88, 0x11, 0x87, 0x3c,
+ 0x90, 0xff, 0xd6, 0xbd, 0x1a, 0x7b, 0x0b, 0xbd, 0x41, 0xdc, 0x6b, 0xbc,
+ 0xc6, 0x4c, 0xda, 0xbd, 0xa9, 0xfc, 0x89, 0x3d, 0xf5, 0x04, 0x2a, 0xbd,
+ 0xe1, 0x1f, 0xe1, 0x3c, 0x9d, 0x42, 0x42, 0xbd, 0x85, 0x77, 0xe0, 0x3d,
+ 0x1b, 0xb3, 0x24, 0xbd, 0x95, 0x13, 0xe2, 0x3d, 0x13, 0x7c, 0xcb, 0x3d,
+ 0x05, 0x76, 0xca, 0xb9, 0x44, 0xc9, 0xd2, 0x3d, 0xd5, 0x0c, 0x77, 0x3d,
+ 0xb0, 0x61, 0x10, 0xbe, 0xc6, 0x1c, 0x84, 0xbd, 0xc8, 0x85, 0xd9, 0x3c,
+ 0xf6, 0x02, 0x1f, 0x3e, 0x64, 0x5e, 0x81, 0xbd, 0x39, 0x7d, 0xdd, 0x3d,
+ 0xad, 0xd0, 0x10, 0x3d, 0xc3, 0xc5, 0xd8, 0xbd, 0x9b, 0x89, 0x8b, 0xbd,
+ 0x18, 0x86, 0x14, 0xbe, 0x73, 0x66, 0x00, 0xbe, 0xbd, 0xc5, 0x3c, 0xbd,
+ 0x54, 0xd2, 0xc8, 0xbd, 0x66, 0x9b, 0xe3, 0x3d, 0x1d, 0x2b, 0x44, 0x3e,
+ 0x49, 0xd3, 0xdf, 0x3c, 0xec, 0xd0, 0xbd, 0xbd, 0xac, 0x73, 0x70, 0x3d,
+ 0xc5, 0xd5, 0x6d, 0x3d, 0xe8, 0x1b, 0xe4, 0xbd, 0xf3, 0x61, 0x14, 0xbe,
+ 0x7c, 0x94, 0x59, 0x3e, 0x43, 0x4f, 0x16, 0xbe, 0x7c, 0xe4, 0x03, 0x3d,
+ 0x20, 0x8b, 0x08, 0x3c, 0x20, 0xfb, 0xe4, 0x3b, 0xfd, 0x65, 0x9a, 0x3e,
+ 0x45, 0xd9, 0xe0, 0xbe, 0x27, 0x0c, 0x70, 0xbd, 0x17, 0xd6, 0x32, 0xbe,
+ 0x41, 0x07, 0x7a, 0xbc, 0x95, 0x3f, 0x43, 0xbd, 0x1c, 0xe8, 0xd1, 0x3d,
+ 0xf5, 0xc5, 0x06, 0x3d, 0x83, 0x57, 0x26, 0xbe, 0xdf, 0xe5, 0x08, 0xbe,
+ 0xdb, 0xd9, 0x49, 0xbe, 0x52, 0x24, 0x20, 0xbe, 0x7a, 0x3a, 0x67, 0x3e,
+ 0xf2, 0x74, 0x93, 0xbc, 0x92, 0xad, 0xa5, 0xbe, 0x3b, 0x9b, 0x1b, 0x3e,
+ 0xf3, 0x23, 0x28, 0xbe, 0x38, 0xe3, 0x21, 0xbd, 0x96, 0xb1, 0x1e, 0xbb,
+ 0x9f, 0x09, 0x6a, 0x3e, 0x82, 0xee, 0x6e, 0x3e, 0x56, 0x34, 0xc3, 0xbd,
+ 0x67, 0x2f, 0x9f, 0xbe, 0xde, 0xc5, 0xfa, 0xbd, 0xeb, 0x28, 0x9f, 0xbd,
+ 0x80, 0x78, 0xe1, 0xbd, 0x82, 0xfa, 0x5e, 0xbe, 0x15, 0xfe, 0xd1, 0x3d,
+ 0xe9, 0xa8, 0x50, 0xbe, 0x57, 0x99, 0x0a, 0x3d, 0x62, 0x1e, 0x24, 0xbe,
+ 0xd7, 0xcd, 0xb1, 0x3e, 0x60, 0x70, 0x47, 0xbe, 0xbc, 0x04, 0x1f, 0x3d,
+ 0xfa, 0x95, 0x1d, 0x3d, 0x0f, 0xe9, 0x79, 0xbe, 0x46, 0x79, 0xd1, 0xbd,
+ 0x14, 0x3b, 0x21, 0x3e, 0x8a, 0x89, 0x5d, 0x3e, 0x3b, 0xa4, 0x23, 0xbe,
+ 0xf6, 0x25, 0xc1, 0xbe, 0xd7, 0x64, 0xab, 0x3c, 0x3b, 0x9d, 0x21, 0x3e,
+ 0xf9, 0xcb, 0x8a, 0x3e, 0x08, 0x10, 0xc5, 0x39, 0xf0, 0x93, 0x80, 0x3e,
+ 0xa3, 0x75, 0x0b, 0x3e, 0x26, 0x3b, 0x90, 0x3d, 0x56, 0xe7, 0x3f, 0xbd,
+ 0xf4, 0xc9, 0xa7, 0x3e, 0x4f, 0x5e, 0x0f, 0xbd, 0x40, 0xe0, 0x4b, 0x3e,
+ 0xa3, 0x71, 0x37, 0xbd, 0x2a, 0x1f, 0xf0, 0xbd, 0x23, 0x82, 0x7f, 0xbe,
+ 0x8d, 0x55, 0x68, 0x3e, 0xf8, 0x8c, 0x2d, 0xbe, 0xf3, 0x3e, 0x65, 0xbe,
+ 0xe3, 0x29, 0x22, 0xbe, 0x3c, 0xa4, 0x3c, 0x3e, 0x50, 0x3b, 0x6f, 0xbe,
+ 0xee, 0xb0, 0x97, 0xbd, 0x12, 0x25, 0x53, 0x3e, 0x7d, 0x8b, 0x41, 0x3e,
+ 0xc4, 0x85, 0xa8, 0x3e, 0x47, 0xf5, 0xca, 0xbd, 0x1e, 0xed, 0xa7, 0x3d,
+ 0x04, 0x28, 0x81, 0x3e, 0x7e, 0xfb, 0xb9, 0xbe, 0x91, 0x55, 0xc7, 0xbd,
+ 0xfa, 0x0b, 0x98, 0x3d, 0xcf, 0x5f, 0x80, 0xbd, 0xa6, 0x40, 0x81, 0x3d,
+ 0xd3, 0x73, 0x63, 0x3d, 0x0f, 0xc9, 0xba, 0x3d, 0xe2, 0x88, 0xd0, 0xbe,
+ 0xb5, 0x03, 0x4e, 0x3d, 0xd8, 0x17, 0xd4, 0xbd, 0xaf, 0xef, 0x04, 0x3e,
+ 0xf5, 0x45, 0xfa, 0x3d, 0x47, 0xe9, 0x9c, 0x3d, 0x75, 0x18, 0x6b, 0xbd,
+ 0x55, 0x2d, 0x3a, 0x3e, 0xd2, 0x08, 0x14, 0x3e, 0x07, 0xbd, 0xc4, 0xbe,
+ 0x77, 0x07, 0x13, 0xbd, 0x3a, 0xac, 0x22, 0x3d, 0xd0, 0xc8, 0xd1, 0xbd,
+ 0xa9, 0xd7, 0x4e, 0x3d, 0x48, 0x93, 0x2b, 0xbd, 0x21, 0x1d, 0x8b, 0x3d,
+ 0x10, 0x98, 0xfb, 0x3d, 0x35, 0x70, 0x3f, 0xbd, 0x8c, 0xcf, 0xcb, 0x3d,
+ 0x8f, 0x70, 0x2e, 0xbe, 0x95, 0x33, 0x93, 0xbc, 0xa2, 0xb0, 0xf5, 0x3d,
+ 0xf6, 0xb4, 0x47, 0xbe, 0xf5, 0x09, 0x66, 0xbd, 0x5d, 0x4e, 0x06, 0xbe,
+ 0xc4, 0x06, 0xcf, 0x3c, 0x13, 0x2d, 0xd4, 0x3d, 0xee, 0x36, 0xfc, 0xbd,
+ 0x7e, 0x57, 0x8a, 0x3d, 0x29, 0x17, 0xeb, 0x3d, 0x8d, 0x25, 0x10, 0x3d,
+ 0x87, 0xc7, 0x8a, 0xbd, 0xf2, 0xe1, 0x54, 0xbd, 0x57, 0xf9, 0xed, 0x3d,
+ 0x8a, 0xad, 0x0f, 0xbe, 0x11, 0x92, 0xf7, 0x3d, 0x62, 0x08, 0x76, 0x39,
+ 0x72, 0x4a, 0x0d, 0x3e, 0x3e, 0xa6, 0x03, 0xbe, 0xf0, 0x14, 0x14, 0x3e,
+ 0xd5, 0xd1, 0x1f, 0x3d, 0x36, 0x53, 0x15, 0x3d, 0x6b, 0x0c, 0x1d, 0x3d,
+ 0xff, 0x80, 0x42, 0xbd, 0xb6, 0x68, 0xce, 0x3c, 0x4d, 0x34, 0xca, 0xbc,
+ 0x42, 0xad, 0x0d, 0x3d, 0x7e, 0x38, 0x5f, 0x3d, 0x18, 0x7a, 0x55, 0x3d,
+ 0xb9, 0xca, 0x38, 0x3d, 0xf2, 0xe5, 0x07, 0x3e, 0xa4, 0x40, 0x02, 0x3e,
+ 0xf9, 0xe8, 0xa8, 0x3d, 0xfe, 0xf0, 0x77, 0x3d, 0x95, 0x2e, 0x95, 0x3d,
+ 0xa8, 0xd6, 0x3d, 0xbe, 0x64, 0x6e, 0x75, 0x3e, 0x2d, 0x91, 0x7b, 0x3e,
+ 0xab, 0xc6, 0x77, 0x3d, 0x5d, 0x3c, 0x86, 0xbd, 0x8d, 0xca, 0x45, 0x3e,
+ 0xb0, 0xa0, 0x48, 0xbd, 0x04, 0xd3, 0x96, 0x3d, 0x66, 0xaf, 0x09, 0xbc,
+ 0xa7, 0x73, 0x92, 0xbd, 0xb5, 0x98, 0x50, 0x3e, 0x2d, 0xcd, 0xe3, 0x3d,
+ 0x56, 0xc5, 0xb4, 0x3d, 0x46, 0x9f, 0xf5, 0xbd, 0x22, 0x58, 0xa5, 0x3d,
+ 0x74, 0x3a, 0x20, 0xbe, 0xeb, 0xf9, 0xb3, 0xbc, 0xc3, 0x02, 0x63, 0x3e,
+ 0x26, 0x8a, 0x1d, 0xbb, 0xd3, 0xd6, 0x15, 0x3e, 0x6b, 0x48, 0x3c, 0x3e,
+ 0xb9, 0xb8, 0x25, 0xbe, 0xcf, 0xf8, 0x0e, 0xbd, 0xc2, 0x4d, 0x19, 0x3e,
+ 0xb8, 0xfa, 0x9c, 0xbd, 0x87, 0x96, 0x0c, 0xbe, 0x78, 0x78, 0x29, 0xbe,
+ 0x3f, 0x9f, 0x29, 0xbd, 0xfe, 0x90, 0x84, 0xbd, 0x48, 0xa6, 0xe1, 0xbd,
+ 0xfb, 0x61, 0x02, 0xbe, 0xaf, 0x15, 0xdd, 0x3d, 0xa1, 0xe9, 0x25, 0xbd,
+ 0x50, 0xdb, 0x85, 0x3d, 0xc0, 0x67, 0x4e, 0xbd, 0x5f, 0xcc, 0x28, 0x3d,
+ 0xa7, 0x96, 0xce, 0x3c, 0x6f, 0x07, 0xb0, 0x3c, 0x36, 0x94, 0x15, 0x3e,
+ 0x42, 0x0a, 0x5a, 0xbb, 0x87, 0xd0, 0x9e, 0xbc, 0xec, 0xe7, 0x6f, 0x3e,
+ 0xb1, 0xf9, 0xbb, 0xbd, 0x9d, 0x63, 0x26, 0xbe, 0x99, 0xbc, 0x7c, 0x3d,
+ 0xcb, 0xc0, 0xa0, 0xbc, 0x2d, 0x41, 0x47, 0xbe, 0xd9, 0xbf, 0x16, 0xbe,
+ 0x38, 0x89, 0x54, 0x3d, 0x3f, 0x9f, 0xe6, 0x3c, 0x70, 0xa4, 0xf3, 0xbd,
+ 0xd1, 0xcd, 0x33, 0xbe, 0x49, 0x75, 0x9e, 0xbd, 0xce, 0x7d, 0x8d, 0xbd,
+ 0x7d, 0x28, 0xdf, 0xbd, 0x59, 0x0e, 0x41, 0xbb, 0x93, 0xfb, 0x39, 0x3e,
+ 0x2a, 0xf4, 0x78, 0x3d, 0x5d, 0x22, 0xb4, 0x3c, 0x06, 0x79, 0x27, 0xbe,
+ 0x96, 0xa7, 0x89, 0xbd, 0x82, 0xc1, 0x1a, 0xbe, 0x34, 0x93, 0x45, 0x3e,
+ 0xed, 0xf6, 0x0e, 0xbe, 0xb9, 0x72, 0x72, 0xbd, 0x55, 0x74, 0xa6, 0x3d,
+ 0xe8, 0xf6, 0x65, 0xbd, 0x0a, 0xb4, 0x9f, 0xbd, 0x42, 0x4a, 0x79, 0x3d,
+ 0xcf, 0x30, 0xa5, 0xbc, 0x85, 0xa9, 0x39, 0x3d, 0xf3, 0x76, 0xd2, 0x3d,
+ 0xc4, 0x9b, 0x5a, 0x3c, 0xcd, 0x1e, 0xde, 0x3d, 0x1d, 0x92, 0x8e, 0xbd,
+ 0x9b, 0x75, 0x11, 0xbd, 0xe1, 0xb8, 0x07, 0xbe, 0xe5, 0xc2, 0xf9, 0xbd,
+ 0xdd, 0x3f, 0xb6, 0x3d, 0xf3, 0xd0, 0x36, 0x3d, 0xa9, 0x15, 0x4f, 0xbd,
+ 0x4c, 0xea, 0xa9, 0xbd, 0x2e, 0x9c, 0xef, 0xbd, 0x56, 0x76, 0xb8, 0x3d,
+ 0x91, 0x6a, 0x4f, 0x3c, 0x1d, 0x18, 0xd7, 0x3d, 0x84, 0x44, 0x0d, 0xbe,
+ 0x34, 0x56, 0x82, 0x3d, 0xc9, 0xba, 0xd6, 0x3d, 0x20, 0x97, 0x36, 0x3b,
+ 0xf2, 0xc2, 0x84, 0xbd, 0xaa, 0xb0, 0x08, 0xbe, 0x01, 0x8f, 0x50, 0x3e,
+ 0xa9, 0x48, 0x7b, 0x3d, 0xda, 0x2c, 0x36, 0xbd, 0xe3, 0x56, 0x0e, 0x3c,
+ 0x8b, 0xdc, 0xb0, 0x3d, 0xf1, 0xf8, 0x72, 0xbd, 0x2a, 0x72, 0x28, 0x3d,
+ 0x5c, 0x3a, 0xd1, 0x3d, 0x5f, 0x23, 0xfd, 0xbd, 0xda, 0x22, 0x1c, 0x3e,
+ 0xf1, 0x28, 0x44, 0xbd, 0x28, 0xeb, 0x16, 0xbe, 0x42, 0x5c, 0x81, 0xbc,
+ 0x6b, 0xae, 0x1b, 0x3e, 0x17, 0xf5, 0xa6, 0xbd, 0x42, 0x6c, 0x10, 0xbe,
+ 0x07, 0x42, 0xfa, 0x3c, 0xdb, 0x92, 0x11, 0x3e, 0xc2, 0x43, 0x74, 0xbd,
+ 0x46, 0x76, 0xbc, 0x3d, 0xc3, 0x1f, 0x1c, 0x3e, 0x37, 0x8b, 0x55, 0x3d,
+ 0x23, 0xf3, 0x9b, 0xbd, 0x28, 0x90, 0x46, 0xbd, 0x39, 0x92, 0x92, 0xbd,
+ 0xb3, 0xb5, 0x96, 0xba, 0xde, 0x03, 0x5b, 0x3d, 0xff, 0x89, 0x22, 0x3e,
+ 0xad, 0xf8, 0xd6, 0xbc, 0xc8, 0x3e, 0xf0, 0xbd, 0x58, 0x80, 0x1e, 0x3e,
+ 0x40, 0x2e, 0x01, 0xbe, 0x2d, 0xbb, 0x7b, 0x3d, 0x5e, 0x55, 0xa3, 0x3d,
+ 0x2f, 0x15, 0xbc, 0xbd, 0x1a, 0x64, 0x87, 0x3d, 0x2d, 0x0a, 0x44, 0x3e,
+ 0xa8, 0x45, 0x55, 0xbd, 0xf6, 0x61, 0x04, 0xbd, 0x83, 0x40, 0xc3, 0xbd,
+ 0x03, 0x40, 0x37, 0x3d, 0x97, 0xcf, 0x8f, 0xbd, 0x06, 0x0d, 0xe8, 0x3d,
+ 0x0b, 0xd0, 0x8d, 0x3d, 0x9d, 0x90, 0x68, 0xbd, 0xa2, 0xb8, 0x2f, 0xbc,
+ 0x07, 0xcb, 0x17, 0xbe, 0x06, 0xc0, 0x88, 0x3b, 0x93, 0xf6, 0x05, 0x3e,
+ 0x78, 0x2f, 0x24, 0xbe, 0xb3, 0x84, 0x94, 0x3d, 0x99, 0xfe, 0x11, 0xbc,
+ 0xe0, 0x9a, 0x0b, 0x3e, 0x60, 0xf5, 0x28, 0x3c, 0xb5, 0x39, 0xba, 0x3c,
+ 0x0f, 0x2e, 0x05, 0x3d, 0xc9, 0x75, 0xcc, 0xbd, 0xe0, 0x0a, 0xc0, 0x3d,
+ 0x2f, 0xae, 0xee, 0x3c, 0x28, 0x41, 0x81, 0x3d, 0xa0, 0x99, 0x06, 0xbe,
+ 0x4c, 0x97, 0x22, 0xbe, 0xca, 0x2f, 0xc8, 0xbd, 0x50, 0x18, 0x47, 0x3e,
+ 0x1b, 0x31, 0xd7, 0x3d, 0xdf, 0x3a, 0xcd, 0xbd, 0xbe, 0x88, 0x1b, 0x3e,
+ 0xed, 0xf8, 0x90, 0xbc, 0x54, 0x24, 0x1a, 0xbe, 0xc7, 0x89, 0x10, 0x3d,
+ 0x38, 0x19, 0x6a, 0x3e, 0x39, 0x8f, 0x6d, 0xbe, 0xb6, 0x53, 0xd9, 0x3d,
+ 0xc7, 0x0b, 0x9f, 0x3c, 0x66, 0x70, 0x49, 0xbc, 0x61, 0x4a, 0x58, 0xbc,
+ 0x56, 0xfc, 0xa5, 0xbd, 0x20, 0x50, 0x53, 0xbd, 0xd6, 0x29, 0x8b, 0x3d,
+ 0xa8, 0x8f, 0x42, 0x3c, 0xed, 0xbd, 0x10, 0x3e, 0xd3, 0x59, 0x1e, 0x3e,
+ 0x74, 0x6f, 0xa4, 0x3d, 0xb9, 0x97, 0x73, 0x3c, 0x6c, 0xf5, 0x5f, 0xbe,
+ 0x1d, 0xc4, 0xff, 0xbb, 0x2c, 0x3c, 0x03, 0xbd, 0x7e, 0x22, 0x73, 0x3e,
+ 0x84, 0x7e, 0xfe, 0xbd, 0xac, 0x2a, 0x26, 0xbe, 0x2f, 0xfa, 0xb0, 0xbd,
+ 0x2a, 0x82, 0x56, 0xbe, 0xf9, 0xae, 0x05, 0x3b, 0x0b, 0xec, 0x65, 0x3d,
+ 0x0b, 0x0f, 0x29, 0x3e, 0xd7, 0xb3, 0xb7, 0x3d, 0x7f, 0xa1, 0xc9, 0x3d,
+ 0x7a, 0x30, 0xbc, 0x3e, 0xf3, 0x3f, 0x25, 0x3e, 0x05, 0x7e, 0x6c, 0xbc,
+ 0x1f, 0x9a, 0xc9, 0xbe, 0xfe, 0xde, 0x09, 0xbf, 0x0d, 0x39, 0x75, 0xbe,
+ 0x96, 0x5e, 0x99, 0x3e, 0x26, 0xdc, 0x05, 0x3e, 0x5c, 0x5f, 0xd2, 0x3d,
+ 0xe3, 0xee, 0xb4, 0xbd, 0xd9, 0xa1, 0x9b, 0xbd, 0x4a, 0xd2, 0x8d, 0xbe,
+ 0x21, 0x8e, 0x6f, 0xbe, 0xec, 0xee, 0x84, 0x3d, 0x44, 0x1d, 0x39, 0xbe,
+ 0x19, 0x80, 0x00, 0x3f, 0x56, 0xcc, 0x98, 0x3c, 0xa7, 0x2e, 0x37, 0xbe,
+ 0xeb, 0x1b, 0x9a, 0x3e, 0x59, 0xb3, 0x50, 0xbe, 0x3b, 0x87, 0x42, 0xbe,
+ 0x0b, 0x44, 0xd9, 0x3e, 0x6a, 0xf7, 0x9d, 0xbe, 0x7f, 0x9b, 0x4f, 0x3d,
+ 0x90, 0x2b, 0x08, 0xbd, 0xa2, 0x37, 0x1f, 0xbe, 0x32, 0x24, 0xdb, 0xbe,
+ 0x32, 0x4f, 0x49, 0x3d, 0x9d, 0xa4, 0x91, 0x3e, 0x73, 0x56, 0x11, 0xbe,
+ 0x43, 0x92, 0x80, 0xbe, 0xb8, 0x99, 0xf6, 0xbc, 0x8f, 0x3d, 0xae, 0xbe,
+ 0x5c, 0x07, 0x08, 0x3e, 0x5d, 0x7c, 0x10, 0xbe, 0x17, 0x17, 0x18, 0xbe,
+ 0x60, 0x26, 0x56, 0xbd, 0xd1, 0x46, 0x2f, 0xbe, 0x94, 0x03, 0xbf, 0xbd,
+ 0x09, 0x94, 0x7e, 0x3e, 0x92, 0x27, 0x9d, 0x3e, 0x8c, 0x3a, 0xbe, 0x3e,
+ 0xcd, 0x28, 0xb4, 0x3d, 0x5e, 0x28, 0x3f, 0xbd, 0x91, 0x7a, 0x24, 0x3e,
+ 0xea, 0xf6, 0xdd, 0xbd, 0xda, 0x37, 0x93, 0x3e, 0x6c, 0x2e, 0x50, 0x3b,
+ 0x46, 0x61, 0x0c, 0x3f, 0xf7, 0x77, 0xd3, 0x3d, 0x69, 0xbe, 0xac, 0xbd,
+ 0x00, 0x83, 0x07, 0xbf, 0x99, 0xe8, 0xf7, 0xbd, 0x7a, 0x73, 0x55, 0xbc,
+ 0x45, 0x4f, 0xf1, 0x3e, 0x07, 0x33, 0xb0, 0xbc, 0xee, 0x0a, 0x13, 0xbd,
+ 0x1f, 0x5b, 0x6c, 0xbc, 0x7e, 0x39, 0x84, 0x3d, 0xe9, 0x44, 0xc8, 0xbd,
+ 0xf5, 0x68, 0x1d, 0xbc, 0x9d, 0xe5, 0xdf, 0xbe, 0x65, 0xab, 0xcf, 0xbe,
+ 0xc2, 0x5b, 0xb8, 0xbc, 0xa3, 0x67, 0x75, 0xbd, 0xca, 0x26, 0xbd, 0x3e,
+ 0x5d, 0x55, 0xe0, 0xbe, 0x75, 0xfd, 0x89, 0x3e, 0x3f, 0x10, 0x61, 0x3e,
+ 0x24, 0xd0, 0xe7, 0xbe, 0x88, 0x91, 0xf8, 0x3d, 0x61, 0x92, 0x12, 0x3e,
+ 0xd1, 0xe2, 0xdc, 0xbd, 0xf3, 0xcb, 0x0d, 0xbe, 0xb3, 0x91, 0x6d, 0xbe,
+ 0xb6, 0x27, 0x36, 0xbd, 0xee, 0xdc, 0x1f, 0xbc, 0x94, 0xff, 0x2c, 0x3e,
+ 0x95, 0x43, 0xa5, 0xbe, 0x61, 0x75, 0x29, 0xbe, 0xdc, 0xee, 0xc8, 0x3e,
+ 0xa9, 0xd6, 0x12, 0xbe, 0x72, 0x05, 0x1a, 0xbd, 0x00, 0xed, 0x0c, 0xbe,
+ 0x6f, 0x04, 0x5e, 0x3d, 0x90, 0xdd, 0x80, 0x3b, 0xee, 0x52, 0x29, 0xbd,
+ 0x7d, 0x33, 0x01, 0xbf, 0x5c, 0xe8, 0x07, 0xbd, 0x86, 0x58, 0xb3, 0x3e,
+ 0x0a, 0x88, 0x91, 0xbc, 0xfb, 0x0e, 0x76, 0x3d, 0xbc, 0xe0, 0x22, 0x3e,
+ 0x02, 0x7f, 0xad, 0x3d, 0x49, 0xc7, 0xb1, 0x3c, 0x4e, 0xd6, 0xe7, 0xbe,
+ 0xca, 0xf7, 0x9f, 0x3b, 0x2d, 0x28, 0x43, 0xbd, 0x6d, 0x87, 0x2c, 0xbe,
+ 0xdb, 0x0c, 0x8f, 0x3e, 0x58, 0x8e, 0x61, 0x3d, 0x03, 0x94, 0x26, 0xbd,
+ 0x51, 0x8f, 0x04, 0x3e, 0x39, 0xf0, 0xbc, 0x3b, 0x04, 0x9d, 0xec, 0x3d,
+ 0xec, 0x66, 0xc6, 0xbd, 0xab, 0x67, 0x8d, 0xbd, 0xa0, 0x6c, 0x96, 0x3e,
+ 0xf8, 0xd9, 0xec, 0x3d, 0x69, 0x27, 0x10, 0x3f, 0x16, 0xef, 0xdf, 0x3e,
+ 0x41, 0x51, 0x96, 0x3e, 0x3a, 0x95, 0x54, 0xbe, 0x0b, 0xe1, 0x8a, 0xbd,
+ 0x5d, 0x80, 0xf9, 0xbe, 0x6d, 0xce, 0x06, 0xbf, 0x50, 0x30, 0xc4, 0x3e,
+ 0xd6, 0x7f, 0x22, 0xbd, 0x77, 0x49, 0xdb, 0xbd, 0x4d, 0x25, 0xea, 0x3b,
+ 0x52, 0xca, 0x90, 0x3d, 0x55, 0x33, 0xa5, 0xbd, 0x47, 0xf3, 0xfe, 0x3d,
+ 0xd9, 0xc8, 0x0b, 0x3e, 0xcd, 0x8c, 0xda, 0xbc, 0x55, 0x8e, 0x8b, 0xbd,
+ 0x41, 0x57, 0xe5, 0xbd, 0xa4, 0x49, 0x28, 0xbd, 0xe5, 0xcc, 0xa3, 0xbe,
+ 0x4b, 0xbe, 0x5b, 0xbc, 0x10, 0x09, 0x0e, 0xbe, 0x02, 0xd8, 0x88, 0xbd,
+ 0xd3, 0x28, 0xcb, 0xbd, 0xa9, 0x9c, 0x1a, 0x3d, 0x03, 0xab, 0x70, 0xbd,
+ 0x5a, 0x93, 0x56, 0xbd, 0x94, 0xe1, 0xa7, 0x3c, 0x97, 0x2b, 0x4b, 0xbe,
+ 0xe7, 0x01, 0x3f, 0xbd, 0xa7, 0x05, 0x31, 0xbe, 0xec, 0x88, 0xf7, 0xbd,
+ 0xb8, 0x2f, 0x08, 0xbe, 0x75, 0x3e, 0xc1, 0xbd, 0x19, 0x8a, 0xf4, 0xbd,
+ 0xf2, 0x14, 0x62, 0xbc, 0x87, 0x86, 0x38, 0x3e, 0xd8, 0x5e, 0x72, 0x3d,
+ 0x6e, 0xf4, 0x25, 0x3e, 0x60, 0xc4, 0xbf, 0xbc, 0xa4, 0x4f, 0xe2, 0xbc,
+ 0xbf, 0xe5, 0x01, 0xbd, 0x3f, 0x65, 0xc2, 0x3d, 0xa5, 0x15, 0x1a, 0xbb,
+ 0x38, 0x7a, 0x23, 0x3d, 0x9f, 0x00, 0xc5, 0xbc, 0x0d, 0x9a, 0x17, 0xbe,
+ 0xf0, 0x66, 0x0c, 0xbe, 0x24, 0x5f, 0xe0, 0x3d, 0x6a, 0x3c, 0x84, 0xbd,
+ 0xfd, 0xca, 0x0a, 0x3d, 0x53, 0x13, 0x8d, 0x3d, 0xb6, 0x36, 0x04, 0xbe,
+ 0xcf, 0xc9, 0xdd, 0x3d, 0xf3, 0x52, 0x02, 0xbe, 0x28, 0x6b, 0xe6, 0xbd,
+ 0x6f, 0x67, 0xeb, 0x3d, 0x57, 0x8f, 0x5d, 0xbc, 0xf5, 0x1a, 0x39, 0xbd,
+ 0x85, 0x78, 0xf8, 0xbd, 0x8e, 0xb1, 0x85, 0xbc, 0xab, 0x3f, 0x61, 0x3d,
+ 0x9c, 0xb3, 0x0d, 0x3d, 0xa4, 0x0e, 0x7f, 0xbd, 0xd2, 0x54, 0xe4, 0x3d,
+ 0x9e, 0x9e, 0xcb, 0x3d, 0xc1, 0xa8, 0x95, 0xbd, 0x3e, 0x9c, 0xa2, 0xbd,
+ 0xed, 0x20, 0x7f, 0xbd, 0x41, 0xb7, 0xd2, 0x3d, 0xfb, 0x75, 0xba, 0x3d,
+ 0xd5, 0xcc, 0x12, 0x3c, 0x13, 0x04, 0x1e, 0x3e, 0x47, 0x38, 0x82, 0xbd,
+ 0x61, 0xf0, 0x1d, 0xbd, 0x9c, 0x53, 0xb5, 0xbd, 0xc4, 0x23, 0x66, 0x3c,
+ 0x27, 0xfc, 0xe5, 0x3d, 0xf8, 0x55, 0x39, 0xbd, 0xd6, 0x55, 0x95, 0x3c,
+ 0x7c, 0x17, 0xd1, 0xbd, 0x27, 0xfb, 0x81, 0x3c, 0xdd, 0x7c, 0xf2, 0xbd,
+ 0x38, 0x38, 0xdc, 0xbd, 0xb8, 0x97, 0x10, 0xbe, 0x95, 0xa0, 0x37, 0xbb,
+ 0x19, 0x43, 0xa1, 0x3d, 0x7f, 0x98, 0x1c, 0xbc, 0xbb, 0xdd, 0x86, 0x3d,
+ 0xdb, 0xb2, 0xb0, 0xba, 0xf4, 0xbd, 0x49, 0xbd, 0xcc, 0x09, 0xb1, 0xbd,
+ 0x50, 0x1e, 0xf5, 0xbd, 0x62, 0x39, 0x3e, 0xbc, 0x97, 0xec, 0xc0, 0xbc,
+ 0x29, 0xfd, 0xec, 0x3c, 0x3e, 0xb1, 0x58, 0xbc, 0x72, 0xbd, 0x3e, 0xbd,
+ 0x77, 0x90, 0x02, 0xbd, 0x9c, 0x90, 0x5a, 0x3d, 0x9c, 0xec, 0xcd, 0x3d,
+ 0xfd, 0x0e, 0xf4, 0x3d, 0xff, 0xc4, 0xb6, 0x3d, 0x9f, 0x02, 0xf0, 0x3d,
+ 0x70, 0xfc, 0x25, 0xbe, 0x6d, 0xa9, 0xd8, 0xbc, 0x50, 0x3e, 0x54, 0xbd,
+ 0x0c, 0xa0, 0x8d, 0xbd, 0x55, 0x18, 0x56, 0x3d, 0xbc, 0x89, 0xa1, 0xbd,
+ 0x1e, 0xf2, 0xd6, 0xbd, 0xf3, 0x89, 0x27, 0xbe, 0x5a, 0x59, 0x1a, 0x3e,
+ 0x31, 0x8e, 0x3c, 0x3d, 0x1f, 0x2e, 0xff, 0x3c, 0x8a, 0x29, 0xf9, 0xbd,
+ 0xd6, 0x6c, 0x0e, 0xbe, 0x97, 0x6c, 0x15, 0xbd, 0xab, 0x0f, 0x8f, 0xbd,
+ 0xc2, 0x06, 0x23, 0xbd, 0x97, 0x32, 0x0a, 0xbe, 0x51, 0x19, 0x65, 0xbd,
+ 0x86, 0x67, 0xb3, 0x3d, 0xc3, 0x47, 0xc1, 0x3d, 0xfb, 0xb9, 0x04, 0xbe,
+ 0xa5, 0xe2, 0x70, 0x3c, 0xfc, 0xcc, 0x6f, 0x3d, 0x13, 0x42, 0x1c, 0x3d,
+ 0x01, 0xe5, 0x72, 0xbe, 0xed, 0xe9, 0x06, 0x3e, 0xab, 0x00, 0xbc, 0x3d,
+ 0x45, 0xa6, 0x49, 0xbc, 0x79, 0x1e, 0xa5, 0xbd, 0x2e, 0xc3, 0x72, 0xbd,
+ 0x33, 0x2b, 0xcc, 0x3d, 0x40, 0x66, 0xbe, 0x3d, 0xfb, 0x28, 0x1b, 0x3e,
+ 0x11, 0x7c, 0x3d, 0xbc, 0x9d, 0x5d, 0x21, 0x3e, 0x31, 0xa0, 0xd2, 0xbd,
+ 0xaa, 0x8e, 0x0b, 0x3d, 0x3f, 0x7e, 0x20, 0x3c, 0x7c, 0xd5, 0x32, 0xbe,
+ 0xfb, 0x73, 0xfe, 0xbd, 0xf2, 0xcf, 0xc3, 0x3d, 0x0f, 0xe7, 0x81, 0x3e,
+ 0x3d, 0x14, 0x1e, 0x3e, 0x84, 0xa0, 0x8d, 0x3d, 0x4b, 0xcd, 0xf8, 0x3c,
+ 0xed, 0xf3, 0x24, 0x3d, 0x11, 0x91, 0x4a, 0x3d, 0x5a, 0xa4, 0x88, 0x3c,
+ 0xa6, 0x2e, 0x59, 0x3e, 0xf4, 0x74, 0x25, 0xbd, 0x40, 0x44, 0x3b, 0xbd,
+ 0x67, 0x66, 0x98, 0xbc, 0x1f, 0x86, 0xb9, 0xbd, 0xe4, 0xba, 0xb0, 0x3e,
+ 0x14, 0x15, 0xb2, 0xbe, 0x26, 0x68, 0x9c, 0xbd, 0x32, 0x88, 0xb2, 0xbd,
+ 0x27, 0x04, 0x61, 0xbc, 0x07, 0x5f, 0x8e, 0xbd, 0x9a, 0xc9, 0x94, 0xbd,
+ 0x81, 0x31, 0xe9, 0xba, 0xff, 0x81, 0x42, 0xbe, 0xa7, 0xec, 0xb1, 0xbe,
+ 0xea, 0xc0, 0xba, 0xbd, 0xce, 0x2f, 0x7a, 0x3d, 0x6e, 0x2b, 0x7d, 0x3e,
+ 0xcd, 0xd8, 0xa6, 0x3d, 0x65, 0x42, 0x84, 0xbd, 0x59, 0xcb, 0x6c, 0xbd,
+ 0x39, 0xe8, 0x8a, 0xbd, 0x4d, 0xda, 0x2c, 0x3d, 0xd3, 0x23, 0xc8, 0x3b,
+ 0xc7, 0x6e, 0x1f, 0x3e, 0x5a, 0x1a, 0xbe, 0x3e, 0x26, 0x08, 0x01, 0xbe,
+ 0xed, 0x62, 0x93, 0xbe, 0xe0, 0xf3, 0x0d, 0xbe, 0x7a, 0xb1, 0x27, 0xbd,
+ 0x3e, 0xb8, 0xbc, 0x3c, 0x22, 0xe5, 0x2f, 0xbe, 0xe5, 0xf6, 0xfc, 0xbd,
+ 0xf5, 0xad, 0x70, 0xbe, 0xa2, 0x20, 0x81, 0x3e, 0xc4, 0xe7, 0x33, 0xbe,
+ 0x40, 0x3d, 0x76, 0x3e, 0x10, 0x1d, 0x1d, 0x3d, 0x1c, 0x42, 0xa6, 0xbd,
+ 0x91, 0xa9, 0x3c, 0x3e, 0x43, 0xf6, 0x79, 0xbe, 0x2a, 0xcc, 0x07, 0xbe,
+ 0x86, 0x33, 0x23, 0x3e, 0xb6, 0xdd, 0xd7, 0x3d, 0x5c, 0x74, 0xa5, 0xbd,
+ 0x58, 0x7b, 0x9b, 0xbe, 0xaa, 0x63, 0xfb, 0xbd, 0x46, 0x4c, 0x88, 0x3e,
+ 0x19, 0x71, 0xbd, 0x3e, 0xec, 0x49, 0x47, 0xbd, 0x34, 0x09, 0x07, 0x3d,
+ 0xe9, 0x44, 0x87, 0x3d, 0x13, 0x93, 0x5c, 0x3e, 0x3b, 0xbd, 0xe8, 0x3d,
+ 0x33, 0xab, 0x24, 0x3e, 0x68, 0xa0, 0x0a, 0x3e, 0x65, 0x53, 0xab, 0x3d,
+ 0x2f, 0xab, 0xdf, 0x3c, 0xaa, 0x3a, 0xc7, 0xbd, 0x71, 0xb3, 0x75, 0xbe,
+ 0xc5, 0xa0, 0x11, 0x3e, 0xe8, 0x08, 0x47, 0xbe, 0xb1, 0xed, 0x6b, 0xbe,
+ 0xdb, 0x54, 0x1f, 0xbe, 0x3b, 0xe0, 0x90, 0x3d, 0xa4, 0x23, 0xbd, 0xbd,
+ 0xee, 0x3f, 0xbf, 0xbd, 0xcf, 0x23, 0x88, 0x3e, 0xc5, 0x5d, 0x4c, 0x3e,
+ 0x41, 0x96, 0x67, 0x3e, 0x31, 0x4d, 0x8c, 0xbd, 0x32, 0xd6, 0xaa, 0x3d,
+ 0x69, 0xf9, 0x85, 0x3e, 0xd6, 0xc6, 0x93, 0xbe, 0x29, 0xcb, 0x9b, 0xbe,
+ 0x18, 0x7f, 0x1e, 0x3d, 0x06, 0x12, 0x86, 0x3c, 0xc2, 0x79, 0x1f, 0x3e,
+ 0xee, 0xdc, 0xc7, 0xbd, 0x6e, 0x5e, 0x46, 0xbd, 0xa9, 0xdc, 0x4c, 0xbe,
+ 0x42, 0xf2, 0x0b, 0xbd, 0x4d, 0xf7, 0xd5, 0xbc, 0x22, 0x69, 0xa7, 0x3d,
+ 0x2a, 0x5c, 0x6a, 0x3c, 0x50, 0xdc, 0x50, 0x3e, 0x0b, 0xe9, 0x51, 0xbd,
+ 0x41, 0x27, 0x89, 0x3d, 0x94, 0x97, 0x0c, 0x3d, 0xef, 0x0a, 0x5d, 0xbe,
+ 0xfc, 0xf5, 0x87, 0x3c, 0x61, 0x43, 0x06, 0x3e, 0x1b, 0x92, 0x02, 0xbd,
+ 0x3b, 0x71, 0x08, 0x3e, 0x05, 0xe9, 0xcf, 0xbd, 0x8c, 0x12, 0x4c, 0x3b,
+ 0x3e, 0x7f, 0xf7, 0xbd, 0xd6, 0x63, 0x0c, 0x3e, 0x57, 0x96, 0x08, 0x3e,
+ 0x23, 0xe8, 0xd6, 0xbd, 0xc3, 0x00, 0xa0, 0xbd, 0xf1, 0x56, 0x85, 0xbd,
+ 0x99, 0x3b, 0xc1, 0xbc, 0x42, 0xad, 0xef, 0x3d, 0x7c, 0xe3, 0x0f, 0xbe,
+ 0x24, 0x74, 0xc9, 0x3d, 0x3b, 0x07, 0xa6, 0xbd, 0xb7, 0x77, 0xc1, 0xbd,
+ 0xae, 0xa9, 0x2f, 0xbd, 0x34, 0xcb, 0x07, 0xbe, 0x96, 0x4e, 0x71, 0x3d,
+ 0x1b, 0x14, 0xd1, 0x3d, 0x3d, 0xfe, 0x27, 0x3e, 0x97, 0x11, 0x69, 0x3c,
+ 0x93, 0x5a, 0xc0, 0xbd, 0x29, 0x93, 0xb9, 0xbd, 0x99, 0x73, 0x06, 0xbe,
+ 0x72, 0x3d, 0x66, 0x3d, 0xe8, 0x01, 0x8f, 0xbd, 0x6c, 0x3d, 0xd9, 0x3d,
+ 0xc0, 0x34, 0xe9, 0xba, 0xe9, 0x22, 0x51, 0xbe, 0x9d, 0x5f, 0xdf, 0x3d,
+ 0x0c, 0xce, 0x26, 0x3e, 0xad, 0x60, 0x0b, 0x3e, 0x37, 0xb9, 0xd3, 0x3d,
+ 0x10, 0x13, 0xa5, 0xbd, 0xff, 0x78, 0x83, 0x3d, 0x07, 0xb5, 0x85, 0xbd,
+ 0x0d, 0xa0, 0x19, 0x3d, 0xef, 0x07, 0xec, 0xba, 0x72, 0x2f, 0xa5, 0xbd,
+ 0xb3, 0x89, 0xf2, 0x3d, 0x7b, 0x76, 0xdf, 0x3c, 0x80, 0x1f, 0xbf, 0x3b,
+ 0xa8, 0x87, 0xab, 0x3d, 0x36, 0xc9, 0x4f, 0x3e, 0xdb, 0x4f, 0xcd, 0x3d,
+ 0xea, 0xa4, 0x38, 0x3d, 0x67, 0xc5, 0xbf, 0x3d, 0x81, 0xed, 0x3f, 0x3d,
+ 0xb3, 0x85, 0xaa, 0x3d, 0xaf, 0x56, 0xbb, 0xbc, 0x95, 0x79, 0x5d, 0xbb,
+ 0xc1, 0x0d, 0xdd, 0xbd, 0x11, 0x57, 0x25, 0x3e, 0x66, 0x35, 0xf4, 0x3d,
+ 0xc9, 0xe6, 0x35, 0xbe, 0x6b, 0x35, 0x82, 0x3d, 0x53, 0x81, 0xec, 0x3d,
+ 0xe9, 0x8d, 0xd4, 0x3d, 0x04, 0xa1, 0x33, 0xbb, 0x5d, 0xa9, 0x81, 0x3e,
+ 0xf9, 0xbf, 0xfe, 0x3d, 0xef, 0x6b, 0xc6, 0xba, 0x62, 0x20, 0xeb, 0x3d,
+ 0x7f, 0xe5, 0x93, 0x3b, 0x85, 0x38, 0x0c, 0x3e, 0xad, 0x9f, 0xfd, 0x3d,
+ 0x56, 0xcc, 0xc5, 0xbd, 0x81, 0x44, 0x14, 0x3c, 0x91, 0x8c, 0x64, 0x3c,
+ 0x1a, 0x33, 0x52, 0x3b, 0x0c, 0x98, 0x38, 0xbd, 0x6b, 0x54, 0xd3, 0xbb,
+ 0x68, 0x8b, 0x13, 0xbe, 0xd1, 0x95, 0xb1, 0x3d, 0x85, 0xbd, 0x10, 0xbe,
+ 0x04, 0xff, 0x8f, 0x3c, 0x8e, 0xee, 0xa6, 0x3d, 0x6e, 0x2b, 0x2a, 0x3d,
+ 0xa9, 0x9b, 0x44, 0xbe, 0x1e, 0x23, 0x8f, 0xbd, 0xe7, 0x21, 0x62, 0x3d,
+ 0xe4, 0x7e, 0x31, 0x3d, 0x7e, 0x3d, 0x24, 0x3e, 0xb1, 0x57, 0x21, 0x3e,
+ 0x41, 0x5b, 0x93, 0x3d, 0x0d, 0x81, 0x40, 0x3d, 0x9d, 0xe0, 0xd5, 0x3d,
+ 0x27, 0x49, 0xc5, 0x3d, 0x9c, 0x72, 0xf9, 0xbd, 0x1f, 0x6a, 0xcf, 0xbd,
+ 0xcf, 0xda, 0x32, 0xbe, 0xf3, 0xdd, 0x1f, 0xbe, 0x6f, 0xa3, 0xce, 0xbd,
+ 0x48, 0xbd, 0x57, 0xbe, 0x83, 0x73, 0x07, 0xbe, 0xd9, 0x34, 0x4c, 0xbc,
+ 0x3e, 0x5e, 0x09, 0xbe, 0xa6, 0xcd, 0x65, 0x3d, 0xce, 0xec, 0x68, 0x3e,
+ 0x92, 0x3f, 0x20, 0xbd, 0xb9, 0xd4, 0x83, 0x3c, 0x8e, 0x78, 0x12, 0xbc,
+ 0x36, 0xdc, 0xef, 0xbd, 0xe2, 0xc3, 0xbf, 0xbb, 0x7c, 0x4a, 0x83, 0x3d,
+ 0x65, 0x6a, 0x13, 0xbe, 0xf2, 0x76, 0x3e, 0xbe, 0x36, 0x2d, 0x57, 0x3b,
+ 0x1c, 0x84, 0xd9, 0xbd, 0xda, 0x09, 0x81, 0x3d, 0xe8, 0x2c, 0xc6, 0x3c,
+ 0xa5, 0x52, 0x30, 0x3d, 0x4b, 0x26, 0x01, 0xbd, 0x2d, 0x9d, 0x1f, 0x3e,
+ 0x2e, 0x83, 0xaa, 0x3c, 0x19, 0x23, 0x9e, 0x3d, 0x88, 0x84, 0x8f, 0x3d,
+ 0xcf, 0xbb, 0x93, 0xbd, 0xee, 0xfe, 0x4d, 0xbd, 0x59, 0x38, 0xc8, 0xbd,
+ 0xca, 0xd8, 0xa2, 0x3d, 0x08, 0xf9, 0x48, 0x3d, 0x4f, 0xb8, 0x86, 0x3d,
+ 0x56, 0x27, 0x31, 0xbe, 0xbb, 0xd5, 0x13, 0xbe, 0x10, 0xc5, 0x6d, 0xbc,
+ 0x52, 0xc4, 0x80, 0x3c, 0xbf, 0x21, 0x84, 0x3d, 0xf6, 0xc7, 0x7f, 0xbd,
+ 0x0e, 0x20, 0x95, 0xbd, 0xf8, 0x97, 0x03, 0x3e, 0xbb, 0x8a, 0xbd, 0xbd,
+ 0x90, 0x83, 0xf0, 0x3d, 0x97, 0xdf, 0xcf, 0x3c, 0x53, 0xc6, 0x09, 0x3d,
+ 0x75, 0x51, 0x56, 0x3c, 0x00, 0x5b, 0xa9, 0x3c, 0x2c, 0xad, 0xf4, 0x3a,
+ 0x7d, 0x94, 0xa5, 0xbd, 0xc7, 0x34, 0xbf, 0xbd, 0xfe, 0xc5, 0xdc, 0xbb,
+ 0x32, 0x73, 0x16, 0xbd, 0x48, 0x08, 0xd5, 0x3d, 0x72, 0xea, 0x3d, 0x3e,
+ 0xc2, 0x6e, 0xfd, 0x3d, 0x10, 0x86, 0x49, 0x3d, 0x44, 0x9b, 0x87, 0xbd,
+ 0x2e, 0xe1, 0x34, 0xbd, 0x3c, 0xee, 0xcc, 0xbd, 0x1b, 0xe3, 0x27, 0xbd,
+ 0xdb, 0xed, 0x73, 0xbd, 0x5a, 0xb1, 0x2f, 0x3e, 0xe3, 0x11, 0x43, 0xbd,
+ 0xd0, 0xb4, 0x0b, 0x3e, 0xe9, 0x2b, 0xb3, 0x3c, 0x84, 0x5c, 0x7b, 0x3d,
+ 0x25, 0x55, 0xa3, 0x3d, 0x96, 0xba, 0x10, 0xbe, 0x57, 0xa8, 0xf5, 0xbd,
+ 0xbc, 0xdc, 0xaf, 0xbd, 0x52, 0x50, 0x4e, 0x3e, 0x21, 0x07, 0xaa, 0x3c,
+ 0xed, 0xc7, 0x00, 0x3e, 0xc7, 0x99, 0xa7, 0x3d, 0x9c, 0xd9, 0xa7, 0x3c,
+ 0xe1, 0x30, 0x1d, 0xbe, 0x2f, 0x47, 0x80, 0x3d, 0xa2, 0xa4, 0x7b, 0xbd,
+ 0x51, 0x8f, 0x4a, 0xbd, 0x5a, 0xea, 0x38, 0x3d, 0x54, 0x33, 0x2e, 0x3e,
+ 0x66, 0xb2, 0x87, 0xbc, 0xd6, 0x0a, 0x02, 0xbc, 0x34, 0x3c, 0xb1, 0x3d,
+ 0x5f, 0xdc, 0xb4, 0x3d, 0x3d, 0x3e, 0xd2, 0xbd, 0x9c, 0x2b, 0x92, 0x3c,
+ 0xec, 0xe6, 0xb9, 0xbd, 0x43, 0xe1, 0x62, 0x3d, 0xb4, 0x73, 0x3b, 0x3e,
+ 0x30, 0x9f, 0x2c, 0xba, 0xe0, 0x85, 0x07, 0x3d, 0x5e, 0xe4, 0x3c, 0x3e,
+ 0xe3, 0xd1, 0x10, 0xbe, 0xfe, 0x00, 0x18, 0xbe, 0x6c, 0xfd, 0xa9, 0xbd,
+ 0x5b, 0xc2, 0x08, 0x3e, 0x46, 0xd6, 0x5b, 0xbc, 0x6f, 0xfa, 0xdc, 0xbc,
+ 0xf7, 0xe7, 0x57, 0xbd, 0x69, 0x86, 0xac, 0x3d, 0xd1, 0xd0, 0x07, 0xbe,
+ 0xe5, 0xaf, 0x93, 0x3d, 0x69, 0x63, 0x1b, 0x3e, 0xb4, 0xb6, 0xe9, 0xbc,
+ 0xd1, 0x21, 0x22, 0xbe, 0x3d, 0x23, 0xed, 0x3d, 0xff, 0xb5, 0x67, 0xbd,
+ 0xa6, 0x95, 0xad, 0x3d, 0xbe, 0xdc, 0xa8, 0xbc, 0x19, 0x5d, 0x2b, 0x3e,
+ 0xa5, 0x32, 0x99, 0xbc, 0xb7, 0xf5, 0xfb, 0xbd, 0x07, 0x37, 0x29, 0x3d,
+ 0xbf, 0x47, 0x75, 0x3d, 0xe3, 0xa9, 0x81, 0xbe, 0xb3, 0xef, 0xfc, 0xbd,
+ 0x4a, 0x72, 0xf1, 0x3c, 0x50, 0xe0, 0x8c, 0x3d, 0x0d, 0x7d, 0x23, 0xbe,
+ 0x3c, 0x23, 0x2e, 0xbe, 0xed, 0x60, 0x62, 0x3d, 0x09, 0x23, 0x37, 0xbe,
+ 0x2f, 0x5e, 0x55, 0xbd, 0x92, 0x6b, 0xe5, 0x3c, 0x5e, 0x06, 0x93, 0x3c,
+ 0x90, 0xc1, 0x40, 0x3d, 0x11, 0x39, 0x43, 0x3d, 0x54, 0x0c, 0x5a, 0xbe,
+ 0xac, 0xc6, 0xe8, 0xbd, 0x03, 0x45, 0xd3, 0x3c, 0x53, 0x14, 0x6f, 0x3d,
+ 0x46, 0x44, 0x10, 0xbe, 0xb4, 0x4d, 0x0f, 0xbe, 0x36, 0xc5, 0x10, 0xbe,
+ 0x3c, 0x5d, 0x37, 0xbe, 0x77, 0x64, 0x69, 0xbd, 0xfc, 0x57, 0x0f, 0x3e,
+ 0xd2, 0x68, 0x24, 0x3e, 0x6c, 0x33, 0xfc, 0x3a, 0xd6, 0xf4, 0x0e, 0xbd,
+ 0xa9, 0x06, 0x75, 0x3e, 0x3a, 0xa0, 0xd4, 0x3b, 0x99, 0x93, 0x49, 0xbd,
+ 0x8e, 0x38, 0xa1, 0xbe, 0x2c, 0x70, 0xdc, 0xbe, 0xea, 0x46, 0xd2, 0xbd,
+ 0xef, 0xce, 0xc1, 0x3e, 0x52, 0xed, 0x47, 0x3e, 0x36, 0xb7, 0x97, 0x3e,
+ 0xcb, 0x66, 0x9d, 0xbd, 0xb2, 0x29, 0xc7, 0xbd, 0x49, 0x21, 0x3a, 0xbe,
+ 0xca, 0xcb, 0x4e, 0xbd, 0x59, 0x31, 0x50, 0xbe, 0xd8, 0x50, 0x16, 0x3d,
+ 0x9c, 0x6c, 0x2d, 0x3e, 0x4b, 0x79, 0x14, 0xbe, 0x71, 0xd6, 0x9d, 0xbe,
+ 0x1e, 0x62, 0x2f, 0x3e, 0x2b, 0x0a, 0x5f, 0xbd, 0xea, 0xdd, 0xdb, 0xbe,
+ 0xe2, 0xc3, 0x65, 0x3d, 0x93, 0x95, 0x65, 0xbe, 0xe6, 0xcd, 0xe3, 0x3d,
+ 0xba, 0x0d, 0xbb, 0xbd, 0xd0, 0x8b, 0xf5, 0xbd, 0x43, 0x3f, 0xcc, 0xbe,
+ 0xa5, 0xe7, 0x90, 0x3d, 0xc0, 0x66, 0x80, 0x3e, 0x36, 0x4f, 0xba, 0xbd,
+ 0x2f, 0xfa, 0x43, 0x3e, 0xa1, 0x09, 0x1a, 0xbd, 0x74, 0x6b, 0x15, 0xbe,
+ 0xdb, 0xf5, 0x5d, 0x3d, 0x1a, 0x41, 0x13, 0xbe, 0x62, 0x1f, 0x93, 0xbd,
+ 0x0f, 0xae, 0x2d, 0xbc, 0x22, 0x1a, 0x66, 0xbe, 0x65, 0x18, 0xec, 0xbc,
+ 0xf0, 0x92, 0xd8, 0xbd, 0xe4, 0x23, 0xdb, 0xbd, 0xaf, 0xf0, 0x45, 0x3e,
+ 0x19, 0xe0, 0x55, 0x3e, 0x34, 0x80, 0xbf, 0xbd, 0x76, 0xa0, 0x2e, 0xbd,
+ 0x57, 0x62, 0xb7, 0xbd, 0xd0, 0xd8, 0x50, 0x3e, 0x9c, 0xc1, 0xe4, 0x3d,
+ 0x63, 0x01, 0x12, 0x3c, 0x56, 0x97, 0xd8, 0xbd, 0x7c, 0xc2, 0x4e, 0x3e,
+ 0xf1, 0xa2, 0x77, 0xbe, 0xad, 0x52, 0x00, 0xbe, 0x7f, 0x92, 0x5f, 0xbd,
+ 0x52, 0x22, 0x84, 0x3e, 0xc9, 0xd1, 0x4a, 0x3c, 0xa5, 0x71, 0x96, 0x3e,
+ 0xfa, 0x11, 0x1a, 0x3e, 0xf4, 0x69, 0xee, 0xbd, 0x83, 0xb9, 0x2e, 0xbe,
+ 0x9f, 0xf3, 0x54, 0xbd, 0x15, 0x49, 0x09, 0xbe, 0xad, 0x51, 0x08, 0xbf,
+ 0x50, 0x59, 0xda, 0x3d, 0x64, 0x16, 0x65, 0xbe, 0xf9, 0x24, 0x0a, 0x3e,
+ 0xde, 0x88, 0x09, 0xbe, 0x65, 0xbc, 0x2b, 0x3d, 0x95, 0xba, 0xb0, 0x3d,
+ 0x21, 0x66, 0x03, 0xbe, 0x5e, 0xc1, 0x0f, 0x3e, 0xc3, 0x17, 0xaa, 0x3e,
+ 0xb4, 0x8c, 0x33, 0x3e, 0x0a, 0x74, 0xaf, 0xbc, 0x61, 0x56, 0xff, 0x3d,
+ 0xfb, 0xa4, 0x24, 0x3e, 0x76, 0x3a, 0xd5, 0xbd, 0xce, 0x1a, 0x2a, 0x3e,
+ 0xbf, 0xe6, 0xba, 0xbe, 0x94, 0xe4, 0x99, 0xbd, 0x02, 0xf2, 0xf9, 0xbd,
+ 0x53, 0x97, 0x84, 0xbe, 0x18, 0x73, 0x8a, 0xbd, 0x1d, 0x01, 0x88, 0x3e,
+ 0x04, 0xe0, 0x3c, 0xbd, 0xa6, 0x75, 0x8d, 0xbd, 0x70, 0x61, 0x88, 0xbe,
+ 0xc6, 0x76, 0x3a, 0x3d, 0x6a, 0xbe, 0x7f, 0x3d, 0x32, 0x71, 0x8a, 0x3d,
+ 0x0f, 0xd6, 0x69, 0x3e, 0xc2, 0x37, 0xf4, 0xbd, 0xfe, 0xd8, 0x70, 0xbe,
+ 0x1a, 0x15, 0xb5, 0x3e, 0x67, 0xd6, 0x3c, 0x3d, 0xaa, 0x99, 0x85, 0xbe,
+ 0x69, 0xa6, 0x79, 0xbc, 0x4f, 0x2d, 0x59, 0x3e, 0x8a, 0x00, 0xb0, 0xbe,
+ 0x77, 0xf6, 0x6b, 0xbd, 0xb2, 0x17, 0x86, 0xbd, 0xb6, 0x48, 0x53, 0x3e,
+ 0x9a, 0xa7, 0x0a, 0xbe, 0xe3, 0x86, 0x92, 0xbc, 0x37, 0xa4, 0xaa, 0xbd,
+ 0xcb, 0xc6, 0xca, 0xbd, 0xe3, 0x08, 0x82, 0x3d, 0xee, 0x29, 0x13, 0x3e,
+ 0xe2, 0x32, 0xb6, 0x3d, 0x54, 0x4c, 0xe1, 0x3d, 0x51, 0x91, 0xa9, 0x3e,
+ 0x39, 0xc6, 0x8c, 0x3e, 0xd7, 0x85, 0x48, 0x3d, 0xb8, 0x51, 0x90, 0xbd,
+ 0xab, 0x3c, 0x21, 0xbe, 0xa5, 0x93, 0x9d, 0xbe, 0xa8, 0xd9, 0x82, 0x3c,
+ 0xf2, 0x0f, 0xe1, 0xbd, 0x0a, 0xc1, 0x36, 0xbe, 0xa1, 0x9c, 0x6f, 0x3c,
+ 0x4e, 0x6f, 0xd3, 0xbd, 0x43, 0x9c, 0x59, 0x3b, 0xf7, 0xef, 0x95, 0xbc,
+ 0x06, 0x50, 0xd1, 0xbb, 0xde, 0x9b, 0x00, 0x3e, 0x93, 0xe2, 0x9f, 0xbc,
+ 0x54, 0x1f, 0x20, 0xbb, 0xf9, 0xd3, 0xc4, 0x3d, 0x01, 0x62, 0x8f, 0xbe,
+ 0x51, 0x1a, 0x04, 0x3e, 0xe8, 0x19, 0x11, 0x3d, 0x09, 0xa8, 0xeb, 0xbd,
+ 0x74, 0xb4, 0x89, 0xbd, 0xd7, 0xf9, 0x12, 0xbe, 0x1f, 0xfd, 0xd8, 0x3c,
+ 0xe7, 0xda, 0xb7, 0xbd, 0xfd, 0xae, 0x8f, 0x3d, 0xc1, 0xe3, 0xe8, 0xbd,
+ 0x61, 0x03, 0xb7, 0x3c, 0x3b, 0x8f, 0x58, 0xbe, 0x64, 0x2f, 0xf9, 0xbd,
+ 0x26, 0x23, 0xf7, 0xbd, 0xeb, 0xeb, 0x0b, 0xbe, 0xa4, 0x50, 0x68, 0x3d,
+ 0x25, 0x1a, 0x96, 0x3d, 0x44, 0x68, 0x39, 0x3e, 0x74, 0xf8, 0xe1, 0x3d,
+ 0xb0, 0x6e, 0xce, 0xbd, 0x75, 0x13, 0x86, 0x3d, 0xa7, 0xb3, 0x8e, 0x3d,
+ 0x0f, 0x4b, 0xd9, 0x3d, 0x5e, 0xca, 0xf0, 0x3b, 0x19, 0x29, 0x45, 0xbe,
+ 0x07, 0x68, 0x1b, 0xbe, 0xc9, 0x27, 0x22, 0xbd, 0xa7, 0x59, 0xe9, 0x3c,
+ 0xda, 0xdf, 0x24, 0xbd, 0x42, 0xa0, 0xd3, 0x3c, 0x5e, 0x94, 0xcd, 0x3d,
+ 0x14, 0xc2, 0xa3, 0xbc, 0x4e, 0x50, 0x60, 0x3c, 0x69, 0xe2, 0x09, 0xbe,
+ 0x51, 0x6c, 0xaa, 0xbd, 0xe8, 0x8e, 0x1b, 0xbe, 0xd0, 0x40, 0x4f, 0x3d,
+ 0xce, 0xe0, 0xb8, 0x3d, 0xe1, 0x97, 0x90, 0xbd, 0xcf, 0xc8, 0x30, 0xbd,
+ 0x43, 0x0a, 0xe1, 0x3d, 0x91, 0x29, 0x8b, 0x3d, 0xbc, 0xf0, 0x03, 0x3d,
+ 0x97, 0xf8, 0x9a, 0x3d, 0x89, 0xb0, 0x18, 0xbe, 0xeb, 0xaa, 0x17, 0x3e,
+ 0xec, 0x19, 0x00, 0x3c, 0x64, 0x0c, 0x8d, 0x3d, 0x0a, 0x96, 0x95, 0xbd,
+ 0xc5, 0xc9, 0x6c, 0x3d, 0xe9, 0xf6, 0x14, 0xbd, 0xb3, 0xf0, 0x42, 0x3c,
+ 0xad, 0x61, 0xeb, 0x3d, 0xbd, 0xd7, 0xa2, 0xba, 0xb5, 0x98, 0x4b, 0xbd,
+ 0x74, 0x0f, 0x12, 0x3e, 0x54, 0x39, 0x59, 0xbc, 0xda, 0xf9, 0x18, 0x3c,
+ 0x78, 0x0f, 0xd3, 0xbd, 0x38, 0xa3, 0xfa, 0x3d, 0x10, 0xc4, 0xf7, 0x3d,
+ 0xad, 0xfc, 0x9a, 0x3d, 0x8f, 0x84, 0x53, 0xbd, 0x1d, 0x4e, 0x35, 0x3c,
+ 0x12, 0xa4, 0xd9, 0xbd, 0x0b, 0x6c, 0xaf, 0xbd, 0x45, 0xba, 0x60, 0x3d,
+ 0x81, 0x32, 0x1a, 0xbc, 0x35, 0x67, 0x3e, 0xbd, 0x90, 0xbd, 0x4a, 0xbd,
+ 0x22, 0x74, 0xee, 0xbc, 0x56, 0xc3, 0xde, 0xbd, 0xb5, 0x51, 0xdf, 0xbb,
+ 0xf0, 0xea, 0x83, 0xbd, 0x8a, 0xd9, 0x1d, 0xba, 0xdc, 0x42, 0xeb, 0xbd,
+ 0xd2, 0xf7, 0x53, 0xbd, 0xe1, 0x93, 0x91, 0x3d, 0x6c, 0xfb, 0x9e, 0xbd,
+ 0x31, 0x8b, 0x9b, 0xbd, 0x28, 0xd2, 0x95, 0xbb, 0xfc, 0xa9, 0x9a, 0xbd,
+ 0x62, 0x22, 0xf5, 0x3d, 0x77, 0xda, 0x6a, 0xbd, 0x28, 0xf2, 0x80, 0x3d,
+ 0x1d, 0xa1, 0x7b, 0xbd, 0x60, 0x69, 0x33, 0xbd, 0x57, 0xbc, 0x57, 0x3c,
+ 0xc6, 0x30, 0xeb, 0x3d, 0xc6, 0xb1, 0x1f, 0xbe, 0x00, 0x94, 0xbb, 0x3d,
+ 0xd1, 0x3d, 0xf3, 0xbd, 0x5e, 0x07, 0xa0, 0xbd, 0x7f, 0x9a, 0xf7, 0x3d,
+ 0xb9, 0x0d, 0x38, 0x3e, 0xc9, 0xda, 0x89, 0x3d, 0x98, 0xbf, 0xe2, 0x3c,
+ 0xc4, 0xec, 0x10, 0xbd, 0x52, 0x14, 0xdc, 0x3d, 0xf0, 0x85, 0x6a, 0x3d,
+ 0xe1, 0x7c, 0xcd, 0x3d, 0x14, 0x30, 0x00, 0x3e, 0x47, 0xe4, 0xeb, 0x3c,
+ 0x58, 0xc3, 0xe1, 0x3d, 0xe4, 0x6a, 0xab, 0x3d, 0xf5, 0x31, 0xff, 0x3d,
+ 0x06, 0xee, 0xa6, 0xbb, 0x88, 0xd2, 0x91, 0xba, 0x39, 0x97, 0x3b, 0x3e,
+ 0xdb, 0x77, 0x59, 0xbe, 0x17, 0x63, 0x48, 0xbb, 0xad, 0x4b, 0x61, 0x3d,
+ 0x8c, 0xb5, 0x21, 0xbe, 0x08, 0x84, 0x80, 0xbd, 0xad, 0xc6, 0x98, 0xbd,
+ 0xf4, 0xec, 0x64, 0x3e, 0x8e, 0x94, 0xc0, 0x3c, 0x83, 0xbe, 0x95, 0xbd,
+ 0x80, 0xb0, 0x51, 0x3b, 0x04, 0x9e, 0x82, 0xbd, 0x7c, 0x13, 0x9e, 0x3b,
+ 0x8e, 0x7b, 0x15, 0x39, 0x66, 0x87, 0x9a, 0xbd, 0x06, 0x86, 0x0c, 0xbe,
+ 0x24, 0xb6, 0x82, 0xbe, 0x55, 0x54, 0x5a, 0x3e, 0x02, 0xb7, 0xf3, 0x3a,
+ 0x31, 0xba, 0x20, 0x3e, 0x16, 0x40, 0xeb, 0xbd, 0x92, 0x19, 0xba, 0x3d,
+ 0x82, 0xd0, 0xe7, 0x3d, 0x06, 0xef, 0x7e, 0xbd, 0xa7, 0xf4, 0xd4, 0xbc,
+ 0x0d, 0x51, 0x0a, 0x3e, 0x9d, 0x61, 0x13, 0xbe, 0x73, 0xeb, 0x4b, 0x3e,
+ 0xc8, 0x64, 0xb4, 0xbc, 0x93, 0x8d, 0xaa, 0xbd, 0xd7, 0x1a, 0x31, 0x3e,
+ 0x20, 0x22, 0x59, 0xbe, 0x55, 0x18, 0xc3, 0x3c, 0x46, 0xc8, 0x4d, 0xbe,
+ 0xfb, 0x8a, 0x8a, 0x3c, 0xdf, 0xcc, 0x09, 0xbd, 0xea, 0x56, 0x00, 0xbe,
+ 0x99, 0x92, 0xd6, 0xbd, 0x15, 0x79, 0x85, 0xbe, 0x49, 0x16, 0x69, 0xbe,
+ 0x39, 0x0a, 0x3f, 0xbe, 0xee, 0x6a, 0xd5, 0xbd, 0xeb, 0x8b, 0xe4, 0x3d,
+ 0x32, 0x6b, 0x83, 0xbc, 0x50, 0x73, 0x2c, 0xbe, 0x7c, 0x73, 0xe3, 0xbc,
+ 0xbd, 0xc2, 0x80, 0xbe, 0x7c, 0x18, 0x2a, 0xbe, 0x49, 0xa4, 0xff, 0xbd,
+ 0xb7, 0x45, 0x62, 0x3e, 0x93, 0xc5, 0x37, 0x3e, 0x55, 0x64, 0x05, 0xbe,
+ 0xae, 0x97, 0x1f, 0xbe, 0x54, 0x4e, 0xb8, 0xbd, 0xc9, 0xb5, 0x81, 0xbb,
+ 0x8b, 0x69, 0x60, 0x3d, 0x5e, 0x64, 0x1c, 0xbe, 0x72, 0x68, 0x9e, 0x3c,
+ 0xf4, 0x4c, 0x9a, 0x3c, 0x02, 0xe9, 0x17, 0x3e, 0x4c, 0x07, 0xd3, 0x3c,
+ 0x8e, 0xcc, 0x5a, 0x3e, 0x22, 0xc4, 0xd8, 0xbc, 0x9d, 0xae, 0x00, 0x3e,
+ 0xc9, 0xf7, 0xf8, 0x3d, 0x04, 0x69, 0x13, 0xbd, 0x7e, 0xe4, 0xb5, 0xbd,
+ 0x14, 0x5b, 0x4b, 0x3e, 0x7e, 0x8c, 0xca, 0x3d, 0x6a, 0x73, 0x84, 0xbe,
+ 0x49, 0xf7, 0x7c, 0xbe, 0xf9, 0x7a, 0x93, 0x3d, 0x14, 0x37, 0x89, 0x3d,
+ 0x09, 0xdd, 0x38, 0x3e, 0xdc, 0xf3, 0xec, 0xbd, 0x53, 0xf8, 0x2f, 0xbc,
+ 0x6f, 0x15, 0x0c, 0x3e, 0x40, 0x40, 0xb3, 0x3d, 0xe0, 0x21, 0xa0, 0x3c,
+ 0x0e, 0x21, 0x95, 0x3e, 0x9b, 0xee, 0xd8, 0x3d, 0x23, 0xf7, 0x92, 0xbd,
+ 0xfb, 0x9c, 0xe3, 0xbd, 0x88, 0xf1, 0x78, 0xbe, 0x89, 0x7a, 0x88, 0xbe,
+ 0x69, 0x10, 0x55, 0x3e, 0xcd, 0xf2, 0x87, 0xbd, 0xe6, 0x18, 0x0e, 0xbd,
+ 0x1d, 0x04, 0x92, 0xbe, 0x1f, 0x78, 0x9e, 0x3d, 0x28, 0x97, 0xad, 0xbd,
+ 0xee, 0x3c, 0x86, 0xba, 0x7d, 0x98, 0x85, 0x3e, 0x1d, 0xef, 0x02, 0x3e,
+ 0x54, 0x41, 0x18, 0x3e, 0xe0, 0x01, 0x9b, 0x3c, 0x7c, 0x29, 0xa4, 0x3d,
+ 0x3c, 0x08, 0xc1, 0x3d, 0x68, 0x6d, 0xa1, 0xbe, 0xfb, 0x12, 0x7e, 0xbe,
+ 0x3a, 0xd8, 0x6a, 0x3d, 0xcb, 0x50, 0x5a, 0x3c, 0xbc, 0x6e, 0x34, 0x3e,
+ 0xaf, 0x7a, 0x09, 0x3d, 0x7d, 0x9a, 0xa1, 0x3c, 0x44, 0x07, 0xad, 0xbe,
+ 0xee, 0x94, 0x3c, 0xbc, 0xf0, 0x55, 0x74, 0xbd, 0x68, 0xf2, 0xea, 0x3d,
+ 0x41, 0x15, 0xd3, 0x3d, 0xe2, 0x77, 0x92, 0x3e, 0xd3, 0xc7, 0x32, 0x3d,
+ 0x17, 0xea, 0x5e, 0x3e, 0xdf, 0x33, 0x15, 0xbc, 0xde, 0x44, 0x98, 0xbe,
+ 0xc6, 0x69, 0x0e, 0x3e, 0x6a, 0x67, 0xf2, 0x3d, 0xd5, 0x68, 0x34, 0x3e,
+ 0x97, 0x96, 0x39, 0x3d, 0x81, 0x59, 0xa0, 0xbc, 0x87, 0x62, 0xb6, 0x3d,
+ 0x65, 0x05, 0xea, 0x3c, 0x28, 0x54, 0x3f, 0xbd, 0x74, 0xa7, 0x1f, 0x3e,
+ 0xba, 0x09, 0x24, 0xbe, 0x5b, 0xff, 0x2e, 0xbb, 0xf9, 0x3e, 0xb5, 0xbd,
+ 0xbf, 0x72, 0x80, 0x3b, 0x67, 0xb8, 0x01, 0x3e, 0x16, 0xd6, 0x3b, 0x3c,
+ 0x97, 0x77, 0x4e, 0xbb, 0x61, 0xf6, 0x03, 0x3e, 0x79, 0x43, 0x58, 0x3d,
+ 0x09, 0x8a, 0x57, 0xbd, 0xeb, 0x0a, 0xd1, 0x3d, 0xd2, 0x2a, 0x07, 0x3e,
+ 0x0b, 0x3e, 0xc9, 0xbd, 0x78, 0x1b, 0x1a, 0xbe, 0x8b, 0xcf, 0xda, 0x3d,
+ 0xc6, 0x5d, 0xbd, 0xbd, 0x32, 0x7b, 0x04, 0xbe, 0x19, 0x55, 0x28, 0xbe,
+ 0x46, 0xea, 0x7e, 0x3d, 0xea, 0x59, 0x42, 0xbe, 0xea, 0x86, 0x45, 0x3b,
+ 0xd8, 0x5c, 0x43, 0x3d, 0x70, 0xb6, 0x01, 0x3d, 0xed, 0x97, 0x2d, 0x3e,
+ 0xd1, 0x5b, 0x1f, 0x3d, 0x30, 0x31, 0x02, 0x3c, 0x9d, 0xdd, 0xe2, 0xbc,
+ 0x22, 0xcc, 0x84, 0x3d, 0x11, 0x9a, 0xa5, 0x3c, 0xcf, 0x9f, 0x0c, 0xbe,
+ 0xb3, 0xe9, 0x99, 0x3d, 0x14, 0x1c, 0x1c, 0x3e, 0xac, 0x5b, 0xc7, 0xbd,
+ 0xa3, 0x50, 0xb7, 0x3c, 0x7a, 0x27, 0x59, 0x3d, 0x7a, 0x96, 0x03, 0xbe,
+ 0xe3, 0x8f, 0xa4, 0x3d, 0x93, 0xc8, 0x1c, 0x3d, 0x7b, 0x7f, 0x97, 0x3d,
+ 0x63, 0x03, 0xf8, 0xbd, 0x19, 0xd7, 0x97, 0xbd, 0x15, 0x10, 0x0b, 0x3d,
+ 0x9f, 0x6b, 0x0c, 0xbe, 0x90, 0x24, 0x83, 0x3d, 0x0f, 0x12, 0x54, 0x3d,
+ 0x1e, 0x67, 0x82, 0xbd, 0xb4, 0xb6, 0x54, 0x3e, 0x18, 0x09, 0x67, 0xbd,
+ 0x04, 0x47, 0xd6, 0xbc, 0x57, 0x1e, 0x4f, 0xbe, 0xda, 0x5a, 0x76, 0xbd,
+ 0x8b, 0xbb, 0xc4, 0x3c, 0xe0, 0x6e, 0x3c, 0xbd, 0xd6, 0x01, 0x11, 0x3e,
+ 0x71, 0x7a, 0xe5, 0x3d, 0x64, 0x99, 0x3f, 0x3c, 0xca, 0xea, 0x7e, 0x3d,
+ 0xf8, 0x2d, 0xdb, 0xbd, 0xf7, 0xfa, 0x1a, 0x3c, 0xf7, 0xa9, 0xd1, 0x3c,
+ 0xf9, 0x49, 0xec, 0xbc, 0xd7, 0xed, 0xd4, 0xbd, 0xb2, 0x18, 0xc3, 0x3d,
+ 0xbc, 0x06, 0x30, 0x3e, 0x0e, 0xd6, 0x5e, 0xbc, 0x3f, 0x38, 0xe8, 0x3d,
+ 0xa9, 0x33, 0x0c, 0xbd, 0xde, 0x14, 0x93, 0x3d, 0x28, 0x32, 0x5d, 0xbd,
+ 0x2e, 0xc3, 0xdf, 0x3c, 0xfe, 0xf9, 0x26, 0x3d, 0x7e, 0x3a, 0x5a, 0xbe,
+ 0xdf, 0xbf, 0x9f, 0xbd, 0x19, 0x68, 0x2d, 0x3d, 0x1e, 0x5a, 0x20, 0x3e,
+ 0x85, 0x60, 0xa4, 0x3d, 0x43, 0x9e, 0x0a, 0xbd, 0x1a, 0x09, 0xe6, 0xbc,
+ 0xe1, 0x9f, 0x47, 0xbd, 0xef, 0xb5, 0x1b, 0xbe, 0x28, 0xa9, 0x23, 0xbc,
+ 0x4a, 0x09, 0x2c, 0xbd, 0x12, 0xa8, 0x29, 0xbd, 0xe2, 0x37, 0x98, 0x3b,
+ 0x6d, 0xe0, 0x50, 0x3d, 0xa6, 0xb3, 0x9a, 0xbd, 0x58, 0x67, 0x94, 0x3d,
+ 0xf5, 0x1c, 0x1d, 0xbe, 0x86, 0x62, 0x7a, 0x3b, 0x16, 0x48, 0xd4, 0xbc,
+ 0xd7, 0xe6, 0x17, 0xbe, 0xa7, 0x50, 0xf8, 0xbd, 0xe7, 0x0b, 0x55, 0x3e,
+ 0xb6, 0xa2, 0xcb, 0x3d, 0xce, 0x4b, 0xaa, 0xbd, 0xf0, 0x4b, 0x47, 0xbe,
+ 0x43, 0xa8, 0x43, 0xbe, 0xe2, 0x65, 0x93, 0x3d, 0x1c, 0xa6, 0xef, 0x3d,
+ 0x62, 0x8f, 0x02, 0xbe, 0x7c, 0x63, 0xac, 0xbd, 0x32, 0xd4, 0x03, 0xbe,
+ 0x4c, 0x2c, 0x51, 0xbe, 0x3f, 0xb2, 0xb0, 0x3d, 0xaf, 0x78, 0x2c, 0x3e,
+ 0xf1, 0xaf, 0x06, 0xbe, 0x70, 0x0e, 0x6c, 0x3b, 0xd8, 0x7c, 0x04, 0x3d,
+ 0x7c, 0xd6, 0xd0, 0x3d, 0x33, 0x9c, 0x8c, 0xbb, 0x3d, 0x3a, 0x9f, 0x3d,
+ 0xef, 0x75, 0x20, 0x3d, 0xc9, 0xb4, 0x16, 0xbe, 0xba, 0x2d, 0x70, 0x3d,
+ 0xba, 0xfb, 0xcc, 0x3b, 0x70, 0xc6, 0x06, 0xbe, 0x8e, 0x56, 0xb9, 0x3d,
+ 0x01, 0xab, 0x96, 0xbc, 0x5a, 0xdd, 0xcb, 0xbd, 0xb0, 0xc8, 0x0e, 0xbd,
+ 0xdd, 0x9d, 0xae, 0xbd, 0xb2, 0xdf, 0x7d, 0xbd, 0xfa, 0x8e, 0x88, 0xbc,
+ 0xf6, 0x6f, 0x79, 0x3c, 0x7d, 0xb0, 0xba, 0xbd, 0x6c, 0x3f, 0xeb, 0x3d,
+ 0x8a, 0x4b, 0x8c, 0x3d, 0xb2, 0x52, 0xdd, 0x3c, 0xc6, 0xf9, 0x8d, 0x3c,
+ 0x81, 0x04, 0xb9, 0xbd, 0x56, 0x6e, 0x2d, 0xbe, 0x4f, 0x90, 0xb5, 0x3d,
+ 0x92, 0xff, 0x78, 0x3d, 0x3f, 0x19, 0x07, 0xbe, 0xc3, 0x14, 0x2f, 0xbe,
+ 0x8f, 0x87, 0xae, 0x3d, 0xfc, 0xd7, 0xc1, 0xbb, 0x6c, 0x0b, 0x11, 0x3e,
+ 0xe4, 0x54, 0x0b, 0x3e, 0x73, 0x90, 0x65, 0xbd, 0xb0, 0x46, 0xe1, 0xbc,
+ 0x33, 0x31, 0xe7, 0x3d, 0x36, 0x37, 0xc1, 0x3d, 0x8d, 0xc8, 0x3a, 0xbc,
+ 0x79, 0x03, 0x32, 0xbe, 0x99, 0x87, 0x88, 0xbd, 0x38, 0xfc, 0xdd, 0xbd,
+ 0x42, 0x21, 0x85, 0xbb, 0x78, 0xe6, 0x17, 0x3e, 0xe7, 0x5c, 0x5a, 0xbd,
+ 0x29, 0x20, 0x40, 0x3d, 0xec, 0xab, 0x26, 0xbd, 0xd4, 0xd5, 0x28, 0x3d,
+ 0x73, 0x48, 0x34, 0xbd, 0xf8, 0x06, 0x6c, 0x3e, 0x8b, 0xda, 0x0a, 0xbe,
+ 0x36, 0x53, 0x5a, 0x3d, 0x52, 0x00, 0x90, 0xbd, 0x4b, 0x92, 0x29, 0x3e,
+ 0xdb, 0x51, 0x9e, 0x3c, 0x14, 0xda, 0x48, 0xbd, 0x3b, 0x96, 0x99, 0x3c,
+ 0x45, 0x2d, 0x5c, 0xbd, 0xeb, 0x39, 0xe4, 0x3d, 0x8b, 0x36, 0x77, 0x3d,
+ 0x6f, 0xba, 0x33, 0xbe, 0xd3, 0x36, 0x16, 0xbe, 0xb1, 0xa0, 0xb1, 0x3c,
+ 0xbd, 0x14, 0xcc, 0xbc, 0xfd, 0xd0, 0xdb, 0x3d, 0xb6, 0x95, 0x27, 0x3e,
+ 0x99, 0x55, 0x8b, 0x3d, 0xa9, 0x99, 0x1a, 0xbe, 0x07, 0x7a, 0x06, 0x3e,
+ 0xf2, 0x32, 0xb8, 0x3d, 0xa2, 0xc4, 0x8d, 0x3d, 0xe3, 0xc7, 0xfa, 0x3d,
+ 0xfb, 0xe7, 0x1c, 0xbd, 0x07, 0x3e, 0x75, 0xbe, 0x67, 0x5c, 0x00, 0xbe,
+ 0x22, 0x6f, 0x30, 0x3e, 0xd1, 0x27, 0x50, 0x3c, 0x59, 0xe3, 0x55, 0xbd,
+ 0xa7, 0x4e, 0x9e, 0xbd, 0xb9, 0x3d, 0xae, 0xbd, 0xf5, 0x2c, 0x5f, 0xbe,
+ 0x88, 0xc6, 0xa3, 0xbc, 0x96, 0x33, 0x64, 0x3d, 0x66, 0xd7, 0x22, 0x3c,
+ 0xcf, 0x6d, 0x3e, 0xbe, 0xd7, 0x1c, 0xae, 0xbd, 0xc0, 0xaf, 0x48, 0x3e,
+ 0xf4, 0x1a, 0x80, 0x3d, 0x99, 0x10, 0x5e, 0xbd, 0x48, 0x08, 0x15, 0xbd,
+ 0x4b, 0xb8, 0xf1, 0xbd, 0xc1, 0xc8, 0x1f, 0x3b, 0xdb, 0x3e, 0x7e, 0xbd,
+ 0xbe, 0xbc, 0x6b, 0xbd, 0xf2, 0x90, 0x58, 0xbe, 0x9a, 0xec, 0x0d, 0x3e,
+ 0x94, 0x87, 0x97, 0xbd, 0x7f, 0xaa, 0x84, 0xbd, 0x9f, 0xa5, 0x76, 0x3d,
+ 0x3c, 0x32, 0x40, 0xbb, 0x85, 0x65, 0xa8, 0x3b, 0xb8, 0xd3, 0xea, 0xbd,
+ 0xc3, 0x0b, 0x75, 0xbb, 0x6f, 0x6f, 0x4f, 0x3d, 0x7e, 0xad, 0xe6, 0x3d,
+ 0x5c, 0x14, 0xf8, 0x3c, 0x75, 0xa9, 0xc1, 0x3b, 0xc0, 0xa2, 0xe6, 0xbd,
+ 0x53, 0x03, 0x2e, 0xbe, 0x3a, 0x5f, 0x32, 0xbd, 0x55, 0x2d, 0x26, 0x3e,
+ 0x7a, 0xba, 0x97, 0x3d, 0x79, 0xbf, 0x09, 0xbe, 0x7a, 0x73, 0xe0, 0xbd,
+ 0x1a, 0x22, 0x79, 0xbe, 0x80, 0x40, 0x07, 0x37, 0x67, 0x08, 0x2d, 0x3e,
+ 0xa5, 0x92, 0x86, 0x3c, 0xc5, 0xb0, 0xcb, 0xbd, 0xf6, 0xae, 0xd6, 0xbd,
+ 0xb4, 0xff, 0x22, 0x3e, 0x15, 0x69, 0x0e, 0xbe, 0x70, 0xef, 0xf7, 0x3b,
+ 0xa8, 0x09, 0x22, 0x3d, 0x46, 0xe3, 0xe7, 0xbe, 0x4d, 0x59, 0xa0, 0xbe,
+ 0xed, 0x00, 0xce, 0x3d, 0x32, 0x42, 0xa4, 0x3d, 0xaf, 0x38, 0xe6, 0x3e,
+ 0x7e, 0x16, 0x74, 0xbd, 0xb8, 0x8d, 0x0b, 0xbd, 0x57, 0x9d, 0xad, 0xbe,
+ 0xdb, 0xb1, 0xd5, 0xbd, 0x14, 0x61, 0x0b, 0xbe, 0xf3, 0x4a, 0x43, 0x3d,
+ 0x0b, 0x48, 0xa1, 0x3e, 0x19, 0xca, 0x59, 0xbd, 0x85, 0x05, 0xac, 0xbd,
+ 0x36, 0xe3, 0x49, 0x3d, 0xd1, 0x28, 0x18, 0x3e, 0x20, 0x7c, 0x0e, 0xbf,
+ 0xfa, 0xbb, 0x1b, 0x3d, 0x25, 0x4a, 0xc4, 0xbe, 0x9a, 0xee, 0xea, 0x3c,
+ 0x61, 0xcd, 0x9c, 0xbd, 0xa5, 0xbd, 0x0a, 0xbe, 0x5d, 0x23, 0xb3, 0xbe,
+ 0x96, 0x9e, 0x33, 0x3e, 0x93, 0xd7, 0x5f, 0x3d, 0xda, 0x8a, 0x00, 0xbf,
+ 0x2d, 0x0f, 0x8b, 0xbe, 0x8c, 0x91, 0x8d, 0xbe, 0xe6, 0x82, 0x09, 0xbe,
+ 0x09, 0xc9, 0x2b, 0x3e, 0x98, 0x50, 0x78, 0xbe, 0xd2, 0xda, 0x98, 0x3d,
+ 0xf1, 0x42, 0xba, 0xbd, 0x36, 0x30, 0x55, 0x3c, 0x5c, 0x87, 0xb4, 0x3d,
+ 0x39, 0x6f, 0x33, 0x3d, 0xb7, 0x61, 0x2a, 0xbe, 0x54, 0x59, 0xcf, 0x3d,
+ 0x7b, 0x34, 0x9a, 0x3e, 0xf5, 0x9e, 0x9a, 0xbd, 0x3f, 0xc8, 0xb6, 0x3d,
+ 0x8e, 0xc1, 0x0e, 0xbd, 0x0f, 0x8b, 0xd7, 0x3e, 0xb9, 0x75, 0x60, 0x3e,
+ 0xb3, 0xa3, 0x8d, 0xbc, 0x22, 0x3e, 0xbd, 0xbd, 0x54, 0xae, 0xf5, 0x3e,
+ 0x14, 0xa2, 0x43, 0xbe, 0x92, 0x4e, 0xc7, 0x3c, 0xde, 0xb9, 0xb3, 0x3d,
+ 0xf6, 0xe2, 0xb8, 0x3b, 0x94, 0x5d, 0xab, 0xbd, 0x07, 0x14, 0x9b, 0x3c,
+ 0x35, 0xa4, 0x86, 0x3e, 0x57, 0x17, 0xa1, 0x3d, 0xf0, 0x7a, 0x10, 0xbe,
+ 0x0a, 0x12, 0xd6, 0x3d, 0x8f, 0x1e, 0x83, 0xbe, 0xb7, 0xf9, 0xb7, 0xbd,
+ 0x55, 0x22, 0x94, 0xbd, 0x99, 0x9c, 0x6b, 0xbe, 0xa5, 0x36, 0x9a, 0x3d,
+ 0xac, 0xb3, 0x66, 0xbe, 0x22, 0x78, 0x83, 0x3e, 0xb0, 0xf0, 0xba, 0x3d,
+ 0x51, 0x8d, 0x99, 0xbc, 0xdb, 0x16, 0xcd, 0xbd, 0x62, 0x56, 0xa0, 0x3e,
+ 0x14, 0x8a, 0x80, 0x3e, 0xf0, 0xb5, 0xee, 0x3d, 0xdc, 0x89, 0x1e, 0x3e,
+ 0x1f, 0xad, 0xa1, 0xbe, 0x2a, 0xd5, 0xce, 0x3d, 0x73, 0xdd, 0xa8, 0xbd,
+ 0xd8, 0x8e, 0xa7, 0xbe, 0x09, 0x24, 0x9a, 0x3e, 0xa1, 0x2a, 0xa6, 0xbe,
+ 0x5e, 0xd7, 0x90, 0xbb, 0x50, 0x48, 0x42, 0x3d, 0xca, 0x0f, 0xc4, 0x3e,
+ 0xe5, 0x85, 0xff, 0xbd, 0xd5, 0x92, 0x69, 0xbe, 0xcf, 0x21, 0x9d, 0x3d,
+ 0x26, 0xd9, 0x46, 0x3e, 0x24, 0x8d, 0x87, 0xbd, 0x7e, 0x9b, 0xcd, 0x3d,
+ 0x2f, 0x19, 0xd9, 0x3e, 0xac, 0xc7, 0x0a, 0xbe, 0x2f, 0x7b, 0x31, 0xbc,
+ 0x2e, 0xca, 0xa3, 0x3e, 0xdd, 0xf7, 0x61, 0xbd, 0x84, 0x40, 0x03, 0xbf,
+ 0x11, 0x32, 0xfe, 0xbb, 0xad, 0x8f, 0xf9, 0xbd, 0xcd, 0x9f, 0x4b, 0xbe,
+ 0x4f, 0x2e, 0x71, 0x3e, 0xe1, 0x66, 0x81, 0x3d, 0xd9, 0x03, 0x0d, 0x3e,
+ 0xc0, 0x0c, 0x98, 0xbd, 0xcd, 0x03, 0xee, 0x3d, 0xde, 0xc0, 0x04, 0xbf,
+ 0xc1, 0xf8, 0xb8, 0xbe, 0x42, 0x52, 0x40, 0xbd, 0xbd, 0x70, 0x14, 0xbe,
+ 0x91, 0x55, 0xa9, 0xbb, 0xc5, 0xa8, 0x61, 0x3e, 0x46, 0xbc, 0xa1, 0x3e,
+ 0x67, 0x36, 0x42, 0x3d, 0x07, 0xb9, 0x88, 0x3d, 0x02, 0x9c, 0x05, 0xbe,
+ 0x2b, 0x17, 0x85, 0xbd, 0x74, 0x24, 0x6b, 0xbe, 0xeb, 0x9f, 0x26, 0x3e,
+ 0xd3, 0x58, 0xd5, 0x3d, 0x15, 0x49, 0x3d, 0xbe, 0xf4, 0xbd, 0x53, 0xbd,
+ 0x05, 0xa1, 0xea, 0xbd, 0xb6, 0x0b, 0xb6, 0xbd, 0x15, 0x9d, 0x7c, 0xbd,
+ 0x13, 0xaa, 0xc5, 0xbd, 0x54, 0xa7, 0x3d, 0xbe, 0x39, 0x31, 0xd9, 0xbd,
+ 0xe9, 0x8b, 0x93, 0x3d, 0x7c, 0xde, 0xcd, 0x3c, 0xd6, 0x4e, 0x9d, 0xbe,
+ 0x69, 0xf1, 0x9d, 0xbc, 0xfd, 0xdc, 0xde, 0x3d, 0xd4, 0xf2, 0x7a, 0xbd,
+ 0x2b, 0xb0, 0xa3, 0xbd, 0xb8, 0xb4, 0x90, 0xbd, 0x18, 0x40, 0xa1, 0x3d,
+ 0xc0, 0x23, 0xd6, 0xbd, 0xbd, 0x87, 0x2d, 0xbd, 0xbf, 0xac, 0xfc, 0xbd,
+ 0x7e, 0x1f, 0x8a, 0x3c, 0x71, 0x50, 0x56, 0xbd, 0xf8, 0xca, 0x9c, 0x3d,
+ 0x09, 0x70, 0x2b, 0xbd, 0xc2, 0x7f, 0xff, 0xbc, 0x1e, 0xfe, 0xab, 0x3d,
+ 0x80, 0x5e, 0xa9, 0x3c, 0x9e, 0xc1, 0x85, 0x3c, 0xf8, 0x4b, 0x31, 0x3d,
+ 0x99, 0xaf, 0x90, 0x3d, 0xdb, 0x29, 0x81, 0xbd, 0xb8, 0xcf, 0x12, 0xbe,
+ 0x69, 0xf6, 0xc2, 0x3c, 0x84, 0xde, 0xfa, 0x3d, 0x8b, 0x99, 0x04, 0xbe,
+ 0xc3, 0x9b, 0x19, 0xbd, 0x5e, 0x32, 0x7b, 0x3d, 0xfe, 0x49, 0xea, 0xbd,
+ 0x5d, 0x9b, 0x86, 0x3d, 0xb1, 0x63, 0x27, 0xbe, 0x5a, 0x64, 0xd3, 0xbd,
+ 0xf3, 0x92, 0x49, 0x3d, 0xdd, 0x14, 0x5c, 0x3d, 0xdd, 0x9c, 0xde, 0xbd,
+ 0xe7, 0x92, 0x29, 0x3d, 0x85, 0xf6, 0x2a, 0xbd, 0x0e, 0xb7, 0x80, 0xbe,
+ 0xb4, 0x83, 0x8c, 0xbd, 0x0b, 0x92, 0xf2, 0x3d, 0xa9, 0x7e, 0x27, 0xbc,
+ 0x30, 0x82, 0x29, 0xbd, 0xbb, 0xf5, 0x8f, 0xbb, 0xcd, 0xb3, 0x5a, 0xbc,
+ 0x75, 0x10, 0x84, 0x3d, 0x05, 0x5a, 0xd5, 0xba, 0xde, 0x0b, 0x47, 0x3d,
+ 0x75, 0xaa, 0xe0, 0x3b, 0x37, 0xdf, 0xf9, 0x3d, 0x55, 0x34, 0x16, 0xbc,
+ 0x09, 0x0d, 0x6a, 0xbd, 0x24, 0x1f, 0xfc, 0x3d, 0x29, 0xc2, 0x8a, 0xbd,
+ 0x56, 0x69, 0xc1, 0x3d, 0xfa, 0x91, 0x17, 0xbd, 0xd7, 0x79, 0x30, 0xba,
+ 0x31, 0x58, 0xc9, 0xbd, 0x84, 0x83, 0xd0, 0xbb, 0xe5, 0x0d, 0x44, 0xbd,
+ 0xcf, 0x8c, 0x78, 0x3d, 0x10, 0xd3, 0xa9, 0xbe, 0x24, 0x5c, 0x03, 0x3e,
+ 0xa4, 0x22, 0xec, 0x3b, 0x39, 0xfb, 0x2e, 0x3c, 0x52, 0xda, 0x84, 0x3d,
+ 0x91, 0xb8, 0x3a, 0xbe, 0x1a, 0x5d, 0x31, 0xbd, 0x34, 0xe8, 0xf3, 0xbd,
+ 0xcf, 0xc3, 0x81, 0x3d, 0x21, 0x58, 0x5a, 0x3d, 0x96, 0x92, 0x94, 0xba,
+ 0xbc, 0x0a, 0x1f, 0x3e, 0xe2, 0x1b, 0x15, 0xbe, 0x9e, 0x2c, 0x5a, 0xbd,
+ 0x6d, 0x58, 0x95, 0x3d, 0xdb, 0x95, 0xfc, 0xbd, 0xe0, 0x1b, 0x37, 0xbe,
+ 0x32, 0x6e, 0x92, 0x3d, 0xc3, 0x1d, 0x7b, 0xbb, 0x2a, 0xe2, 0x3d, 0x3d,
+ 0xa5, 0x60, 0x17, 0xbe, 0xea, 0xec, 0x38, 0x3e, 0x61, 0xbe, 0xf1, 0x3d,
+ 0xa9, 0xf8, 0x8b, 0x3d, 0x6a, 0x20, 0x07, 0xbe, 0x80, 0x10, 0x9a, 0xbc,
+ 0x3c, 0x89, 0x1e, 0x3d, 0x4a, 0x51, 0x16, 0x3d, 0x75, 0xb8, 0xf9, 0x3c,
+ 0x27, 0xa9, 0xb0, 0x3d, 0x3c, 0x49, 0xab, 0x3d, 0x28, 0x54, 0xe0, 0xbd,
+ 0xe4, 0xee, 0x96, 0xbd, 0x30, 0x78, 0x05, 0xbe, 0xfe, 0x15, 0x4b, 0x3e,
+ 0x10, 0xfe, 0xca, 0x3d, 0x3f, 0x0a, 0xcf, 0x3d, 0x26, 0xdc, 0x1a, 0x3d,
+ 0x5e, 0x00, 0x7b, 0xbc, 0x18, 0xfc, 0x88, 0x3d, 0x03, 0x10, 0x56, 0xbd,
+ 0x53, 0xb0, 0x72, 0x3d, 0xb9, 0x34, 0xc0, 0xbd, 0x0e, 0x07, 0xca, 0xbd,
+ 0x53, 0xfd, 0x0e, 0xbe, 0xbc, 0x78, 0x99, 0xbd, 0x42, 0x16, 0xe9, 0x3d,
+ 0x65, 0x14, 0x5d, 0x3e, 0x79, 0x2c, 0x0a, 0x3d, 0x76, 0x3b, 0x37, 0x3e,
+ 0x1d, 0xea, 0x35, 0xbc, 0x10, 0x71, 0x6d, 0x3e, 0x10, 0x68, 0x4a, 0x3e,
+ 0x5d, 0x61, 0xe0, 0xbd, 0x82, 0xf9, 0x97, 0x3c, 0x7f, 0x8e, 0xc4, 0xbd,
+ 0x3e, 0xef, 0x83, 0x3e, 0xd5, 0xbe, 0x80, 0x3c, 0x0e, 0x6b, 0xb8, 0xbc,
+ 0xcc, 0x4d, 0x4f, 0x3e, 0x73, 0x20, 0xef, 0x3d, 0x42, 0xe9, 0x51, 0x3e,
+ 0x26, 0x69, 0xc6, 0x3d, 0x1a, 0x7a, 0x90, 0x3d, 0x83, 0x64, 0x27, 0xbe,
+ 0xe8, 0xd8, 0x33, 0xbe, 0x98, 0x42, 0x86, 0x3e, 0x72, 0xa2, 0x85, 0x3e,
+ 0xdc, 0x87, 0x3e, 0xbc, 0x0f, 0x73, 0x86, 0xbd, 0xdb, 0x81, 0x8d, 0xbd,
+ 0xf9, 0x58, 0x89, 0xbd, 0x54, 0xd8, 0x8c, 0xbd, 0x81, 0x23, 0xbc, 0xbd,
+ 0xe2, 0x30, 0xaa, 0x3e, 0xf2, 0x95, 0x34, 0xbd, 0x6a, 0x7c, 0x18, 0xbc,
+ 0xf0, 0xbf, 0xa6, 0xbd, 0xb9, 0x00, 0x2d, 0x3d, 0x01, 0x37, 0xa6, 0x3e,
+ 0x23, 0x24, 0xc8, 0xbe, 0x08, 0x50, 0x12, 0x3e, 0xa9, 0x79, 0x25, 0x3d,
+ 0xc1, 0x5c, 0x4a, 0xbe, 0xf7, 0x87, 0x28, 0xbc, 0xf0, 0x33, 0xd4, 0xbd,
+ 0xc8, 0x16, 0xb7, 0xbc, 0x0d, 0x5b, 0x98, 0xbe, 0x90, 0x8c, 0x26, 0xbe,
+ 0x20, 0xb5, 0x22, 0xbe, 0xf9, 0x13, 0x0b, 0xbe, 0x58, 0xb8, 0xb9, 0x3e,
+ 0x86, 0x07, 0xce, 0x3d, 0x5f, 0x09, 0x78, 0xbe, 0x48, 0x12, 0x67, 0xbe,
+ 0x4a, 0xec, 0xa1, 0xbd, 0x67, 0x0a, 0xa1, 0xbc, 0xab, 0x32, 0x67, 0x3c,
+ 0x12, 0xa4, 0xc9, 0x3e, 0x8d, 0xf8, 0x21, 0x3e, 0xc0, 0x4a, 0x5d, 0xbd,
+ 0x07, 0x63, 0xcf, 0xbd, 0x58, 0x38, 0x1d, 0xbd, 0x8f, 0xb0, 0xe1, 0xbd,
+ 0x65, 0xfa, 0xfb, 0xbd, 0x64, 0xe8, 0x55, 0xbe, 0xe7, 0x17, 0xea, 0xbd,
+ 0xaa, 0x32, 0x15, 0xbe, 0x0e, 0xa0, 0x70, 0x3e, 0x13, 0xd7, 0x2c, 0xbd,
+ 0xab, 0xcc, 0x19, 0x3e, 0xb2, 0x69, 0x35, 0xbe, 0x28, 0x16, 0xf3, 0x3d,
+ 0x95, 0xa8, 0x18, 0x3d, 0xf8, 0x62, 0x02, 0xbe, 0xda, 0xdc, 0xae, 0xbc,
+ 0xab, 0x8d, 0x13, 0xbd, 0x1e, 0x41, 0x93, 0xbd, 0x93, 0x29, 0x82, 0xbe,
+ 0x6b, 0xe1, 0xa3, 0xbe, 0xf1, 0x5d, 0xf3, 0xbd, 0x5b, 0x49, 0x7f, 0x3e,
+ 0x9c, 0x68, 0xd0, 0x3d, 0x5c, 0x16, 0x6d, 0xbc, 0x61, 0x31, 0x17, 0x3e,
+ 0x78, 0x62, 0x9d, 0x3d, 0x88, 0xc6, 0x15, 0x3d, 0x01, 0x00, 0x86, 0xbc,
+ 0xbb, 0xb0, 0xc4, 0x3e, 0x20, 0x23, 0xb0, 0x3d, 0x2c, 0xd5, 0xbf, 0x3d,
+ 0xfb, 0xd4, 0xa9, 0x3d, 0xee, 0x13, 0x20, 0xbe, 0x93, 0x8f, 0x62, 0xbe,
+ 0xc3, 0xa7, 0xdf, 0xbc, 0x70, 0x5f, 0x2d, 0xbe, 0xe9, 0x43, 0x2f, 0xbe,
+ 0xe5, 0x4f, 0xce, 0xbe, 0x23, 0xfe, 0x50, 0x3b, 0xf7, 0x15, 0x0b, 0xbe,
+ 0x88, 0x85, 0xf8, 0xbd, 0xcd, 0xaf, 0x28, 0x3e, 0xd4, 0xbd, 0x88, 0x3e,
+ 0xe5, 0xe8, 0xec, 0x3d, 0x56, 0xd5, 0x1f, 0x3e, 0x1d, 0x95, 0x9c, 0xbc,
+ 0x63, 0xa4, 0x31, 0x3e, 0x04, 0xcc, 0x83, 0xbe, 0x9d, 0x81, 0x57, 0xbd,
+ 0xcb, 0xe2, 0x85, 0x3d, 0x67, 0x6d, 0xa5, 0x3d, 0xf8, 0xe2, 0x25, 0x3e,
+ 0xe7, 0x29, 0x4e, 0x3d, 0x2b, 0x5c, 0x31, 0xbd, 0xc9, 0x54, 0x84, 0xbe,
+ 0x69, 0x34, 0xf0, 0x3c, 0x53, 0xf9, 0x18, 0x3d, 0x1e, 0xa8, 0x50, 0x3c,
+ 0x72, 0x67, 0x07, 0x3d, 0xa9, 0xd6, 0x61, 0x3e, 0x99, 0xdd, 0xca, 0x3c,
+ 0xfb, 0xc1, 0x79, 0x3e, 0x6c, 0xe7, 0x5b, 0x3d, 0x1f, 0x45, 0xcf, 0xbe,
+ 0x46, 0x98, 0x61, 0x3e, 0x12, 0x47, 0x66, 0xbc, 0xd5, 0x1b, 0x41, 0x3c,
+ 0x89, 0xfb, 0x9f, 0x3d, 0x53, 0x22, 0x71, 0xbd, 0x55, 0x42, 0x18, 0xbd,
+ 0xd7, 0xc7, 0xa5, 0x3d, 0x19, 0x95, 0xd2, 0x3d, 0xee, 0x5d, 0xe5, 0xba,
+ 0xe1, 0x09, 0x93, 0xbd, 0x29, 0x32, 0x6d, 0xbd, 0xb4, 0xa2, 0x34, 0xbd,
+ 0x53, 0x44, 0xf9, 0xbd, 0x38, 0xf5, 0x8a, 0xbd, 0x72, 0x23, 0xf5, 0x3a,
+ 0x00, 0xa2, 0x83, 0xbc, 0x75, 0xb1, 0x88, 0x3d, 0xb9, 0xe7, 0x02, 0x3e,
+ 0xd8, 0x90, 0x44, 0x3d, 0xad, 0x7e, 0x7f, 0x3d, 0x5a, 0xf2, 0xe8, 0x3d,
+ 0x29, 0x7e, 0x46, 0xbe, 0x18, 0x93, 0x9a, 0xbe, 0x08, 0xde, 0x49, 0xbc,
+ 0xa2, 0xc6, 0x1c, 0xbe, 0x2a, 0x9d, 0xf9, 0x3a, 0xc9, 0x5d, 0xe1, 0xbc,
+ 0xd5, 0xda, 0x86, 0x3c, 0x0b, 0xa5, 0xa0, 0x3d, 0xfc, 0x3d, 0x0e, 0x3e,
+ 0xb3, 0xac, 0x83, 0xbd, 0x6f, 0xc5, 0x44, 0x3d, 0xa2, 0xea, 0x88, 0x3b,
+ 0xa2, 0x86, 0x2c, 0x3e, 0x4a, 0x5d, 0xcd, 0xbd, 0x0e, 0xb9, 0x9a, 0x3d,
+ 0xfa, 0xe3, 0xb4, 0xbc, 0x2e, 0x2a, 0x27, 0xbd, 0x49, 0x3e, 0xdc, 0x3d,
+ 0xf4, 0x6a, 0x9e, 0xbd, 0x27, 0x25, 0x0f, 0x3d, 0xe3, 0xb6, 0x2a, 0x3c,
+ 0x19, 0xb8, 0x0e, 0x3e, 0xf5, 0x3d, 0x1e, 0x3d, 0x19, 0xdd, 0xed, 0xbd,
+ 0x8e, 0x14, 0xd7, 0xbd, 0x68, 0xde, 0x6a, 0x3e, 0x65, 0x49, 0x1c, 0xbe,
+ 0x59, 0x15, 0x2c, 0x3e, 0x3b, 0x80, 0x01, 0x3d, 0xad, 0xf4, 0xaa, 0x3d,
+ 0x63, 0x35, 0xac, 0xbc, 0x8d, 0x6b, 0x1d, 0xbe, 0x46, 0x28, 0x8c, 0x3d,
+ 0xbb, 0x99, 0x1e, 0x3d, 0xb3, 0xfd, 0x53, 0x3e, 0x2a, 0x39, 0x32, 0x3c,
+ 0x27, 0x97, 0x44, 0xbe, 0x1a, 0xc5, 0xc4, 0x3b, 0x6a, 0x83, 0xa8, 0xbd,
+ 0xa3, 0x49, 0x0a, 0xbd, 0xff, 0xa0, 0x87, 0x3d, 0x89, 0x1c, 0x6b, 0xbd,
+ 0xef, 0x92, 0xf2, 0x3d, 0x26, 0x7f, 0xf1, 0x3d, 0x91, 0xa6, 0x79, 0xbd,
+ 0x05, 0x58, 0x9a, 0xbd, 0x6c, 0xc2, 0xcd, 0xbd, 0x1d, 0xca, 0x66, 0x3e,
+ 0xa8, 0x03, 0xbc, 0xbc, 0x5a, 0xa3, 0x31, 0xbd, 0x5f, 0x3d, 0xc8, 0xbd,
+ 0x6b, 0x59, 0x2b, 0x3e, 0x62, 0x23, 0x02, 0x3e, 0x35, 0x69, 0x8c, 0x3c,
+ 0x34, 0x8a, 0x8a, 0xbd, 0x13, 0x78, 0x0b, 0x3e, 0xec, 0x0a, 0x53, 0xbe,
+ 0x35, 0x1e, 0xcd, 0x3d, 0xd5, 0x83, 0x12, 0xbd, 0x16, 0x9e, 0x6c, 0x3d,
+ 0x57, 0x3f, 0xb3, 0x3b, 0xfa, 0x09, 0x33, 0xbd, 0x69, 0x29, 0x01, 0xbe,
+ 0x99, 0x44, 0x2f, 0xbd, 0x79, 0xdd, 0x46, 0x3d, 0x76, 0xb8, 0x1c, 0x3e,
+ 0x9f, 0x3b, 0x84, 0x3b, 0xeb, 0xa7, 0x0f, 0xbe, 0xa8, 0x0a, 0x5e, 0x3d,
+ 0xc0, 0x99, 0x3a, 0x3d, 0xf9, 0xe6, 0x81, 0xbd, 0x45, 0x71, 0x95, 0xbd,
+ 0xd4, 0x75, 0x60, 0xbe, 0x59, 0x0e, 0x1f, 0x3e, 0x15, 0xa3, 0x8c, 0xbd,
+ 0xe3, 0x3e, 0x44, 0xbe, 0x28, 0xbd, 0x3f, 0xbe, 0x88, 0xc8, 0xbe, 0xbd,
+ 0x1a, 0xa5, 0x2d, 0xbb, 0x9f, 0xcd, 0x0c, 0x3c, 0xd4, 0x85, 0x0a, 0x3d,
+ 0xd4, 0x36, 0xbf, 0x3d, 0xe5, 0xbf, 0x88, 0x3d, 0x83, 0x9e, 0x05, 0xbe,
+ 0xa0, 0x27, 0x08, 0xbe, 0xad, 0x85, 0x52, 0x3c, 0x1b, 0xeb, 0xac, 0x3d,
+ 0x50, 0xf0, 0x4e, 0x3d, 0xa1, 0xe6, 0xbd, 0xbd, 0xad, 0x25, 0xb1, 0xbd,
+ 0x4e, 0x3f, 0xb5, 0x3d, 0x21, 0xac, 0x09, 0x3e, 0x92, 0xaa, 0x04, 0x3e,
+ 0xaf, 0xd7, 0x90, 0x3d, 0x77, 0xd8, 0x09, 0x3e, 0xbe, 0x46, 0x8d, 0x3d,
+ 0x3a, 0xa8, 0x84, 0x3e, 0xff, 0x08, 0xcd, 0xbd, 0x9d, 0xe2, 0xeb, 0xbd,
+ 0xde, 0x7c, 0x6c, 0xbd, 0x89, 0x8b, 0x87, 0xbc, 0x3f, 0xf0, 0xaf, 0x3a,
+ 0xcc, 0x11, 0x03, 0x3d, 0x82, 0x28, 0x18, 0xbe, 0x36, 0xd7, 0x9b, 0x3d,
+ 0x92, 0x9e, 0xa1, 0x3b, 0xb2, 0x2b, 0x38, 0xbe, 0x61, 0x40, 0xa4, 0xbd,
+ 0x7b, 0x0e, 0xbc, 0x3c, 0x5c, 0x3c, 0x3e, 0x3d, 0xba, 0x2e, 0xfc, 0x3d,
+ 0x2c, 0xf1, 0xdb, 0x3d, 0x6b, 0xc2, 0x98, 0x3d, 0xfa, 0x05, 0x69, 0xbd,
+ 0x77, 0x82, 0xba, 0xbd, 0xb7, 0x42, 0x17, 0xbc, 0xeb, 0x20, 0x4f, 0x3e,
+ 0xeb, 0x8b, 0x10, 0xbc, 0x4f, 0x90, 0x60, 0xbe, 0xae, 0x79, 0xc0, 0xbd,
+ 0xee, 0xbb, 0xd8, 0x3c, 0xf6, 0x8c, 0xaf, 0xbd, 0xb3, 0x17, 0xc4, 0x3c,
+ 0x7a, 0x1b, 0x3c, 0x3b, 0x00, 0x5c, 0x8f, 0xbd, 0x9a, 0x8e, 0x99, 0xbd,
+ 0xac, 0x1d, 0x62, 0x3c, 0x7f, 0xb3, 0x2b, 0x3d, 0x09, 0x59, 0x77, 0x3c,
+ 0x56, 0x9f, 0xde, 0x3d, 0x44, 0xfc, 0xcf, 0xbc, 0xc3, 0x32, 0x11, 0x3d,
+ 0xa2, 0x91, 0xd9, 0xbc, 0xdf, 0x9a, 0x57, 0x3e, 0x7a, 0x20, 0x9d, 0xbd,
+ 0xab, 0x87, 0x19, 0x3e, 0xd1, 0xb5, 0x60, 0x3e, 0x8c, 0x40, 0x0e, 0x3e,
+ 0x2c, 0x14, 0x68, 0x3d, 0xca, 0x34, 0xd1, 0xbc, 0x25, 0x28, 0xa5, 0xbc,
+ 0x91, 0xe9, 0x18, 0xbd, 0x84, 0xfc, 0x8f, 0x3c, 0x44, 0x74, 0x1d, 0x3d,
+ 0x1d, 0xd4, 0x41, 0xbd, 0xb3, 0xe3, 0x90, 0x3d, 0x76, 0xe1, 0x4c, 0x3e,
+ 0x42, 0x86, 0x48, 0xbd, 0xee, 0x4e, 0x0a, 0xbe, 0xa1, 0x71, 0x28, 0xbd,
+ 0x8d, 0x16, 0xab, 0x3d, 0x49, 0x05, 0x34, 0x3d, 0x62, 0x7c, 0x9e, 0x3c,
+ 0x39, 0x1a, 0x24, 0xbe, 0xf0, 0x6e, 0x59, 0xbd, 0x83, 0xd7, 0xaa, 0x3d,
+ 0xc5, 0x01, 0xde, 0xbd, 0xbb, 0x6b, 0x11, 0xbe, 0x51, 0x09, 0x29, 0xbe,
+ 0xcb, 0x26, 0xa1, 0xbd, 0x1e, 0xca, 0xf7, 0xbc, 0xd2, 0x50, 0x55, 0x3d,
+ 0xe1, 0xc1, 0x38, 0x3b, 0xa4, 0x44, 0xdc, 0xbd, 0xf4, 0xda, 0x26, 0x3d,
+ 0xf8, 0xe7, 0x11, 0xbe, 0x1e, 0x10, 0x60, 0xbe, 0x45, 0xf4, 0x05, 0xbe,
+ 0x53, 0xb7, 0x1d, 0x3c, 0xc9, 0x83, 0xef, 0x3d, 0x4e, 0x0b, 0xfc, 0xbd,
+ 0xff, 0xa8, 0x9a, 0x3d, 0xdb, 0xd9, 0xc5, 0xbc, 0x5c, 0x5a, 0xe0, 0xbc,
+ 0x4f, 0x9a, 0xf2, 0x3d, 0x16, 0xbc, 0xc3, 0xbd, 0xfa, 0xa2, 0x1f, 0xbe,
+ 0x17, 0x49, 0x91, 0xbd, 0x69, 0x24, 0x80, 0x3d, 0x6e, 0x40, 0x85, 0x3c,
+ 0xf3, 0xf3, 0x33, 0x3d, 0x1b, 0xb8, 0xf8, 0x3c, 0xe9, 0xfd, 0x0e, 0x3d,
+ 0xb3, 0x6f, 0xfe, 0xbd, 0x42, 0x4d, 0xd3, 0x3d, 0x09, 0x67, 0x3e, 0x3e,
+ 0x83, 0x3c, 0x5a, 0x39, 0xb0, 0xf3, 0x20, 0xbe, 0x25, 0x64, 0x7a, 0xbd,
+ 0x52, 0x6b, 0x0e, 0xbe, 0x75, 0x32, 0xac, 0xbd, 0x95, 0xe5, 0xeb, 0x3a,
+ 0xaf, 0xd9, 0x4c, 0xbe, 0x26, 0x38, 0x36, 0xbe, 0x8a, 0xb4, 0x04, 0xbe,
+ 0xe5, 0x44, 0x1a, 0xbe, 0xc9, 0x05, 0x54, 0x3d, 0x12, 0x57, 0x46, 0x3e,
+ 0xb5, 0x91, 0x57, 0x3d, 0x89, 0xbe, 0xa1, 0xbd, 0xfb, 0x08, 0xd5, 0x3c,
+ 0x8f, 0xff, 0xdd, 0xbd, 0x5e, 0x60, 0x31, 0x3b, 0x51, 0x65, 0x01, 0xbc,
+ 0x32, 0xcc, 0xeb, 0x3c, 0x68, 0xbe, 0x58, 0x3c, 0xb2, 0x88, 0x79, 0x3d,
+ 0x00, 0x19, 0xe6, 0xbd, 0x48, 0x4b, 0xe3, 0xbd, 0x3c, 0xfc, 0xcd, 0xbd,
+ 0x16, 0xbd, 0x09, 0xbe, 0xa3, 0xd0, 0x0d, 0x3e, 0xbc, 0xc8, 0xde, 0x3d,
+ 0xf1, 0xee, 0xf1, 0xbc, 0xae, 0xb4, 0xf5, 0xbd, 0x93, 0xce, 0x97, 0xbc,
+ 0x79, 0x67, 0xdf, 0x3e, 0x14, 0xa4, 0x99, 0xbc, 0x45, 0x8f, 0x68, 0xbe,
+ 0x3a, 0x3a, 0xf9, 0xbd, 0xcd, 0xb1, 0x8c, 0x3d, 0xc2, 0x6e, 0x7d, 0x3e,
+ 0x54, 0xe1, 0x57, 0x3d, 0x0f, 0xe4, 0xa4, 0xbe, 0x01, 0x58, 0x08, 0xbd,
+ 0xeb, 0x62, 0xe6, 0x3c, 0x19, 0x06, 0x25, 0xbd, 0x91, 0x7f, 0x73, 0x3e,
+ 0x45, 0x37, 0x95, 0x3d, 0x9c, 0x32, 0xe1, 0xbd, 0x96, 0x2f, 0xee, 0xbb,
+ 0xe9, 0xf5, 0x0b, 0x3e, 0x96, 0x77, 0x9f, 0x3e, 0xc9, 0x35, 0x57, 0x3d,
+ 0xdd, 0x68, 0x9a, 0xbc, 0xc8, 0xe0, 0x90, 0x3b, 0x84, 0x59, 0x2f, 0xbd,
+ 0x2b, 0x30, 0xc1, 0xbc, 0x76, 0xbd, 0x08, 0x3c, 0x92, 0xce, 0x4e, 0xbe,
+ 0x6b, 0x6a, 0x80, 0x3e, 0x7f, 0x6b, 0x05, 0x3d, 0xee, 0xf8, 0xce, 0xbe,
+ 0x50, 0xbc, 0x99, 0xbd, 0x0a, 0x61, 0x9f, 0xbc, 0x03, 0x69, 0x28, 0xbd,
+ 0xb0, 0x03, 0x8e, 0x3e, 0xd7, 0xbc, 0x29, 0xbe, 0x2e, 0xd0, 0x0f, 0xbe,
+ 0x08, 0xae, 0x93, 0xbc, 0x4b, 0x9d, 0x94, 0x3d, 0xe5, 0x39, 0x7d, 0xbd,
+ 0x96, 0xe9, 0xfa, 0x3b, 0x5d, 0x58, 0x92, 0xbe, 0xbb, 0x19, 0x4e, 0x3e,
+ 0xd6, 0x2d, 0x35, 0x3f, 0xde, 0x4b, 0x56, 0x3d, 0x9b, 0xde, 0x0c, 0xbe,
+ 0xab, 0x25, 0xc0, 0xbc, 0xd6, 0x2a, 0xa7, 0x3e, 0xfe, 0xfc, 0x36, 0xbc,
+ 0xf8, 0xad, 0xfe, 0x3d, 0x2a, 0x11, 0x98, 0xbb, 0x92, 0xfd, 0xca, 0x3e,
+ 0x15, 0x9c, 0xa6, 0x3d, 0x35, 0x04, 0xfd, 0x3d, 0x8b, 0xfa, 0x7c, 0xbe,
+ 0xd9, 0xb6, 0x27, 0x3e, 0xa6, 0x95, 0xe8, 0x3d, 0xf3, 0x6d, 0x9a, 0x3d,
+ 0x11, 0xaf, 0x9a, 0x3d, 0x95, 0x59, 0x56, 0x3d, 0x63, 0x38, 0xb3, 0xbc,
+ 0x32, 0x31, 0x36, 0x3d, 0xc2, 0x70, 0x02, 0xbe, 0x98, 0xdd, 0xde, 0x3c,
+ 0x5d, 0xa9, 0x6b, 0xbd, 0x5c, 0xb3, 0x0a, 0xbe, 0xd6, 0x77, 0xed, 0x3d,
+ 0x8c, 0x01, 0x0e, 0xbe, 0xc6, 0x99, 0x07, 0x3e, 0x28, 0x1c, 0x8e, 0xba,
+ 0xcb, 0x15, 0x8a, 0x3b, 0x72, 0x09, 0xbe, 0x3d, 0xf1, 0x96, 0xb7, 0x3e,
+ 0x1e, 0x01, 0x1d, 0x3e, 0xb2, 0x8d, 0x13, 0xbe, 0xe1, 0x2d, 0xfe, 0xbb,
+ 0x99, 0xb7, 0x09, 0xbe, 0xc0, 0x4b, 0x16, 0xbd, 0x2a, 0xe9, 0x93, 0xbd,
+ 0x8c, 0xd3, 0x6d, 0xbe, 0x87, 0x2c, 0x6d, 0x3d, 0xd7, 0x06, 0x91, 0xbe,
+ 0xfe, 0x60, 0xaf, 0xbe, 0xc7, 0x62, 0x75, 0x3d, 0x12, 0x57, 0xdc, 0x3d,
+ 0xb7, 0xc2, 0x2d, 0x3d, 0xce, 0x39, 0xf4, 0xbc, 0x11, 0xb7, 0x76, 0x3e,
+ 0x53, 0x39, 0x79, 0x3e, 0x74, 0x52, 0x63, 0xbd, 0xb8, 0x05, 0x6f, 0xbd,
+ 0xe1, 0x70, 0x49, 0x3e, 0x2f, 0x79, 0x8f, 0xbe, 0xf5, 0x48, 0x74, 0xbe,
+ 0x63, 0x6c, 0xc6, 0x3e, 0x9d, 0xf2, 0x6b, 0xbe, 0xd8, 0xcb, 0xf0, 0xbe,
+ 0x94, 0x8e, 0xfb, 0x3b, 0xa9, 0x8b, 0x37, 0xbd, 0x7f, 0x9b, 0xa0, 0xbd,
+ 0x13, 0xd3, 0xcc, 0x3d, 0xcc, 0x3b, 0x81, 0x3d, 0xee, 0x2c, 0x91, 0x3d,
+ 0xfe, 0x07, 0xac, 0x3d, 0x7b, 0x58, 0xfb, 0xbd, 0x2c, 0x46, 0xf5, 0xbe,
+ 0x5b, 0x18, 0xd9, 0xbe, 0x3e, 0x05, 0xed, 0xbd, 0x85, 0x06, 0x41, 0x3d,
+ 0x77, 0x82, 0xbc, 0x3d, 0x54, 0x70, 0x24, 0x3d, 0xbd, 0x64, 0x8f, 0x3e,
+ 0xb9, 0x26, 0x9b, 0x3d, 0xe0, 0xb2, 0x24, 0xb6, 0xcb, 0x39, 0xed, 0xbd,
+ 0x74, 0x57, 0x7c, 0xbd, 0x9c, 0x96, 0x21, 0xbe, 0xa8, 0xb0, 0xde, 0x3d,
+ 0xf8, 0x30, 0x26, 0x3d, 0x32, 0x45, 0x8a, 0xbe, 0x72, 0x07, 0x18, 0xbe,
+ 0x16, 0x9d, 0xd5, 0x3c, 0x6d, 0x4e, 0x03, 0x3e, 0x30, 0x44, 0x9d, 0x3d,
+ 0x1e, 0x1e, 0x8a, 0x3d, 0x5c, 0x02, 0x0d, 0x3d, 0x74, 0x65, 0xed, 0xbd,
+ 0x2d, 0x44, 0x30, 0x3c, 0xd0, 0x79, 0x3e, 0x3c, 0xe9, 0xdc, 0x07, 0xbe,
+ 0x64, 0x34, 0xd0, 0xbd, 0x6a, 0xef, 0xc6, 0xbd, 0xf0, 0x95, 0x04, 0xbe,
+ 0x99, 0x44, 0xe8, 0x3d, 0x3a, 0x4b, 0x98, 0x3d, 0x71, 0xcb, 0xbd, 0xbd,
+ 0x33, 0x69, 0x9a, 0x3d, 0x71, 0xff, 0xa6, 0xbd, 0xe6, 0x54, 0x3c, 0xbe,
+ 0xcb, 0xe9, 0xfc, 0xbd, 0xab, 0xe4, 0x0c, 0xbd, 0xe6, 0x94, 0x28, 0x3d,
+ 0x1f, 0x32, 0x90, 0x3d, 0x7a, 0x1b, 0x1e, 0x3d, 0x17, 0xe1, 0x0e, 0xbe,
+ 0x32, 0x6b, 0x3c, 0xbd, 0x61, 0xfb, 0x89, 0xbd, 0x45, 0x06, 0xb8, 0xbd,
+ 0x6f, 0x7f, 0x56, 0xbc, 0x0e, 0xeb, 0x10, 0xbd, 0x7d, 0xb0, 0xbf, 0x3d,
+ 0x4f, 0xd4, 0xde, 0xbd, 0x1a, 0x9c, 0x52, 0x3e, 0x37, 0xa7, 0x13, 0xbd,
+ 0x54, 0x79, 0x38, 0xbe, 0xa0, 0xd0, 0xec, 0x3d, 0x42, 0x15, 0x11, 0xbe,
+ 0xbb, 0xdf, 0x47, 0xbc, 0x0d, 0x70, 0x60, 0xbd, 0x21, 0x60, 0xe9, 0x3d,
+ 0xa5, 0x6e, 0x20, 0x3e, 0x78, 0xe2, 0x3f, 0x3d, 0x0c, 0xc9, 0xa4, 0x3d,
+ 0x5e, 0x4b, 0xf3, 0xbd, 0xda, 0x49, 0x90, 0xbd, 0xf4, 0x3c, 0x7e, 0xbe,
+ 0x06, 0x4e, 0x14, 0xbd, 0x16, 0x0c, 0xe2, 0xbd, 0x18, 0xa4, 0x9d, 0x3d,
+ 0x34, 0x8c, 0xdc, 0x3d, 0xe3, 0x79, 0x03, 0xbe, 0x2b, 0x5a, 0x16, 0x3e,
+ 0x11, 0xdd, 0x33, 0xbc, 0xc4, 0x05, 0xed, 0x3c, 0xc4, 0xd3, 0xd1, 0xbd,
+ 0xce, 0x22, 0xed, 0x3d, 0xa5, 0xf4, 0xbf, 0x3d, 0x1b, 0xd8, 0x09, 0xbe,
+ 0xeb, 0xb8, 0xfd, 0x3d, 0xc1, 0x7f, 0xa8, 0x3d, 0xa7, 0x97, 0x5d, 0xbe,
+ 0xbe, 0xbf, 0x55, 0xbc, 0xf9, 0x81, 0x0a, 0xbe, 0x2f, 0x60, 0xe5, 0xbd,
+ 0x72, 0x41, 0x50, 0x3d, 0xb9, 0x7a, 0xe1, 0x3d, 0x00, 0x57, 0x07, 0x3d,
+ 0x27, 0x62, 0x28, 0x3d, 0xe1, 0x8c, 0x37, 0xbe, 0xb0, 0x73, 0x3e, 0x3d,
+ 0x76, 0x22, 0xa7, 0xbb, 0x53, 0x95, 0x20, 0xbd, 0x76, 0x4e, 0xb7, 0xbd,
+ 0x3e, 0x38, 0x10, 0xbe, 0xf4, 0x48, 0x11, 0xbe, 0x51, 0x3b, 0xd5, 0x3c,
+ 0xf1, 0xc9, 0x36, 0x3e, 0x30, 0x78, 0x3a, 0x3d, 0xac, 0x54, 0xac, 0xbc,
+ 0x15, 0xf8, 0x66, 0x3d, 0xc8, 0x37, 0x9c, 0xbd, 0x2f, 0x79, 0x05, 0x3d,
+ 0x1f, 0xae, 0x42, 0xbe, 0xf0, 0x47, 0x80, 0xbd, 0x9b, 0x8e, 0x7c, 0xbd,
+ 0x9f, 0xe2, 0x08, 0x3c, 0x88, 0xa8, 0xb2, 0x3d, 0xe3, 0xaf, 0xd6, 0xbc,
+ 0xe6, 0x37, 0x64, 0xbd, 0x2d, 0x07, 0x48, 0xbd, 0x7b, 0x4b, 0x21, 0xbb,
+ 0xa7, 0x04, 0xa0, 0xbd, 0xc6, 0xb2, 0x89, 0xbc, 0xc8, 0x88, 0xbd, 0xbd,
+ 0x01, 0xe1, 0x4e, 0x3d, 0x07, 0x8d, 0xbf, 0x3d, 0xbf, 0xa4, 0x6e, 0xbd,
+ 0x0d, 0xc1, 0x8f, 0x3c, 0x8d, 0xb1, 0x1f, 0xbd, 0x14, 0x69, 0xbb, 0xbd,
+ 0x6d, 0xda, 0xd9, 0xbd, 0x77, 0xba, 0x18, 0xbe, 0xad, 0xca, 0x42, 0x3e,
+ 0xb6, 0x59, 0x8e, 0x3d, 0x97, 0x96, 0xd6, 0x3d, 0xb7, 0x20, 0x98, 0xbd,
+ 0x48, 0x9e, 0x3e, 0x3d, 0xc5, 0x45, 0x0f, 0xbd, 0x34, 0x98, 0x81, 0xbd,
+ 0x73, 0xa6, 0xe1, 0x3d, 0x9d, 0xa6, 0xb2, 0xbb, 0x4d, 0x4b, 0xbe, 0x3d,
+ 0xad, 0xae, 0x54, 0xbe, 0x33, 0xb7, 0x2e, 0xbd, 0x21, 0xb5, 0x8d, 0xbb,
+ 0xf2, 0x81, 0x27, 0x3e, 0x1b, 0x8e, 0x38, 0xbd, 0x87, 0xad, 0xa8, 0xbc,
+ 0xfc, 0x8d, 0x84, 0xbc, 0xfd, 0xef, 0x42, 0x3e, 0xcd, 0xdf, 0xd5, 0xbb,
+ 0x61, 0x78, 0xbb, 0xbd, 0xdd, 0xd2, 0x62, 0xbc, 0x26, 0x7f, 0x0a, 0x3d,
+ 0xc2, 0x43, 0x7f, 0x3e, 0xe9, 0x2b, 0xd0, 0xbd, 0x4c, 0xb8, 0x18, 0x3d,
+ 0x84, 0x5d, 0xda, 0x3d, 0x53, 0x76, 0x1e, 0x3e, 0xf7, 0x02, 0xcd, 0x3d,
+ 0xb8, 0xd5, 0x9c, 0xbc, 0xf2, 0x01, 0xfb, 0xbc, 0x08, 0x18, 0xcf, 0xbd,
+ 0xee, 0xfc, 0x2f, 0xbe, 0xad, 0x5c, 0x8c, 0x3e, 0x61, 0x0a, 0x8c, 0x3e,
+ 0xf2, 0xd3, 0x18, 0x3e, 0x2d, 0xec, 0x58, 0xbe, 0x32, 0x3a, 0x10, 0xbe,
+ 0xe4, 0x20, 0x90, 0x3d, 0xa4, 0xe6, 0xcb, 0xbd, 0x3e, 0xb2, 0x00, 0xbe,
+ 0x9e, 0xaa, 0x42, 0x3e, 0xe6, 0xc8, 0x9f, 0x3d, 0xd9, 0xe0, 0xd7, 0xba,
+ 0xaa, 0x29, 0x3f, 0x39, 0xcc, 0xb3, 0x47, 0xbe, 0xdf, 0x3a, 0x9c, 0x3e,
+ 0x34, 0x34, 0x20, 0xbe, 0x4c, 0x00, 0xca, 0x3d, 0x44, 0x20, 0xd9, 0xbd,
+ 0xff, 0xe9, 0x3b, 0xbd, 0xc0, 0xe7, 0xb6, 0x3d, 0x16, 0xf0, 0x81, 0xbd,
+ 0x02, 0xd2, 0xd5, 0x3d, 0x0a, 0x84, 0x5c, 0x3d, 0x4f, 0x21, 0x33, 0xbe,
+ 0x27, 0x58, 0x5c, 0xbd, 0x83, 0x8d, 0x45, 0xbe, 0xfa, 0x27, 0x94, 0x3e,
+ 0xff, 0x13, 0x1a, 0x3c, 0xde, 0x96, 0x9f, 0x3c, 0xee, 0x52, 0x37, 0xbe,
+ 0x06, 0xd5, 0x58, 0xbc, 0xa9, 0xe6, 0xb9, 0x39, 0xe5, 0x72, 0x2b, 0xbd,
+ 0x93, 0x32, 0x3f, 0x3e, 0xf7, 0x66, 0x2c, 0x3e, 0x8f, 0x90, 0x90, 0xbc,
+ 0x74, 0x63, 0x9e, 0xbd, 0xcf, 0xb9, 0x6e, 0x3c, 0xf0, 0x4b, 0x22, 0xbe,
+ 0xf0, 0xd2, 0xe5, 0xbd, 0x26, 0x8a, 0x48, 0xbe, 0xfe, 0xec, 0x99, 0xbd,
+ 0x1b, 0xfa, 0xca, 0xbb, 0x5e, 0xbc, 0x62, 0x3d, 0x43, 0xf9, 0xe4, 0xbd,
+ 0xd3, 0x09, 0x03, 0x3e, 0xa4, 0x8f, 0x25, 0xbe, 0x44, 0x03, 0xe2, 0xbd,
+ 0xaf, 0xc9, 0xa6, 0xbc, 0xc4, 0xf3, 0x6c, 0xbe, 0x56, 0xd0, 0xba, 0x3d,
+ 0x5b, 0xe0, 0x16, 0x3e, 0xb0, 0xec, 0xac, 0xbd, 0xd8, 0x53, 0xb6, 0xbd,
+ 0xd8, 0xcf, 0x69, 0xbe, 0x1f, 0xfc, 0x65, 0xbd, 0x41, 0x56, 0x55, 0x3e,
+ 0xb1, 0xbf, 0x89, 0x3e, 0x03, 0xdc, 0x1b, 0x3d, 0xcf, 0x76, 0x29, 0xbd,
+ 0x26, 0x32, 0xdb, 0x3d, 0xc1, 0x15, 0xf1, 0x3d, 0x19, 0xb0, 0x61, 0x3e,
+ 0x2e, 0xac, 0x9c, 0x3e, 0x6d, 0x5e, 0x8c, 0x3c, 0x59, 0xeb, 0x4b, 0xbe,
+ 0x27, 0x0b, 0x3e, 0x3d, 0x4d, 0x9d, 0x34, 0xbd, 0xef, 0x10, 0x0d, 0xbe,
+ 0xc7, 0xe4, 0x2e, 0xbc, 0x0a, 0xac, 0x21, 0xbe, 0xdc, 0x83, 0x85, 0xbd,
+ 0x70, 0x57, 0x82, 0xbe, 0x0e, 0xe5, 0x24, 0x3e, 0x5e, 0x25, 0xdc, 0x3c,
+ 0x21, 0x65, 0x86, 0xbe, 0xd1, 0xf6, 0x83, 0x3e, 0xef, 0x25, 0x63, 0x3e,
+ 0xda, 0xc4, 0x74, 0x3e, 0x0a, 0xa1, 0xa2, 0xbd, 0x4f, 0x02, 0xe1, 0xbc,
+ 0x85, 0x75, 0x34, 0x3e, 0x99, 0x15, 0xb8, 0xbe, 0x2d, 0xb3, 0x93, 0xbe,
+ 0x4e, 0x71, 0xaf, 0x3d, 0x87, 0x6e, 0xf6, 0xbc, 0x3e, 0x1e, 0x28, 0x3e,
+ 0xd9, 0x22, 0x90, 0x3d, 0x75, 0xe0, 0xe1, 0x3d, 0x46, 0x6b, 0x5a, 0xbe,
+ 0x4c, 0xb2, 0x6c, 0xbc, 0x61, 0x5b, 0x41, 0x3d, 0xe0, 0x6c, 0x94, 0x3d,
+ 0xf8, 0x86, 0xcd, 0x3d, 0xe9, 0xbe, 0x04, 0x3d, 0xc1, 0xa4, 0xcf, 0xbc,
+ 0x8e, 0x80, 0x5c, 0x3e, 0x3d, 0x05, 0xdb, 0x3c, 0xaa, 0x97, 0x1f, 0xbe,
+ 0x54, 0x1a, 0x0f, 0xbe, 0x58, 0xd2, 0x23, 0x3c, 0xba, 0x06, 0x2a, 0x3c,
+ 0x64, 0xd7, 0x87, 0x3d, 0x21, 0xf2, 0x80, 0xbd, 0x00, 0x11, 0x37, 0x3d,
+ 0x1f, 0x58, 0x84, 0x3d, 0xe3, 0xf9, 0xc0, 0x3d, 0x41, 0x39, 0xaa, 0x3d,
+ 0x43, 0xc2, 0x87, 0xbd, 0x10, 0xc4, 0x05, 0xbe, 0x33, 0x99, 0x31, 0x3e,
+ 0xe6, 0x8b, 0xdd, 0xba, 0xbd, 0xba, 0xd3, 0x3d, 0x6e, 0x0d, 0x6c, 0x3d,
+ 0x88, 0x56, 0xc6, 0x3d, 0x54, 0x64, 0xa1, 0x3c, 0xe8, 0x78, 0x6c, 0xbc,
+ 0xa0, 0xda, 0x17, 0xbc, 0x7d, 0x0e, 0x3f, 0xbe, 0x2f, 0x54, 0x06, 0x3e,
+ 0x42, 0x8d, 0x00, 0x3d, 0xe8, 0x5c, 0x1c, 0xbe, 0x2b, 0xb9, 0xa8, 0xbd,
+ 0xca, 0x64, 0x60, 0xbd, 0xd0, 0xc3, 0x62, 0x3d, 0x0b, 0xe0, 0x8d, 0xbd,
+ 0xe6, 0x66, 0x38, 0x3e, 0x95, 0x59, 0x39, 0x3c, 0x5e, 0x6c, 0x36, 0xbd,
+ 0x13, 0xf0, 0xfc, 0x3d, 0x8a, 0xbb, 0x01, 0xbe, 0x69, 0xec, 0xee, 0x3d,
+ 0x52, 0x0e, 0x4f, 0xbd, 0x5f, 0x88, 0x45, 0xbc, 0x1d, 0xca, 0x87, 0xbd,
+ 0x0e, 0xb4, 0x99, 0x3d, 0x72, 0xa2, 0xe3, 0xbc, 0xf3, 0xb0, 0x91, 0x3d,
+ 0xa1, 0x7a, 0xaf, 0x3c, 0xb1, 0x8d, 0x8b, 0xbd, 0x78, 0x3f, 0xa0, 0x3d,
+ 0x23, 0x9c, 0x95, 0x3d, 0xed, 0xb0, 0x57, 0x3d, 0x9b, 0xf3, 0xe1, 0xbc,
+ 0x3b, 0x2e, 0x89, 0x3d, 0xf8, 0x49, 0xf6, 0xbb, 0xe1, 0xd6, 0x3a, 0x3d,
+ 0x94, 0xd4, 0x8c, 0xbc, 0x3f, 0xa8, 0xce, 0x3d, 0xab, 0xc6, 0xef, 0x3c,
+ 0xe8, 0xe5, 0x74, 0x3d, 0x92, 0xf9, 0x8e, 0x3d, 0xbe, 0x18, 0xdb, 0xbc,
+ 0xc4, 0xec, 0x30, 0x3e, 0xf7, 0x3a, 0x53, 0xbc, 0x04, 0x47, 0x1c, 0x3c,
+ 0xe0, 0xf0, 0xce, 0xbd, 0xe0, 0x3c, 0x06, 0xbe, 0x1d, 0xe6, 0x61, 0xbc,
+ 0x7d, 0xb6, 0xab, 0x3d, 0x75, 0xbf, 0xf0, 0x3d, 0x16, 0x6e, 0x26, 0x3e,
+ 0x3d, 0xa1, 0xfa, 0x3c, 0xa0, 0xa3, 0xc1, 0x3d, 0xdb, 0xf9, 0xfa, 0x3c,
+ 0xa5, 0x7d, 0x1b, 0xbd, 0xe7, 0xcb, 0x45, 0xbd, 0xb2, 0x31, 0xf6, 0x3d,
+ 0x54, 0xb5, 0x5a, 0xbd, 0xcf, 0xed, 0x0c, 0xbd, 0xc8, 0x66, 0xc7, 0xbd,
+ 0x75, 0x3c, 0xff, 0x3d, 0xbe, 0x55, 0xec, 0xbd, 0x58, 0x72, 0x54, 0xba,
+ 0xfc, 0x3e, 0xba, 0x3d, 0x3f, 0xaa, 0xed, 0x3d, 0x73, 0x1f, 0x2d, 0xbe,
+ 0x94, 0x85, 0xe3, 0xbc, 0x49, 0x8a, 0x14, 0xbe, 0xcc, 0xcc, 0x19, 0x3d,
+ 0x50, 0x5d, 0x2c, 0xbd, 0xb5, 0x53, 0x9f, 0xbd, 0x13, 0x2f, 0x02, 0x3e,
+ 0xef, 0x2b, 0x54, 0x3b, 0x93, 0x70, 0x9b, 0xbd, 0xa1, 0xb6, 0x90, 0xbb,
+ 0x4e, 0x69, 0x10, 0xbd, 0x29, 0x18, 0x98, 0x3c, 0xc1, 0xd1, 0x75, 0xbd,
+ 0x02, 0x72, 0x20, 0x3e, 0x72, 0x53, 0x44, 0x3b, 0xc8, 0x17, 0x31, 0xbc,
+ 0xb7, 0xa5, 0xfe, 0x3d, 0x06, 0x9a, 0x21, 0xbe, 0xfd, 0xb3, 0xeb, 0xbd,
+ 0x3a, 0x3a, 0x6b, 0xbc, 0x66, 0x3b, 0x86, 0x3b, 0x11, 0x93, 0xff, 0xbd,
+ 0x15, 0xa3, 0x14, 0xbd, 0x85, 0x7a, 0x3c, 0xbd, 0xb3, 0x52, 0x86, 0x3e,
+ 0x0b, 0x26, 0xa6, 0x3a, 0x43, 0x88, 0xa9, 0x3c, 0xca, 0x2f, 0xa3, 0xbd,
+ 0xe6, 0xc3, 0xb9, 0x3c, 0x6d, 0xd3, 0x44, 0xbd, 0xfb, 0xc2, 0xf4, 0x3d,
+ 0x90, 0xe0, 0xd3, 0x3d, 0xc9, 0x8d, 0x1a, 0x3e, 0x61, 0x87, 0xae, 0xbd,
+ 0x80, 0xec, 0x03, 0xbe, 0x21, 0xf5, 0x7b, 0xbd, 0x92, 0x24, 0x66, 0xbd,
+ 0x13, 0x48, 0x8e, 0xbd, 0x15, 0xec, 0x97, 0xbc, 0x55, 0x5a, 0x3d, 0xbd,
+ 0xdd, 0xbd, 0x8c, 0x3c, 0x70, 0x48, 0x03, 0x3e, 0x3a, 0xbf, 0x63, 0xbd,
+ 0x9b, 0x82, 0x24, 0xbd, 0x16, 0x57, 0x0a, 0xbb, 0x08, 0x3f, 0x53, 0x3b,
+ 0x95, 0x68, 0x90, 0x3d, 0x74, 0xa8, 0xfb, 0x3d, 0xe5, 0x85, 0x77, 0x3d,
+ 0x37, 0xde, 0x41, 0xbc, 0x69, 0x94, 0x15, 0xbd, 0xce, 0x10, 0xda, 0x3d,
+ 0x09, 0x07, 0x0d, 0xbe, 0xed, 0xba, 0x9f, 0xbd, 0xef, 0x3c, 0x01, 0x3e,
+ 0xd8, 0xf7, 0xa7, 0x3d, 0x1b, 0xc6, 0x31, 0xbd, 0x8c, 0x38, 0xf1, 0x3c,
+ 0xc8, 0x65, 0xce, 0xbd, 0xc7, 0x0c, 0x85, 0xbd, 0x85, 0x8c, 0x4d, 0x3e,
+ 0xba, 0x75, 0x7e, 0xbb, 0x30, 0xf9, 0x41, 0x3d, 0x28, 0xd9, 0x13, 0xbd,
+ 0xdf, 0x52, 0xbe, 0xbd, 0x8c, 0xf5, 0xc2, 0xbc, 0x2b, 0x01, 0x98, 0x3d,
+ 0x0a, 0x11, 0xb9, 0x3d, 0x54, 0x0b, 0x9b, 0x3d, 0x82, 0x15, 0xb3, 0x3d,
+ 0x50, 0x1d, 0x29, 0x3b, 0xef, 0x43, 0xfd, 0xbc, 0xcb, 0x9e, 0xcd, 0x3d,
+ 0x8d, 0xea, 0x9b, 0x3d, 0x59, 0x3f, 0x86, 0x3c, 0xdf, 0x88, 0xb8, 0x3d,
+ 0x38, 0x50, 0xdc, 0x3d, 0x42, 0xa3, 0x2e, 0xbe, 0x52, 0xfc, 0x8c, 0x3c,
+ 0x2b, 0x05, 0xa8, 0xbd, 0xef, 0x70, 0x38, 0x3e, 0x26, 0x0d, 0x0a, 0x3e,
+ 0x40, 0x77, 0x8d, 0x3e, 0x60, 0x1a, 0x5f, 0xbb, 0x02, 0xf0, 0xd8, 0x3d,
+ 0x21, 0x03, 0xcc, 0x3c, 0x1a, 0x59, 0x02, 0xbe, 0x36, 0x30, 0xeb, 0x3d,
+ 0x0a, 0x40, 0xc9, 0x3c, 0xcf, 0xff, 0xcb, 0xbd, 0x63, 0x58, 0x9e, 0xbd,
+ 0x09, 0x99, 0xa9, 0xbd, 0x0a, 0x60, 0x3e, 0xbd, 0xb1, 0xa0, 0xf2, 0xbd,
+ 0x90, 0xef, 0xe1, 0x3d, 0x70, 0xe9, 0xae, 0x3c, 0xc3, 0x25, 0xd9, 0x3d,
+ 0x7b, 0xe7, 0x22, 0xbd, 0x81, 0xba, 0x8f, 0xbd, 0x8d, 0x8a, 0x83, 0x3d,
+ 0x91, 0x56, 0x28, 0xbc, 0x80, 0x57, 0x91, 0x3c, 0x0d, 0x89, 0xcd, 0x3d,
+ 0x5c, 0xe7, 0x43, 0x3d, 0xf7, 0x85, 0x19, 0xbe, 0x04, 0x31, 0x10, 0x3c,
+ 0xa6, 0x83, 0x8a, 0xbd, 0xf8, 0xc1, 0xb1, 0xbd, 0x7c, 0x71, 0x92, 0xbd,
+ 0x9e, 0x44, 0x1d, 0xbd, 0x86, 0xae, 0xf5, 0xbd, 0x72, 0x8d, 0xb3, 0x3d,
+ 0xf6, 0xef, 0xd7, 0x3d, 0x3e, 0xf0, 0x5c, 0xbd, 0x10, 0xbd, 0xf6, 0x3c,
+ 0xa4, 0x61, 0x8f, 0x3d, 0xf3, 0xe1, 0x36, 0x3d, 0x95, 0x65, 0x9e, 0xbd,
+ 0x26, 0x03, 0x8e, 0x3d, 0x3a, 0xe3, 0xf2, 0xbd, 0x6c, 0x78, 0xb2, 0xbd,
+ 0x48, 0x85, 0x4f, 0xbe, 0xc5, 0x34, 0xc5, 0x3c, 0xc5, 0xe1, 0x9a, 0xbd,
+ 0x4a, 0x6d, 0xb2, 0x3d, 0xe2, 0x9c, 0x4b, 0x3d, 0x7e, 0xc2, 0xdf, 0xbd,
+ 0x48, 0x0c, 0x5e, 0xbc, 0xcb, 0x8d, 0x42, 0x3d, 0x89, 0x1d, 0xf7, 0xbc,
+ 0x6f, 0xd3, 0xd4, 0x3c, 0xe9, 0x8f, 0x45, 0xbe, 0xc2, 0x46, 0xd6, 0x3d,
+ 0xd1, 0x4b, 0xcf, 0xbd, 0x7c, 0xa4, 0x47, 0xbd, 0x97, 0xe2, 0xb8, 0xbd,
+ 0x8f, 0xf7, 0xe0, 0xbd, 0x05, 0x66, 0x82, 0xbd, 0x12, 0x26, 0xb7, 0xbd,
+ 0xcc, 0x0c, 0x1b, 0xbe, 0x12, 0xd2, 0x94, 0xbd, 0x39, 0xb2, 0x6f, 0x3e,
+ 0x36, 0x9a, 0x01, 0xbb, 0x86, 0xa8, 0x2c, 0xbe, 0x51, 0x4c, 0x0f, 0xbe,
+ 0x36, 0x0f, 0x64, 0xbe, 0xb3, 0x20, 0x25, 0x3d, 0x40, 0x1d, 0x1e, 0x3e,
+ 0x19, 0xb1, 0x39, 0x3d, 0x38, 0xa7, 0xb3, 0xbd, 0x0b, 0x96, 0xca, 0x3c,
+ 0x15, 0x82, 0xb5, 0xbd, 0x46, 0x54, 0x81, 0x3d, 0x8e, 0xfa, 0x74, 0xbd,
+ 0x34, 0x69, 0x01, 0x3e, 0x51, 0x0e, 0x4a, 0xbc, 0xf1, 0xf8, 0x97, 0x3b,
+ 0x55, 0x3c, 0xdb, 0xbc, 0x31, 0x25, 0x75, 0x3d, 0x1f, 0x14, 0x62, 0x3e,
+ 0x66, 0x62, 0x46, 0x3e, 0xaa, 0x45, 0x13, 0xbe, 0x54, 0xbf, 0x81, 0xbe,
+ 0x9a, 0x76, 0x64, 0xbe, 0x87, 0x9c, 0x66, 0x3e, 0x70, 0xdb, 0xc3, 0x3d,
+ 0x42, 0x84, 0xd6, 0x3d, 0xe8, 0x6f, 0x4d, 0xbe, 0x37, 0xe8, 0xf6, 0x3a,
+ 0xff, 0x20, 0x1e, 0x3d, 0xcc, 0xbd, 0x1e, 0x3b, 0x54, 0x63, 0x47, 0x3d,
+ 0xc5, 0x7f, 0x01, 0xbe, 0x99, 0xd8, 0xc4, 0x3d, 0xf2, 0x5e, 0xc6, 0xbc,
+ 0x4d, 0xed, 0x52, 0x3d, 0x10, 0xf4, 0x4f, 0x3e, 0x09, 0xfc, 0x74, 0x3e,
+ 0x72, 0x7f, 0xbd, 0xbd, 0x5e, 0x2e, 0x75, 0xbd, 0x03, 0x04, 0xd1, 0xbd,
+ 0x56, 0x48, 0xc2, 0x3b, 0x73, 0x7c, 0x63, 0x3c, 0x2d, 0x89, 0x85, 0xbe,
+ 0xe8, 0xfb, 0xac, 0x3d, 0x63, 0x2d, 0xd8, 0x3d, 0xcc, 0x1c, 0x13, 0xbe,
+ 0x37, 0x2f, 0xde, 0xbd, 0x01, 0x52, 0x98, 0xbd, 0x3a, 0xa2, 0x0f, 0x3e,
+ 0x4d, 0x7e, 0xc7, 0xbd, 0x32, 0x3e, 0x9f, 0xbe, 0xb9, 0x32, 0x36, 0xbe,
+ 0x16, 0x1a, 0x7c, 0x3d, 0x2e, 0x19, 0xb1, 0x3c, 0xdc, 0x1d, 0x12, 0xbe,
+ 0xdd, 0x73, 0x80, 0xbd, 0xd4, 0xcb, 0x32, 0xbf, 0x92, 0xde, 0xf4, 0x3d,
+ 0xff, 0x7b, 0xdf, 0x3e, 0x5b, 0xb7, 0x1e, 0xbd, 0x3d, 0x8b, 0xb1, 0xbd,
+ 0x1d, 0xed, 0xf5, 0xbc, 0xde, 0x14, 0xb5, 0x3e, 0x0a, 0x0a, 0xab, 0xbd,
+ 0xc3, 0xa4, 0xbd, 0x3d, 0x5a, 0x0c, 0xea, 0xbd, 0x5f, 0x7f, 0x84, 0x3e,
+ 0x6a, 0xf0, 0x30, 0x3a, 0xbd, 0x15, 0x0c, 0x3e, 0xb3, 0x2a, 0x59, 0xbe,
+ 0xb3, 0x9f, 0x9f, 0x3d, 0xa9, 0x6a, 0x11, 0x3e, 0xda, 0xfb, 0xdd, 0x3d,
+ 0x76, 0xa3, 0x2e, 0xbc, 0x04, 0x88, 0x1b, 0x3e, 0x76, 0x85, 0xd8, 0x3d,
+ 0x92, 0xd8, 0x50, 0x3d, 0x0d, 0x49, 0xaf, 0x3d, 0x5b, 0xa9, 0x21, 0x3c,
+ 0x74, 0x11, 0xbb, 0x3d, 0xf9, 0x13, 0x18, 0x3e, 0x34, 0xaa, 0x60, 0xbe,
+ 0x96, 0x88, 0x4e, 0xbd, 0x14, 0xaf, 0x8e, 0x3d, 0x45, 0xbf, 0x09, 0x3e,
+ 0x8e, 0xb8, 0x08, 0x3e, 0xce, 0x01, 0x81, 0x3d, 0x11, 0x28, 0x0d, 0x3e,
+ 0x63, 0xd1, 0x52, 0x3e, 0xb7, 0xfe, 0x0e, 0xbe, 0xc0, 0x78, 0x5e, 0x3e,
+ 0x29, 0x18, 0xad, 0xbd, 0x24, 0xb6, 0x09, 0x3e, 0xc6, 0xe9, 0x46, 0xbe,
+ 0x9d, 0x74, 0x99, 0xbd, 0x4a, 0x1c, 0x0f, 0xbe, 0xbc, 0x0b, 0x05, 0xbf,
+ 0xed, 0x2d, 0xf0, 0xba, 0x7f, 0x90, 0xdc, 0xbb, 0x0b, 0xf7, 0xd7, 0x3c,
+ 0x77, 0x24, 0x9b, 0xbd, 0x42, 0xff, 0xf0, 0xbc, 0x53, 0x63, 0xeb, 0x3b,
+ 0x52, 0x3d, 0xb5, 0x3e, 0xed, 0xe3, 0x9a, 0xbd, 0xf3, 0xb9, 0xbb, 0x3d,
+ 0x90, 0x4e, 0x0e, 0x3e, 0xd2, 0x34, 0xea, 0xbd, 0x03, 0x14, 0x34, 0xbe,
+ 0x69, 0xcb, 0x0c, 0x3e, 0xe4, 0xf3, 0xa7, 0xbe, 0x5d, 0xdb, 0x7a, 0xbe,
+ 0x81, 0x74, 0xd8, 0xbd, 0xb6, 0x34, 0x8e, 0x3d, 0x75, 0xb0, 0xbd, 0xbd,
+ 0x84, 0x77, 0xc0, 0x3d, 0xe1, 0xe9, 0xc6, 0x3c, 0xdf, 0x29, 0xf5, 0x3c,
+ 0x88, 0xe2, 0xa4, 0x3d, 0xae, 0x00, 0x3b, 0xbd, 0xdb, 0x07, 0xde, 0xbe,
+ 0x48, 0xf9, 0x41, 0xbf, 0x23, 0x50, 0xce, 0xbb, 0xd8, 0x9b, 0x36, 0x3d,
+ 0x71, 0x15, 0x81, 0xbd, 0x59, 0xe3, 0xf6, 0xbd, 0x30, 0x49, 0x27, 0x3d,
+ 0x20, 0xfa, 0x70, 0xbd, 0xe0, 0x50, 0x97, 0x3e, 0xde, 0x2c, 0x53, 0x3e,
+ 0x58, 0x1a, 0xdc, 0xbd, 0x6f, 0x66, 0xcc, 0x3d, 0xaa, 0x64, 0x1a, 0xbe,
+ 0x8c, 0x82, 0xc5, 0xbd, 0x8c, 0x70, 0x91, 0xbe, 0x9e, 0xe0, 0xba, 0xbd,
+ 0xda, 0x40, 0xf0, 0x3d, 0x43, 0x9e, 0x1c, 0x3e, 0xea, 0xb4, 0xf4, 0x3d,
+ 0xe9, 0xfc, 0xa9, 0xbc, 0x6b, 0xa5, 0xa6, 0x3b, 0xee, 0xf1, 0xe1, 0xbd,
+ 0xa9, 0xd6, 0x59, 0xbc, 0xe4, 0xec, 0x75, 0x3d, 0xec, 0xe3, 0xfb, 0xbd,
+ 0x38, 0x2e, 0x7a, 0x3d, 0xc9, 0x66, 0xcf, 0xbd, 0x8e, 0x43, 0xa3, 0xbd,
+ 0x8f, 0x5d, 0xb3, 0xbd, 0x4e, 0x5d, 0xdc, 0x3c, 0x71, 0xcd, 0xda, 0xbd,
+ 0x69, 0xd1, 0x52, 0x3d, 0xea, 0x9a, 0xd2, 0xbd, 0x4d, 0xa9, 0x5d, 0xbd,
+ 0xf3, 0x5e, 0xa9, 0xbc, 0x81, 0x20, 0x18, 0xbe, 0x91, 0x16, 0xdc, 0xbd,
+ 0xec, 0x55, 0xd9, 0xbc, 0xa1, 0x07, 0x06, 0x3e, 0x50, 0xb4, 0xd7, 0x3d,
+ 0x4b, 0xe5, 0x98, 0xbd, 0xca, 0x26, 0x05, 0x3e, 0xf9, 0x14, 0x71, 0xbd,
+ 0x4f, 0xfc, 0x16, 0xbe, 0x44, 0x62, 0x63, 0x3d, 0x32, 0xec, 0x0a, 0x3e,
+ 0x47, 0x9d, 0x48, 0xbd, 0xe0, 0x70, 0x4b, 0xbd, 0x2f, 0x87, 0xde, 0xbd,
+ 0x0a, 0xb6, 0xa8, 0x3c, 0xa4, 0xaa, 0x1d, 0xbe, 0x84, 0xe2, 0xd9, 0xbd,
+ 0xd3, 0x8e, 0x04, 0xbd, 0x74, 0xdd, 0xaa, 0xbd, 0xd2, 0x08, 0xea, 0x3d,
+ 0xcd, 0x6a, 0x68, 0x3d, 0x99, 0x50, 0x14, 0x3e, 0x3c, 0xf2, 0xa7, 0xbb,
+ 0x58, 0xc8, 0x1b, 0xbd, 0xce, 0xfd, 0x08, 0x3d, 0x9b, 0xe5, 0x37, 0xbe,
+ 0x52, 0xd4, 0x7e, 0xbd, 0x63, 0x22, 0x12, 0xbd, 0x11, 0xe9, 0x31, 0xbc,
+ 0xf6, 0xaa, 0x02, 0xbc, 0xc1, 0x64, 0x53, 0xbd, 0xcd, 0xf1, 0x94, 0x3d,
+ 0x91, 0x55, 0x02, 0xbe, 0xef, 0x2a, 0xba, 0xbd, 0x0c, 0x29, 0x97, 0x3d,
+ 0x86, 0xa6, 0x8f, 0xbd, 0x12, 0x07, 0xc5, 0x3d, 0x61, 0x1c, 0xc3, 0xbd,
+ 0xb4, 0x71, 0x26, 0x3e, 0xad, 0x96, 0xd0, 0x3d, 0x1d, 0x5d, 0xbe, 0xbc,
+ 0xfe, 0x53, 0xd8, 0xbd, 0xce, 0x2e, 0x70, 0xbd, 0xa1, 0xd1, 0x8a, 0x3c,
+ 0xa5, 0x18, 0x74, 0x3d, 0xe9, 0xa3, 0x8f, 0x3d, 0x56, 0x02, 0xeb, 0xbb,
+ 0x90, 0xac, 0xaa, 0xbd, 0xd9, 0xa6, 0x43, 0xbe, 0x5c, 0xd3, 0x35, 0x3b,
+ 0xe1, 0xcc, 0x6c, 0xbd, 0xe0, 0xf8, 0x5f, 0x3d, 0xc0, 0x81, 0x8c, 0xba,
+ 0x5a, 0xe5, 0xf7, 0x3c, 0xdb, 0x73, 0x00, 0xbe, 0xcf, 0x60, 0x02, 0xbc,
+ 0x35, 0x25, 0xf9, 0x3d, 0xd7, 0xef, 0x8c, 0x3d, 0xc5, 0xb1, 0xa8, 0x3d,
+ 0xf9, 0x44, 0x4a, 0x3d, 0x35, 0x4d, 0x95, 0xbd, 0x59, 0xf8, 0xa0, 0xbd,
+ 0x4c, 0xc1, 0x23, 0xbe, 0xc1, 0x38, 0x98, 0x3d, 0xe9, 0xe1, 0xaa, 0xbd,
+ 0xa3, 0x93, 0x1a, 0x3e, 0x72, 0x1a, 0x4b, 0xbd, 0xb5, 0x8d, 0x7d, 0x3d,
+ 0xed, 0xf1, 0xeb, 0xbd, 0x44, 0x4a, 0x21, 0x3e, 0xf5, 0x96, 0x93, 0xbb,
+ 0x10, 0x35, 0x25, 0x3d, 0xcd, 0x58, 0x5a, 0xbc, 0x04, 0xa0, 0xa8, 0x3c,
+ 0x3d, 0xed, 0x8f, 0x3d, 0x36, 0xa5, 0x09, 0xbd, 0x6b, 0x51, 0xc8, 0x3d,
+ 0xd9, 0x07, 0x4d, 0x3d, 0x04, 0xb7, 0x53, 0x3d, 0x2e, 0x05, 0xb3, 0x3d,
+ 0xfa, 0x7d, 0x21, 0xbe, 0x2b, 0xdb, 0x1d, 0xbe, 0xfe, 0x47, 0xcb, 0x3a,
+ 0x6f, 0x5c, 0xf0, 0x3d, 0x70, 0xd2, 0xb7, 0xbd, 0xcb, 0xf8, 0xb2, 0x3c,
+ 0x8a, 0xdb, 0xd4, 0x3c, 0xf6, 0xf6, 0xf7, 0x3d, 0x05, 0x1d, 0xf8, 0x3d,
+ 0xd3, 0x3c, 0xbd, 0xbd, 0xff, 0x46, 0x17, 0x3e, 0xc5, 0x33, 0x28, 0xbc,
+ 0x09, 0x62, 0xc3, 0xbd, 0xf2, 0x41, 0x01, 0x3e, 0x05, 0x36, 0x15, 0x3d,
+ 0xc2, 0x6e, 0x07, 0x3d, 0x07, 0xdd, 0xdd, 0x3c, 0x42, 0xe0, 0x0a, 0x3e,
+ 0x5f, 0x74, 0x97, 0xbd, 0xb7, 0x1f, 0x5a, 0x3e, 0xd6, 0x91, 0x18, 0x3c,
+ 0x5e, 0x42, 0x3b, 0x3d, 0x13, 0x49, 0xa4, 0xbc, 0x44, 0xf0, 0x64, 0xbb,
+ 0x9c, 0x10, 0x70, 0x3e, 0x3b, 0xda, 0x82, 0x3d, 0x87, 0x3a, 0x6d, 0x3d,
+ 0x0b, 0x4f, 0x53, 0x3d, 0xbf, 0x52, 0xdb, 0xbd, 0x9a, 0x6a, 0x85, 0x3c,
+ 0x13, 0x5b, 0xa5, 0xbc, 0x65, 0x80, 0x89, 0xbd, 0xd7, 0x58, 0x81, 0x3d,
+ 0xf9, 0xf4, 0xa4, 0xbe, 0x3d, 0xb6, 0xfb, 0x3d, 0x22, 0x48, 0x8f, 0x3d,
+ 0xab, 0x48, 0xdd, 0x3d, 0xc2, 0x02, 0x4f, 0x3c, 0x3c, 0x23, 0x07, 0x3d,
+ 0x8f, 0x63, 0x1b, 0x3d, 0x31, 0x18, 0x00, 0x3e, 0x0a, 0x75, 0x7b, 0xbc,
+ 0x6d, 0x49, 0x34, 0x3e, 0x0b, 0x05, 0xc2, 0xbd, 0xeb, 0x55, 0xbd, 0x3d,
+ 0x7d, 0xc1, 0x7e, 0x3d, 0x39, 0x04, 0x0d, 0x3c, 0xc8, 0xb4, 0xbc, 0x3e,
+ 0x47, 0x9f, 0xbd, 0xbe, 0x78, 0xd9, 0x25, 0xbe, 0xf2, 0x99, 0x7f, 0x3d,
+ 0xa3, 0x60, 0x92, 0xbc, 0x61, 0x15, 0x87, 0xbe, 0xde, 0xbc, 0x0b, 0xbe,
+ 0x35, 0x08, 0xce, 0xbd, 0x6b, 0x53, 0xd7, 0xbd, 0x44, 0xda, 0xbe, 0xbd,
+ 0x1e, 0x7f, 0xe4, 0xbd, 0x77, 0xe5, 0xf2, 0xbc, 0x50, 0x33, 0xc4, 0x3e,
+ 0x81, 0x14, 0xe4, 0x3d, 0x97, 0xc9, 0x63, 0xbe, 0x47, 0x32, 0x48, 0xbd,
+ 0x4b, 0xd3, 0x9b, 0xbe, 0x85, 0x11, 0x0a, 0x3d, 0xbc, 0xfb, 0xb3, 0xbd,
+ 0xd6, 0xf8, 0x31, 0x3e, 0xb2, 0x9a, 0x4d, 0x3e, 0x6a, 0x81, 0xdf, 0xbc,
+ 0x19, 0x65, 0x4a, 0xbe, 0xaf, 0xcb, 0x48, 0x3e, 0xc5, 0xf3, 0x27, 0xbe,
+ 0x8c, 0xa6, 0xb2, 0x3d, 0x10, 0xd1, 0x06, 0xbe, 0x22, 0xff, 0xf8, 0xbd,
+ 0xfc, 0x9d, 0x5b, 0xbe, 0x99, 0xda, 0x79, 0xbc, 0x6f, 0x1d, 0x01, 0xbe,
+ 0xa4, 0x59, 0x70, 0x3e, 0x7a, 0x3d, 0x48, 0x3d, 0x61, 0x03, 0x3a, 0xbd,
+ 0x9f, 0x43, 0xe6, 0x3d, 0xbd, 0xff, 0x6c, 0xbe, 0x0e, 0x1b, 0x60, 0xbe,
+ 0xd3, 0xcd, 0xc4, 0xbc, 0xb7, 0x79, 0xa5, 0xbd, 0xc9, 0xe3, 0x8a, 0xbd,
+ 0x0e, 0x5d, 0x97, 0xbe, 0x69, 0xe5, 0x85, 0x3d, 0xcb, 0xc8, 0x1e, 0x3e,
+ 0x6b, 0x3f, 0x95, 0x3e, 0x21, 0x19, 0x1d, 0xbd, 0xa1, 0xd9, 0x68, 0x3e,
+ 0x8c, 0xf6, 0xe0, 0xbd, 0x2b, 0x12, 0x0a, 0x3e, 0xc4, 0x4a, 0x0b, 0x3e,
+ 0xfe, 0xca, 0x07, 0x3e, 0x69, 0xba, 0x56, 0x3d, 0xbd, 0xc7, 0xc0, 0xbd,
+ 0xf7, 0xb6, 0xac, 0x3d, 0x86, 0xef, 0x9e, 0xbd, 0x9a, 0x9b, 0xc4, 0xbe,
+ 0xac, 0x13, 0x87, 0xbd, 0x99, 0xfe, 0xe2, 0x3d, 0xdf, 0x79, 0x37, 0xbe,
+ 0xa0, 0xf1, 0x92, 0xbe, 0xac, 0x75, 0x6f, 0x3d, 0x2c, 0xb2, 0x58, 0xbc,
+ 0xb6, 0x8c, 0xf5, 0xbd, 0xee, 0xa6, 0xed, 0xbb, 0xe6, 0x4f, 0xce, 0xbc,
+ 0x17, 0xef, 0x8c, 0x3e, 0xb0, 0xc4, 0x10, 0x3e, 0xc3, 0x45, 0x56, 0x3e,
+ 0x21, 0x43, 0x7b, 0xbc, 0x40, 0xaf, 0x14, 0xbe, 0xb2, 0x3f, 0x37, 0xbd,
+ 0x70, 0xaa, 0x13, 0xbd, 0xdf, 0xa8, 0x16, 0xbd, 0x99, 0x9c, 0x4f, 0x3e,
+ 0x6d, 0x64, 0xf8, 0xbb, 0xcc, 0x37, 0x13, 0xbd, 0xaf, 0xb7, 0x6b, 0xbe,
+ 0xb4, 0xd1, 0xdd, 0x3d, 0x60, 0x75, 0x4d, 0x3c, 0x92, 0x40, 0xe4, 0xbd,
+ 0x84, 0xc5, 0x05, 0xbe, 0x73, 0x8d, 0xb3, 0x3d, 0x3e, 0xd2, 0x1d, 0x3d,
+ 0x21, 0xaa, 0x23, 0x3e, 0x6e, 0xe4, 0x1e, 0xbd, 0xbd, 0x60, 0xad, 0xbe,
+ 0xec, 0x66, 0x58, 0x3d, 0x91, 0x5a, 0xfc, 0xb9, 0x38, 0xab, 0xba, 0xbb,
+ 0xee, 0x02, 0xb9, 0x3d, 0x03, 0x3e, 0x92, 0xbd, 0x9e, 0x65, 0x13, 0x3e,
+ 0x7c, 0xc0, 0x0a, 0x3d, 0x68, 0x07, 0x27, 0x3e, 0xcd, 0x05, 0x25, 0x3e,
+ 0x90, 0xae, 0xa4, 0x3d, 0xfe, 0x9e, 0xda, 0xbd, 0x08, 0xff, 0xb0, 0xba,
+ 0xb3, 0x8e, 0xf4, 0xbd, 0xb6, 0x5b, 0xb4, 0x3c, 0x68, 0xc0, 0xed, 0xbd,
+ 0xd0, 0xce, 0xdf, 0xbd, 0x08, 0x58, 0x78, 0x3d, 0xaf, 0xbb, 0xbc, 0x3c,
+ 0xfa, 0x89, 0xd9, 0x3d, 0x47, 0x30, 0xa2, 0xbe, 0xc2, 0xb4, 0x4a, 0x3e,
+ 0xa1, 0x73, 0x49, 0x3d, 0x9b, 0xe3, 0x0e, 0xbe, 0x9c, 0xfe, 0x98, 0xbc,
+ 0x0a, 0x8f, 0x18, 0xbe, 0x63, 0x65, 0xe2, 0x3d, 0x15, 0xe0, 0x9a, 0x3d,
+ 0x3b, 0x2d, 0x73, 0x3d, 0xd0, 0xa2, 0x7a, 0x3d, 0x5a, 0xbf, 0x8b, 0x3c,
+ 0xbb, 0xa1, 0x3f, 0x3e, 0xc4, 0xe1, 0x11, 0xbe, 0x36, 0xa6, 0xa5, 0xbd,
+ 0xe0, 0x7c, 0x49, 0x3d, 0x24, 0xd2, 0x3b, 0xbe, 0xbe, 0x3f, 0x10, 0xbe,
+ 0x14, 0x45, 0xdc, 0x3d, 0x93, 0x0d, 0xa3, 0xbe, 0x15, 0xdb, 0x15, 0xbe,
+ 0x52, 0x05, 0x3c, 0xbe, 0x0c, 0x9d, 0x45, 0xbd, 0xeb, 0x8e, 0xb9, 0x3c,
+ 0xbd, 0xeb, 0x0a, 0xbe, 0xb3, 0x5d, 0x6d, 0xbd, 0xe9, 0xa6, 0x69, 0xbd,
+ 0x0d, 0xb4, 0xb5, 0xbd, 0x7c, 0xf1, 0xbf, 0xbd, 0x06, 0x0d, 0x81, 0x3d,
+ 0x2f, 0x09, 0xe8, 0x3c, 0x3e, 0x28, 0x2b, 0x3e, 0x41, 0x6f, 0x41, 0x3e,
+ 0xc8, 0xf5, 0xa4, 0x3c, 0x27, 0xc1, 0x11, 0x3d, 0x62, 0x2d, 0xd8, 0x3b,
+ 0x0b, 0xc9, 0x5f, 0x3e, 0x07, 0xf1, 0x6b, 0x3e, 0x86, 0xb6, 0x0a, 0xbe,
+ 0xda, 0xf1, 0x26, 0xbe, 0xf7, 0x42, 0xfb, 0xbd, 0xbe, 0x6d, 0xfc, 0x3d,
+ 0xd3, 0x2c, 0xfd, 0x3c, 0xc6, 0xdc, 0x8b, 0x3d, 0x4d, 0xfc, 0xcc, 0xbd,
+ 0xc6, 0x97, 0x93, 0x3d, 0xe2, 0x89, 0xd9, 0x3d, 0xa7, 0x13, 0x9e, 0xbd,
+ 0x69, 0xf2, 0x24, 0xbd, 0x93, 0x93, 0xa3, 0xbd, 0x76, 0x99, 0xf8, 0x3d,
+ 0x2e, 0x5f, 0xe7, 0xbd, 0x34, 0x36, 0x14, 0xbe, 0x4c, 0xe4, 0x25, 0xbe,
+ 0x64, 0x30, 0x7a, 0xbb, 0x65, 0x64, 0xb3, 0x3c, 0xa0, 0xab, 0x9e, 0xbd,
+ 0xad, 0xc8, 0xf1, 0xbd, 0x99, 0x97, 0xe0, 0xbd, 0x44, 0x64, 0x3c, 0xbe,
+ 0x9d, 0x54, 0x38, 0x3d, 0x6f, 0x95, 0x00, 0x3e, 0xa2, 0x3f, 0x34, 0x3d,
+ 0x8e, 0xc1, 0x1e, 0xbe, 0xde, 0x96, 0x49, 0xbc, 0x2b, 0xd2, 0x89, 0x3c,
+ 0xc6, 0x87, 0xf1, 0x3c, 0x4f, 0xb7, 0x95, 0x3d, 0xc0, 0xb3, 0x1d, 0xbb,
+ 0xad, 0x90, 0xd6, 0xbb, 0xfd, 0x85, 0x1f, 0xbc, 0x76, 0xe4, 0x14, 0x3e,
+ 0x05, 0x33, 0x6f, 0x3c, 0x3b, 0x45, 0x11, 0xbd, 0x56, 0xeb, 0x90, 0xbd,
+ 0xed, 0x4a, 0x85, 0x3d, 0x2f, 0xd7, 0x22, 0xbe, 0x33, 0x69, 0xb2, 0x3c,
+ 0xdf, 0x49, 0x45, 0xbe, 0x21, 0xc9, 0x15, 0xbc, 0x70, 0x88, 0xfd, 0xbd,
+ 0x8d, 0x5f, 0xb9, 0xbd, 0xc8, 0x7d, 0x6e, 0x3d, 0xdc, 0x7c, 0x8a, 0x3e,
+ 0x1d, 0x4d, 0x59, 0xbd, 0xb3, 0x4f, 0x64, 0xbd, 0x30, 0x64, 0x67, 0xbe,
+ 0xef, 0xe4, 0x65, 0xbe, 0x0e, 0x99, 0xe4, 0xbd, 0x76, 0x4b, 0xd5, 0x3d,
+ 0x1a, 0xf7, 0x80, 0xbd, 0x4a, 0xd6, 0xa3, 0xbd, 0x1a, 0x65, 0x95, 0xbc,
+ 0xfe, 0xa0, 0x53, 0xbe, 0xbb, 0x4d, 0x11, 0x3e, 0x60, 0xbd, 0x3d, 0x3d,
+ 0xc8, 0x0c, 0x13, 0x3e, 0xbc, 0xc3, 0x5f, 0xbd, 0x61, 0xe9, 0xe7, 0x3d,
+ 0x84, 0xa6, 0xa5, 0xbd, 0x5d, 0x9e, 0x28, 0x3e, 0xb3, 0x04, 0xa6, 0x3d,
+ 0x82, 0x7a, 0xce, 0x3d, 0x41, 0x4d, 0xbd, 0xbd, 0x99, 0x9b, 0xee, 0x3d,
+ 0x7b, 0xa3, 0x11, 0x3d, 0x24, 0xf6, 0x1d, 0x3e, 0xc8, 0xa4, 0x46, 0x3d,
+ 0x76, 0xbf, 0xe8, 0x3b, 0x2d, 0x8b, 0x1e, 0xbe, 0x2a, 0x29, 0x49, 0x3d,
+ 0xd0, 0x7c, 0xb2, 0xbb, 0x74, 0xbb, 0x56, 0xbd, 0xff, 0x64, 0x2e, 0xbe,
+ 0x50, 0x9d, 0x85, 0xbe, 0x86, 0x9b, 0xe4, 0x3d, 0xe5, 0x27, 0xe7, 0x3d,
+ 0x4a, 0x4e, 0x4a, 0x3e, 0xcd, 0x14, 0x2b, 0xbe, 0x04, 0x51, 0x63, 0x3e,
+ 0xac, 0x10, 0xea, 0x3c, 0x4c, 0xeb, 0x37, 0xbe, 0x73, 0x3d, 0xd6, 0x3d,
+ 0x3c, 0x5c, 0x01, 0xbd, 0xed, 0xeb, 0x87, 0x3d, 0xc1, 0x60, 0xb5, 0x3d,
+ 0x78, 0x3b, 0x7c, 0xbd, 0x1e, 0xa8, 0x18, 0x3d, 0x00, 0xef, 0x7c, 0x3c,
+ 0x25, 0x3f, 0x52, 0x3e, 0xd0, 0x8d, 0xd6, 0xbd, 0x87, 0xb8, 0x24, 0xbd,
+ 0x42, 0x71, 0x5f, 0x3d, 0xdd, 0xcf, 0x9a, 0xbd, 0xfc, 0xc4, 0xdf, 0x3d,
+ 0xff, 0x54, 0x83, 0xbc, 0x84, 0xcd, 0x7f, 0xbe, 0x6e, 0x92, 0x97, 0xbc,
+ 0xf6, 0x5c, 0x52, 0xbe, 0x8e, 0x27, 0x71, 0xbd, 0xea, 0x0c, 0x84, 0x3d,
+ 0x46, 0xd0, 0x18, 0xbd, 0x04, 0x68, 0xea, 0x3d, 0x9c, 0xef, 0xfb, 0x3d,
+ 0xcf, 0x3d, 0xa4, 0x3d, 0xd9, 0xa3, 0x27, 0xbe, 0xac, 0x9f, 0xea, 0x3d,
+ 0xe2, 0x18, 0x55, 0xbd, 0x70, 0x61, 0x62, 0x3c, 0xc3, 0xff, 0x06, 0xbd,
+ 0xec, 0xfc, 0x71, 0x3d, 0x6a, 0x65, 0xac, 0x3d, 0x84, 0x6b, 0x23, 0x3d,
+ 0x88, 0x8f, 0xca, 0x3d, 0xed, 0x8d, 0x5d, 0x3e, 0xa3, 0x7a, 0x9f, 0xbd,
+ 0xd2, 0x8c, 0xf6, 0xbb, 0x4f, 0x55, 0x05, 0xbe, 0xd1, 0xc9, 0x01, 0x3e,
+ 0x7c, 0x6b, 0xab, 0x3d, 0x3a, 0x8e, 0xca, 0x3d, 0x18, 0x27, 0x41, 0xbd,
+ 0x44, 0x24, 0x24, 0x3d, 0x60, 0xac, 0x24, 0xbd, 0xb4, 0x38, 0xf8, 0x3d,
+ 0xd7, 0xad, 0xa1, 0x3d, 0x75, 0xb5, 0x82, 0x3d, 0xd8, 0xfd, 0xea, 0x3d,
+ 0x32, 0x11, 0x3f, 0xbe, 0x45, 0x1a, 0xf3, 0x3b, 0xae, 0xf1, 0x8b, 0xbd,
+ 0x8c, 0x64, 0x22, 0x3d, 0x1a, 0xdb, 0x05, 0x3e, 0x9f, 0x36, 0xfb, 0xbc,
+ 0x24, 0x46, 0x57, 0xbd, 0x03, 0xec, 0x0c, 0xbd, 0xa2, 0x92, 0x2d, 0xbd,
+ 0x60, 0x36, 0x34, 0xbe, 0x34, 0xc9, 0x5a, 0xbd, 0xa8, 0xe5, 0x51, 0x3e,
+ 0x08, 0x4f, 0x1a, 0xbe, 0x0c, 0x6f, 0x8e, 0x3d, 0x75, 0xd3, 0x3a, 0x3c,
+ 0x6c, 0x61, 0xb8, 0xbb, 0x03, 0xe8, 0x74, 0x3b, 0x31, 0x7f, 0x93, 0xbd,
+ 0x41, 0xcf, 0xd7, 0xbb, 0x56, 0x4a, 0x49, 0xbd, 0xda, 0x92, 0x45, 0xbd,
+ 0xf3, 0x3f, 0xa9, 0xba, 0xb7, 0x97, 0x02, 0xbe, 0xca, 0xfd, 0xdf, 0x3c,
+ 0x74, 0xfe, 0x44, 0xbd, 0x71, 0x7c, 0x85, 0x3d, 0x94, 0x5e, 0xc6, 0xbd,
+ 0x22, 0x57, 0x3e, 0xbd, 0xf5, 0x5b, 0xb7, 0xbb, 0x12, 0x13, 0x1c, 0xbd,
+ 0xf8, 0x60, 0x5a, 0xbe, 0x88, 0x39, 0xb0, 0xbd, 0x7f, 0x6c, 0x6e, 0x3e,
+ 0xba, 0x14, 0x91, 0xbd, 0x98, 0x77, 0xb3, 0xbd, 0xc4, 0xf2, 0x32, 0xbe,
+ 0x64, 0x4b, 0xdd, 0xbd, 0xd7, 0x1d, 0x7b, 0xbd, 0xae, 0x1d, 0x60, 0xbd,
+ 0xfa, 0x51, 0x60, 0xbd, 0x72, 0x42, 0xac, 0x3d, 0x1a, 0x83, 0x06, 0x3e,
+ 0x90, 0x83, 0x69, 0xbe, 0xcc, 0x02, 0xf4, 0x3c, 0x3d, 0x93, 0x94, 0x3b,
+ 0xe1, 0x88, 0x4b, 0x3d, 0x34, 0x60, 0x5a, 0x3c, 0x8d, 0xef, 0x59, 0xbc,
+ 0x7e, 0x28, 0x22, 0x3b, 0xb7, 0xbc, 0x48, 0x3e, 0xa4, 0x3c, 0x83, 0x3c,
+ 0x8e, 0x56, 0x78, 0x3e, 0x20, 0xdf, 0xac, 0xbc, 0xee, 0x7e, 0x79, 0x3c,
+ 0xcb, 0x03, 0xd9, 0xbc, 0x9b, 0xbf, 0x1b, 0x3e, 0xe3, 0x4a, 0x45, 0xbc,
+ 0xcb, 0xe1, 0xcb, 0x3d, 0x3b, 0xa6, 0x36, 0xbe, 0x46, 0xc0, 0x9d, 0x3e,
+ 0x5c, 0xab, 0x82, 0x3d, 0xf6, 0xfa, 0x53, 0xbe, 0xc9, 0x8e, 0x03, 0xbe,
+ 0x0f, 0x31, 0xc8, 0x3d, 0x8d, 0x13, 0xb4, 0xbd, 0x45, 0x62, 0x58, 0xbc,
+ 0x97, 0x02, 0x11, 0xbe, 0xed, 0xa5, 0xc4, 0xbb, 0xf7, 0x0c, 0xaa, 0x3e,
+ 0x82, 0x50, 0x0c, 0x3d, 0xbb, 0xcd, 0x38, 0xbe, 0xfb, 0x05, 0x0a, 0x3e,
+ 0xcc, 0x5d, 0xb3, 0xbd, 0xf8, 0xa1, 0x1b, 0x3c, 0x45, 0xc3, 0xb1, 0xbd,
+ 0x3a, 0x07, 0xc5, 0x3d, 0x1e, 0x7f, 0x17, 0x3e, 0x04, 0xa4, 0xd7, 0x3d,
+ 0x59, 0xe3, 0x9f, 0x3d, 0xb5, 0x4e, 0x91, 0xbd, 0xf4, 0x26, 0x55, 0xbb,
+ 0x4e, 0x7c, 0xca, 0xbc, 0x63, 0xd1, 0x2c, 0xbd, 0xc3, 0x7c, 0x6b, 0x3d,
+ 0xfd, 0x3f, 0x11, 0xbe, 0x0e, 0x3e, 0x62, 0xbe, 0x2d, 0x2d, 0x7d, 0xbd,
+ 0x81, 0x5d, 0x1b, 0xbe, 0x52, 0xd0, 0x0a, 0xbf, 0xed, 0x08, 0xc4, 0xbd,
+ 0xaf, 0x75, 0xae, 0x3d, 0xb6, 0xd2, 0xe8, 0xb8, 0xff, 0x61, 0x70, 0xbd,
+ 0xd7, 0xc4, 0x40, 0x3d, 0xce, 0x38, 0x83, 0x3e, 0xa4, 0x2f, 0xe0, 0x3d,
+ 0x49, 0x59, 0xfb, 0xbd, 0xd4, 0x07, 0x49, 0xbd, 0x5c, 0xd3, 0xf9, 0xbd,
+ 0xd7, 0xd9, 0x86, 0x3e, 0x9a, 0x56, 0x15, 0x3e, 0x00, 0x88, 0x9c, 0xbe,
+ 0x67, 0x71, 0x1f, 0x3e, 0xe4, 0xa9, 0x04, 0x3e, 0x89, 0x7b, 0x5c, 0xbd,
+ 0xd1, 0x57, 0x6a, 0xbd, 0x93, 0x58, 0x30, 0xbd, 0x0d, 0xf9, 0xcf, 0xbc,
+ 0x14, 0x03, 0x10, 0x3c, 0x09, 0x11, 0x38, 0x3e, 0x46, 0x82, 0xb4, 0x3c,
+ 0x5c, 0xc1, 0x4d, 0x3e, 0x5d, 0x5a, 0xae, 0xbd, 0x8a, 0xc0, 0x06, 0xbf,
+ 0x84, 0xc9, 0x7e, 0xbd, 0x4f, 0xe1, 0x0d, 0x3e, 0xed, 0xae, 0x4a, 0x3d,
+ 0x2a, 0x6f, 0x0f, 0x3d, 0xa4, 0xd1, 0x53, 0x3e, 0x74, 0x1d, 0x1c, 0x3e,
+ 0x8f, 0xe5, 0xf7, 0xbd, 0x8c, 0xdf, 0x15, 0xbe, 0xbc, 0x33, 0x52, 0x3e,
+ 0xb4, 0x1d, 0xcb, 0x3e, 0x5f, 0x06, 0x04, 0x3c, 0x9f, 0xf3, 0x25, 0x3d,
+ 0x94, 0xd2, 0x2f, 0x3e, 0x31, 0x4a, 0x3d, 0xbe, 0x5d, 0x94, 0xa4, 0xbe,
+ 0xa8, 0x62, 0x95, 0x3e, 0x1e, 0x7a, 0xc2, 0x3d, 0x39, 0x2a, 0x8e, 0x3d,
+ 0x5d, 0xb2, 0x43, 0xbe, 0x02, 0x90, 0x0a, 0xbd, 0xb0, 0x05, 0x23, 0xbd,
+ 0x7c, 0xbb, 0x3b, 0x3d, 0x38, 0xce, 0x89, 0x3e, 0x53, 0x94, 0x6c, 0x3d,
+ 0x27, 0x31, 0x56, 0x3e, 0xba, 0x28, 0x70, 0xbd, 0xcb, 0x5e, 0x87, 0xbe,
+ 0x5a, 0x59, 0x52, 0x3c, 0x32, 0xfd, 0x7c, 0xbe, 0xf2, 0x43, 0xa4, 0xbd,
+ 0x2f, 0xcb, 0xc0, 0x3e, 0x24, 0xe9, 0x30, 0x3e, 0x7a, 0xe2, 0x72, 0x3d,
+ 0x3d, 0x0e, 0xa0, 0x3d, 0x58, 0x22, 0xa5, 0xbe, 0xc3, 0x6f, 0x87, 0xbd,
+ 0x2a, 0xaf, 0x18, 0xbd, 0xfe, 0xd7, 0x64, 0xbd, 0x86, 0x89, 0xbf, 0xbd,
+ 0x46, 0x88, 0x11, 0xbf, 0xc3, 0x1f, 0x0d, 0xbe, 0xaf, 0x2b, 0x65, 0x3d,
+ 0x92, 0xc4, 0x3c, 0xbd, 0x22, 0x97, 0x02, 0xbf, 0xfb, 0x04, 0x54, 0x3e,
+ 0x95, 0x39, 0x19, 0xbd, 0x71, 0x07, 0xca, 0x3d, 0x6e, 0x9b, 0x60, 0x3d,
+ 0x73, 0x91, 0x19, 0x3e, 0x82, 0x42, 0x08, 0x3e, 0xea, 0x59, 0x73, 0xbe,
+ 0x44, 0x57, 0x92, 0x3d, 0x0d, 0xf2, 0xc7, 0xbd, 0x3a, 0x8e, 0xbe, 0x3d,
+ 0x11, 0x41, 0x18, 0x3e, 0xc6, 0xbb, 0x16, 0xbe, 0xe8, 0x51, 0x1e, 0xbe,
+ 0x47, 0x02, 0xc2, 0x3d, 0x8d, 0x79, 0x2c, 0xbc, 0xc8, 0xdc, 0x10, 0xbe,
+ 0x66, 0x58, 0x82, 0x3d, 0xef, 0x2f, 0x18, 0xbe, 0xc2, 0x68, 0x11, 0xbe,
+ 0x07, 0xfb, 0x57, 0xbb, 0x60, 0x23, 0xfb, 0x3c, 0x13, 0x1f, 0x60, 0xbe,
+ 0x28, 0x78, 0x62, 0x3c, 0xea, 0x9a, 0x9c, 0x3d, 0x08, 0xe1, 0xd9, 0x3b,
+ 0xc4, 0x47, 0xe5, 0x3c, 0x42, 0x79, 0x08, 0xbe, 0x55, 0xa2, 0xca, 0xbc,
+ 0x13, 0x30, 0x55, 0x3e, 0xde, 0x35, 0x13, 0x3c, 0xa7, 0x7e, 0x67, 0xbd,
+ 0x6c, 0x05, 0xfb, 0xbb, 0x9e, 0xc6, 0xcd, 0x3c, 0x49, 0x5c, 0x81, 0x3d,
+ 0x59, 0xc8, 0x82, 0xbd, 0x31, 0x83, 0x8a, 0xbc, 0xe7, 0x70, 0x57, 0x3e,
+ 0x70, 0xee, 0x5e, 0x3d, 0x00, 0xeb, 0xb4, 0x3d, 0xbf, 0x27, 0xb2, 0x3d,
+ 0x6c, 0x1f, 0xa5, 0x3c, 0x59, 0xd7, 0xcc, 0xbd, 0x53, 0x00, 0x07, 0xbe,
+ 0x05, 0xdc, 0x5f, 0xbd, 0xb6, 0x3d, 0xac, 0xbe, 0x87, 0x3e, 0x04, 0x3d,
+ 0x6f, 0x08, 0x20, 0xbc, 0xe3, 0x29, 0xa4, 0xbd, 0x0d, 0x96, 0xf8, 0xbd,
+ 0xbc, 0x0f, 0x8a, 0x3d, 0xa7, 0x20, 0x02, 0x3e, 0x14, 0x81, 0x4c, 0xbc,
+ 0xbe, 0x56, 0xde, 0x3d, 0x2c, 0x9a, 0x61, 0x3d, 0x72, 0xbe, 0x7e, 0xbe,
+ 0x34, 0x91, 0xe9, 0x3d, 0x86, 0x3d, 0x6e, 0xbd, 0x77, 0x29, 0x03, 0xbd,
+ 0xdb, 0x32, 0x0a, 0x3d, 0x2f, 0xa5, 0xe2, 0x3d, 0xe6, 0xe2, 0xdb, 0x3d,
+ 0xaf, 0x31, 0x1b, 0x3d, 0x02, 0xdc, 0xdb, 0xbc, 0x79, 0x24, 0x62, 0xbd,
+ 0x9d, 0x53, 0xaf, 0xbd, 0xe6, 0x78, 0x79, 0x3d, 0xed, 0xde, 0x16, 0xbe,
+ 0x9c, 0x76, 0x20, 0x3d, 0x3c, 0xd9, 0xad, 0x3d, 0xa3, 0x30, 0x93, 0xbe,
+ 0xa0, 0x4b, 0x9b, 0xbd, 0xdb, 0x30, 0x01, 0x3e, 0x8c, 0x22, 0xa3, 0x3d,
+ 0x33, 0x80, 0xe7, 0xbd, 0x0b, 0x83, 0xe8, 0x3c, 0x28, 0xcf, 0x98, 0xbc,
+ 0x37, 0x27, 0x62, 0x3d, 0x6a, 0x35, 0x27, 0xbd, 0x0c, 0x26, 0x02, 0xbc,
+ 0x8d, 0x55, 0x94, 0xbd, 0xec, 0xb8, 0x3a, 0xbc, 0xb3, 0x5d, 0x03, 0xbe,
+ 0x03, 0xc5, 0x3a, 0x3d, 0xd8, 0x32, 0x62, 0xbe, 0xa3, 0xb3, 0xe7, 0x3d,
+ 0x2d, 0xbf, 0x3e, 0xbe, 0xe8, 0xd7, 0x8b, 0x3d, 0xe1, 0x8c, 0x16, 0xbe,
+ 0xbf, 0xf0, 0x31, 0x3e, 0x4b, 0x18, 0x52, 0xbd, 0x6d, 0xc8, 0x23, 0xbe,
+ 0x7b, 0x56, 0xe3, 0xbd, 0x9e, 0xa0, 0xec, 0xbd, 0xbf, 0xb3, 0x01, 0xbe,
+ 0xe2, 0x6e, 0x89, 0xbd, 0x91, 0xab, 0xd6, 0xbd, 0x10, 0x61, 0xb1, 0x3d,
+ 0x90, 0x68, 0x09, 0x3c, 0x91, 0x48, 0x97, 0x3b, 0xe4, 0xc4, 0xc7, 0xbd,
+ 0x0c, 0x83, 0xfd, 0x3d, 0xbe, 0x20, 0xec, 0x3d, 0xe4, 0x77, 0x74, 0x3d,
+ 0x4d, 0xad, 0xf1, 0x3d, 0x21, 0x6d, 0x25, 0xbd, 0x6e, 0x54, 0x8f, 0xbc,
+ 0x25, 0xb1, 0x2a, 0xbe, 0x82, 0x04, 0xae, 0x3c, 0x73, 0x44, 0x88, 0xbb,
+ 0x9f, 0xc9, 0xd7, 0xbb, 0x24, 0xf6, 0x4b, 0xbe, 0xfd, 0xbe, 0x00, 0x3e,
+ 0xa4, 0x5e, 0x18, 0xbe, 0xea, 0x96, 0x0a, 0xbd, 0x47, 0x9a, 0xf5, 0xbd,
+ 0x75, 0x37, 0x04, 0x3e, 0x26, 0x09, 0xd1, 0x3c, 0xdf, 0x1b, 0x95, 0x3d,
+ 0x67, 0xa9, 0x19, 0xbe, 0x68, 0xeb, 0xb7, 0xbc, 0x54, 0x8d, 0x98, 0x3d,
+ 0x74, 0x6a, 0x22, 0xbc, 0x7d, 0xec, 0x0f, 0x3e, 0x8d, 0xda, 0x0b, 0xbe,
+ 0x72, 0x48, 0x03, 0xbc, 0xaa, 0x62, 0xcf, 0xbc, 0xcb, 0xf7, 0xc8, 0x3d,
+ 0x3c, 0x2a, 0xba, 0xbc, 0x38, 0x69, 0x84, 0x3e, 0x10, 0x7e, 0x83, 0xbd,
+ 0x87, 0x19, 0x7a, 0x3d, 0xc8, 0x09, 0xbf, 0x3c, 0xc6, 0x0f, 0xde, 0x3a,
+ 0xfd, 0xca, 0x03, 0x3e, 0xc1, 0x26, 0xc5, 0x3b, 0xb3, 0x1d, 0x85, 0x3d,
+ 0x07, 0x37, 0x28, 0x3c, 0xd3, 0x34, 0x94, 0xbc, 0x26, 0x11, 0x16, 0xbe,
+ 0x9c, 0x0c, 0xd2, 0xbd, 0x2b, 0xbd, 0x15, 0xbc, 0x70, 0x41, 0xef, 0xbd,
+ 0x70, 0xce, 0xa2, 0xbe, 0x74, 0xe8, 0x76, 0xbd, 0xae, 0x75, 0x62, 0x3d,
+ 0x0e, 0x9f, 0x60, 0x3e, 0x08, 0x92, 0x06, 0xbe, 0x8a, 0x41, 0x9e, 0x3c,
+ 0x2a, 0x84, 0x3c, 0x3c, 0x21, 0x38, 0x0e, 0x3d, 0x95, 0xcd, 0xb2, 0x3b,
+ 0xd2, 0xa2, 0x17, 0x3e, 0xc0, 0x5f, 0xc4, 0xbd, 0xd6, 0x97, 0x0e, 0x3e,
+ 0x9c, 0x9b, 0x58, 0x3d, 0xdc, 0x18, 0x8d, 0x3d, 0x23, 0x7f, 0x9a, 0x3e,
+ 0xe5, 0x35, 0x8b, 0xbe, 0x08, 0x06, 0x25, 0xbd, 0xf1, 0x88, 0x7c, 0xbd,
+ 0xba, 0x30, 0x2b, 0xbc, 0xdf, 0xec, 0x3d, 0xbe, 0x5a, 0xff, 0xae, 0xbd,
+ 0x7a, 0x3c, 0x82, 0x3d, 0x8a, 0x9d, 0x20, 0xbe, 0x38, 0x18, 0xc0, 0xbe,
+ 0x9c, 0x86, 0x86, 0xbc, 0x22, 0x26, 0x9a, 0xbc, 0xb2, 0x43, 0x8e, 0x3e,
+ 0x55, 0xe0, 0x11, 0x3e, 0x21, 0xef, 0x69, 0xbe, 0x4f, 0xaf, 0x10, 0xbe,
+ 0x38, 0xda, 0x60, 0xbe, 0x1b, 0xc3, 0x25, 0x3e, 0xf9, 0xc4, 0x5c, 0xbe,
+ 0xf7, 0x01, 0x9b, 0x3e, 0xbd, 0xbe, 0xdb, 0x3d, 0xca, 0x74, 0xa9, 0xbd,
+ 0x00, 0x3c, 0x0c, 0xbe, 0x98, 0x40, 0x6e, 0x3d, 0x5d, 0x6e, 0xe8, 0xbd,
+ 0x00, 0x07, 0x75, 0xbe, 0xad, 0xcc, 0xb6, 0xbe, 0x73, 0x59, 0xf0, 0xbd,
+ 0x4b, 0x02, 0xbe, 0xbd, 0xdd, 0xeb, 0x88, 0x3e, 0xab, 0x8a, 0x1f, 0xbd,
+ 0x8d, 0xb2, 0xb5, 0x3e, 0x48, 0x01, 0x90, 0xbd, 0xe9, 0x3d, 0xe2, 0x3d,
+ 0x3a, 0xfd, 0xd5, 0x3d, 0xc1, 0xe2, 0x37, 0xbe, 0xce, 0x25, 0x12, 0xbe,
+ 0x4a, 0x0e, 0x00, 0x3e, 0x85, 0x76, 0x39, 0x3d, 0x9c, 0x26, 0xea, 0xbd,
+ 0xe8, 0x6a, 0x84, 0xbe, 0x00, 0xe1, 0x86, 0xbd, 0xdb, 0x20, 0x48, 0x3e,
+ 0x6e, 0xb1, 0xa1, 0x3e, 0x0b, 0x10, 0x19, 0x3e, 0xa6, 0xf3, 0x24, 0x3e,
+ 0x92, 0x07, 0x7e, 0xbe, 0x4c, 0xc1, 0xa1, 0xbd, 0xf8, 0x0a, 0xe3, 0x3d,
+ 0xf1, 0xa0, 0x8e, 0x3e, 0x6d, 0xf5, 0xe7, 0x3d, 0xd6, 0x9e, 0xa2, 0x3d,
+ 0xd7, 0x71, 0x47, 0xbc, 0x8a, 0xfd, 0x03, 0xbe, 0x40, 0x4a, 0x77, 0xbe,
+ 0xd8, 0xe4, 0x82, 0x3d, 0x8b, 0xec, 0x39, 0xbe, 0xf9, 0xa8, 0x69, 0xbd,
+ 0xb2, 0xab, 0x43, 0xbe, 0x5e, 0x45, 0xb0, 0xbc, 0x51, 0x70, 0xeb, 0xbd,
+ 0x01, 0x5f, 0xca, 0x3c, 0xfd, 0x93, 0x2e, 0x3e, 0x39, 0xd0, 0x1e, 0x3e,
+ 0x5e, 0xd3, 0x70, 0x3e, 0xec, 0x15, 0x31, 0x3d, 0x86, 0x66, 0xfe, 0x3d,
+ 0xf6, 0x8b, 0x82, 0x3c, 0xfa, 0x98, 0x06, 0xbe, 0x0f, 0xd8, 0xa7, 0xbd,
+ 0x91, 0x0a, 0x11, 0xbd, 0x4f, 0xb5, 0xe7, 0xbd, 0xde, 0xcc, 0x8d, 0xbc,
+ 0x11, 0xa1, 0xe9, 0xbd, 0x2d, 0x15, 0x0f, 0x3e, 0xd8, 0x67, 0xa2, 0xbe,
+ 0x12, 0x75, 0xc2, 0x3d, 0x34, 0x77, 0x9d, 0xbd, 0x63, 0x2b, 0x4c, 0x3c,
+ 0xe2, 0xd9, 0xd5, 0x3c, 0x78, 0x91, 0xfe, 0x3d, 0x97, 0xf8, 0x14, 0x3e,
+ 0xf4, 0x89, 0xd8, 0x3b, 0xb2, 0x8e, 0x29, 0x3d, 0xa3, 0xe9, 0x75, 0xbe,
+ 0x1e, 0xd1, 0x9c, 0xbe, 0xba, 0x14, 0x49, 0x3e, 0x94, 0xe8, 0x2f, 0x3e,
+ 0x73, 0x26, 0xa9, 0x3d, 0x70, 0x06, 0xe3, 0x3d, 0xee, 0x6c, 0x10, 0xbd,
+ 0x31, 0xb0, 0x83, 0xbd, 0x62, 0xf3, 0x2a, 0xbe, 0x29, 0x77, 0x80, 0x3d,
+ 0x14, 0xd5, 0xac, 0xbd, 0x76, 0xd2, 0x95, 0x3d, 0x37, 0xd3, 0x1b, 0xbd,
+ 0xc6, 0xab, 0xb0, 0x3c, 0xdb, 0x11, 0x00, 0xbe, 0x7e, 0x21, 0x8d, 0xbe,
+ 0x56, 0x19, 0x9a, 0x3d, 0x51, 0xbf, 0xbf, 0xbd, 0x77, 0xa0, 0xf9, 0x3d,
+ 0x38, 0xf3, 0x85, 0x3c, 0x53, 0x0e, 0xa0, 0xbe, 0x80, 0x84, 0x10, 0x3d,
+ 0xc5, 0x6f, 0x2f, 0xbe, 0x8b, 0x39, 0x0c, 0xbe, 0xd2, 0xe1, 0xd2, 0xbd,
+ 0xd1, 0x5c, 0x01, 0xbe, 0x1d, 0x15, 0x24, 0x3d, 0x14, 0x4e, 0xd5, 0xbd,
+ 0x55, 0x32, 0x4c, 0x3c, 0xf8, 0x6d, 0x0d, 0xbc, 0x34, 0x31, 0x95, 0x3d,
+ 0xc5, 0x83, 0x73, 0xbd, 0x1d, 0x65, 0x34, 0x3d, 0x05, 0x4f, 0x20, 0xbe,
+ 0xf9, 0x50, 0x83, 0x3d, 0xf3, 0x04, 0xf3, 0xbd, 0xe3, 0x87, 0x72, 0xbc,
+ 0xde, 0xe9, 0x0d, 0x3d, 0xee, 0x9e, 0x68, 0x3c, 0xa0, 0x8a, 0x5d, 0x3d,
+ 0x1f, 0x0f, 0x68, 0x3d, 0x24, 0x50, 0x00, 0xbe, 0xe2, 0xea, 0x02, 0x3e,
+ 0xb6, 0x75, 0xd3, 0xbc, 0xb0, 0xac, 0x4e, 0x3d, 0x71, 0xef, 0x71, 0x3d,
+ 0xff, 0xf0, 0x28, 0x3e, 0x1c, 0xbd, 0xd1, 0xbd, 0x52, 0x8e, 0x2d, 0x3d,
+ 0xa1, 0x26, 0xeb, 0xbc, 0x74, 0xa2, 0x15, 0x3e, 0x65, 0x9c, 0x20, 0x3e,
+ 0x31, 0xbf, 0x3e, 0x3d, 0xca, 0x3a, 0x22, 0xbe, 0x29, 0x0c, 0x61, 0x3d,
+ 0xd3, 0x1b, 0xe9, 0x3d, 0xe7, 0xcf, 0x1b, 0x3e, 0x1f, 0x6b, 0x33, 0x3d,
+ 0x9b, 0x4a, 0x1d, 0xbe, 0xce, 0x0d, 0xd2, 0x3d, 0x50, 0xdd, 0xb8, 0x3c,
+ 0x59, 0xde, 0xf6, 0xbd, 0x98, 0xd2, 0x4b, 0xbe, 0x84, 0x4e, 0x20, 0x3e,
+ 0xae, 0x00, 0x6c, 0xbd, 0xcd, 0x70, 0xd7, 0xbc, 0x07, 0x03, 0x87, 0xbb,
+ 0x5a, 0x6c, 0xa6, 0xbd, 0x68, 0x22, 0x91, 0x3c, 0xc2, 0xa5, 0x90, 0x3d,
+ 0xd9, 0xac, 0xf4, 0xbc, 0x44, 0x55, 0x83, 0x3c, 0x19, 0xdc, 0x0a, 0x3e,
+ 0x37, 0xb5, 0x3e, 0x3e, 0x79, 0xc1, 0xce, 0x3c, 0xb8, 0xd0, 0xaf, 0xbc,
+ 0xa6, 0xf6, 0x27, 0xbc, 0xea, 0x94, 0x75, 0x3c, 0x2f, 0x31, 0x99, 0x3a,
+ 0x41, 0x01, 0xdb, 0xbc, 0xb6, 0x1b, 0x6c, 0xbb, 0x6e, 0x19, 0xb8, 0x3e,
+ 0x87, 0x7b, 0xed, 0xbd, 0xf7, 0x37, 0x39, 0x3d, 0x56, 0x58, 0x84, 0x3c,
+ 0x63, 0xbe, 0xe2, 0x3d, 0xe1, 0xe7, 0x17, 0xbe, 0x7f, 0x02, 0xba, 0x3d,
+ 0x5a, 0x58, 0x05, 0xbe, 0xa3, 0xe3, 0xa0, 0xbc, 0xd4, 0x5d, 0x42, 0x3d,
+ 0x9e, 0x58, 0xaa, 0x3d, 0x65, 0x1e, 0xf3, 0xbd, 0x47, 0x74, 0x80, 0xbd,
+ 0x1d, 0x8e, 0xcc, 0xbc, 0x96, 0x4a, 0x0d, 0xbe, 0xf6, 0x66, 0x07, 0x3e,
+ 0x5d, 0x14, 0x27, 0xbe, 0xae, 0x88, 0xc7, 0xbc, 0x7e, 0x80, 0x65, 0xbe,
+ 0xb1, 0x0b, 0xd1, 0xba, 0x99, 0x0e, 0x9d, 0x3d, 0x84, 0x40, 0x01, 0x3d,
+ 0x39, 0x79, 0x01, 0xbe, 0xff, 0xde, 0x46, 0xbe, 0x27, 0xa2, 0x3c, 0x3c,
+ 0xbe, 0x83, 0xdd, 0xbd, 0x65, 0xa0, 0x92, 0xbd, 0xbb, 0x26, 0xa0, 0xbd,
+ 0x63, 0xca, 0xb5, 0xbd, 0xbe, 0xba, 0xda, 0xbd, 0x37, 0xac, 0xc0, 0x3d,
+ 0x95, 0x5c, 0xd0, 0xbd, 0xf2, 0x01, 0xaf, 0x3b, 0xd0, 0xa2, 0xd0, 0x3d,
+ 0x88, 0xd1, 0x98, 0x3d, 0x1b, 0x36, 0x50, 0xbe, 0x81, 0xb2, 0x05, 0x3d,
+ 0x52, 0x21, 0x98, 0xbe, 0x9a, 0xe4, 0x59, 0x3e, 0x34, 0xaf, 0xd5, 0xbc,
+ 0xa5, 0xcb, 0xe9, 0x3c, 0xda, 0x02, 0x96, 0xbd, 0x9a, 0x24, 0x71, 0x3c,
+ 0xc1, 0x8c, 0x0a, 0xbc, 0x1c, 0xb6, 0x35, 0xbe, 0x87, 0xfc, 0xff, 0xbd,
+ 0x13, 0xe0, 0x86, 0xbd, 0xe0, 0x15, 0x16, 0xbe, 0x12, 0xa5, 0xff, 0xbb,
+ 0x0a, 0x01, 0xb4, 0xbd, 0x4e, 0x9a, 0x08, 0xbc, 0x4c, 0x40, 0x81, 0xbe,
+ 0x7b, 0xf2, 0x92, 0xbd, 0xe2, 0xfc, 0x9a, 0x3d, 0x17, 0x30, 0x00, 0x3e,
+ 0xff, 0x16, 0x8d, 0x3e, 0x85, 0x0c, 0x31, 0xbe, 0x97, 0xfa, 0xd2, 0x3d,
+ 0x2f, 0x06, 0x88, 0xbe, 0x2a, 0x11, 0xa0, 0x3b, 0xba, 0x38, 0x89, 0xbd,
+ 0x17, 0x33, 0x83, 0x3d, 0x48, 0xde, 0x81, 0x3d, 0x23, 0x28, 0x2b, 0xbc,
+ 0xac, 0xf6, 0xb7, 0xbd, 0xe0, 0x5b, 0x7c, 0x3c, 0x21, 0x1c, 0xf5, 0xbd,
+ 0x00, 0xf8, 0x62, 0x3d, 0x43, 0x83, 0xe3, 0xbd, 0xca, 0x6f, 0x67, 0xbe,
+ 0xb4, 0x60, 0x12, 0x3e, 0xdb, 0xbd, 0x82, 0xbd, 0x93, 0x3c, 0x8a, 0x3d,
+ 0xd8, 0xdb, 0x4c, 0xbd, 0xdf, 0x85, 0xb1, 0xbc, 0xa1, 0x8b, 0x83, 0x3d,
+ 0x5c, 0x6d, 0x46, 0xbe, 0xcb, 0xec, 0x2c, 0xbd, 0xca, 0x0e, 0xfe, 0x3d,
+ 0x98, 0xec, 0xe7, 0x3d, 0x62, 0x57, 0xeb, 0x3d, 0xee, 0xb3, 0x7e, 0x3c,
+ 0x91, 0x4a, 0xbf, 0x3c, 0x5a, 0xbd, 0x9e, 0xbd, 0xb2, 0x60, 0x9a, 0x3c,
+ 0xa9, 0xe0, 0xff, 0xbc, 0x49, 0x20, 0x9c, 0xbc, 0x49, 0xca, 0x3f, 0x3e,
+ 0x32, 0x2f, 0x29, 0xbe, 0xb6, 0xb5, 0x92, 0xbd, 0x23, 0xa2, 0x99, 0xbb,
+ 0x3d, 0x69, 0x50, 0x3e, 0xe6, 0x07, 0xb9, 0xbb, 0x3a, 0x39, 0xcc, 0xbc,
+ 0x83, 0x14, 0x0f, 0xbe, 0x80, 0x24, 0x73, 0xbd, 0x30, 0xa1, 0xcf, 0x3d,
+ 0xa7, 0xe5, 0xfb, 0xbd, 0x8b, 0xff, 0xee, 0xbd, 0xda, 0x4f, 0x94, 0x3d,
+ 0xb5, 0x9b, 0x60, 0x3d, 0x08, 0x65, 0x73, 0x3d, 0x84, 0x52, 0x96, 0xbd,
+ 0xbc, 0x84, 0xb4, 0xbd, 0xb6, 0xf5, 0x46, 0x3d, 0x5d, 0x9a, 0x53, 0x3e,
+ 0xd5, 0x36, 0x8c, 0x3b, 0x66, 0x84, 0xa5, 0xbd, 0x76, 0x07, 0x41, 0x3c,
+ 0x76, 0xd9, 0x91, 0x3e, 0xe6, 0xed, 0xf6, 0x3d, 0xc0, 0x7c, 0x95, 0xbd,
+ 0x67, 0xc1, 0x13, 0x3e, 0xd1, 0x45, 0xbc, 0x3d, 0x71, 0x62, 0x39, 0xbe,
+ 0xc4, 0x88, 0x47, 0x3e, 0x64, 0x5b, 0xe6, 0x3d, 0x0a, 0x21, 0xdf, 0x3e,
+ 0x72, 0x36, 0x2b, 0xbe, 0x47, 0x78, 0x85, 0xbb, 0x72, 0xf6, 0x5b, 0x3d,
+ 0x1b, 0x64, 0x0d, 0x3d, 0x55, 0xe2, 0xe5, 0x3c, 0x8d, 0x6b, 0xe2, 0xbc,
+ 0x5b, 0xf8, 0xee, 0x3c, 0xe1, 0x81, 0xc5, 0x3d, 0x20, 0x63, 0xd4, 0xbd,
+ 0x18, 0xb3, 0x7a, 0x3e, 0xe3, 0x22, 0xf2, 0xbd, 0x68, 0x78, 0xa8, 0xbd,
+ 0xef, 0x2e, 0x09, 0x3d, 0xcb, 0xfc, 0xd3, 0xbc, 0x9e, 0x90, 0x2e, 0x3e,
+ 0x6d, 0xe6, 0x07, 0xbe, 0xbd, 0xf6, 0x0b, 0x3c, 0x0c, 0x39, 0xba, 0xbc,
+ 0xcd, 0x5b, 0x06, 0xbd, 0xcd, 0x51, 0xec, 0x3d, 0x40, 0xd8, 0x35, 0x3b,
+ 0x0b, 0xb1, 0x14, 0xbe, 0xbf, 0xe4, 0xbd, 0xbd, 0x89, 0x55, 0xa3, 0xbd,
+ 0x1a, 0x29, 0x44, 0xbd, 0x80, 0xc7, 0x2d, 0xbd, 0x75, 0xd5, 0x58, 0xbc,
+ 0xcb, 0xc8, 0xff, 0xbc, 0x84, 0x36, 0x92, 0x3d, 0x87, 0x9e, 0x9d, 0x3c,
+ 0x66, 0x3b, 0x10, 0xbe, 0xcc, 0x97, 0x17, 0xbd, 0x20, 0x27, 0xfe, 0x3d,
+ 0x4b, 0x00, 0xb6, 0x3c, 0xc8, 0xe9, 0x1f, 0xbe, 0x7c, 0x60, 0xaf, 0x3d,
+ 0xff, 0x1c, 0x00, 0xbe, 0x27, 0xf8, 0x18, 0x3e, 0x8c, 0x69, 0x88, 0x3c,
+ 0xa7, 0xfc, 0x98, 0xbe, 0x8f, 0x54, 0x91, 0x3e, 0x0b, 0x3f, 0x1e, 0xbe,
+ 0x0f, 0x68, 0xdb, 0x3d, 0xef, 0x6c, 0x87, 0xbd, 0x38, 0x9a, 0x82, 0xbe,
+ 0x4a, 0xbc, 0x9e, 0x3e, 0x57, 0x7f, 0xa9, 0x3d, 0xf2, 0x8d, 0xfb, 0xbd,
+ 0x21, 0x5a, 0x22, 0x3e, 0x02, 0x3c, 0x33, 0xbe, 0x18, 0x59, 0x37, 0x3e,
+ 0x6f, 0x52, 0x8c, 0x3c, 0x2d, 0xa7, 0x70, 0xbd, 0x54, 0x5c, 0x57, 0x3e,
+ 0x00, 0xd8, 0x96, 0xbe, 0x09, 0xe7, 0x0f, 0x3e, 0x5f, 0x12, 0x8c, 0x3e,
+ 0x7d, 0xda, 0x10, 0xbd, 0x4a, 0x16, 0x53, 0xbd, 0xab, 0x30, 0xa4, 0xbb,
+ 0xdc, 0xfc, 0x71, 0xbd, 0x63, 0xf0, 0xa7, 0xbc, 0xf8, 0x14, 0x79, 0x3c,
+ 0xd2, 0x01, 0xe3, 0x3d, 0xe8, 0xcd, 0x0e, 0xbd, 0xe7, 0x69, 0xc4, 0xbd,
+ 0xab, 0x0a, 0xfb, 0x3d, 0x40, 0xa3, 0x11, 0x3d, 0x2b, 0xf4, 0x42, 0xbb,
+ 0xbb, 0xef, 0x07, 0xbf, 0x1a, 0xf7, 0x89, 0xbe, 0x4c, 0x70, 0x18, 0xbe,
+ 0x51, 0x12, 0x0d, 0xbd, 0x96, 0x02, 0x65, 0xbd, 0x43, 0xdc, 0x6e, 0x3c,
+ 0x28, 0x11, 0xda, 0x3c, 0x22, 0xe3, 0xa8, 0xbe, 0xa6, 0x36, 0x55, 0xbe,
+ 0xcd, 0x65, 0xe3, 0x3c, 0xcc, 0xa7, 0x96, 0xbe, 0xe2, 0x27, 0xdf, 0x3d,
+ 0x4d, 0xce, 0xda, 0xbd, 0xd1, 0xc7, 0x0e, 0xbe, 0x51, 0x8e, 0xb5, 0xbd,
+ 0xe0, 0x53, 0x46, 0xbe, 0x43, 0x3a, 0xd6, 0x3d, 0x01, 0xc9, 0xaa, 0xbe,
+ 0xc3, 0xfb, 0xe1, 0x3e, 0x41, 0x8d, 0xc7, 0x3d, 0xf0, 0x74, 0x63, 0xbe,
+ 0xcf, 0xbe, 0x76, 0x3d, 0xee, 0x8d, 0xdc, 0x3d, 0x1c, 0x16, 0x9f, 0xbc,
+ 0x78, 0x2d, 0x36, 0xbe, 0xd9, 0x6d, 0xc3, 0xbc, 0x85, 0xc5, 0x63, 0x3e,
+ 0x5a, 0x7b, 0x9a, 0xbd, 0xa2, 0x35, 0x34, 0x3b, 0x75, 0x20, 0xd9, 0x3d,
+ 0x89, 0x3c, 0x2a, 0x3e, 0x68, 0x64, 0xd4, 0xbd, 0xc6, 0xe5, 0x27, 0xbf,
+ 0x2e, 0x52, 0x10, 0x3e, 0x0e, 0xa6, 0x2c, 0x3e, 0x2f, 0x01, 0x84, 0xbd,
+ 0x50, 0xbd, 0x90, 0x3e, 0xc6, 0xca, 0x1c, 0xbd, 0x0e, 0xa5, 0x34, 0x3e,
+ 0x6e, 0xd5, 0xf4, 0xbe, 0xda, 0xb1, 0x7e, 0x3d, 0x05, 0x69, 0x82, 0x3e,
+ 0xcc, 0x7f, 0x38, 0x3f, 0x65, 0x2d, 0x47, 0xbd, 0xc5, 0x2b, 0x38, 0x3e,
+ 0x2a, 0xb9, 0xbf, 0xbc, 0xf6, 0x41, 0x83, 0xbe, 0xf6, 0x5b, 0x4f, 0xbe,
+ 0x78, 0x35, 0x12, 0x3f, 0xe4, 0xea, 0x46, 0x3d, 0x23, 0x57, 0x63, 0x3e,
+ 0x7d, 0x35, 0x3b, 0xbe, 0xc8, 0x8f, 0xe9, 0x3b, 0x02, 0x9d, 0x12, 0xbe,
+ 0x64, 0x6c, 0x53, 0x3d, 0x18, 0x84, 0x06, 0x3e, 0xa3, 0x48, 0x62, 0xbe,
+ 0x79, 0x92, 0x64, 0x3e, 0xdc, 0x58, 0x07, 0x3e, 0xb2, 0x79, 0x2b, 0xbf,
+ 0x97, 0x28, 0x1d, 0x3e, 0xd6, 0x58, 0x93, 0xbd, 0x1f, 0x26, 0x76, 0xbd,
+ 0x54, 0xe1, 0x1c, 0x3f, 0xa5, 0xdd, 0xbe, 0x3e, 0x8e, 0xb2, 0xd8, 0x3d,
+ 0x76, 0xd2, 0x3b, 0xbe, 0xe0, 0x3b, 0x88, 0xbe, 0x2f, 0x76, 0xf6, 0xbe,
+ 0xdc, 0x33, 0xd7, 0xbd, 0x6d, 0x89, 0xc9, 0xbd, 0xb5, 0xef, 0x9f, 0x3e,
+ 0x63, 0xda, 0xda, 0xbe, 0xf6, 0x15, 0x81, 0xbd, 0x55, 0x1c, 0xa1, 0xbe,
+ 0xa8, 0xf8, 0x1f, 0x3a, 0x1a, 0x24, 0xff, 0xbe, 0xd4, 0x81, 0x39, 0x3d,
+ 0xea, 0x42, 0x26, 0xbe, 0x22, 0xfc, 0x50, 0x3e, 0xfa, 0x9d, 0xd8, 0x3d,
+ 0x65, 0xf1, 0xb2, 0x3d, 0x2b, 0xd5, 0xdc, 0x3e, 0x70, 0x6f, 0xaa, 0xbe,
+ 0xa0, 0x5e, 0x8f, 0xbd, 0xfc, 0xc8, 0x11, 0xbe, 0x9d, 0x37, 0x3e, 0x3d,
+ 0x65, 0xac, 0x9d, 0x3d, 0x14, 0xd8, 0x9b, 0x3d, 0xc8, 0xb1, 0xc2, 0xbd,
+ 0x12, 0x33, 0x81, 0xbd, 0x34, 0x2c, 0xdd, 0xbd, 0x02, 0xd2, 0xe0, 0xbd,
+ 0x0b, 0xe1, 0x6b, 0x3d, 0xd8, 0xc7, 0xb7, 0xbd, 0xbc, 0xb8, 0x5b, 0xbe,
+ 0xed, 0x69, 0x0c, 0x3d, 0x92, 0x5e, 0x98, 0xbd, 0xe8, 0xdc, 0x35, 0xbe,
+ 0x7d, 0xd3, 0xe0, 0x3d, 0xe3, 0x97, 0xeb, 0xbd, 0x50, 0xf5, 0x36, 0x3d,
+ 0x2b, 0x3f, 0x24, 0xbd, 0x39, 0xd5, 0xeb, 0xbd, 0x0a, 0x24, 0xca, 0x3d,
+ 0xd5, 0xac, 0xfc, 0xbd, 0x28, 0xe3, 0x92, 0x3d, 0x7b, 0xd2, 0xd9, 0xbd,
+ 0x21, 0x30, 0x86, 0xbd, 0x3e, 0x04, 0xeb, 0xbc, 0xd6, 0x79, 0xa5, 0xbd,
+ 0x7b, 0x87, 0xe2, 0xbd, 0x62, 0x66, 0xb9, 0xbd, 0x3f, 0xc0, 0x51, 0x3d,
+ 0xdd, 0xc2, 0x67, 0x3d, 0xfd, 0x60, 0x1c, 0x3e, 0x01, 0xbb, 0x20, 0xbd,
+ 0x0a, 0xd6, 0xf5, 0xbb, 0xa0, 0x44, 0x14, 0xbd, 0xe4, 0x7b, 0xc2, 0xbd,
+ 0x8c, 0x3b, 0x18, 0x3d, 0x52, 0xdd, 0xf1, 0xbd, 0x93, 0x5e, 0xc2, 0x3d,
+ 0x0f, 0x17, 0xee, 0x3d, 0x2a, 0x5b, 0xfb, 0x3d, 0xe7, 0xe9, 0xcc, 0x3c,
+ 0xa8, 0x3e, 0xf7, 0xbd, 0x22, 0x29, 0x01, 0x3e, 0xb9, 0xb9, 0x97, 0x3d,
+ 0x6f, 0x71, 0x0d, 0xbd, 0xfe, 0x72, 0x43, 0x3d, 0xa8, 0x8e, 0x51, 0xbe,
+ 0xac, 0x5b, 0x9a, 0x3d, 0x59, 0x04, 0xa1, 0xbd, 0x46, 0x8d, 0xf5, 0xbd,
+ 0xe9, 0x06, 0xbb, 0x3d, 0x4e, 0xc2, 0x01, 0x3d, 0x93, 0x5e, 0x4c, 0xbd,
+ 0x84, 0xd7, 0x85, 0xbd, 0x32, 0xf0, 0xd9, 0x3d, 0x4d, 0x9b, 0xd4, 0x3d,
+ 0x9e, 0xb6, 0x04, 0xbe, 0xce, 0x71, 0xc2, 0x3d, 0x56, 0x5e, 0xa8, 0x3d,
+ 0x1c, 0x46, 0xbf, 0xbd, 0xd6, 0x69, 0x9a, 0xb9, 0x50, 0x07, 0xb9, 0xbd,
+ 0x41, 0x89, 0xff, 0xbd, 0x55, 0xd1, 0x17, 0xbc, 0xeb, 0x89, 0x0f, 0xbd,
+ 0x48, 0xe5, 0xbe, 0x3c, 0xb5, 0x90, 0x47, 0xbc, 0x7f, 0x40, 0x94, 0x3d,
+ 0xd7, 0x1d, 0x66, 0x3c, 0xa1, 0xbd, 0x59, 0xbc, 0x18, 0xfd, 0xaf, 0xbc,
+ 0xdd, 0xc3, 0x0c, 0x3e, 0x5a, 0x74, 0xf0, 0xbd, 0xeb, 0x8b, 0x85, 0xbd,
+ 0x00, 0x81, 0x09, 0x3e, 0xac, 0x24, 0x64, 0xbe, 0x2a, 0x7b, 0x07, 0x3e,
+ 0xfb, 0x8e, 0x80, 0x3d, 0x78, 0xd8, 0x05, 0xbe, 0x89, 0x1e, 0xa3, 0xbd,
+ 0xef, 0xf7, 0x01, 0xbe, 0x69, 0x74, 0xaf, 0x3c, 0x0f, 0xc7, 0x97, 0x3d,
+ 0x67, 0x3a, 0xfa, 0xbd, 0x7b, 0x01, 0x86, 0xbe, 0x20, 0x6d, 0x29, 0x3d,
+ 0xa3, 0x2e, 0xc1, 0xbc, 0xe5, 0x28, 0xc2, 0x3d, 0x12, 0xb4, 0x6a, 0xbd,
+ 0x02, 0xba, 0x53, 0xbd, 0x73, 0xaa, 0x26, 0xbd, 0x67, 0x92, 0xad, 0x3d,
+ 0xe3, 0xb1, 0x3a, 0x3d, 0xf2, 0xe0, 0xf0, 0xbc, 0x6b, 0xd8, 0xb5, 0x3c,
+ 0x21, 0x14, 0x2e, 0x3e, 0xe8, 0xc3, 0xe3, 0x3d, 0x69, 0x90, 0xf8, 0x3c,
+ 0x56, 0xa8, 0x11, 0xbd, 0xd4, 0x86, 0x2c, 0x3e, 0xfe, 0xda, 0x01, 0x3e,
+ 0x85, 0xce, 0x2f, 0x3d, 0x8a, 0x99, 0x54, 0xbe, 0x09, 0x43, 0xff, 0xbd,
+ 0xa3, 0x96, 0xed, 0x3d, 0xdc, 0xfc, 0xc5, 0xbd, 0x0e, 0x98, 0x9b, 0x3d,
+ 0x76, 0x3a, 0x83, 0x3d, 0x22, 0xca, 0x90, 0x3d, 0xb1, 0xfd, 0xd8, 0xbd,
+ 0x4e, 0x8d, 0x6d, 0x3c, 0x97, 0x6c, 0xe5, 0x3d, 0x0f, 0x3f, 0xb2, 0x3d,
+ 0x8c, 0x00, 0x66, 0xbe, 0x22, 0x61, 0x10, 0xbe, 0xdf, 0xf7, 0x34, 0xbd,
+ 0x43, 0xa1, 0xc2, 0xbe, 0xfc, 0xf9, 0x3c, 0x3e, 0x21, 0x93, 0xd4, 0x3d,
+ 0x12, 0x65, 0x7d, 0xbd, 0xcc, 0x6e, 0x9c, 0x3e, 0xf1, 0x6d, 0x82, 0xbd,
+ 0xc3, 0x77, 0x5a, 0xbd, 0xf5, 0x27, 0x05, 0xbe, 0x4d, 0x80, 0x67, 0xbe,
+ 0x34, 0x23, 0x3e, 0x3e, 0x59, 0x40, 0xde, 0x3c, 0x20, 0xde, 0x30, 0x3e,
+ 0x84, 0xbe, 0xa9, 0x3d, 0x9e, 0xc4, 0x17, 0x3d, 0x8a, 0xee, 0xb5, 0xbd,
+ 0x84, 0xab, 0x1e, 0xbe, 0x47, 0xce, 0xef, 0xbd, 0x20, 0xe8, 0x45, 0x3d,
+ 0x9d, 0x12, 0x6f, 0xbe, 0x1b, 0x5b, 0x9d, 0xbe, 0xc2, 0xa1, 0x0d, 0x3e,
+ 0xd3, 0x9c, 0xed, 0x3c, 0x28, 0x8f, 0x8d, 0xbd, 0x05, 0xe4, 0x24, 0xbe,
+ 0x43, 0x58, 0xfa, 0xbb, 0xaf, 0x96, 0x11, 0xbe, 0xee, 0x06, 0xa0, 0xbc,
+ 0x32, 0xf2, 0x0e, 0xbd, 0x54, 0x9c, 0x70, 0xbd, 0x45, 0x42, 0x1f, 0x3e,
+ 0xe0, 0x25, 0xcb, 0x3d, 0xab, 0x59, 0x28, 0xbd, 0x53, 0x96, 0x9b, 0x3e,
+ 0x82, 0xb6, 0xa9, 0xbe, 0xdc, 0xa5, 0x31, 0xbe, 0xa4, 0xe0, 0x42, 0x3c,
+ 0x6e, 0x35, 0x0e, 0xbe, 0xa4, 0x54, 0x4f, 0xbe, 0x32, 0xdf, 0xc9, 0xbd,
+ 0xc7, 0x2a, 0x6f, 0x3d, 0x51, 0xab, 0x9e, 0xbe, 0x75, 0x9d, 0x5b, 0xbe,
+ 0x53, 0x06, 0xd2, 0xbc, 0xf2, 0x6e, 0xa8, 0xbd, 0xe3, 0xab, 0x8d, 0x3e,
+ 0xc5, 0xd4, 0xd4, 0xbb, 0xac, 0x28, 0x6c, 0xbe, 0xb3, 0x1e, 0x2f, 0xbe,
+ 0x5d, 0xf9, 0xee, 0xbd, 0xdf, 0x5d, 0xb7, 0xbc, 0xd8, 0x92, 0x16, 0xbe,
+ 0xba, 0x3c, 0x60, 0x3e, 0x4f, 0x9c, 0x5b, 0x3d, 0x1c, 0x6a, 0x0f, 0xbe,
+ 0x73, 0xc2, 0xda, 0xbd, 0x62, 0xb2, 0x30, 0xbd, 0xda, 0x26, 0x0c, 0xbd,
+ 0xdd, 0x0f, 0x8e, 0xbe, 0xf1, 0xe5, 0xa2, 0xbe, 0xb9, 0xf5, 0xd8, 0x3d,
+ 0xdf, 0xb8, 0x45, 0xbe, 0x67, 0x2a, 0xa5, 0xbc, 0xa9, 0x61, 0x83, 0x3d,
+ 0xe0, 0xb7, 0xc4, 0x3e, 0x84, 0xe4, 0xba, 0xbd, 0x05, 0xc5, 0x4e, 0xbd,
+ 0xed, 0xb0, 0x82, 0x3e, 0x3c, 0x8d, 0x08, 0xbe, 0x0d, 0x08, 0x62, 0xbd,
+ 0xff, 0xba, 0xe6, 0x3d, 0x2e, 0x29, 0x96, 0x3b, 0x81, 0xd3, 0xdb, 0xbd,
+ 0x83, 0xb6, 0x7b, 0xbe, 0xbe, 0x6c, 0x8e, 0x3d, 0x9c, 0x88, 0x5e, 0x3e,
+ 0x5e, 0xd7, 0x06, 0x3f, 0x84, 0x3a, 0xa9, 0xbd, 0x3b, 0x4e, 0xbe, 0x3d,
+ 0x7e, 0x48, 0xc3, 0x3d, 0x28, 0xc9, 0x81, 0x3d, 0xa3, 0x55, 0x08, 0x3d,
+ 0x1c, 0xc4, 0xbe, 0x3d, 0x33, 0xb0, 0x67, 0xbd, 0xe0, 0xe8, 0xc0, 0xbd,
+ 0x8d, 0xac, 0x55, 0x3d, 0x96, 0xca, 0xf3, 0xbd, 0xc1, 0x87, 0x84, 0xbe,
+ 0x35, 0x48, 0x08, 0x3e, 0xd1, 0x1d, 0x85, 0xbd, 0x7b, 0x9d, 0xc6, 0xbe,
+ 0x39, 0xad, 0x56, 0xbe, 0x64, 0x7c, 0x1c, 0x3e, 0x59, 0x41, 0x1e, 0xbe,
+ 0x54, 0x70, 0xe6, 0xbc, 0xba, 0x7d, 0x63, 0xbc, 0x19, 0x99, 0xa7, 0x3e,
+ 0x1c, 0x4d, 0xba, 0x3e, 0x07, 0xc1, 0x11, 0x3e, 0x77, 0x35, 0x04, 0x3e,
+ 0x86, 0x1c, 0x21, 0xbb, 0x0c, 0xc2, 0xe1, 0xbd, 0x0e, 0xb9, 0x99, 0xbe,
+ 0xc1, 0x83, 0xaa, 0xbd, 0xdf, 0x5d, 0x9e, 0xbc, 0x33, 0xa3, 0xce, 0x3d,
+ 0x55, 0x41, 0x24, 0xbe, 0xbb, 0x39, 0x27, 0xbd, 0x63, 0xd8, 0xff, 0xbe,
+ 0x6e, 0xd6, 0xa0, 0x3d, 0x4a, 0xf9, 0xeb, 0xbc, 0x33, 0xaa, 0xde, 0x3d,
+ 0x5c, 0x4c, 0x10, 0xbe, 0x85, 0x56, 0xfc, 0x3d, 0xd8, 0x03, 0xc6, 0xbc,
+ 0x63, 0xb1, 0x43, 0x3e, 0x5f, 0x64, 0xa2, 0x3d, 0xa3, 0x56, 0x9a, 0xbe,
+ 0xd4, 0x73, 0x7e, 0x3d, 0x21, 0xa6, 0x65, 0x3e, 0x02, 0x81, 0x36, 0x3e,
+ 0xc2, 0x2a, 0x8d, 0xbd, 0x0d, 0x37, 0xd5, 0x3d, 0x41, 0xce, 0xaa, 0xbc,
+ 0xd9, 0xde, 0x3b, 0xbc, 0x6e, 0x7e, 0x16, 0xbe, 0xf0, 0x0d, 0x75, 0x3d,
+ 0x29, 0x65, 0x54, 0x3d, 0xd0, 0x7e, 0x66, 0xbd, 0xe7, 0x34, 0x14, 0x3e,
+ 0x2e, 0xc6, 0x4d, 0xbd, 0x41, 0xe7, 0x7e, 0xbc, 0x9c, 0xb1, 0xbc, 0x3c,
+ 0xa0, 0x1b, 0xce, 0x3d, 0x35, 0xc2, 0x8d, 0x3d, 0x4d, 0xc3, 0x1f, 0xbb,
+ 0xa4, 0xc3, 0x4f, 0x3d, 0x9a, 0x55, 0x3f, 0xbe, 0xd4, 0x77, 0x9e, 0x3d,
+ 0x86, 0x6d, 0x8e, 0x3d, 0x9e, 0x56, 0xa6, 0xbd, 0xec, 0x45, 0xaa, 0xbd,
+ 0x59, 0xf3, 0x2c, 0x3d, 0x39, 0xa5, 0xcb, 0xbd, 0x50, 0xed, 0xfe, 0x3d,
+ 0x35, 0xc8, 0x5e, 0x3d, 0xe4, 0x2a, 0x44, 0xbd, 0x2b, 0x15, 0x19, 0xbe,
+ 0x84, 0xa8, 0x8c, 0xbd, 0x3f, 0x65, 0x46, 0x3a, 0x8e, 0x1d, 0x23, 0x3c,
+ 0x9f, 0x55, 0xd6, 0xbc, 0xd8, 0x7c, 0xeb, 0xbc, 0xf1, 0xb4, 0x08, 0xbd,
+ 0xef, 0x90, 0x4c, 0x3d, 0x96, 0xc0, 0xd4, 0x3c, 0x78, 0x54, 0x1c, 0xbe,
+ 0x48, 0x80, 0x12, 0xbd, 0x84, 0x08, 0x53, 0x3c, 0xd6, 0xb0, 0xf8, 0x3d,
+ 0x4a, 0xcb, 0x71, 0xbe, 0x8d, 0xe4, 0x9d, 0x3d, 0xd7, 0x4a, 0xdc, 0x3d,
+ 0x8c, 0xae, 0xe7, 0x3d, 0x1e, 0xf7, 0x24, 0x3d, 0x86, 0x61, 0xad, 0x3d,
+ 0x60, 0x80, 0x42, 0xbd, 0x03, 0xf2, 0x35, 0xbd, 0xb1, 0x70, 0xe1, 0xbb,
+ 0xb9, 0xe4, 0x39, 0xbe, 0x1c, 0xaf, 0x83, 0xbe, 0x1e, 0x3e, 0x04, 0x3e,
+ 0x82, 0xa4, 0xff, 0x3d, 0x17, 0xcb, 0xe0, 0xbd, 0xbf, 0xe0, 0xab, 0xbd,
+ 0xf0, 0xdc, 0xb7, 0xbc, 0x0a, 0xf7, 0x21, 0x3e, 0x81, 0xf9, 0xd5, 0xbb,
+ 0x21, 0xe1, 0x0f, 0xbd, 0xce, 0xf4, 0x01, 0xbd, 0x11, 0xe4, 0xea, 0xbd,
+ 0x20, 0xfa, 0xa7, 0xbd, 0x2d, 0xee, 0xde, 0xbb, 0x86, 0x14, 0x6b, 0xbd,
+ 0xe7, 0xfd, 0xb2, 0x3b, 0x15, 0xff, 0x1c, 0x3b, 0x2e, 0x91, 0x4a, 0x3e,
+ 0xc0, 0xc5, 0x70, 0xbd, 0x43, 0xb4, 0x30, 0xbe, 0xdd, 0x73, 0x32, 0xbe,
+ 0x84, 0x65, 0x42, 0x3d, 0xe5, 0x10, 0xdc, 0x3d, 0xe7, 0x20, 0x76, 0xbd,
+ 0x3f, 0xc8, 0x29, 0x3d, 0x5d, 0x30, 0x50, 0x3e, 0xc6, 0xca, 0xea, 0xbd,
+ 0x7d, 0xca, 0x96, 0x3d, 0x18, 0x69, 0xd6, 0x3d, 0x5b, 0x75, 0x22, 0xbd,
+ 0x13, 0xc6, 0xc4, 0x3d, 0x02, 0x15, 0xad, 0xbd, 0x61, 0x37, 0x18, 0xbe,
+ 0x40, 0x85, 0x55, 0x3d, 0xd1, 0xe4, 0x94, 0x3d, 0x56, 0x13, 0x2d, 0x3e,
+ 0xb4, 0x79, 0x40, 0xbd, 0x59, 0xb5, 0x0a, 0xbd, 0x01, 0xf5, 0xe9, 0xbc,
+ 0x6d, 0x22, 0x6a, 0xbd, 0xde, 0xc3, 0x09, 0x3d, 0x5a, 0xa2, 0xb5, 0xbd,
+ 0xdc, 0x1e, 0xb1, 0xbd, 0x64, 0x40, 0xdf, 0x3b, 0xb8, 0xe6, 0x40, 0x3e,
+ 0x40, 0x85, 0x7b, 0xbd, 0x5c, 0x92, 0x0a, 0xbe, 0x90, 0xb0, 0xb5, 0x3c,
+ 0x65, 0xf7, 0xd8, 0x3d, 0x54, 0xab, 0xf2, 0x3b, 0x1d, 0x16, 0x9c, 0x3d,
+ 0x00, 0xcf, 0x9e, 0xbd, 0x6a, 0x99, 0x7b, 0xba, 0x68, 0x2e, 0x8d, 0xbd,
+ 0xe2, 0x49, 0x03, 0x3e, 0xc9, 0xe8, 0x0f, 0xbe, 0x04, 0xf3, 0x9e, 0xbd,
+ 0x5c, 0x70, 0x06, 0xbe, 0x66, 0x41, 0x7d, 0x3d, 0x48, 0x5b, 0xa9, 0xbd,
+ 0x43, 0xab, 0xc2, 0xbd, 0x4c, 0x97, 0x18, 0xbd, 0x35, 0x90, 0x09, 0x3e,
+ 0x37, 0x66, 0xf0, 0x3c, 0x8f, 0x23, 0x27, 0xbe, 0xca, 0xf7, 0x11, 0x3e,
+ 0x4d, 0x17, 0x73, 0x3b, 0x9b, 0xd0, 0x1f, 0x3e, 0x94, 0xd3, 0x0f, 0x3e,
+ 0x9e, 0xfe, 0xe7, 0x3c, 0x81, 0x70, 0x10, 0xbd, 0x29, 0x42, 0x14, 0x3d,
+ 0x2d, 0x62, 0x45, 0x3d, 0xf6, 0x48, 0x86, 0xbe, 0xc8, 0xa0, 0x11, 0xbd,
+ 0x1d, 0x7a, 0x01, 0xbe, 0x8c, 0x9c, 0xc1, 0xbd, 0x63, 0xdf, 0x2f, 0x3e,
+ 0x78, 0xfc, 0xa2, 0xbd, 0xc1, 0x29, 0xf7, 0xbd, 0x7d, 0x4d, 0xc1, 0xbd,
+ 0xee, 0x5d, 0xd0, 0xbd, 0xcd, 0xba, 0x07, 0xbe, 0xb2, 0xa9, 0xa6, 0x3d,
+ 0xd2, 0x91, 0x77, 0x3e, 0x30, 0x20, 0x42, 0xbe, 0xdc, 0x43, 0x9c, 0x3d,
+ 0x84, 0x65, 0x46, 0xbe, 0xe2, 0xf2, 0xcc, 0xbd, 0x02, 0x9c, 0xae, 0x3d,
+ 0x48, 0xac, 0xe0, 0xbc, 0xd1, 0xa3, 0x00, 0xbe, 0xf3, 0xdf, 0x1c, 0x3e,
+ 0x8f, 0x51, 0xdc, 0x3d, 0xd2, 0xba, 0xb0, 0xbc, 0x3e, 0x84, 0x93, 0xbd,
+ 0xe3, 0x00, 0x58, 0x3d, 0xd7, 0x69, 0x55, 0xbd, 0xfa, 0x14, 0x04, 0xbd,
+ 0xa9, 0xf2, 0x1b, 0x3e, 0xa9, 0x10, 0xb1, 0x3c, 0x97, 0xec, 0x55, 0xbd,
+ 0x99, 0xcb, 0x19, 0x3d, 0xeb, 0x7d, 0x17, 0xbe, 0x0e, 0xc2, 0x90, 0x3d,
+ 0xf9, 0x7f, 0x47, 0xbe, 0xc6, 0x5d, 0x43, 0xbe, 0x34, 0xb7, 0x87, 0x3d,
+ 0x30, 0x26, 0x86, 0xbe, 0xd3, 0x81, 0x9d, 0x3d, 0xf7, 0xbc, 0xd0, 0xbd,
+ 0x00, 0x64, 0x3b, 0x3d, 0xc8, 0x85, 0x4e, 0xbd, 0x5b, 0xef, 0x1b, 0x3e,
+ 0xd3, 0xb6, 0xf8, 0x3c, 0xb3, 0xc0, 0x9d, 0x3d, 0x93, 0xc4, 0x07, 0x3e,
+ 0xff, 0x83, 0x44, 0xbe, 0xfe, 0xc3, 0x91, 0xbd, 0x2c, 0x98, 0x4c, 0xbd,
+ 0x0e, 0xc8, 0x0d, 0x3c, 0x4f, 0x08, 0x9f, 0xbd, 0x40, 0xd5, 0x2f, 0xbe,
+ 0x6e, 0x5e, 0x2a, 0x3e, 0x0e, 0x45, 0x39, 0x3e, 0x01, 0x68, 0xaa, 0xbd,
+ 0x2f, 0x90, 0xa1, 0x3c, 0x21, 0x99, 0x0b, 0xbe, 0x15, 0x12, 0xba, 0x3d,
+ 0xdc, 0x28, 0x92, 0xbd, 0x34, 0x09, 0xb7, 0xbd, 0xea, 0x6d, 0x2d, 0x3e,
+ 0x28, 0x6c, 0x06, 0xbd, 0xfe, 0xf5, 0x30, 0xbd, 0xcc, 0x3b, 0x58, 0x3e,
+ 0x2d, 0xd8, 0x26, 0x3e, 0xb3, 0x51, 0xee, 0xbd, 0x53, 0x33, 0xc2, 0xbd,
+ 0x85, 0x61, 0x2f, 0x3e, 0xef, 0x38, 0x94, 0xbd, 0xfa, 0x0c, 0xe7, 0x3c,
+ 0xcf, 0xc4, 0x04, 0x3c, 0x4b, 0x30, 0x4d, 0x3e, 0x02, 0x46, 0x3c, 0xbe,
+ 0x29, 0x91, 0xec, 0x3d, 0x11, 0x52, 0x3c, 0xbd, 0xaf, 0x82, 0x32, 0xbd,
+ 0xdd, 0x2a, 0x4c, 0x3d, 0x4d, 0x7e, 0xd7, 0x3d, 0x54, 0x2d, 0x4f, 0xbd,
+ 0xcf, 0x24, 0x3e, 0x3e, 0x9f, 0x51, 0xa0, 0xbd, 0xbc, 0xa5, 0x0a, 0x3e,
+ 0x88, 0xc4, 0x8d, 0x3d, 0xbf, 0x1f, 0x3c, 0xbd, 0xda, 0x2c, 0xf9, 0xbc,
+ 0xa5, 0x60, 0xb0, 0x3c, 0x39, 0xb1, 0xd8, 0xbd, 0xdc, 0xaa, 0x9c, 0xbd,
+ 0xb8, 0x28, 0x23, 0xbe, 0x83, 0xb1, 0x52, 0xbd, 0x8e, 0xf0, 0x0c, 0x3e,
+ 0xd7, 0xb0, 0xd4, 0xbd, 0xf7, 0xa6, 0xbb, 0xbc, 0x6a, 0xd6, 0x3b, 0xbd,
+ 0x36, 0x1b, 0x21, 0x3e, 0x46, 0x88, 0x18, 0x3e, 0x95, 0x88, 0xb7, 0x3d,
+ 0x5b, 0xd9, 0xeb, 0xbc, 0x20, 0xf3, 0x91, 0xbc, 0x2e, 0xcd, 0x8f, 0xba,
+ 0xc9, 0x23, 0x94, 0x3d, 0xa9, 0x49, 0xe7, 0xbc, 0xee, 0xc8, 0x95, 0xbd,
+ 0x99, 0x78, 0x2e, 0x3d, 0xc5, 0x56, 0xd7, 0x3d, 0xe8, 0xfb, 0xd7, 0x3d,
+ 0xf9, 0xe9, 0x40, 0xbe, 0x9a, 0x6a, 0x11, 0xbd, 0xbb, 0x96, 0x1f, 0x3e,
+ 0x70, 0x92, 0xf8, 0xbd, 0xc8, 0x49, 0xe5, 0xbc, 0x8c, 0x0b, 0xe1, 0xbc,
+ 0x01, 0xd7, 0x1f, 0x3e, 0x1d, 0x82, 0xdb, 0xbc, 0xe1, 0xe9, 0x65, 0x3e,
+ 0x23, 0xe4, 0xfe, 0xbe, 0xa0, 0xc2, 0x24, 0x3d, 0xcd, 0xcc, 0x5e, 0xbe,
+ 0xfa, 0x03, 0xff, 0x3d, 0x33, 0x93, 0xd7, 0x3d, 0x90, 0x1b, 0x89, 0xbe,
+ 0x12, 0x73, 0xa3, 0x3d, 0x92, 0xd7, 0x8c, 0x3d, 0xd6, 0x11, 0x2c, 0xbe,
+ 0x9c, 0x39, 0x03, 0xbf, 0x15, 0x87, 0x0a, 0xbc, 0xb8, 0xc5, 0xb5, 0xbd,
+ 0xae, 0x5c, 0xe6, 0xbd, 0x18, 0x86, 0xe4, 0x3d, 0x72, 0x77, 0x95, 0xbe,
+ 0x2b, 0x2f, 0xf6, 0x3d, 0x50, 0xfa, 0xb2, 0x3d, 0x1c, 0x3d, 0x8b, 0x3e,
+ 0x87, 0x03, 0x40, 0x3e, 0x3f, 0xd8, 0x78, 0xbd, 0x2d, 0x3e, 0xee, 0xbd,
+ 0x91, 0xa7, 0x2d, 0xbe, 0x7b, 0x97, 0x36, 0x3d, 0x75, 0x67, 0x62, 0xbe,
+ 0xaf, 0xa4, 0x50, 0x3d, 0xec, 0xe0, 0x27, 0xbe, 0x4f, 0xf4, 0xa8, 0xbe,
+ 0x5a, 0x5e, 0xcb, 0xbe, 0xd7, 0xc4, 0xf6, 0xbc, 0xef, 0xa4, 0xb3, 0x3d,
+ 0x22, 0x1a, 0x27, 0x3d, 0x1d, 0x35, 0x4c, 0xbe, 0xe9, 0xb1, 0xba, 0xbb,
+ 0xb0, 0x6d, 0xc1, 0xbd, 0x3f, 0x86, 0xf2, 0xbc, 0xc7, 0x72, 0x1e, 0xbd,
+ 0xda, 0xbf, 0xac, 0xbc, 0x99, 0x88, 0x99, 0xbd, 0x12, 0xd1, 0xb7, 0xbc,
+ 0xd8, 0x5e, 0x9d, 0x38, 0xc2, 0xd7, 0xe7, 0xbc, 0xd0, 0xc0, 0xac, 0xbe,
+ 0xa3, 0x84, 0xbe, 0xbd, 0xc4, 0x46, 0xda, 0x3e, 0xd1, 0xdb, 0x1f, 0xbe,
+ 0x92, 0xf2, 0x80, 0x3d, 0xbf, 0x9f, 0x74, 0xbe, 0xee, 0x1a, 0x7f, 0xbd,
+ 0xe3, 0x70, 0x61, 0x3d, 0x19, 0x31, 0xb7, 0xbc, 0xbd, 0x5c, 0x40, 0x3e,
+ 0xd4, 0x12, 0xcb, 0x3d, 0x08, 0x5b, 0x78, 0xbe, 0x62, 0xa6, 0x4f, 0xbb,
+ 0x97, 0x7b, 0x0a, 0x3e, 0x19, 0xa7, 0x09, 0xbe, 0x1c, 0x9f, 0x9e, 0x3d,
+ 0x91, 0xa7, 0xd7, 0x3d, 0xbd, 0xd8, 0x80, 0xbe, 0x66, 0x08, 0xb3, 0xbb,
+ 0x65, 0xc0, 0xf4, 0x3c, 0x30, 0x7c, 0xe2, 0xbd, 0x22, 0x43, 0x40, 0xbe,
+ 0x81, 0x9e, 0xeb, 0xbb, 0x1e, 0xb3, 0x87, 0x3e, 0x41, 0xc1, 0xdf, 0xbd,
+ 0x9d, 0x2a, 0x18, 0xbe, 0x01, 0x98, 0x49, 0xbe, 0xe6, 0x63, 0x25, 0x3e,
+ 0xbc, 0x8f, 0xd3, 0xbd, 0x4f, 0xdd, 0x93, 0x3d, 0x30, 0x71, 0x1b, 0xbd,
+ 0x72, 0x64, 0xc0, 0xbc, 0xb6, 0xd1, 0x23, 0xba, 0x5a, 0x83, 0xc0, 0x3d,
+ 0xe2, 0xad, 0xbd, 0xbe, 0xb3, 0x2d, 0x96, 0x3e, 0xa6, 0xf2, 0xaf, 0x3d,
+ 0x4c, 0x5f, 0xd4, 0x3e, 0x1c, 0x4a, 0x7f, 0x3d, 0x94, 0x80, 0x4c, 0xbe,
+ 0x7d, 0x79, 0x8f, 0xbd, 0xbe, 0xb3, 0x67, 0x3e, 0x63, 0xa0, 0xa4, 0xbe,
+ 0x34, 0xfe, 0x7c, 0xbe, 0x5e, 0x3d, 0x44, 0xbe, 0x89, 0x49, 0x31, 0x3e,
+ 0x75, 0xb2, 0x32, 0x3e, 0x9f, 0xeb, 0x5a, 0xbe, 0xe1, 0x34, 0x27, 0xbe,
+ 0xa4, 0x51, 0x49, 0xbc, 0x05, 0xa3, 0x1b, 0x3e, 0xc1, 0x3c, 0x90, 0xbc,
+ 0x3e, 0x08, 0xa4, 0x3e, 0x11, 0x4d, 0x51, 0x3d, 0x37, 0x97, 0x7c, 0x3e,
+ 0xad, 0x27, 0x1f, 0x3e, 0x5c, 0xaf, 0x36, 0x3e, 0x16, 0xd3, 0x5b, 0xbe,
+ 0x62, 0x68, 0x14, 0xbe, 0xfa, 0x76, 0xe8, 0x3c, 0x64, 0x4b, 0x99, 0x3b,
+ 0x25, 0x3b, 0x88, 0xbe, 0xb4, 0x36, 0xa3, 0xbd, 0x43, 0x6c, 0xa4, 0xbe,
+ 0x3b, 0xe6, 0x7b, 0x3c, 0xaa, 0xc2, 0x14, 0x3e, 0xad, 0xab, 0xf2, 0x3d,
+ 0x11, 0x5c, 0xa6, 0xbc, 0xce, 0xaf, 0x9e, 0xbd, 0x97, 0x08, 0xd0, 0x3d,
+ 0xa8, 0xb8, 0x9c, 0x3d, 0x0c, 0x73, 0x90, 0x3e, 0x45, 0x27, 0xd2, 0xbd,
+ 0x12, 0x7c, 0x88, 0x3d, 0x69, 0xdb, 0x71, 0xbe, 0x2b, 0x8a, 0x9c, 0x3d,
+ 0x6a, 0x30, 0x54, 0xbb, 0xae, 0xf7, 0x83, 0x3d, 0x11, 0xbb, 0x0d, 0xbc,
+ 0x4c, 0x3a, 0x1a, 0x3e, 0x91, 0xa7, 0xdc, 0xbd, 0xca, 0xb0, 0x18, 0xbe,
+ 0x16, 0x3d, 0xbf, 0xbc, 0xc6, 0xc2, 0x6a, 0x3c, 0x86, 0x41, 0xca, 0x3c,
+ 0x22, 0xc7, 0xa9, 0xbd, 0x5e, 0x09, 0xc9, 0x3d, 0xe1, 0x6b, 0x49, 0x3e,
+ 0x10, 0x41, 0xcc, 0xbc, 0x35, 0x8e, 0x88, 0xbd, 0x38, 0x72, 0x22, 0x3e,
+ 0xa7, 0xf9, 0xa8, 0x3c, 0x5f, 0x23, 0x27, 0xbd, 0x70, 0x47, 0xd4, 0x3d,
+ 0x29, 0xea, 0x43, 0xbd, 0x4b, 0x27, 0x2b, 0xbe, 0x77, 0x26, 0x27, 0xbe,
+ 0x4e, 0xfd, 0x24, 0x3d, 0x55, 0x0b, 0xca, 0xbd, 0xc7, 0x4a, 0x2e, 0x3e,
+ 0x08, 0x50, 0xd9, 0x3d, 0xf8, 0x48, 0x22, 0x3d, 0xfe, 0xbd, 0xa1, 0x3d,
+ 0xf6, 0x11, 0x06, 0x3c, 0x8e, 0xdd, 0x3e, 0x3d, 0xdd, 0x51, 0xb0, 0x3c,
+ 0x0a, 0x47, 0x75, 0xbc, 0x48, 0x66, 0xf7, 0xbc, 0x36, 0x25, 0xe0, 0x3c,
+ 0xf9, 0xb8, 0x0f, 0xbe, 0xe3, 0x28, 0xc7, 0x3c, 0xa9, 0x45, 0x46, 0x3d,
+ 0xf6, 0x55, 0x68, 0xbe, 0x5f, 0xac, 0x7d, 0x3d, 0x0a, 0x4f, 0x2e, 0xbd,
+ 0x66, 0x3d, 0x37, 0xbe, 0xdd, 0xa6, 0x06, 0xbe, 0x8c, 0x62, 0xd8, 0xbc,
+ 0x28, 0xf1, 0x9d, 0x3c, 0x4e, 0xe4, 0x60, 0xbc, 0x58, 0x6a, 0x28, 0xbd,
+ 0xd8, 0xd6, 0xe0, 0x3d, 0x7a, 0x94, 0x35, 0xbd, 0x51, 0x52, 0xc8, 0x3d,
+ 0x40, 0x30, 0xaa, 0xbd, 0x20, 0xf4, 0x6c, 0x3c, 0x1c, 0x24, 0x81, 0xbd,
+ 0xf3, 0xa4, 0x9e, 0xbd, 0xfc, 0xf3, 0x2c, 0x3d, 0x77, 0x99, 0x03, 0xbe,
+ 0xf5, 0x4e, 0x8f, 0xbc, 0xe7, 0x1a, 0xb9, 0x3d, 0xed, 0xa1, 0x30, 0x3d,
+ 0x0f, 0x1f, 0x2b, 0x3e, 0x03, 0xac, 0xb8, 0x3d, 0x5f, 0x1f, 0xa0, 0xbd,
+ 0xda, 0x69, 0x0d, 0x3e, 0x43, 0x79, 0x9f, 0x3d, 0x30, 0x71, 0xc7, 0x3c,
+ 0xef, 0xec, 0xcb, 0x3d, 0x8e, 0x2c, 0x28, 0x3d, 0xf3, 0xce, 0xb2, 0x3d,
+ 0xfa, 0xc1, 0xb1, 0x3d, 0xf0, 0x14, 0xb9, 0xbd, 0x5e, 0xf2, 0xe9, 0x3d,
+ 0xdc, 0x49, 0x6a, 0x3d, 0x50, 0xb7, 0xae, 0xbc, 0x18, 0x34, 0xe5, 0x3d,
+ 0xd8, 0xb3, 0xe1, 0x3d, 0x9c, 0xbc, 0x53, 0xbe, 0xa6, 0xf8, 0x01, 0x3d,
+ 0x90, 0x42, 0x16, 0xbc, 0xe2, 0xed, 0x11, 0x3d, 0x3f, 0x57, 0xab, 0xbe,
+ 0x51, 0xef, 0x06, 0x3e, 0x00, 0xc6, 0x72, 0x3c, 0x4f, 0x04, 0x14, 0x3e,
+ 0x79, 0x47, 0x01, 0xbc, 0xaa, 0xd6, 0x33, 0xbe, 0x1b, 0x23, 0xe0, 0x3d,
+ 0xdd, 0xbc, 0xe3, 0xbd, 0x5c, 0x02, 0x1f, 0x3e, 0x8d, 0xb7, 0x77, 0x3d,
+ 0xb2, 0xc7, 0x8e, 0x3d, 0xb1, 0xf3, 0x2c, 0x3e, 0x38, 0x59, 0x9e, 0x3c,
+ 0x1d, 0x12, 0x8f, 0xbd, 0x56, 0x6f, 0x06, 0xbd, 0x54, 0xbc, 0x9a, 0xbd,
+ 0x94, 0x41, 0xd6, 0x3d, 0x49, 0xf3, 0x0c, 0x3e, 0x81, 0xd5, 0x8e, 0xbd,
+ 0x6d, 0x9f, 0x16, 0x3e, 0x92, 0xb6, 0x25, 0x3d, 0xf3, 0x6e, 0x2a, 0xbd,
+ 0xe1, 0xdc, 0x06, 0xbe, 0x7e, 0x2b, 0x63, 0xbd, 0x18, 0x74, 0xe7, 0xbd,
+ 0x3b, 0x0f, 0xb0, 0x3d, 0x9e, 0x6b, 0x16, 0x3e, 0x0d, 0xc0, 0x81, 0xbd,
+ 0xf0, 0x3f, 0x1b, 0x3d, 0x1b, 0x33, 0x93, 0x3c, 0xf2, 0x4b, 0x19, 0xbc,
+ 0x4f, 0x29, 0x5a, 0xbb, 0x9e, 0x40, 0xf9, 0xbd, 0x7a, 0x06, 0x21, 0x3e,
+ 0x4a, 0x55, 0x64, 0xbe, 0xe0, 0x5d, 0x05, 0xbe, 0xe2, 0x4d, 0xa8, 0xbd,
+ 0xce, 0x26, 0xaf, 0x3d, 0xac, 0x5f, 0x6d, 0x3d, 0x68, 0xcf, 0xe6, 0x3c,
+ 0xc9, 0xe2, 0x33, 0xbc, 0x15, 0x4d, 0xdd, 0x3e, 0x4d, 0xc1, 0xb6, 0x3d,
+ 0xb4, 0x4e, 0x15, 0xbe, 0x65, 0xc1, 0xb4, 0xbd, 0x9e, 0x59, 0x78, 0xbe,
+ 0x32, 0xe4, 0xb7, 0x3e, 0x2d, 0x2e, 0xb9, 0xbd, 0xb7, 0x6e, 0xe8, 0x3d,
+ 0x52, 0x3b, 0x85, 0x3e, 0xf3, 0xdd, 0xaa, 0x3c, 0xff, 0x81, 0xcf, 0xbd,
+ 0xba, 0x40, 0xb7, 0xbc, 0x6a, 0x54, 0xa0, 0xbc, 0x9c, 0xb4, 0x8f, 0x3d,
+ 0xe3, 0x2a, 0x2b, 0xbe, 0xcc, 0xd5, 0x71, 0xbd, 0xfe, 0xb6, 0x62, 0x3e,
+ 0x85, 0xc5, 0xa3, 0x3d, 0xf6, 0xc4, 0x27, 0xbd, 0xf5, 0x46, 0xb0, 0xbc,
+ 0x16, 0x77, 0x0b, 0xbe, 0xbe, 0xb9, 0xd3, 0x3d, 0x7e, 0x18, 0x6d, 0x3d,
+ 0xc3, 0x9b, 0x19, 0x3e, 0x50, 0x21, 0x0a, 0xbc, 0x8c, 0x66, 0xa4, 0x3d,
+ 0xec, 0x36, 0x25, 0x3d, 0x9f, 0xfd, 0x17, 0x3e, 0x55, 0x21, 0xb7, 0x3e,
+ 0xb4, 0x0e, 0xa2, 0xbe, 0x36, 0xab, 0x7e, 0xbc, 0xa4, 0x66, 0x15, 0x3d,
+ 0x05, 0x9a, 0x12, 0xbd, 0x84, 0x4c, 0x69, 0x3c, 0x9b, 0xf4, 0xa1, 0x3d,
+ 0x77, 0x31, 0xa4, 0xbd, 0xfc, 0x76, 0x92, 0xbe, 0xcc, 0xfc, 0x85, 0xbe,
+ 0xdc, 0x66, 0x02, 0xbe, 0xf1, 0x41, 0x5e, 0xbe, 0xb0, 0xee, 0xba, 0x3e,
+ 0x15, 0x5d, 0x2d, 0x3e, 0xc6, 0x55, 0x67, 0xbe, 0xed, 0xde, 0x17, 0xbe,
+ 0xf0, 0xbb, 0x92, 0xbe, 0xb8, 0xc3, 0xff, 0x3d, 0x5d, 0x06, 0xa7, 0xbe,
+ 0xb8, 0x46, 0xca, 0x3e, 0xc6, 0x35, 0x57, 0xbd, 0x27, 0xa5, 0xcb, 0xbd,
+ 0x25, 0x1f, 0x09, 0xbd, 0x95, 0xa2, 0xca, 0xbd, 0x25, 0xc1, 0x62, 0xbd,
+ 0x5f, 0xdc, 0x8a, 0x3d, 0xb5, 0xbd, 0xaf, 0xbe, 0x17, 0x25, 0xda, 0xbd,
+ 0x62, 0x09, 0x68, 0xbe, 0xda, 0x8c, 0x80, 0x3e, 0x32, 0xeb, 0x39, 0xbe,
+ 0xfc, 0x1f, 0xa5, 0x3e, 0xd3, 0x0e, 0xa4, 0xbd, 0x80, 0x49, 0x16, 0x3e,
+ 0x3f, 0x73, 0x83, 0x3e, 0x7d, 0xb4, 0x85, 0xbc, 0x19, 0xc2, 0x6c, 0x3d,
+ 0xe3, 0x43, 0x9a, 0x3e, 0xbc, 0xeb, 0xd9, 0x3d, 0xd1, 0xba, 0x15, 0xbe,
+ 0xd4, 0xf6, 0xd2, 0xbe, 0xe1, 0x9d, 0xd5, 0xbd, 0x46, 0xd8, 0x7f, 0x3e,
+ 0x33, 0x34, 0x8b, 0x3e, 0xb8, 0x17, 0x3d, 0x3e, 0x7e, 0x43, 0x2b, 0x3e,
+ 0xfa, 0xff, 0xf2, 0x3c, 0x0d, 0xc7, 0x4a, 0xbe, 0x91, 0x2a, 0x1b, 0xbe,
+ 0x7f, 0x13, 0xb7, 0x3e, 0xdd, 0x32, 0x6a, 0x3d, 0x29, 0xda, 0xd1, 0x3d,
+ 0xb8, 0xe6, 0xaf, 0x3d, 0x1b, 0x59, 0xce, 0xbc, 0xef, 0xa6, 0x96, 0xbe,
+ 0x08, 0xbe, 0x0e, 0x3e, 0x09, 0x10, 0x91, 0xbd, 0xf9, 0xad, 0xd6, 0xbe,
+ 0x0f, 0xd9, 0x73, 0xbe, 0x1c, 0x79, 0x08, 0x3e, 0x04, 0xd0, 0xc0, 0xbe,
+ 0xbf, 0xd9, 0x2c, 0xbe, 0x78, 0xba, 0x5d, 0x3e, 0x9a, 0x89, 0xa4, 0x3e,
+ 0x48, 0x8f, 0xac, 0x3e, 0x19, 0xed, 0xdf, 0x3d, 0x58, 0xdd, 0xc6, 0xbd,
+ 0xf5, 0xe0, 0x62, 0x3e, 0xc6, 0x89, 0x25, 0xbe, 0xa9, 0xb6, 0x75, 0xbe,
+ 0x4e, 0x56, 0xfd, 0x3d, 0xea, 0x8f, 0x2a, 0xbe, 0x2d, 0xd0, 0xef, 0x3d,
+ 0xeb, 0x25, 0xd4, 0xbd, 0x94, 0xb9, 0x7f, 0xbd, 0x64, 0x5c, 0x12, 0xbf,
+ 0x68, 0xa0, 0xbd, 0xbd, 0x20, 0x2e, 0xf6, 0xbd, 0x32, 0xd6, 0xbd, 0x3d,
+ 0xcd, 0x49, 0x31, 0xbe, 0xa7, 0xa2, 0x98, 0x3e, 0x3b, 0x2b, 0x53, 0x3e,
+ 0xef, 0x68, 0x65, 0x3e, 0x1b, 0xb6, 0x13, 0x3e, 0xa6, 0x28, 0xe1, 0xbe,
+ 0xf8, 0xa5, 0x34, 0x3c, 0x5d, 0xc7, 0xf8, 0x3b, 0xe1, 0xc9, 0x3d, 0xbd,
+ 0xba, 0x39, 0x60, 0xbd, 0x89, 0xc8, 0x2f, 0x3d, 0x10, 0x9f, 0xcd, 0x3d,
+ 0xab, 0xfd, 0x1a, 0xbd, 0x49, 0xbc, 0x7a, 0xbe, 0x58, 0xc9, 0xcb, 0x3c,
+ 0x2b, 0xbc, 0x27, 0xbe, 0xf1, 0x66, 0xd9, 0x3c, 0x8b, 0x5e, 0xe5, 0x3d,
+ 0x26, 0x2b, 0x5b, 0x3d, 0xe0, 0x7d, 0x0a, 0xbe, 0xd9, 0x90, 0x13, 0xbd,
+ 0xd1, 0x4c, 0x83, 0x3d, 0x76, 0xf5, 0xd0, 0x3d, 0xe5, 0x24, 0xf3, 0x3c,
+ 0xd2, 0xcc, 0xb6, 0x3a, 0x84, 0xe8, 0xc2, 0xbe, 0xfc, 0x7a, 0x6f, 0x3c,
+ 0x80, 0x1f, 0x29, 0x3c, 0x34, 0x7b, 0x63, 0xbc, 0x9c, 0xe3, 0x46, 0x3d,
+ 0x2e, 0xf5, 0xbe, 0xbc, 0xd5, 0x8a, 0x9c, 0x3d, 0x92, 0x91, 0x33, 0xbd,
+ 0x0e, 0xe8, 0xf1, 0xbc, 0xeb, 0xae, 0xbd, 0xbd, 0xb5, 0x81, 0x9d, 0xbc,
+ 0x7a, 0x0a, 0x5f, 0xbe, 0xe2, 0x9a, 0x2c, 0xbc, 0x96, 0x4d, 0x9b, 0x3d,
+ 0x65, 0x29, 0x76, 0x3d, 0xc5, 0x0c, 0xaa, 0xbd, 0x41, 0x1a, 0x2a, 0x3d,
+ 0xdb, 0x8b, 0x9e, 0x3b, 0x39, 0x7f, 0x3f, 0x3d, 0xde, 0x3c, 0x10, 0xbe,
+ 0x55, 0x9d, 0x57, 0xbd, 0x5a, 0x90, 0x8d, 0xbe, 0xb2, 0x96, 0x1e, 0x3e,
+ 0x11, 0x56, 0x13, 0xbe, 0xf1, 0x2b, 0x02, 0xbe, 0xa0, 0xbf, 0x4d, 0x3c,
+ 0xce, 0x88, 0x92, 0x3c, 0xbd, 0x4b, 0x88, 0xbd, 0xdd, 0x11, 0x4c, 0x3e,
+ 0x08, 0x50, 0x11, 0xbe, 0xdb, 0xb9, 0x00, 0xbb, 0xed, 0x55, 0xef, 0xbd,
+ 0x31, 0x7e, 0x0c, 0xbe, 0x59, 0x10, 0x36, 0xbe, 0x67, 0x2f, 0x05, 0x3e,
+ 0x45, 0x13, 0x0e, 0x3e, 0x86, 0x57, 0x6c, 0xbd, 0xbb, 0xc7, 0x82, 0xbc,
+ 0x10, 0x1c, 0xf6, 0x3d, 0x79, 0xe8, 0x16, 0x3e, 0x10, 0x7c, 0x15, 0x3e,
+ 0xf9, 0xcb, 0x7c, 0xbd, 0xa6, 0x24, 0x5a, 0x3d, 0xa6, 0x10, 0x1a, 0xbe,
+ 0x20, 0x2b, 0xad, 0x3d, 0x49, 0xa5, 0x3f, 0xbe, 0x5c, 0xf7, 0x41, 0x3e,
+ 0x64, 0x28, 0x21, 0xbe, 0xc3, 0x21, 0x9b, 0xbd, 0xbe, 0x5c, 0x31, 0x3d,
+ 0x0d, 0x66, 0x22, 0x3e, 0xd9, 0x97, 0xba, 0x3d, 0x72, 0x05, 0x20, 0xbe,
+ 0x76, 0x65, 0xdd, 0xbc, 0x5f, 0x82, 0xda, 0x3c, 0x08, 0x82, 0xcf, 0xbc,
+ 0xe2, 0x2a, 0xb1, 0x3c, 0x80, 0x0d, 0xd5, 0x3d, 0xc5, 0x93, 0x5f, 0xbd,
+ 0x46, 0x62, 0x2b, 0x3e, 0x08, 0xde, 0xae, 0x3d, 0xce, 0x41, 0xae, 0xbd,
+ 0x85, 0x61, 0x0f, 0xbe, 0x66, 0xc9, 0x84, 0xbd, 0x20, 0xe3, 0x43, 0x3d,
+ 0x80, 0xa7, 0xb1, 0xbd, 0x87, 0xfe, 0x01, 0x3e, 0x74, 0xf9, 0x71, 0x3c,
+ 0x41, 0xf7, 0xab, 0xbd, 0xdf, 0xe2, 0xcc, 0x3d, 0x56, 0x8a, 0xa0, 0xbd,
+ 0x32, 0x73, 0xd0, 0xbd, 0xee, 0xdf, 0xf9, 0xbd, 0x3d, 0xbf, 0x40, 0xbd,
+ 0xe6, 0xd1, 0x3e, 0xbd, 0x18, 0x59, 0xad, 0x3d, 0x7d, 0x13, 0x90, 0x3d,
+ 0x94, 0xa2, 0x63, 0xbe, 0x03, 0x65, 0x8c, 0xbd, 0x9d, 0xc3, 0xb0, 0xbd,
+ 0x10, 0xba, 0xa5, 0x3d, 0xbe, 0xb6, 0x59, 0x3e, 0xf5, 0x82, 0x54, 0x3d,
+ 0xa2, 0x35, 0x33, 0x3d, 0x90, 0x4b, 0xf2, 0xbc, 0x15, 0x9a, 0x11, 0x3e,
+ 0x01, 0x73, 0xcc, 0x3d, 0x83, 0x08, 0x9e, 0xbd, 0x2b, 0x7e, 0xaf, 0x3d,
+ 0xc9, 0x06, 0x7f, 0xbd, 0xcd, 0x26, 0xda, 0xbd, 0x3e, 0x57, 0xd8, 0xbd,
+ 0x90, 0xd8, 0xa9, 0xbd, 0x80, 0xef, 0xb8, 0xbd, 0xf9, 0x03, 0x1f, 0x3e,
+ 0xf6, 0xef, 0xba, 0xbc, 0x23, 0x45, 0x55, 0xbd, 0xbd, 0x64, 0x50, 0x3d,
+ 0xc2, 0xc6, 0x88, 0xbc, 0x1b, 0x7f, 0x66, 0x3e, 0x38, 0x81, 0xd9, 0x3c,
+ 0x95, 0x05, 0x16, 0x3c, 0x51, 0x05, 0x42, 0x3d, 0x0f, 0xef, 0xa7, 0x3c,
+ 0x61, 0x00, 0x58, 0xbd, 0xad, 0x73, 0x8b, 0xbe, 0x2f, 0x4a, 0x19, 0xbe,
+ 0xa3, 0x14, 0x6f, 0xbd, 0x86, 0xa6, 0x74, 0x3d, 0x85, 0x60, 0x91, 0xbd,
+ 0x12, 0xcc, 0x2d, 0xbd, 0xc6, 0x43, 0xdf, 0xbd, 0xff, 0x19, 0xb0, 0x3d,
+ 0xb4, 0xce, 0x82, 0xbd, 0x51, 0xf9, 0xbd, 0xbd, 0x57, 0x94, 0xac, 0xbd,
+ 0xcc, 0x30, 0x80, 0x3d, 0xd5, 0x3d, 0x80, 0xbe, 0x58, 0xb2, 0x2c, 0x3e,
+ 0x4b, 0x88, 0x29, 0xbd, 0x3c, 0x9d, 0xd8, 0xbd, 0x8e, 0x25, 0xf8, 0xbd,
+ 0x8d, 0xe3, 0x43, 0xbd, 0xde, 0x60, 0x11, 0xbe, 0x05, 0x39, 0x94, 0xbc,
+ 0xe0, 0x9a, 0x39, 0xbe, 0x95, 0x69, 0x28, 0x3a, 0x07, 0xbc, 0x1e, 0x3e,
+ 0x81, 0xaf, 0x10, 0x3d, 0xa2, 0x42, 0x2d, 0xbd, 0x94, 0x58, 0xdb, 0xbd,
+ 0xbb, 0x71, 0xc6, 0xbc, 0x18, 0xba, 0x20, 0xbe, 0x49, 0x17, 0xdc, 0xbd,
+ 0xd9, 0x81, 0xa8, 0xbc, 0xc5, 0x37, 0x12, 0xbd, 0xc5, 0xd7, 0xe1, 0x3d,
+ 0x3d, 0x08, 0x8e, 0x3c, 0x24, 0xd8, 0x08, 0xbe, 0xe8, 0x4b, 0x4f, 0xbd,
+ 0xa3, 0x2e, 0x90, 0xbb, 0xda, 0x4a, 0x07, 0x3d, 0x48, 0x0b, 0xca, 0x3c,
+ 0x42, 0x67, 0xc4, 0x3b, 0xfc, 0xa2, 0xa9, 0x3d, 0x99, 0x43, 0x62, 0x3e,
+ 0xd3, 0xd5, 0x8f, 0x3d, 0xda, 0x4b, 0xc6, 0xbd, 0xc0, 0x66, 0x27, 0x3d,
+ 0x34, 0xe1, 0x33, 0xbe, 0xef, 0x4b, 0xe9, 0xbd, 0x81, 0x62, 0xbb, 0xbc,
+ 0xeb, 0x11, 0x05, 0x3e, 0x25, 0x43, 0x27, 0x3e, 0xd2, 0x60, 0x41, 0xbe,
+ 0x95, 0xf5, 0xac, 0x3d, 0xf8, 0x25, 0xfb, 0x3c, 0x34, 0x51, 0xbd, 0x3b,
+ 0xee, 0x31, 0xe0, 0x3d, 0x3c, 0xbf, 0x4c, 0xbc, 0xca, 0xc7, 0xa8, 0x3d,
+ 0x92, 0x40, 0x91, 0x3d, 0xbd, 0x0a, 0x2e, 0xbe, 0xf0, 0x5b, 0xf7, 0x3b,
+ 0x08, 0x14, 0xb1, 0x3c, 0x3f, 0x79, 0x01, 0xbd, 0xe1, 0xf9, 0x87, 0x3e,
+ 0x99, 0x79, 0x14, 0x3e, 0x30, 0xb8, 0x73, 0x3d, 0xd2, 0x62, 0x44, 0xbe,
+ 0x42, 0xcd, 0x9d, 0xbb, 0x98, 0x83, 0xbe, 0xba, 0x7e, 0x67, 0x5a, 0xbd,
+ 0x81, 0xe1, 0x99, 0x3d, 0xa6, 0xbb, 0x0b, 0x3e, 0xcd, 0x66, 0x9f, 0xbd,
+ 0x7d, 0x0b, 0x38, 0x3d, 0x16, 0xda, 0xb5, 0x3d, 0xeb, 0xb8, 0x54, 0xbd,
+ 0xc7, 0x39, 0x7b, 0x3c, 0xb0, 0xe4, 0x21, 0xbd, 0xe7, 0xf6, 0x7c, 0xbd,
+ 0xc2, 0xc6, 0xcc, 0x3d, 0x1d, 0xd5, 0x66, 0xbd, 0x02, 0x9f, 0x77, 0x3c,
+ 0xfd, 0x29, 0x4a, 0xbe, 0xda, 0xd2, 0x36, 0x3d, 0x6d, 0x0d, 0x6a, 0xbc,
+ 0x5e, 0xab, 0x8c, 0x3d, 0x3b, 0xd1, 0x0e, 0xbe, 0x65, 0x8a, 0xe9, 0xbd,
+ 0x23, 0x61, 0xb2, 0xbd, 0xe0, 0x83, 0x8c, 0xbd, 0xd2, 0xd0, 0x5b, 0xbd,
+ 0xc8, 0x39, 0x23, 0xbe, 0xbb, 0xe5, 0xa7, 0x3d, 0xb1, 0x20, 0x21, 0xbd,
+ 0xee, 0x2d, 0xe0, 0x3d, 0x57, 0x89, 0x3f, 0x3d, 0xca, 0x13, 0xf7, 0x3d,
+ 0x50, 0x63, 0x00, 0xbe, 0x83, 0x00, 0x4a, 0x3d, 0xf8, 0x2e, 0xd1, 0x3d,
+ 0x47, 0xbb, 0x39, 0x3e, 0x9c, 0x47, 0xfd, 0xbd, 0x5f, 0x99, 0x8f, 0xbd,
+ 0x07, 0x64, 0x3c, 0xbb, 0x2a, 0x9d, 0xa7, 0xbd, 0x82, 0xeb, 0xbd, 0x3d,
+ 0xa0, 0x50, 0xeb, 0xbc, 0x68, 0xf1, 0xdb, 0xbd, 0x65, 0x4a, 0x33, 0x3c,
+ 0xd2, 0xbf, 0x55, 0xbc, 0x15, 0xbd, 0xf1, 0xbd, 0x15, 0x32, 0x15, 0x3e,
+ 0x9e, 0xec, 0x70, 0xbd, 0x4f, 0xd1, 0xb2, 0xbd, 0x4d, 0xff, 0xbd, 0x3e,
+ 0x40, 0xb1, 0xeb, 0x3e, 0xd9, 0xfc, 0x40, 0x3e, 0x90, 0x4d, 0xe0, 0xbd,
+ 0xb8, 0xba, 0x9e, 0xbc, 0x16, 0x62, 0x38, 0xbe, 0x3c, 0xc5, 0xb7, 0x3e,
+ 0xc0, 0x46, 0x3f, 0xbe, 0xab, 0xaf, 0xc8, 0x3d, 0x7a, 0xe2, 0x53, 0xbe,
+ 0x2e, 0x1b, 0x76, 0xbf, 0x77, 0x94, 0x4b, 0x3a, 0x2b, 0xf9, 0x9d, 0x3e,
+ 0x87, 0x3b, 0xaf, 0xbe, 0xb1, 0xfb, 0x72, 0xbd, 0x10, 0xd6, 0xbf, 0xbe,
+ 0x2a, 0x33, 0x29, 0x3f, 0x66, 0xaa, 0x59, 0xbe, 0x45, 0x80, 0xba, 0x3d,
+ 0xc5, 0x84, 0x6f, 0x3b, 0xcb, 0x23, 0xea, 0x3d, 0xe7, 0x8e, 0xfb, 0xbd,
+ 0x44, 0x1c, 0x38, 0x3d, 0x7a, 0xd3, 0xa7, 0x3d, 0xe7, 0x07, 0xa5, 0xbc,
+ 0x0b, 0x84, 0xd6, 0x3d, 0x75, 0x2b, 0xad, 0xbe, 0x0b, 0x6c, 0x1b, 0xbf,
+ 0xdb, 0x0e, 0xfb, 0xbe, 0x5f, 0x98, 0x0a, 0xbd, 0x5b, 0xc8, 0xbb, 0x3e,
+ 0x58, 0x0d, 0xce, 0x3e, 0x16, 0x44, 0x8c, 0xbe, 0x33, 0x3e, 0xf6, 0xbc,
+ 0xd9, 0xdb, 0x52, 0xbd, 0x49, 0xbe, 0xd5, 0x3d, 0xfd, 0x7a, 0xc3, 0xbd,
+ 0xe7, 0xfe, 0x06, 0xbe, 0xb3, 0xba, 0x56, 0xbe, 0xf9, 0x08, 0xcf, 0x3d,
+ 0xb2, 0x52, 0x04, 0xbe, 0x3c, 0x5d, 0xa6, 0x3e, 0x4c, 0x45, 0x31, 0xbe,
+ 0x46, 0xe1, 0x9b, 0x3e, 0xb0, 0x97, 0x1b, 0x3d, 0x3b, 0x4d, 0x15, 0xbd,
+ 0x2c, 0x0a, 0xbe, 0xbe, 0x48, 0x2d, 0x50, 0x3c, 0x0e, 0x52, 0x26, 0x3e,
+ 0x8a, 0x7b, 0xb9, 0xbe, 0x8a, 0x5f, 0x7a, 0xbe, 0xfc, 0x69, 0xf0, 0x3e,
+ 0x71, 0xee, 0x3d, 0x3e, 0x27, 0xdf, 0x75, 0x3e, 0x90, 0xfc, 0xa6, 0x3c,
+ 0xcc, 0xcd, 0xc0, 0x3e, 0x2b, 0x6d, 0xf2, 0x3e, 0x7e, 0x38, 0xdf, 0xbd,
+ 0x4f, 0x5b, 0x81, 0x3d, 0x86, 0x09, 0x11, 0xbe, 0x0e, 0x17, 0x8a, 0xbd,
+ 0xc6, 0x06, 0x9d, 0xbe, 0x1b, 0xec, 0xc2, 0xbe, 0x41, 0x8c, 0xe3, 0xbe,
+ 0x25, 0xb3, 0x6d, 0xbe, 0x5c, 0xc9, 0x51, 0xbe, 0x11, 0x61, 0xc1, 0x3d,
+ 0x53, 0x6a, 0xd8, 0x3d, 0x62, 0x96, 0xdc, 0xbd, 0x8b, 0x36, 0x37, 0x3e,
+ 0xbf, 0xe3, 0x0f, 0x3f, 0xb9, 0x56, 0xf1, 0xbd, 0xb7, 0x2d, 0x15, 0xbf,
+ 0xb3, 0x22, 0x03, 0xbf, 0xe0, 0x59, 0xf8, 0xbd, 0x47, 0x4a, 0xae, 0xbe,
+ 0x19, 0x0a, 0xe0, 0x3e, 0x29, 0x4a, 0xcf, 0x3e, 0xfe, 0x7d, 0xdb, 0x3e,
+ 0x99, 0x9d, 0x2e, 0xbe, 0xf2, 0xf7, 0x83, 0xbd, 0x3c, 0xd5, 0xa3, 0x3d,
+ 0x6d, 0xa7, 0xe9, 0x3d, 0xa9, 0x60, 0x95, 0x3e, 0xa9, 0xdd, 0x53, 0xbe,
+ 0xfe, 0x42, 0x9c, 0x3d, 0x6b, 0xfa, 0xc9, 0xbd, 0xd2, 0x98, 0x76, 0x3e,
+ 0x1f, 0x15, 0x2b, 0xbe, 0xd5, 0xd0, 0x38, 0xbf, 0x66, 0x88, 0x95, 0x3e,
+ 0xfe, 0x34, 0x67, 0xbe, 0xbe, 0xa4, 0x1b, 0x3e, 0x46, 0x57, 0x89, 0xbd,
+ 0x41, 0x33, 0x02, 0xbf, 0xef, 0x25, 0x90, 0xbe, 0x0f, 0xe4, 0x93, 0x3e,
+ 0xe1, 0xb9, 0x9a, 0x3e, 0xd2, 0x52, 0x72, 0x3e, 0x21, 0x9e, 0x11, 0x3f,
+ 0x2b, 0xc2, 0x14, 0xbe, 0x75, 0x8b, 0x14, 0xbd, 0xe4, 0x55, 0xbb, 0xbe,
+ 0x3d, 0x76, 0x20, 0xbd, 0xbd, 0x14, 0x89, 0x3e, 0x67, 0x3b, 0x4d, 0x3c,
+ 0x19, 0xb0, 0xa4, 0x3d, 0xba, 0x3e, 0xd8, 0x3e, 0x69, 0xee, 0x74, 0xbe,
+ 0x4c, 0xf5, 0x22, 0x3d, 0xb1, 0xab, 0xd4, 0xbd, 0x4d, 0x09, 0x8b, 0x3e,
+ 0x3e, 0xd6, 0xf0, 0xbd, 0xfb, 0xdf, 0x1a, 0xbf, 0x10, 0xca, 0x71, 0x3e,
+ 0x0e, 0x2e, 0x1a, 0x3e, 0x78, 0xf7, 0x63, 0xbe, 0xcf, 0xc3, 0x32, 0xbe,
+ 0x05, 0x58, 0x55, 0x3c, 0x78, 0x9a, 0xa9, 0xbc, 0x5f, 0x7b, 0x96, 0x3d,
+ 0xa6, 0xb6, 0x90, 0xbd, 0x6f, 0xcd, 0x08, 0xbe, 0x5f, 0xf9, 0x93, 0xbe,
+ 0x2c, 0x17, 0x6b, 0xbd, 0x71, 0xa7, 0x08, 0xbe, 0x4a, 0xe7, 0x29, 0xbe,
+ 0xee, 0x42, 0xa4, 0x3d, 0xfd, 0xfc, 0x62, 0xbd, 0x36, 0x5b, 0x6c, 0xbb,
+ 0xec, 0xc6, 0xaf, 0x3d, 0xa5, 0xee, 0xd8, 0x3c, 0xc9, 0x51, 0x92, 0x3d,
+ 0x90, 0x15, 0x06, 0xbe, 0x88, 0xc8, 0xc2, 0x3c, 0x01, 0xa0, 0x50, 0x3d,
+ 0x2f, 0xaa, 0x4b, 0x3d, 0x82, 0x54, 0xc5, 0x3b, 0x25, 0xe7, 0x54, 0x3d,
+ 0xab, 0x39, 0x26, 0xbe, 0x18, 0xc0, 0x84, 0xbd, 0x93, 0x39, 0x8e, 0x3d,
+ 0x28, 0x29, 0x16, 0xbd, 0x57, 0xea, 0x42, 0x3d, 0x26, 0xd8, 0x97, 0x3d,
+ 0x9d, 0xab, 0xcd, 0xbb, 0x92, 0x9f, 0x7f, 0x3e, 0x66, 0xbc, 0x56, 0xbd,
+ 0xb0, 0x17, 0x48, 0x3d, 0xb8, 0xf3, 0xa3, 0x3c, 0x00, 0x3c, 0xcb, 0x3d,
+ 0xaf, 0x04, 0xbb, 0xbd, 0x2b, 0xd3, 0xe7, 0xbd, 0xb3, 0x64, 0xda, 0xbd,
+ 0xf2, 0xbf, 0x0b, 0xbe, 0xc1, 0x6a, 0xa6, 0xbd, 0xaf, 0x38, 0x73, 0xbb,
+ 0xbe, 0x4f, 0xf9, 0x3c, 0xcd, 0x79, 0xd2, 0xbd, 0xf7, 0xd8, 0x2f, 0x3e,
+ 0x4b, 0x73, 0xde, 0x3d, 0x1c, 0x45, 0xc5, 0x3d, 0xa2, 0x6a, 0x73, 0xbd,
+ 0x45, 0x32, 0xbc, 0x3d, 0x7e, 0x3f, 0xc3, 0x3d, 0x47, 0xb4, 0x22, 0xbe,
+ 0x0a, 0x85, 0x8c, 0xbc, 0xe6, 0x66, 0x6a, 0xbd, 0xea, 0x31, 0x0b, 0xba,
+ 0x92, 0xc3, 0x99, 0xbd, 0xee, 0x76, 0x57, 0x3d, 0x86, 0xc9, 0xac, 0xbd,
+ 0x7a, 0x58, 0x28, 0x3d, 0x01, 0x04, 0x08, 0x3e, 0x0c, 0xb0, 0xbd, 0xbb,
+ 0x33, 0x47, 0x72, 0xbd, 0xf5, 0x3f, 0x02, 0x3e, 0x9f, 0x05, 0xc9, 0xbd,
+ 0x6e, 0x44, 0x47, 0xbd, 0xb1, 0x75, 0xad, 0x3c, 0x7b, 0xa4, 0xaf, 0x3c,
+ 0xf5, 0xfa, 0x42, 0x3d, 0xa8, 0x0a, 0xc6, 0x3d, 0x62, 0xf1, 0x4f, 0x3e,
+ 0xb7, 0x52, 0xc7, 0xbd, 0x7c, 0xec, 0xa6, 0x3d, 0x64, 0xa3, 0xda, 0x3c,
+ 0x3d, 0x37, 0x13, 0xbc, 0x78, 0xb2, 0xbc, 0x3d, 0xd2, 0xa0, 0x38, 0x3d,
+ 0x3b, 0xd1, 0x55, 0xbd, 0xb6, 0xa4, 0x16, 0xbe, 0x8b, 0x5f, 0xc3, 0x3d,
+ 0xc6, 0xea, 0x47, 0xbd, 0xd8, 0x23, 0x01, 0xbe, 0x77, 0xba, 0x91, 0xbe,
+ 0x96, 0x42, 0x99, 0xbc, 0x50, 0xdb, 0x06, 0xbe, 0x4a, 0xc8, 0xe5, 0xbd,
+ 0xa7, 0x75, 0x59, 0xbe, 0x26, 0x22, 0x1f, 0xbe, 0xa7, 0x2e, 0x5d, 0xbd,
+ 0x3c, 0x32, 0x8a, 0xbd, 0x13, 0x88, 0x22, 0x3e, 0x60, 0x98, 0x29, 0x3c,
+ 0xb9, 0xf7, 0x35, 0x3d, 0xcd, 0xa5, 0x73, 0x3d, 0x2e, 0x6c, 0xf7, 0x3d,
+ 0x3c, 0xd1, 0x75, 0x3c, 0xb8, 0x2b, 0x20, 0xbc, 0x06, 0x89, 0x88, 0x3d,
+ 0x7c, 0x75, 0xcb, 0x3d, 0x38, 0x01, 0x22, 0x3e, 0xfe, 0x50, 0x25, 0xbe,
+ 0x46, 0x39, 0xa3, 0xbd, 0x76, 0xc0, 0x08, 0xbc, 0x4a, 0x16, 0xc9, 0xbd,
+ 0xc7, 0xb0, 0xfe, 0x3c, 0x86, 0x4c, 0x8d, 0xbd, 0x3d, 0x0e, 0xe7, 0x3d,
+ 0x73, 0xde, 0xde, 0x3d, 0x28, 0x43, 0x11, 0x3e, 0xa0, 0x7b, 0xa8, 0x3d,
+ 0xd4, 0x1e, 0xd6, 0x3a, 0x3d, 0x19, 0xf3, 0xbd, 0x55, 0xa5, 0xd8, 0xbd,
+ 0xf4, 0x81, 0xdb, 0xbd, 0xd3, 0x3a, 0x9e, 0x3d, 0xf1, 0xc4, 0x31, 0x3e,
+ 0xa8, 0x62, 0x65, 0xbe, 0x74, 0xf2, 0x2a, 0x3e, 0xd2, 0xf0, 0xd1, 0x3d,
+ 0x3a, 0xa8, 0xce, 0x3d, 0x6c, 0xfb, 0x44, 0x3d, 0x55, 0x4c, 0x23, 0x3d,
+ 0xe2, 0xb6, 0xad, 0xbd, 0x9e, 0xac, 0xa7, 0x3e, 0xf0, 0x41, 0xa7, 0x3d,
+ 0xb4, 0xd7, 0x36, 0xbe, 0x70, 0x91, 0x0f, 0xbe, 0x39, 0x3c, 0x6b, 0xbe,
+ 0x12, 0x62, 0xb2, 0x3e, 0x0b, 0x07, 0xc9, 0xbc, 0x39, 0xc0, 0x0c, 0x3e,
+ 0xbb, 0x79, 0x76, 0x3d, 0x95, 0x7b, 0x2e, 0x3e, 0xa6, 0x2a, 0x1c, 0xbe,
+ 0xea, 0x63, 0xb7, 0xbd, 0x1d, 0x29, 0xeb, 0x3c, 0x52, 0xfa, 0x2c, 0xbe,
+ 0xf3, 0xc4, 0x9d, 0xbe, 0x24, 0x2e, 0x40, 0xbe, 0x56, 0xcc, 0x0c, 0x3e,
+ 0x26, 0x54, 0xf0, 0x3d, 0x0a, 0x5c, 0x9a, 0xbe, 0x7e, 0x17, 0x87, 0x3d,
+ 0xce, 0x93, 0x05, 0xbe, 0x28, 0xa9, 0x93, 0xbb, 0xfd, 0x94, 0x64, 0x3d,
+ 0x66, 0xa9, 0xc4, 0x3d, 0x3f, 0xb3, 0x2c, 0xbe, 0x94, 0xf0, 0x69, 0x3e,
+ 0x5d, 0x7f, 0x05, 0xbe, 0x4e, 0xe0, 0x20, 0x3e, 0x9b, 0x01, 0x09, 0x3e,
+ 0xe0, 0x2b, 0xab, 0xbe, 0x00, 0xf5, 0x4b, 0xbe, 0x1d, 0x86, 0x60, 0xbe,
+ 0x30, 0x39, 0xa1, 0xbb, 0x67, 0x81, 0xd7, 0xbd, 0x79, 0x0b, 0xdb, 0xbd,
+ 0xe6, 0xcc, 0x28, 0xbe, 0x89, 0x9a, 0x99, 0xbe, 0xe9, 0x0a, 0xbd, 0xbe,
+ 0xfd, 0x95, 0xa3, 0xbe, 0x3a, 0x0e, 0x5f, 0xbe, 0xfb, 0x38, 0xb7, 0x3e,
+ 0x4c, 0x5d, 0xe3, 0x3d, 0xb4, 0x51, 0x80, 0xbe, 0xbf, 0x7f, 0xca, 0x3d,
+ 0x34, 0xb0, 0xbc, 0xbd, 0x1f, 0xc5, 0xd1, 0x3d, 0x44, 0x9b, 0xa1, 0xbe,
+ 0x30, 0x1c, 0xaa, 0x3e, 0x27, 0xf4, 0x27, 0x3d, 0x65, 0x9f, 0x23, 0xbe,
+ 0xf2, 0xb0, 0x0e, 0x3d, 0xb1, 0x63, 0x5e, 0x3d, 0x76, 0x96, 0x12, 0xbe,
+ 0x8c, 0x52, 0x83, 0xbe, 0xe7, 0x87, 0x24, 0xbe, 0xb6, 0x35, 0xa0, 0xbd,
+ 0xf0, 0xa3, 0x38, 0xbd, 0x50, 0x99, 0x4c, 0x3e, 0xbe, 0x67, 0x4c, 0xbe,
+ 0x2f, 0xac, 0xdd, 0x3e, 0x03, 0xa4, 0xd1, 0xbd, 0xb9, 0x21, 0xb7, 0x3e,
+ 0xa6, 0xa1, 0x7e, 0x3e, 0x62, 0x73, 0xaa, 0xbd, 0x04, 0x55, 0x2e, 0xbd,
+ 0xce, 0xa9, 0x96, 0x3e, 0x40, 0x4d, 0xc3, 0xbd, 0x40, 0xaa, 0xa0, 0xbe,
+ 0xa9, 0x23, 0x73, 0xbe, 0x04, 0xf2, 0x12, 0x3b, 0x30, 0xa4, 0x87, 0x3e,
+ 0x2f, 0x52, 0xf1, 0x3e, 0x60, 0xc1, 0xdc, 0x3d, 0x76, 0x34, 0x09, 0x3e,
+ 0x96, 0x04, 0x47, 0xbe, 0xa7, 0x12, 0x62, 0xbe, 0x0e, 0xc3, 0x08, 0xbe,
+ 0x01, 0xbb, 0x96, 0x3e, 0x00, 0xcc, 0x92, 0x3d, 0x2e, 0x2a, 0xc7, 0xbd,
+ 0x87, 0x36, 0x8f, 0x3d, 0x81, 0x51, 0x88, 0x3d, 0xc2, 0x49, 0x72, 0xbe,
+ 0x36, 0x93, 0x82, 0x3b, 0xf2, 0x9b, 0x1e, 0x3c, 0xc1, 0x71, 0xbe, 0xbe,
+ 0x01, 0xd3, 0xe6, 0xbd, 0x1a, 0xf0, 0xd2, 0x3d, 0x05, 0xcf, 0x72, 0xbe,
+ 0xb5, 0x54, 0x51, 0xbe, 0x62, 0x05, 0x37, 0x3d, 0x35, 0xdc, 0x91, 0x3e,
+ 0x99, 0xb1, 0x92, 0x3e, 0x71, 0xa4, 0x29, 0x3e, 0xc4, 0xe7, 0xd1, 0x3d,
+ 0xf7, 0xd7, 0x38, 0x3e, 0x90, 0x51, 0x39, 0xbe, 0xfc, 0x16, 0x52, 0xbe,
+ 0xbe, 0x05, 0x0b, 0x3e, 0x54, 0x33, 0x8a, 0x3c, 0x9e, 0xd9, 0x3c, 0x3e,
+ 0x54, 0x9a, 0x6e, 0x3d, 0x32, 0x46, 0xa3, 0x3d, 0x92, 0x1f, 0xc6, 0xbe,
+ 0xd5, 0x97, 0x1a, 0x3d, 0x24, 0x71, 0x9c, 0xbe, 0xc0, 0xe0, 0x22, 0xbd,
+ 0xf2, 0xa0, 0xaa, 0xbd, 0xa6, 0xcd, 0x99, 0x3e, 0xbe, 0xbf, 0x76, 0x3e,
+ 0x1c, 0xaa, 0x5c, 0x3c, 0x27, 0x50, 0xce, 0x3d, 0xf6, 0xed, 0x92, 0xbe,
+ 0x7a, 0xdb, 0x14, 0x3e, 0x5b, 0xf7, 0x85, 0x3d, 0xde, 0x1c, 0x29, 0x3e,
+ 0xfb, 0xba, 0x8c, 0xbd, 0xc8, 0x4f, 0x5a, 0x3e, 0x0f, 0x16, 0x6c, 0x3c,
+ 0xd4, 0xd2, 0x9b, 0x3a, 0x67, 0xa9, 0xa4, 0x3d, 0x6c, 0xad, 0x9d, 0x3d,
+ 0xa2, 0x28, 0xe3, 0x3d, 0x80, 0xce, 0xc3, 0xbd, 0x9b, 0xa8, 0x6e, 0xbd,
+ 0xe0, 0x52, 0x05, 0xbd, 0x06, 0x0b, 0x06, 0x3c, 0xf5, 0x45, 0xc1, 0xbd,
+ 0xe4, 0xd0, 0xd0, 0xbd, 0x53, 0x4b, 0x0f, 0xbe, 0x11, 0x37, 0x8f, 0xbd,
+ 0xa1, 0xbb, 0x95, 0xbe, 0x04, 0xcb, 0x43, 0x3e, 0x86, 0xc3, 0x83, 0x3e,
+ 0x9e, 0x05, 0x5b, 0x3c, 0xbf, 0x90, 0x25, 0x3d, 0xeb, 0x6d, 0x27, 0x3d,
+ 0x9a, 0xe1, 0x8f, 0xbd, 0x66, 0x21, 0x2f, 0x3b, 0x67, 0xe6, 0x71, 0xbd,
+ 0xb9, 0xb0, 0x57, 0x3e, 0xb2, 0x03, 0x27, 0xbe, 0x6e, 0xfe, 0x09, 0x3e,
+ 0x59, 0x2f, 0xaa, 0xbd, 0x1a, 0x74, 0x10, 0xbd, 0x1e, 0xeb, 0x40, 0x3e,
+ 0xae, 0x88, 0xc3, 0xbe, 0xcf, 0x2d, 0x09, 0xbe, 0x90, 0x5d, 0xef, 0xbb,
+ 0xa7, 0xe0, 0xd3, 0xbc, 0x9d, 0x34, 0xae, 0x3c, 0xcf, 0x91, 0xdf, 0xbd,
+ 0xb1, 0x7a, 0xd1, 0x3b, 0x76, 0xbc, 0xf4, 0xbc, 0xb9, 0x5f, 0x43, 0xbe,
+ 0xe4, 0x50, 0x98, 0xbc, 0xbc, 0xa3, 0x61, 0x3b, 0xe8, 0x09, 0x95, 0x3e,
+ 0x21, 0xea, 0x02, 0x3e, 0xcc, 0x5e, 0x96, 0xbe, 0xb3, 0x07, 0x09, 0xbe,
+ 0xba, 0x3a, 0x51, 0xbe, 0x42, 0x7d, 0xb6, 0x3d, 0x2b, 0x17, 0xcf, 0xba,
+ 0x03, 0x52, 0x61, 0x3e, 0xa8, 0x48, 0x81, 0x3e, 0x9c, 0x29, 0xd4, 0x3c,
+ 0xd7, 0xbf, 0x8b, 0xbe, 0xff, 0xe5, 0x6c, 0xbd, 0x1d, 0x50, 0x7a, 0xbd,
+ 0xae, 0x9f, 0xe6, 0xbd, 0x41, 0x6f, 0xc3, 0xbe, 0xb8, 0xb4, 0x18, 0xbe,
+ 0x77, 0xae, 0x36, 0xbd, 0x4a, 0x26, 0xa5, 0x3d, 0x10, 0xfe, 0x50, 0xbe,
+ 0x25, 0x66, 0x35, 0x3e, 0x90, 0xce, 0x2e, 0xbe, 0x03, 0xf3, 0x88, 0xbd,
+ 0xec, 0xae, 0xef, 0x3d, 0x6a, 0x99, 0x8e, 0xbe, 0x9c, 0xf6, 0xcb, 0xbc,
+ 0x15, 0xcb, 0xd7, 0xbb, 0xf9, 0xc1, 0x22, 0x3e, 0x2c, 0x6b, 0x0d, 0xbe,
+ 0x36, 0x99, 0x9a, 0xbe, 0xa9, 0x76, 0x26, 0x3d, 0x8a, 0x7d, 0x9b, 0x3e,
+ 0xda, 0x85, 0x3e, 0x3e, 0x5e, 0x6e, 0xbb, 0xbd, 0x6d, 0xe4, 0x07, 0x3e,
+ 0x7b, 0xb4, 0xe9, 0x3d, 0xef, 0xfe, 0x54, 0x3d, 0xc7, 0x12, 0x27, 0x3e,
+ 0x32, 0x02, 0xb5, 0x3e, 0x85, 0x82, 0xeb, 0x3d, 0xdb, 0x5d, 0xa0, 0x3d,
+ 0x77, 0x38, 0x8f, 0xbc, 0x05, 0xab, 0x0e, 0xbe, 0x69, 0xd0, 0x5c, 0xbe,
+ 0xa0, 0x3f, 0xa4, 0xbc, 0x2e, 0x6f, 0xd2, 0x3c, 0xb1, 0x27, 0x02, 0xbe,
+ 0x9e, 0x54, 0x3d, 0xbe, 0xee, 0x43, 0x2c, 0x3e, 0x61, 0x34, 0x4b, 0xbe,
+ 0x03, 0x9f, 0x95, 0xbd, 0x70, 0xcb, 0x6a, 0x3e, 0x2a, 0xc1, 0x93, 0x3e,
+ 0x7b, 0x40, 0x7c, 0x3e, 0xb1, 0x1c, 0x30, 0xbc, 0xa8, 0x4d, 0x15, 0x3e,
+ 0x12, 0xaf, 0xdb, 0x3d, 0x20, 0x56, 0xa5, 0xbe, 0xd1, 0xa9, 0x96, 0xbd,
+ 0x60, 0xf4, 0xf1, 0x3d, 0x6f, 0x2e, 0x23, 0xbd, 0x90, 0x68, 0x75, 0x3e,
+ 0x03, 0x00, 0x96, 0xbd, 0xe5, 0xff, 0x4f, 0xbd, 0xdc, 0xe7, 0x7b, 0xbe,
+ 0x69, 0x17, 0x91, 0xbd, 0xa8, 0xf5, 0x46, 0xbe, 0x00, 0x85, 0x3b, 0xbd,
+ 0xd6, 0xb6, 0x1a, 0x3c, 0x73, 0xc4, 0x01, 0x3e, 0x64, 0x53, 0x40, 0xbd,
+ 0xec, 0x0a, 0x8e, 0x3d, 0xaa, 0x4f, 0x1d, 0xbd, 0x00, 0x57, 0xcd, 0xbe,
+ 0x45, 0x6c, 0x33, 0x3d, 0xaf, 0xc9, 0xdd, 0xbd, 0x8c, 0x79, 0x40, 0x3e,
+ 0x92, 0x48, 0x1d, 0x3e, 0x6e, 0xe3, 0x4f, 0xbe, 0x38, 0x51, 0x4e, 0xbe,
+ 0xa2, 0x79, 0xf8, 0x3d, 0xbe, 0xb3, 0xcf, 0x3d, 0x47, 0x7f, 0x30, 0x3e,
+ 0x05, 0x0e, 0x14, 0x3e, 0xcc, 0x71, 0x34, 0xbe, 0xe2, 0x98, 0xe4, 0xbe,
+ 0x76, 0xce, 0x96, 0xbd, 0x2a, 0x5e, 0x45, 0x3d, 0x66, 0x70, 0xb0, 0xbd,
+ 0x2e, 0x7f, 0xf7, 0xbd, 0x1b, 0x68, 0x30, 0x3d, 0x36, 0xb6, 0x1f, 0xbe,
+ 0xd4, 0x02, 0x98, 0xbd, 0x06, 0x5c, 0xc5, 0x3e, 0x4d, 0x48, 0x27, 0x3e,
+ 0x2f, 0x2e, 0xc2, 0x3d, 0xda, 0x68, 0x72, 0xbe, 0xec, 0x44, 0x14, 0x3d,
+ 0xa4, 0xfa, 0xb4, 0xbd, 0x15, 0x71, 0xfc, 0x3d, 0x62, 0x8a, 0x3a, 0xbe,
+ 0x83, 0x02, 0x67, 0x3e, 0x45, 0x0d, 0x8b, 0xbd, 0x0d, 0x75, 0xa1, 0xbd,
+ 0x9a, 0x17, 0x3c, 0xbe, 0x23, 0xe1, 0x4e, 0xbe, 0x04, 0xae, 0xa0, 0x3d,
+ 0xe8, 0xd4, 0x29, 0xbe, 0x2e, 0x94, 0xb0, 0xbe, 0x1a, 0xda, 0x2d, 0xbe,
+ 0xee, 0x4e, 0xa5, 0xbd, 0xc9, 0xa3, 0x70, 0xbe, 0xfb, 0x6a, 0xf8, 0xbd,
+ 0xf0, 0x92, 0x04, 0xbe, 0x21, 0x2f, 0xaf, 0xbe, 0xea, 0x9a, 0x25, 0xbd,
+ 0x97, 0x5d, 0x91, 0x3e, 0xf3, 0xcf, 0x81, 0xbc, 0x0d, 0x77, 0x80, 0x3e,
+ 0x84, 0xa6, 0xc7, 0xbd, 0x24, 0x15, 0x63, 0x3d, 0x56, 0xaa, 0x39, 0xbe,
+ 0x5d, 0x91, 0xc8, 0x3b, 0x82, 0xf2, 0x7f, 0x3d, 0x74, 0x23, 0x57, 0x3e,
+ 0x35, 0x60, 0x89, 0x3d, 0x1f, 0x65, 0x42, 0x3e, 0x83, 0x6f, 0xe6, 0xbd,
+ 0x54, 0x5b, 0x84, 0x3d, 0x4a, 0x6d, 0x3c, 0xbe, 0xfc, 0xe2, 0xe3, 0xbd,
+ 0xa4, 0xe1, 0xb0, 0x3d, 0x6d, 0x54, 0x27, 0x3d, 0x85, 0xf8, 0xde, 0x3c,
+ 0xb3, 0x2b, 0xfb, 0x3b, 0x65, 0x25, 0x14, 0xbe, 0x3a, 0x8b, 0x73, 0xbe,
+ 0xfd, 0x3a, 0x46, 0x3d, 0x5e, 0x73, 0x60, 0xbe, 0x46, 0x4f, 0x11, 0xbe,
+ 0x3c, 0x16, 0x42, 0xbe, 0x7a, 0x7b, 0x0e, 0x3c, 0xf4, 0x04, 0x2e, 0x3e,
+ 0x0b, 0xde, 0x2e, 0xbd, 0x61, 0x5d, 0xe0, 0x3d, 0x52, 0x1f, 0x8e, 0x3e,
+ 0x5f, 0xaa, 0xbc, 0x3d, 0x3c, 0x9b, 0xd4, 0x3c, 0x51, 0x9d, 0x5b, 0x3e,
+ 0x14, 0x1f, 0x11, 0x3e, 0xe7, 0xd5, 0xda, 0x3d, 0x1d, 0x46, 0xa2, 0x3d,
+ 0xd6, 0x34, 0xeb, 0xbc, 0x0d, 0xb0, 0x56, 0x3d, 0x03, 0xb7, 0x9c, 0xbe,
+ 0xf3, 0x4b, 0x59, 0xbd, 0xf0, 0xc0, 0x9e, 0x3d, 0xd2, 0x3b, 0x53, 0x3d,
+ 0xe1, 0xf9, 0x29, 0xbd, 0x87, 0x84, 0x0f, 0xbe, 0xca, 0xba, 0xbb, 0xbb,
+ 0xc6, 0xb9, 0xa5, 0x3d, 0x06, 0xaf, 0xc8, 0x3d, 0x78, 0x86, 0x2d, 0x3e,
+ 0xbc, 0x15, 0x8e, 0x3e, 0xd9, 0xce, 0x80, 0xbd, 0x7d, 0x42, 0xb6, 0xbe,
+ 0xa5, 0xec, 0xd4, 0x3d, 0x2a, 0x39, 0x44, 0xbb, 0xc4, 0x29, 0x15, 0xbe,
+ 0x63, 0x74, 0x68, 0x3d, 0x18, 0xc7, 0xfe, 0x3d, 0xd5, 0xda, 0x22, 0xbe,
+ 0xb6, 0x03, 0x26, 0x3e, 0xce, 0xe5, 0x10, 0xbe, 0x16, 0x43, 0x19, 0xbe,
+ 0x9c, 0x5a, 0x44, 0xbd, 0xef, 0x11, 0x97, 0x3d, 0x5e, 0x89, 0xb1, 0xbe,
+ 0xee, 0x9a, 0x0a, 0xbf, 0x86, 0x95, 0x86, 0xbd, 0x93, 0x86, 0x1c, 0xbe,
+ 0xce, 0x84, 0xc5, 0x3d, 0x60, 0x61, 0xd7, 0xbd, 0x77, 0x91, 0x6a, 0x3e,
+ 0xf2, 0xe1, 0x01, 0x3e, 0xaf, 0xcb, 0x65, 0x3e, 0x80, 0x64, 0x0f, 0x3e,
+ 0xcc, 0x3b, 0x35, 0xbe, 0xbf, 0xa2, 0x55, 0xbe, 0x3c, 0x37, 0x61, 0xbe,
+ 0x46, 0xb4, 0xe8, 0xbd, 0x9d, 0xe5, 0x02, 0xbe, 0xa5, 0xac, 0x83, 0xbe,
+ 0x34, 0xa5, 0xd3, 0x3d, 0xc5, 0x71, 0x13, 0xbe, 0xc1, 0xc7, 0xb2, 0x3d,
+ 0x88, 0x94, 0xec, 0xbd, 0x92, 0xc3, 0x0c, 0x3e, 0x5f, 0x6e, 0xb6, 0x3c,
+ 0x7d, 0xf7, 0x06, 0x3d, 0xb8, 0xe4, 0x53, 0x3d, 0xba, 0xb3, 0xe5, 0xbd,
+ 0x7a, 0xb2, 0x01, 0x3e, 0xaf, 0x6d, 0x9f, 0x3d, 0xb0, 0x6f, 0xef, 0xbd,
+ 0x42, 0x6e, 0x40, 0xbe, 0xc6, 0xfb, 0x77, 0xbc, 0xc9, 0x5a, 0x4d, 0x3d,
+ 0x09, 0xf7, 0xdd, 0xbd, 0xab, 0x8a, 0xc0, 0x3d, 0xbd, 0x7c, 0xef, 0xbd,
+ 0x55, 0xd5, 0x81, 0x3d, 0x90, 0xf7, 0xaf, 0xbd, 0x66, 0xe0, 0x9a, 0x3d,
+ 0xbb, 0xdb, 0x27, 0xbe, 0x2f, 0xe8, 0x9f, 0xbd, 0x02, 0xc5, 0x4f, 0xbe,
+ 0xcc, 0xb6, 0xb6, 0xbe, 0xfd, 0x36, 0x36, 0xbc, 0xe4, 0x10, 0xdd, 0xbb,
+ 0xd0, 0x37, 0x7f, 0x3d, 0x27, 0xa9, 0xa4, 0xbe, 0x04, 0x07, 0x54, 0xbe,
+ 0xd7, 0xc7, 0x88, 0x3d, 0xcd, 0x5f, 0x20, 0x3e, 0x70, 0xd0, 0xa4, 0x3c,
+ 0x27, 0x50, 0xbf, 0x3d, 0x77, 0x93, 0x38, 0xbc, 0x7a, 0x6e, 0xb9, 0x3d,
+ 0xdf, 0x56, 0x2d, 0xbd, 0x9a, 0x67, 0x4c, 0x3b, 0x08, 0xa8, 0xb2, 0x3d,
+ 0x8a, 0x96, 0xe9, 0xbd, 0x4c, 0x64, 0xd2, 0xbd, 0xe4, 0x1b, 0x7b, 0xbe,
+ 0x2d, 0xf4, 0x58, 0x3d, 0x3e, 0x47, 0xb5, 0xbc, 0x75, 0x6b, 0x20, 0xbe,
+ 0x06, 0x3a, 0x05, 0x3e, 0x2c, 0x34, 0x0a, 0x3e, 0xd7, 0xe6, 0x43, 0xbd,
+ 0x2c, 0x38, 0x8c, 0x3d, 0xf7, 0x4a, 0x15, 0x3e, 0x4f, 0x92, 0xe9, 0x3d,
+ 0x80, 0x85, 0xb1, 0xbd, 0x1a, 0xb6, 0x3c, 0xbe, 0xb2, 0xdf, 0x51, 0xbe,
+ 0xc1, 0xd7, 0x71, 0xbe, 0xc1, 0x93, 0xdb, 0xbd, 0x5d, 0x4c, 0x6c, 0xbd,
+ 0xb1, 0x6b, 0x21, 0xbc, 0xb5, 0xb1, 0x12, 0x3e, 0x5c, 0x89, 0x5d, 0xba,
+ 0x29, 0xca, 0xd7, 0x3d, 0x4e, 0x60, 0x51, 0x3e, 0x90, 0x30, 0xd6, 0xbc,
+ 0xee, 0x83, 0x12, 0x3d, 0xcb, 0x01, 0x8e, 0x3d, 0xf4, 0xe4, 0x53, 0x3c,
+ 0x1c, 0xb7, 0x3f, 0xbe, 0x2d, 0x78, 0x57, 0xbe, 0x13, 0x95, 0x01, 0x3c,
+ 0x8e, 0x51, 0x3a, 0xbe, 0xe1, 0xfd, 0xe2, 0xbd, 0x20, 0xf5, 0x95, 0x3c,
+ 0x23, 0x95, 0x12, 0x3e, 0x9a, 0xa5, 0x02, 0x3d, 0x57, 0xc4, 0xc7, 0x3d,
+ 0x24, 0xf2, 0xf9, 0xbd, 0x6c, 0x2e, 0x36, 0xbe, 0x6b, 0xa1, 0x80, 0x3d,
+ 0x00, 0xb1, 0x01, 0xbe, 0x9a, 0x4e, 0xaf, 0xbd, 0xb3, 0x16, 0xb7, 0x3d,
+ 0x78, 0xae, 0xd9, 0x3d, 0xd4, 0xca, 0x4a, 0xbd, 0x7c, 0x02, 0x31, 0xbc,
+ 0xfd, 0x4f, 0x2e, 0x3c, 0x80, 0xb8, 0xe5, 0x3d, 0x90, 0x84, 0x9d, 0x3c,
+ 0xaf, 0x6e, 0xc0, 0xbe, 0xf0, 0x86, 0x21, 0x3e, 0xf3, 0x61, 0x25, 0x3d,
+ 0x60, 0xe9, 0x9b, 0x3c, 0xc4, 0xab, 0xc8, 0xbe, 0xc3, 0x06, 0x28, 0x3e,
+ 0x5b, 0xf2, 0x54, 0x3d, 0xb8, 0x65, 0x8b, 0xbe, 0x10, 0x45, 0xf4, 0x3d,
+ 0xf8, 0xbd, 0x10, 0x3e, 0xb8, 0x69, 0xde, 0x3d, 0xe1, 0x1b, 0x91, 0x3d,
+ 0x64, 0x9e, 0x37, 0x3e, 0xfc, 0x60, 0x65, 0x3d, 0x67, 0xcb, 0x9a, 0x3d,
+ 0xf5, 0xc0, 0x18, 0x3e, 0x59, 0x4e, 0x79, 0x3d, 0xac, 0x0c, 0x11, 0x3e,
+ 0x34, 0x9a, 0xcd, 0xbd, 0x2f, 0x0f, 0x4f, 0xbe, 0x59, 0xbc, 0x8c, 0xbd,
+ 0x93, 0xe3, 0xc8, 0x3d, 0x35, 0x90, 0x12, 0x3e, 0x47, 0x5e, 0xbd, 0xbe,
+ 0xf0, 0xf2, 0xa3, 0x3d, 0x64, 0x1d, 0x31, 0x3d, 0xcf, 0xbe, 0x0f, 0x3d,
+ 0xbb, 0x2c, 0x4d, 0xbd, 0x19, 0x1b, 0xb7, 0x3d, 0x1b, 0xfd, 0xdf, 0x3d,
+ 0xf2, 0x32, 0x3d, 0x3c, 0xf1, 0xf0, 0x40, 0x3d, 0xe6, 0x4e, 0xab, 0x3c,
+ 0xac, 0xec, 0xa1, 0xbd, 0xf9, 0xfa, 0xc0, 0xbd, 0x4e, 0x87, 0x3e, 0xbe,
+ 0x7b, 0x9f, 0x52, 0x3c, 0x14, 0x9a, 0x24, 0xbe, 0x9c, 0x43, 0x81, 0x3d,
+ 0xc5, 0x1d, 0x30, 0x3d, 0xf6, 0x31, 0x9e, 0xbd, 0xe5, 0xc4, 0x12, 0x3d,
+ 0x4e, 0x3e, 0x77, 0xbe, 0xac, 0x5f, 0xa9, 0x3b, 0x94, 0x35, 0x22, 0x3d,
+ 0x26, 0xa6, 0xa4, 0xbd, 0x4c, 0x34, 0x01, 0x3e, 0xf3, 0x44, 0x7e, 0xbe,
+ 0x84, 0x66, 0x42, 0x3d, 0x3d, 0xc0, 0xe4, 0xbc, 0x91, 0x7b, 0x9c, 0x3d,
+ 0xe5, 0x9a, 0x06, 0xbe, 0xa6, 0x80, 0xb3, 0xbd, 0xba, 0x36, 0x06, 0x3e,
+ 0xc2, 0x28, 0xef, 0x3d, 0xc7, 0x5c, 0x97, 0xbd, 0x24, 0x10, 0x34, 0xbe,
+ 0x8a, 0xc4, 0x68, 0xbd, 0x88, 0xd0, 0x02, 0xbe, 0xf2, 0x74, 0x84, 0x3e,
+ 0x50, 0xa9, 0x03, 0xbe, 0xc1, 0xec, 0x4d, 0xbe, 0x72, 0x6b, 0x78, 0x3c,
+ 0xa0, 0x40, 0xb2, 0x3d, 0x4f, 0xe7, 0xc0, 0x3d, 0xbc, 0xc1, 0x1e, 0xbd,
+ 0x0a, 0x91, 0x39, 0xbb, 0x23, 0xf0, 0xae, 0xbd, 0xd9, 0xcf, 0x23, 0xbe,
+ 0x81, 0xd4, 0x88, 0xbd, 0xe6, 0xf0, 0x91, 0xbd, 0xd0, 0x23, 0x93, 0xbb,
+ 0xbf, 0xc8, 0x5b, 0x3e, 0x7f, 0x8e, 0xbc, 0xbd, 0xb0, 0xc1, 0x0a, 0xbe,
+ 0x7e, 0xd9, 0xdf, 0xbc, 0xd0, 0x5e, 0xb2, 0x3d, 0xc6, 0xdb, 0x2e, 0xbe,
+ 0xc3, 0x47, 0xa1, 0x3c, 0x08, 0xef, 0x5c, 0x3d, 0x09, 0x49, 0xf8, 0x3d,
+ 0x72, 0xcd, 0x72, 0xbd, 0xd0, 0x33, 0x10, 0xbc, 0xe1, 0xe4, 0xf8, 0xbd,
+ 0xd0, 0x07, 0xcd, 0x3d, 0x22, 0xbf, 0x07, 0x3d, 0x34, 0x43, 0x14, 0xbe,
+ 0x29, 0xb5, 0x70, 0xbd, 0x81, 0x81, 0x41, 0x3e, 0xeb, 0xba, 0x73, 0x3d,
+ 0x02, 0xdb, 0x56, 0x3e, 0xaa, 0xff, 0x70, 0xbd, 0xbc, 0xdc, 0x59, 0xbd,
+ 0x30, 0xb0, 0xbf, 0x3d, 0x75, 0xab, 0x9c, 0xbd, 0x52, 0xed, 0x4e, 0xbe,
+ 0x42, 0x7f, 0x12, 0x3e, 0x00, 0x9d, 0xea, 0x3d, 0x3a, 0x62, 0x50, 0xbd,
+ 0xba, 0x4f, 0x31, 0xbd, 0x81, 0xc5, 0x82, 0xbd, 0x78, 0x84, 0x80, 0x3e,
+ 0xbc, 0x51, 0x82, 0xbd, 0x80, 0x2e, 0x13, 0xbd, 0x92, 0x89, 0xb3, 0xbd,
+ 0xa2, 0xee, 0x65, 0x3e, 0xce, 0x04, 0x42, 0x3e, 0x86, 0xbd, 0xa9, 0xbc,
+ 0xf6, 0x25, 0x2c, 0x3e, 0xa7, 0x4f, 0x1b, 0xbb, 0xa7, 0x89, 0xb9, 0xbd,
+ 0x2b, 0x83, 0xc3, 0xbc, 0x4a, 0x6d, 0x31, 0xbe, 0x85, 0xe7, 0x49, 0xbe,
+ 0x5d, 0x1e, 0x9d, 0xbd, 0x63, 0x8c, 0xe1, 0x3d, 0xcd, 0xe9, 0x25, 0xbe,
+ 0xc5, 0xd5, 0x5d, 0xbe, 0xb2, 0x59, 0x4a, 0x3d, 0xd4, 0xac, 0x87, 0x3b,
+ 0x0e, 0x06, 0xb8, 0xbd, 0xec, 0xb7, 0x5e, 0x3e, 0xb3, 0xef, 0xee, 0xbb,
+ 0x55, 0x57, 0x92, 0x3d, 0xf9, 0xb5, 0xbc, 0xbd, 0xf4, 0x1c, 0x6d, 0x3e,
+ 0xfd, 0x34, 0x82, 0x3e, 0xc2, 0x4e, 0xa7, 0xbd, 0x86, 0xf6, 0x00, 0x3e,
+ 0xb2, 0x70, 0xa9, 0xbd, 0x30, 0xd6, 0x67, 0xbd, 0x67, 0xcc, 0xa5, 0xbd,
+ 0x8a, 0x33, 0x01, 0x3e, 0xfe, 0x34, 0x1f, 0x3d, 0xed, 0x1f, 0x57, 0xbe,
+ 0xa1, 0x12, 0x8f, 0x3c, 0x5d, 0xb2, 0xab, 0xbb, 0x72, 0x0a, 0x3d, 0xbe,
+ 0xe9, 0x2d, 0xb4, 0x3d, 0x54, 0x51, 0x5a, 0xbd, 0xdf, 0x98, 0xfc, 0xbc,
+ 0xa1, 0xbd, 0x22, 0x3e, 0x51, 0x4d, 0x8e, 0xbd, 0x2a, 0x93, 0x93, 0xbe,
+ 0x6d, 0x23, 0x08, 0x3e, 0xff, 0xe3, 0xa0, 0xbc, 0xac, 0x86, 0x86, 0x3d,
+ 0x7d, 0x32, 0x74, 0x3e, 0x79, 0x6f, 0x3d, 0x3d, 0xbc, 0x38, 0x25, 0xbe,
+ 0x99, 0x1a, 0x58, 0xbd, 0xdc, 0x2b, 0x11, 0x3d, 0x55, 0xc4, 0x90, 0x3d,
+ 0x67, 0x26, 0x16, 0x3e, 0x0c, 0xc2, 0xab, 0x3c, 0xa4, 0x0b, 0x47, 0x3d,
+ 0xaa, 0xcc, 0x15, 0xbd, 0xbe, 0x1e, 0x48, 0xbd, 0xc1, 0xed, 0x54, 0x3d,
+ 0xb2, 0xfa, 0xd8, 0xbd, 0x4b, 0x2a, 0xed, 0xbd, 0x82, 0x8b, 0x42, 0x3e,
+ 0x04, 0x1c, 0xf2, 0xbd, 0x26, 0x2f, 0x3e, 0x3e, 0x69, 0xd0, 0x2d, 0xbe,
+ 0x47, 0x89, 0xe8, 0xbd, 0x80, 0xc3, 0x64, 0x3c, 0x2a, 0x16, 0xdd, 0xbd,
+ 0x86, 0x15, 0x06, 0x3d, 0xfc, 0x83, 0xc1, 0xbd, 0x8a, 0x18, 0xd7, 0xbd,
+ 0xe5, 0x31, 0x37, 0x3e, 0xfd, 0x4e, 0x77, 0xbc, 0x2f, 0xd0, 0x61, 0x3b,
+ 0xde, 0x9f, 0x27, 0xbe, 0xda, 0xac, 0xe8, 0x3c, 0x96, 0x9c, 0xf3, 0x3d,
+ 0x61, 0x94, 0xee, 0xbd, 0x4d, 0x4f, 0x27, 0xbb, 0x78, 0xcd, 0x00, 0x3c,
+ 0xbd, 0x29, 0xd0, 0x3c, 0xe8, 0x40, 0x68, 0xbd, 0xfc, 0x4d, 0x0d, 0xbd,
+ 0x76, 0xd0, 0x27, 0x3e, 0x9a, 0xa9, 0xc4, 0xbd, 0x8e, 0xef, 0x9d, 0x3d,
+ 0xa4, 0x15, 0x8b, 0xbd, 0x96, 0x1a, 0x63, 0xbd, 0xf3, 0x7c, 0x4b, 0x3e,
+ 0x4e, 0x22, 0x9d, 0x3d, 0x44, 0xd3, 0x9f, 0x3d, 0xfd, 0x6a, 0x0e, 0x3d,
+ 0x73, 0x0b, 0xb2, 0xbd, 0x80, 0xe4, 0x05, 0x3d, 0xe5, 0x3a, 0x8a, 0x39,
+ 0x68, 0x48, 0xfb, 0x3d, 0xbb, 0x73, 0x44, 0x3e, 0x33, 0x43, 0xdd, 0x3d,
+ 0x87, 0x38, 0x88, 0xbe, 0x75, 0x31, 0x1a, 0xbe, 0x5d, 0x8d, 0x67, 0xbe,
+ 0x05, 0x1d, 0x01, 0x3e, 0x43, 0xf4, 0x80, 0x3e, 0x85, 0x59, 0xf3, 0x3d,
+ 0xab, 0x27, 0x02, 0xbe, 0xd8, 0x72, 0x36, 0xbd, 0x01, 0x2d, 0x5d, 0x3e,
+ 0xcc, 0x5d, 0xfd, 0x3d, 0xd0, 0x3e, 0x12, 0x3e, 0x59, 0x7d, 0xe2, 0x3d,
+ 0xd5, 0xef, 0xba, 0xbb, 0x30, 0x6b, 0xba, 0xbc, 0xb8, 0xee, 0xcf, 0x3d,
+ 0xc6, 0x30, 0xb5, 0xbc, 0x85, 0x8a, 0xe9, 0x3d, 0x97, 0x86, 0x2b, 0x3e,
+ 0xa0, 0x92, 0x2a, 0x3d, 0xbc, 0x51, 0x36, 0xbd, 0x05, 0x42, 0x1b, 0x3e,
+ 0x7b, 0x7e, 0x4b, 0xbe, 0xea, 0x5e, 0xf6, 0x3d, 0x82, 0x4a, 0x5d, 0xbd,
+ 0x88, 0x5e, 0x83, 0x3d, 0xa0, 0x52, 0x28, 0x3e, 0xe8, 0x12, 0x2e, 0x3e,
+ 0xa9, 0x77, 0x3f, 0x3d, 0xb5, 0xcb, 0xac, 0x3d, 0x0e, 0x3e, 0x94, 0x3d,
+ 0x16, 0x05, 0xca, 0xbd, 0x5c, 0xbf, 0x66, 0xbe, 0x84, 0x68, 0xb0, 0xbd,
+ 0xd4, 0xd1, 0x1c, 0xbe, 0x11, 0x39, 0xf7, 0x3c, 0x86, 0xe1, 0xfb, 0xbb,
+ 0x1b, 0x30, 0xff, 0xbc, 0xcc, 0xb9, 0x83, 0xbc, 0x87, 0xdb, 0x3c, 0x3d,
+ 0xbe, 0x08, 0x28, 0xbe, 0xbf, 0x2c, 0x28, 0x3c, 0x6d, 0x75, 0xb0, 0x3b,
+ 0xe0, 0x53, 0x27, 0x3d, 0x2a, 0x77, 0x6d, 0xbc, 0xff, 0x4e, 0x64, 0x3d,
+ 0x12, 0x81, 0xdd, 0x3d, 0x79, 0x56, 0xd0, 0x3d, 0x86, 0x06, 0xaf, 0x3d,
+ 0x55, 0xa5, 0xb7, 0x3d, 0x80, 0xcb, 0x6a, 0xbd, 0x63, 0xe6, 0x9f, 0x3d,
+ 0x23, 0x19, 0x36, 0x3e, 0xfb, 0x1e, 0xca, 0x3d, 0x02, 0x59, 0x49, 0xbe,
+ 0x5d, 0x0a, 0x05, 0xbe, 0xed, 0x48, 0xe1, 0xbd, 0x55, 0xa4, 0x17, 0xbe,
+ 0x6d, 0xea, 0x53, 0x3d, 0x72, 0x0e, 0x25, 0xbe, 0x8e, 0x2f, 0xff, 0xbc,
+ 0xce, 0x72, 0xd8, 0x3b, 0x7c, 0x3f, 0x66, 0x3d, 0x06, 0x70, 0x82, 0xbd,
+ 0x5b, 0x14, 0x82, 0xbd, 0x41, 0x52, 0xc7, 0xbd, 0x1f, 0xe8, 0x5f, 0x3d,
+ 0x6a, 0x4a, 0x60, 0xbd, 0x88, 0x4a, 0x9b, 0xbd, 0x51, 0x25, 0x75, 0xbc,
+ 0x9c, 0x4f, 0x19, 0xbd, 0xcc, 0x42, 0xa3, 0x3d, 0xae, 0xda, 0xe1, 0xbc,
+ 0x72, 0x1d, 0xc4, 0x3d, 0xe1, 0xde, 0xac, 0x3d, 0x4b, 0x56, 0x08, 0x3e,
+ 0xfc, 0xd6, 0x90, 0xbd, 0x79, 0x15, 0x93, 0xbd, 0xd7, 0x39, 0xdf, 0xbd,
+ 0x40, 0x85, 0x3e, 0xbe, 0x61, 0xd9, 0xd7, 0x3d, 0xb4, 0x75, 0x2a, 0xbe,
+ 0xcc, 0x8e, 0x0d, 0x3e, 0x79, 0x34, 0xa5, 0x3d, 0x47, 0xd4, 0x25, 0xbe,
+ 0x2e, 0x88, 0xf6, 0x3d, 0x06, 0xbf, 0xb8, 0xbc, 0xda, 0xe8, 0xb6, 0xbd,
+ 0x69, 0x36, 0xa2, 0xbd, 0x49, 0x64, 0x0e, 0xbe, 0x87, 0x9a, 0xcf, 0x3d,
+ 0xcb, 0xa2, 0xbe, 0xbd, 0x3d, 0x84, 0x16, 0xbe, 0x94, 0xbf, 0x43, 0xbe,
+ 0x4b, 0xc9, 0x0d, 0xbe, 0x28, 0x33, 0x4d, 0xbe, 0x2b, 0x07, 0x89, 0x3d,
+ 0xd5, 0x47, 0x52, 0xbc, 0x07, 0x53, 0xe2, 0xbd, 0x82, 0xb2, 0x31, 0x3d,
+ 0x1c, 0x78, 0x59, 0xbc, 0x35, 0x57, 0xdf, 0x3d, 0xe2, 0x55, 0x1d, 0xbe,
+ 0x72, 0x51, 0xb7, 0x3d, 0x29, 0xa1, 0x84, 0x3d, 0xcb, 0x43, 0xa6, 0xb9,
+ 0x11, 0x73, 0xf2, 0xbd, 0xb4, 0x75, 0xaa, 0x3d, 0x8b, 0x2f, 0x70, 0xbd,
+ 0x2a, 0x73, 0x15, 0x3d, 0x83, 0xf7, 0x40, 0xbd, 0xd6, 0x09, 0xd8, 0x3d,
+ 0x60, 0x7f, 0x01, 0xbe, 0x05, 0x42, 0x0d, 0xbd, 0x62, 0x93, 0x9f, 0x3d,
+ 0x2e, 0xe0, 0xb0, 0x3b, 0x4d, 0x7b, 0x91, 0x3d, 0x42, 0x91, 0x00, 0x3e,
+ 0xaa, 0xd7, 0xcb, 0x3c, 0x08, 0x97, 0xea, 0xbd, 0x25, 0xd2, 0x07, 0x3e,
+ 0xff, 0x80, 0x21, 0x3e, 0x79, 0xa6, 0x7c, 0xbd, 0xa0, 0x30, 0x9c, 0xbd,
+ 0x8a, 0x16, 0xec, 0x3d, 0xda, 0x0f, 0x1a, 0x3c, 0x3f, 0x2f, 0x56, 0x3e,
+ 0xe6, 0x89, 0x0a, 0x3d, 0xf7, 0x17, 0xef, 0x3d, 0x00, 0xf9, 0x96, 0x3d,
+ 0x0e, 0xa8, 0x1c, 0x3c, 0x86, 0xb2, 0x32, 0xbc, 0x9c, 0xeb, 0x8d, 0xbd,
+ 0xc3, 0x88, 0x3d, 0x3d, 0xb1, 0x61, 0x67, 0xbc, 0x5a, 0xdf, 0x52, 0xbd,
+ 0x3c, 0x1b, 0xbf, 0x3d, 0x3f, 0xfe, 0xe2, 0xbc, 0xbd, 0x70, 0xfd, 0xbc,
+ 0x72, 0x84, 0x48, 0xbe, 0xa7, 0x33, 0xb6, 0xbc, 0xd3, 0x8b, 0x14, 0xbe,
+ 0xc2, 0x67, 0x4e, 0xbd, 0x50, 0x8b, 0x46, 0x3e, 0x0d, 0x4a, 0x81, 0x3d,
+ 0x95, 0xc0, 0xf9, 0x3c, 0x7e, 0x79, 0xf4, 0x3c, 0x9b, 0xb4, 0x2f, 0xbe,
+ 0x85, 0x5a, 0x13, 0x3d, 0x1a, 0xbc, 0x2c, 0xbd, 0x22, 0xec, 0xe7, 0x3d,
+ 0x55, 0xea, 0x38, 0xbe, 0xde, 0xf6, 0xcf, 0xbc, 0x58, 0xa0, 0x38, 0xbd,
+ 0x24, 0xf3, 0x23, 0xbd, 0x93, 0x93, 0xd8, 0x3d, 0xb6, 0xce, 0xb3, 0xbc,
+ 0x75, 0xbd, 0xe0, 0x3d, 0x7d, 0x7c, 0x12, 0x3e, 0x83, 0x5c, 0x4e, 0xbe,
+ 0x8c, 0x11, 0x3b, 0xbe, 0xd0, 0x06, 0x88, 0xbd, 0x26, 0x3f, 0xf8, 0x3d,
+ 0xc5, 0x0b, 0x72, 0x3c, 0xdc, 0x85, 0xba, 0x3d, 0xf4, 0xa2, 0xac, 0xbc,
+ 0x19, 0x4f, 0xcb, 0xbd, 0xfc, 0x1e, 0x82, 0x3c, 0xe9, 0x48, 0xd7, 0xbc,
+ 0xbb, 0x33, 0xd2, 0xbd, 0xae, 0xd9, 0x99, 0xbd, 0xc1, 0x3f, 0x59, 0x3d,
+ 0x90, 0x56, 0xde, 0xba, 0xa6, 0xdf, 0x95, 0xbd, 0xe1, 0x20, 0xc4, 0x3d,
+ 0xf3, 0x24, 0x9f, 0x3d, 0xb6, 0x99, 0x85, 0xbd, 0x61, 0xdb, 0xc8, 0x3c,
+ 0x5b, 0x44, 0xfe, 0x3d, 0xcb, 0xe1, 0x84, 0x3c, 0xab, 0x5d, 0x1b, 0x3c,
+ 0xbd, 0x66, 0x3b, 0x3d, 0x8b, 0x7c, 0x4e, 0x3d, 0x13, 0x97, 0x54, 0x3d,
+ 0xf6, 0x1c, 0x93, 0xbd, 0x74, 0x94, 0x4c, 0x3d, 0xf0, 0x9a, 0x1c, 0x3b,
+ 0x1e, 0xb8, 0xcc, 0x3d, 0x35, 0x62, 0x26, 0xbe, 0x2a, 0x3c, 0x3e, 0xbe,
+ 0x89, 0xac, 0xbe, 0xbb, 0x0d, 0x1c, 0x8b, 0x3d, 0x7e, 0x53, 0xc6, 0x3d,
+ 0xce, 0x4c, 0x92, 0xbd, 0xb8, 0x52, 0x94, 0xbd, 0x5a, 0x84, 0x1d, 0x3d,
+ 0xfb, 0x9f, 0xa2, 0xbc, 0xa2, 0xd0, 0x1e, 0xbd, 0x9d, 0x83, 0xa9, 0xbd,
+ 0x4e, 0x01, 0x47, 0x3d, 0xe1, 0xe5, 0x4f, 0xbb, 0x57, 0x2c, 0x93, 0xbe,
+ 0x2d, 0xc8, 0x7e, 0x3d, 0xa8, 0xa8, 0x8b, 0xbb, 0x37, 0x6c, 0xc4, 0xba,
+ 0x4d, 0x92, 0x06, 0xbe, 0xd4, 0x34, 0x9f, 0x3d, 0xd9, 0x89, 0xd5, 0xbd,
+ 0xa3, 0xd2, 0xa1, 0xbb, 0x9e, 0x44, 0x81, 0x3c, 0x62, 0x19, 0x9e, 0xbd,
+ 0x52, 0x5a, 0x8e, 0xbd, 0xd4, 0x6b, 0x25, 0xbe, 0x81, 0x2a, 0x22, 0x3e,
+ 0x54, 0xe8, 0xfd, 0xbd, 0xc3, 0x40, 0x3b, 0xbe, 0xaa, 0x1d, 0x43, 0x3d,
+ 0x96, 0x51, 0xa6, 0xbd, 0x37, 0x1b, 0x64, 0x3d, 0x95, 0x76, 0x7d, 0xbc,
+ 0x70, 0x39, 0x21, 0x3e, 0x85, 0x95, 0xde, 0x3d, 0x23, 0xae, 0x62, 0x3d,
+ 0x86, 0x4b, 0x1b, 0xbd, 0xb0, 0xdf, 0xeb, 0xbd, 0xcd, 0x8b, 0xf9, 0xbd,
+ 0x4c, 0x54, 0x16, 0x3e, 0x90, 0x06, 0x0d, 0xbe, 0xf8, 0x94, 0xe1, 0x3d,
+ 0xd6, 0x71, 0xeb, 0xbd, 0xa0, 0x9f, 0x1f, 0xbe, 0xd8, 0xb4, 0x99, 0x3b,
+ 0x78, 0x5a, 0x24, 0x3d, 0xbd, 0x7f, 0x96, 0xbd, 0xbc, 0x97, 0x23, 0x3e,
+ 0xb1, 0xde, 0x8a, 0xbd, 0x89, 0xf7, 0xc4, 0x3b, 0xff, 0xba, 0xce, 0x3c,
+ 0x8b, 0x3f, 0xc2, 0xbd, 0xa1, 0xf7, 0x68, 0xbc, 0x84, 0xca, 0x0d, 0xbe,
+ 0xf0, 0xa4, 0x5d, 0x3d, 0x70, 0xd6, 0xbf, 0xbc, 0x07, 0x5a, 0x81, 0x3d,
+ 0xde, 0x86, 0x7e, 0x3d, 0xcb, 0x76, 0x32, 0xbc, 0x32, 0xdc, 0xb3, 0x3d,
+ 0x97, 0x0a, 0x86, 0xbd, 0xe7, 0x19, 0xc5, 0xbb, 0xaf, 0xff, 0x37, 0xbc,
+ 0x23, 0xa8, 0x28, 0xbd, 0x65, 0x0d, 0x3d, 0x3e, 0xba, 0x1f, 0x6d, 0x3d,
+ 0x8c, 0x35, 0xc9, 0x3d, 0xc9, 0x00, 0xe1, 0x3c, 0xdd, 0x55, 0xee, 0xbd,
+ 0xe2, 0xe0, 0x8c, 0xbc, 0xa6, 0x1a, 0xfc, 0x3b, 0xe0, 0x25, 0xd6, 0x3d,
+ 0xc6, 0x80, 0x06, 0x3e, 0x04, 0x1c, 0x33, 0xbc, 0x19, 0x0a, 0x33, 0x3e,
+ 0xa3, 0x36, 0x6d, 0xbb, 0x38, 0x6c, 0x8a, 0x3d, 0xd7, 0x1f, 0x7c, 0x3c,
+ 0x7f, 0x55, 0xfe, 0x3c, 0xa1, 0x50, 0x8b, 0xbd, 0x6e, 0x25, 0xfd, 0xba,
+ 0xcf, 0x7f, 0x57, 0xbe, 0x3f, 0x3a, 0x03, 0x3e, 0xf5, 0x7a, 0x83, 0x3d,
+ 0x39, 0x4b, 0x04, 0xbe, 0xd8, 0xb2, 0x02, 0x3d, 0xeb, 0xb6, 0x1a, 0x3b,
+ 0xa1, 0x87, 0xae, 0xbd, 0xb7, 0x56, 0x20, 0x3e, 0x2d, 0xfd, 0x06, 0xbe,
+ 0xb9, 0xb2, 0x15, 0xbe, 0x0b, 0x72, 0x5f, 0xbd, 0x1a, 0x77, 0x76, 0xbd,
+ 0x41, 0xa9, 0x9a, 0x3c, 0x4c, 0xc8, 0x47, 0xbd, 0xaf, 0x35, 0xa5, 0x3c,
+ 0xb6, 0x6a, 0x1e, 0x3c, 0x9f, 0xec, 0x75, 0x3d, 0xe6, 0xb1, 0xc2, 0x3d,
+ 0xd5, 0xfd, 0x5d, 0xbe, 0x64, 0x05, 0x0d, 0x3e, 0xd3, 0xb5, 0x44, 0x3d,
+ 0xc1, 0x42, 0x3d, 0xbd, 0x50, 0xec, 0x22, 0xbd, 0xe9, 0xf9, 0xcb, 0xbd,
+ 0x18, 0xbe, 0xaa, 0x3c, 0x72, 0x31, 0xff, 0xbd, 0x26, 0x2a, 0x25, 0x3d,
+ 0x4d, 0x8a, 0x40, 0x3d, 0x09, 0x8f, 0x09, 0x3d, 0x6e, 0xa0, 0x4d, 0xbe,
+ 0xe9, 0xf5, 0x53, 0xbd, 0x5a, 0x7a, 0xcc, 0xbd, 0xe6, 0x54, 0x08, 0xbe,
+ 0xb8, 0x4d, 0x07, 0xbe, 0xf1, 0x8b, 0x8d, 0xbe, 0xa3, 0x6a, 0x9d, 0x3d,
+ 0x8e, 0xa7, 0xc2, 0x3d, 0x41, 0xbc, 0x04, 0x3d, 0xd8, 0x13, 0xe7, 0x3e,
+ 0xf2, 0x7e, 0xa7, 0xbc, 0x2f, 0x21, 0x9b, 0x3c, 0x56, 0xab, 0x94, 0xbe,
+ 0x2b, 0x03, 0x0b, 0xbe, 0xc0, 0x27, 0x3f, 0xbc, 0x4d, 0x7b, 0x19, 0xbd,
+ 0x54, 0xa4, 0x0c, 0x3e, 0xd6, 0xc3, 0xd2, 0xbd, 0xb8, 0xce, 0xe9, 0xbd,
+ 0xf4, 0x26, 0x1f, 0x3f, 0xc4, 0x1a, 0x0a, 0xbe, 0x3e, 0xfe, 0xaf, 0x3d,
+ 0x75, 0xfa, 0x98, 0xbe, 0x0e, 0x88, 0xa2, 0xbb, 0x2e, 0x90, 0x2f, 0xbd,
+ 0xb0, 0x64, 0xbd, 0x39, 0x6f, 0x1b, 0x9b, 0xbc, 0xdd, 0xf5, 0xd7, 0xbd,
+ 0x24, 0xe7, 0x62, 0xbe, 0xda, 0x31, 0x6b, 0x3e, 0xf4, 0xa9, 0x42, 0x3b,
+ 0x12, 0xdf, 0x33, 0xbe, 0xbf, 0x4b, 0xa9, 0x3b, 0xa2, 0xd0, 0x85, 0xbe,
+ 0x08, 0xe4, 0xd3, 0x3e, 0xc4, 0x22, 0x4c, 0xbd, 0x07, 0xbc, 0x3c, 0x3d,
+ 0x0a, 0xb2, 0x53, 0x3d, 0x0a, 0xf1, 0x82, 0x3d, 0xae, 0xeb, 0x31, 0x3b,
+ 0x0b, 0xe2, 0x3a, 0x3e, 0x2d, 0xd2, 0xa1, 0x3d, 0x9e, 0x0a, 0x4a, 0x3e,
+ 0x15, 0x87, 0x4e, 0xbd, 0xde, 0x43, 0xcf, 0xbd, 0xf8, 0x3e, 0xd0, 0xbe,
+ 0x90, 0x55, 0xd5, 0x3b, 0xca, 0xc2, 0x9b, 0x3e, 0xd0, 0x4c, 0xa6, 0xbc,
+ 0x70, 0x8b, 0xa6, 0x3e, 0xe2, 0x1b, 0xcb, 0xbd, 0x4c, 0xdf, 0x75, 0x3e,
+ 0x18, 0x0c, 0x14, 0xbf, 0x37, 0x2a, 0x03, 0x3b, 0xaa, 0x3a, 0xf9, 0x3d,
+ 0xf6, 0xf6, 0x8a, 0x3d, 0x53, 0x61, 0x2e, 0x3e, 0x19, 0xdf, 0x26, 0x3e,
+ 0x83, 0x84, 0x2f, 0xbe, 0xcd, 0xaa, 0xa7, 0xbd, 0x57, 0xe7, 0x54, 0x3c,
+ 0xf9, 0xd9, 0x80, 0x3e, 0x2b, 0x6b, 0x32, 0xbe, 0x2d, 0x83, 0x86, 0x3c,
+ 0x17, 0x69, 0xb3, 0xbe, 0xd1, 0xa0, 0x46, 0x3e, 0x7f, 0x75, 0x1f, 0xbc,
+ 0x5f, 0x75, 0x20, 0xbf, 0xdb, 0xdb, 0xa9, 0x3d, 0x2f, 0x31, 0xea, 0xbd,
+ 0x94, 0x14, 0x98, 0xbd, 0x70, 0x65, 0x32, 0x3d, 0x68, 0x2e, 0x6d, 0xbe,
+ 0xb0, 0x53, 0x7b, 0x3e, 0xb4, 0xd6, 0xca, 0xbd, 0xdc, 0xea, 0x55, 0x3a,
+ 0x5d, 0xbf, 0xba, 0x3c, 0x3d, 0x8d, 0x06, 0xbd, 0xea, 0x1a, 0x4f, 0x3c,
+ 0x99, 0x3e, 0x41, 0x3d, 0x8c, 0x1a, 0x23, 0xbe, 0x9e, 0x1f, 0x1a, 0x3f,
+ 0xb8, 0xd7, 0xd3, 0xbd, 0x4e, 0x31, 0x81, 0xbb, 0x7f, 0x6a, 0x13, 0x3e,
+ 0x21, 0xa5, 0x9b, 0xbd, 0xcc, 0x6d, 0x71, 0x3e, 0xfb, 0xb6, 0x0b, 0x3f,
+ 0x39, 0xd7, 0x08, 0x3d, 0xe0, 0x16, 0xdf, 0x3c, 0x1d, 0x8f, 0xf0, 0x3e,
+ 0x7a, 0xf2, 0x45, 0x3d, 0x96, 0x5e, 0xad, 0x3d, 0x09, 0xa8, 0x52, 0x3e,
+ 0x01, 0x1a, 0x40, 0x3e, 0x55, 0x2a, 0xbd, 0xbe, 0x71, 0x17, 0x49, 0x3d,
+ 0xee, 0x0d, 0x94, 0xbe, 0x8f, 0xb4, 0x9f, 0xbe, 0xb1, 0xa9, 0x9e, 0xbe,
+ 0x98, 0xb6, 0x14, 0xbe, 0xd8, 0xe1, 0x24, 0xbd, 0x1f, 0x18, 0x9d, 0xbd,
+ 0x3f, 0xc5, 0xdf, 0xbc, 0xed, 0x4a, 0xb3, 0x3d, 0xf6, 0x42, 0x9f, 0x3c,
+ 0x35, 0x84, 0x08, 0x3e, 0x03, 0x6a, 0xc1, 0xbc, 0xa5, 0x64, 0xfe, 0x3e,
+ 0x25, 0x8e, 0x05, 0x3e, 0xec, 0x90, 0x8d, 0x3e, 0xee, 0x59, 0x92, 0x3d,
+ 0x48, 0x99, 0x72, 0x3d, 0x77, 0xe3, 0xb4, 0x3d, 0x7c, 0x87, 0xb7, 0xbc,
+ 0xf7, 0xb4, 0x96, 0xbe, 0x04, 0x7f, 0x96, 0x3c, 0x44, 0x50, 0xac, 0x3e,
+ 0x13, 0xa6, 0x08, 0x3e, 0x62, 0xc2, 0x1b, 0xbe, 0x4a, 0xb1, 0x1c, 0xbd,
+ 0x67, 0x20, 0xe9, 0x3d, 0x5b, 0x60, 0x17, 0xbe, 0x3d, 0x74, 0x3c, 0xbe,
+ 0x36, 0x87, 0x03, 0xbe, 0x29, 0x4f, 0xda, 0xbd, 0xe9, 0xc3, 0xf0, 0x3a,
+ 0xfa, 0x63, 0x30, 0xbc, 0x13, 0x30, 0x0f, 0xbe, 0x50, 0xab, 0x45, 0x3d,
+ 0x83, 0xee, 0xdc, 0xbd, 0x3b, 0xb8, 0xf0, 0xbd, 0xc8, 0x39, 0x59, 0x3b,
+ 0xde, 0xbe, 0x82, 0x3c, 0x92, 0x7b, 0xe5, 0x3d, 0x8c, 0x82, 0xac, 0x3b,
+ 0x9e, 0xed, 0xb1, 0x3d, 0xb0, 0x79, 0xcb, 0x3d, 0xb4, 0x01, 0xf2, 0xbd,
+ 0x7b, 0x90, 0x58, 0xbd, 0x98, 0x77, 0xb9, 0xbd, 0x93, 0xc2, 0x2c, 0xbd,
+ 0xe1, 0x81, 0x02, 0xbe, 0x9a, 0xd1, 0xf4, 0x3d, 0xcb, 0x2d, 0x47, 0x3c,
+ 0x67, 0xba, 0xac, 0xbc, 0xa5, 0x55, 0xba, 0xbd, 0xb5, 0xc9, 0x21, 0x3e,
+ 0x31, 0x54, 0xed, 0xbc, 0xe4, 0x50, 0x02, 0x3e, 0x8c, 0xe8, 0xf5, 0xbc,
+ 0x26, 0xcb, 0x2f, 0xbd, 0xa2, 0x38, 0xc6, 0x3d, 0x16, 0x32, 0xde, 0xbd,
+ 0x9b, 0x49, 0x33, 0xbd, 0x9a, 0x87, 0x28, 0x3e, 0xeb, 0xcc, 0xe4, 0x3d,
+ 0x81, 0x09, 0x15, 0xbe, 0x01, 0x26, 0x46, 0x3d, 0xf3, 0xd8, 0xfe, 0xbc,
+ 0x6d, 0x7e, 0x24, 0xbd, 0xe2, 0x76, 0x1c, 0xbd, 0xdb, 0x36, 0x6b, 0x3d,
+ 0x2a, 0x93, 0x05, 0xbe, 0xab, 0x3d, 0x9c, 0x3d, 0xc7, 0xe9, 0x08, 0xbe,
+ 0xf4, 0x4f, 0xbc, 0x3d, 0xea, 0x78, 0x27, 0x3c, 0xeb, 0x47, 0xa7, 0x3d,
+ 0xd6, 0xb7, 0xc7, 0x3d, 0xe8, 0xdb, 0x09, 0x3e, 0x0f, 0x8f, 0xca, 0x3d,
+ 0x17, 0x31, 0x89, 0x3d, 0x79, 0x3a, 0x1a, 0xbd, 0x1c, 0x20, 0xf8, 0x3d,
+ 0xfb, 0x9c, 0xd9, 0x3d, 0xa1, 0x4d, 0xf4, 0xbd, 0x83, 0x3d, 0x54, 0x3d,
+ 0x7a, 0x2d, 0x07, 0x3d, 0x21, 0x6c, 0x75, 0xbd, 0x0a, 0x74, 0x94, 0x3d,
+ 0x43, 0x11, 0xc8, 0xbd, 0xf6, 0x63, 0x17, 0x3e, 0xb3, 0xa0, 0x4a, 0x3c,
+ 0xf7, 0x59, 0xe2, 0x3d, 0x24, 0xb4, 0x2e, 0x3c, 0x99, 0x1d, 0x4d, 0x3d,
+ 0xd2, 0x78, 0xc6, 0xbd, 0xc0, 0x65, 0x8d, 0xbd, 0xe0, 0xe9, 0x25, 0x3c,
+ 0x6a, 0x88, 0xd1, 0xbd, 0x5b, 0x5b, 0x08, 0xbe, 0xd0, 0x68, 0xdd, 0xbc,
+ 0x78, 0xc7, 0x71, 0xbe, 0x73, 0x32, 0x08, 0xbe, 0xf1, 0x9b, 0x43, 0x3d,
+ 0x94, 0x3f, 0xd2, 0x3d, 0xcc, 0x14, 0xf2, 0x3d, 0x81, 0xd8, 0x81, 0x3d,
+ 0x5f, 0x7e, 0xf2, 0x3d, 0x90, 0xdf, 0xdd, 0xbd, 0xca, 0x27, 0xc9, 0xbd,
+ 0x5a, 0x0d, 0xac, 0x3d, 0x39, 0xc5, 0x7c, 0x3d, 0x7f, 0x84, 0x55, 0xbd,
+ 0x94, 0x7e, 0xfb, 0xbd, 0xd7, 0x6d, 0x55, 0x3c, 0x0f, 0x84, 0xe9, 0xbd,
+ 0x14, 0xfd, 0x09, 0x3e, 0x1d, 0x80, 0x42, 0xbe, 0xe1, 0xcc, 0xaa, 0x3d,
+ 0xf4, 0xd6, 0xd7, 0xbd, 0x68, 0xa8, 0xaf, 0x3c, 0x8e, 0x6d, 0x55, 0x3d,
+ 0x75, 0x03, 0x10, 0x3e, 0xe6, 0x9a, 0x70, 0x3c, 0xc8, 0xfa, 0x6b, 0x3d,
+ 0x2e, 0x14, 0x72, 0xbd, 0xd7, 0xf3, 0xa6, 0x3d, 0xba, 0x72, 0xac, 0xbd,
+ 0xc3, 0xc8, 0x94, 0x3d, 0xac, 0xa8, 0xcf, 0xbd, 0x0a, 0x76, 0x0c, 0xbe,
+ 0xd9, 0x5f, 0x93, 0xbd, 0x84, 0x07, 0x43, 0x3d, 0x3c, 0x9c, 0x13, 0x3e,
+ 0x1d, 0xa6, 0xe4, 0x3b, 0x9c, 0xb3, 0xda, 0xb8, 0x28, 0xc0, 0xb6, 0x3d,
+ 0xc2, 0x47, 0x00, 0xbe, 0xd1, 0x4d, 0x13, 0x3d, 0x4d, 0x93, 0x38, 0xbc,
+ 0x75, 0xd9, 0x01, 0x3e, 0x10, 0x80, 0xde, 0xbc, 0x65, 0xdf, 0xd1, 0xbd,
+ 0x1a, 0x66, 0x20, 0x3e, 0xc9, 0x47, 0x26, 0x3d, 0x57, 0x8c, 0x5e, 0x3e,
+ 0x2a, 0x83, 0xac, 0x3d, 0xa9, 0xd4, 0x81, 0x3e, 0x57, 0x74, 0x3e, 0xbe,
+ 0xd3, 0x6d, 0xef, 0xbb, 0x6d, 0xbf, 0xb9, 0xbd, 0xb6, 0xe0, 0xa9, 0xbd,
+ 0xdc, 0xe3, 0x16, 0x3e, 0xeb, 0x59, 0xaf, 0x3b, 0x7e, 0xdc, 0x75, 0x3d,
+ 0x80, 0xc7, 0xef, 0xbd, 0x91, 0x64, 0x1f, 0xbd, 0xb6, 0x76, 0xa2, 0xbd,
+ 0xe7, 0xdb, 0x69, 0xbe, 0x65, 0x5a, 0x1e, 0xbd, 0x12, 0xe4, 0xa2, 0x3c,
+ 0xdc, 0xbe, 0x02, 0xbe, 0x00, 0x6e, 0x45, 0x3b, 0xdc, 0x8b, 0x94, 0xbe,
+ 0x8c, 0xac, 0xdf, 0x3d, 0x6f, 0x8a, 0xbd, 0xbc, 0xe7, 0x1f, 0xe0, 0xbc,
+ 0x56, 0x6c, 0x47, 0x3d, 0x17, 0x60, 0xa5, 0x3c, 0x2a, 0x4b, 0xea, 0x3c,
+ 0x1b, 0x14, 0x47, 0x3d, 0x88, 0x4b, 0xc3, 0x3d, 0x43, 0x72, 0x12, 0xbd,
+ 0x28, 0x6c, 0x9e, 0x3d, 0x29, 0x8f, 0x95, 0xbc, 0x63, 0xf7, 0x47, 0x3e,
+ 0x20, 0x45, 0xca, 0xbb, 0x46, 0xe1, 0x1a, 0xbd, 0xa9, 0xcd, 0xb5, 0x3d,
+ 0x50, 0x62, 0xcf, 0x3d, 0xe4, 0xa1, 0x0f, 0x3e, 0x78, 0x8f, 0x5e, 0x3d,
+ 0x86, 0x76, 0xad, 0x3c, 0x5b, 0x71, 0x3b, 0x3d, 0xec, 0x23, 0x84, 0xbe,
+ 0x59, 0x3e, 0x8b, 0xbd, 0xe8, 0xd9, 0x9d, 0xbd, 0xca, 0xdf, 0x1e, 0x3e,
+ 0x3b, 0x21, 0xb9, 0x3c, 0x81, 0xef, 0x11, 0xbe, 0x48, 0x5a, 0x98, 0x3c,
+ 0x52, 0x93, 0x01, 0xbd, 0xc5, 0x40, 0x79, 0xbd, 0x1f, 0x43, 0xc4, 0xbd,
+ 0x56, 0x8f, 0x4b, 0x3e, 0x97, 0x96, 0x8c, 0xbc, 0x62, 0xe1, 0x8d, 0x3d,
+ 0xd1, 0x8a, 0x88, 0xbe, 0x37, 0xba, 0x1b, 0xbe, 0xa5, 0x5b, 0x86, 0xbd,
+ 0xff, 0x38, 0x1b, 0x3d, 0x04, 0x19, 0xf4, 0xbc, 0x0b, 0x75, 0x8e, 0x3d,
+ 0xe7, 0x28, 0x47, 0xbe, 0x59, 0xf9, 0xfc, 0x3c, 0x92, 0x50, 0x34, 0x3d,
+ 0x07, 0xc8, 0x8f, 0x3e, 0xea, 0x09, 0x9b, 0x3c, 0xc0, 0xbe, 0x58, 0x3d,
+ 0xd5, 0x5b, 0x04, 0x3d, 0xd9, 0xc5, 0x84, 0xbd, 0x74, 0x32, 0xf0, 0xbd,
+ 0x94, 0xf9, 0x52, 0x3e, 0xf5, 0x14, 0x4a, 0x3d, 0x7f, 0xc4, 0x8e, 0x3c,
+ 0x6b, 0xb6, 0x05, 0xbe, 0xc4, 0x51, 0xfd, 0xbd, 0xd6, 0x2e, 0x01, 0x3e,
+ 0x41, 0x55, 0xc9, 0x3c, 0x27, 0x84, 0xa2, 0x3d, 0x1b, 0x92, 0xe9, 0x3c,
+ 0x34, 0x68, 0x40, 0x3e, 0x52, 0x21, 0x3c, 0x3e, 0x50, 0xd1, 0xcc, 0x3c,
+ 0x28, 0x8a, 0x1e, 0x3e, 0x43, 0x3e, 0x01, 0xbe, 0x2f, 0xc6, 0x2a, 0x3d,
+ 0xcf, 0x13, 0xe9, 0xbd, 0x63, 0xf8, 0x78, 0xbe, 0xad, 0x81, 0x55, 0xbe,
+ 0x06, 0x1e, 0x86, 0x3b, 0xa4, 0x06, 0xa6, 0x3b, 0x2f, 0x2e, 0x2b, 0xbe,
+ 0x07, 0x29, 0x77, 0xbe, 0x30, 0x9f, 0x7e, 0xbd, 0xf6, 0xf7, 0x1b, 0xbe,
+ 0xa3, 0xae, 0x52, 0xbd, 0x01, 0xcf, 0xf1, 0x3d, 0x6c, 0xac, 0xe7, 0x3d,
+ 0xc9, 0xf0, 0xd9, 0x3d, 0x2b, 0x27, 0x79, 0xbd, 0xae, 0x56, 0x53, 0x3e,
+ 0x21, 0xf4, 0xc4, 0x3c, 0x1e, 0x5f, 0xdc, 0xbb, 0x77, 0xc3, 0xa4, 0xbc,
+ 0x55, 0x85, 0x86, 0xbd, 0xea, 0x9d, 0x5a, 0x3d, 0x50, 0xf8, 0x24, 0xbe,
+ 0x53, 0x94, 0x87, 0xbd, 0xb7, 0xb6, 0x21, 0x3e, 0x37, 0x62, 0x96, 0xbe,
+ 0xbc, 0x60, 0xd7, 0xbd, 0x44, 0x38, 0x20, 0xbe, 0x7d, 0x46, 0x32, 0x3d,
+ 0xf1, 0xb5, 0xf5, 0xbd, 0xdc, 0xcc, 0xd7, 0xbc, 0xb6, 0xf3, 0x3f, 0xbd,
+ 0x6a, 0xd8, 0x99, 0x3c, 0x7a, 0x58, 0x14, 0x3e, 0xf2, 0x8b, 0xe2, 0xbd,
+ 0x26, 0x45, 0x85, 0x3d, 0x55, 0x58, 0x5f, 0xbc, 0xb6, 0x07, 0x70, 0x3d,
+ 0xee, 0xdb, 0xcd, 0xbd, 0xd6, 0x6b, 0xc5, 0x3c, 0xc9, 0x90, 0x4a, 0xbe,
+ 0x43, 0x2c, 0x1b, 0x3e, 0xc2, 0x51, 0x67, 0xbd, 0xbc, 0x67, 0xa3, 0xbd,
+ 0x27, 0x3d, 0x1e, 0x3e, 0xf4, 0x73, 0x15, 0xbe, 0x06, 0xfc, 0xec, 0x3d,
+ 0x86, 0x20, 0xc4, 0x3c, 0x00, 0x5a, 0xff, 0xbd, 0x28, 0x85, 0xcd, 0xbd,
+ 0xd9, 0xf5, 0x4e, 0x3d, 0x7d, 0x8f, 0x97, 0xbd, 0x11, 0xf6, 0x84, 0xbd,
+ 0x0c, 0x2e, 0xb8, 0x3d, 0x6d, 0xb9, 0x99, 0x3d, 0x10, 0x37, 0x86, 0xbe,
+ 0x47, 0xac, 0xbf, 0x3d, 0x9d, 0x3d, 0xdb, 0x3c, 0x86, 0x44, 0x41, 0x3d,
+ 0x05, 0x94, 0x4f, 0x3c, 0x5c, 0x3e, 0xdd, 0xbb, 0xb6, 0xa8, 0x83, 0x3a,
+ 0xd0, 0xcf, 0x91, 0x3d, 0xa9, 0xdd, 0xb3, 0x3d, 0x39, 0xdc, 0x0f, 0xbe,
+ 0x07, 0xf9, 0x3a, 0xbe, 0x7b, 0x80, 0x14, 0x3d, 0x71, 0x53, 0xf7, 0x3b,
+ 0x05, 0x90, 0xd5, 0xbd, 0xde, 0x96, 0x0d, 0xbe, 0x94, 0xc7, 0xc7, 0x3d,
+ 0x2d, 0x07, 0x08, 0xbd, 0x76, 0xfa, 0x56, 0x3c, 0x9b, 0xf2, 0xea, 0xbd,
+ 0x66, 0x06, 0x2f, 0x3b, 0xe9, 0xa6, 0x04, 0x3d, 0x17, 0x53, 0x08, 0x3d,
+ 0x1e, 0xe2, 0x5e, 0xbd, 0x0a, 0xf5, 0xb2, 0xbd, 0xd9, 0x40, 0xb6, 0x3d,
+ 0xc1, 0xde, 0xb6, 0xbd, 0x2a, 0xdf, 0x0e, 0x3e, 0xc0, 0x9c, 0x13, 0xbe,
+ 0x58, 0x73, 0x81, 0x3c, 0x00, 0xc0, 0xeb, 0xbd, 0xc7, 0xb6, 0x03, 0xbe,
+ 0x69, 0x9d, 0xb3, 0x3d, 0x16, 0x2d, 0x5d, 0xbd, 0x19, 0xd3, 0x8b, 0xbd,
+ 0x04, 0x9a, 0x3d, 0xbe, 0x1c, 0xdb, 0x55, 0xbe, 0x2a, 0x4b, 0x14, 0xbd,
+ 0x79, 0xe7, 0x98, 0xbd, 0x57, 0x74, 0xab, 0x3a, 0xcc, 0x13, 0xbd, 0xbd,
+ 0xb4, 0x55, 0x26, 0x3e, 0xe8, 0x84, 0x22, 0x3b, 0x09, 0xa2, 0x6f, 0x3e,
+ 0x1c, 0xe5, 0xcf, 0xbd, 0x1a, 0x56, 0x1c, 0xbd, 0x60, 0x52, 0xcf, 0xbd,
+ 0x78, 0x21, 0x2c, 0xbc, 0xa8, 0x82, 0xe3, 0xbd, 0x31, 0x64, 0x0c, 0xbe,
+ 0x91, 0xf1, 0xa2, 0xbd, 0x06, 0x25, 0x4a, 0xbc, 0x02, 0x85, 0x9b, 0xbd,
+ 0x0e, 0xb2, 0x83, 0x3d, 0xf1, 0xc7, 0xca, 0x3c, 0x46, 0x95, 0xe8, 0x3c,
+ 0x89, 0xc1, 0x07, 0xbe, 0x29, 0x0f, 0xad, 0x3c, 0xa5, 0xe8, 0xe5, 0xbd,
+ 0x9f, 0x20, 0x0e, 0xbe, 0xf3, 0xd6, 0x25, 0x3e, 0x4c, 0xb7, 0x34, 0x3e,
+ 0xde, 0x83, 0x82, 0x3b, 0x0b, 0x9e, 0xc2, 0x3d, 0x48, 0x97, 0x19, 0xbe,
+ 0xf4, 0x9c, 0xda, 0xbb, 0xaf, 0x29, 0x09, 0x3e, 0xc4, 0x22, 0xb8, 0x3d,
+ 0xe2, 0x3f, 0x3d, 0x3d, 0x86, 0xdc, 0x90, 0xbd, 0x52, 0xa9, 0x4a, 0x3e,
+ 0x4b, 0x1e, 0xde, 0x3d, 0xa2, 0xd7, 0xb3, 0xbd, 0x26, 0x71, 0xb4, 0x3d,
+ 0xa2, 0x09, 0x88, 0xbd, 0x7d, 0xc4, 0xd8, 0x3d, 0xee, 0xd5, 0x42, 0x3b,
+ 0x35, 0x93, 0x4d, 0xbe, 0x49, 0xf7, 0xc7, 0xbd, 0xf5, 0x07, 0xb5, 0x3d,
+ 0xa6, 0xd0, 0x62, 0xbd, 0x04, 0xea, 0x36, 0xbc, 0x1d, 0x1d, 0x1c, 0xbc,
+ 0x04, 0x96, 0xd2, 0x3d, 0x43, 0xf7, 0xd7, 0xbd, 0xb9, 0xa0, 0x13, 0xbe,
+ 0xbe, 0x0b, 0xa4, 0xbd, 0x18, 0xdc, 0x22, 0x3c, 0x62, 0xcf, 0xab, 0xbd,
+ 0x0e, 0x42, 0x03, 0xbe, 0xfc, 0xe4, 0xfc, 0x3b, 0x5e, 0xe8, 0x45, 0xbd,
+ 0x35, 0x94, 0x88, 0x3d, 0x13, 0xd2, 0xb3, 0x3d, 0xc1, 0x23, 0xa9, 0xbd,
+ 0x49, 0x90, 0x6c, 0x3d, 0x3f, 0x54, 0x56, 0x3b, 0x79, 0x1c, 0x25, 0xbe,
+ 0x05, 0x54, 0x32, 0x3d, 0x27, 0x34, 0x26, 0xbe, 0xfb, 0x8b, 0xa1, 0x3d,
+ 0x8c, 0x94, 0xb5, 0x3d, 0xaa, 0x98, 0x28, 0x3d, 0xd9, 0x68, 0x46, 0x3d,
+ 0x8c, 0xe4, 0x4e, 0xbd, 0x4f, 0x2c, 0x1d, 0xbe, 0xbc, 0xe4, 0xba, 0xbb,
+ 0xcb, 0x29, 0x0d, 0x3e, 0xda, 0x7d, 0xa8, 0xbc, 0x1f, 0x47, 0x3a, 0xbd,
+ 0x23, 0xac, 0xcb, 0xbd, 0x00, 0xfd, 0x57, 0xbd, 0x1d, 0x56, 0xf4, 0xbd,
+ 0x3b, 0x9b, 0x27, 0xbe, 0x30, 0x38, 0x04, 0x3a, 0x1c, 0x90, 0x4a, 0xbd,
+ 0x11, 0xe8, 0x94, 0xbb, 0x9c, 0x3f, 0x17, 0x3d, 0x20, 0x5e, 0x31, 0xbd,
+ 0x10, 0xd2, 0x3a, 0xbd, 0xb3, 0x21, 0x1a, 0x3e, 0x47, 0x5d, 0x0c, 0xbb,
+ 0xa5, 0x0d, 0xc9, 0xbc, 0x91, 0xf9, 0xc0, 0x3d, 0x3a, 0x68, 0x32, 0x3d,
+ 0x55, 0xbb, 0x21, 0x3d, 0x15, 0xbe, 0xa5, 0x3d, 0x54, 0x5d, 0x59, 0xbe,
+ 0x80, 0x12, 0xc7, 0xbd, 0xc5, 0xf4, 0xf3, 0x3c, 0x11, 0xa3, 0xcc, 0xbd,
+ 0x79, 0x41, 0xee, 0x3d, 0xd7, 0xc5, 0x0b, 0xbe, 0xfd, 0xc9, 0x22, 0x3e,
+ 0x18, 0x82, 0xb5, 0xbd, 0x65, 0xca, 0x15, 0x3d, 0x4a, 0x0f, 0x8c, 0x3d,
+ 0x6b, 0xb0, 0x1a, 0x3e, 0x77, 0xed, 0xc5, 0xbc, 0x7e, 0x22, 0xbe, 0x3d,
+ 0xf7, 0x39, 0x12, 0xbe, 0xba, 0x39, 0x50, 0x3c, 0xad, 0x1e, 0x08, 0xbe,
+ 0x8b, 0xeb, 0x2a, 0x3e, 0x82, 0x12, 0x9d, 0x3d, 0x3a, 0x95, 0x12, 0xbe,
+ 0x83, 0x4e, 0x60, 0xbd, 0x9a, 0xd3, 0xdd, 0xbc, 0x79, 0x55, 0xac, 0x3d,
+ 0x55, 0xe1, 0x7d, 0x3d, 0xa9, 0x37, 0xfa, 0x3d, 0x33, 0x4b, 0x5b, 0xbd,
+ 0xac, 0x42, 0xa4, 0xbd, 0xfa, 0x90, 0x2a, 0xbe, 0xdf, 0x21, 0xd0, 0xbd,
+ 0x1a, 0x74, 0xfb, 0x3c, 0x93, 0xa6, 0x6d, 0x3d, 0x25, 0xa0, 0xda, 0xbd,
+ 0x22, 0x98, 0x28, 0x3e, 0x5a, 0x35, 0xa3, 0x3d, 0xbd, 0x42, 0x28, 0x3e,
+ 0xe5, 0xe5, 0x65, 0xbd, 0xf7, 0xf9, 0xc1, 0xbd, 0xb6, 0x09, 0x95, 0x3d,
+ 0x14, 0xcb, 0x07, 0xbd, 0xf4, 0xaa, 0xce, 0xbc, 0xb9, 0x33, 0x32, 0x3d,
+ 0xad, 0xb2, 0xad, 0x3d, 0x9b, 0x98, 0x9f, 0x3c, 0xb6, 0xc9, 0x80, 0xbb,
+ 0x0a, 0x3b, 0x40, 0x3c, 0x9f, 0x76, 0xaa, 0x3d, 0xe8, 0x4c, 0xf2, 0x3b,
+ 0xce, 0x15, 0x36, 0xbe, 0xb9, 0x89, 0x0c, 0xbd, 0xc4, 0xaa, 0x79, 0x3d,
+ 0x92, 0x18, 0x53, 0xbd, 0xa9, 0x66, 0x25, 0x3e, 0xac, 0xdd, 0x6b, 0xbd,
+ 0xdf, 0x4a, 0x30, 0x3e, 0x70, 0xe1, 0x7e, 0xbc, 0x48, 0x3d, 0x7e, 0xbb,
+ 0x8d, 0xba, 0x12, 0x3a, 0xa7, 0x05, 0x84, 0x3d, 0x36, 0x12, 0x02, 0x3e,
+ 0x8c, 0x15, 0x01, 0xbe, 0x46, 0xf6, 0xc3, 0xbc, 0x5c, 0xf4, 0xe7, 0x3d,
+ 0xa7, 0x47, 0x07, 0x3e, 0x3a, 0x01, 0xe1, 0x3d, 0x05, 0x68, 0x01, 0xbe,
+ 0xa8, 0x7c, 0x8a, 0xbc, 0xf1, 0xfc, 0xb8, 0x3d, 0xbc, 0x6e, 0x44, 0xbd,
+ 0x9f, 0x72, 0x31, 0xbe, 0x47, 0xaf, 0xc9, 0xbd, 0x39, 0x25, 0xbf, 0xbc,
+ 0x41, 0xde, 0x16, 0x3e, 0x0b, 0x5f, 0xaa, 0x3d, 0x85, 0xa7, 0x51, 0x3e,
+ 0x60, 0x7a, 0x81, 0xbc, 0x09, 0x48, 0xe4, 0xbd, 0x91, 0x78, 0xf1, 0xbd,
+ 0x9d, 0xa5, 0xb1, 0x3b, 0xd8, 0x75, 0xc4, 0x3d, 0x0a, 0x15, 0x9f, 0xbc,
+ 0x59, 0x0c, 0x8e, 0xbd, 0x04, 0x2d, 0xdc, 0x3d, 0x38, 0xb5, 0x1d, 0x3d,
+ 0x96, 0x6f, 0x44, 0xbd, 0x29, 0x5f, 0x59, 0xbd, 0x23, 0x69, 0xd3, 0x3d,
+ 0x0e, 0xa4, 0xb6, 0x3d, 0xa1, 0xb5, 0xbe, 0x3b, 0xdf, 0x04, 0xce, 0x3c,
+ 0xad, 0xcf, 0xbb, 0x3d, 0xfe, 0x05, 0x1b, 0xbe, 0x58, 0xc1, 0xc7, 0xbd,
+ 0x38, 0x9d, 0x63, 0xbe, 0x82, 0xc9, 0x91, 0xbe, 0x59, 0x5a, 0x00, 0xbe,
+ 0xbb, 0x68, 0x0f, 0x3e, 0x8f, 0xe1, 0xf3, 0x3d, 0xdc, 0x2e, 0xe4, 0x3d,
+ 0xb9, 0x24, 0x4c, 0xbe, 0x67, 0x3c, 0x0a, 0xbe, 0x85, 0xda, 0x20, 0xbe,
+ 0xfe, 0x5a, 0x91, 0x3d, 0xfb, 0xf9, 0x1d, 0xbe, 0xff, 0xc3, 0xd3, 0xbd,
+ 0xfa, 0x0d, 0x20, 0x3e, 0x18, 0x61, 0xb5, 0xbd, 0x88, 0x8a, 0x07, 0xbd,
+ 0xbb, 0x21, 0x03, 0x3e, 0x53, 0x4f, 0x20, 0x3e, 0x16, 0xc5, 0x28, 0x3c,
+ 0x19, 0xdf, 0x7e, 0xbe, 0x72, 0xc1, 0x5d, 0x3e, 0x1b, 0xb8, 0xeb, 0x3c,
+ 0xad, 0x44, 0x05, 0xbe, 0x78, 0xe7, 0xf6, 0xbd, 0xdc, 0x5e, 0x4d, 0x3c,
+ 0xc7, 0x79, 0x75, 0xbe, 0x8e, 0x34, 0x6c, 0x3e, 0xd9, 0x88, 0xc9, 0x3c,
+ 0x7c, 0xe8, 0x1a, 0x3d, 0x54, 0x40, 0x6d, 0x3d, 0x8e, 0xd1, 0x4d, 0xbe,
+ 0x63, 0x14, 0xc6, 0x3e, 0x33, 0x98, 0x09, 0xbe, 0x57, 0xb8, 0x03, 0xbd,
+ 0x21, 0x41, 0x16, 0xbc, 0xda, 0xf2, 0x77, 0xbe, 0xf4, 0x6b, 0xc4, 0xbd,
+ 0xf1, 0x29, 0x2b, 0x3e, 0x74, 0xa3, 0x45, 0x3e, 0xb4, 0x78, 0x40, 0x3e,
+ 0xfc, 0xdd, 0x27, 0x3e, 0xbe, 0x64, 0x37, 0xbe, 0xa4, 0x43, 0x63, 0xbe,
+ 0xc9, 0x1e, 0x31, 0xbd, 0x14, 0x85, 0x65, 0x3e, 0x08, 0x5a, 0xaa, 0x3c,
+ 0xba, 0x4b, 0x95, 0x3e, 0x19, 0x0a, 0x12, 0xbd, 0xb4, 0x92, 0x07, 0x3c,
+ 0xca, 0x2b, 0x9b, 0xbe, 0x7e, 0x43, 0xf4, 0xbd, 0x88, 0x89, 0x02, 0xbe,
+ 0x56, 0xec, 0x5d, 0x3e, 0xc7, 0xaf, 0x70, 0x3e, 0xaa, 0x7b, 0x82, 0x3d,
+ 0xfc, 0x68, 0x1e, 0x3d, 0x5b, 0xb7, 0x54, 0x3e, 0x10, 0xe5, 0xd2, 0x3d,
+ 0xa2, 0x6a, 0x7f, 0x3d, 0x62, 0xf8, 0x0e, 0xbe, 0xdf, 0x81, 0xdc, 0x3d,
+ 0x45, 0xf6, 0x1b, 0xbe, 0x6b, 0x36, 0x04, 0x3d, 0x6f, 0x91, 0xc8, 0xbd,
+ 0x0e, 0x56, 0x62, 0xbe, 0x7b, 0x97, 0x26, 0x3e, 0x54, 0x97, 0xa8, 0x3c,
+ 0xf2, 0x38, 0x4b, 0xbe, 0x9a, 0x3e, 0x0b, 0x3e, 0xdd, 0x99, 0x56, 0x3e,
+ 0x35, 0x71, 0xb1, 0x3e, 0xda, 0xa5, 0xa9, 0xbc, 0x7f, 0x7e, 0x04, 0xbe,
+ 0xe1, 0x52, 0xe4, 0xbc, 0xd7, 0x75, 0xa8, 0xbd, 0xe4, 0x72, 0x53, 0xbe,
+ 0x2d, 0xb6, 0x0d, 0xbe, 0xa7, 0x2e, 0xf7, 0xbd, 0x16, 0xae, 0x51, 0x3e,
+ 0x63, 0x45, 0x47, 0xbe, 0xcb, 0x7e, 0x23, 0xbd, 0xaa, 0x6e, 0xe2, 0x3d,
+ 0x3d, 0xa9, 0xe0, 0xbd, 0x8d, 0x3c, 0x3b, 0x3d, 0x47, 0xfd, 0x9a, 0x3e,
+ 0x92, 0x48, 0x28, 0xbe, 0xe7, 0x33, 0x43, 0x3d, 0x6b, 0x64, 0x16, 0x3d,
+ 0x54, 0xc0, 0x80, 0x3e, 0xe7, 0x5f, 0xfb, 0x3d, 0x92, 0x25, 0x69, 0x3e,
+ 0xe5, 0x61, 0xb2, 0xba, 0x00, 0x50, 0xcf, 0xbe, 0x11, 0xc6, 0xe2, 0x3b,
+ 0x71, 0x28, 0xa3, 0xbe, 0xdb, 0xc6, 0x80, 0xbe, 0x4e, 0xe0, 0xec, 0xbd,
+ 0x73, 0x13, 0x0a, 0xbe, 0x03, 0xa0, 0x4e, 0x3e, 0xfb, 0x1d, 0xfd, 0xbc,
+ 0x22, 0xcb, 0x98, 0xbd, 0xe9, 0xe2, 0xc7, 0xbd, 0xab, 0x6c, 0x5e, 0xbd,
+ 0x60, 0x7a, 0x95, 0xbd, 0x27, 0x85, 0x25, 0xbe, 0x46, 0x03, 0xd0, 0x3e,
+ 0xbf, 0x80, 0x01, 0x3e, 0xec, 0x03, 0x36, 0x3e, 0xed, 0x59, 0xbd, 0x3d,
+ 0x17, 0xa9, 0xd5, 0xbc, 0x55, 0xec, 0x8f, 0xbd, 0x20, 0x10, 0x27, 0xbd,
+ 0x48, 0x9e, 0x9b, 0xbd, 0x96, 0x5e, 0x36, 0xbe, 0x94, 0x0f, 0xa0, 0x3e,
+ 0x7c, 0xae, 0x35, 0x3e, 0x33, 0x16, 0xbc, 0xbd, 0xa7, 0x7f, 0xa6, 0xbd,
+ 0x67, 0x52, 0xa8, 0x39, 0xc7, 0x66, 0x76, 0x3d, 0x2f, 0xcc, 0x5a, 0x3d,
+ 0x28, 0x70, 0x56, 0xbd, 0x64, 0x06, 0x91, 0x3d, 0x07, 0xee, 0x55, 0x3b,
+ 0x7f, 0x46, 0x11, 0xbe, 0xa8, 0x91, 0xd3, 0xbd, 0xd2, 0xfb, 0x53, 0x3c,
+ 0x28, 0xc6, 0xbe, 0xbd, 0x22, 0xaa, 0x34, 0xbe, 0xfd, 0x28, 0xd2, 0xbd,
+ 0x70, 0xf0, 0x14, 0xbe, 0x10, 0x06, 0x11, 0xbe, 0x11, 0x03, 0x1e, 0x3e,
+ 0xa7, 0xd5, 0xd2, 0x3c, 0x34, 0x9d, 0x19, 0xbd, 0x7e, 0xc8, 0x2a, 0xbd,
+ 0x04, 0xdc, 0xac, 0xbd, 0x2c, 0x3e, 0xe6, 0xbc, 0x7a, 0x05, 0x94, 0xbd,
+ 0x53, 0x2e, 0x05, 0xbe, 0x17, 0xab, 0x0a, 0x3e, 0x0d, 0x85, 0xcc, 0x3c,
+ 0xff, 0x37, 0xe0, 0xbd, 0xd6, 0x2b, 0x17, 0x3e, 0x4b, 0x6e, 0x8f, 0xbd,
+ 0x58, 0xe6, 0xdb, 0x3d, 0xdb, 0x3f, 0x66, 0xbd, 0xf7, 0x47, 0xb0, 0x3d,
+ 0x6f, 0xd0, 0x37, 0x3e, 0x56, 0x6b, 0x80, 0x3c, 0x2e, 0x84, 0x20, 0xbd,
+ 0xaf, 0xce, 0x02, 0x3e, 0x69, 0xe4, 0xfd, 0x3c, 0x9b, 0xd3, 0x87, 0x3d,
+ 0xb8, 0x5a, 0x1e, 0x3d, 0x30, 0xb5, 0xfc, 0xbd, 0x64, 0xa8, 0xfd, 0x3d,
+ 0x72, 0x15, 0x6c, 0xbd, 0x12, 0x04, 0x9e, 0xbd, 0x28, 0x17, 0xa1, 0x3d,
+ 0x18, 0xdf, 0x9f, 0xbd, 0x33, 0x21, 0x18, 0xbc, 0xea, 0xb7, 0xa9, 0x3c,
+ 0xcd, 0x68, 0xbe, 0x3d, 0x80, 0x49, 0x6a, 0xbd, 0x6b, 0x69, 0xf4, 0x3d,
+ 0xcd, 0x80, 0x35, 0xbd, 0xb1, 0x7d, 0xdc, 0xbd, 0x76, 0xe8, 0xce, 0x3d,
+ 0x4f, 0xa4, 0x5f, 0xbd, 0xe6, 0x52, 0xb3, 0xbc, 0x57, 0xfd, 0xed, 0x3d,
+ 0x4e, 0x21, 0xb4, 0xbd, 0xae, 0x9e, 0xe5, 0xbd, 0x6a, 0xb0, 0x72, 0xbb,
+ 0xc5, 0x8f, 0x8e, 0x3d, 0xa1, 0x57, 0x1f, 0xbe, 0xf3, 0x32, 0x0f, 0xbd,
+ 0x7a, 0x8d, 0x92, 0xbd, 0x14, 0x99, 0xb5, 0x3d, 0x52, 0x89, 0x2a, 0xbe,
+ 0x2d, 0xd9, 0x6f, 0xbd, 0x59, 0x8a, 0x9a, 0x3d, 0x1e, 0xed, 0xa6, 0x3d,
+ 0xe4, 0xbd, 0x0e, 0xbe, 0xad, 0x63, 0xb7, 0xbd, 0xed, 0x73, 0xc1, 0x3d,
+ 0xf2, 0x2c, 0xa2, 0xbd, 0x95, 0x5d, 0x03, 0x3e, 0x5b, 0x67, 0x7d, 0xbc,
+ 0x15, 0x90, 0x66, 0xbe, 0x3e, 0x21, 0xf2, 0x3c, 0xfe, 0xf4, 0x6f, 0x3d,
+ 0x6f, 0x05, 0xeb, 0xbd, 0x9c, 0x24, 0x02, 0xbd, 0xdd, 0x26, 0x91, 0xbd,
+ 0x2e, 0x56, 0xf1, 0xbd, 0x13, 0x72, 0x00, 0xbe, 0x5e, 0xa2, 0xe0, 0xbd,
+ 0x4d, 0xdd, 0xb5, 0x3d, 0xb0, 0x0d, 0xe2, 0xbd, 0x1a, 0x30, 0x2b, 0x3d,
+ 0x2f, 0xe3, 0x8a, 0xbd, 0xa0, 0x82, 0x5f, 0x3e, 0x77, 0xb2, 0xa6, 0x3d,
+ 0xa0, 0xca, 0xc8, 0x3d, 0x33, 0x9d, 0x61, 0xbd, 0xc8, 0x0a, 0xb2, 0x3d,
+ 0xe5, 0xcb, 0x9e, 0xbd, 0x1c, 0x2a, 0xd6, 0x3d, 0x43, 0x10, 0xb4, 0x3d,
+ 0x76, 0xb3, 0x15, 0x3e, 0x01, 0x6c, 0x25, 0xbc, 0x1f, 0xcf, 0xf4, 0x3d,
+ 0x70, 0xdc, 0xfd, 0x3c, 0x17, 0xc3, 0xbc, 0x3c, 0x49, 0x9f, 0x94, 0x3d,
+ 0x07, 0xe7, 0xc5, 0xbd, 0xd1, 0x0e, 0xbd, 0xbb, 0x84, 0xf1, 0x84, 0x3d,
+ 0x6f, 0x43, 0x85, 0xbd, 0x9b, 0x02, 0x2d, 0xbe, 0xc8, 0x93, 0x88, 0xbb,
+ 0x37, 0x10, 0x9b, 0x3d, 0x57, 0xcc, 0xd6, 0x3c, 0x5d, 0x74, 0xfc, 0x3d,
+ 0x8d, 0xaa, 0x0d, 0xbe, 0x5e, 0x13, 0x81, 0x3d, 0x58, 0xd5, 0x6b, 0xbe,
+ 0x8a, 0xa2, 0xd3, 0x3d, 0xe5, 0x4c, 0xf9, 0x3d, 0x98, 0xd6, 0xe7, 0x3d,
+ 0x24, 0x1c, 0xaa, 0xbc, 0x78, 0x09, 0xea, 0xbc, 0x11, 0x30, 0x68, 0x3d,
+ 0x85, 0x94, 0xf2, 0x3d, 0x78, 0x6b, 0x20, 0x3e, 0xec, 0x69, 0xec, 0x3c,
+ 0x58, 0xbc, 0xd0, 0xbd, 0x00, 0x6c, 0x02, 0x3d, 0x5a, 0xf1, 0x24, 0xbe,
+ 0x4c, 0xac, 0x3d, 0x3e, 0x6e, 0xd0, 0xfa, 0xbb, 0x99, 0x68, 0x7e, 0xbd,
+ 0x9e, 0xca, 0xa3, 0x3c, 0xa8, 0x27, 0xd4, 0x3c, 0xfd, 0xaf, 0x4a, 0x3d,
+ 0x76, 0x44, 0x41, 0xbe, 0xef, 0xdc, 0x8e, 0x3d, 0xab, 0xcd, 0x20, 0xbe,
+ 0x61, 0x85, 0x38, 0xbd, 0x9a, 0xd3, 0x3d, 0xbc, 0x8a, 0xa2, 0xc2, 0xbc,
+ 0xca, 0x67, 0x4b, 0xbd, 0xd9, 0x5e, 0xdb, 0xbd, 0xb1, 0x73, 0xde, 0x3d,
+ 0xa6, 0x54, 0xc7, 0xbd, 0x0e, 0xdb, 0x92, 0xbd, 0xa7, 0x03, 0x29, 0xbd,
+ 0xb2, 0x31, 0x12, 0x3e, 0x99, 0xce, 0x82, 0x3d, 0x1e, 0x91, 0x46, 0xbd,
+ 0x04, 0x1c, 0x13, 0xbb, 0x05, 0x91, 0x4f, 0xbe, 0x9a, 0xa1, 0x97, 0x3e,
+ 0x52, 0x45, 0x18, 0xbe, 0xd2, 0xd4, 0x92, 0xbb, 0x98, 0x4e, 0xf7, 0x3d,
+ 0x4e, 0x9f, 0xcd, 0xbd, 0xf1, 0xcb, 0x2e, 0x3d, 0xc0, 0x98, 0x88, 0xbd,
+ 0x30, 0xfc, 0xc0, 0x3d, 0x91, 0x72, 0xba, 0xbc, 0xfa, 0xf9, 0x4c, 0xbd,
+ 0x6a, 0x48, 0xd5, 0xbd, 0xae, 0x47, 0x38, 0xbd, 0x5a, 0x44, 0x71, 0x3b,
+ 0xf3, 0xdb, 0x0d, 0x3e, 0x35, 0x34, 0x98, 0xbd, 0xdf, 0x7a, 0x99, 0x3d,
+ 0xae, 0x09, 0xb7, 0xbd, 0x2a, 0x8c, 0xed, 0xbd, 0xdc, 0x42, 0x1e, 0xbe,
+ 0x4c, 0xc5, 0x44, 0x3d, 0x23, 0xf2, 0xc3, 0x3d, 0x38, 0x07, 0xd5, 0x3c,
+ 0x3b, 0xc0, 0x16, 0xbd, 0x72, 0x71, 0x34, 0xbd, 0x82, 0x67, 0x63, 0xbd,
+ 0xc4, 0xd3, 0x03, 0x3e, 0x22, 0x31, 0x90, 0xbd, 0x40, 0x07, 0xad, 0x3b,
+ 0xe9, 0x20, 0x66, 0xbd, 0x95, 0xba, 0x0e, 0x3e, 0x73, 0x34, 0x24, 0xbe,
+ 0xdb, 0x5f, 0xee, 0x3d, 0x0a, 0x9c, 0x1a, 0xbe, 0x76, 0xb6, 0x66, 0xbc,
+ 0xd0, 0xd0, 0x80, 0x3e, 0x17, 0xf0, 0x8d, 0xbd, 0x4e, 0xd5, 0x12, 0xbe,
+ 0x18, 0x22, 0x50, 0x3e, 0xe2, 0xc4, 0x99, 0x3d, 0x0a, 0x90, 0x5f, 0xbd,
+ 0x92, 0xca, 0xb7, 0xbd, 0x6f, 0xec, 0xf9, 0xbd, 0x28, 0x44, 0x26, 0x3e,
+ 0x83, 0x94, 0x33, 0xbd, 0x3f, 0xf6, 0xda, 0x3d, 0xe0, 0xb6, 0xbf, 0x3d,
+ 0xa4, 0x2a, 0x66, 0x3e, 0xf8, 0xb3, 0x6b, 0x3e, 0xc3, 0xbd, 0x80, 0x3c,
+ 0xf9, 0x20, 0x82, 0x3e, 0x62, 0x12, 0xdc, 0xbd, 0xc5, 0xee, 0x36, 0xbd,
+ 0xb7, 0x57, 0xd7, 0xbd, 0x5f, 0xf0, 0xfb, 0xbd, 0xad, 0x9e, 0x2c, 0xbe,
+ 0x35, 0x8b, 0xe0, 0xbd, 0x6d, 0x95, 0xbd, 0xbc, 0x46, 0x6c, 0x61, 0xbd,
+ 0x41, 0x4d, 0x25, 0xbe, 0x1d, 0xce, 0xa2, 0x3c, 0xbc, 0xf6, 0x46, 0xbe,
+ 0x56, 0x7c, 0xad, 0x3d, 0x0c, 0x6f, 0x30, 0x3e, 0xb7, 0x29, 0x12, 0x3d,
+ 0x5f, 0x34, 0x8b, 0xbc, 0x5d, 0xf4, 0xa0, 0x3d, 0x15, 0xc2, 0x41, 0x3e,
+ 0x8f, 0xcb, 0xcb, 0x3d, 0xcb, 0x47, 0x8d, 0xbd, 0x5f, 0x0e, 0xb1, 0x3c,
+ 0xa9, 0x6b, 0x4b, 0xbc, 0xe0, 0xa2, 0x04, 0xbe, 0x14, 0x1f, 0x30, 0xbe,
+ 0xa0, 0x3b, 0x46, 0xbd, 0xb0, 0xc5, 0x5a, 0x3d, 0x65, 0xf5, 0x9d, 0xbe,
+ 0xba, 0xeb, 0xc5, 0x3d, 0xc4, 0x45, 0xa8, 0xbd, 0x59, 0xb2, 0x78, 0x3d,
+ 0xe7, 0x61, 0x0d, 0xbc, 0x74, 0x64, 0x91, 0xbd, 0x9d, 0x91, 0xc1, 0x3d,
+ 0x0d, 0x1d, 0x4d, 0x3c, 0xab, 0x4f, 0xea, 0x3d, 0x33, 0x55, 0x08, 0xbe,
+ 0xd4, 0x34, 0xa2, 0xbd, 0xdf, 0xef, 0x2c, 0xbe, 0x66, 0x15, 0xeb, 0x3d,
+ 0x66, 0xcb, 0x07, 0x3e, 0x2c, 0x50, 0xe6, 0xbd, 0xe7, 0xcf, 0xd8, 0x3c,
+ 0xcc, 0xc6, 0xc6, 0x3d, 0x03, 0xf0, 0x11, 0xbe, 0xab, 0xb0, 0x04, 0xbe,
+ 0x67, 0x84, 0xcb, 0x3d, 0x70, 0x25, 0x2f, 0xbc, 0x79, 0x8f, 0x13, 0x3e,
+ 0xf2, 0x98, 0x41, 0x3d, 0xe2, 0x76, 0xf7, 0xbd, 0xc3, 0x73, 0xc2, 0x3d,
+ 0x54, 0xe2, 0xda, 0xbd, 0x7a, 0xba, 0x01, 0xbe, 0x36, 0xa9, 0xab, 0xbd,
+ 0x3c, 0xc8, 0xbb, 0xbd, 0xb8, 0x28, 0x3e, 0x3c, 0xc7, 0x61, 0x4b, 0xbd,
+ 0xee, 0x9a, 0xfd, 0x3d, 0x35, 0xef, 0x03, 0xbd, 0x0e, 0x66, 0xcb, 0xbc,
+ 0x5a, 0x5f, 0x1c, 0xbe, 0xb8, 0xb1, 0xf6, 0x3d, 0xbc, 0x06, 0x9d, 0xbc,
+ 0xe5, 0xb8, 0xcf, 0xbb, 0xe4, 0xa2, 0x69, 0xbd, 0x91, 0x1b, 0xf1, 0xbc,
+ 0xec, 0xcb, 0x58, 0xbe, 0x6b, 0x3b, 0x57, 0xbd, 0x32, 0x97, 0xd7, 0x3d,
+ 0x54, 0x5c, 0x2c, 0x3d, 0x96, 0xee, 0xca, 0x3c, 0x30, 0x21, 0xd3, 0x3b,
+ 0xca, 0xcd, 0x87, 0xbd, 0x1d, 0x08, 0x4f, 0x3d, 0xfd, 0x83, 0xdd, 0xbc,
+ 0x26, 0xd2, 0x32, 0x3d, 0xdf, 0x8e, 0xac, 0xbd, 0x48, 0xc6, 0x0e, 0x3c,
+ 0xea, 0xa4, 0xc2, 0x3d, 0x16, 0xc5, 0x11, 0x3d, 0x10, 0xf5, 0x8c, 0xbd,
+ 0xc0, 0x19, 0xc3, 0x3d, 0x01, 0x35, 0x11, 0xbd, 0x93, 0x65, 0x98, 0xbb,
+ 0x9d, 0x44, 0x79, 0x3d, 0xf2, 0x6e, 0xec, 0xbd, 0xcc, 0xf2, 0xd2, 0xbd,
+ 0x6e, 0x7c, 0x9b, 0x3d, 0x49, 0x56, 0xd8, 0x3d, 0x46, 0x52, 0x25, 0x3e,
+ 0x07, 0x6c, 0x6b, 0xbd, 0xee, 0xc7, 0x3c, 0xbd, 0x22, 0xcc, 0x1a, 0xbd,
+ 0x5d, 0x29, 0x4b, 0x3c, 0x23, 0x62, 0x1e, 0xbe, 0x37, 0x5f, 0x85, 0x3d,
+ 0x8f, 0x77, 0x2a, 0x3e, 0x45, 0x45, 0xb8, 0xbd, 0xd1, 0x02, 0x0f, 0x3e,
+ 0x0f, 0x87, 0xdd, 0xbd, 0xab, 0x2a, 0x8e, 0x3b, 0xfd, 0xc4, 0xb2, 0x3c,
+ 0xfc, 0x4b, 0xf5, 0x3d, 0x96, 0xb5, 0xf6, 0x3d, 0xbf, 0x37, 0x3a, 0xbd,
+ 0xf1, 0xbb, 0x33, 0x3d, 0x49, 0x98, 0x39, 0x3e, 0x38, 0xec, 0xee, 0x3d,
+ 0xb4, 0x78, 0x81, 0x3d, 0xcf, 0xc8, 0xf5, 0x3d, 0xa8, 0xd8, 0x1b, 0xbd,
+ 0xcf, 0x67, 0xde, 0xbd, 0xf6, 0x4d, 0x17, 0xbe, 0xfa, 0xf5, 0x18, 0xbe,
+ 0x68, 0x65, 0xf1, 0x3d, 0x6b, 0xae, 0xb2, 0xbd, 0x8a, 0x50, 0xcb, 0x3d,
+ 0x1b, 0x5a, 0xc6, 0xbc, 0x85, 0x27, 0x18, 0xbd, 0x05, 0x79, 0xc7, 0x3c,
+ 0xfe, 0x43, 0x91, 0xbd, 0x38, 0xe2, 0x56, 0xbd, 0x26, 0xa8, 0x13, 0x3e,
+ 0xec, 0x11, 0x8e, 0x3c, 0xe1, 0x4e, 0xb6, 0x3d, 0x63, 0xe0, 0x97, 0xbc,
+ 0x12, 0x67, 0xec, 0xbd, 0xf1, 0xa5, 0xad, 0x3b, 0xf9, 0x1c, 0xc0, 0x3d,
+ 0x08, 0xb9, 0x38, 0x3d, 0xde, 0x3e, 0xbb, 0xbd, 0xf8, 0xe3, 0xfe, 0xbd,
+ 0xbd, 0x3e, 0x2e, 0xbb, 0x68, 0x14, 0x8b, 0x3c, 0xce, 0x92, 0x5b, 0x3c,
+ 0xc0, 0x41, 0x1c, 0x3e, 0x33, 0x0b, 0xa5, 0xbd, 0xf7, 0x04, 0xab, 0x3d,
+ 0x29, 0xe1, 0x46, 0x3d, 0xda, 0x6f, 0xba, 0xbc, 0xcd, 0x74, 0x72, 0xbd,
+ 0x8d, 0xf3, 0x03, 0xbe, 0x83, 0xce, 0x4a, 0x3d, 0x19, 0xf7, 0x06, 0x3e,
+ 0x22, 0x0b, 0x03, 0x3e, 0xf5, 0x4d, 0x1b, 0xbd, 0xb8, 0xda, 0x31, 0x3d,
+ 0x73, 0xe7, 0xf7, 0x3c, 0x6f, 0x67, 0xc6, 0xbb, 0xdf, 0x62, 0xad, 0x3d,
+ 0xa0, 0x79, 0x6a, 0x3d, 0x60, 0x0e, 0x9c, 0xbd, 0xc2, 0x52, 0xf2, 0xbd,
+ 0x10, 0xfc, 0xd3, 0xbd, 0x1f, 0x2a, 0xea, 0xbd, 0xf1, 0x79, 0x16, 0x3e,
+ 0xa7, 0x19, 0xda, 0xbd, 0x41, 0x6b, 0xb6, 0x3c, 0x02, 0xe8, 0x5a, 0xbd,
+ 0xeb, 0x3b, 0x0d, 0x3e, 0xbb, 0x61, 0x27, 0xbe, 0xce, 0x75, 0x9a, 0x3b,
+ 0x36, 0x1b, 0x13, 0x3e, 0xc6, 0xa6, 0xaf, 0xbd, 0x75, 0x90, 0x09, 0x3e,
+ 0x5e, 0x67, 0xaf, 0x3d, 0xd1, 0x62, 0x22, 0xbe, 0xa7, 0x01, 0x07, 0xbe,
+ 0x54, 0xc5, 0x15, 0xbe, 0xc6, 0x22, 0xf1, 0xbd, 0x69, 0xc0, 0x7c, 0xbd,
+ 0xba, 0x03, 0x2d, 0x3d, 0x44, 0x5c, 0x02, 0xbe, 0xaa, 0xc5, 0x90, 0xbe,
+ 0x60, 0x67, 0xcb, 0x3d, 0xe2, 0x05, 0x00, 0xbc, 0x46, 0x6b, 0xce, 0x3c,
+ 0x41, 0x3a, 0xf4, 0x3d, 0xa3, 0x84, 0x59, 0xbd, 0x1d, 0x89, 0xd8, 0x3d,
+ 0x88, 0x03, 0xdf, 0xbd, 0x50, 0x17, 0xa0, 0xbd, 0xee, 0x45, 0xe8, 0xbd,
+ 0x01, 0x8c, 0x3a, 0x3c, 0x1b, 0x9b, 0xeb, 0xbd, 0x99, 0xc7, 0x0b, 0x3e,
+ 0x33, 0xfe, 0xd7, 0x3c, 0x7c, 0xa9, 0x3e, 0xbe, 0x38, 0x88, 0x1a, 0x3e,
+ 0xd7, 0xe7, 0x00, 0xbd, 0x19, 0x49, 0xc5, 0x3d, 0xcb, 0x70, 0xb8, 0xbd,
+ 0x81, 0xfb, 0xdd, 0x3c, 0xff, 0xb2, 0xdd, 0xbd, 0x50, 0x93, 0xfa, 0x3d,
+ 0xce, 0xd4, 0xa4, 0x3d, 0x02, 0x1d, 0x32, 0xbe, 0x03, 0x16, 0x9e, 0xbd,
+ 0x66, 0x8c, 0x24, 0x3d, 0xc6, 0xd0, 0xed, 0x3d, 0x1f, 0xc3, 0xe8, 0xbc,
+ 0x19, 0x0b, 0x05, 0x3a, 0xac, 0xe2, 0x15, 0xbe, 0xa3, 0x55, 0xed, 0x3d,
+ 0x2b, 0x24, 0x28, 0x3d, 0xd5, 0xcb, 0x98, 0xbd, 0x47, 0xb2, 0xfd, 0x3c,
+ 0x18, 0xa6, 0x38, 0xbe, 0x67, 0xef, 0xf9, 0xbd, 0xf5, 0x7d, 0x7b, 0x3c,
+ 0x8a, 0x93, 0xc2, 0x3d, 0x11, 0xbf, 0xbf, 0xbd, 0x8f, 0x52, 0xae, 0xbd,
+ 0x38, 0x3f, 0xda, 0x3d, 0xba, 0xcb, 0x89, 0x3d, 0xdf, 0xe8, 0x11, 0x3e,
+ 0xdf, 0x56, 0x93, 0xbd, 0xdf, 0xee, 0x8d, 0x3d, 0x0a, 0x9e, 0x6d, 0xbd,
+ 0x3d, 0x21, 0xae, 0x3d, 0xf6, 0xd0, 0xb3, 0xbd, 0xf1, 0x79, 0x74, 0xbd,
+ 0x01, 0x9b, 0x24, 0xbd, 0x5f, 0xdb, 0x34, 0x3e, 0xea, 0x2f, 0xe5, 0xbd,
+ 0x15, 0x3c, 0xc7, 0x3c, 0xe7, 0x00, 0x06, 0x3e, 0x3b, 0x3d, 0x2f, 0x3c,
+ 0x16, 0x0d, 0xf8, 0xbc, 0xa8, 0x8a, 0x09, 0x3d, 0xf3, 0x6c, 0x56, 0x3d,
+ 0x21, 0x54, 0xcf, 0x3c, 0xc8, 0xb1, 0x32, 0x3e, 0x27, 0x2c, 0x00, 0x3e,
+ 0x35, 0x8b, 0xe3, 0x3c, 0x16, 0xdf, 0xa3, 0xbd, 0x50, 0x70, 0x4a, 0xbe,
+ 0x7c, 0xaf, 0xd5, 0xbc, 0x31, 0xf3, 0xd1, 0x3d, 0x38, 0x99, 0x2a, 0x3d,
+ 0xbd, 0xbc, 0x31, 0xbe, 0x21, 0xb6, 0xce, 0x3d, 0x41, 0xdd, 0x07, 0x3e,
+ 0xf5, 0xd0, 0xfa, 0x3d, 0x0c, 0x3a, 0x67, 0xbd, 0x9e, 0x85, 0x86, 0xbd,
+ 0x0e, 0xc5, 0x44, 0x3d, 0x7d, 0xd1, 0x11, 0x3e, 0xde, 0xb8, 0x16, 0xbe,
+ 0xec, 0xfb, 0x11, 0x3d, 0x48, 0x96, 0xfc, 0x3d, 0x68, 0xc9, 0x15, 0x3e,
+ 0xb6, 0x4b, 0x84, 0x3c, 0x5a, 0x1f, 0xcd, 0xbc, 0x51, 0x3e, 0xf6, 0xbc,
+ 0x96, 0x2a, 0x97, 0x3d, 0x7b, 0xcb, 0xd4, 0xbd, 0xe7, 0x63, 0x13, 0xbd,
+ 0xaa, 0xa6, 0x95, 0xbd, 0xeb, 0xdb, 0x3f, 0xbd, 0xe8, 0x40, 0xdd, 0xbd,
+ 0xb1, 0x88, 0x84, 0x3c, 0x02, 0x05, 0xdf, 0x3d, 0xbc, 0x79, 0x30, 0x3d,
+ 0x64, 0xbb, 0xd7, 0xbd, 0xa8, 0x44, 0xdd, 0xbd, 0xd5, 0xff, 0xb0, 0x3c,
+ 0xf4, 0x26, 0x51, 0xbd, 0x50, 0xcc, 0xc8, 0xbd, 0xce, 0xfb, 0x9b, 0x3c,
+ 0x3a, 0x99, 0xef, 0xbd, 0x28, 0xe6, 0x13, 0xbd, 0x5e, 0xdd, 0x6c, 0x3c,
+ 0xf6, 0x72, 0x7c, 0xbe, 0x7d, 0xa6, 0xbc, 0xbe, 0x9a, 0x34, 0x14, 0xbe,
+ 0x03, 0xe3, 0xdb, 0x3e, 0x91, 0xba, 0x51, 0x3c, 0xe8, 0xa4, 0x51, 0x3e,
+ 0x65, 0x34, 0x61, 0xbe, 0xe4, 0x6e, 0xf7, 0x3c, 0xa4, 0x2f, 0x3e, 0x3c,
+ 0x6b, 0x8f, 0xc3, 0xbd, 0x9f, 0xbc, 0xa0, 0xbd, 0x87, 0xaf, 0xf8, 0x3d,
+ 0xfa, 0x0c, 0x49, 0x3e, 0x40, 0xbd, 0xf7, 0x3c, 0xf0, 0xb4, 0x31, 0xbe,
+ 0xa0, 0x5d, 0x30, 0x3e, 0x98, 0x02, 0x60, 0x3e, 0x64, 0x35, 0x2f, 0xbd,
+ 0x9e, 0xd1, 0xcd, 0x3c, 0x1b, 0xd2, 0x29, 0x3e, 0x58, 0xac, 0xac, 0xbd,
+ 0x70, 0x88, 0xf0, 0x3b, 0x10, 0x61, 0xef, 0x3c, 0x0c, 0x58, 0xb4, 0x3d,
+ 0xc7, 0xfb, 0xcc, 0xbc, 0x9d, 0x73, 0x92, 0x3e, 0x62, 0x08, 0x69, 0x3e,
+ 0x19, 0x4a, 0x59, 0x3d, 0x48, 0xc2, 0xa1, 0xbc, 0x3f, 0xbb, 0x30, 0xbd,
+ 0x5f, 0x40, 0x93, 0x3e, 0x2c, 0xe2, 0x57, 0xbe, 0x97, 0xa7, 0x8e, 0xbd,
+ 0xd6, 0x26, 0xbf, 0x3d, 0x52, 0xa8, 0x53, 0xbe, 0x66, 0xb4, 0x65, 0x3d,
+ 0xdc, 0x6e, 0x58, 0xbd, 0x64, 0x94, 0xc4, 0x3e, 0xd4, 0x3a, 0x9d, 0x3e,
+ 0x2d, 0x7a, 0xae, 0x3e, 0xce, 0xec, 0xe0, 0xbd, 0x0a, 0x2f, 0x3d, 0xbe,
+ 0x5a, 0x94, 0x77, 0xbd, 0xb4, 0xed, 0x29, 0x3d, 0xf5, 0xb1, 0x44, 0x3c,
+ 0xeb, 0x3b, 0x4e, 0x3d, 0x04, 0x23, 0xd2, 0x3d, 0xd3, 0x27, 0x9a, 0xbd,
+ 0xe8, 0xd0, 0x88, 0xbe, 0x67, 0x8f, 0xb9, 0x3d, 0xb6, 0xdc, 0x0d, 0x3d,
+ 0xb3, 0xaa, 0x26, 0x3e, 0x7a, 0xbf, 0x63, 0x3d, 0xe8, 0x64, 0x34, 0xbe,
+ 0x31, 0xcc, 0x87, 0x3d, 0x97, 0xa5, 0x33, 0x3e, 0xbb, 0xa4, 0x4b, 0xbd,
+ 0x9c, 0x7c, 0x67, 0xbd, 0x8d, 0xf6, 0x32, 0xbe, 0x2e, 0x73, 0xa5, 0x3e,
+ 0xf5, 0xb5, 0x0b, 0xbe, 0x4e, 0x61, 0x93, 0x3c, 0x68, 0x92, 0xad, 0x3d,
+ 0xb0, 0x11, 0xc9, 0xbd, 0x75, 0x13, 0x71, 0xbd, 0x97, 0xc5, 0xc8, 0xbd,
+ 0x59, 0x0e, 0x24, 0xbe, 0xa7, 0x06, 0xe9, 0x3c, 0xbd, 0x1c, 0x31, 0xbe,
+ 0x56, 0xba, 0xb9, 0x3e, 0x45, 0x45, 0x35, 0xbd, 0x64, 0x9f, 0x22, 0xbe,
+ 0x37, 0x55, 0x23, 0xbe, 0xa7, 0xf1, 0xcc, 0xbd, 0x67, 0xbf, 0xb8, 0xbe,
+ 0x67, 0xf9, 0x78, 0xbe, 0x1a, 0x37, 0xc5, 0xbd, 0xa6, 0x78, 0x86, 0x3e,
+ 0x26, 0x79, 0xa7, 0xbe, 0x67, 0xa0, 0x14, 0x3d, 0x8e, 0xac, 0xed, 0x3d,
+ 0xd8, 0x58, 0xac, 0xbd, 0x46, 0x90, 0x9f, 0xbc, 0xdf, 0x97, 0x80, 0x3e,
+ 0xf5, 0x63, 0x24, 0xbe, 0x23, 0x28, 0xa7, 0x3d, 0xeb, 0xb1, 0x83, 0x3e,
+ 0xac, 0xa5, 0xfc, 0x3d, 0xfb, 0x66, 0x51, 0xbb, 0xa3, 0x9a, 0xa1, 0x3e,
+ 0xaf, 0x7f, 0xf0, 0x3d, 0x72, 0x28, 0xb8, 0xbe, 0xee, 0x52, 0x00, 0xbe,
+ 0x22, 0x1d, 0x01, 0xbe, 0xc1, 0xf8, 0xab, 0xbc, 0x94, 0x12, 0xe6, 0xbd,
+ 0xdd, 0x89, 0xd7, 0x3c, 0x33, 0x8b, 0xe6, 0x3d, 0x7f, 0xd9, 0x18, 0xbe,
+ 0xb1, 0xf3, 0xff, 0x3d, 0x32, 0xad, 0x90, 0xbd, 0xa7, 0x0b, 0x52, 0x3e,
+ 0xb4, 0xa4, 0xf5, 0x3c, 0x79, 0x39, 0x13, 0x3d, 0x28, 0x0c, 0x4f, 0x3e,
+ 0x24, 0xce, 0x08, 0x3a, 0xb1, 0x73, 0x46, 0x3e, 0x66, 0xbe, 0xe8, 0x3c,
+ 0xb6, 0x92, 0x36, 0xbe, 0xa4, 0x36, 0x87, 0xbd, 0x82, 0xca, 0x2f, 0xbe,
+ 0x08, 0x64, 0xd3, 0xbd, 0x9b, 0xdc, 0x6d, 0xbe, 0xba, 0x39, 0x9e, 0x3e,
+ 0x1c, 0xe2, 0xb9, 0x3d, 0x1b, 0xcc, 0x6f, 0x3a, 0x00, 0xa4, 0x9f, 0xbd,
+ 0xe1, 0xb7, 0x9e, 0x3d, 0x3d, 0x4b, 0x1e, 0xbd, 0xa7, 0x93, 0x8e, 0x3b,
+ 0xdf, 0x52, 0xf8, 0xbd, 0xc3, 0xcf, 0x36, 0xbd, 0xe9, 0x2f, 0xee, 0xbd,
+ 0xbb, 0x8c, 0x44, 0xba, 0x51, 0xd4, 0x51, 0xbd, 0x5b, 0x4f, 0x34, 0x3e,
+ 0x93, 0x6a, 0x0e, 0xbd, 0x3f, 0xb0, 0x22, 0x3d, 0x13, 0xa2, 0xa8, 0x3d,
+ 0x68, 0xa8, 0x7e, 0xbd, 0x10, 0xb8, 0xe2, 0xbc, 0x53, 0x56, 0xe9, 0x3d,
+ 0xa0, 0x90, 0xb6, 0x3c, 0xda, 0xb8, 0x19, 0xbd, 0x38, 0x3d, 0x8d, 0xbe,
+ 0x16, 0xdd, 0x3e, 0x3d, 0x8d, 0xac, 0xfc, 0x3d, 0x5c, 0x36, 0xe3, 0xbd,
+ 0xb4, 0x8d, 0xbf, 0x3d, 0xd5, 0x17, 0xa5, 0xbc, 0x07, 0x85, 0xba, 0xbb,
+ 0x0b, 0x7b, 0xc8, 0xbd, 0x53, 0x0f, 0xd3, 0xbd, 0xc7, 0xc5, 0x93, 0xbd,
+ 0x84, 0x65, 0xaa, 0x3d, 0x62, 0x39, 0x5e, 0x3c, 0x2e, 0xa0, 0xec, 0xbd,
+ 0x60, 0x1e, 0xa4, 0xbd, 0x4a, 0x21, 0x17, 0xbd, 0x92, 0xb5, 0x68, 0xbd,
+ 0x5e, 0xf5, 0xfd, 0x3d, 0x1c, 0xf5, 0x1a, 0xbd, 0xc2, 0x32, 0x00, 0xbe,
+ 0xc2, 0x57, 0x8b, 0xba, 0x04, 0xad, 0x2a, 0x3d, 0xd6, 0xd1, 0x87, 0xbd,
+ 0xb3, 0xf0, 0x4c, 0xbd, 0xcf, 0x80, 0xa4, 0xbc, 0x83, 0x71, 0x03, 0xbe,
+ 0x1e, 0x02, 0x3a, 0x3d, 0xbf, 0xde, 0x55, 0xbd, 0x3e, 0x5e, 0x3a, 0xbe,
+ 0x98, 0x17, 0x42, 0xbc, 0x92, 0x57, 0x9f, 0xbd, 0xa2, 0x0c, 0x8b, 0x3d,
+ 0x59, 0x87, 0x56, 0x3d, 0x1b, 0x5c, 0xd9, 0x3d, 0x24, 0xbe, 0x39, 0xbd,
+ 0x70, 0x20, 0xd4, 0x3d, 0xde, 0x0e, 0xb9, 0x3d, 0x80, 0x5b, 0xcb, 0x3c,
+ 0x87, 0x72, 0x93, 0x3c, 0x5a, 0xe9, 0x2c, 0xbc, 0x3e, 0x98, 0x18, 0xbe,
+ 0xd3, 0x0c, 0x26, 0x3d, 0xc6, 0xb7, 0x8d, 0xbb, 0x4f, 0xad, 0x82, 0x3c,
+ 0xbb, 0x48, 0x5f, 0xbd, 0x79, 0x0b, 0xc6, 0xbd, 0x08, 0xa5, 0xdc, 0xbd,
+ 0x7c, 0xe9, 0xba, 0xbd, 0x5f, 0x29, 0x6b, 0x3d, 0xd5, 0x72, 0x11, 0xbc,
+ 0x15, 0x62, 0xec, 0x3d, 0x5c, 0xff, 0x73, 0xbd, 0x0e, 0x34, 0x87, 0xbc,
+ 0x76, 0x37, 0x4f, 0x3d, 0xf6, 0x3b, 0x5c, 0xb8, 0x68, 0x5a, 0x21, 0x3d,
+ 0x02, 0x87, 0x8c, 0xbb, 0x69, 0xbc, 0x2d, 0x3c, 0x36, 0xa9, 0xd7, 0x3d,
+ 0xfe, 0xf9, 0xd8, 0x3d, 0x40, 0x88, 0x21, 0x3d, 0x6b, 0xba, 0xe6, 0xbb,
+ 0x53, 0x88, 0x0d, 0xbc, 0xd8, 0x24, 0x69, 0xbc, 0xf9, 0xed, 0xdb, 0xbb,
+ 0xee, 0x6f, 0xda, 0xbd, 0xb1, 0x5c, 0x56, 0x3d, 0x02, 0x3d, 0xc2, 0x3d,
+ 0xbd, 0xc6, 0x9b, 0xbd, 0x9c, 0xce, 0x1d, 0x3e, 0x34, 0x14, 0x49, 0x3d,
+ 0xe3, 0xcb, 0x01, 0x3e, 0x51, 0x5b, 0x7a, 0xbd, 0xe1, 0xee, 0xbd, 0xbc,
+ 0x0b, 0x55, 0x4c, 0xbd, 0x7b, 0x74, 0xf1, 0x3d, 0x2a, 0x29, 0x01, 0x3e,
+ 0x6c, 0xf5, 0x0a, 0x3e, 0x34, 0xdd, 0x6b, 0xbd, 0x9d, 0x23, 0x19, 0x3e,
+ 0x15, 0xb1, 0x2f, 0xbb, 0x53, 0xbc, 0xf6, 0x3c, 0x9d, 0xf4, 0x1d, 0xbe,
+ 0x1c, 0x5c, 0x44, 0x3c, 0x54, 0xca, 0x0f, 0x3c, 0xe6, 0xd9, 0xaa, 0xbd,
+ 0x9a, 0xf9, 0x82, 0xbd, 0xf9, 0x64, 0x4a, 0xbc, 0xb6, 0x63, 0xcc, 0x3d,
+ 0xf2, 0x49, 0x01, 0x3e, 0xaf, 0x5b, 0x9b, 0xbc, 0x62, 0x99, 0xa2, 0xbc,
+ 0xf0, 0xb3, 0xd2, 0xbb, 0xf9, 0x6c, 0x2b, 0xbe, 0x03, 0x5a, 0x9f, 0xbd,
+ 0x26, 0x33, 0x41, 0xbd, 0xed, 0x40, 0x39, 0x3d, 0x10, 0x83, 0xf9, 0x3d,
+ 0x3c, 0x0f, 0x79, 0xbd, 0xc7, 0x13, 0x26, 0xbe, 0x76, 0xb8, 0xf0, 0xbb,
+ 0x1c, 0x05, 0x30, 0xbd, 0xd4, 0x32, 0xfc, 0xbb, 0xc6, 0x42, 0x7c, 0xbd,
+ 0x48, 0xc8, 0x99, 0xbd, 0xd3, 0xec, 0x17, 0xbd, 0x3e, 0xf3, 0x8f, 0xbd,
+ 0xb2, 0xda, 0x9d, 0x3d, 0xed, 0xe8, 0xeb, 0xbd, 0x65, 0x2a, 0x7b, 0x3c,
+ 0x40, 0x13, 0xe2, 0xbc, 0x42, 0xbc, 0x02, 0x3d, 0x96, 0xf3, 0xf1, 0xbd,
+ 0xbe, 0x18, 0xa7, 0xbd, 0x29, 0x81, 0x03, 0x3e, 0x7e, 0xa3, 0xaf, 0xbc,
+ 0x54, 0x0b, 0x61, 0xbe, 0x72, 0x5c, 0x17, 0x3e, 0x16, 0xb2, 0x51, 0xbe,
+ 0x37, 0x81, 0xbc, 0xbc, 0x5f, 0x4d, 0xb6, 0xbc, 0xda, 0xeb, 0x36, 0xbd,
+ 0x47, 0xb1, 0xcc, 0xbc, 0x4c, 0xd1, 0xc4, 0xbd, 0xef, 0xc4, 0x57, 0xbb,
+ 0x08, 0x1a, 0x7a, 0x3d, 0xdc, 0xf7, 0x3e, 0xbc, 0xe4, 0x4d, 0x23, 0xbe,
+ 0x08, 0x14, 0xe4, 0xbd, 0xa3, 0xde, 0xc9, 0xbd, 0xe6, 0x6d, 0xce, 0x3d,
+ 0xf1, 0x1d, 0x75, 0xbe, 0x77, 0xaf, 0x45, 0xbe, 0xbc, 0xc6, 0xb1, 0x3b,
+ 0xaf, 0xf1, 0x8b, 0x3c, 0x11, 0x53, 0x31, 0x3d, 0xe1, 0x82, 0x96, 0x3d,
+ 0x5e, 0x5c, 0x8e, 0x3d, 0xb1, 0xfd, 0xa2, 0xbd, 0xd7, 0x10, 0x7d, 0xbe,
+ 0x1e, 0x93, 0x48, 0x3b, 0xc9, 0xb6, 0x1e, 0xbe, 0xff, 0x5e, 0x73, 0x3d,
+ 0xf1, 0xdc, 0xa4, 0x3c, 0xa7, 0x27, 0xb7, 0xbd, 0x69, 0x7a, 0x29, 0xbc,
+ 0x33, 0xf4, 0x73, 0xbe, 0x2f, 0x89, 0xf8, 0xbc, 0xba, 0x1e, 0x43, 0xbe,
+ 0x17, 0x94, 0x9f, 0x3d, 0x95, 0xb2, 0xda, 0x3d, 0xc0, 0xdf, 0x08, 0x3e,
+ 0xc8, 0x54, 0x39, 0xbe, 0x7e, 0x7c, 0xaf, 0xbd, 0xed, 0x9b, 0xfc, 0xbd,
+ 0xd4, 0x60, 0xbb, 0x3d, 0x70, 0xfe, 0x04, 0xbe, 0x13, 0x73, 0xab, 0x3d,
+ 0x31, 0xb5, 0x5e, 0xbe, 0xef, 0x58, 0x09, 0xbd, 0x91, 0xa1, 0x13, 0xbe,
+ 0xc3, 0xc5, 0x8f, 0x3e, 0xf2, 0xa7, 0xd9, 0xbd, 0x6c, 0x4e, 0x4b, 0x3d,
+ 0xc4, 0x31, 0xef, 0x3d, 0xfd, 0x26, 0x7e, 0xbe, 0xe4, 0x53, 0x9e, 0xbd,
+ 0x80, 0x55, 0x08, 0x3e, 0xce, 0x04, 0xe2, 0x3d, 0x25, 0x92, 0xc5, 0x3d,
+ 0xaa, 0x57, 0x4a, 0xbe, 0x65, 0xac, 0xae, 0xbd, 0xfb, 0x50, 0xf6, 0x3c,
+ 0x98, 0xd1, 0x41, 0xbe, 0x7a, 0xbc, 0x16, 0xbb, 0x1c, 0xba, 0x8b, 0x3d,
+ 0xed, 0x55, 0x25, 0xbd, 0x1c, 0xcd, 0x0a, 0x3e, 0x39, 0x5e, 0xae, 0x3c,
+ 0x54, 0xf2, 0x39, 0x3e, 0xef, 0xa1, 0x3e, 0xbd, 0x5e, 0x50, 0x1a, 0xbe,
+ 0x86, 0x35, 0x24, 0x3c, 0x8b, 0x46, 0xa2, 0xbd, 0xb0, 0xf6, 0xa7, 0xbd,
+ 0xdf, 0x7d, 0x0a, 0xbe, 0x71, 0x5b, 0xa8, 0x3d, 0x4c, 0x5a, 0x1c, 0x3d,
+ 0x61, 0x02, 0x3e, 0xbe, 0x05, 0xfc, 0x76, 0x3c, 0x89, 0x2c, 0x4d, 0xbd,
+ 0x7f, 0xd0, 0x2b, 0x3e, 0x97, 0xe1, 0xa3, 0x3b, 0x47, 0x20, 0x20, 0x3e,
+ 0xff, 0x9e, 0xf0, 0x3d, 0x73, 0xf4, 0xb4, 0x3d, 0xea, 0x75, 0xd3, 0x3d,
+ 0xc2, 0xc6, 0x3c, 0x3e, 0x91, 0x1b, 0x03, 0xbe, 0x38, 0x3c, 0xf8, 0xbd,
+ 0xf4, 0xee, 0x15, 0x3e, 0x0b, 0xaa, 0x80, 0xbd, 0xf3, 0x53, 0xef, 0xbd,
+ 0xb1, 0xc1, 0x04, 0x3e, 0x99, 0xaa, 0xfa, 0x3d, 0x43, 0x75, 0x7d, 0xbe,
+ 0x8c, 0x51, 0xfc, 0xbd, 0x7c, 0x47, 0x15, 0xbe, 0x66, 0xf8, 0x42, 0xbe,
+ 0x8a, 0x65, 0xa6, 0xbd, 0xcc, 0x8d, 0x31, 0x3e, 0x1e, 0x1f, 0xb4, 0x3d,
+ 0x57, 0x12, 0xd4, 0x3d, 0x17, 0xdf, 0xcd, 0x3d, 0x1b, 0xb2, 0x2a, 0xbe,
+ 0x43, 0x40, 0x76, 0x3d, 0x40, 0x47, 0x45, 0xbe, 0x6f, 0x01, 0xc5, 0xbd,
+ 0xe8, 0x27, 0x79, 0x3d, 0x63, 0x2e, 0x33, 0x3d, 0xe8, 0xef, 0x03, 0xbe,
+ 0xf4, 0xdf, 0x72, 0xbd, 0xb1, 0x20, 0x1e, 0x3d, 0x84, 0xcb, 0x1c, 0xbe,
+ 0x3d, 0x36, 0xf3, 0xbb, 0xc5, 0x09, 0x44, 0xbe, 0x38, 0x8a, 0xaf, 0xbd,
+ 0xd0, 0xf6, 0x8e, 0xbd, 0x64, 0x95, 0x31, 0xbe, 0x27, 0xae, 0xe5, 0xbd,
+ 0x1a, 0x41, 0xf6, 0xbd, 0x67, 0x17, 0x65, 0xbd, 0x6e, 0xd1, 0x3b, 0xbd,
+ 0x3f, 0x8c, 0x02, 0xbd, 0xbd, 0xb0, 0x52, 0xbd, 0xca, 0xb9, 0x72, 0xbe,
+ 0x39, 0x10, 0xf0, 0x3d, 0x83, 0x12, 0xd3, 0x3a, 0xde, 0x42, 0x15, 0x3b,
+ 0x22, 0xc6, 0xd1, 0x3d, 0x44, 0x29, 0x8f, 0x3d, 0x01, 0x40, 0x8c, 0xbd,
+ 0x52, 0x8c, 0x46, 0xbd, 0xe9, 0x69, 0x5a, 0x3c, 0x9f, 0xba, 0xa1, 0x3b,
+ 0x77, 0xbe, 0x6e, 0xbe, 0x11, 0x0a, 0x0f, 0x3d, 0x0c, 0x6f, 0x28, 0xbd,
+ 0xc2, 0x7f, 0x91, 0xbc, 0xf3, 0xbf, 0xa5, 0x3c, 0xa4, 0x08, 0x96, 0x3d,
+ 0x7c, 0xb0, 0x8f, 0x3b, 0xbb, 0xbe, 0x21, 0x3e, 0x9d, 0x83, 0x97, 0x3d,
+ 0xe4, 0xeb, 0xd6, 0x3d, 0xc6, 0x3b, 0x8e, 0x3d, 0x30, 0xc3, 0x3e, 0x3e,
+ 0xac, 0x40, 0x73, 0x3d, 0x54, 0xbc, 0x0b, 0xbe, 0x25, 0xeb, 0x0f, 0xbe,
+ 0xfb, 0x4d, 0xcd, 0xbd, 0x52, 0xfd, 0x34, 0x3d, 0xab, 0xe3, 0xc5, 0xbd,
+ 0x49, 0xdc, 0x3a, 0xbd, 0x24, 0xb9, 0x74, 0x3c, 0x87, 0xf6, 0xc1, 0x3c,
+ 0x74, 0x03, 0x74, 0xbd, 0x03, 0x1f, 0x0c, 0xbe, 0x76, 0x36, 0xa4, 0xbc,
+ 0x71, 0x64, 0x52, 0xbc, 0xb9, 0x99, 0x27, 0xbc, 0xe3, 0x2c, 0x53, 0xbd,
+ 0x28, 0x25, 0xa6, 0xbd, 0x77, 0x24, 0xd0, 0x3d, 0x55, 0x81, 0x0f, 0x3d,
+ 0x24, 0x83, 0x25, 0x3c, 0x61, 0xa7, 0x8c, 0xbd, 0xac, 0x7b, 0x9d, 0x3d,
+ 0x70, 0x50, 0x6b, 0xbd, 0x23, 0x73, 0x0c, 0xbd, 0x09, 0xa3, 0x3f, 0x3d,
+ 0xe9, 0x47, 0x8a, 0x3d, 0x4a, 0x7f, 0xfa, 0xbd, 0x19, 0xec, 0x5e, 0x3d,
+ 0x09, 0xe4, 0xd0, 0x3d, 0x6a, 0xfb, 0xc0, 0x3d, 0x57, 0xf2, 0x76, 0x3d,
+ 0x73, 0x02, 0xc7, 0xbd, 0xf0, 0x9b, 0xa9, 0x3d, 0x7b, 0x72, 0x48, 0xbd,
+ 0x6a, 0x54, 0x52, 0xbe, 0xbb, 0x3d, 0x87, 0xbd, 0xc9, 0x79, 0x86, 0xbd,
+ 0xe3, 0x5f, 0x49, 0x3d, 0x12, 0xad, 0x93, 0x3d, 0x6c, 0x21, 0x23, 0x3e,
+ 0xf5, 0x2f, 0x07, 0x3e, 0x80, 0xb2, 0x35, 0x3d, 0x56, 0x8b, 0x1c, 0x3d,
+ 0x17, 0xbf, 0x06, 0xbe, 0x15, 0x81, 0x1f, 0x3e, 0xc4, 0x67, 0x2f, 0x3d,
+ 0x2e, 0x0c, 0x21, 0x3d, 0x52, 0xfa, 0x97, 0xbb, 0x91, 0x7a, 0x11, 0x3e,
+ 0xfe, 0x24, 0x93, 0x3d, 0x27, 0x01, 0xf6, 0xbd, 0x5b, 0x0a, 0xe8, 0xbd,
+ 0x8d, 0x26, 0xd2, 0xbc, 0x80, 0x77, 0x94, 0x3d, 0xd9, 0x43, 0xbe, 0xbb,
+ 0xfd, 0x4d, 0x34, 0xbd, 0x0e, 0xf0, 0x4d, 0x3d, 0x52, 0x3f, 0x94, 0xbc,
+ 0x50, 0x38, 0x2c, 0x3c, 0x4e, 0x3d, 0x60, 0xbb, 0xac, 0xb5, 0xbb, 0x3d,
+ 0xfc, 0xd0, 0x2c, 0xbd, 0x6d, 0xae, 0x5b, 0xbd, 0xf1, 0x23, 0xa3, 0xbd,
+ 0xe3, 0x7c, 0x8e, 0xbd, 0x8c, 0xf7, 0xe2, 0x3d, 0xa3, 0x8c, 0x92, 0x3c,
+ 0xc1, 0xb5, 0x68, 0xbd, 0xc0, 0x1b, 0x9f, 0x3d, 0x28, 0xa4, 0x9f, 0x3c,
+ 0x6f, 0x52, 0x8b, 0x3d, 0xda, 0xd9, 0x24, 0x3d, 0xfa, 0x51, 0x01, 0x3e,
+ 0xc1, 0x0f, 0xc9, 0x3d, 0xa6, 0xfa, 0x43, 0x3d, 0x4f, 0x4a, 0xfe, 0xbc,
+ 0xca, 0x79, 0xf7, 0x3d, 0x15, 0x8b, 0x76, 0x3d, 0x75, 0x2a, 0xe8, 0x3d,
+ 0xb7, 0x9f, 0xfa, 0xbd, 0xe9, 0x8a, 0xe0, 0xbd, 0xb4, 0x25, 0x6a, 0xbd,
+ 0xbd, 0x0a, 0xa6, 0x3d, 0x45, 0xea, 0x3a, 0xbd, 0xbc, 0x3f, 0x4e, 0xbe,
+ 0xe0, 0x37, 0x8a, 0x3d, 0x43, 0xe3, 0x18, 0xbe, 0x26, 0x7e, 0x52, 0x3b,
+ 0xd8, 0x45, 0x83, 0xbd, 0xc4, 0xf4, 0x35, 0xbe, 0xd1, 0x12, 0x8b, 0xbd,
+ 0x36, 0xa0, 0x53, 0xbe, 0xb2, 0xfb, 0x0b, 0xbe, 0x36, 0xce, 0x2c, 0xbe,
+ 0xc8, 0x55, 0x1d, 0x3c, 0x85, 0xb6, 0xe2, 0x3c, 0x12, 0xe0, 0x11, 0xbe,
+ 0x3b, 0xaa, 0xe0, 0x3d, 0x67, 0x1b, 0x34, 0x3d, 0x1f, 0x5c, 0xf3, 0xbc,
+ 0xca, 0xf1, 0x8e, 0x3d, 0xa4, 0xae, 0x37, 0x3d, 0xf1, 0x5a, 0xfe, 0x3d,
+ 0xe3, 0xb8, 0x0d, 0x3e, 0x01, 0xc0, 0x15, 0xbe, 0x4b, 0x51, 0x48, 0xbe,
+ 0x87, 0x36, 0x63, 0xbe, 0xc2, 0xcc, 0x27, 0xbe, 0x9b, 0x3c, 0xd9, 0xbd,
+ 0x7f, 0x47, 0x38, 0xbd, 0xe5, 0x8a, 0xf5, 0xbb, 0x23, 0x71, 0x4b, 0x3c,
+ 0xca, 0x3a, 0x73, 0x3c, 0xa3, 0x85, 0x49, 0xbd, 0xc9, 0x19, 0xe7, 0x3b,
+ 0x26, 0x7b, 0xac, 0x3d, 0x0d, 0x7a, 0x29, 0xbd, 0x40, 0xbe, 0x25, 0x3e,
+ 0xb7, 0x74, 0x0c, 0xbe, 0x62, 0xe7, 0x1b, 0xbe, 0x90, 0x71, 0xe5, 0x3d,
+ 0x01, 0x86, 0x7d, 0xbd, 0xb0, 0x2c, 0xb1, 0x3d, 0x09, 0xd9, 0x8f, 0xbd,
+ 0x2e, 0x68, 0x0a, 0x3e, 0x33, 0xa8, 0x19, 0xbd, 0xc4, 0xcd, 0x29, 0x3d,
+ 0x08, 0x3a, 0x86, 0xbd, 0xc3, 0xe1, 0x11, 0xbe, 0x53, 0xbb, 0x52, 0x3d,
+ 0x7a, 0xbf, 0xa3, 0x3d, 0x5e, 0xe3, 0x1b, 0xbd, 0xbe, 0x65, 0xe6, 0xbc,
+ 0xd0, 0xa1, 0x99, 0xbd, 0x73, 0xed, 0x25, 0x3d, 0xb7, 0xd9, 0x2e, 0x3d,
+ 0x32, 0x45, 0xa6, 0xbd, 0x01, 0xb9, 0x1f, 0xbe, 0x64, 0x27, 0xe8, 0x3d,
+ 0xad, 0x88, 0xbe, 0xbc, 0x7b, 0x16, 0x2c, 0x3c, 0x8c, 0x4e, 0x7d, 0xbc,
+ 0xc7, 0x64, 0x98, 0x3d, 0x26, 0x08, 0xbf, 0xbd, 0x3d, 0x7f, 0x24, 0xbe,
+ 0xce, 0xd5, 0x6f, 0x3d, 0x4a, 0x2e, 0xc8, 0x3d, 0xcd, 0x4f, 0xf3, 0xbc,
+ 0xd3, 0x00, 0x0a, 0x3d, 0xc1, 0x80, 0x25, 0x3d, 0xdd, 0xfd, 0xfb, 0x3d,
+ 0xf6, 0x47, 0x0e, 0xbe, 0x76, 0xe9, 0x52, 0xbd, 0x1d, 0x82, 0x32, 0xbd,
+ 0xab, 0x0b, 0xde, 0xbd, 0xde, 0x8b, 0x37, 0xbd, 0x0e, 0xdd, 0xa4, 0xbc,
+ 0xca, 0xba, 0xca, 0x3d, 0x62, 0x5e, 0xc7, 0xbd, 0x64, 0x1e, 0x6f, 0x3d,
+ 0x4f, 0x57, 0x89, 0x3d, 0xc3, 0x4a, 0xca, 0x3d, 0x80, 0x4d, 0x9e, 0x3d,
+ 0xf0, 0x67, 0x41, 0xbd, 0x54, 0x0d, 0xbf, 0xbd, 0xe9, 0xd8, 0x4a, 0x3e,
+ 0x51, 0x05, 0x0a, 0x3e, 0xe3, 0x1d, 0xe7, 0x3b, 0x9b, 0x88, 0xf5, 0xbd,
+ 0xc7, 0x5a, 0x0c, 0xbe, 0x4f, 0x7f, 0x77, 0x3d, 0x04, 0xc2, 0xd0, 0xbd,
+ 0x48, 0x34, 0x69, 0xbc, 0xd4, 0xc0, 0x16, 0xbe, 0xfc, 0x4b, 0xc9, 0xbd,
+ 0x4e, 0xff, 0x21, 0x3d, 0xeb, 0x48, 0x90, 0x3d, 0x64, 0xa2, 0x8c, 0xbd,
+ 0xb4, 0x42, 0xd9, 0xbd, 0x45, 0xb5, 0x8f, 0x3d, 0xda, 0x64, 0x07, 0xbe,
+ 0xd0, 0xfd, 0x72, 0xbc, 0x43, 0x1e, 0x17, 0x3e, 0x87, 0x53, 0x8a, 0xbd,
+ 0xe0, 0xdc, 0xb5, 0xbd, 0xd0, 0xf3, 0x24, 0xbd, 0x21, 0x91, 0x36, 0xbb,
+ 0xfd, 0x04, 0xa4, 0x3d, 0x49, 0x3b, 0xa7, 0x3d, 0x2d, 0xdb, 0x64, 0xbd,
+ 0x2c, 0x80, 0x17, 0x3e, 0x00, 0xcb, 0x72, 0x3d, 0x57, 0xe8, 0x23, 0xbe,
+ 0xa8, 0x44, 0xc0, 0xbb, 0x25, 0x60, 0x06, 0xbe, 0x8c, 0x0b, 0x25, 0xbd,
+ 0x60, 0xae, 0x93, 0xbe, 0x88, 0xef, 0x45, 0xbe, 0xeb, 0xf1, 0x52, 0x3d,
+ 0x89, 0x88, 0xab, 0x3d, 0x30, 0xf5, 0xd6, 0x3d, 0xc7, 0x5b, 0xb9, 0x3d,
+ 0x2c, 0x28, 0xa5, 0xbd, 0x43, 0xf9, 0xea, 0x3c, 0x20, 0x78, 0x04, 0xbe,
+ 0x98, 0x57, 0x70, 0x3b, 0xce, 0xad, 0x07, 0xbe, 0xaf, 0x5c, 0x0c, 0xbe,
+ 0x5e, 0xcd, 0x02, 0xbd, 0xe2, 0x24, 0xb4, 0x3d, 0x82, 0xca, 0x83, 0xbe,
+ 0xb0, 0xd3, 0x45, 0x3e, 0x33, 0xd0, 0x42, 0x3d, 0x82, 0xee, 0x0c, 0xbe,
+ 0x4d, 0xaf, 0xca, 0xbd, 0x20, 0xca, 0x9e, 0x3e, 0xda, 0xa5, 0x4e, 0x3d,
+ 0x37, 0x91, 0x35, 0x3d, 0xfb, 0xbd, 0xfd, 0xbb, 0x02, 0x8c, 0x4e, 0x3d,
+ 0x43, 0xda, 0xd7, 0x3d, 0x0c, 0x81, 0x71, 0x3e, 0xaa, 0x9b, 0x33, 0x3e,
+ 0xed, 0xc4, 0x04, 0x3d, 0x21, 0xab, 0xea, 0xbd, 0x54, 0xf7, 0x45, 0xbd,
+ 0x8e, 0xad, 0x65, 0x3e, 0x36, 0x2a, 0x89, 0xbe, 0xcf, 0x02, 0x71, 0x3d,
+ 0xb0, 0xbe, 0x00, 0xbe, 0x0d, 0x86, 0x59, 0xbe, 0x17, 0x8b, 0x7c, 0xbd,
+ 0x9a, 0x9b, 0x3e, 0x3e, 0x94, 0x17, 0x19, 0x3e, 0x62, 0x82, 0x3e, 0x3e,
+ 0x74, 0xfa, 0x0d, 0x3d, 0xf1, 0xb8, 0x4c, 0xbe, 0xf6, 0x30, 0x36, 0xbb,
+ 0x26, 0x4b, 0x9a, 0xbc, 0x58, 0xb3, 0x52, 0x3e, 0xbe, 0xe8, 0x00, 0x3e,
+ 0x27, 0x91, 0x18, 0x3e, 0x3a, 0x26, 0xb0, 0xbc, 0x29, 0x9d, 0xc6, 0xbd,
+ 0xff, 0x07, 0xf9, 0xbd, 0x34, 0x4f, 0x92, 0x3e, 0x2e, 0xf7, 0xa0, 0x3d,
+ 0x76, 0xb1, 0x4b, 0x3e, 0x89, 0x11, 0xa3, 0x3d, 0x10, 0x44, 0xcd, 0xbd,
+ 0xec, 0x34, 0x23, 0x3e, 0x05, 0x81, 0xbd, 0xbe, 0x89, 0x8c, 0x41, 0xbd,
+ 0x47, 0x29, 0x98, 0x3d, 0x03, 0xe8, 0x2d, 0x3d, 0x76, 0x96, 0x2b, 0x3e,
+ 0xc8, 0x1d, 0x14, 0x3d, 0x8b, 0xa4, 0xb1, 0xbd, 0x1a, 0x48, 0x0c, 0xbe,
+ 0xcb, 0x03, 0x17, 0xbd, 0xf6, 0xe0, 0xb5, 0xbb, 0x8a, 0xad, 0x0c, 0xbe,
+ 0x96, 0x84, 0x76, 0x3d, 0x49, 0x1a, 0x39, 0x3e, 0x98, 0xe6, 0xa4, 0xbe,
+ 0x20, 0x2f, 0x3a, 0x3e, 0x6b, 0x05, 0x82, 0xbd, 0xe6, 0x4c, 0x1f, 0xbe,
+ 0x26, 0xd1, 0xb4, 0xbd, 0xa6, 0x02, 0x73, 0xbb, 0x40, 0x6c, 0x6a, 0xbe,
+ 0xba, 0x20, 0xbb, 0xbd, 0x97, 0xd7, 0x03, 0xbe, 0xe2, 0x25, 0x97, 0xbd,
+ 0x96, 0x8a, 0x2c, 0xbe, 0x08, 0xf5, 0x08, 0xbd, 0xcd, 0xa0, 0x7c, 0xbc,
+ 0x5b, 0x85, 0x5b, 0x3d, 0x8d, 0xe4, 0xfe, 0x3e, 0xfa, 0x14, 0x8a, 0x3e,
+ 0x66, 0x8b, 0x3b, 0xbe, 0x16, 0x64, 0x0f, 0xbe, 0xbb, 0xe0, 0xd9, 0x3d,
+ 0x75, 0xf9, 0x5a, 0x3e, 0x2a, 0x1a, 0xe1, 0xbd, 0x11, 0x6d, 0x6d, 0x3e,
+ 0x19, 0x2b, 0x50, 0xbd, 0xe3, 0x8d, 0x41, 0xbe, 0xd1, 0xb7, 0x1a, 0xbe,
+ 0xeb, 0x8a, 0x9e, 0xbe, 0x4a, 0x0d, 0xc7, 0xbe, 0x0e, 0x94, 0x99, 0x3c,
+ 0x84, 0x31, 0x43, 0x3d, 0x9a, 0xa6, 0x67, 0xbe, 0xdf, 0x3f, 0x96, 0xbd,
+ 0x37, 0x62, 0xe5, 0xbd, 0x45, 0x35, 0x7e, 0xbd, 0x02, 0xe5, 0xdc, 0xbd,
+ 0x49, 0x10, 0x0e, 0xbd, 0xf0, 0x95, 0xa6, 0xbd, 0xca, 0xa9, 0xad, 0x3e,
+ 0x2c, 0x77, 0xe1, 0xbd, 0x31, 0x39, 0xf1, 0xbd, 0xbb, 0x27, 0x5c, 0xbd,
+ 0xc8, 0x8f, 0xbb, 0xbd, 0x70, 0x3d, 0xc0, 0xbd, 0x25, 0xb1, 0x6b, 0xbd,
+ 0xc1, 0xa1, 0x53, 0xbd, 0x93, 0x03, 0x15, 0xbe, 0x8d, 0x6d, 0x52, 0x3e,
+ 0xc0, 0x3f, 0x31, 0x3e, 0x2d, 0x49, 0xdb, 0xbc, 0xed, 0xc1, 0x1c, 0x3d,
+ 0x1b, 0x73, 0xb6, 0xbd, 0xd0, 0x9a, 0x53, 0x3d, 0x8b, 0xe4, 0xbf, 0xbc,
+ 0x6d, 0x13, 0x04, 0xbe, 0x2c, 0x6e, 0xdc, 0xbd, 0x13, 0xc7, 0x95, 0x3d,
+ 0xc1, 0xf2, 0xf7, 0xbd, 0xd5, 0x59, 0x90, 0x3d, 0x9a, 0x3a, 0xc7, 0x3d,
+ 0x59, 0xc8, 0xb1, 0x3d, 0x88, 0x3b, 0x17, 0xbd, 0x88, 0xa2, 0x8a, 0xba,
+ 0xb7, 0xdb, 0x22, 0xbc, 0xc9, 0xf1, 0x0a, 0xbe, 0xa2, 0x6f, 0x1f, 0x3d,
+ 0x38, 0x94, 0x1b, 0xbb, 0x40, 0xf7, 0x90, 0xbd, 0x21, 0xda, 0x64, 0xbe,
+ 0xdc, 0x8c, 0xa2, 0xbd, 0x8c, 0x2e, 0xc0, 0xbd, 0x97, 0xe9, 0x92, 0x3d,
+ 0x35, 0xb1, 0x1c, 0xbe, 0xad, 0x26, 0xda, 0xbd, 0xa2, 0x06, 0x07, 0x3d,
+ 0x50, 0x8a, 0x0b, 0x3e, 0xd1, 0xa4, 0x51, 0x3d, 0x9b, 0xa1, 0x3d, 0x3d,
+ 0x46, 0xdc, 0x8b, 0x3c, 0x6c, 0x1d, 0xa8, 0xbd, 0xcc, 0x3b, 0x7d, 0x3d,
+ 0xec, 0x95, 0x19, 0x3d, 0xd8, 0xad, 0xad, 0x3d, 0x5e, 0x26, 0x3d, 0xbd,
+ 0x6e, 0x49, 0x58, 0xbd, 0x51, 0xc4, 0xe5, 0x3d, 0x36, 0x29, 0xa1, 0xbd,
+ 0xa9, 0x12, 0x05, 0xbe, 0x3d, 0xe4, 0x22, 0xbe, 0xda, 0xbb, 0x64, 0xbd,
+ 0x42, 0x4c, 0xfa, 0x3c, 0xcb, 0x26, 0x87, 0x3c, 0x78, 0xfa, 0xd2, 0x3c,
+ 0x56, 0x81, 0x12, 0xbe, 0x1b, 0xf8, 0xed, 0xbd, 0x12, 0x67, 0x97, 0xbd,
+ 0x17, 0x7a, 0x36, 0xbd, 0x83, 0x58, 0x08, 0x3d, 0x2f, 0x24, 0xf7, 0x3c,
+ 0xb3, 0x0b, 0xbc, 0x3c, 0x37, 0x52, 0xe6, 0x3d, 0x0f, 0xf8, 0xe8, 0xbc,
+ 0x51, 0x1e, 0xac, 0x3d, 0x54, 0x51, 0x5e, 0x3d, 0x0b, 0x98, 0xe3, 0xbd,
+ 0x71, 0x5b, 0x82, 0x3d, 0x81, 0x16, 0x6a, 0xbd, 0xd3, 0xd5, 0xd7, 0x3d,
+ 0xe7, 0x90, 0xfd, 0xbd, 0x70, 0xc4, 0x19, 0xbe, 0x1d, 0x06, 0xa5, 0xbd,
+ 0xf3, 0x44, 0xb7, 0xbd, 0x45, 0xec, 0xd2, 0x3d, 0x80, 0x3b, 0xa7, 0x3d,
+ 0x4c, 0xbb, 0xf7, 0x3c, 0x38, 0x89, 0xd4, 0x3d, 0x85, 0x5b, 0x82, 0xbd,
+ 0x04, 0x86, 0x92, 0x3c, 0x08, 0x50, 0x41, 0xbd, 0x51, 0x91, 0x5b, 0xbc,
+ 0x52, 0xeb, 0x07, 0x3d, 0x02, 0x23, 0x1d, 0xbd, 0x8d, 0xb3, 0x28, 0x3d,
+ 0x24, 0x9b, 0xfc, 0xbd, 0x1b, 0x71, 0x72, 0xbd, 0xd0, 0x37, 0xa7, 0xbd,
+ 0x76, 0x4c, 0x60, 0xbd, 0x44, 0xb5, 0x9f, 0x3d, 0x4b, 0x2e, 0x7b, 0xbd,
+ 0xe8, 0x0f, 0xc8, 0xbc, 0xed, 0xe1, 0x02, 0x3d, 0x55, 0x8a, 0x80, 0xbc,
+ 0x53, 0x9f, 0x1c, 0xbd, 0xcc, 0x84, 0xb9, 0x3c, 0x8c, 0xca, 0x0f, 0xbe,
+ 0xef, 0xba, 0x4e, 0xbe, 0xff, 0x38, 0x10, 0xbd, 0xed, 0xe9, 0xc1, 0xbc,
+ 0x44, 0xf3, 0x0b, 0xbb, 0x3b, 0x75, 0x8d, 0xbd, 0x88, 0x68, 0xc6, 0xbd,
+ 0x23, 0xed, 0x4f, 0xbd, 0xdc, 0xa1, 0x15, 0x3e, 0x42, 0xd4, 0xac, 0x3b,
+ 0x42, 0x4e, 0xf2, 0xbc, 0x0b, 0x5d, 0xaf, 0x3d, 0x1d, 0xa2, 0xbf, 0x3c,
+ 0x06, 0x52, 0x0b, 0xbd, 0x48, 0x69, 0x91, 0x3d, 0xe0, 0x16, 0x87, 0x3b,
+ 0x7a, 0x0e, 0x85, 0x3d, 0x7f, 0x4e, 0xcc, 0x3d, 0x04, 0x19, 0x16, 0xbe,
+ 0x8b, 0xbe, 0x5b, 0xbd, 0x57, 0x9e, 0x84, 0x3c, 0x59, 0x42, 0xa3, 0xbd,
+ 0x60, 0xc7, 0xcb, 0xbb, 0x0b, 0x24, 0x67, 0xbd, 0x50, 0xcd, 0x47, 0xbd,
+ 0x6a, 0x98, 0x0c, 0xbe, 0xfc, 0xda, 0xec, 0xbd, 0xf9, 0x49, 0xb9, 0x3a,
+ 0x9e, 0x77, 0xb8, 0xbc, 0x50, 0x62, 0x9b, 0xbc, 0x73, 0xa7, 0xd8, 0x3d,
+ 0x78, 0x73, 0x71, 0xbd, 0x19, 0xbb, 0x27, 0xbe, 0xbc, 0x8b, 0x03, 0x3e,
+ 0x86, 0xaa, 0x1e, 0x3d, 0x86, 0xfd, 0x4a, 0x3e, 0xa9, 0x9a, 0xa9, 0xbd,
+ 0xc3, 0x88, 0x4a, 0x3d, 0x32, 0x77, 0x86, 0xbd, 0xfb, 0x19, 0x7a, 0x3c,
+ 0x97, 0x8b, 0xdb, 0x3c, 0x6c, 0x5b, 0x02, 0xbe, 0x52, 0x9d, 0xa0, 0xbd,
+ 0x65, 0x4d, 0x29, 0x3d, 0x33, 0xd7, 0x39, 0x3d, 0x52, 0x18, 0xc0, 0x3d,
+ 0x42, 0x2c, 0x60, 0xbe, 0x6d, 0x82, 0x45, 0xbd, 0xe0, 0x5a, 0xd1, 0xbb,
+ 0x0d, 0xd7, 0x73, 0xbd, 0x9b, 0xde, 0x0f, 0x3e, 0x44, 0x73, 0x4b, 0xbe,
+ 0x6d, 0xd8, 0xd6, 0xbd, 0xbd, 0x2b, 0xfe, 0xbd, 0x7c, 0xa3, 0xec, 0xbc,
+ 0xbe, 0x89, 0x3e, 0x3d, 0x14, 0x8a, 0x1e, 0x3d, 0x01, 0xd2, 0xd7, 0x3d,
+ 0xa6, 0x96, 0x32, 0x3e, 0x4e, 0x48, 0xf1, 0xbd, 0x44, 0x6b, 0xea, 0xbd,
+ 0x0a, 0x94, 0xef, 0xbc, 0xcc, 0x31, 0x80, 0xbd, 0x46, 0xcc, 0x9f, 0x3e,
+ 0x89, 0x18, 0x95, 0xbc, 0x69, 0xdb, 0x85, 0xbd, 0x1b, 0xa1, 0x8a, 0xbd,
+ 0x31, 0x59, 0x45, 0x3d, 0x09, 0x05, 0x16, 0x3e, 0x00, 0xf2, 0xa6, 0xbd,
+ 0x3e, 0x94, 0x41, 0x3d, 0x85, 0xc9, 0xd2, 0xbd, 0x98, 0xae, 0x86, 0xbe,
+ 0x07, 0x9e, 0x89, 0xbd, 0xfd, 0xef, 0x80, 0xbc, 0xc9, 0xd9, 0xee, 0x3c,
+ 0x1d, 0x98, 0x5f, 0x3e, 0xd7, 0xa8, 0x74, 0xbe, 0x0a, 0x4d, 0x50, 0xbd,
+ 0xe7, 0xa7, 0x53, 0xbe, 0x03, 0x21, 0x3b, 0xbd, 0x8b, 0x85, 0xaf, 0xbd,
+ 0xae, 0x75, 0x2b, 0x3e, 0x43, 0x73, 0xa3, 0xbb, 0x2e, 0xca, 0xa3, 0x3d,
+ 0xa2, 0xc2, 0x60, 0xbe, 0xfe, 0xb1, 0xca, 0x3d, 0x46, 0x4e, 0xc7, 0x3b,
+ 0xaa, 0xce, 0x9a, 0x3d, 0xf7, 0xeb, 0xe2, 0xbd, 0x36, 0xe9, 0x8d, 0xbd,
+ 0x4e, 0xf1, 0x1c, 0xbd, 0xb9, 0x00, 0x99, 0xbb, 0xa4, 0xe9, 0xa7, 0xbd,
+ 0xde, 0x0e, 0x28, 0x3e, 0x72, 0x49, 0x46, 0xbd, 0x1f, 0x3f, 0x00, 0x3e,
+ 0x8b, 0x53, 0x0c, 0x3e, 0xcf, 0x62, 0x63, 0xbe, 0x42, 0xcf, 0xde, 0xbd,
+ 0x7e, 0xaf, 0x4f, 0x3e, 0xfd, 0xd7, 0xff, 0x3c, 0x37, 0xbb, 0x8e, 0xbd,
+ 0x08, 0xd7, 0x96, 0xbd, 0xe1, 0x8a, 0xd2, 0xbc, 0xcb, 0x7a, 0x4e, 0x3c,
+ 0x2d, 0x34, 0x28, 0xbe, 0x44, 0x36, 0x1b, 0x3c, 0xe5, 0x56, 0x04, 0xbc,
+ 0xb0, 0xda, 0x19, 0x3e, 0xae, 0x54, 0x5f, 0x3e, 0x00, 0x90, 0x09, 0xbe,
+ 0xfb, 0xca, 0x8e, 0x3e, 0x21, 0x40, 0xd5, 0xbd, 0xa3, 0xb5, 0xb3, 0x3c,
+ 0x42, 0x34, 0xa4, 0xbd, 0xfe, 0x14, 0x10, 0xbe, 0xfc, 0x0d, 0xec, 0xbd,
+ 0x8a, 0x81, 0x9c, 0x3c, 0x8d, 0xab, 0xc9, 0x3d, 0xb8, 0x0b, 0x08, 0x3c,
+ 0x40, 0xe9, 0xe1, 0xbd, 0xb4, 0x3b, 0x08, 0xbe, 0xb3, 0x5a, 0x59, 0x3d,
+ 0xae, 0x74, 0xb7, 0xbc, 0xcb, 0x89, 0x47, 0x3e, 0x75, 0x6d, 0x93, 0xbc,
+ 0xaf, 0x5e, 0x4c, 0x3d, 0x40, 0xce, 0x93, 0xbd, 0x13, 0x19, 0x06, 0x3e,
+ 0x45, 0x3c, 0xf4, 0x3d, 0xa6, 0x25, 0x8e, 0xbd, 0x84, 0x11, 0x3f, 0xbd,
+ 0x9a, 0x09, 0x97, 0xbd, 0x7d, 0x5e, 0xbc, 0xbd, 0x33, 0x6e, 0xb7, 0xbd,
+ 0xe0, 0xd6, 0x1b, 0x3d, 0xb6, 0x2a, 0xe3, 0x3d, 0x13, 0xc4, 0x08, 0xbe,
+ 0xdf, 0x3b, 0xaf, 0xbc, 0x16, 0xcb, 0x0d, 0xbe, 0x70, 0x28, 0x2c, 0xbe,
+ 0x19, 0xf5, 0x83, 0x3d, 0xce, 0x82, 0x1a, 0xbd, 0xf9, 0xd2, 0x61, 0x39,
+ 0x25, 0x8c, 0x9b, 0xbc, 0xab, 0xd9, 0x02, 0x3e, 0xc2, 0xec, 0x8f, 0xbe,
+ 0xfc, 0x32, 0x02, 0x3e, 0xbc, 0xe1, 0x0d, 0xbd, 0x30, 0x97, 0xa0, 0x3d,
+ 0x03, 0x43, 0xf2, 0x3d, 0x12, 0xb3, 0x9a, 0x3d, 0x48, 0x04, 0xf9, 0xbd,
+ 0x2a, 0xea, 0x21, 0x3e, 0x0f, 0x90, 0x2f, 0xbe, 0x76, 0xa3, 0x13, 0xbe,
+ 0xea, 0xda, 0xaf, 0xbc, 0xd0, 0xd4, 0x36, 0xbd, 0x09, 0x2b, 0x03, 0x3e,
+ 0xac, 0x97, 0x01, 0x3d, 0x85, 0x31, 0xa1, 0xbd, 0xaa, 0x1d, 0xb7, 0xbd,
+ 0xfd, 0x56, 0x74, 0x3d, 0xd3, 0x93, 0xf1, 0x3c, 0x33, 0xdf, 0x99, 0xbb,
+ 0x82, 0xeb, 0x8c, 0xbc, 0x6a, 0x6a, 0xb0, 0xbd, 0x5f, 0x77, 0x82, 0xbe,
+ 0x90, 0x00, 0x3a, 0xbd, 0xa3, 0xaf, 0xb3, 0x3d, 0x61, 0x45, 0xfb, 0xbd,
+ 0xc7, 0xfa, 0xc0, 0xbd, 0xde, 0x86, 0x0a, 0x3e, 0x19, 0x4d, 0xdd, 0x3d,
+ 0x4e, 0x32, 0xd6, 0xbc, 0xba, 0x2f, 0xb8, 0xbd, 0xb4, 0x74, 0x66, 0xbe,
+ 0x88, 0x43, 0x81, 0xbe, 0x50, 0xb1, 0xc1, 0xbc, 0x4d, 0x25, 0xc4, 0xbd,
+ 0xe9, 0x3e, 0x2c, 0xbb, 0x91, 0x8e, 0xf6, 0xbd, 0xcd, 0xc3, 0x40, 0xbc,
+ 0x91, 0xf0, 0xfe, 0x3d, 0x44, 0x28, 0x26, 0xbd, 0x34, 0xfe, 0xd1, 0x3b,
+ 0x62, 0xab, 0x2a, 0x3e, 0xc8, 0x8f, 0xb3, 0xbd, 0x34, 0x99, 0xa0, 0xbd,
+ 0x4f, 0x8b, 0x9d, 0x3d, 0x83, 0xe6, 0x26, 0xbe, 0x01, 0x0a, 0xac, 0x3d,
+ 0x1e, 0xef, 0x9c, 0xbd, 0x36, 0x3d, 0x7b, 0xbd, 0x3e, 0xe4, 0xc6, 0xbd,
+ 0x28, 0xc5, 0xe9, 0x3c, 0x94, 0xbf, 0x63, 0x3c, 0x3e, 0x86, 0xed, 0x3d,
+ 0xe5, 0xe2, 0x47, 0xbd, 0xbf, 0x5e, 0x2a, 0xbe, 0xe0, 0x02, 0x02, 0x3e,
+ 0xcf, 0x9a, 0xc5, 0x3d, 0x0a, 0x0c, 0x01, 0xbe, 0x2e, 0x96, 0x1b, 0x3e,
+ 0x0f, 0x87, 0xc8, 0xbc, 0x68, 0x86, 0x97, 0x3d, 0xa9, 0xee, 0xe8, 0xbd,
+ 0x7a, 0x35, 0x07, 0xbc, 0xbe, 0x1e, 0x17, 0x3d, 0xb8, 0x8e, 0x0b, 0x3d,
+ 0xcb, 0xc7, 0x34, 0x3d, 0x0a, 0x66, 0xca, 0x3c, 0x8e, 0xb7, 0xaf, 0xbd,
+ 0x16, 0xa2, 0x8f, 0xbd, 0xae, 0x7d, 0x11, 0x3e, 0x13, 0xbb, 0x02, 0xbd,
+ 0x83, 0xcd, 0xaa, 0x3d, 0xbc, 0xd8, 0x0a, 0xbd, 0x3e, 0xa6, 0x04, 0xbe,
+ 0xa8, 0x3a, 0xd7, 0xbc, 0x4f, 0xad, 0xb4, 0x3d, 0xcd, 0xda, 0xed, 0xbd,
+ 0xd9, 0x9e, 0x78, 0xbd, 0x29, 0x12, 0x7a, 0xbc, 0x7b, 0x82, 0x58, 0xbd,
+ 0x97, 0xbd, 0x2a, 0xbe, 0x47, 0x02, 0x1a, 0x3e, 0x61, 0x82, 0x10, 0x3d,
+ 0xab, 0x84, 0xd2, 0x3d, 0x66, 0x40, 0xc4, 0x3d, 0x2b, 0x4c, 0x28, 0x3d,
+ 0xa6, 0x03, 0x1f, 0xbe, 0xf8, 0x60, 0x7a, 0x3d, 0x3d, 0x9b, 0x0a, 0x3e,
+ 0x6f, 0x5a, 0xa8, 0xbb, 0x5b, 0xf3, 0xe5, 0xbd, 0x08, 0x45, 0x2b, 0x3e,
+ 0x96, 0x05, 0x98, 0x3d, 0x87, 0xda, 0x97, 0x3d, 0x46, 0xda, 0x10, 0x3e,
+ 0xed, 0xd5, 0xc9, 0x3d, 0xa2, 0xc1, 0x7c, 0x3b, 0x91, 0x90, 0x2b, 0xbe,
+ 0x2e, 0x29, 0x78, 0xbb, 0xc1, 0x2c, 0x71, 0xbd, 0x79, 0xb7, 0xd9, 0xbd,
+ 0x7c, 0xef, 0x5b, 0x3d, 0x7c, 0x97, 0xa7, 0x3d, 0xf3, 0xa3, 0x59, 0x3d,
+ 0x99, 0x0d, 0x59, 0x3d, 0x38, 0x0a, 0x30, 0xbe, 0xde, 0x82, 0x98, 0xbd,
+ 0xbd, 0x18, 0x5f, 0xbe, 0x43, 0xcb, 0x3a, 0x3e, 0x01, 0x1b, 0x3b, 0xbc,
+ 0x4c, 0x88, 0x87, 0x3d, 0xb1, 0xe5, 0xcb, 0x3c, 0x4c, 0x78, 0x05, 0xbc,
+ 0x62, 0x56, 0xb9, 0xbd, 0x9c, 0x39, 0xe4, 0xbc, 0xbc, 0x4b, 0x59, 0xbd,
+ 0x58, 0x65, 0xc4, 0xbd, 0xcd, 0x7f, 0xe7, 0x3a, 0x0c, 0x84, 0x6d, 0x3c,
+ 0x4b, 0xc4, 0x00, 0x3e, 0x4d, 0xb6, 0xbd, 0xbd, 0x1c, 0xf2, 0x77, 0x3d,
+ 0xbb, 0xbf, 0xf1, 0xbd, 0x44, 0xa8, 0x8e, 0x3d, 0x9c, 0x7e, 0x0e, 0xbc,
+ 0x38, 0x75, 0x6c, 0xbd, 0x0e, 0x2a, 0xd7, 0x3d, 0xbb, 0x45, 0x88, 0xbd,
+ 0x66, 0x35, 0xb3, 0xbd, 0xfc, 0xae, 0x0f, 0xbe, 0xe8, 0x4f, 0xc3, 0xbc,
+ 0xdc, 0xe0, 0xe4, 0x3c, 0x31, 0x8f, 0x21, 0xbe, 0x54, 0x5c, 0x89, 0xbd,
+ 0x25, 0x9f, 0x3f, 0x3d, 0xab, 0x2d, 0xfd, 0xbc, 0x52, 0x93, 0x0b, 0xbe,
+ 0x0e, 0x55, 0xd9, 0xbc, 0xb4, 0xe4, 0x00, 0x3e, 0xa2, 0x32, 0x3a, 0xbe,
+ 0xe2, 0xab, 0x8b, 0x3d, 0x95, 0x37, 0x15, 0x3e, 0x38, 0x4b, 0xa9, 0xbd,
+ 0x46, 0x33, 0x3d, 0xbd, 0xac, 0x22, 0x3e, 0xbd, 0x73, 0x2d, 0x9e, 0x3d,
+ 0x38, 0x69, 0x15, 0x3e, 0x44, 0x37, 0xaa, 0x3d, 0x9e, 0xe6, 0x5d, 0xbe,
+ 0x46, 0x65, 0xcb, 0x3a, 0xbb, 0x96, 0x48, 0xbe, 0x93, 0xd3, 0xac, 0xbd,
+ 0xc0, 0x99, 0x7a, 0x3c, 0x8e, 0xe9, 0x85, 0xbd, 0x1d, 0x7e, 0x1e, 0xbc,
+ 0xf0, 0x75, 0xd5, 0x3d, 0x9a, 0xdd, 0x2a, 0x3d, 0x33, 0xbb, 0xd9, 0xbc,
+ 0x05, 0x30, 0xb3, 0x3d, 0xf4, 0xb5, 0xa7, 0x3d, 0x26, 0xc3, 0xbf, 0x3d,
+ 0x2f, 0x33, 0xc1, 0x3d, 0xe0, 0x2d, 0xb5, 0x3b, 0x17, 0xc9, 0x67, 0x3d,
+ 0x88, 0xd2, 0x2f, 0x3d, 0xe5, 0x1c, 0x0c, 0x3e, 0x0d, 0x64, 0x6c, 0x3d,
+ 0x64, 0x02, 0x39, 0xbd, 0x54, 0x4e, 0x9a, 0x3d, 0xe9, 0x6d, 0x97, 0xbc,
+ 0x55, 0x1e, 0x36, 0x3d, 0xa0, 0x2d, 0x0a, 0xbd, 0xb8, 0x1a, 0x62, 0x3c,
+ 0x17, 0xec, 0x99, 0xbc, 0x1d, 0x69, 0xd7, 0xbc, 0xb9, 0xf3, 0xb9, 0xbb,
+ 0x6b, 0xc6, 0xad, 0xbd, 0x10, 0x6d, 0x75, 0xbd, 0x75, 0x6e, 0x5b, 0xbd,
+ 0x91, 0xa0, 0x9f, 0x3d, 0x0a, 0xc8, 0xff, 0xbd, 0x0b, 0x34, 0x4d, 0x3e,
+ 0x45, 0x4b, 0xd8, 0xbc, 0x80, 0x5a, 0x21, 0xbd, 0x19, 0xb5, 0x06, 0xbd,
+ 0xa2, 0xaf, 0x82, 0xbd, 0xf2, 0x2f, 0x9f, 0xbd, 0xf2, 0x97, 0xf6, 0xbd,
+ 0xa0, 0xfa, 0x7f, 0x3d, 0x5a, 0x90, 0x95, 0xbc, 0x8c, 0xbb, 0xfb, 0xbc,
+ 0xe9, 0xba, 0x98, 0xbd, 0x3f, 0x0b, 0xd0, 0x3d, 0xa9, 0x1d, 0xc7, 0x3c,
+ 0xbf, 0xad, 0x6a, 0xbe, 0x45, 0xc3, 0xec, 0xbc, 0x95, 0x60, 0xf9, 0xbc,
+ 0xef, 0x1a, 0x80, 0xbd, 0xc5, 0x3d, 0xf7, 0xbc, 0x3c, 0x38, 0xe9, 0x3c,
+ 0xb7, 0x23, 0xc6, 0xbd, 0x9e, 0xa4, 0xe9, 0x3c, 0xfc, 0xbc, 0xae, 0xbd,
+ 0x08, 0x93, 0x3f, 0x3a, 0x39, 0x8e, 0xc7, 0x3d, 0x08, 0xc3, 0x71, 0xbb,
+ 0xe5, 0xd2, 0x53, 0xbd, 0x02, 0x8c, 0x48, 0xbd, 0x8e, 0x2c, 0x1c, 0x3e,
+ 0x40, 0x55, 0xce, 0x3d, 0x6a, 0x61, 0xbd, 0xbc, 0x9f, 0x6b, 0x60, 0x3d,
+ 0x9c, 0x1a, 0x74, 0xbc, 0x93, 0x3f, 0xee, 0x3d, 0x1e, 0x4c, 0x00, 0xbe,
+ 0xe3, 0x78, 0xfd, 0xbd, 0x77, 0xa1, 0x96, 0xbc, 0xd5, 0xb1, 0xa4, 0x3d,
+ 0xe5, 0x3e, 0x7d, 0x3c, 0xfe, 0x01, 0x09, 0x3d, 0x5f, 0x1b, 0x76, 0x3d,
+ 0x32, 0xd0, 0x12, 0x3d, 0xb3, 0x26, 0x27, 0xbe, 0xc5, 0xb2, 0x72, 0xbd,
+ 0x75, 0xe0, 0x3e, 0xbe, 0x6f, 0xa5, 0x8f, 0x3c, 0xea, 0x8d, 0x73, 0xbc,
+ 0x62, 0x69, 0xce, 0x3d, 0xae, 0xe8, 0x48, 0xbd, 0x3e, 0x31, 0x75, 0x3d,
+ 0x70, 0x48, 0x03, 0xbd, 0x50, 0x11, 0x27, 0x3c, 0x06, 0x9f, 0xb0, 0x3d,
+ 0xa6, 0x48, 0xbe, 0x3d, 0x04, 0x98, 0x78, 0xbd, 0x44, 0x4b, 0x10, 0xbe,
+ 0x59, 0xa4, 0x07, 0x3e, 0x3c, 0x32, 0x57, 0x3c, 0x20, 0x23, 0xe9, 0x3d,
+ 0xb6, 0x53, 0x83, 0xbe, 0xc0, 0x41, 0x78, 0xbe, 0xd1, 0x03, 0x28, 0x3d,
+ 0x28, 0x81, 0x83, 0x3d, 0x3a, 0x9e, 0xe8, 0x3d, 0x9d, 0xb5, 0xeb, 0x3d,
+ 0x86, 0x7e, 0x65, 0xbb, 0x96, 0xe1, 0xd8, 0xbc, 0xa2, 0x09, 0xe5, 0x3d,
+ 0x50, 0x57, 0x11, 0xbe, 0x4c, 0x69, 0xde, 0xbd, 0x3e, 0xe1, 0x93, 0xbd,
+ 0x80, 0xec, 0x1a, 0x3e, 0x39, 0x80, 0xe0, 0x3b, 0x4c, 0xeb, 0x80, 0xbe,
+ 0xa4, 0x3e, 0xbb, 0xbd, 0x2b, 0xb7, 0xa8, 0x3e, 0x29, 0x6f, 0x08, 0xbe,
+ 0x8a, 0x54, 0x30, 0x3d, 0x0a, 0x1a, 0x16, 0x3d, 0xfb, 0x81, 0xd8, 0xbd,
+ 0xe4, 0x2c, 0x0c, 0xbd, 0xdd, 0x0f, 0x15, 0x3d, 0x1e, 0x15, 0xd1, 0xbd,
+ 0x63, 0x33, 0xc7, 0x3d, 0xa2, 0x01, 0x27, 0x3e, 0x5e, 0xe1, 0x8f, 0xbc,
+ 0x76, 0x5e, 0xff, 0xbc, 0x02, 0xb7, 0xda, 0x3d, 0xb0, 0x31, 0xac, 0x3d,
+ 0xb2, 0xf6, 0x35, 0x3e, 0xbd, 0x29, 0x6b, 0xbd, 0xd1, 0xb2, 0x9d, 0xbc,
+ 0xa3, 0x4b, 0xc2, 0xbc, 0x4a, 0xc0, 0xd6, 0xbd, 0xc3, 0x09, 0x8e, 0x3d,
+ 0x7c, 0x84, 0xa1, 0x3d, 0x23, 0xd5, 0x3b, 0xbd, 0xd5, 0xec, 0x01, 0xbe,
+ 0x96, 0xcf, 0x15, 0x3e, 0x55, 0x18, 0xac, 0xbd, 0x38, 0xba, 0xf4, 0x3d,
+ 0xe6, 0x16, 0xc1, 0x3d, 0x0a, 0xdb, 0x00, 0x3e, 0x16, 0xca, 0x11, 0xbd,
+ 0x48, 0x4a, 0xd1, 0x3d, 0xf2, 0xbd, 0x99, 0xbd, 0xee, 0x80, 0x22, 0x3e,
+ 0x16, 0x30, 0x8e, 0xbb, 0x1b, 0xec, 0x7e, 0x3e, 0x8b, 0xbc, 0xdc, 0x3d,
+ 0x80, 0x57, 0xe5, 0xbc, 0x01, 0x91, 0x62, 0x3e, 0x74, 0x93, 0x78, 0xbe,
+ 0x7f, 0x1f, 0xf9, 0x3d, 0x58, 0x9b, 0x85, 0x3b, 0x98, 0x62, 0xfd, 0x3c,
+ 0x05, 0x4e, 0xbe, 0x3d, 0xbe, 0x19, 0xb8, 0xbd, 0x81, 0x05, 0xdb, 0x3d,
+ 0x58, 0x61, 0xff, 0x3d, 0xe0, 0x25, 0x26, 0x3d, 0xf3, 0x78, 0xbd, 0xbd,
+ 0x6e, 0xb0, 0x0b, 0x3e, 0x60, 0xd2, 0x97, 0xbb, 0x0c, 0x0a, 0xd4, 0xbd,
+ 0x4f, 0x23, 0x1a, 0x3e, 0x67, 0x1b, 0x2f, 0x3e, 0x43, 0xa6, 0xb9, 0xbe,
+ 0xd8, 0x7f, 0xc8, 0x3d, 0x2d, 0x8f, 0xa3, 0x3d, 0xaf, 0x61, 0x07, 0xbe,
+ 0x92, 0x6b, 0x01, 0xbe, 0xde, 0x82, 0x2b, 0xbe, 0xd8, 0xff, 0x21, 0xbe,
+ 0x27, 0x27, 0x3b, 0xbd, 0x2d, 0x0d, 0x09, 0xbd, 0x2a, 0xf5, 0x83, 0x3c,
+ 0xf9, 0x33, 0xb9, 0xbd, 0x69, 0xdb, 0x07, 0x3e, 0x3f, 0x35, 0x12, 0x3e,
+ 0x7b, 0x28, 0x1f, 0xbe, 0x9b, 0x0d, 0xc5, 0x3e, 0x71, 0xf3, 0x9b, 0x3d,
+ 0xc4, 0x4f, 0xcd, 0xbd, 0x44, 0xc8, 0x80, 0xbd, 0x0e, 0x9b, 0x87, 0xbd,
+ 0x22, 0x29, 0x33, 0xbd, 0x69, 0x8d, 0xd1, 0xbd, 0xb2, 0x86, 0x01, 0x3d,
+ 0x28, 0x81, 0x3a, 0xbd, 0xc4, 0x5d, 0x8e, 0xbe, 0x8b, 0xb9, 0x86, 0xbd,
+ 0x17, 0x28, 0x7b, 0xbe, 0x91, 0x34, 0xea, 0xbd, 0xb3, 0xce, 0xbb, 0xbd,
+ 0x75, 0x37, 0x5d, 0x3e, 0x82, 0x57, 0x82, 0xbd, 0x84, 0x53, 0x9a, 0xbd,
+ 0xa7, 0x41, 0xca, 0xbc, 0x33, 0x1a, 0x41, 0xbe, 0x92, 0x1b, 0x50, 0xbe,
+ 0x22, 0x5e, 0x24, 0xbe, 0xb2, 0x64, 0xf6, 0xbd, 0x9b, 0x99, 0x70, 0x3e,
+ 0x23, 0x80, 0xed, 0x39, 0xbf, 0x47, 0x65, 0xbe, 0x03, 0x33, 0xe9, 0xbd,
+ 0xf9, 0xcb, 0x0f, 0x3d, 0x50, 0xe4, 0xc4, 0xbc, 0x54, 0x84, 0x17, 0xbd,
+ 0x49, 0x68, 0xac, 0xbc, 0x3f, 0xf3, 0x34, 0xbe, 0x7f, 0xd1, 0x01, 0x3e,
+ 0xae, 0x8f, 0xe5, 0x3d, 0xbb, 0x62, 0xba, 0xbd, 0xa7, 0xcd, 0xb1, 0x3d,
+ 0x71, 0x99, 0x31, 0x3d, 0xe8, 0xe2, 0x2a, 0xbc, 0x88, 0xef, 0x05, 0x3d,
+ 0xa5, 0xb7, 0x5c, 0x3d, 0x91, 0xca, 0xef, 0xbd, 0x9e, 0xcc, 0x50, 0xbd,
+ 0x25, 0x40, 0xd4, 0x3d, 0x29, 0xbc, 0xeb, 0xbc, 0x80, 0x7e, 0x0b, 0x3e,
+ 0x4b, 0x57, 0x0e, 0x3d, 0x70, 0x63, 0x0c, 0x3b, 0xc5, 0x53, 0xed, 0xbd,
+ 0x9a, 0xf1, 0x2c, 0xbe, 0x7b, 0xb6, 0xf4, 0x3c, 0x8e, 0xf8, 0x0b, 0x3e,
+ 0x0d, 0x70, 0x6d, 0x3c, 0x62, 0x37, 0xf8, 0x3c, 0x25, 0x2c, 0x2c, 0xbe,
+ 0xea, 0x79, 0x22, 0x3d, 0x86, 0x60, 0x96, 0xbd, 0x05, 0x21, 0x6a, 0x3b,
+ 0xb4, 0x2c, 0xf5, 0xbd, 0x89, 0xb4, 0xa4, 0x3b, 0x2e, 0x7d, 0x02, 0x3d,
+ 0x36, 0xcd, 0x1f, 0xbd, 0xdb, 0xcc, 0x6d, 0xbd, 0x37, 0x15, 0x0c, 0x3d,
+ 0xba, 0x2c, 0xd1, 0x3d, 0xd2, 0xc0, 0xe7, 0x3d, 0x07, 0x7d, 0xc2, 0xbd,
+ 0x18, 0x2e, 0x9b, 0x3a, 0x34, 0x45, 0x3b, 0x3d, 0x56, 0x3d, 0x23, 0xbd,
+ 0xb3, 0xc6, 0x71, 0xbd, 0x12, 0x09, 0x10, 0x3e, 0x7d, 0x1e, 0x8e, 0x3d,
+ 0x1f, 0x81, 0xce, 0xbd, 0xa0, 0x60, 0xf5, 0xbd, 0xee, 0x9f, 0xed, 0xbc,
+ 0x6e, 0xc0, 0x03, 0x3e, 0x76, 0xa6, 0xd9, 0x3d, 0x12, 0x7b, 0xbf, 0xbc,
+ 0x64, 0x24, 0x09, 0xbe, 0x75, 0x0f, 0x02, 0xbd, 0x59, 0x62, 0xc5, 0xbd,
+ 0x4c, 0x19, 0x7a, 0x3d, 0x31, 0x50, 0x5a, 0x3d, 0x54, 0x25, 0x6c, 0x3b,
+ 0xca, 0x6c, 0x12, 0xbe, 0x34, 0xda, 0x0d, 0xbe, 0x82, 0x5c, 0xc6, 0xbd,
+ 0x55, 0x9d, 0x73, 0x3d, 0xe0, 0xae, 0x04, 0x3e, 0x1b, 0x83, 0x92, 0x3c,
+ 0x2a, 0x25, 0x09, 0xbe, 0x24, 0xd9, 0xa7, 0x3c, 0xf1, 0xde, 0xdb, 0xbd,
+ 0x19, 0xb8, 0x42, 0x3d, 0x73, 0x6f, 0xe1, 0x3c, 0xc6, 0x05, 0x00, 0xbe,
+ 0x8d, 0xb3, 0x26, 0x3e, 0xc4, 0x67, 0x26, 0xbd, 0xf5, 0xed, 0x01, 0x3d,
+ 0x0b, 0x88, 0xab, 0x3d, 0xd4, 0x56, 0x8c, 0x3d, 0xb0, 0xce, 0x5d, 0x3d,
+ 0xa5, 0x2d, 0x85, 0x3d, 0xc1, 0x72, 0x81, 0xbd, 0x3a, 0x3b, 0xb8, 0x3c,
+ 0xbb, 0xbb, 0xbc, 0x3c, 0xd5, 0xf9, 0x10, 0xbe, 0xbd, 0x5e, 0x28, 0xbd,
+ 0x99, 0x27, 0x6d, 0xbe, 0xa6, 0xf6, 0x06, 0xbe, 0x0a, 0xc1, 0xe0, 0x3c,
+ 0x7e, 0x7f, 0x11, 0xbe, 0x2d, 0x0f, 0xf1, 0xbd, 0xbc, 0x57, 0x8a, 0xbd,
+ 0x71, 0xd8, 0x17, 0xbd, 0x08, 0x8c, 0x97, 0x3b, 0x71, 0x1a, 0x98, 0x3d,
+ 0x94, 0x80, 0xf7, 0xbd, 0x0a, 0x49, 0x8f, 0x3d, 0x09, 0x50, 0x90, 0xbd,
+ 0x11, 0x38, 0xca, 0xbd, 0x24, 0x49, 0x09, 0x3d, 0x3f, 0x6b, 0xa6, 0xbd,
+ 0xa3, 0x86, 0x80, 0x3d, 0xbc, 0x81, 0x31, 0xbe, 0x89, 0x89, 0x45, 0x3d,
+ 0xba, 0x38, 0x00, 0xbe, 0xbe, 0xff, 0x2d, 0x3e, 0x49, 0x51, 0x99, 0x3b,
+ 0x3d, 0x0b, 0x07, 0x3d, 0x9d, 0xb3, 0xf6, 0xbd, 0x0d, 0x65, 0xb7, 0xbc,
+ 0xc3, 0x4c, 0x6c, 0xbd, 0x75, 0x34, 0x4e, 0x3d, 0x82, 0x80, 0x55, 0xbd,
+ 0xe6, 0xc2, 0x2f, 0x3d, 0xb4, 0x83, 0xa4, 0xbd, 0xac, 0xdb, 0x26, 0xbe,
+ 0x20, 0xcb, 0xdf, 0x3d, 0xa3, 0x73, 0x5a, 0x3b, 0x47, 0x8e, 0x5b, 0x3d,
+ 0xcc, 0x0a, 0xdd, 0x3d, 0x90, 0xdf, 0x7c, 0x3d, 0xbd, 0x6d, 0x40, 0xbd,
+ 0x89, 0xf7, 0x8e, 0xbd, 0x45, 0xc5, 0x32, 0x3d, 0x39, 0x40, 0x61, 0xbd,
+ 0x02, 0x08, 0x33, 0x3e, 0x0c, 0x0f, 0x20, 0x3c, 0xe1, 0x65, 0x32, 0xbd,
+ 0x3e, 0x55, 0x79, 0xbd, 0x9e, 0xb3, 0xe2, 0xbd, 0x3f, 0xfd, 0x69, 0x3e,
+ 0x76, 0x88, 0xfc, 0x3c, 0x94, 0xb1, 0xc3, 0x3d, 0x6d, 0x29, 0xd0, 0xbd,
+ 0x62, 0x24, 0x70, 0xbc, 0xef, 0x65, 0xaf, 0x3d, 0x32, 0xea, 0x81, 0xbb,
+ 0x7c, 0x87, 0x11, 0x3d, 0x90, 0x27, 0x3e, 0xbe, 0x2c, 0x26, 0x20, 0x3e,
+ 0x1c, 0xf1, 0xdf, 0xbc, 0xf5, 0xd9, 0x36, 0xbe, 0xa0, 0xf9, 0xc2, 0x3d,
+ 0x70, 0x83, 0x4c, 0xbe, 0x19, 0x61, 0x0b, 0xbe, 0xb7, 0x05, 0x09, 0xbd,
+ 0xf9, 0x09, 0x8a, 0x3c, 0x74, 0x99, 0x66, 0xbc, 0xb9, 0xbc, 0x52, 0xbe,
+ 0xec, 0xc8, 0x3a, 0xbd, 0x0d, 0x0b, 0x7c, 0x3d, 0x6b, 0x4e, 0x0e, 0xbe,
+ 0x12, 0x51, 0x25, 0x3d, 0xf8, 0x99, 0x16, 0xbd, 0x80, 0x4c, 0x07, 0x3e,
+ 0x28, 0x97, 0x6d, 0x3e, 0xc2, 0xdb, 0xed, 0xbc, 0xab, 0xcc, 0xff, 0xbd,
+ 0x8a, 0xef, 0x9a, 0xbd, 0xe5, 0x67, 0x8e, 0x3c, 0x50, 0x66, 0xb9, 0x3d,
+ 0x3e, 0x05, 0x5e, 0xbe, 0x5c, 0xa4, 0x3b, 0xbc, 0xe2, 0xa2, 0x35, 0xbc,
+ 0x6e, 0xd9, 0xd3, 0xbd, 0x5b, 0xee, 0x1c, 0x3c, 0x70, 0x38, 0x1b, 0xbe,
+ 0x50, 0xcb, 0x62, 0x3d, 0xc7, 0x62, 0x38, 0xbe, 0xc2, 0x12, 0x55, 0xbd,
+ 0x78, 0x4e, 0x2b, 0xbe, 0x4c, 0x74, 0x78, 0x3c, 0xed, 0xd0, 0x9b, 0xbc,
+ 0x8d, 0x0f, 0x5b, 0x3e, 0x43, 0x88, 0x8c, 0xbd, 0x35, 0xe7, 0x97, 0x3d,
+ 0xac, 0x59, 0x82, 0xbe, 0x16, 0x29, 0xc4, 0xbd, 0xf1, 0xbb, 0xe7, 0xbd,
+ 0x56, 0x4d, 0x39, 0x3e, 0x2f, 0x18, 0x11, 0x3e, 0xa9, 0x67, 0xfb, 0x3d,
+ 0x38, 0xa6, 0x11, 0xbe, 0xc6, 0xe1, 0xbb, 0xbd, 0x44, 0x86, 0x8f, 0xbd,
+ 0x2a, 0xe4, 0xac, 0xbc, 0x0f, 0xe1, 0x4c, 0xbd, 0x6b, 0x18, 0x2c, 0xbe,
+ 0x27, 0xf9, 0x4f, 0xbe, 0x71, 0xe5, 0xd6, 0x3d, 0x9a, 0x1f, 0x59, 0x3d,
+ 0xcc, 0xe5, 0x15, 0x3e, 0x20, 0x1d, 0x50, 0xbe, 0xc0, 0x63, 0x3b, 0xbc,
+ 0xd1, 0x6a, 0x3e, 0x3e, 0x31, 0x9e, 0x2f, 0xbe, 0x26, 0x50, 0x49, 0xbe,
+ 0xd6, 0x3a, 0x5d, 0x3e, 0xb5, 0xbc, 0xe9, 0xbc, 0xb6, 0x43, 0x43, 0x3d,
+ 0x45, 0xe8, 0xa8, 0xbc, 0x69, 0x5f, 0xd6, 0xbc, 0xcb, 0xe5, 0x9e, 0x3c,
+ 0xd1, 0x8c, 0x13, 0xbb, 0x8d, 0x26, 0x55, 0x3d, 0x98, 0xec, 0xb7, 0xbd,
+ 0x4b, 0x44, 0xb2, 0x3d, 0x4b, 0x47, 0x4f, 0x3d, 0xec, 0xe5, 0x3d, 0xbc,
+ 0x91, 0x68, 0xa2, 0x3e, 0x17, 0xcf, 0xea, 0x3d, 0x5b, 0xa2, 0x23, 0x3d,
+ 0x4f, 0x8f, 0x8a, 0x3d, 0xd3, 0x4b, 0x4f, 0xbe, 0x79, 0x65, 0x69, 0xbc,
+ 0x89, 0x1d, 0x46, 0xbe, 0xd4, 0xe7, 0x93, 0x3c, 0xce, 0x68, 0x34, 0xbc,
+ 0x09, 0x60, 0x72, 0xbd, 0x1c, 0xcd, 0x03, 0x3d, 0x09, 0x67, 0xda, 0xbc,
+ 0xc5, 0xbc, 0x03, 0x3e, 0x4d, 0x07, 0x8c, 0x3e, 0x80, 0xdb, 0x75, 0x3b,
+ 0x21, 0xcc, 0x8d, 0x3d, 0x4b, 0xb4, 0x9a, 0xbd, 0x54, 0xcb, 0x3b, 0x3e,
+ 0x6a, 0x46, 0x0a, 0x3e, 0x1e, 0xe7, 0x7f, 0xbe, 0x84, 0xbc, 0xed, 0x3d,
+ 0x56, 0x64, 0xd9, 0xbd, 0xeb, 0xce, 0x9b, 0x3d, 0xb1, 0x35, 0x77, 0x3d,
+ 0xdb, 0x01, 0xf5, 0x3d, 0xac, 0x38, 0x99, 0x3d, 0x5f, 0x0d, 0xff, 0xbd,
+ 0x27, 0x4b, 0xf0, 0xbd, 0x32, 0x46, 0x15, 0xbe, 0x92, 0xe3, 0x28, 0xbe,
+ 0x83, 0xa0, 0xb7, 0xbd, 0x8a, 0xe5, 0x1d, 0x3e, 0xe7, 0x8e, 0xe3, 0x3c,
+ 0x5f, 0xb1, 0x69, 0x3e, 0x35, 0x2e, 0x86, 0xbd, 0x05, 0x98, 0x2e, 0xbe,
+ 0xca, 0x45, 0xdc, 0xbb, 0x19, 0x90, 0xd7, 0x3d, 0x44, 0x57, 0x4e, 0x3d,
+ 0x89, 0x96, 0x5a, 0xbd, 0xc9, 0x5a, 0x3c, 0xbe, 0xa7, 0x0f, 0x5f, 0x3d,
+ 0x8c, 0x0c, 0xd3, 0x3d, 0xd8, 0x12, 0x87, 0x3a, 0xd6, 0xc2, 0x1c, 0x3e,
+ 0xa3, 0xa3, 0x2a, 0xbe, 0x74, 0x2a, 0x8b, 0xbd, 0xff, 0x44, 0xe0, 0x3b,
+ 0xe9, 0x98, 0x91, 0x3d, 0xf9, 0xbf, 0xcf, 0xbd, 0x90, 0xa8, 0x06, 0xbe,
+ 0x53, 0xbe, 0xf4, 0xbd, 0x6f, 0x6f, 0xaf, 0x3d, 0xf5, 0x31, 0x02, 0xbd,
+ 0x2b, 0xbc, 0x3d, 0x3d, 0x53, 0x20, 0x61, 0xbd, 0xb4, 0xbc, 0x02, 0xbd,
+ 0xad, 0xa1, 0xfd, 0x3d, 0x7a, 0x09, 0xd5, 0x3d, 0x88, 0x7f, 0xe2, 0x3b,
+ 0xd8, 0xa9, 0x01, 0xbe, 0xfc, 0x68, 0xd8, 0xbd, 0xf1, 0x64, 0xfe, 0xbd,
+ 0x2c, 0xbf, 0x40, 0x3d, 0xd0, 0xa5, 0x2c, 0xbe, 0x49, 0x29, 0xc9, 0xbd,
+ 0x31, 0x20, 0xb0, 0xbd, 0xf7, 0x6d, 0x25, 0xbe, 0x4c, 0xab, 0xa5, 0x3d,
+ 0x84, 0x3b, 0x74, 0xbb, 0xe9, 0x69, 0x1b, 0xbe, 0xac, 0xeb, 0xb1, 0xbc,
+ 0xa3, 0x22, 0x46, 0x3d, 0x6e, 0x4e, 0x4b, 0x3c, 0xef, 0x1e, 0x94, 0x3d,
+ 0xef, 0xa5, 0xa5, 0x3d, 0x3d, 0x43, 0xe7, 0x3d, 0xcb, 0xfc, 0x58, 0x3e,
+ 0x83, 0x3f, 0x2a, 0xbd, 0x05, 0x8e, 0xae, 0x3d, 0x70, 0x15, 0xbf, 0xbd,
+ 0x22, 0x32, 0x09, 0x3c, 0x2a, 0xdd, 0x6d, 0x3c, 0x9a, 0x17, 0xb3, 0x3d,
+ 0xcd, 0xca, 0xb1, 0x3d, 0x3c, 0x94, 0x11, 0x3c, 0x7d, 0xfa, 0xdf, 0x3d,
+ 0x73, 0x69, 0x4d, 0xbc, 0xa2, 0x54, 0xab, 0xbc, 0x07, 0x33, 0x34, 0x3e,
+ 0x5c, 0xb8, 0xe4, 0xbd, 0xb8, 0x26, 0x71, 0xbe, 0xb4, 0x1d, 0x59, 0x3d,
+ 0x3b, 0x78, 0x4d, 0xbc, 0x83, 0xf0, 0x05, 0x3e, 0xea, 0x62, 0xde, 0x3c,
+ 0x64, 0xc2, 0x19, 0x3e, 0xe1, 0x7c, 0x9a, 0x3d, 0x23, 0xda, 0x75, 0xbb,
+ 0xcd, 0x01, 0x2f, 0xbe, 0x57, 0x9d, 0xe3, 0x3d, 0x1e, 0xf0, 0x05, 0x3e,
+ 0x40, 0xe6, 0x19, 0xbe, 0x22, 0xa1, 0x18, 0x3d, 0x88, 0xb0, 0x99, 0x3c,
+ 0xab, 0x04, 0xaf, 0x3d, 0xf8, 0x7c, 0x07, 0x3d, 0x37, 0xb2, 0xf4, 0x3d,
+ 0x8b, 0xd1, 0xbd, 0x3d, 0x12, 0x1a, 0x89, 0x3c, 0x99, 0x81, 0x13, 0x3e,
+ 0xb5, 0x79, 0x5c, 0xbe, 0xd5, 0xa8, 0x48, 0xbd, 0xe0, 0x90, 0x5b, 0x3d,
+ 0xab, 0xa4, 0x6d, 0xbd, 0x27, 0x6f, 0x9c, 0xbb, 0x9a, 0x0e, 0xef, 0x3d,
+ 0xf0, 0x70, 0xe5, 0xbd, 0x0a, 0x4f, 0xd3, 0xbd, 0xc4, 0xa4, 0x9b, 0xbc,
+ 0x23, 0x17, 0xab, 0xbd, 0x2c, 0xec, 0x15, 0x3e, 0x57, 0xbb, 0x26, 0x3e,
+ 0x09, 0xca, 0x3b, 0x3d, 0xf6, 0x2e, 0xa7, 0xbd, 0x5c, 0x2a, 0x78, 0x3d,
+ 0x84, 0x89, 0x18, 0x3e, 0x4a, 0x71, 0x9a, 0x3d, 0x34, 0xb2, 0x20, 0xbe,
+ 0x10, 0xef, 0xa8, 0xbd, 0xca, 0xdb, 0xa8, 0xbd, 0xa6, 0x51, 0xde, 0xbd,
+ 0xe7, 0xac, 0x12, 0xbe, 0x36, 0x8f, 0xb7, 0x3b, 0x01, 0x5b, 0x05, 0x3e,
+ 0x9f, 0x5b, 0x32, 0xbd, 0x39, 0xb4, 0x46, 0x3c, 0xa9, 0x65, 0x6d, 0xbc,
+ 0x46, 0xbf, 0x59, 0xbd, 0x5f, 0xa0, 0x30, 0xbd, 0x5e, 0x53, 0x34, 0xbd,
+ 0xea, 0xd7, 0x59, 0x3d, 0x26, 0xbb, 0x2f, 0x3d, 0x57, 0xe0, 0xa2, 0x3d,
+ 0xbb, 0x77, 0x0e, 0x3d, 0x2c, 0xc7, 0xb4, 0x3c, 0x7e, 0xf9, 0xbf, 0xbc,
+ 0xc4, 0x01, 0x22, 0xbd, 0x7e, 0x76, 0x61, 0xbe, 0x11, 0x52, 0xbb, 0xbd,
+ 0x72, 0xa8, 0xf5, 0x3d, 0x0b, 0xc6, 0xf5, 0x3c, 0x81, 0x16, 0x03, 0x3e,
+ 0x8d, 0x36, 0x1a, 0xbe, 0x6e, 0x00, 0xff, 0x3c, 0x22, 0xf2, 0xf0, 0xbd,
+ 0x5d, 0xf4, 0x28, 0xbe, 0xef, 0xa7, 0xee, 0xbd, 0x5f, 0x57, 0x00, 0xbd,
+ 0xdb, 0x75, 0xbf, 0xbc, 0x94, 0x51, 0x06, 0x3e, 0xd0, 0x74, 0x07, 0x3d,
+ 0xb3, 0x27, 0x7a, 0xbd, 0xbd, 0x25, 0xb4, 0x3d, 0x7e, 0xf3, 0x09, 0x3d,
+ 0x19, 0x46, 0xdb, 0xbd, 0xbd, 0xfd, 0x02, 0xbe, 0x21, 0x44, 0x5b, 0xbd,
+ 0xd1, 0x16, 0xde, 0x3d, 0xbb, 0x32, 0x94, 0x3c, 0x65, 0x4d, 0x16, 0xbe,
+ 0xce, 0xd0, 0xcc, 0x3d, 0x2c, 0xa2, 0x58, 0xbc, 0xc6, 0xc7, 0x88, 0xbe,
+ 0x07, 0xcc, 0x97, 0x3d, 0x8b, 0x94, 0x86, 0xbd, 0x03, 0x3c, 0xac, 0x3d,
+ 0x6e, 0x36, 0xde, 0x3d, 0x6f, 0x1f, 0x61, 0x3d, 0x7e, 0x76, 0x68, 0xbb,
+ 0x91, 0x90, 0xd7, 0xbb, 0x31, 0xe2, 0x95, 0x3d, 0x3d, 0x51, 0xe3, 0xbd,
+ 0x39, 0x95, 0x80, 0xbe, 0xbe, 0x08, 0x9e, 0xbc, 0xf3, 0x87, 0xfd, 0xbc,
+ 0xab, 0xc8, 0xe1, 0x3d, 0x4e, 0x79, 0x20, 0xbe, 0xb9, 0x32, 0xac, 0xbb,
+ 0x91, 0x1a, 0x69, 0x3c, 0x11, 0x2d, 0x0b, 0xbe, 0x97, 0x80, 0xab, 0xbd,
+ 0xf2, 0x3f, 0x11, 0x3e, 0xc2, 0x24, 0x11, 0x3e, 0xc1, 0xd6, 0xc0, 0x3c,
+ 0x18, 0x83, 0x39, 0x3e, 0x3f, 0xe4, 0x9d, 0xbd, 0x51, 0x28, 0xd0, 0x3c,
+ 0x6d, 0xdf, 0xaa, 0x3d, 0xcd, 0x86, 0x10, 0x3e, 0x81, 0x85, 0x5c, 0xbd,
+ 0x5b, 0x85, 0xd9, 0xbd, 0x20, 0x76, 0x94, 0xbd, 0x69, 0x71, 0xb1, 0x3d,
+ 0xf2, 0xe0, 0x3a, 0xbe, 0x0a, 0xd9, 0x0a, 0x3b, 0x3c, 0xbb, 0x00, 0x3e,
+ 0x38, 0x85, 0xcf, 0xbd, 0x96, 0x45, 0x79, 0xbd, 0xaa, 0x75, 0x25, 0x3e,
+ 0xf0, 0x50, 0xc4, 0x3d, 0x56, 0x98, 0xbc, 0x3b, 0xf9, 0x6a, 0xc3, 0x3d,
+ 0x7b, 0x9c, 0x9a, 0x3d, 0xad, 0x80, 0xc0, 0x3b, 0x8b, 0xe8, 0x31, 0x3e,
+ 0xe3, 0xd9, 0x8e, 0xbd, 0xf7, 0xf1, 0x33, 0xbc, 0x0e, 0x33, 0x2e, 0x3e,
+ 0x5e, 0x22, 0x22, 0xbe, 0xab, 0x61, 0x83, 0xbd, 0xd7, 0x3a, 0x1b, 0x3c,
+ 0x7b, 0x61, 0xe3, 0x3d, 0x0c, 0x14, 0x87, 0xbd, 0x3a, 0x6d, 0xd8, 0xbd,
+ 0xeb, 0x23, 0xe0, 0x3d, 0x1d, 0xaf, 0x87, 0xbd, 0x93, 0xee, 0x4a, 0x3e,
+ 0xd7, 0xf9, 0xaa, 0xbd, 0x68, 0x83, 0x83, 0x3d, 0xd4, 0x43, 0x17, 0xbe,
+ 0xb3, 0xf1, 0x96, 0x3d, 0xdb, 0xbd, 0x0d, 0x3d, 0x41, 0x21, 0x34, 0xbd,
+ 0xca, 0x13, 0xcb, 0xbd, 0xab, 0x40, 0x00, 0x3e, 0x6d, 0x23, 0x44, 0xbd,
+ 0x27, 0x73, 0x50, 0xbe, 0x31, 0xf7, 0x04, 0x3d, 0x3b, 0x92, 0x0c, 0x3e,
+ 0xd4, 0x3f, 0xd2, 0xbd, 0x1b, 0x11, 0x16, 0x3e, 0x0a, 0x8e, 0x3c, 0x3c,
+ 0x69, 0xba, 0xcb, 0x3d, 0x24, 0xd5, 0x88, 0x3d, 0x46, 0x46, 0xc0, 0x3c,
+ 0x3a, 0x08, 0xb7, 0x3d, 0xc1, 0x3b, 0xd7, 0x3c, 0xe0, 0x5a, 0x1b, 0xbe,
+ 0x1b, 0xf6, 0xed, 0x3c, 0xc6, 0xf8, 0x22, 0x3e, 0xe6, 0xda, 0x4c, 0xbc,
+ 0x11, 0xa4, 0xb9, 0x3d, 0x1e, 0x23, 0x44, 0xbe, 0x84, 0x16, 0x27, 0x3e,
+ 0x70, 0x23, 0xcf, 0x3d, 0x1e, 0x9f, 0x98, 0xbd, 0x4b, 0xda, 0xb5, 0xbd,
+ 0x1e, 0xbb, 0xe5, 0x3c, 0xcc, 0x3c, 0xef, 0xbd, 0x5d, 0x50, 0xe3, 0x3d,
+ 0x5c, 0xd9, 0x88, 0x3d, 0xe3, 0x3a, 0x57, 0xbd, 0xcf, 0x26, 0x6f, 0x3d,
+ 0x4a, 0x52, 0x69, 0xbd, 0x36, 0x4f, 0xf5, 0xbd, 0x08, 0x79, 0xe5, 0x3c,
+ 0x78, 0xcb, 0xe7, 0x3d, 0xdb, 0x78, 0x99, 0x3d, 0x03, 0xfc, 0xcd, 0xbc,
+ 0xb9, 0xd0, 0x41, 0xbd, 0x98, 0x78, 0x51, 0xbd, 0x54, 0xde, 0x82, 0x3d,
+ 0xfe, 0xd7, 0xc6, 0xbd, 0xa3, 0x89, 0xb1, 0xbd, 0x93, 0x91, 0x18, 0xbe,
+ 0xeb, 0x2b, 0x81, 0xbe, 0xc2, 0x3b, 0x74, 0xbd, 0x0b, 0x5f, 0x32, 0x3e,
+ 0x7f, 0x62, 0x91, 0x3e, 0x4a, 0xd8, 0x23, 0xbe, 0xdd, 0xd7, 0x20, 0x3d,
+ 0x66, 0x3a, 0x51, 0xbd, 0xf0, 0xbe, 0x42, 0xbe, 0xb7, 0x3a, 0xef, 0x3d,
+ 0x6c, 0x93, 0xa0, 0xbd, 0xe0, 0x4b, 0xf9, 0x3d, 0x95, 0x21, 0xcf, 0xbe,
+ 0x78, 0x52, 0x25, 0xbe, 0x75, 0x11, 0x98, 0x3e, 0xbe, 0x8d, 0xa4, 0xbd,
+ 0xf7, 0x8b, 0x31, 0xbe, 0xee, 0x13, 0x89, 0x3d, 0x89, 0xb1, 0x5d, 0x3d,
+ 0xea, 0xec, 0x3b, 0x3d, 0xab, 0x4a, 0x36, 0xbd, 0x8c, 0xc6, 0x6d, 0xbe,
+ 0x03, 0xc8, 0x98, 0x3c, 0x2d, 0xb2, 0x82, 0x3e, 0x9d, 0x0c, 0x46, 0x3c,
+ 0xbc, 0x3c, 0x81, 0x3e, 0x69, 0x14, 0x03, 0x3e, 0xb4, 0x70, 0xb8, 0xbc,
+ 0x6d, 0xb6, 0xd2, 0x3d, 0x21, 0xec, 0x97, 0x3d, 0x1c, 0x71, 0xcb, 0xbd,
+ 0x63, 0x7c, 0xfb, 0x3d, 0x64, 0x1c, 0x71, 0xbe, 0xf0, 0x20, 0xe2, 0xbd,
+ 0xcd, 0x9c, 0x1c, 0xbd, 0x3f, 0x5c, 0x51, 0xbe, 0x07, 0xcc, 0xc7, 0xbc,
+ 0xaf, 0x6c, 0x20, 0xbd, 0xdf, 0x68, 0x07, 0xbe, 0x9c, 0xc0, 0x79, 0xbd,
+ 0x73, 0x1b, 0x7f, 0x3e, 0xdd, 0x50, 0x59, 0xbe, 0xd0, 0x11, 0x03, 0x3e,
+ 0x65, 0x23, 0x55, 0x3c, 0x29, 0xc4, 0x5a, 0xbd, 0xc5, 0x32, 0xfa, 0xba,
+ 0xa7, 0xa0, 0x12, 0xbc, 0x55, 0x2d, 0xd8, 0x3e, 0xa9, 0x60, 0x6c, 0x3e,
+ 0x9e, 0x65, 0x84, 0xbd, 0x90, 0xe8, 0x52, 0x3e, 0xd1, 0x14, 0x1e, 0xbe,
+ 0x3e, 0x9c, 0x9f, 0xbc, 0x07, 0xea, 0x84, 0xbe, 0x0a, 0xab, 0xb4, 0x3c,
+ 0xdd, 0xc5, 0xbf, 0xbd, 0x99, 0x99, 0x55, 0x3e, 0x8e, 0xa1, 0x26, 0xbe,
+ 0x40, 0x11, 0x22, 0xbd, 0x06, 0xe1, 0x37, 0x3e, 0x30, 0xcc, 0xdd, 0xbd,
+ 0xd1, 0xcb, 0x36, 0x3e, 0x78, 0x67, 0x6c, 0xbe, 0xdc, 0xc8, 0xa9, 0xbe,
+ 0x65, 0xa5, 0x25, 0x3b, 0x79, 0xe1, 0x1c, 0xbc, 0xf9, 0x50, 0x99, 0xbe,
+ 0xc5, 0x7a, 0x90, 0x3e, 0xe4, 0x68, 0xe4, 0x3d, 0x82, 0x5e, 0xcc, 0x3d,
+ 0xb5, 0x3b, 0x17, 0xbd, 0x12, 0x17, 0x40, 0xbe, 0xca, 0xdc, 0xe5, 0xbd,
+ 0xb2, 0xa0, 0x1a, 0x3e, 0x15, 0xc3, 0xf9, 0x3d, 0xfb, 0x6e, 0xa9, 0x3c,
+ 0xff, 0x55, 0x36, 0xbc, 0xf1, 0x04, 0x9e, 0x3c, 0x23, 0x88, 0xff, 0x3c,
+ 0x05, 0x23, 0x4c, 0xbc, 0x9a, 0x5c, 0x48, 0x3e, 0x91, 0xa3, 0x95, 0x3d,
+ 0xa2, 0x48, 0xa8, 0xbd, 0x41, 0x00, 0xc4, 0xbd, 0xd0, 0x26, 0xc4, 0xbd,
+ 0xa9, 0xc3, 0x4c, 0xbd, 0x8c, 0x39, 0x36, 0xbd, 0x73, 0x8a, 0x29, 0xbd,
+ 0x0c, 0x86, 0x5a, 0x3d, 0x04, 0x0e, 0xe8, 0xbe, 0x2b, 0x5c, 0xa0, 0x3d,
+ 0x43, 0x1f, 0x83, 0xbe, 0x87, 0x9d, 0x1d, 0xbe, 0xc1, 0x4d, 0x77, 0x3e,
+ 0x43, 0x9f, 0x21, 0xbd, 0x1b, 0xee, 0x8f, 0x3d, 0x92, 0x91, 0x14, 0xbe,
+ 0x5c, 0x8f, 0x17, 0xbd, 0x34, 0x72, 0x23, 0xbe, 0x08, 0xa0, 0x3b, 0x3c,
+ 0x7b, 0xf7, 0xc8, 0xbe, 0x1e, 0xf5, 0x28, 0xbe, 0x98, 0x6d, 0x0d, 0x3e,
+ 0x74, 0x5e, 0xe4, 0xbc, 0x0e, 0x5c, 0x2f, 0xbe, 0x36, 0xed, 0x32, 0xbd,
+ 0x24, 0x5c, 0x93, 0x3d, 0x00, 0x49, 0x03, 0x3b, 0x75, 0x33, 0x2b, 0x3e,
+ 0x65, 0xc7, 0xea, 0xbd, 0xe9, 0xde, 0xca, 0xbd, 0x1c, 0x14, 0xac, 0xbd,
+ 0xe3, 0x26, 0x80, 0x3c, 0x56, 0xcc, 0x81, 0xbd, 0xcc, 0xfd, 0xa1, 0x3d,
+ 0x24, 0x0d, 0x2c, 0xbe, 0xdf, 0x2a, 0x17, 0xbd, 0x31, 0xaa, 0x11, 0xbe,
+ 0xd7, 0x9a, 0x1a, 0xbd, 0x75, 0xbd, 0xc6, 0xbd, 0x06, 0x11, 0xd4, 0x3c,
+ 0xa9, 0x2b, 0x19, 0xbe, 0xed, 0xe4, 0x0e, 0xbe, 0xc3, 0x05, 0x5f, 0x3c,
+ 0x5a, 0x81, 0xfc, 0xbc, 0xb4, 0xc2, 0x1e, 0xbe, 0xda, 0x1f, 0x89, 0x3c,
+ 0xc2, 0x57, 0x29, 0xbd, 0x2c, 0x7b, 0xad, 0xbc, 0xa5, 0x87, 0xfa, 0x3d,
+ 0x09, 0xb3, 0xe3, 0xbd, 0xab, 0x3d, 0x0d, 0xbe, 0x90, 0xe5, 0x79, 0xbd,
+ 0x71, 0x25, 0x00, 0x3e, 0xf8, 0xa8, 0x95, 0x3d, 0xdd, 0x77, 0x7e, 0x3b,
+ 0x48, 0x18, 0x43, 0x3c, 0x58, 0x77, 0x48, 0x3d, 0xf9, 0x02, 0xc0, 0xbc,
+ 0xb3, 0xad, 0x8a, 0xbd, 0x54, 0xe0, 0xa6, 0xbc, 0xe1, 0x91, 0xf0, 0xbd,
+ 0x8e, 0x4b, 0xe5, 0x3d, 0xdf, 0x24, 0x3a, 0xbd, 0xd4, 0x7b, 0x4c, 0xbd,
+ 0x08, 0x14, 0x4a, 0xbd, 0xcb, 0x6a, 0xc6, 0xbb, 0xfb, 0xe3, 0x96, 0xbd,
+ 0x1f, 0x5b, 0xdd, 0xbd, 0xcd, 0x2a, 0x1b, 0x3c, 0x4b, 0x48, 0x58, 0x3d,
+ 0x0a, 0x19, 0x8d, 0x3d, 0x8b, 0xa6, 0xbf, 0x3d, 0x1a, 0x57, 0x51, 0xbc,
+ 0xc9, 0x0f, 0x0b, 0x3e, 0x5b, 0x48, 0x79, 0xbd, 0x48, 0xa1, 0xbc, 0x3d,
+ 0xd7, 0xc7, 0x03, 0xbe, 0x3b, 0x75, 0x75, 0x3d, 0x58, 0x47, 0x15, 0xbe,
+ 0x92, 0x5c, 0x5c, 0xbe, 0xb8, 0x5c, 0x05, 0xbe, 0xa4, 0x79, 0x2b, 0xbe,
+ 0x1c, 0x60, 0x11, 0x3e, 0x97, 0x43, 0x32, 0x3e, 0xc0, 0x7e, 0x12, 0xbc,
+ 0x80, 0x16, 0xde, 0xbd, 0xb2, 0xfc, 0xef, 0xbc, 0x46, 0x49, 0xc1, 0x3d,
+ 0x6e, 0xc9, 0x78, 0xbd, 0xec, 0x0c, 0xa5, 0x3c, 0x13, 0x7d, 0xe1, 0xbc,
+ 0x8f, 0xd8, 0x10, 0x3d, 0xd9, 0xf6, 0xbc, 0xbd, 0x2d, 0xe4, 0xca, 0x3c,
+ 0x46, 0x4b, 0x20, 0x3d, 0x3a, 0xd5, 0x14, 0x3e, 0xfb, 0x88, 0x6e, 0xbb,
+ 0x70, 0xe8, 0x91, 0x3c, 0x93, 0x14, 0x0b, 0xbd, 0x52, 0x0c, 0xca, 0x3c,
+ 0x64, 0x60, 0x06, 0xbd, 0x5f, 0xb2, 0x8a, 0xbd, 0xed, 0x32, 0x09, 0xbe,
+ 0x24, 0x79, 0x00, 0xbd, 0xeb, 0xbf, 0xeb, 0x3c, 0x75, 0xbf, 0xab, 0x3d,
+ 0xf4, 0xbb, 0x59, 0xbe, 0xd7, 0x25, 0xb8, 0xbd, 0x67, 0x28, 0x22, 0x3e,
+ 0xda, 0x88, 0x08, 0xbd, 0xec, 0x99, 0x9f, 0x3c, 0x88, 0x85, 0x86, 0xbd,
+ 0x0d, 0xed, 0x8a, 0x3d, 0x52, 0xaa, 0x98, 0x3d, 0x34, 0xb5, 0xda, 0x3d,
+ 0x27, 0x30, 0xe3, 0x3d, 0x39, 0xa5, 0x27, 0x3e, 0xae, 0xf2, 0x88, 0x3b,
+ 0x4c, 0x16, 0x47, 0xbc, 0x40, 0xc3, 0x13, 0x3e, 0x68, 0x70, 0x18, 0xbe,
+ 0xd7, 0x58, 0x8d, 0xbd, 0xb0, 0x05, 0xd8, 0xbd, 0x4c, 0xe2, 0xf9, 0xbd,
+ 0xd2, 0x51, 0xe2, 0x3d, 0x12, 0xe2, 0x92, 0xbe, 0xf5, 0xc7, 0x7a, 0xbd,
+ 0x7f, 0xf4, 0x5e, 0x3d, 0xab, 0x25, 0x89, 0x3c, 0x55, 0x72, 0xe0, 0x3d,
+ 0x04, 0x75, 0x59, 0xbe, 0xcf, 0xc0, 0x8e, 0x3a, 0xd1, 0x95, 0x3b, 0xbe,
+ 0x42, 0x69, 0x3c, 0xbb, 0x97, 0x72, 0xcf, 0x3d, 0x2a, 0x15, 0xea, 0x3c,
+ 0x0c, 0x46, 0xd0, 0x3d, 0x72, 0x06, 0xeb, 0xbd, 0xe5, 0xaf, 0x27, 0x3d,
+ 0xa3, 0x6e, 0x0d, 0xbe, 0x80, 0xb4, 0xdf, 0xbd, 0x77, 0xab, 0x05, 0xbe,
+ 0x2d, 0xdc, 0x86, 0xbd, 0xbf, 0x38, 0xab, 0x3b, 0x16, 0x8f, 0x1e, 0xbe,
+ 0xf2, 0x0e, 0xa0, 0x3d, 0x7e, 0xcc, 0x86, 0xbc, 0xd4, 0x7f, 0x85, 0xbd,
+ 0xee, 0x6f, 0x11, 0x3e, 0x9a, 0xe9, 0x06, 0x3e, 0x93, 0x64, 0x09, 0x3e,
+ 0x61, 0x73, 0x02, 0xbd, 0x26, 0x81, 0xa3, 0xbd, 0x02, 0x98, 0x19, 0xbe,
+ 0x50, 0xda, 0x93, 0x3d, 0x77, 0x1c, 0xce, 0x3d, 0x35, 0xa9, 0x14, 0x3e,
+ 0x16, 0xe3, 0x3f, 0x3e, 0x0a, 0xe6, 0x85, 0x3d, 0xcd, 0x5f, 0x0b, 0x3e,
+ 0xa9, 0x07, 0x27, 0x3d, 0xf3, 0x58, 0x2d, 0xbe, 0x67, 0x1c, 0x91, 0xbd,
+ 0x0c, 0xa9, 0x0b, 0x3d, 0xa3, 0xa6, 0x2b, 0xbd, 0x89, 0xe9, 0xab, 0xbd,
+ 0x17, 0x53, 0xbb, 0xbd, 0x72, 0xfc, 0x83, 0x3c, 0xb2, 0x9c, 0x4e, 0xbe,
+ 0x89, 0x6d, 0x60, 0x3e, 0xcc, 0x7f, 0x12, 0x3e, 0xef, 0xa1, 0xd2, 0x3c,
+ 0xfc, 0x8d, 0x55, 0x3d, 0x50, 0xa2, 0x43, 0xbd, 0x51, 0xe8, 0xc2, 0xbd,
+ 0x32, 0x1e, 0x2a, 0x3d, 0xb8, 0x63, 0x24, 0xbc, 0xc3, 0xd1, 0x44, 0xbd,
+ 0x5a, 0x55, 0x21, 0x3d, 0x40, 0xda, 0x8f, 0xbd, 0x91, 0xa6, 0x7f, 0x3e,
+ 0xa8, 0xd7, 0x20, 0xbe, 0x56, 0xf0, 0x2f, 0xbc, 0xe6, 0x12, 0x82, 0xbc,
+ 0xf4, 0xb8, 0x8d, 0xbd, 0x0b, 0x30, 0xf9, 0xbd, 0x9f, 0xee, 0x85, 0xbc,
+ 0x15, 0x52, 0x5c, 0xbc, 0xa4, 0x4d, 0x6d, 0x3d, 0xc0, 0x58, 0x58, 0xbe,
+ 0x92, 0x0d, 0x3d, 0xbd, 0x66, 0x97, 0x25, 0xbe, 0xfa, 0xe6, 0x58, 0x3c,
+ 0x5f, 0x15, 0x0d, 0x3d, 0x65, 0xf4, 0xef, 0xbd, 0x82, 0x6f, 0x29, 0xbe,
+ 0x22, 0x3d, 0x7f, 0xbe, 0x06, 0x7f, 0x6e, 0x3d, 0x2f, 0x3a, 0xcd, 0x3c,
+ 0x7c, 0x8c, 0xe3, 0x3d, 0x55, 0x08, 0x98, 0x3e, 0x57, 0xe9, 0x9e, 0x3d,
+ 0x8f, 0x33, 0x7c, 0xbe, 0x82, 0x9a, 0xd7, 0xbd, 0x5f, 0x37, 0xd8, 0x3d,
+ 0xb7, 0xee, 0x1c, 0x3e, 0xfa, 0x02, 0xe9, 0x3b, 0xa7, 0xdd, 0xf5, 0xbd,
+ 0xbc, 0xb1, 0xf1, 0xbd, 0x48, 0x65, 0x4e, 0x3d, 0xd8, 0x81, 0x25, 0xbd,
+ 0x02, 0x33, 0x69, 0x3e, 0xff, 0x35, 0xbd, 0xbd, 0x79, 0xa6, 0xb5, 0xbd,
+ 0x9e, 0xbd, 0x8f, 0x3c, 0x86, 0x76, 0x5a, 0xbd, 0x7c, 0x9d, 0x59, 0xbe,
+ 0xe4, 0x7f, 0x9d, 0x3e, 0x95, 0xd7, 0x3d, 0xbc, 0xdb, 0x71, 0x15, 0x3e,
+ 0xc2, 0x2a, 0xa2, 0xbd, 0x5a, 0x88, 0x16, 0xbd, 0xa1, 0x06, 0xfa, 0x3d,
+ 0x74, 0x70, 0x49, 0xbe, 0xdd, 0x10, 0x29, 0x3d, 0x02, 0x68, 0x4e, 0xbd,
+ 0x24, 0xbf, 0x08, 0x3d, 0xe4, 0xd3, 0x64, 0x3d, 0x87, 0x14, 0x6f, 0xbe,
+ 0xe2, 0x0c, 0x76, 0x3e, 0xf7, 0x00, 0xe2, 0x3d, 0xe6, 0x4d, 0xc9, 0x3c,
+ 0xbd, 0x65, 0x42, 0xbe, 0xd7, 0x60, 0x6e, 0xbc, 0x0a, 0x3e, 0x29, 0xbe,
+ 0x81, 0x27, 0x06, 0xbe, 0x47, 0x4b, 0x98, 0xbd, 0x6e, 0x9a, 0x40, 0xbe,
+ 0x27, 0x1b, 0x47, 0xbe, 0x28, 0x1e, 0x04, 0xbe, 0x65, 0x51, 0x4a, 0xbe,
+ 0x34, 0xfb, 0x16, 0x3e, 0x6d, 0x21, 0xff, 0x3c, 0x12, 0x06, 0x65, 0x3d,
+ 0xed, 0x1e, 0x23, 0x3e, 0xed, 0xc8, 0x27, 0x3e, 0xfa, 0x9d, 0x1e, 0x3d,
+ 0x1a, 0x56, 0x6f, 0x3d, 0x45, 0x0f, 0x86, 0xbe, 0x59, 0x12, 0x1a, 0xbd,
+ 0xca, 0xd7, 0xe5, 0xbd, 0xb7, 0x16, 0xf5, 0xbd, 0x31, 0xde, 0xca, 0x3d,
+ 0x9f, 0x19, 0x5f, 0x3e, 0x97, 0xb4, 0x1e, 0x3e, 0xac, 0x4a, 0x0b, 0xbe,
+ 0x44, 0xb6, 0x07, 0x3c, 0x1e, 0x75, 0x21, 0xbe, 0xed, 0x82, 0x85, 0xbe,
+ 0x2a, 0xb0, 0x53, 0xbd, 0x51, 0x65, 0x20, 0x3e, 0x58, 0x76, 0xcb, 0x3d,
+ 0xd4, 0x0b, 0x04, 0x3d, 0xff, 0xed, 0xa4, 0x3d, 0x58, 0x6b, 0x2c, 0xbe,
+ 0xf2, 0x6b, 0x7f, 0xbd, 0x27, 0x80, 0xfa, 0xbc, 0x2e, 0x79, 0x17, 0xbc,
+ 0xe5, 0x6a, 0x19, 0xbe, 0xc1, 0x2f, 0x4a, 0x3c, 0x30, 0x4a, 0x0c, 0xbe,
+ 0x03, 0xae, 0x0c, 0x3e, 0x35, 0xd3, 0x27, 0x3d, 0x7e, 0xe1, 0xbe, 0xbc,
+ 0xac, 0xaf, 0x75, 0x3d, 0xf2, 0xef, 0x91, 0x3b, 0x40, 0xbc, 0x59, 0x3e,
+ 0x6f, 0xd3, 0x07, 0xbe, 0x39, 0xeb, 0xe9, 0xbd, 0x02, 0xa3, 0x89, 0xbb,
+ 0xb3, 0xb5, 0xdf, 0x3d, 0x8a, 0xab, 0x26, 0xbd, 0xdc, 0xc0, 0xe1, 0xbb,
+ 0x3f, 0x38, 0x32, 0x3e, 0xd3, 0xff, 0xb9, 0xbd, 0xd3, 0x32, 0x0e, 0x3b,
+ 0x70, 0xbc, 0xbb, 0xbd, 0x35, 0x00, 0x8c, 0xbc, 0x2b, 0x84, 0xe6, 0xbd,
+ 0xb0, 0x29, 0xea, 0x3d, 0x49, 0x31, 0x89, 0x3d, 0xe3, 0x97, 0x08, 0xbc,
+ 0xf5, 0xbe, 0x80, 0xbd, 0xb4, 0x22, 0xbe, 0x3c, 0x50, 0xf9, 0x34, 0xbe,
+ 0x43, 0x5f, 0x97, 0xbe, 0xec, 0x1b, 0x14, 0xbe, 0x5b, 0x85, 0xb1, 0xbd,
+ 0xd7, 0x00, 0x7c, 0x3a, 0x31, 0xbe, 0x64, 0xbe, 0xd1, 0x79, 0x64, 0x3b,
+ 0x66, 0x34, 0x88, 0xbd, 0x65, 0x75, 0x29, 0xbd, 0xf4, 0x00, 0x70, 0x3d,
+ 0x85, 0x4b, 0xca, 0xbd, 0x4e, 0x0d, 0x8c, 0x3d, 0x8e, 0x8f, 0x18, 0x3c,
+ 0x37, 0x06, 0x1e, 0x3e, 0xf0, 0x96, 0xaa, 0xbd, 0x50, 0xce, 0xd5, 0x3d,
+ 0xf8, 0xca, 0xbf, 0x3d, 0x24, 0x53, 0x7c, 0xbd, 0xcd, 0xe0, 0xc9, 0xbd,
+ 0x12, 0x37, 0xf0, 0x3d, 0xa9, 0xd4, 0x61, 0x3d, 0x81, 0xd0, 0x15, 0x3e,
+ 0xc0, 0x3b, 0xe7, 0xbd, 0x81, 0x52, 0xb4, 0xbc, 0x09, 0x0a, 0x2c, 0x3e,
+ 0x90, 0x54, 0x2b, 0xbe, 0xb5, 0xcb, 0x10, 0xbd, 0xbc, 0x97, 0x0a, 0xbe,
+ 0x57, 0x56, 0x12, 0x3e, 0xba, 0x0b, 0x4a, 0x3e, 0x22, 0x1f, 0x33, 0x3d,
+ 0x50, 0xdb, 0xad, 0xbd, 0x1f, 0x71, 0x00, 0xbe, 0x5f, 0x15, 0x18, 0x3e,
+ 0x3d, 0xf2, 0x8a, 0xbc, 0xca, 0x8a, 0x0b, 0xbd, 0xf5, 0x31, 0x00, 0x3d,
+ 0xa8, 0x2f, 0xa8, 0x3d, 0xa6, 0x58, 0xcd, 0x3c, 0x14, 0x2e, 0x68, 0xbd,
+ 0x71, 0x7f, 0xdf, 0x3d, 0x62, 0x36, 0x9e, 0xbd, 0x2d, 0x70, 0x87, 0x3d,
+ 0x16, 0x1c, 0x11, 0xbd, 0xa0, 0x3e, 0x57, 0xbc, 0xed, 0xdf, 0x14, 0xbe,
+ 0xd9, 0x76, 0xb8, 0xbd, 0x83, 0x27, 0x4b, 0xbd, 0x58, 0xf0, 0xba, 0x3d,
+ 0xf6, 0xa8, 0xf8, 0xbd, 0xaf, 0xaa, 0x64, 0xbd, 0x40, 0x7b, 0x27, 0x3e,
+ 0xa5, 0xbd, 0xec, 0xbd, 0x45, 0xa0, 0x85, 0xbb, 0xf3, 0x34, 0x6a, 0xbd,
+ 0x64, 0xa0, 0xad, 0xbd, 0xca, 0x07, 0x34, 0x3e, 0x76, 0x48, 0x91, 0xbd,
+ 0x5f, 0x0d, 0x3b, 0xbe, 0x29, 0x8f, 0x02, 0x3e, 0x92, 0x5f, 0x35, 0x3e,
+ 0x93, 0x13, 0xb1, 0x3d, 0xda, 0x91, 0x77, 0xbd, 0x3c, 0x86, 0x15, 0x3e,
+ 0x76, 0xe2, 0xd7, 0x3d, 0x68, 0x64, 0x3a, 0x3e, 0x7a, 0xee, 0x7a, 0xbe,
+ 0x9b, 0xb0, 0x67, 0x3d, 0xad, 0x2a, 0x11, 0x3e, 0x35, 0x9a, 0x72, 0xbd,
+ 0xf9, 0x37, 0x0d, 0x3e, 0x50, 0x98, 0x6d, 0x3d, 0xbf, 0xd2, 0xa1, 0x3d,
+ 0xcd, 0xe7, 0x0b, 0xbe, 0x27, 0x25, 0x94, 0xbc, 0xf3, 0x61, 0x93, 0xbc,
+ 0xa7, 0xa7, 0x85, 0xbc, 0xe3, 0x87, 0x47, 0x3d, 0xb5, 0xdd, 0xab, 0xbd,
+ 0xc4, 0x36, 0xcf, 0x3d, 0x57, 0x0f, 0x2b, 0x3e, 0xd9, 0x36, 0xda, 0xbc,
+ 0x1e, 0xdf, 0x64, 0xbc, 0x90, 0x63, 0x77, 0xbe, 0x72, 0xc3, 0x09, 0xbe,
+ 0xfc, 0xd9, 0x2c, 0x3d, 0x99, 0x8b, 0x72, 0xbe, 0xde, 0xc3, 0x2b, 0x3e,
+ 0x22, 0xc4, 0x87, 0x3d, 0x99, 0xf2, 0x33, 0x3d, 0xc2, 0x2b, 0x9e, 0xbd,
+ 0xb5, 0x68, 0xfd, 0x3c, 0xcc, 0x1c, 0x03, 0xbd, 0xb4, 0x19, 0x62, 0xbd,
+ 0x50, 0x7d, 0xdc, 0x3d, 0xbb, 0xe9, 0xd6, 0x3d, 0x78, 0x3f, 0xdd, 0x3d,
+ 0x63, 0x47, 0xad, 0xbd, 0x3f, 0xe3, 0x34, 0xbe, 0x5f, 0xc6, 0x31, 0x3d,
+ 0x27, 0xfc, 0x31, 0x3d, 0x58, 0xac, 0x89, 0xbd, 0xd7, 0x28, 0xbb, 0x3d,
+ 0x83, 0x82, 0x46, 0x3d, 0x13, 0x2d, 0x98, 0xbd, 0xf9, 0x26, 0xf7, 0xbd,
+ 0x1d, 0x32, 0xaa, 0x3d, 0xcb, 0x25, 0xdb, 0xbd, 0x36, 0x83, 0x22, 0xbd,
+ 0xed, 0xa9, 0x3f, 0xbe, 0x5f, 0xcb, 0x86, 0x3d, 0xff, 0x8b, 0x97, 0x3d,
+ 0xba, 0xd5, 0xe6, 0x3d, 0xb8, 0x42, 0x41, 0xbd, 0x9f, 0x95, 0x19, 0xbe,
+ 0x83, 0xc5, 0x9a, 0x3c, 0x86, 0x29, 0x3f, 0xbd, 0x28, 0xdb, 0x06, 0xbd,
+ 0x9e, 0xab, 0x46, 0xbe, 0xf3, 0xe5, 0x83, 0xbd, 0x9d, 0xb1, 0xaf, 0x3d,
+ 0x10, 0xdb, 0x79, 0x3d, 0x6f, 0x95, 0x37, 0xbe, 0xbf, 0x32, 0x67, 0xbd,
+ 0x94, 0x49, 0xe0, 0x3d, 0xb9, 0xe6, 0x25, 0x3e, 0xcf, 0x99, 0x1e, 0xbe,
+ 0xb7, 0x8f, 0x8e, 0x3d, 0x6f, 0x0a, 0x4a, 0x3e, 0x55, 0x53, 0xf2, 0x3c,
+ 0x18, 0x68, 0x65, 0x3c, 0x0a, 0x0d, 0xb7, 0x3d, 0xc0, 0xef, 0x9e, 0x3d,
+ 0xd7, 0xa2, 0x3e, 0x3e, 0xaf, 0xc3, 0xc5, 0xbd, 0xd5, 0x38, 0xdf, 0x3d,
+ 0xe2, 0x5d, 0x5c, 0x3e, 0x50, 0x86, 0x16, 0xbe, 0x47, 0x99, 0x33, 0x3d,
+ 0x8e, 0x37, 0xe0, 0xbd, 0x99, 0x59, 0x1c, 0xbe, 0x86, 0x9e, 0xa1, 0xbc,
+ 0xe9, 0xc8, 0x48, 0xbc, 0x96, 0x41, 0x19, 0xbe, 0x86, 0x7b, 0xa1, 0xbd,
+ 0x21, 0x4e, 0x26, 0x3e, 0x51, 0x98, 0xc8, 0x3c, 0x08, 0x23, 0x07, 0xbe,
+ 0xdd, 0x2c, 0x9f, 0x3c, 0xbb, 0x9a, 0x5d, 0xbe, 0xdc, 0x73, 0x43, 0x3d,
+ 0x35, 0x68, 0xae, 0xbd, 0x8e, 0x2c, 0x20, 0x3c, 0x33, 0x91, 0x9f, 0x3d,
+ 0x66, 0x7d, 0xd4, 0xba, 0xbb, 0x43, 0xaf, 0x3d, 0xde, 0xfe, 0x87, 0x3d,
+ 0xe7, 0xbf, 0xbe, 0xbd, 0x70, 0x7e, 0x39, 0xbc, 0x6f, 0x71, 0x61, 0xbd,
+ 0x1e, 0x2f, 0x02, 0xbd, 0xd7, 0xd9, 0xf4, 0x3c, 0xfa, 0x5b, 0x03, 0xbd,
+ 0xf7, 0xcc, 0x54, 0xbd, 0x8e, 0x4a, 0x21, 0x3d, 0xd8, 0x27, 0x72, 0xbd,
+ 0xd9, 0x78, 0x20, 0xbe, 0xe3, 0x18, 0xda, 0x3d, 0x29, 0x3c, 0x73, 0x3c,
+ 0xa8, 0x58, 0xd9, 0xbc, 0xc8, 0x17, 0xc1, 0x3c, 0xfd, 0x02, 0x2c, 0x3d,
+ 0xe2, 0x7a, 0x9d, 0xbd, 0x8c, 0x6f, 0xb5, 0x3d, 0x6b, 0x11, 0x5e, 0x3d,
+ 0x59, 0x52, 0x3b, 0xbd, 0x27, 0x7e, 0xdf, 0x3c, 0x16, 0x29, 0xca, 0xbc,
+ 0x4b, 0xd5, 0x5b, 0xbc, 0xe0, 0xe7, 0x09, 0xbd, 0xf2, 0x24, 0xe9, 0x3d,
+ 0x0a, 0xc8, 0xec, 0x3d, 0xbf, 0xf8, 0xc0, 0x3d, 0x82, 0xfa, 0x44, 0xbe,
+ 0x00, 0x6a, 0xc6, 0xbd, 0x19, 0x30, 0x31, 0xbc, 0xcd, 0x90, 0x37, 0xbd,
+ 0xa3, 0xa1, 0x72, 0x3e, 0x8d, 0xc9, 0xc5, 0x3d, 0x24, 0x6c, 0x43, 0xbd,
+ 0xaf, 0x81, 0x8a, 0xbd, 0xb9, 0xd4, 0x49, 0x3d, 0xfe, 0xf3, 0x80, 0xba,
+ 0x4d, 0xcc, 0xfa, 0x3d, 0x21, 0xd4, 0x0a, 0x3e, 0x4f, 0x0f, 0xc5, 0x3c,
+ 0xf4, 0x6c, 0xda, 0x3d, 0xb7, 0xa1, 0xe8, 0x3d, 0xe5, 0x0b, 0xa8, 0xbc,
+ 0x3b, 0x86, 0x10, 0xbe, 0xae, 0xe9, 0xf9, 0xbd, 0x30, 0x4c, 0xef, 0xbd,
+ 0xcc, 0x31, 0xf4, 0xbd, 0xf6, 0x2e, 0xf1, 0xbd, 0xc3, 0x79, 0xcd, 0x3d,
+ 0x76, 0xb9, 0x4d, 0x3d, 0x4a, 0x10, 0xac, 0xbd, 0x9f, 0xd8, 0xe6, 0x3e,
+ 0xad, 0xc8, 0x45, 0xbe, 0x52, 0x8c, 0xbe, 0xbe, 0xe5, 0xdc, 0x16, 0xbe,
+ 0xb8, 0x34, 0x44, 0x3e, 0x2b, 0x74, 0x8b, 0x3d, 0x51, 0x2e, 0xc3, 0xbc,
+ 0x89, 0x17, 0x39, 0xbc, 0xde, 0xbd, 0x27, 0xbe, 0xb1, 0xb9, 0x3f, 0xbe,
+ 0xba, 0xa5, 0x97, 0xbb, 0xc6, 0x1d, 0x81, 0xbc, 0xdc, 0x2a, 0xb6, 0xbd,
+ 0xfc, 0x6b, 0x77, 0xbd, 0xec, 0x54, 0x82, 0xbc, 0x9a, 0x0e, 0xf3, 0xbe,
+ 0x5d, 0xcc, 0xb9, 0x3d, 0x22, 0xda, 0x45, 0x3e, 0x10, 0x91, 0x82, 0x3c,
+ 0x02, 0xf3, 0x51, 0x3e, 0x11, 0x2b, 0x5d, 0x3e, 0xa7, 0x71, 0x18, 0x3d,
+ 0xbd, 0x0d, 0x45, 0x3d, 0xaf, 0x14, 0xcc, 0xbd, 0xd7, 0x18, 0xc4, 0xbd,
+ 0xff, 0xd9, 0x1c, 0x3e, 0xba, 0xbe, 0x0b, 0x3e, 0xbf, 0xcd, 0xb8, 0x3d,
+ 0xc7, 0xdb, 0xac, 0xbe, 0xd9, 0xe1, 0xcf, 0xbe, 0xf0, 0xbe, 0x1e, 0xbe,
+ 0xea, 0x29, 0x10, 0x3e, 0xd3, 0xd7, 0xe0, 0x39, 0x9e, 0x19, 0x05, 0x3e,
+ 0xb0, 0x06, 0xd2, 0xbd, 0x02, 0x43, 0x9c, 0xbc, 0xfd, 0x73, 0xdd, 0x3c,
+ 0x5e, 0xe9, 0x89, 0xbc, 0x5e, 0x14, 0x0a, 0xbf, 0x9f, 0xaa, 0xbb, 0x3c,
+ 0xf3, 0x8e, 0x1a, 0xbe, 0xc5, 0x98, 0x21, 0x3d, 0xd8, 0x94, 0xb8, 0xbc,
+ 0x9a, 0x50, 0xb4, 0xbd, 0x81, 0x10, 0xce, 0x3e, 0xd4, 0x74, 0xf4, 0xbd,
+ 0x88, 0x5b, 0xbc, 0x3d, 0x35, 0x5d, 0xfa, 0x3b, 0x04, 0x57, 0xe1, 0x3b,
+ 0xad, 0x0e, 0x84, 0xbc, 0x2a, 0xa8, 0x71, 0x3e, 0x02, 0xf7, 0x01, 0x3e,
+ 0xe4, 0x98, 0x27, 0x3e, 0x85, 0x9c, 0x8b, 0xbd, 0x58, 0xf7, 0x09, 0x3e,
+ 0x21, 0x98, 0x85, 0x3e, 0xec, 0xe7, 0xea, 0x3d, 0x50, 0x4e, 0x60, 0x3c,
+ 0x8b, 0x4f, 0x37, 0x3c, 0x7f, 0x0a, 0xb3, 0xbe, 0xb9, 0xee, 0x8e, 0xbe,
+ 0xbc, 0x89, 0xe2, 0xbd, 0x49, 0x29, 0x27, 0xbe, 0xa6, 0xa0, 0x60, 0xbd,
+ 0xb0, 0xaf, 0xd6, 0xbd, 0xef, 0x8d, 0xcc, 0xbc, 0xe2, 0xb9, 0x58, 0xbd,
+ 0x6b, 0x3d, 0x53, 0x3c, 0x1b, 0xc6, 0x46, 0x3e, 0xdb, 0xa5, 0x8b, 0x3e,
+ 0xba, 0x57, 0x85, 0x3d, 0xdf, 0xce, 0x18, 0x3d, 0xbd, 0x38, 0x4d, 0x3e,
+ 0x10, 0x4a, 0x34, 0xbe, 0x6b, 0x23, 0xe5, 0x3b, 0x1b, 0x99, 0x5a, 0x3d,
+ 0xe2, 0x3c, 0xd5, 0x3d, 0x64, 0x30, 0xec, 0xbd, 0xb0, 0x85, 0x79, 0xbe,
+ 0x75, 0xb5, 0xd0, 0xbc, 0xed, 0x52, 0xf2, 0x3c, 0xda, 0x70, 0xd0, 0xbd,
+ 0x9d, 0x8a, 0x3d, 0xbc, 0x51, 0x88, 0x0c, 0xbe, 0x48, 0x64, 0xf7, 0xbd,
+ 0xc0, 0xb0, 0x15, 0x3c, 0x5f, 0x69, 0x7a, 0xbe, 0x49, 0x27, 0xd3, 0x3d,
+ 0x05, 0x70, 0x44, 0xbe, 0xed, 0x44, 0x58, 0xbd, 0x86, 0x1b, 0x06, 0x3e,
+ 0x15, 0x94, 0x23, 0x3e, 0x92, 0xeb, 0x32, 0x3b, 0x72, 0xa8, 0xbc, 0xbb,
+ 0x60, 0x03, 0xb1, 0x3d, 0x54, 0xf1, 0x01, 0x3d, 0x54, 0x14, 0xa7, 0xbc,
+ 0xbb, 0xcd, 0x1f, 0x3e, 0x04, 0xc7, 0xd8, 0x3d, 0xad, 0x1b, 0x94, 0xbe,
+ 0x55, 0x3e, 0x19, 0x3e, 0x14, 0xaa, 0xd2, 0xbc, 0x45, 0x30, 0xfd, 0x3c,
+ 0x2d, 0x14, 0x28, 0x3e, 0x5a, 0x87, 0x10, 0x3e, 0xc7, 0xbe, 0x9d, 0xbc,
+ 0x84, 0x2f, 0x28, 0xbd, 0xc1, 0x7b, 0x6a, 0x3e, 0xd1, 0x41, 0x8f, 0x3d,
+ 0x93, 0xca, 0xbb, 0x3d, 0xa6, 0x97, 0x0a, 0xbe, 0x1e, 0x1f, 0xcd, 0xbd,
+ 0xcf, 0x1c, 0x27, 0xbd, 0x80, 0x5c, 0x80, 0xbe, 0x8b, 0x3f, 0x69, 0x3e,
+ 0xa3, 0xfa, 0x51, 0x3d, 0xe3, 0x4f, 0xed, 0x3d, 0x55, 0x1f, 0x12, 0xbd,
+ 0x8e, 0x55, 0xe0, 0xbd, 0xd4, 0x3d, 0x8c, 0xbd, 0xc0, 0x1c, 0x41, 0x3c,
+ 0x26, 0x49, 0x2d, 0xbd, 0xed, 0x72, 0xbb, 0x3d, 0x47, 0x2d, 0x9c, 0x3c,
+ 0x0f, 0x3b, 0x70, 0xbc, 0xd7, 0x0b, 0xaf, 0xbd, 0x7f, 0x0f, 0x5c, 0x3d,
+ 0xde, 0x91, 0xa0, 0xbc, 0x5b, 0xef, 0xcd, 0xbd, 0x64, 0xee, 0x69, 0xbd,
+ 0x1a, 0x65, 0xe3, 0xbd, 0x62, 0x5e, 0x81, 0xbd, 0x68, 0x34, 0x01, 0x3e,
+ 0xf9, 0xd4, 0x36, 0xbd, 0xe1, 0x22, 0xb6, 0x3d, 0xaf, 0x58, 0x52, 0xb9,
+ 0xc8, 0xed, 0x74, 0xbe, 0x5d, 0x62, 0xc5, 0x3d, 0xe7, 0x2e, 0x0d, 0x3e,
+ 0xdc, 0x13, 0x53, 0x3d, 0xa9, 0xa0, 0x16, 0xbe, 0x1e, 0xf1, 0xf6, 0x3b,
+ 0xf1, 0x12, 0x26, 0x3e, 0xd9, 0xda, 0x35, 0x3c, 0x1d, 0xf9, 0x38, 0x3e,
+ 0x67, 0xf8, 0xc0, 0x3c, 0xb5, 0xf4, 0x5d, 0xbd, 0x30, 0xd6, 0x17, 0xbd,
+ 0x8e, 0x30, 0xa7, 0x3c, 0x94, 0xad, 0xd1, 0xbd, 0xca, 0x76, 0x84, 0xbd,
+ 0x56, 0x1c, 0x14, 0xbe, 0x16, 0xe6, 0x74, 0x3c, 0xb6, 0x27, 0xa8, 0xbc,
+ 0x25, 0xcf, 0xc7, 0x3b, 0xd1, 0x48, 0xef, 0x3c, 0x40, 0xbe, 0x16, 0xbe,
+ 0x38, 0x55, 0xf9, 0x3d, 0x52, 0xbd, 0x05, 0x3e, 0x14, 0x25, 0xad, 0xbd,
+ 0x36, 0x55, 0x94, 0x3d, 0xf2, 0x90, 0xa0, 0x3c, 0x49, 0x48, 0xe9, 0xbc,
+ 0x24, 0x2d, 0xf8, 0x3d, 0x77, 0x06, 0xff, 0x3a, 0xaf, 0xa9, 0xb9, 0x3d,
+ 0x99, 0xd6, 0x6f, 0xbd, 0x9c, 0xa2, 0x88, 0x3d, 0x23, 0x8d, 0xee, 0xbd,
+ 0xe5, 0xfe, 0x3c, 0xbd, 0xce, 0xbc, 0x51, 0x3d, 0x5b, 0xe3, 0x6d, 0xbe,
+ 0x08, 0x1d, 0xfd, 0x3d, 0x6e, 0x45, 0x00, 0xbd, 0x73, 0x94, 0x20, 0xbe,
+ 0x43, 0xa7, 0x13, 0xbe, 0xcf, 0x76, 0x07, 0xbe, 0x2b, 0x28, 0x6d, 0xbd,
+ 0x03, 0x86, 0x28, 0x3e, 0xe5, 0x6b, 0x15, 0xbe, 0x3e, 0x20, 0x20, 0xbd,
+ 0x5a, 0x28, 0x3d, 0x3e, 0xd6, 0x64, 0x1f, 0xbd, 0xaf, 0x8a, 0xc7, 0x3d,
+ 0xa1, 0xd5, 0xc2, 0xbd, 0x98, 0xcd, 0x1f, 0x3d, 0x71, 0x45, 0x48, 0xbe,
+ 0xba, 0x31, 0x34, 0x3d, 0x90, 0x85, 0x92, 0xbc, 0xda, 0xc3, 0x60, 0xbe,
+ 0xea, 0x57, 0x0d, 0x3d, 0xff, 0x5f, 0xd3, 0x3d, 0xfc, 0x0c, 0x89, 0xbd,
+ 0x77, 0xf5, 0xff, 0x3d, 0x4f, 0xe8, 0x28, 0x3d, 0xa5, 0x1b, 0x7c, 0xbd,
+ 0x2d, 0xba, 0x91, 0xbd, 0x7f, 0xb0, 0xaa, 0xbd, 0x30, 0x20, 0xb0, 0x3c,
+ 0x70, 0x89, 0xc0, 0x3c, 0x2f, 0x52, 0x09, 0x3e, 0x3f, 0x82, 0x1f, 0x3d,
+ 0xda, 0xc6, 0x89, 0xbd, 0x90, 0xa1, 0x20, 0x3e, 0xad, 0x87, 0x80, 0xbd,
+ 0x01, 0x55, 0x77, 0x3d, 0x4b, 0x83, 0x87, 0xbd, 0x38, 0xd7, 0xc7, 0xbd,
+ 0x83, 0x68, 0xb2, 0x3d, 0x88, 0x75, 0xb4, 0x3d, 0xdf, 0xb5, 0x17, 0xbe,
+ 0x33, 0xd1, 0xad, 0x3d, 0xbf, 0x18, 0x01, 0xbd, 0xd1, 0xca, 0x19, 0xbd,
+ 0x7e, 0xae, 0x24, 0xbd, 0xe0, 0xeb, 0xaa, 0x3d, 0xb6, 0x6e, 0xcf, 0x3c,
+ 0x11, 0x9f, 0xfc, 0x3d, 0xed, 0xfd, 0x5b, 0x3c, 0x2c, 0x35, 0x22, 0x3e,
+ 0x1e, 0x69, 0x83, 0x3d, 0x83, 0x64, 0x10, 0xbe, 0x5b, 0x4e, 0x61, 0xbd,
+ 0x0c, 0xf8, 0xf0, 0x3b, 0xc7, 0x4b, 0x46, 0x3d, 0x9d, 0x8c, 0x85, 0x3d,
+ 0x04, 0x06, 0x69, 0xbb, 0x0b, 0x86, 0x19, 0xbd, 0xf3, 0x36, 0x20, 0xbe,
+ 0xad, 0x7e, 0x4b, 0x3d, 0x90, 0xa1, 0x45, 0xbe, 0xa0, 0xae, 0x1b, 0x3d,
+ 0xd0, 0x75, 0xd8, 0xba, 0x12, 0x03, 0x92, 0xbd, 0x15, 0x83, 0x6c, 0xbb,
+ 0x36, 0x9f, 0xb5, 0xbd, 0xfb, 0xdd, 0x29, 0x3e, 0xa1, 0x5e, 0x38, 0xbd,
+ 0x74, 0x1a, 0xfe, 0x3d, 0xf9, 0xc6, 0x18, 0xbe, 0xca, 0x9a, 0x9a, 0x3b,
+ 0x62, 0x90, 0x86, 0x3d, 0x7d, 0x2f, 0xaf, 0xbd, 0xb3, 0x3d, 0xc8, 0x3d,
+ 0xa2, 0xd8, 0xcd, 0xbd, 0x2e, 0x7c, 0x00, 0x3d, 0x58, 0x46, 0x04, 0x3e,
+ 0x91, 0xd8, 0x83, 0x3d, 0x8b, 0xaa, 0xc0, 0xbd, 0xd3, 0xab, 0xdb, 0x3c,
+ 0xc1, 0x07, 0x52, 0xbe, 0xf2, 0xac, 0x6f, 0x3e, 0x1c, 0x65, 0x0b, 0xbe,
+ 0x60, 0x9a, 0x18, 0xbe, 0xb5, 0xb7, 0x3b, 0xbc, 0x5e, 0x92, 0x0a, 0xbe,
+ 0x96, 0x2d, 0xb5, 0x3d, 0x61, 0xc9, 0x19, 0x3d, 0x9a, 0xd3, 0xbf, 0xbc,
+ 0x71, 0xb4, 0x88, 0x3b, 0x7f, 0xf1, 0x5c, 0x3c, 0x67, 0x6b, 0x7b, 0xbd,
+ 0xc4, 0x58, 0xc5, 0xbd, 0x87, 0x7f, 0x13, 0xbe, 0xbb, 0x9f, 0xc8, 0x3d,
+ 0xd5, 0x5c, 0x3a, 0xbe, 0x74, 0x73, 0x5d, 0xbe, 0x87, 0x60, 0x3b, 0xbd,
+ 0xad, 0x55, 0x0c, 0xbe, 0x85, 0x83, 0xbd, 0x3c, 0x6a, 0x1e, 0x8a, 0x3c,
+ 0xb2, 0x83, 0x2b, 0x3e, 0x60, 0x4a, 0x0a, 0x3d, 0x23, 0x91, 0x23, 0xbd,
+ 0x52, 0xd2, 0x30, 0x3c, 0x84, 0x9b, 0x9f, 0xbd, 0x3a, 0x62, 0x8d, 0x3e,
+ 0x4a, 0x37, 0xcf, 0x3d, 0x91, 0x8b, 0x99, 0xbd, 0x98, 0xaf, 0x99, 0x3d,
+ 0x46, 0x9f, 0x5a, 0xbc, 0x72, 0xa0, 0x82, 0xbd, 0x56, 0x19, 0x82, 0x3d,
+ 0x52, 0x94, 0xe9, 0x3d, 0x62, 0x76, 0x1a, 0x3e, 0x6a, 0xb5, 0xe3, 0x3d,
+ 0x3e, 0x95, 0x48, 0xbe, 0x1a, 0xd8, 0xfb, 0x3d, 0xbc, 0x51, 0x8f, 0xbe,
+ 0x2a, 0x0a, 0x6e, 0x3d, 0xd7, 0x40, 0x5b, 0x3d, 0x51, 0xb0, 0x0d, 0xbe,
+ 0x8d, 0xba, 0x4a, 0xbc, 0xae, 0x55, 0xa9, 0x3d, 0x0b, 0x14, 0xf0, 0x3c,
+ 0x95, 0xa5, 0x82, 0xbc, 0x64, 0xdd, 0x81, 0xbd, 0x84, 0xd7, 0x32, 0x3d,
+ 0x56, 0x11, 0x57, 0x3e, 0x77, 0x69, 0x18, 0x3c, 0x0e, 0xda, 0x24, 0xbe,
+ 0xcd, 0xd7, 0x8f, 0x3e, 0x31, 0x6d, 0x18, 0xbe, 0x62, 0xc3, 0xcd, 0x3d,
+ 0x2f, 0xb6, 0xbf, 0x3c, 0x12, 0x19, 0xd2, 0x3d, 0xc3, 0x79, 0x35, 0x3d,
+ 0xa1, 0x70, 0x1b, 0xbe, 0xb0, 0x58, 0xa7, 0x3c, 0x54, 0x37, 0x03, 0x3e,
+ 0x72, 0x6a, 0x2d, 0x3d, 0x62, 0xb7, 0xe9, 0x3d, 0x16, 0xc8, 0x75, 0x3d,
+ 0x68, 0x99, 0x4e, 0x3e, 0xf4, 0x06, 0x42, 0x3d, 0x1f, 0x5c, 0xb6, 0x3d,
+ 0xff, 0xb6, 0x88, 0xbd, 0x29, 0x06, 0x6b, 0xbd, 0x60, 0x82, 0xd4, 0xbd,
+ 0x0a, 0x8d, 0x0c, 0xbe, 0x15, 0x7f, 0x08, 0xbe, 0x7d, 0x4c, 0x8f, 0xbd,
+ 0x05, 0x55, 0x6e, 0xbd, 0x7c, 0x05, 0xa6, 0x3d, 0x97, 0xd2, 0x2a, 0xbe,
+ 0x51, 0x54, 0x5f, 0xbd, 0x88, 0xbd, 0x0b, 0x3e, 0xdf, 0xb2, 0x87, 0xbd,
+ 0x84, 0x30, 0xd6, 0x3d, 0x82, 0x4f, 0x09, 0x3e, 0x5c, 0x89, 0x34, 0x3a,
+ 0x7c, 0x7e, 0x18, 0x3e, 0x41, 0x7b, 0xc8, 0xbd, 0x2c, 0xac, 0xbf, 0x3c,
+ 0x41, 0x87, 0x04, 0x3e, 0x23, 0x0f, 0xdd, 0xbc, 0x3f, 0x9b, 0x03, 0x3e,
+ 0x53, 0xdc, 0x1f, 0x3d, 0x35, 0x1c, 0xf5, 0x3d, 0x92, 0x0a, 0x82, 0xbd,
+ 0x5c, 0x2d, 0xcb, 0x3d, 0x19, 0xd5, 0xcd, 0xbd, 0x3a, 0x31, 0x03, 0xbd,
+ 0x52, 0x8c, 0xc2, 0x3d, 0x68, 0x3d, 0x24, 0x3e, 0x08, 0xf4, 0x15, 0xbe,
+ 0x0f, 0x61, 0xdb, 0x3d, 0x4b, 0x03, 0xf2, 0xbd, 0xd2, 0x70, 0x8c, 0xbe,
+ 0xee, 0x57, 0xae, 0xbc, 0x90, 0xd9, 0xaf, 0x3c, 0x29, 0xca, 0x82, 0xbc,
+ 0xbf, 0xc1, 0xf3, 0xbb, 0x09, 0xec, 0x86, 0x3b, 0x14, 0x18, 0x98, 0x3d,
+ 0x26, 0x37, 0xed, 0x3d, 0x5e, 0x77, 0xde, 0xbd, 0x6c, 0x6f, 0x61, 0x3e,
+ 0xfd, 0x35, 0xa1, 0xbd, 0x33, 0x23, 0xfb, 0xbd, 0x2f, 0xbf, 0xab, 0xbc,
+ 0xee, 0xda, 0xc9, 0xbd, 0xa3, 0x8b, 0x0a, 0xbd, 0x11, 0x77, 0x02, 0x3d,
+ 0xe5, 0xc7, 0x00, 0x3e, 0xbd, 0x90, 0xf8, 0xbd, 0x13, 0x3a, 0x88, 0x3d,
+ 0xca, 0x6d, 0xa3, 0x3d, 0x34, 0x6a, 0x36, 0x3e, 0x3b, 0xae, 0x63, 0xbd,
+ 0x93, 0xed, 0x45, 0xbd, 0xd6, 0x46, 0xcb, 0x3d, 0xaf, 0xda, 0x81, 0x3c,
+ 0x37, 0x2e, 0xf3, 0x3d, 0xbc, 0x54, 0xe8, 0xbd, 0xf9, 0x44, 0xa3, 0xbd,
+ 0x42, 0x57, 0x12, 0xbe, 0x2f, 0xe8, 0x9e, 0xbd, 0x13, 0x19, 0xa1, 0xbc,
+ 0x66, 0xb6, 0x49, 0xbe, 0x43, 0x04, 0xa1, 0xbd, 0xf2, 0xfd, 0xc1, 0x3d,
+ 0xc7, 0x3c, 0xc9, 0xbd, 0xf5, 0x81, 0xa7, 0xbb, 0x97, 0x4e, 0x9e, 0xbd,
+ 0xd2, 0x01, 0xe6, 0xbc, 0x96, 0xc7, 0xff, 0xbb, 0x5a, 0x4d, 0xa0, 0x3d,
+ 0x7b, 0xb1, 0x01, 0xbd, 0x11, 0xd0, 0x5d, 0x3e, 0xe3, 0x10, 0xba, 0x3d,
+ 0x71, 0x19, 0x9c, 0xbc, 0x84, 0x59, 0x02, 0x3d, 0x52, 0x00, 0x0c, 0x3e,
+ 0xb7, 0x48, 0xc0, 0x3d, 0x90, 0x9c, 0x3e, 0xbd, 0x27, 0x39, 0xd4, 0x3d,
+ 0xa8, 0x43, 0x1f, 0x3d, 0xf2, 0xa4, 0xec, 0xbb, 0x73, 0x27, 0x03, 0x3e,
+ 0x51, 0xcb, 0xef, 0xbd, 0x55, 0xeb, 0xa2, 0xbd, 0x2d, 0x1b, 0x80, 0xbc,
+ 0x74, 0x3f, 0x98, 0x3d, 0x23, 0xa8, 0xe7, 0x3d, 0xd5, 0x73, 0x27, 0xbd,
+ 0xbb, 0x7d, 0xa3, 0x3d, 0xb4, 0x1d, 0xdf, 0x3d, 0xc7, 0xe0, 0x83, 0xbd,
+ 0x03, 0xdf, 0x04, 0x3e, 0xdc, 0xdd, 0x91, 0xbc, 0xdc, 0x86, 0x8f, 0xbd,
+ 0xc7, 0xc2, 0x20, 0xbd, 0x9f, 0x56, 0x62, 0xbb, 0x16, 0xe7, 0xe2, 0x3c,
+ 0x0e, 0xe9, 0xab, 0xbd, 0xd4, 0x2d, 0x00, 0x3d, 0xcb, 0x44, 0x37, 0xbe,
+ 0x4f, 0x0b, 0x63, 0x3d, 0x52, 0x3e, 0x92, 0xbd, 0x8f, 0x54, 0xe1, 0xbd,
+ 0x86, 0x83, 0xc0, 0xbc, 0x4b, 0x3b, 0xaa, 0x3d, 0x74, 0xc8, 0x3c, 0x3d,
+ 0x18, 0x06, 0x1b, 0xbe, 0xe5, 0x7c, 0x99, 0x3d, 0x47, 0x9f, 0x07, 0x3d,
+ 0x5f, 0xd7, 0xfe, 0xbd, 0x1d, 0xcb, 0x42, 0x3d, 0x61, 0x3c, 0x29, 0x3e,
+ 0x91, 0xd9, 0xa1, 0x3d, 0x84, 0xd4, 0x04, 0xbe, 0xc3, 0x13, 0xfe, 0xbc,
+ 0xd3, 0xed, 0x0b, 0xbe, 0x02, 0x1f, 0x8a, 0x3d, 0xc8, 0x49, 0xad, 0x3d,
+ 0xe7, 0x73, 0x41, 0x3c, 0xf4, 0xd5, 0x64, 0x3d, 0xdd, 0x0e, 0xbd, 0x3d,
+ 0x56, 0xf7, 0xff, 0x3d, 0xd7, 0xd8, 0xcd, 0x3d, 0xd5, 0x63, 0xfe, 0x3c,
+ 0x05, 0x33, 0x1e, 0x3d, 0x45, 0x95, 0xab, 0x3d, 0x7d, 0x54, 0x7e, 0xbd,
+ 0xc9, 0x08, 0x5d, 0xbe, 0xde, 0x71, 0xee, 0xbc, 0x9a, 0x14, 0xda, 0x3d,
+ 0xa3, 0x36, 0xb4, 0x3e, 0x6b, 0x30, 0xc2, 0x3c, 0x22, 0x6d, 0xeb, 0xbc,
+ 0x37, 0x4d, 0xc2, 0x3c, 0xfe, 0xde, 0xd0, 0xbd, 0x52, 0x80, 0xdc, 0x3c,
+ 0x15, 0xbc, 0x1e, 0x3d, 0x99, 0xb7, 0x94, 0xbd, 0x47, 0x04, 0x3b, 0x3e,
+ 0xc6, 0xd7, 0xed, 0x3d, 0xa1, 0x31, 0x2c, 0x3d, 0xda, 0xac, 0x8a, 0xbc,
+ 0xc4, 0x81, 0x79, 0xbd, 0xc7, 0xaf, 0x76, 0xbd, 0x5d, 0x9f, 0x9e, 0x3d,
+ 0x1a, 0x53, 0x2e, 0xbe, 0x21, 0x97, 0x1a, 0xbe, 0x04, 0x73, 0x08, 0x3e,
+ 0xcf, 0x16, 0x10, 0xbd, 0x2d, 0x72, 0x4a, 0x3d, 0x1d, 0x9b, 0x15, 0xbd,
+ 0x70, 0x5c, 0xa4, 0x3c, 0xca, 0xe0, 0xf7, 0xbc, 0xce, 0xa8, 0xf0, 0xbd,
+ 0xe9, 0x73, 0x7a, 0x3d, 0xc1, 0xc5, 0x30, 0xbd, 0x4a, 0x73, 0x12, 0xbd,
+ 0x5a, 0xdb, 0xa0, 0x3d, 0xe6, 0x11, 0x96, 0xbd, 0xe2, 0xfd, 0x80, 0x3d,
+ 0xb1, 0x27, 0x96, 0xbd, 0xbe, 0xd1, 0x82, 0xbd, 0x72, 0x19, 0x85, 0x3d,
+ 0xf6, 0x08, 0x5f, 0x3d, 0x20, 0x24, 0xbf, 0x3b, 0x7c, 0xbe, 0xac, 0xbd,
+ 0x6b, 0x39, 0xd2, 0x3b, 0x07, 0xf3, 0xeb, 0x3d, 0x0f, 0x83, 0x13, 0xbe,
+ 0xbd, 0x9b, 0x83, 0x3a, 0xd2, 0x4a, 0x0a, 0x3e, 0x44, 0x00, 0xea, 0x3b,
+ 0x82, 0x60, 0xd9, 0xbd, 0x03, 0x00, 0xce, 0xbd, 0xc4, 0xb4, 0x07, 0xbe,
+ 0xbd, 0xbc, 0x47, 0xbb, 0x2a, 0x75, 0x46, 0x3c, 0xe6, 0xe3, 0xcf, 0x3d,
+ 0xab, 0x94, 0xe9, 0x3c, 0x4c, 0x6e, 0xef, 0x3d, 0x01, 0xde, 0x13, 0xbe,
+ 0x56, 0x9c, 0x94, 0xbd, 0x18, 0x86, 0x34, 0xbd, 0x76, 0xc2, 0xe2, 0x3d,
+ 0xe7, 0x8b, 0x02, 0xbc, 0xec, 0x92, 0x1e, 0x3b, 0xb4, 0x22, 0x02, 0x3d,
+ 0x31, 0x4d, 0x08, 0x3e, 0x8e, 0xe6, 0x02, 0x3e, 0x60, 0x4a, 0xf6, 0x3c,
+ 0xef, 0xfc, 0x1d, 0xbd, 0xa5, 0xbc, 0xef, 0xbd, 0x8b, 0xb3, 0xda, 0xbc,
+ 0xc5, 0xe6, 0xd6, 0xbd, 0x68, 0x01, 0x81, 0xbc, 0x6e, 0xbc, 0x02, 0xbe,
+ 0xf0, 0xac, 0x0a, 0xbd, 0xde, 0x53, 0xd1, 0x3d, 0xb1, 0xbb, 0xc4, 0xbc,
+ 0x91, 0xd6, 0x25, 0x3d, 0x53, 0xf8, 0xe8, 0xbb, 0x78, 0x50, 0x47, 0x3d,
+ 0x90, 0xb4, 0xc1, 0x3d, 0xfb, 0xf2, 0x6a, 0xbd, 0x97, 0x9d, 0x22, 0xbe,
+ 0x22, 0x5b, 0x34, 0x3e, 0x5a, 0x9d, 0xcd, 0xbd, 0xda, 0x17, 0xcd, 0xbd,
+ 0x1d, 0x74, 0xfa, 0x3d, 0x47, 0x20, 0x16, 0xbe, 0x07, 0x7b, 0x12, 0x3e,
+ 0x34, 0xbf, 0x1e, 0xbe, 0x94, 0x25, 0x54, 0x3d, 0xf0, 0x86, 0x3d, 0x3e,
+ 0x45, 0x24, 0x3a, 0xbe, 0xe0, 0xed, 0xd4, 0x3d, 0xea, 0xcc, 0x8e, 0xbd,
+ 0x71, 0x08, 0x77, 0x3d, 0x99, 0xe7, 0xdf, 0xbc, 0x32, 0x8a, 0x6b, 0xbd,
+ 0x95, 0xd8, 0x39, 0xbc, 0x8d, 0x83, 0x89, 0xbd, 0xe2, 0x12, 0x2a, 0x3d,
+ 0xe7, 0x42, 0xc8, 0xbd, 0x14, 0x72, 0x88, 0x3d, 0x3f, 0xeb, 0xaf, 0xbd,
+ 0xda, 0x3b, 0x78, 0xbd, 0xbd, 0xc0, 0x78, 0xbd, 0x27, 0xd1, 0x84, 0x3e,
+ 0x24, 0x4c, 0x24, 0x3d, 0x0b, 0xd3, 0xb3, 0x3d, 0x87, 0xac, 0x21, 0xbd,
+ 0x5f, 0x5d, 0xf0, 0xbd, 0xc0, 0xf1, 0x02, 0x3c, 0xdb, 0xe9, 0xa2, 0xbc,
+ 0x8f, 0x0f, 0x1d, 0x3d, 0x7f, 0xc4, 0xaa, 0xbd, 0x19, 0x9b, 0x26, 0xbd,
+ 0xe3, 0xe6, 0x84, 0xbd, 0x97, 0xb5, 0xfa, 0x3c, 0xc5, 0xf2, 0xcd, 0xbc,
+ 0x07, 0xbe, 0x9f, 0xbd, 0xcd, 0x44, 0xa2, 0xbb, 0x1e, 0x6c, 0xe0, 0xbd,
+ 0x4e, 0x07, 0x6d, 0xbd, 0x63, 0x28, 0x65, 0x3d, 0x89, 0x47, 0x04, 0x3e,
+ 0x48, 0xfd, 0xe2, 0x3d, 0x49, 0x73, 0xf7, 0x3c, 0xcb, 0x1e, 0x81, 0xbd,
+ 0xa4, 0xeb, 0x91, 0xbd, 0x6e, 0x3a, 0xde, 0xbd, 0x91, 0xae, 0x6c, 0xbd,
+ 0xa0, 0xed, 0xcf, 0xbd, 0xb7, 0xa8, 0x6a, 0xbd, 0x71, 0xe8, 0x28, 0x3e,
+ 0x1a, 0xec, 0x84, 0x3c, 0x10, 0xff, 0x90, 0x3d, 0x09, 0x2d, 0x74, 0x3e,
+ 0x74, 0xe4, 0x58, 0x3d, 0xa1, 0x4f, 0x1e, 0xbd, 0x68, 0xe3, 0x0a, 0x3e,
+ 0xfa, 0xc8, 0x2d, 0xbe, 0xea, 0x63, 0x19, 0xbe, 0x84, 0xfb, 0x11, 0xbc,
+ 0x15, 0xc9, 0x8e, 0x3c, 0x9a, 0x51, 0xcb, 0xbd, 0xab, 0xb4, 0x53, 0x3e,
+ 0x9c, 0xc3, 0x22, 0xbe, 0x23, 0x7c, 0x78, 0x3e, 0x05, 0xb5, 0xd0, 0xbd,
+ 0xd8, 0xf4, 0x55, 0x3d, 0x62, 0x60, 0x14, 0xbe, 0x77, 0xa4, 0x3e, 0xbd,
+ 0x55, 0x2e, 0x8e, 0x3e, 0x55, 0xb7, 0xfc, 0x3c, 0x55, 0xef, 0x67, 0xbd,
+ 0xac, 0x79, 0xc5, 0x3d, 0x0e, 0x99, 0x1c, 0xbd, 0xbf, 0x50, 0x5f, 0x3d,
+ 0xc9, 0x00, 0x3f, 0xbb, 0xcf, 0xb1, 0x0b, 0xbe, 0x23, 0x0a, 0x78, 0xbe,
+ 0x02, 0xdc, 0x52, 0xbe, 0x22, 0xfa, 0x3b, 0x3e, 0x42, 0x47, 0xf9, 0xbd,
+ 0xdc, 0xe7, 0x50, 0xbe, 0x69, 0x98, 0x23, 0x3e, 0x96, 0x32, 0x1d, 0x3e,
+ 0x04, 0xa4, 0x90, 0x3d, 0x8f, 0x14, 0x79, 0xbd, 0x34, 0x0d, 0xa4, 0xbd,
+ 0x57, 0x34, 0xad, 0x3e, 0x4b, 0xe2, 0x8e, 0x3c, 0xe6, 0xb9, 0x3a, 0x3d,
+ 0xa6, 0x07, 0x70, 0x3e, 0x22, 0xfd, 0xc7, 0x3c, 0xc6, 0x3e, 0xc1, 0x3e,
+ 0x78, 0xe9, 0x4f, 0xbe, 0x74, 0xe3, 0xf9, 0xbc, 0x19, 0x71, 0x2a, 0xbd,
+ 0x17, 0xd1, 0x07, 0x3c, 0x50, 0x86, 0x57, 0xbe, 0x5b, 0x19, 0x03, 0xbe,
+ 0x16, 0x09, 0x6c, 0x3d, 0xe5, 0x71, 0xa8, 0xbe, 0x81, 0x4f, 0x9f, 0xbe,
+ 0x7c, 0x2c, 0x29, 0xbe, 0x40, 0x27, 0x35, 0xbe, 0x68, 0x58, 0xb2, 0xbd,
+ 0x41, 0x83, 0x4c, 0x3e, 0xe1, 0x7d, 0xa3, 0xbe, 0x10, 0xb9, 0xa9, 0xbd,
+ 0x03, 0x6e, 0x6e, 0xbe, 0x9a, 0xa2, 0xcc, 0xbd, 0x15, 0x47, 0xee, 0xba,
+ 0xe0, 0x01, 0x67, 0x3e, 0x29, 0x19, 0xcf, 0x3e, 0xf9, 0xef, 0x48, 0x3e,
+ 0x43, 0x58, 0x29, 0xbd, 0xdc, 0x51, 0x26, 0xbe, 0x59, 0x08, 0x21, 0xbc,
+ 0xec, 0x3a, 0xbe, 0xbd, 0x24, 0xb9, 0x00, 0xbf, 0xa3, 0x71, 0x82, 0x3c,
+ 0x50, 0x07, 0x52, 0xbd, 0x52, 0xbe, 0x0a, 0x3e, 0x77, 0x76, 0xf3, 0xbd,
+ 0xad, 0xe6, 0x60, 0x3e, 0x7a, 0xf9, 0xd4, 0xbd, 0x27, 0x50, 0x60, 0xbe,
+ 0xc2, 0x4c, 0x91, 0x3e, 0xca, 0xec, 0x65, 0xbe, 0x8b, 0x58, 0x6a, 0xbe,
+ 0x50, 0x85, 0x3a, 0x3e, 0x45, 0x17, 0x0d, 0xbe, 0xd3, 0xd7, 0x49, 0xbe,
+ 0xca, 0x1a, 0x20, 0xbe, 0x95, 0x43, 0x8c, 0x3c, 0x69, 0x9c, 0x0e, 0x3e,
+ 0xf8, 0x09, 0x49, 0xbe, 0x5b, 0x4f, 0x45, 0xbe, 0xa8, 0x93, 0x15, 0xbd,
+ 0xba, 0xc1, 0x5d, 0x3e, 0x58, 0x86, 0xc2, 0x3d, 0x7e, 0x4b, 0x99, 0xbe,
+ 0x2a, 0xea, 0x8a, 0x3e, 0x3e, 0x28, 0x9a, 0xbd, 0xd2, 0xbb, 0x33, 0x3c,
+ 0xfc, 0xb0, 0x66, 0xbe, 0xcb, 0xb0, 0xd7, 0xbc, 0xe8, 0x96, 0x43, 0xbe,
+ 0x9e, 0xbe, 0x3f, 0xbd, 0x07, 0x7b, 0xec, 0xbd, 0x2d, 0x25, 0x3a, 0xbe,
+ 0x13, 0x9c, 0xe3, 0xbd, 0x43, 0xcc, 0x02, 0x3d, 0x90, 0xca, 0xcf, 0xbe,
+ 0x2a, 0xcb, 0x2a, 0x3e, 0x73, 0xbc, 0x09, 0x3e, 0x9e, 0xa9, 0x64, 0x3e,
+ 0xee, 0xb2, 0x36, 0xbe, 0x06, 0xb6, 0xf3, 0xbd, 0x47, 0x75, 0x1b, 0x3e,
+ 0x11, 0xab, 0x2b, 0x3d, 0xdb, 0x09, 0x3a, 0xbe, 0x64, 0x8e, 0x7e, 0xbd,
+ 0xa1, 0x6a, 0x7e, 0xbd, 0x99, 0x51, 0xa1, 0x3d, 0x8e, 0x70, 0x04, 0x3e,
+ 0xcd, 0xd8, 0x0f, 0xbf, 0xbb, 0x44, 0xaf, 0x3d, 0x56, 0xbc, 0xb3, 0x3d,
+ 0xbf, 0xb9, 0x9b, 0xbc, 0xcc, 0xf0, 0x6e, 0xbe, 0x90, 0x0b, 0x7c, 0xbe,
+ 0xce, 0x2e, 0x1c, 0x3c, 0x45, 0x9f, 0x0a, 0x3e, 0x1c, 0xa1, 0x78, 0xbd,
+ 0xbb, 0x97, 0x21, 0x3e, 0xc0, 0x50, 0x06, 0xbe, 0x2e, 0xbd, 0x2b, 0xbe,
+ 0x60, 0xf2, 0x90, 0xbb, 0xf9, 0x4a, 0xc8, 0xbd, 0xa8, 0x89, 0x75, 0x3c,
+ 0xd5, 0x32, 0xd4, 0xbd, 0x31, 0x80, 0x1f, 0x3e, 0xef, 0x68, 0x48, 0xbd,
+ 0xec, 0xf0, 0x13, 0xbe, 0xa9, 0x49, 0x61, 0x3d, 0xa9, 0x80, 0x24, 0x3e,
+ 0x59, 0xed, 0x89, 0x3c, 0x23, 0xcf, 0x3c, 0xbe, 0xea, 0x74, 0x06, 0x3e,
+ 0x35, 0xe3, 0xf3, 0xbd, 0xca, 0x2a, 0xd6, 0xbd, 0x4a, 0x48, 0xa1, 0x3d,
+ 0xc3, 0x80, 0xcf, 0x3d, 0x1c, 0xe9, 0xbd, 0xbd, 0x59, 0x01, 0x64, 0x3e,
+ 0x08, 0x28, 0xf7, 0x3c, 0x17, 0x34, 0xb7, 0xbd, 0x06, 0x93, 0xe0, 0xbd,
+ 0x07, 0xf3, 0xa8, 0x3c, 0x66, 0x58, 0x9e, 0x3d, 0x70, 0x48, 0x83, 0xbd,
+ 0xb0, 0x5b, 0x06, 0xbe, 0xa4, 0x5a, 0x1e, 0x3c, 0xe0, 0x4a, 0xc2, 0x3b,
+ 0x2d, 0x20, 0x17, 0x3b, 0xc0, 0x35, 0x84, 0x3d, 0x03, 0xc0, 0x90, 0xbd,
+ 0xd1, 0x20, 0xb0, 0x3d, 0x25, 0xf8, 0x07, 0x3e, 0x05, 0x24, 0x1b, 0x3d,
+ 0x93, 0x02, 0x43, 0x3d, 0xc6, 0x05, 0xd8, 0xbc, 0xc6, 0x4b, 0x4a, 0x3d,
+ 0x67, 0x20, 0x8e, 0x3d, 0xec, 0xce, 0x3e, 0xbe, 0x97, 0xe6, 0x53, 0xbc,
+ 0x1e, 0x72, 0x3e, 0x3e, 0x3a, 0x04, 0xa9, 0x3d, 0xce, 0xd3, 0x8c, 0xbd,
+ 0x08, 0xde, 0xe7, 0x3d, 0x7b, 0x0d, 0x89, 0x3a, 0x10, 0x77, 0x26, 0x3e,
+ 0x8a, 0x06, 0x31, 0xbe, 0xe3, 0xb8, 0x7f, 0xbd, 0x7e, 0x86, 0x14, 0xbe,
+ 0x50, 0x2f, 0x7e, 0xbd, 0xab, 0x9d, 0x47, 0xbd, 0xbf, 0xbe, 0x0b, 0xbe,
+ 0x40, 0xe9, 0xde, 0xbd, 0x44, 0xa2, 0x52, 0xbd, 0x36, 0xc0, 0xed, 0xbd,
+ 0xfb, 0xc3, 0x8f, 0x3d, 0x5f, 0x9c, 0x1b, 0x3e, 0xc8, 0x46, 0x03, 0xbe,
+ 0xb6, 0xe8, 0x5a, 0x3c, 0x8a, 0x10, 0xb0, 0x3c, 0xed, 0x7e, 0x29, 0xbe,
+ 0xc5, 0xa2, 0x8b, 0xbd, 0x98, 0xf1, 0xf3, 0xbd, 0xa1, 0xe6, 0x06, 0xbe,
+ 0xc5, 0x3b, 0xfe, 0xbd, 0xd9, 0xf3, 0xd9, 0xbd, 0x12, 0x97, 0x55, 0x3a,
+ 0xa4, 0xd0, 0x6c, 0x3d, 0x81, 0xfe, 0xf2, 0xbd, 0x4f, 0x7c, 0x35, 0xbd,
+ 0x6b, 0x3b, 0x55, 0xbd, 0x12, 0x86, 0xe8, 0x3c, 0xa2, 0x56, 0xb5, 0xbd,
+ 0xc6, 0x68, 0x81, 0x3b, 0x0a, 0xbb, 0x59, 0x3d, 0xe0, 0x2f, 0x8b, 0xbd,
+ 0x30, 0x45, 0x85, 0xbd, 0x91, 0x57, 0x15, 0xbe, 0xef, 0xe9, 0xfc, 0xbc,
+ 0x30, 0x4f, 0xe8, 0x3d, 0x52, 0x35, 0xdf, 0x3d, 0xaf, 0x19, 0xf9, 0x3d,
+ 0x6e, 0x10, 0xbc, 0x3d, 0xda, 0x62, 0xa2, 0x3c, 0x01, 0xc1, 0x0a, 0x3e,
+ 0x92, 0xe0, 0xa4, 0x3d, 0x93, 0x7c, 0xad, 0xbd, 0x63, 0x78, 0xd3, 0x3d,
+ 0xfa, 0x90, 0xe2, 0xbd, 0x91, 0xe5, 0xc5, 0x3d, 0x9b, 0x9d, 0xf4, 0x3d,
+ 0xfa, 0x53, 0x60, 0xbd, 0x72, 0x20, 0xcb, 0xbd, 0x0d, 0x97, 0x6c, 0x3d,
+ 0x24, 0x6f, 0xe0, 0x3b, 0x24, 0xee, 0x04, 0xbd, 0xe5, 0xa3, 0x58, 0xbd,
+ 0xed, 0x53, 0x17, 0x3d, 0x05, 0x55, 0x58, 0xbd, 0x2d, 0xc6, 0x2a, 0x3e,
+ 0x40, 0x05, 0x9c, 0x3c, 0x02, 0x89, 0x14, 0x3d, 0x2e, 0xab, 0x1e, 0xbb,
+ 0x2e, 0xdf, 0x06, 0x3e, 0x25, 0x6c, 0x29, 0xbd, 0xd2, 0xa0, 0xb0, 0xbc,
+ 0x0f, 0x5c, 0xe7, 0x3d, 0x22, 0xfe, 0xf8, 0x3d, 0x3b, 0x2e, 0x9a, 0x3d,
+ 0x03, 0xb7, 0xd9, 0xbd, 0xd6, 0x17, 0x43, 0xbd, 0xc9, 0xe6, 0xba, 0x3b,
+ 0x0c, 0xe5, 0x88, 0x3d, 0xa1, 0xe2, 0x4f, 0x3d, 0xe9, 0x52, 0x06, 0x3c,
+ 0x5f, 0x60, 0x93, 0x3d, 0xe7, 0x59, 0x41, 0xbe, 0x6c, 0x44, 0xe9, 0x3d,
+ 0x4a, 0x3f, 0x3d, 0xbe, 0x13, 0x36, 0x4c, 0x3d, 0xaa, 0x0f, 0xe1, 0x3d,
+ 0xd3, 0xd8, 0x84, 0xbd, 0xc0, 0x1d, 0x22, 0x3e, 0xf0, 0xac, 0xa7, 0x3d,
+ 0xfd, 0x94, 0xb4, 0x3d, 0x4b, 0xb3, 0xca, 0xbc, 0xf7, 0xb2, 0x5d, 0x3d,
+ 0xd4, 0x17, 0x1a, 0xbd, 0x3d, 0x5e, 0x11, 0xbd, 0xf4, 0x18, 0x44, 0x3e,
+ 0xb9, 0x8e, 0xcd, 0xbd, 0x4e, 0x1f, 0xa4, 0xbc, 0x09, 0x03, 0x12, 0xbd,
+ 0x36, 0x3a, 0xca, 0x3d, 0xbe, 0x15, 0xea, 0x3d, 0xba, 0x5c, 0x3d, 0x3d,
+ 0x22, 0x62, 0x8c, 0x3d, 0x7c, 0x09, 0x5c, 0x3e, 0x94, 0x42, 0xae, 0x3d,
+ 0xd6, 0xc6, 0xc7, 0xbd, 0x42, 0xf1, 0x0b, 0xbe, 0x28, 0x3b, 0xe3, 0xbd,
+ 0x04, 0x6b, 0xbe, 0x3d, 0xf3, 0xb5, 0x0f, 0xbe, 0x14, 0x81, 0xa3, 0x3d,
+ 0xc2, 0xbb, 0xca, 0x3d, 0x55, 0x0d, 0xd9, 0xbb, 0x9f, 0x73, 0x5e, 0x3d,
+ 0xc3, 0x0c, 0xfa, 0xbd, 0x6a, 0xb6, 0xde, 0x3c, 0x4a, 0x9a, 0x25, 0x3d,
+ 0x41, 0xd7, 0x23, 0xbe, 0x70, 0x08, 0x20, 0xbe, 0x7c, 0x65, 0xf7, 0xbd,
+ 0xf6, 0x08, 0x19, 0xbc, 0x30, 0x9d, 0x27, 0xbd, 0xe3, 0x34, 0xb1, 0x3d,
+ 0xd9, 0xe4, 0x1b, 0xbb, 0x80, 0x46, 0xc2, 0x3c, 0x24, 0x33, 0x13, 0xbe,
+ 0x01, 0xbd, 0x41, 0xbe, 0x1b, 0x6a, 0xdd, 0x3d, 0x0c, 0x42, 0x1f, 0x3e,
+ 0x0e, 0xc5, 0xfa, 0x3d, 0xc4, 0xcc, 0x8d, 0xba, 0xc9, 0x05, 0x66, 0x3c,
+ 0xa2, 0xd9, 0x2d, 0xbe, 0x49, 0xec, 0x03, 0xbe, 0xf1, 0x23, 0x18, 0xbe,
+ 0xab, 0x50, 0xd4, 0x3d, 0x48, 0x05, 0xa7, 0x3c, 0xe1, 0x45, 0x0a, 0x3d,
+ 0x1d, 0x82, 0x6e, 0xbe, 0x97, 0x1b, 0x4a, 0x3d, 0x6d, 0x6c, 0x7b, 0x3c,
+ 0xee, 0x20, 0xf4, 0x3c, 0xf8, 0x3b, 0xd2, 0x3d, 0x4c, 0x71, 0x14, 0xbe,
+ 0x52, 0xae, 0xcd, 0xbc, 0xf8, 0x18, 0x44, 0x3e, 0x7c, 0x5f, 0x05, 0xbe,
+ 0xd3, 0x50, 0x3e, 0xbd, 0xe7, 0xff, 0xe8, 0xbd, 0xa9, 0x03, 0x13, 0x3e,
+ 0x6f, 0x22, 0x00, 0x3e, 0xde, 0xd3, 0x94, 0x3c, 0x2b, 0x0e, 0x61, 0xbe,
+ 0xdd, 0x5b, 0x54, 0x3e, 0xd5, 0x43, 0x16, 0xbe, 0x21, 0x21, 0x0c, 0x3d,
+ 0x54, 0x57, 0x8a, 0xbc, 0xfa, 0xd3, 0x65, 0x3d, 0xf0, 0x3c, 0x94, 0x3e,
+ 0x10, 0xb5, 0x64, 0xbe, 0x6c, 0xc5, 0x17, 0x3c, 0x47, 0x75, 0xed, 0xbc,
+ 0x59, 0xf3, 0x24, 0x3c, 0x0c, 0x6c, 0xb2, 0x3d, 0xc4, 0xa5, 0x87, 0x3d,
+ 0x50, 0x39, 0x0f, 0x3e, 0x02, 0x91, 0xa8, 0x3d, 0xf1, 0x5d, 0xc8, 0xbd,
+ 0xe4, 0xda, 0xdc, 0x3d, 0xea, 0x77, 0x05, 0xbe, 0x67, 0x71, 0xbd, 0xbd,
+ 0x62, 0xa0, 0x92, 0x3c, 0x5d, 0x1f, 0x07, 0xbe, 0x12, 0x2e, 0x34, 0x3d,
+ 0x2c, 0xa0, 0x20, 0x3a, 0xe0, 0xf9, 0x37, 0xbd, 0x4f, 0xb5, 0x0a, 0x3e,
+ 0x51, 0x12, 0x1b, 0x3e, 0x83, 0x14, 0x06, 0x3e, 0x0a, 0xff, 0xb2, 0x3d,
+ 0xe4, 0x0e, 0x83, 0x3d, 0x43, 0x35, 0xf0, 0x3c, 0xf4, 0xbd, 0x1f, 0x3e,
+ 0x5e, 0xa0, 0xb5, 0x3e, 0x03, 0xa7, 0x0a, 0xbe, 0xc5, 0x98, 0x31, 0xbc,
+ 0xfb, 0x4d, 0xc8, 0x3d, 0xfd, 0x5f, 0x89, 0x3d, 0x7a, 0x82, 0x76, 0x3c,
+ 0x54, 0x23, 0xe1, 0x3d, 0x8c, 0xbe, 0xc0, 0x3c, 0xde, 0x99, 0x3d, 0xbe,
+ 0xfd, 0x00, 0x02, 0xbe, 0xd9, 0x09, 0xc6, 0xbd, 0x51, 0xbb, 0x14, 0x3d,
+ 0x5d, 0x06, 0xdf, 0xba, 0x36, 0xe4, 0x2e, 0x3e, 0x02, 0x3a, 0x54, 0xbd,
+ 0xbd, 0xdf, 0xe1, 0x3d, 0xaa, 0xb5, 0xba, 0xbd, 0x1e, 0x0b, 0xf8, 0xbd,
+ 0x75, 0xa5, 0xa2, 0xbe, 0x57, 0x5b, 0x8c, 0xbd, 0x33, 0x50, 0x8c, 0xbd,
+ 0x53, 0xde, 0x5b, 0xbc, 0x79, 0x43, 0xa0, 0x3c, 0xc5, 0x85, 0x90, 0xbd,
+ 0x34, 0xaf, 0xa1, 0x3d, 0xa7, 0xd6, 0xe3, 0x3c, 0x30, 0x41, 0x23, 0x3e,
+ 0xac, 0x10, 0xcc, 0x3d, 0x24, 0x1a, 0x90, 0x3b, 0x10, 0x3e, 0x53, 0x3e,
+ 0xd0, 0xf1, 0xe0, 0xbc, 0x98, 0x72, 0x64, 0x3d, 0xb1, 0x7b, 0xac, 0xbb,
+ 0xda, 0xfb, 0xb8, 0xbd, 0x1c, 0x7f, 0x04, 0x3d, 0x0d, 0x51, 0x10, 0x3e,
+ 0xb5, 0x41, 0xb4, 0x3d, 0xc2, 0xea, 0xd8, 0xba, 0x5d, 0x39, 0xd0, 0xbb,
+ 0x68, 0x61, 0x07, 0xbd, 0x93, 0x7c, 0xc3, 0x3d, 0x81, 0x41, 0xbf, 0x3d,
+ 0x1d, 0x40, 0xad, 0x3d, 0x48, 0xf0, 0x03, 0xbe, 0xef, 0x86, 0xe9, 0x3d,
+ 0xa5, 0x67, 0x97, 0x3d, 0x11, 0x37, 0x98, 0x3d, 0x3e, 0x04, 0xac, 0x3d,
+ 0x73, 0x2f, 0xc1, 0xbd, 0x3c, 0x71, 0x8c, 0x3d, 0xdf, 0xb2, 0x03, 0x3d,
+ 0xe0, 0xfa, 0xf7, 0xbd, 0x58, 0xc8, 0x44, 0xbd, 0x37, 0xb4, 0x34, 0xbd,
+ 0xb4, 0xcd, 0x95, 0x3d, 0x3d, 0xc0, 0x62, 0xbd, 0x9b, 0x82, 0x80, 0x3d,
+ 0xed, 0x32, 0x16, 0xbe, 0x05, 0xe8, 0xf9, 0x3d, 0x1e, 0xf7, 0x42, 0x3e,
+ 0x48, 0x9b, 0xbb, 0xbd, 0xa5, 0x5e, 0x73, 0x3c, 0x70, 0xf1, 0x46, 0x3c,
+ 0xb1, 0x93, 0x20, 0x3e, 0x54, 0x41, 0xbb, 0xbb, 0x10, 0xec, 0x1c, 0xbe,
+ 0xf9, 0x47, 0xf6, 0x3d, 0x75, 0x45, 0x95, 0xbd, 0x62, 0x3c, 0x41, 0xbd,
+ 0x71, 0x5b, 0x1a, 0xbe, 0x9c, 0xfc, 0xa1, 0xbd, 0x12, 0x04, 0x2a, 0x3e,
+ 0x5b, 0xf4, 0xe2, 0xbc, 0xa1, 0x2f, 0x3f, 0xbe, 0xf5, 0x94, 0xc0, 0x3d,
+ 0xc4, 0xcc, 0x46, 0x3e, 0xac, 0x98, 0x1b, 0xbe, 0x9c, 0xd0, 0x52, 0xbd,
+ 0x0e, 0x99, 0x3c, 0x3d, 0x16, 0x3b, 0xd9, 0x3d, 0xc8, 0x27, 0x56, 0x3e,
+ 0x07, 0x36, 0xeb, 0xbb, 0x2c, 0x34, 0x68, 0x3e, 0xae, 0x22, 0xcf, 0xbc,
+ 0x93, 0x4b, 0xc8, 0xbd, 0x5c, 0x4c, 0x7d, 0x3c, 0x2d, 0xd6, 0x58, 0xbc,
+ 0x56, 0x94, 0xe7, 0xbd, 0x58, 0x6e, 0x0e, 0xbd, 0x75, 0xf2, 0x81, 0x3c,
+ 0x7c, 0x1b, 0xe5, 0x3c, 0xbf, 0xe5, 0xa8, 0xbc, 0x6a, 0x2f, 0xbf, 0xbc,
+ 0xb8, 0x9b, 0xd1, 0xbd, 0x0b, 0xb6, 0xa8, 0x3d, 0xcf, 0x07, 0x06, 0xbb,
+ 0x3d, 0xd8, 0x03, 0x3c, 0x37, 0x44, 0x86, 0xbd, 0xd7, 0xef, 0x20, 0x3e,
+ 0xe4, 0xac, 0xd5, 0xbc, 0x9c, 0xcf, 0xa6, 0xbc, 0xe4, 0x1b, 0x2d, 0x3d,
+ 0x32, 0x56, 0x90, 0x3d, 0x15, 0x67, 0x8a, 0xbd, 0x50, 0xd1, 0x04, 0xbe,
+ 0xd9, 0x0b, 0x4e, 0x3d, 0x3f, 0xb6, 0x2e, 0xbe, 0x54, 0x87, 0xf1, 0x3d,
+ 0xff, 0x5d, 0x25, 0x3e, 0x03, 0xc6, 0x9a, 0x3d, 0x8b, 0xab, 0xd1, 0xbc,
+ 0xd9, 0x58, 0xa2, 0x3d, 0xbc, 0x79, 0x25, 0x3e, 0x10, 0x43, 0x6c, 0x3d,
+ 0x70, 0x51, 0x8c, 0xbb, 0x4b, 0x5f, 0x20, 0x3e, 0xb9, 0x65, 0x1c, 0x3d,
+ 0x3a, 0x19, 0x13, 0xbd, 0xf1, 0xb0, 0x33, 0xbe, 0x4d, 0xd9, 0x32, 0xbe,
+ 0x4f, 0x81, 0x05, 0x3e, 0x50, 0xd8, 0x53, 0xbd, 0x1a, 0xd8, 0xa0, 0xbd,
+ 0x92, 0x72, 0x6a, 0xbe, 0x55, 0xf1, 0x42, 0xbd, 0xc0, 0x66, 0xc0, 0x3d,
+ 0x87, 0x58, 0x77, 0xbb, 0x43, 0x4c, 0xa8, 0xbd, 0xd4, 0x9a, 0x6c, 0x3d,
+ 0x8d, 0xdc, 0xa1, 0xbd, 0xea, 0x54, 0xe9, 0x3d, 0xfd, 0x98, 0x97, 0x3d,
+ 0xed, 0x43, 0x42, 0xbd, 0x95, 0x37, 0x01, 0xbc, 0x5c, 0x89, 0xc9, 0x3d,
+ 0x4f, 0x90, 0xca, 0xbd, 0x53, 0x42, 0x9f, 0x3d, 0x53, 0x32, 0x22, 0xbe,
+ 0x0f, 0x8a, 0x2c, 0xbe, 0xf0, 0xbd, 0x18, 0xbd, 0x56, 0x56, 0x91, 0x3c,
+ 0x96, 0x89, 0xa0, 0x3d, 0x33, 0x95, 0xfa, 0x3d, 0x74, 0xce, 0xee, 0x3c,
+ 0x48, 0x5e, 0xc6, 0x3d, 0x36, 0x1c, 0x3c, 0xbe, 0x9b, 0xc1, 0xd6, 0x3d,
+ 0xc5, 0x05, 0x50, 0x3d, 0x1d, 0x5c, 0x43, 0xbd, 0xba, 0xbc, 0xab, 0xbd,
+ 0x9e, 0x8f, 0x3d, 0xbd, 0x88, 0xcc, 0x81, 0x3d, 0x0b, 0x83, 0x47, 0x3e,
+ 0x37, 0x24, 0xab, 0x3d, 0xdf, 0xa6, 0xff, 0xbc, 0x87, 0x29, 0x0d, 0x3c,
+ 0xec, 0x5f, 0x48, 0xbd, 0xb4, 0xfa, 0x03, 0x3e, 0x31, 0x9b, 0xc4, 0x3d,
+ 0x1c, 0xf3, 0x49, 0x3d, 0xe7, 0x06, 0xc9, 0x3d, 0x0b, 0xdf, 0xca, 0x3c,
+ 0xa5, 0xdc, 0x43, 0xbd, 0x45, 0xfb, 0x88, 0x3d, 0xac, 0x01, 0xbe, 0x3d,
+ 0x54, 0x35, 0x3f, 0x3d, 0xba, 0x95, 0x7e, 0x3d, 0xc1, 0x17, 0xbd, 0x3c,
+ 0x6e, 0x69, 0xe3, 0x3d, 0xdf, 0x8b, 0x6b, 0xbc, 0x97, 0xfd, 0x2a, 0xbc,
+ 0xae, 0xc4, 0x6f, 0xbd, 0xbd, 0x85, 0x35, 0xbe, 0xf1, 0x05, 0xbe, 0x3d,
+ 0x13, 0xa1, 0x0c, 0xbc, 0x6a, 0x1c, 0x25, 0x3c, 0x24, 0x45, 0x27, 0x3e,
+ 0x52, 0xd0, 0xbc, 0x3d, 0xe1, 0x2e, 0x48, 0x3d, 0x1f, 0x94, 0x46, 0x3d,
+ 0x0b, 0xef, 0x65, 0x3e, 0xf9, 0x73, 0xe2, 0xbd, 0xaa, 0xf3, 0x3d, 0xbe,
+ 0x61, 0x8b, 0x27, 0x3d, 0x9e, 0xb8, 0x2a, 0x3d, 0xa9, 0x56, 0xe4, 0x3d,
+ 0xe2, 0xbd, 0x1c, 0xbe, 0xae, 0xe4, 0xf6, 0x3a, 0x09, 0x4f, 0x4c, 0x3d,
+ 0x2e, 0x17, 0x01, 0xbe, 0x53, 0x12, 0x96, 0xbc, 0xe7, 0xd6, 0x2a, 0x3d,
+ 0xcd, 0x8b, 0x0b, 0x3d, 0x9e, 0xd5, 0xfe, 0xbd, 0x7a, 0xda, 0xbc, 0x3d,
+ 0xc9, 0x91, 0xe5, 0xbd, 0x0e, 0x40, 0x8e, 0xbd, 0xde, 0x8a, 0x29, 0x3e,
+ 0x25, 0x25, 0xc4, 0x3a, 0x77, 0x71, 0x04, 0x3e, 0xf3, 0x00, 0x42, 0x3e,
+ 0xc6, 0x69, 0x7b, 0xbd, 0x5c, 0xae, 0x9f, 0xbd, 0xd6, 0x12, 0x49, 0x3d,
+ 0xf1, 0x24, 0xee, 0x3d, 0x65, 0xf1, 0x81, 0xbd, 0xf5, 0x75, 0xd1, 0xbd,
+ 0x6e, 0x79, 0x1a, 0xbd, 0x9e, 0xa1, 0xab, 0xbd, 0x77, 0x2c, 0x1e, 0x3d,
+ 0xd6, 0x58, 0x57, 0xbc, 0x82, 0x3c, 0x41, 0xbd, 0x4d, 0x1f, 0x90, 0x3d,
+ 0x26, 0x79, 0x16, 0xbd, 0x53, 0x12, 0x43, 0x3d, 0x1f, 0xf9, 0xb7, 0x3c,
+ 0x7c, 0x1e, 0x7b, 0xbd, 0xbd, 0xef, 0xf3, 0x3d, 0x24, 0xd0, 0x09, 0x3e,
+ 0x1d, 0x8e, 0x23, 0xbd, 0x95, 0x51, 0x98, 0xbd, 0x1b, 0x77, 0x93, 0x3c,
+ 0x70, 0x38, 0x9c, 0x3d, 0x5e, 0x12, 0x87, 0xbd, 0x82, 0x01, 0x09, 0xbe,
+ 0x69, 0x78, 0x4a, 0x3e, 0xe4, 0x25, 0xf2, 0xbc, 0x31, 0x07, 0x74, 0x3d,
+ 0xb5, 0x23, 0x87, 0x3d, 0x8a, 0xe9, 0x81, 0xbd, 0xb8, 0x52, 0x04, 0xbe,
+ 0xed, 0xbe, 0x0d, 0xbe, 0x4e, 0xa9, 0x26, 0xbd, 0xa7, 0x77, 0x21, 0x3e,
+ 0xf9, 0xd2, 0xa2, 0xbc, 0xf5, 0x61, 0x3a, 0xbe, 0x35, 0x11, 0x33, 0xbe,
+ 0xb3, 0xd2, 0xe7, 0xbd, 0xd2, 0x80, 0x0b, 0xbe, 0x00, 0x37, 0xd0, 0xbd,
+ 0x99, 0x2c, 0x75, 0xbd, 0xc8, 0x8f, 0xef, 0xbc, 0xb3, 0x99, 0x95, 0xbc,
+ 0x50, 0xd4, 0x9a, 0x3d, 0xc5, 0x14, 0x67, 0x3c, 0x1a, 0x32, 0xc1, 0x3d,
+ 0xce, 0xf7, 0x59, 0xbd, 0xf6, 0x6f, 0x8d, 0xbb, 0x14, 0x81, 0x27, 0xbd,
+ 0xca, 0xe2, 0x5c, 0x3d, 0x2e, 0x1c, 0x1d, 0xbd, 0xc9, 0x89, 0x0e, 0x3e,
+ 0xac, 0xf3, 0xe5, 0xbc, 0x09, 0x6a, 0x83, 0x3e, 0x81, 0xed, 0xf1, 0x3d,
+ 0x4f, 0xfb, 0x54, 0xbe, 0x54, 0x55, 0x4b, 0xbe, 0xd6, 0x94, 0xeb, 0xbc,
+ 0xe2, 0x79, 0x8b, 0xbe, 0x95, 0x55, 0x86, 0xbd, 0x2f, 0x87, 0xd7, 0xbd,
+ 0xe4, 0x4c, 0x42, 0xbd, 0xd8, 0x07, 0xe7, 0xbc, 0xa6, 0xbd, 0x6a, 0xbd,
+ 0x53, 0x04, 0x5e, 0x3d, 0xb1, 0x72, 0x33, 0x3d, 0x6d, 0x64, 0x96, 0xbc,
+ 0xfd, 0x43, 0x16, 0x3e, 0xb8, 0xc8, 0x22, 0x3d, 0x57, 0xb2, 0x17, 0xbb,
+ 0x8e, 0xd8, 0x08, 0x3e, 0xcd, 0x9a, 0x58, 0x3e, 0x6a, 0x3b, 0x00, 0x3e,
+ 0x89, 0x65, 0xf7, 0x3c, 0xec, 0x09, 0xf4, 0xbd, 0xe0, 0x0b, 0xf9, 0x3d,
+ 0x19, 0x14, 0x2f, 0xbc, 0xae, 0xda, 0xbb, 0xbd, 0xbf, 0xa1, 0x37, 0xbd,
+ 0xbf, 0x80, 0x23, 0x3e, 0x45, 0x10, 0x7d, 0x3d, 0xf8, 0x2e, 0x6b, 0xbb,
+ 0x61, 0x44, 0xf3, 0x3d, 0x56, 0xf6, 0x93, 0xbe, 0xaf, 0xc8, 0xb3, 0x3d,
+ 0x41, 0xfc, 0xc2, 0x3c, 0x61, 0x67, 0xf1, 0xbd, 0xae, 0xe4, 0xff, 0x3d,
+ 0xfb, 0x2e, 0x67, 0x3d, 0xd5, 0x8b, 0xdb, 0xbd, 0x6e, 0x50, 0x8f, 0x3c,
+ 0xdf, 0x2b, 0xaa, 0x3d, 0x3f, 0xa4, 0xaf, 0xbe, 0xf6, 0x73, 0x41, 0x3d,
+ 0xb3, 0x19, 0x15, 0x3e, 0x8b, 0x8b, 0xb9, 0x3d, 0x6e, 0xc7, 0x07, 0x3e,
+ 0x61, 0xbb, 0xa3, 0x3c, 0x91, 0x0a, 0xdb, 0x3d, 0x57, 0x2d, 0xe6, 0xbc,
+ 0xcf, 0xb4, 0xdc, 0x3d, 0x86, 0x4c, 0x98, 0xbd, 0x39, 0xd5, 0xee, 0x3d,
+ 0x84, 0xeb, 0x5c, 0x3b, 0x5d, 0x8f, 0x31, 0x3e, 0x0a, 0x4e, 0xb2, 0xbd,
+ 0xe6, 0x9a, 0xb3, 0x3d, 0x05, 0x35, 0x2b, 0xbe, 0xbd, 0xf7, 0x64, 0x3d,
+ 0xba, 0x06, 0x3e, 0x3e, 0x26, 0x9b, 0xa5, 0xbd, 0xe3, 0xc4, 0x1e, 0x3d,
+ 0x5d, 0x9d, 0x77, 0xbd, 0xe7, 0xa1, 0xab, 0x3d, 0x05, 0xc7, 0x8f, 0x3c,
+ 0x7c, 0x0c, 0x07, 0xbe, 0xb0, 0x17, 0x08, 0x3d, 0xa4, 0xdb, 0x58, 0xbe,
+ 0x36, 0x9f, 0xcc, 0xbd, 0xa9, 0x33, 0xca, 0xbd, 0xcb, 0x4b, 0xc2, 0xbd,
+ 0x8c, 0xd1, 0xb2, 0xbd, 0xcb, 0x3e, 0x01, 0xbe, 0x1b, 0xd8, 0xc9, 0x3d,
+ 0x4f, 0x52, 0xae, 0xbd, 0x6c, 0xda, 0x37, 0xbd, 0x8c, 0x43, 0x95, 0x3e,
+ 0xea, 0xb5, 0x87, 0x3d, 0x6d, 0x97, 0xf2, 0xbc, 0x8d, 0xc7, 0xd9, 0xbc,
+ 0x68, 0xe8, 0xb3, 0xbc, 0x31, 0x57, 0x57, 0xbd, 0x38, 0xa7, 0x5a, 0xbe,
+ 0xbd, 0xf3, 0xf5, 0x3c, 0x89, 0x64, 0x7f, 0x3d, 0xa9, 0xab, 0x09, 0xbe,
+ 0x5a, 0x61, 0x4a, 0xbe, 0x21, 0xc2, 0xa7, 0x3d, 0xef, 0x2c, 0x30, 0xbe,
+ 0x79, 0x31, 0xbd, 0x3d, 0xfc, 0x72, 0xc3, 0xbd, 0x93, 0x06, 0xb7, 0x3c,
+ 0x5b, 0xd3, 0x4e, 0xbe, 0xa2, 0x7b, 0x3a, 0xbe, 0x65, 0x73, 0x02, 0xbe,
+ 0xea, 0x9a, 0xf6, 0x3d, 0x45, 0xbe, 0x9c, 0xbd, 0xee, 0xc2, 0x85, 0x3d,
+ 0xe4, 0xd4, 0xc6, 0x3d, 0x27, 0x3f, 0x35, 0xbe, 0x7b, 0xaa, 0xc9, 0x3d,
+ 0x7e, 0x93, 0xa2, 0xbc, 0x1f, 0xf8, 0xa4, 0x3d, 0x4b, 0x53, 0x11, 0xbe,
+ 0x0f, 0x54, 0xc5, 0xbc, 0xf8, 0xbb, 0x0f, 0xbe, 0xc9, 0x1d, 0x92, 0xba,
+ 0xe1, 0xb6, 0x7d, 0xbe, 0x14, 0xc6, 0x4e, 0xbd, 0xd8, 0x03, 0x01, 0x3c,
+ 0x45, 0xfb, 0x3e, 0x3b, 0xfc, 0x71, 0x07, 0xbe, 0xbb, 0x31, 0x14, 0xbe,
+ 0x2b, 0xc8, 0x89, 0xbd, 0x1b, 0x22, 0x4c, 0x3d, 0x99, 0x5b, 0x03, 0xbe,
+ 0x6e, 0xdd, 0x73, 0x3e, 0x6d, 0x65, 0x81, 0xbd, 0xf2, 0x8a, 0x07, 0x3e,
+ 0xe7, 0x44, 0x28, 0xbe, 0xde, 0x50, 0xf3, 0xbd, 0xf8, 0x47, 0x1b, 0xbe,
+ 0xff, 0x62, 0x38, 0xbe, 0x5a, 0x2e, 0xfb, 0xbd, 0xa8, 0x24, 0x08, 0x3e,
+ 0x15, 0x6a, 0xd7, 0xbd, 0xde, 0xb9, 0x94, 0x3d, 0xc8, 0x39, 0xfa, 0x3d,
+ 0x56, 0x5d, 0x36, 0x3d, 0x65, 0x41, 0x00, 0x3d, 0x52, 0x80, 0x45, 0x3e,
+ 0xe7, 0x18, 0xb5, 0x3d, 0x08, 0x8a, 0x1d, 0xbd, 0x42, 0x5c, 0xcf, 0xbd,
+ 0x49, 0xdb, 0x98, 0xbd, 0x16, 0xd2, 0xca, 0x3d, 0xac, 0x42, 0xd7, 0x3d,
+ 0x8a, 0x68, 0x96, 0x3d, 0x2d, 0x95, 0xa0, 0xbb, 0xef, 0x25, 0x38, 0x3d,
+ 0x1b, 0xbc, 0x84, 0xbd, 0x80, 0x4c, 0xdf, 0xbc, 0x4d, 0x18, 0xfb, 0xbc,
+ 0xd9, 0x90, 0x01, 0x3e, 0x4f, 0x95, 0x32, 0x3d, 0xb0, 0x92, 0x0c, 0x3e,
+ 0x47, 0xf4, 0xe1, 0xba, 0xb7, 0x77, 0x50, 0x3c, 0xae, 0xcc, 0x03, 0x3e,
+ 0x65, 0x6d, 0xec, 0xbc, 0x37, 0xf1, 0x2b, 0xbc, 0x4d, 0x57, 0x17, 0x3e,
+ 0xa2, 0x21, 0xae, 0x3d, 0x8a, 0x91, 0x51, 0x3d, 0x11, 0x39, 0x5c, 0x3d,
+ 0x8a, 0xd2, 0xfb, 0x3c, 0x85, 0xc9, 0x21, 0x3c, 0xac, 0x88, 0x6e, 0xbd,
+ 0x57, 0x4e, 0x3e, 0x3d, 0x88, 0x8d, 0xe3, 0xbd, 0x74, 0xcf, 0x7e, 0x3d,
+ 0x93, 0x1f, 0xba, 0x3d, 0x36, 0x13, 0xef, 0x3d, 0x31, 0x60, 0xa0, 0x3d,
+ 0xc2, 0x5b, 0x8b, 0x3c, 0x5c, 0xd8, 0x4d, 0xbc, 0xe9, 0xa9, 0xbe, 0xbd,
+ 0x0a, 0xa8, 0xd7, 0x3d, 0x41, 0x4e, 0x9f, 0xbc, 0x9f, 0x68, 0xce, 0xbd,
+ 0x7f, 0x02, 0xc4, 0x3c, 0x07, 0xba, 0x58, 0xbe, 0xe4, 0x8f, 0xa3, 0xbd,
+ 0xfa, 0x6b, 0xa0, 0xbd, 0x16, 0x45, 0x11, 0x3e, 0xc8, 0xfb, 0x67, 0x3d,
+ 0xdf, 0x41, 0x7c, 0x3d, 0x6a, 0xa7, 0xe6, 0x3b, 0x65, 0x65, 0x10, 0x3d,
+ 0xa9, 0x92, 0x36, 0xbe, 0xfb, 0x5b, 0x41, 0x3d, 0xbe, 0x0e, 0xe1, 0xbd,
+ 0xf7, 0x40, 0x1f, 0x3d, 0xf2, 0x40, 0xe7, 0xbc, 0xfe, 0x6a, 0x1c, 0x3c,
+ 0xdd, 0x38, 0x33, 0x3d, 0xe5, 0x13, 0x1e, 0xbc, 0xe1, 0x22, 0x0c, 0xbd,
+ 0xc8, 0x04, 0x19, 0xbe, 0xbc, 0x18, 0x3d, 0x3c, 0xf0, 0x71, 0x52, 0xbd,
+ 0xc2, 0x32, 0xbd, 0x3d, 0xbc, 0x7f, 0xce, 0xbd, 0x76, 0x81, 0xb2, 0xbd,
+ 0xa7, 0xac, 0x59, 0xbe, 0x2e, 0x8c, 0x8a, 0x3d, 0x58, 0x37, 0x0e, 0x3e,
+ 0x17, 0x3c, 0xa6, 0xbc, 0x40, 0x7e, 0x0b, 0xbc, 0x9a, 0x35, 0xa0, 0xbb,
+ 0x2f, 0x42, 0xa4, 0x3d, 0x65, 0x00, 0xfd, 0x3d, 0xc3, 0x7a, 0x66, 0xbd,
+ 0xc1, 0x51, 0xe5, 0xbd, 0x78, 0x87, 0xe7, 0x3d, 0x5b, 0x40, 0x02, 0x3e,
+ 0xce, 0xe5, 0x02, 0xbd, 0x8b, 0xbb, 0xe1, 0xbd, 0x5f, 0x37, 0x01, 0xbe,
+ 0x22, 0x35, 0x02, 0x3d, 0x7c, 0x9c, 0x97, 0xbd, 0xb5, 0x5a, 0x21, 0x3e,
+ 0x10, 0x62, 0x21, 0x3e, 0x24, 0xa8, 0x18, 0x3e, 0xc8, 0xbb, 0x47, 0x3c,
+ 0x9b, 0x6c, 0xff, 0x3d, 0xd8, 0xf3, 0xc1, 0xbc, 0xae, 0x0a, 0x03, 0xbd,
+ 0x5a, 0xb5, 0x4c, 0xbe, 0x7c, 0x79, 0xfc, 0xbd, 0x27, 0xe2, 0xdd, 0xbd,
+ 0x2c, 0x89, 0xd6, 0x3d, 0x38, 0x6c, 0x01, 0x3d, 0xdf, 0xd9, 0x6e, 0xbe,
+ 0x58, 0x61, 0xb2, 0x3d, 0x94, 0x3b, 0xaa, 0xbd, 0x49, 0xeb, 0xc0, 0xbd,
+ 0xa8, 0xbe, 0x3a, 0x3c, 0xd1, 0x44, 0xd8, 0x3c, 0xe6, 0x52, 0x21, 0xbd,
+ 0x79, 0x65, 0x47, 0x3d, 0xe5, 0xb2, 0x9e, 0x3c, 0x2a, 0xef, 0x56, 0xbb,
+ 0x3c, 0xa9, 0x40, 0x3e, 0x92, 0x6f, 0xea, 0x3d, 0x42, 0x3d, 0xdd, 0x3d,
+ 0x32, 0x5f, 0x78, 0xbe, 0x29, 0xe2, 0x02, 0xbd, 0x7f, 0x4e, 0x02, 0x3e,
+ 0x6b, 0x22, 0x03, 0xbd, 0x06, 0x84, 0x42, 0x3e, 0x8e, 0x35, 0xbc, 0xbd,
+ 0x4a, 0x73, 0xe6, 0xbd, 0xb9, 0xb2, 0xcc, 0xbd, 0x4c, 0xd0, 0x93, 0x3a,
+ 0x30, 0xe3, 0x19, 0x3e, 0x9c, 0x62, 0x1e, 0xbe, 0xf7, 0x95, 0x8c, 0x3c,
+ 0xbe, 0x94, 0xb6, 0xbd, 0xe1, 0x31, 0x53, 0x3d, 0x4d, 0x12, 0x8b, 0x3d,
+ 0x8e, 0x9f, 0xc8, 0xbd, 0x7c, 0xca, 0x4b, 0x3d, 0x95, 0xfd, 0x65, 0x3e,
+ 0x9f, 0x89, 0x1f, 0xbe, 0x41, 0xb2, 0x06, 0x3e, 0x6c, 0x9e, 0x6e, 0x3d,
+ 0x7d, 0x7a, 0x24, 0xbe, 0xe9, 0x13, 0x0e, 0x3e, 0xee, 0x6a, 0x96, 0x3d,
+ 0x18, 0x27, 0xa6, 0x3d, 0x98, 0x3a, 0xd3, 0x3c, 0xda, 0x88, 0xce, 0xbd,
+ 0xc1, 0x3a, 0x03, 0x3e, 0x0c, 0x33, 0x1d, 0x3c, 0x90, 0x1b, 0x8f, 0x3d,
+ 0x7e, 0xa0, 0xb9, 0x3d, 0x16, 0x19, 0xaa, 0xbc, 0x9d, 0x8e, 0x23, 0x3e,
+ 0x29, 0x5c, 0x77, 0xbe, 0xa5, 0x05, 0x37, 0xbe, 0x58, 0x88, 0x98, 0xbd,
+ 0xdc, 0xcf, 0xe3, 0x3d, 0x4f, 0x55, 0x1f, 0x3c, 0x6f, 0xf9, 0x05, 0xbe,
+ 0x4a, 0x2f, 0x1c, 0x3b, 0x93, 0x40, 0xba, 0x3d, 0x07, 0xf6, 0x7b, 0xbe,
+ 0xa7, 0x14, 0x4e, 0xbe, 0x45, 0x91, 0xba, 0x3c, 0x77, 0x24, 0x07, 0x3e,
+ 0x0e, 0xfc, 0xe5, 0x3d, 0xc2, 0xf0, 0xa2, 0xbd, 0x29, 0x05, 0x4d, 0xbe,
+ 0x7d, 0xf1, 0x40, 0xbe, 0x0c, 0x06, 0x26, 0xbe, 0xe5, 0xfe, 0xbe, 0x3d,
+ 0x51, 0x90, 0x5a, 0x3d, 0x5a, 0xd9, 0x9d, 0xbd, 0x55, 0xc8, 0xb0, 0xbd,
+ 0xe9, 0x6e, 0x49, 0xbe, 0x85, 0x6f, 0xf7, 0xbd, 0x46, 0xaf, 0xd7, 0xbd,
+ 0xed, 0x9f, 0x7d, 0x3e, 0x3e, 0x5e, 0x66, 0x3c, 0xe0, 0xa3, 0x19, 0x3d,
+ 0x52, 0xd3, 0x2a, 0xbe, 0xb6, 0xe6, 0x90, 0x3d, 0x36, 0x26, 0x2a, 0x3e,
+ 0xc9, 0xe3, 0x2d, 0x3e, 0xcd, 0xd8, 0xc3, 0xbb, 0xe1, 0x16, 0x3e, 0x3c,
+ 0x52, 0x81, 0x57, 0x3e, 0xa4, 0xd1, 0x1f, 0xbd, 0xed, 0x96, 0xc4, 0xbc,
+ 0x35, 0x75, 0x52, 0x3d, 0x71, 0xff, 0xa3, 0x3d, 0x89, 0xb9, 0xb5, 0xbd,
+ 0xb9, 0xa9, 0x41, 0xbe, 0x4e, 0x62, 0x62, 0xbc, 0x62, 0xa3, 0x4f, 0xbd,
+ 0x8e, 0xea, 0x4c, 0xbe, 0x53, 0x02, 0x10, 0x3d, 0xf6, 0x51, 0x32, 0x3d,
+ 0x90, 0xdf, 0x8c, 0x3c, 0x28, 0x14, 0x38, 0xbd, 0x9c, 0x9e, 0x98, 0x3c,
+ 0xd1, 0x30, 0x15, 0x3e, 0xab, 0x6b, 0xa6, 0xbc, 0xae, 0x79, 0xfa, 0x3d,
+ 0x87, 0x32, 0x5c, 0x3d, 0xa8, 0xb8, 0xcf, 0xbd, 0xd9, 0x49, 0x15, 0xbe,
+ 0xb7, 0xde, 0x95, 0x3d, 0x97, 0x23, 0xb6, 0xbd, 0xc7, 0x59, 0xd4, 0xbd,
+ 0xd6, 0x33, 0x97, 0x3c, 0x4e, 0x14, 0x8f, 0x3d, 0xc5, 0xa3, 0xfe, 0x3d,
+ 0x0b, 0x17, 0x08, 0x3e, 0x91, 0xeb, 0x07, 0x3e, 0xc8, 0xac, 0x25, 0x3e,
+ 0x54, 0x02, 0x97, 0xbb, 0x52, 0xbe, 0x43, 0x3e, 0xa6, 0x79, 0x75, 0x3e,
+ 0xda, 0x9b, 0x58, 0x3d, 0x82, 0xad, 0x6d, 0xbe, 0xa0, 0x6f, 0x44, 0x3d,
+ 0x92, 0xba, 0x49, 0x3d, 0x5f, 0x3e, 0x1a, 0xbe, 0x18, 0x31, 0x44, 0xbe,
+ 0xd7, 0x31, 0x1f, 0xbe, 0xfa, 0xa1, 0x92, 0x3d, 0x98, 0x9e, 0x99, 0xbe,
+ 0x21, 0x43, 0x0a, 0x3d, 0x12, 0xdf, 0x88, 0xbe, 0x4b, 0xc0, 0x01, 0x3c,
+ 0x29, 0x95, 0x83, 0x3d, 0x59, 0x3c, 0x4d, 0x3d, 0x9e, 0x4e, 0xff, 0x3d,
+ 0xe4, 0xdf, 0xcc, 0xbd, 0x88, 0xe6, 0x8f, 0x3d, 0x92, 0xfc, 0x8e, 0xbe,
+ 0x92, 0x26, 0x06, 0xbd, 0xbf, 0x98, 0xed, 0x3d, 0x88, 0xb5, 0xe8, 0xbd,
+ 0x04, 0x65, 0x0d, 0x3b, 0x94, 0x28, 0x9d, 0x3d, 0x50, 0x99, 0x06, 0x3e,
+ 0x12, 0x02, 0xd7, 0x3d, 0x4c, 0xd9, 0xd4, 0xbd, 0xc8, 0xf1, 0x87, 0xbc,
+ 0x3a, 0xa1, 0xf8, 0x3d, 0xb4, 0x4c, 0xb5, 0xbc, 0x54, 0xe1, 0x51, 0x3e,
+ 0x63, 0x94, 0xdc, 0xbd, 0xe9, 0x3e, 0x19, 0xbe, 0x70, 0xe9, 0x0a, 0xbe,
+ 0xf9, 0x51, 0xf6, 0xbd, 0x38, 0xcc, 0xba, 0xbd, 0x71, 0x61, 0xa3, 0x3d,
+ 0x41, 0xde, 0x06, 0x3c, 0x76, 0x5b, 0xe5, 0x3d, 0x69, 0x4f, 0x04, 0xbd,
+ 0x85, 0x2c, 0x4e, 0xbe, 0x23, 0x6e, 0x80, 0xbd, 0x59, 0x63, 0xc1, 0xbd,
+ 0x30, 0xe2, 0x96, 0x3c, 0x3f, 0x25, 0xf8, 0xbd, 0x55, 0x90, 0x59, 0xbc,
+ 0x6f, 0x09, 0x15, 0x3e, 0x76, 0x5f, 0x85, 0xbd, 0x3e, 0x82, 0xef, 0x3d,
+ 0x6e, 0xf6, 0x52, 0xbe, 0x96, 0x3c, 0x47, 0xbe, 0x79, 0xec, 0x52, 0x3e,
+ 0x20, 0x80, 0x64, 0xbc, 0x16, 0x7e, 0x57, 0x3d, 0x97, 0x01, 0x90, 0xbd,
+ 0x76, 0x69, 0xae, 0x3d, 0xce, 0x46, 0x1c, 0xbe, 0xfa, 0xa0, 0x0c, 0xbe,
+ 0x53, 0xe4, 0x31, 0x3d, 0x59, 0x07, 0x68, 0x3d, 0x92, 0xcb, 0xfa, 0xb9,
+ 0x4a, 0xf4, 0xa3, 0x3b, 0xeb, 0x61, 0x58, 0xbd, 0x4b, 0xc4, 0x20, 0x3e,
+ 0xba, 0x04, 0x1f, 0x3e, 0xac, 0xf1, 0xd9, 0xbc, 0x95, 0xa4, 0x42, 0xbd,
+ 0x9d, 0xd5, 0x48, 0xbd, 0x2e, 0x40, 0x64, 0x3d, 0x6f, 0x3c, 0x01, 0x3e,
+ 0xcd, 0x12, 0x17, 0xbd, 0x9f, 0xf2, 0x21, 0x3c, 0x19, 0xf2, 0x79, 0x3d,
+ 0x97, 0xd3, 0xa9, 0xbc, 0xcd, 0x61, 0x29, 0xbe, 0x4f, 0xeb, 0xa8, 0xbd,
+ 0x0c, 0x97, 0x01, 0x3d, 0x75, 0xd4, 0x01, 0x3e, 0xf8, 0xc2, 0x08, 0xbe,
+ 0x88, 0x27, 0x0c, 0xbd, 0x46, 0x2f, 0x06, 0x3d, 0xcb, 0x70, 0x4e, 0xbe,
+ 0xbe, 0x3f, 0xe4, 0x3d, 0x23, 0xf7, 0x0c, 0xbd, 0x0e, 0x81, 0x54, 0x3c,
+ 0xe2, 0x8d, 0x08, 0xbe, 0x6c, 0xe8, 0xc1, 0xbd, 0x19, 0x72, 0x08, 0xbe,
+ 0x68, 0xce, 0x4f, 0x3d, 0x68, 0x17, 0xb6, 0x3d, 0x4e, 0xa1, 0x3c, 0x3e,
+ 0x8f, 0x34, 0xf7, 0xbd, 0x2b, 0x79, 0x17, 0x3c, 0x1a, 0x26, 0x44, 0xbb,
+ 0xe0, 0x3b, 0x06, 0xbe, 0x7d, 0x7c, 0xac, 0xbd, 0xd4, 0x78, 0x42, 0xbd,
+ 0x82, 0x5f, 0x61, 0xbd, 0x17, 0x3e, 0x01, 0xbd, 0x85, 0xeb, 0x60, 0x3e,
+ 0x80, 0xaf, 0x0a, 0xbe, 0x1c, 0xfe, 0x05, 0xbe, 0x94, 0xd5, 0x40, 0x3d,
+ 0x07, 0x94, 0xf1, 0x3b, 0xf3, 0x92, 0x17, 0x3e, 0xdf, 0x6b, 0xaf, 0x3d,
+ 0x3f, 0x6d, 0x18, 0x3d, 0x15, 0x93, 0xa0, 0x3c, 0xc6, 0x80, 0xa4, 0x3d,
+ 0xd0, 0x52, 0x02, 0x3e, 0x8f, 0x4e, 0x9d, 0x3d, 0x40, 0xb3, 0x29, 0xbe,
+ 0x99, 0x54, 0x92, 0xbd, 0x3b, 0x5e, 0x28, 0xbb, 0x8a, 0x73, 0xcf, 0xbd,
+ 0xae, 0x67, 0xfc, 0xbb, 0xdf, 0xbd, 0x55, 0x3e, 0x3e, 0x1f, 0x06, 0xbe,
+ 0x42, 0x59, 0x46, 0x3d, 0x00, 0xcf, 0xe2, 0xbd, 0xed, 0x0c, 0x03, 0xbe,
+ 0x39, 0x48, 0x04, 0x3d, 0xb7, 0x35, 0xcd, 0x3c, 0x47, 0x23, 0x7c, 0xbe,
+ 0x1e, 0x1b, 0x23, 0xbe, 0xc8, 0xaa, 0x9f, 0xbd, 0xbf, 0x65, 0x44, 0x3d,
+ 0x70, 0x0f, 0x0b, 0xbe, 0xee, 0x69, 0x82, 0x3d, 0x37, 0xd5, 0xec, 0x3c,
+ 0xf3, 0x75, 0x11, 0xba, 0xa3, 0x07, 0xde, 0x3d, 0x38, 0x73, 0x3b, 0x3d,
+ 0xad, 0xbd, 0x7b, 0x3c, 0xd3, 0x82, 0x23, 0xbe, 0x48, 0x2d, 0x4d, 0xbd,
+ 0x92, 0xa0, 0x1e, 0xbe, 0x21, 0x0e, 0x92, 0x3d, 0xda, 0x8c, 0x14, 0xbe,
+ 0xc4, 0x8c, 0x0f, 0xbe, 0xd7, 0x63, 0x89, 0xbd, 0x74, 0xdb, 0xfc, 0xbd,
+ 0xe4, 0x29, 0xc4, 0x3d, 0xc5, 0x1a, 0x02, 0x3e, 0x61, 0x64, 0x34, 0xbc,
+ 0xb0, 0x14, 0xd9, 0x3d, 0x06, 0xb0, 0xf7, 0xbd, 0xb4, 0x04, 0x0b, 0x3e,
+ 0xed, 0x86, 0x5d, 0x3d, 0x75, 0xfe, 0x3d, 0xbe, 0x71, 0x21, 0xb8, 0xbd,
+ 0xb6, 0x83, 0xdd, 0x3c, 0xcc, 0xe8, 0xb7, 0xbc, 0xf7, 0x2c, 0x3b, 0xbc,
+ 0x32, 0x62, 0xd0, 0xba, 0x22, 0x57, 0x3a, 0xbd, 0xb1, 0x64, 0xea, 0xbd,
+ 0x84, 0xa5, 0x11, 0xbe, 0x75, 0xce, 0xa2, 0x3d, 0x98, 0xa1, 0x6a, 0x3d,
+ 0xd1, 0xd7, 0x96, 0x3d, 0xd5, 0x22, 0x29, 0x3d, 0xbc, 0xf8, 0x1c, 0xbe,
+ 0x62, 0xb4, 0xe1, 0x3d, 0x35, 0xca, 0xa7, 0x3c, 0xc0, 0x11, 0xe6, 0x3d,
+ 0x9b, 0x3a, 0x31, 0xbd, 0xc2, 0xf5, 0x49, 0x3d, 0xfc, 0x4c, 0xb3, 0x3d,
+ 0x8c, 0x54, 0xbb, 0x3c, 0xc8, 0xd7, 0x22, 0xbe, 0xc0, 0x31, 0xb9, 0x3d,
+ 0x79, 0x9a, 0xb3, 0xbb, 0x84, 0x61, 0xfa, 0xbd, 0xc4, 0x7b, 0x0b, 0xbe,
+ 0x6e, 0x25, 0x14, 0xbe, 0x45, 0x77, 0x3a, 0x3d, 0x76, 0x31, 0x34, 0x3d,
+ 0x05, 0xf0, 0xb4, 0x3d, 0x17, 0xac, 0xd4, 0x3d, 0x4a, 0xbf, 0x9f, 0xbc,
+ 0x3c, 0x13, 0x0f, 0x3e, 0x07, 0x1a, 0x3a, 0x3d, 0x04, 0x23, 0x82, 0xbb,
+ 0x23, 0x88, 0x92, 0x3d, 0x37, 0x9e, 0xba, 0x3d, 0x8f, 0x83, 0xcb, 0xbd,
+ 0xb6, 0x17, 0x92, 0xbc, 0x92, 0x8c, 0xe6, 0xbc, 0x14, 0x29, 0xda, 0xbc,
+ 0x56, 0x03, 0x57, 0x3d, 0x77, 0xb6, 0x3c, 0xbe, 0x13, 0x3c, 0xb4, 0x3d,
+ 0x03, 0x17, 0x54, 0xbc, 0xb9, 0x06, 0xc4, 0xbc, 0xf5, 0xc0, 0x71, 0x3d,
+ 0x05, 0x41, 0xe8, 0xbc, 0xc0, 0x6d, 0x6b, 0x3d, 0xe5, 0x7a, 0x3d, 0xbe,
+ 0xbc, 0xc7, 0xba, 0xbd, 0x37, 0xcf, 0xa8, 0x3d, 0x05, 0x37, 0x2a, 0xbe,
+ 0xba, 0xa3, 0x2e, 0xbd, 0xe1, 0xe6, 0x2c, 0x3d, 0x11, 0xc8, 0x09, 0xbe,
+ 0x01, 0x86, 0x88, 0x3d, 0xb1, 0x39, 0x74, 0x3d, 0x9a, 0xaa, 0x35, 0x3e,
+ 0xac, 0x03, 0x57, 0xbd, 0x7b, 0xe8, 0x03, 0xbd, 0xe7, 0xcd, 0xdb, 0xbd,
+ 0x9e, 0xaa, 0xec, 0x3b, 0x83, 0xd7, 0xb9, 0xbc, 0x4c, 0xb1, 0x53, 0x3d,
+ 0xa3, 0xe4, 0x9b, 0xbd, 0x8c, 0xb4, 0x44, 0x3d, 0xc7, 0x53, 0x8a, 0x3e,
+ 0xd0, 0xbd, 0x63, 0x3c, 0xfe, 0x4c, 0x81, 0x3d, 0x3f, 0xf5, 0x14, 0x3e,
+ 0xc5, 0xc9, 0xad, 0x3d, 0x01, 0xc2, 0x06, 0x3e, 0x6a, 0x00, 0x3d, 0x3d,
+ 0x69, 0x24, 0xbb, 0x3c, 0xa0, 0xc3, 0xe3, 0xbd, 0x46, 0x4d, 0x59, 0xbd,
+ 0x10, 0x46, 0x33, 0x3e, 0xf8, 0xf0, 0xfd, 0x3b, 0x04, 0x6e, 0x38, 0xbd,
+ 0x42, 0x9a, 0x2a, 0xbd, 0x96, 0xdd, 0xa4, 0x3d, 0x3a, 0x3f, 0xaa, 0xbd,
+ 0x85, 0xc9, 0x29, 0x3d, 0xbd, 0xff, 0x52, 0x3e, 0x4d, 0x98, 0x9b, 0xbd,
+ 0xb6, 0x81, 0xaa, 0xbd, 0xcf, 0xfa, 0x55, 0xbd, 0xd3, 0x76, 0x09, 0xbe,
+ 0xcc, 0x8b, 0x89, 0x3d, 0x47, 0xd7, 0x81, 0xbd, 0xd1, 0xb9, 0xf8, 0xbd,
+ 0x82, 0xe1, 0x4e, 0xbe, 0x30, 0xd4, 0xd5, 0x3d, 0xeb, 0x04, 0x09, 0x3d,
+ 0x82, 0x8b, 0xd1, 0x3c, 0x2d, 0x45, 0x5b, 0x3d, 0x17, 0x6e, 0xa7, 0x3c,
+ 0x4f, 0x1a, 0x12, 0xbd, 0xfe, 0x90, 0x19, 0xbd, 0x4d, 0xdd, 0xcb, 0xbd,
+ 0x7f, 0xa4, 0x16, 0xbe, 0xe2, 0xa0, 0xf2, 0xbd, 0xd8, 0x5c, 0x05, 0xbd,
+ 0xe8, 0x68, 0xb9, 0x3d, 0x35, 0x38, 0x8b, 0x3d, 0xd2, 0x6c, 0x95, 0x3d,
+ 0x4a, 0xd1, 0x58, 0x3b, 0x7c, 0x05, 0x54, 0x3e, 0xde, 0x96, 0xe8, 0x3c,
+ 0x47, 0x99, 0xa5, 0xbe, 0x03, 0x92, 0x6e, 0x3c, 0x29, 0xad, 0x51, 0xbc,
+ 0xa5, 0xd9, 0x12, 0x3e, 0x14, 0xfa, 0x90, 0x3c, 0xec, 0x45, 0x57, 0xbe,
+ 0xf2, 0x44, 0x72, 0xbd, 0x1f, 0x6d, 0x46, 0x3c, 0x80, 0xf3, 0x2a, 0xbd,
+ 0xf8, 0xd8, 0xaf, 0x3c, 0xe0, 0x55, 0xfb, 0x3b, 0x06, 0x60, 0xa1, 0xbd,
+ 0xca, 0xee, 0x9f, 0xbd, 0x58, 0xc3, 0x8c, 0x3e, 0xab, 0x02, 0x06, 0x3d,
+ 0xdc, 0xfe, 0x94, 0xbc, 0x14, 0x3f, 0x40, 0xbd, 0x10, 0xf2, 0xc1, 0x3c,
+ 0x92, 0x1d, 0xd4, 0x3c, 0x39, 0xbd, 0x19, 0xbd, 0xf5, 0x2d, 0xec, 0x3c,
+ 0xbc, 0x73, 0x0e, 0x3e, 0xc7, 0x35, 0xe7, 0xbd, 0x3f, 0x91, 0x35, 0xbd,
+ 0x73, 0xd6, 0x4a, 0x3e, 0xae, 0x49, 0x60, 0xbe, 0xce, 0x33, 0x98, 0x3e,
+ 0x13, 0x70, 0x10, 0xbe, 0xa6, 0x69, 0x59, 0xba, 0x19, 0xe7, 0xc1, 0xbb,
+ 0xc0, 0xcd, 0x9e, 0xbd, 0xc9, 0x1b, 0x0f, 0xbe, 0xe1, 0x8e, 0x68, 0xbc,
+ 0xa9, 0x22, 0x55, 0x3d, 0x77, 0xa6, 0x18, 0xbe, 0xf4, 0x5d, 0x77, 0xbe,
+ 0x37, 0xcd, 0x25, 0xbc, 0xe8, 0xb1, 0x63, 0x3e, 0xe0, 0x9d, 0xdf, 0xbd,
+ 0xcd, 0x6a, 0xe7, 0xb8, 0x11, 0x44, 0x82, 0xbe, 0x9d, 0x7f, 0xc4, 0x3c,
+ 0x95, 0x5f, 0x10, 0xbe, 0x00, 0xf4, 0x80, 0x3d, 0x3b, 0x79, 0xc9, 0xbd,
+ 0xf6, 0xc2, 0x6d, 0x3e, 0x92, 0x4f, 0x72, 0x3d, 0x2d, 0x66, 0xf3, 0xbc,
+ 0x2f, 0xf9, 0x5b, 0x3e, 0xdf, 0x97, 0x18, 0xbe, 0x86, 0xfe, 0x9c, 0xbd,
+ 0x76, 0xeb, 0xd3, 0x3d, 0xb9, 0x8a, 0x0c, 0xbf, 0xe4, 0x39, 0xbd, 0x3d,
+ 0x8e, 0x17, 0x2c, 0xbe, 0xf3, 0x4f, 0xf3, 0x3e, 0xa6, 0x4b, 0x1d, 0x3e,
+ 0x8f, 0xa2, 0x73, 0x3e, 0x43, 0xe6, 0x8c, 0xbe, 0xfe, 0xb6, 0xcb, 0xbe,
+ 0xc8, 0x0a, 0x91, 0x3e, 0xf2, 0x92, 0x26, 0xbe, 0xee, 0x04, 0xce, 0x3b,
+ 0x49, 0x60, 0x39, 0x3e, 0x5e, 0x0c, 0x9a, 0xbc, 0x2e, 0x4d, 0xb3, 0xbe,
+ 0xcb, 0x29, 0x72, 0xbd, 0xef, 0x7f, 0x7d, 0xbd, 0xf8, 0x87, 0x38, 0x3e,
+ 0x4e, 0x5d, 0x3c, 0xbb, 0xfc, 0xc6, 0x25, 0xbd, 0xad, 0xb8, 0x3d, 0x3d,
+ 0xda, 0x51, 0x8d, 0x3c, 0xfc, 0x6a, 0xd0, 0x3c, 0x27, 0x69, 0x1e, 0x3e,
+ 0xbb, 0xe5, 0x3a, 0x3e, 0x54, 0x4b, 0x2e, 0x3d, 0x52, 0xec, 0x18, 0x3e,
+ 0x6b, 0xe0, 0xdd, 0xbd, 0x0b, 0xf2, 0x4f, 0x3d, 0xb2, 0xf4, 0x29, 0xbe,
+ 0x2f, 0xe1, 0xb2, 0xbc, 0x9f, 0xb6, 0xa5, 0xbc, 0xe7, 0x05, 0xd7, 0xbd,
+ 0x26, 0x66, 0x5a, 0xbd, 0x74, 0x8f, 0x39, 0xbe, 0x75, 0x18, 0x08, 0xbf,
+ 0x4a, 0x0d, 0xd8, 0x3d, 0x0a, 0x7d, 0xc1, 0xbd, 0xc7, 0x57, 0x89, 0x3e,
+ 0x6f, 0xdc, 0x0d, 0x3e, 0xb3, 0xb3, 0x1e, 0x3d, 0x42, 0x7c, 0x39, 0x3e,
+ 0xe6, 0x94, 0x1e, 0xbd, 0x6a, 0x24, 0x6b, 0xbe, 0xbf, 0xdd, 0x37, 0xbd,
+ 0x28, 0x7c, 0x2b, 0x3d, 0x85, 0x14, 0xee, 0x3d, 0xa3, 0x95, 0xf4, 0x3d,
+ 0xb1, 0xc5, 0xbb, 0xbe, 0xac, 0xf8, 0xd5, 0xbc, 0xe1, 0xca, 0xef, 0xbd,
+ 0x33, 0x03, 0x15, 0x3c, 0xe3, 0xbf, 0x40, 0xbe, 0x24, 0xe0, 0x9b, 0xbd,
+ 0x31, 0x25, 0x70, 0x3c, 0x1b, 0x47, 0x3f, 0x3e, 0x25, 0xf4, 0xe6, 0xbd,
+ 0x1a, 0x44, 0x62, 0x3e, 0x39, 0x96, 0xce, 0x3d, 0xf3, 0xec, 0xdb, 0xbd,
+ 0x29, 0x80, 0xf9, 0xbd, 0xa4, 0x7b, 0xe3, 0x3b, 0xac, 0xaf, 0x05, 0xbd,
+ 0xb2, 0x82, 0xaa, 0xbd, 0xc3, 0x05, 0x89, 0x3c, 0xed, 0xbe, 0x12, 0x3d,
+ 0x9d, 0x6c, 0x7d, 0xbd, 0x69, 0xdc, 0xb0, 0x3d, 0x01, 0xc4, 0x35, 0xbd,
+ 0x57, 0xd6, 0x4d, 0x3d, 0x33, 0x2c, 0xac, 0x3d, 0x9f, 0xfa, 0x40, 0xbd,
+ 0x0d, 0xb2, 0x26, 0xbc, 0xea, 0x9c, 0x1e, 0xbe, 0x3a, 0x46, 0xc7, 0xbd,
+ 0x57, 0x5e, 0x9b, 0x3d, 0xc0, 0x73, 0x45, 0x3c, 0x78, 0x16, 0x5e, 0x3e,
+ 0x8d, 0x89, 0xb1, 0x3d, 0x07, 0xe3, 0xe4, 0xbd, 0x69, 0x59, 0xb0, 0xbd,
+ 0xdd, 0x32, 0x61, 0x3c, 0x78, 0xec, 0x91, 0x3c, 0xe5, 0xc7, 0x19, 0xbd,
+ 0x2c, 0x89, 0x39, 0xbd, 0xc4, 0x8c, 0xed, 0xbd, 0xa6, 0x04, 0xf9, 0x3d,
+ 0x4b, 0x9e, 0x6c, 0x3d, 0x54, 0x97, 0x26, 0x3e, 0x58, 0x94, 0x2a, 0x3e,
+ 0xda, 0x2f, 0x90, 0x3d, 0xa3, 0xe6, 0x49, 0xbe, 0x91, 0x1d, 0xfb, 0xbb,
+ 0x7b, 0x4f, 0x6a, 0xbc, 0x20, 0x7f, 0xca, 0x3b, 0x15, 0x15, 0x28, 0x3d,
+ 0xe9, 0x84, 0xb3, 0x3d, 0x8a, 0x0a, 0x59, 0xbe, 0x39, 0x66, 0x31, 0x3d,
+ 0x20, 0xab, 0xef, 0xbc, 0x01, 0x82, 0xac, 0xbc, 0xd9, 0xc0, 0x3e, 0xbc,
+ 0xe9, 0xd4, 0xb3, 0x3d, 0x16, 0xe3, 0xe4, 0x3d, 0x36, 0xbf, 0x8d, 0xbd,
+ 0x0e, 0x61, 0x9f, 0x3d, 0xae, 0x8e, 0x8c, 0x3c, 0x46, 0xdc, 0xa0, 0x3d,
+ 0x27, 0x99, 0x03, 0x3c, 0xec, 0xaa, 0x11, 0x3d, 0xbf, 0xb8, 0x63, 0xbb,
+ 0xcf, 0x0a, 0xfd, 0x3d, 0x62, 0xdb, 0x2d, 0xbe, 0x37, 0xee, 0x25, 0x3d,
+ 0x41, 0x70, 0x53, 0x3d, 0x7c, 0x89, 0x21, 0xbe, 0x81, 0x49, 0xcb, 0xbd,
+ 0x5d, 0x30, 0x8a, 0xbd, 0x2c, 0x44, 0xe4, 0x3c, 0x06, 0x63, 0x5d, 0x3d,
+ 0xe4, 0xe5, 0x0c, 0xbe, 0x84, 0xc4, 0x94, 0xbc, 0x9b, 0x0d, 0x0a, 0xbe,
+ 0x77, 0xb6, 0x08, 0x3e, 0x65, 0x7f, 0x88, 0xbc, 0x3e, 0x70, 0xcc, 0xbd,
+ 0x64, 0x9f, 0x51, 0x3d, 0x78, 0x11, 0x5f, 0xbd, 0xc4, 0xc7, 0xb1, 0xbc,
+ 0x29, 0x48, 0xad, 0xbc, 0x3f, 0x72, 0xf0, 0xbc, 0x76, 0x6f, 0x37, 0x3e,
+ 0x30, 0x49, 0x15, 0x3c, 0xe0, 0xff, 0x0c, 0x3c, 0xaa, 0x98, 0x9a, 0xbd,
+ 0x64, 0x16, 0x50, 0xbe, 0x33, 0xf5, 0xc2, 0x3d, 0xe4, 0x85, 0x27, 0x3a,
+ 0x02, 0x91, 0xc4, 0xbd, 0x74, 0xcc, 0x34, 0xbe, 0x35, 0xb5, 0x88, 0x3d,
+ 0x01, 0x82, 0x6f, 0xbb, 0xb2, 0x1e, 0x9d, 0x3d, 0x63, 0x8d, 0x8f, 0x3d,
+ 0x34, 0xee, 0xa2, 0xbd, 0x44, 0x06, 0x17, 0xbb, 0x99, 0xf8, 0xb4, 0x3d,
+ 0x49, 0x58, 0x26, 0xbd, 0x8f, 0x65, 0xd3, 0x3d, 0x6d, 0xc2, 0x24, 0x3d,
+ 0x67, 0x90, 0x96, 0xbc, 0x4a, 0x61, 0xeb, 0xbd, 0x79, 0x76, 0x0e, 0xbe,
+ 0xf9, 0x37, 0x06, 0x3d, 0x8f, 0x21, 0x1d, 0xbc, 0x9c, 0x39, 0xa0, 0x3d,
+ 0xbb, 0x9b, 0x08, 0x3c, 0xe0, 0x62, 0x0a, 0x3d, 0xbe, 0xce, 0xc9, 0xbd,
+ 0xd4, 0x4c, 0x49, 0xbe, 0xa3, 0xb0, 0xd8, 0x3b, 0x65, 0xc8, 0x83, 0xbe,
+ 0x28, 0xf9, 0x1f, 0xbd, 0x91, 0xbf, 0xd3, 0x3d, 0xd7, 0x9f, 0x0a, 0xbe,
+ 0x15, 0x5d, 0x15, 0x3c, 0x84, 0x50, 0x00, 0x3e, 0x45, 0xa1, 0xac, 0x3d,
+ 0x91, 0x34, 0xfd, 0x3d, 0xc8, 0x0f, 0xfd, 0x3d, 0x3b, 0x28, 0xe4, 0xbc,
+ 0xdf, 0xff, 0x78, 0x3c, 0x26, 0xf4, 0x9c, 0xbd, 0xcd, 0x3f, 0x43, 0x3d,
+ 0x62, 0xad, 0x49, 0x3e, 0x4c, 0xcf, 0x21, 0xbe, 0x77, 0xde, 0x2d, 0xbe,
+ 0xb9, 0x5b, 0x3f, 0xbd, 0xe0, 0xdf, 0xb6, 0xbd, 0xb9, 0xd1, 0x09, 0x3e,
+ 0x03, 0xc4, 0x00, 0x3d, 0x10, 0x4b, 0x8e, 0x3e, 0xf8, 0x4d, 0x8a, 0xbd,
+ 0xee, 0x08, 0x31, 0xbd, 0xce, 0x04, 0x81, 0x3d, 0x58, 0xbf, 0x21, 0x3d,
+ 0x6e, 0x25, 0x2f, 0x3b, 0xbf, 0x22, 0x73, 0xbc, 0x9e, 0x75, 0x96, 0xbc,
+ 0x52, 0x2b, 0x4f, 0xbb, 0x4e, 0x89, 0x8d, 0xbd, 0xef, 0xf6, 0x04, 0xbd,
+ 0x96, 0xea, 0x74, 0x3d, 0x00, 0xed, 0x64, 0x3d, 0xc2, 0xa1, 0xf5, 0x3b,
+ 0x40, 0x64, 0x1d, 0xbe, 0xfe, 0xbb, 0xf3, 0x3d, 0xef, 0x38, 0xbc, 0x3d,
+ 0xcc, 0xb3, 0x13, 0x3d, 0x7f, 0x1c, 0x34, 0xbc, 0xe7, 0xfd, 0x09, 0xbe,
+ 0x8b, 0x7a, 0xc0, 0xbd, 0xc1, 0x04, 0x87, 0x3d, 0x74, 0xd1, 0x1e, 0xbe,
+ 0x1d, 0x9a, 0x30, 0x3e, 0x70, 0x65, 0xf3, 0x3d, 0x1a, 0x8a, 0x80, 0x3c,
+ 0xe2, 0xdb, 0x39, 0xbe, 0x02, 0x13, 0x20, 0xbe, 0x47, 0x0f, 0x65, 0x3e,
+ 0x62, 0xf5, 0xac, 0xbe, 0xb5, 0xbc, 0x24, 0xbe, 0x34, 0xc5, 0xf7, 0xbd,
+ 0x9f, 0xe5, 0xa8, 0xbd, 0xec, 0xf3, 0x46, 0x3c, 0xf5, 0xa3, 0x14, 0xbe,
+ 0x84, 0xf4, 0x1d, 0xbe, 0xe1, 0xcf, 0xf8, 0xbd, 0xea, 0xf2, 0xb6, 0xbd,
+ 0x65, 0x1c, 0x66, 0xbd, 0x17, 0xee, 0x85, 0xbd, 0xf1, 0x9f, 0x2d, 0x3e,
+ 0x9f, 0x11, 0x8b, 0x3d, 0x1f, 0x85, 0x7f, 0xbe, 0x8f, 0x81, 0x1d, 0x3a,
+ 0xa0, 0x28, 0x88, 0xbd, 0x88, 0x9a, 0x9c, 0xbd, 0xca, 0x59, 0xbb, 0xbd,
+ 0x70, 0x2e, 0x9c, 0x3d, 0x4c, 0xc3, 0x78, 0xbd, 0x40, 0xe6, 0xa5, 0x3d,
+ 0x1f, 0x4b, 0x87, 0xbe, 0xea, 0xe3, 0x01, 0xbe, 0x6f, 0x63, 0xed, 0xbd,
+ 0x99, 0x85, 0x65, 0xbc, 0x3e, 0x6c, 0x0f, 0xbe, 0x39, 0xf8, 0xbb, 0xbb,
+ 0xf0, 0xdb, 0xca, 0x3d, 0x9a, 0x14, 0x7a, 0x3e, 0x58, 0x40, 0x99, 0xbe,
+ 0x5b, 0x84, 0x29, 0x3e, 0x77, 0x34, 0x0e, 0xbd, 0x43, 0x8d, 0x79, 0xbe,
+ 0x8b, 0x28, 0x59, 0x3e, 0x73, 0x5f, 0x52, 0xbe, 0xa2, 0xe1, 0x12, 0x3d,
+ 0xb1, 0x98, 0x06, 0x3e, 0x76, 0x28, 0x0e, 0x3e, 0x30, 0xe4, 0xda, 0xbb,
+ 0xa8, 0x75, 0x8e, 0xbd, 0xe2, 0xef, 0x01, 0x3e, 0x4c, 0xa4, 0x37, 0x3e,
+ 0x6b, 0x31, 0x57, 0x3d, 0xff, 0x1d, 0xb2, 0xbb, 0x24, 0x06, 0x6f, 0xbd,
+ 0x16, 0x5a, 0xc8, 0xbc, 0xa9, 0x16, 0xd3, 0x3d, 0xa6, 0x60, 0xc7, 0xbc,
+ 0xae, 0x1d, 0xbb, 0xbc, 0x8d, 0x4a, 0x86, 0xbd, 0xcf, 0xc2, 0xe4, 0x3d,
+ 0xb7, 0x22, 0x46, 0xbe, 0x3f, 0x41, 0xba, 0xbd, 0xea, 0xa8, 0x26, 0xbe,
+ 0x82, 0x89, 0x30, 0x3e, 0x83, 0xde, 0x35, 0x3d, 0x46, 0x76, 0xe8, 0xbc,
+ 0x9c, 0xd9, 0x52, 0xbe, 0x2b, 0xc3, 0x36, 0x3d, 0xf8, 0x43, 0xaf, 0xbd,
+ 0x6b, 0x81, 0x84, 0x3d, 0x4e, 0x48, 0xe3, 0x3d, 0xc1, 0x2c, 0x14, 0x3d,
+ 0x3b, 0xf5, 0xe8, 0x3d, 0x0c, 0x2f, 0x78, 0x3e, 0x71, 0x91, 0xd9, 0x3d,
+ 0x94, 0x50, 0xd7, 0xbd, 0xb3, 0xb7, 0x1e, 0xbe, 0x24, 0x10, 0x93, 0xbe,
+ 0x8f, 0xbb, 0xbb, 0xbd, 0xd3, 0x4d, 0x27, 0x3d, 0x24, 0x55, 0x35, 0xbe,
+ 0xb1, 0x38, 0x28, 0xbe, 0x2d, 0xe7, 0x6f, 0x3d, 0x73, 0x88, 0x25, 0xbe,
+ 0x3b, 0xe5, 0x72, 0xbd, 0xf4, 0xf1, 0x63, 0x3d, 0xc0, 0xe8, 0xfc, 0xbd,
+ 0xdb, 0x9a, 0x86, 0x3d, 0x73, 0xdf, 0x2e, 0x3e, 0x8d, 0x64, 0x87, 0xbd,
+ 0x88, 0x1b, 0x03, 0xbe, 0x7e, 0x8a, 0x40, 0x3c, 0x62, 0x07, 0xea, 0xbd,
+ 0x39, 0x7f, 0x82, 0xbd, 0x26, 0x56, 0x7a, 0xbb, 0x0c, 0xb0, 0xae, 0xbd,
+ 0xd8, 0xa4, 0xa1, 0xbc, 0xcc, 0x04, 0x6c, 0x3d, 0xc0, 0x55, 0x7b, 0x39,
+ 0xaa, 0x30, 0xd7, 0x3d, 0xd2, 0x2a, 0x01, 0xbe, 0x0e, 0x21, 0xd0, 0x3a,
+ 0x0d, 0x95, 0xc9, 0x3d, 0xbe, 0x2a, 0x32, 0xbe, 0x25, 0xd9, 0x08, 0x3e,
+ 0x28, 0xdc, 0xb7, 0x3d, 0x38, 0xce, 0x00, 0x3d, 0x0c, 0x26, 0x72, 0x3d,
+ 0x54, 0xdd, 0x8d, 0x3d, 0x08, 0x6d, 0xcd, 0xbc, 0x4e, 0x94, 0xe2, 0xbc,
+ 0xce, 0x02, 0x9b, 0xbc, 0x0b, 0xdf, 0xa8, 0xbd, 0x75, 0xe6, 0xf1, 0xbb,
+ 0xcf, 0x05, 0x90, 0xbc, 0x72, 0x5e, 0x5b, 0xbd, 0x30, 0x60, 0x66, 0x3d,
+ 0xaf, 0xaa, 0x8e, 0x3d, 0xdc, 0xed, 0x7e, 0xbd, 0xd0, 0x5d, 0xad, 0xbd,
+ 0xe8, 0x00, 0xf2, 0xbc, 0x4a, 0xc1, 0x83, 0x3d, 0x53, 0xf1, 0xdb, 0xbc,
+ 0x9a, 0xad, 0x81, 0xbe, 0x63, 0xc6, 0xe3, 0xbd, 0x41, 0xbd, 0xba, 0x3d,
+ 0xa3, 0x8a, 0x99, 0xbd, 0x8a, 0x26, 0xfb, 0x3c, 0x11, 0xd8, 0xcd, 0x3c,
+ 0x87, 0xbb, 0xb0, 0x3d, 0xca, 0xf0, 0xc3, 0x3d, 0x7b, 0x77, 0xae, 0xbd,
+ 0x9f, 0xb1, 0xef, 0x3d, 0x5a, 0xb3, 0x33, 0x3e, 0x04, 0x40, 0xeb, 0x3d,
+ 0x4d, 0xca, 0x49, 0xbe, 0x94, 0x60, 0x03, 0xbe, 0xe4, 0x3f, 0x3a, 0x3b,
+ 0xd5, 0x6b, 0xee, 0x3d, 0xb2, 0x77, 0xdd, 0xbd, 0xe6, 0x15, 0x13, 0xbd,
+ 0xc3, 0x09, 0x7d, 0xbd, 0xa8, 0x51, 0x9f, 0x3d, 0x96, 0x5f, 0x0e, 0x3e,
+ 0x7d, 0x4b, 0x82, 0xbe, 0x1c, 0xfb, 0xf0, 0xbc, 0x3e, 0xf9, 0x29, 0xbd,
+ 0xea, 0x4b, 0x8d, 0x3d, 0x5b, 0x8b, 0x48, 0xbb, 0xa9, 0xe7, 0x17, 0xbc,
+ 0x9f, 0x8c, 0xce, 0x3d, 0x45, 0x7d, 0xa3, 0xbd, 0x87, 0xf3, 0x8e, 0x3d,
+ 0xc9, 0xc7, 0x32, 0x3e, 0xa4, 0x65, 0xf4, 0x3c, 0x7d, 0x7d, 0x85, 0x3c,
+ 0xb1, 0x0b, 0x08, 0x3e, 0x7d, 0x1b, 0x51, 0x3e, 0xbd, 0x9c, 0x93, 0x3d,
+ 0xd4, 0x01, 0xbf, 0xbd, 0xcd, 0x32, 0x2d, 0xbe, 0x81, 0xc3, 0xd3, 0xbc,
+ 0x49, 0x38, 0x3e, 0x3d, 0x90, 0x13, 0x9b, 0x3c, 0x6a, 0x14, 0xa4, 0x3d,
+ 0xd8, 0x52, 0x02, 0xbd, 0xe2, 0xb6, 0x35, 0x3d, 0x8e, 0x4c, 0xcf, 0xbd,
+ 0xaf, 0x75, 0x12, 0xbe, 0x52, 0x25, 0x13, 0xbd, 0xd0, 0x17, 0xed, 0xbd,
+ 0x3c, 0x09, 0xc2, 0x3d, 0xa5, 0x93, 0xfb, 0xbb, 0xa2, 0xc4, 0x12, 0x3e,
+ 0x51, 0x3a, 0x23, 0xbd, 0x83, 0x0b, 0xb1, 0xbd, 0xbd, 0x6d, 0x8e, 0x3d,
+ 0x29, 0x02, 0x13, 0xbe, 0xf7, 0x44, 0x45, 0x3d, 0x8e, 0x21, 0x23, 0x3c,
+ 0x1f, 0x9d, 0x2f, 0x3e, 0x14, 0x0d, 0x06, 0x3d, 0x00, 0x6e, 0xb3, 0xbd,
+ 0x3f, 0x0a, 0x4d, 0x3e, 0xb9, 0xc0, 0x2b, 0xbd, 0x50, 0xf5, 0x48, 0xbd,
+ 0x8d, 0xca, 0x06, 0x3a, 0xee, 0xbd, 0x0b, 0x3d, 0x33, 0xf1, 0x42, 0xbe,
+ 0x29, 0x70, 0x56, 0xbe, 0x02, 0x85, 0xc3, 0x3d, 0xfd, 0xda, 0x24, 0x3d,
+ 0x44, 0x77, 0x1c, 0x3b, 0x45, 0x53, 0x4b, 0xbe, 0xe3, 0x9f, 0x18, 0xbd,
+ 0x64, 0xe4, 0xd6, 0xbc, 0xff, 0xb5, 0xa9, 0xbd, 0x86, 0x74, 0x57, 0xbd,
+ 0xe9, 0x1f, 0x90, 0xbd, 0x84, 0xbd, 0xee, 0x3d, 0x98, 0xaa, 0x2c, 0x3d,
+ 0xa8, 0x71, 0x8d, 0x3d, 0xcf, 0x40, 0xb7, 0x3d, 0x36, 0x38, 0x8f, 0x3d,
+ 0x73, 0xdc, 0xee, 0xbd, 0x70, 0x3e, 0x80, 0x3d, 0xe5, 0x58, 0x39, 0xbd,
+ 0x0c, 0x49, 0xfe, 0xbd, 0x82, 0xc3, 0xe0, 0x3d, 0xe6, 0x47, 0x41, 0xbd,
+ 0x1e, 0x96, 0xb2, 0xbc, 0x54, 0x5f, 0x23, 0x3e, 0xee, 0x07, 0xe4, 0x3c,
+ 0xd1, 0x00, 0x15, 0xbd, 0x37, 0xdd, 0x9c, 0x3d, 0x69, 0xfd, 0xfe, 0xbd,
+ 0x20, 0x65, 0x8e, 0x3d, 0x81, 0xbf, 0x41, 0x3d, 0x2b, 0x4c, 0x3d, 0x3c,
+ 0xab, 0xbf, 0xea, 0xbd, 0xae, 0x9c, 0x3d, 0x3d, 0x19, 0xca, 0x45, 0x3e,
+ 0x6a, 0x6c, 0x8b, 0x3d, 0x78, 0xe1, 0x07, 0xbe, 0x91, 0xad, 0x0a, 0x3c,
+ 0x44, 0xef, 0x79, 0x3d, 0xd6, 0x0c, 0xee, 0x3d, 0xcc, 0x42, 0x14, 0xbe,
+ 0x2f, 0x99, 0x8e, 0xbd, 0xbb, 0x85, 0xb9, 0x3d, 0x2d, 0xf6, 0x58, 0xbd,
+ 0x02, 0xa4, 0x7c, 0xbe, 0x9f, 0xb3, 0x03, 0xbd, 0x19, 0xb4, 0xc1, 0x3d,
+ 0x46, 0xf0, 0xd6, 0x3c, 0x64, 0x86, 0x71, 0x3d, 0xfb, 0x28, 0x76, 0x3c,
+ 0x72, 0x72, 0xcd, 0x3c, 0x80, 0xc0, 0x28, 0x3e, 0x27, 0x7a, 0x99, 0x3d,
+ 0x6a, 0xea, 0x53, 0xbe, 0x6e, 0x81, 0x69, 0xbb, 0x0b, 0x46, 0x50, 0x3c,
+ 0x09, 0x55, 0x01, 0xbe, 0x8e, 0x0d, 0x01, 0x3c, 0x6b, 0x19, 0xe5, 0x3d,
+ 0x43, 0x24, 0xaa, 0x3c, 0x77, 0x17, 0x04, 0xbe, 0x08, 0xf5, 0x1e, 0xbe,
+ 0xa7, 0x58, 0x9e, 0x3b, 0x53, 0xcb, 0x13, 0xbd, 0xb0, 0x83, 0x5e, 0x3e,
+ 0x4f, 0x51, 0x26, 0xbe, 0x10, 0xcb, 0x0b, 0xbe, 0x0a, 0x0b, 0xb4, 0x3d,
+ 0x61, 0xe2, 0x08, 0x3d, 0x5f, 0x68, 0x8c, 0x3d, 0xc0, 0x5d, 0x0c, 0x3d,
+ 0xca, 0xc8, 0x46, 0x3e, 0x41, 0xeb, 0x02, 0xbe, 0xd2, 0x60, 0x89, 0xbd,
+ 0x27, 0x14, 0x35, 0xbc, 0x31, 0x50, 0x3d, 0x3d, 0x7c, 0x24, 0x85, 0xbd,
+ 0xa9, 0x38, 0xc2, 0x3c, 0x27, 0xb4, 0x2f, 0x3d, 0x32, 0x09, 0xa1, 0x3d,
+ 0x84, 0x2e, 0x18, 0x3e, 0x11, 0xcf, 0x67, 0xbd, 0x7d, 0x18, 0xdb, 0x3c,
+ 0x1b, 0xaf, 0x70, 0xbd, 0x32, 0x50, 0x02, 0xbe, 0x4b, 0x1d, 0x17, 0x3c,
+ 0xe2, 0xd0, 0x39, 0xbd, 0x1b, 0x44, 0x4e, 0x3e, 0x7d, 0xcc, 0x1c, 0xbe,
+ 0xd6, 0xbc, 0xa4, 0xbd, 0xde, 0x1c, 0x84, 0x3c, 0x4e, 0x36, 0x5a, 0x3d,
+ 0xa5, 0x40, 0xae, 0x3c, 0xf4, 0x45, 0xec, 0xbd, 0x36, 0x9c, 0xcd, 0xbd,
+ 0x27, 0x04, 0x84, 0x3d, 0x85, 0x4c, 0x48, 0x3c, 0x5d, 0x43, 0x0d, 0x3c,
+ 0x9c, 0x44, 0x27, 0xbe, 0x0d, 0x38, 0xed, 0x3d, 0xd7, 0x74, 0x1d, 0xbe,
+ 0x51, 0xa1, 0x99, 0x3c, 0x1d, 0x62, 0x0b, 0xbc, 0xea, 0x61, 0x31, 0x3e,
+ 0x71, 0x6c, 0x20, 0xbe, 0xc7, 0xee, 0x15, 0xbc, 0xfe, 0x47, 0x16, 0xbe,
+ 0xcf, 0xa0, 0x89, 0x3d, 0xa1, 0x29, 0x14, 0x3d, 0xb1, 0xfb, 0x4f, 0x3d,
+ 0xc2, 0xb4, 0x01, 0x3e, 0xe5, 0x30, 0xfe, 0xbd, 0x20, 0x9d, 0x3a, 0xbd,
+ 0x19, 0x9a, 0x3d, 0x3e, 0x53, 0x92, 0x32, 0xbc, 0xcb, 0xd4, 0x84, 0xbd,
+ 0x80, 0x15, 0x5b, 0x3d, 0x16, 0xe3, 0x4a, 0x3d, 0xc4, 0x52, 0x1a, 0x3d,
+ 0x83, 0x46, 0x35, 0xbe, 0x14, 0x44, 0xd4, 0x3d, 0xd3, 0x77, 0x9b, 0xbd,
+ 0x76, 0x01, 0x65, 0x3d, 0xb7, 0xa5, 0x34, 0xbe, 0xe7, 0xa2, 0x88, 0xbe,
+ 0xd0, 0xf5, 0x0a, 0x3e, 0x2b, 0x80, 0x99, 0x3a, 0xa1, 0x23, 0xe3, 0xbd,
+ 0xae, 0x24, 0x7d, 0xbe, 0xb6, 0x73, 0xe6, 0x3d, 0x4a, 0xd5, 0x98, 0x3d,
+ 0x50, 0x2c, 0xc8, 0xbd, 0xe3, 0xbb, 0xe8, 0xbd, 0xdc, 0x65, 0x96, 0x3d,
+ 0xd1, 0xfa, 0xd6, 0xbd, 0x12, 0x80, 0xd8, 0xbb, 0xff, 0x5c, 0x3c, 0xbe,
+ 0xde, 0xc1, 0x1b, 0xbe, 0x55, 0x13, 0x72, 0x3d, 0x82, 0x70, 0x2b, 0x3e,
+ 0x1f, 0xad, 0x06, 0x3e, 0x35, 0xd3, 0xe8, 0x3d, 0xf6, 0xcd, 0xcb, 0xbc,
+ 0x6e, 0x00, 0x80, 0xbd, 0x14, 0x35, 0x64, 0x3e, 0x45, 0xba, 0xf2, 0xbd,
+ 0x01, 0x5c, 0xf4, 0xbe, 0xc7, 0xf1, 0x2a, 0xbe, 0xcd, 0xec, 0x8b, 0x3d,
+ 0xf8, 0xd8, 0x25, 0x3e, 0xf0, 0xea, 0x87, 0x3b, 0x91, 0x38, 0xe0, 0xbc,
+ 0x52, 0x2b, 0x0e, 0xbc, 0x6e, 0x2d, 0x37, 0xbc, 0x90, 0xae, 0x4e, 0xbb,
+ 0x5d, 0x7b, 0x5b, 0x3e, 0x2e, 0xed, 0x64, 0xbd, 0x48, 0xdb, 0xcf, 0xbe,
+ 0x66, 0xa0, 0xda, 0xbc, 0xef, 0x5b, 0xcc, 0x3d, 0x95, 0x23, 0x48, 0xbd,
+ 0x10, 0xc5, 0x38, 0xbe, 0x76, 0x0a, 0xd3, 0x3b, 0x64, 0x72, 0x0d, 0x3e,
+ 0x15, 0x03, 0x12, 0xbe, 0x37, 0x0e, 0x05, 0x3d, 0xa2, 0xde, 0x91, 0x3c,
+ 0xdc, 0xb6, 0xa9, 0xbd, 0xd1, 0x64, 0x1b, 0xbe, 0x0c, 0x78, 0xb8, 0xbc,
+ 0xe5, 0xb6, 0x2c, 0x3e, 0x80, 0x8b, 0xad, 0xbd, 0x9b, 0xb9, 0x1c, 0x3e,
+ 0x23, 0x0f, 0x3f, 0xbe, 0xfb, 0x7b, 0x56, 0xbe, 0xc5, 0x32, 0x16, 0x3e,
+ 0x91, 0x0e, 0xd9, 0x3d, 0xb5, 0xe0, 0xbf, 0xbd, 0x9b, 0x0c, 0x9a, 0xbd,
+ 0x4c, 0xa6, 0x60, 0x3e, 0x04, 0x4c, 0x00, 0xbe, 0x4d, 0x6b, 0x5d, 0xbe,
+ 0x4a, 0x5f, 0x05, 0xbe, 0xec, 0x78, 0xef, 0x3b, 0x7f, 0x7a, 0x93, 0xbe,
+ 0xb9, 0xce, 0xe5, 0xbd, 0x80, 0x23, 0x85, 0xbd, 0x07, 0xa6, 0x80, 0x3d,
+ 0xae, 0x8e, 0x3d, 0xbc, 0x7c, 0x2b, 0xb8, 0xbd, 0xdc, 0x47, 0x65, 0xbe,
+ 0x99, 0xb6, 0x0e, 0x3d, 0x2b, 0xe9, 0x09, 0x3e, 0x2f, 0xa5, 0x04, 0x3e,
+ 0x2a, 0xf7, 0x9c, 0x3e, 0xfb, 0x8d, 0x25, 0xbe, 0x32, 0x2e, 0x74, 0x3c,
+ 0x18, 0xc1, 0x55, 0xbe, 0xb7, 0xb7, 0xa7, 0xbe, 0x9b, 0x99, 0x8c, 0x3d,
+ 0xcf, 0x99, 0xbc, 0xbc, 0xda, 0xcc, 0x71, 0x3e, 0x95, 0xb9, 0xd7, 0x3e,
+ 0xf2, 0x3e, 0x4b, 0xbd, 0x38, 0x7d, 0x1e, 0x3d, 0xb0, 0x88, 0x9b, 0xbd,
+ 0x33, 0x68, 0x88, 0x3d, 0x37, 0xad, 0x03, 0x3c, 0xab, 0xae, 0xbf, 0x3d,
+ 0xc1, 0x41, 0xb1, 0xbd, 0xa7, 0x8b, 0x19, 0xbd, 0x7c, 0xf6, 0xe5, 0xbd,
+ 0xdd, 0x76, 0x50, 0xbe, 0x67, 0x2b, 0x36, 0xbd, 0x1a, 0x2b, 0x4f, 0x3e,
+ 0x62, 0x46, 0x19, 0x3d, 0x8e, 0xdb, 0xb1, 0x3c, 0x03, 0x4e, 0x68, 0x3b,
+ 0x24, 0xf3, 0x40, 0x3d, 0xd8, 0x60, 0x0a, 0x3e, 0x7d, 0xd9, 0x00, 0x3e,
+ 0xf7, 0x35, 0xb3, 0x3d, 0xe3, 0x81, 0xd5, 0xbc, 0xfc, 0x7c, 0x4a, 0xbd,
+ 0xcd, 0x6c, 0x47, 0xbe, 0xc2, 0x3d, 0x35, 0xbe, 0x14, 0x5d, 0x85, 0xbe,
+ 0x7c, 0xce, 0x86, 0x3d, 0x94, 0x72, 0x40, 0x3d, 0x55, 0x04, 0x94, 0xbd,
+ 0xfb, 0x55, 0x9a, 0xbd, 0xca, 0x79, 0xcc, 0xbd, 0xbb, 0x49, 0x30, 0xbe,
+ 0xd7, 0xe5, 0x47, 0x3e, 0x5e, 0x63, 0x16, 0x3e, 0xae, 0xad, 0x01, 0x3e,
+ 0xe8, 0xc7, 0xc9, 0x3b, 0x66, 0x16, 0x6b, 0xbd, 0xf2, 0xbe, 0xbd, 0x3e,
+ 0xbc, 0xf6, 0x33, 0xbc, 0x46, 0x5b, 0xb0, 0x3d, 0x6f, 0x29, 0x53, 0xbd,
+ 0x4a, 0x3c, 0x14, 0xbd, 0x38, 0xa4, 0x4b, 0x3d, 0x8b, 0x76, 0xe3, 0xbd,
+ 0x69, 0x2c, 0x10, 0xbf, 0x3a, 0x36, 0x50, 0x3d, 0x99, 0xce, 0x50, 0x3e,
+ 0x8a, 0x03, 0x35, 0x39, 0x11, 0x56, 0x64, 0xbe, 0xce, 0x4d, 0xcf, 0xbd,
+ 0xd4, 0xda, 0x0c, 0xbe, 0x0f, 0x0d, 0x66, 0x3e, 0x89, 0x02, 0xea, 0xbd,
+ 0xe7, 0xfa, 0xc2, 0x3e, 0xa0, 0x4b, 0xf7, 0xbd, 0x60, 0xb6, 0x4a, 0xbe,
+ 0xa6, 0x29, 0x4d, 0xbd, 0x9b, 0xa4, 0x34, 0x3c, 0xf0, 0xa4, 0xf7, 0xbd,
+ 0x01, 0x10, 0x88, 0xbd, 0xd7, 0x33, 0xf1, 0x3d, 0x06, 0x08, 0x65, 0x3d,
+ 0x26, 0x13, 0xc9, 0x3d, 0xbf, 0xff, 0xa9, 0x3d, 0xe1, 0xd2, 0x51, 0x3d,
+ 0xf8, 0x7b, 0xe3, 0xbd, 0xb3, 0xdc, 0x92, 0xbd, 0x66, 0xbb, 0xce, 0xbb,
+ 0x54, 0x93, 0x35, 0xbe, 0x5e, 0x1a, 0x7e, 0xbd, 0x56, 0x53, 0xff, 0x3c,
+ 0x97, 0x0c, 0x18, 0xbc, 0xc0, 0x60, 0x4c, 0x3c, 0x71, 0xef, 0x45, 0xbe,
+ 0x6a, 0x76, 0x77, 0x3c, 0x40, 0x13, 0xaf, 0x3c, 0x01, 0xd5, 0xa0, 0xbc,
+ 0x94, 0x26, 0xcd, 0xbd, 0x30, 0xfa, 0xb6, 0x3d, 0xbe, 0x66, 0x9d, 0xbd,
+ 0xf4, 0x3c, 0xb6, 0xbd, 0x86, 0xb2, 0xc8, 0x3d, 0xaa, 0xc4, 0xa9, 0xbd,
+ 0xf6, 0x0e, 0xfd, 0xbd, 0xbd, 0xe1, 0xdf, 0x3d, 0x37, 0x1f, 0xe9, 0xbd,
+ 0xbd, 0x30, 0x38, 0xbe, 0xe4, 0x78, 0xb0, 0xbd, 0x9c, 0xc7, 0x5c, 0x3c,
+ 0x46, 0xa1, 0x9b, 0x3d, 0x0e, 0xcc, 0xbc, 0x3d, 0xed, 0x23, 0xf6, 0x3d,
+ 0x32, 0x20, 0x11, 0xbd, 0xcd, 0xb7, 0x1c, 0xbc, 0x92, 0x17, 0x3a, 0xbd,
+ 0xec, 0xb8, 0xd9, 0xbc, 0xd6, 0xb7, 0x93, 0xbd, 0x29, 0x06, 0x20, 0x3d,
+ 0x73, 0x49, 0x74, 0xbe, 0x1d, 0x64, 0xac, 0x3d, 0xdf, 0xf7, 0x86, 0x3d,
+ 0x5d, 0x8d, 0x86, 0x3d, 0xe7, 0x57, 0xd8, 0x3d, 0xa1, 0xa3, 0x79, 0xbd,
+ 0xbc, 0x7f, 0x53, 0x3d, 0x51, 0x0e, 0x56, 0x3d, 0xad, 0x62, 0xdb, 0xbc,
+ 0xff, 0x74, 0x0a, 0xbe, 0x7e, 0xa6, 0x8e, 0xbe, 0x4d, 0xae, 0x0d, 0xbe,
+ 0x91, 0xcf, 0x2e, 0xbd, 0xe1, 0x3a, 0x03, 0xbe, 0xa5, 0x05, 0x88, 0xbd,
+ 0x91, 0x37, 0x01, 0x3e, 0xd3, 0x7b, 0x03, 0xbc, 0x5e, 0x42, 0x3e, 0x3d,
+ 0x2d, 0x06, 0x9a, 0xbc, 0xf4, 0xf6, 0xf5, 0xbd, 0x7e, 0x72, 0x0e, 0xbe,
+ 0xa0, 0x0f, 0xfb, 0x3d, 0x7b, 0x7a, 0xaf, 0xbd, 0x3a, 0xa0, 0x5b, 0xbe,
+ 0xaa, 0xe5, 0xcc, 0x3c, 0xc1, 0x6f, 0x84, 0xbd, 0xfb, 0x97, 0x50, 0x3d,
+ 0x71, 0x6d, 0xfe, 0xbd, 0x1b, 0xde, 0x04, 0x3d, 0xa1, 0x9e, 0x6e, 0xbd,
+ 0x4e, 0xd0, 0x80, 0x3d, 0xc5, 0x42, 0x91, 0xbd, 0x19, 0x28, 0xdc, 0xbd,
+ 0x84, 0x69, 0xdd, 0x3c, 0x1a, 0x64, 0x84, 0xbd, 0x88, 0x14, 0xd7, 0xbd,
+ 0x76, 0x34, 0xa6, 0xbd, 0xb8, 0xf9, 0xc0, 0xbd, 0xe7, 0xc9, 0xd6, 0x3d,
+ 0x53, 0x1d, 0x06, 0x3e, 0xad, 0x64, 0xcc, 0x3d, 0x96, 0x6b, 0x6e, 0xbe,
+ 0xb1, 0xe1, 0xb0, 0xbc, 0x1f, 0x30, 0x57, 0x3e, 0xd6, 0xeb, 0x8c, 0x3d,
+ 0xec, 0x4e, 0x60, 0x3d, 0xfd, 0x67, 0xc6, 0xbd, 0xf3, 0x65, 0xdf, 0xbc,
+ 0xd1, 0xfb, 0xb9, 0x3d, 0x40, 0xcc, 0xfa, 0xbd, 0x84, 0x0f, 0x49, 0xbc,
+ 0xaa, 0x4a, 0xa0, 0x3d, 0x07, 0x90, 0x45, 0x3e, 0xb8, 0x9e, 0x9a, 0xbc,
+ 0x7f, 0x8c, 0x0a, 0xbd, 0xed, 0x28, 0x97, 0xbd, 0x3d, 0x6a, 0x47, 0x3c,
+ 0x2e, 0xb3, 0x33, 0xbe, 0x18, 0x9f, 0x7a, 0x3d, 0xe8, 0xe8, 0xe1, 0xbd,
+ 0x90, 0x50, 0x22, 0xbd, 0x40, 0x3d, 0x19, 0x3c, 0xd4, 0xf0, 0xdf, 0xbd,
+ 0x76, 0xd7, 0x32, 0xbc, 0xeb, 0x67, 0xda, 0x3d, 0xe6, 0x1d, 0x24, 0xbc,
+ 0xdf, 0x82, 0x06, 0xbe, 0x80, 0x03, 0x20, 0xbe, 0x06, 0xa8, 0x04, 0x3e,
+ 0x1d, 0x71, 0xd0, 0x3d, 0x3c, 0x79, 0xe9, 0xbc, 0xba, 0x19, 0x03, 0xbe,
+ 0xae, 0xa2, 0x54, 0xbe, 0x5f, 0x29, 0xbf, 0xbd, 0xb0, 0x71, 0x6e, 0x3c,
+ 0x1f, 0xd6, 0x18, 0xbe, 0x73, 0x57, 0x56, 0xbd, 0x81, 0x60, 0xef, 0x3c,
+ 0xba, 0x5f, 0xb1, 0x3d, 0x5d, 0xb1, 0x2b, 0x3e, 0x62, 0x08, 0xa2, 0xbd,
+ 0x3b, 0xc6, 0x9f, 0x3d, 0x53, 0xda, 0x70, 0x3d, 0xfd, 0x8c, 0x82, 0x3d,
+ 0x5a, 0x3d, 0xd4, 0x3d, 0xd8, 0xfe, 0xe9, 0x3c, 0x04, 0xe2, 0x12, 0x3e,
+ 0xec, 0x11, 0x2a, 0xbe, 0xee, 0x42, 0x97, 0x3d, 0xb1, 0x23, 0x8c, 0xbd,
+ 0xbf, 0xfc, 0x75, 0xbb, 0x3a, 0x29, 0x0d, 0xbe, 0x70, 0xee, 0x7d, 0xbe,
+ 0x30, 0xde, 0x87, 0x3c, 0x03, 0x62, 0x0f, 0xbd, 0xa5, 0x8a, 0x21, 0x3d,
+ 0xcb, 0xd5, 0x50, 0xbe, 0x28, 0x60, 0x9d, 0xbd, 0x98, 0x53, 0x9a, 0x3d,
+ 0x55, 0xbf, 0xac, 0xbd, 0xa6, 0x95, 0x3a, 0xbd, 0x14, 0xf7, 0xed, 0xbd,
+ 0x40, 0x4c, 0x8f, 0x3d, 0x85, 0x47, 0x98, 0xbc, 0x62, 0xda, 0x6f, 0xbd,
+ 0x53, 0xfe, 0xdd, 0xbd, 0xbc, 0x72, 0xeb, 0xbd, 0x4a, 0xed, 0x6c, 0x3e,
+ 0xbf, 0xe2, 0x2d, 0xbe, 0x11, 0x50, 0xd6, 0xbd, 0xe4, 0x5b, 0xb7, 0x3d,
+ 0x15, 0x9c, 0x21, 0xbe, 0x13, 0x27, 0x25, 0xbe, 0xfa, 0x08, 0x6b, 0xbd,
+ 0xd1, 0x17, 0xd7, 0xbc, 0x36, 0x6d, 0x8c, 0x3c, 0x86, 0x68, 0xb2, 0xbd,
+ 0x53, 0x87, 0xc0, 0xbe, 0x5b, 0xf6, 0x18, 0xbe, 0xc4, 0x10, 0x3a, 0x3d,
+ 0x37, 0x70, 0x47, 0x3e, 0x4a, 0x8c, 0x33, 0xbe, 0x43, 0xb7, 0xa1, 0x3d,
+ 0x1e, 0xa1, 0xf7, 0xbd, 0xf6, 0x9c, 0xe3, 0xbc, 0xb7, 0x6e, 0x0a, 0xbe,
+ 0x5e, 0xd5, 0x94, 0xbd, 0x0e, 0x37, 0xc3, 0xbc, 0x6d, 0x36, 0x57, 0xbd,
+ 0x05, 0x45, 0xc4, 0xbd, 0x00, 0x81, 0xde, 0xbd, 0xbe, 0xae, 0x1c, 0xbd,
+ 0xbe, 0xda, 0x55, 0xbd, 0xc2, 0xa1, 0xc9, 0xbd, 0x39, 0xe9, 0xde, 0x3b,
+ 0xa0, 0xa8, 0x28, 0xbd, 0xf7, 0x6c, 0x86, 0x3d, 0x28, 0x09, 0xaf, 0xbd,
+ 0x57, 0xe0, 0x77, 0x3e, 0xf5, 0xc5, 0x63, 0x3c, 0x65, 0x4e, 0x52, 0xbc,
+ 0x29, 0x47, 0x7b, 0x3e, 0x2a, 0xe9, 0xd1, 0xbc, 0x35, 0x83, 0xd6, 0x3c,
+ 0xc1, 0x16, 0x18, 0x3e, 0x70, 0xd4, 0x11, 0xbd, 0x1a, 0xf6, 0x5e, 0x3d,
+ 0xc9, 0xf3, 0xef, 0xbd, 0xea, 0xee, 0xc6, 0xbd, 0x02, 0x98, 0xdd, 0x3d,
+ 0x00, 0x8a, 0xc1, 0xbd, 0x53, 0xc0, 0x17, 0x3e, 0x3f, 0x80, 0x06, 0xbd,
+ 0x75, 0xdb, 0x6e, 0x3d, 0x27, 0x82, 0x3d, 0xbd, 0x95, 0x61, 0x1e, 0x3e,
+ 0x98, 0x4f, 0x0c, 0x3e, 0x0c, 0x96, 0x25, 0xbc, 0xb9, 0xef, 0x61, 0xbe,
+ 0x00, 0xf2, 0x54, 0x3d, 0x2e, 0xdb, 0x40, 0x3e, 0x29, 0xfe, 0x86, 0xbc,
+ 0xc8, 0x6c, 0x63, 0x3e, 0x12, 0xb2, 0xf1, 0x3d, 0xb0, 0x3e, 0x8d, 0xb8,
+ 0xfa, 0xe6, 0x03, 0xbe, 0x69, 0x45, 0xc0, 0xbd, 0x63, 0x87, 0x9d, 0xbd,
+ 0xb8, 0x91, 0x47, 0x3e, 0x27, 0x43, 0x3d, 0x3e, 0x03, 0x94, 0x62, 0xbd,
+ 0xbf, 0x05, 0xdb, 0x3d, 0x87, 0x46, 0x0f, 0x3d, 0xdf, 0x55, 0xc3, 0xbc,
+ 0xbc, 0x15, 0x05, 0xbe, 0x7e, 0x30, 0x9c, 0xbe, 0x84, 0xb3, 0x75, 0xbd,
+ 0xaa, 0xa5, 0xc1, 0xbd, 0xfa, 0x39, 0x72, 0xbd, 0xbe, 0x0c, 0x0a, 0xbd,
+ 0xfd, 0x4f, 0xcf, 0xbd, 0x86, 0x9d, 0x59, 0x3d, 0xfe, 0xae, 0x87, 0xbd,
+ 0xa0, 0x3c, 0x5e, 0x3d, 0x86, 0x43, 0x0d, 0xbe, 0x70, 0xce, 0x43, 0x3d,
+ 0x5f, 0xf9, 0xcb, 0xbc, 0xff, 0x75, 0xae, 0x3d, 0x9c, 0xb8, 0x2a, 0xbe,
+ 0x21, 0x3f, 0xc4, 0xbd, 0x1c, 0x3f, 0x4d, 0xbc, 0x5f, 0x3a, 0x21, 0xbe,
+ 0xa8, 0xf8, 0xca, 0x3a, 0x3a, 0xe4, 0xf1, 0x3d, 0x43, 0x32, 0xe1, 0x3d,
+ 0x58, 0xea, 0x71, 0x3d, 0x5b, 0x85, 0xdd, 0x3d, 0x69, 0x48, 0x92, 0xbd,
+ 0xf9, 0xab, 0x2f, 0x3e, 0x8f, 0xb5, 0xeb, 0xbd, 0xbc, 0x8f, 0x09, 0x3d,
+ 0x06, 0x46, 0x92, 0xbc, 0xb5, 0x24, 0x5f, 0xbd, 0x46, 0x4e, 0x5c, 0xbd,
+ 0x44, 0xbb, 0xa9, 0x3d, 0x8a, 0x4f, 0xe4, 0x3d, 0x2f, 0x11, 0x2a, 0x3c,
+ 0xa9, 0xd6, 0x59, 0xbd, 0x4c, 0x9e, 0x3d, 0xbd, 0x66, 0xfa, 0xe9, 0x3c,
+ 0x10, 0x49, 0xe7, 0xba, 0xb4, 0xf1, 0x38, 0x3d, 0xd2, 0x7f, 0xed, 0xbd,
+ 0xbb, 0xa2, 0x19, 0x3d, 0x39, 0x7c, 0xcd, 0x3c, 0xd6, 0xf9, 0xd1, 0x3d,
+ 0x9c, 0x9a, 0x21, 0xbc, 0xe7, 0xf2, 0x64, 0x3d, 0x00, 0xe8, 0xf6, 0xbc,
+ 0x62, 0xe3, 0x05, 0xbe, 0xe2, 0x59, 0xe5, 0x3d, 0x51, 0x02, 0xd3, 0xbd,
+ 0xc3, 0x11, 0xda, 0xbd, 0x13, 0x7e, 0x0c, 0xbe, 0x54, 0xc1, 0x72, 0xbd,
+ 0x54, 0xbb, 0x11, 0x3d, 0x2c, 0x1e, 0xfb, 0xbd, 0x81, 0xd5, 0x0b, 0x3d,
+ 0xe0, 0x4b, 0x21, 0xbc, 0x34, 0x0b, 0x30, 0xbe, 0x8b, 0x25, 0x60, 0xbc,
+ 0x12, 0xde, 0x2b, 0x3d, 0x87, 0x0b, 0xfa, 0x3c, 0x6e, 0xb9, 0x33, 0x3d,
+ 0x48, 0x3a, 0xf1, 0xbd, 0x82, 0xec, 0xcf, 0x3d, 0xbd, 0x9d, 0xea, 0x3b,
+ 0xc0, 0x38, 0xb1, 0x3c, 0xfa, 0x59, 0xd7, 0xbd, 0x7f, 0x71, 0xce, 0x3c,
+ 0x15, 0xe5, 0x11, 0xbd, 0x31, 0xe8, 0x44, 0xbc, 0x76, 0x66, 0x8c, 0xbd,
+ 0x13, 0x38, 0x7c, 0xbe, 0x46, 0x76, 0xb4, 0x3d, 0x1e, 0x69, 0x86, 0x3d,
+ 0xb9, 0xa6, 0x9b, 0xbb, 0xa0, 0x12, 0xd6, 0xbd, 0x61, 0xe7, 0xdc, 0x3d,
+ 0x2f, 0xfe, 0x02, 0x3d, 0x4e, 0x93, 0xfe, 0x3c, 0x17, 0x8f, 0x9e, 0xbd,
+ 0x74, 0xec, 0xcc, 0x3c, 0x0c, 0x8f, 0x5e, 0x3d, 0x42, 0x33, 0x87, 0x3d,
+ 0xb4, 0x60, 0x8b, 0xbd, 0xa2, 0xa7, 0x1f, 0x3e, 0xd3, 0x51, 0xce, 0xbd,
+ 0xdd, 0x50, 0x16, 0xbd, 0xe4, 0x27, 0x0e, 0x3d, 0x86, 0x6d, 0xf0, 0xbc,
+ 0x6c, 0x3e, 0x89, 0x3d, 0xba, 0xb4, 0xe7, 0x3d, 0x3d, 0xaa, 0x6f, 0xbd,
+ 0xf6, 0xf5, 0xb5, 0x3d, 0x1e, 0xbe, 0x0a, 0xbe, 0x50, 0x8e, 0x22, 0x3d,
+ 0x1b, 0xd7, 0xe7, 0xbd, 0x23, 0xb0, 0x10, 0x3e, 0x2b, 0x30, 0x27, 0xbe,
+ 0x8c, 0x66, 0xed, 0x3c, 0xe7, 0xe8, 0x01, 0xbe, 0x20, 0x88, 0x4c, 0x3d,
+ 0xea, 0x02, 0x44, 0xbe, 0x96, 0x9c, 0x17, 0x3d, 0xb4, 0xaa, 0xbd, 0xbd,
+ 0xe9, 0x2d, 0xe8, 0x3c, 0x4f, 0x30, 0xd0, 0x3d, 0xb7, 0xed, 0x98, 0xbd,
+ 0xd7, 0x8c, 0x3e, 0x3e, 0xb4, 0xce, 0x1a, 0xbe, 0x18, 0x75, 0x0d, 0x3e,
+ 0xe7, 0xbd, 0x79, 0x3e, 0xae, 0xd3, 0xb8, 0xbd, 0xb2, 0x2b, 0x63, 0x3c,
+ 0xf1, 0xc9, 0x12, 0x3e, 0xd6, 0x89, 0xa8, 0xbd, 0x97, 0x18, 0x3e, 0xbd,
+ 0x81, 0xc1, 0x89, 0xbd, 0x3a, 0x77, 0xd5, 0x3d, 0x84, 0xb0, 0x14, 0xbe,
+ 0x13, 0x3a, 0x3c, 0x3d, 0x2c, 0xac, 0x95, 0xbd, 0xd8, 0x83, 0xc0, 0xbd,
+ 0xfd, 0x76, 0x02, 0xbe, 0x7b, 0x2f, 0x8c, 0xbd, 0x96, 0xbc, 0x50, 0xbd,
+ 0x35, 0xdc, 0x09, 0xbe, 0xa4, 0x7e, 0xc6, 0x3c, 0xc8, 0x15, 0x3f, 0x3e,
+ 0x37, 0xec, 0x37, 0xbd, 0x55, 0x8c, 0xbc, 0xbc, 0xe1, 0xb0, 0x63, 0xbd,
+ 0x0a, 0x48, 0x7c, 0x3a, 0xa3, 0x08, 0x1c, 0xbe, 0x37, 0xd9, 0x1d, 0xbe,
+ 0x2d, 0x4b, 0x58, 0xbe, 0xbc, 0x84, 0xc9, 0x3d, 0x8b, 0x3e, 0xba, 0xbd,
+ 0x17, 0x97, 0x66, 0xbe, 0xbd, 0x30, 0x9d, 0xbd, 0xb9, 0xe4, 0x23, 0xbd,
+ 0x9e, 0x6f, 0x20, 0xbe, 0x64, 0x30, 0xfc, 0x3d, 0x53, 0x48, 0x5b, 0x3d,
+ 0xfa, 0x67, 0x22, 0x3d, 0xe2, 0x9e, 0x88, 0xbd, 0x9c, 0x0b, 0x2f, 0xbd,
+ 0x3a, 0x59, 0x2c, 0x3d, 0x5f, 0x3e, 0x59, 0xbd, 0xfb, 0x37, 0x82, 0x3d,
+ 0x5a, 0xee, 0xbc, 0x3d, 0xd6, 0x99, 0x05, 0xbe, 0xed, 0x8a, 0xe8, 0xbd,
+ 0x74, 0x94, 0x2a, 0x3e, 0xca, 0xe1, 0xd9, 0xbd, 0x9f, 0x0f, 0x00, 0x3e,
+ 0x9a, 0xf9, 0x40, 0xbd, 0x11, 0xdd, 0x88, 0xbd, 0x76, 0x1d, 0x85, 0x3c,
+ 0x7a, 0x96, 0xdd, 0xbd, 0x7b, 0x02, 0x12, 0x3e, 0x29, 0x39, 0x48, 0x3d,
+ 0xc2, 0xed, 0x0f, 0x3d, 0xc5, 0x46, 0x0f, 0xbe, 0x85, 0x70, 0xd0, 0x3d,
+ 0xe3, 0x42, 0x5e, 0x3d, 0xb1, 0xf5, 0xdf, 0x3d, 0x0e, 0x7b, 0xf6, 0xbd,
+ 0xf5, 0xa6, 0xf2, 0xba, 0x0d, 0x4a, 0x8d, 0xbd, 0x20, 0xa1, 0x08, 0x3e,
+ 0x48, 0xd9, 0xd4, 0xbd, 0x28, 0x5f, 0x66, 0xbd, 0xbc, 0x07, 0x4c, 0x3d,
+ 0x79, 0x82, 0xe9, 0x3d, 0xce, 0x06, 0x35, 0xbd, 0xdb, 0xc6, 0x4a, 0xbc,
+ 0x5f, 0xc9, 0x3a, 0xbe, 0x28, 0x54, 0xbb, 0x3d, 0xb8, 0xd4, 0x92, 0x3c,
+ 0xc0, 0xe7, 0x0f, 0xbe, 0xca, 0xb2, 0xe0, 0x3d, 0x96, 0x9e, 0x7d, 0x3d,
+ 0x05, 0x40, 0xf8, 0xbd, 0xcb, 0x82, 0x75, 0x3a, 0x6d, 0x4b, 0xd7, 0xbd,
+ 0x9e, 0x26, 0xd6, 0x3d, 0x57, 0xdc, 0x0c, 0xbe, 0xcf, 0xff, 0xc7, 0x3d,
+ 0xa4, 0x8a, 0x0a, 0xbe, 0xca, 0xe7, 0x86, 0xbd, 0xa9, 0x4e, 0xab, 0x3c,
+ 0x02, 0x73, 0x3b, 0x3e, 0xd1, 0xb4, 0xa8, 0x3c, 0x9f, 0xe7, 0x04, 0xbe,
+ 0xfd, 0x9a, 0x9c, 0x3d, 0x88, 0x0f, 0x0f, 0xbe, 0x63, 0x19, 0xc0, 0x3c,
+ 0xa6, 0x54, 0xa3, 0x3d, 0xa5, 0x5c, 0xb7, 0x3d, 0xe4, 0xc4, 0x10, 0xbd,
+ 0x16, 0xb5, 0x0b, 0xbd, 0x05, 0x26, 0x28, 0x3e, 0xe2, 0xdb, 0x0c, 0xbe,
+ 0x47, 0xa6, 0xfd, 0xbd, 0x7e, 0x7f, 0x3e, 0xbd, 0xfb, 0xb8, 0xee, 0xbd,
+ 0xf3, 0x1e, 0x0b, 0xbd, 0xd4, 0xfc, 0x69, 0xbd, 0x1b, 0x10, 0x9c, 0x3d,
+ 0xc2, 0x81, 0x93, 0xbd, 0x1d, 0x43, 0x06, 0xbe, 0x60, 0x94, 0x46, 0x3e,
+ 0x0d, 0x03, 0x85, 0x3d, 0x09, 0x14, 0x81, 0x3d, 0xa6, 0x7f, 0x02, 0xbe,
+ 0xe6, 0xd5, 0x27, 0x3e, 0x7e, 0x54, 0xa2, 0xbd, 0x02, 0x4b, 0xcd, 0xbb,
+ 0x7f, 0xae, 0x6b, 0xbc, 0x06, 0x71, 0x18, 0x3d, 0x9e, 0x9d, 0xc0, 0x3c,
+ 0x21, 0xae, 0x80, 0x3c, 0xed, 0x68, 0x0b, 0x3e, 0xc1, 0x12, 0xa0, 0x3d,
+ 0x5f, 0xd2, 0xb2, 0xbd, 0xac, 0xb4, 0x3c, 0xbe, 0x5f, 0xf8, 0x72, 0x3b,
+ 0xd3, 0x94, 0x0b, 0x3e, 0x93, 0xd6, 0x06, 0xbe, 0xbe, 0xba, 0x3a, 0xbd,
+ 0x1a, 0x20, 0x53, 0xbc, 0xc3, 0x03, 0xb8, 0xbd, 0xcb, 0x19, 0x9d, 0xbd,
+ 0xe6, 0x87, 0xcb, 0x3c, 0x64, 0x8c, 0x8b, 0x3d, 0x29, 0xdc, 0x47, 0xbe,
+ 0xb6, 0x12, 0x22, 0xbd, 0xfa, 0x41, 0xb1, 0x3d, 0x6e, 0x40, 0x01, 0xbe,
+ 0xd4, 0x5c, 0xd6, 0x3d, 0x3d, 0x6d, 0x13, 0xbe, 0x65, 0x31, 0xfc, 0xbc,
+ 0xc6, 0x9e, 0xae, 0xbe, 0x70, 0x37, 0xab, 0xbc, 0xc4, 0x62, 0x06, 0x3e,
+ 0x01, 0x82, 0x32, 0x3d, 0xe3, 0xce, 0x19, 0x3e, 0xa0, 0x7c, 0xd6, 0x3b,
+ 0xbe, 0xb4, 0x9f, 0xbd, 0x60, 0x71, 0xc8, 0x3d, 0x5e, 0x04, 0x48, 0xbe,
+ 0xd7, 0x04, 0x47, 0xbe, 0x39, 0xd1, 0x05, 0xbe, 0x27, 0xd3, 0xf2, 0x3d,
+ 0xc4, 0x7c, 0xf8, 0x3d, 0x17, 0x7d, 0x29, 0x3e, 0xae, 0xc8, 0xdd, 0x3d,
+ 0xf0, 0x5a, 0xf1, 0x3a, 0xfb, 0x5c, 0xe6, 0x3d, 0x1c, 0x88, 0x5d, 0x3d,
+ 0xe7, 0x94, 0xd0, 0xbe, 0x47, 0x87, 0xa5, 0x3d, 0xcc, 0x49, 0x69, 0xbe,
+ 0x82, 0x58, 0x9c, 0x3c, 0x2b, 0xf8, 0x57, 0x3d, 0xe5, 0x2a, 0xe1, 0xbd,
+ 0x4f, 0x7b, 0xaf, 0xbd, 0xd8, 0x23, 0x9c, 0x3d, 0x2d, 0xab, 0x32, 0xbd,
+ 0x33, 0x25, 0x1c, 0xbd, 0x4e, 0x0c, 0x67, 0xbd, 0x69, 0x50, 0x18, 0xbe,
+ 0xd1, 0x56, 0xc4, 0xbd, 0xa3, 0x6a, 0xa1, 0x3e, 0xa0, 0xa2, 0x3e, 0x3c,
+ 0xef, 0x41, 0x8b, 0x3d, 0x49, 0x5e, 0x38, 0xbe, 0x9d, 0x8f, 0xa5, 0x3d,
+ 0xe0, 0xee, 0x15, 0xbd, 0xca, 0x2d, 0x91, 0xbd, 0x1a, 0x59, 0x29, 0x3e,
+ 0xd2, 0xca, 0x36, 0x3e, 0x15, 0x7c, 0xac, 0x3c, 0x1f, 0xa7, 0x0f, 0xbe,
+ 0xa7, 0xb6, 0x74, 0x3e, 0x1b, 0x58, 0xba, 0xbd, 0x8d, 0x7f, 0xd6, 0xbc,
+ 0x1f, 0x4f, 0x1f, 0xbe, 0x41, 0xf2, 0x41, 0xbe, 0x2b, 0x1b, 0x66, 0xbd,
+ 0x6e, 0xf7, 0xd2, 0xbd, 0x96, 0x1a, 0x9d, 0xbc, 0x57, 0x99, 0xa8, 0x3b,
+ 0xbc, 0x04, 0x38, 0xbe, 0x49, 0x4b, 0x9c, 0xbe, 0x07, 0x2f, 0x09, 0xbe,
+ 0x8a, 0x6b, 0x2d, 0x3d, 0x85, 0x2b, 0x6a, 0x3e, 0xda, 0xb1, 0x6b, 0xbe,
+ 0xfc, 0x12, 0xdc, 0xbc, 0x18, 0x43, 0x4b, 0xbe, 0xd3, 0x38, 0x90, 0xbb,
+ 0x0e, 0xe6, 0x1a, 0xbe, 0x9b, 0x80, 0xe0, 0xbc, 0xd0, 0x49, 0xe2, 0xbc,
+ 0x0c, 0xda, 0x8d, 0x3e, 0x19, 0xbc, 0x05, 0x3e, 0x51, 0xd1, 0x93, 0x3e,
+ 0x58, 0xf6, 0x47, 0x3e, 0x7e, 0x2b, 0x2e, 0xbe, 0x50, 0x3a, 0xeb, 0xbd,
+ 0x2b, 0xaf, 0x0d, 0x3c, 0xba, 0x9d, 0x10, 0xbe, 0x00, 0x44, 0x3e, 0xbe,
+ 0x92, 0x2b, 0x5f, 0xbe, 0x70, 0xee, 0x9a, 0x3e, 0x40, 0x89, 0xd8, 0x3e,
+ 0x92, 0x3d, 0x0c, 0xbe, 0xb7, 0x1e, 0x5e, 0xbd, 0x86, 0xcf, 0x76, 0xbe,
+ 0x87, 0xe1, 0x9f, 0x3e, 0xb6, 0xda, 0x90, 0xbb, 0x37, 0x00, 0xce, 0x3d,
+ 0x03, 0xfc, 0x8d, 0x3e, 0x3a, 0x23, 0xd9, 0x3d, 0x6c, 0x4b, 0x42, 0x3d,
+ 0x55, 0x7d, 0xf7, 0xbd, 0xe1, 0xc1, 0xaf, 0xbd, 0x57, 0x35, 0xb0, 0x38,
+ 0xef, 0xc2, 0x48, 0xbd, 0xe7, 0xdf, 0x98, 0x3d, 0x9c, 0x0b, 0x31, 0x3e,
+ 0x8a, 0x6c, 0x87, 0x3e, 0xae, 0x40, 0x9b, 0x3d, 0x17, 0x53, 0x4f, 0xbe,
+ 0x36, 0xf8, 0xed, 0x3d, 0x32, 0x86, 0x3d, 0x3d, 0xff, 0x4d, 0x53, 0xbe,
+ 0x0d, 0xcf, 0x27, 0xbd, 0x70, 0x85, 0x66, 0xbd, 0xe0, 0x7a, 0x96, 0xbe,
+ 0x5e, 0x06, 0xa7, 0x3c, 0xc1, 0x13, 0x15, 0xbe, 0xe6, 0x93, 0x91, 0xbe,
+ 0x4e, 0xce, 0x50, 0xbe, 0x7e, 0x61, 0x9c, 0x3d, 0x0d, 0x95, 0xe7, 0xbe,
+ 0x5c, 0xf7, 0x11, 0xbe, 0x51, 0x9a, 0x6c, 0x3e, 0xb5, 0x85, 0x4d, 0x3e,
+ 0x1b, 0x82, 0x04, 0x3e, 0xaf, 0x66, 0x98, 0x3e, 0xee, 0x93, 0x23, 0x3e,
+ 0x7c, 0x22, 0x96, 0x3c, 0x38, 0x1f, 0x52, 0x3d, 0x60, 0x4a, 0x06, 0x3e,
+ 0x61, 0xf0, 0xbb, 0xbc, 0xfb, 0x56, 0x2a, 0x3d, 0xdb, 0x82, 0xbe, 0xbd,
+ 0xb9, 0xa1, 0x09, 0xbe, 0xd6, 0x8c, 0x41, 0xbd, 0x81, 0xa2, 0x3f, 0xbe,
+ 0x2e, 0xa6, 0x9d, 0xbd, 0x0b, 0x1f, 0x98, 0xbe, 0x82, 0x37, 0xaa, 0xbe,
+ 0x7f, 0x02, 0x3c, 0xbd, 0x5a, 0xa3, 0xcf, 0xbc, 0x7f, 0x06, 0x0c, 0x3e,
+ 0x07, 0x95, 0xa5, 0x3e, 0xb5, 0xfa, 0xad, 0xbc, 0xa0, 0xfb, 0x86, 0xbd,
+ 0x98, 0xbd, 0xc3, 0xbd, 0xde, 0x87, 0x2e, 0x3e, 0x06, 0xa6, 0xc2, 0xbd,
+ 0x9f, 0xf3, 0x7d, 0xbc, 0xc9, 0x37, 0xf5, 0x3c, 0xe4, 0x03, 0x46, 0xbd,
+ 0x79, 0xc1, 0xe2, 0xbd, 0xa0, 0x1a, 0x0f, 0xbe, 0x3d, 0xef, 0xe4, 0xbb,
+ 0x33, 0x5d, 0x4b, 0xbd, 0xb3, 0x7e, 0x01, 0xbe, 0x2c, 0x3f, 0xbe, 0x3c,
+ 0x6f, 0xcf, 0x1d, 0x3d, 0x1e, 0x59, 0xd7, 0xbd, 0x47, 0x5d, 0x94, 0xbd,
+ 0xfe, 0x6a, 0x80, 0xbc, 0xaa, 0x09, 0xf2, 0x3d, 0x11, 0x50, 0x08, 0x3d,
+ 0x98, 0x9e, 0xdf, 0xbd, 0x6c, 0x00, 0x1b, 0x3e, 0xaa, 0xa0, 0x11, 0x3d,
+ 0x24, 0x10, 0x7c, 0x3b, 0xfe, 0x03, 0x09, 0x3e, 0x64, 0x0c, 0x86, 0x3d,
+ 0x59, 0x3d, 0xec, 0xbd, 0x75, 0x60, 0x78, 0x3d, 0xf9, 0x96, 0x0c, 0x3e,
+ 0xe5, 0x27, 0x20, 0xbd, 0xb6, 0x4d, 0xed, 0xbc, 0x3d, 0x1f, 0xab, 0x3d,
+ 0xda, 0x91, 0x8a, 0xbd, 0xfe, 0x2d, 0xcb, 0x3d, 0x4b, 0xb6, 0x98, 0xbd,
+ 0xd4, 0x98, 0xf0, 0xbd, 0xc1, 0x8e, 0xe2, 0x3d, 0x49, 0xc9, 0x95, 0xbd,
+ 0x44, 0x76, 0xd6, 0x3d, 0x55, 0x84, 0xcb, 0xbd, 0x07, 0xfd, 0xe0, 0xbd,
+ 0xc2, 0xbe, 0xe5, 0x3c, 0x8f, 0x01, 0xaf, 0x3d, 0xad, 0xf7, 0x9b, 0x3d,
+ 0x70, 0x16, 0x0c, 0xbe, 0xe6, 0x25, 0xd3, 0x3d, 0xff, 0xe2, 0xcc, 0x3d,
+ 0xe4, 0x87, 0x2d, 0x3d, 0x46, 0xc1, 0xa3, 0x3d, 0x7a, 0xc5, 0x00, 0xbe,
+ 0xcd, 0x6e, 0xd2, 0x3d, 0x7c, 0x7b, 0xf6, 0x3c, 0x43, 0x31, 0x82, 0x3c,
+ 0xce, 0x1e, 0xbb, 0x3d, 0x74, 0xd4, 0x29, 0xbe, 0x91, 0xb4, 0x12, 0x3d,
+ 0xb5, 0xd6, 0x15, 0x3e, 0xe8, 0x41, 0x07, 0x3e, 0x35, 0x1a, 0x08, 0x3e,
+ 0x44, 0x0f, 0xb1, 0x3d, 0x71, 0xe5, 0x3a, 0xbe, 0x61, 0x15, 0xa1, 0x3d,
+ 0x22, 0xef, 0xca, 0x3d, 0x4f, 0xaf, 0xcf, 0x3d, 0xc0, 0xaf, 0x35, 0xbe,
+ 0x33, 0xe8, 0x01, 0x3e, 0xac, 0x28, 0x06, 0xbe, 0x03, 0xbe, 0x37, 0xbd,
+ 0x64, 0x3f, 0x97, 0x3d, 0xa1, 0x3f, 0x9c, 0x3c, 0x9c, 0x42, 0x62, 0xbd,
+ 0x5b, 0x49, 0x39, 0x3d, 0xef, 0xd5, 0xc9, 0x3d, 0xcf, 0x04, 0x74, 0xbd,
+ 0xa7, 0x0c, 0x4b, 0x3d, 0x2c, 0x15, 0x0e, 0xbe, 0xf2, 0xd2, 0x86, 0xbd,
+ 0x4d, 0xf9, 0xab, 0xbd, 0xe0, 0x6f, 0x0b, 0xbe, 0x7e, 0xeb, 0xb6, 0xbd,
+ 0x96, 0x49, 0xbf, 0x3c, 0x26, 0xe4, 0xc1, 0x3d, 0xa8, 0xa1, 0xef, 0xbd,
+ 0xad, 0x9c, 0x96, 0x3c, 0x76, 0x0c, 0x8f, 0xbd, 0xb2, 0x11, 0xd6, 0xbc,
+ 0x1e, 0x70, 0x33, 0x3d, 0xf2, 0xc8, 0x29, 0xbe, 0xce, 0x0d, 0xcf, 0xbd,
+ 0xde, 0x65, 0xd5, 0x3d, 0x61, 0x72, 0x7b, 0x3d, 0xe2, 0x0c, 0x86, 0x3d,
+ 0xa8, 0x93, 0x46, 0x3d, 0x64, 0x23, 0xb2, 0xbc, 0x63, 0xe0, 0x73, 0xbd,
+ 0xd7, 0x5d, 0xb6, 0x3d, 0x0e, 0x8d, 0xfc, 0xbc, 0x66, 0xe4, 0x5a, 0xbd,
+ 0x5a, 0x2d, 0x1c, 0xbc, 0x91, 0x09, 0x38, 0x3d, 0xd3, 0xe9, 0xa7, 0x3c,
+ 0xfb, 0xed, 0x60, 0xbe, 0x73, 0x7f, 0x24, 0x3d, 0x7a, 0xc7, 0x71, 0xbe,
+ 0x40, 0x00, 0xd0, 0x3d, 0x84, 0x5d, 0xef, 0x3c, 0xb2, 0xb0, 0xbe, 0xbc,
+ 0xe0, 0x0a, 0x28, 0xbe, 0x35, 0x2e, 0xb0, 0xbd, 0xae, 0x9a, 0xaf, 0xbc,
+ 0xf1, 0xdb, 0x57, 0x3d, 0x63, 0xaa, 0x88, 0xbd, 0xb9, 0xee, 0xea, 0xbc,
+ 0xc1, 0x79, 0xdf, 0x3d, 0x57, 0x78, 0x15, 0x3c, 0x0f, 0x5f, 0x45, 0xbe,
+ 0x19, 0x66, 0x2b, 0xbe, 0x84, 0x8d, 0x0b, 0xbc, 0xe8, 0xe1, 0x62, 0x3d,
+ 0x49, 0xe9, 0x7f, 0xbe, 0x12, 0x65, 0xd7, 0x3d, 0x00, 0x77, 0x68, 0xbc,
+ 0x91, 0xa9, 0xff, 0xbb, 0x27, 0x93, 0x96, 0x3d, 0x69, 0xca, 0x2c, 0x3d,
+ 0x1f, 0x4e, 0x36, 0xbd, 0x9a, 0x50, 0x6b, 0x3d, 0x42, 0x8a, 0x8a, 0xbd,
+ 0xd3, 0x8d, 0x90, 0x3e, 0xd5, 0x36, 0x94, 0x3d, 0xc5, 0xe7, 0x9d, 0x3d,
+ 0x12, 0xa2, 0x85, 0xbc, 0x66, 0x67, 0x26, 0xbd, 0xb2, 0x36, 0xc0, 0xbd,
+ 0xee, 0x2e, 0xa8, 0x3c, 0x8e, 0xf6, 0xf1, 0x3d, 0x6f, 0x5f, 0x40, 0x3d,
+ 0x43, 0x2d, 0x0d, 0xbe, 0xc1, 0x94, 0x54, 0x3d, 0xca, 0xf3, 0xf0, 0x3b,
+ 0x4e, 0xb5, 0x91, 0x3b, 0x9f, 0xb6, 0xe9, 0xbd, 0xa2, 0x44, 0xc7, 0x3d,
+ 0x7c, 0xe8, 0xa1, 0x3d, 0xe9, 0x09, 0x9b, 0xbd, 0xa7, 0x1d, 0x50, 0xbd,
+ 0x96, 0xe4, 0x4e, 0x3d, 0x63, 0x57, 0xab, 0x3d, 0xf4, 0x89, 0x21, 0xbb,
+ 0xee, 0x32, 0x7d, 0x3d, 0x5f, 0x62, 0x44, 0xbd, 0x3b, 0xa5, 0x77, 0x3e,
+ 0x89, 0x11, 0x3c, 0xbe, 0x95, 0x1f, 0x5c, 0xbe, 0xf5, 0xbb, 0x01, 0x3e,
+ 0x37, 0x5d, 0x4f, 0xbd, 0xed, 0x65, 0x32, 0xbe, 0x7d, 0xfc, 0xdc, 0x3d,
+ 0xd5, 0x84, 0x38, 0x3c, 0x08, 0xc4, 0xa2, 0xbd, 0x60, 0x1b, 0xd8, 0xbd,
+ 0xf5, 0xcd, 0x99, 0xbd, 0x93, 0xa8, 0xdd, 0xbd, 0xf6, 0x12, 0xda, 0x3d,
+ 0x6a, 0xed, 0x81, 0x3d, 0xf3, 0x93, 0x92, 0xbe, 0x9e, 0x04, 0x29, 0x3d,
+ 0xe1, 0x7d, 0xc6, 0xbd, 0xb6, 0x67, 0x85, 0x3d, 0xf1, 0x20, 0x35, 0xbe,
+ 0x57, 0xd0, 0x1c, 0x3c, 0x9e, 0xe4, 0x74, 0xbd, 0x84, 0xb3, 0x85, 0x3c,
+ 0x07, 0x94, 0x15, 0xbe, 0x95, 0x58, 0x6a, 0xbd, 0xe0, 0x3f, 0x9f, 0xbd,
+ 0xe7, 0xf5, 0xfa, 0x3c, 0xf9, 0x32, 0x44, 0xbe, 0x6d, 0x2a, 0x57, 0x3d,
+ 0xf4, 0xe0, 0xb8, 0xbd, 0xf1, 0x95, 0x1d, 0x3e, 0x1e, 0x96, 0xef, 0xbd,
+ 0x40, 0x9b, 0x2c, 0x3e, 0x77, 0xfa, 0xf4, 0xbd, 0xfc, 0x7c, 0x20, 0xbe,
+ 0x9e, 0xec, 0x80, 0x3b, 0x86, 0xf6, 0xa6, 0xbd, 0xdd, 0xe3, 0x1a, 0xbe,
+ 0xa5, 0xf1, 0x0f, 0x3e, 0x86, 0x45, 0xbf, 0x3d, 0x27, 0xc1, 0x0a, 0x3e,
+ 0x00, 0x6a, 0x48, 0xbe, 0x13, 0xe6, 0xb3, 0x3c, 0x46, 0xa0, 0x1e, 0x3d,
+ 0x13, 0xf9, 0xfd, 0x3c, 0x8b, 0xbe, 0xf9, 0x3d, 0x2c, 0x76, 0x58, 0x3d,
+ 0xd7, 0x0f, 0x4a, 0x3e, 0x2e, 0xf7, 0x0c, 0x3d, 0x5b, 0x24, 0x01, 0x3e,
+ 0xd1, 0xb0, 0x3d, 0x3e, 0xe3, 0xea, 0xf4, 0xbd, 0x3e, 0x4f, 0x01, 0xbe,
+ 0x9f, 0x37, 0x9a, 0x3d, 0x42, 0x28, 0x03, 0x3e, 0xdc, 0x65, 0x44, 0xbc,
+ 0xde, 0x4a, 0x2e, 0x3e, 0x58, 0xec, 0xa2, 0xba, 0xa5, 0x88, 0xa6, 0xbd,
+ 0x9a, 0x00, 0x97, 0x3c, 0x7a, 0x50, 0x67, 0xbd, 0xfc, 0xca, 0xa5, 0xbd,
+ 0x34, 0x92, 0x3e, 0x3e, 0x07, 0xcf, 0x49, 0x3e, 0x8c, 0xa5, 0x16, 0x3e,
+ 0xf3, 0x7f, 0x4d, 0x3e, 0xe6, 0x82, 0x4c, 0x3e, 0x05, 0x06, 0xab, 0xbd,
+ 0x53, 0x1a, 0xcb, 0xbd, 0x51, 0x54, 0x2b, 0xbd, 0x07, 0xf3, 0x97, 0xbe,
+ 0x04, 0x6f, 0x4a, 0x3d, 0x65, 0xf3, 0x1b, 0xbe, 0x31, 0x50, 0x9c, 0x3d,
+ 0x56, 0xa3, 0xc7, 0xbd, 0x2e, 0xe5, 0x14, 0x3d, 0x52, 0xaa, 0x73, 0xbe,
+ 0xeb, 0x2c, 0x16, 0xbb, 0x19, 0x32, 0x0b, 0xbe, 0xed, 0x35, 0x9b, 0xbd,
+ 0xbf, 0x56, 0xb5, 0x3d, 0x3a, 0xda, 0x60, 0x3e, 0xca, 0x81, 0xa2, 0xbc,
+ 0x44, 0xd5, 0x30, 0xbc, 0xff, 0xfa, 0x58, 0xbd, 0x0e, 0x2b, 0xb8, 0xbd,
+ 0x4e, 0x32, 0xb7, 0x3b, 0x49, 0xc5, 0xa7, 0xbd, 0x32, 0x9e, 0xeb, 0x3d,
+ 0xf4, 0xe3, 0x0e, 0xbe, 0xeb, 0x45, 0x2d, 0x3e, 0xd6, 0x12, 0x29, 0xbd,
+ 0xdf, 0x70, 0x7d, 0x3d, 0xb5, 0x9b, 0xfb, 0xbd, 0xf0, 0x11, 0x67, 0xbd,
+ 0x95, 0x9e, 0x6e, 0x3d, 0x6f, 0xff, 0x0d, 0xbe, 0xcc, 0x5a, 0x18, 0xbd,
+ 0xc9, 0x72, 0xdf, 0x3d, 0xc7, 0xfb, 0x37, 0xbd, 0xc5, 0x8a, 0x89, 0xbd,
+ 0x08, 0x59, 0x10, 0xbe, 0x17, 0xce, 0x0d, 0xbe, 0x53, 0xab, 0x22, 0x3d,
+ 0x20, 0x43, 0xdd, 0xbd, 0xab, 0x7c, 0x11, 0x3e, 0x03, 0x8b, 0x6b, 0xbe,
+ 0xfb, 0x1e, 0xf8, 0x3d, 0x41, 0x45, 0x40, 0xbd, 0xac, 0xc3, 0x95, 0xbd,
+ 0x2e, 0xe9, 0xed, 0x3d, 0x95, 0x2e, 0x03, 0xbe, 0x95, 0x64, 0xf0, 0x3c,
+ 0x8a, 0x1e, 0xb0, 0xbc, 0x5c, 0x6c, 0x1a, 0xbe, 0xcd, 0xd6, 0x6f, 0x3b,
+ 0xa0, 0xf2, 0x49, 0xbe, 0xa9, 0xa6, 0x81, 0xbd, 0x7c, 0x16, 0x01, 0x3e,
+ 0xf9, 0x08, 0xbe, 0xbc, 0x73, 0x9a, 0x49, 0xbe, 0xb5, 0x85, 0xab, 0x3d,
+ 0x23, 0x72, 0xca, 0x3d, 0x02, 0x72, 0x0c, 0x3e, 0xe1, 0x3f, 0x01, 0xbe,
+ 0xf5, 0xc8, 0x9d, 0xbd, 0x47, 0x11, 0x2d, 0xbd, 0x1c, 0x3d, 0x8c, 0xbe,
+ 0xf8, 0x4d, 0xbc, 0xbc, 0xbf, 0x2a, 0x35, 0x3d, 0x42, 0x72, 0x28, 0x3d,
+ 0x74, 0xa0, 0x87, 0x3d, 0xfc, 0xe7, 0x0e, 0xbe, 0x51, 0x58, 0x2d, 0xbe,
+ 0x01, 0xd5, 0xd4, 0xbd, 0xfc, 0xdf, 0x62, 0xbc, 0xbf, 0x0c, 0x44, 0xbe,
+ 0x16, 0x50, 0x9f, 0x3d, 0x69, 0xa0, 0xcf, 0x3d, 0xd6, 0x95, 0x1f, 0x3e,
+ 0x95, 0x7a, 0x71, 0xbe, 0x75, 0xad, 0x88, 0xbd, 0xa1, 0x47, 0x4a, 0xbe,
+ 0x57, 0x55, 0x0d, 0x3d, 0x06, 0x4f, 0xc6, 0x3d, 0xc3, 0x53, 0x43, 0xbd,
+ 0x70, 0xdb, 0xd7, 0xbd, 0x8a, 0x3c, 0x95, 0x3d, 0x38, 0xba, 0x72, 0xbb,
+ 0x5b, 0xce, 0xac, 0x3d, 0x50, 0xe7, 0xd6, 0xbd, 0xd2, 0xb6, 0x1f, 0x3e,
+ 0x6e, 0xe7, 0x0b, 0x3e, 0x74, 0xa0, 0xd4, 0xbc, 0x99, 0xf0, 0x80, 0xbe,
+ 0x92, 0xa5, 0xfb, 0x3c, 0x63, 0x83, 0x66, 0xbd, 0xaa, 0xdf, 0xaf, 0xbd,
+ 0x24, 0xa2, 0x25, 0xbd, 0x01, 0x2d, 0x08, 0xbe, 0x96, 0x18, 0x33, 0x3e,
+ 0xed, 0x50, 0x51, 0xbc, 0xa9, 0xa2, 0xd5, 0xbd, 0xa9, 0x95, 0x0e, 0xbd,
+ 0x12, 0x32, 0x49, 0x3e, 0x76, 0x05, 0x92, 0xbc, 0xd3, 0xab, 0x2f, 0xbe,
+ 0xc9, 0xf0, 0x24, 0x3e, 0x8a, 0x3d, 0x09, 0x3c, 0x4b, 0xdf, 0x62, 0x3d,
+ 0x70, 0xb9, 0x10, 0xbe, 0xd8, 0x08, 0x94, 0xbd, 0xd8, 0xe8, 0x56, 0xbe,
+ 0x25, 0xa6, 0x0f, 0xbe, 0xf1, 0x31, 0x0c, 0xbd, 0x3e, 0x7e, 0xfc, 0xbd,
+ 0xe1, 0xf2, 0x06, 0xbe, 0x7b, 0x59, 0xa6, 0x3d, 0xa8, 0xaa, 0x24, 0xbe,
+ 0x80, 0x51, 0x75, 0xbd, 0x90, 0x1d, 0x80, 0x3e, 0x54, 0x08, 0x36, 0x3e,
+ 0xe1, 0x52, 0x95, 0x3c, 0x3a, 0x7f, 0x40, 0x3e, 0x43, 0x85, 0xb2, 0x3d,
+ 0x71, 0xcc, 0x41, 0x3e, 0x02, 0x4b, 0xb9, 0xbd, 0x48, 0x5a, 0xf2, 0xbd,
+ 0xb8, 0x52, 0x3c, 0x3d, 0x4d, 0xf3, 0xd4, 0x3d, 0xca, 0x7f, 0x16, 0xbe,
+ 0x4f, 0x72, 0xc2, 0x3d, 0x4e, 0x0c, 0x0e, 0x3d, 0xc1, 0xd0, 0x9d, 0xbe,
+ 0x43, 0x46, 0x09, 0xbd, 0x7e, 0xb4, 0x02, 0x3c, 0x6b, 0xa9, 0xc2, 0xbd,
+ 0xdd, 0xb5, 0x73, 0xbd, 0xc0, 0x9e, 0x20, 0xbc, 0xdf, 0xbf, 0x2b, 0x3d,
+ 0x7f, 0x35, 0xaf, 0x3d, 0x3c, 0xda, 0xd3, 0xbd, 0xe1, 0xe2, 0xac, 0xbe,
+ 0xad, 0x84, 0x96, 0x3d, 0xc6, 0x8e, 0x11, 0x3d, 0x2c, 0x83, 0x08, 0x3e,
+ 0xb0, 0xae, 0x93, 0xbe, 0x92, 0x34, 0xce, 0xbc, 0x93, 0x8b, 0x3b, 0x3d,
+ 0x9a, 0x2c, 0xee, 0xbe, 0xf9, 0x69, 0xe9, 0x3c, 0xbc, 0x6d, 0x85, 0x3d,
+ 0xe2, 0xcf, 0x76, 0x3e, 0x58, 0x4f, 0xbd, 0xbd, 0x58, 0x1d, 0x02, 0xbe,
+ 0x64, 0x12, 0x0a, 0xbe, 0xd4, 0x15, 0x96, 0x3d, 0x21, 0xd9, 0xb0, 0x3c,
+ 0x4d, 0x49, 0x8a, 0xbd, 0x55, 0x23, 0xbe, 0x3c, 0x5e, 0x8c, 0xcc, 0xbe,
+ 0x3e, 0x67, 0x8c, 0xbb, 0xc4, 0xee, 0x10, 0x3e, 0xef, 0xad, 0xd3, 0xbd,
+ 0x94, 0x5f, 0xf1, 0x3c, 0x54, 0x36, 0x5d, 0x3e, 0x7b, 0xb8, 0x10, 0x3e,
+ 0x23, 0xa0, 0x7d, 0x3d, 0xb5, 0x58, 0x38, 0xbd, 0x3e, 0xde, 0x33, 0x3e,
+ 0xf3, 0xf5, 0x2b, 0x3e, 0x2f, 0x10, 0xb3, 0x3d, 0xac, 0x5f, 0x3d, 0xbd,
+ 0xaa, 0x5f, 0x50, 0x3d, 0x79, 0x8c, 0xa6, 0xbd, 0x3c, 0x4e, 0xcf, 0x3d,
+ 0x87, 0x1c, 0xf7, 0x3c, 0x69, 0x07, 0x2f, 0xbe, 0x5e, 0xa4, 0xb7, 0x3d,
+ 0xf3, 0x5a, 0x28, 0xbd, 0x16, 0xce, 0x8f, 0xbe, 0x19, 0x32, 0x06, 0xbe,
+ 0x44, 0x6c, 0x55, 0xbd, 0xba, 0xfe, 0x89, 0xbe, 0xc6, 0xb0, 0xbc, 0xbc,
+ 0xce, 0x22, 0x91, 0xbd, 0xa5, 0x86, 0xe3, 0xbd, 0xba, 0xb8, 0x21, 0x3d,
+ 0xc2, 0x42, 0x6e, 0x3e, 0x73, 0x16, 0x12, 0xbe, 0x0b, 0x91, 0x2b, 0x3e,
+ 0x5e, 0xb4, 0x48, 0xbe, 0x24, 0x11, 0xeb, 0x3d, 0xc3, 0x94, 0xd8, 0xbc,
+ 0xd0, 0xea, 0x57, 0x3d, 0xa8, 0xe3, 0x60, 0x3e, 0x3c, 0x72, 0xe0, 0x3d,
+ 0x80, 0x1e, 0x9a, 0xbc, 0x57, 0xbf, 0xbc, 0x3d, 0x5f, 0x0d, 0xbf, 0x3c,
+ 0x84, 0x31, 0x99, 0x3d, 0x9d, 0x83, 0x70, 0xbe, 0x11, 0x0b, 0xac, 0x3d,
+ 0x46, 0xeb, 0xcb, 0xbd, 0x31, 0xf3, 0xeb, 0xbc, 0x02, 0xae, 0xc5, 0x3d,
+ 0xc7, 0xe2, 0x80, 0xbd, 0x9e, 0x09, 0x7d, 0xbd, 0xee, 0x5c, 0x59, 0xbe,
+ 0xf5, 0xae, 0x7d, 0x3e, 0xea, 0xe7, 0x28, 0xbd, 0x4d, 0x6b, 0x15, 0xbe,
+ 0xb1, 0xab, 0xb2, 0x3d, 0xed, 0x75, 0x37, 0x3d, 0x0d, 0x5d, 0x69, 0xbe,
+ 0x0d, 0x3f, 0x7d, 0xbd, 0x52, 0x88, 0xa0, 0x3b, 0xf1, 0x7a, 0xe1, 0xbd,
+ 0x2c, 0xfd, 0x2c, 0xbd, 0x13, 0x65, 0x83, 0x3d, 0xe8, 0x7f, 0x56, 0xbe,
+ 0x7b, 0x5d, 0x83, 0xbd, 0xb3, 0x39, 0x97, 0xbc, 0x22, 0x07, 0x94, 0x3d,
+ 0x98, 0x18, 0x9d, 0xbd, 0xee, 0x5a, 0x8d, 0xbd, 0x0e, 0x3c, 0xc1, 0x3d,
+ 0x9c, 0x25, 0x73, 0xbe, 0x74, 0x20, 0x85, 0x3d, 0x80, 0x7e, 0x21, 0x3c,
+ 0xd2, 0x45, 0xf1, 0x3c, 0x41, 0xd7, 0xfc, 0xbd, 0xe1, 0xb4, 0x07, 0xbe,
+ 0x77, 0x2b, 0x1f, 0x3d, 0xb4, 0x72, 0x90, 0x3d, 0x9c, 0x6a, 0x60, 0xbe,
+ 0xe4, 0xc7, 0x09, 0x3e, 0x15, 0x5d, 0x80, 0xbd, 0xd4, 0x20, 0x49, 0x3c,
+ 0x6b, 0x99, 0xe5, 0xbd, 0xf4, 0xe0, 0x80, 0xbd, 0x1d, 0x3d, 0x1d, 0x3e,
+ 0x27, 0x67, 0xcb, 0x3d, 0x4a, 0xa4, 0xce, 0xbd, 0x14, 0x73, 0x55, 0xbe,
+ 0xc6, 0x2d, 0xd2, 0x3b, 0x01, 0x81, 0xb0, 0x3d, 0xa2, 0x28, 0x82, 0xbd,
+ 0xe4, 0x36, 0x03, 0xbe, 0xd2, 0x65, 0x27, 0x3e, 0x1b, 0x8c, 0xe1, 0x3d,
+ 0xac, 0x07, 0xf3, 0xbc, 0x18, 0x8a, 0xc0, 0xbd, 0x3b, 0xc6, 0x1e, 0xbe,
+ 0x7c, 0x76, 0x4f, 0x3c, 0xfa, 0xe9, 0x67, 0xbd, 0xd9, 0xac, 0xe9, 0x3d,
+ 0x95, 0x3f, 0xf1, 0x3c, 0x43, 0x49, 0x71, 0xbd, 0xff, 0xdd, 0xaa, 0x3b,
+ 0x19, 0x0d, 0x30, 0x3d, 0x39, 0x4b, 0xad, 0x3c, 0xf2, 0x82, 0xe5, 0x3c,
+ 0x05, 0xd3, 0x8a, 0xbd, 0x87, 0xf2, 0xfe, 0x3d, 0xbf, 0x60, 0xff, 0xbd,
+ 0xb1, 0x5f, 0x02, 0xbf, 0xe8, 0xea, 0x24, 0xbd, 0x52, 0x52, 0xfe, 0x3d,
+ 0x8e, 0x3c, 0x62, 0xbd, 0x9e, 0x19, 0x95, 0x3c, 0x46, 0x5c, 0x20, 0xbe,
+ 0xa8, 0xf3, 0xdd, 0xbc, 0x1a, 0xab, 0x25, 0xbd, 0x7a, 0xfe, 0xd2, 0x3d,
+ 0x74, 0xa9, 0xab, 0x3c, 0x20, 0xd1, 0xc9, 0xbd, 0x56, 0x93, 0xf3, 0xbc,
+ 0x48, 0x5b, 0xa7, 0xbd, 0x25, 0x32, 0x57, 0x3e, 0xe0, 0xfa, 0xcf, 0xbd,
+ 0x65, 0x3c, 0x2a, 0xbe, 0xec, 0xac, 0x88, 0xbd, 0xd1, 0x5f, 0x98, 0x3c,
+ 0x73, 0x12, 0xc4, 0xbd, 0x03, 0xe0, 0x82, 0xba, 0x14, 0x2f, 0xe9, 0xbb,
+ 0xb9, 0x52, 0xd2, 0xbe, 0x9b, 0x2f, 0x53, 0x3e, 0xbc, 0x7c, 0xec, 0x3d,
+ 0xe3, 0x64, 0x00, 0xbe, 0x70, 0x93, 0xc6, 0xbc, 0xb1, 0x38, 0xb9, 0xbe,
+ 0xb5, 0x87, 0x05, 0xbd, 0x2e, 0x76, 0x08, 0x3e, 0xb4, 0xb6, 0xd4, 0x3c,
+ 0xc4, 0xe0, 0x8e, 0x3d, 0xed, 0x33, 0x20, 0xbc, 0x41, 0xe3, 0x0f, 0xbe,
+ 0x40, 0xb6, 0x76, 0xbd, 0xef, 0x81, 0x47, 0x3e, 0xfb, 0x6b, 0x10, 0xbd,
+ 0x26, 0xde, 0xbe, 0x3c, 0x5f, 0x54, 0xf9, 0xbd, 0x7c, 0xc3, 0x06, 0xbe,
+ 0x6f, 0x9a, 0xde, 0xbd, 0xa7, 0xaa, 0x5b, 0x3d, 0x0e, 0x95, 0x3c, 0x3c,
+ 0x6d, 0x94, 0x82, 0x3e, 0xd1, 0x6b, 0x63, 0xbd, 0xf3, 0xa9, 0x5b, 0x3d,
+ 0x3f, 0x79, 0xae, 0x3d, 0xe7, 0xf3, 0xc7, 0x3d, 0xe3, 0x86, 0x91, 0xbd,
+ 0xf2, 0x71, 0xbb, 0xbc, 0x98, 0x44, 0x5e, 0xbe, 0xb2, 0x88, 0x25, 0x3b,
+ 0x11, 0x65, 0x6a, 0xbe, 0xdc, 0xcc, 0xb5, 0x3e, 0xb2, 0x07, 0x1b, 0x3e,
+ 0xae, 0x04, 0x85, 0xbd, 0x8a, 0x8a, 0x4e, 0x3e, 0xfc, 0x0f, 0xfb, 0x3d,
+ 0xd9, 0x67, 0x04, 0x3e, 0x60, 0xf1, 0xdf, 0x3d, 0xcd, 0x37, 0x86, 0xbe,
+ 0x21, 0x1a, 0x91, 0xbd, 0xc5, 0x4a, 0x39, 0x3e, 0xa8, 0x18, 0x83, 0xbd,
+ 0xa6, 0x9e, 0xdb, 0xbd, 0x34, 0xcb, 0xb5, 0x3d, 0x3c, 0xf8, 0x2c, 0xbd,
+ 0x81, 0x5f, 0x27, 0x3e, 0x17, 0xd5, 0x51, 0xbd, 0x46, 0xb1, 0x0c, 0x3e,
+ 0x90, 0xab, 0xc5, 0xbb, 0xa9, 0xf9, 0x8d, 0x3d, 0x1d, 0xf1, 0x31, 0xbe,
+ 0xa6, 0x81, 0x3f, 0xbe, 0xb1, 0x9e, 0x4f, 0xbe, 0xfc, 0x62, 0xa5, 0x3d,
+ 0x39, 0xfc, 0xc7, 0xbd, 0x96, 0xc9, 0xd5, 0x3d, 0xca, 0x95, 0x21, 0xbe,
+ 0x6b, 0xee, 0x55, 0x3c, 0x41, 0xcd, 0x61, 0xbc, 0xd3, 0xe8, 0xe9, 0xbd,
+ 0xd6, 0x48, 0x6f, 0x3d, 0x41, 0x31, 0x3b, 0x3d, 0x01, 0xdb, 0xb4, 0xbd,
+ 0xe5, 0xe8, 0x0a, 0xbd, 0x76, 0xe3, 0x8f, 0xbd, 0xaa, 0xac, 0x1c, 0x3e,
+ 0xa1, 0x20, 0x1a, 0xbe, 0x73, 0x0f, 0xf9, 0xbe, 0x6c, 0xb1, 0x49, 0x3e,
+ 0xa1, 0x72, 0x7d, 0x3d, 0xd4, 0xe2, 0x8c, 0x3c, 0xfa, 0x1c, 0x3f, 0xbd,
+ 0x9d, 0x2c, 0xae, 0xbc, 0xf3, 0x8b, 0xca, 0xbc, 0x73, 0x3a, 0xf8, 0x3d,
+ 0x93, 0x79, 0x13, 0x3e, 0x66, 0x3d, 0x9d, 0xbd, 0x99, 0x21, 0x1e, 0x3c,
+ 0x80, 0x95, 0xe9, 0x3d, 0xae, 0x67, 0x98, 0xbe, 0x20, 0x54, 0x8b, 0xbe,
+ 0xa4, 0xb2, 0xbd, 0xbc, 0xc1, 0xd6, 0x13, 0x3e, 0xa6, 0xa2, 0x8a, 0xbd,
+ 0x5a, 0xe1, 0xc1, 0xbd, 0x28, 0x9d, 0x1f, 0x3e, 0x44, 0x45, 0xc7, 0x3d,
+ 0x2f, 0xcb, 0x99, 0x3c, 0x01, 0xba, 0x38, 0xbc, 0x62, 0x28, 0x49, 0xbd,
}};
-const int32_t dnn_hiddenlayer_1_bias_part_0_shape[1] = {123};
+const int32_t dnn_hiddenlayer_1_bias_part_0_shape[1] = {115};
const union {
- uint8_t bytes[492];
- float values[123];
+ uint8_t bytes[460];
+ float values[115];
} dnn_hiddenlayer_1_bias_part_0 = {{
- 0x0b, 0xc8, 0x27, 0xbe, 0xaf, 0x12, 0x1a, 0xbe, 0x42, 0xbe, 0x30, 0xbe,
- 0xdf, 0x76, 0x16, 0xbd, 0x2d, 0x8b, 0x44, 0xbe, 0x04, 0xf5, 0x96, 0x3d,
- 0x1a, 0x42, 0xb3, 0xbd, 0x5d, 0x19, 0x75, 0x3f, 0x89, 0x05, 0x88, 0x3e,
- 0x85, 0x95, 0xb1, 0x3e, 0x53, 0xb7, 0x17, 0xbe, 0x71, 0x00, 0xf6, 0x3d,
- 0x36, 0xbb, 0x29, 0xbe, 0x53, 0x79, 0x62, 0x3e, 0xdf, 0xad, 0xbe, 0x3e,
- 0xd2, 0xa1, 0x23, 0xbe, 0x76, 0xee, 0xa1, 0xbe, 0xff, 0xef, 0x38, 0xbf,
- 0x08, 0xdc, 0x99, 0x3e, 0xf1, 0xff, 0x33, 0x3e, 0x77, 0x05, 0x10, 0xbe,
- 0x1e, 0x9b, 0x5c, 0xbf, 0x87, 0x8e, 0x86, 0xbe, 0x94, 0xea, 0x74, 0xbe,
- 0x08, 0x11, 0x8e, 0xbe, 0x90, 0x55, 0x2c, 0x3f, 0xea, 0x72, 0xfa, 0x3c,
- 0x1f, 0x27, 0x2e, 0x3f, 0x99, 0xbf, 0x47, 0x3f, 0xdf, 0x10, 0xaf, 0x3d,
- 0x85, 0xba, 0x1d, 0x3f, 0x06, 0xb2, 0x5f, 0xbe, 0xbc, 0x94, 0x34, 0x39,
- 0x59, 0x5a, 0x8e, 0xbe, 0x25, 0x0e, 0xad, 0x3d, 0xf4, 0xeb, 0xeb, 0xbd,
- 0x9b, 0x4b, 0x98, 0xbe, 0x16, 0xff, 0x4f, 0xbe, 0x76, 0x98, 0x48, 0xbd,
- 0xed, 0x44, 0x02, 0x3e, 0x36, 0x49, 0x31, 0xbe, 0x55, 0x64, 0x85, 0x3f,
- 0x28, 0x46, 0x85, 0x3d, 0x31, 0x59, 0x49, 0xbe, 0x73, 0x03, 0xf2, 0x3c,
- 0x24, 0x17, 0x03, 0x3e, 0xd8, 0x15, 0x0c, 0xbf, 0xaa, 0x74, 0x01, 0xbe,
- 0x2b, 0x0f, 0xf2, 0xbd, 0x36, 0x59, 0x52, 0xbf, 0x33, 0x10, 0x5e, 0x3e,
- 0x85, 0x14, 0x98, 0xbe, 0x58, 0x61, 0x77, 0x3e, 0x83, 0xce, 0x05, 0x3f,
- 0xc4, 0xe4, 0x4a, 0xbf, 0xcb, 0xfb, 0x76, 0x3c, 0x96, 0xd7, 0x65, 0x3d,
- 0xc7, 0xf4, 0x8a, 0x3e, 0x8e, 0xa1, 0xaa, 0x3e, 0x52, 0x17, 0x2d, 0xbc,
- 0x0c, 0x46, 0xd7, 0xbe, 0x32, 0xe1, 0xaf, 0x3e, 0x7b, 0x54, 0x1f, 0xbe,
- 0x52, 0xef, 0x02, 0xbe, 0x41, 0xee, 0xa4, 0x3d, 0xce, 0x60, 0x57, 0xbe,
- 0xdc, 0x17, 0x5d, 0xbd, 0x33, 0x14, 0x10, 0xbf, 0x55, 0x8c, 0x1a, 0xbe,
- 0x55, 0xe5, 0x0b, 0xbe, 0x1b, 0x8e, 0xc3, 0xbd, 0xc8, 0x92, 0xcd, 0xbe,
- 0x2a, 0x85, 0x53, 0x3d, 0x9c, 0xdb, 0x28, 0xbe, 0x32, 0x68, 0x2d, 0xbf,
- 0x99, 0x5f, 0x03, 0xbe, 0x37, 0xd3, 0xec, 0x3c, 0xc5, 0x22, 0xc2, 0x3e,
- 0xf8, 0xd5, 0xc9, 0xbd, 0x51, 0x55, 0x9e, 0xbe, 0x1d, 0xbe, 0x0b, 0x3f,
- 0x10, 0x25, 0xc0, 0x3d, 0xce, 0xa3, 0x02, 0xbd, 0x56, 0xc0, 0x17, 0xbe,
- 0xe8, 0xb2, 0xfd, 0x3e, 0x9d, 0x48, 0xe1, 0xbd, 0x8e, 0x02, 0x81, 0xbf,
- 0xf9, 0xfe, 0x9b, 0xbc, 0xbb, 0x8e, 0x88, 0xbe, 0xd8, 0x83, 0x86, 0xbb,
- 0x15, 0x60, 0x7a, 0xbe, 0x62, 0xdf, 0xff, 0xbd, 0x59, 0x54, 0xe1, 0xbf,
- 0x46, 0x40, 0x3e, 0x3f, 0x14, 0xb1, 0xcb, 0xbd, 0x53, 0xe5, 0x5f, 0xbe,
- 0x02, 0x1c, 0x78, 0xbe, 0x74, 0x52, 0x01, 0xbe, 0x80, 0xb4, 0x09, 0xbe,
- 0x5c, 0x7d, 0xe4, 0x3d, 0x97, 0x25, 0xd9, 0xbd, 0x81, 0xfb, 0x3f, 0x3c,
- 0x2c, 0x8a, 0xbf, 0x3d, 0xb2, 0x46, 0xdd, 0xbe, 0xba, 0xf0, 0x8d, 0x3d,
- 0x8c, 0xd8, 0x1d, 0xc0, 0x32, 0x2f, 0x36, 0x3d, 0x60, 0x6e, 0x77, 0xbe,
- 0x6b, 0xd2, 0x21, 0xbd, 0x6d, 0x8b, 0x64, 0xbe, 0x25, 0x90, 0x63, 0xbf,
- 0xa6, 0x24, 0xe7, 0xbd, 0xa5, 0x09, 0x33, 0xbe, 0x96, 0x14, 0x25, 0xbe,
- 0x4b, 0x9b, 0x23, 0xbf, 0xa8, 0x02, 0x01, 0xbe, 0x21, 0xd4, 0xfa, 0x3d,
- 0x07, 0x63, 0x3d, 0x3e, 0x9f, 0xba, 0x0a, 0xbe, 0x04, 0x91, 0xbd, 0xbc,
- 0xd2, 0xe0, 0xec, 0xbd, 0x4d, 0xa7, 0xaa, 0xbe, 0x2d, 0xe4, 0xde, 0x3d,
+ 0x83, 0x63, 0x96, 0x3e, 0x35, 0x40, 0x31, 0xbe, 0x5e, 0x17, 0x29, 0xbd,
+ 0x49, 0xc8, 0xe0, 0xbd, 0xc8, 0x2b, 0x79, 0xbe, 0xfe, 0x3a, 0xeb, 0x3e,
+ 0x46, 0x1f, 0xe7, 0x3a, 0x92, 0x3f, 0x6e, 0x3e, 0x0c, 0x4d, 0xe0, 0xbc,
+ 0x7b, 0xf5, 0x64, 0x3c, 0xa7, 0x9f, 0x85, 0xbe, 0xc1, 0x6b, 0x5a, 0xbd,
+ 0x3a, 0xc6, 0xd3, 0xbc, 0x4d, 0x21, 0x75, 0x3e, 0xa8, 0xf3, 0x69, 0xbd,
+ 0xc8, 0x8d, 0x01, 0x3d, 0x7d, 0xba, 0x59, 0x3e, 0x30, 0xd2, 0x00, 0x3e,
+ 0xea, 0x4e, 0x00, 0xbe, 0xf5, 0x00, 0xf8, 0xbc, 0x4a, 0x46, 0x79, 0x3c,
+ 0xdf, 0xc0, 0x71, 0xbd, 0x4e, 0x8e, 0xd2, 0x3c, 0x8a, 0xf0, 0xdc, 0x3d,
+ 0x92, 0x99, 0x37, 0xbc, 0xeb, 0xce, 0x4d, 0x3e, 0x94, 0x28, 0x6c, 0x3e,
+ 0x3c, 0x44, 0x58, 0xbe, 0x38, 0xcc, 0x13, 0x3e, 0x42, 0x2b, 0xf4, 0xbd,
+ 0xb0, 0x3c, 0x17, 0x3d, 0x6e, 0xf2, 0x69, 0xbe, 0x8c, 0x2b, 0x81, 0x3e,
+ 0xac, 0x3d, 0x12, 0xbe, 0x7d, 0x22, 0x23, 0x3d, 0x5a, 0x34, 0xa4, 0xbe,
+ 0x2d, 0xe2, 0xe2, 0x3c, 0xca, 0x76, 0xa3, 0xbd, 0x8c, 0x6d, 0x82, 0x3e,
+ 0xdc, 0x03, 0x53, 0x3e, 0xb2, 0x8b, 0xc2, 0xbd, 0xfa, 0xef, 0xb4, 0xbe,
+ 0x96, 0x2c, 0x5b, 0x3e, 0xd3, 0xbd, 0x33, 0xbd, 0x51, 0x5b, 0x3d, 0xbd,
+ 0xaf, 0xeb, 0xa3, 0xbd, 0x41, 0x2f, 0xbb, 0xbd, 0xc4, 0x2c, 0xdb, 0xbd,
+ 0xfe, 0x2a, 0x21, 0x3c, 0x77, 0x3a, 0x1d, 0xbe, 0x12, 0xce, 0x80, 0x3d,
+ 0xca, 0x56, 0x34, 0xbd, 0x79, 0x33, 0xb6, 0xbd, 0xa3, 0xad, 0x93, 0xbe,
+ 0x10, 0xd4, 0x2f, 0xbe, 0x5c, 0xf7, 0x03, 0xbd, 0xf6, 0x45, 0x8e, 0xbe,
+ 0xd9, 0x46, 0x05, 0xbe, 0x8f, 0xb6, 0x3c, 0xbe, 0xdd, 0xa0, 0xa4, 0x3e,
+ 0x4f, 0xf8, 0xbb, 0x3e, 0xaa, 0x40, 0x67, 0xbe, 0x8c, 0x52, 0xe4, 0x3c,
+ 0xee, 0xfe, 0x55, 0xbd, 0xbb, 0xb4, 0x68, 0x3e, 0x0c, 0x39, 0x58, 0x3e,
+ 0x12, 0x10, 0xc6, 0xbd, 0x15, 0xc0, 0x4c, 0x3b, 0xae, 0x50, 0xe7, 0xbd,
+ 0xdc, 0x27, 0x61, 0xbc, 0xd3, 0xc2, 0xf3, 0x3d, 0xb5, 0xc9, 0x9c, 0xbe,
+ 0x1b, 0xd7, 0x8e, 0xbd, 0xe2, 0x23, 0x78, 0x3e, 0x87, 0x90, 0xc9, 0x3d,
+ 0x24, 0xfb, 0x21, 0xbe, 0x19, 0xf8, 0x51, 0x3d, 0xa2, 0x4c, 0x5d, 0xbe,
+ 0x63, 0x00, 0x8d, 0xbe, 0x3c, 0x78, 0x93, 0xbe, 0xd5, 0xf9, 0xb8, 0x3e,
+ 0x7d, 0x34, 0x77, 0x3e, 0x6b, 0x86, 0x57, 0xbe, 0xf3, 0x96, 0x31, 0xbe,
+ 0x17, 0x29, 0x08, 0x3d, 0x14, 0x39, 0x1e, 0xbe, 0x84, 0x37, 0xfe, 0xbd,
+ 0xfa, 0x22, 0x60, 0xbc, 0xca, 0xe3, 0x37, 0x3e, 0xc3, 0x8e, 0x85, 0x3c,
+ 0xb7, 0xf6, 0x36, 0x3d, 0x51, 0x86, 0x9a, 0xbb, 0x15, 0x70, 0xdc, 0x3e,
+ 0x20, 0xe5, 0x6f, 0xbd, 0xf5, 0xbc, 0x1b, 0x3d, 0x88, 0x62, 0x4b, 0x3e,
+ 0x3d, 0x12, 0x95, 0xbd, 0xe6, 0x58, 0xd3, 0xbc, 0x93, 0x31, 0xb8, 0x3d,
+ 0xdd, 0x4f, 0xee, 0xbd, 0xa0, 0x3a, 0x05, 0xbd, 0xb4, 0xc3, 0x96, 0x3e,
+ 0x6a, 0x1e, 0xc6, 0xbc, 0x38, 0xc6, 0xd5, 0xbd, 0xf5, 0xc6, 0x89, 0x3e,
+ 0xa6, 0x20, 0x85, 0xbe, 0x05, 0x02, 0xab, 0xbc, 0x83, 0xfc, 0x3b, 0x3e,
+ 0x33, 0x69, 0x0f, 0x3e, 0x2a, 0x21, 0x6c, 0x3d, 0xee, 0xa6, 0x15, 0xbe,
+ 0x30, 0xfe, 0x8e, 0xbe, 0xc0, 0x60, 0x66, 0xbe, 0x06, 0x19, 0x18, 0xbd,
+ 0xbb, 0x80, 0xab, 0x3e,
}};
-const int32_t dnn_hiddenlayer_1_kernel_part_0_shape[2] = {102, 123};
+const int32_t dnn_hiddenlayer_1_kernel_part_0_shape[2] = {117, 115};
const union {
- uint8_t bytes[50184];
- float values[12546];
+ uint8_t bytes[53820];
+ float values[13455];
} dnn_hiddenlayer_1_kernel_part_0 = {{
- 0x49, 0xd4, 0x9e, 0x3e, 0x33, 0xfe, 0x35, 0x3d, 0x03, 0x80, 0xe7, 0xbd,
- 0x87, 0x83, 0x72, 0x3d, 0x8d, 0x5e, 0x33, 0x3e, 0x30, 0x30, 0x4e, 0x3e,
- 0x65, 0xb0, 0xa3, 0x3d, 0x4c, 0x01, 0x74, 0x3e, 0x10, 0x42, 0xc5, 0x3d,
- 0xc5, 0xa0, 0xc8, 0x3e, 0x40, 0xde, 0x28, 0xbe, 0x7d, 0xd8, 0xe2, 0x3e,
- 0x5a, 0x6b, 0x63, 0x3d, 0x6b, 0x64, 0xc3, 0xbd, 0x44, 0x09, 0xbf, 0xbc,
- 0xc6, 0x05, 0xdf, 0x3d, 0xef, 0xd1, 0x19, 0x3e, 0xa5, 0x13, 0x93, 0x3e,
- 0x7f, 0x07, 0x54, 0xbe, 0xac, 0xac, 0xc5, 0x3d, 0xcf, 0x12, 0x2d, 0xbd,
- 0xb9, 0xcb, 0x37, 0x3e, 0xad, 0x74, 0x62, 0x3e, 0xc2, 0x8b, 0x13, 0x3e,
- 0x74, 0x86, 0xce, 0xbd, 0x41, 0x73, 0x96, 0x3e, 0x92, 0x67, 0x7a, 0xbe,
- 0x9e, 0x82, 0xa9, 0x3d, 0x3f, 0xc3, 0xd8, 0x3d, 0x51, 0x6f, 0x42, 0x3d,
- 0x7f, 0x9e, 0xbd, 0xbc, 0xc1, 0x3e, 0x3c, 0x3e, 0x00, 0xe0, 0x32, 0xbf,
- 0xca, 0xfa, 0x17, 0x3e, 0xd2, 0xaf, 0x4d, 0x3e, 0x58, 0x42, 0x7a, 0xbd,
- 0x0f, 0x54, 0x21, 0x3d, 0xf2, 0x40, 0x63, 0x3e, 0xf0, 0x47, 0x89, 0x3e,
- 0x97, 0xf8, 0x44, 0x3e, 0xf0, 0xe6, 0x0c, 0x3e, 0xa7, 0x6a, 0xfe, 0x3d,
- 0x4a, 0xe8, 0x94, 0xbd, 0xa9, 0x31, 0xd3, 0x3d, 0x36, 0xc5, 0x4a, 0x3e,
- 0x06, 0x05, 0x9b, 0x3e, 0x37, 0x33, 0x24, 0xbe, 0x07, 0x3e, 0x1f, 0xbe,
- 0xd1, 0xaf, 0xa8, 0x3d, 0x02, 0x25, 0x2a, 0x3e, 0xeb, 0x4d, 0x1c, 0xbd,
- 0xc7, 0xb0, 0x08, 0xbd, 0x2f, 0x34, 0xee, 0x3d, 0x77, 0x01, 0xe8, 0x3e,
- 0xf9, 0xb0, 0x52, 0xbe, 0x79, 0x85, 0x34, 0xbe, 0xb7, 0x8f, 0xe7, 0xbc,
- 0x0d, 0x65, 0xa8, 0x3e, 0x2c, 0xbe, 0x84, 0x3e, 0xec, 0xd3, 0xe2, 0x3b,
- 0x14, 0xa0, 0x14, 0xbe, 0x13, 0xa6, 0xb3, 0x3e, 0x75, 0xe6, 0x7a, 0xbd,
- 0xe6, 0xa1, 0xaf, 0xbd, 0x9d, 0xf9, 0xb7, 0x3d, 0x43, 0xb1, 0xd1, 0x3a,
- 0xe9, 0xb8, 0x11, 0x3e, 0xee, 0xd9, 0x9b, 0x3d, 0x05, 0xba, 0x43, 0xbc,
- 0x21, 0x52, 0x1d, 0x3b, 0xc1, 0x6c, 0x16, 0x3e, 0xe9, 0xd1, 0x4d, 0x3e,
- 0x02, 0x86, 0xb4, 0xbd, 0x73, 0xf0, 0x9f, 0x3e, 0x55, 0x23, 0x46, 0x3d,
- 0xe9, 0xca, 0x27, 0xbe, 0xd6, 0xe6, 0x91, 0xbd, 0x74, 0x4a, 0x44, 0xbe,
- 0x45, 0x1f, 0x39, 0xbc, 0x6a, 0x26, 0x65, 0x3e, 0x76, 0xa7, 0x3e, 0xbe,
- 0xd0, 0x50, 0x12, 0xbe, 0x65, 0x4f, 0x08, 0xbe, 0x85, 0x19, 0x47, 0x3e,
- 0xe2, 0xe0, 0x55, 0xbd, 0xec, 0x59, 0xdc, 0xbd, 0x40, 0xdd, 0x02, 0x3e,
- 0x97, 0x6f, 0x8f, 0x3e, 0xf0, 0xab, 0xcc, 0xbd, 0xdd, 0x96, 0xa9, 0xbd,
- 0xd1, 0x65, 0xaf, 0x3d, 0xc6, 0xf2, 0x76, 0x3e, 0x8e, 0xe2, 0xd3, 0x3d,
- 0xf1, 0x28, 0x91, 0x3b, 0xef, 0x8f, 0x3a, 0x3d, 0x45, 0x43, 0x14, 0x3e,
- 0xf0, 0x20, 0xd5, 0x3c, 0xc8, 0xf0, 0x85, 0xbe, 0x96, 0x9e, 0xb9, 0x3d,
- 0xd0, 0xf3, 0xcc, 0xbe, 0x4f, 0x8f, 0xe7, 0x3c, 0xfd, 0x69, 0xc9, 0x3d,
- 0x26, 0x26, 0xb2, 0xbd, 0x88, 0x84, 0x20, 0x3e, 0x39, 0x66, 0xa1, 0x3e,
- 0x12, 0x83, 0x83, 0x3d, 0x49, 0x6e, 0x00, 0xbe, 0x7a, 0x95, 0x1c, 0xbe,
- 0x72, 0x9a, 0x4c, 0x3c, 0xc5, 0x68, 0xad, 0x3d, 0xe7, 0xbb, 0x52, 0x3e,
- 0x7a, 0x69, 0x3f, 0xbe, 0x43, 0xbe, 0x14, 0xbe, 0x70, 0xeb, 0x28, 0x3e,
- 0x5a, 0xb9, 0x3b, 0x3d, 0x00, 0x02, 0x91, 0xbe, 0x88, 0x58, 0x2a, 0xbe,
- 0x73, 0x4a, 0x32, 0xbe, 0x5c, 0x26, 0x45, 0x3d, 0xf9, 0x21, 0xdf, 0x3e,
- 0xa3, 0xbc, 0xdb, 0xbd, 0xc2, 0x73, 0x09, 0xbd, 0x1a, 0x97, 0xa1, 0x3d,
- 0x3c, 0xd6, 0x8a, 0x3e, 0x4e, 0x5a, 0x50, 0xbd, 0xd7, 0x6d, 0x67, 0x3c,
- 0xf7, 0xc2, 0x0c, 0xbe, 0x6b, 0x65, 0x49, 0xbe, 0x2d, 0xd6, 0x3d, 0x3c,
- 0x3f, 0xbb, 0xa2, 0xbe, 0xfd, 0x77, 0x0f, 0x3d, 0xaf, 0xb4, 0xd3, 0xbd,
- 0xa1, 0x49, 0xda, 0x3c, 0xd4, 0x14, 0xc1, 0x3d, 0x8e, 0x05, 0x1d, 0xbd,
- 0xea, 0xe0, 0x4a, 0x3e, 0x7c, 0x0f, 0x86, 0xbc, 0x89, 0x0a, 0x48, 0x3d,
- 0xe0, 0xb0, 0x77, 0x3d, 0x98, 0x55, 0x15, 0x3e, 0x23, 0x13, 0xdf, 0x3d,
- 0xa2, 0xd9, 0x40, 0x3e, 0x05, 0xd9, 0x56, 0x3d, 0x07, 0x06, 0xdc, 0xbc,
- 0x16, 0x05, 0x45, 0x3e, 0x4e, 0x29, 0xf2, 0x3d, 0xd2, 0x07, 0x9c, 0x3c,
- 0x68, 0xbf, 0x2e, 0xbe, 0xa2, 0x82, 0x89, 0x3d, 0x3b, 0x87, 0x94, 0xbd,
- 0x7c, 0x10, 0xe3, 0xbc, 0xd3, 0xb1, 0x68, 0xbe, 0x80, 0xc1, 0x8a, 0xbe,
- 0x58, 0x12, 0x53, 0xbe, 0x44, 0x1c, 0x30, 0x3c, 0xb3, 0xc0, 0xb9, 0xbd,
- 0x38, 0x6a, 0xbe, 0x3d, 0xdc, 0x18, 0xdc, 0xbe, 0x64, 0xd4, 0xe0, 0xbd,
- 0x81, 0xc5, 0x6e, 0x3e, 0x56, 0x13, 0xe0, 0xbd, 0x33, 0x61, 0x1e, 0x3d,
- 0x00, 0xaa, 0x79, 0x3e, 0x41, 0x1e, 0x3b, 0x39, 0xbc, 0x43, 0xf5, 0xbc,
- 0x28, 0x9a, 0xfd, 0x3c, 0x1b, 0x84, 0xab, 0x3d, 0x28, 0xd6, 0x81, 0x3e,
- 0x2f, 0x87, 0x9a, 0xbe, 0x87, 0x8c, 0xa1, 0x3c, 0x15, 0x92, 0x43, 0xbe,
- 0x71, 0x81, 0x46, 0xbb, 0x1b, 0x94, 0x5a, 0x3c, 0xd6, 0xbb, 0x66, 0xbe,
- 0x6b, 0xfa, 0xd7, 0x3d, 0x25, 0xa8, 0x98, 0xbd, 0xf3, 0x1a, 0xbf, 0xbe,
- 0x87, 0x60, 0x8c, 0x3e, 0xcd, 0x63, 0x4e, 0xbc, 0xe7, 0x49, 0x5f, 0xbc,
- 0x09, 0x33, 0x8e, 0x3d, 0x59, 0x72, 0xc1, 0x3c, 0xc3, 0xae, 0x5e, 0xbe,
- 0x30, 0xd7, 0x03, 0x3d, 0x54, 0xf8, 0x0e, 0xbe, 0x5c, 0xd9, 0x54, 0x3d,
- 0x95, 0xfd, 0x36, 0xbe, 0xbd, 0x4c, 0x37, 0xbe, 0xa2, 0x81, 0x2d, 0x3e,
- 0x59, 0x84, 0x07, 0x3e, 0xb4, 0x4e, 0x2d, 0x3d, 0x62, 0x15, 0x7b, 0x3e,
- 0x83, 0x39, 0xe0, 0xbd, 0xa5, 0xeb, 0x4d, 0xbe, 0xbf, 0xa6, 0xe9, 0xbe,
- 0xf2, 0xbd, 0x56, 0x3e, 0x72, 0xa0, 0xb0, 0x3c, 0xcf, 0x64, 0x67, 0xbe,
- 0x53, 0x6b, 0xa7, 0xbe, 0x0b, 0x02, 0x00, 0x3e, 0xe1, 0xa8, 0xfa, 0xbe,
- 0xc1, 0x0c, 0x13, 0x3e, 0x1d, 0x35, 0x44, 0x3e, 0x00, 0x80, 0x5d, 0x3d,
- 0xcd, 0x68, 0x01, 0x3e, 0xaa, 0xa5, 0x3c, 0xbe, 0x78, 0x40, 0xa2, 0x3d,
- 0xa4, 0xef, 0x27, 0xbe, 0x09, 0x92, 0x0f, 0x3d, 0x81, 0xb8, 0xe0, 0x3d,
- 0x29, 0x38, 0xb0, 0xbe, 0xa9, 0xcc, 0x94, 0x3e, 0x29, 0xe9, 0x79, 0x3e,
- 0xd4, 0xb4, 0xe4, 0xbd, 0x93, 0xd8, 0x05, 0xbe, 0x56, 0x9c, 0xf9, 0xbd,
- 0x03, 0x30, 0xa7, 0x3e, 0x67, 0x1b, 0xc5, 0x3c, 0xc8, 0xc1, 0x16, 0x3e,
- 0xaf, 0xc6, 0x79, 0xbe, 0x14, 0xaa, 0xd0, 0xbd, 0xb2, 0xa5, 0x09, 0xbd,
- 0xa8, 0x2a, 0x9a, 0x3c, 0xe9, 0x76, 0x92, 0xbd, 0x67, 0x16, 0x57, 0xbe,
- 0x6f, 0xf6, 0x49, 0x3d, 0x9e, 0x32, 0xe8, 0x3b, 0x45, 0x32, 0x8a, 0x3e,
- 0x60, 0xb2, 0x37, 0x3e, 0x7f, 0xea, 0x89, 0x3e, 0x57, 0x92, 0x52, 0xbc,
- 0x63, 0xd0, 0x45, 0x3d, 0x5e, 0x87, 0xc1, 0xbd, 0xf7, 0x3c, 0x7b, 0xbd,
- 0xff, 0x8e, 0x74, 0x3d, 0x5e, 0xa2, 0xcf, 0xbc, 0x90, 0x6d, 0xf2, 0x3d,
- 0x1d, 0xfc, 0x00, 0xbe, 0xd8, 0x33, 0xbb, 0x3d, 0x3e, 0x1d, 0x02, 0xbd,
- 0xf5, 0x1b, 0xe1, 0xbd, 0xdd, 0xc8, 0x74, 0xbe, 0x39, 0xcb, 0xe8, 0x3d,
- 0x2c, 0x82, 0x1b, 0x3e, 0x90, 0xe1, 0x72, 0xbd, 0x64, 0x60, 0xd7, 0x3c,
- 0x26, 0x10, 0x14, 0x3e, 0x6c, 0xfb, 0x04, 0x3e, 0x7a, 0xee, 0x2f, 0xbe,
- 0xdb, 0x3d, 0x2f, 0x3e, 0xb5, 0xd9, 0x21, 0xbe, 0xc5, 0xb2, 0x4c, 0x3d,
- 0xc6, 0x6c, 0x46, 0x3d, 0x5b, 0xc2, 0xbd, 0xbc, 0x3e, 0x04, 0x53, 0xbd,
- 0x28, 0x80, 0x94, 0xbd, 0x6d, 0x67, 0xdb, 0x3d, 0xad, 0x4e, 0x9e, 0x3d,
- 0x4e, 0x1b, 0xb3, 0x3d, 0x54, 0x8c, 0xda, 0xbd, 0x04, 0x1e, 0xce, 0x3d,
- 0x80, 0x57, 0x8d, 0xbd, 0x6f, 0x29, 0x15, 0xbe, 0x80, 0x5f, 0x44, 0xbd,
- 0x2d, 0x0b, 0x31, 0xbe, 0x3d, 0xe8, 0xc1, 0x3d, 0xe8, 0x6c, 0x13, 0x3e,
- 0xeb, 0x03, 0xfa, 0x3b, 0x87, 0x9f, 0x1e, 0x3d, 0xaa, 0xa7, 0x11, 0xbd,
- 0x87, 0x63, 0x97, 0xbd, 0xad, 0x60, 0x33, 0x3e, 0xb2, 0x6b, 0xc6, 0x3d,
- 0x6f, 0x8e, 0xf1, 0x3d, 0x76, 0x72, 0x19, 0x3c, 0xa0, 0x5d, 0xe5, 0xbc,
- 0x39, 0x68, 0x1e, 0x3e, 0xc6, 0x1e, 0x04, 0x3e, 0x0a, 0x03, 0x1d, 0x3d,
- 0x47, 0x2c, 0x39, 0xbd, 0x00, 0x86, 0x25, 0x3d, 0xf6, 0x37, 0xa9, 0x3d,
- 0xd2, 0xc4, 0x37, 0x3d, 0x1f, 0xdd, 0xc6, 0xbc, 0x56, 0x65, 0x19, 0xbe,
- 0x6a, 0xce, 0x02, 0xbe, 0x77, 0x78, 0x30, 0x3d, 0x5a, 0x8d, 0x20, 0x3d,
- 0x2b, 0xde, 0xe9, 0x3c, 0x1d, 0xbf, 0xc0, 0xbd, 0x12, 0x19, 0xa2, 0xbd,
- 0x77, 0x64, 0x79, 0xbd, 0xcc, 0x75, 0x41, 0xbd, 0xd1, 0xd6, 0x84, 0x3b,
- 0x64, 0xb8, 0xf9, 0x3d, 0xdf, 0x56, 0x2f, 0x3e, 0x24, 0x9e, 0xa1, 0x3b,
- 0x2b, 0x94, 0x08, 0xbe, 0x26, 0x06, 0xac, 0xbc, 0xed, 0xce, 0x81, 0xbd,
- 0xcd, 0x31, 0xb5, 0xbd, 0xc6, 0xf4, 0x24, 0xbe, 0x19, 0x49, 0x68, 0x3d,
- 0xe2, 0xa1, 0x8c, 0xbe, 0xb3, 0x0d, 0x45, 0xbd, 0x82, 0x64, 0xf7, 0xbd,
- 0xce, 0xa0, 0xad, 0xbd, 0x16, 0xea, 0x5e, 0xbd, 0x1b, 0xa1, 0x4b, 0x3e,
- 0x0f, 0x54, 0xf7, 0x3d, 0xe5, 0xee, 0x6a, 0xbd, 0xf7, 0x4c, 0x09, 0x3e,
- 0x43, 0x49, 0x0d, 0x3e, 0xe3, 0x01, 0x0a, 0x3d, 0x37, 0xb0, 0x23, 0xbe,
- 0x77, 0xea, 0x60, 0xbd, 0x85, 0xa3, 0x07, 0xbe, 0x1d, 0xd7, 0x62, 0xbe,
- 0xc8, 0x11, 0xd9, 0x3c, 0xdc, 0x31, 0xb6, 0xbc, 0x73, 0x2e, 0x54, 0xbd,
- 0xf7, 0x3e, 0xfb, 0x3c, 0xfc, 0x66, 0x2f, 0x3e, 0xca, 0x1d, 0x2f, 0x3d,
- 0x14, 0x77, 0x29, 0xbd, 0x8f, 0xd6, 0xd1, 0xbc, 0xa3, 0x4e, 0xda, 0xbd,
- 0x3a, 0xbf, 0x3f, 0x3c, 0xf8, 0x5a, 0xb7, 0x3d, 0xc1, 0x50, 0xb5, 0x3e,
- 0x17, 0x90, 0xe1, 0x3d, 0xa6, 0xe8, 0xc9, 0x3d, 0xd7, 0x79, 0x13, 0xbe,
- 0xc3, 0x41, 0x10, 0xbe, 0x5d, 0x49, 0x68, 0xbd, 0xe0, 0xb0, 0xf2, 0x3b,
- 0x90, 0xd0, 0x99, 0x3c, 0xf1, 0x9f, 0xc4, 0x3c, 0xc2, 0x2a, 0x31, 0xbd,
- 0xaf, 0xc7, 0x6a, 0x3d, 0xcf, 0xca, 0x23, 0xbe, 0x15, 0xf5, 0x82, 0xbe,
- 0x84, 0xa9, 0x41, 0x3e, 0x7a, 0xc9, 0x04, 0xbe, 0x7a, 0xe4, 0x17, 0xbe,
- 0xd0, 0x3f, 0xf2, 0x3c, 0xec, 0x50, 0x19, 0x3c, 0x03, 0x96, 0xef, 0xbc,
- 0x84, 0x7d, 0xb2, 0xbd, 0x91, 0x81, 0x1e, 0xbc, 0x70, 0x76, 0x8c, 0x3e,
- 0xe3, 0xfc, 0x8f, 0x3c, 0x4f, 0xfd, 0x2d, 0xbc, 0x22, 0x8f, 0x99, 0x3d,
- 0xfe, 0x69, 0x0f, 0x3d, 0x94, 0x63, 0x09, 0x3e, 0xb8, 0xa8, 0x33, 0xbc,
- 0x66, 0xb3, 0x43, 0x3c, 0x66, 0x36, 0x30, 0x3d, 0x11, 0x8f, 0xc7, 0xbd,
- 0x01, 0x50, 0xdc, 0xbd, 0x0b, 0xda, 0x2b, 0xbe, 0x72, 0x08, 0x22, 0x3d,
- 0x2d, 0x40, 0x7d, 0xbb, 0x7a, 0x93, 0xfc, 0x3d, 0xaf, 0xc1, 0xbc, 0xbd,
- 0xdf, 0xcc, 0x13, 0x3e, 0x47, 0x7f, 0xe7, 0x3c, 0xe8, 0xee, 0xad, 0xbd,
- 0xb7, 0x4a, 0x8e, 0xbd, 0xbf, 0x80, 0xcc, 0xbe, 0x9f, 0x3a, 0x49, 0xbe,
- 0x30, 0x79, 0x56, 0x3e, 0x20, 0xc4, 0x40, 0x3e, 0xf0, 0xbb, 0x5f, 0x3e,
- 0x85, 0x0e, 0x4b, 0x3e, 0x3e, 0x67, 0xd6, 0x3d, 0x2c, 0xfd, 0x88, 0x3a,
- 0xfe, 0x1f, 0x3a, 0xbe, 0x44, 0x46, 0x09, 0x3e, 0x88, 0x23, 0x0f, 0xbf,
- 0x41, 0x2c, 0x5a, 0x3e, 0x65, 0x4a, 0xc2, 0xbe, 0x4b, 0x82, 0x2d, 0x3e,
- 0xd8, 0x1b, 0xc7, 0xbe, 0xbf, 0xa2, 0x4f, 0xbd, 0x79, 0x58, 0xe3, 0x3d,
- 0x19, 0x3e, 0x14, 0x3d, 0xfe, 0xe4, 0x17, 0xbe, 0x34, 0xeb, 0xe1, 0xbd,
- 0xff, 0x96, 0x3d, 0x3c, 0x32, 0x5f, 0x92, 0xbd, 0xd5, 0x29, 0xd4, 0xbd,
- 0x92, 0xbc, 0x67, 0x3e, 0xfe, 0x3d, 0xe3, 0xbe, 0x46, 0xc1, 0xd4, 0x3d,
- 0xdc, 0xd2, 0xe4, 0xbe, 0xd5, 0x20, 0xfc, 0xbe, 0xaf, 0xfc, 0x46, 0xbd,
- 0xa2, 0x74, 0x20, 0xbd, 0x7f, 0x83, 0x44, 0x3e, 0xdc, 0x64, 0x66, 0xbe,
- 0x1f, 0xb1, 0xfb, 0x3d, 0x9c, 0x16, 0xab, 0xbe, 0xe0, 0x40, 0xa0, 0xbe,
- 0x28, 0x86, 0x56, 0x3e, 0xa2, 0x66, 0x5e, 0x3e, 0x28, 0xa5, 0xe0, 0xbb,
- 0xe8, 0xbd, 0x3f, 0xbe, 0x44, 0xec, 0xb5, 0xbe, 0xd0, 0xe3, 0x17, 0x3b,
- 0x5f, 0x05, 0xe1, 0x3d, 0x62, 0x53, 0x92, 0xbd, 0xdb, 0xd9, 0xe4, 0xbd,
- 0xd7, 0xb7, 0x9b, 0x3d, 0x4e, 0x3e, 0x8e, 0x3d, 0x3a, 0x52, 0xa0, 0xbc,
- 0x5a, 0x09, 0x4d, 0xbe, 0xda, 0xa5, 0x98, 0xbe, 0x7f, 0x47, 0xfc, 0xbe,
- 0x1e, 0x68, 0x1f, 0xbe, 0x0f, 0x07, 0x7d, 0xbd, 0x33, 0x1f, 0xa3, 0x3b,
- 0x0b, 0x09, 0xa3, 0xbc, 0x47, 0x27, 0xcc, 0xbe, 0x12, 0x96, 0x11, 0xbe,
- 0xa8, 0x55, 0x17, 0xbe, 0x5e, 0xa9, 0x58, 0x3e, 0x71, 0x86, 0xea, 0xbd,
- 0x59, 0xf8, 0xb7, 0x3d, 0xea, 0x08, 0xe7, 0xbd, 0x79, 0x9e, 0xe5, 0x3d,
- 0xf1, 0x19, 0x61, 0x3e, 0xd0, 0x6a, 0x4b, 0x3e, 0xf5, 0x70, 0xef, 0x3c,
- 0xb0, 0x2e, 0x4a, 0x3d, 0x10, 0x8c, 0x9d, 0xbc, 0xea, 0x0c, 0x76, 0x3d,
- 0x3e, 0x46, 0x96, 0x3e, 0xdf, 0xd5, 0x79, 0x3c, 0xa3, 0xe6, 0x3e, 0xbe,
- 0xb8, 0xd2, 0x1a, 0x3e, 0xf2, 0xff, 0x37, 0xbe, 0xaa, 0xcb, 0x1f, 0x3e,
- 0xcb, 0x59, 0x3b, 0x3e, 0x78, 0xf3, 0x71, 0xbe, 0xfb, 0x07, 0x02, 0xbd,
- 0xbe, 0xc7, 0x10, 0xbe, 0xd4, 0x53, 0x61, 0x3e, 0x26, 0x4b, 0x0c, 0x3e,
- 0xe5, 0x94, 0xbd, 0xbe, 0x57, 0xea, 0x89, 0xbe, 0x4b, 0x7c, 0x2b, 0xbe,
- 0xe2, 0xcb, 0x36, 0xbd, 0x80, 0x2d, 0xcb, 0xbd, 0xb4, 0x12, 0x1b, 0xbe,
- 0xb2, 0x19, 0xdf, 0xbe, 0x44, 0x7a, 0xa4, 0x3d, 0xa9, 0x3a, 0x66, 0x3e,
- 0x2e, 0xf5, 0x8b, 0xbd, 0xe6, 0x44, 0x2e, 0xbb, 0x9d, 0x7b, 0x02, 0xbe,
- 0xa8, 0x0a, 0xd7, 0xbd, 0x79, 0x6a, 0x30, 0xbe, 0x0c, 0xf6, 0x91, 0x3d,
- 0xd0, 0xd8, 0xb2, 0xbe, 0x0d, 0x05, 0x29, 0xbd, 0xf0, 0xf6, 0x46, 0x3b,
- 0x25, 0xb6, 0x0f, 0xbf, 0x7d, 0x7f, 0x81, 0xbd, 0xe4, 0x8a, 0xfb, 0xbe,
- 0x74, 0x2d, 0xea, 0xbd, 0xf7, 0x0b, 0x18, 0xbf, 0xeb, 0x5f, 0xf2, 0x3d,
- 0x8b, 0xd4, 0xb3, 0xbe, 0x96, 0x68, 0x02, 0xbe, 0x5f, 0xb4, 0x92, 0x3c,
- 0x02, 0xc7, 0xa7, 0xbc, 0xfd, 0x6e, 0x8e, 0xbe, 0xa2, 0x2f, 0x01, 0xbf,
- 0x06, 0x0a, 0x19, 0xbe, 0xc1, 0xf0, 0xcc, 0x3d, 0x09, 0x6c, 0x00, 0xbe,
- 0x7c, 0x09, 0xc0, 0x3d, 0x09, 0x2e, 0x6e, 0x3d, 0xea, 0xcf, 0x32, 0xbc,
- 0x5c, 0x6c, 0xb0, 0x3d, 0xf7, 0xf1, 0x8a, 0x3d, 0xc4, 0x9d, 0x82, 0xbd,
- 0x17, 0x65, 0x62, 0xbd, 0xd4, 0xbd, 0x8a, 0x3d, 0x8f, 0xb4, 0x37, 0xbe,
- 0x7f, 0x2a, 0xc0, 0x3d, 0x88, 0x53, 0xd8, 0xbc, 0xed, 0x3b, 0x60, 0x3d,
- 0xaa, 0xc5, 0x1f, 0xbc, 0x88, 0xe9, 0xcd, 0xbd, 0x46, 0x59, 0xe1, 0x3c,
- 0x1c, 0x71, 0xac, 0xbd, 0x14, 0xd7, 0x26, 0x3c, 0x92, 0x84, 0x4e, 0x3e,
- 0xcb, 0x9d, 0x1c, 0xbb, 0x87, 0x66, 0x4e, 0x3e, 0x63, 0xc8, 0xba, 0x3d,
- 0x73, 0x20, 0x36, 0x3d, 0x78, 0x0a, 0xf6, 0xbb, 0x0c, 0x13, 0x32, 0x3e,
- 0x86, 0xc6, 0x36, 0xbd, 0x11, 0x74, 0x8b, 0xbe, 0xaf, 0x56, 0xaa, 0x3d,
- 0x2c, 0xd0, 0x85, 0xbe, 0x73, 0xb5, 0xeb, 0x3b, 0xd9, 0x2a, 0xff, 0xbd,
- 0xf4, 0x30, 0x82, 0xbe, 0x23, 0x50, 0x51, 0x3d, 0x2c, 0xd1, 0x4f, 0xbd,
- 0x47, 0x1b, 0x72, 0x3e, 0x01, 0x02, 0x84, 0xbd, 0xd5, 0xad, 0x71, 0x3d,
- 0x9d, 0x1d, 0xbe, 0xbc, 0x1a, 0x02, 0xa0, 0x3c, 0x05, 0x2d, 0x93, 0x3d,
- 0xc9, 0x87, 0x91, 0xbd, 0xdf, 0x48, 0xba, 0x3e, 0x67, 0x46, 0xb0, 0x3c,
- 0x3e, 0x23, 0x98, 0x3e, 0xed, 0x4e, 0x6e, 0xbd, 0x83, 0x1b, 0x1a, 0xbe,
- 0xb6, 0xa8, 0xab, 0xbb, 0xc2, 0x72, 0x75, 0x3e, 0xad, 0x1f, 0xcd, 0xbd,
- 0x4f, 0x2c, 0xc8, 0xbd, 0x3b, 0x7a, 0x81, 0xbd, 0x03, 0x1a, 0x95, 0xbc,
- 0x29, 0x54, 0xf8, 0xbe, 0x2c, 0xf5, 0x91, 0x3e, 0xea, 0x57, 0x01, 0x3e,
- 0x1b, 0x47, 0x69, 0x3d, 0x1a, 0xa2, 0x84, 0x3d, 0x1a, 0x37, 0x8b, 0x3d,
- 0x60, 0xba, 0x31, 0x3d, 0x15, 0x1a, 0x88, 0xbe, 0x05, 0xd9, 0x02, 0xbe,
- 0x4a, 0x00, 0x02, 0x3e, 0x9e, 0x32, 0xbc, 0xbd, 0x6b, 0x51, 0xc5, 0x3d,
- 0xce, 0x7b, 0x70, 0x3e, 0x30, 0x33, 0xcf, 0x3d, 0x59, 0x19, 0x29, 0xbe,
- 0x74, 0x50, 0x4b, 0x3e, 0x9e, 0xbc, 0x59, 0xbd, 0xbf, 0xe4, 0x71, 0x3e,
- 0xbf, 0x70, 0x12, 0xbe, 0x11, 0xa6, 0x62, 0xbd, 0x8d, 0x1c, 0x43, 0x3b,
- 0x37, 0xea, 0x25, 0xbe, 0xcb, 0x98, 0x5a, 0xbc, 0xdd, 0xb4, 0xab, 0x3e,
- 0xd6, 0x3d, 0xf7, 0x3a, 0x9a, 0x9e, 0x07, 0x3e, 0x83, 0x8c, 0x8f, 0x3e,
- 0x9e, 0x7f, 0x97, 0x3e, 0x85, 0x75, 0x03, 0xbe, 0x07, 0x6b, 0x99, 0xbe,
- 0x93, 0x9d, 0x18, 0xbe, 0x2a, 0xf5, 0x5b, 0xbc, 0xf1, 0x72, 0x51, 0xbe,
- 0xf5, 0x85, 0x8c, 0x3e, 0xee, 0x69, 0x52, 0x3e, 0x33, 0xec, 0x83, 0xbe,
- 0xa9, 0x55, 0x9b, 0xbd, 0x4b, 0x3e, 0x3e, 0xbe, 0x43, 0x34, 0x93, 0x3d,
- 0x72, 0x9e, 0x15, 0x3e, 0xb9, 0x16, 0xb5, 0x3e, 0xbb, 0xab, 0x8c, 0xbe,
- 0xb2, 0x95, 0xa3, 0xbe, 0x10, 0xe1, 0x08, 0x3e, 0xf0, 0xa7, 0x4d, 0x3d,
- 0x55, 0x55, 0x8b, 0xbe, 0x77, 0x5c, 0xcd, 0x3e, 0x2a, 0xce, 0xc3, 0xbd,
- 0x14, 0xc8, 0xc2, 0xbd, 0xd3, 0x06, 0xcc, 0xbc, 0x25, 0x89, 0xe7, 0x3d,
- 0x87, 0xfc, 0x85, 0x3b, 0x50, 0x8c, 0x85, 0xbd, 0x00, 0xe1, 0x9b, 0xbc,
- 0xdd, 0x35, 0x73, 0xbd, 0xc0, 0x4f, 0x33, 0xbd, 0xa7, 0xb0, 0x9e, 0x3d,
- 0x17, 0xcc, 0x09, 0x3e, 0x53, 0x23, 0x50, 0x3e, 0xd1, 0x40, 0x1e, 0x3e,
- 0x60, 0xd0, 0xbb, 0x3d, 0x3a, 0x7a, 0x9e, 0xbe, 0x94, 0x86, 0x1e, 0xbe,
- 0xdd, 0x1b, 0x0e, 0xbe, 0xb5, 0x02, 0x41, 0xbe, 0x69, 0x4d, 0x66, 0x3c,
- 0x1d, 0x76, 0xe7, 0x3d, 0x8f, 0x4b, 0xab, 0x3d, 0x9c, 0xc0, 0x1b, 0x3e,
- 0x1b, 0xfa, 0x54, 0xbd, 0x54, 0x4f, 0xd6, 0xbd, 0x86, 0x21, 0x7d, 0x3d,
- 0x07, 0xee, 0x21, 0xbe, 0xdc, 0x55, 0x1b, 0x3d, 0x1d, 0xe8, 0xc7, 0x3d,
- 0x97, 0x4f, 0x1d, 0x3e, 0xed, 0xca, 0x3a, 0xbd, 0xec, 0xcd, 0x24, 0x3e,
- 0x44, 0x40, 0xa5, 0x3d, 0x18, 0x41, 0xea, 0xbd, 0xfe, 0x54, 0xdb, 0xbc,
- 0xf8, 0x62, 0xe3, 0x3d, 0xf1, 0xd3, 0xca, 0x3d, 0xac, 0xaa, 0xd7, 0x3d,
- 0x6c, 0x40, 0x1f, 0x3e, 0xf8, 0x51, 0x1a, 0xbe, 0x2b, 0x54, 0x76, 0x3e,
- 0x79, 0x75, 0x6a, 0xbb, 0x8e, 0x59, 0x83, 0x3e, 0xcd, 0x76, 0x1c, 0x3e,
- 0x49, 0x7b, 0x64, 0x3d, 0x41, 0x8e, 0xaf, 0xbd, 0x79, 0xd4, 0x3b, 0xbe,
- 0xcf, 0x5c, 0x81, 0xbd, 0xa2, 0x4c, 0xbc, 0x3d, 0xf9, 0xd4, 0xc8, 0xbd,
- 0x37, 0x94, 0xe7, 0xbd, 0x01, 0x54, 0x57, 0xbe, 0x87, 0x1c, 0xf5, 0x3d,
- 0xac, 0xf7, 0xbf, 0xbd, 0x6b, 0xc2, 0x3c, 0x3d, 0x64, 0xb3, 0x44, 0xbe,
- 0xb0, 0xbb, 0x52, 0xba, 0x7e, 0xbc, 0xce, 0xbc, 0xc3, 0xf3, 0xc1, 0xbe,
- 0x9d, 0x51, 0x0d, 0xbc, 0xcc, 0x47, 0xae, 0x3e, 0x2e, 0x5b, 0xe2, 0x3d,
- 0x59, 0x11, 0x0f, 0xbe, 0xb9, 0x57, 0x15, 0x3e, 0xc3, 0x3b, 0x5d, 0xbe,
- 0x21, 0xd1, 0x55, 0x3e, 0xbb, 0x62, 0xc7, 0xbd, 0xe4, 0x42, 0x17, 0xbc,
- 0xa4, 0x85, 0x91, 0xbd, 0x37, 0x07, 0x3e, 0xbe, 0xb9, 0x18, 0x98, 0xbd,
- 0x29, 0x14, 0xaf, 0xbc, 0x75, 0x13, 0x2b, 0x3e, 0x12, 0xde, 0x52, 0x3c,
- 0x97, 0xc5, 0x76, 0xbe, 0x37, 0x74, 0x19, 0x3e, 0xa4, 0xb5, 0xd6, 0xbd,
- 0x7b, 0x7d, 0x86, 0x3e, 0x79, 0xc0, 0x62, 0xbd, 0x20, 0xba, 0x21, 0x3e,
- 0x2e, 0xc1, 0xa3, 0xbe, 0x9b, 0x1e, 0x8e, 0xbe, 0x8d, 0xbd, 0x32, 0x3d,
- 0x8d, 0xff, 0x3b, 0xbe, 0x37, 0xc2, 0xba, 0x3d, 0xcb, 0x11, 0x24, 0xbe,
- 0x2f, 0x9b, 0xb8, 0x3c, 0x53, 0xf2, 0x19, 0x3e, 0xae, 0xe0, 0x17, 0x3e,
- 0xb2, 0xe5, 0x2a, 0xbd, 0x85, 0x53, 0x96, 0xbd, 0xc8, 0xb9, 0x0f, 0x3d,
- 0x32, 0x13, 0x97, 0x3d, 0xc7, 0xe3, 0x9f, 0x3e, 0x06, 0xaa, 0x8b, 0xbe,
- 0xba, 0x24, 0x04, 0xbe, 0x5e, 0x31, 0xa8, 0xbe, 0xb2, 0x88, 0xe4, 0x3d,
- 0x17, 0xac, 0xb6, 0xbe, 0x8e, 0xc4, 0xd1, 0x3d, 0x51, 0x09, 0xde, 0x3c,
- 0x14, 0xfb, 0xb4, 0x3d, 0x7e, 0xdc, 0x37, 0xbe, 0xa7, 0xde, 0xf6, 0x3d,
- 0x77, 0x3f, 0x76, 0x3d, 0xc7, 0x8a, 0x0f, 0x3c, 0xd8, 0x34, 0x85, 0xbe,
- 0x22, 0xb4, 0x3f, 0xbd, 0x13, 0x34, 0x09, 0xbe, 0xbc, 0x6c, 0x0d, 0xbc,
- 0xb2, 0x81, 0x8a, 0xbe, 0x61, 0xb5, 0x8d, 0x3d, 0x05, 0x29, 0x40, 0xbe,
- 0x5d, 0x5b, 0x04, 0x3e, 0xb5, 0xce, 0xad, 0x3a, 0x18, 0xcb, 0x0e, 0x3e,
- 0x81, 0x17, 0xdc, 0xbd, 0x1c, 0xc6, 0xb8, 0xbd, 0x31, 0xad, 0xaa, 0x3e,
- 0x7d, 0x3f, 0x9e, 0xbd, 0xa0, 0xa4, 0x04, 0x3e, 0x95, 0x4b, 0x31, 0xbe,
- 0x19, 0x29, 0x86, 0xbe, 0x40, 0xfb, 0xb2, 0x3d, 0x4f, 0xd4, 0x31, 0xbe,
- 0xb0, 0xa4, 0x17, 0x3e, 0x06, 0xd1, 0x0a, 0xbe, 0xdc, 0x33, 0x62, 0x3e,
- 0x7b, 0x16, 0x36, 0xbe, 0xd4, 0x8e, 0x3b, 0xbd, 0x75, 0xaa, 0x1b, 0xbc,
- 0xf2, 0x7e, 0xc7, 0x3e, 0x14, 0xe4, 0x9f, 0xbe, 0xe7, 0x31, 0x48, 0xbd,
- 0x74, 0x93, 0xa1, 0xbe, 0x6f, 0xa5, 0x84, 0xbe, 0x33, 0xe2, 0x0d, 0xbe,
- 0xe3, 0x1b, 0x90, 0xbe, 0x18, 0x3e, 0x50, 0x3d, 0xd3, 0x9a, 0x89, 0xbd,
- 0xdd, 0x46, 0xcc, 0xbd, 0x52, 0x81, 0x3b, 0x3d, 0x97, 0x2a, 0x3f, 0xbe,
- 0xd9, 0x95, 0x06, 0xbe, 0x22, 0x11, 0xcc, 0x3d, 0x39, 0x28, 0x43, 0xbe,
- 0xc1, 0x10, 0x8e, 0xba, 0xb9, 0xea, 0x92, 0x3b, 0x2d, 0x27, 0x17, 0x3e,
- 0x7e, 0x94, 0xab, 0x3e, 0x1e, 0x3d, 0x42, 0x3b, 0xdc, 0xdd, 0x19, 0xbf,
- 0x95, 0xa3, 0x01, 0xbf, 0xcb, 0xe0, 0x3c, 0xbe, 0x3a, 0x3f, 0x6f, 0x3e,
- 0xaf, 0x58, 0xf5, 0xbc, 0x56, 0x2b, 0xbc, 0xbc, 0x3c, 0xd9, 0xa8, 0x3e,
- 0x94, 0x1e, 0xba, 0xbd, 0x1c, 0x71, 0x4e, 0xbe, 0xf4, 0xcd, 0xff, 0xbc,
- 0x2d, 0x36, 0xeb, 0xbd, 0x4f, 0x73, 0x19, 0x3e, 0xa1, 0x39, 0x9c, 0xbe,
- 0x2c, 0x04, 0x6c, 0x3e, 0x18, 0x0f, 0xa4, 0x3d, 0xd7, 0x35, 0x5b, 0xbd,
- 0xee, 0x81, 0x4d, 0x3d, 0xf7, 0x54, 0x0a, 0x3e, 0x48, 0x17, 0xc2, 0x3d,
- 0xc3, 0xb1, 0x31, 0x3e, 0xb5, 0x0e, 0x9c, 0xbc, 0xf7, 0x45, 0x04, 0xbd,
- 0xa5, 0x8c, 0xb5, 0x3b, 0xd5, 0x2a, 0x9f, 0xbe, 0xb8, 0x56, 0x9f, 0xbe,
- 0xd2, 0x8d, 0xdd, 0x3d, 0x0a, 0x50, 0xd4, 0x3d, 0xd1, 0xe9, 0x3c, 0xbd,
- 0x40, 0xf0, 0x3c, 0x3d, 0x89, 0xb4, 0x7c, 0xbe, 0x40, 0x7f, 0x95, 0x3e,
- 0x7c, 0x44, 0xfd, 0x3c, 0xb4, 0xdf, 0x9e, 0x3c, 0xd6, 0xad, 0xc1, 0x3e,
- 0x61, 0xa5, 0x8a, 0x3d, 0xe5, 0x4c, 0x2b, 0x3e, 0x65, 0xd2, 0xd7, 0xbd,
- 0x7d, 0x63, 0x3c, 0x3e, 0xc1, 0x96, 0x13, 0x3a, 0x2d, 0xeb, 0xac, 0xbe,
- 0x11, 0xb0, 0xea, 0x3c, 0x63, 0x78, 0xf2, 0x3d, 0x3e, 0xf9, 0x50, 0x3d,
- 0xda, 0xb9, 0x25, 0xbd, 0x1a, 0x65, 0x37, 0xbd, 0xec, 0x9d, 0x86, 0xbd,
- 0xc7, 0x84, 0x64, 0x3b, 0x91, 0x17, 0xa2, 0x3c, 0xa2, 0x10, 0xdf, 0x3d,
- 0xb8, 0x04, 0xbf, 0x3c, 0xb8, 0x80, 0x94, 0x3d, 0x5c, 0x1f, 0x73, 0x3e,
- 0x76, 0x86, 0x30, 0x3d, 0xc1, 0xe5, 0x54, 0xbe, 0x7d, 0xcf, 0xa8, 0xbe,
- 0x67, 0x0d, 0x3d, 0x3e, 0xaa, 0xbf, 0xed, 0xbd, 0xd4, 0xf8, 0xdf, 0x3b,
- 0xf0, 0x3d, 0xa3, 0xbe, 0x0f, 0xd1, 0x53, 0xbe, 0x33, 0x9b, 0x7c, 0x3d,
- 0x37, 0x9e, 0xb4, 0xbe, 0x58, 0xe3, 0xb3, 0x3e, 0x34, 0x6e, 0xda, 0x3d,
- 0xd5, 0x0a, 0x95, 0xbd, 0xa1, 0x4e, 0x08, 0x3e, 0x08, 0x39, 0x93, 0x3e,
- 0x73, 0x64, 0xee, 0xbb, 0xd0, 0x9a, 0x34, 0xbb, 0x88, 0x8e, 0x19, 0xbe,
- 0x62, 0xe8, 0xcb, 0x3c, 0x7a, 0xdc, 0xee, 0xbd, 0xe8, 0xfe, 0xae, 0xba,
- 0xa6, 0xb6, 0xb2, 0x3d, 0xec, 0x58, 0x75, 0xbd, 0xa9, 0x01, 0x91, 0xbe,
- 0x6a, 0x2a, 0x28, 0xbf, 0xf6, 0xd4, 0x11, 0xbe, 0xe8, 0x35, 0x09, 0xbe,
- 0xda, 0x21, 0x0d, 0x3d, 0xcb, 0x06, 0x90, 0x3d, 0xef, 0x6f, 0x9c, 0xbd,
- 0x93, 0x95, 0x84, 0xbb, 0x71, 0x77, 0x0b, 0x3d, 0xa7, 0x9f, 0x15, 0x3e,
- 0x20, 0x56, 0xa3, 0x3c, 0x9c, 0xa7, 0x0a, 0xbe, 0xcf, 0x50, 0x85, 0x3d,
- 0x01, 0x57, 0x18, 0xbe, 0x91, 0xc0, 0x82, 0x3d, 0x02, 0xa4, 0x6a, 0xbe,
- 0xeb, 0xc0, 0x08, 0x3c, 0xec, 0x8b, 0xd9, 0xbe, 0x53, 0x0f, 0x0a, 0x3e,
- 0xf2, 0x47, 0x17, 0xbf, 0x0f, 0xeb, 0xd9, 0xbc, 0x71, 0x56, 0x96, 0x3c,
- 0xa7, 0x13, 0x23, 0xbf, 0xe4, 0x35, 0x3a, 0xbd, 0xcd, 0x1f, 0xee, 0x3d,
- 0x7a, 0x45, 0x72, 0xbe, 0xbf, 0x87, 0x28, 0xbd, 0x9a, 0x71, 0xaf, 0x3e,
- 0xc1, 0x07, 0xaa, 0xbe, 0x6b, 0x3f, 0xbd, 0x3d, 0x4f, 0xdf, 0x31, 0xbe,
- 0xa1, 0xc0, 0xce, 0xbe, 0x43, 0x93, 0x78, 0x3e, 0xca, 0x39, 0x40, 0x3e,
- 0xbc, 0xf7, 0xb1, 0xba, 0x7a, 0x10, 0x77, 0x3b, 0x3e, 0x63, 0x42, 0x3e,
- 0x4c, 0x41, 0xfd, 0x3d, 0x65, 0x77, 0x73, 0xbc, 0x52, 0x7a, 0x6a, 0xbd,
- 0x8f, 0x84, 0x80, 0xbd, 0xf3, 0xd0, 0x80, 0xbe, 0x66, 0xd4, 0x2d, 0x3d,
- 0xab, 0x86, 0x5c, 0xbe, 0x29, 0x20, 0x9a, 0xbd, 0xce, 0xc5, 0x06, 0xbe,
- 0x04, 0x2d, 0xe4, 0x3b, 0x13, 0xdc, 0x78, 0x3e, 0x02, 0x71, 0x7a, 0xbc,
- 0xa6, 0xfa, 0x1f, 0xbe, 0xbc, 0xba, 0x36, 0x3e, 0xd2, 0x69, 0x04, 0x3e,
- 0xbb, 0x49, 0x14, 0xbd, 0xa7, 0x22, 0x37, 0x3e, 0x06, 0xb4, 0xf0, 0xbc,
- 0xb7, 0xdf, 0x8f, 0xbd, 0x03, 0x47, 0x67, 0xbe, 0x42, 0x6a, 0xe0, 0xbc,
- 0x17, 0xde, 0x25, 0x3e, 0x31, 0xd7, 0x48, 0xbe, 0xf3, 0xf4, 0xc0, 0xbd,
- 0x7f, 0xab, 0x16, 0xbc, 0xbc, 0x3a, 0x95, 0x3e, 0x69, 0xee, 0x81, 0xbe,
- 0xd4, 0x6f, 0xcb, 0xbd, 0x75, 0x97, 0x65, 0x3e, 0xe2, 0x76, 0xb4, 0x3e,
- 0xe6, 0xc4, 0x9a, 0xbe, 0xc2, 0x5e, 0x4b, 0x3b, 0xe4, 0xbe, 0xfc, 0x3d,
- 0xd6, 0x04, 0xb2, 0xbe, 0x66, 0xf5, 0xb5, 0xbd, 0x30, 0x09, 0x52, 0xbe,
- 0xc9, 0xf8, 0x8c, 0x3e, 0xf9, 0xda, 0x5f, 0x3e, 0xeb, 0xc9, 0x06, 0xbe,
- 0x48, 0xe5, 0x13, 0x3e, 0x77, 0xa5, 0x84, 0xbb, 0xca, 0x44, 0xd0, 0x3d,
- 0x52, 0x13, 0x23, 0x3e, 0x11, 0xcc, 0x6e, 0x3e, 0xda, 0x3b, 0x51, 0xbc,
- 0x25, 0x7c, 0x47, 0x3e, 0xc9, 0x1a, 0xc6, 0x3d, 0x5d, 0xc4, 0xb0, 0xbd,
- 0x83, 0x0f, 0xca, 0x3d, 0x85, 0xc7, 0xf8, 0xbd, 0x84, 0x91, 0xb4, 0x3d,
- 0x3e, 0xa7, 0xbf, 0xbe, 0x05, 0xc7, 0x12, 0x3c, 0x77, 0xcf, 0xd2, 0x3b,
- 0x38, 0xe1, 0x1c, 0xbd, 0x3e, 0xf6, 0x88, 0xbe, 0x4d, 0x5b, 0x35, 0x3c,
- 0x10, 0x48, 0x13, 0xbc, 0xd5, 0xf5, 0x99, 0x3d, 0xc6, 0x1b, 0x43, 0xbe,
- 0xab, 0x85, 0x8e, 0xbe, 0x8e, 0x8e, 0x29, 0x3d, 0x4d, 0x64, 0xbf, 0xbe,
- 0x76, 0x9d, 0x0c, 0x3e, 0x1d, 0x3b, 0x62, 0xbe, 0xde, 0xaa, 0x79, 0xbe,
- 0xb6, 0xd2, 0xfe, 0xbe, 0x8f, 0x2e, 0xf8, 0xbb, 0xe5, 0x6e, 0x11, 0x3e,
- 0x64, 0xf1, 0x26, 0xbe, 0x53, 0x82, 0x94, 0x3e, 0xab, 0xe6, 0x05, 0x3e,
- 0x60, 0x17, 0xf8, 0xbe, 0x28, 0xd2, 0x16, 0xbe, 0xf6, 0xdd, 0x0b, 0xbe,
- 0x3f, 0xb7, 0x45, 0xbe, 0x55, 0xc2, 0x6f, 0xbc, 0x5e, 0x5b, 0x79, 0xbc,
- 0xac, 0x1d, 0xa9, 0xbd, 0xc0, 0x2d, 0x75, 0x3e, 0xcb, 0x35, 0xc6, 0xbe,
- 0xca, 0xeb, 0x90, 0x3e, 0xf2, 0x6e, 0x89, 0xbd, 0x48, 0xee, 0x56, 0xbd,
- 0x60, 0x5f, 0x14, 0xbe, 0xad, 0x5d, 0x38, 0xbe, 0xe7, 0x3e, 0xaa, 0xbe,
- 0x1f, 0xf2, 0xb6, 0xbe, 0xbd, 0x4e, 0x9e, 0xbd, 0x0b, 0x8a, 0x8a, 0xbe,
- 0xf0, 0xe8, 0xc7, 0x3d, 0x06, 0xe0, 0xbd, 0xbe, 0x73, 0x8f, 0x25, 0x3a,
- 0xd9, 0x97, 0xf8, 0xbc, 0x92, 0x41, 0x5a, 0x3d, 0x39, 0x49, 0xe7, 0x3d,
- 0x0b, 0x3d, 0x0a, 0xbf, 0x7c, 0x84, 0xda, 0xbe, 0xaa, 0x86, 0x0d, 0x3e,
- 0x89, 0x92, 0x02, 0xbe, 0x9c, 0x8a, 0x2a, 0xbe, 0x69, 0x3d, 0x8c, 0x3d,
- 0xf7, 0x6c, 0x74, 0x3e, 0xd3, 0x0e, 0xa2, 0xbe, 0xaf, 0xe8, 0x9c, 0xbd,
- 0x84, 0xfc, 0x09, 0x3e, 0x38, 0xcb, 0x05, 0xbd, 0xb3, 0x15, 0x84, 0x3e,
- 0xf1, 0x3e, 0xbd, 0x3d, 0x34, 0x3b, 0x2a, 0xbd, 0x5a, 0xee, 0x73, 0xbc,
- 0x5f, 0xcb, 0x38, 0x3d, 0xa0, 0x7e, 0x5e, 0x3b, 0x56, 0x86, 0x54, 0x3e,
- 0x25, 0xca, 0x73, 0xbe, 0xe1, 0x86, 0x89, 0x3d, 0x95, 0xcf, 0x2f, 0xbd,
- 0x0f, 0x4b, 0x71, 0x3d, 0xe7, 0x70, 0x4a, 0x3d, 0x66, 0x2e, 0x1e, 0x3e,
- 0xac, 0xef, 0xd1, 0xbd, 0x17, 0x41, 0x2f, 0xbe, 0xc5, 0x44, 0xab, 0xbd,
- 0x9b, 0x36, 0xba, 0xbe, 0xa8, 0xc4, 0x2c, 0xbb, 0xbc, 0x4d, 0xb2, 0xbd,
- 0xf7, 0xef, 0xd3, 0xbc, 0x90, 0x89, 0xfe, 0xbc, 0x23, 0xf5, 0x08, 0x3e,
- 0x02, 0x02, 0xa1, 0x3d, 0xd6, 0x17, 0x55, 0xbe, 0xc0, 0x6d, 0x37, 0xbe,
- 0xc6, 0xb4, 0x28, 0x3e, 0x07, 0x19, 0xf7, 0x3e, 0x6f, 0xe7, 0xba, 0x3e,
- 0xd1, 0xdb, 0xb8, 0x3e, 0x02, 0x8c, 0x15, 0xbe, 0xe2, 0x73, 0xb1, 0xbe,
- 0x46, 0x24, 0x2f, 0xbd, 0xd9, 0x2b, 0x88, 0x3c, 0x1a, 0x03, 0xd2, 0xbc,
- 0x58, 0xbd, 0xe6, 0xbd, 0x34, 0xe7, 0x18, 0xbf, 0x6f, 0x45, 0x59, 0x3d,
- 0x00, 0x5a, 0xa8, 0xbe, 0x02, 0x90, 0xd4, 0xbe, 0xd8, 0x31, 0x9a, 0xbc,
- 0xd5, 0x42, 0x4d, 0xbe, 0xca, 0xae, 0x58, 0xbe, 0x44, 0x3f, 0xe2, 0xbe,
- 0xb6, 0x22, 0x2d, 0xbe, 0x57, 0xd2, 0x08, 0x3c, 0x19, 0x3f, 0xfd, 0xbc,
- 0x54, 0x74, 0x80, 0xbd, 0x36, 0x83, 0xf4, 0x3d, 0xac, 0x49, 0xa6, 0xbd,
- 0x61, 0xcc, 0xfc, 0x3d, 0xe1, 0x93, 0x31, 0xbf, 0xf9, 0x98, 0xa6, 0xbd,
- 0x70, 0xa1, 0x1a, 0xbe, 0x62, 0xac, 0xe4, 0xbd, 0xc4, 0x7c, 0x80, 0x3c,
- 0x77, 0xb2, 0xa6, 0xbe, 0xd3, 0x0c, 0x35, 0xbd, 0xda, 0xd2, 0x8d, 0xbd,
- 0x6f, 0x7c, 0xb4, 0xbd, 0x8c, 0xb4, 0x48, 0xbe, 0xb9, 0xb9, 0x4a, 0xbe,
- 0xcd, 0xba, 0x30, 0x3e, 0x58, 0x8f, 0x1b, 0xbe, 0x19, 0x16, 0xaf, 0x3b,
- 0x0f, 0xbb, 0x65, 0xbd, 0x1e, 0x89, 0x06, 0xbe, 0x79, 0xa4, 0x37, 0xbe,
- 0x05, 0x43, 0x1f, 0xbe, 0x5e, 0x19, 0x46, 0xbd, 0x4c, 0x58, 0x19, 0xbe,
- 0xe6, 0x6d, 0xa8, 0x3b, 0x4a, 0x0b, 0xf4, 0x3d, 0x4e, 0x88, 0xaa, 0xbd,
- 0x58, 0x0f, 0x8a, 0x3e, 0x9c, 0xba, 0xa4, 0xbd, 0xa7, 0x93, 0x6b, 0x3d,
- 0x9a, 0xf1, 0x39, 0x3e, 0xb4, 0x0c, 0x11, 0xbe, 0x28, 0xe7, 0x9a, 0x3d,
- 0x49, 0xfe, 0x05, 0xbe, 0xd2, 0x96, 0xd2, 0x3c, 0xcc, 0x9f, 0x44, 0xbe,
- 0x1d, 0x28, 0x04, 0x3e, 0x35, 0x9f, 0x81, 0xbe, 0xb6, 0xb3, 0x25, 0xbd,
- 0xd2, 0x5b, 0x0c, 0xbe, 0x52, 0xd9, 0x52, 0xbd, 0x20, 0xd7, 0x92, 0xbe,
- 0x31, 0xde, 0x98, 0x3e, 0xd8, 0x5a, 0x21, 0xbe, 0x6d, 0xda, 0x9e, 0x3c,
- 0x87, 0x1b, 0x56, 0x3e, 0x54, 0x3b, 0x34, 0xbe, 0x56, 0x7f, 0x11, 0xbe,
- 0x88, 0xbc, 0x19, 0x3c, 0xbd, 0x78, 0x03, 0xbe, 0xd3, 0x20, 0xce, 0xbd,
- 0x5e, 0x18, 0x8b, 0x3d, 0x86, 0x2e, 0xf3, 0xbc, 0x24, 0xf7, 0x17, 0x3e,
- 0x4a, 0xd9, 0x96, 0xbd, 0x82, 0x26, 0xd8, 0xbd, 0x5e, 0x18, 0xc5, 0xbe,
- 0x0b, 0x7f, 0xc6, 0xbc, 0xae, 0x0b, 0xc1, 0xbd, 0xe9, 0xb4, 0x98, 0x3e,
- 0x3d, 0xb9, 0xec, 0xbd, 0x10, 0xd6, 0xe9, 0xbd, 0x9d, 0xf3, 0xa3, 0xbd,
- 0xa0, 0x97, 0xce, 0x3d, 0x64, 0x18, 0x19, 0xbe, 0xae, 0x3e, 0x81, 0x3d,
- 0x4f, 0x5a, 0xe0, 0xbd, 0xe0, 0x76, 0x2b, 0x3e, 0xcd, 0x88, 0x21, 0x3d,
- 0x22, 0x64, 0x27, 0xbd, 0xac, 0x44, 0x7a, 0xbe, 0x4e, 0x1a, 0x06, 0xbe,
- 0x94, 0x64, 0x3c, 0xbe, 0xa9, 0xa6, 0xde, 0xbd, 0xf7, 0x3d, 0xa7, 0xbc,
- 0xd6, 0x8c, 0xf1, 0xbd, 0xf0, 0xf5, 0xb8, 0xbd, 0x3b, 0x05, 0x90, 0xbe,
- 0x13, 0x4c, 0xbc, 0x3d, 0xae, 0x56, 0x13, 0x3d, 0xb6, 0xbd, 0x54, 0x3c,
- 0xc6, 0xe5, 0x1c, 0xbf, 0x25, 0xd4, 0xa1, 0xbd, 0xb9, 0xdc, 0x3b, 0xbe,
- 0x23, 0x4d, 0x11, 0x3e, 0x30, 0xfa, 0x4a, 0xbe, 0xec, 0xe2, 0x9e, 0xbd,
- 0x5a, 0xf6, 0x58, 0xbe, 0xba, 0x98, 0x80, 0xbe, 0x8a, 0x50, 0xac, 0xbd,
- 0x4c, 0xd0, 0x82, 0xbe, 0x14, 0xf1, 0xa7, 0x3e, 0xcd, 0xa7, 0x9f, 0xbe,
- 0x89, 0xb3, 0x50, 0x3e, 0x2c, 0xd8, 0x6a, 0x3c, 0x31, 0xde, 0xea, 0xbd,
- 0xe5, 0x5f, 0x22, 0xbd, 0xb2, 0xc1, 0x00, 0xbe, 0xc4, 0x81, 0x7b, 0x3e,
- 0xd8, 0x6a, 0x4c, 0xbe, 0x4e, 0x95, 0x23, 0x3e, 0xde, 0xd0, 0x93, 0x3d,
- 0x39, 0x8e, 0x93, 0xbd, 0xec, 0xee, 0x9e, 0x3d, 0x04, 0xad, 0x1b, 0x3d,
- 0x1b, 0xbc, 0x6d, 0xbe, 0xec, 0x12, 0xcf, 0xbd, 0x43, 0x84, 0xfd, 0xbd,
- 0x32, 0x78, 0x1b, 0xbe, 0xfd, 0x79, 0xc2, 0x3d, 0xaf, 0x44, 0x10, 0xbe,
- 0x7e, 0x2e, 0x50, 0xbd, 0x27, 0x4b, 0xdf, 0x3d, 0x81, 0x85, 0x53, 0xbe,
- 0x30, 0x18, 0x9d, 0x3b, 0x64, 0x46, 0x4c, 0x3b, 0xa3, 0x4c, 0x01, 0xbe,
- 0x2d, 0xfb, 0x80, 0xbe, 0x9e, 0xf2, 0x91, 0x3e, 0x7c, 0xe3, 0x77, 0x3e,
- 0x92, 0xe8, 0xac, 0x3d, 0x70, 0xcf, 0xb9, 0xbd, 0x75, 0x35, 0xf0, 0x3d,
- 0xcb, 0xe4, 0xb4, 0xbe, 0xfb, 0x33, 0x5e, 0xbe, 0x8c, 0xd9, 0x3a, 0x3e,
- 0x23, 0xf4, 0x72, 0xbe, 0xc7, 0x6b, 0x90, 0x3e, 0xa1, 0x7c, 0xad, 0x3c,
- 0x72, 0xb3, 0x74, 0x3d, 0xc7, 0xc7, 0x7b, 0xbe, 0x73, 0x6a, 0xce, 0xbc,
- 0x06, 0x34, 0x59, 0xba, 0x72, 0x6a, 0x37, 0xbe, 0x36, 0xdd, 0x1e, 0xbe,
- 0xdb, 0x62, 0xa8, 0xbe, 0x9c, 0xda, 0x1b, 0xbd, 0x4b, 0x5e, 0x2a, 0xbe,
- 0xa1, 0x48, 0x16, 0x3d, 0xc8, 0x02, 0xab, 0x3d, 0x87, 0x09, 0xa4, 0xbe,
- 0xfe, 0x74, 0xc9, 0x3d, 0xd5, 0x3c, 0x45, 0x3d, 0xbc, 0xd0, 0x0e, 0xbd,
- 0xeb, 0x9a, 0x07, 0xbf, 0x41, 0xde, 0xe4, 0x3d, 0x2a, 0xe7, 0x57, 0xbc,
- 0xa9, 0xa2, 0xcc, 0xbe, 0x5c, 0xdb, 0xed, 0x3d, 0xee, 0x94, 0x09, 0xbe,
- 0x51, 0x04, 0xf0, 0xbd, 0xb4, 0x04, 0xd9, 0xbd, 0x35, 0xd0, 0x21, 0xbe,
- 0x51, 0xda, 0x37, 0x3e, 0x4e, 0x81, 0xad, 0xbe, 0xb1, 0xb7, 0x89, 0xbd,
- 0x5d, 0x7b, 0xf5, 0xbd, 0x67, 0xd5, 0xda, 0xbd, 0xdc, 0x9d, 0xb0, 0xbc,
- 0x0f, 0x38, 0x2d, 0x3e, 0xb0, 0x4c, 0x9c, 0x3d, 0x6c, 0x53, 0x3a, 0xbe,
- 0x87, 0x4b, 0x97, 0xbd, 0x7c, 0x43, 0x7f, 0x3d, 0x5b, 0xe4, 0xad, 0xbd,
- 0xa6, 0xfa, 0x5c, 0xbd, 0xc1, 0x03, 0x8c, 0xbd, 0x10, 0x19, 0x81, 0xbe,
- 0x87, 0xdb, 0xc8, 0xba, 0xfe, 0x0b, 0x51, 0xbe, 0xd8, 0x82, 0xa3, 0x3e,
- 0x26, 0x84, 0x48, 0x3e, 0x56, 0x93, 0x6c, 0x3e, 0x74, 0xbe, 0x44, 0xbe,
- 0x25, 0xcd, 0x93, 0xbe, 0x17, 0x03, 0xb4, 0x3b, 0x71, 0x2f, 0xd4, 0xbd,
- 0x48, 0x1a, 0x25, 0xbe, 0x0f, 0x79, 0x90, 0x3d, 0xed, 0x64, 0x13, 0xbe,
- 0xbe, 0x81, 0x81, 0xbe, 0xf7, 0x21, 0x15, 0x3c, 0xde, 0x07, 0x2f, 0x3d,
- 0x7a, 0xa7, 0x73, 0xbe, 0x9d, 0x89, 0x42, 0xbe, 0x86, 0xe2, 0x89, 0xbe,
- 0x22, 0x9a, 0x01, 0xbd, 0xc7, 0xff, 0xb5, 0xbe, 0x22, 0xae, 0x4d, 0xbe,
- 0x78, 0x02, 0x18, 0xbf, 0x78, 0xe6, 0x9b, 0xbe, 0xe1, 0xae, 0xfb, 0xbd,
- 0x23, 0x73, 0x92, 0xbd, 0x13, 0x7b, 0x0c, 0x3e, 0xfc, 0xaa, 0x8f, 0xbb,
- 0xad, 0x85, 0x4b, 0x3d, 0xd5, 0x10, 0x30, 0xbc, 0xb5, 0x33, 0xd2, 0x3d,
- 0x58, 0xb8, 0x25, 0xbe, 0x00, 0xf4, 0x0f, 0x3c, 0x7c, 0x82, 0xe7, 0xbe,
- 0xcd, 0xfc, 0x93, 0x3c, 0x27, 0x72, 0x4d, 0xbd, 0x2d, 0x3a, 0x01, 0xbe,
- 0x2e, 0x1e, 0xb9, 0xbe, 0x42, 0xd1, 0x83, 0xbe, 0x61, 0x23, 0xdc, 0x3d,
- 0x91, 0x15, 0x82, 0x3e, 0x78, 0x2b, 0xf4, 0xbd, 0x5c, 0x25, 0x50, 0xbe,
- 0x3e, 0x03, 0x95, 0x3e, 0x91, 0x8a, 0x2d, 0xbe, 0x57, 0xea, 0x4d, 0x3c,
- 0x32, 0x17, 0xfe, 0xbc, 0xff, 0xd0, 0xa9, 0x3c, 0xfe, 0xb8, 0x04, 0xbe,
- 0x19, 0x3f, 0x2b, 0xbb, 0xa5, 0xfc, 0xe6, 0xbe, 0x05, 0x3d, 0xc6, 0xbd,
- 0xc2, 0x63, 0x6f, 0xbd, 0x57, 0xc6, 0xaf, 0xbe, 0x7a, 0x30, 0x02, 0xbe,
- 0x9d, 0x6f, 0x3b, 0xbe, 0x3d, 0xb9, 0x37, 0xbd, 0xcc, 0x7b, 0xc5, 0xbd,
- 0x29, 0x5c, 0x1f, 0x3e, 0x6a, 0x4c, 0x57, 0x3d, 0x09, 0x17, 0x91, 0xbd,
- 0xc6, 0x01, 0xc2, 0x3b, 0xa8, 0xf9, 0x81, 0xbe, 0x18, 0x82, 0x58, 0x3e,
- 0xd8, 0xe4, 0x07, 0xbe, 0x7c, 0xa1, 0x2f, 0x3d, 0x66, 0xad, 0xbf, 0x3d,
- 0x75, 0x4b, 0xec, 0xbd, 0x11, 0x17, 0x70, 0xbe, 0xf5, 0xb9, 0x6d, 0xbe,
- 0x01, 0x76, 0x45, 0xbe, 0x86, 0x7f, 0xa6, 0xbe, 0x62, 0x6c, 0xf9, 0xbc,
- 0xfd, 0x9d, 0x4a, 0xbb, 0x4a, 0xa9, 0x9f, 0x3d, 0x9e, 0x35, 0xa9, 0x3c,
- 0xe0, 0xe0, 0xb5, 0x3d, 0x9a, 0xec, 0xef, 0xbd, 0xaf, 0x22, 0x26, 0x3d,
- 0xce, 0xde, 0x65, 0xbe, 0xd4, 0x81, 0x7a, 0x3c, 0xd1, 0xbc, 0x03, 0x3d,
- 0xf7, 0xfe, 0x2c, 0xbe, 0xf0, 0x35, 0x16, 0xbe, 0x09, 0xde, 0x00, 0xbe,
- 0x9d, 0x27, 0x2c, 0x3d, 0xaf, 0x2b, 0xbd, 0xbc, 0x11, 0x2d, 0x90, 0xbd,
- 0x38, 0x60, 0x7e, 0xbe, 0xca, 0xc2, 0x06, 0xbc, 0xd3, 0x2e, 0x1a, 0x3e,
- 0xdc, 0x39, 0x09, 0xbe, 0x4a, 0x00, 0x38, 0xbe, 0x33, 0x98, 0xe5, 0xbd,
- 0x5e, 0x37, 0x5a, 0xbd, 0xae, 0xb6, 0x3f, 0xbd, 0x59, 0x8d, 0xe7, 0x3d,
- 0x96, 0xfb, 0x4e, 0x3e, 0x4a, 0x65, 0x01, 0xbf, 0xaf, 0x4f, 0x8f, 0xbe,
- 0xc7, 0xb8, 0x05, 0xbe, 0x0a, 0xa5, 0x8f, 0xbe, 0xd0, 0xda, 0x63, 0x3d,
- 0x60, 0xee, 0x27, 0xbe, 0xca, 0x43, 0x51, 0xbe, 0xfe, 0xf4, 0x11, 0xbe,
- 0x49, 0xf5, 0x18, 0xbe, 0x61, 0xd8, 0x19, 0xbd, 0x71, 0xa9, 0xc0, 0xbc,
- 0x89, 0xe9, 0x84, 0xbd, 0xdc, 0xe2, 0x2d, 0xbe, 0xf0, 0x32, 0xcf, 0xbe,
- 0xf4, 0x3f, 0xa5, 0xbd, 0x2b, 0x0a, 0x01, 0x3b, 0x1d, 0x40, 0x4b, 0xbe,
- 0x92, 0x6f, 0xbd, 0x3d, 0xfc, 0x86, 0xcf, 0xbd, 0x9a, 0x9e, 0x47, 0xbd,
- 0x6f, 0xd9, 0xd8, 0x3d, 0x28, 0x9b, 0x25, 0x3d, 0x76, 0x28, 0xa7, 0xbb,
- 0xc1, 0xba, 0x0f, 0xbe, 0x64, 0x7e, 0x12, 0xbe, 0xb1, 0xf1, 0x3e, 0xbe,
- 0x11, 0x46, 0x7d, 0xbb, 0xa9, 0x50, 0xcf, 0x3c, 0x61, 0xc9, 0x33, 0xbe,
- 0xf4, 0x1c, 0xb0, 0xbc, 0x95, 0x5d, 0x82, 0xbd, 0x04, 0x3d, 0xe6, 0xbd,
- 0x7b, 0xae, 0x9d, 0xbc, 0xc5, 0x27, 0x75, 0x3e, 0x0d, 0xfc, 0x12, 0x3e,
- 0xaa, 0x28, 0x1a, 0xbe, 0xae, 0xeb, 0x35, 0x3e, 0x73, 0x09, 0x1d, 0xbe,
- 0x39, 0xce, 0xdb, 0xbd, 0xcc, 0xa7, 0x0a, 0xbd, 0xa4, 0x86, 0x0e, 0x3e,
- 0x41, 0x1f, 0x53, 0x3e, 0x23, 0xf0, 0x98, 0xbd, 0x02, 0x8b, 0x41, 0xbe,
- 0x12, 0xce, 0x04, 0xbf, 0xd2, 0x67, 0x18, 0x3d, 0xb3, 0x75, 0xc5, 0xbd,
- 0xd3, 0xe6, 0x97, 0xbe, 0x51, 0x6d, 0x55, 0xbe, 0xca, 0xd5, 0x56, 0x3d,
- 0xcc, 0x2a, 0x34, 0xbe, 0xac, 0xfe, 0x77, 0xbd, 0xcd, 0x7f, 0xbb, 0xbd,
- 0xbc, 0x75, 0x8e, 0xbe, 0xcf, 0x41, 0xe0, 0xbe, 0x98, 0xe9, 0x7f, 0x3e,
- 0xf2, 0x82, 0x71, 0x3d, 0x48, 0xde, 0x9d, 0xbe, 0xa6, 0xc4, 0x50, 0x3d,
- 0x06, 0x5f, 0x8a, 0x3e, 0xe9, 0x5a, 0x28, 0xbe, 0x22, 0x6a, 0x11, 0xbd,
- 0xf8, 0xee, 0x3b, 0xbe, 0x62, 0xaa, 0x40, 0xbd, 0xc3, 0x38, 0x8c, 0xbe,
- 0x8d, 0xef, 0x7a, 0x3d, 0xbe, 0xa6, 0x33, 0x3d, 0xde, 0x85, 0xea, 0xbd,
- 0x5c, 0x5f, 0xd5, 0x3c, 0x0d, 0xf2, 0xb8, 0x3d, 0xba, 0x72, 0xbd, 0xbe,
- 0x45, 0x68, 0x6d, 0x3c, 0xd6, 0x84, 0xac, 0xbd, 0x3f, 0xa3, 0xf4, 0xbe,
- 0x8d, 0xb1, 0x9e, 0xbe, 0xfd, 0x11, 0xb8, 0xbe, 0x82, 0x2f, 0x2a, 0xbe,
- 0xb2, 0x50, 0x2f, 0xbd, 0x6f, 0x73, 0xb6, 0xbd, 0x4b, 0xaf, 0x32, 0x3e,
- 0x76, 0x60, 0x7f, 0xbd, 0x2a, 0x6c, 0xc1, 0xbd, 0x46, 0xcc, 0xba, 0xbd,
- 0x17, 0x4e, 0x92, 0x3c, 0x15, 0xc6, 0x69, 0xbe, 0x3d, 0xab, 0x63, 0xbe,
- 0xa0, 0x14, 0x06, 0xbd, 0xd6, 0xbc, 0x5c, 0xbe, 0xcb, 0x78, 0xa1, 0xbe,
- 0x2d, 0xf6, 0x54, 0xbe, 0xb4, 0xe3, 0xab, 0x3b, 0xb1, 0xe5, 0x54, 0xbe,
- 0xee, 0x88, 0x3f, 0xbe, 0x02, 0x8e, 0x3f, 0x3e, 0x0b, 0x46, 0xa6, 0x3d,
- 0x49, 0x0d, 0xa1, 0xbe, 0x1f, 0x54, 0x96, 0xbd, 0xd9, 0x5f, 0x5d, 0x3d,
- 0x05, 0x1e, 0x55, 0x3d, 0x1a, 0xc2, 0xcd, 0x3d, 0xbf, 0x5a, 0x5f, 0xbe,
- 0x00, 0x6d, 0x52, 0xbe, 0xbe, 0xf3, 0x37, 0xbd, 0xd9, 0x8e, 0x95, 0x3e,
- 0x74, 0x02, 0xef, 0xbc, 0x87, 0x64, 0xb1, 0xbe, 0xef, 0xe8, 0x8e, 0xbd,
- 0xb8, 0xa1, 0x17, 0xbe, 0xd4, 0x52, 0x0a, 0xbf, 0xd4, 0xa5, 0xb9, 0xbc,
- 0xb7, 0xf4, 0xc3, 0xbe, 0x0b, 0x0f, 0xee, 0xbc, 0x43, 0xe3, 0xaf, 0xbc,
- 0xcf, 0x52, 0x0f, 0x3e, 0x95, 0x69, 0xfb, 0x3c, 0x11, 0x60, 0x4e, 0x3e,
- 0xa3, 0x19, 0x47, 0xbd, 0xc9, 0xe9, 0x2a, 0x3e, 0x8e, 0x22, 0x07, 0x3e,
- 0x38, 0x85, 0xb9, 0xbe, 0xb3, 0xd7, 0xd0, 0x3c, 0x79, 0x7f, 0xa1, 0xbe,
- 0x6a, 0xf8, 0x54, 0x3e, 0x70, 0x4e, 0x89, 0xbd, 0x18, 0x76, 0xfd, 0xbe,
- 0xa8, 0xc1, 0x89, 0x3e, 0x37, 0xe4, 0xa4, 0x3c, 0xd5, 0x82, 0xc3, 0xbd,
- 0x21, 0x5b, 0x16, 0xbe, 0xe9, 0xaa, 0x3a, 0x3e, 0x35, 0x63, 0x68, 0xbe,
- 0x34, 0x0a, 0xb2, 0xbe, 0x0d, 0x0d, 0x85, 0xbe, 0x44, 0x23, 0xdd, 0xbd,
- 0x7a, 0x7b, 0x1c, 0xbe, 0x9e, 0x57, 0x22, 0x3d, 0xf1, 0x16, 0xea, 0xbd,
- 0xec, 0xc2, 0xb4, 0x3e, 0x26, 0x23, 0x09, 0xbe, 0x8e, 0x13, 0x95, 0x3d,
- 0x49, 0xee, 0xd7, 0x3d, 0x31, 0xb2, 0xdc, 0x3d, 0xc1, 0x7f, 0xae, 0xbe,
- 0xc4, 0x25, 0xd1, 0x3d, 0x72, 0xec, 0xa5, 0xbe, 0x3f, 0x4b, 0x7e, 0xbd,
- 0x80, 0x93, 0x52, 0xbe, 0x98, 0x9b, 0x25, 0x3d, 0x80, 0x8f, 0x07, 0x3d,
- 0x8d, 0xd6, 0x31, 0x3d, 0xd9, 0xac, 0x0d, 0x3e, 0xb2, 0xda, 0xa5, 0xbe,
- 0x90, 0x58, 0x44, 0xbb, 0xde, 0x52, 0x07, 0x3f, 0x32, 0x65, 0xfd, 0xbd,
- 0x35, 0x2a, 0xbf, 0x3e, 0x4d, 0x7d, 0xa9, 0xbe, 0x32, 0x90, 0x25, 0xbe,
- 0x9e, 0x12, 0x5a, 0xbe, 0x33, 0x2c, 0x16, 0xbe, 0xf6, 0xef, 0xe1, 0xbc,
- 0xcc, 0xbf, 0x55, 0xbe, 0x69, 0x6e, 0x26, 0x3d, 0x0a, 0xe6, 0x2f, 0xbf,
- 0xcd, 0xbc, 0xe6, 0xbe, 0x9c, 0xff, 0x54, 0x3e, 0xca, 0xa6, 0x9e, 0xbd,
- 0xd5, 0xf8, 0xa3, 0xbd, 0x09, 0x25, 0x5a, 0x3e, 0xb2, 0xf6, 0x4e, 0x3e,
- 0xc4, 0x10, 0x0f, 0xbb, 0x1d, 0xeb, 0x26, 0x3d, 0xee, 0x37, 0x97, 0x3d,
- 0xc8, 0x75, 0xab, 0x3d, 0x0a, 0x98, 0xc5, 0xbd, 0x63, 0xce, 0x86, 0x3d,
- 0x59, 0x17, 0xc0, 0xbd, 0xf5, 0x1c, 0x07, 0xbd, 0x7e, 0x75, 0x1e, 0x3e,
- 0xc4, 0xf5, 0xe3, 0x3e, 0x38, 0x71, 0x86, 0xbe, 0x99, 0x3c, 0x82, 0xbe,
- 0x05, 0xe5, 0xc0, 0x3e, 0x8c, 0x0c, 0x12, 0xbe, 0x6c, 0xc0, 0x89, 0x3d,
- 0x62, 0xbe, 0xef, 0xbe, 0xe2, 0xfc, 0xd8, 0x3d, 0x4b, 0x35, 0xd5, 0xbe,
- 0xe7, 0xb4, 0xbb, 0xbe, 0xcc, 0xaa, 0xcd, 0xbb, 0xa1, 0xcf, 0x31, 0xbd,
- 0x20, 0xd5, 0x00, 0xbf, 0xae, 0xaf, 0x84, 0xbe, 0x1d, 0x99, 0x90, 0xbe,
- 0x5f, 0xe4, 0xf9, 0xbe, 0x1d, 0xd8, 0x9f, 0xbd, 0x66, 0x49, 0x10, 0xbe,
- 0x6d, 0x43, 0xc4, 0x3d, 0x1e, 0x54, 0x77, 0x3e, 0xf1, 0x7b, 0x4b, 0x3d,
- 0xd0, 0x28, 0xc5, 0xbd, 0x2e, 0x74, 0xae, 0xbd, 0xc9, 0x7e, 0xcd, 0x3d,
- 0x28, 0x7e, 0x69, 0xbb, 0xf3, 0x56, 0x12, 0xbe, 0xc2, 0x50, 0x6a, 0x3d,
- 0xc2, 0xa6, 0x0b, 0x3e, 0x10, 0xdd, 0x35, 0x3e, 0xe5, 0x81, 0x58, 0xbe,
- 0x9f, 0xca, 0xd2, 0xbe, 0x7e, 0x13, 0x15, 0xbe, 0x92, 0xfb, 0xa5, 0xbd,
- 0x7b, 0xa4, 0x14, 0xbe, 0x0f, 0x32, 0x46, 0xbd, 0xb0, 0xa0, 0x0f, 0x3e,
- 0xff, 0x05, 0x8b, 0xbe, 0x27, 0x67, 0x3e, 0x3e, 0xfe, 0xf7, 0xbb, 0xbd,
- 0x1d, 0x52, 0x6d, 0xbe, 0x2e, 0x33, 0x57, 0x3d, 0x0c, 0x24, 0x3d, 0x3e,
- 0x38, 0x61, 0x6c, 0xbd, 0x2e, 0x32, 0xda, 0x3d, 0x46, 0x0b, 0xa3, 0x3d,
- 0x8a, 0x4a, 0x78, 0x3e, 0x25, 0x09, 0x14, 0x3d, 0xcf, 0xf9, 0xbf, 0x3d,
- 0x90, 0xc0, 0xc6, 0xbd, 0x43, 0xe6, 0x53, 0xbe, 0x5f, 0x98, 0xb2, 0xbd,
- 0x97, 0x48, 0x8a, 0x3e, 0x3e, 0x56, 0x74, 0xbe, 0x8b, 0x13, 0x6d, 0xbd,
- 0xeb, 0xb8, 0xda, 0x3d, 0x4f, 0x21, 0x3d, 0x3e, 0x6f, 0x73, 0x11, 0xbe,
- 0x04, 0x31, 0x90, 0x3d, 0xc7, 0x00, 0x89, 0xbe, 0x36, 0x46, 0x95, 0x3d,
- 0xfc, 0xc7, 0x63, 0xbd, 0xd2, 0x42, 0x17, 0x3a, 0x57, 0xa6, 0x59, 0xbd,
- 0x15, 0x8e, 0x74, 0x3d, 0xc4, 0xfc, 0x25, 0x3d, 0x47, 0xbe, 0xc2, 0xbd,
- 0x63, 0x49, 0xc9, 0x3d, 0x3b, 0x68, 0xe4, 0xbd, 0x9a, 0x96, 0x40, 0x3e,
- 0xb9, 0x9f, 0x40, 0xbe, 0xfc, 0x48, 0xc5, 0x3d, 0x99, 0xf9, 0x4b, 0xbd,
- 0x82, 0xd3, 0x74, 0xbe, 0xa3, 0x0f, 0x1e, 0x3d, 0xaa, 0x0f, 0xa1, 0xbe,
- 0x64, 0xa2, 0x86, 0x3e, 0x12, 0x21, 0xd1, 0xbd, 0xa2, 0x48, 0x50, 0x3d,
- 0xe9, 0x72, 0x21, 0x3d, 0xde, 0x21, 0x37, 0x3e, 0x20, 0xbd, 0x1e, 0x3d,
- 0xc1, 0xd9, 0x1e, 0xbc, 0x4d, 0xca, 0x01, 0x3e, 0x9d, 0xd1, 0x4b, 0xbe,
- 0xe1, 0xe4, 0x84, 0xbc, 0xf1, 0xb8, 0xf2, 0xbd, 0x79, 0xc2, 0xa2, 0x3d,
- 0x0c, 0x1b, 0x6f, 0xbd, 0xc0, 0x52, 0x65, 0x3d, 0x3f, 0x98, 0x35, 0x3e,
- 0xb6, 0x5b, 0xd5, 0xbc, 0x2f, 0xf1, 0xc8, 0x3d, 0xf9, 0x06, 0x83, 0x3e,
- 0xbe, 0x06, 0x94, 0xbe, 0x1b, 0x34, 0x0b, 0x3e, 0x57, 0xa8, 0x08, 0x3e,
- 0xa5, 0x9f, 0x57, 0xbc, 0x77, 0x9c, 0xfc, 0xbd, 0xd2, 0x72, 0x99, 0x3b,
- 0xa3, 0x85, 0xd7, 0x3d, 0xe8, 0x3d, 0xf9, 0x3d, 0x0c, 0x7f, 0xaa, 0x3c,
- 0x27, 0x84, 0x19, 0xbe, 0x84, 0x2d, 0x86, 0xbe, 0xa9, 0xa7, 0x92, 0xbd,
- 0xe3, 0x4a, 0xc4, 0x3d, 0xc5, 0x20, 0x7d, 0xbb, 0x1f, 0x4a, 0x7a, 0xbe,
- 0x29, 0x10, 0x65, 0xbd, 0x16, 0xc4, 0x24, 0xbd, 0xea, 0xbd, 0x77, 0xbd,
- 0x84, 0xa6, 0x3e, 0x3e, 0xf4, 0xb0, 0x8a, 0xbd, 0xdd, 0x9a, 0xed, 0x3d,
- 0xc3, 0xb9, 0xcd, 0xbd, 0xbf, 0x2a, 0x94, 0x3d, 0xfd, 0x5f, 0xc4, 0xbe,
- 0xb5, 0x23, 0x10, 0xbe, 0xdd, 0xfd, 0xdf, 0xbc, 0x46, 0xf2, 0x11, 0x3e,
- 0x14, 0x13, 0xd7, 0xbc, 0x0b, 0xd8, 0x3c, 0xbe, 0xdc, 0x09, 0x51, 0xbe,
- 0xc9, 0x00, 0x9e, 0x3e, 0x26, 0x33, 0xd6, 0xbc, 0x14, 0x72, 0x12, 0xbe,
- 0x64, 0x60, 0xa5, 0xbd, 0x0d, 0x79, 0x9e, 0x3d, 0xfe, 0x12, 0x6f, 0xbe,
- 0xbf, 0x11, 0x63, 0x3d, 0x84, 0x40, 0x45, 0xbd, 0xff, 0x6a, 0x6b, 0x3e,
- 0xe9, 0x8c, 0x99, 0x3c, 0x40, 0x25, 0x36, 0xbe, 0x6f, 0xf1, 0x21, 0xbd,
- 0xbf, 0x70, 0x97, 0xbe, 0xa3, 0xf9, 0x17, 0x3d, 0x33, 0x80, 0x43, 0x3c,
- 0x47, 0x19, 0xb2, 0xbe, 0x6f, 0x42, 0x10, 0x3e, 0x0a, 0x24, 0x4a, 0xbe,
- 0x46, 0x7e, 0x19, 0x3d, 0x23, 0x1f, 0xd2, 0x3d, 0xe1, 0xd0, 0xa6, 0xbd,
- 0x61, 0xa5, 0x14, 0xbe, 0xf4, 0x14, 0xc7, 0xbd, 0x2f, 0x7e, 0xf6, 0x3d,
- 0x51, 0x34, 0x1c, 0xbe, 0xdb, 0xe1, 0x60, 0xbc, 0x7b, 0x1d, 0x07, 0x3e,
- 0x0f, 0x0b, 0xd5, 0xbb, 0x04, 0xed, 0x8b, 0xbc, 0x5f, 0x40, 0xf8, 0xbc,
- 0xb8, 0x5a, 0xc4, 0xbd, 0xfa, 0xb4, 0x5a, 0x3e, 0x67, 0x4b, 0x5e, 0x3e,
- 0x4c, 0x1b, 0x24, 0xbe, 0x4a, 0xab, 0x4b, 0x3d, 0x94, 0x71, 0x52, 0xbd,
- 0xc1, 0xe6, 0x7c, 0xbe, 0x58, 0x57, 0x54, 0xbe, 0xb6, 0x27, 0xec, 0xbd,
- 0x59, 0xc1, 0xcf, 0xbd, 0x83, 0x8e, 0xb7, 0xbd, 0x74, 0x14, 0x87, 0xbe,
- 0x11, 0x22, 0x0e, 0xbf, 0xf4, 0xc2, 0x25, 0x3e, 0xa2, 0xe4, 0x08, 0x3d,
- 0x73, 0xd6, 0x2c, 0xbe, 0x15, 0x70, 0xf7, 0x3d, 0xe7, 0x45, 0x88, 0x3d,
- 0x83, 0x3f, 0x32, 0xbc, 0xf6, 0xe6, 0x14, 0x3e, 0xe8, 0xec, 0xa0, 0xbc,
- 0x1f, 0x6f, 0x5f, 0xbd, 0x9e, 0xfc, 0x80, 0x3e, 0xe4, 0xc1, 0x5e, 0xbe,
- 0x2d, 0x57, 0x21, 0xbe, 0x95, 0x93, 0x07, 0xbd, 0xa5, 0x30, 0x29, 0xbe,
- 0x57, 0x5d, 0x5e, 0xbe, 0xe0, 0x2b, 0x9d, 0xbe, 0x47, 0x99, 0xf9, 0x3c,
- 0x9f, 0x2b, 0x49, 0xbe, 0xd3, 0x35, 0x84, 0xbd, 0xb7, 0x18, 0xa8, 0xbd,
- 0x58, 0x4d, 0x8c, 0xbc, 0xe5, 0x65, 0x84, 0xbe, 0xa2, 0xca, 0x3d, 0x3d,
- 0x70, 0x3f, 0xe7, 0x3d, 0x7c, 0x5a, 0x4e, 0xbe, 0x8e, 0xf1, 0x11, 0x3e,
- 0x15, 0xbf, 0xf9, 0xbd, 0x2f, 0x52, 0xb4, 0xbe, 0x85, 0x78, 0x58, 0xbe,
- 0xa8, 0x5a, 0x77, 0xbd, 0xda, 0x67, 0x3a, 0xbd, 0x13, 0x52, 0x81, 0xbd,
- 0x89, 0x69, 0xc4, 0xbc, 0xac, 0xd0, 0xa1, 0xbd, 0x00, 0x62, 0x1e, 0x3c,
- 0x64, 0xf2, 0x9b, 0xbd, 0xcb, 0x6b, 0x95, 0xbe, 0x29, 0x4f, 0xcc, 0xbd,
- 0x54, 0xab, 0x16, 0x3e, 0x8b, 0xd3, 0x0f, 0xbe, 0xbe, 0xdc, 0x89, 0xbd,
- 0x62, 0x81, 0xb3, 0x3d, 0x13, 0x9f, 0x9b, 0xbc, 0xed, 0x99, 0x08, 0x3d,
- 0x8d, 0x29, 0xf0, 0xbd, 0x19, 0x2d, 0x96, 0xbd, 0xf3, 0x56, 0xfb, 0x3d,
- 0x07, 0x9b, 0x71, 0xbd, 0x2d, 0x2d, 0xe7, 0xbc, 0xea, 0x9e, 0xfc, 0x3d,
- 0xf9, 0x43, 0xd3, 0xbc, 0xc6, 0xe1, 0xa9, 0x3e, 0x86, 0x18, 0xf2, 0x3c,
- 0x45, 0xb7, 0xca, 0xbe, 0x53, 0x1a, 0x2d, 0x3d, 0xcb, 0xfd, 0xfb, 0xbe,
- 0x26, 0xfd, 0x32, 0xbe, 0x7b, 0xf3, 0x23, 0xbe, 0x4d, 0xd2, 0xcf, 0xbe,
- 0x46, 0xf0, 0xbf, 0xbd, 0x7d, 0x43, 0x94, 0xbe, 0xfc, 0x31, 0xb8, 0x3d,
- 0xbd, 0x2f, 0x5f, 0xbe, 0x02, 0x83, 0x1a, 0xbe, 0xe9, 0x43, 0x80, 0x3a,
- 0xa0, 0x7d, 0x86, 0x3d, 0xd6, 0x6a, 0x1e, 0xbd, 0x25, 0x14, 0xc7, 0xbd,
- 0x52, 0x12, 0x1d, 0x3e, 0x97, 0x55, 0xb6, 0x3d, 0xe1, 0x95, 0xe0, 0xbd,
- 0x74, 0x09, 0x91, 0x3d, 0xbe, 0x38, 0x97, 0x3d, 0xcb, 0x4f, 0xfc, 0xbc,
- 0xbb, 0xba, 0x99, 0xbd, 0xe9, 0x2a, 0xde, 0xbb, 0x19, 0x29, 0x93, 0xbe,
- 0xd8, 0x9e, 0x8b, 0xbe, 0x35, 0x75, 0x77, 0xbd, 0x65, 0xa6, 0x2f, 0x3d,
- 0x38, 0x4c, 0x1f, 0x3d, 0x80, 0x0e, 0x90, 0x3b, 0xa5, 0x8a, 0x41, 0x3c,
- 0x5f, 0x4b, 0xbe, 0x3c, 0x31, 0x14, 0x7c, 0xbd, 0xd9, 0xbe, 0x9e, 0x3c,
- 0xc6, 0xc9, 0x05, 0x3e, 0x00, 0xd2, 0xbd, 0x3b, 0xbe, 0xf1, 0x3b, 0xbc,
- 0x65, 0x2c, 0xcc, 0xbd, 0x2b, 0x60, 0x90, 0xbd, 0xbe, 0x75, 0xdf, 0xbd,
- 0xb8, 0xca, 0x44, 0xbe, 0xe9, 0x5b, 0xf4, 0x3d, 0x0d, 0xd9, 0x91, 0x3c,
- 0x6e, 0x65, 0x07, 0xbf, 0xef, 0x7b, 0x89, 0xbe, 0xdb, 0xfa, 0x87, 0xbd,
- 0x90, 0xde, 0xae, 0xbc, 0xd8, 0x38, 0xcb, 0x3c, 0xd1, 0x9a, 0xae, 0xbe,
- 0x95, 0xff, 0x1c, 0xbe, 0x3e, 0x78, 0x0f, 0xbd, 0xba, 0xe0, 0x06, 0xbd,
- 0xe7, 0xf5, 0x4d, 0xbe, 0x4f, 0x9b, 0x23, 0xbe, 0x45, 0xf9, 0x40, 0x3d,
- 0xac, 0xdb, 0x28, 0xbd, 0xfa, 0x52, 0x1f, 0x3d, 0x45, 0x8b, 0x73, 0x3c,
- 0x99, 0x94, 0x74, 0xbc, 0xfb, 0xb5, 0x9b, 0x3d, 0x5f, 0x22, 0x51, 0xbc,
- 0x23, 0xeb, 0x28, 0xbe, 0xbf, 0x01, 0x88, 0xbd, 0x54, 0x39, 0x58, 0xbe,
- 0xbe, 0x63, 0xed, 0xbc, 0x44, 0xe1, 0xdd, 0x3d, 0x8f, 0xb9, 0xb1, 0xbd,
- 0x60, 0x6f, 0x96, 0xbd, 0x81, 0x82, 0x2b, 0xbe, 0x67, 0x66, 0x56, 0x3d,
- 0x59, 0x38, 0xa1, 0xbd, 0x51, 0x65, 0x96, 0xbd, 0xb9, 0x19, 0x10, 0x3e,
- 0x9f, 0x5c, 0x44, 0xbc, 0x50, 0xc2, 0xb5, 0x3e, 0x9f, 0x07, 0xca, 0xbd,
- 0x86, 0xfc, 0x0b, 0xbe, 0x80, 0xb4, 0xbf, 0x3b, 0xfe, 0xf9, 0x0b, 0xbd,
- 0x6d, 0x73, 0x2a, 0x3e, 0xd0, 0x05, 0x2e, 0x3e, 0xb9, 0x2d, 0x6a, 0xbe,
- 0x1d, 0xfc, 0x84, 0xbc, 0x57, 0x60, 0x0d, 0x3e, 0xd9, 0xa6, 0xdc, 0x3d,
- 0xf0, 0xa2, 0x2d, 0x3e, 0x53, 0xbf, 0x19, 0x3e, 0xcd, 0x70, 0xfd, 0xbb,
- 0x7f, 0xbf, 0xd8, 0x3d, 0xb5, 0x49, 0xb0, 0x3d, 0x3c, 0x66, 0x2f, 0x3d,
- 0x98, 0x47, 0x8c, 0xbd, 0xd1, 0x7a, 0x34, 0xbd, 0x51, 0x74, 0x16, 0x3d,
- 0x65, 0x27, 0x18, 0x3d, 0xae, 0x05, 0x82, 0xbc, 0x00, 0x4d, 0xd5, 0x3c,
- 0x79, 0x64, 0x53, 0x3c, 0xbd, 0x88, 0x5f, 0x3e, 0xce, 0xb2, 0xf3, 0xbd,
- 0x6a, 0x27, 0xe1, 0x3d, 0xb4, 0x5c, 0x2f, 0xbd, 0x58, 0x9d, 0x4c, 0x3e,
- 0x4e, 0x5c, 0x3c, 0xbe, 0x1c, 0xbe, 0xb0, 0x3d, 0xc4, 0x04, 0x39, 0x3e,
- 0x29, 0x04, 0x20, 0x3d, 0x06, 0x48, 0x3b, 0x3d, 0x9b, 0x28, 0x27, 0x3e,
- 0x77, 0xca, 0x08, 0xbe, 0xa5, 0x0d, 0x3b, 0xbd, 0xa8, 0xef, 0x01, 0x3e,
- 0x12, 0xc9, 0x14, 0x3e, 0x25, 0x7e, 0x67, 0x3d, 0x24, 0xeb, 0x4b, 0x3e,
- 0xb0, 0x02, 0x9c, 0xbd, 0xff, 0x05, 0xef, 0xbb, 0x2c, 0x50, 0xbc, 0xbc,
- 0xec, 0x9b, 0xbf, 0x3d, 0x7a, 0x20, 0x99, 0xbd, 0xc6, 0xce, 0x34, 0x3d,
- 0xc6, 0x36, 0xd5, 0xbd, 0x02, 0x6f, 0x0c, 0xbe, 0xbc, 0xdc, 0x77, 0x3d,
- 0x58, 0x51, 0xed, 0xbc, 0x56, 0x20, 0x7d, 0x3e, 0xb7, 0xa4, 0xa6, 0x3d,
- 0x3d, 0x1b, 0x16, 0xbe, 0x67, 0x0e, 0x4b, 0x3e, 0x96, 0x66, 0xfa, 0x3d,
- 0x40, 0xf5, 0xf4, 0x3c, 0x0f, 0xd0, 0x78, 0xbe, 0x91, 0x3e, 0xde, 0x3d,
- 0xe5, 0xf9, 0x1e, 0x3e, 0xa5, 0xa4, 0xf3, 0xbd, 0xbf, 0x42, 0xd0, 0x3d,
- 0x03, 0xb8, 0xc4, 0xbd, 0x34, 0xa3, 0x93, 0xbd, 0x03, 0x58, 0xea, 0x3d,
- 0x85, 0xd4, 0x68, 0x3d, 0xec, 0x75, 0x5d, 0xbe, 0xb1, 0xbb, 0x22, 0x3d,
- 0xd2, 0x6a, 0xd9, 0xbd, 0x4d, 0x54, 0x38, 0x3e, 0x87, 0x44, 0x4f, 0x3e,
- 0xdc, 0x6a, 0xd6, 0xbc, 0xd0, 0x2d, 0x83, 0x3b, 0x1b, 0x35, 0xc3, 0x3c,
- 0x91, 0xa3, 0x96, 0xbd, 0x84, 0xe5, 0x87, 0x3d, 0xdb, 0x6d, 0xfb, 0xbd,
- 0x07, 0x03, 0x3f, 0x3e, 0x57, 0xf3, 0xaa, 0x3d, 0x10, 0x1a, 0x87, 0x3d,
- 0x51, 0x7a, 0xeb, 0x3c, 0x08, 0xee, 0x25, 0x3e, 0x9d, 0x0e, 0x4e, 0x3d,
- 0x10, 0xfe, 0xbb, 0xbd, 0x11, 0x4d, 0x54, 0x3d, 0x7f, 0x0f, 0x20, 0x3e,
- 0xb4, 0x26, 0xd9, 0x3d, 0xb9, 0xaf, 0x0b, 0xbe, 0xa6, 0xf4, 0xce, 0xbd,
- 0x9a, 0xf5, 0x9a, 0x3c, 0x35, 0x36, 0x0e, 0xbd, 0xc6, 0x1b, 0xf5, 0x3d,
- 0x60, 0x01, 0x53, 0xbd, 0x94, 0xd0, 0xe7, 0x3d, 0x54, 0x5b, 0x74, 0x3d,
- 0x9c, 0x21, 0x29, 0xbd, 0xc7, 0xec, 0xba, 0xbd, 0x1e, 0x0a, 0x22, 0xbe,
- 0x31, 0x75, 0x9d, 0x3d, 0x3e, 0xff, 0x00, 0x3e, 0xca, 0xa4, 0x21, 0xbb,
- 0xc8, 0xac, 0xf5, 0x3c, 0x3b, 0x3c, 0x4e, 0xbc, 0x8e, 0x1a, 0x1a, 0xbe,
- 0x1b, 0x81, 0x4e, 0xbe, 0xca, 0x89, 0x35, 0x3e, 0x57, 0xbc, 0x6c, 0x3e,
- 0x22, 0xdb, 0xdc, 0xbd, 0x4a, 0x58, 0xb1, 0x3d, 0x00, 0x27, 0x43, 0x3d,
- 0xb2, 0x58, 0xa1, 0xbc, 0xad, 0x22, 0xcf, 0x3d, 0x76, 0x98, 0xab, 0x3d,
- 0xbf, 0x94, 0xa3, 0xbe, 0x69, 0xb4, 0x76, 0x3c, 0xa1, 0x2f, 0x4c, 0xbd,
- 0xd9, 0x62, 0x63, 0xbd, 0x8f, 0x02, 0xf8, 0x3d, 0xd5, 0xb8, 0xa0, 0xbe,
- 0xb9, 0x0f, 0xa2, 0xbd, 0x13, 0x93, 0xdf, 0x3b, 0xa2, 0x51, 0xdb, 0xbe,
- 0x08, 0x43, 0x5d, 0x3b, 0xa2, 0x87, 0xe5, 0x3c, 0x71, 0xb8, 0x29, 0x3d,
- 0x73, 0xf5, 0xb9, 0x3c, 0xe6, 0x0e, 0x2b, 0x3e, 0x58, 0xbb, 0x4d, 0x3c,
- 0xcd, 0x2e, 0xcb, 0x3d, 0x7f, 0x98, 0x30, 0xbe, 0x0d, 0x12, 0xa5, 0xbe,
- 0xbc, 0xcc, 0xa6, 0x3d, 0x15, 0xbd, 0xaf, 0x3d, 0x87, 0xde, 0x46, 0xbe,
- 0xc5, 0x07, 0x5a, 0x3d, 0x73, 0xc5, 0x11, 0xbe, 0x4f, 0xe2, 0x60, 0xbe,
- 0x6d, 0x9a, 0x21, 0xbe, 0x95, 0x27, 0x25, 0xbe, 0x5e, 0x5e, 0x35, 0xbe,
- 0xf5, 0xa9, 0xd7, 0xbd, 0xbd, 0xef, 0xbc, 0x3d, 0x55, 0x5d, 0x7a, 0xbe,
- 0x37, 0xb2, 0xb2, 0x3d, 0x64, 0x06, 0x78, 0xbe, 0x67, 0x4a, 0xb0, 0x3e,
- 0x30, 0xca, 0x81, 0xbd, 0x15, 0x38, 0x0a, 0x3e, 0x2f, 0xcb, 0xe9, 0x3c,
- 0x38, 0xc5, 0xe9, 0xbd, 0x41, 0x3e, 0xea, 0xbe, 0xf1, 0x69, 0xf5, 0x3d,
- 0x14, 0x1a, 0xcf, 0x3d, 0x11, 0xd8, 0x02, 0xbe, 0xf3, 0x49, 0x2f, 0x3e,
- 0x82, 0x37, 0xdd, 0xbe, 0x88, 0xe5, 0xb0, 0xbd, 0x3e, 0x9e, 0xf7, 0x3d,
- 0x6c, 0xc3, 0x89, 0xbe, 0x1a, 0x76, 0xb4, 0xbd, 0xbc, 0xdb, 0xea, 0x3d,
- 0xad, 0x3d, 0x2f, 0x3e, 0xa9, 0x85, 0xf1, 0x3c, 0x8c, 0x05, 0x55, 0xbd,
- 0x99, 0xf5, 0xec, 0xbe, 0xff, 0x60, 0x4b, 0xbe, 0x35, 0xca, 0xd6, 0x3d,
- 0x19, 0x99, 0x0d, 0xbe, 0x95, 0x1d, 0xaa, 0xbe, 0xca, 0x1a, 0x9d, 0xbe,
- 0xd7, 0x67, 0xdb, 0xbe, 0x94, 0x0c, 0xb0, 0xbe, 0x4b, 0xb2, 0x9b, 0x3e,
- 0xca, 0x3a, 0xbd, 0xbd, 0x45, 0x32, 0x3e, 0x3e, 0x08, 0xe6, 0x68, 0x3b,
- 0x3c, 0x1c, 0x0a, 0xbf, 0x74, 0x3e, 0x02, 0xbe, 0xf2, 0x42, 0x2a, 0x3e,
- 0xf6, 0xa6, 0x94, 0x3d, 0xf5, 0x8f, 0x47, 0xbe, 0xfb, 0xa3, 0xbf, 0xbd,
- 0x2d, 0x5e, 0xb0, 0xbd, 0x65, 0x79, 0xaf, 0xbd, 0x33, 0x5a, 0x0c, 0x3b,
- 0xe0, 0x4e, 0x2a, 0x3d, 0x5a, 0x6b, 0xa9, 0xbd, 0xda, 0x44, 0x3e, 0x3e,
- 0x75, 0xf3, 0x61, 0x3e, 0x6c, 0x52, 0x27, 0xbb, 0xc1, 0x93, 0xb7, 0x3d,
- 0x71, 0x8d, 0x19, 0x3e, 0x7e, 0xfd, 0xb0, 0xbd, 0x1d, 0x37, 0xbb, 0xbd,
- 0x58, 0x86, 0x82, 0xbd, 0x74, 0xc6, 0xbc, 0xbe, 0xe9, 0x4b, 0xb6, 0xbd,
- 0x0d, 0x8c, 0x05, 0xbf, 0xd7, 0x65, 0x37, 0xbe, 0xfa, 0x26, 0x8c, 0xbe,
- 0x3e, 0x1b, 0xe2, 0x3b, 0x63, 0xc8, 0xdb, 0xbe, 0xdb, 0x27, 0xba, 0xbd,
- 0x07, 0x7a, 0x0f, 0xbf, 0x0a, 0x5b, 0xeb, 0xbd, 0xfb, 0x85, 0xb3, 0xbd,
- 0xe6, 0x52, 0x77, 0xbe, 0x11, 0xf2, 0x09, 0xbe, 0x56, 0x67, 0xfa, 0x3d,
- 0xa4, 0x87, 0x86, 0xbf, 0xa0, 0x5e, 0xea, 0x3d, 0x7d, 0x33, 0x24, 0xbc,
- 0xeb, 0xf0, 0x1b, 0xbe, 0xaf, 0x11, 0x23, 0x3e, 0xf3, 0x26, 0x84, 0x3e,
- 0x81, 0x60, 0xaf, 0xbe, 0x74, 0xc5, 0xf6, 0xbd, 0xf0, 0x75, 0xee, 0x3c,
- 0x05, 0xb3, 0x1f, 0x3e, 0x84, 0x17, 0x09, 0x3e, 0x87, 0xa9, 0xf0, 0xbd,
- 0xbc, 0x5b, 0x77, 0xbd, 0xb8, 0xb6, 0x3d, 0xbd, 0xb4, 0x4f, 0x84, 0x3e,
- 0x03, 0x6c, 0x43, 0xbe, 0x83, 0x1d, 0x90, 0xbd, 0xff, 0xf4, 0x5b, 0xbd,
- 0x88, 0x24, 0xe3, 0xbd, 0xb6, 0x4d, 0x0b, 0x3e, 0x9e, 0xb8, 0x8c, 0x3e,
- 0x3a, 0xc7, 0x5a, 0x3e, 0xe1, 0xd5, 0x9b, 0xbd, 0x15, 0x5a, 0x0a, 0xbd,
- 0x5f, 0x2b, 0x25, 0xbe, 0x7b, 0x33, 0x23, 0x3e, 0x6f, 0x88, 0xc2, 0x3d,
- 0x42, 0x74, 0x2f, 0xbd, 0x1f, 0x03, 0xbd, 0xbe, 0xea, 0xbb, 0xb8, 0xbd,
- 0x7a, 0x4e, 0x67, 0xbe, 0x9a, 0xcb, 0xa6, 0xbe, 0x3d, 0x8e, 0xbe, 0x3e,
- 0xea, 0x21, 0xce, 0x3d, 0xc0, 0x7f, 0x90, 0xbd, 0xf7, 0xc3, 0x24, 0x3e,
- 0x25, 0x93, 0x7a, 0xbe, 0x7d, 0xcc, 0x0a, 0x3c, 0xac, 0xcc, 0x80, 0xbe,
- 0xc2, 0x3d, 0x6d, 0x3d, 0xdd, 0x31, 0x40, 0xbe, 0xf0, 0x35, 0x11, 0x3e,
- 0xcf, 0x2a, 0xee, 0x3c, 0xc5, 0x70, 0x54, 0x3e, 0x60, 0x3b, 0x78, 0xbc,
- 0x5d, 0x08, 0x2c, 0xbd, 0x1a, 0x5d, 0xb6, 0xbb, 0x6f, 0x67, 0xdf, 0xbd,
- 0x85, 0xb1, 0xbc, 0x3d, 0xcf, 0xf4, 0x97, 0xbc, 0x20, 0x6e, 0x05, 0xbe,
- 0xa8, 0x9c, 0xfa, 0xbd, 0xb8, 0x78, 0x82, 0x3d, 0x1b, 0x4b, 0x8a, 0xbd,
- 0xe5, 0x0a, 0x3b, 0xbe, 0xdd, 0x17, 0xef, 0x3d, 0xfc, 0x28, 0xc6, 0xbc,
- 0x85, 0xe2, 0xeb, 0xbd, 0xcd, 0xda, 0xca, 0x3d, 0x41, 0xd9, 0x9f, 0x3a,
- 0x66, 0xce, 0x0b, 0xbe, 0xc1, 0x77, 0x0b, 0xbe, 0x68, 0x8b, 0x73, 0xbd,
- 0x5f, 0x79, 0x74, 0x3e, 0x0b, 0xa3, 0x9d, 0xbe, 0xb8, 0x14, 0x3e, 0xbc,
- 0x77, 0x53, 0x9e, 0xbc, 0xb4, 0xf0, 0xdf, 0xbe, 0x88, 0x89, 0x20, 0xbe,
- 0xbd, 0x7a, 0x86, 0xbe, 0x66, 0xb7, 0x06, 0xbe, 0x12, 0x10, 0x22, 0xbe,
- 0x59, 0x3d, 0x86, 0xbd, 0xe8, 0x23, 0x9a, 0xbd, 0x5c, 0xf8, 0x80, 0x3d,
- 0xca, 0x36, 0xae, 0xbe, 0x23, 0x5b, 0x81, 0x3d, 0xc8, 0x15, 0x68, 0xbe,
- 0xc7, 0x94, 0x0f, 0x3e, 0xd5, 0xb1, 0x52, 0xbd, 0xdf, 0x33, 0x9b, 0xbe,
- 0x7b, 0x7a, 0x8b, 0xbd, 0xfa, 0x1b, 0xd1, 0xbd, 0x75, 0x42, 0xae, 0xbe,
- 0xe9, 0x16, 0x55, 0xbe, 0x55, 0x3c, 0x10, 0xbe, 0x03, 0xb3, 0xbc, 0xbe,
- 0x8c, 0x1c, 0xe1, 0xbd, 0xf3, 0x93, 0xc9, 0xbe, 0xa3, 0x2e, 0xae, 0xbd,
- 0xc3, 0x50, 0x04, 0xbe, 0x0c, 0xc9, 0x1a, 0xbe, 0x0c, 0xa0, 0x66, 0x3e,
- 0x80, 0x04, 0xbc, 0xbc, 0x46, 0x24, 0x3e, 0x3c, 0x5f, 0x3a, 0x85, 0xbd,
- 0xf6, 0xaf, 0xcf, 0xbd, 0x59, 0x22, 0x52, 0x3b, 0x59, 0xe0, 0x91, 0xbe,
- 0x34, 0x46, 0x0e, 0xbf, 0xba, 0x84, 0x34, 0x3c, 0x05, 0x33, 0x14, 0x3d,
- 0xa2, 0x00, 0xa3, 0xbe, 0x90, 0xb4, 0x0a, 0xbe, 0x85, 0x0d, 0xa0, 0x3d,
- 0xf7, 0x3f, 0x8d, 0xbd, 0x3a, 0x32, 0x1e, 0xbe, 0xf4, 0xf5, 0x91, 0x3d,
- 0x39, 0x9a, 0xc0, 0xbe, 0xeb, 0xd9, 0x5a, 0xbe, 0x2a, 0x35, 0x08, 0xbe,
- 0x75, 0x7c, 0x46, 0x3e, 0xd3, 0xea, 0x61, 0xbe, 0xc9, 0xf8, 0x9e, 0x3d,
- 0x3c, 0x72, 0x40, 0x3e, 0xe9, 0x41, 0x82, 0xbd, 0x0d, 0x70, 0xc5, 0xbe,
- 0x4d, 0xf4, 0xd4, 0x3d, 0x47, 0xaf, 0x0d, 0x3e, 0x33, 0xe3, 0x2a, 0x3d,
- 0x37, 0xd6, 0x7f, 0x3e, 0xa0, 0x25, 0x84, 0x3c, 0xeb, 0xc9, 0x99, 0xbd,
- 0xef, 0xe0, 0x0b, 0xbd, 0x8a, 0x0e, 0x99, 0x3d, 0xfe, 0x54, 0xf7, 0xbc,
- 0x27, 0xb4, 0x81, 0xbc, 0x7a, 0xa8, 0x5c, 0x3e, 0xc1, 0xac, 0xe3, 0xbe,
- 0x93, 0xfd, 0xae, 0xbe, 0x85, 0x6f, 0x4c, 0x3d, 0xd6, 0xe1, 0x18, 0xbd,
- 0x20, 0x93, 0x24, 0xbe, 0x4c, 0xd1, 0x2a, 0xbe, 0x01, 0x1c, 0x56, 0xbe,
- 0x15, 0xcb, 0x1f, 0xbd, 0xb8, 0x85, 0x00, 0xbe, 0x85, 0x2a, 0x21, 0x3e,
- 0xa7, 0xa1, 0xf7, 0xbd, 0x81, 0x85, 0x96, 0xbd, 0x09, 0xda, 0x83, 0x3d,
- 0x43, 0x48, 0xe4, 0x39, 0xb2, 0x1c, 0xdc, 0xbe, 0x80, 0x29, 0x36, 0x3e,
- 0xe4, 0x22, 0xa6, 0x3e, 0x3d, 0x42, 0xf9, 0xbd, 0xc1, 0x2e, 0x14, 0xbe,
- 0x65, 0xc8, 0x4c, 0xbd, 0x2b, 0xb8, 0x29, 0xbe, 0xd6, 0x35, 0x2f, 0x3d,
- 0x59, 0x2b, 0xc3, 0xbd, 0xfe, 0x49, 0xe1, 0xbd, 0x82, 0xe8, 0xc9, 0x3c,
- 0xae, 0xdb, 0x76, 0xbe, 0x86, 0xf0, 0x14, 0xbe, 0x70, 0xd9, 0x65, 0xbd,
- 0x96, 0x7c, 0xc0, 0xbe, 0xcb, 0x97, 0x09, 0xbd, 0x61, 0x09, 0xb6, 0xbe,
- 0xf2, 0x81, 0x8e, 0x3d, 0x96, 0x04, 0xb2, 0xbe, 0x1a, 0x35, 0x6b, 0xbd,
- 0x5b, 0x83, 0xa5, 0x3c, 0x3f, 0x4c, 0x38, 0xbe, 0x86, 0x9b, 0x8d, 0xbe,
- 0x9d, 0xaf, 0x9d, 0x3d, 0x7e, 0x90, 0x40, 0x3e, 0x6e, 0xe8, 0x02, 0x3d,
- 0x0f, 0x0b, 0x97, 0xbe, 0x14, 0x1c, 0xd6, 0xbc, 0x7f, 0xc0, 0xa8, 0x3c,
- 0x3b, 0x69, 0x8b, 0xbe, 0x0c, 0x6b, 0x8b, 0xbe, 0x5d, 0x0c, 0x27, 0x3e,
- 0x90, 0xd1, 0x3f, 0x3d, 0x93, 0x28, 0xe2, 0xbe, 0xd8, 0x03, 0xd9, 0xbe,
- 0x05, 0xe9, 0xc5, 0xbe, 0x1b, 0x92, 0xee, 0xbe, 0x08, 0x28, 0xfc, 0xbd,
- 0xc7, 0xdb, 0x58, 0x3e, 0xa1, 0x9b, 0xd6, 0xbd, 0xd1, 0x41, 0x06, 0xbe,
- 0x7d, 0xdb, 0x97, 0xbe, 0xcc, 0xf3, 0x8e, 0xbe, 0xf9, 0x23, 0x02, 0xbf,
- 0x1f, 0x72, 0x54, 0x3e, 0x03, 0xcf, 0xc2, 0xbe, 0x6c, 0xbd, 0x0f, 0xbd,
- 0x0d, 0x5b, 0x8e, 0x3c, 0xb2, 0xb3, 0x67, 0xbe, 0x11, 0x7a, 0x9c, 0xbe,
- 0x4c, 0x1d, 0x73, 0xbd, 0x22, 0xce, 0xa3, 0xbe, 0xa8, 0x25, 0xc9, 0xbd,
- 0x8a, 0x43, 0x01, 0x3c, 0x92, 0x52, 0x95, 0xbd, 0x6a, 0xff, 0xa2, 0x3d,
- 0xe9, 0x1c, 0x68, 0x3d, 0xef, 0x3a, 0xb9, 0xba, 0x28, 0xf2, 0xb6, 0xbd,
- 0x84, 0xe6, 0xf3, 0xbd, 0x1f, 0x16, 0x89, 0x3d, 0x2a, 0xb3, 0xf7, 0xbe,
- 0x30, 0x6c, 0xed, 0x3c, 0x5a, 0x5e, 0x64, 0xbe, 0xbf, 0xdd, 0xca, 0xbc,
- 0xb6, 0xaa, 0x13, 0xbe, 0x4c, 0xa0, 0x44, 0x3b, 0xb0, 0x17, 0x25, 0xbe,
- 0x74, 0x17, 0xcd, 0xbe, 0x0b, 0x16, 0xf8, 0x3d, 0xe0, 0x0e, 0x0a, 0xbf,
- 0x65, 0x91, 0xf9, 0x3d, 0xf0, 0xf5, 0xdb, 0xbe, 0x87, 0x7c, 0x3f, 0xbe,
- 0x80, 0xfb, 0x23, 0xbe, 0xe9, 0x8c, 0xdb, 0xbe, 0x02, 0xeb, 0x52, 0x3d,
- 0x18, 0x38, 0xa7, 0x3d, 0xe3, 0xc2, 0xa4, 0xbd, 0x8a, 0x25, 0x33, 0x3d,
- 0xf7, 0xcb, 0x2d, 0xbd, 0x4c, 0x08, 0x1a, 0xbb, 0x51, 0xb1, 0x2c, 0xbe,
- 0xc8, 0x8a, 0x30, 0xbe, 0xc2, 0x7d, 0x91, 0x3d, 0x5d, 0xc5, 0x1e, 0xbe,
- 0x86, 0xa2, 0x9a, 0xbe, 0x7a, 0xa1, 0x7a, 0xbd, 0x96, 0xa2, 0x96, 0xbe,
- 0x89, 0xa2, 0xce, 0x3b, 0xb3, 0xc1, 0x87, 0xbd, 0x62, 0xdb, 0x85, 0xbc,
- 0x83, 0x38, 0x84, 0xbe, 0xd2, 0x05, 0xc7, 0xbd, 0x94, 0x76, 0xf0, 0x3d,
- 0x70, 0xa5, 0x13, 0x3e, 0xe5, 0xfd, 0x61, 0x3d, 0xed, 0x9b, 0xa0, 0xbe,
- 0xec, 0xf4, 0xbf, 0x3b, 0x70, 0x2b, 0xea, 0xbd, 0xbe, 0x86, 0x89, 0x3e,
- 0xc7, 0x7b, 0xcb, 0xbe, 0x18, 0x76, 0x7f, 0xbd, 0x2e, 0x92, 0xef, 0xbe,
- 0xa5, 0xc1, 0x19, 0xbe, 0x04, 0x97, 0x45, 0xbe, 0x2a, 0x45, 0x20, 0xbe,
- 0xcb, 0x8e, 0xdc, 0xbe, 0x94, 0x59, 0x84, 0xbd, 0xb0, 0x80, 0x62, 0x3c,
- 0x2f, 0x69, 0xfc, 0xbc, 0x53, 0x2b, 0x8c, 0x3d, 0x3b, 0x9c, 0x3c, 0xbe,
- 0xe5, 0xe3, 0x49, 0x3e, 0xfd, 0xe8, 0x9f, 0x3d, 0xa1, 0xed, 0x06, 0xbe,
- 0x00, 0x3b, 0x84, 0x3d, 0x07, 0xe4, 0x66, 0xbc, 0x60, 0x33, 0x37, 0xbd,
- 0x71, 0x86, 0x9b, 0xbc, 0x21, 0x2e, 0x8a, 0xbe, 0xc9, 0x2e, 0x60, 0xbe,
- 0xa8, 0x43, 0xe1, 0x3d, 0xb0, 0xe7, 0x6f, 0xbe, 0xab, 0xb9, 0xeb, 0xbe,
- 0x84, 0xe2, 0xf6, 0xbe, 0x6a, 0x45, 0x8c, 0xbe, 0x9b, 0xee, 0x04, 0xbd,
- 0xb7, 0xd6, 0x77, 0xbe, 0x54, 0x68, 0x0d, 0xbd, 0x79, 0xe7, 0xa6, 0xbe,
- 0xd6, 0x3b, 0xa6, 0x3a, 0x03, 0x71, 0xfe, 0xbd, 0x17, 0x72, 0xa2, 0xbd,
- 0xa2, 0x7f, 0x11, 0x3e, 0xe2, 0x02, 0xc8, 0xbd, 0x94, 0xf5, 0x62, 0xbe,
- 0x59, 0x8f, 0x2b, 0xbb, 0xa7, 0xd3, 0x73, 0xbe, 0xe9, 0x82, 0xd0, 0xbe,
- 0xbe, 0xfc, 0x8b, 0xbe, 0x45, 0x2e, 0xee, 0xbe, 0x36, 0x8a, 0xc0, 0x3c,
- 0xd5, 0x72, 0x63, 0xbe, 0xa2, 0x59, 0xd3, 0xbe, 0xa9, 0xa4, 0x08, 0xbe,
- 0x30, 0x22, 0xe5, 0xbd, 0x1e, 0x3f, 0x75, 0x3d, 0x08, 0x0b, 0x47, 0xbe,
- 0xb9, 0x79, 0xcd, 0xbc, 0xa6, 0x82, 0x88, 0x3d, 0x0e, 0x08, 0x3f, 0xbe,
- 0x05, 0x84, 0x5e, 0x3e, 0x90, 0x7d, 0x3a, 0x3a, 0xf3, 0xa3, 0x9c, 0xbd,
- 0x37, 0x3c, 0xfa, 0x3d, 0xa0, 0x4f, 0x82, 0x3e, 0xcc, 0xca, 0xc8, 0xbc,
- 0x0e, 0x39, 0x05, 0xbf, 0x9c, 0x8d, 0x68, 0x3d, 0xc2, 0x28, 0xe9, 0xbb,
- 0x1c, 0x13, 0x3c, 0xbd, 0xb0, 0xbe, 0x28, 0xbe, 0x86, 0x85, 0x5d, 0xbe,
- 0xb5, 0x7c, 0xf6, 0xbe, 0xd1, 0x55, 0x68, 0xbe, 0x70, 0xf8, 0x15, 0xbe,
- 0x14, 0x73, 0x28, 0x3e, 0x81, 0x4c, 0xee, 0x3d, 0x2d, 0x43, 0x7a, 0x3d,
- 0x02, 0x57, 0x9a, 0xbe, 0xc8, 0x1d, 0x8b, 0x3c, 0xf1, 0xa5, 0xda, 0xbd,
- 0x90, 0xca, 0x40, 0x3e, 0x2e, 0xf9, 0x2d, 0x3e, 0xd2, 0x28, 0xaf, 0x3d,
- 0x9b, 0x4b, 0xfd, 0xbe, 0x01, 0x13, 0x31, 0x3e, 0x0b, 0x28, 0x05, 0xbf,
- 0xd7, 0xb0, 0x82, 0xbe, 0x61, 0x2f, 0xa4, 0x3d, 0x06, 0xf9, 0xa5, 0xbe,
- 0x2f, 0x73, 0x61, 0xbe, 0xa9, 0xef, 0xc6, 0xbe, 0x1c, 0x9f, 0x04, 0xbd,
- 0x05, 0x71, 0x22, 0xbe, 0x52, 0xee, 0x64, 0xbe, 0x21, 0x4f, 0xbd, 0xbd,
- 0x44, 0xbd, 0x92, 0xbe, 0x95, 0x26, 0xfe, 0xbe, 0x16, 0x78, 0x5e, 0xbe,
- 0xa5, 0x3d, 0x78, 0x3d, 0x46, 0x56, 0xe4, 0xbe, 0x63, 0x0a, 0xd1, 0xbc,
- 0xf5, 0xc2, 0xa6, 0xbd, 0xe3, 0x36, 0xa3, 0xbe, 0x3a, 0xa6, 0x04, 0x3c,
- 0xdc, 0xcf, 0x03, 0x3e, 0xe6, 0x56, 0xfe, 0xbd, 0x56, 0x99, 0x33, 0x3e,
- 0x03, 0x69, 0x42, 0x3e, 0x82, 0xfe, 0x23, 0xbe, 0x54, 0x51, 0x8a, 0xbe,
- 0xa3, 0x62, 0x53, 0xbe, 0x94, 0xfd, 0xb2, 0x3c, 0x6c, 0x84, 0x33, 0xbe,
- 0xd7, 0x38, 0xf4, 0x3c, 0x27, 0x3e, 0xac, 0x3d, 0xff, 0xde, 0x8b, 0x3c,
- 0xbb, 0xd1, 0x71, 0x3e, 0x27, 0x74, 0x51, 0xbd, 0xa0, 0xd1, 0xb2, 0xbc,
- 0x5b, 0xa3, 0x66, 0xbe, 0x6b, 0x06, 0x39, 0xbe, 0x88, 0xf5, 0x03, 0x3d,
- 0x1b, 0x5d, 0x80, 0xbe, 0xd7, 0x42, 0x56, 0x3e, 0x01, 0x11, 0xe7, 0xbc,
- 0xa4, 0x71, 0xe5, 0x3d, 0x71, 0x2c, 0xd1, 0xbd, 0xfe, 0xc1, 0xa6, 0xbe,
- 0x6a, 0xf5, 0x09, 0xbe, 0x83, 0x0f, 0x2e, 0xbe, 0x48, 0xe0, 0xd7, 0x3d,
- 0x7c, 0x6c, 0x63, 0x3e, 0xe2, 0x02, 0xcb, 0xbd, 0x6d, 0x49, 0xe5, 0xb9,
- 0x8b, 0x47, 0xb6, 0xbe, 0x21, 0xb6, 0x72, 0xbe, 0xdc, 0x58, 0x51, 0xbd,
- 0x47, 0xc2, 0x73, 0x3e, 0x64, 0x15, 0x4a, 0xbe, 0x44, 0x72, 0x9b, 0xbd,
- 0x1b, 0x01, 0xdf, 0xbd, 0x6b, 0x66, 0x72, 0x3d, 0xec, 0x89, 0x1a, 0x3d,
- 0x7d, 0xa7, 0x1c, 0x3e, 0x09, 0x1d, 0x0d, 0x3e, 0x63, 0xde, 0x3e, 0x3d,
- 0x80, 0x30, 0xc6, 0xba, 0x52, 0x1c, 0x05, 0xbc, 0x4f, 0x39, 0x0a, 0xbd,
- 0xf5, 0x9e, 0xc3, 0xb9, 0x1e, 0xb1, 0x90, 0xbe, 0x50, 0xda, 0x23, 0xbe,
- 0x16, 0x3f, 0xad, 0xbd, 0xa9, 0xa8, 0x68, 0xbd, 0x0b, 0xb1, 0x8e, 0xbd,
- 0x56, 0x1c, 0x0c, 0xbe, 0xc4, 0x95, 0x80, 0xbe, 0x06, 0x98, 0x95, 0x3d,
- 0x50, 0x14, 0x54, 0x3c, 0x58, 0xd1, 0x84, 0x3e, 0x47, 0xac, 0x26, 0x3d,
- 0x09, 0x77, 0xce, 0xbe, 0x7e, 0x0f, 0x5e, 0xbd, 0x06, 0xdd, 0x9f, 0xbe,
- 0x12, 0x00, 0x2f, 0xbe, 0xbc, 0xc6, 0x40, 0xbe, 0x46, 0x68, 0x31, 0x3e,
- 0x3e, 0x72, 0x01, 0xbd, 0x3a, 0x91, 0xb1, 0xbd, 0xeb, 0x35, 0x22, 0xbe,
- 0x6a, 0x12, 0x43, 0xbe, 0x4b, 0xc5, 0xbf, 0xbd, 0x4a, 0x66, 0xc2, 0xbe,
- 0x63, 0x18, 0x35, 0xbf, 0xc2, 0x91, 0x58, 0x3c, 0xfe, 0x38, 0xe8, 0xbe,
- 0x96, 0x73, 0x33, 0x3e, 0x89, 0x02, 0x46, 0xbe, 0xe3, 0xf1, 0xd2, 0xbc,
- 0x99, 0xe6, 0xc6, 0xbe, 0x37, 0xe1, 0x9b, 0xbe, 0xa1, 0x46, 0x05, 0xbd,
- 0x13, 0x01, 0x69, 0x3a, 0x3f, 0xae, 0x96, 0xbe, 0xa5, 0xaa, 0x38, 0xbe,
- 0x3d, 0x88, 0x7a, 0xbd, 0xfd, 0x79, 0xac, 0xbd, 0xd7, 0xfb, 0x8d, 0xbd,
- 0x1a, 0x37, 0xa3, 0xbe, 0x40, 0x8a, 0x8a, 0xbd, 0xf1, 0xca, 0x01, 0xbf,
- 0x8f, 0xac, 0xba, 0xbd, 0xf4, 0x5e, 0x1f, 0xbe, 0x67, 0xbb, 0x49, 0xbe,
- 0x19, 0xca, 0x8e, 0xbe, 0xd8, 0x76, 0xca, 0xbe, 0x3a, 0x7f, 0x6d, 0xbe,
- 0x07, 0x41, 0x9e, 0xbc, 0x7d, 0xb8, 0xd9, 0x3d, 0xd7, 0x3d, 0xf3, 0xbe,
- 0xe5, 0x19, 0x31, 0xbd, 0x1b, 0xc9, 0x13, 0xbe, 0x34, 0xb2, 0x73, 0xbb,
- 0xa6, 0x95, 0x5b, 0xbe, 0x6c, 0x1e, 0xc5, 0xbe, 0xdb, 0x71, 0xfb, 0x3d,
- 0xab, 0x1a, 0xc8, 0xbe, 0xc3, 0xbe, 0xd1, 0x3c, 0x80, 0x89, 0x03, 0x3e,
- 0x5e, 0xb5, 0xc7, 0xbd, 0x8f, 0xd4, 0x25, 0xbd, 0x06, 0xd3, 0x17, 0xbf,
- 0x30, 0x0c, 0x9d, 0xbe, 0x56, 0xf0, 0x79, 0xbd, 0x6a, 0x79, 0xd9, 0x3d,
- 0xa3, 0x64, 0x8c, 0x3d, 0x83, 0x93, 0x07, 0xbd, 0x62, 0xe4, 0xf1, 0xbe,
- 0xa8, 0x8e, 0x8b, 0x3e, 0xd9, 0x11, 0xc6, 0xbd, 0xb1, 0x2d, 0x40, 0x3e,
- 0xdc, 0x1a, 0xba, 0xbe, 0xfa, 0x57, 0xe5, 0xbd, 0x8c, 0x93, 0x0a, 0xbc,
- 0x16, 0x0b, 0x9e, 0xbe, 0xc6, 0x78, 0x1e, 0xbe, 0x1c, 0x13, 0x99, 0xbd,
- 0x76, 0xdc, 0x8b, 0xbd, 0x0d, 0xab, 0x37, 0x3e, 0xaa, 0xec, 0x49, 0xbd,
- 0x02, 0x33, 0x8d, 0x3c, 0x80, 0x0b, 0x4e, 0xbd, 0x95, 0xa6, 0x91, 0xbe,
- 0x5b, 0xf3, 0xdd, 0xbe, 0x15, 0x89, 0x5a, 0xbd, 0x84, 0x55, 0x21, 0x3e,
- 0x56, 0xe4, 0xbc, 0x3a, 0x1f, 0x99, 0x41, 0xbf, 0x82, 0x96, 0x8c, 0xbe,
- 0xb2, 0x0e, 0xda, 0xbe, 0x7b, 0x38, 0x5d, 0x3d, 0x26, 0xcb, 0xac, 0xbe,
- 0x31, 0xd2, 0x01, 0xbf, 0xb9, 0x02, 0x13, 0x3e, 0x67, 0x99, 0xed, 0x3d,
- 0x94, 0x64, 0xb6, 0xbd, 0xd0, 0xba, 0x54, 0xbe, 0xcb, 0xc4, 0x47, 0x3d,
- 0x04, 0x75, 0xdc, 0x3b, 0x34, 0xe6, 0x2a, 0xbd, 0xda, 0xf9, 0x49, 0xbf,
- 0x7d, 0x4e, 0xbc, 0xbe, 0x6e, 0xbc, 0x08, 0xbe, 0x8a, 0xc6, 0xdf, 0xbc,
- 0xc1, 0xaa, 0xb8, 0xbc, 0x04, 0x73, 0x8b, 0xbd, 0xd3, 0x62, 0x4c, 0xbd,
- 0x1a, 0x41, 0xc6, 0xbe, 0xf0, 0xda, 0x3e, 0x3d, 0x5f, 0x2b, 0x1e, 0xbe,
- 0xda, 0xeb, 0x1f, 0xbe, 0x21, 0xbf, 0x40, 0xbe, 0xbc, 0x0c, 0x07, 0x3e,
- 0x93, 0xf1, 0x07, 0x3e, 0x03, 0x78, 0xd0, 0x3d, 0xda, 0x92, 0xac, 0xbd,
- 0xcb, 0xf6, 0x16, 0x3e, 0x7b, 0xc8, 0xde, 0xbd, 0x32, 0x5d, 0xd5, 0xbd,
- 0x59, 0xb5, 0xbe, 0xbc, 0xda, 0xc3, 0x4e, 0xbd, 0x64, 0xa2, 0x3c, 0x3e,
- 0xb8, 0xec, 0x2b, 0xbd, 0x38, 0x77, 0x2b, 0xbe, 0xa1, 0x4f, 0x73, 0xbc,
- 0x47, 0x1c, 0xa1, 0x3d, 0x96, 0x32, 0x42, 0xbe, 0x8f, 0x61, 0x66, 0xbe,
- 0x56, 0xc4, 0x24, 0xbd, 0x1f, 0x59, 0x91, 0xbe, 0xdf, 0x50, 0x61, 0xbd,
- 0x88, 0x79, 0x89, 0xbd, 0x85, 0x07, 0x03, 0x3e, 0x36, 0x0c, 0x00, 0x3e,
- 0x69, 0x89, 0x90, 0xbe, 0x2b, 0x68, 0x1d, 0xbe, 0xdb, 0x8c, 0x04, 0xbd,
- 0x35, 0x32, 0xfc, 0xbd, 0xdb, 0xfe, 0xa0, 0xbd, 0x57, 0xbc, 0x91, 0xbe,
- 0x0f, 0x53, 0x01, 0x3e, 0xda, 0x29, 0xbc, 0x3d, 0x2e, 0x45, 0x51, 0x3d,
- 0x9c, 0x93, 0x6f, 0xbe, 0xc4, 0xa6, 0xae, 0xbd, 0x8a, 0x0a, 0x54, 0x3e,
- 0x7d, 0x67, 0x55, 0xbe, 0x10, 0x2f, 0x29, 0xba, 0x30, 0xcd, 0x06, 0x3d,
- 0xd7, 0x3d, 0x41, 0xbd, 0x3d, 0xbe, 0x92, 0x3e, 0x0e, 0x2a, 0x45, 0x3e,
- 0x36, 0xdd, 0x05, 0xbf, 0xa8, 0x28, 0x5c, 0xbe, 0x26, 0xa8, 0x0a, 0xbe,
- 0x7d, 0x2c, 0xa7, 0x3e, 0x5e, 0x44, 0xdd, 0xbd, 0xcd, 0xc8, 0x8a, 0xbe,
- 0xd3, 0xd5, 0x3f, 0xbe, 0xeb, 0xbf, 0x8e, 0xbe, 0xc2, 0x11, 0xc7, 0xbd,
- 0xea, 0xea, 0xf3, 0xbd, 0xa8, 0x72, 0x42, 0x3e, 0x94, 0xa0, 0x9b, 0xbe,
- 0xbe, 0xeb, 0xab, 0x3d, 0x4b, 0xaf, 0xce, 0xbb, 0x64, 0x78, 0x32, 0xbe,
- 0x4f, 0x23, 0x82, 0xbe, 0x13, 0x72, 0x9b, 0xbe, 0x43, 0xee, 0xb3, 0xbd,
- 0xa9, 0xde, 0x5d, 0x39, 0x32, 0xa4, 0xa1, 0xbd, 0xd2, 0xe8, 0x01, 0xbe,
- 0x99, 0x4f, 0xe8, 0x3d, 0x38, 0x04, 0x91, 0x3d, 0xb2, 0x87, 0xc9, 0xbd,
- 0xf8, 0x9a, 0xcd, 0xbe, 0xcc, 0x93, 0x66, 0xbd, 0xac, 0x52, 0x82, 0x3d,
- 0x7d, 0x80, 0x36, 0xbe, 0x44, 0xce, 0x68, 0x3d, 0xf7, 0xe9, 0xa3, 0xbd,
- 0xcf, 0x69, 0xe1, 0xbd, 0xea, 0xd5, 0x81, 0xbc, 0x96, 0x60, 0x6c, 0x3d,
- 0x72, 0x36, 0xbf, 0xbd, 0xc8, 0xc1, 0x90, 0xbe, 0xba, 0x13, 0x80, 0x3b,
- 0xc6, 0xf7, 0x22, 0x3e, 0x2f, 0x0d, 0xc1, 0x3d, 0x77, 0xbd, 0x9b, 0x3d,
- 0x7d, 0x7a, 0x03, 0x3e, 0x1d, 0xf8, 0x3d, 0xbe, 0x97, 0xe3, 0x3c, 0x3e,
- 0xdd, 0xf8, 0xc8, 0xbd, 0xcd, 0x16, 0x44, 0x3e, 0x05, 0x7f, 0x31, 0xbd,
- 0x52, 0xaa, 0x0b, 0xbe, 0x70, 0xb7, 0xbe, 0xbe, 0x9a, 0xd4, 0x32, 0x3d,
- 0xd0, 0xf7, 0x01, 0x3e, 0xc1, 0x3a, 0x1a, 0xbb, 0xcf, 0x8f, 0x62, 0x3d,
- 0x4f, 0x62, 0x74, 0xbe, 0xee, 0xbf, 0x9e, 0x3c, 0x6c, 0xcd, 0x12, 0x3e,
- 0x01, 0x2d, 0xe0, 0xbd, 0xaa, 0x21, 0xa4, 0xbd, 0x80, 0x67, 0xca, 0x3d,
- 0xab, 0x57, 0x43, 0x3d, 0xe8, 0xd7, 0x3c, 0xbb, 0xc8, 0x6b, 0x20, 0xbf,
- 0xce, 0x61, 0xd3, 0x3a, 0x94, 0xb8, 0x5b, 0xbe, 0x77, 0x21, 0x0a, 0xbf,
- 0xa2, 0x8f, 0xaa, 0x3c, 0x2e, 0xf5, 0xa2, 0xbe, 0xcf, 0x0e, 0xaa, 0xbd,
- 0xf1, 0x22, 0xa6, 0xbd, 0xa9, 0x46, 0x64, 0xbd, 0x30, 0x5a, 0x37, 0xbd,
- 0xee, 0xfa, 0x7c, 0xbe, 0xe9, 0xfa, 0xe2, 0xbd, 0xf6, 0x02, 0x0a, 0x3e,
- 0x8a, 0x8b, 0x94, 0xbb, 0x18, 0x3f, 0x82, 0xbd, 0xc0, 0xa2, 0x25, 0x3e,
- 0xa3, 0xec, 0xd1, 0xbe, 0x95, 0x94, 0xcc, 0x3d, 0x52, 0xe7, 0x4e, 0xbe,
- 0x29, 0xe1, 0x15, 0xbe, 0xdb, 0x4e, 0x88, 0xbe, 0x31, 0x39, 0xcb, 0x3c,
- 0x60, 0x44, 0x50, 0xbc, 0xef, 0x99, 0x45, 0x3e, 0xb3, 0x41, 0x83, 0x3e,
- 0x40, 0x63, 0x4f, 0x3c, 0x2c, 0x61, 0x4b, 0x3e, 0xaf, 0xad, 0x99, 0x3d,
- 0xd6, 0x96, 0x8a, 0x3e, 0xbb, 0x3a, 0xb4, 0x3d, 0x9b, 0xbe, 0x3f, 0xbe,
- 0xea, 0x4c, 0x0b, 0xbe, 0x07, 0x5e, 0xb6, 0xbd, 0xed, 0xd8, 0x55, 0xbd,
- 0x62, 0xff, 0xc1, 0xbd, 0x37, 0xe7, 0x70, 0xbe, 0x01, 0x44, 0x4c, 0xbe,
- 0x3e, 0x93, 0x8d, 0x3e, 0x2c, 0x8e, 0x83, 0xbd, 0xbb, 0xe7, 0x0d, 0xbe,
- 0x7c, 0xbd, 0x0e, 0xbe, 0x06, 0x07, 0x66, 0xbe, 0x77, 0x65, 0x89, 0x3e,
- 0x80, 0x76, 0xda, 0x3a, 0x46, 0x8c, 0x14, 0x3e, 0xd8, 0x0a, 0xa9, 0x3d,
- 0x9e, 0xca, 0x5c, 0x3d, 0x42, 0x0f, 0xd6, 0xbc, 0x82, 0x6f, 0x91, 0xbc,
- 0x84, 0xf3, 0x41, 0x3d, 0xae, 0xba, 0x41, 0xbe, 0xe8, 0x11, 0x36, 0xbd,
- 0x75, 0x29, 0x36, 0x3e, 0xb9, 0xba, 0x84, 0xbe, 0xd5, 0xc9, 0x49, 0xbe,
- 0x14, 0xae, 0xfd, 0xbe, 0x14, 0xf0, 0x41, 0x3d, 0x7d, 0xd9, 0x7a, 0xbd,
- 0x86, 0x9b, 0x0c, 0xbf, 0x53, 0xf5, 0x6a, 0x3e, 0xaa, 0x9a, 0xa6, 0xbe,
- 0x67, 0x6a, 0x1e, 0xbe, 0x3e, 0x6c, 0x7a, 0xbe, 0xa4, 0xe6, 0x17, 0x3e,
- 0x8d, 0x13, 0xbd, 0x3c, 0x45, 0x0c, 0x5a, 0xbe, 0xa9, 0xd2, 0x75, 0xbd,
- 0xfa, 0x54, 0xe8, 0xbd, 0x2a, 0x18, 0x03, 0x3e, 0x19, 0xa7, 0x12, 0x3e,
- 0x4b, 0x3e, 0x4b, 0xbe, 0x91, 0x91, 0x44, 0xbe, 0x85, 0x02, 0x96, 0xbe,
- 0x7e, 0x16, 0x47, 0xbe, 0x49, 0xdf, 0xed, 0x3d, 0xa7, 0x2c, 0xa4, 0x3d,
- 0x4c, 0x60, 0x1a, 0xbe, 0x19, 0xce, 0xec, 0x3c, 0xbd, 0x07, 0x92, 0xbe,
- 0x23, 0x3f, 0xb8, 0x3d, 0x99, 0x1b, 0xda, 0xbe, 0x0f, 0x86, 0x96, 0xbd,
- 0x81, 0x89, 0xf5, 0x3d, 0xc8, 0xfa, 0x40, 0xbe, 0xcf, 0x63, 0x23, 0x3e,
- 0x86, 0x6f, 0xbb, 0xbd, 0x82, 0x1b, 0x77, 0xbe, 0xf9, 0x27, 0xe3, 0xbc,
- 0xa4, 0x63, 0x96, 0xbe, 0x1d, 0x05, 0x88, 0xbe, 0x4c, 0x80, 0x2e, 0xbe,
- 0x19, 0xed, 0x9b, 0xbe, 0x93, 0xe8, 0x19, 0x3d, 0x17, 0x58, 0xac, 0x3d,
- 0x82, 0xbc, 0xd6, 0xbd, 0xb0, 0xd5, 0x35, 0x3e, 0x00, 0xd3, 0xeb, 0xbe,
- 0x2d, 0xdf, 0xa5, 0x3e, 0x5d, 0x03, 0x0e, 0x3e, 0x15, 0x11, 0x9b, 0xbc,
- 0x5e, 0x73, 0xa2, 0x3d, 0x04, 0x66, 0x13, 0x3d, 0xe8, 0x4b, 0x85, 0xbd,
- 0x55, 0xbc, 0x94, 0xbd, 0x0e, 0x62, 0x94, 0xbe, 0x41, 0x14, 0xd6, 0xbd,
- 0x97, 0x02, 0x2e, 0xbe, 0xbe, 0x60, 0x1b, 0xbe, 0x2b, 0x19, 0x94, 0xbe,
- 0xe0, 0x97, 0x3b, 0x3c, 0xeb, 0x30, 0xc4, 0xba, 0xee, 0x6c, 0x53, 0x3e,
- 0xfc, 0x7c, 0x0e, 0xbd, 0x3f, 0xd0, 0x56, 0x3d, 0xfe, 0x57, 0x40, 0xbe,
- 0xd4, 0xf7, 0xe9, 0xbd, 0xb6, 0x06, 0x75, 0xbe, 0x1a, 0xfc, 0x73, 0x3d,
- 0x70, 0x47, 0x9e, 0xbd, 0xa6, 0xbb, 0xff, 0xbd, 0xd0, 0x61, 0x0c, 0x3e,
- 0x30, 0x9e, 0x5c, 0xbe, 0xe0, 0x1b, 0xa4, 0xbe, 0x66, 0x93, 0xc8, 0xbc,
- 0x82, 0xbd, 0x29, 0xbf, 0xb3, 0xab, 0x4b, 0x3b, 0x0d, 0x4a, 0x03, 0x3e,
- 0x4d, 0x04, 0xd2, 0xbe, 0xec, 0x21, 0xd8, 0xbd, 0xfa, 0x13, 0x4d, 0xbb,
- 0x3b, 0x97, 0x1e, 0x3d, 0x96, 0x28, 0xb0, 0xbe, 0xb5, 0xc7, 0x48, 0x3e,
- 0x76, 0xee, 0xa6, 0xbe, 0x67, 0x81, 0x1f, 0xbd, 0x8e, 0x74, 0xaf, 0xbe,
- 0xd1, 0x2c, 0x35, 0x3e, 0x32, 0xa9, 0xf8, 0x3c, 0xbe, 0x8b, 0xff, 0x3d,
- 0xd3, 0x4a, 0xbe, 0x3b, 0xde, 0xcb, 0x79, 0xbc, 0xee, 0x3b, 0xa8, 0xbe,
- 0x9e, 0x14, 0x93, 0x3d, 0x48, 0x69, 0x01, 0xbe, 0xad, 0xf6, 0x4a, 0xbe,
- 0xae, 0xe2, 0xd8, 0x3d, 0xee, 0x96, 0xeb, 0x3c, 0xd6, 0xdd, 0xce, 0xbe,
- 0x5a, 0xab, 0x80, 0xbe, 0x7b, 0x36, 0x9f, 0xbe, 0x08, 0x5b, 0x9d, 0xbe,
- 0xba, 0xeb, 0xc1, 0xbd, 0xa5, 0x57, 0x5f, 0xbe, 0xbe, 0x51, 0xc0, 0xbd,
- 0xfe, 0x7b, 0x29, 0xbd, 0xe9, 0x28, 0xbd, 0xbd, 0x9b, 0x77, 0xa6, 0xbd,
- 0xbc, 0xae, 0x4d, 0xbd, 0x7b, 0xa7, 0x18, 0xbe, 0x95, 0x8c, 0x0d, 0xbe,
- 0x5f, 0xc7, 0x91, 0x3d, 0xa5, 0xb0, 0x2d, 0x3e, 0xed, 0xcc, 0x15, 0xbe,
- 0x69, 0x09, 0xa0, 0x3d, 0xea, 0x51, 0xd1, 0xbe, 0xa1, 0x38, 0xcd, 0xbe,
- 0x73, 0xaf, 0x85, 0xbd, 0x64, 0x37, 0x8e, 0xbe, 0xdd, 0x44, 0x68, 0x3d,
- 0xe3, 0x76, 0xfb, 0x3d, 0x66, 0x6e, 0x4d, 0x3e, 0x26, 0x71, 0x90, 0x3d,
- 0x9b, 0xa8, 0x43, 0xbb, 0x1b, 0xa9, 0x49, 0x3e, 0x3a, 0x65, 0xc4, 0xbc,
- 0x4a, 0xdb, 0xb7, 0x3c, 0x1b, 0x85, 0x6a, 0xbb, 0x50, 0x2d, 0x6f, 0xbe,
- 0xcf, 0xd2, 0x31, 0x3e, 0x6a, 0x12, 0x51, 0x3e, 0x20, 0xcb, 0x60, 0xbe,
- 0xf4, 0x27, 0x04, 0x3d, 0x82, 0xd1, 0xa1, 0xbc, 0x16, 0xb4, 0x5d, 0x3c,
- 0xb1, 0x3f, 0x0c, 0xbd, 0xf8, 0xf2, 0xb3, 0x3c, 0x1e, 0x3f, 0xbe, 0xbc,
- 0x93, 0x2f, 0xfc, 0x3d, 0x20, 0x33, 0x1c, 0xbe, 0x87, 0x73, 0x09, 0xbe,
- 0xad, 0x99, 0x9a, 0x3d, 0xe7, 0xb0, 0x39, 0x3e, 0x0a, 0x46, 0x40, 0xbe,
- 0xc5, 0x73, 0x90, 0xbd, 0x3c, 0xe5, 0xeb, 0xbd, 0x50, 0x41, 0x87, 0x3d,
- 0x72, 0xcd, 0x0a, 0x3d, 0xbc, 0x2b, 0x8a, 0xbd, 0x29, 0x7d, 0xf2, 0x3c,
- 0xac, 0x29, 0x50, 0xbe, 0x95, 0x19, 0xc1, 0xbc, 0x02, 0x2f, 0x91, 0xbc,
- 0xc7, 0x5b, 0xf5, 0x3c, 0x4a, 0x9a, 0x77, 0x3e, 0xef, 0x08, 0xbe, 0xbd,
- 0x79, 0xc7, 0x2c, 0x3e, 0x2d, 0x7a, 0xf4, 0xbd, 0x44, 0x77, 0x70, 0x3c,
- 0x7f, 0x2b, 0x1b, 0x3e, 0xdb, 0x72, 0xe1, 0xbd, 0xd6, 0xd4, 0x9d, 0xb9,
- 0xe9, 0xb1, 0x45, 0x3c, 0x00, 0x18, 0x8c, 0x3e, 0xa5, 0x48, 0xd1, 0x3d,
- 0x98, 0x0d, 0x86, 0xbd, 0x04, 0xca, 0x5b, 0x3e, 0x6e, 0x86, 0x11, 0x3e,
- 0x7c, 0x11, 0xba, 0x3c, 0xe8, 0x0c, 0xef, 0x3d, 0x3a, 0xf4, 0xef, 0xbd,
- 0x34, 0x66, 0xe1, 0x3d, 0xa7, 0xa2, 0xe8, 0x3d, 0xc2, 0xf1, 0xaf, 0xbc,
- 0x27, 0x4b, 0xa1, 0x3d, 0xec, 0x6b, 0x13, 0xbd, 0x9c, 0xec, 0x46, 0x3d,
- 0x1d, 0x7b, 0x23, 0x3d, 0x3d, 0x5e, 0x8b, 0x3d, 0x07, 0x6a, 0xa3, 0x3c,
- 0x08, 0x29, 0x92, 0xbd, 0x64, 0x74, 0xd7, 0x3d, 0x8f, 0x0e, 0x20, 0xbe,
- 0xf5, 0xa0, 0x7c, 0xbe, 0x30, 0x16, 0xdb, 0x3d, 0x88, 0xa8, 0x75, 0xbd,
- 0xc3, 0x17, 0x06, 0x3e, 0xae, 0xa3, 0x84, 0xbb, 0x3b, 0xfd, 0xd6, 0x3d,
- 0x94, 0xb1, 0x13, 0xbd, 0xcf, 0xcf, 0xe6, 0x3c, 0x4f, 0xa9, 0xb3, 0xbd,
- 0xae, 0xd6, 0xe1, 0x3d, 0xb8, 0x55, 0x4c, 0x3e, 0x4e, 0xa0, 0xa6, 0xbd,
- 0x4d, 0xa2, 0x64, 0x3e, 0xaa, 0x34, 0xad, 0xbc, 0x34, 0x4a, 0x0b, 0xbd,
- 0x8c, 0xf5, 0x8f, 0xbd, 0x70, 0x71, 0x83, 0x3d, 0xab, 0x77, 0x8e, 0xbd,
- 0x4e, 0x86, 0x93, 0x3d, 0x32, 0xb2, 0x24, 0x3d, 0x08, 0x78, 0x16, 0xbd,
- 0x8f, 0x04, 0x64, 0xbd, 0xdb, 0x96, 0x73, 0x3d, 0x62, 0x18, 0x1a, 0xbd,
- 0xa0, 0x0f, 0xee, 0xba, 0x54, 0xd7, 0xc7, 0x3d, 0x02, 0xe0, 0xc4, 0xbd,
- 0x96, 0x18, 0xac, 0xbd, 0x41, 0x0f, 0xbf, 0x3d, 0xde, 0xe1, 0x92, 0x3c,
- 0x0a, 0xc5, 0x3f, 0xbe, 0x2e, 0x87, 0x3f, 0x3d, 0xaf, 0xdf, 0xa9, 0xbd,
- 0x6d, 0x09, 0x05, 0x3e, 0xba, 0x7e, 0x9a, 0x3d, 0x3a, 0x1a, 0x03, 0xbe,
- 0x14, 0x5c, 0x71, 0x3e, 0xb1, 0x2d, 0x15, 0x3e, 0x1d, 0x8f, 0x44, 0x3e,
- 0x2a, 0x51, 0x3f, 0x3e, 0x5c, 0xcb, 0xfd, 0xbd, 0x15, 0x1b, 0xee, 0xbd,
- 0xc5, 0x2e, 0x9f, 0x3d, 0xcf, 0x5c, 0xaf, 0x3c, 0x35, 0x94, 0xb9, 0x3a,
- 0x1c, 0x90, 0xee, 0x3d, 0xa3, 0x55, 0xd4, 0xbd, 0xdc, 0x65, 0x03, 0x3e,
- 0x81, 0x9c, 0xea, 0xbd, 0x69, 0xe4, 0x28, 0xbe, 0xae, 0x50, 0xf7, 0x3d,
- 0x20, 0x3e, 0xa7, 0x3d, 0x94, 0xdf, 0xbf, 0x3d, 0x07, 0x9c, 0x47, 0x3e,
- 0xcf, 0x65, 0x6f, 0x3c, 0x96, 0xc5, 0x4b, 0xbe, 0x0c, 0x5e, 0x37, 0xbd,
- 0x3a, 0xe4, 0x23, 0x3e, 0xde, 0x6e, 0x8b, 0xbd, 0xed, 0xc5, 0xe3, 0xbd,
- 0x14, 0xa3, 0xab, 0xbb, 0x8f, 0x1b, 0xa0, 0xbe, 0xf2, 0x71, 0xcb, 0x3c,
- 0xc4, 0x8b, 0xae, 0x3d, 0xc7, 0x8b, 0x13, 0x3e, 0xec, 0xb6, 0x88, 0x3e,
- 0xc2, 0x2e, 0xa4, 0x3d, 0xb1, 0x55, 0x23, 0xbb, 0xa4, 0x48, 0x12, 0xbd,
- 0x79, 0xb0, 0xcb, 0x3e, 0xf0, 0x35, 0x48, 0x3e, 0x20, 0x99, 0x22, 0x3e,
- 0xaa, 0x17, 0x7c, 0x3d, 0x38, 0x4f, 0xe6, 0xbc, 0x63, 0x81, 0x22, 0xbe,
- 0xa3, 0xd5, 0x4d, 0x3d, 0x40, 0x1a, 0xae, 0xbe, 0x2b, 0x3c, 0xbe, 0x3e,
- 0x6d, 0xef, 0x29, 0xbe, 0xaf, 0x25, 0x22, 0x3e, 0xeb, 0x6d, 0x2a, 0x3b,
- 0x18, 0x11, 0xbe, 0xba, 0x3e, 0x51, 0x16, 0xbd, 0x23, 0x34, 0xac, 0x3d,
- 0x91, 0x39, 0x1c, 0xbe, 0xba, 0xd4, 0x20, 0x3e, 0xfa, 0x1b, 0x77, 0xbd,
- 0xa7, 0x52, 0xbd, 0x3d, 0x62, 0x15, 0x9a, 0x3d, 0x41, 0x26, 0xfc, 0xbd,
- 0x14, 0x92, 0xb6, 0x3d, 0x14, 0xd3, 0x19, 0xbc, 0xfa, 0x55, 0x0d, 0xbd,
- 0x1c, 0x1b, 0xac, 0x3d, 0xe5, 0x8d, 0x3c, 0x3d, 0x96, 0xdd, 0xe6, 0xbd,
- 0x04, 0xac, 0xc8, 0x3d, 0x3e, 0x95, 0x78, 0x3d, 0x7c, 0x1a, 0x8c, 0xbe,
- 0x08, 0xce, 0xa4, 0x3e, 0x52, 0xef, 0xa1, 0xbd, 0x40, 0x01, 0xf3, 0xbd,
- 0x84, 0x7f, 0x8b, 0xbe, 0x63, 0x34, 0x24, 0x3d, 0xc1, 0xec, 0x8f, 0xbd,
- 0xd9, 0x08, 0xf5, 0x3d, 0x6d, 0x5e, 0x07, 0x3e, 0xce, 0x59, 0x14, 0xbd,
- 0xbc, 0xf4, 0x05, 0x3c, 0x9f, 0xfa, 0x15, 0xbe, 0xb4, 0xfe, 0x1f, 0x3e,
- 0x72, 0xca, 0xa5, 0x3d, 0x88, 0xef, 0x43, 0x3d, 0xe9, 0xe3, 0xda, 0x3d,
- 0xfc, 0x2d, 0x66, 0xbd, 0x02, 0x8a, 0xc1, 0x3a, 0x8a, 0x12, 0xef, 0x3d,
- 0xe4, 0xac, 0xac, 0x3d, 0xa0, 0x0b, 0x02, 0x3e, 0x2d, 0x59, 0x8d, 0x3c,
- 0xc4, 0x83, 0x2c, 0x3e, 0xa1, 0x8e, 0x67, 0x3e, 0x5c, 0x1b, 0xec, 0xbc,
- 0x2e, 0x2a, 0xbf, 0xb9, 0x5a, 0xf0, 0x54, 0xbd, 0xf4, 0xc2, 0x57, 0xbd,
- 0xa4, 0xa5, 0x83, 0xbe, 0x5b, 0x32, 0x16, 0x3e, 0xb7, 0x73, 0x50, 0xbe,
- 0x11, 0x70, 0x4b, 0xbe, 0x41, 0x2f, 0xe1, 0x3d, 0xab, 0xf8, 0x09, 0xbc,
- 0xad, 0x97, 0xd7, 0xbe, 0x7c, 0x85, 0x90, 0x3d, 0x4c, 0xb4, 0xad, 0xbe,
- 0xad, 0x3d, 0x26, 0xbb, 0xaa, 0x6e, 0xb5, 0x3d, 0x71, 0x72, 0xc3, 0xbc,
- 0xd0, 0x9e, 0x15, 0xbd, 0x54, 0x67, 0x89, 0xbd, 0xda, 0xc3, 0xb5, 0xbe,
- 0x6d, 0xce, 0x31, 0x3d, 0x7d, 0xc4, 0x38, 0xbe, 0x85, 0x26, 0x5c, 0xbe,
- 0x74, 0x59, 0xa3, 0xbd, 0xa4, 0x7d, 0xa8, 0xbd, 0x3e, 0x54, 0x81, 0xbd,
- 0x27, 0x4c, 0x1e, 0xbd, 0x76, 0x3d, 0xd2, 0x3d, 0x23, 0x02, 0x25, 0x3d,
- 0x03, 0x20, 0xf7, 0xbd, 0xb3, 0xb1, 0x83, 0xbd, 0xc7, 0x41, 0x75, 0xbd,
- 0x47, 0x55, 0xf1, 0xbd, 0x01, 0xf9, 0x41, 0x3d, 0xda, 0xeb, 0x86, 0xbd,
- 0xce, 0x2b, 0x69, 0xbc, 0x7b, 0x07, 0x1d, 0x3e, 0x7a, 0x80, 0xaa, 0xbd,
- 0xce, 0xb2, 0x1d, 0xbe, 0xf4, 0x0a, 0xbb, 0x3e, 0xc9, 0x5f, 0x0f, 0x3e,
- 0x4d, 0x49, 0x8b, 0xbe, 0xac, 0x21, 0xb3, 0xbd, 0x56, 0xcf, 0xf1, 0x3d,
- 0xb4, 0x61, 0x96, 0xbd, 0x31, 0xba, 0xaf, 0x3d, 0x43, 0x14, 0xf2, 0xbd,
- 0xc3, 0x6b, 0x22, 0xbd, 0x08, 0x71, 0xa1, 0x3d, 0x30, 0xfe, 0xc2, 0x3c,
- 0xa7, 0xb5, 0xe5, 0xbd, 0xee, 0x26, 0xca, 0x3d, 0xfd, 0x95, 0x22, 0xbd,
- 0x8b, 0x44, 0x6e, 0x3e, 0xbe, 0xc0, 0x8c, 0xbd, 0x38, 0xac, 0x83, 0x3e,
- 0xcf, 0x50, 0x1b, 0xbb, 0x46, 0xb8, 0x37, 0x3e, 0x29, 0xa3, 0x83, 0x3e,
- 0x93, 0x00, 0x29, 0xbc, 0xe1, 0x56, 0x7a, 0xbe, 0x94, 0x8a, 0x6d, 0x3d,
- 0x03, 0x23, 0x25, 0x3c, 0xa5, 0x24, 0x16, 0xbe, 0x9e, 0x4e, 0x10, 0xbc,
- 0x28, 0x77, 0xcd, 0xbd, 0x0e, 0xf7, 0x77, 0xbd, 0x7a, 0x0b, 0x8b, 0xbe,
- 0xd5, 0x74, 0x3a, 0x3d, 0x12, 0x13, 0x64, 0x3e, 0x1a, 0xaa, 0x3c, 0x3e,
- 0xf5, 0x1a, 0x1c, 0x3e, 0x30, 0x38, 0xb3, 0x3c, 0x8d, 0x62, 0x58, 0x3d,
- 0x24, 0x96, 0x6f, 0xbd, 0x95, 0x67, 0x37, 0x3e, 0xf7, 0x92, 0x15, 0xbd,
- 0xcc, 0xa0, 0x50, 0x3e, 0x26, 0xed, 0x45, 0xbe, 0xad, 0x41, 0x00, 0x3e,
- 0x6d, 0x25, 0x79, 0xbb, 0x57, 0xc7, 0x35, 0xbe, 0x57, 0xd2, 0x30, 0xbb,
- 0xb1, 0xc3, 0xd6, 0x3d, 0x90, 0xb2, 0x34, 0xbd, 0x37, 0xdd, 0x44, 0x3e,
- 0xd7, 0x6c, 0xd6, 0x3d, 0x03, 0x7b, 0x91, 0x3c, 0xb2, 0x01, 0x98, 0xbe,
- 0x21, 0x18, 0xdb, 0x3d, 0x9b, 0xc4, 0x3b, 0x3e, 0x87, 0xb6, 0x90, 0x3e,
- 0x42, 0x2e, 0x4f, 0xbe, 0xaf, 0xe3, 0x61, 0x3e, 0x4f, 0x94, 0x90, 0x3e,
- 0x15, 0x9e, 0x2a, 0xbe, 0xc2, 0x81, 0x05, 0x3e, 0x75, 0x50, 0x90, 0xbe,
- 0xd7, 0xf9, 0x78, 0xbd, 0xe0, 0xec, 0x27, 0x3e, 0xe4, 0x7e, 0x8d, 0xbe,
- 0x7f, 0xf4, 0xa1, 0x3e, 0x27, 0xf2, 0x44, 0x3e, 0xa6, 0xe4, 0xbe, 0x3e,
- 0x63, 0xab, 0x77, 0xbe, 0x9a, 0x8c, 0x1d, 0x3e, 0xaf, 0x69, 0xeb, 0x3d,
- 0x1f, 0x27, 0x54, 0xbd, 0xa7, 0x2f, 0x51, 0x3d, 0x13, 0xc4, 0x0e, 0xbe,
- 0x0d, 0x4b, 0x65, 0x3c, 0x72, 0xab, 0x49, 0xbe, 0xa7, 0x95, 0xca, 0xbd,
- 0x64, 0x8a, 0x42, 0xbe, 0x3c, 0x83, 0x8e, 0x3e, 0xe4, 0xdc, 0x68, 0x3e,
- 0x40, 0x53, 0xd4, 0x3e, 0xbe, 0xfc, 0x5e, 0xbd, 0xce, 0x47, 0xac, 0xbd,
- 0xc4, 0xc1, 0x89, 0xbd, 0x98, 0xdb, 0x30, 0x3e, 0x68, 0x22, 0x10, 0x3e,
- 0x68, 0x0b, 0x77, 0x3c, 0x93, 0x3f, 0xb0, 0x3c, 0xb0, 0x9c, 0x17, 0xbd,
- 0x3f, 0x2b, 0xde, 0xbe, 0xe4, 0x99, 0x68, 0x3d, 0xdd, 0xb5, 0x1f, 0xbe,
- 0xbf, 0xa7, 0xbb, 0xbd, 0x4d, 0x2d, 0x3a, 0xbd, 0x52, 0x83, 0xdc, 0x3c,
- 0x71, 0x98, 0x99, 0x3d, 0x54, 0xb7, 0xa4, 0x3c, 0x2e, 0x19, 0x9c, 0xbe,
- 0x15, 0x19, 0x17, 0x3e, 0x1a, 0x24, 0x65, 0x3e, 0xe3, 0xe5, 0xc2, 0xbc,
- 0x94, 0x1c, 0xc5, 0x3d, 0x8d, 0x42, 0x9b, 0x3e, 0xd3, 0xa2, 0x27, 0xbe,
- 0xdb, 0x90, 0x19, 0xbe, 0x67, 0x3e, 0x0b, 0x3e, 0x4e, 0x9b, 0xe1, 0xbd,
- 0xb1, 0x46, 0x2f, 0x3d, 0x3a, 0x38, 0x98, 0x3e, 0xbe, 0xd0, 0x61, 0xbd,
- 0x82, 0x98, 0x88, 0xbe, 0x8e, 0xca, 0x36, 0xbe, 0xee, 0x5d, 0x7d, 0xbd,
- 0x62, 0xd9, 0x42, 0xbf, 0x63, 0xf2, 0x2d, 0x3e, 0x99, 0xfc, 0x58, 0xbe,
- 0x0d, 0x2b, 0x5f, 0xbd, 0x0f, 0x6a, 0x00, 0xbe, 0xd8, 0x9c, 0x9e, 0x3d,
- 0x78, 0x6b, 0xd5, 0x3c, 0x93, 0x54, 0x99, 0x3d, 0x47, 0xee, 0x7d, 0x3c,
- 0x18, 0x7a, 0x71, 0xbe, 0x63, 0x8a, 0xbd, 0xbd, 0x72, 0xe5, 0x5c, 0xbd,
- 0xf2, 0x6c, 0x22, 0x3d, 0x4a, 0x86, 0x77, 0xbe, 0x90, 0x43, 0x67, 0x3e,
- 0x7a, 0xd6, 0x3a, 0x3d, 0xba, 0x46, 0x4d, 0x3d, 0xe4, 0x36, 0x5b, 0x3c,
- 0x4e, 0x10, 0x44, 0xbb, 0x46, 0xa6, 0x0c, 0xbe, 0xe7, 0x88, 0x49, 0x3c,
- 0x35, 0x7c, 0x9f, 0xbd, 0xee, 0x46, 0x70, 0xbd, 0x9b, 0x5a, 0x1c, 0xbc,
- 0x9f, 0xf5, 0xff, 0xbc, 0x39, 0x08, 0x74, 0x3c, 0xf2, 0x91, 0x2d, 0xbe,
- 0xf2, 0xba, 0xbe, 0x3b, 0x54, 0x0f, 0x8e, 0xbc, 0xc7, 0x77, 0x8b, 0x3d,
- 0x0c, 0x6d, 0x15, 0xbd, 0xb1, 0x69, 0x45, 0x3e, 0x6f, 0x34, 0x12, 0x3e,
- 0x73, 0x77, 0x5d, 0x3d, 0x8a, 0x83, 0x85, 0xbd, 0x3a, 0x0f, 0x71, 0x3d,
- 0x11, 0x47, 0x52, 0x3c, 0x2d, 0xe6, 0xf0, 0x3c, 0xdd, 0x21, 0x77, 0xbe,
- 0x6a, 0x31, 0x7b, 0xbd, 0xdb, 0xbf, 0x3d, 0xbe, 0xa2, 0x23, 0x18, 0xbe,
- 0xa4, 0x92, 0xef, 0xbc, 0x8b, 0x17, 0xf6, 0xbd, 0xa6, 0x0f, 0x7c, 0xbe,
- 0x0f, 0xd3, 0xb2, 0xbd, 0x83, 0x86, 0x00, 0x3e, 0xb1, 0x8c, 0xf8, 0x3d,
- 0xe2, 0x44, 0x0e, 0xbe, 0xde, 0xed, 0x36, 0x3e, 0xb1, 0x17, 0x5f, 0x3d,
- 0x18, 0x57, 0x95, 0xbe, 0x3a, 0xf7, 0x60, 0x3e, 0x50, 0x4c, 0x59, 0xbe,
- 0xf9, 0xeb, 0xdb, 0x3d, 0x75, 0x1a, 0x59, 0xbe, 0x7b, 0xaf, 0xa8, 0x3d,
- 0x0c, 0x07, 0x49, 0x3d, 0x31, 0x13, 0x95, 0xbd, 0x22, 0x52, 0x83, 0x3d,
- 0x75, 0x6b, 0x61, 0x3e, 0xe7, 0x55, 0x2d, 0x3e, 0x9c, 0xc2, 0xe3, 0xbe,
- 0xcf, 0x4c, 0xbe, 0xbd, 0x90, 0x9c, 0x2c, 0x3d, 0xef, 0x7a, 0xef, 0xbc,
- 0xd5, 0x71, 0x60, 0xbe, 0x7a, 0xa5, 0x66, 0x3e, 0xba, 0x3c, 0xd9, 0x3d,
- 0x2d, 0xa9, 0xc6, 0x3e, 0x5a, 0x96, 0xf6, 0x3e, 0xab, 0x03, 0x38, 0xbe,
- 0xe6, 0x1d, 0x67, 0x3e, 0x43, 0x5b, 0xc7, 0x3b, 0xc0, 0x63, 0x56, 0x3e,
- 0xee, 0x74, 0xa7, 0x3e, 0x58, 0xa1, 0x0f, 0xbd, 0xed, 0xa8, 0xa8, 0x3d,
- 0x32, 0x51, 0x40, 0xbe, 0x83, 0x2c, 0x54, 0x3e, 0x25, 0xf7, 0x57, 0xbe,
- 0xf3, 0xaa, 0xf6, 0xbd, 0x3c, 0x6a, 0x1b, 0x3e, 0x4b, 0x7f, 0xa9, 0x3c,
- 0x99, 0x0a, 0x04, 0xbd, 0x3e, 0xea, 0x4b, 0xbd, 0xf6, 0xf4, 0xe0, 0x3c,
- 0x1f, 0x02, 0x23, 0x3b, 0x55, 0x3b, 0x73, 0xbe, 0xf3, 0x6f, 0x7c, 0xbd,
- 0xc6, 0x2e, 0xfb, 0x3e, 0xa1, 0x59, 0x89, 0xbd, 0x85, 0x26, 0x90, 0x3b,
- 0x7d, 0xf9, 0x13, 0x3d, 0xb6, 0x56, 0xfa, 0x3d, 0x7d, 0x9c, 0x52, 0xbe,
- 0x07, 0x2e, 0x28, 0xbd, 0xcc, 0x2e, 0x07, 0xbf, 0xc6, 0x74, 0x96, 0xbe,
- 0xd7, 0x05, 0x60, 0x3b, 0x03, 0xc2, 0x95, 0xbe, 0x5a, 0xf5, 0x9d, 0xbc,
- 0x65, 0x92, 0x46, 0x3e, 0xfd, 0xa5, 0x1e, 0xbe, 0x1e, 0x2d, 0x4b, 0x3e,
- 0xf4, 0xd6, 0x6b, 0xbe, 0x74, 0x73, 0xd0, 0xbc, 0x67, 0x2f, 0x0d, 0x3d,
- 0x74, 0xf4, 0xdc, 0xba, 0xb4, 0x4a, 0x1f, 0xbe, 0x86, 0x6e, 0x49, 0xbe,
- 0xcd, 0x00, 0xb1, 0xbe, 0x2a, 0xe7, 0x9d, 0xbe, 0xcd, 0x31, 0x04, 0xbd,
- 0x65, 0x30, 0x2e, 0x3e, 0xfd, 0x5e, 0x18, 0x3e, 0x25, 0x14, 0xcb, 0xbd,
- 0xa8, 0xb4, 0xd3, 0xbc, 0xcf, 0xc8, 0x88, 0x3e, 0xd5, 0x2b, 0x82, 0xbd,
- 0x51, 0x2a, 0xa5, 0xbe, 0x12, 0xd1, 0xf9, 0xbc, 0xa3, 0x0d, 0x71, 0x3e,
- 0x35, 0xf8, 0x20, 0xbe, 0x87, 0xff, 0x3e, 0x3e, 0xb5, 0x9c, 0x3e, 0xbd,
- 0x5d, 0x85, 0xb4, 0xbe, 0xf2, 0xa1, 0xbd, 0x3d, 0xd4, 0xe6, 0xd8, 0xbd,
- 0x5b, 0xa0, 0xf6, 0xbe, 0xc5, 0xb4, 0x10, 0xbe, 0x54, 0x40, 0xc3, 0xbd,
- 0x5c, 0x67, 0xd8, 0x3d, 0x16, 0xf9, 0x7d, 0xbe, 0xba, 0x78, 0xf3, 0xbd,
- 0x32, 0x8f, 0x67, 0x3e, 0x95, 0xef, 0x8e, 0xbe, 0xc3, 0x5e, 0x96, 0x3d,
- 0x1c, 0x7b, 0x8e, 0x3d, 0xda, 0x3c, 0xdc, 0xbd, 0x8b, 0xb7, 0xb6, 0xbd,
- 0xb3, 0x9f, 0x16, 0xbe, 0x58, 0x3e, 0xd8, 0x3c, 0x7c, 0xb2, 0xf8, 0x3d,
- 0x9d, 0x55, 0x64, 0x3d, 0x31, 0xe2, 0x20, 0x3e, 0x7c, 0x0f, 0xd6, 0xbe,
- 0xe6, 0x77, 0xd8, 0xbd, 0x36, 0x8a, 0x94, 0x3d, 0x7a, 0x63, 0x0d, 0xbd,
- 0xbd, 0xb5, 0x40, 0xbe, 0x17, 0xae, 0xe1, 0xbd, 0x20, 0x49, 0x43, 0x3c,
- 0x41, 0x51, 0xdd, 0xbe, 0x4e, 0x80, 0xae, 0x3e, 0x9c, 0xb0, 0xba, 0xbe,
- 0xc7, 0x23, 0x14, 0xbe, 0x18, 0xf1, 0xbb, 0x3e, 0x4e, 0x9e, 0xc7, 0xbd,
- 0xbe, 0x1e, 0xaa, 0xbe, 0x9a, 0xaf, 0xfb, 0xbd, 0xb9, 0x9d, 0x04, 0xbe,
- 0xac, 0x69, 0x42, 0x3e, 0x0f, 0x56, 0xa0, 0x3e, 0x8e, 0x7e, 0x1a, 0xbd,
- 0x5c, 0x31, 0xca, 0xbd, 0xba, 0x0f, 0x03, 0x3b, 0x3f, 0x03, 0x01, 0xbd,
- 0x25, 0x4e, 0x21, 0xbe, 0xdb, 0xe0, 0x0b, 0x3e, 0x80, 0xbd, 0x92, 0xbe,
- 0xca, 0xfe, 0xaf, 0x3c, 0xe3, 0x80, 0xc2, 0xbe, 0xcc, 0x13, 0x52, 0xbd,
- 0x73, 0x69, 0x89, 0xbe, 0x1f, 0x99, 0xbf, 0x3d, 0xd4, 0x2a, 0xd5, 0xbd,
- 0x1d, 0xb5, 0xfb, 0xbe, 0x90, 0x12, 0x0d, 0xbf, 0xba, 0x0e, 0x34, 0xbd,
- 0x82, 0xce, 0x44, 0xbd, 0xc3, 0x04, 0x02, 0xbc, 0x25, 0x6d, 0x60, 0xbe,
- 0x34, 0xcb, 0x6d, 0x3d, 0x2e, 0x46, 0x4c, 0xbd, 0xd5, 0xfd, 0x8e, 0xbd,
- 0xcf, 0x65, 0x44, 0x3d, 0x3a, 0xa9, 0xf4, 0xbe, 0x0e, 0x3d, 0x8c, 0x3d,
- 0x65, 0xbb, 0xc3, 0xba, 0xab, 0x6b, 0xfe, 0x3c, 0x2d, 0xf6, 0x11, 0xbf,
- 0xca, 0x71, 0x84, 0xbd, 0x90, 0x48, 0x80, 0xbe, 0x7c, 0x1d, 0x3c, 0xbe,
- 0xf1, 0xad, 0xa4, 0xbe, 0x38, 0x70, 0xb3, 0x3d, 0x50, 0xb6, 0x3f, 0x3d,
- 0x76, 0xdf, 0x3d, 0xbe, 0x25, 0x5d, 0xd2, 0xbe, 0xff, 0x5a, 0x89, 0x3d,
- 0x79, 0x2e, 0x24, 0x3c, 0x54, 0x19, 0xdc, 0xba, 0x6e, 0xd3, 0x80, 0xbe,
- 0xc7, 0x58, 0x3d, 0xbe, 0x7f, 0x00, 0xd4, 0x3d, 0x6a, 0xa3, 0x14, 0xbf,
- 0x76, 0x3d, 0xc6, 0xbe, 0x64, 0xed, 0xd2, 0x3c, 0xd1, 0x29, 0x82, 0xbf,
- 0x12, 0x44, 0x45, 0x3e, 0x36, 0xd8, 0x35, 0xbc, 0xa7, 0x8d, 0x68, 0xbe,
- 0x14, 0x94, 0x37, 0x3e, 0x8b, 0x92, 0x0c, 0xbd, 0xcc, 0xc9, 0x98, 0xbc,
- 0xd6, 0x62, 0x89, 0xbe, 0x6d, 0xd9, 0xd3, 0xbd, 0x9b, 0xfa, 0x62, 0xbe,
- 0xe4, 0x45, 0x9d, 0xbd, 0x71, 0xad, 0x9d, 0x3c, 0x5f, 0x5e, 0x13, 0xbe,
- 0xad, 0x81, 0x27, 0xbe, 0x58, 0xbc, 0x84, 0x3e, 0x45, 0xd2, 0x0d, 0x3e,
- 0x37, 0x0b, 0x3f, 0x3e, 0xca, 0x44, 0x1c, 0xbc, 0x56, 0xce, 0xaa, 0x3d,
- 0x11, 0x92, 0xdf, 0x3c, 0xe7, 0x95, 0x02, 0xbe, 0x1d, 0x3d, 0xfd, 0xbe,
- 0x0a, 0xdc, 0x7f, 0xbc, 0x23, 0x02, 0xf3, 0xbd, 0x17, 0x0a, 0x90, 0xbd,
- 0x0b, 0xaa, 0x2c, 0x3e, 0xc6, 0x5b, 0xe2, 0xbd, 0x18, 0x4e, 0x33, 0xbe,
- 0x63, 0x8f, 0x3d, 0xbe, 0xf9, 0xd3, 0x28, 0x3e, 0x63, 0x52, 0xa3, 0xbe,
- 0xc9, 0x95, 0xe9, 0xbe, 0xc7, 0x98, 0xc6, 0xbc, 0x8a, 0xe4, 0xd2, 0xbd,
- 0xc7, 0x11, 0x71, 0xbd, 0x57, 0x7b, 0xb7, 0xbe, 0x17, 0xf1, 0x24, 0x3e,
- 0x97, 0x15, 0x90, 0x3d, 0xd4, 0xc1, 0xb0, 0x3d, 0xfd, 0xb5, 0xa0, 0x3d,
- 0x26, 0xf1, 0xcb, 0x3d, 0x0f, 0xac, 0x15, 0xbd, 0x48, 0xba, 0x35, 0xbe,
- 0x71, 0x3f, 0xa7, 0xbd, 0x53, 0x22, 0x10, 0x3c, 0x28, 0xbb, 0xcf, 0x3c,
- 0x1a, 0x1b, 0x46, 0x3e, 0x4d, 0xd7, 0xe4, 0xbe, 0x0a, 0x8a, 0x7e, 0xbd,
- 0x56, 0x78, 0x15, 0xbe, 0xe1, 0x6a, 0x7b, 0xbc, 0xf8, 0x26, 0xbf, 0xbe,
- 0x53, 0x77, 0xe1, 0x3b, 0x52, 0x9d, 0x10, 0xbe, 0x2f, 0x23, 0x4a, 0xbc,
- 0x3b, 0xdc, 0x51, 0xbe, 0x62, 0x04, 0x96, 0xbe, 0x94, 0x3f, 0x82, 0xbd,
- 0x17, 0xe3, 0x98, 0x3c, 0xd2, 0x82, 0x2c, 0xbd, 0xe2, 0xe9, 0x80, 0xbe,
- 0x82, 0x28, 0xd1, 0xbd, 0x6a, 0x36, 0x9a, 0x3b, 0xb2, 0x2a, 0x36, 0xbe,
- 0x3c, 0xdf, 0x19, 0xbc, 0x90, 0x84, 0x00, 0xbc, 0x1c, 0x3b, 0x9c, 0xbe,
- 0xb9, 0x30, 0xbb, 0xbe, 0x8f, 0x13, 0x0c, 0xbe, 0xbb, 0xf6, 0x19, 0xbe,
- 0x52, 0xac, 0x1d, 0xbd, 0xe2, 0xe3, 0xc0, 0x3c, 0x36, 0x49, 0x5b, 0xbe,
- 0x43, 0xec, 0x13, 0xbe, 0x82, 0x0c, 0x73, 0xbe, 0xad, 0x73, 0x5e, 0xbc,
- 0xd2, 0x60, 0x49, 0xbd, 0x90, 0x75, 0xa9, 0xbd, 0x08, 0x91, 0x23, 0xbe,
- 0x91, 0x7b, 0x1a, 0x3d, 0xfe, 0x74, 0xf0, 0xbd, 0x5e, 0x82, 0xc4, 0x3d,
- 0x25, 0x80, 0xf8, 0xbd, 0x35, 0xfb, 0x11, 0xbe, 0x26, 0x8e, 0x1a, 0x3d,
- 0x5f, 0x46, 0x60, 0xbb, 0x6d, 0xbd, 0xc7, 0x3d, 0xc9, 0x3d, 0x38, 0xbe,
- 0x59, 0x2e, 0xa6, 0x3d, 0xb5, 0x89, 0x86, 0x3d, 0x59, 0x72, 0xc6, 0x3d,
- 0x47, 0xf1, 0xe7, 0xbd, 0x53, 0x11, 0x27, 0x3e, 0x7e, 0xe7, 0x10, 0x3e,
- 0xb9, 0x7b, 0x90, 0xbd, 0x5d, 0x13, 0xa3, 0xbd, 0x36, 0xdf, 0x11, 0x3d,
- 0x1e, 0x56, 0x02, 0xbe, 0x3c, 0xe2, 0xa5, 0x3d, 0x40, 0x95, 0x76, 0xbc,
- 0xc0, 0x86, 0x71, 0xbd, 0xf7, 0xcb, 0x00, 0xbd, 0xaa, 0x41, 0xda, 0xbd,
- 0xe3, 0x82, 0xd7, 0x3c, 0xd8, 0xe9, 0x6e, 0x3d, 0xc0, 0xf4, 0x0a, 0xbe,
- 0xca, 0x69, 0x9b, 0xbd, 0xa4, 0x7a, 0xae, 0xbc, 0x7b, 0x40, 0xde, 0xbc,
- 0xce, 0xed, 0x20, 0x3e, 0xa8, 0x20, 0x91, 0x3d, 0x3a, 0x48, 0x12, 0x3e,
- 0xc6, 0x62, 0x22, 0x3d, 0xb0, 0x84, 0x05, 0x3b, 0x2b, 0x1f, 0x81, 0xbc,
- 0x97, 0x8a, 0x26, 0xbe, 0x1a, 0x03, 0x3a, 0xbe, 0x1a, 0xc6, 0x35, 0xbe,
- 0x13, 0xd0, 0xcc, 0x3d, 0x13, 0xad, 0x98, 0xbd, 0x0f, 0xe9, 0x5d, 0x3d,
- 0xa5, 0xa9, 0xe2, 0x3d, 0x59, 0xc8, 0xcf, 0x3d, 0x9e, 0x59, 0x06, 0x3e,
- 0x94, 0x43, 0xc9, 0x3c, 0xe8, 0xe4, 0xa0, 0xbd, 0x76, 0x8a, 0x9a, 0x3d,
- 0x3d, 0x1f, 0x32, 0xbd, 0xc5, 0x36, 0x81, 0x3d, 0xa6, 0x13, 0x99, 0xbd,
- 0x55, 0xdd, 0xc0, 0xbd, 0x85, 0x1f, 0x21, 0x3d, 0xbe, 0x22, 0x4b, 0x3d,
- 0xd9, 0x0b, 0x63, 0x3d, 0xad, 0xc4, 0x93, 0x3d, 0xe5, 0x70, 0xbe, 0x3c,
- 0x27, 0x9d, 0xfe, 0xbd, 0xd1, 0x96, 0x69, 0xbd, 0xa6, 0x6e, 0xce, 0xbd,
- 0x19, 0xd6, 0x0a, 0xbe, 0x3b, 0x94, 0x03, 0xbe, 0xf1, 0x72, 0x88, 0x3d,
- 0xc0, 0x73, 0x9a, 0xbd, 0x2c, 0x8c, 0xac, 0xbd, 0x6d, 0xa8, 0x93, 0x3d,
- 0xa8, 0x45, 0x2e, 0x3c, 0x93, 0x26, 0x21, 0x3d, 0x97, 0xd6, 0x49, 0x3e,
- 0x43, 0xc9, 0xe9, 0x3c, 0x06, 0x30, 0x10, 0x3e, 0xbf, 0x33, 0x2f, 0x3e,
- 0xc3, 0x58, 0x22, 0xbe, 0x3a, 0x61, 0xda, 0xbd, 0x47, 0xfb, 0xf6, 0x3d,
- 0x5f, 0x6e, 0x96, 0xbd, 0xc4, 0xf8, 0xb2, 0x3d, 0x71, 0xb9, 0xb4, 0x3c,
- 0xcc, 0xca, 0x02, 0xbe, 0x3f, 0xd5, 0x65, 0xbb, 0x4d, 0xe9, 0x09, 0x3c,
- 0xcf, 0x91, 0x2e, 0xbe, 0x3d, 0xa8, 0x08, 0xbe, 0xf8, 0xed, 0x06, 0x3e,
- 0xfa, 0x29, 0xbf, 0xbd, 0xa4, 0x49, 0x44, 0xbd, 0xe1, 0x80, 0xd3, 0xbd,
- 0xa9, 0x69, 0x20, 0xbe, 0x2f, 0xe9, 0xfa, 0xbd, 0xad, 0x7e, 0xfa, 0x3d,
- 0xeb, 0x22, 0x28, 0xbe, 0x32, 0xa1, 0x05, 0xbe, 0x47, 0x3e, 0xad, 0xbb,
- 0xbd, 0xb0, 0xc6, 0xbd, 0x4f, 0xef, 0xa3, 0x3c, 0x00, 0x64, 0x2b, 0x3e,
- 0x15, 0x24, 0x84, 0xbb, 0x9b, 0xeb, 0xa1, 0xbd, 0x63, 0xd5, 0x1e, 0xbe,
- 0x14, 0x7e, 0x70, 0x3d, 0xf1, 0x14, 0xe9, 0x3c, 0x10, 0xd1, 0xa5, 0xbb,
- 0xcb, 0x9a, 0xa1, 0x3d, 0x67, 0x68, 0xf0, 0x3c, 0xff, 0x8f, 0xe4, 0xbd,
- 0x65, 0x47, 0x12, 0xbe, 0xd2, 0x76, 0xd5, 0xbd, 0x68, 0x06, 0x37, 0xbe,
- 0x4a, 0x82, 0xee, 0x3d, 0xa3, 0xa4, 0xc4, 0xbc, 0x5d, 0x8c, 0x09, 0xbe,
- 0x2d, 0x85, 0xf8, 0xbc, 0x8d, 0xd8, 0x2f, 0xbd, 0x1c, 0x53, 0x29, 0x3d,
- 0xa5, 0xfc, 0x33, 0xbe, 0xcd, 0xef, 0x92, 0xbd, 0x7d, 0x2d, 0xa5, 0x3d,
- 0x93, 0xaa, 0x22, 0xbe, 0xf5, 0x6a, 0x26, 0x3e, 0x73, 0x0c, 0x02, 0xbe,
- 0x02, 0x75, 0x8c, 0x3d, 0x98, 0xab, 0x12, 0x3e, 0x15, 0x4c, 0xc3, 0xbe,
- 0x78, 0x6c, 0xa1, 0xbc, 0x60, 0x2e, 0x49, 0xbd, 0xb4, 0x89, 0x98, 0xbe,
- 0x81, 0x74, 0xa7, 0xbe, 0x9e, 0x65, 0x28, 0x3e, 0x26, 0x88, 0x67, 0x3d,
- 0x7d, 0x8e, 0xda, 0xbe, 0x08, 0x48, 0x1e, 0x3e, 0xd2, 0x83, 0x90, 0xbd,
- 0xc3, 0x22, 0x17, 0xbe, 0xb9, 0x7b, 0x0b, 0xbf, 0x41, 0xb0, 0x79, 0xbd,
- 0xd3, 0x2c, 0xcf, 0xbe, 0x40, 0x44, 0x6f, 0x3d, 0x32, 0x5b, 0x75, 0xbe,
- 0x28, 0x6c, 0x55, 0xbe, 0xcf, 0xe8, 0xc1, 0x3d, 0x84, 0x3c, 0x89, 0xbd,
- 0x02, 0xda, 0xd9, 0xbe, 0xe8, 0x91, 0x07, 0x3e, 0xe1, 0xc1, 0xe5, 0xbc,
- 0x87, 0xef, 0x29, 0x3e, 0x06, 0xcf, 0x8c, 0xbc, 0xff, 0xd7, 0xbd, 0x3c,
- 0x87, 0x43, 0xf2, 0x3d, 0x60, 0xab, 0x42, 0xbe, 0xfb, 0xeb, 0xd0, 0xbe,
- 0x10, 0x3e, 0x95, 0xbe, 0xbe, 0x07, 0xa4, 0x3d, 0xe1, 0x46, 0xc8, 0x3c,
- 0x37, 0x8f, 0xd1, 0xbe, 0xd4, 0x6c, 0x5f, 0x3d, 0x0e, 0xac, 0xfb, 0xbe,
- 0x6e, 0xea, 0x1c, 0xbe, 0xbd, 0x44, 0x51, 0xbe, 0xf1, 0x1d, 0xbb, 0x3c,
- 0xab, 0xd4, 0x1c, 0x3e, 0xdf, 0x6e, 0x91, 0xbe, 0xee, 0x64, 0x63, 0xbe,
- 0x3e, 0xb6, 0xc1, 0x3c, 0xf9, 0x99, 0x1f, 0xbe, 0xd3, 0x71, 0x66, 0x3d,
- 0x1b, 0x89, 0xc7, 0x3d, 0xa4, 0xb9, 0xa0, 0xbe, 0x26, 0x34, 0x10, 0xbe,
- 0x7e, 0x5d, 0x2d, 0x3e, 0xa8, 0x57, 0x10, 0x3e, 0x7b, 0xa3, 0x84, 0xbe,
- 0x5d, 0x91, 0x61, 0x3e, 0xc5, 0x20, 0x7f, 0x3e, 0xb7, 0x84, 0xd7, 0xbc,
- 0x79, 0x5e, 0xc7, 0x3c, 0x01, 0xaf, 0x88, 0xbe, 0x43, 0x9f, 0x93, 0xbb,
- 0x97, 0xcb, 0x00, 0xbf, 0x81, 0x92, 0x28, 0x3d, 0x30, 0x35, 0xd6, 0xbe,
- 0xad, 0xff, 0x17, 0xbe, 0x3b, 0x9d, 0x27, 0xbd, 0x5e, 0x33, 0x2e, 0xbe,
- 0xa7, 0x07, 0xc3, 0xbc, 0x22, 0x9b, 0x08, 0xbf, 0xfd, 0xdf, 0xa4, 0xbe,
- 0x4b, 0xa7, 0x9f, 0xbe, 0x66, 0x54, 0xd9, 0xbd, 0x84, 0xcf, 0xc5, 0x3d,
- 0x00, 0xed, 0x81, 0x3e, 0xa0, 0xca, 0x72, 0x3d, 0xd5, 0x98, 0x84, 0xbe,
- 0xa6, 0x55, 0x91, 0xbe, 0x9b, 0xf7, 0x20, 0xbe, 0x31, 0xac, 0x60, 0xbd,
- 0x64, 0x3e, 0xe1, 0x3d, 0x06, 0xc5, 0x4b, 0xbe, 0xf4, 0x08, 0x7b, 0xbe,
- 0x24, 0x7a, 0x0e, 0xba, 0xe2, 0x5f, 0xb2, 0xbc, 0xf6, 0xf7, 0x0d, 0xbe,
- 0xac, 0x80, 0x69, 0x3e, 0x78, 0xa4, 0x5e, 0xbd, 0x94, 0xfd, 0x39, 0x3e,
- 0xcd, 0x25, 0x20, 0xbd, 0x8f, 0x26, 0xc7, 0xbe, 0x85, 0x73, 0x57, 0x3d,
- 0x1a, 0x33, 0x31, 0xbe, 0xc6, 0xfe, 0x25, 0xbe, 0x0c, 0xad, 0xee, 0xbe,
- 0x97, 0x3d, 0x9f, 0x3d, 0x3a, 0x0f, 0x50, 0xbe, 0x4e, 0x43, 0xa3, 0x3d,
- 0xc8, 0xfc, 0xc1, 0xbd, 0xdc, 0xab, 0xd0, 0xbe, 0x88, 0x83, 0x08, 0xbd,
- 0x03, 0x4f, 0x90, 0xbe, 0x6b, 0x98, 0xaa, 0xbe, 0xd2, 0xa9, 0xe5, 0xbc,
- 0xd3, 0x0d, 0x0c, 0xbe, 0xc4, 0x0b, 0x08, 0x3e, 0x77, 0x98, 0x46, 0x3e,
- 0xdf, 0x8d, 0x2e, 0xbe, 0xd2, 0xdd, 0xc9, 0xbd, 0x7f, 0x1a, 0xa9, 0xbc,
- 0xe4, 0x41, 0xb1, 0xbd, 0x02, 0x60, 0xd9, 0x3c, 0x28, 0x58, 0x65, 0xbc,
- 0x16, 0xcc, 0xab, 0xbd, 0x67, 0x62, 0xd4, 0xbd, 0xa3, 0xb3, 0x17, 0xbd,
- 0x02, 0xeb, 0x54, 0xbe, 0x5d, 0x30, 0xdc, 0x3d, 0x66, 0xe8, 0x3f, 0xbe,
- 0xf0, 0x17, 0xa2, 0xbd, 0x67, 0xb6, 0x49, 0xbe, 0xb3, 0x02, 0x05, 0x3e,
- 0x5e, 0xac, 0xd2, 0x3c, 0xd2, 0x9a, 0xd1, 0x3d, 0xcd, 0xa8, 0xda, 0xbe,
- 0x43, 0xdd, 0x3c, 0xbd, 0xac, 0xda, 0x99, 0x3d, 0x46, 0x2b, 0x73, 0xbd,
- 0x42, 0x4e, 0x84, 0x3e, 0x17, 0x42, 0x16, 0xbe, 0xb4, 0xb1, 0xd3, 0x3d,
- 0x44, 0x08, 0x95, 0x3e, 0x6c, 0xe8, 0xe4, 0xbd, 0x88, 0xb5, 0x8b, 0xbe,
- 0xcf, 0x98, 0xd2, 0xbe, 0x11, 0x4b, 0x44, 0xbb, 0xb0, 0xbe, 0x6c, 0xbb,
- 0x8f, 0x00, 0xe0, 0x3d, 0xf9, 0xf0, 0x6f, 0x3e, 0x25, 0x22, 0xb4, 0xbe,
- 0x98, 0xee, 0xf6, 0xbd, 0x81, 0x88, 0xe4, 0xbd, 0x1b, 0xca, 0xa1, 0xbe,
- 0x6d, 0x2d, 0xde, 0xbd, 0xe5, 0x4b, 0xda, 0x3e, 0x9a, 0x78, 0x79, 0xbe,
- 0x5d, 0x57, 0xdc, 0xbb, 0x25, 0x3a, 0x8c, 0x3d, 0xd6, 0x0d, 0x0f, 0xbe,
- 0xe5, 0x44, 0x17, 0x3e, 0x10, 0x0e, 0x9c, 0x3d, 0xcd, 0xce, 0x81, 0x3b,
- 0x3d, 0xc8, 0x10, 0xbe, 0x90, 0x23, 0x78, 0x3e, 0x6c, 0x0c, 0xb5, 0xbd,
- 0x91, 0x69, 0xaa, 0x3d, 0x9e, 0xe4, 0xc0, 0xbd, 0x91, 0x5a, 0x2e, 0xbb,
- 0x79, 0xd0, 0xb2, 0xbe, 0xef, 0x83, 0x06, 0x3e, 0xa0, 0x51, 0x3e, 0xbe,
- 0xee, 0xbd, 0x98, 0xbc, 0xe7, 0x9a, 0xf5, 0xbd, 0x63, 0x84, 0x38, 0x3c,
- 0xb3, 0x74, 0x48, 0x3d, 0x3c, 0x41, 0x7b, 0x3e, 0xd0, 0x43, 0x19, 0x3d,
- 0xe2, 0xfc, 0xba, 0x3a, 0xcd, 0x5d, 0xb4, 0xbc, 0xf0, 0x58, 0xf9, 0x3c,
- 0x69, 0x1e, 0xc0, 0x3e, 0x32, 0x50, 0xdc, 0x3c, 0xe6, 0x92, 0xb7, 0xbc,
- 0x1a, 0x84, 0x5a, 0xbe, 0x43, 0x39, 0x47, 0xbc, 0x16, 0x09, 0x0c, 0xbe,
- 0x39, 0x3f, 0x39, 0xbe, 0xd2, 0x9d, 0xe8, 0xbd, 0x7d, 0x5d, 0x05, 0xbe,
- 0x18, 0x52, 0x8d, 0xbd, 0xb8, 0xad, 0x9c, 0x3d, 0x39, 0x2c, 0x20, 0xbd,
- 0x92, 0xee, 0x80, 0xbe, 0xca, 0x53, 0xaf, 0xbc, 0xe4, 0x37, 0xb8, 0x3c,
- 0xd5, 0x4e, 0x1f, 0x3e, 0x13, 0x55, 0xa5, 0xbe, 0xc8, 0xf8, 0x10, 0xbe,
- 0x86, 0xa1, 0x37, 0x3e, 0x14, 0xac, 0xcc, 0x3d, 0x25, 0x58, 0x80, 0x3c,
- 0xa2, 0xd6, 0x76, 0x3e, 0x5d, 0x58, 0x86, 0xbd, 0x44, 0x61, 0xa3, 0xbe,
- 0x09, 0xff, 0xd0, 0x3d, 0xb4, 0x3c, 0xde, 0x3d, 0xbc, 0x6e, 0x36, 0xbe,
- 0x2f, 0xde, 0xd6, 0xbe, 0x20, 0x8f, 0x01, 0xbe, 0xce, 0x41, 0xd8, 0xbd,
- 0xe1, 0x47, 0x34, 0x3b, 0x5d, 0xd3, 0x2a, 0x3e, 0xd5, 0x94, 0xa9, 0x3e,
- 0xa2, 0x3a, 0x76, 0xbe, 0x7b, 0x81, 0xa2, 0xbd, 0xa8, 0x72, 0x60, 0xbe,
- 0x2f, 0xa4, 0x88, 0x3e, 0xb0, 0xb2, 0x3b, 0x3e, 0x45, 0xa4, 0x17, 0x3d,
- 0xc1, 0x51, 0x04, 0xbf, 0xeb, 0x14, 0x1c, 0xbd, 0x01, 0xd5, 0xbc, 0xbd,
- 0xb4, 0x37, 0x01, 0xbe, 0x0b, 0x54, 0x06, 0xbe, 0xe5, 0x70, 0xdf, 0xbd,
- 0x8c, 0xfc, 0x70, 0xbe, 0x63, 0x46, 0xb4, 0x3d, 0x51, 0xb8, 0x97, 0xbd,
- 0x0a, 0x4b, 0x14, 0xbc, 0xa6, 0x6d, 0xd7, 0x3d, 0xc1, 0xa4, 0xec, 0x3c,
- 0xee, 0x33, 0x98, 0x3c, 0xb7, 0x80, 0x06, 0x3d, 0x5d, 0x4d, 0x3a, 0xbc,
- 0xdc, 0x7c, 0x63, 0xbe, 0x91, 0x08, 0x34, 0xbe, 0xaa, 0x79, 0xe2, 0x3d,
- 0x6b, 0xef, 0xa1, 0xbe, 0xa4, 0x66, 0x2d, 0x3c, 0xde, 0x15, 0x5e, 0x3c,
- 0x58, 0x0a, 0x8b, 0x3d, 0xd6, 0x3a, 0x58, 0x3e, 0xd9, 0xa4, 0xc6, 0x3c,
- 0xaa, 0x70, 0x81, 0x3c, 0x94, 0xec, 0xf4, 0x3d, 0xb3, 0xc1, 0x0b, 0xbf,
- 0xdd, 0x3f, 0x6a, 0x3d, 0x5b, 0x28, 0x14, 0xbe, 0x4b, 0xca, 0x49, 0x3c,
- 0x71, 0x50, 0x33, 0xbe, 0x1a, 0x7a, 0xb3, 0xbe, 0x43, 0x26, 0x51, 0x3e,
- 0xe1, 0xb2, 0xa3, 0xb9, 0x24, 0xa2, 0x61, 0xbe, 0x65, 0x1a, 0xba, 0x3d,
- 0x09, 0x69, 0x2e, 0xbd, 0x4e, 0x43, 0x6f, 0xbe, 0x15, 0x26, 0xba, 0xbe,
- 0x9b, 0x7b, 0xe7, 0xbd, 0x45, 0xf5, 0xc8, 0xbd, 0xf3, 0xcb, 0x35, 0xbc,
- 0xad, 0x8d, 0xe3, 0xbd, 0x15, 0xc5, 0x97, 0xbd, 0x95, 0xd5, 0xdc, 0x3d,
- 0x07, 0x37, 0xba, 0x3d, 0x25, 0x04, 0x2c, 0xbd, 0x87, 0x04, 0x9d, 0x3c,
- 0x2d, 0x15, 0xab, 0x3d, 0x3e, 0x47, 0x99, 0x3d, 0x6b, 0xdb, 0xa8, 0x3b,
- 0x4a, 0xec, 0xca, 0x3d, 0x5d, 0xc3, 0x20, 0x3e, 0x8d, 0x70, 0x11, 0xbe,
- 0x45, 0x31, 0xdb, 0x3d, 0x8b, 0x0c, 0xa1, 0xbd, 0x59, 0xab, 0x62, 0xbc,
- 0xce, 0x0b, 0x9f, 0x3d, 0xd9, 0xb2, 0xf2, 0xbd, 0xca, 0x08, 0x31, 0x3c,
- 0xb6, 0x20, 0xf7, 0xbd, 0x6a, 0xa3, 0x7a, 0x3c, 0x55, 0x56, 0x9e, 0x3d,
- 0x48, 0xa9, 0xd2, 0xbc, 0x7d, 0x63, 0x1d, 0x3e, 0x5a, 0x17, 0x7d, 0xbd,
- 0x7e, 0xd0, 0x28, 0xbd, 0xec, 0x49, 0xd8, 0x3c, 0xe8, 0x6c, 0x57, 0x3d,
- 0x54, 0x6e, 0x8b, 0x3c, 0x8d, 0x09, 0x03, 0xbe, 0x7e, 0xc4, 0x72, 0x3c,
- 0x5d, 0x02, 0x00, 0x3e, 0x28, 0xd1, 0x96, 0x3c, 0xbb, 0xad, 0xb3, 0x3d,
- 0xbc, 0x9a, 0x23, 0xbe, 0x32, 0xff, 0x16, 0xbe, 0xcf, 0x19, 0xd0, 0xbd,
- 0xda, 0x22, 0xfc, 0xba, 0xf4, 0x11, 0x3a, 0x3d, 0xc6, 0x23, 0x83, 0xbc,
- 0xf9, 0x94, 0xb0, 0x3d, 0x2f, 0x37, 0xa4, 0xbd, 0x41, 0xbf, 0x8e, 0xbd,
- 0x43, 0x23, 0x07, 0x3e, 0x72, 0x3e, 0x80, 0xbd, 0x0f, 0x44, 0xb9, 0x3d,
- 0x06, 0xb3, 0x6f, 0x3d, 0x26, 0x2f, 0xe9, 0x3d, 0x2f, 0x23, 0x99, 0xbd,
- 0x7c, 0x19, 0x0a, 0xbe, 0xf5, 0x62, 0x2c, 0xbc, 0xa0, 0x66, 0x20, 0xbd,
- 0x06, 0x60, 0x25, 0x3e, 0xb1, 0x6f, 0xba, 0xbb, 0xd3, 0xfb, 0xc5, 0x3c,
- 0x71, 0x61, 0xa1, 0xbc, 0xd4, 0x0f, 0xc0, 0xbd, 0x71, 0xe3, 0xff, 0xba,
- 0x18, 0x3c, 0x5b, 0xbd, 0x96, 0x1b, 0x0e, 0x3d, 0xaf, 0x10, 0xa4, 0xbd,
- 0x96, 0xcd, 0x05, 0x3c, 0x72, 0x83, 0xec, 0x3d, 0xfc, 0xa7, 0xf9, 0x3b,
- 0x44, 0x07, 0xea, 0x3d, 0xbd, 0xd5, 0x99, 0xbb, 0x79, 0xa8, 0x88, 0x3d,
- 0x02, 0xeb, 0x14, 0xbe, 0x96, 0x63, 0x30, 0x3c, 0xc9, 0xf2, 0x08, 0x3e,
- 0x0d, 0xd6, 0xa0, 0xbd, 0x68, 0x25, 0xc4, 0xbc, 0xe7, 0x80, 0xf7, 0xbd,
- 0x64, 0x3a, 0xbe, 0x3d, 0xdb, 0xbc, 0x1f, 0xbe, 0x90, 0xb2, 0xf5, 0x3d,
- 0xf8, 0x9e, 0x00, 0xbe, 0xa3, 0x18, 0x01, 0xbe, 0x49, 0x18, 0x40, 0x3d,
- 0x95, 0xb6, 0x2f, 0xbd, 0x31, 0x0d, 0x49, 0xbc, 0x16, 0xbc, 0x54, 0x3d,
- 0x0c, 0x39, 0x1d, 0xbe, 0x0d, 0x3a, 0xf6, 0x3d, 0xef, 0x1d, 0x5c, 0x3d,
- 0xf3, 0x5e, 0xb3, 0xbd, 0x40, 0x03, 0xc2, 0x3b, 0x66, 0x1b, 0xa4, 0xbd,
- 0xa0, 0x1e, 0x0d, 0x3e, 0x08, 0x0c, 0x1a, 0x3e, 0xc2, 0x07, 0xdb, 0x3d,
- 0x6a, 0x87, 0xeb, 0x3c, 0x46, 0x17, 0x5f, 0xbd, 0x89, 0xfa, 0x04, 0x3d,
- 0xec, 0x20, 0x15, 0xbe, 0x3a, 0xaf, 0x9b, 0x3c, 0xda, 0xca, 0xdc, 0xbc,
- 0x71, 0x0d, 0xec, 0xbc, 0x8b, 0x25, 0x13, 0x3d, 0x30, 0xa1, 0x66, 0x3d,
- 0xe9, 0x85, 0xb1, 0x3d, 0x39, 0x31, 0x1b, 0xbe, 0x95, 0xa9, 0x1f, 0x3e,
- 0xe0, 0x7e, 0xd9, 0xbd, 0x59, 0x1c, 0x03, 0x3e, 0xdb, 0xb5, 0x03, 0x3e,
- 0xb8, 0x22, 0x8a, 0x3d, 0x09, 0xd4, 0x5a, 0x3d, 0xf2, 0x6c, 0xdb, 0xbd,
- 0x02, 0xe7, 0x09, 0xbc, 0xdf, 0xaf, 0xbe, 0x3d, 0x33, 0xd2, 0x1d, 0x3e,
- 0x1d, 0xbc, 0xe7, 0xbc, 0xc0, 0xb0, 0x2b, 0x3d, 0x91, 0x69, 0xcf, 0x3d,
- 0x7b, 0x15, 0x8c, 0xbd, 0xda, 0xc3, 0x11, 0xbe, 0x39, 0x66, 0x21, 0x3d,
- 0xa2, 0x03, 0x11, 0xbe, 0x65, 0xff, 0x0a, 0x3c, 0x0c, 0x4a, 0x01, 0xbd,
- 0x15, 0x0c, 0xe2, 0xbc, 0xa1, 0xfc, 0x9c, 0x3d, 0xd9, 0xd2, 0xbe, 0x3d,
- 0x35, 0x63, 0xd3, 0xbd, 0xd2, 0xdf, 0xdc, 0x3c, 0x9b, 0xe7, 0x46, 0x3e,
- 0x9e, 0xc8, 0x02, 0x3e, 0xa2, 0x8c, 0x5e, 0x3c, 0x5c, 0xd8, 0x38, 0xbe,
- 0x63, 0x48, 0x29, 0xbe, 0xf2, 0x8f, 0xca, 0xbc, 0x5e, 0xaf, 0x29, 0x3e,
- 0xdb, 0x92, 0x16, 0x3d, 0xaf, 0x4b, 0xc2, 0x3d, 0x85, 0x64, 0x6f, 0x3d,
- 0xd4, 0xa2, 0xda, 0x3d, 0xb8, 0x14, 0x16, 0xbc, 0x07, 0x17, 0x8c, 0x3d,
- 0x8f, 0x3d, 0x0e, 0xbe, 0x77, 0x22, 0x9c, 0xbd, 0xb8, 0x9b, 0xee, 0x3d,
- 0x0c, 0x3e, 0x48, 0x3e, 0x22, 0xe8, 0x54, 0xbe, 0x04, 0x03, 0xe8, 0x3c,
- 0xd9, 0xce, 0x3e, 0xbe, 0x5a, 0xc3, 0x18, 0x3e, 0xe4, 0x78, 0xfa, 0x3d,
- 0xb6, 0x5c, 0x69, 0xbc, 0x46, 0x0e, 0xc6, 0xbd, 0x5d, 0x5a, 0xac, 0x3d,
- 0xbd, 0xad, 0xe8, 0x3d, 0x6a, 0x88, 0x85, 0x3c, 0x64, 0xfe, 0x88, 0xbd,
- 0xf6, 0x63, 0x83, 0x3c, 0x35, 0x6d, 0x20, 0x3d, 0xf2, 0x4b, 0xbf, 0xbc,
- 0xde, 0x0b, 0x6e, 0x3d, 0x07, 0x62, 0xc2, 0xbc, 0x1e, 0xbc, 0xaf, 0xbc,
- 0xda, 0xef, 0x2b, 0xbd, 0xf0, 0x9f, 0xb6, 0xb9, 0xcd, 0x37, 0x46, 0xbd,
- 0x23, 0x3e, 0x17, 0xbd, 0x47, 0x3f, 0x92, 0xbd, 0xe4, 0x10, 0xf4, 0xbd,
- 0xd3, 0x66, 0x8e, 0x3d, 0x4e, 0xab, 0x4c, 0xbe, 0x45, 0x03, 0x3f, 0xbe,
- 0xf8, 0xc6, 0x69, 0x3c, 0x58, 0xcc, 0x92, 0x3d, 0x4b, 0x62, 0x0c, 0xbd,
- 0xbe, 0xab, 0x72, 0xbc, 0x70, 0x1a, 0x66, 0x3d, 0xcb, 0x27, 0x0c, 0x3e,
- 0x61, 0xc5, 0x63, 0xbe, 0x4f, 0x5c, 0x0c, 0xbd, 0xb5, 0x2f, 0x32, 0xbe,
- 0xa1, 0xdb, 0x2b, 0x3d, 0x1b, 0x61, 0x08, 0xbd, 0x27, 0xfb, 0xf4, 0xbb,
- 0x3c, 0xfc, 0x18, 0xbd, 0x38, 0x25, 0x33, 0x3d, 0x7b, 0x3c, 0x91, 0x3d,
- 0xfb, 0x17, 0xb8, 0x3d, 0x10, 0x74, 0x71, 0xbd, 0x35, 0x11, 0xbd, 0xbd,
- 0xdc, 0x29, 0xf7, 0xbd, 0x60, 0x7e, 0x19, 0xbe, 0x43, 0x34, 0x0b, 0x3e,
- 0x00, 0xc1, 0x18, 0xbe, 0x63, 0x64, 0xd6, 0xbd, 0xd2, 0x07, 0xe9, 0xbd,
- 0xe5, 0xb8, 0x00, 0xbd, 0x5c, 0x1d, 0x36, 0xbc, 0x83, 0x3f, 0xaa, 0x3d,
- 0xe4, 0x0f, 0xec, 0x3c, 0xfc, 0x62, 0x88, 0xbd, 0x1a, 0x9b, 0x33, 0xbe,
- 0xac, 0xec, 0x02, 0xbe, 0x36, 0x58, 0xb7, 0xbc, 0xcf, 0xf3, 0xc1, 0xbd,
- 0xf8, 0x10, 0xc4, 0xbe, 0x09, 0x96, 0x85, 0xbe, 0xb2, 0x36, 0x9c, 0x3d,
- 0xac, 0xd7, 0x43, 0xbb, 0x1e, 0x32, 0xc9, 0x3b, 0x01, 0xfd, 0x0d, 0x3c,
- 0xa4, 0x55, 0x9f, 0xbb, 0x98, 0xad, 0x90, 0xbd, 0x1e, 0x84, 0x20, 0xbd,
- 0xb5, 0xf5, 0x85, 0x3d, 0x5c, 0x58, 0x3b, 0xbd, 0x01, 0x98, 0x9d, 0xbe,
- 0xde, 0x8d, 0xb7, 0x3d, 0xd9, 0x5e, 0xc2, 0xbd, 0x2d, 0xa3, 0x00, 0xbe,
- 0x6b, 0x4e, 0x0b, 0x3e, 0xc1, 0x9a, 0x18, 0x3b, 0x5d, 0x5e, 0x8c, 0x3d,
- 0x49, 0x17, 0xa2, 0xbd, 0x1e, 0x14, 0x07, 0x3e, 0x5f, 0xd9, 0x90, 0x3c,
- 0xb8, 0xe7, 0x8c, 0xbc, 0x4b, 0xe0, 0xc6, 0x3d, 0x62, 0x0e, 0x43, 0xbe,
- 0x16, 0xcc, 0x36, 0xbe, 0x76, 0x3a, 0xd0, 0xbc, 0xe1, 0x68, 0x96, 0xbe,
- 0x0a, 0x20, 0xe7, 0x3d, 0x8c, 0x80, 0xc8, 0xbd, 0x98, 0xe4, 0x3e, 0xbd,
- 0xe8, 0xc3, 0x39, 0x3e, 0x91, 0x4f, 0x31, 0x3c, 0x3e, 0xc0, 0x8d, 0xbd,
- 0x04, 0xa8, 0x50, 0x3a, 0x3d, 0xd6, 0x4c, 0x3d, 0xc3, 0x51, 0x10, 0x3e,
- 0xe9, 0xa4, 0x97, 0x3b, 0x84, 0xb9, 0xa1, 0xbd, 0xf1, 0xb3, 0x14, 0x3e,
- 0x7c, 0x8a, 0x25, 0xbe, 0xe5, 0x56, 0x29, 0xbe, 0xb0, 0xba, 0xd5, 0xbc,
- 0x69, 0xd6, 0xf9, 0xbd, 0xaf, 0x45, 0x85, 0xbe, 0x72, 0x40, 0xf7, 0xbc,
- 0xc2, 0xb1, 0xa9, 0xbd, 0x21, 0x11, 0xef, 0xbd, 0x3c, 0x8f, 0x58, 0xbe,
- 0xa8, 0xf5, 0x8e, 0x3d, 0xb9, 0x67, 0x71, 0x3c, 0xc0, 0xf3, 0x2c, 0xbc,
- 0xf0, 0xde, 0x25, 0xbd, 0x41, 0xe2, 0x9f, 0x3e, 0xb2, 0xcc, 0xf7, 0x3d,
- 0x52, 0xe5, 0xc0, 0xbe, 0x4c, 0xc3, 0xbc, 0xbd, 0x2a, 0xea, 0x57, 0x3e,
- 0xa3, 0xa1, 0xbb, 0xbd, 0xf6, 0xe0, 0xd7, 0x3e, 0x3b, 0x58, 0x77, 0xbe,
- 0x4c, 0x73, 0x5f, 0x3c, 0x7f, 0x99, 0x6f, 0x3d, 0x3f, 0x1e, 0x0b, 0xbd,
- 0x83, 0x9f, 0x84, 0xbd, 0x5e, 0x39, 0x9e, 0x3d, 0x1b, 0x6a, 0x07, 0x3e,
- 0xe9, 0x4a, 0xe4, 0xb9, 0xdf, 0xda, 0x01, 0x3e, 0x96, 0x3c, 0xa0, 0x3e,
- 0xe2, 0x8a, 0x0c, 0xbe, 0x11, 0x8f, 0x08, 0xbf, 0xd6, 0x02, 0x30, 0x3e,
- 0xad, 0x76, 0x31, 0xbd, 0x8e, 0x8c, 0xe9, 0xbd, 0xeb, 0x37, 0x56, 0x3e,
- 0x07, 0xe2, 0x7e, 0xbe, 0xdc, 0x8d, 0xe7, 0x3e, 0x09, 0x03, 0xa0, 0xbe,
- 0x83, 0x30, 0x4b, 0x3d, 0xe3, 0xea, 0x46, 0xbe, 0xf2, 0x48, 0x4f, 0xbd,
- 0x78, 0x31, 0x57, 0x3e, 0xc1, 0x22, 0x35, 0x3e, 0x92, 0xb9, 0xa1, 0xbe,
- 0x8a, 0xe1, 0xc2, 0xbc, 0xf1, 0x42, 0xef, 0x3d, 0xc4, 0xcc, 0xdc, 0xbd,
- 0x1c, 0x2d, 0xa9, 0x3d, 0x84, 0x9d, 0x19, 0x3e, 0x17, 0xda, 0x3d, 0x3d,
- 0xbf, 0x44, 0x43, 0x3c, 0x6e, 0x6c, 0xf5, 0x3c, 0xda, 0xc2, 0x58, 0xbe,
- 0xa2, 0x10, 0x67, 0x3c, 0xd1, 0x32, 0xee, 0xbd, 0x02, 0x3c, 0x14, 0xbe,
- 0xe7, 0xfc, 0x0f, 0x3f, 0x2b, 0x70, 0x5f, 0x3e, 0x26, 0x0a, 0xa1, 0xbe,
- 0x5b, 0x0d, 0x55, 0x3d, 0xb8, 0x6b, 0xfc, 0x3e, 0x5f, 0x8c, 0xce, 0xbd,
- 0xe5, 0x96, 0xbe, 0x3d, 0xc2, 0xa6, 0xab, 0xbd, 0x2c, 0x1a, 0x3f, 0x3e,
- 0x0c, 0x39, 0x8a, 0x3e, 0xb9, 0x7c, 0xb6, 0xbd, 0x66, 0xc3, 0x40, 0xbe,
- 0x47, 0xf8, 0xff, 0xbd, 0x41, 0x90, 0xb4, 0xbe, 0x01, 0x3d, 0xaf, 0x3c,
- 0x9b, 0xa9, 0xa1, 0x3e, 0x84, 0xe7, 0x3b, 0x3d, 0xfb, 0xac, 0xe1, 0x3d,
- 0x01, 0x2e, 0x1a, 0x3f, 0x9d, 0xbd, 0x2c, 0x3e, 0x50, 0xa0, 0xd6, 0xbe,
- 0x5a, 0x03, 0xa4, 0x3e, 0x48, 0x41, 0xe6, 0x3b, 0xf1, 0x38, 0xb8, 0xbe,
- 0xe9, 0x87, 0xf3, 0x3d, 0x53, 0x8d, 0xc3, 0x3e, 0x76, 0xdb, 0xba, 0x3e,
- 0x39, 0x13, 0x13, 0x3f, 0x26, 0x8f, 0x82, 0xbe, 0xd3, 0x77, 0x73, 0x3d,
- 0xe2, 0x6e, 0x8d, 0x3a, 0xc7, 0x77, 0x03, 0xbd, 0xd1, 0xbf, 0xb0, 0xbd,
- 0x5a, 0x40, 0x55, 0xbf, 0x8d, 0x1a, 0x5d, 0xbd, 0x32, 0xf5, 0x3c, 0x3e,
- 0xeb, 0x92, 0x9b, 0xbd, 0x00, 0x37, 0x68, 0xbe, 0x29, 0x19, 0xb5, 0xbd,
- 0x3a, 0x47, 0x67, 0x3d, 0x85, 0x20, 0xa5, 0x3d, 0xcf, 0x23, 0xd2, 0xbd,
- 0x41, 0x0f, 0x02, 0x3f, 0x56, 0x06, 0x7b, 0x3e, 0xca, 0xb8, 0xff, 0x3d,
- 0x58, 0x24, 0x58, 0x3e, 0x2f, 0x9d, 0x2d, 0xbd, 0x2e, 0xce, 0x92, 0x3e,
- 0x5a, 0xb2, 0xda, 0xbd, 0x79, 0x76, 0x77, 0x3e, 0xfb, 0x4c, 0xdf, 0xbc,
- 0xbf, 0xa9, 0x54, 0x3e, 0x0a, 0xdf, 0x98, 0x3d, 0x51, 0x88, 0x8f, 0x3d,
- 0xb9, 0x72, 0x28, 0xbd, 0xe0, 0xc4, 0x5c, 0xbe, 0xf5, 0xe2, 0x25, 0xbe,
- 0xb6, 0xdb, 0xdd, 0x3c, 0x30, 0x7d, 0xca, 0xbd, 0xca, 0x72, 0x27, 0xbd,
- 0xd9, 0xf4, 0x3f, 0x3d, 0xe7, 0xda, 0xca, 0x3e, 0x29, 0x24, 0xe9, 0x3e,
- 0x58, 0xae, 0xcd, 0xbe, 0x57, 0xc7, 0x9d, 0xbe, 0xd4, 0x90, 0x7a, 0xbe,
- 0xa8, 0xbf, 0x4a, 0xbc, 0x1a, 0x05, 0x33, 0x3e, 0x82, 0x69, 0xc9, 0x3e,
- 0xf3, 0x67, 0x3c, 0xbe, 0x0c, 0x67, 0xb9, 0xbc, 0x9c, 0x2f, 0xa7, 0x3c,
- 0x4c, 0x5b, 0xcc, 0x3c, 0xe7, 0xdb, 0xd3, 0x3b, 0x31, 0x50, 0xc6, 0xbd,
- 0x0a, 0x64, 0x6f, 0xbd, 0xf7, 0xc1, 0xf4, 0x3c, 0x4f, 0x2b, 0xbd, 0x3d,
- 0x7e, 0xbd, 0xcd, 0x3e, 0x93, 0xed, 0x8c, 0xbd, 0xbf, 0x57, 0x4e, 0x3e,
- 0xf9, 0x44, 0x2c, 0xbe, 0x44, 0xfc, 0x07, 0xbe, 0x7f, 0x4d, 0xf1, 0xbd,
- 0x97, 0x93, 0xdb, 0x3d, 0x09, 0x87, 0x0a, 0x3e, 0x7d, 0x44, 0x8b, 0x3d,
- 0x06, 0xaf, 0x10, 0xbe, 0xb1, 0x7f, 0x30, 0xbd, 0x3a, 0xd0, 0x95, 0x3d,
- 0xf9, 0xf2, 0x8b, 0x3d, 0x5a, 0xa7, 0x24, 0xbe, 0x96, 0xd8, 0x00, 0xbd,
- 0x60, 0x94, 0x18, 0x3e, 0xbf, 0x6a, 0x6c, 0xbe, 0x81, 0xad, 0x45, 0x3e,
- 0xc9, 0x05, 0x24, 0x3e, 0xaf, 0xa4, 0x1f, 0xbd, 0x94, 0x7c, 0x3f, 0xbe,
- 0x59, 0xe8, 0x69, 0xbc, 0x3f, 0x21, 0x04, 0xbe, 0x85, 0x7d, 0x90, 0xbd,
- 0x0b, 0x55, 0x09, 0xbd, 0x53, 0x73, 0x87, 0xbc, 0x93, 0x1e, 0x22, 0x3e,
- 0xc0, 0x9e, 0x4a, 0x3d, 0xad, 0x23, 0xb2, 0x3e, 0xf5, 0xc0, 0xf1, 0x3d,
- 0x0f, 0xc3, 0x7a, 0x3e, 0x52, 0x17, 0xb7, 0x3d, 0xac, 0x42, 0x47, 0xbd,
- 0x6c, 0xea, 0x1d, 0x3e, 0xde, 0xa1, 0x28, 0xbb, 0x1e, 0x22, 0x06, 0x3e,
- 0x18, 0x03, 0xf7, 0x3e, 0xbc, 0x33, 0x11, 0x3e, 0x6e, 0x65, 0x4f, 0xbe,
- 0x69, 0x32, 0x50, 0x3e, 0x99, 0x03, 0x1e, 0x3e, 0x52, 0x21, 0x69, 0xbc,
- 0x26, 0x41, 0xdd, 0x3d, 0xad, 0xc5, 0x9f, 0xbd, 0x11, 0xaa, 0x70, 0x3e,
- 0x7a, 0x6d, 0xb4, 0xbd, 0xf3, 0xf0, 0xb3, 0xbd, 0x2c, 0xb9, 0x5d, 0xbe,
- 0xcc, 0xc7, 0xf7, 0xbd, 0xe4, 0x39, 0xc3, 0x3e, 0x14, 0x20, 0x7c, 0xbd,
- 0x0f, 0x0f, 0x4c, 0x3e, 0xc6, 0x8e, 0x48, 0x3e, 0xbe, 0x9f, 0x88, 0x3d,
- 0x70, 0xc2, 0x82, 0x3e, 0xe7, 0xf4, 0x43, 0x3c, 0x36, 0x96, 0x64, 0x3d,
- 0xba, 0xd9, 0x97, 0x3d, 0x83, 0x00, 0x65, 0x3e, 0x4a, 0x23, 0x4c, 0x3e,
- 0xa8, 0x59, 0x14, 0xbd, 0x60, 0x6e, 0x67, 0x3d, 0xe1, 0x7e, 0x88, 0xbe,
- 0x74, 0x3a, 0x27, 0x3e, 0x99, 0xd0, 0x0b, 0x3e, 0xf0, 0x08, 0x71, 0x3d,
- 0xcf, 0x35, 0x5c, 0xbd, 0xac, 0x39, 0x41, 0xbe, 0xff, 0x38, 0x16, 0xbe,
- 0x98, 0x30, 0x05, 0x3e, 0x3d, 0x8e, 0xd5, 0xbc, 0xee, 0x06, 0xa5, 0x3b,
- 0xca, 0x02, 0x8c, 0x3e, 0xdc, 0xb9, 0xeb, 0x3d, 0xb9, 0x46, 0x26, 0xbc,
- 0xc2, 0x71, 0xc2, 0xbd, 0xda, 0xc4, 0x51, 0xbd, 0xe5, 0x5f, 0x85, 0x3b,
- 0x7c, 0x41, 0x85, 0x3d, 0xe9, 0x00, 0x04, 0xbd, 0x84, 0xdb, 0x72, 0x3c,
- 0xb9, 0xe9, 0xac, 0x3c, 0xdd, 0x36, 0x8d, 0xbd, 0xe5, 0x04, 0xf5, 0xbc,
- 0xc7, 0x54, 0x0b, 0xbe, 0xa4, 0xea, 0xbd, 0xbd, 0xa9, 0xc6, 0x25, 0x3e,
- 0x20, 0x1a, 0x20, 0x3e, 0x91, 0xac, 0x7a, 0x3c, 0xfb, 0x3e, 0x3b, 0xbc,
- 0x6e, 0x80, 0xaf, 0xbd, 0xb3, 0xb7, 0x3a, 0x3e, 0xde, 0x9f, 0x81, 0x3e,
- 0x76, 0x37, 0xad, 0xbd, 0x46, 0xc4, 0xfa, 0xbd, 0x98, 0x95, 0x07, 0x3d,
- 0xf1, 0x2a, 0xda, 0x3c, 0x5d, 0xda, 0x07, 0xbe, 0x98, 0xb5, 0x5f, 0x3d,
- 0x58, 0x05, 0x0d, 0x3e, 0x9c, 0x57, 0xf5, 0x3d, 0x22, 0x08, 0x15, 0xbe,
- 0x80, 0x9b, 0x93, 0xbd, 0xdf, 0x87, 0x65, 0x3d, 0xfd, 0xb2, 0x63, 0x3c,
- 0xe4, 0xa6, 0xac, 0xbd, 0x6c, 0xc9, 0x6b, 0x3e, 0x6e, 0x7f, 0xce, 0xbd,
- 0x77, 0x7b, 0xcb, 0xbd, 0x38, 0x2b, 0x34, 0x3d, 0x55, 0x78, 0x31, 0x3c,
- 0x8e, 0x9f, 0x36, 0xbe, 0x58, 0x82, 0x30, 0xbe, 0x01, 0x65, 0x62, 0xbd,
- 0x66, 0x3a, 0xb8, 0x3d, 0xc4, 0x2f, 0xb0, 0x3d, 0x87, 0x37, 0xdb, 0xbc,
- 0xfa, 0x24, 0x13, 0xbe, 0x34, 0x13, 0x34, 0xbd, 0xe6, 0x40, 0xa5, 0xbe,
- 0x27, 0x14, 0xc9, 0x3b, 0xfd, 0x72, 0x12, 0x3e, 0x72, 0xaf, 0x52, 0x3d,
- 0xd8, 0xfa, 0x76, 0x3e, 0x49, 0x28, 0xd5, 0xbd, 0xda, 0xdc, 0xc0, 0xbd,
- 0x57, 0x67, 0xec, 0xbe, 0x27, 0x73, 0xd2, 0xbc, 0x81, 0x92, 0xce, 0x3c,
- 0x5a, 0x98, 0x62, 0x3d, 0x00, 0x88, 0x61, 0x3e, 0xff, 0xbe, 0x02, 0x3e,
- 0x1a, 0x88, 0x35, 0x3d, 0xc7, 0xda, 0x10, 0xbd, 0xa9, 0xae, 0xb7, 0xbd,
- 0xd3, 0xef, 0xed, 0x3d, 0x51, 0x42, 0xac, 0x3e, 0xa4, 0x6c, 0x56, 0x3e,
- 0x1c, 0x05, 0xd8, 0x3c, 0x3f, 0x80, 0xc0, 0x3b, 0x74, 0xa7, 0x0d, 0x3d,
- 0x05, 0xaa, 0x24, 0x3d, 0xfc, 0x24, 0x10, 0x3e, 0x4a, 0xb4, 0x23, 0x3d,
- 0xb7, 0x49, 0xc2, 0xbd, 0x63, 0x89, 0x63, 0xbd, 0xbb, 0xfa, 0xa3, 0x3c,
- 0x44, 0xc2, 0x12, 0x3e, 0x90, 0xe0, 0x37, 0xbd, 0x77, 0xe7, 0xd9, 0xbd,
- 0x3a, 0xc0, 0x53, 0xbe, 0x84, 0x3b, 0x32, 0xbf, 0xf0, 0x1e, 0x18, 0x3b,
- 0x14, 0x22, 0x92, 0xbd, 0x63, 0xb6, 0xd0, 0xbc, 0x78, 0x85, 0xd2, 0xbc,
- 0x4b, 0x64, 0xaa, 0x3d, 0xe2, 0xa8, 0x0d, 0xbe, 0xcf, 0x0d, 0x04, 0xbe,
- 0xea, 0x3a, 0xd9, 0x3d, 0xa9, 0x6c, 0x75, 0x3e, 0x1a, 0x3b, 0x38, 0xbe,
- 0x8e, 0xc3, 0x44, 0x3e, 0xdf, 0x8d, 0x2f, 0xbe, 0x3a, 0xd4, 0x82, 0x3d,
- 0x14, 0xa2, 0x3d, 0xbc, 0xf4, 0x8d, 0x94, 0xbc, 0x02, 0xf2, 0xd2, 0xbd,
- 0xc5, 0xac, 0x53, 0x3e, 0xe6, 0xf6, 0x2b, 0xbe, 0x78, 0x24, 0x99, 0x3d,
- 0x92, 0x97, 0xb4, 0x3d, 0xad, 0x25, 0x00, 0x3e, 0x3f, 0xda, 0x21, 0xbc,
- 0x44, 0xe7, 0x52, 0xbd, 0xa7, 0x2e, 0x84, 0x3e, 0x43, 0xe9, 0x3d, 0x3e,
- 0xa4, 0xe8, 0x01, 0x3e, 0xb9, 0x5f, 0x4b, 0xbc, 0x88, 0x23, 0xd8, 0x3d,
- 0xb1, 0x6c, 0x31, 0x3e, 0x10, 0x53, 0x3b, 0x3e, 0xc4, 0x7e, 0x43, 0xbe,
- 0xc5, 0x03, 0x50, 0x3d, 0x76, 0x86, 0xe2, 0x3c, 0x4c, 0xe7, 0x02, 0xbd,
- 0xed, 0xef, 0xda, 0xbc, 0x11, 0x4f, 0x3d, 0xbe, 0x60, 0x36, 0x0e, 0xbe,
- 0x1d, 0x86, 0x28, 0xbe, 0x16, 0x38, 0xfc, 0xbd, 0x0f, 0x7c, 0xfc, 0x3d,
- 0x35, 0x74, 0xb6, 0x3d, 0xca, 0x0a, 0x01, 0xbd, 0x1d, 0x65, 0xcd, 0xbd,
- 0xe9, 0xb8, 0x80, 0x3c, 0xa6, 0x72, 0x90, 0x3c, 0x4f, 0x26, 0xd1, 0xbb,
- 0xb1, 0x8f, 0x4b, 0x3b, 0xb5, 0x7d, 0x86, 0x3c, 0x23, 0x66, 0x73, 0xbc,
- 0xb6, 0x3e, 0x3d, 0xbf, 0xc3, 0x58, 0xd3, 0xbd, 0x24, 0x49, 0x17, 0xbe,
- 0x78, 0x25, 0x07, 0x3e, 0x0b, 0x72, 0x07, 0xbe, 0xee, 0x21, 0x9d, 0xbb,
- 0xf0, 0x67, 0xdc, 0xbd, 0x82, 0xa8, 0x1f, 0xbe, 0x68, 0x97, 0x8e, 0xbe,
- 0xc8, 0x20, 0x0e, 0xbe, 0x37, 0x38, 0x5b, 0xbe, 0x8a, 0xe8, 0x43, 0xbe,
- 0x24, 0xd4, 0x60, 0x3d, 0xc9, 0x3f, 0x0f, 0xbd, 0x32, 0xe9, 0xda, 0x3d,
- 0x77, 0xec, 0x24, 0xbe, 0x55, 0x61, 0xaf, 0xbd, 0xb4, 0x99, 0x4d, 0x3d,
- 0x13, 0x39, 0x8f, 0x3d, 0x1c, 0x9e, 0x00, 0xbe, 0xb2, 0x98, 0x67, 0xbc,
- 0x91, 0x4b, 0xc2, 0xbc, 0xd0, 0xde, 0xd1, 0xbd, 0xaf, 0xb4, 0x9b, 0x3e,
- 0xe5, 0x30, 0xd4, 0xbd, 0x2d, 0xd0, 0x31, 0x3d, 0xc6, 0xde, 0x82, 0xbd,
- 0x1b, 0xcb, 0xe8, 0xbc, 0xb4, 0x33, 0x91, 0xbd, 0x68, 0x0c, 0x11, 0x3e,
- 0xd6, 0x0a, 0x6b, 0xbc, 0x87, 0x2a, 0x54, 0xbd, 0x26, 0x90, 0x59, 0xbd,
- 0x2d, 0x61, 0x20, 0xbe, 0x52, 0xa1, 0x05, 0x3e, 0x11, 0xc5, 0x5b, 0x3e,
- 0x14, 0x32, 0x2b, 0x3e, 0x70, 0xca, 0x70, 0xbd, 0x16, 0x46, 0x40, 0x3e,
- 0x74, 0x84, 0xa5, 0x3d, 0x18, 0x5e, 0x71, 0xbd, 0x3c, 0x91, 0x68, 0x3e,
- 0x0b, 0xa9, 0x6a, 0x3b, 0x52, 0xa8, 0x54, 0xbc, 0x63, 0x50, 0x15, 0xbc,
- 0x55, 0xed, 0x39, 0xbc, 0x70, 0x25, 0x26, 0xbe, 0x37, 0x4b, 0xac, 0xba,
- 0x30, 0x3a, 0xc1, 0x3d, 0xdd, 0xf1, 0x97, 0x3c, 0x6a, 0x64, 0xb0, 0xbd,
- 0x89, 0x4c, 0xb9, 0xbc, 0x3e, 0xf5, 0x94, 0xbd, 0x2e, 0x9f, 0x8f, 0xbd,
- 0x1b, 0x83, 0x30, 0xbe, 0x54, 0x6f, 0xb7, 0xbd, 0x28, 0xf1, 0x61, 0x3d,
- 0xd6, 0xad, 0x8b, 0x3d, 0xa1, 0x94, 0x38, 0xbe, 0x68, 0x12, 0x00, 0x3d,
- 0xfc, 0x07, 0x19, 0xbe, 0x93, 0x8c, 0x28, 0xbd, 0x25, 0x5c, 0x18, 0xbe,
- 0xa2, 0x5d, 0x9e, 0xbd, 0x47, 0x35, 0xe0, 0x3c, 0x5d, 0x4c, 0x09, 0xbe,
- 0xf2, 0x92, 0x9c, 0x3d, 0x4d, 0x03, 0x8b, 0xbd, 0xbe, 0x6a, 0x6b, 0x3d,
- 0x50, 0x1a, 0x9f, 0xbd, 0xe1, 0x28, 0x68, 0x3c, 0xb1, 0x91, 0x16, 0x3e,
- 0xaa, 0x10, 0x06, 0x3d, 0x62, 0xb2, 0x1d, 0x3d, 0x64, 0x3b, 0x6c, 0x3d,
- 0xf5, 0xcc, 0x81, 0xbd, 0xbd, 0x20, 0xd5, 0x3d, 0x4a, 0x21, 0x6f, 0xbc,
- 0x88, 0xb3, 0x2a, 0x3e, 0x4d, 0xc4, 0x08, 0xbe, 0x8a, 0x82, 0x2c, 0x3e,
- 0x37, 0x2a, 0x23, 0xbe, 0xa1, 0x55, 0xd6, 0xbd, 0x09, 0x33, 0x9f, 0xbe,
- 0x70, 0x2a, 0x05, 0xbe, 0x34, 0xc2, 0xe8, 0xbd, 0xf1, 0x6e, 0x46, 0xbe,
- 0xb3, 0x7a, 0xd6, 0xbd, 0xfa, 0xf5, 0x2f, 0x3e, 0x4a, 0x77, 0x80, 0xbd,
- 0x17, 0xa7, 0x12, 0xbe, 0x69, 0xcb, 0x12, 0x3d, 0xa6, 0x26, 0x1f, 0xbc,
- 0xf8, 0x8a, 0xb3, 0xba, 0x8b, 0x6d, 0xcc, 0xbd, 0xef, 0x45, 0x1b, 0xbd,
- 0x9c, 0x55, 0x18, 0xbe, 0x49, 0xe5, 0xe5, 0x3c, 0x75, 0x36, 0xe3, 0xbd,
- 0xfc, 0x97, 0xf6, 0x3d, 0x16, 0x17, 0x4a, 0xbd, 0x04, 0xa0, 0x42, 0xbd,
- 0x7c, 0xaf, 0x3a, 0xbe, 0xbd, 0xfa, 0xf1, 0x3d, 0x01, 0x11, 0xe9, 0xbd,
- 0x4d, 0x67, 0x9c, 0xbd, 0x50, 0x2b, 0x12, 0x3e, 0x46, 0xc8, 0x93, 0xbd,
- 0x3a, 0x77, 0x36, 0x3d, 0xee, 0x62, 0x5d, 0xbc, 0x1d, 0x5d, 0x25, 0xbb,
- 0xe4, 0x33, 0x88, 0x3d, 0x53, 0xd5, 0x26, 0xbe, 0xba, 0xc7, 0x8f, 0xbd,
- 0x7f, 0x7e, 0x60, 0xbd, 0xad, 0x8e, 0xb3, 0xbd, 0xe7, 0xa2, 0xfc, 0x3d,
- 0xa6, 0x07, 0x14, 0xbe, 0x47, 0xb4, 0xe6, 0x3d, 0xa1, 0x2f, 0x0f, 0xbc,
- 0x86, 0xc2, 0xfb, 0xbd, 0x95, 0x53, 0xb7, 0x3d, 0x28, 0xc0, 0x1c, 0x3d,
- 0x57, 0x91, 0xca, 0xbd, 0xea, 0xc4, 0xe1, 0xbd, 0x93, 0x0a, 0x89, 0x3d,
- 0xa9, 0xde, 0xf3, 0x3c, 0x38, 0x50, 0xfd, 0x3d, 0x5c, 0xea, 0x23, 0xbd,
- 0x15, 0xe3, 0x97, 0xbe, 0xfa, 0x6a, 0x1f, 0xbe, 0x4c, 0x6d, 0x3f, 0xbd,
- 0x61, 0xa4, 0x03, 0x3e, 0xec, 0xec, 0xf2, 0xbc, 0xab, 0x3e, 0x3c, 0x3d,
- 0x3b, 0x27, 0x09, 0x3d, 0xb0, 0x5f, 0x8c, 0x3d, 0x86, 0xd7, 0x0e, 0x3d,
- 0xfe, 0x0a, 0x5c, 0x3e, 0x6f, 0x3d, 0x4e, 0x3e, 0xa0, 0xa3, 0xc0, 0xbd,
- 0x88, 0x62, 0xd9, 0x3d, 0xd3, 0x46, 0xa5, 0x3d, 0x48, 0x4d, 0xbd, 0xbc,
- 0xfd, 0x53, 0x01, 0xbd, 0x70, 0xad, 0x1d, 0x3e, 0x83, 0x14, 0x14, 0x3e,
- 0xdf, 0x01, 0x2c, 0x3e, 0x07, 0xc5, 0x5d, 0xbe, 0x3b, 0x6b, 0x2d, 0xbe,
- 0x03, 0x0e, 0xc1, 0x3c, 0xf5, 0x46, 0x6c, 0x3d, 0x24, 0xe6, 0x86, 0x3d,
- 0x38, 0xca, 0x01, 0x3e, 0x88, 0x55, 0xb2, 0xbd, 0xb9, 0x2a, 0xb9, 0x3c,
- 0x03, 0x11, 0x4c, 0x3d, 0x35, 0xba, 0xbb, 0xbd, 0xf4, 0xf1, 0x75, 0xbd,
- 0x79, 0x4a, 0x3c, 0xbe, 0xed, 0x13, 0x2f, 0xbd, 0xf9, 0xc4, 0x6f, 0xbe,
- 0x43, 0x2d, 0x66, 0xbe, 0x35, 0x3b, 0x8d, 0xbe, 0xad, 0xb4, 0xb0, 0x3e,
- 0x41, 0x2e, 0x95, 0x3e, 0xd2, 0x15, 0x2a, 0x3d, 0xb2, 0xd2, 0xcf, 0x3b,
- 0xef, 0x24, 0xeb, 0xbe, 0xeb, 0x8e, 0xb7, 0x3d, 0x82, 0x64, 0x0f, 0x3e,
- 0xea, 0xcd, 0x6a, 0x3d, 0x78, 0x73, 0x7c, 0xbe, 0x16, 0x46, 0x33, 0x3e,
- 0x6d, 0x88, 0x4b, 0xbe, 0xf3, 0x71, 0x81, 0xbe, 0x18, 0x2d, 0xec, 0xbd,
- 0x90, 0x54, 0x59, 0x3e, 0x15, 0x42, 0x0d, 0x3b, 0xb9, 0x37, 0xb9, 0xbd,
- 0xf2, 0xb4, 0x32, 0x3e, 0x7f, 0x00, 0x00, 0x3e, 0xad, 0x73, 0x94, 0xbe,
- 0x2a, 0x84, 0x31, 0xbd, 0x3a, 0x29, 0x91, 0x3e, 0xdd, 0x32, 0xa8, 0x3e,
- 0x5f, 0x75, 0x1f, 0x3e, 0xc7, 0xd1, 0x7b, 0x3e, 0xa1, 0x78, 0x42, 0x3d,
- 0x77, 0x09, 0xad, 0xbd, 0x31, 0xb7, 0xaf, 0xbd, 0xdf, 0x01, 0xdd, 0x3d,
- 0x0c, 0x60, 0x01, 0xbe, 0x1d, 0xe6, 0x3a, 0x3e, 0xb2, 0xbf, 0x64, 0x3b,
- 0xcc, 0xf2, 0x12, 0x3e, 0x5b, 0x72, 0x02, 0xbe, 0x63, 0x6b, 0x7b, 0xbd,
- 0x08, 0x47, 0x4b, 0xbd, 0xe4, 0x73, 0xf4, 0x3d, 0xf5, 0x6c, 0xd5, 0x3d,
- 0x3a, 0x94, 0xf2, 0xbd, 0x87, 0xe3, 0xf9, 0x3d, 0xa2, 0x84, 0x98, 0xbe,
- 0xef, 0x0b, 0x0c, 0x3e, 0x02, 0x9a, 0x8e, 0xbc, 0x39, 0x0c, 0x3a, 0xbe,
- 0x2f, 0xcb, 0x57, 0x3e, 0x0d, 0x80, 0xaf, 0xbe, 0xcc, 0x41, 0x2c, 0xbe,
- 0xc1, 0x3b, 0xb3, 0x3c, 0x26, 0x3f, 0x04, 0x3d, 0x11, 0xce, 0x79, 0x3d,
- 0x18, 0xa4, 0xca, 0xbe, 0x61, 0xab, 0x40, 0xbe, 0x13, 0x9d, 0x7c, 0x3d,
- 0x44, 0x76, 0x48, 0xbd, 0xc6, 0x22, 0xaf, 0xbe, 0xb7, 0xcb, 0x80, 0x3d,
- 0x68, 0xbe, 0x4e, 0x3e, 0xa4, 0xea, 0x8f, 0xbc, 0x57, 0xd9, 0xda, 0xbd,
- 0x25, 0x30, 0xa7, 0xbe, 0x72, 0x2c, 0x12, 0x3e, 0xd1, 0xed, 0xa2, 0xbb,
- 0x9d, 0x5b, 0x96, 0x3d, 0xd3, 0x71, 0x59, 0xbe, 0x85, 0xe1, 0x2e, 0x3e,
- 0x3f, 0x70, 0x7f, 0xbd, 0x1a, 0xc6, 0x22, 0x3a, 0x6a, 0x36, 0x9e, 0xbe,
- 0xd1, 0x67, 0xfc, 0x3c, 0xb2, 0xe1, 0xb5, 0x3d, 0xda, 0x28, 0xa0, 0xbd,
- 0xb4, 0x7a, 0x88, 0x3e, 0xce, 0x74, 0x1d, 0x3e, 0x3d, 0x0a, 0x07, 0x3e,
- 0xb1, 0xd1, 0x15, 0xbe, 0xa8, 0x27, 0xb7, 0xba, 0x7d, 0x6e, 0x8f, 0x3b,
- 0x2d, 0x58, 0x95, 0x3e, 0x77, 0xff, 0x15, 0x3d, 0x1a, 0x8a, 0x42, 0x3d,
- 0x0c, 0x7d, 0xcf, 0xbe, 0x91, 0xd4, 0xc6, 0xbb, 0x0e, 0xd5, 0x83, 0xbe,
- 0x34, 0x00, 0x81, 0xbe, 0xb9, 0x3c, 0x23, 0x3e, 0x8e, 0xe8, 0xd2, 0x3c,
- 0x14, 0x7e, 0x76, 0xbc, 0x7a, 0xa8, 0xf5, 0xbb, 0x15, 0x64, 0xab, 0xbe,
- 0xfd, 0x9f, 0x07, 0x3e, 0xe0, 0x53, 0xd4, 0xbd, 0x60, 0xbd, 0x37, 0xbe,
- 0xf2, 0xf5, 0x74, 0x3e, 0xc8, 0x7c, 0x81, 0xbe, 0x94, 0xe5, 0xf6, 0xbc,
- 0x6c, 0xd2, 0xaf, 0x3e, 0x98, 0xac, 0x9d, 0xbe, 0xc8, 0x91, 0xd2, 0x3c,
- 0x9b, 0x04, 0x66, 0x3e, 0xc7, 0xf9, 0x48, 0xbe, 0xc6, 0x80, 0x67, 0xbe,
- 0x92, 0x95, 0xc8, 0xbe, 0xc3, 0xa7, 0x53, 0xbe, 0xc7, 0xb8, 0x06, 0x3e,
- 0xcf, 0xb4, 0x6c, 0xbd, 0x3a, 0xa2, 0xb8, 0xbd, 0xb4, 0x0e, 0x57, 0xbe,
- 0xe3, 0x54, 0x3c, 0x3d, 0xfd, 0x2e, 0x38, 0x3e, 0x70, 0x81, 0xe7, 0xbd,
- 0xb2, 0x15, 0x80, 0xbe, 0xc9, 0x3a, 0xa3, 0x3d, 0x04, 0xd4, 0x0e, 0x3e,
- 0xd7, 0xd4, 0x49, 0xbe, 0x2d, 0x87, 0xb2, 0x3d, 0xc4, 0xd8, 0xea, 0x3d,
- 0x77, 0xfb, 0x3b, 0xbc, 0xfa, 0x33, 0x29, 0x3d, 0x38, 0xa4, 0x98, 0x3e,
- 0x92, 0x20, 0x5b, 0xbe, 0x6a, 0x1b, 0xf7, 0xbc, 0x4d, 0x01, 0xca, 0x3d,
- 0xa9, 0x5f, 0x12, 0xbe, 0x04, 0x4c, 0x92, 0x3d, 0x60, 0xfd, 0xa9, 0x3d,
- 0xca, 0x42, 0xdd, 0xbe, 0xd5, 0xf8, 0xcb, 0x3d, 0x5f, 0xb6, 0x1b, 0x3a,
- 0x00, 0x94, 0x69, 0x3d, 0x07, 0x92, 0x81, 0xbe, 0xb0, 0x06, 0x86, 0xbe,
- 0xe0, 0xcd, 0x84, 0xbd, 0xaa, 0x2a, 0x98, 0xbb, 0xd9, 0xa6, 0xa2, 0xbc,
- 0x1d, 0xd6, 0x5a, 0xbe, 0x31, 0xfa, 0x41, 0xbe, 0xcf, 0x21, 0x15, 0x3d,
- 0x5c, 0x71, 0x8d, 0xbe, 0x0d, 0xf7, 0x99, 0xbe, 0x8f, 0x25, 0xaa, 0xbd,
- 0x7f, 0x62, 0xea, 0xbe, 0xfe, 0x47, 0x03, 0xbe, 0xc0, 0x77, 0x53, 0xbe,
- 0x00, 0xaf, 0x9e, 0xbd, 0xe0, 0x0a, 0xbb, 0xbe, 0x06, 0x98, 0xb5, 0xbe,
- 0x95, 0x04, 0x1d, 0xbe, 0x8e, 0x75, 0xe2, 0xbe, 0x23, 0xdf, 0xb6, 0x3d,
- 0x88, 0xa2, 0xb0, 0x3d, 0x68, 0xa6, 0xa7, 0xbe, 0xa4, 0x97, 0x06, 0xbd,
- 0x8c, 0x9f, 0x1c, 0xbe, 0xfe, 0x1a, 0xdf, 0xbe, 0xf6, 0xd4, 0x8f, 0xbd,
- 0x07, 0x2d, 0x73, 0xbe, 0xab, 0xc7, 0x84, 0x3d, 0xaa, 0xb8, 0x80, 0xbd,
- 0xe6, 0x5b, 0x00, 0x3e, 0xc0, 0x72, 0xd8, 0xbe, 0x0c, 0x66, 0x0e, 0xbd,
- 0xf4, 0xf9, 0x42, 0x3d, 0x26, 0x6a, 0x91, 0x3d, 0x56, 0x5e, 0x4a, 0x3a,
- 0x65, 0xbd, 0xc8, 0xbe, 0x3d, 0x65, 0x39, 0xbe, 0x0e, 0x20, 0xad, 0x3c,
- 0xcb, 0x08, 0x88, 0xbe, 0x4a, 0xe6, 0x60, 0xbe, 0x1c, 0xcd, 0xc2, 0xbe,
- 0xd1, 0x78, 0x08, 0x3d, 0x0c, 0x37, 0xa5, 0x3d, 0xfb, 0xc9, 0xff, 0xbe,
- 0xd3, 0x48, 0x9b, 0x3e, 0x35, 0xf5, 0xf5, 0xbd, 0xc5, 0xea, 0x4c, 0x3d,
- 0xb3, 0x0d, 0xd4, 0xbe, 0x45, 0x5d, 0x08, 0xbe, 0xe1, 0x44, 0x35, 0x3d,
- 0xaf, 0x4b, 0x14, 0xbe, 0xc9, 0x3f, 0x20, 0xbe, 0x88, 0xbd, 0x28, 0xbe,
- 0x56, 0xf0, 0x3f, 0xbf, 0x00, 0x15, 0x53, 0xbe, 0xbf, 0x3c, 0x75, 0xbe,
- 0xdf, 0x0f, 0x3d, 0x3b, 0x34, 0xf3, 0x03, 0xbe, 0xb5, 0x02, 0x5b, 0xbd,
- 0x1b, 0x51, 0xc4, 0xbd, 0x1e, 0x55, 0x57, 0xbe, 0xf1, 0xf0, 0xb5, 0xbd,
- 0xbb, 0x3f, 0x7c, 0x3d, 0x81, 0x16, 0xb5, 0xbe, 0x81, 0x7a, 0xd7, 0xbe,
- 0xe1, 0x2c, 0x20, 0xbc, 0x57, 0xbc, 0xd8, 0xbd, 0x85, 0xa2, 0x97, 0xbe,
- 0x82, 0x44, 0x6e, 0xbe, 0xa8, 0x4f, 0x80, 0xbd, 0xb3, 0xd8, 0x0c, 0xbe,
- 0x75, 0x2a, 0x75, 0xbe, 0x9f, 0x75, 0x82, 0xbe, 0x53, 0x18, 0xb8, 0xbd,
- 0xea, 0x04, 0x65, 0xbe, 0xfd, 0x5d, 0xb6, 0xbe, 0x79, 0xe8, 0x88, 0xbc,
- 0x01, 0x0b, 0xa7, 0xbe, 0x01, 0x57, 0xab, 0xbc, 0xe6, 0x36, 0x34, 0xbd,
- 0x23, 0xdc, 0x45, 0xbe, 0x20, 0x2c, 0x11, 0xbe, 0xad, 0xdc, 0x85, 0x3d,
- 0x04, 0x96, 0x20, 0x3d, 0xa5, 0x2d, 0x01, 0xbe, 0xc4, 0x5f, 0x9c, 0xbe,
- 0x43, 0x28, 0x7d, 0xbd, 0xcb, 0x9a, 0x49, 0x3d, 0xf0, 0xd9, 0x80, 0xbe,
- 0xa2, 0x72, 0xb2, 0xbe, 0xdc, 0x85, 0xa2, 0xbe, 0x98, 0xde, 0x9b, 0x3d,
- 0x2a, 0x7d, 0x2f, 0x3e, 0xd0, 0x1b, 0x26, 0xbe, 0x1d, 0x81, 0x33, 0x3d,
- 0x52, 0x4f, 0x46, 0xbd, 0x79, 0xd6, 0xa7, 0xbe, 0xf6, 0xcd, 0xc4, 0xbd,
- 0x63, 0x0a, 0x4f, 0xbe, 0x0a, 0x72, 0x27, 0xbd, 0x2c, 0x31, 0xbd, 0xbe,
- 0xa9, 0x72, 0x0b, 0xbd, 0xcc, 0xed, 0x96, 0xbd, 0xb1, 0xdb, 0xf2, 0xbd,
- 0x53, 0xaf, 0x78, 0x3d, 0xe8, 0xc1, 0x64, 0xbe, 0xe8, 0x21, 0x7f, 0xbe,
- 0x46, 0x28, 0x0b, 0xbf, 0xee, 0xfc, 0x00, 0xbe, 0x62, 0x6f, 0x85, 0xbd,
- 0xbe, 0xbc, 0x38, 0x3d, 0x02, 0xa0, 0xb5, 0xbe, 0x07, 0xee, 0xd4, 0xbe,
- 0xf7, 0xe3, 0x78, 0x3d, 0x4e, 0xa7, 0x39, 0x3e, 0x5e, 0x74, 0x02, 0xbd,
- 0xa1, 0x43, 0x97, 0xbd, 0xf1, 0x53, 0xc3, 0xbe, 0xdb, 0xd0, 0xdf, 0xbe,
- 0x08, 0x98, 0x4c, 0xbe, 0xda, 0x82, 0xed, 0xbc, 0x1e, 0xf9, 0x50, 0xbe,
- 0xe3, 0x5d, 0xd7, 0xbc, 0x44, 0xbc, 0xf1, 0xbb, 0xa7, 0x87, 0x9a, 0xbe,
- 0xbc, 0x2b, 0xe7, 0xbd, 0x94, 0x92, 0x03, 0xbd, 0x58, 0xe8, 0x06, 0x3d,
- 0xbb, 0xab, 0x47, 0x3e, 0xff, 0x04, 0xd0, 0x3d, 0x21, 0xec, 0x24, 0xbe,
- 0xd8, 0x14, 0x8c, 0x3b, 0xbc, 0x2c, 0x00, 0xbf, 0x8c, 0xc3, 0x09, 0xbe,
- 0x51, 0xeb, 0xa4, 0xbd, 0x4c, 0x97, 0x89, 0xba, 0x70, 0x67, 0x26, 0x3d,
- 0xed, 0x39, 0xb1, 0x3d, 0x3c, 0x71, 0x79, 0x3e, 0x4a, 0xab, 0xd1, 0xbd,
- 0x1d, 0xac, 0x02, 0xbc, 0xf4, 0x1a, 0x1a, 0xbe, 0x55, 0x19, 0x42, 0x3c,
- 0x08, 0x9d, 0x38, 0x3e, 0x58, 0x36, 0x1d, 0xbe, 0xdd, 0xf8, 0x29, 0x3e,
- 0xd3, 0x9f, 0x26, 0xbc, 0xd0, 0x78, 0xfd, 0xbe, 0x28, 0xfa, 0x5b, 0xbe,
- 0x4e, 0xba, 0xc6, 0xbd, 0xfd, 0x00, 0x82, 0x3d, 0xdd, 0x02, 0x0a, 0xbe,
- 0xc1, 0xe9, 0x57, 0x3d, 0x09, 0x47, 0x96, 0x3c, 0x1a, 0x86, 0x9d, 0x3e,
- 0x17, 0x97, 0x82, 0x3d, 0xec, 0xea, 0xcb, 0xbd, 0x64, 0x9d, 0xf9, 0x3d,
- 0x24, 0x05, 0xca, 0xbe, 0xf0, 0xd6, 0x95, 0xbe, 0x74, 0x3e, 0x5b, 0xbd,
- 0xad, 0x6f, 0x8c, 0x3e, 0x66, 0x56, 0x0a, 0xbe, 0x76, 0x4f, 0xc6, 0xbc,
- 0x3b, 0xcb, 0xb8, 0xbd, 0x69, 0xd1, 0x21, 0xbf, 0xc5, 0x88, 0x0c, 0xbd,
- 0xa7, 0x5d, 0x05, 0x3d, 0x3f, 0x0b, 0xa2, 0xbd, 0x9c, 0xb5, 0xc8, 0xbe,
- 0xdb, 0x6c, 0xe2, 0x3d, 0xc0, 0x1b, 0x61, 0x3d, 0x41, 0xa1, 0x84, 0xbd,
- 0x13, 0x0b, 0x6f, 0xbe, 0xf8, 0x6d, 0x73, 0xbd, 0xfb, 0xe8, 0x5b, 0x3c,
- 0x22, 0xce, 0x8f, 0xbd, 0x6e, 0x02, 0x45, 0xbe, 0xa0, 0x25, 0xf2, 0x3d,
- 0x33, 0x4e, 0x86, 0xbd, 0xc0, 0xcc, 0xb0, 0x3d, 0xcf, 0xa5, 0x14, 0xbd,
- 0x7e, 0xb9, 0x7d, 0xbe, 0x0f, 0x15, 0x90, 0xbd, 0xa1, 0xc0, 0xa6, 0xbd,
- 0xc0, 0x87, 0xbe, 0xbe, 0x7b, 0x47, 0x19, 0xbe, 0x69, 0x4b, 0x6a, 0x3e,
- 0x32, 0x94, 0x16, 0xbe, 0xdd, 0x81, 0x19, 0xbe, 0x02, 0x4f, 0x00, 0x3d,
- 0xd5, 0x62, 0x21, 0xbe, 0xbc, 0xee, 0x2f, 0xbe, 0xf1, 0xeb, 0x87, 0x3e,
- 0x1d, 0x42, 0x3e, 0xbe, 0x63, 0xcf, 0x9f, 0xbd, 0xf8, 0x20, 0x50, 0x3e,
- 0x5a, 0x22, 0x12, 0x3e, 0x69, 0xf0, 0x26, 0xbd, 0x3a, 0x0a, 0x1a, 0x3e,
- 0x49, 0x48, 0xf8, 0xbd, 0xf0, 0x31, 0x92, 0xbd, 0xb6, 0xc0, 0x13, 0xbe,
- 0x9d, 0x01, 0x11, 0xbe, 0x5e, 0x2e, 0x32, 0xbe, 0x54, 0x8b, 0x1d, 0xbd,
- 0xb8, 0x6b, 0xa3, 0x3d, 0x21, 0xa5, 0x36, 0xbe, 0x73, 0xe3, 0xcb, 0x3c,
- 0xf5, 0x53, 0x90, 0xba, 0xd1, 0x3d, 0x01, 0xbe, 0x3e, 0x21, 0xad, 0xbd,
- 0x37, 0x7f, 0x94, 0xbe, 0x58, 0x53, 0xa7, 0xbe, 0x33, 0x2c, 0x01, 0xbe,
- 0x21, 0xf2, 0x82, 0x3d, 0x77, 0xb8, 0xd0, 0xbc, 0x49, 0x84, 0xc4, 0x3c,
- 0xa4, 0xe6, 0xc0, 0x3d, 0x13, 0xbb, 0xbe, 0xbd, 0xb1, 0xda, 0xd8, 0xba,
- 0x72, 0x46, 0x78, 0xbd, 0xb7, 0x91, 0xe6, 0xbd, 0xfd, 0x04, 0x5f, 0xbd,
- 0x14, 0x35, 0xef, 0x39, 0x49, 0x35, 0x6e, 0xbe, 0x4c, 0x5b, 0x22, 0xbc,
- 0x74, 0x35, 0x20, 0xbe, 0xc9, 0xd5, 0x99, 0xbd, 0x41, 0xee, 0x65, 0xbe,
- 0x0c, 0x81, 0x57, 0x3d, 0x0e, 0x44, 0x52, 0xbe, 0x9d, 0xab, 0x8b, 0x3e,
- 0x54, 0x81, 0xd0, 0x3c, 0xcc, 0x27, 0xb6, 0x3d, 0x86, 0x6d, 0x4c, 0xbe,
- 0xc3, 0x6f, 0x6c, 0x3e, 0x32, 0x3f, 0x81, 0x3e, 0x3d, 0x53, 0x7c, 0xbe,
- 0x12, 0x52, 0xad, 0xbd, 0x8c, 0xe1, 0x88, 0xbd, 0xb4, 0x6e, 0xae, 0xbe,
- 0xa5, 0xad, 0x09, 0x3c, 0x98, 0xf8, 0x98, 0x3c, 0xce, 0x76, 0x41, 0xbd,
- 0x51, 0x0a, 0xe5, 0x3d, 0x87, 0xb6, 0xb3, 0x3e, 0x82, 0xd4, 0x18, 0xbe,
- 0xe5, 0xc5, 0x53, 0xbe, 0xbd, 0x04, 0xaf, 0xbd, 0x3f, 0xca, 0x84, 0xbe,
- 0x82, 0x8f, 0x38, 0x3e, 0x7e, 0xc2, 0x0b, 0xbe, 0x47, 0xef, 0xd2, 0x3e,
- 0x02, 0x0b, 0x2d, 0xbe, 0x43, 0xef, 0x90, 0xbe, 0x9f, 0x23, 0x99, 0x3d,
- 0x9a, 0x24, 0x9c, 0x3e, 0x88, 0x23, 0xaf, 0x3e, 0x64, 0xc7, 0xa2, 0x3e,
- 0x3f, 0x66, 0x2d, 0x3e, 0xcc, 0x03, 0x2e, 0xbd, 0xa8, 0xc0, 0xb3, 0x3e,
- 0xd1, 0xd4, 0x3f, 0x3d, 0xca, 0xb2, 0xca, 0xbd, 0x09, 0x2d, 0xab, 0xbd,
- 0xc5, 0x2c, 0xfc, 0x3e, 0x9e, 0x2d, 0x8e, 0x3e, 0x3c, 0xd6, 0x2b, 0xbe,
- 0x2c, 0xcf, 0xcd, 0x3d, 0xd6, 0x12, 0x53, 0x3d, 0xa9, 0xb8, 0x96, 0xbe,
- 0x76, 0x26, 0xe7, 0x3d, 0x36, 0x21, 0x84, 0x3d, 0xef, 0x81, 0x64, 0xbc,
- 0x77, 0x31, 0xa9, 0xbc, 0x85, 0xd5, 0x37, 0x3e, 0x72, 0x79, 0x63, 0x3e,
- 0xd8, 0xe4, 0xce, 0x3c, 0x1f, 0xb5, 0xd9, 0x3e, 0x88, 0x9a, 0x23, 0x3e,
- 0xa0, 0xe3, 0xe8, 0x3e, 0x3e, 0x32, 0x4f, 0x3e, 0xd3, 0xa0, 0x18, 0x3e,
- 0x1e, 0xee, 0xd7, 0x3c, 0xdb, 0x83, 0x98, 0xbd, 0xb6, 0x8a, 0xac, 0x3d,
- 0x78, 0xd7, 0x90, 0x3d, 0x43, 0x6c, 0x21, 0xbb, 0xbf, 0x89, 0xb3, 0x3e,
- 0x8c, 0x9e, 0x34, 0xbe, 0x0b, 0x49, 0xa9, 0xbd, 0xe8, 0x69, 0x47, 0xbe,
- 0xda, 0x0d, 0xdf, 0xbd, 0x2c, 0xe1, 0x91, 0xbe, 0x41, 0xaf, 0xbf, 0xbc,
- 0x88, 0x5c, 0x5e, 0x3e, 0x67, 0x28, 0x18, 0x3d, 0x69, 0xc6, 0x1b, 0xbe,
- 0xcb, 0x87, 0xcf, 0x3c, 0x7a, 0xa7, 0xca, 0x3d, 0x6c, 0xbc, 0xed, 0xbb,
- 0x1d, 0xbb, 0x16, 0x3d, 0x67, 0x48, 0x4e, 0x3d, 0x9f, 0x69, 0x7f, 0x3d,
- 0x1f, 0xbc, 0xfe, 0xbd, 0x31, 0x08, 0x2e, 0xbe, 0xef, 0xc1, 0x7a, 0xbc,
- 0x6d, 0x6e, 0x24, 0x3d, 0xe8, 0x99, 0x05, 0x3f, 0x82, 0xb2, 0x9c, 0x3e,
- 0x6f, 0xf5, 0x91, 0xbe, 0x1a, 0xd9, 0x98, 0xbe, 0xf4, 0xef, 0xd1, 0xbd,
- 0xb8, 0xd3, 0xc9, 0x3c, 0xd3, 0x64, 0xb1, 0x3e, 0xce, 0x11, 0xc8, 0xbe,
- 0xc5, 0x78, 0x24, 0x3d, 0x50, 0x5a, 0xd4, 0xbe, 0xea, 0x43, 0x2f, 0x3e,
- 0x37, 0x1c, 0x77, 0xbe, 0xda, 0xc8, 0x7d, 0xbd, 0xec, 0xec, 0x9d, 0x3d,
- 0x37, 0x75, 0xf4, 0x3d, 0xcb, 0xc8, 0x0a, 0xbe, 0x7e, 0x26, 0x0f, 0x3d,
- 0x1f, 0x02, 0x94, 0x3e, 0x37, 0x78, 0xfc, 0xbd, 0xc0, 0xab, 0xd2, 0x3d,
- 0xdf, 0x96, 0xe6, 0xbd, 0x85, 0xcb, 0xb3, 0xbc, 0x88, 0xb6, 0x9d, 0xbd,
- 0x97, 0x5c, 0x9b, 0x3e, 0x78, 0x4e, 0x2b, 0xbe, 0xd3, 0x95, 0xb2, 0xbd,
- 0x8a, 0x70, 0x0b, 0x3f, 0xef, 0x3c, 0x3f, 0x3e, 0x04, 0xc3, 0x19, 0xbb,
- 0x57, 0x97, 0x62, 0xbe, 0x19, 0x75, 0xd2, 0x3e, 0xcb, 0x8a, 0xa5, 0xbd,
- 0x16, 0x81, 0xd8, 0x3d, 0x04, 0x62, 0x07, 0xbe, 0x17, 0x42, 0xf4, 0x3d,
- 0x03, 0x0e, 0x15, 0x3d, 0x11, 0x50, 0x28, 0x3d, 0x88, 0x25, 0x73, 0x3d,
- 0xe1, 0x94, 0xcb, 0x3d, 0xdc, 0xa3, 0xfa, 0x3d, 0x93, 0xca, 0x9c, 0x3d,
- 0x27, 0x3b, 0x0a, 0x3d, 0xba, 0xac, 0xe4, 0x3d, 0x8c, 0x00, 0xab, 0xbd,
- 0x86, 0x4d, 0x30, 0xbe, 0x0a, 0x56, 0x38, 0xbe, 0x29, 0x4f, 0x6d, 0x3e,
- 0x76, 0x78, 0xe0, 0xbd, 0x10, 0x44, 0x5e, 0x3d, 0x8c, 0x6a, 0x50, 0x3e,
- 0x8b, 0x01, 0x16, 0xbe, 0xfa, 0xf5, 0xf8, 0x3e, 0xbe, 0x72, 0xc5, 0x3d,
- 0x32, 0x24, 0xb4, 0x3d, 0x3d, 0xe2, 0x47, 0xbd, 0x87, 0x8c, 0xdd, 0x3d,
- 0x3b, 0x9f, 0x73, 0x3c, 0x6f, 0x85, 0x54, 0x3e, 0xc8, 0x60, 0x9a, 0x3d,
- 0x8e, 0xfc, 0xef, 0x3c, 0xb8, 0x29, 0x40, 0x3e, 0xf9, 0x9a, 0xa8, 0xbd,
- 0xc1, 0x12, 0x2f, 0xbe, 0xfd, 0x8c, 0x31, 0xbe, 0xd4, 0x5d, 0xc0, 0x3e,
- 0x7d, 0x99, 0x11, 0xbe, 0x0a, 0x22, 0xa4, 0xbd, 0x2d, 0x06, 0xcb, 0xbd,
- 0x30, 0xa4, 0xc5, 0x3a, 0xde, 0x92, 0xd6, 0xbd, 0x30, 0x91, 0x04, 0xbe,
- 0x2c, 0x1c, 0x7a, 0xbd, 0xc5, 0xb5, 0x38, 0xbe, 0xff, 0xf7, 0x65, 0xbc,
- 0xe4, 0x2e, 0xa5, 0x3e, 0xf4, 0xe2, 0xb7, 0xbd, 0xc2, 0x5c, 0xa2, 0x3c,
- 0x6b, 0xa6, 0xf0, 0xbd, 0xb7, 0x57, 0x7c, 0x3c, 0x12, 0xca, 0x12, 0x3d,
- 0xf5, 0xa9, 0x46, 0x3e, 0x35, 0x35, 0xae, 0x3d, 0x45, 0x69, 0xb6, 0x3c,
- 0x32, 0x04, 0xdb, 0x3d, 0xa5, 0x98, 0x04, 0x3e, 0xba, 0x0c, 0x21, 0x3d,
- 0x6c, 0x05, 0x6c, 0xbd, 0xa7, 0x19, 0x07, 0x3e, 0x1a, 0x61, 0x9d, 0x3e,
- 0xee, 0x72, 0x11, 0xbe, 0x65, 0x6c, 0xf7, 0x3a, 0x67, 0x74, 0x59, 0xbd,
- 0x80, 0xe6, 0x03, 0xbe, 0x90, 0x58, 0x03, 0xbd, 0x0f, 0x87, 0xb4, 0xbd,
- 0x80, 0xc0, 0x00, 0xbf, 0x6b, 0xcf, 0xce, 0x3d, 0x8c, 0x13, 0x7c, 0xbc,
- 0x26, 0xc2, 0xae, 0x3d, 0x10, 0x62, 0xa3, 0x3b, 0x28, 0x1f, 0x11, 0xbe,
- 0x41, 0x2e, 0x8a, 0xbe, 0x17, 0x24, 0x08, 0x3e, 0xdb, 0xfe, 0x2a, 0x3e,
- 0x30, 0x68, 0x09, 0x3d, 0x81, 0x71, 0xb5, 0x3d, 0x31, 0x5f, 0x17, 0x3c,
- 0x7e, 0xaa, 0x1a, 0xbe, 0x78, 0x89, 0x62, 0x3e, 0x12, 0xea, 0x63, 0xbd,
- 0xaa, 0xf3, 0x0f, 0x3e, 0x44, 0xae, 0x79, 0x3e, 0x52, 0xe6, 0x1f, 0x3e,
- 0x1d, 0x96, 0xca, 0x3e, 0x32, 0x59, 0x83, 0x3d, 0x58, 0x4c, 0xbf, 0xbd,
- 0x36, 0xd3, 0x5e, 0xbd, 0x4b, 0x0b, 0x77, 0x3c, 0xfc, 0x69, 0xbe, 0xbd,
- 0xf7, 0x17, 0x5e, 0x3c, 0x35, 0x74, 0x16, 0xbd, 0x30, 0x28, 0x9b, 0xbc,
- 0xfb, 0x5b, 0x33, 0x3c, 0xf4, 0x8d, 0xea, 0x3d, 0x30, 0x95, 0x99, 0x3e,
- 0xc6, 0xb7, 0x11, 0x3e, 0x1a, 0x1f, 0xea, 0xbc, 0xa6, 0xd4, 0xbc, 0xbd,
- 0xdd, 0x1b, 0x1f, 0x3e, 0xc7, 0x4f, 0x01, 0x3d, 0x72, 0x02, 0x92, 0xbd,
- 0x80, 0xa8, 0xd0, 0x3d, 0x16, 0xc5, 0x53, 0xbd, 0xd9, 0xd9, 0xc2, 0xbd,
- 0x83, 0x76, 0x7f, 0xbd, 0xa0, 0xc4, 0xc9, 0x3d, 0x3b, 0x35, 0x68, 0xbd,
- 0x87, 0x8a, 0x98, 0xbe, 0x6f, 0x13, 0xbb, 0x3c, 0x4c, 0x27, 0xc6, 0x3c,
- 0xf2, 0xc4, 0x25, 0x3e, 0x0d, 0xcc, 0xfb, 0x3d, 0x2a, 0xbe, 0x88, 0xbd,
- 0xb9, 0x23, 0xfe, 0xbd, 0x50, 0x4a, 0x06, 0x3e, 0x61, 0x34, 0xdf, 0x3d,
- 0x94, 0x72, 0x69, 0x3d, 0xb6, 0xbf, 0x2a, 0xbd, 0x16, 0x52, 0x3f, 0xbd,
- 0x94, 0xf6, 0x61, 0xbc, 0x96, 0x58, 0xa3, 0xbd, 0xb3, 0xec, 0xb2, 0x3e,
- 0x96, 0x14, 0xfd, 0xbc, 0xe0, 0x97, 0x0b, 0x3d, 0xed, 0x0d, 0x07, 0xbe,
- 0xcd, 0x3e, 0xe5, 0xbd, 0x54, 0x65, 0x00, 0xbe, 0xce, 0x96, 0x42, 0x3d,
- 0xd0, 0xb0, 0xc0, 0xbd, 0x08, 0x1b, 0xd9, 0xbd, 0x7d, 0x5d, 0x21, 0x3e,
- 0x38, 0x5d, 0xf7, 0xbd, 0x28, 0x20, 0xc4, 0x3d, 0xe0, 0x15, 0xef, 0xbd,
- 0xed, 0x11, 0xed, 0xbd, 0xfc, 0x92, 0x7e, 0xbb, 0x4c, 0xee, 0x78, 0x3e,
- 0xc7, 0x9b, 0x06, 0x3d, 0xb5, 0x63, 0x06, 0xbd, 0x48, 0x48, 0xc0, 0x3d,
- 0xd2, 0x79, 0x08, 0xbe, 0x7b, 0x49, 0xfa, 0xbc, 0x6d, 0xb2, 0x07, 0x3e,
- 0x8d, 0xec, 0x37, 0xbe, 0xed, 0xd7, 0xa1, 0x3d, 0x10, 0x6d, 0x9c, 0xbc,
- 0xe6, 0xbc, 0x55, 0xbe, 0x00, 0x1e, 0x08, 0xbe, 0x64, 0x7b, 0x3e, 0xbd,
- 0xa4, 0x6c, 0xbe, 0x3e, 0x1a, 0xe1, 0xa3, 0xbe, 0x6c, 0x0c, 0x50, 0x3d,
- 0x2d, 0x6c, 0xc9, 0xbe, 0x39, 0xf7, 0xc5, 0x3e, 0xc5, 0xbb, 0xef, 0xbd,
- 0x32, 0xcf, 0x3a, 0xbe, 0x05, 0x9d, 0x72, 0xbe, 0x89, 0x2b, 0x09, 0xbe,
- 0x1b, 0x01, 0xb1, 0x3d, 0x68, 0x41, 0x3d, 0xbd, 0xe4, 0x8f, 0x97, 0xbd,
- 0x1a, 0x21, 0x56, 0x3e, 0xaf, 0x62, 0xc4, 0xbe, 0xd6, 0x1a, 0x6c, 0xbe,
- 0x3f, 0xf4, 0x5a, 0xbe, 0xc6, 0x8b, 0x86, 0x3e, 0x22, 0x5c, 0xa2, 0xbd,
- 0xfa, 0xf3, 0x7e, 0x3e, 0xea, 0xc3, 0x9a, 0x3e, 0xfb, 0xf3, 0x5f, 0xbe,
- 0x83, 0xe6, 0xbc, 0xbe, 0x81, 0x61, 0xd3, 0xbc, 0xa8, 0x2a, 0x3e, 0x3e,
- 0x45, 0x33, 0x41, 0x3e, 0x42, 0x02, 0x7a, 0xbd, 0x3d, 0xa4, 0xac, 0xbe,
- 0xb8, 0xd2, 0x86, 0xbc, 0x21, 0xa3, 0x7a, 0xbd, 0xbc, 0xc2, 0x68, 0x3d,
- 0x62, 0x1b, 0xb5, 0x3d, 0xa6, 0xd2, 0x3d, 0xbc, 0x70, 0x87, 0x12, 0xbe,
- 0x79, 0x8d, 0x18, 0xbe, 0x54, 0xcc, 0x10, 0xbe, 0x0b, 0x4a, 0xd3, 0xbd,
- 0x76, 0x39, 0x61, 0x3e, 0x26, 0x95, 0x28, 0xbe, 0x11, 0x11, 0x47, 0x3e,
- 0xc7, 0x3c, 0xc7, 0xbe, 0xf1, 0x00, 0x81, 0x3d, 0x92, 0x40, 0x4e, 0xbe,
- 0xbe, 0xaa, 0x50, 0xbe, 0xea, 0x0b, 0x80, 0xbd, 0x56, 0x27, 0x03, 0xbe,
- 0x52, 0x2b, 0x08, 0x3c, 0x3b, 0xd8, 0x73, 0xbe, 0xa5, 0xb9, 0xd2, 0xbd,
- 0x25, 0x8c, 0x06, 0xbe, 0xf5, 0x7a, 0x07, 0xbc, 0x01, 0x51, 0x10, 0xbe,
- 0xee, 0x55, 0x5f, 0xbe, 0xfc, 0x53, 0x86, 0xbe, 0x56, 0x20, 0xfc, 0x3d,
- 0x47, 0xc2, 0x83, 0x3d, 0x22, 0x46, 0x5a, 0xbe, 0x91, 0xdd, 0x80, 0xbc,
- 0xe1, 0xf6, 0xf3, 0x3e, 0x19, 0xf2, 0x0c, 0xbe, 0xba, 0x86, 0x32, 0x3e,
- 0xd1, 0x79, 0x39, 0x3d, 0x55, 0x19, 0x9d, 0x3b, 0x98, 0x8d, 0x4b, 0x3c,
- 0x20, 0x71, 0x31, 0x3e, 0x1e, 0xef, 0xaf, 0x3d, 0x8f, 0x6d, 0xaa, 0xbe,
- 0xc6, 0xb5, 0x08, 0xbe, 0x07, 0xd4, 0x99, 0x3d, 0x51, 0xb5, 0x95, 0xbe,
- 0xc5, 0xf1, 0x52, 0x3e, 0x6f, 0xb0, 0xa3, 0xbe, 0x74, 0x4a, 0xb1, 0xbb,
- 0xa7, 0xd7, 0xa4, 0x3e, 0x1b, 0x01, 0x7d, 0x3d, 0x2a, 0xe9, 0x47, 0xbd,
- 0x5b, 0xdd, 0xb6, 0xbd, 0x11, 0xa6, 0x0f, 0x3e, 0xfe, 0x67, 0x0b, 0xbe,
- 0xbd, 0x3f, 0xd1, 0xbd, 0x5d, 0x26, 0x28, 0x3e, 0x02, 0xbe, 0x12, 0x3e,
- 0x3a, 0x96, 0xc6, 0x3d, 0x66, 0xfc, 0x9a, 0x3d, 0x6a, 0x55, 0xed, 0x3d,
- 0xdd, 0xf0, 0x36, 0x3e, 0x2f, 0xa4, 0x8c, 0xbd, 0x12, 0x9f, 0x8b, 0xbd,
- 0x1d, 0x2b, 0xc1, 0x3c, 0xa1, 0x91, 0x20, 0x3c, 0xcf, 0x98, 0xd8, 0x3c,
- 0x23, 0x83, 0x72, 0x3e, 0xc4, 0x9b, 0x77, 0x3e, 0xfd, 0xa8, 0xec, 0xbd,
- 0x4c, 0x08, 0x93, 0xbe, 0xda, 0x60, 0xa5, 0x3e, 0x49, 0xc9, 0x04, 0xbe,
- 0x78, 0xcd, 0xa4, 0xbd, 0x4b, 0xba, 0x9e, 0xbc, 0xcc, 0x09, 0x80, 0xbe,
- 0x9e, 0x9a, 0x2c, 0x3d, 0x9b, 0xe0, 0xaf, 0x3e, 0x4c, 0xde, 0xad, 0xbc,
- 0xd4, 0x86, 0x70, 0xbc, 0x76, 0x5c, 0x18, 0x3d, 0xfc, 0x50, 0xdc, 0x3c,
- 0x6c, 0x0a, 0x19, 0x3c, 0xf4, 0x92, 0xf6, 0xbc, 0x8d, 0x2b, 0x3c, 0xbd,
- 0x34, 0xad, 0xf2, 0xbc, 0xeb, 0x49, 0x12, 0x3c, 0xfb, 0x1c, 0xc3, 0xbe,
- 0x9e, 0x50, 0x16, 0xbe, 0x82, 0x7d, 0xa2, 0xbe, 0x73, 0xe0, 0x11, 0xbe,
- 0x51, 0xf2, 0x03, 0x3e, 0x9b, 0x70, 0xf9, 0xbd, 0x9d, 0x64, 0x4e, 0x3e,
- 0x60, 0xf9, 0x43, 0xbe, 0x9e, 0x6a, 0x74, 0xbe, 0x02, 0xd4, 0x41, 0xbd,
- 0x56, 0x21, 0x05, 0x3e, 0xdb, 0x3c, 0x18, 0xbc, 0xb1, 0xab, 0x30, 0x3e,
- 0x23, 0x7a, 0xeb, 0xbe, 0xce, 0x24, 0x77, 0xbe, 0xc1, 0xee, 0xcc, 0xbd,
- 0xb6, 0x7d, 0x83, 0xbe, 0x99, 0x9d, 0xb1, 0xbd, 0x23, 0x88, 0xce, 0xbe,
- 0x8c, 0xaa, 0xa2, 0x3e, 0xbc, 0xb9, 0x19, 0x3e, 0x4e, 0x3c, 0xcf, 0xbe,
- 0xd2, 0x8c, 0xd9, 0xbc, 0x27, 0x57, 0x8c, 0x3e, 0xe9, 0x41, 0xd5, 0x3e,
- 0xea, 0x9f, 0xfd, 0x3c, 0xa9, 0xd1, 0x94, 0x3d, 0x6b, 0x25, 0x4d, 0xbe,
- 0xaa, 0x95, 0x9e, 0xbe, 0xda, 0x7a, 0x94, 0xbd, 0xb4, 0xaf, 0x98, 0x3e,
- 0xa0, 0xdb, 0x82, 0x3c, 0x65, 0xfb, 0xb6, 0x3e, 0x17, 0x71, 0x5c, 0x3e,
- 0xb9, 0xaf, 0x77, 0xbd, 0x9d, 0xdb, 0x09, 0xbd, 0x0f, 0xdf, 0x14, 0xbf,
- 0x4e, 0x99, 0x4b, 0x3e, 0xbe, 0xad, 0x02, 0xbe, 0xcd, 0xd6, 0x4b, 0xbe,
- 0x09, 0x32, 0xab, 0x3e, 0x02, 0xbe, 0xb9, 0x3d, 0xd4, 0xbb, 0x51, 0xbe,
- 0xcb, 0x32, 0xa2, 0x3d, 0x08, 0x57, 0x4c, 0xbe, 0x69, 0xc7, 0xbf, 0xbe,
- 0x44, 0xdd, 0x4d, 0xbd, 0x45, 0xc1, 0x8f, 0xbe, 0xca, 0xc8, 0xdf, 0x3d,
- 0x93, 0x97, 0x3c, 0x3e, 0xa1, 0x36, 0x46, 0x3e, 0x2b, 0x0d, 0xa5, 0x3d,
- 0xaa, 0x4a, 0x7f, 0xbe, 0xbc, 0x36, 0x56, 0xbc, 0x18, 0xb0, 0x13, 0x3d,
- 0x81, 0x82, 0xad, 0xbd, 0x13, 0xbd, 0x1d, 0xbb, 0x2f, 0x9d, 0xd9, 0xbd,
- 0xc4, 0x73, 0x43, 0x3e, 0xc6, 0x73, 0x11, 0xbe, 0x4e, 0xa0, 0x46, 0xbd,
- 0x23, 0x2e, 0x81, 0x3e, 0xf1, 0xf1, 0x4e, 0xbd, 0x4f, 0xc1, 0x8d, 0x3c,
- 0x35, 0x54, 0x96, 0xbe, 0x23, 0xf5, 0x26, 0x3d, 0xbd, 0xc3, 0x34, 0xba,
- 0x87, 0x2c, 0xd7, 0x3d, 0x35, 0xfd, 0x9a, 0x3d, 0x9c, 0xd6, 0x67, 0x3e,
- 0x64, 0xef, 0xe7, 0xbe, 0x97, 0x66, 0x09, 0x3e, 0x4c, 0xe1, 0x86, 0x3d,
- 0x61, 0x08, 0xb3, 0xbe, 0x3a, 0xc7, 0x03, 0x3d, 0x36, 0x25, 0xdb, 0xbe,
- 0x22, 0xef, 0x0c, 0xbe, 0x62, 0x3d, 0xc8, 0xbd, 0x7a, 0x37, 0xfc, 0x3d,
- 0x95, 0xa1, 0x84, 0x3d, 0x82, 0x6e, 0x16, 0xbe, 0x2b, 0xe7, 0x84, 0x3e,
- 0x42, 0x3c, 0x93, 0xbe, 0x18, 0xeb, 0xac, 0x3c, 0xca, 0xa0, 0x50, 0x3d,
- 0x1d, 0x1c, 0xc1, 0xbe, 0xdd, 0x90, 0x29, 0xbd, 0x43, 0x20, 0x1b, 0xbd,
- 0x3c, 0x61, 0x52, 0x3d, 0x45, 0xfa, 0x39, 0xbf, 0x59, 0xf9, 0x14, 0x3e,
- 0xcf, 0xab, 0x23, 0xbd, 0x7a, 0xa8, 0x14, 0xbd, 0x7d, 0xd2, 0xb0, 0xbe,
- 0x2e, 0x82, 0x16, 0xbf, 0xb1, 0x68, 0xfc, 0xbc, 0x16, 0xc2, 0xbb, 0xbe,
- 0x21, 0x52, 0x97, 0x3d, 0x59, 0x2e, 0xc9, 0x3c, 0x16, 0xbd, 0x29, 0xbd,
- 0xdc, 0x58, 0x30, 0xbe, 0x2c, 0xf0, 0x7d, 0x3d, 0x17, 0xe0, 0xd5, 0x3e,
- 0xdf, 0xcb, 0xe9, 0x3d, 0x3a, 0x66, 0x09, 0xbd, 0xa3, 0x7a, 0x01, 0xbe,
- 0x37, 0xf0, 0x90, 0x3d, 0x06, 0xbc, 0xd1, 0x3d, 0x99, 0x01, 0xdd, 0xbb,
- 0xfb, 0x65, 0xae, 0xbe, 0x41, 0xc1, 0x50, 0xbe, 0x74, 0xd4, 0x37, 0xbd,
- 0xac, 0x55, 0xb6, 0xbe, 0x25, 0x45, 0x4a, 0x3e, 0x97, 0xdd, 0x20, 0xbe,
- 0x95, 0x76, 0x19, 0xbe, 0xdc, 0x79, 0xb4, 0x3c, 0x3a, 0x11, 0x19, 0x3e,
- 0xbd, 0x67, 0x0f, 0xbe, 0x0c, 0xbc, 0x44, 0x3d, 0xc8, 0xad, 0xbc, 0xbc,
- 0x04, 0xbf, 0xc4, 0x3e, 0xd0, 0xad, 0xda, 0xbc, 0x07, 0x24, 0x58, 0x3e,
- 0xd9, 0xa4, 0xb1, 0x3d, 0xcd, 0xf3, 0x7c, 0x3e, 0x5a, 0x84, 0x3c, 0x3e,
- 0x04, 0xde, 0xf8, 0x3d, 0x3d, 0x96, 0x1c, 0xbe, 0x31, 0x1e, 0x07, 0xbc,
- 0xe4, 0x58, 0xcd, 0xbd, 0xd3, 0x76, 0xc2, 0xbd, 0xc0, 0xd7, 0xc4, 0xbd,
- 0x71, 0xcb, 0x0a, 0x3e, 0x35, 0xa6, 0x80, 0xbe, 0x82, 0x18, 0xc3, 0xbd,
- 0x63, 0xc2, 0x72, 0xbe, 0x27, 0xb7, 0x3c, 0x3d, 0x97, 0x74, 0xc1, 0xbd,
- 0x01, 0xa9, 0x15, 0xbd, 0x25, 0x6a, 0x1d, 0x3d, 0xae, 0x0d, 0xdb, 0xbd,
- 0x76, 0x1c, 0x72, 0x3d, 0x39, 0x8c, 0x31, 0xbd, 0x2d, 0xd5, 0x81, 0x3e,
- 0x1c, 0x1f, 0xbf, 0xbe, 0x6c, 0x1b, 0x18, 0x3c, 0x79, 0x30, 0xaf, 0x3d,
- 0x42, 0xd4, 0x7d, 0xbc, 0x39, 0xfa, 0xc7, 0xbd, 0x37, 0x88, 0x9d, 0xbd,
- 0xf8, 0x3e, 0xaf, 0xbc, 0x8c, 0x33, 0xce, 0xbd, 0x94, 0x97, 0x40, 0x3e,
- 0x8f, 0x83, 0x92, 0xbe, 0xfe, 0xe6, 0x42, 0x3c, 0x50, 0x62, 0x87, 0xbd,
- 0x28, 0x08, 0x96, 0x3d, 0xda, 0xd8, 0x15, 0xbe, 0xff, 0xdb, 0x05, 0xbe,
- 0xdb, 0xad, 0x69, 0xbd, 0xc8, 0x74, 0x16, 0xbe, 0xd3, 0x03, 0x4a, 0xbe,
- 0xbe, 0xe4, 0x58, 0x3c, 0x12, 0xe3, 0x18, 0xbe, 0xfc, 0xe5, 0xd3, 0xbd,
- 0x08, 0x96, 0xed, 0xbe, 0xec, 0x76, 0xdc, 0xbd, 0xc8, 0x51, 0xcb, 0x3d,
- 0x05, 0x85, 0xc9, 0xbd, 0x29, 0x7b, 0x26, 0x3d, 0x10, 0x1a, 0x75, 0xbd,
- 0xfd, 0x6d, 0xa8, 0xbe, 0x65, 0xe5, 0x55, 0xbe, 0xec, 0xb7, 0xa7, 0xbc,
- 0x4a, 0x50, 0x05, 0xba, 0x7a, 0x1e, 0x90, 0xbe, 0xcf, 0xa1, 0x5b, 0xbe,
- 0xef, 0xdc, 0xd8, 0x3d, 0xa6, 0xf7, 0x17, 0xbe, 0x94, 0x13, 0x23, 0x3e,
- 0xf5, 0x90, 0x9a, 0xbd, 0x40, 0x01, 0x9e, 0xbd, 0x73, 0x74, 0x8e, 0x3e,
- 0x7e, 0x5b, 0xfd, 0x3c, 0xbd, 0x99, 0x47, 0xbe, 0x75, 0x75, 0x08, 0x3d,
- 0xf3, 0xb3, 0xe4, 0xbe, 0xba, 0xa4, 0x15, 0x3e, 0x2a, 0x60, 0xe7, 0xbd,
- 0x59, 0xdb, 0x3a, 0xbe, 0x95, 0x01, 0x13, 0xbd, 0xd5, 0x22, 0x95, 0xbe,
- 0x01, 0x3c, 0xc7, 0xbc, 0xa1, 0x29, 0xb1, 0x3c, 0xe8, 0xec, 0xb6, 0xbd,
- 0xd6, 0x56, 0x9e, 0xbd, 0x4d, 0xc0, 0xc9, 0xbd, 0x2a, 0x06, 0xe5, 0x3c,
- 0xfd, 0x05, 0x9a, 0xbc, 0x19, 0xa6, 0xb5, 0xbc, 0xc9, 0x9d, 0xc1, 0x3d,
- 0xb1, 0x9b, 0x38, 0xbd, 0x56, 0x12, 0xaa, 0x3c, 0x31, 0xa6, 0x28, 0xbd,
- 0x02, 0xed, 0x29, 0xbe, 0x4a, 0xb1, 0xfb, 0xbe, 0xf5, 0x85, 0x22, 0x3e,
- 0xa5, 0x6c, 0x18, 0xbf, 0x3e, 0x2f, 0xff, 0xbe, 0xbd, 0xbf, 0x4c, 0x3e,
- 0xce, 0x9c, 0x8a, 0x3e, 0x7d, 0xc4, 0x39, 0xbe, 0xf4, 0xcb, 0x5b, 0xbd,
- 0xd7, 0x36, 0xa4, 0xbe, 0x2b, 0xbe, 0xa9, 0xbe, 0x98, 0x76, 0x58, 0x3d,
- 0xfc, 0xb6, 0x1e, 0x3e, 0x5b, 0xb1, 0x5c, 0xbe, 0x6d, 0xc4, 0xbe, 0xbc,
- 0x59, 0xec, 0x36, 0x3c, 0x07, 0x37, 0x35, 0xbc, 0xf3, 0x85, 0x3e, 0xbe,
- 0x02, 0x33, 0x46, 0xbe, 0xba, 0xaf, 0x15, 0xbd, 0x97, 0x27, 0x11, 0x3e,
- 0x62, 0xfa, 0xc9, 0x3c, 0x96, 0xf8, 0xd2, 0x3d, 0x3c, 0xa7, 0xd4, 0xbd,
- 0xfc, 0x77, 0x91, 0x3b, 0x63, 0x4c, 0x51, 0xbc, 0x44, 0xa3, 0xca, 0x3d,
- 0xd0, 0xb4, 0xd4, 0xbe, 0x0c, 0x0b, 0xf3, 0xbd, 0xb5, 0x58, 0x10, 0xbe,
- 0xa3, 0x51, 0x10, 0xbe, 0x08, 0x64, 0x95, 0xbe, 0xb0, 0x1a, 0x25, 0xbe,
- 0x6c, 0x0e, 0xba, 0x3c, 0x20, 0x57, 0xcb, 0xbd, 0x47, 0x00, 0xfd, 0xbd,
- 0x46, 0x5a, 0x3c, 0xbe, 0xda, 0xf0, 0x9e, 0x3c, 0x68, 0x2b, 0x26, 0xbd,
- 0xaa, 0x75, 0xed, 0x3d, 0x67, 0x1b, 0x38, 0x3d, 0x4a, 0x7e, 0x83, 0xbd,
- 0x02, 0x3b, 0xea, 0x3c, 0x17, 0x0e, 0xed, 0x3d, 0x24, 0x13, 0x14, 0xbf,
- 0xfa, 0x67, 0xab, 0xbd, 0x18, 0xbf, 0xa0, 0x3d, 0x12, 0x35, 0x8e, 0xbe,
- 0xff, 0xe2, 0xff, 0xbb, 0x86, 0x37, 0xa3, 0xbe, 0x82, 0x83, 0x12, 0x3e,
- 0xce, 0xf9, 0xd1, 0xbe, 0xc6, 0x35, 0x1c, 0xbd, 0xfb, 0xee, 0xa2, 0xbe,
- 0x25, 0xff, 0x5b, 0x3e, 0x7b, 0x6c, 0xa3, 0xbc, 0x51, 0x1a, 0xb0, 0x3d,
- 0x76, 0x65, 0x7f, 0x3d, 0x58, 0x0d, 0x47, 0x3e, 0x2e, 0x29, 0x39, 0x3e,
- 0xd8, 0x42, 0x99, 0xbe, 0x09, 0x33, 0x2a, 0xbd, 0xc4, 0xcf, 0x42, 0x3e,
- 0x57, 0xc7, 0xdc, 0xbc, 0xd1, 0x98, 0x34, 0x3e, 0x4e, 0x83, 0x0a, 0x3e,
- 0x72, 0x4e, 0xc0, 0x3e, 0x73, 0x19, 0xfe, 0xbd, 0xeb, 0x51, 0x29, 0xbe,
- 0xc5, 0x8e, 0xb3, 0x3d, 0x09, 0xa0, 0xfc, 0xbd, 0x69, 0xcb, 0xae, 0xbc,
- 0x03, 0xe8, 0x03, 0xbe, 0xb6, 0x2a, 0x1f, 0xbd, 0xc5, 0x79, 0xd4, 0x3d,
- 0x32, 0x95, 0xe8, 0x3d, 0xc8, 0x7d, 0x54, 0x3e, 0xc9, 0x2d, 0x4e, 0x3e,
- 0x33, 0x7d, 0x25, 0xbe, 0xd3, 0xeb, 0x3a, 0xbe, 0xb0, 0x3a, 0x21, 0xbe,
- 0x83, 0xf4, 0x95, 0x3d, 0xfe, 0x1d, 0x83, 0x3e, 0xfc, 0x8f, 0x9f, 0xbe,
- 0x3e, 0x21, 0x57, 0xbe, 0x8b, 0x7c, 0x8e, 0x3e, 0xde, 0x37, 0x00, 0xbe,
- 0x01, 0x15, 0xee, 0x3c, 0x14, 0x61, 0x81, 0x3c, 0x1f, 0xea, 0xfe, 0x3d,
- 0xa9, 0x14, 0x29, 0x3e, 0x5f, 0x45, 0xba, 0xbd, 0x78, 0x65, 0x3f, 0xbe,
- 0x98, 0x88, 0x1a, 0x3d, 0xe9, 0xb3, 0xf9, 0x3c, 0x64, 0x45, 0x6e, 0x3d,
- 0x2e, 0xbc, 0xbb, 0x3d, 0xd3, 0x78, 0xdf, 0xbe, 0x6a, 0xcd, 0x31, 0xbc,
- 0xf3, 0x80, 0x91, 0x3d, 0xd5, 0xfd, 0x92, 0xbc, 0x58, 0x14, 0xa5, 0x3b,
- 0x61, 0x22, 0x68, 0x3d, 0x91, 0x8c, 0x2d, 0xbd, 0xff, 0xad, 0x92, 0xbd,
- 0x2c, 0xda, 0xbb, 0x3d, 0xe5, 0x5a, 0x28, 0x3e, 0x50, 0x14, 0x02, 0xbd,
- 0x45, 0x94, 0x05, 0x3c, 0xde, 0x4a, 0x6a, 0xbe, 0xd0, 0x15, 0x11, 0xbe,
- 0x72, 0xa0, 0x8b, 0xbc, 0xee, 0xf6, 0x0e, 0x3e, 0x5f, 0x76, 0x3d, 0xbc,
- 0xed, 0xa8, 0xb6, 0xbd, 0x5b, 0x81, 0x75, 0xbe, 0x3c, 0x25, 0x86, 0x3d,
- 0x9a, 0x71, 0xeb, 0xbd, 0x39, 0xd1, 0xc4, 0x3d, 0x74, 0x2b, 0xbf, 0xbc,
- 0x11, 0x52, 0x9c, 0xbd, 0xd6, 0xdb, 0x2e, 0xbe, 0x43, 0x62, 0x3a, 0xbb,
- 0x86, 0x97, 0xb4, 0xbb, 0x61, 0xa9, 0x3a, 0x3e, 0x4d, 0xca, 0x11, 0x3e,
- 0xfd, 0x6b, 0x89, 0xbc, 0x86, 0xbd, 0x36, 0xbe, 0x4d, 0x05, 0xcd, 0x3e,
- 0xa1, 0x75, 0xd7, 0x3d, 0xa4, 0xd9, 0xcd, 0x3d, 0x11, 0x94, 0x2a, 0x3e,
- 0x0a, 0x29, 0x8f, 0xbe, 0x7c, 0x1a, 0x6d, 0xbd, 0xe8, 0x52, 0x76, 0x3c,
- 0x12, 0x98, 0x92, 0xbd, 0x4f, 0xf8, 0x34, 0xbe, 0xb2, 0x7c, 0x36, 0xbd,
- 0x01, 0x79, 0x08, 0x3d, 0xcf, 0xe8, 0xca, 0xbc, 0x1d, 0x78, 0xa7, 0x3d,
- 0x88, 0xcf, 0xea, 0x3d, 0x0d, 0x02, 0x0e, 0x3e, 0x30, 0x10, 0x23, 0xbe,
- 0x2c, 0x5d, 0xb8, 0x3d, 0x67, 0xfe, 0x96, 0x3d, 0x12, 0xcc, 0x72, 0x3c,
- 0x6e, 0xe3, 0x0d, 0xbd, 0xe2, 0x9c, 0x1c, 0x3e, 0xc9, 0x38, 0x9c, 0xbd,
- 0x22, 0x06, 0x80, 0xbd, 0xcd, 0xf7, 0x34, 0x3c, 0x5f, 0xbf, 0xcc, 0x3d,
- 0xa2, 0xce, 0x1c, 0xbe, 0x01, 0x85, 0xec, 0xbc, 0x40, 0x1a, 0x6c, 0x3c,
- 0x83, 0xd6, 0xa3, 0xbd, 0x0d, 0x6c, 0x63, 0x3d, 0xe7, 0xf1, 0xb2, 0x3d,
- 0x53, 0xd3, 0xee, 0xbc, 0x6d, 0x77, 0x6d, 0x3d, 0x88, 0x98, 0x00, 0x3e,
- 0xa8, 0x40, 0x88, 0xbe, 0x5d, 0xf2, 0x01, 0x3c, 0x1e, 0x77, 0xb0, 0xbd,
- 0x42, 0x90, 0x36, 0xbe, 0x94, 0x91, 0x4b, 0xbe, 0x3c, 0x8a, 0x36, 0xbd,
- 0xb3, 0x12, 0xd7, 0xbd, 0x7e, 0x09, 0x06, 0xbf, 0x28, 0x4c, 0x7f, 0xbd,
- 0xd9, 0xf4, 0xd0, 0xbd, 0x54, 0xbf, 0x27, 0x3e, 0xe7, 0xef, 0x67, 0x3d,
- 0xed, 0xfd, 0xc9, 0xbe, 0x3f, 0x39, 0x17, 0x3e, 0xc3, 0x80, 0x4a, 0xbe,
- 0x6a, 0xdc, 0xa6, 0x3d, 0x40, 0xdd, 0x3f, 0x3e, 0x37, 0x5b, 0x36, 0xbe,
- 0xc7, 0x39, 0x0b, 0x3d, 0xf0, 0x46, 0x74, 0xbc, 0x71, 0x8e, 0xf8, 0xbe,
- 0x7f, 0xe2, 0x9a, 0xbe, 0x04, 0x8a, 0x81, 0xbd, 0xd2, 0x11, 0x8c, 0xbd,
- 0xf4, 0x29, 0xb6, 0x3c, 0x7d, 0x1f, 0xc8, 0x3d, 0xc3, 0xcd, 0xc6, 0xbe,
- 0x88, 0xde, 0x12, 0xbe, 0xf5, 0xe1, 0x9c, 0xbc, 0x70, 0x4b, 0x87, 0xbe,
- 0x52, 0xfa, 0x51, 0xbe, 0xbf, 0xf1, 0x81, 0xbd, 0x67, 0x22, 0x47, 0x3c,
- 0x99, 0x0d, 0x03, 0x3e, 0xa1, 0x28, 0x98, 0xbe, 0xd1, 0x62, 0x02, 0x3d,
- 0xbf, 0x3b, 0x6d, 0x3e, 0x56, 0x0e, 0xdb, 0xbe, 0x6c, 0x07, 0x20, 0x3d,
- 0x44, 0x9e, 0x3f, 0xbd, 0x4a, 0x83, 0x81, 0x3e, 0x22, 0xfa, 0x91, 0xbc,
- 0x94, 0x9a, 0xa3, 0x3e, 0xb4, 0x6b, 0x2b, 0xbe, 0xb1, 0x3e, 0x41, 0xbc,
- 0x33, 0xf7, 0x30, 0x3d, 0x21, 0xc6, 0xae, 0xbe, 0x18, 0x36, 0xb4, 0xbd,
- 0xcc, 0x4a, 0x99, 0xbd, 0x50, 0xa6, 0x75, 0xbe, 0xe7, 0xd5, 0x0b, 0x3e,
- 0x5e, 0xfa, 0x1d, 0xbe, 0xe9, 0xd6, 0x68, 0x3e, 0x2d, 0xdc, 0x3a, 0xbd,
- 0x3f, 0x2c, 0xa5, 0xbe, 0xb7, 0x24, 0xa0, 0x3d, 0x50, 0x8b, 0x0a, 0xbb,
- 0x3c, 0x41, 0x4e, 0x3d, 0xe2, 0xf0, 0x52, 0xbd, 0x06, 0x64, 0x1a, 0xbe,
- 0x86, 0xa2, 0x9b, 0x3c, 0x53, 0x67, 0xe5, 0xbe, 0xd9, 0xd5, 0xf6, 0xba,
- 0x1b, 0x90, 0x63, 0x3e, 0x0d, 0xcc, 0x46, 0xbd, 0x0f, 0xb6, 0x5c, 0x38,
- 0xb5, 0x6b, 0x09, 0x3d, 0x9b, 0x3a, 0xb9, 0x3d, 0x73, 0x3e, 0x56, 0xbd,
- 0xe5, 0xd8, 0xf6, 0xbd, 0x55, 0xc8, 0xc6, 0xbd, 0xfe, 0x0b, 0x19, 0xbe,
- 0x0a, 0xd0, 0xf8, 0x3c, 0xd7, 0x3e, 0xfb, 0xbd, 0x5f, 0x45, 0xb6, 0xbd,
- 0xa5, 0xea, 0xd7, 0x3c, 0x6f, 0xb5, 0xed, 0x3c, 0x49, 0xd2, 0x73, 0xbd,
- 0x19, 0x97, 0x8b, 0x3d, 0x0e, 0x1c, 0x09, 0xbe, 0xa4, 0x94, 0xa4, 0xbd,
- 0x9b, 0xd1, 0x92, 0x3c, 0x0a, 0xae, 0x9d, 0xbd, 0xbe, 0x89, 0xbc, 0xbd,
- 0x4c, 0x84, 0x96, 0xbd, 0x5f, 0xac, 0x4a, 0xbe, 0xbd, 0xc8, 0xeb, 0xbe,
- 0x05, 0x29, 0x15, 0x3e, 0x45, 0x49, 0xde, 0x3d, 0x5f, 0x00, 0x89, 0xbd,
- 0x10, 0xb7, 0x9f, 0xbd, 0xc9, 0x49, 0x11, 0x3e, 0x89, 0x6e, 0x1d, 0xbc,
- 0x0f, 0x96, 0x91, 0xbe, 0x7b, 0xf2, 0xef, 0xbd, 0xb9, 0x90, 0xd4, 0xbc,
- 0xcc, 0xc7, 0xd5, 0xbe, 0xa8, 0x7c, 0x9e, 0x3d, 0x69, 0x65, 0xed, 0xbe,
- 0x64, 0xa0, 0xc6, 0xbe, 0x05, 0x96, 0x09, 0xbe, 0x03, 0xe1, 0x54, 0xbe,
- 0xaf, 0xaf, 0x18, 0xbf, 0xd1, 0xcc, 0x0e, 0x3e, 0x63, 0x4d, 0xda, 0xbc,
- 0x30, 0xb4, 0x5e, 0x3d, 0x65, 0xd6, 0x53, 0xbe, 0xe4, 0xeb, 0xf0, 0x3b,
- 0x88, 0xf1, 0x65, 0x3e, 0x65, 0xb5, 0x72, 0xbd, 0xba, 0xbf, 0x97, 0xbe,
- 0xa4, 0x78, 0x47, 0xbb, 0xa5, 0x12, 0x29, 0xbd, 0x53, 0x58, 0x12, 0xbe,
- 0x9c, 0x05, 0x0b, 0x3d, 0x8a, 0x8f, 0x07, 0x3e, 0xff, 0x56, 0x1d, 0x3e,
- 0x62, 0x71, 0xf2, 0xbc, 0x91, 0xaf, 0x2b, 0xbe, 0xb4, 0x1e, 0x41, 0x3d,
- 0xfb, 0xb2, 0xab, 0xbc, 0xf5, 0x63, 0x4a, 0xbe, 0x23, 0xfa, 0x43, 0xbe,
- 0xc0, 0xe2, 0x2f, 0xbe, 0x2f, 0x5f, 0x28, 0xbd, 0x98, 0x98, 0x0f, 0xbe,
- 0x78, 0xae, 0x39, 0x3c, 0x1f, 0x8e, 0xb0, 0xbe, 0x75, 0xdf, 0x72, 0xbe,
- 0x74, 0x62, 0x11, 0xbc, 0x5f, 0x0b, 0x53, 0x3e, 0xc4, 0x43, 0x0a, 0xbe,
- 0x1a, 0x86, 0x10, 0xbd, 0x40, 0xbd, 0x90, 0xbe, 0x3d, 0xfc, 0xa5, 0x3d,
- 0x09, 0x94, 0x19, 0x3e, 0xbf, 0x4f, 0x0f, 0xbd, 0xad, 0xe6, 0xa9, 0xbe,
- 0xc5, 0x73, 0x41, 0x3c, 0xa6, 0xdb, 0x2c, 0x3d, 0xa0, 0x15, 0x08, 0xbe,
- 0xdf, 0xcc, 0x8c, 0xbe, 0x3e, 0x8e, 0xf4, 0xbd, 0x78, 0xc2, 0x75, 0x3e,
- 0x26, 0x9b, 0x9f, 0xbe, 0xce, 0x80, 0x06, 0xbe, 0x7b, 0x21, 0x4b, 0xbd,
- 0xf4, 0x82, 0x82, 0xbd, 0xc7, 0xce, 0xf5, 0xbd, 0x30, 0xa0, 0x0a, 0x3e,
- 0x85, 0x1e, 0x09, 0xbf, 0x54, 0xcf, 0x4b, 0xbe, 0x58, 0xb7, 0x83, 0xbd,
- 0xd4, 0xff, 0x02, 0x3e, 0x9b, 0x9b, 0x28, 0x3e, 0x14, 0x83, 0x89, 0x3e,
- 0x77, 0x46, 0xb9, 0xbe, 0x7a, 0xd1, 0x51, 0xbe, 0xcf, 0xa1, 0x2e, 0xbe,
- 0x74, 0x87, 0x4a, 0xbe, 0x31, 0x2f, 0x03, 0xbe, 0xec, 0x45, 0x53, 0xbe,
- 0x07, 0x4c, 0x82, 0xbd, 0x68, 0xb7, 0x4b, 0xbd, 0xa1, 0x07, 0xdd, 0xbe,
- 0xf6, 0xaa, 0x5d, 0x3e, 0xe1, 0xad, 0xd6, 0xbc, 0x9c, 0x8b, 0x40, 0xbe,
- 0x04, 0x94, 0xaa, 0xbe, 0xe1, 0x6d, 0x32, 0x3e, 0x6b, 0xa7, 0x22, 0x3e,
- 0xf4, 0x44, 0xe8, 0xbe, 0x4f, 0x21, 0x0e, 0xbe, 0xae, 0x27, 0x88, 0xbe,
- 0x5d, 0x74, 0xa2, 0x3e, 0x9e, 0x35, 0xc2, 0x3d, 0x3c, 0xb0, 0xbf, 0xbd,
- 0x69, 0xcf, 0x18, 0xbe, 0x40, 0x80, 0x42, 0xbd, 0x25, 0xd1, 0xb1, 0xbe,
- 0x6c, 0xdb, 0x22, 0xbe, 0x89, 0x58, 0xda, 0x3d, 0x7d, 0xa8, 0xf1, 0xbe,
- 0x9a, 0x40, 0x3e, 0xbd, 0xa6, 0x2e, 0xba, 0xbe, 0x37, 0x97, 0xec, 0xbd,
- 0x73, 0x5f, 0x0b, 0xbd, 0x30, 0x50, 0x41, 0x3d, 0x64, 0x36, 0xe6, 0x3b,
- 0xa6, 0x43, 0xc6, 0xbc, 0xcb, 0xc3, 0x95, 0xbe, 0x7c, 0xe9, 0xcb, 0xbd,
- 0xf2, 0x87, 0x08, 0xbe, 0x76, 0x33, 0x68, 0x3e, 0x8d, 0xb4, 0x01, 0xbe,
- 0x3e, 0x22, 0x9a, 0xbd, 0x17, 0x8e, 0xda, 0xbd, 0xc8, 0x91, 0x24, 0x3d,
- 0xf3, 0x6e, 0x78, 0x3c, 0x33, 0x9e, 0x9e, 0x3e, 0xf8, 0xc4, 0xdc, 0xbd,
- 0xd6, 0x1f, 0xa7, 0xbe, 0xfc, 0xa1, 0x57, 0xbd, 0x82, 0x22, 0x3a, 0x3c,
- 0x9b, 0xa2, 0x6b, 0x3e, 0x13, 0xf7, 0x74, 0xba, 0xdd, 0x81, 0x10, 0xbe,
- 0x54, 0x30, 0xf9, 0x3d, 0xea, 0xc7, 0x81, 0x3d, 0xf1, 0x33, 0x30, 0xbe,
- 0xd5, 0x2e, 0x6e, 0x3e, 0x21, 0x63, 0x3d, 0xbe, 0x25, 0x91, 0x1e, 0xbe,
- 0x65, 0xc5, 0x6a, 0x3e, 0x59, 0x16, 0xaa, 0xbe, 0x4b, 0xb8, 0x43, 0xbc,
- 0x86, 0xf0, 0x8a, 0xbe, 0x26, 0xf3, 0xad, 0xbd, 0x61, 0xc4, 0x0f, 0x3e,
- 0x87, 0x6a, 0x62, 0xbd, 0x7e, 0x84, 0xf0, 0xbe, 0x1c, 0x99, 0x94, 0xbc,
- 0xdf, 0xb5, 0x41, 0x3e, 0xc5, 0x68, 0x24, 0xbe, 0xc0, 0xb2, 0xf9, 0x3d,
- 0x06, 0x13, 0x3b, 0xbe, 0x8e, 0xc1, 0x72, 0xbd, 0x31, 0x01, 0x8f, 0xbb,
- 0xb4, 0xbf, 0x8b, 0xbe, 0x2a, 0x90, 0xca, 0x3d, 0xd5, 0x94, 0x8f, 0x3d,
- 0x24, 0x37, 0x80, 0xbe, 0x29, 0xac, 0x52, 0xbe, 0x3f, 0x82, 0x42, 0xbe,
- 0x7c, 0xb6, 0xd6, 0x3d, 0x6e, 0x6a, 0xe8, 0x3c, 0x72, 0xef, 0x63, 0xbd,
- 0xd3, 0x71, 0x6e, 0x3e, 0x0d, 0x71, 0xf1, 0xbe, 0x97, 0x7d, 0x41, 0xbe,
- 0x4c, 0x86, 0x59, 0xbd, 0x41, 0x4c, 0xb8, 0x3d, 0xf9, 0x76, 0xa9, 0xbd,
- 0x5d, 0xea, 0x33, 0x3d, 0x05, 0x8c, 0xeb, 0x3d, 0x46, 0xfe, 0xf1, 0x3d,
- 0xa4, 0x95, 0x50, 0xbd, 0x50, 0x39, 0xbd, 0xbc, 0x54, 0x89, 0x7f, 0x3e,
- 0xe1, 0x15, 0x29, 0xbe, 0x3c, 0xee, 0x4b, 0x3e, 0xd9, 0x53, 0x35, 0x3d,
- 0x39, 0x9e, 0x75, 0x3d, 0xc7, 0x12, 0x3c, 0x3d, 0x7e, 0x57, 0x83, 0xbc,
- 0x97, 0x90, 0x8a, 0x3d, 0x3b, 0xbd, 0x90, 0x3e, 0x04, 0xc0, 0x14, 0xbe,
- 0xa8, 0xe5, 0x64, 0xbd, 0x45, 0x1f, 0x4a, 0xbd, 0xec, 0xcf, 0xa8, 0xbd,
- 0x78, 0x13, 0x10, 0x3e, 0x53, 0xd1, 0x3a, 0x3e, 0x55, 0x37, 0x0a, 0x3e,
- 0xa2, 0x84, 0x12, 0x3e, 0x6b, 0x1f, 0x61, 0x3e, 0x59, 0xa4, 0x57, 0x3e,
- 0xde, 0xbe, 0x80, 0xbe, 0x4d, 0x66, 0xdc, 0xbd, 0x47, 0xe0, 0xa7, 0x3b,
- 0x9b, 0x00, 0x83, 0x3d, 0x4d, 0xf6, 0xad, 0xbe, 0xa3, 0x0f, 0xf9, 0x3d,
- 0x2f, 0x7b, 0x34, 0xbd, 0xc0, 0x2c, 0xb7, 0xbd, 0x77, 0x49, 0x2f, 0xbd,
- 0xea, 0x9f, 0x7a, 0x3d, 0x5a, 0xdf, 0xea, 0x3c, 0x51, 0x02, 0xd6, 0x3d,
- 0xcc, 0xa8, 0x8a, 0xbc, 0x68, 0xa6, 0x00, 0xbe, 0xdc, 0x8b, 0x6c, 0xbb,
- 0x56, 0xc0, 0xd8, 0xbc, 0x27, 0x49, 0x35, 0xbc, 0x29, 0xfd, 0x60, 0x3d,
- 0xa7, 0x5f, 0x11, 0xbe, 0xd1, 0x5a, 0xef, 0xbb, 0x2d, 0xa5, 0x2b, 0xbf,
- 0x53, 0x45, 0xb0, 0x3d, 0xdf, 0x24, 0x80, 0x3d, 0x21, 0x97, 0x87, 0x3d,
- 0x69, 0xbd, 0xa3, 0x3d, 0xef, 0xfd, 0xbd, 0xbe, 0xdb, 0xa7, 0x8f, 0x3e,
- 0xbc, 0xd8, 0x8e, 0xbe, 0xa7, 0xa1, 0x84, 0xbc, 0x78, 0xb7, 0x11, 0xbe,
- 0x1e, 0xc5, 0xc8, 0x3d, 0xc4, 0x3d, 0x6b, 0x3e, 0x8b, 0x1a, 0x67, 0xbd,
- 0xdd, 0x99, 0xb2, 0xbe, 0x3e, 0x02, 0xec, 0x3e, 0x8f, 0xca, 0x10, 0xbe,
- 0x50, 0x0e, 0xd8, 0xbd, 0x2f, 0xad, 0x05, 0x3e, 0x4f, 0x9b, 0x1c, 0xbe,
- 0xf7, 0x4e, 0x4b, 0x3d, 0x46, 0xd6, 0xfb, 0xbe, 0xc2, 0x09, 0x0d, 0x3e,
- 0x21, 0x00, 0x4b, 0xbe, 0x4f, 0xda, 0x66, 0xbd, 0x7e, 0xa1, 0x24, 0xbe,
- 0xb0, 0x85, 0x31, 0x3c, 0xea, 0x86, 0xf2, 0xbd, 0x2c, 0xce, 0x5d, 0x3b,
- 0x18, 0x74, 0xfe, 0x3d, 0x17, 0xb4, 0x1b, 0xbe, 0xa2, 0xd1, 0x33, 0xbe,
- 0xdc, 0x6b, 0x96, 0x3d, 0x2b, 0x58, 0x10, 0xbe, 0x2b, 0x7c, 0xd6, 0xbd,
- 0x2a, 0xda, 0x6c, 0x3e, 0x79, 0x06, 0x8f, 0x3e, 0xd5, 0xf2, 0x01, 0x3f,
- 0x41, 0x23, 0x8d, 0x3d, 0x91, 0x02, 0x6b, 0x3d, 0x27, 0xd0, 0x9f, 0x3e,
- 0x45, 0xe1, 0x9f, 0x3e, 0x1c, 0xde, 0xd0, 0x3d, 0xf7, 0xda, 0x2d, 0x3d,
- 0x44, 0x00, 0x29, 0xbf, 0x89, 0xf8, 0xfe, 0x3d, 0xdb, 0x49, 0x8e, 0x3d,
- 0xe5, 0xca, 0xa7, 0xbe, 0x5c, 0x16, 0x4f, 0x3e, 0xf0, 0x8a, 0x89, 0xbe,
- 0xc6, 0xc5, 0x1e, 0x3e, 0x7d, 0x0e, 0x5b, 0xbe, 0x96, 0xed, 0x7c, 0xbd,
- 0x4a, 0xee, 0xc0, 0xbc, 0xd0, 0xf5, 0x28, 0x3b, 0xf8, 0x56, 0x9f, 0x3d,
- 0xca, 0x03, 0xd2, 0x3c, 0x50, 0xea, 0xd7, 0xbd, 0x25, 0x0e, 0x99, 0x3c,
- 0x9f, 0x14, 0xce, 0xbb, 0x15, 0xaa, 0x92, 0xbd, 0xc0, 0x43, 0x29, 0x3e,
- 0xaa, 0xcd, 0x95, 0xbd, 0x5e, 0xc2, 0x12, 0xbe, 0x6c, 0x01, 0x40, 0x3e,
- 0xc5, 0x44, 0x2f, 0xbf, 0xda, 0x76, 0x3e, 0xbe, 0xf8, 0x81, 0xb0, 0xbd,
- 0x63, 0xcd, 0x13, 0x3e, 0x37, 0x24, 0x84, 0x3e, 0xa4, 0x3d, 0xc0, 0xbe,
- 0x4a, 0x0d, 0xa3, 0xbe, 0x33, 0xb5, 0xaa, 0x3c, 0xbf, 0x7d, 0x7f, 0xbe,
- 0xc5, 0x8e, 0x7f, 0x3e, 0x3a, 0xca, 0xb8, 0x3d, 0xb2, 0x56, 0xee, 0xbc,
- 0x80, 0x68, 0xd8, 0xbd, 0xef, 0x0d, 0x80, 0xbd, 0x0f, 0x95, 0xb8, 0x3e,
- 0x5d, 0x8f, 0x18, 0x3d, 0x8b, 0xc6, 0x3a, 0xbe, 0xe5, 0xdf, 0xfc, 0xbd,
- 0x88, 0xe4, 0x5b, 0x3e, 0xfa, 0xff, 0xe1, 0x3e, 0x3e, 0x24, 0x0c, 0xbe,
- 0x44, 0xeb, 0x73, 0xbe, 0x5e, 0x2e, 0xe9, 0xbd, 0x4e, 0x6e, 0x5e, 0xbd,
- 0x1b, 0x6f, 0x7e, 0x3d, 0xfb, 0x93, 0x15, 0xbc, 0x32, 0x41, 0x7e, 0xbd,
- 0x3b, 0x1a, 0x3b, 0xbe, 0x53, 0x0a, 0xd2, 0xbd, 0x36, 0xc1, 0x08, 0xbe,
- 0x10, 0x6f, 0x11, 0xbe, 0x24, 0x89, 0x08, 0x3e, 0xd2, 0xc0, 0x87, 0x3d,
- 0x57, 0x7f, 0x32, 0x3d, 0xa4, 0x65, 0xc0, 0x3c, 0x84, 0xee, 0x8c, 0xbe,
- 0x1b, 0xc2, 0x43, 0xbe, 0xad, 0xcb, 0x2b, 0xbe, 0xe6, 0x1d, 0x0e, 0xbe,
- 0x60, 0x97, 0xd9, 0xbd, 0x50, 0xdd, 0x18, 0x3e, 0xec, 0xd4, 0x2a, 0x3e,
- 0xb1, 0x14, 0x94, 0x3d, 0xa4, 0xba, 0xcc, 0xbe, 0x4c, 0xa9, 0x39, 0xbe,
- 0x0e, 0x6e, 0x8c, 0xbe, 0xc1, 0x9f, 0x4e, 0xbe, 0xf9, 0x4b, 0xd8, 0xbd,
- 0xc8, 0x71, 0x96, 0xbc, 0xc5, 0xad, 0x9a, 0xbe, 0x56, 0xe7, 0xe6, 0xbd,
- 0xfc, 0xd2, 0x05, 0xbe, 0xb3, 0x53, 0x2e, 0xbe, 0xef, 0x83, 0x3c, 0xbd,
- 0xbe, 0x0f, 0xf6, 0xbd, 0x00, 0xa9, 0xcb, 0xbc, 0xd2, 0xdf, 0x79, 0xbe,
- 0x0d, 0x9a, 0x1c, 0x3e, 0x2b, 0x5f, 0x85, 0xbd, 0x1e, 0xb4, 0x4b, 0xbd,
- 0xee, 0xac, 0xc5, 0x3c, 0x55, 0xcf, 0x9e, 0xbe, 0xf7, 0xca, 0x08, 0xbe,
- 0x92, 0x17, 0x7d, 0x3c, 0xbc, 0x3d, 0xee, 0xbd, 0x38, 0x28, 0x50, 0x3d,
- 0x5d, 0x08, 0x36, 0x3d, 0x30, 0x49, 0x70, 0xbd, 0xe6, 0xbe, 0x90, 0x3d,
- 0x66, 0x53, 0x48, 0xbe, 0x94, 0x5f, 0x7a, 0xbe, 0xd3, 0xd8, 0x51, 0x3c,
- 0x5f, 0x1f, 0x55, 0xbe, 0x1f, 0x88, 0x9c, 0xbd, 0xdd, 0x1c, 0x8d, 0x3c,
- 0xa4, 0x7f, 0xc4, 0xbe, 0x35, 0x49, 0x08, 0x3e, 0xec, 0x9d, 0xc2, 0x3c,
- 0xc3, 0x04, 0x0e, 0x3a, 0x50, 0xab, 0x99, 0xbd, 0x25, 0xcd, 0x7f, 0xbe,
- 0x8f, 0x54, 0xd6, 0xbd, 0x7a, 0x11, 0x70, 0xbe, 0x9a, 0x85, 0x4e, 0xbe,
- 0x33, 0xd9, 0x4a, 0xbc, 0xa0, 0x55, 0xf0, 0xbe, 0xb2, 0xb2, 0xc2, 0x3d,
- 0xc3, 0x02, 0x80, 0xbe, 0xa2, 0xef, 0x21, 0x3e, 0xb4, 0x99, 0xc7, 0xbd,
- 0xbb, 0x56, 0x32, 0x3d, 0x8c, 0xb0, 0x55, 0xbe, 0xe0, 0x66, 0x80, 0xbe,
- 0x03, 0xc9, 0x12, 0x3e, 0x8e, 0xd5, 0x5c, 0xbd, 0x7c, 0x21, 0x01, 0x3e,
- 0xb4, 0x9b, 0x44, 0xbc, 0x4c, 0x7e, 0xbe, 0x3c, 0xd2, 0xa4, 0xb5, 0x3d,
- 0x1d, 0xc4, 0x2d, 0xbf, 0x7e, 0x5c, 0xaa, 0xbd, 0xfa, 0x6c, 0x57, 0x3e,
- 0xbe, 0x0f, 0xc8, 0xbc, 0x12, 0x57, 0xf4, 0xbd, 0x15, 0x8f, 0x4a, 0xbd,
- 0x8a, 0x2f, 0x39, 0x3e, 0xc1, 0xfa, 0xd7, 0xbd, 0x02, 0xb3, 0xdd, 0xbd,
- 0xa3, 0xb2, 0x7e, 0xbe, 0x8c, 0x52, 0x05, 0xbf, 0x60, 0xb1, 0x16, 0xbe,
- 0x1f, 0x5a, 0xbb, 0xbe, 0x82, 0x76, 0xe5, 0xbc, 0x87, 0x11, 0xc0, 0xbc,
- 0x77, 0xae, 0xaa, 0xbe, 0xb3, 0xd1, 0x24, 0xbe, 0x1f, 0x72, 0x49, 0xbe,
- 0xb3, 0x74, 0x89, 0x3d, 0x8f, 0xb3, 0x3b, 0xbd, 0x88, 0x0b, 0xba, 0x3a,
- 0x54, 0x41, 0x33, 0xbe, 0x8b, 0xb9, 0x51, 0xbe, 0x22, 0x19, 0x0b, 0x3e,
- 0x13, 0x25, 0x0b, 0xbf, 0x7c, 0x8b, 0x75, 0x3e, 0x12, 0xca, 0x3c, 0xbe,
- 0x81, 0xe1, 0x8f, 0x3d, 0x8d, 0x60, 0xfd, 0xbd, 0x86, 0x85, 0xaa, 0x3d,
- 0x31, 0xea, 0x1c, 0xbf, 0xf2, 0x3a, 0x20, 0xbe, 0xb0, 0x0a, 0x83, 0xbe,
- 0x5f, 0xb8, 0x06, 0x3d, 0x7e, 0x27, 0x8a, 0x3d, 0x31, 0x62, 0x1e, 0xbe,
- 0xc7, 0x50, 0xb6, 0xbd, 0x58, 0x76, 0x2c, 0xbc, 0x79, 0xa6, 0x49, 0x3e,
- 0x27, 0x92, 0xbd, 0xbc, 0xac, 0x17, 0xa3, 0xbc, 0x5f, 0x95, 0xb5, 0xbd,
- 0x2e, 0x21, 0x2d, 0xbc, 0x4b, 0x55, 0x87, 0x3d, 0xa8, 0x27, 0x2e, 0xbd,
- 0x09, 0x73, 0xc6, 0x3d, 0x1a, 0x92, 0x01, 0xbe, 0x93, 0x8f, 0x14, 0x3e,
- 0xf4, 0xf0, 0x0d, 0xbe, 0x07, 0xf1, 0x7a, 0xbd, 0x1d, 0x7a, 0xbd, 0xbd,
- 0x16, 0x8a, 0x10, 0x3e, 0xfd, 0xe4, 0x4a, 0x3d, 0x0a, 0x3e, 0x10, 0xbc,
- 0x88, 0x3d, 0xe6, 0x3d, 0x1b, 0xb8, 0xd7, 0xbe, 0xfd, 0x60, 0x28, 0x3d,
- 0x6a, 0x7b, 0x2d, 0x3e, 0x58, 0xb9, 0x87, 0xbd, 0x46, 0xbe, 0x1f, 0x3e,
- 0x0b, 0xbb, 0x34, 0xbd, 0x53, 0x5a, 0x1f, 0x3d, 0x60, 0xb7, 0xba, 0x3e,
- 0x82, 0x97, 0xb9, 0xbe, 0x69, 0xef, 0xf8, 0xbe, 0xf6, 0xcb, 0xcf, 0x3d,
- 0x86, 0xb5, 0x94, 0x3e, 0x4e, 0x80, 0xb4, 0xbe, 0x13, 0x1d, 0xf4, 0x3d,
- 0x78, 0x7d, 0xc1, 0x3d, 0x09, 0x80, 0x91, 0xbe, 0x18, 0x19, 0x78, 0xbd,
- 0x53, 0x20, 0x68, 0x3c, 0xde, 0x9e, 0xe2, 0xbd, 0x04, 0x09, 0xf2, 0xbd,
- 0xff, 0xd1, 0x28, 0xbd, 0x00, 0x34, 0x53, 0xbe, 0xfc, 0xad, 0x49, 0x3e,
- 0xa2, 0xf7, 0xdb, 0xbd, 0xbc, 0x4f, 0xd8, 0xbd, 0x1d, 0xd9, 0x5f, 0xbd,
- 0xf6, 0xfd, 0x8f, 0xbd, 0xc4, 0x00, 0xda, 0xbd, 0x7a, 0x4d, 0xf7, 0xbd,
- 0x4d, 0x8d, 0x48, 0xbd, 0x0a, 0x45, 0x48, 0x3e, 0x45, 0x57, 0x23, 0x3d,
- 0x4c, 0x51, 0x92, 0xbd, 0x3b, 0xab, 0x20, 0xbe, 0xf4, 0x75, 0xb6, 0x3e,
- 0x32, 0xdb, 0x52, 0x3e, 0x2e, 0x40, 0x16, 0xbe, 0x08, 0x2b, 0x3b, 0xbe,
- 0x5f, 0x18, 0x17, 0x3e, 0xfa, 0xcb, 0xd3, 0xbd, 0x35, 0x0e, 0x9b, 0xbc,
- 0xfa, 0x81, 0xfa, 0xbd, 0x97, 0x90, 0xc9, 0x3d, 0x4d, 0x24, 0x23, 0xbe,
- 0xef, 0xc6, 0xc6, 0x3d, 0x3d, 0xcc, 0xe4, 0x3b, 0xe2, 0x55, 0x8f, 0xbe,
- 0x07, 0x09, 0x01, 0x3e, 0xe1, 0xf9, 0xe7, 0xbd, 0xcd, 0x70, 0xa7, 0xbe,
- 0x76, 0x78, 0xdb, 0x3e, 0x7e, 0xed, 0x00, 0x3e, 0x67, 0x3b, 0x5e, 0xbe,
- 0x04, 0x11, 0x08, 0x3e, 0x96, 0x7e, 0x56, 0x3e, 0x28, 0xb6, 0x2a, 0x3e,
- 0x8c, 0xdb, 0x59, 0xbe, 0x24, 0x7d, 0xa8, 0xbd, 0x3c, 0x0c, 0x9c, 0xbe,
- 0x2f, 0x2e, 0xa7, 0x3d, 0x43, 0xf6, 0xf4, 0xbc, 0xdc, 0x2c, 0x2f, 0x3d,
- 0xbe, 0x03, 0x55, 0x3e, 0x95, 0x19, 0xa9, 0xbd, 0xfb, 0xf1, 0xe0, 0xbd,
- 0xb2, 0x2c, 0xe4, 0x3d, 0x45, 0x6a, 0x2d, 0xbd, 0x22, 0x8d, 0x79, 0x3d,
- 0x68, 0xe6, 0x78, 0x3e, 0x03, 0x1d, 0x0a, 0xbe, 0x23, 0x0d, 0x42, 0x3d,
- 0xca, 0x02, 0xc8, 0xbd, 0xe3, 0x17, 0x14, 0xbf, 0x64, 0x9e, 0x90, 0xbe,
- 0x18, 0xa7, 0xed, 0xbe, 0x9b, 0xf6, 0x9b, 0x3c, 0x53, 0xfe, 0x81, 0x3e,
- 0xad, 0xa2, 0x19, 0x3e, 0xaa, 0xf9, 0xcc, 0xbd, 0x1d, 0x45, 0x79, 0xbd,
- 0xce, 0x68, 0x4d, 0xbe, 0x2f, 0xf7, 0x47, 0x3d, 0x42, 0xa8, 0x04, 0xbe,
- 0x25, 0x17, 0xfc, 0xbe, 0xca, 0x95, 0x85, 0xbd, 0x69, 0xc9, 0xe9, 0x3d,
- 0xff, 0x7c, 0x73, 0x3d, 0xb4, 0x44, 0xd9, 0x3d, 0x58, 0x07, 0x89, 0xbd,
- 0xc7, 0x52, 0xed, 0xbe, 0xd3, 0xb5, 0x1b, 0xbe, 0xb8, 0xcf, 0x9e, 0x3d,
- 0xf8, 0x25, 0xa2, 0x3e, 0xd5, 0xb1, 0xf5, 0x3e, 0x74, 0xc8, 0x9b, 0x3d,
- 0xc9, 0xde, 0xe4, 0x3d, 0x34, 0xc6, 0x9d, 0x3e, 0x16, 0x41, 0x79, 0x3e,
- 0x0a, 0xe6, 0x17, 0xbe, 0xbc, 0xb4, 0xe4, 0x3e, 0xba, 0xf4, 0x27, 0xbe,
- 0xe0, 0x8c, 0xcb, 0x3e, 0xb9, 0x62, 0x9f, 0xbd, 0x4b, 0x00, 0x0e, 0x3e,
- 0x4d, 0x2e, 0x54, 0x3d, 0xe1, 0x9d, 0x34, 0xbe, 0xaa, 0x02, 0x4c, 0x3e,
- 0x68, 0xa4, 0x52, 0xbd, 0x6a, 0x40, 0xa0, 0x3d, 0x5a, 0x2e, 0x5b, 0xbd,
- 0x48, 0x67, 0x00, 0xbc, 0x63, 0x8b, 0x24, 0x3e, 0x20, 0xdb, 0xc3, 0x3e,
- 0x42, 0x81, 0xca, 0x3e, 0x5f, 0xf1, 0xb1, 0xbe, 0x97, 0x58, 0xb6, 0xbe,
- 0x45, 0xd5, 0x94, 0x3d, 0x5e, 0x4e, 0xe3, 0xbe, 0x48, 0x7b, 0xf7, 0x3e,
- 0xa7, 0x53, 0xaf, 0xbe, 0x23, 0xbb, 0xb5, 0xbd, 0x3d, 0x7c, 0x7d, 0x3d,
- 0x07, 0x4c, 0x28, 0xbe, 0xe9, 0xec, 0x1a, 0xbe, 0x17, 0x05, 0x53, 0xbb,
- 0x96, 0x0b, 0x7f, 0x3d, 0x3b, 0x6e, 0x59, 0xbc, 0x09, 0x0b, 0xff, 0xbd,
- 0x0c, 0x90, 0x9d, 0xbe, 0xc7, 0xf4, 0x53, 0xbd, 0x3e, 0xba, 0xe5, 0xbd,
- 0xe7, 0xbe, 0xf1, 0xbd, 0xee, 0x4e, 0x2d, 0x3d, 0xe4, 0x1d, 0xd0, 0x3d,
- 0x41, 0x5f, 0xe1, 0xbe, 0x4c, 0x9b, 0x2a, 0xbe, 0x60, 0xf7, 0x43, 0xbd,
- 0x22, 0x30, 0x07, 0x3d, 0x63, 0x77, 0x05, 0xbc, 0x86, 0x04, 0xeb, 0xbd,
- 0xa8, 0x32, 0x32, 0x3e, 0x20, 0x3e, 0xac, 0xbd, 0x50, 0xc7, 0x8f, 0xbe,
- 0xff, 0xdf, 0x97, 0xbe, 0x99, 0x25, 0xdf, 0x3d, 0x90, 0x16, 0xbf, 0x3c,
- 0x11, 0x04, 0x27, 0x3e, 0x7e, 0x48, 0x25, 0x3e, 0x9a, 0x82, 0x64, 0x3e,
- 0x27, 0xdd, 0x8d, 0xbe, 0xef, 0xe5, 0x0b, 0x3e, 0xf7, 0x88, 0xca, 0xbd,
- 0xef, 0x40, 0x03, 0xbd, 0xaa, 0xf7, 0x65, 0x3d, 0xdc, 0x88, 0x2a, 0xbe,
- 0xf2, 0xbc, 0x1b, 0xbe, 0xd6, 0xa7, 0x1f, 0xbe, 0x08, 0xc0, 0x1b, 0xbe,
- 0xf7, 0xc3, 0xad, 0x3d, 0x10, 0xd3, 0x48, 0x3d, 0xe5, 0x67, 0x60, 0x3e,
- 0x87, 0xe0, 0x13, 0xbd, 0x08, 0xdc, 0x2b, 0xbe, 0x0d, 0x61, 0x47, 0xbe,
- 0xf2, 0xc4, 0x6b, 0x3d, 0x47, 0x90, 0xfa, 0xbb, 0xb8, 0xad, 0x7b, 0x3d,
- 0xb6, 0x88, 0x7d, 0xbe, 0xfe, 0x1f, 0xb5, 0xbd, 0xc7, 0x8b, 0xc1, 0x3d,
- 0xb6, 0x2c, 0x33, 0xbc, 0x18, 0x34, 0xa9, 0x3b, 0x06, 0xeb, 0x1b, 0x3d,
- 0x84, 0x3e, 0xe6, 0x3d, 0x87, 0x12, 0xf9, 0xbd, 0xb8, 0x9c, 0x6e, 0xbd,
- 0xd8, 0x70, 0x4f, 0x3e, 0xc7, 0x97, 0xa8, 0xbd, 0xf2, 0x85, 0x68, 0xbe,
- 0x31, 0xb6, 0xda, 0xbd, 0x08, 0xb7, 0x01, 0xbe, 0x6c, 0x6f, 0xd3, 0xbd,
- 0xfd, 0x36, 0xc8, 0xbe, 0xde, 0x5f, 0x92, 0xbc, 0x5f, 0x48, 0x1f, 0x3e,
- 0x1f, 0x7a, 0xd8, 0x3d, 0x6b, 0xea, 0x7f, 0x3e, 0x08, 0x5b, 0x8c, 0xbe,
- 0xcc, 0xb4, 0x6d, 0xbe, 0xe9, 0xe4, 0x8d, 0xbd, 0x23, 0x99, 0x2d, 0xbd,
- 0xe1, 0x8f, 0x3a, 0x3d, 0x6f, 0xde, 0xd7, 0xbd, 0xcb, 0x45, 0xf1, 0x3d,
- 0x62, 0x87, 0xab, 0xbc, 0x28, 0x8d, 0xde, 0x3d, 0x7b, 0xf0, 0xa3, 0x3d,
- 0x07, 0x1e, 0xa0, 0x3d, 0x0b, 0x74, 0xc5, 0xbc, 0xf8, 0x8a, 0xd5, 0x3e,
- 0x08, 0xa9, 0xbc, 0x3d, 0x06, 0xe4, 0x7e, 0x3e, 0x00, 0x4c, 0x15, 0xbd,
- 0xc4, 0x69, 0xf3, 0x3c, 0xd1, 0x87, 0x63, 0xbd, 0xb2, 0x9f, 0x18, 0x3d,
- 0xb8, 0x50, 0xab, 0xbe, 0x9e, 0xf7, 0x30, 0xbd, 0xbd, 0xc0, 0x54, 0xbd,
- 0x45, 0xe2, 0x68, 0x3e, 0x0b, 0xfc, 0x77, 0x3c, 0x69, 0x99, 0x9d, 0xbd,
- 0xa0, 0xee, 0x33, 0x3e, 0xa7, 0xbe, 0x9f, 0xbd, 0xed, 0x13, 0xc7, 0x3c,
- 0xd2, 0x70, 0x52, 0x3d, 0xcd, 0xc2, 0x29, 0x3d, 0x54, 0xc1, 0x0b, 0xbe,
- 0xd7, 0x96, 0x04, 0xbe, 0x61, 0xbb, 0x89, 0xbd, 0xe2, 0x79, 0xd3, 0x3d,
- 0x91, 0x96, 0xda, 0xbd, 0x53, 0x76, 0x1b, 0xbe, 0x00, 0x2e, 0x69, 0x3e,
- 0x1b, 0xb4, 0xca, 0xbd, 0xd7, 0x78, 0x3a, 0xbe, 0x39, 0xaf, 0x32, 0xbe,
- 0x01, 0x2c, 0xd6, 0xbc, 0x33, 0xf9, 0xf0, 0x3d, 0xec, 0xd5, 0xa0, 0xbe,
- 0xc1, 0x45, 0x3f, 0xbe, 0x06, 0x72, 0x8e, 0xbd, 0x84, 0x68, 0x4a, 0x3d,
- 0xba, 0xa8, 0x9f, 0xbd, 0xc2, 0x66, 0x0b, 0x3e, 0x58, 0x4a, 0xe4, 0xbc,
- 0x34, 0xfa, 0xf8, 0x3d, 0x2d, 0x27, 0x6f, 0xbd, 0xf4, 0x1e, 0x70, 0xbd,
- 0x37, 0xb7, 0x32, 0xbd, 0x10, 0x3f, 0x26, 0xbe, 0x80, 0xcc, 0x34, 0x3d,
- 0xec, 0x50, 0x62, 0x3d, 0x1b, 0xcd, 0xeb, 0xbc, 0x17, 0x78, 0x8b, 0x3d,
- 0xf6, 0x81, 0x25, 0xbe, 0xd3, 0x3a, 0xfa, 0xbe, 0x0e, 0xbb, 0xfd, 0x3d,
- 0xcf, 0x9f, 0x8a, 0x3d, 0x3e, 0xa5, 0x86, 0xbe, 0x22, 0x62, 0xdc, 0xbd,
- 0xaa, 0x13, 0x34, 0xbe, 0x8e, 0xe3, 0x9b, 0x3e, 0x85, 0x85, 0xcb, 0x3d,
- 0x0c, 0x8e, 0xa6, 0x3d, 0x9c, 0x15, 0x7c, 0xbd, 0xf3, 0xa3, 0x8b, 0xbe,
- 0xdc, 0x3f, 0xa4, 0x3e, 0xe4, 0xbe, 0xcc, 0xbd, 0x4f, 0x1c, 0x7b, 0xbd,
- 0x7b, 0xdf, 0x4e, 0xbe, 0xd5, 0x5c, 0x31, 0x3c, 0xb2, 0x34, 0x9b, 0x3d,
- 0x17, 0xa7, 0xb3, 0xbd, 0xee, 0xf7, 0x5e, 0x3e, 0xd1, 0xc3, 0x1f, 0xbd,
- 0x86, 0xfe, 0x25, 0xbe, 0x73, 0x86, 0x19, 0xbd, 0xdb, 0x5e, 0x05, 0x3d,
- 0x0e, 0x09, 0x47, 0x3d, 0x05, 0x1a, 0x2d, 0xbe, 0xb2, 0x6a, 0x93, 0xbd,
- 0x50, 0x90, 0x1e, 0xbd, 0xec, 0x57, 0x91, 0x3e, 0x2d, 0x19, 0x72, 0xbd,
- 0x5f, 0xaa, 0x76, 0x3e, 0x39, 0xeb, 0xb1, 0x3d, 0x66, 0xc5, 0x1f, 0x3b,
- 0x5c, 0x9d, 0x97, 0x3e, 0x13, 0x9c, 0x47, 0xbe, 0xa9, 0x4f, 0xef, 0xbc,
- 0xe0, 0xad, 0x53, 0xbc, 0x32, 0x1a, 0xac, 0x3d, 0xdd, 0x8e, 0x84, 0x3e,
- 0x54, 0x5c, 0xe9, 0xbd, 0x4e, 0xc4, 0xc1, 0x3e, 0x90, 0x25, 0xa0, 0x3e,
- 0xa5, 0xef, 0x6f, 0xbe, 0xdd, 0xa3, 0x83, 0xbd, 0xb0, 0xed, 0xf0, 0xbc,
- 0xe4, 0x45, 0x9e, 0x3d, 0xd9, 0xc3, 0x5e, 0xbd, 0x62, 0x8e, 0xf7, 0x3d,
- 0x6a, 0x9f, 0xbe, 0x3e, 0x48, 0xc0, 0x56, 0xbe, 0x40, 0x4b, 0xc7, 0xbd,
- 0x79, 0x03, 0xa0, 0x3d, 0x9f, 0xd4, 0x32, 0x3d, 0xd0, 0x10, 0x40, 0x3d,
- 0x04, 0x3b, 0xff, 0x3d, 0x45, 0x5a, 0xad, 0xbb, 0xcc, 0x7e, 0x8d, 0x3d,
- 0x87, 0xdd, 0x6f, 0xbc, 0x9f, 0x05, 0x4a, 0x3e, 0x7a, 0x94, 0x28, 0xbe,
- 0x47, 0x1b, 0x1c, 0x3d, 0xdd, 0xfe, 0xb2, 0xbc, 0xcc, 0x4d, 0x4b, 0x3e,
- 0x75, 0x8d, 0x36, 0x3e, 0x9d, 0x07, 0xe0, 0xbc, 0xa8, 0xc3, 0x70, 0x3e,
- 0xc4, 0xa6, 0x0f, 0x3d, 0xe6, 0x40, 0xa7, 0xbd, 0x57, 0xca, 0xdd, 0xbd,
- 0x45, 0x01, 0x3b, 0x3e, 0x3d, 0xc2, 0x9d, 0xbe, 0x68, 0x46, 0x40, 0xbe,
- 0x03, 0xbd, 0x08, 0x3e, 0x4e, 0x03, 0x01, 0xbe, 0x8d, 0x79, 0xe6, 0xbd,
- 0xdb, 0xbf, 0x18, 0xbe, 0x95, 0x0a, 0x4c, 0xbe, 0xd4, 0xd4, 0x10, 0x3e,
- 0x53, 0x53, 0x81, 0x3e, 0x46, 0x48, 0x00, 0x3e, 0x2d, 0x03, 0xce, 0x3d,
- 0x07, 0xd8, 0x67, 0xbe, 0xf8, 0x57, 0xcd, 0x3d, 0x19, 0x0a, 0xb7, 0xbd,
- 0xe4, 0x94, 0x2c, 0xbe, 0xc7, 0x5d, 0x76, 0x3d, 0x9e, 0xa0, 0x17, 0xbe,
- 0xd7, 0x98, 0x80, 0x3e, 0x9f, 0x9f, 0xbb, 0xbd, 0xb6, 0x87, 0x6f, 0x3d,
- 0x1f, 0x09, 0x14, 0xbe, 0x9d, 0x64, 0x0e, 0xbe, 0x8d, 0x1c, 0x22, 0xbd,
- 0x59, 0x4a, 0xd3, 0xbd, 0x24, 0xb9, 0xff, 0xbd, 0x07, 0x5e, 0xc9, 0xbc,
- 0x65, 0xda, 0xf4, 0xbd, 0x14, 0xcf, 0x1a, 0x3c, 0x9e, 0x5e, 0x31, 0xbd,
- 0x00, 0xb9, 0x27, 0xbd, 0x67, 0xc0, 0xc0, 0x3e, 0xdf, 0x5b, 0x8f, 0xbd,
- 0xaf, 0xad, 0x88, 0x3e, 0x27, 0x57, 0xdb, 0xbd, 0x88, 0xd0, 0x9d, 0x3e,
- 0x94, 0x99, 0x6b, 0xbd, 0xd6, 0x5e, 0x9c, 0x3e, 0x24, 0xb0, 0x5d, 0x3e,
- 0xbb, 0x18, 0xea, 0x3d, 0xef, 0xc2, 0x84, 0x3c, 0x2a, 0xbc, 0x09, 0x3e,
- 0xc7, 0xad, 0x34, 0x3c, 0x81, 0x62, 0xa9, 0x3e, 0xa8, 0xc5, 0x97, 0x3d,
- 0x1e, 0xdc, 0x57, 0xbe, 0x95, 0x9a, 0x85, 0x3e, 0x3a, 0x80, 0x68, 0xbc,
- 0x62, 0xf7, 0x8c, 0x3d, 0xb1, 0x7f, 0xa0, 0x3c, 0x33, 0xfd, 0x09, 0xbe,
- 0xbc, 0x21, 0xa1, 0xbd, 0xa1, 0x7f, 0xce, 0x3d, 0x7b, 0xbd, 0x6f, 0x3c,
- 0x42, 0xec, 0x9f, 0x39, 0xb5, 0x83, 0x63, 0xbe, 0xcd, 0x0f, 0x19, 0x3e,
- 0xba, 0xda, 0x27, 0x3e, 0x4b, 0x18, 0xb9, 0x3c, 0x1d, 0x8c, 0x0f, 0x3e,
- 0xec, 0x03, 0x66, 0xbe, 0x51, 0x37, 0x6f, 0x3e, 0x70, 0x12, 0x98, 0x3e,
- 0xd6, 0xf4, 0xc6, 0x3d, 0xb3, 0x46, 0xcd, 0x3d, 0x37, 0x61, 0x56, 0x3e,
- 0x00, 0x98, 0x0d, 0xbd, 0xcf, 0x36, 0x7a, 0xbe, 0x7d, 0x38, 0x68, 0xbe,
- 0x1b, 0xd4, 0x2e, 0x3e, 0xab, 0x1f, 0xa3, 0xbd, 0x6d, 0x46, 0xdb, 0xbd,
- 0x8e, 0x9f, 0x60, 0xbe, 0xfe, 0x76, 0x86, 0xbd, 0x80, 0xb1, 0x18, 0xbc,
- 0x0c, 0x39, 0xa6, 0x3d, 0x46, 0xd7, 0x2d, 0x3e, 0xc4, 0x48, 0xae, 0xbc,
- 0x90, 0xa1, 0x41, 0x3e, 0xdc, 0xf7, 0xc3, 0xbd, 0xa1, 0x56, 0x17, 0x3e,
- 0xe3, 0x6d, 0xd0, 0xbd, 0xac, 0x5b, 0xf0, 0xbd, 0xd2, 0xa2, 0x91, 0x3d,
- 0x16, 0x29, 0xa8, 0xbd, 0x40, 0x04, 0x50, 0xbe, 0xfc, 0x08, 0xa6, 0x3e,
- 0xa4, 0x07, 0x71, 0xbd, 0x6c, 0xb1, 0x93, 0xbd, 0x1b, 0xe2, 0xa1, 0x3e,
- 0x5c, 0x8a, 0xca, 0x3c, 0x4f, 0xfd, 0x3d, 0x3d, 0x75, 0xf8, 0xb3, 0x3e,
- 0xb1, 0x61, 0xcd, 0xbd, 0xc3, 0x7f, 0x04, 0x3e, 0xd6, 0x38, 0xa5, 0x3c,
- 0x7b, 0x4d, 0x07, 0xbe, 0xf1, 0x3e, 0xb5, 0xbd, 0x3b, 0x07, 0x30, 0x3e,
- 0xf8, 0x60, 0xdd, 0xbd, 0x35, 0x92, 0x04, 0xbd, 0xc9, 0x10, 0x12, 0x3e,
- 0xe2, 0xc1, 0xc1, 0xbe, 0x8d, 0x1f, 0x50, 0xbc, 0x55, 0x24, 0x8e, 0x3d,
- 0xf4, 0x10, 0x4b, 0x3e, 0xd9, 0x20, 0x45, 0x3e, 0x43, 0x70, 0x52, 0x3c,
- 0x89, 0x3a, 0x04, 0x3e, 0x26, 0xf1, 0xb6, 0x3d, 0xcf, 0x5a, 0x87, 0x3d,
- 0x9c, 0xce, 0x37, 0x3e, 0xea, 0xe4, 0x8a, 0xbe, 0x8c, 0x43, 0x93, 0xbd,
- 0x0b, 0x92, 0x08, 0xbe, 0xd2, 0xcc, 0x18, 0xbd, 0x53, 0xfd, 0xd5, 0xbb,
- 0xa2, 0x91, 0xab, 0xbd, 0x7f, 0xec, 0x32, 0xbe, 0x3b, 0x61, 0xa6, 0x3e,
- 0xa4, 0x91, 0x99, 0xbd, 0x8a, 0x44, 0xc3, 0xbc, 0xf2, 0x09, 0x3f, 0xbe,
- 0xa8, 0x39, 0xee, 0xbd, 0xc1, 0xfb, 0xac, 0x3d, 0x4f, 0xf6, 0xbc, 0xbe,
- 0x3b, 0xf7, 0x0a, 0x3e, 0x29, 0x03, 0xc2, 0x3d, 0xed, 0xb4, 0x13, 0x3e,
- 0xe5, 0x9d, 0x69, 0x3d, 0x1f, 0x13, 0x3c, 0x3e, 0x8f, 0xc0, 0x3a, 0x3e,
- 0x5e, 0xab, 0x0f, 0xbe, 0x97, 0xa3, 0xee, 0x3d, 0x6b, 0xbc, 0x0d, 0xbc,
- 0xda, 0xe9, 0x92, 0x3e, 0xb1, 0x5b, 0xfb, 0x3d, 0x42, 0x03, 0x74, 0xbe,
- 0xd4, 0xa9, 0x2b, 0xbe, 0xf9, 0x68, 0x3e, 0xbe, 0xe6, 0x16, 0xdf, 0xbe,
- 0xf2, 0x8d, 0xc2, 0xbe, 0xc1, 0xae, 0x7d, 0xbc, 0x1d, 0x21, 0x52, 0x3e,
- 0xa0, 0xa5, 0x95, 0xbd, 0x43, 0x72, 0xba, 0xbc, 0x25, 0x94, 0xbb, 0x3c,
- 0x16, 0x6c, 0x16, 0x3e, 0x02, 0xa7, 0x9b, 0x3e, 0x9e, 0x73, 0x65, 0xbd,
- 0x18, 0x4e, 0x38, 0x3d, 0x75, 0xf4, 0xbd, 0x3d, 0x53, 0x02, 0x6b, 0x3e,
- 0x0b, 0xf7, 0x86, 0x3d, 0x9c, 0xd7, 0x97, 0xbd, 0x81, 0xc8, 0x83, 0x3d,
- 0xe4, 0x75, 0x26, 0xbe, 0x76, 0x18, 0xbb, 0x3b, 0x9b, 0xdb, 0x0d, 0x3d,
- 0xcc, 0x6d, 0x61, 0x3d, 0xd3, 0x16, 0xec, 0xbd, 0x4d, 0xf5, 0xdc, 0xbd,
- 0xba, 0x0c, 0x1c, 0x3e, 0x58, 0x2c, 0xb4, 0xbc, 0x45, 0xc3, 0xa7, 0xbd,
- 0xab, 0x03, 0x77, 0xbd, 0xf0, 0x77, 0xe9, 0xbd, 0xbd, 0x0b, 0x98, 0x3e,
- 0x13, 0x9d, 0x6f, 0x3d, 0x8a, 0x74, 0x74, 0x3e, 0x74, 0x1b, 0xa1, 0x3e,
- 0x72, 0xc1, 0x24, 0xbd, 0x12, 0xbf, 0x7f, 0x3d, 0x7b, 0x0d, 0x61, 0x3e,
- 0x6d, 0x42, 0x82, 0xbd, 0x5e, 0xc9, 0x3b, 0xbd, 0x44, 0x8d, 0x4d, 0x3d,
- 0xbc, 0x52, 0x01, 0xbe, 0x42, 0x27, 0xf7, 0xbd, 0x59, 0xf1, 0xcf, 0xbc,
- 0x2d, 0x8f, 0xcd, 0x3b, 0xaf, 0x32, 0xa2, 0xbe, 0x6c, 0x7f, 0x81, 0xbe,
- 0xa0, 0x83, 0x12, 0x3e, 0x0b, 0xa9, 0x88, 0xbe, 0xa0, 0x14, 0x12, 0x3e,
- 0x54, 0xb5, 0x65, 0x3e, 0x96, 0x6c, 0x37, 0xbe, 0x2c, 0xa7, 0x70, 0xbe,
- 0x1f, 0xdd, 0x5f, 0xbe, 0xfd, 0xf5, 0x0b, 0xbd, 0xb3, 0x16, 0xc9, 0x3b,
- 0x04, 0xe6, 0x3e, 0xbe, 0x90, 0x7a, 0xf8, 0xbd, 0x05, 0x96, 0x6c, 0xbe,
- 0x88, 0xb9, 0xc0, 0x3d, 0x06, 0xd5, 0x27, 0xbe, 0x43, 0x3a, 0x0d, 0x3d,
- 0x10, 0xbc, 0x4d, 0x3d, 0xe6, 0x29, 0xa4, 0xbe, 0x2d, 0xde, 0x37, 0xbe,
- 0xb9, 0x46, 0x2b, 0xbf, 0x01, 0x11, 0x10, 0xbe, 0x16, 0xde, 0xe0, 0x3d,
- 0x6c, 0x0e, 0x93, 0xbd, 0x0e, 0xe4, 0xa1, 0xbe, 0xec, 0x06, 0x0c, 0x3d,
- 0x79, 0x35, 0x90, 0xbe, 0xd7, 0x1a, 0x71, 0xbe, 0xc0, 0x3f, 0x20, 0xbe,
- 0x42, 0x4d, 0xe7, 0xbd, 0x80, 0x35, 0x97, 0xbc, 0xdc, 0xad, 0x45, 0xbe,
- 0x5d, 0x9e, 0x08, 0xbf, 0xab, 0xf9, 0xd1, 0x3c, 0xa1, 0x1a, 0xca, 0xbd,
- 0x54, 0x54, 0xc0, 0xbc, 0x64, 0xa2, 0xb6, 0xbe, 0xb3, 0x94, 0x39, 0xbe,
- 0x3a, 0x79, 0x4c, 0xbe, 0xed, 0x66, 0x0a, 0xbe, 0x20, 0x41, 0x1d, 0x3d,
- 0x78, 0x45, 0x3a, 0xbb, 0xe0, 0x18, 0x5e, 0x3e, 0x56, 0x1c, 0x5d, 0xbe,
- 0x78, 0xc4, 0x83, 0xbe, 0x06, 0xa1, 0x2e, 0xbe, 0xc4, 0x3d, 0x12, 0xbe,
- 0xea, 0x8c, 0xf6, 0x3d, 0xa6, 0x19, 0x9d, 0x3e, 0x46, 0x55, 0x8b, 0xbe,
- 0xe8, 0xf9, 0x69, 0xbd, 0x2f, 0xd7, 0x05, 0xbe, 0x3a, 0xf5, 0x93, 0x3d,
- 0x99, 0x22, 0x8e, 0x3c, 0x23, 0xf4, 0x61, 0x3c, 0xda, 0xbc, 0x1e, 0xbf,
- 0x67, 0xa6, 0xc7, 0xbe, 0x40, 0xa5, 0xc6, 0x3d, 0xcf, 0x41, 0x82, 0x3d,
- 0x28, 0x0a, 0xf8, 0xbe, 0x8c, 0xd7, 0x73, 0x3d, 0x62, 0xd1, 0x45, 0xbe,
- 0x89, 0x1c, 0x84, 0xbe, 0x23, 0xc7, 0xda, 0xbd, 0xc1, 0xb3, 0xea, 0xbc,
- 0x59, 0x99, 0xda, 0xbd, 0x75, 0xee, 0xca, 0xbd, 0x8a, 0x16, 0x41, 0xbd,
- 0x39, 0x2d, 0x00, 0xbf, 0xc8, 0x67, 0xce, 0x3d, 0x56, 0xe4, 0x7a, 0xbe,
- 0x61, 0xd0, 0x38, 0xbe, 0xbd, 0x38, 0x3a, 0x3c, 0x52, 0x4d, 0x12, 0xbe,
- 0x43, 0x50, 0xc2, 0xbe, 0x4b, 0x04, 0x73, 0x3d, 0x45, 0x80, 0xf4, 0x3d,
- 0x03, 0xae, 0x34, 0xbe, 0x6d, 0x38, 0xca, 0x3d, 0x39, 0xb4, 0xa4, 0x3d,
- 0xa8, 0x7c, 0x27, 0x3e, 0x14, 0x00, 0x88, 0x3d, 0x42, 0x7e, 0x6b, 0x3e,
- 0x74, 0xfb, 0xc3, 0x3c, 0xab, 0x43, 0x53, 0x3d, 0x7e, 0xa7, 0x82, 0x3e,
- 0x20, 0x16, 0xe2, 0xbe, 0xa1, 0x05, 0x76, 0xbd, 0xd8, 0xcd, 0x7d, 0x3d,
- 0x6d, 0x20, 0x0a, 0xbf, 0x35, 0x94, 0x0f, 0x3e, 0x0a, 0x1c, 0x02, 0xbd,
- 0xbd, 0xee, 0x65, 0xbe, 0x19, 0x8f, 0x27, 0x3d, 0x90, 0xa0, 0xba, 0xbe,
- 0xc3, 0x1f, 0xed, 0x3d, 0x11, 0x42, 0x08, 0x3e, 0xee, 0xb2, 0x81, 0xbd,
- 0x45, 0x24, 0x71, 0x3e, 0xcb, 0xfe, 0x02, 0xbe, 0x5e, 0x2b, 0xcb, 0x3b,
- 0x83, 0xf2, 0x98, 0xbd, 0x1f, 0x05, 0x63, 0xbe, 0x6f, 0x76, 0x88, 0x3d,
- 0x56, 0xd0, 0x1b, 0x3d, 0x43, 0xd9, 0x0b, 0xbd, 0x4d, 0x7c, 0x6b, 0xbe,
- 0xa0, 0x0a, 0x39, 0x3e, 0x02, 0x35, 0xa2, 0xbe, 0xb9, 0x3c, 0x12, 0xbc,
- 0x1b, 0xc8, 0x47, 0xbe, 0x31, 0x5b, 0x58, 0xbe, 0xb1, 0x88, 0x49, 0xbd,
- 0x11, 0xb3, 0x5b, 0xbe, 0xc0, 0x5e, 0x21, 0xbe, 0x20, 0x72, 0x27, 0xbc,
- 0xb8, 0x43, 0x3f, 0x3d, 0x60, 0x00, 0x6f, 0xbd, 0xd1, 0x1f, 0x79, 0xbd,
- 0xf7, 0xea, 0x7f, 0xbd, 0xa3, 0xd8, 0xb0, 0xbe, 0xfc, 0x9c, 0xb9, 0xbe,
- 0x2b, 0x6a, 0x71, 0xbe, 0x5c, 0xa4, 0x86, 0x3e, 0xb5, 0xe2, 0x9e, 0x3e,
- 0x7a, 0x0f, 0x70, 0x3e, 0x34, 0xd9, 0x2b, 0xbd, 0x64, 0x35, 0x78, 0xbd,
- 0xa5, 0x14, 0x36, 0xbe, 0x1f, 0x26, 0xad, 0x3d, 0x3e, 0xdb, 0x9b, 0x3e,
- 0xf4, 0x73, 0x2d, 0x3e, 0x72, 0x37, 0x94, 0xbe, 0xe3, 0x0f, 0x01, 0x3e,
- 0x53, 0x64, 0x01, 0xbd, 0xc4, 0xb6, 0x4e, 0x3e, 0xe9, 0x14, 0xc7, 0xbc,
- 0x3f, 0x60, 0x06, 0xbf, 0xd0, 0x8c, 0x15, 0xba, 0xd1, 0x33, 0xa0, 0xbd,
- 0x4a, 0xc2, 0x33, 0xbe, 0xcf, 0xcc, 0x1b, 0x3e, 0x32, 0x5f, 0x9d, 0x3d,
- 0x9d, 0x83, 0xd5, 0x3e, 0xa2, 0xf4, 0x03, 0xbe, 0x6b, 0x69, 0x96, 0x3e,
- 0xb4, 0x98, 0x7c, 0x3e, 0xe6, 0x7c, 0xbe, 0xbd, 0x14, 0x87, 0xe3, 0xbd,
- 0x5c, 0x54, 0x84, 0xbb, 0xe0, 0x07, 0x29, 0x3e, 0xd9, 0xd9, 0x5c, 0xbd,
- 0x83, 0x4e, 0x9c, 0xbe, 0xfe, 0x40, 0x9d, 0xbd, 0x9c, 0x3c, 0xc4, 0xbd,
- 0x85, 0x22, 0x13, 0x3e, 0xe9, 0xea, 0x0a, 0x3e, 0xf1, 0xd6, 0x32, 0x3e,
- 0xfe, 0x61, 0x6e, 0x3e, 0xf5, 0x61, 0xd6, 0xbe, 0x70, 0x2c, 0x53, 0x3e,
- 0x59, 0x17, 0x4f, 0x3e, 0xf9, 0x28, 0x2d, 0xbe, 0x87, 0x46, 0x51, 0xbc,
- 0xb6, 0xd5, 0xe0, 0x3d, 0xbb, 0xc4, 0x8c, 0xbe, 0x39, 0x16, 0xb4, 0x3e,
- 0x4a, 0x9f, 0x80, 0xbd, 0xe9, 0x0b, 0xae, 0x3d, 0x5a, 0x30, 0x39, 0x3e,
- 0xdc, 0x62, 0x63, 0xbd, 0xaa, 0x63, 0x99, 0xbe, 0x0e, 0xb2, 0x83, 0xbd,
- 0x62, 0x09, 0xa2, 0x3e, 0x18, 0x22, 0x59, 0x3e, 0xf8, 0x36, 0x07, 0x3c,
- 0xeb, 0x7d, 0xa7, 0xbd, 0x19, 0x64, 0x65, 0x3e, 0xe9, 0xe8, 0x83, 0xbe,
- 0x68, 0x98, 0xe7, 0x3d, 0x73, 0xe9, 0x19, 0x3e, 0xa0, 0xfe, 0x88, 0xbd,
- 0x8b, 0x07, 0x38, 0x3d, 0x18, 0xd3, 0xbf, 0xbe, 0xd3, 0x9c, 0x0a, 0xbe,
- 0x7d, 0xaa, 0x18, 0xbe, 0x05, 0xab, 0x2e, 0x3c, 0x41, 0x3e, 0x84, 0x3e,
- 0x37, 0x00, 0xc4, 0x3d, 0x2c, 0xeb, 0x48, 0xbd, 0x5e, 0x93, 0x9a, 0xbe,
- 0xb0, 0x26, 0x4e, 0xbe, 0x75, 0x51, 0x37, 0x3e, 0xfc, 0xb1, 0x5b, 0x3e,
- 0xbc, 0x48, 0x23, 0x3d, 0x1b, 0xc3, 0x03, 0xbe, 0xee, 0x8b, 0x92, 0x3d,
- 0x9b, 0xce, 0xb5, 0x3e, 0x2e, 0xb3, 0xcd, 0xbd, 0x2f, 0x8a, 0x05, 0xbe,
- 0x7b, 0x08, 0x31, 0x3e, 0x01, 0x55, 0xf9, 0xbd, 0x81, 0x24, 0x0e, 0xbe,
- 0x2f, 0x99, 0x85, 0xbe, 0x92, 0x2f, 0xaf, 0x3d, 0x5d, 0x24, 0x24, 0xbe,
- 0x69, 0xed, 0x33, 0xbc, 0x62, 0x8f, 0x5c, 0xbc, 0xa6, 0x9f, 0xdc, 0xbe,
- 0x56, 0xfd, 0x61, 0xbb, 0x24, 0x76, 0xec, 0xbb, 0x49, 0x91, 0x6f, 0x3d,
- 0x88, 0xbd, 0xd7, 0x3d, 0xe5, 0x9e, 0x2c, 0xbe, 0x76, 0x35, 0x8f, 0xbd,
- 0x99, 0xa3, 0xef, 0x3c, 0xe5, 0x11, 0x3a, 0xbe, 0x11, 0x4e, 0xe0, 0x3d,
- 0x3d, 0xde, 0x83, 0xbe, 0x2f, 0xfa, 0xd1, 0xbe, 0x5d, 0x1a, 0x11, 0xbc,
- 0x40, 0x1d, 0xf3, 0xbe, 0xbe, 0xb6, 0x58, 0xbd, 0x00, 0x25, 0x49, 0xbe,
- 0x38, 0x4f, 0xa3, 0xba, 0x56, 0xfa, 0x40, 0xbe, 0xc1, 0xad, 0x5d, 0xbd,
- 0x63, 0x0b, 0x20, 0xbe, 0xdd, 0x7b, 0xa1, 0xbe, 0xb2, 0x6a, 0x7a, 0x3c,
- 0xf6, 0x21, 0x25, 0xbe, 0x66, 0x97, 0x75, 0xbc, 0x52, 0xdc, 0x05, 0x3e,
- 0x59, 0x39, 0x01, 0xbc, 0x20, 0xd3, 0x16, 0x3e, 0x67, 0x91, 0x7b, 0x3e,
- 0x6f, 0xb9, 0xf9, 0xbd, 0x52, 0xd0, 0xa7, 0xbc, 0xae, 0x64, 0xee, 0xbe,
- 0xde, 0x86, 0xa3, 0x3c, 0xa9, 0xf2, 0x1f, 0x3e, 0x7a, 0x8e, 0x0a, 0xbe,
- 0xd5, 0x5b, 0xd8, 0xbe, 0xb2, 0x84, 0x9a, 0xbe, 0xf8, 0x1b, 0xfb, 0x3d,
- 0x63, 0x56, 0xa4, 0x3d, 0xaf, 0x2e, 0x99, 0xbe, 0x3c, 0x90, 0x77, 0x3e,
- 0x99, 0xa5, 0x47, 0x3e, 0x23, 0x22, 0x89, 0x3d, 0xcf, 0xb1, 0x12, 0xbe,
- 0x88, 0x02, 0xb0, 0x3c, 0xf5, 0x5a, 0xad, 0xbb, 0x7a, 0xd7, 0xb8, 0xbd,
- 0x7e, 0x94, 0xb7, 0xbe, 0x44, 0xcb, 0xc9, 0xbe, 0xb1, 0x4f, 0x16, 0x3e,
- 0x0e, 0xb1, 0xe7, 0x3d, 0x11, 0x7c, 0x02, 0xbd, 0xb0, 0x03, 0x80, 0x3b,
- 0x66, 0x8c, 0x84, 0x3e, 0x7e, 0xc3, 0x0d, 0xbd, 0x0c, 0x02, 0xe5, 0xbe,
- 0x13, 0x7a, 0x38, 0xbe, 0x13, 0xaa, 0xe0, 0xbd, 0x91, 0xed, 0x24, 0xbe,
- 0x3a, 0xab, 0xf2, 0xbd, 0x34, 0xa1, 0x8d, 0x3d, 0x83, 0x18, 0x9e, 0xbd,
- 0x60, 0xf8, 0x1a, 0x3e, 0x68, 0x5f, 0xf1, 0xbd, 0xb2, 0x01, 0xb8, 0xbd,
- 0x00, 0xa7, 0x0f, 0x3e, 0x66, 0x57, 0xa1, 0xbd, 0x5c, 0x6d, 0x64, 0xbd,
- 0xc5, 0xa9, 0x0e, 0xbe, 0xb7, 0x56, 0x0e, 0xbe, 0xa9, 0xb2, 0xeb, 0xbd,
- 0x7c, 0xec, 0xa3, 0x3e, 0xc0, 0x42, 0x78, 0x3d, 0xec, 0x41, 0x2c, 0x3d,
- 0x13, 0x8e, 0x1d, 0x3d, 0x6e, 0xb8, 0x7c, 0xbd, 0x54, 0xfd, 0xde, 0xbc,
- 0x48, 0xd7, 0x0f, 0xbe, 0x53, 0xaf, 0x10, 0x3e, 0x8a, 0x3d, 0xa5, 0x3e,
- 0x5f, 0x3e, 0x40, 0xbe, 0x90, 0x6a, 0x5c, 0x3d, 0x4a, 0xdb, 0xa2, 0xbe,
- 0xd1, 0xc7, 0x0c, 0xbe, 0x4e, 0x87, 0x9c, 0x3d, 0x8a, 0x9d, 0xa7, 0xbe,
- 0x10, 0x3c, 0x0f, 0x3e, 0x93, 0x41, 0xa9, 0x3d, 0xd9, 0xac, 0xc3, 0x3d,
- 0xf3, 0xff, 0x7f, 0x3e, 0x19, 0x2b, 0x2c, 0xbe, 0x86, 0x44, 0x88, 0xbd,
- 0xe2, 0x46, 0x36, 0xbd, 0xd1, 0x2a, 0xa6, 0xbe, 0x57, 0xc2, 0x9e, 0x3e,
- 0x3e, 0xe5, 0xb0, 0x3d, 0xcd, 0x6f, 0x18, 0xbe, 0xfc, 0xdf, 0x1c, 0xbe,
- 0x32, 0xdc, 0xc0, 0xbc, 0x35, 0x7a, 0x97, 0xbd, 0xdb, 0x2c, 0x33, 0xbe,
- 0xa9, 0x2f, 0x5f, 0x3e, 0x9e, 0x25, 0xb1, 0x3d, 0x4c, 0xf9, 0xa1, 0xbe,
- 0xf9, 0xae, 0x01, 0xbe, 0xda, 0x2a, 0x12, 0xbe, 0x10, 0xaa, 0x4e, 0xbe,
- 0xd7, 0x03, 0x09, 0xbe, 0xb2, 0x28, 0xa3, 0xbc, 0x37, 0x7c, 0x7f, 0xbd,
- 0xda, 0x29, 0x6a, 0xbc, 0x64, 0x57, 0x73, 0xbd, 0x60, 0xd3, 0x53, 0x3b,
- 0x37, 0x5e, 0x52, 0xbe, 0x56, 0x0a, 0x68, 0xbe, 0x98, 0x77, 0x54, 0xbd,
- 0x45, 0x54, 0x23, 0x3e, 0x4a, 0xb8, 0x31, 0x3e, 0x26, 0xfd, 0xb3, 0x3c,
- 0xf5, 0xbb, 0x0a, 0xbe, 0xce, 0xa4, 0xfe, 0xbd, 0x9c, 0x07, 0xda, 0xbd,
- 0x07, 0xff, 0x37, 0xbe, 0x24, 0x91, 0x82, 0x3d, 0x7b, 0x2b, 0x8b, 0xbe,
- 0x8f, 0x03, 0xd4, 0xbd, 0x5b, 0x90, 0x43, 0x3d, 0x0d, 0xe6, 0x47, 0x3e,
- 0x76, 0x9d, 0xc3, 0x3e, 0xe7, 0x22, 0x34, 0xbc, 0xb2, 0x8d, 0x83, 0xbd,
- 0x97, 0x49, 0x2b, 0x3e, 0xba, 0x1a, 0xfd, 0xbb, 0xf1, 0x70, 0x97, 0xbc,
- 0xc4, 0x10, 0x87, 0x3e, 0xd2, 0xdd, 0x87, 0x3d, 0x41, 0x3c, 0x80, 0xbd,
- 0xcc, 0x14, 0xe8, 0x3d, 0x1c, 0xd7, 0x82, 0xbe, 0xf8, 0x98, 0xdb, 0xbd,
- 0xb4, 0x9f, 0xd0, 0x3d, 0x5c, 0x2b, 0x2d, 0xbe, 0x18, 0xd8, 0x92, 0xbe,
- 0x88, 0xfe, 0x2f, 0xbd, 0xa2, 0x08, 0x74, 0xbe, 0xbe, 0x08, 0x92, 0xbd,
- 0x5b, 0xb8, 0x38, 0x3d, 0x62, 0xcd, 0x3b, 0xbe, 0x28, 0x85, 0xbc, 0xbe,
- 0x9e, 0x9b, 0xf8, 0x3c, 0x4c, 0xf7, 0xcf, 0xbb, 0xab, 0x41, 0x15, 0xbe,
- 0x60, 0x0f, 0x33, 0xbd, 0xe8, 0x22, 0x09, 0x3b, 0xe6, 0x64, 0x74, 0xbd,
- 0x02, 0x32, 0x3c, 0x3e, 0xb3, 0xa2, 0xac, 0x3d, 0x6b, 0x8d, 0x73, 0xbd,
- 0xaa, 0x85, 0xf8, 0xbd, 0x80, 0x6f, 0x64, 0xbe, 0x47, 0xf8, 0xbf, 0xbc,
- 0xb3, 0xc1, 0xfd, 0x3d, 0x94, 0x9f, 0x0b, 0x3e, 0xfc, 0x82, 0xbf, 0x3d,
- 0x86, 0x9b, 0x2d, 0xbc, 0xad, 0x19, 0x27, 0x3e, 0xb7, 0xe7, 0x19, 0xbc,
- 0xc5, 0xe9, 0x56, 0xbe, 0xc7, 0xc9, 0x5e, 0x3d, 0x41, 0xcc, 0xe6, 0x3c,
- 0xa0, 0x05, 0x1d, 0xbe, 0x73, 0xa5, 0x87, 0x3c, 0xdf, 0x00, 0x97, 0x3e,
- 0xcc, 0x62, 0x1c, 0xbe, 0x49, 0xe6, 0xc6, 0xbd, 0x9f, 0x10, 0x2e, 0xbd,
- 0xb6, 0xc6, 0xbb, 0x3d, 0xc4, 0x65, 0x8e, 0x3e, 0x79, 0x15, 0xa1, 0xbd,
- 0x21, 0x79, 0x21, 0xbd, 0x4c, 0x31, 0x64, 0xbd, 0x28, 0xfb, 0x39, 0xbf,
- 0x6a, 0x60, 0xb3, 0xbd, 0x7a, 0xd2, 0x63, 0x3e, 0x74, 0xa0, 0x05, 0x3e,
- 0x10, 0x53, 0x84, 0x3d, 0x8b, 0xba, 0xb6, 0xbc, 0x62, 0x1e, 0x90, 0xbd,
- 0xab, 0xed, 0x8d, 0x3d, 0x6f, 0xa6, 0x91, 0xbe, 0xbe, 0x24, 0xae, 0xbd,
- 0xba, 0xd1, 0x7c, 0xbe, 0x18, 0xff, 0xfe, 0xbe, 0xcc, 0x20, 0x66, 0x3e,
- 0x09, 0x21, 0xf9, 0xbe, 0x73, 0xf6, 0x81, 0xbe, 0x2a, 0xac, 0x2f, 0x3e,
- 0x33, 0x8f, 0x87, 0xbb, 0x43, 0xdb, 0x1c, 0xbe, 0xff, 0x62, 0x82, 0xbe,
- 0xe3, 0x1e, 0xb8, 0xbe, 0xd5, 0x85, 0x20, 0xbe, 0x70, 0x7d, 0xe0, 0xbd,
- 0x65, 0x84, 0x81, 0xbe, 0x40, 0xfd, 0x90, 0xbd, 0x8b, 0x4f, 0x8a, 0x3d,
- 0x62, 0x0d, 0x5f, 0x3e, 0xe1, 0x6d, 0x96, 0x3d, 0x84, 0x44, 0x77, 0x3e,
- 0x4f, 0x68, 0x0b, 0xbe, 0x05, 0xf0, 0xda, 0xbd, 0xef, 0xe9, 0x2e, 0xbe,
- 0x2e, 0x71, 0xf4, 0xbd, 0xe0, 0xc5, 0xac, 0xbe, 0x7e, 0x9e, 0xd8, 0xbe,
- 0x35, 0x7f, 0x70, 0x3d, 0xee, 0x46, 0x06, 0xbe, 0xfd, 0x10, 0xd1, 0xbe,
- 0xa9, 0x06, 0x26, 0xbe, 0x4d, 0xb5, 0x4e, 0xbe, 0xc9, 0xda, 0x81, 0xbd,
- 0xe8, 0xfc, 0xb3, 0xbe, 0x85, 0x93, 0xc4, 0x3d, 0x6f, 0x05, 0x02, 0xbe,
- 0xff, 0x2a, 0xba, 0xbd, 0x5e, 0x69, 0xf5, 0xbc, 0x3a, 0x74, 0x28, 0xbf,
- 0x87, 0x18, 0xae, 0xbe, 0x4c, 0x84, 0x4e, 0xbc, 0x46, 0x77, 0xb2, 0xbc,
- 0x1a, 0x83, 0x45, 0xbe, 0xba, 0x61, 0x31, 0xbe, 0xe3, 0x51, 0x18, 0xbe,
- 0xf1, 0x11, 0xcf, 0x3c, 0x70, 0x5f, 0x0d, 0xbe, 0x67, 0x17, 0x87, 0xbd,
- 0x56, 0x4a, 0x19, 0xbf, 0xe7, 0x96, 0xac, 0x3d, 0xf3, 0x8b, 0x05, 0xbf,
- 0x00, 0x4d, 0x94, 0x3d, 0x21, 0x00, 0x19, 0xbe, 0x11, 0xa5, 0x17, 0x3e,
- 0x83, 0xe4, 0xf6, 0x3d, 0x6d, 0x61, 0xad, 0x3c, 0xaa, 0x56, 0xa4, 0x3d,
- 0x62, 0xd7, 0x77, 0x3e, 0x10, 0xdf, 0x10, 0xbe, 0x14, 0xfc, 0x08, 0x3e,
- 0xdd, 0xf6, 0x94, 0x3d, 0xf9, 0x06, 0xa8, 0xbd, 0x08, 0x9c, 0xb5, 0xbe,
- 0xb9, 0x7d, 0xd2, 0xbd, 0x72, 0x71, 0x05, 0xbe, 0x9e, 0x76, 0x7e, 0x3d,
- 0x25, 0x8f, 0x53, 0xbd, 0xa6, 0x12, 0x6b, 0xbe, 0x43, 0x39, 0x97, 0xbe,
- 0x96, 0x66, 0x17, 0xbe, 0x97, 0x81, 0x59, 0x3e, 0x1d, 0x81, 0xc5, 0x3d,
- 0xe4, 0x3e, 0x40, 0xbe, 0x93, 0xc8, 0x79, 0xbd, 0x55, 0x24, 0x48, 0xbe,
- 0xd0, 0xb8, 0xaf, 0xbc, 0x49, 0x3a, 0x60, 0x3c, 0x29, 0xe8, 0x38, 0xbe,
- 0xf1, 0x76, 0x9d, 0xbd, 0xd4, 0x26, 0x29, 0xbe, 0x91, 0xad, 0x9f, 0xbd,
- 0x71, 0xcd, 0x11, 0xbe, 0xfc, 0xe6, 0x20, 0xbf, 0xa0, 0x1a, 0xb7, 0xbe,
- 0xcd, 0xb2, 0x86, 0x3e, 0x00, 0xb5, 0xdd, 0xbe, 0x2b, 0xef, 0x36, 0xbe,
- 0x18, 0xa6, 0x37, 0xbe, 0x4e, 0x50, 0xb5, 0xbe, 0x20, 0xec, 0x2f, 0x3e,
- 0x43, 0x3f, 0x19, 0x3d, 0xcc, 0x2a, 0x4d, 0x3e, 0xb7, 0xe0, 0x77, 0x3d,
- 0x17, 0xc6, 0x46, 0x3d, 0xd3, 0x4f, 0x6e, 0x3d, 0x43, 0xcb, 0x29, 0x3e,
- 0x0a, 0x63, 0x1f, 0xbe, 0xc2, 0xdd, 0x36, 0x3e, 0xe2, 0x71, 0x82, 0xbd,
- 0xb0, 0x6e, 0x00, 0x3e, 0x24, 0xab, 0x10, 0xbe, 0x28, 0x69, 0x6c, 0xbe,
- 0x38, 0xb5, 0x28, 0xbd, 0x7c, 0xd1, 0xbd, 0xbd, 0x1c, 0x0a, 0x01, 0x3d,
- 0x10, 0xf2, 0xfc, 0x3c, 0x90, 0x78, 0x8f, 0xbd, 0xee, 0xd6, 0x9a, 0xbc,
- 0x76, 0x2e, 0xf4, 0xbd, 0x5e, 0xde, 0x32, 0x3d, 0xc2, 0x50, 0xe3, 0x3d,
- 0x3b, 0xd0, 0xc2, 0xbc, 0xc5, 0x31, 0xbd, 0x3b, 0xf5, 0xdd, 0x0d, 0x3d,
- 0xe6, 0xd0, 0x0b, 0xbc, 0xd5, 0x1b, 0x83, 0x3d, 0x59, 0x57, 0x5f, 0xbd,
- 0x25, 0x24, 0x33, 0x3e, 0x7b, 0x11, 0xb4, 0x3d, 0x4e, 0xa4, 0x14, 0xbd,
- 0xec, 0xa7, 0x82, 0xbd, 0x33, 0x25, 0x05, 0xbe, 0xb2, 0x5b, 0x74, 0xbe,
- 0x9f, 0x3c, 0x53, 0x3e, 0x46, 0xa4, 0x8a, 0x3d, 0x78, 0x2a, 0x17, 0xbe,
- 0x9f, 0x18, 0xb9, 0xbc, 0x99, 0x80, 0x67, 0x3e, 0xd1, 0xde, 0xe0, 0x3d,
- 0x0c, 0xaa, 0xd7, 0x3d, 0xf4, 0x92, 0x6f, 0xbe, 0x8f, 0x25, 0x78, 0x3d,
- 0x30, 0x6d, 0x1d, 0xbd, 0x0d, 0x17, 0xd1, 0x3d, 0x58, 0x5c, 0xbe, 0x3d,
- 0xa0, 0x7f, 0x0d, 0x3e, 0x2a, 0xe7, 0x74, 0xbe, 0xb6, 0xc0, 0x07, 0xbe,
- 0xf2, 0x3c, 0xa7, 0x3d, 0xac, 0xc3, 0x5c, 0xbc, 0x3c, 0x49, 0x5e, 0x3d,
- 0xce, 0x86, 0xc7, 0x3d, 0xcd, 0x7d, 0x8c, 0x3d, 0x3b, 0xf8, 0xde, 0xbd,
- 0x9b, 0xc2, 0x92, 0xbd, 0x55, 0xbc, 0x06, 0xbd, 0x14, 0x7d, 0xc9, 0xbc,
- 0x29, 0x57, 0x51, 0x3d, 0x4b, 0xfd, 0x9c, 0x3d, 0x0d, 0x98, 0xb1, 0x3d,
- 0x03, 0xc1, 0x2e, 0xbe, 0xf2, 0x4d, 0xb8, 0xbb, 0xbc, 0x31, 0x57, 0x3e,
- 0x1d, 0xe5, 0xf2, 0xbd, 0x1d, 0xce, 0x3c, 0x3c, 0xe5, 0x0f, 0xb7, 0xbd,
- 0xd2, 0xeb, 0x1d, 0x3d, 0x87, 0xbb, 0x2a, 0xbd, 0x1d, 0x00, 0x22, 0x3e,
- 0x47, 0x20, 0xd3, 0xbd, 0xf1, 0xc0, 0xe1, 0xbc, 0xc9, 0xe6, 0x93, 0xbd,
- 0x2c, 0x03, 0x35, 0x3e, 0xe1, 0xf6, 0xb0, 0x3d, 0xf1, 0x64, 0xc0, 0x3d,
- 0x74, 0x36, 0xc6, 0x3d, 0x8b, 0xa8, 0x77, 0xbc, 0xaf, 0xe4, 0xf1, 0x3c,
- 0x3c, 0x69, 0x6d, 0x3d, 0xa1, 0xa7, 0xd8, 0x3d, 0x98, 0xbf, 0x1a, 0x3e,
- 0x20, 0xcc, 0x13, 0x3e, 0x39, 0x78, 0xd6, 0x3d, 0xb4, 0x86, 0xaa, 0x3d,
- 0xd9, 0x32, 0x74, 0xbd, 0x6d, 0xf6, 0xc4, 0x3d, 0x1a, 0x1c, 0x2d, 0xbe,
- 0xf6, 0x57, 0xec, 0x3d, 0x5c, 0xce, 0x06, 0x3d, 0x2d, 0xa9, 0xab, 0x3d,
- 0x4a, 0x91, 0xfe, 0x3d, 0x92, 0x8f, 0x12, 0xbe, 0x6d, 0x8a, 0x10, 0xbd,
- 0xb3, 0x6a, 0xff, 0xbd, 0x01, 0x73, 0x91, 0xbe, 0x56, 0xed, 0xb6, 0x3b,
- 0x27, 0x91, 0x52, 0x3d, 0x25, 0xcb, 0x38, 0x3e, 0x4a, 0x49, 0x39, 0xbc,
- 0x14, 0xd6, 0xed, 0x3d, 0x58, 0x4e, 0x86, 0xbd, 0x40, 0x7c, 0xa4, 0x3e,
- 0xcd, 0x78, 0x04, 0x3e, 0xef, 0x45, 0xd5, 0x3d, 0x0b, 0xf4, 0x3b, 0x3e,
- 0x4d, 0x71, 0x36, 0x3d, 0x58, 0xed, 0x32, 0x3e, 0xdd, 0x62, 0x97, 0xbd,
- 0x55, 0xb0, 0x7e, 0xbd, 0x32, 0x9c, 0xc1, 0xbc, 0xcb, 0x6f, 0xf2, 0xbd,
- 0x98, 0x9f, 0x28, 0xbe, 0x80, 0x8c, 0xb7, 0xbc, 0xb3, 0xda, 0x2f, 0x3d,
- 0x5a, 0xb6, 0x47, 0x3d, 0xf2, 0x8c, 0x70, 0x3d, 0xb6, 0x53, 0x27, 0x3e,
- 0x97, 0x55, 0x98, 0xbd, 0x26, 0x12, 0xbf, 0x3d, 0x2a, 0xcb, 0xd4, 0x3d,
- 0xf7, 0xd9, 0xf8, 0x3d, 0x66, 0x83, 0x3e, 0xbd, 0xb9, 0x59, 0x0d, 0x3e,
- 0x5b, 0x09, 0x6f, 0xbe, 0xb4, 0x45, 0x09, 0xbe, 0x5e, 0xec, 0xd7, 0xbe,
- 0x33, 0xd6, 0x1d, 0xbd, 0x06, 0xa2, 0x66, 0xbe, 0x22, 0xbf, 0x98, 0xbe,
- 0x04, 0x1c, 0xbb, 0xbd, 0x23, 0x62, 0xd5, 0xbd, 0x48, 0xeb, 0x4a, 0xbe,
- 0xcf, 0x27, 0xc0, 0xbd, 0xb6, 0x90, 0xca, 0xbe, 0xfc, 0xb4, 0xc5, 0xbd,
- 0xdb, 0xda, 0x16, 0x3e, 0x2d, 0x11, 0x2a, 0xbe, 0x2e, 0x85, 0xcc, 0xbe,
- 0x24, 0xf0, 0x32, 0x3d, 0x3b, 0x1a, 0x6b, 0xbd, 0x1e, 0x00, 0x47, 0xbe,
- 0xe9, 0xb6, 0x56, 0x3c, 0x67, 0x7f, 0xa3, 0xbe, 0x41, 0xa2, 0xa2, 0x3b,
- 0xcb, 0x30, 0x99, 0x3d, 0x9c, 0xd6, 0xcf, 0xbe, 0x9d, 0x2e, 0x6d, 0xbe,
- 0xf4, 0x1c, 0x85, 0xbe, 0x45, 0x66, 0x4f, 0xbe, 0xb7, 0x41, 0x19, 0xbe,
- 0xfc, 0x97, 0xdc, 0xbe, 0xeb, 0x64, 0x2c, 0x3e, 0x36, 0x5d, 0x8b, 0xbe,
- 0x5a, 0xe3, 0xc0, 0xbd, 0x78, 0xb8, 0xb8, 0xbe, 0x00, 0xac, 0xdc, 0x3d,
- 0xb9, 0x37, 0x91, 0xbe, 0x87, 0x9d, 0x93, 0xbe, 0x34, 0xab, 0x79, 0xbe,
- 0x59, 0x1e, 0x11, 0xbc, 0x7f, 0xd1, 0x9a, 0xbd, 0x71, 0x48, 0xa7, 0xbe,
- 0xdf, 0x8d, 0x1d, 0xbe, 0x15, 0xa8, 0x26, 0xbe, 0x35, 0x89, 0x9f, 0xbd,
- 0x8c, 0x1b, 0x78, 0xbe, 0xab, 0x84, 0xb0, 0xbd, 0x30, 0x77, 0xe7, 0xbc,
- 0x5f, 0xf5, 0xc2, 0xbe, 0x6f, 0x20, 0x89, 0xbd, 0x82, 0xad, 0xa4, 0xbd,
- 0xcf, 0x79, 0x20, 0xbe, 0x00, 0x30, 0xb8, 0x3d, 0xcf, 0x84, 0xdb, 0xbe,
- 0x73, 0x71, 0xed, 0xbe, 0xc0, 0xad, 0x04, 0xbf, 0x78, 0xdb, 0x24, 0xbd,
- 0xa6, 0x2d, 0x81, 0xbe, 0x9b, 0xf3, 0x56, 0x3d, 0xff, 0xd6, 0x4a, 0xbe,
- 0xa9, 0x46, 0x20, 0x3e, 0x98, 0xbe, 0x63, 0x3c, 0x53, 0xb2, 0x84, 0x3d,
- 0x72, 0x93, 0x04, 0x3d, 0x08, 0x7d, 0xb2, 0xbd, 0xf2, 0x5b, 0x46, 0xbe,
- 0x9a, 0xf4, 0x08, 0xbe, 0xb7, 0xd4, 0x3e, 0xbc, 0xed, 0x94, 0x8d, 0xbe,
- 0x73, 0xa5, 0x87, 0xbe, 0x66, 0xd8, 0x02, 0x3e, 0x6d, 0xd0, 0xad, 0xbe,
- 0xab, 0x46, 0x1e, 0x3d, 0x05, 0x3d, 0x7d, 0xbd, 0x14, 0x81, 0x1b, 0xbf,
- 0x92, 0x31, 0x05, 0xbe, 0x9d, 0x62, 0xf7, 0xbd, 0x6d, 0xbe, 0x36, 0x3e,
- 0x1d, 0xbb, 0x04, 0xbd, 0xda, 0xf4, 0x83, 0xbe, 0x25, 0xc9, 0x2f, 0xbf,
- 0x77, 0xdb, 0xfe, 0xbc, 0x14, 0xe1, 0xf5, 0x3c, 0xc1, 0xb1, 0xd9, 0x3d,
- 0x65, 0x71, 0xc6, 0xbc, 0x69, 0x50, 0x05, 0xbd, 0x5b, 0x9c, 0x45, 0xbe,
- 0xfc, 0x5e, 0x22, 0xbe, 0xf6, 0x8e, 0x7a, 0xbe, 0x93, 0x7d, 0xfd, 0xbd,
- 0xaf, 0x23, 0xd6, 0xbd, 0x67, 0x2b, 0x9f, 0xbd, 0xab, 0x3c, 0x89, 0xbe,
- 0x78, 0x90, 0xed, 0xbd, 0xc5, 0xdc, 0x33, 0xbd, 0x25, 0x52, 0x0a, 0x3d,
- 0xf0, 0xc9, 0xef, 0x3d, 0xc9, 0x75, 0x8a, 0xbd, 0xbc, 0x25, 0xcc, 0x3d,
- 0x99, 0xc4, 0x66, 0xbe, 0xf1, 0xe4, 0x6f, 0x3d, 0x60, 0x5c, 0x6a, 0xbb,
- 0x6b, 0x48, 0x2a, 0xbf, 0xb8, 0xf6, 0x61, 0xbe, 0x7c, 0x0a, 0x8d, 0xbe,
- 0xfd, 0x48, 0xa3, 0x3d, 0x18, 0x41, 0xd3, 0xbd, 0x18, 0x79, 0x3c, 0xbe,
- 0x4a, 0xaf, 0xc3, 0x3d, 0x46, 0x66, 0x89, 0xbd, 0xd5, 0x46, 0x25, 0xbe,
- 0xc6, 0x2f, 0x77, 0xbe, 0xd7, 0x27, 0x02, 0xbe, 0x54, 0x18, 0x40, 0x3d,
- 0x48, 0x1c, 0x67, 0xbe, 0x4d, 0x04, 0x99, 0xbe, 0xd4, 0xa6, 0x31, 0xbe,
- 0xf3, 0x64, 0xaa, 0x3d, 0x6f, 0xd1, 0x48, 0xbe, 0x45, 0x38, 0x53, 0xbe,
- 0x3d, 0x30, 0x81, 0x3d, 0xd3, 0x92, 0x4a, 0xbe, 0xaa, 0xc3, 0xe0, 0xbb,
- 0x91, 0x56, 0x70, 0xbe, 0xc4, 0x0c, 0x34, 0x3d, 0x82, 0x2f, 0x50, 0x3e,
- 0x4e, 0x14, 0xa4, 0x3c, 0x09, 0x46, 0x53, 0x3d, 0xbd, 0x5f, 0xd8, 0xbd,
- 0xd8, 0x23, 0xf3, 0x3e, 0x51, 0x12, 0x03, 0xbd, 0xcd, 0x13, 0x7d, 0xbe,
- 0x17, 0x9c, 0x87, 0xbe, 0xe3, 0x65, 0x45, 0xbd, 0x5d, 0x3a, 0x9c, 0x3e,
- 0xfb, 0xd6, 0xff, 0x3d, 0x9c, 0x91, 0x59, 0x3e, 0xde, 0x40, 0x16, 0x3e,
- 0x93, 0xf0, 0x0e, 0x3e, 0xc0, 0x2e, 0xc7, 0xbd, 0xf0, 0xaa, 0x97, 0xbd,
- 0xcb, 0xe4, 0xba, 0x3d, 0x07, 0x50, 0xcd, 0x3c, 0x22, 0x21, 0x02, 0x3d,
- 0x01, 0xad, 0x45, 0x3d, 0xdb, 0xf0, 0x78, 0xbe, 0x43, 0x75, 0x41, 0xbd,
- 0x54, 0x64, 0x7b, 0xbd, 0xbf, 0x9d, 0xa0, 0x3d, 0x3e, 0x5c, 0x7e, 0x3e,
- 0x0f, 0x39, 0x4d, 0x3d, 0x6e, 0x8e, 0x24, 0x3e, 0x53, 0xfd, 0xf6, 0x3c,
- 0xef, 0x55, 0x53, 0xbe, 0xb6, 0x98, 0x2f, 0xbe, 0x56, 0xb2, 0x6a, 0x3c,
- 0xd9, 0x95, 0x59, 0xbe, 0xd9, 0x97, 0x3f, 0xbe, 0x36, 0x55, 0x6d, 0x3d,
- 0x7e, 0x44, 0x2f, 0xbe, 0xa8, 0xa7, 0x00, 0x3c, 0x97, 0x1e, 0x01, 0xbd,
- 0x86, 0x35, 0xa5, 0x3d, 0x3c, 0xc8, 0x62, 0x3b, 0x82, 0x34, 0xec, 0xbc,
- 0x7a, 0xd8, 0x4f, 0x3e, 0x7e, 0x2c, 0x76, 0x3d, 0x2f, 0xbf, 0xcf, 0x3d,
- 0xc5, 0x0f, 0xca, 0xbb, 0x26, 0x80, 0xbe, 0xbd, 0x6f, 0xf5, 0xa7, 0xbc,
- 0x68, 0x1b, 0x55, 0x3d, 0x79, 0xd7, 0x13, 0xbe, 0xba, 0xbf, 0x10, 0xbe,
- 0xe6, 0x21, 0x21, 0x3e, 0x32, 0xc6, 0x33, 0xbd, 0xea, 0x41, 0x97, 0xbd,
- 0xe5, 0x73, 0x02, 0xbe, 0x70, 0x6f, 0x27, 0xbe, 0x92, 0x0b, 0xd4, 0xbd,
- 0x82, 0x34, 0x61, 0xbd, 0xfa, 0xc2, 0x04, 0x3c, 0x5d, 0xe6, 0x12, 0x3e,
- 0xa6, 0xaf, 0x02, 0x3d, 0x44, 0x10, 0x77, 0xbd, 0xba, 0x4c, 0x61, 0xbe,
- 0xf6, 0x8e, 0x2e, 0xbe, 0xa7, 0x48, 0xce, 0xbd, 0x83, 0xae, 0xad, 0xbd,
- 0x13, 0x60, 0xf7, 0xbd, 0xea, 0x4f, 0x27, 0x3e, 0xb1, 0xaf, 0x2e, 0xbd,
- 0xb1, 0xca, 0xc2, 0x3c, 0xcf, 0x73, 0x4f, 0x3e, 0x6f, 0xc9, 0x08, 0xbe,
- 0x9e, 0x2c, 0x2c, 0x3e, 0xb3, 0x7f, 0x08, 0xbe, 0xca, 0xe0, 0x2b, 0xbd,
- 0x5b, 0x0d, 0x75, 0xbe, 0x75, 0x68, 0x88, 0x3d, 0x18, 0xcb, 0xc0, 0xbc,
- 0x17, 0x02, 0x65, 0xbc, 0x8d, 0xac, 0x57, 0x3d, 0xf8, 0x3a, 0xbf, 0xbd,
- 0x33, 0xdb, 0xbb, 0xbd, 0xa9, 0x02, 0x9f, 0xbb, 0x75, 0x27, 0x33, 0x3e,
- 0xc4, 0x1a, 0x50, 0x3d, 0x60, 0xee, 0x34, 0x3e, 0x3a, 0xae, 0x25, 0x3e,
- 0x3f, 0x29, 0x53, 0xbe, 0xc2, 0x98, 0x85, 0xbd, 0x04, 0x42, 0xc3, 0x3b,
- 0x6b, 0x81, 0xa7, 0x3d, 0x65, 0x9f, 0x5a, 0x3d, 0x99, 0xbc, 0xe7, 0xbd,
- 0x3e, 0x01, 0xec, 0xbb, 0x0e, 0xb5, 0xe2, 0xbd, 0x0a, 0xa7, 0x17, 0xbd,
- 0xe8, 0xc6, 0xf9, 0x3d, 0x58, 0xd2, 0x8e, 0x3a, 0xf6, 0xdb, 0x55, 0x3e,
- 0x73, 0xc8, 0xc4, 0x3d, 0xcf, 0x39, 0x48, 0xbc, 0x1b, 0xc5, 0x05, 0x3d,
- 0x0b, 0x51, 0x3e, 0x3d, 0xca, 0x15, 0x55, 0x3e, 0xb5, 0xd6, 0x91, 0x3e,
- 0xe0, 0xd1, 0xe6, 0x3d, 0xe2, 0x80, 0x84, 0x3e, 0x31, 0x86, 0xab, 0xbd,
- 0x8e, 0x0d, 0x05, 0x3e, 0x21, 0x67, 0xc5, 0x3c, 0xc0, 0xf3, 0xb7, 0x3d,
- 0xd6, 0xb1, 0xd6, 0xbd, 0x8f, 0xd8, 0xe4, 0xbd, 0x39, 0x06, 0x1d, 0xbe,
- 0x88, 0xca, 0x1c, 0x3e, 0x78, 0x3c, 0xe8, 0xbb, 0x45, 0x59, 0x9c, 0xbd,
- 0xaa, 0x7b, 0x0f, 0xbd, 0xfe, 0x00, 0x04, 0x3f, 0xf1, 0x40, 0xa3, 0x3e,
- 0x4c, 0xfb, 0xb2, 0xbe, 0x92, 0x23, 0x8e, 0x3e, 0xb1, 0x2b, 0x4c, 0x3e,
- 0xcf, 0x8d, 0x03, 0xbe, 0xeb, 0xd9, 0xcb, 0xbd, 0xc8, 0x6a, 0xb1, 0x3e,
- 0x04, 0x3c, 0xc3, 0x3d, 0xd3, 0xdd, 0x1d, 0xbe, 0x2b, 0xe9, 0xf3, 0xbe,
- 0xac, 0x12, 0x36, 0x3d, 0x57, 0x0f, 0x11, 0xbd, 0x34, 0xbe, 0x09, 0xbe,
- 0xc2, 0x07, 0xdf, 0x3d, 0x09, 0x7a, 0x05, 0x3f, 0xc0, 0x6c, 0x0d, 0x3e,
- 0xff, 0xce, 0x31, 0x3d, 0x34, 0x93, 0x50, 0x3e, 0xdf, 0xa4, 0x92, 0xbe,
- 0x58, 0xbf, 0x84, 0xbd, 0x19, 0x25, 0xdf, 0xbd, 0xb6, 0xce, 0xa5, 0x3e,
- 0x08, 0xbc, 0x51, 0xbc, 0x30, 0x39, 0xf5, 0xbd, 0x25, 0x6c, 0x84, 0x3e,
- 0x14, 0x7a, 0x14, 0xbe, 0xe0, 0xc3, 0x83, 0xbe, 0x9b, 0xd9, 0x91, 0x3d,
- 0xc5, 0x8c, 0x10, 0xbf, 0x2e, 0xef, 0x0c, 0x3e, 0xe4, 0x33, 0xef, 0x3d,
- 0xce, 0x68, 0xfc, 0xbd, 0xe3, 0x2a, 0x85, 0x3d, 0x47, 0x14, 0x10, 0x3e,
- 0x2e, 0xb6, 0x43, 0xbe, 0x7c, 0xda, 0x92, 0xbd, 0x31, 0x92, 0x8f, 0x3d,
- 0x7e, 0x9e, 0x22, 0x3f, 0x29, 0x27, 0x49, 0xbe, 0x3c, 0xae, 0x83, 0xbe,
- 0x79, 0x2e, 0xc6, 0x3e, 0xcf, 0x5c, 0x2f, 0xbd, 0x7a, 0x0b, 0x63, 0xbe,
- 0xe6, 0x90, 0x49, 0x3e, 0x29, 0xa9, 0x83, 0x3e, 0xdd, 0x9a, 0xed, 0x3d,
- 0x09, 0xef, 0xea, 0x3d, 0x85, 0x9b, 0xad, 0x3e, 0xb8, 0xf8, 0xbf, 0xbd,
- 0xde, 0x58, 0x39, 0xbe, 0x23, 0x34, 0x73, 0x3c, 0xb4, 0x9c, 0x8b, 0x3d,
- 0xdb, 0x1f, 0x6e, 0xbe, 0xf3, 0x75, 0x55, 0xbe, 0xbf, 0x19, 0x8e, 0xbe,
- 0x89, 0xde, 0xfa, 0x3d, 0x32, 0xc0, 0xc6, 0xbe, 0x74, 0x2b, 0x81, 0xbc,
- 0x07, 0xac, 0xdc, 0xbe, 0x7a, 0x7e, 0xc4, 0xbe, 0x18, 0x00, 0x09, 0xbd,
- 0x66, 0xa4, 0x28, 0xbe, 0x99, 0xc4, 0xc4, 0x3d, 0x2c, 0x68, 0x89, 0xbe,
- 0xe1, 0x44, 0xaa, 0xbd, 0xb1, 0xe1, 0x10, 0xbe, 0xae, 0xc9, 0x47, 0xbe,
- 0xd4, 0xb9, 0x67, 0x3c, 0xb7, 0xea, 0x4a, 0xbe, 0x39, 0x5d, 0x55, 0xbe,
- 0x7b, 0x09, 0x8e, 0xbc, 0x9f, 0xf0, 0x21, 0x3e, 0x88, 0x03, 0x83, 0x3c,
- 0x07, 0xf4, 0xb6, 0x3e, 0xa0, 0x17, 0xd2, 0xbe, 0x57, 0x33, 0xe6, 0x3e,
- 0x22, 0xc2, 0x7e, 0xbe, 0x18, 0x3a, 0x93, 0xbc, 0xd8, 0xfd, 0x6b, 0x3d,
- 0x5c, 0x57, 0x13, 0x3b, 0xd0, 0x7a, 0x8b, 0x3d, 0xa3, 0x2c, 0x19, 0xbe,
- 0x71, 0xa0, 0x75, 0xbe, 0xf7, 0xb6, 0x8e, 0xbc, 0x4d, 0x0d, 0xd8, 0x3d,
- 0x38, 0x52, 0xaf, 0x3e, 0x2c, 0x00, 0x92, 0x3d, 0x3f, 0x3a, 0xa2, 0xbd,
- 0x25, 0xc8, 0x02, 0x3e, 0xec, 0xf2, 0x11, 0xbe, 0x5d, 0x28, 0xac, 0xbd,
- 0x09, 0x2a, 0xb5, 0xbc, 0x15, 0x98, 0x2a, 0xbe, 0xd6, 0x32, 0x12, 0xbf,
- 0xe1, 0x55, 0x9a, 0x3e, 0x74, 0x5c, 0x68, 0x3e, 0x56, 0xbf, 0x26, 0xbd,
- 0x1c, 0xe7, 0x81, 0x3e, 0x63, 0x90, 0x89, 0xbe, 0x25, 0x23, 0x16, 0x3e,
- 0x0c, 0x04, 0xe9, 0x3b, 0xfb, 0xf6, 0x06, 0x3c, 0xc8, 0x00, 0x5c, 0xbe,
- 0x2a, 0x3c, 0x99, 0x3d, 0x7c, 0x5b, 0x83, 0x3c, 0x47, 0x6d, 0x4a, 0xbe,
- 0x62, 0xd5, 0xdc, 0xbc, 0x38, 0xfd, 0x13, 0x3e, 0x79, 0x70, 0x2d, 0x3e,
- 0x25, 0x55, 0x18, 0xbe, 0xb4, 0xc6, 0x0f, 0x3e, 0xef, 0xe7, 0x46, 0xbe,
- 0x86, 0x4d, 0x81, 0xbe, 0x2d, 0x98, 0xd7, 0x3e, 0xc3, 0x57, 0x7c, 0xbc,
- 0xe8, 0x50, 0xea, 0xbd, 0x98, 0xb5, 0x33, 0x3e, 0x48, 0xec, 0xca, 0xbc,
- 0x35, 0x4a, 0xc6, 0xbd, 0xce, 0x52, 0xab, 0xbb, 0xc8, 0x0c, 0xb4, 0xbd,
- 0xb7, 0x57, 0xd4, 0xbd, 0x52, 0x9f, 0x91, 0xbe, 0x61, 0x69, 0xdd, 0x3d,
- 0x1e, 0x8d, 0x1a, 0xbf, 0x93, 0x37, 0xb0, 0x3e, 0xd2, 0x53, 0x7c, 0xbc,
- 0x87, 0x87, 0x1d, 0xbd, 0x7a, 0x9a, 0x3e, 0xbe, 0xdb, 0x54, 0x90, 0x3e,
- 0x48, 0x99, 0xb7, 0xbc, 0xbe, 0xd3, 0xb7, 0xbd, 0x84, 0x4a, 0x13, 0x3e,
- 0x1e, 0x18, 0x0d, 0x3e, 0x24, 0x93, 0x1a, 0xbe, 0x26, 0x96, 0xb5, 0x3b,
- 0x3a, 0x2a, 0xca, 0xbd, 0x87, 0x63, 0xda, 0x3d, 0x64, 0x77, 0x1e, 0xbc,
- 0x1a, 0xf4, 0x1d, 0xbe, 0x93, 0xb8, 0xcf, 0xbd, 0x06, 0x45, 0x39, 0x3d,
- 0x53, 0x24, 0xab, 0xbd, 0x21, 0xd0, 0x15, 0xbe, 0xc2, 0x0e, 0xa3, 0x3d,
- 0xe1, 0xda, 0x1d, 0x3e, 0xe6, 0x75, 0x57, 0xbd, 0x9b, 0x68, 0xc4, 0xbd,
- 0x17, 0x27, 0xb4, 0x3d, 0x1d, 0x8c, 0x02, 0xbe, 0x17, 0x5c, 0xda, 0xbd,
- 0xf2, 0xbf, 0x9d, 0x3d, 0x35, 0x5a, 0xc1, 0xbd, 0x6c, 0xfd, 0xcf, 0x3d,
- 0xda, 0xe5, 0x2b, 0x3e, 0x55, 0x7b, 0xee, 0x3d, 0x4b, 0xf0, 0x1a, 0xbe,
- 0x02, 0xe4, 0x9b, 0xbc, 0xc8, 0x77, 0x07, 0xbe, 0xe5, 0x5d, 0x49, 0xb7,
- 0xf9, 0x31, 0xde, 0x3d, 0x72, 0x8b, 0x22, 0x3e, 0xb6, 0x58, 0x98, 0x3d,
- 0xc7, 0x50, 0x52, 0x3d, 0xb1, 0x3f, 0xc5, 0xbd, 0x50, 0xbf, 0xce, 0x3d,
- 0x33, 0x66, 0x5b, 0x3d, 0x91, 0x2b, 0xed, 0xbd, 0xf6, 0x6d, 0x82, 0xbd,
- 0xf6, 0x52, 0x04, 0x3e, 0x52, 0xf2, 0xed, 0x3c, 0x72, 0x92, 0xe6, 0xb9,
- 0x70, 0x90, 0xe2, 0xbc, 0xee, 0xca, 0x0a, 0xbe, 0x92, 0xf3, 0xc6, 0x3d,
- 0x08, 0xdf, 0x80, 0xbc, 0xc7, 0x9f, 0x9a, 0x3c, 0x7d, 0x36, 0x74, 0xbd,
- 0x9e, 0x2a, 0x1f, 0x3e, 0xa9, 0xd0, 0x81, 0xbd, 0x68, 0x98, 0xf5, 0x3d,
- 0x9f, 0xec, 0x85, 0xbd, 0x22, 0x90, 0xad, 0xbd, 0xc3, 0x26, 0x85, 0xbb,
- 0x83, 0xd2, 0x25, 0x3e, 0x2e, 0x16, 0xda, 0x3d, 0x8c, 0x7b, 0xf2, 0xbc,
- 0xc6, 0xfa, 0xa3, 0x3d, 0x5b, 0x77, 0xa0, 0xbd, 0xa2, 0x79, 0xd4, 0xbd,
- 0xd9, 0x7a, 0x96, 0x3d, 0xa7, 0xa6, 0xda, 0x3d, 0xac, 0x67, 0x0b, 0xbd,
- 0x4a, 0x7f, 0x10, 0xbe, 0xb5, 0xbc, 0x7b, 0xbd, 0x61, 0x21, 0x6a, 0xbc,
- 0xc4, 0xed, 0x68, 0x3d, 0x41, 0xdf, 0x25, 0xbd, 0xe0, 0x17, 0xc2, 0x3d,
- 0xa5, 0x91, 0xf1, 0xbd, 0x1a, 0xe4, 0x93, 0xbd, 0xd1, 0x3a, 0xa9, 0x3d,
- 0xba, 0xb5, 0x8f, 0x3d, 0x8a, 0x40, 0x8c, 0x3c, 0x1f, 0x54, 0x03, 0xbe,
- 0x48, 0x7b, 0xd8, 0x3d, 0x03, 0x01, 0x17, 0x3e, 0x18, 0xf2, 0x5d, 0x3b,
- 0x71, 0xbb, 0x57, 0xbd, 0x63, 0x93, 0x75, 0x3b, 0xf1, 0xf1, 0xbd, 0x3d,
- 0x54, 0xbe, 0xd9, 0x3c, 0xae, 0x3a, 0xe9, 0xbc, 0xee, 0xe6, 0xa6, 0x3d,
- 0x66, 0xe3, 0x8a, 0xbd, 0x8b, 0xb4, 0xfd, 0x3d, 0x53, 0x5e, 0xe7, 0xbc,
- 0x27, 0x85, 0x06, 0xbe, 0xb8, 0x5e, 0xee, 0x3c, 0x96, 0x68, 0xb5, 0x3c,
- 0x39, 0x15, 0xb6, 0xbd, 0xb5, 0x84, 0x0a, 0xbe, 0x4f, 0xa1, 0xa5, 0x3d,
- 0x99, 0x65, 0x08, 0xbd, 0xdb, 0x82, 0xb6, 0x3c, 0x8a, 0x0f, 0xfb, 0x3d,
- 0xf8, 0xff, 0x84, 0x3c, 0xee, 0x93, 0x6a, 0x3d, 0x1b, 0x82, 0xe9, 0xbd,
- 0x17, 0xf2, 0x83, 0xbd, 0xc0, 0x20, 0x22, 0x3b, 0xf2, 0xc2, 0x8d, 0x3d,
- 0x46, 0xd7, 0xad, 0xbd, 0x01, 0xe9, 0x1a, 0xbe, 0xf9, 0x70, 0x22, 0x3e,
- 0x3b, 0x4f, 0x65, 0x3c, 0x18, 0xcc, 0x79, 0xbd, 0x80, 0x17, 0xca, 0x3c,
- 0x02, 0x8a, 0x1e, 0x3e, 0x08, 0xd3, 0xe9, 0xbd, 0x3f, 0x3d, 0xb1, 0x3d,
- 0x88, 0x5b, 0xdb, 0x3c, 0x92, 0xa5, 0xe0, 0xbd, 0xaa, 0x0c, 0x03, 0x3e,
- 0xbc, 0x00, 0x65, 0x3c, 0xb4, 0x96, 0xfd, 0xbd, 0x14, 0x40, 0xb2, 0xbd,
- 0x10, 0x06, 0x8d, 0x3d, 0x00, 0x07, 0x3f, 0xbb, 0x17, 0x93, 0x80, 0xbd,
- 0x30, 0x2e, 0x4f, 0x3d, 0x48, 0x77, 0xb6, 0xbd, 0x33, 0x76, 0x58, 0xbd,
- 0x10, 0x6f, 0x53, 0x3e, 0x13, 0x89, 0x67, 0xbe, 0x6b, 0xc6, 0x2d, 0xbe,
- 0xed, 0x3b, 0x34, 0x3d, 0x76, 0xec, 0x73, 0x3e, 0x1b, 0x60, 0x02, 0x3f,
- 0x02, 0xf8, 0x70, 0x3e, 0x10, 0xfd, 0xc0, 0xbe, 0xd2, 0x84, 0xbc, 0xbe,
- 0x1d, 0x09, 0x8c, 0xbe, 0x3c, 0x99, 0xb5, 0xbe, 0x0f, 0x65, 0xa0, 0xbd,
- 0x94, 0x21, 0xc2, 0x3d, 0x6e, 0x11, 0x0d, 0xbf, 0x78, 0xce, 0x46, 0xbe,
- 0x58, 0x4a, 0x86, 0xbd, 0xa8, 0xa5, 0x4f, 0xbd, 0x3a, 0xdb, 0x18, 0x3e,
- 0xf0, 0x0c, 0x09, 0xbd, 0xfc, 0xfc, 0xc0, 0xbd, 0x2a, 0xfe, 0x28, 0x3d,
- 0x9f, 0x73, 0x7c, 0x3e, 0x5b, 0x97, 0x1d, 0x3c, 0xc4, 0xc7, 0x61, 0x38,
- 0xea, 0x7e, 0xc2, 0xbd, 0x20, 0x30, 0x3a, 0x3d, 0xcb, 0x7b, 0x81, 0xbd,
- 0x3a, 0x3d, 0xc9, 0xbe, 0x51, 0x67, 0xeb, 0x3e, 0x64, 0x6f, 0xb7, 0xbd,
- 0x62, 0xbe, 0xc0, 0xbc, 0x1e, 0x25, 0x14, 0x3d, 0x9b, 0x9b, 0xaa, 0x3d,
- 0x6c, 0xec, 0x25, 0x3e, 0xa4, 0xa7, 0x10, 0xbe, 0x0c, 0x21, 0x0c, 0x3b,
- 0x80, 0xf7, 0x2b, 0xbe, 0x3d, 0x8c, 0x82, 0xbe, 0x99, 0x5e, 0xe7, 0x3d,
- 0x94, 0x80, 0x12, 0x3e, 0xb9, 0xf6, 0xd3, 0x3e, 0x73, 0x55, 0x80, 0x3e,
- 0x15, 0x60, 0x02, 0xbe, 0x90, 0x5d, 0x58, 0x3c, 0x3e, 0xbc, 0x20, 0x3d,
- 0x90, 0xc2, 0x86, 0x3d, 0xbc, 0x85, 0x04, 0xbe, 0xb6, 0xbb, 0x2b, 0x3b,
- 0x56, 0x2b, 0x12, 0xbd, 0x2f, 0xef, 0x83, 0xbe, 0x07, 0xa8, 0x9b, 0x3b,
- 0xdb, 0xdf, 0x3e, 0x3e, 0x61, 0x69, 0xeb, 0xbe, 0x1c, 0xda, 0x54, 0x3e,
- 0x67, 0xd4, 0x8d, 0xbe, 0xb9, 0xb7, 0x6f, 0x3e, 0x21, 0x56, 0x2e, 0x3e,
- 0x83, 0x03, 0x54, 0x3e, 0x3d, 0x52, 0xe9, 0xbd, 0xf1, 0x2b, 0x30, 0x3e,
- 0x1c, 0xd6, 0xe6, 0xbe, 0xc0, 0x7b, 0xd0, 0xbe, 0xa8, 0xcc, 0x31, 0xbe,
- 0x35, 0xdd, 0x08, 0x3d, 0xb4, 0xa8, 0xc0, 0xbe, 0xd1, 0xb9, 0x28, 0x3b,
- 0x32, 0x35, 0xf3, 0x3d, 0x61, 0xd3, 0x56, 0xbe, 0x52, 0x1c, 0x20, 0xbf,
- 0x2d, 0xdf, 0x54, 0x3d, 0x50, 0xbc, 0x1f, 0xbd, 0x54, 0x65, 0x87, 0x3e,
- 0xaf, 0xcd, 0x79, 0x3e, 0x60, 0x61, 0x5b, 0x3e, 0x4f, 0x00, 0xc6, 0x3d,
- 0x52, 0x7a, 0xbd, 0x3d, 0xb2, 0x17, 0xb9, 0xbd, 0x0e, 0x5a, 0xa6, 0x3d,
- 0xd1, 0xcc, 0x10, 0xbe, 0xdc, 0x8c, 0x00, 0x3d, 0x60, 0x45, 0xa3, 0xbc,
- 0x44, 0x86, 0xc0, 0x3d, 0x90, 0x2f, 0x3d, 0x3e, 0x39, 0x53, 0x24, 0xbe,
- 0xe3, 0xc7, 0x9f, 0xbd, 0xce, 0x22, 0xa0, 0xbd, 0xd0, 0x01, 0xff, 0x3d,
- 0x13, 0xb6, 0x3e, 0xbc, 0x42, 0x1f, 0xb8, 0xbc, 0x6a, 0xda, 0x9a, 0x3d,
- 0x1a, 0x78, 0xf2, 0x3d, 0x03, 0x74, 0x45, 0x3c, 0xb4, 0xea, 0xd7, 0x3c,
- 0xd4, 0x93, 0x9a, 0xbe, 0xd1, 0x0a, 0x18, 0x3d, 0xf5, 0xbf, 0xa7, 0x3c,
- 0x34, 0xf5, 0xca, 0x3c, 0xa2, 0xf2, 0x28, 0xbd, 0x1c, 0xf8, 0x96, 0xbd,
- 0x1e, 0xe3, 0x8e, 0xbe, 0x76, 0xc9, 0xcd, 0xbc, 0x15, 0x3e, 0x63, 0x3e,
- 0x05, 0xb4, 0x95, 0xbe, 0x08, 0x9c, 0x73, 0x3e, 0x12, 0xd0, 0x36, 0x3e,
- 0x08, 0x7d, 0x2a, 0x3e, 0x42, 0x63, 0xc0, 0xbc, 0xb9, 0x49, 0x0a, 0xbe,
- 0x0e, 0x5d, 0x5f, 0xbd, 0xc8, 0xb6, 0x1b, 0x3e, 0xe9, 0x18, 0xe9, 0xbd,
- 0xdb, 0x70, 0x14, 0xbd, 0x2e, 0x88, 0xb2, 0xbd, 0xf8, 0x93, 0xed, 0xbb,
- 0xc6, 0x79, 0xd6, 0x3d, 0xce, 0xdc, 0x89, 0xbd, 0x22, 0xff, 0x85, 0xbc,
- 0xbf, 0x93, 0x79, 0x3e, 0x02, 0x78, 0xad, 0xbd, 0x9a, 0x78, 0x5a, 0x3d,
- 0x98, 0xe1, 0x79, 0x3d, 0xdd, 0x49, 0x28, 0xbe, 0x99, 0x91, 0xa7, 0x3d,
- 0xa8, 0xeb, 0xef, 0xbd, 0x65, 0x4e, 0x02, 0x3e, 0xce, 0x4b, 0x2f, 0x3e,
- 0x36, 0xa1, 0x71, 0xbe, 0x4f, 0xa4, 0x00, 0xbe, 0x74, 0x90, 0x97, 0x3e,
- 0xb9, 0x51, 0xe1, 0x3d, 0x3d, 0x21, 0x82, 0xbd, 0x15, 0x6b, 0x04, 0xbe,
- 0xb7, 0x43, 0xa1, 0x3d, 0x40, 0x77, 0x2c, 0xbd, 0xda, 0xb5, 0x87, 0xbb,
- 0xae, 0x99, 0xbf, 0x3d, 0xb9, 0xb7, 0x22, 0xbc, 0x27, 0x72, 0xd1, 0xbc,
- 0xf9, 0xff, 0xf1, 0x3d, 0xd8, 0x76, 0x42, 0x3c, 0x66, 0xd2, 0xaf, 0xbd,
- 0xdd, 0x8c, 0xf2, 0xbd, 0x0d, 0x37, 0x35, 0xbd, 0x16, 0x9b, 0x88, 0xbc,
- 0xdc, 0xb8, 0x35, 0xbd, 0x8a, 0x2c, 0x0d, 0xbe, 0xc1, 0x86, 0x10, 0xbe,
- 0x39, 0xf2, 0x34, 0xbe, 0x64, 0x1c, 0x5a, 0x3e, 0x90, 0x09, 0xac, 0xbd,
- 0xfc, 0x4f, 0xb2, 0x3b, 0x2c, 0x77, 0x06, 0x3d, 0x1f, 0xd4, 0x64, 0xbd,
- 0x79, 0x2f, 0x1f, 0x3d, 0x30, 0xa7, 0x2f, 0xbe, 0x49, 0x65, 0xf3, 0xbd,
- 0x44, 0xcf, 0x41, 0xbd, 0xba, 0x49, 0x23, 0xbe, 0xfb, 0xf6, 0xe5, 0x3d,
- 0x6f, 0x72, 0x59, 0xbd, 0xa8, 0x90, 0x9c, 0x3d, 0x1d, 0x60, 0x33, 0x3e,
- 0x3c, 0x23, 0xc4, 0xbd, 0xc1, 0xee, 0x75, 0xbd, 0xac, 0x19, 0x7f, 0x3e,
- 0xa2, 0x6b, 0xf3, 0x3d, 0xc3, 0xeb, 0x93, 0x3e, 0x13, 0x95, 0xa1, 0xbd,
- 0x45, 0xe7, 0x92, 0xbe, 0xf3, 0xbd, 0x47, 0x3e, 0x95, 0x49, 0xa4, 0x3b,
- 0x61, 0x3d, 0x24, 0xbe, 0xaa, 0xe9, 0x47, 0xbe, 0x54, 0x08, 0x3e, 0x3e,
- 0x9d, 0x7a, 0x24, 0x3d, 0x71, 0x34, 0xfd, 0x3c, 0x3b, 0x62, 0xe4, 0x3c,
- 0xcd, 0x31, 0x80, 0xbe, 0xb8, 0xd0, 0x9f, 0x3e, 0xb5, 0xd9, 0x01, 0x3e,
- 0xd7, 0xa6, 0xa9, 0x3d, 0xa3, 0xb7, 0xe3, 0xbc, 0x28, 0xfe, 0x30, 0xbd,
- 0x0f, 0x2f, 0x54, 0x3e, 0x7c, 0x58, 0x04, 0x3e, 0xf9, 0x2c, 0x3f, 0xbd,
- 0xe0, 0x8c, 0x3f, 0x3d, 0x10, 0xb1, 0x73, 0xbd, 0x8c, 0xdb, 0xe8, 0xbd,
- 0xe8, 0xb7, 0x83, 0xbe, 0x8a, 0xed, 0x26, 0x3d, 0xd8, 0x0c, 0x56, 0xbb,
- 0x8b, 0xb4, 0xeb, 0x3d, 0xb7, 0x99, 0xab, 0xbd, 0xa5, 0x3e, 0x86, 0xbd,
- 0xc0, 0x6c, 0x24, 0xbe, 0x32, 0x93, 0x63, 0xbd, 0x29, 0xd5, 0x55, 0xbd,
- 0x2b, 0xec, 0x92, 0xbc, 0x37, 0xa1, 0x14, 0xbe, 0x0b, 0x5c, 0x2e, 0xbe,
- 0xab, 0x8a, 0x8c, 0x3d, 0xad, 0x93, 0x52, 0x3d, 0xbc, 0x68, 0xf7, 0xbd,
- 0x61, 0xa2, 0x0e, 0x3b, 0x25, 0x98, 0xe3, 0xbc, 0x8b, 0x91, 0xf8, 0x3d,
- 0x28, 0x31, 0x3b, 0xbc, 0xb4, 0xb1, 0x60, 0xbe, 0x05, 0xd2, 0xdd, 0x3c,
- 0x30, 0xad, 0xb0, 0xbd, 0x68, 0x0e, 0x86, 0x3d, 0xb1, 0xd2, 0x85, 0xbd,
- 0x9c, 0x8e, 0xa6, 0x3d, 0xac, 0xb1, 0xdc, 0x3b, 0x6d, 0x5d, 0x14, 0x3e,
- 0x6b, 0x7a, 0x50, 0xbe, 0x50, 0xac, 0x83, 0x3d, 0x45, 0x78, 0x88, 0x3d,
- 0x86, 0x52, 0xa1, 0x3e, 0x7a, 0x01, 0xf1, 0x3d, 0x3d, 0x9b, 0xd8, 0x3d,
- 0xf9, 0x00, 0xa5, 0xbd, 0x14, 0x9a, 0x04, 0xbe, 0xe9, 0x22, 0x8f, 0x3b,
- 0xbd, 0x25, 0x78, 0xbe, 0x63, 0x52, 0x88, 0x3e, 0xd6, 0x9b, 0x54, 0xbe,
- 0x27, 0x93, 0xc4, 0xbd, 0x06, 0xc5, 0x13, 0xbe, 0x23, 0xc8, 0x76, 0xbd,
- 0x7a, 0x25, 0x25, 0xbd, 0x3b, 0xc7, 0xaa, 0x3d, 0x98, 0x7d, 0x07, 0x3d,
- 0x70, 0x96, 0x8c, 0x3d, 0xe7, 0x85, 0x88, 0x3b, 0xd5, 0x1b, 0xa7, 0x3d,
- 0x39, 0x4c, 0x11, 0x3e, 0xdc, 0x0a, 0x86, 0xbd, 0x80, 0x3e, 0x75, 0xbc,
- 0xb5, 0xfb, 0x91, 0x3d, 0xd6, 0x9d, 0x30, 0x3d, 0xc8, 0x59, 0xec, 0x3c,
- 0x9a, 0x76, 0x2f, 0x3d, 0x05, 0x1f, 0xc0, 0x3c, 0x9c, 0xa1, 0x1c, 0xbd,
- 0x87, 0x54, 0xe3, 0x3d, 0x93, 0xfe, 0xc5, 0xbd, 0x42, 0xbf, 0x20, 0xbe,
- 0xee, 0xbd, 0xbc, 0x3e, 0x0f, 0xce, 0xac, 0xbe, 0xc5, 0xd0, 0xf9, 0x3d,
- 0x5d, 0x27, 0x25, 0x3e, 0x5e, 0x35, 0xe7, 0xbc, 0xbf, 0x9b, 0x9a, 0xbd,
- 0x64, 0xed, 0x37, 0x3d, 0xac, 0x5a, 0xfe, 0x3d, 0x1a, 0x0f, 0xc9, 0x3a,
- 0x0c, 0xc0, 0x4c, 0xbd, 0x55, 0xda, 0xb8, 0xbe, 0x33, 0x28, 0x8f, 0xbe,
- 0x02, 0x0d, 0x87, 0x3a, 0x1a, 0x20, 0x67, 0xbe, 0x83, 0xef, 0xbd, 0x3e,
- 0x41, 0x74, 0xbc, 0xbe, 0xb2, 0xb5, 0xfc, 0xbc, 0x46, 0x39, 0x0c, 0x3e,
- 0x96, 0xdd, 0x6c, 0x3d, 0x49, 0x95, 0x5e, 0x3e, 0x10, 0x03, 0xe1, 0x3e,
- 0x96, 0x3e, 0xd0, 0x3e, 0xfd, 0x03, 0x10, 0x3d, 0x43, 0x47, 0xa5, 0x3e,
- 0x4f, 0x01, 0x9d, 0x3d, 0x77, 0xef, 0xc4, 0xbe, 0x12, 0x34, 0x29, 0x3e,
- 0xf9, 0x84, 0xb2, 0x3e, 0xb8, 0x33, 0x93, 0x3e, 0xf6, 0x6a, 0x0a, 0x3c,
- 0xc1, 0x7b, 0x14, 0x3e, 0xca, 0x07, 0x8a, 0x3e, 0xd9, 0xd4, 0x6a, 0xbe,
- 0x45, 0x60, 0xf1, 0x3e, 0x17, 0xf4, 0xd3, 0x3e, 0x83, 0x99, 0x64, 0xbd,
- 0x78, 0x8f, 0x6d, 0xbd, 0x2f, 0x5e, 0x0d, 0x3e, 0x6d, 0x2f, 0x6c, 0xbe,
- 0xb0, 0xf6, 0x3e, 0x3e, 0xf2, 0x0b, 0x46, 0x3e, 0x4b, 0x4b, 0x06, 0x3e,
- 0xad, 0xe1, 0x12, 0x3d, 0x50, 0x97, 0xaa, 0x3e, 0x42, 0x7b, 0x0d, 0xbe,
- 0xa7, 0xcf, 0x00, 0xbe, 0xe1, 0x1c, 0xa7, 0xbe, 0x88, 0xcb, 0xd5, 0xbc,
- 0x2f, 0xce, 0x39, 0xbf, 0xd4, 0xc7, 0x46, 0xbe, 0x17, 0xfb, 0xe0, 0x3d,
- 0xdb, 0x35, 0x29, 0xbe, 0xd1, 0x41, 0x09, 0xbe, 0x29, 0xdf, 0xc6, 0xbe,
- 0x8c, 0x19, 0x8e, 0x3d, 0x36, 0x41, 0x8e, 0x3a, 0x40, 0x00, 0x29, 0x3d,
- 0x78, 0x73, 0xb1, 0x3e, 0xb7, 0x4c, 0xac, 0xbe, 0x44, 0xab, 0xf0, 0x3d,
- 0xed, 0x50, 0x0c, 0xbe, 0xb3, 0x6b, 0xd3, 0xbe, 0x22, 0xf6, 0x97, 0x3d,
- 0xe6, 0x7e, 0x8f, 0x3c, 0xa8, 0x4f, 0xa8, 0x3d, 0x1e, 0xa9, 0xa5, 0xbc,
- 0x8e, 0x4e, 0x80, 0x3e, 0x48, 0xbd, 0xc9, 0x3b, 0xbf, 0x62, 0xff, 0xbc,
- 0xc7, 0xab, 0x90, 0x3d, 0x28, 0x0b, 0xf4, 0x3e, 0xfd, 0xec, 0xfd, 0x3d,
- 0xe2, 0xa6, 0x97, 0x3d, 0xaa, 0x22, 0x43, 0xbd, 0x38, 0x6e, 0xaa, 0xbe,
- 0x55, 0x73, 0x59, 0xbe, 0x5a, 0xb4, 0xb6, 0x3e, 0xd3, 0x79, 0x5d, 0xbe,
- 0x90, 0xaa, 0xc6, 0x3e, 0xce, 0xd6, 0xdb, 0xbe, 0x15, 0xdd, 0x9b, 0x3e,
- 0x81, 0xd0, 0x49, 0x3c, 0x83, 0x72, 0xdb, 0x3d, 0x51, 0x9e, 0xe8, 0x3d,
- 0x92, 0x8a, 0x8d, 0xbd, 0x9a, 0x86, 0x8a, 0xbc, 0x63, 0xe4, 0x8e, 0x3d,
- 0x86, 0x75, 0x97, 0x3e, 0x89, 0xd3, 0x46, 0x3e, 0xd5, 0x49, 0xc4, 0x3e,
- 0xfe, 0xd8, 0x2b, 0xbe, 0x61, 0x98, 0x78, 0x3c, 0x48, 0x15, 0xdd, 0x3d,
- 0xc3, 0xa6, 0xc5, 0x3e, 0x04, 0x85, 0xce, 0x3d, 0xfe, 0x94, 0x8f, 0xbd,
- 0x3d, 0x77, 0x0e, 0xbf, 0xb0, 0xdb, 0x81, 0x3e, 0x2a, 0xd3, 0x09, 0x3e,
- 0x17, 0xf7, 0x39, 0xbe, 0xd3, 0xbc, 0xae, 0x3e, 0xf1, 0xd4, 0xe5, 0xbe,
- 0x10, 0x00, 0xe2, 0x3e, 0x24, 0x1a, 0x32, 0xbe, 0xf0, 0xf0, 0x15, 0xbe,
- 0xbf, 0x36, 0x8c, 0x3d, 0x75, 0x1e, 0x53, 0xbd, 0xb8, 0xb0, 0x9b, 0xbe,
- 0xc0, 0xe6, 0x05, 0x3e, 0xb7, 0x29, 0xf5, 0x3d, 0x5a, 0x40, 0x43, 0xbd,
- 0x12, 0xb9, 0xb4, 0x3e, 0xf2, 0x1b, 0x3e, 0x3e, 0xbc, 0xf7, 0x91, 0x3e,
- 0xbf, 0xc4, 0x03, 0xbf, 0x04, 0x7c, 0x8c, 0x3d, 0x7f, 0xd6, 0x9d, 0x3e,
- 0x5f, 0xb1, 0x21, 0x3b, 0xc6, 0x94, 0x66, 0xbd, 0x79, 0x1f, 0xbd, 0x3e,
- 0x13, 0x03, 0x5f, 0xbd, 0x1b, 0xfc, 0x00, 0x3f, 0xa7, 0x72, 0x0a, 0x3d,
- 0x50, 0x31, 0x51, 0x3d, 0xd8, 0x9e, 0xd2, 0xbb, 0x5b, 0xdb, 0x80, 0x3d,
- 0xd2, 0xe3, 0x5f, 0xbd, 0x1e, 0xea, 0xfb, 0x3c, 0xb6, 0xab, 0xcb, 0x3e,
- 0xdb, 0xc7, 0x8b, 0x3e, 0x07, 0x00, 0x0f, 0x3e, 0xe5, 0xf5, 0x8e, 0xbe,
- 0xca, 0xf3, 0x59, 0xbe, 0xb8, 0xbc, 0x0b, 0xbe, 0x3f, 0xbb, 0x6c, 0x3e,
- 0xf1, 0xe1, 0xee, 0x3c, 0xfe, 0x14, 0x36, 0xbf, 0x0e, 0xce, 0x70, 0x3a,
- 0x10, 0xb6, 0x6d, 0xbd, 0xcf, 0x4c, 0xea, 0xbd, 0x66, 0xd9, 0x67, 0xbc,
- 0x8e, 0x87, 0x13, 0xbd, 0x5f, 0x0b, 0xa4, 0x3c, 0x72, 0x61, 0xd5, 0x3d,
- 0xfe, 0xf1, 0xd1, 0x3d, 0x6e, 0xf9, 0x8c, 0xbe, 0x62, 0x8c, 0x4d, 0x3e,
- 0xb4, 0x15, 0xd5, 0x3b, 0x58, 0xbb, 0xa4, 0xbe, 0x5f, 0x21, 0x51, 0xbd,
- 0xc6, 0x43, 0x25, 0xbe, 0x47, 0x1e, 0xbe, 0x3e, 0x3f, 0xf0, 0x39, 0x3d,
- 0x79, 0x87, 0x07, 0x3c, 0xd3, 0x20, 0x3e, 0x3c, 0xc1, 0x5c, 0x7f, 0x3d,
- 0x88, 0x52, 0x08, 0xbe, 0x7c, 0x33, 0xa2, 0x3e, 0xd0, 0xf7, 0xaf, 0x3e,
- 0xb4, 0x4f, 0xf6, 0x3d, 0x36, 0x0c, 0x5a, 0xbd, 0xf8, 0x21, 0x83, 0xbc,
- 0xad, 0x12, 0x90, 0x3c, 0x0a, 0xfe, 0x23, 0xbc, 0x93, 0xb8, 0x51, 0x3e,
- 0x44, 0x86, 0x55, 0x3e, 0x1e, 0x24, 0x79, 0xbd, 0x32, 0xfd, 0xe6, 0xbd,
- 0x3b, 0xb4, 0x9d, 0x3e, 0xe1, 0xaf, 0xc0, 0x3e, 0x00, 0x9f, 0x27, 0xbe,
- 0x0d, 0x37, 0x98, 0xbe, 0x99, 0x2b, 0x3d, 0xbe, 0x12, 0x16, 0xa6, 0x3e,
- 0x2a, 0x7a, 0x07, 0xbd, 0x62, 0x18, 0x75, 0x3e, 0x96, 0xa2, 0x94, 0xbe,
- 0x1d, 0x94, 0x33, 0x3e, 0x89, 0x79, 0x47, 0x3e, 0x16, 0xc9, 0xed, 0x3d,
- 0x04, 0xdb, 0xa4, 0x3c, 0x37, 0x45, 0xd5, 0x3c, 0x00, 0xa7, 0x77, 0x3e,
- 0x1f, 0x8c, 0x85, 0x3e, 0x25, 0xc8, 0x7d, 0xbd, 0x47, 0x77, 0x96, 0xbd,
- 0xc3, 0xa5, 0x47, 0x3e, 0x33, 0x56, 0x6a, 0x3e, 0x65, 0xb8, 0x97, 0x3e,
- 0xa9, 0xb6, 0x5c, 0xbd, 0xbe, 0x76, 0x85, 0xbc, 0x75, 0x31, 0x0d, 0x3d,
- 0x23, 0xa0, 0x6c, 0x3d, 0x26, 0xbc, 0x35, 0xbe, 0x87, 0x57, 0xcb, 0x3d,
- 0x97, 0x30, 0xe4, 0xbc, 0xa5, 0x26, 0x3b, 0xbe, 0x3b, 0xe2, 0xb6, 0x3c,
- 0x7c, 0x54, 0xd0, 0xbe, 0x1a, 0xa2, 0x88, 0xbb, 0x60, 0x69, 0xf9, 0x3d,
- 0xcd, 0x93, 0x50, 0x3e, 0xa3, 0x9c, 0x04, 0x3e, 0xc9, 0x6a, 0x28, 0xbd,
- 0x42, 0xb1, 0x9c, 0xbb, 0xfe, 0xc9, 0xb0, 0xbd, 0x9b, 0xb5, 0xea, 0xbc,
- 0xaa, 0xac, 0x91, 0xbc, 0x3f, 0x01, 0xd9, 0x3e, 0x7f, 0xfd, 0x99, 0xbe,
- 0x85, 0x15, 0x7f, 0x3e, 0x78, 0x46, 0xa6, 0x3d, 0xa8, 0x1e, 0x7a, 0x3e,
- 0xb4, 0x68, 0xe8, 0x3c, 0xe5, 0x95, 0xad, 0xbd, 0xb7, 0x53, 0x04, 0xbe,
- 0x45, 0x3c, 0x68, 0xbe, 0x86, 0x4a, 0x31, 0x3e, 0xbc, 0x6e, 0xb6, 0x3d,
- 0x68, 0xe7, 0x0c, 0x3d, 0x86, 0xc0, 0xf5, 0x3e, 0xe2, 0x2a, 0x4e, 0x3d,
- 0x14, 0x94, 0x28, 0xbe, 0x8b, 0x24, 0x15, 0xbe, 0x39, 0xd4, 0x63, 0x3e,
- 0x93, 0x70, 0xab, 0xbe, 0x4b, 0xdf, 0x95, 0xbe, 0x72, 0x3d, 0xd6, 0x3e,
- 0x5d, 0x05, 0x02, 0xbd, 0x88, 0xfb, 0x24, 0xbe, 0xaf, 0x20, 0xd2, 0x3e,
- 0xeb, 0xed, 0x40, 0xbd, 0x55, 0x37, 0xf3, 0x3c, 0x99, 0xea, 0x99, 0xbd,
- 0xbe, 0x04, 0x56, 0x3e, 0xa4, 0x49, 0xd6, 0x3d, 0xbf, 0x8d, 0x66, 0x3e,
- 0x27, 0x39, 0x96, 0x3e, 0x57, 0x1b, 0x10, 0x3d, 0x8f, 0xe7, 0xeb, 0xbd,
- 0x73, 0xd9, 0xbc, 0x3d, 0x1e, 0x92, 0x98, 0xbe, 0xda, 0xa2, 0x3f, 0xbe,
- 0x45, 0x4a, 0x99, 0x3d, 0x28, 0xcd, 0x72, 0xbb, 0x80, 0x5e, 0x17, 0xbe,
- 0x91, 0xc1, 0xd2, 0x3d, 0xfd, 0x73, 0x8b, 0xbe, 0x3d, 0xee, 0x15, 0xbe,
- 0x9e, 0x08, 0x01, 0x3e, 0x58, 0x1d, 0x94, 0xbd, 0x79, 0x68, 0xd3, 0xbd,
- 0x73, 0xdc, 0xe9, 0xbd, 0x6a, 0xaa, 0x05, 0x3d, 0xb6, 0x7a, 0x16, 0xbe,
- 0xde, 0x96, 0xdb, 0xbd, 0xa9, 0x57, 0xff, 0xbe, 0xe2, 0x35, 0xc5, 0x3c,
- 0x83, 0x92, 0x0a, 0x3d, 0x49, 0x59, 0xbe, 0xbd, 0x36, 0xbd, 0x39, 0xbc,
- 0x3a, 0xa7, 0x21, 0xbe, 0x76, 0xf7, 0xd3, 0xba, 0x55, 0x6f, 0x23, 0xbe,
- 0xe8, 0xef, 0x0f, 0x3c, 0x6f, 0x74, 0x86, 0xbd, 0x13, 0xb4, 0xbf, 0x3d,
- 0xc6, 0x26, 0x0d, 0x3f, 0xac, 0xa9, 0xb8, 0x3d, 0x2d, 0xb4, 0x6b, 0xbd,
- 0x21, 0xa7, 0x4e, 0xbe, 0x8b, 0x03, 0x92, 0xbe, 0xd1, 0x1a, 0xde, 0xbd,
- 0x24, 0x36, 0x00, 0xbe, 0xbf, 0xcb, 0xa6, 0x3e, 0x92, 0x8e, 0x04, 0xbd,
- 0x01, 0x20, 0x4e, 0xbc, 0xb6, 0x75, 0x49, 0x3c, 0x00, 0xd5, 0x83, 0x3e,
- 0xe3, 0x2a, 0x05, 0x3e, 0xae, 0xf7, 0x6f, 0x3d, 0x50, 0xf2, 0xa7, 0xbd,
- 0xb4, 0xf0, 0x9a, 0xbe, 0xcb, 0x54, 0xaf, 0x3d, 0x14, 0xc4, 0x4f, 0x3d,
- 0x45, 0x36, 0x05, 0xbe, 0x05, 0xc1, 0xda, 0x3e, 0xf5, 0xf9, 0x8c, 0x3e,
- 0x23, 0xd3, 0x7b, 0xbe, 0x79, 0x7a, 0xd1, 0xbd, 0x7c, 0x1d, 0x88, 0xbd,
- 0x10, 0xc3, 0x4b, 0x3e, 0xeb, 0x04, 0x62, 0x3e, 0xa3, 0x0e, 0x42, 0x3d,
- 0xfe, 0x97, 0x90, 0xbd, 0xf2, 0x91, 0xf5, 0xbe, 0xf4, 0x08, 0xf6, 0x3d,
- 0x64, 0xcc, 0xcf, 0xbd, 0xff, 0xaf, 0x14, 0xbe, 0x10, 0x23, 0x3b, 0x3d,
- 0x4d, 0x60, 0xe7, 0x3e, 0x9d, 0x60, 0x85, 0x3d, 0x90, 0x60, 0x8c, 0x3d,
- 0xa9, 0xcc, 0xe2, 0x3d, 0x8d, 0x10, 0x84, 0xbc, 0x62, 0x76, 0xda, 0x3d,
- 0x3a, 0x73, 0xd4, 0xbb, 0x8b, 0x4c, 0x32, 0xbc, 0x38, 0x71, 0xb7, 0x3e,
- 0x54, 0x8d, 0x1d, 0xbc, 0xaa, 0x43, 0xbf, 0x3d, 0xc7, 0x6b, 0xbd, 0x3e,
- 0x4d, 0x06, 0x80, 0xbe, 0x68, 0x87, 0x7e, 0xbd, 0x1e, 0xd7, 0x4e, 0xbe,
- 0x4b, 0xa6, 0x14, 0xbe, 0x4c, 0x6b, 0x0f, 0x3e, 0xe0, 0x4f, 0x6e, 0xbc,
- 0x4a, 0x2b, 0xb0, 0x3e, 0x9e, 0x27, 0x9e, 0xbd, 0xb1, 0xeb, 0xc0, 0x3d,
- 0xd3, 0x80, 0x85, 0xbd, 0x17, 0x98, 0x83, 0x3e, 0xc0, 0x7d, 0x47, 0x3b,
- 0x2e, 0x3e, 0x04, 0x3e, 0x0b, 0xa3, 0x0d, 0xbf, 0x74, 0x41, 0xc7, 0xbc,
- 0x16, 0x08, 0x01, 0x3d, 0x22, 0xd2, 0xae, 0x3d, 0xc2, 0x2f, 0xd7, 0xbc,
- 0x5d, 0x2e, 0x73, 0x3d, 0xd6, 0x4b, 0xf4, 0xbd, 0x41, 0x28, 0x02, 0xbe,
- 0xdf, 0xfe, 0x2a, 0xbe, 0xd6, 0xb7, 0xe1, 0x3d, 0xbe, 0x98, 0xf9, 0xbd,
- 0x8e, 0x87, 0x6c, 0xbe, 0xdc, 0x72, 0xbd, 0xbd, 0x21, 0x19, 0x03, 0xbe,
- 0x2c, 0x93, 0x87, 0x3e, 0x53, 0xc0, 0x9f, 0xbe, 0x96, 0x0e, 0xec, 0x3d,
- 0x8e, 0x55, 0x07, 0x3f, 0xfd, 0x41, 0x37, 0x3e, 0x10, 0xc4, 0x79, 0x3d,
- 0x2e, 0x88, 0x8e, 0xbd, 0xc5, 0x91, 0xc4, 0x3c, 0x2b, 0x5a, 0x13, 0xbe,
- 0x47, 0x68, 0x92, 0x3e, 0x43, 0x02, 0xba, 0xbe, 0x26, 0x2e, 0x34, 0xbb,
- 0x56, 0x23, 0xd8, 0x3d, 0xce, 0xd6, 0xc4, 0xbd, 0x31, 0xe2, 0x03, 0x3e,
- 0xaa, 0xf4, 0xeb, 0xbd, 0xc7, 0xcf, 0xa6, 0x3d, 0x38, 0xca, 0x5d, 0xbe,
- 0xd1, 0x2d, 0x15, 0xbd, 0xac, 0x62, 0xcd, 0xbd, 0xa6, 0xbe, 0x63, 0x3e,
- 0xba, 0x7b, 0x4c, 0xbd, 0xdf, 0x2a, 0x78, 0xbe, 0x6a, 0x51, 0x0c, 0x3e,
- 0x72, 0x5a, 0x49, 0x3d, 0x5b, 0x51, 0x2d, 0xbe, 0x96, 0x37, 0x6b, 0xbe,
- 0x9e, 0xf8, 0x90, 0xbb, 0x25, 0x04, 0xf5, 0x3e, 0xaf, 0x76, 0x21, 0xbe,
- 0x0a, 0x3d, 0xe8, 0x3c, 0x3a, 0xc6, 0x1b, 0x3e, 0x41, 0x01, 0x01, 0x3e,
- 0x35, 0xc9, 0x87, 0xbd, 0xe9, 0x8c, 0x11, 0xbe, 0x87, 0x87, 0x10, 0x3e,
- 0x00, 0x2a, 0x4d, 0xbe, 0xc9, 0x9f, 0xfe, 0x3e, 0x10, 0xb5, 0xb0, 0xbe,
- 0xa4, 0x92, 0x0d, 0xbf, 0xcf, 0x3c, 0x9b, 0x3e, 0xaf, 0x1d, 0x93, 0x3e,
- 0x8f, 0xdf, 0x91, 0x3a, 0x98, 0x99, 0x8e, 0xbd, 0x77, 0xc8, 0x4e, 0x3e,
- 0xac, 0x95, 0x48, 0xbe, 0xaf, 0x99, 0xfb, 0xbc, 0xc7, 0x42, 0x10, 0xbe,
- 0x3f, 0x4c, 0x04, 0xbe, 0x44, 0x86, 0x5f, 0xbe, 0xe5, 0x8f, 0x5e, 0xbc,
- 0x3e, 0x19, 0x11, 0x3e, 0x40, 0x60, 0x29, 0x3e, 0x00, 0xa6, 0x0b, 0xbe,
- 0xc3, 0x87, 0x91, 0x3e, 0xf6, 0xef, 0xc0, 0xbd, 0x81, 0x69, 0x15, 0xbe,
- 0x32, 0x59, 0xd0, 0xbc, 0xd4, 0xe3, 0x3f, 0x3c, 0xba, 0x7e, 0xf6, 0xbc,
- 0x75, 0xf0, 0xa0, 0xbd, 0x83, 0xb1, 0xe1, 0xbd, 0x99, 0x6a, 0xa0, 0x3d,
- 0xa6, 0x62, 0xa8, 0xbd, 0x95, 0x46, 0x59, 0xbe, 0xef, 0x5c, 0xaa, 0x3e,
- 0xfb, 0x65, 0x89, 0x3e, 0x6e, 0x2b, 0xe0, 0xbc, 0x12, 0x93, 0xdf, 0xbd,
- 0xd2, 0x8d, 0x20, 0xbd, 0x8f, 0xf3, 0xae, 0x3d, 0xe8, 0x6a, 0xea, 0xbd,
- 0x70, 0x8e, 0x9c, 0xbe, 0x49, 0x98, 0x31, 0x3e, 0xe3, 0xe1, 0x3e, 0xbd,
- 0x5c, 0xa2, 0xaf, 0x3e, 0xf6, 0x4a, 0x52, 0x3e, 0x24, 0x15, 0x8d, 0xbe,
- 0x2a, 0x10, 0x2a, 0x3e, 0x61, 0x94, 0x64, 0x3d, 0xe9, 0xa6, 0x7a, 0xbe,
- 0x1c, 0x9a, 0xa2, 0xbd, 0x99, 0xd4, 0x45, 0x3e, 0x33, 0xad, 0xa4, 0x3d,
- 0x65, 0xa9, 0x33, 0x3e, 0x97, 0xea, 0x6d, 0x3d, 0xc0, 0xb2, 0xd6, 0x3d,
- 0x00, 0xbe, 0x85, 0x3e, 0x4d, 0x24, 0xf0, 0x3c, 0xb7, 0x2e, 0x17, 0xbe,
- 0x83, 0x73, 0xce, 0xbe, 0x85, 0xf9, 0xd3, 0xbd, 0x32, 0x09, 0x89, 0x3c,
- 0xef, 0x2b, 0x16, 0x3e, 0xf7, 0xcb, 0x5d, 0x3e, 0x0b, 0x6e, 0x95, 0x3e,
- 0x92, 0xe6, 0x7e, 0x3d, 0xb4, 0xd5, 0xbf, 0xbd, 0x3d, 0xcb, 0x95, 0x3e,
- 0xc8, 0x8e, 0x82, 0xbc, 0x77, 0xca, 0x1d, 0x3e, 0xd6, 0x04, 0x04, 0x3e,
- 0x78, 0x84, 0x71, 0x3e, 0x0d, 0x4a, 0x17, 0x3e, 0xe9, 0x0e, 0x0f, 0x3d,
- 0x6b, 0xbc, 0x04, 0xbe, 0x5e, 0x5a, 0x31, 0x3d, 0x1c, 0x33, 0x31, 0x3e,
- 0x25, 0x6c, 0xf8, 0x3c, 0x84, 0x9b, 0xec, 0xbd, 0xe8, 0x62, 0x7b, 0xbc,
- 0x01, 0x07, 0x80, 0xbe, 0x74, 0x8a, 0x1a, 0xbe, 0x22, 0xc7, 0xb8, 0xba,
- 0xd5, 0x1a, 0xb0, 0xbe, 0x51, 0x14, 0xd2, 0xbd, 0x83, 0xd5, 0x48, 0xbe,
- 0xa1, 0x40, 0x9e, 0xbe, 0x63, 0x92, 0xf0, 0xbd, 0xc4, 0x00, 0x95, 0xbe,
- 0xb3, 0x8a, 0x2d, 0x3d, 0xbb, 0xe2, 0x17, 0x39, 0xe5, 0xd7, 0x87, 0xbb,
- 0xee, 0xea, 0x52, 0xbe, 0xf5, 0xd3, 0x1b, 0x3d, 0x36, 0xa1, 0xf7, 0x3d,
- 0x34, 0x05, 0x4a, 0xbe, 0xca, 0x80, 0x12, 0x3e, 0x62, 0xe3, 0x9b, 0x3e,
- 0x29, 0xee, 0x05, 0xbe, 0x3f, 0x95, 0x14, 0xbe, 0x5c, 0x70, 0x9f, 0x3e,
- 0x6c, 0x08, 0x94, 0x3d, 0x25, 0x7e, 0x02, 0xbe, 0xe2, 0x40, 0x36, 0x3e,
- 0xb6, 0x52, 0xc0, 0x3c, 0x34, 0x03, 0xbc, 0xbd, 0x08, 0x8e, 0xb1, 0xbe,
- 0x59, 0xd4, 0x2d, 0xbd, 0x0a, 0x46, 0x76, 0xbe, 0x10, 0xb9, 0xd8, 0x3b,
- 0x46, 0x19, 0x24, 0x3e, 0xba, 0x45, 0x29, 0x3e, 0x80, 0x4f, 0x23, 0xbd,
- 0x72, 0x55, 0x47, 0xbd, 0x59, 0x33, 0x6f, 0x3d, 0xef, 0xef, 0xb4, 0x3d,
- 0x95, 0x30, 0xce, 0xbd, 0x45, 0x13, 0x12, 0x3e, 0xa8, 0xbd, 0xc6, 0xbe,
- 0xe5, 0x55, 0xfa, 0x3c, 0x02, 0x3b, 0x33, 0xbe, 0x4b, 0x16, 0x0a, 0xbd,
- 0x2c, 0x04, 0x8c, 0xbd, 0xa8, 0x06, 0x5a, 0xbe, 0x73, 0x61, 0xa7, 0x3d,
- 0x10, 0x31, 0x0a, 0x3e, 0x73, 0x49, 0x8a, 0xbc, 0x7c, 0x9e, 0x2b, 0xbe,
- 0x51, 0x8f, 0x2a, 0x3f, 0x24, 0x40, 0xe9, 0xbd, 0x26, 0xef, 0x5e, 0xbe,
- 0x05, 0x70, 0xf7, 0x3d, 0x10, 0x7a, 0x6c, 0x3d, 0xd5, 0xe1, 0xef, 0x3d,
- 0x09, 0x43, 0x61, 0x3e, 0xb9, 0xf8, 0x2a, 0xbd, 0x91, 0xa1, 0xb5, 0xbd,
- 0x87, 0xac, 0x7b, 0x3d, 0xce, 0x14, 0x55, 0x3e, 0x01, 0x81, 0x52, 0x3d,
- 0x5c, 0x22, 0x92, 0x3e, 0xeb, 0x7d, 0x2c, 0xbd, 0xac, 0x9e, 0x6b, 0x3e,
- 0x53, 0x46, 0x40, 0xbd, 0x9b, 0x50, 0x61, 0x3e, 0x43, 0x0b, 0x92, 0x3e,
- 0xe0, 0xbd, 0x39, 0x3e, 0x8a, 0x05, 0x22, 0x3e, 0x6f, 0x3e, 0x15, 0x3e,
- 0xf3, 0x73, 0x8f, 0x3d, 0xdd, 0xbe, 0x9f, 0x3d, 0xa9, 0x79, 0x8d, 0xbe,
- 0x8d, 0x9b, 0x50, 0xbc, 0x48, 0xa7, 0x52, 0x3e, 0xe5, 0x9b, 0x0f, 0x3e,
- 0xbe, 0xc7, 0x61, 0xbe, 0xd9, 0x3c, 0x25, 0xbd, 0x78, 0x0f, 0xb1, 0x3c,
- 0x17, 0x06, 0x13, 0x3e, 0x22, 0x91, 0xc0, 0x3d, 0xd0, 0xd6, 0x0f, 0xbe,
- 0x56, 0x7a, 0xa9, 0x3c, 0x24, 0x6b, 0xf3, 0x3d, 0x8d, 0x25, 0x1e, 0x3e,
- 0x49, 0x60, 0xdf, 0x3e, 0xbc, 0x15, 0x06, 0x3d, 0x24, 0xa6, 0xc0, 0x3c,
- 0xf1, 0xe5, 0x86, 0x3c, 0x99, 0x22, 0x56, 0xbe, 0x5c, 0x56, 0xb8, 0xbe,
- 0x7a, 0x6c, 0x32, 0x3e, 0x53, 0x3c, 0x37, 0xbe, 0xff, 0x4d, 0x92, 0xbd,
- 0x5f, 0xe2, 0x0e, 0xbe, 0x89, 0xf0, 0x33, 0xbe, 0x1f, 0x35, 0x91, 0xbd,
- 0x34, 0xa6, 0xd3, 0x3d, 0xcf, 0x42, 0xd2, 0x3e, 0x8f, 0xbb, 0x71, 0xbe,
- 0xbb, 0xa8, 0xe4, 0xbd, 0x82, 0x21, 0x1f, 0x3e, 0xf5, 0xa6, 0x22, 0xbd,
- 0x08, 0x61, 0xb1, 0x3e, 0x39, 0xcd, 0x3c, 0xbe, 0x32, 0x55, 0x92, 0xbe,
- 0x2d, 0x66, 0x1f, 0x3d, 0x7c, 0x59, 0x41, 0x3e, 0x04, 0xe8, 0x90, 0xbe,
- 0x79, 0x50, 0x99, 0x3d, 0x0c, 0x34, 0xe5, 0x3d, 0x98, 0x9e, 0xa0, 0xbe,
- 0x05, 0x1c, 0x8b, 0xbc, 0xce, 0x7e, 0xc7, 0xbd, 0xda, 0x1d, 0x8f, 0xbd,
- 0x40, 0x92, 0x2e, 0xbe, 0x3d, 0x25, 0xdc, 0xbd, 0x65, 0xf8, 0x4c, 0x3e,
- 0x13, 0xd0, 0xce, 0xbd, 0x27, 0x5c, 0xad, 0xbd, 0x81, 0x9c, 0x3e, 0xbe,
- 0x83, 0x9f, 0xd3, 0x3d, 0x29, 0xf4, 0x2d, 0xbe, 0x4c, 0xbe, 0x1d, 0x3e,
- 0x97, 0xd2, 0x86, 0xbd, 0xd6, 0x16, 0x1c, 0xbe, 0x1c, 0x55, 0x06, 0xbc,
- 0xe2, 0xaf, 0xc6, 0xbd, 0xbc, 0x4f, 0xa9, 0xbc, 0x52, 0x38, 0x7e, 0xbd,
- 0x26, 0x6d, 0x41, 0x3e, 0x65, 0x21, 0x47, 0xbc, 0xf9, 0x07, 0xc5, 0xbc,
- 0x67, 0x64, 0xb4, 0xbc, 0x84, 0x2c, 0xef, 0x3d, 0x6f, 0x15, 0x01, 0xbd,
- 0x1a, 0xe9, 0x92, 0x3b, 0x07, 0xea, 0x05, 0xbe, 0x87, 0x70, 0x94, 0xbd,
- 0xfe, 0xe3, 0x6c, 0x3e, 0xd6, 0x3c, 0x3d, 0xbe, 0x17, 0x2d, 0x2c, 0xbe,
- 0x7a, 0xfb, 0xa1, 0x3d, 0xa4, 0xdb, 0x88, 0xbd, 0xb1, 0x25, 0x74, 0x3e,
- 0x01, 0x57, 0x18, 0xbd, 0x83, 0x24, 0xb7, 0xbc, 0x8a, 0xef, 0x47, 0xbe,
- 0x2a, 0x7c, 0xd4, 0x3d, 0xac, 0x5c, 0x5f, 0x3d, 0x50, 0x22, 0x0e, 0xbb,
- 0xde, 0x4d, 0x07, 0xbe, 0x19, 0xe8, 0x3a, 0xbe, 0x6d, 0xa3, 0x8d, 0x3d,
- 0xa7, 0x4b, 0xb9, 0xbe, 0x2a, 0x39, 0xa6, 0xbe, 0xe5, 0x82, 0x14, 0xba,
- 0xc5, 0xbe, 0x9e, 0xbe, 0x57, 0x23, 0x8c, 0x3e, 0x5a, 0xe3, 0x39, 0x3e,
- 0x96, 0x64, 0x0b, 0xbd, 0x24, 0xb4, 0xec, 0xbd, 0x0d, 0xc7, 0x2a, 0xbe,
- 0x22, 0xf6, 0xdf, 0xbc, 0x4f, 0x25, 0x91, 0x3e, 0x86, 0x7d, 0xb1, 0xbd,
- 0x1b, 0xd9, 0xb9, 0xbe, 0xfe, 0xc6, 0x68, 0x3d, 0xde, 0x6a, 0x9d, 0x3d,
- 0xcf, 0x28, 0x1b, 0xbd, 0x21, 0xfd, 0xf8, 0x3c, 0x0e, 0x85, 0x3d, 0x3e,
- 0x17, 0x5a, 0xa8, 0x3e, 0x3f, 0xa8, 0xcc, 0x3e, 0x7c, 0x4d, 0x0c, 0xbf,
- 0x54, 0xde, 0xff, 0xbe, 0xce, 0xde, 0x44, 0x3e, 0xfc, 0x2f, 0x80, 0x3e,
- 0x7d, 0x5a, 0xad, 0x3c, 0xfc, 0x49, 0xad, 0xbe, 0x3d, 0x58, 0x17, 0xbe,
- 0xf4, 0x83, 0x19, 0xbe, 0xf0, 0x05, 0xd8, 0x3d, 0xe1, 0x14, 0x3e, 0x3e,
- 0xb7, 0xdc, 0x83, 0xbe, 0x77, 0x7d, 0xab, 0x3d, 0x52, 0x9a, 0x82, 0x3e,
- 0xdd, 0x7f, 0x06, 0x3f, 0x8f, 0x78, 0xd7, 0x3d, 0xc8, 0x9d, 0x9b, 0x3e,
- 0x65, 0x66, 0x24, 0xbd, 0x76, 0xcf, 0xcc, 0x3b, 0x0e, 0xc9, 0x5c, 0xbe,
- 0x3b, 0x95, 0x88, 0x3e, 0x74, 0x6e, 0x8a, 0xbc, 0xac, 0xed, 0xf1, 0x3c,
- 0xdb, 0xb3, 0xd7, 0xbd, 0x66, 0x5f, 0xa1, 0x3e, 0x1e, 0xed, 0xb2, 0xbe,
- 0x5e, 0x1c, 0xa7, 0xbe, 0xb4, 0xb9, 0x4a, 0xbd, 0xa9, 0xaf, 0xb4, 0xbe,
- 0x3a, 0x67, 0x77, 0x3d, 0x3e, 0x07, 0xea, 0x3d, 0xa7, 0x65, 0xe3, 0xbe,
- 0x6e, 0x5e, 0x83, 0x3e, 0x33, 0x60, 0x27, 0xbe, 0xed, 0xfc, 0x9a, 0x3e,
- 0xb3, 0x7f, 0xc9, 0x3d, 0x55, 0x05, 0xc5, 0xbe, 0x11, 0xeb, 0xc7, 0xbc,
- 0xce, 0xe1, 0xde, 0xbe, 0x23, 0x53, 0x7e, 0xbd, 0xe2, 0x65, 0x16, 0x3e,
- 0x3e, 0xc7, 0x73, 0x3d, 0x04, 0x76, 0xe7, 0xbd, 0xb5, 0x4d, 0xd7, 0x3d,
- 0xf5, 0x81, 0xab, 0xbc, 0xb3, 0x57, 0x6f, 0x3d, 0x8f, 0x97, 0xc7, 0x3c,
- 0xfd, 0x49, 0x00, 0xbf, 0x16, 0x52, 0x2e, 0x3d, 0xdc, 0x25, 0x0e, 0x3e,
- 0xe6, 0xfc, 0x5a, 0x3e, 0x9e, 0x29, 0x97, 0x3e, 0xc3, 0x36, 0xc5, 0xbd,
- 0xe9, 0x7c, 0xdf, 0xbd, 0xe9, 0x36, 0xc4, 0x3e, 0x41, 0x93, 0x26, 0x3e,
- 0x5d, 0xdd, 0x4f, 0xbd, 0x29, 0x42, 0x9e, 0x3e, 0x61, 0xd3, 0xf1, 0x3d,
- 0x97, 0x47, 0xdd, 0xbe, 0x87, 0x2b, 0x51, 0xbe, 0x31, 0xc4, 0x1b, 0xbe,
- 0x15, 0xd9, 0x63, 0x3e, 0x0c, 0x86, 0x7d, 0x3d, 0x04, 0xd9, 0x29, 0xbb,
- 0x72, 0x56, 0xdf, 0x3d, 0xd6, 0x9c, 0x00, 0xbf, 0xf9, 0xf6, 0x49, 0x3e,
- 0x3e, 0x49, 0x75, 0xbc, 0x2f, 0x7b, 0x17, 0xbf, 0x3f, 0xa6, 0x6a, 0x3d,
- 0x72, 0xe8, 0x3e, 0x3e, 0x78, 0x39, 0x82, 0xbe, 0x77, 0x0b, 0x93, 0x3d,
- 0xf5, 0xdf, 0xbb, 0x3d, 0xa7, 0x48, 0xa7, 0xbd, 0xa3, 0x88, 0x8d, 0xbe,
- 0x8b, 0x1c, 0x44, 0xbe, 0x6f, 0xa9, 0x0e, 0x3f, 0x1b, 0x88, 0x96, 0xbe,
- 0x20, 0xed, 0x83, 0xbd, 0x3b, 0xa4, 0x0a, 0xbd, 0xa4, 0x87, 0x31, 0x3b,
- 0x3b, 0xcf, 0x83, 0x3e, 0xb4, 0xe6, 0x4e, 0x3d, 0xff, 0x62, 0xcc, 0xbd,
- 0x57, 0x44, 0x70, 0xbd, 0xe4, 0x78, 0x74, 0x3d, 0x97, 0xf9, 0xa6, 0xbd,
- 0x0b, 0x6c, 0xed, 0xbe, 0xed, 0x99, 0x51, 0x3e, 0x3a, 0x6f, 0x81, 0xbe,
- 0xfd, 0x89, 0xef, 0xbe, 0xe9, 0xe1, 0x36, 0xbc, 0x8c, 0x4d, 0xa6, 0x3e,
- 0x09, 0xfc, 0x15, 0x3c, 0x8f, 0x58, 0x09, 0xbe, 0x8d, 0x62, 0xec, 0x3e,
- 0xe6, 0xbd, 0x37, 0xbd, 0xb5, 0xf2, 0x4c, 0x3c, 0x17, 0xc6, 0x74, 0x3e,
- 0x9f, 0x9d, 0xcd, 0xbc, 0xe7, 0x0c, 0x4c, 0xbd, 0x90, 0xe4, 0x65, 0x3d,
- 0x09, 0xb2, 0xbb, 0x3e, 0x1b, 0x14, 0xf4, 0x3d, 0x5b, 0x59, 0x38, 0xbe,
- 0xf6, 0xe3, 0x11, 0x3e, 0x8d, 0x20, 0xf4, 0x3d, 0xd1, 0xa0, 0x71, 0xbe,
- 0x69, 0x8a, 0x14, 0xbe, 0x00, 0xe5, 0x81, 0x3e, 0x0d, 0x1b, 0xaf, 0xbe,
- 0x3c, 0xa9, 0xe4, 0xbd, 0xda, 0x5d, 0x11, 0x3e, 0xad, 0x20, 0xa9, 0x3d,
- 0x3e, 0x4d, 0xbd, 0x3d, 0x69, 0x82, 0x25, 0xbe, 0x96, 0xbe, 0x87, 0x3d,
- 0xb2, 0xd8, 0xef, 0xbc, 0xb1, 0x29, 0xb0, 0x3d, 0x05, 0x72, 0xfc, 0x3d,
- 0xcd, 0x3f, 0x22, 0xbe, 0x5f, 0x78, 0x78, 0x3d, 0x9f, 0xd6, 0xb7, 0xbd,
- 0x2b, 0xea, 0x82, 0xbe, 0xc7, 0xc1, 0x8f, 0x3d, 0x30, 0x6d, 0x87, 0x3e,
- 0xdf, 0xb2, 0x64, 0xbc, 0x89, 0xc2, 0x97, 0xbb, 0x4e, 0x75, 0xef, 0xbe,
- 0x71, 0xdb, 0x23, 0x3e, 0xb3, 0x81, 0x63, 0xbd, 0x55, 0x3d, 0x25, 0x3c,
- 0xcd, 0x15, 0x8c, 0x3c, 0xd9, 0x56, 0xd5, 0xbc, 0x8e, 0x63, 0x39, 0xbe,
- 0x0e, 0xba, 0xd2, 0x3d, 0xc3, 0xa5, 0xd8, 0x3c, 0x82, 0x8f, 0x82, 0xbd,
- 0x67, 0x61, 0x38, 0x3e, 0xb3, 0xc4, 0x8a, 0xbc, 0x26, 0xf7, 0x63, 0x3e,
- 0xb1, 0x03, 0x9a, 0xbe, 0xc6, 0x0d, 0x96, 0xbd, 0xeb, 0x45, 0xcb, 0x3d,
- 0x51, 0x14, 0xc1, 0x3c, 0x00, 0xea, 0x4c, 0xbe, 0x74, 0x72, 0x00, 0x3f,
- 0xf2, 0x15, 0x91, 0xbc, 0x83, 0xe0, 0xd5, 0xbd, 0x83, 0xc4, 0xd1, 0x3d,
- 0x97, 0xd9, 0x05, 0xbe, 0xc0, 0xb8, 0xe2, 0xbc, 0x56, 0xe6, 0xb0, 0x3e,
- 0x8b, 0x1c, 0x36, 0xbd, 0x0f, 0x44, 0x18, 0x3e, 0x79, 0x88, 0x1f, 0x3d,
- 0x46, 0x56, 0x1b, 0x3d, 0xed, 0x41, 0x4d, 0x3e, 0x1a, 0x91, 0xe7, 0x3d,
- 0x4c, 0x67, 0xb4, 0x3e, 0xe1, 0xb4, 0x19, 0x3d, 0xb2, 0x20, 0xf4, 0xbb,
- 0xd1, 0x5c, 0x34, 0x3d, 0x09, 0x5b, 0x35, 0xbd, 0xf9, 0x19, 0xf7, 0xbd,
- 0x84, 0x88, 0x20, 0xbe, 0xf6, 0xd1, 0x97, 0xbd, 0xf2, 0xc9, 0xea, 0x3d,
- 0x41, 0xd4, 0x9e, 0xbd, 0x39, 0x28, 0xe0, 0x3e, 0xc6, 0x58, 0x59, 0xbd,
- 0xd1, 0x42, 0x3b, 0x3e, 0x97, 0x93, 0x5a, 0x3e, 0xbf, 0xac, 0xd3, 0x3d,
- 0x2e, 0x4d, 0x6b, 0xbe, 0xd1, 0x41, 0x04, 0xbe, 0x3d, 0x4c, 0xff, 0xbb,
- 0x9f, 0xe6, 0x89, 0x3d, 0x2e, 0x1d, 0xbf, 0x3d, 0xe6, 0xca, 0xf6, 0x3e,
- 0x09, 0x2c, 0xad, 0x3c, 0x6d, 0x0a, 0xb2, 0xbc, 0xea, 0x93, 0x0a, 0xbe,
- 0x07, 0x70, 0x03, 0x3e, 0x46, 0xbc, 0x4d, 0x3e, 0x63, 0xc7, 0xdd, 0x3d,
- 0xf4, 0x8d, 0xfc, 0x3d, 0xa2, 0x36, 0x84, 0xbe, 0x38, 0x99, 0xa0, 0x3e,
- 0x9d, 0xc6, 0x12, 0xbe, 0x78, 0xb7, 0x39, 0xbd, 0x76, 0x7d, 0xf2, 0xbb,
- 0x2e, 0x4f, 0x7b, 0xbc, 0x65, 0x56, 0xb8, 0xbd, 0x6a, 0x7a, 0xf6, 0xbb,
- 0x1c, 0xe3, 0x1f, 0xbd, 0x5e, 0x54, 0x83, 0x3d, 0x05, 0xd1, 0x07, 0xbe,
- 0x6a, 0xbb, 0x0f, 0xbe, 0x31, 0x94, 0x17, 0xbd, 0xd5, 0x97, 0xbf, 0xbc,
- 0x53, 0xc4, 0x5b, 0xbe, 0x4d, 0x15, 0x0a, 0xbe, 0x37, 0x89, 0x3b, 0xbc,
- 0xd3, 0xb3, 0x19, 0x3d, 0xc0, 0xc4, 0xbb, 0xbd, 0x43, 0x6c, 0x2a, 0x3e,
- 0x7d, 0xec, 0x0f, 0xbd, 0xa4, 0x16, 0xdc, 0xbd, 0x73, 0x5e, 0x1e, 0x3d,
- 0x5a, 0x65, 0x3a, 0xbe, 0x44, 0x43, 0x25, 0xbe, 0x44, 0xbb, 0x5d, 0x3e,
- 0xb0, 0xdd, 0x4b, 0x3e, 0xf9, 0x67, 0xc4, 0x3e, 0x15, 0x53, 0xb4, 0xbd,
- 0x62, 0x2e, 0x32, 0xbe, 0x94, 0x84, 0x45, 0x3d, 0x04, 0xa1, 0xe9, 0xbd,
- 0x68, 0x08, 0x58, 0xbd, 0x5d, 0xef, 0xeb, 0x3d, 0xec, 0xdb, 0x8f, 0xbd,
- 0xff, 0xae, 0x16, 0x3c, 0xf3, 0xd4, 0x16, 0xbe, 0xef, 0x5c, 0xc9, 0xbd,
- 0x68, 0x2c, 0x59, 0x3d, 0x10, 0x1e, 0xe0, 0x3d, 0x2d, 0xdb, 0xe3, 0x3d,
- 0xee, 0x9e, 0xbf, 0x3d, 0x0c, 0xca, 0x71, 0x3c, 0xe6, 0x05, 0x6f, 0x3e,
- 0xe9, 0xa1, 0xf3, 0xbd, 0xd5, 0xb9, 0x1b, 0x3e, 0x48, 0x6f, 0x15, 0xbe,
- 0x33, 0xb8, 0x5f, 0x3e, 0x46, 0xfb, 0x49, 0x3d, 0x8f, 0xa0, 0xe1, 0x3e,
- 0xff, 0xbc, 0x99, 0xbe, 0x89, 0xbd, 0x84, 0xbb, 0x4e, 0x61, 0x4a, 0xbd,
- 0xcc, 0xd5, 0xb1, 0x3d, 0x53, 0x1e, 0x00, 0xbe, 0x56, 0xc7, 0x8e, 0x3e,
- 0x24, 0xf4, 0xb7, 0xbe, 0x2a, 0x6d, 0x44, 0x3e, 0x10, 0xd6, 0xcd, 0xbe,
- 0x2f, 0xc9, 0x0f, 0xbe, 0x2a, 0x60, 0xbc, 0xbc, 0xbf, 0x87, 0xe8, 0x3d,
- 0x81, 0xd7, 0x73, 0x3e, 0xa6, 0xc5, 0x52, 0x3d, 0xf3, 0xa5, 0x3d, 0x3e,
- 0xe6, 0x29, 0x43, 0xbd, 0x95, 0xa3, 0x1b, 0xbe, 0x1b, 0x34, 0x90, 0xbd,
- 0x1f, 0xdc, 0xb6, 0xbe, 0x6f, 0xf6, 0xb5, 0x3e, 0x54, 0xd7, 0x0c, 0xbf,
- 0x24, 0x92, 0xb8, 0xbe, 0x4a, 0x21, 0xa2, 0xbe, 0xc2, 0x6c, 0x41, 0x3d,
- 0xea, 0x4d, 0x63, 0xbe, 0x2d, 0x9a, 0x6d, 0xbe, 0xf7, 0xd8, 0xc0, 0x3d,
- 0xab, 0xa3, 0x11, 0xbe, 0x0f, 0xa4, 0x84, 0x3e, 0x89, 0x8a, 0x6c, 0xbe,
- 0x17, 0x2f, 0xd3, 0x3e, 0x67, 0xa3, 0xad, 0x3d, 0xc5, 0x0e, 0xcc, 0xbd,
- 0x5e, 0xb6, 0x82, 0xbd, 0x9b, 0x6e, 0xcb, 0x3d, 0x3a, 0x61, 0xbc, 0x3e,
- 0xac, 0x4b, 0x1f, 0x3d, 0x72, 0x6d, 0x1b, 0xbe, 0x8c, 0x55, 0x36, 0xbc,
- 0x29, 0x73, 0x6b, 0xbe, 0x23, 0xac, 0x06, 0xbe, 0x34, 0xb4, 0x3a, 0x3e,
- 0x5c, 0x1d, 0x7f, 0xbe, 0xa7, 0x14, 0x18, 0x3d, 0xcb, 0xa7, 0x26, 0xbb,
- 0x51, 0x77, 0x87, 0xbe, 0x2e, 0x1a, 0x7f, 0x3d, 0x37, 0x86, 0x91, 0x3d,
- 0xb7, 0x3c, 0x8c, 0xbe, 0x1d, 0x93, 0xf4, 0xbd, 0x0a, 0xda, 0x5d, 0x3e,
- 0x4a, 0xd4, 0x8e, 0x3e, 0x91, 0x80, 0x1a, 0xbd, 0xc1, 0xbc, 0x49, 0x3e,
- 0xe0, 0x5d, 0x7f, 0x3e, 0xd1, 0x8c, 0xea, 0xbd, 0x44, 0x7c, 0x88, 0x3d,
- 0x14, 0xfa, 0x60, 0x3e, 0xca, 0x8c, 0xb7, 0xbe, 0x77, 0xe2, 0xc0, 0xbc,
- 0x09, 0x1a, 0x38, 0x3e, 0xe3, 0xac, 0x11, 0xbe, 0x6c, 0xe9, 0x26, 0xbd,
- 0x25, 0xba, 0xa4, 0x3e, 0xba, 0x45, 0xad, 0xbe, 0x58, 0x19, 0x9d, 0x3e,
- 0xdd, 0x2c, 0xd0, 0xbd, 0x2d, 0x56, 0xff, 0xbd, 0x47, 0xe3, 0x83, 0x3e,
- 0x28, 0x4d, 0x2e, 0x3e, 0xce, 0x2d, 0xe5, 0xbd, 0x7c, 0x89, 0x34, 0xbe,
- 0x35, 0x4c, 0xe1, 0x3d, 0xf1, 0x63, 0x19, 0xbf, 0xb9, 0x68, 0x4c, 0x3e,
- 0x89, 0x1b, 0x62, 0x3d, 0xfc, 0x0f, 0x58, 0x3e, 0xf0, 0x3c, 0x99, 0xbe,
- 0xff, 0xce, 0x64, 0x3e, 0xdd, 0xa7, 0x86, 0x3e, 0x66, 0x9c, 0x30, 0x3e,
- 0xfa, 0xef, 0x9f, 0x3d, 0xf9, 0x02, 0x2e, 0xbd, 0x7e, 0x57, 0x8a, 0xbd,
- 0xf8, 0xde, 0x6d, 0x3c, 0x8e, 0x00, 0x4b, 0xbe, 0x06, 0xe2, 0x9d, 0xbe,
- 0x16, 0x44, 0xe3, 0xbd, 0x92, 0x8d, 0xfa, 0xbd, 0x7d, 0x64, 0x56, 0xbd,
- 0xd0, 0xe9, 0x4c, 0xbe, 0x52, 0xc1, 0x9c, 0xbd, 0x26, 0x64, 0x41, 0xbe,
- 0x56, 0x15, 0x86, 0x3d, 0x37, 0x84, 0x6a, 0x3e, 0xee, 0x8b, 0x7a, 0x3c,
- 0x00, 0x7e, 0x3e, 0x3d, 0x00, 0xfb, 0x37, 0x3d, 0xee, 0xd0, 0xde, 0x3d,
- 0xdd, 0xc6, 0xf3, 0xbb, 0x16, 0x4b, 0x35, 0x3e, 0x45, 0xb6, 0x7e, 0x3e,
- 0x30, 0xb0, 0x16, 0xbe, 0xae, 0x7b, 0xba, 0xbd, 0xff, 0xc8, 0x6d, 0x3e,
- 0xbe, 0xbc, 0x3f, 0xbd, 0xd6, 0x0a, 0x8d, 0x3d, 0xef, 0x5b, 0x58, 0x3d,
- 0xb7, 0x12, 0x08, 0xbe, 0xb3, 0x13, 0x76, 0x3d, 0x51, 0xd1, 0x49, 0xbd,
- 0xbf, 0x42, 0x66, 0xbe, 0xfc, 0x18, 0x87, 0xbc, 0x54, 0x1b, 0x3b, 0x3e,
- 0x38, 0x07, 0x6d, 0xbc, 0xee, 0xa0, 0xd0, 0x3d, 0x87, 0xc1, 0x99, 0x3c,
- 0x6a, 0xc0, 0xaa, 0xbd, 0x26, 0xdc, 0x35, 0x3e, 0xc5, 0x63, 0x3b, 0xbe,
- 0x70, 0xcf, 0xc1, 0xbd, 0xb7, 0x8f, 0x23, 0x3d, 0x72, 0x72, 0x05, 0x3d,
- 0x28, 0x59, 0xe9, 0x3d, 0x9a, 0x13, 0xac, 0x3d, 0x50, 0x9a, 0xfe, 0xbd,
- 0x64, 0xf7, 0x04, 0x3e, 0xff, 0xf3, 0xce, 0xbd, 0x7a, 0x34, 0x15, 0xbe,
- 0x0e, 0xd4, 0x37, 0x3e, 0xba, 0x63, 0xf3, 0x3d, 0x43, 0x01, 0x56, 0xbe,
- 0xa9, 0x91, 0x87, 0x3d, 0x86, 0xa5, 0x19, 0x3e, 0x2f, 0xd7, 0x08, 0xbd,
- 0x09, 0x67, 0x94, 0x3d, 0x59, 0xe8, 0xd4, 0xbd, 0xe4, 0xa5, 0x4f, 0xbd,
- 0xae, 0x41, 0x84, 0x3d, 0xdd, 0x72, 0x25, 0x3d, 0x33, 0x29, 0x70, 0x3d,
- 0x07, 0x59, 0xc4, 0xbd, 0x1f, 0xdd, 0xe9, 0x3d, 0x20, 0x7a, 0x78, 0x3e,
- 0xa7, 0xad, 0x77, 0xbe, 0x82, 0x6b, 0x0f, 0xbe, 0xfe, 0x87, 0x76, 0xbd,
- 0xaa, 0x42, 0x29, 0x3e, 0x9a, 0xdc, 0x0f, 0x3c, 0x64, 0x44, 0x44, 0x3e,
- 0x99, 0xdc, 0x71, 0x3a, 0x30, 0x25, 0x1d, 0xbe, 0xbb, 0x18, 0x55, 0xbe,
- 0x75, 0xe3, 0x8c, 0x3d, 0x10, 0x72, 0x0c, 0xbe, 0xe3, 0xaa, 0xa9, 0x3d,
- 0xfe, 0xfa, 0x74, 0xbd, 0xc7, 0x76, 0xf6, 0xbd, 0xfe, 0xe4, 0x95, 0x3d,
- 0xdd, 0x55, 0x12, 0x3e, 0x24, 0x95, 0x75, 0x3e, 0x77, 0xb2, 0xdf, 0xbd,
- 0xf6, 0xde, 0x2b, 0xbd, 0x78, 0x4e, 0x42, 0xbe, 0xd8, 0xbf, 0x46, 0x3e,
- 0xdf, 0xcb, 0x31, 0xbe, 0x02, 0x6b, 0x69, 0xbd, 0xb3, 0xc2, 0x65, 0x3d,
- 0x5d, 0x85, 0x11, 0xbb, 0x02, 0xb9, 0x94, 0xbd, 0xfb, 0x9b, 0x85, 0x3d,
- 0xd7, 0x56, 0x90, 0x3d, 0x9f, 0xa1, 0xdf, 0xbd, 0x96, 0xbe, 0xeb, 0x3d,
- 0xf0, 0xfa, 0x6d, 0xbd, 0x14, 0x4b, 0x74, 0xbd, 0x68, 0x31, 0x3b, 0xbe,
- 0x3d, 0x55, 0x97, 0x3e, 0x17, 0x69, 0xfa, 0x3d, 0x62, 0x29, 0x48, 0xbe,
- 0x48, 0x03, 0x09, 0xbe, 0xef, 0x58, 0x5e, 0x3e, 0xc9, 0xbc, 0xb1, 0xbb,
- 0x5b, 0x7b, 0x83, 0x3d, 0xb7, 0x82, 0x0d, 0x3e, 0x1f, 0x69, 0xb6, 0x3d,
- 0x9e, 0x8a, 0x13, 0xbe, 0xeb, 0x31, 0xf9, 0xbd, 0x92, 0x7f, 0x0e, 0xbe,
- 0x1c, 0xf4, 0xeb, 0xbd, 0xc9, 0x54, 0x4a, 0x3c, 0xe6, 0x98, 0x5f, 0xbe,
- 0xac, 0xaf, 0x09, 0x3e, 0xd2, 0x8c, 0x17, 0x3c, 0xa2, 0x8a, 0xc9, 0xbb,
- 0xe1, 0x2b, 0x75, 0xbb, 0xa5, 0xb8, 0x6b, 0x3d, 0xc8, 0x4d, 0x4d, 0xbc,
- 0xf6, 0xc6, 0x39, 0x3d, 0x67, 0x56, 0xa2, 0x3d, 0xce, 0xc8, 0xaf, 0xbd,
- 0xf1, 0xeb, 0xac, 0xbd, 0x86, 0x73, 0xfd, 0xbd, 0x63, 0x89, 0xa6, 0x3d,
- 0x03, 0x35, 0x68, 0xbe, 0x35, 0x86, 0x2e, 0x3d, 0x3f, 0x8a, 0x50, 0x3d,
- 0xe7, 0x6e, 0xcb, 0x3d, 0xc2, 0x9e, 0xf2, 0xbd, 0x29, 0x8c, 0xfa, 0xbd,
- 0x19, 0x9c, 0xbe, 0x3c, 0xd2, 0xe1, 0xe5, 0x3d, 0x73, 0xad, 0x00, 0x3d,
- 0xba, 0xc6, 0xe7, 0xbc, 0x87, 0x5a, 0x15, 0x3d, 0xe3, 0xd2, 0x2b, 0x3e,
- 0x6d, 0x0a, 0x3c, 0x3e, 0xde, 0xb4, 0x15, 0x3e, 0x7f, 0xd1, 0x17, 0xbe,
- 0x9f, 0x0f, 0x73, 0xbe, 0x88, 0x3b, 0x90, 0xbd, 0x08, 0x42, 0x84, 0x3d,
- 0xf4, 0x54, 0x4a, 0x3d, 0x0c, 0xa0, 0x3e, 0x3e, 0x1b, 0x4c, 0xaf, 0xbd,
- 0xfa, 0x07, 0x21, 0xbe, 0xf3, 0xb3, 0x95, 0xbd, 0xe3, 0x55, 0xb5, 0x3d,
- 0x74, 0xbf, 0x65, 0x3d, 0xde, 0xc5, 0x79, 0xbc, 0xf4, 0xc0, 0xd2, 0x3d,
- 0xa6, 0xcd, 0x8d, 0x3a, 0x91, 0xb9, 0xab, 0x39, 0x17, 0x5c, 0xd1, 0xbd,
- 0x12, 0xae, 0x2b, 0x3d, 0x16, 0xda, 0x6c, 0xbd, 0xb2, 0xec, 0x92, 0xbe,
- 0x13, 0x86, 0x30, 0xbd, 0xd1, 0x64, 0x2f, 0xbb, 0x5d, 0xef, 0x0c, 0x3e,
- 0x0b, 0xd1, 0x71, 0xbd, 0x45, 0xde, 0x35, 0x3c, 0x06, 0xcb, 0x75, 0x3c,
- 0x2f, 0xe3, 0xb5, 0x3d, 0xcb, 0xf2, 0xf6, 0x3c, 0x9d, 0x8a, 0xae, 0x3d,
- 0xd9, 0xef, 0xfd, 0x3d, 0xfc, 0xff, 0x83, 0xbd, 0xb0, 0x2f, 0x12, 0x3e,
- 0xfa, 0xe8, 0x98, 0x3d, 0x28, 0x28, 0x07, 0x3e, 0xb6, 0x04, 0x0e, 0xbf,
- 0x98, 0x18, 0x42, 0x3e, 0x8e, 0x7c, 0x2e, 0x3e, 0x72, 0x63, 0x87, 0xbd,
- 0x26, 0x3e, 0xb0, 0xbc, 0xde, 0x87, 0x74, 0x3b, 0x00, 0x0c, 0xdb, 0x3d,
- 0xd7, 0x9f, 0x6c, 0xbe, 0x55, 0x8e, 0xbb, 0x3e, 0x7a, 0x62, 0x38, 0x3d,
- 0x8c, 0x86, 0xa3, 0xbe, 0x65, 0x73, 0xd8, 0xbd, 0x26, 0x48, 0x72, 0x3d,
- 0x47, 0x5a, 0xea, 0xbd, 0x32, 0x14, 0x4e, 0x3e, 0x89, 0xdb, 0xd6, 0x3d,
- 0xd4, 0xde, 0x93, 0x3d, 0xc7, 0x51, 0x49, 0x3e, 0x97, 0x34, 0x59, 0x3c,
- 0x27, 0x46, 0x78, 0x3e, 0xeb, 0x8b, 0x65, 0x3e, 0xfb, 0xea, 0xed, 0xbe,
- 0xf8, 0xa2, 0xba, 0xbe, 0xa7, 0x01, 0x08, 0x3d, 0xf5, 0x67, 0x7f, 0xbe,
- 0x6d, 0xb3, 0x84, 0xbe, 0x04, 0x82, 0x42, 0x3e, 0xbf, 0xfe, 0x80, 0xbc,
- 0x4a, 0xe2, 0x5a, 0x3c, 0x7a, 0x7f, 0x41, 0xbe, 0xa3, 0x7c, 0x2d, 0x3e,
- 0x34, 0x45, 0x3c, 0x3a, 0xce, 0x15, 0xbd, 0x3d, 0x77, 0xcd, 0x56, 0x3d,
- 0xe3, 0xff, 0xa5, 0xbe, 0x92, 0x21, 0x15, 0x3d, 0x10, 0xfa, 0x47, 0xbd,
- 0x84, 0xcd, 0x9a, 0x3d, 0x57, 0xe7, 0xdc, 0x3e, 0x59, 0x22, 0x11, 0xbe,
- 0xf4, 0x38, 0x0c, 0xbe, 0x7c, 0x93, 0x97, 0xbe, 0x92, 0xd8, 0x88, 0xbc,
- 0x2a, 0x75, 0x22, 0xbe, 0x60, 0x67, 0xa7, 0xbd, 0x35, 0x1b, 0xf3, 0x3e,
- 0x35, 0xb7, 0xff, 0xbc, 0xc4, 0xad, 0x17, 0xbe, 0x54, 0x0a, 0x30, 0x3e,
- 0x76, 0xcd, 0x06, 0xbe, 0xea, 0x72, 0x6d, 0xbb, 0xa6, 0x35, 0x38, 0x3e,
- 0x26, 0xb3, 0x33, 0x3e, 0x77, 0x5a, 0xee, 0xbd, 0x49, 0xab, 0x92, 0x3e,
- 0xf7, 0x0d, 0x06, 0xbe, 0xf9, 0xa1, 0x84, 0xbe, 0x3c, 0x5d, 0x8e, 0x3d,
- 0x40, 0x77, 0x41, 0xbe, 0x07, 0xc8, 0x77, 0xbe, 0x3b, 0x71, 0xb8, 0x3d,
- 0x5a, 0x7a, 0x1e, 0x3e, 0xd5, 0x59, 0x35, 0xbe, 0xf6, 0xd8, 0x08, 0xbe,
- 0xc1, 0xe7, 0x35, 0xbd, 0x3e, 0x84, 0x02, 0x3e, 0x2f, 0x15, 0x9a, 0xbe,
- 0x6d, 0xda, 0x6e, 0x3d, 0xb0, 0x9c, 0x58, 0xbe, 0xda, 0x8c, 0x37, 0xbc,
- 0xfb, 0x4f, 0xcd, 0xbd, 0x39, 0xb3, 0xcd, 0x3e, 0x47, 0x6d, 0x1e, 0x3d,
- 0x68, 0x21, 0xdd, 0xbd, 0xdd, 0x71, 0x01, 0xbe, 0xb9, 0x6e, 0xde, 0xbb,
- 0x69, 0x75, 0x7d, 0x3d, 0xe3, 0xa7, 0x44, 0x3c, 0x0d, 0xfc, 0xc1, 0xbc,
- 0xe4, 0x38, 0xec, 0xbe, 0x89, 0x56, 0xf2, 0x3c, 0xab, 0xdb, 0xb5, 0xbd,
- 0x39, 0x43, 0x87, 0xbe, 0x56, 0xf5, 0xb6, 0x3d, 0x74, 0xc1, 0x7b, 0xbe,
- 0x66, 0xd4, 0x2b, 0x3e, 0xcf, 0x59, 0x21, 0xbd, 0x25, 0x2c, 0x89, 0xbe,
- 0xc4, 0xa7, 0x89, 0x3e, 0xcf, 0x2c, 0x22, 0x3d, 0x5f, 0x41, 0xe8, 0xbd,
- 0xbb, 0xb6, 0x87, 0xbe, 0xd9, 0xe5, 0xd7, 0xbc, 0xc0, 0x91, 0xa8, 0x3e,
- 0xf6, 0xc5, 0x59, 0x3c, 0xf5, 0x3e, 0x21, 0x3e, 0xc8, 0x33, 0x15, 0xbe,
- 0x41, 0x8d, 0x74, 0xbd, 0x37, 0x0a, 0x1b, 0xbd, 0xaf, 0x6d, 0x54, 0xbd,
- 0xbc, 0x6e, 0xa1, 0x3d, 0xfd, 0x63, 0x08, 0xbe, 0xfa, 0x95, 0xe3, 0xbd,
- 0xeb, 0xa2, 0x0c, 0x3d, 0x7f, 0xba, 0x13, 0xbe, 0x1c, 0xb6, 0x9c, 0x3c,
- 0x7d, 0xaa, 0xd3, 0xbc, 0x23, 0x7f, 0xbf, 0x3e, 0x4e, 0x07, 0x39, 0xbe,
- 0x04, 0x9b, 0xe9, 0xbd, 0xb6, 0xac, 0x61, 0xbe, 0x45, 0xba, 0x84, 0x3e,
- 0x36, 0x33, 0x01, 0xbe, 0x92, 0xbc, 0x1e, 0x3e, 0xc9, 0x91, 0xd7, 0x3d,
- 0xfc, 0x3e, 0x14, 0x3e, 0x78, 0x5f, 0x4a, 0x3e, 0x20, 0x56, 0x0e, 0x3e,
- 0xfa, 0x30, 0xe5, 0x3e, 0xda, 0xd5, 0xbd, 0xbd, 0x57, 0xda, 0x5f, 0x3e,
- 0x3d, 0x5b, 0xc3, 0x3d, 0xcb, 0xa9, 0x98, 0x3d, 0x7a, 0x58, 0xa9, 0xbe,
- 0x04, 0xe4, 0x52, 0x3d, 0xb3, 0xf6, 0x98, 0xbe, 0x05, 0xd7, 0x61, 0x3d,
- 0x4e, 0x4d, 0xad, 0xbd, 0x3a, 0x6b, 0x8a, 0xbd, 0x41, 0x7f, 0x8b, 0x3e,
- 0xa7, 0xb4, 0xa0, 0x3e, 0x4e, 0x46, 0xa3, 0xbd, 0x63, 0x55, 0xff, 0x3c,
- 0xeb, 0xe3, 0x22, 0xbe, 0x3b, 0x7b, 0x4f, 0x3d, 0x13, 0xc1, 0x11, 0xbe,
- 0x65, 0xe4, 0xe3, 0xbd, 0xdf, 0x37, 0x94, 0x3e, 0xcd, 0x2c, 0x79, 0x3d,
- 0x8e, 0x92, 0x05, 0x3e, 0x02, 0xf3, 0x0d, 0x3e, 0x83, 0x1d, 0x6a, 0xbe,
- 0x51, 0x32, 0xa4, 0x3c, 0x93, 0x33, 0x3d, 0x3e, 0xe8, 0xfe, 0x0e, 0xbf,
- 0xb9, 0x1b, 0x67, 0x3e, 0x06, 0x5f, 0xe4, 0xbd, 0x27, 0xbe, 0xa9, 0xbe,
- 0xf2, 0x13, 0xc0, 0x3d, 0xff, 0x0c, 0x8c, 0xbe, 0x38, 0x8e, 0x08, 0xbe,
- 0xa4, 0x84, 0x2e, 0x3e, 0xc5, 0xe6, 0xac, 0x3d, 0x71, 0x27, 0x02, 0x3e,
- 0xe6, 0x17, 0x2e, 0x3e, 0xf7, 0xed, 0x08, 0x3e, 0xe7, 0x6e, 0x15, 0x3e,
- 0x33, 0x56, 0x0a, 0x3e, 0xe7, 0x80, 0x42, 0x3e, 0x71, 0x10, 0xf3, 0x3d,
- 0x71, 0x33, 0x1f, 0xbc, 0x1a, 0x45, 0x82, 0xbe, 0x04, 0xcb, 0xa2, 0xbd,
- 0xc2, 0x44, 0x9c, 0x3c, 0x0b, 0xaa, 0x91, 0xbd, 0x9d, 0x43, 0x35, 0x3e,
- 0xdd, 0x13, 0x35, 0x3e, 0x57, 0x74, 0xd0, 0x3d, 0x74, 0x47, 0xd9, 0xbd,
- 0xe4, 0x64, 0xf0, 0xbc, 0x2f, 0x60, 0x1b, 0xbe, 0x6f, 0x89, 0xea, 0xbd,
- 0x4b, 0x1f, 0xf7, 0xbc, 0x40, 0x45, 0x33, 0x3e, 0xfc, 0x39, 0xa3, 0x3d,
- 0x70, 0x5f, 0x71, 0xbe, 0x0e, 0x72, 0xb1, 0xbc, 0xda, 0xcf, 0x7a, 0x3e,
- 0xa4, 0x5b, 0xaf, 0x3e, 0x0b, 0x62, 0xb3, 0x3e, 0x2e, 0xc4, 0x99, 0x3d,
- 0x1d, 0x19, 0x94, 0x3e, 0xce, 0xe5, 0x31, 0x3d, 0x68, 0x5f, 0xd7, 0x3e,
- 0xed, 0x03, 0x98, 0xbd, 0xd4, 0x3e, 0x3a, 0xbe, 0x66, 0xb4, 0xd7, 0x3e,
- 0xb4, 0xba, 0x59, 0x3e, 0x99, 0x95, 0xd6, 0x3d, 0x2d, 0x87, 0x4e, 0xbe,
- 0x08, 0x79, 0x09, 0x3d, 0x26, 0x80, 0xa2, 0xbc, 0x54, 0xf1, 0xbd, 0x39,
- 0xc7, 0x88, 0x01, 0xbe, 0x9a, 0xd0, 0x33, 0xbe, 0x06, 0x98, 0x67, 0x3e,
- 0x6e, 0xfe, 0x2a, 0x3e, 0x2f, 0x60, 0x3d, 0x3e, 0x6a, 0x47, 0x25, 0x3d,
- 0xc7, 0xd1, 0x24, 0xbe, 0x2f, 0xc2, 0x7c, 0x3e, 0xf2, 0x26, 0xf7, 0xbd,
- 0x82, 0x41, 0xb2, 0xbe, 0x8a, 0x2e, 0x95, 0xbd, 0x1b, 0x36, 0xc1, 0xbe,
- 0x00, 0xe7, 0x81, 0x3e, 0x2d, 0xa8, 0xb8, 0xbd, 0xd1, 0x63, 0xfe, 0x3d,
- 0xbe, 0x31, 0x90, 0xbd, 0x08, 0x09, 0x2c, 0xbe, 0x6a, 0xd6, 0xb0, 0x3e,
- 0x46, 0x47, 0xcf, 0x3c, 0xae, 0x00, 0x42, 0xbe, 0xd4, 0xd5, 0x9d, 0x3d,
- 0xb8, 0xba, 0x7d, 0x3e, 0x75, 0xfe, 0xf7, 0x3d, 0x73, 0x85, 0x57, 0x3e,
- 0x81, 0x60, 0x4f, 0xbe, 0x03, 0xb1, 0x98, 0xbe, 0x48, 0x4a, 0x59, 0x3e,
- 0x2e, 0xe7, 0x55, 0x3c, 0xe5, 0x12, 0x4c, 0xbe, 0x2a, 0x93, 0x02, 0xbd,
- 0x57, 0x11, 0x28, 0xbe, 0x6c, 0x18, 0x84, 0xbd, 0x55, 0xee, 0x0f, 0x3e,
- 0x60, 0x13, 0x4a, 0x3e, 0x29, 0x61, 0x70, 0xbd, 0x4b, 0x89, 0x78, 0xbe,
- 0xfa, 0x30, 0x35, 0x3e, 0xe1, 0xc4, 0xde, 0x3e, 0xe7, 0x88, 0xbb, 0x3e,
- 0x1d, 0x71, 0x10, 0x3e, 0x34, 0x24, 0xb5, 0xbd, 0xbe, 0x99, 0xc8, 0x3d,
- 0xff, 0x0c, 0xf0, 0xbd, 0xc1, 0x11, 0x67, 0xbe, 0x78, 0xf4, 0x6d, 0xbd,
- 0xfd, 0x9e, 0x7a, 0xbc, 0x45, 0x01, 0xc3, 0xbd, 0x36, 0xbc, 0x0a, 0xbe,
- 0x8c, 0xf2, 0xfb, 0x3c, 0x7d, 0xec, 0x92, 0x3b, 0x35, 0xee, 0xbf, 0x3d,
- 0x8e, 0x4a, 0xac, 0xba, 0x66, 0x68, 0x0b, 0xbe, 0x72, 0x01, 0x0f, 0x3e,
- 0x56, 0xcf, 0x8d, 0xbd, 0x2b, 0x93, 0x10, 0x3e, 0x97, 0x53, 0xd2, 0x3a,
- 0x64, 0xc7, 0x4f, 0x3d, 0x05, 0x4a, 0xd8, 0x3d, 0x36, 0x40, 0xf6, 0xbd,
- 0xd2, 0xc7, 0xa8, 0xbd, 0x8b, 0xcb, 0x09, 0x3e, 0x47, 0xc8, 0x76, 0x3d,
- 0xea, 0x79, 0xc3, 0xbd, 0x97, 0xd9, 0xcf, 0xbb, 0x25, 0x3b, 0xb8, 0xbd,
- 0xd2, 0xc2, 0x07, 0xbe, 0x69, 0x85, 0x37, 0xbd, 0x97, 0xa8, 0x8c, 0xbc,
- 0x04, 0x22, 0xfc, 0x3d, 0x3f, 0x45, 0x1e, 0x3e, 0xff, 0xe2, 0xe5, 0x3c,
- 0x60, 0x2f, 0xe9, 0x3d, 0x8f, 0x2e, 0xff, 0x3c, 0x11, 0x73, 0x8c, 0xbd,
- 0x71, 0x12, 0xad, 0xbd, 0xdd, 0x77, 0xf9, 0xbd, 0x18, 0x3f, 0x44, 0x3d,
- 0x9c, 0x73, 0xa7, 0x3d, 0x76, 0xa4, 0x88, 0x3d, 0x65, 0x11, 0xd4, 0xbd,
- 0x99, 0xa9, 0xd1, 0xbd, 0xa4, 0xa3, 0xe9, 0x3d, 0x4d, 0xcf, 0x2a, 0xbd,
- 0x50, 0x7e, 0x1c, 0xbe, 0xec, 0x82, 0x12, 0x3e, 0x42, 0xe8, 0x22, 0x3e,
- 0xf9, 0x70, 0xab, 0x3c, 0x5a, 0xa8, 0xb1, 0x3c, 0x48, 0x69, 0x6a, 0xbd,
- 0x29, 0x17, 0xce, 0xbc, 0x40, 0x07, 0xd7, 0x3d, 0x7b, 0xe4, 0x49, 0xbe,
- 0x6a, 0x13, 0x01, 0x3e, 0xf0, 0x9d, 0x11, 0xbe, 0xe8, 0x13, 0x81, 0x39,
- 0x23, 0x27, 0x2d, 0x3d, 0xf7, 0xeb, 0xf8, 0x3d, 0x48, 0x41, 0x86, 0x3d,
- 0x29, 0x63, 0x22, 0xbb, 0x29, 0xbc, 0xa8, 0xbc, 0x9e, 0x89, 0x55, 0xbe,
- 0x84, 0x93, 0x4f, 0x3d, 0xa3, 0x85, 0xd8, 0x3d, 0x69, 0x0e, 0xfb, 0x3c,
- 0xcc, 0x3a, 0x11, 0x3e, 0x39, 0xe5, 0xe5, 0x3d, 0xd1, 0x53, 0x37, 0x3d,
- 0xea, 0x80, 0x0f, 0x3e, 0x9f, 0x88, 0x40, 0xbe, 0x38, 0x8c, 0x1b, 0xbe,
- 0xfc, 0xbb, 0x8d, 0x3d, 0xe8, 0x5f, 0x68, 0xbd, 0xe8, 0x86, 0xbf, 0x3d,
- 0x2e, 0x3d, 0x1a, 0x3e, 0x03, 0x28, 0x1d, 0x3d, 0xd5, 0x5e, 0xe6, 0x3d,
- 0x96, 0x99, 0x43, 0x3d, 0x6c, 0x4d, 0x10, 0x3e, 0x27, 0x01, 0x3b, 0x3d,
- 0x69, 0xb5, 0xda, 0xbc, 0xfc, 0x29, 0xce, 0xbd, 0x2a, 0x16, 0xb4, 0x3d,
- 0xc6, 0x47, 0x18, 0xbe, 0x1b, 0x63, 0x28, 0x3d, 0x16, 0xdb, 0xae, 0xbd,
- 0xcc, 0x83, 0x05, 0x3e, 0xa3, 0xc5, 0x72, 0x3d, 0x5d, 0xfe, 0x88, 0x3d,
- 0x4b, 0xa9, 0x05, 0xbd, 0x76, 0x5c, 0x6d, 0xbd, 0xf2, 0x91, 0x24, 0xbe,
- 0x75, 0x38, 0x06, 0x3e, 0x76, 0xe4, 0xf8, 0xbd, 0xeb, 0x3c, 0x05, 0xbe,
- 0x0b, 0x59, 0xe8, 0xbd, 0xdb, 0xcb, 0xe0, 0x3c, 0x4c, 0x5d, 0x67, 0x3c,
- 0xba, 0x33, 0xab, 0x3d, 0x6c, 0x15, 0x6c, 0x3b, 0xd8, 0x38, 0xb5, 0x3c,
- 0x96, 0xb1, 0x20, 0xbd, 0xb9, 0xfd, 0x01, 0xbd, 0x4a, 0xd4, 0xa3, 0x3d,
- 0xd8, 0x47, 0x07, 0xbe, 0xfa, 0x2d, 0x17, 0xbd, 0x6c, 0x04, 0xcb, 0x3d,
- 0x92, 0x84, 0xe4, 0x3d, 0x83, 0xad, 0x1b, 0xbd, 0x41, 0xb4, 0xf8, 0x3d,
- 0x19, 0xd6, 0xf7, 0x3d, 0xe5, 0x79, 0xcc, 0xbd, 0xb9, 0xbc, 0x79, 0x3b,
- 0xad, 0xc2, 0xf4, 0x3d, 0x83, 0x54, 0xb6, 0x3c, 0x03, 0xfa, 0xf8, 0x3d,
- 0x57, 0x4d, 0x10, 0x3e, 0xff, 0x3c, 0x25, 0x3e, 0xed, 0xde, 0x6d, 0xbd,
- 0x05, 0xeb, 0x83, 0x3d, 0x0e, 0x33, 0x58, 0x3e, 0x2b, 0x89, 0x07, 0xbd,
- 0xd4, 0xe5, 0x08, 0x3e, 0x66, 0x48, 0x81, 0xbe, 0xdb, 0xa2, 0x20, 0xbe,
- 0xe6, 0xd6, 0xd5, 0xbd, 0x0d, 0x63, 0x48, 0x3e, 0xa4, 0xaa, 0x5e, 0xbb,
- 0x70, 0x1e, 0x94, 0x3e, 0xda, 0xcd, 0x3f, 0xbe, 0x02, 0x9a, 0x48, 0x3e,
- 0x5e, 0x05, 0x19, 0x3e, 0x61, 0x70, 0x92, 0x3e, 0xde, 0x28, 0xa6, 0x3e,
- 0xb1, 0xb1, 0xcf, 0xbc, 0x60, 0x16, 0x80, 0xbd, 0x89, 0x02, 0xaf, 0xbb,
- 0xac, 0x94, 0x5a, 0x3d, 0x83, 0x57, 0x4d, 0xbe, 0xaa, 0xfd, 0x2d, 0xbe,
- 0x07, 0xb9, 0xcd, 0xbd, 0xd2, 0x67, 0x40, 0xbe, 0x8d, 0x0d, 0xbf, 0x3e,
- 0x25, 0xc5, 0x7c, 0x3e, 0x84, 0xa9, 0x25, 0x3e, 0xb4, 0xab, 0x64, 0x3e,
- 0xce, 0x3b, 0xd5, 0x3d, 0x28, 0xa0, 0xb3, 0xbd, 0x99, 0x8f, 0x07, 0x3e,
- 0x4d, 0x85, 0x1a, 0xbe, 0xe7, 0x53, 0x2c, 0x3e, 0x93, 0x98, 0x55, 0xbd,
- 0x34, 0xb8, 0x3e, 0xbd, 0xed, 0x8b, 0xa7, 0xbd, 0x69, 0x3b, 0x21, 0x3d,
- 0xf2, 0x4f, 0x72, 0xbd, 0x2a, 0xc9, 0xeb, 0xbd, 0xf9, 0x7d, 0x36, 0xbe,
- 0x3c, 0x63, 0x26, 0x3e, 0xbb, 0xab, 0x35, 0xbe, 0x73, 0x16, 0xfa, 0x3d,
- 0x0c, 0xe1, 0x65, 0x3e, 0x8d, 0xb9, 0x83, 0xbd, 0x74, 0xee, 0x99, 0x3c,
- 0xa0, 0x06, 0xcb, 0xbd, 0x19, 0x81, 0x02, 0xbe, 0x2c, 0x7f, 0xf5, 0xbd,
- 0x98, 0x79, 0x4b, 0xbd, 0xfd, 0xe9, 0x5e, 0xbc, 0x6c, 0x80, 0x27, 0xbd,
- 0x9d, 0x52, 0x34, 0x3d, 0xec, 0x6e, 0x08, 0x3d, 0xd5, 0xc8, 0x27, 0x3e,
- 0x75, 0x95, 0xe1, 0xbd, 0xb6, 0xbd, 0x18, 0xbe, 0xba, 0x2b, 0x18, 0x3d,
- 0x02, 0x05, 0x58, 0xbd, 0x7a, 0x98, 0x17, 0x3e, 0xad, 0x01, 0x5a, 0x3e,
- 0xfc, 0x49, 0x9d, 0x3d, 0x66, 0xb6, 0x00, 0x3e, 0x9e, 0x15, 0xe8, 0x3d,
- 0x7f, 0x5f, 0xbc, 0xbb, 0x74, 0x1e, 0x4a, 0xbd, 0xb1, 0x52, 0xc6, 0xbd,
- 0x43, 0xd0, 0x95, 0x3e, 0xf7, 0xf8, 0x8e, 0x3e, 0x51, 0x87, 0x26, 0xbe,
- 0xd1, 0x73, 0x3b, 0xbe, 0x2d, 0x05, 0x0c, 0x3e, 0xff, 0x5b, 0xc6, 0xbc,
- 0x38, 0x3e, 0x85, 0x3e, 0xed, 0x67, 0x0e, 0x3c, 0x40, 0x3b, 0xbf, 0x3d,
- 0x46, 0xd7, 0xa4, 0x3d, 0x40, 0x47, 0x27, 0x3e, 0x11, 0x28, 0x18, 0x3e,
- 0xaa, 0x4b, 0x44, 0xbc, 0xde, 0x83, 0x17, 0x3d, 0x5b, 0xd9, 0xa9, 0x3d,
- 0x8f, 0xcb, 0x83, 0x3c, 0x10, 0xb3, 0xb8, 0xb9, 0x96, 0xeb, 0x32, 0x3e,
- 0x11, 0xf9, 0x28, 0xbe, 0xef, 0xdb, 0x03, 0xbd, 0xd6, 0xe3, 0xbd, 0x3d,
- 0xd6, 0xda, 0x1c, 0xbd, 0x4c, 0x4a, 0x6c, 0x3d, 0x1f, 0x96, 0xc4, 0x3c,
- 0x31, 0x23, 0xc8, 0xbb, 0x8b, 0xb7, 0x25, 0x3e, 0x52, 0x1d, 0xe7, 0x3d,
- 0x63, 0x7f, 0x7f, 0x3e, 0xf7, 0x48, 0x29, 0xbd, 0x83, 0xb5, 0x0e, 0xbd,
- 0xdb, 0x6a, 0x90, 0x3d, 0x42, 0xa4, 0x89, 0x3d, 0x87, 0xec, 0xda, 0xbd,
- 0xf0, 0xb1, 0x45, 0x3e, 0x5d, 0xc7, 0x2e, 0xbe, 0x31, 0x4c, 0xab, 0xbd,
- 0xb0, 0xbb, 0x20, 0x3b, 0xa7, 0xe4, 0x94, 0x3d, 0xf4, 0xa9, 0x4d, 0x3e,
- 0xaa, 0x9a, 0xcf, 0x3e, 0xb1, 0xf4, 0x26, 0x3c, 0x04, 0x05, 0xc7, 0x3d,
- 0x6a, 0xb9, 0x3e, 0x3e, 0xf7, 0x8c, 0x3f, 0x3d, 0xba, 0xea, 0x93, 0xbe,
- 0x5c, 0x27, 0xcc, 0xbb, 0x1e, 0x82, 0x79, 0x3d, 0x5b, 0xd0, 0xe5, 0xbb,
- 0x63, 0x7c, 0xed, 0xba, 0x0a, 0x13, 0x36, 0xbe, 0x8a, 0xbe, 0x77, 0xbd,
- 0x4a, 0x3a, 0x81, 0x3d, 0xb0, 0xcf, 0x29, 0xbe, 0xd7, 0x83, 0x15, 0x3e,
- 0x0e, 0x97, 0x7c, 0x3d, 0xf4, 0xf9, 0xeb, 0xbd, 0xf5, 0xf1, 0x6a, 0x3d,
- 0x5c, 0x09, 0x01, 0xbe, 0x0d, 0xf8, 0xf7, 0x3d, 0x68, 0x31, 0x01, 0x3d,
- 0x8c, 0x18, 0xb0, 0x3d, 0x2c, 0xbf, 0x28, 0xbe, 0x23, 0x98, 0x38, 0x3e,
- 0xe0, 0x4f, 0xe7, 0x3d, 0xf3, 0xdc, 0x2e, 0xbe, 0x82, 0xf9, 0x14, 0xbc,
- 0x4b, 0xf7, 0x27, 0xbe, 0xf7, 0xe9, 0x6c, 0x3d, 0xf0, 0xd9, 0x19, 0xbe,
- 0x73, 0x82, 0xbe, 0xbd, 0x07, 0xf8, 0x2a, 0xbd, 0x63, 0xcc, 0x62, 0x3d,
- 0x1a, 0x93, 0xc3, 0x3d, 0xce, 0xa6, 0xd2, 0xbb, 0x6e, 0x71, 0x0d, 0x3e,
- 0x98, 0x75, 0xbb, 0xbe, 0xb5, 0xde, 0xcf, 0xbd, 0xa1, 0xd6, 0x3c, 0xbe,
- 0x06, 0xa5, 0x0c, 0xbd, 0x76, 0xd7, 0xeb, 0x3d, 0x48, 0xea, 0x34, 0x3e,
- 0x35, 0x0d, 0x63, 0x3c, 0x2a, 0x03, 0x7b, 0xbe, 0xc3, 0x76, 0xf1, 0x3c,
- 0x24, 0xe1, 0xdf, 0xbd, 0x7e, 0xfe, 0x19, 0xbd, 0xcd, 0xbd, 0x6b, 0x3c,
- 0xd3, 0x74, 0x1d, 0xbe, 0xfb, 0x4d, 0x93, 0x3e, 0x0c, 0xc5, 0xa4, 0xb7,
- 0x93, 0x7e, 0x78, 0x3d, 0x4d, 0x63, 0x63, 0xbe, 0x9e, 0xb1, 0x11, 0xbe,
- 0x89, 0x48, 0x28, 0x3e, 0xe2, 0xc9, 0x47, 0xbe, 0x4e, 0x48, 0x9c, 0xbc,
- 0xb8, 0x96, 0xc0, 0xbd, 0x5c, 0x08, 0x4d, 0xbd, 0x74, 0x7b, 0x7b, 0xbc,
- 0x01, 0xb1, 0x4f, 0xbc, 0xac, 0x5b, 0x96, 0x3d, 0xe7, 0x92, 0x4f, 0x3e,
- 0x92, 0x39, 0x33, 0xbe, 0xcb, 0xd3, 0x31, 0xbe, 0xfa, 0x6a, 0xe1, 0x3d,
- 0x40, 0xbb, 0x84, 0x3e, 0xe9, 0x58, 0x6e, 0x3d, 0x93, 0x97, 0x83, 0xbd,
- 0x16, 0x95, 0x85, 0x39, 0x8d, 0x94, 0xda, 0x3d, 0xe8, 0x36, 0x4e, 0x3e,
- 0x66, 0xa2, 0x41, 0xbe, 0x5e, 0x1d, 0x1f, 0x3e, 0x57, 0x51, 0x6e, 0xbc,
- 0x77, 0x43, 0xd0, 0x3d, 0x4d, 0xdc, 0xca, 0x3c, 0xad, 0x8c, 0xcf, 0x3d,
- 0x4f, 0x47, 0x95, 0x3d, 0x41, 0xdc, 0x39, 0xbe, 0xe6, 0x13, 0x8f, 0x3e,
- 0xd1, 0xd3, 0x35, 0x3e, 0xe2, 0xb9, 0xbe, 0x3d, 0xd1, 0xed, 0xe4, 0xbd,
- 0xdb, 0x18, 0x6b, 0x3e, 0x5d, 0xf1, 0x21, 0xbd, 0x27, 0x86, 0x04, 0x3e,
- 0x97, 0xa0, 0x42, 0x3d, 0xa1, 0x8a, 0x71, 0xbd, 0xd7, 0x20, 0x7f, 0x3e,
- 0x53, 0x90, 0x44, 0x3e, 0xc0, 0x06, 0x36, 0x3d, 0xab, 0x44, 0x2c, 0xbe,
- 0xa3, 0x8f, 0x41, 0xbe, 0xcc, 0x86, 0x42, 0x3e, 0x56, 0x10, 0x2a, 0x3e,
- 0x66, 0xcc, 0x0e, 0xbd, 0x8b, 0x05, 0x13, 0xbd, 0x04, 0x0a, 0x1f, 0xbe,
- 0xd3, 0x5e, 0x06, 0x3e, 0xc9, 0x3d, 0x92, 0x3e, 0xb7, 0xdd, 0x29, 0x3b,
- 0x0b, 0xc7, 0x27, 0x3d, 0x29, 0x7c, 0xf0, 0xbd, 0xf5, 0xad, 0xc9, 0x3d,
- 0xe8, 0x7f, 0x09, 0xbd, 0x7f, 0xb5, 0xc3, 0x3c, 0x4a, 0x99, 0x84, 0xbd,
- 0xe4, 0xcc, 0x11, 0xbd, 0x4d, 0x96, 0x1a, 0xbd, 0xac, 0xf7, 0x89, 0x3d,
- 0x60, 0x35, 0xc0, 0xbb, 0xc8, 0xa8, 0xec, 0x3b, 0x54, 0x9e, 0xf9, 0x3d,
- 0xce, 0x9b, 0xc7, 0xbe, 0xfb, 0x32, 0xa4, 0x3d, 0xcf, 0xdc, 0x48, 0x3e,
- 0x25, 0x61, 0x3b, 0xbe, 0xbf, 0x77, 0xa4, 0xbd, 0x8d, 0xd4, 0x2f, 0x3d,
- 0x01, 0xdc, 0x50, 0x3e, 0x89, 0x37, 0xec, 0xbb, 0xab, 0x2e, 0x1c, 0x3e,
- 0xdd, 0xb2, 0x81, 0x3d, 0xfe, 0x80, 0x80, 0xbd, 0x33, 0x2c, 0xbe, 0xbd,
- 0xdc, 0x3a, 0xc7, 0xbd, 0xec, 0x45, 0x54, 0x3e, 0x09, 0x77, 0x64, 0x3e,
- 0x20, 0x23, 0x35, 0xbe, 0x78, 0xae, 0x3c, 0xbe, 0xe8, 0x9f, 0x97, 0xbd,
- 0x95, 0x4a, 0x31, 0xbc, 0x0e, 0x75, 0x44, 0x3e, 0x79, 0xdc, 0x5d, 0x3d,
- 0x25, 0x62, 0xa0, 0x3d, 0x53, 0x5b, 0x1c, 0xbe, 0xcc, 0x53, 0x93, 0xbe,
- 0x88, 0xee, 0xb8, 0xbd, 0x2f, 0x70, 0x02, 0xbe, 0xed, 0x4f, 0x19, 0x3e,
- 0x4f, 0x6e, 0x6b, 0x3b, 0x22, 0x5b, 0x39, 0x3e, 0xdb, 0xe6, 0x8f, 0xbd,
- 0x30, 0xce, 0x98, 0x3c, 0xe5, 0x70, 0x81, 0xbd, 0x0f, 0x59, 0x5c, 0x3d,
- 0xf0, 0xf8, 0x89, 0xbd, 0x88, 0xe5, 0x58, 0xbe, 0x7c, 0xaa, 0xd2, 0x3d,
- 0xc7, 0x2d, 0xeb, 0xbd, 0x12, 0x26, 0xfb, 0xbc, 0x08, 0x9a, 0x8e, 0xbd,
- 0x9c, 0x0f, 0x1a, 0x3e, 0x9c, 0xbe, 0x77, 0xbd, 0xde, 0x9a, 0xe6, 0xbc,
- 0xa9, 0xa8, 0x54, 0xbd, 0x3f, 0x08, 0x25, 0xbe, 0xf9, 0xbe, 0x01, 0xbd,
- 0x7b, 0xaa, 0xe5, 0x3c, 0xe8, 0x33, 0xa8, 0x3c, 0xa9, 0xd6, 0x3f, 0xbd,
- 0x0b, 0x7c, 0x59, 0x3d, 0xcc, 0x2d, 0x0c, 0x3e, 0xc2, 0xb9, 0x07, 0x3d,
- 0xc4, 0x57, 0x99, 0xbd, 0x61, 0xc1, 0xdf, 0xbd, 0xae, 0x0e, 0x01, 0xbe,
- 0x04, 0x81, 0x49, 0xbd, 0x2f, 0x6b, 0x0f, 0x3e, 0x37, 0x02, 0x78, 0x3c,
- 0x1d, 0xbe, 0x01, 0xbe, 0x51, 0xf1, 0x5a, 0x3d, 0x90, 0x73, 0xad, 0xbd,
- 0xd6, 0xfb, 0xe8, 0xbc, 0x20, 0x0b, 0x3d, 0xbe, 0x7a, 0xcf, 0x3f, 0xbd,
- 0x08, 0x01, 0xed, 0xbd, 0x3e, 0x4b, 0xec, 0x3c, 0xb9, 0x65, 0xf8, 0xbd,
- 0x9c, 0xd5, 0x69, 0x3d, 0x43, 0x0f, 0x6f, 0xbc, 0xc9, 0x32, 0x8e, 0x3d,
- 0xa0, 0xb6, 0xd3, 0xbd, 0x1b, 0xf4, 0x24, 0xbd, 0xeb, 0xc2, 0x88, 0x3d,
- 0x5c, 0x4c, 0xd5, 0xbd, 0x2e, 0x84, 0xaa, 0x3c, 0xa0, 0x6a, 0xc6, 0xbd,
- 0x3f, 0x2f, 0xc7, 0x3c, 0x70, 0xcd, 0x65, 0x3d, 0xf2, 0xc5, 0xd7, 0xbd,
- 0xa9, 0xaa, 0x9f, 0xbd, 0x05, 0x08, 0x8a, 0x3d, 0x8d, 0xb5, 0xee, 0xbc,
- 0x92, 0xf3, 0x33, 0xbe, 0x0d, 0xd7, 0x38, 0xbe, 0x5f, 0x42, 0x16, 0x3e,
- 0x29, 0xe4, 0x1d, 0x3e, 0x76, 0x82, 0x90, 0xbd, 0x10, 0xff, 0x7b, 0x3d,
- 0x0b, 0x39, 0xbe, 0xbc, 0xe1, 0xf8, 0xce, 0xbc, 0x17, 0x37, 0x5d, 0x3d,
- 0x5e, 0x28, 0xe2, 0x3d, 0xd4, 0x66, 0x76, 0x3d, 0xaa, 0xbb, 0x57, 0xbb,
- 0x2c, 0x2b, 0x80, 0xbd, 0xc7, 0x13, 0x00, 0x3e, 0x76, 0x4f, 0xb0, 0x3d,
- 0x0b, 0x57, 0xd2, 0xbd, 0x2f, 0x8b, 0x90, 0x3d, 0xb1, 0x86, 0x3c, 0xbe,
- 0xde, 0x92, 0x16, 0xbe, 0xef, 0x29, 0x7d, 0xbc, 0x80, 0x73, 0xf6, 0xbd,
- 0xf2, 0x59, 0x82, 0x3c, 0x60, 0x38, 0xee, 0xbd, 0xfc, 0x56, 0xff, 0xbb,
- 0x85, 0x21, 0xa8, 0x3d, 0xf7, 0x17, 0x88, 0xbd, 0x93, 0x8e, 0x4d, 0xbd,
- 0x15, 0x35, 0xf4, 0x3d, 0x5d, 0xbd, 0x12, 0x3e, 0x58, 0xa2, 0xfd, 0xbd,
- 0x4a, 0x7c, 0x05, 0xbe, 0x99, 0xcf, 0xf7, 0xbd, 0x9e, 0x77, 0x2e, 0xbc,
- 0x77, 0x87, 0x38, 0xbe, 0x0b, 0x5c, 0xd0, 0x3d, 0xf4, 0xc0, 0xc6, 0x3d,
- 0xa1, 0x79, 0xe2, 0xbd, 0x2c, 0xa4, 0xf4, 0x3d, 0x85, 0x14, 0x59, 0xbd,
- 0x48, 0x3a, 0x3e, 0x3d, 0x7d, 0x2f, 0x76, 0xba, 0xaa, 0xfb, 0xbd, 0x3d,
- 0x8f, 0xc4, 0xb3, 0x3d, 0x60, 0xd2, 0xc6, 0xbd, 0xf8, 0x2f, 0x0c, 0xbe,
- 0x60, 0xcc, 0xd9, 0x3d, 0x51, 0x53, 0x37, 0x3d, 0xef, 0xf3, 0x03, 0x3e,
- 0xdb, 0x8e, 0x42, 0xbd, 0x03, 0x25, 0xbc, 0x3d, 0x2a, 0x1d, 0xbc, 0x3c,
- 0x55, 0xcf, 0x0a, 0x3e, 0xfc, 0x64, 0xdc, 0x3d, 0xfe, 0xd9, 0x03, 0xbe,
- 0x05, 0xcc, 0x20, 0xbe, 0x96, 0xf3, 0xc1, 0xbd, 0x58, 0x76, 0x7b, 0x3c,
- 0x1d, 0xbc, 0x35, 0x3c, 0xf4, 0x89, 0xfc, 0xbd, 0xf8, 0x28, 0x82, 0xbb,
- 0xe0, 0xfe, 0x13, 0xbd, 0x4c, 0x1b, 0xaa, 0xbd, 0xef, 0x88, 0xb9, 0x3d,
- 0x38, 0x64, 0xed, 0xbd, 0x91, 0x6e, 0x91, 0xbd, 0x9e, 0x77, 0x9f, 0xbb,
- 0x78, 0x4a, 0xa6, 0xbc, 0xd8, 0x5c, 0xd4, 0x3d, 0xe9, 0x57, 0x04, 0x3d,
- 0x2a, 0xaa, 0x00, 0x3e, 0x67, 0x16, 0xd1, 0x3d, 0x79, 0x7a, 0xec, 0xbd,
- 0x3d, 0xde, 0x12, 0xbc, 0x16, 0x60, 0xdd, 0xbd, 0xa4, 0xdc, 0xcc, 0x3b,
- 0x2f, 0x80, 0x15, 0xbe, 0x68, 0x6e, 0xe6, 0x3d, 0x68, 0xd1, 0x8b, 0x3d,
- 0x9f, 0x5c, 0x41, 0x3e, 0x18, 0xb0, 0x19, 0x3e, 0xe7, 0xad, 0x95, 0xbe,
- 0x15, 0xaa, 0x27, 0x3e, 0x59, 0xa9, 0x21, 0x3e, 0xb2, 0x21, 0xbd, 0x3e,
- 0x5b, 0xe0, 0x54, 0x3e, 0x33, 0x7c, 0x15, 0x3e, 0x4e, 0x14, 0xfd, 0x3d,
- 0x32, 0xc5, 0xd4, 0xbd, 0x6e, 0x1f, 0x4d, 0x3d, 0xe6, 0xb9, 0xf1, 0xbc,
- 0x23, 0xfe, 0x31, 0x3e, 0xaa, 0xbb, 0x2b, 0xbe, 0xd7, 0xf6, 0x86, 0x3e,
- 0xe8, 0x69, 0x68, 0xbd, 0x9a, 0x06, 0x39, 0xbe, 0xb4, 0xa4, 0x68, 0x3e,
- 0xd5, 0x21, 0x8f, 0xbd, 0xa6, 0xdc, 0xa2, 0xbe, 0xdd, 0xb8, 0x1f, 0xbe,
- 0xc7, 0x65, 0x39, 0xbd, 0xcf, 0xd0, 0x8d, 0x3d, 0x23, 0x12, 0xef, 0x3d,
- 0x97, 0x15, 0xfb, 0xbd, 0x96, 0x17, 0x9f, 0x3d, 0x01, 0xfd, 0x85, 0xbe,
- 0xb9, 0x2f, 0xae, 0x3c, 0x1d, 0x2b, 0xb0, 0x3d, 0x3a, 0x8e, 0x4f, 0xbe,
- 0xce, 0xfd, 0x54, 0x3e, 0x2f, 0x8d, 0x12, 0xbd, 0x48, 0x40, 0xe2, 0x3d,
- 0x9c, 0xad, 0x98, 0x3d, 0xf0, 0x43, 0x0f, 0xbe, 0x04, 0xdc, 0x8a, 0xbd,
- 0xd3, 0x45, 0x4d, 0xbd, 0x0e, 0x07, 0x07, 0x3e, 0xde, 0x72, 0x80, 0x3d,
- 0x25, 0xb6, 0x1a, 0x3e, 0x52, 0x11, 0xd3, 0xbd, 0xd8, 0x9f, 0xf3, 0xbd,
- 0x47, 0xb1, 0x02, 0xbd, 0xbc, 0x39, 0x82, 0xb9, 0xf4, 0x28, 0x1b, 0x3e,
- 0x5b, 0x99, 0xcc, 0xbe, 0x62, 0xe3, 0xc9, 0xbd, 0xfe, 0xc3, 0x8a, 0xbd,
- 0x01, 0xf0, 0xf3, 0x3c, 0x20, 0xb5, 0x92, 0xbe, 0x4b, 0xc3, 0x24, 0x3e,
- 0x99, 0xce, 0x81, 0xbe, 0x51, 0x9c, 0x84, 0xbd, 0xd1, 0x28, 0x3c, 0x3d,
- 0x7d, 0x62, 0x02, 0xbe, 0x6a, 0x37, 0x24, 0xbd, 0xca, 0x49, 0xc0, 0xbb,
- 0x28, 0xe3, 0x06, 0x3e, 0x08, 0x67, 0x8f, 0xbd, 0x50, 0x2a, 0xec, 0xbd,
- 0xb5, 0x43, 0x56, 0x3e, 0x0a, 0xaf, 0x1e, 0xbc, 0x8b, 0xb0, 0x28, 0xbe,
- 0x33, 0x03, 0x95, 0xbe, 0x38, 0xe4, 0xf1, 0x3d, 0xbe, 0x66, 0x8e, 0xbe,
- 0x77, 0x99, 0x98, 0xbb, 0x1b, 0xbd, 0x53, 0x3e, 0x48, 0xfc, 0x93, 0x3d,
- 0x1b, 0xc2, 0xcb, 0xbd, 0xc8, 0x06, 0x4c, 0x3d, 0xcb, 0x47, 0xd8, 0x3b,
- 0xae, 0x74, 0x10, 0xbe, 0xfc, 0xc3, 0xa3, 0xbc, 0x70, 0x6a, 0xc4, 0x3d,
- 0x8b, 0x9a, 0xe7, 0xbe, 0xde, 0x9d, 0x5b, 0xbd, 0x51, 0xe5, 0xb4, 0xbe,
- 0xc9, 0xbe, 0xc0, 0xbe, 0x97, 0xb9, 0x98, 0x3d, 0xb2, 0xa4, 0x90, 0x3e,
- 0xcd, 0x5b, 0x52, 0xbe, 0x51, 0xf0, 0xc1, 0xbb, 0x7d, 0x38, 0xf0, 0xbd,
- 0x4e, 0x44, 0x46, 0x3e, 0xd8, 0x50, 0xa8, 0x3d, 0xde, 0x7e, 0x72, 0xbd,
- 0x78, 0x0d, 0x22, 0xbe, 0x50, 0x5d, 0x03, 0xbd, 0x76, 0x47, 0x91, 0xbe,
- 0x40, 0x29, 0x45, 0xbe, 0x81, 0x76, 0x7f, 0xbd, 0xc8, 0xa0, 0xbc, 0x3d,
- 0x6b, 0xb7, 0x82, 0x3d, 0x43, 0xc6, 0x7c, 0xbd, 0xf6, 0xc8, 0xa9, 0x3b,
- 0x63, 0xba, 0x8c, 0xbe, 0x1c, 0xef, 0x0a, 0xbe, 0xc9, 0x56, 0x13, 0x3d,
- 0xd5, 0x3c, 0x98, 0x3d, 0xdf, 0x9f, 0x1b, 0xbe, 0xa2, 0x98, 0x04, 0x3d,
- 0x6d, 0x5f, 0x00, 0xbf, 0x00, 0x1e, 0xd6, 0x3d, 0x8e, 0x0b, 0xd6, 0xbc,
- 0x31, 0xb0, 0xa8, 0xbc, 0x5e, 0x88, 0xdc, 0xbd, 0x61, 0x46, 0x3c, 0xbe,
- 0xe2, 0x97, 0x28, 0xbe, 0x38, 0xc7, 0x23, 0xbd, 0x69, 0x6d, 0x9b, 0xbe,
- 0x58, 0x28, 0xaa, 0x3b, 0xef, 0x44, 0x9b, 0x3d, 0x1b, 0xc0, 0xcf, 0xbd,
- 0x86, 0x05, 0x89, 0x3e, 0xfe, 0x8b, 0x6b, 0x3e, 0xd5, 0xa2, 0x3c, 0x3d,
- 0xdb, 0xc7, 0xcd, 0x3d, 0x8c, 0x83, 0x49, 0x3e, 0x7a, 0xdb, 0xeb, 0x3d,
- 0xbf, 0x62, 0xa2, 0x3d, 0xc1, 0x71, 0x03, 0xbe, 0x24, 0x2d, 0x44, 0xbe,
- 0x00, 0x52, 0x2b, 0xbd, 0x00, 0x26, 0xab, 0xbd, 0x2e, 0xbf, 0x81, 0xbe,
- 0x1d, 0xd0, 0xa5, 0x3d, 0x80, 0xca, 0x9d, 0xbd, 0x95, 0xb2, 0x0b, 0x3e,
- 0x04, 0x3f, 0x7f, 0x3e, 0x3f, 0x01, 0x62, 0xbd, 0x94, 0x63, 0xb5, 0xbe,
- 0x15, 0x2a, 0x9e, 0x3e, 0xe8, 0x12, 0xfc, 0xbe, 0x5a, 0x92, 0x37, 0xbe,
- 0x15, 0x29, 0x76, 0xbe, 0x33, 0x56, 0x5b, 0x3e, 0x80, 0xd2, 0x3f, 0xbe,
- 0xe1, 0xde, 0xd4, 0x3c, 0x55, 0x15, 0xce, 0xbd, 0xeb, 0x50, 0x05, 0x3d,
- 0x73, 0x8f, 0x63, 0xbe, 0x1f, 0x11, 0x18, 0x3e, 0xc7, 0xda, 0xe3, 0xbd,
- 0xb4, 0x58, 0x70, 0xbe, 0xc8, 0xde, 0xfb, 0xbc, 0x1d, 0xa1, 0xaf, 0xbe,
- 0x9f, 0xd0, 0x90, 0xbe, 0x56, 0xd6, 0xfe, 0x3d, 0xae, 0xe4, 0x81, 0x3d,
- 0x2c, 0x3f, 0x1f, 0x3e, 0x0e, 0x8e, 0x67, 0xbe, 0xf8, 0x85, 0x7c, 0x3c,
- 0x7b, 0xd6, 0xef, 0x3d, 0x66, 0x67, 0x63, 0x3e, 0x4d, 0xc5, 0x84, 0xbd,
- 0x25, 0x13, 0x12, 0xbe, 0xbc, 0x46, 0xa3, 0x3e, 0x1a, 0x48, 0x13, 0xbe,
- 0xb0, 0x27, 0xdd, 0xbd, 0x4c, 0xaf, 0x69, 0xbe, 0xa5, 0x3b, 0x8c, 0x3e,
- 0xba, 0x3e, 0x09, 0x3e, 0xf8, 0xeb, 0x28, 0xbc, 0xec, 0xa7, 0x1a, 0xbd,
- 0xe2, 0x54, 0x3e, 0xbd, 0x89, 0x4f, 0x1e, 0xbe, 0xcd, 0x28, 0x46, 0x3e,
- 0x81, 0x1d, 0xac, 0x3d, 0x6e, 0x4c, 0xe7, 0xbb, 0xc1, 0xda, 0x6c, 0xbe,
- 0x76, 0xa0, 0x3c, 0xbe, 0xaa, 0x67, 0xcb, 0xbe, 0x80, 0x47, 0xfa, 0x3e,
- 0x5e, 0xb1, 0xe6, 0xbd, 0x81, 0x74, 0x24, 0xbd, 0x26, 0x32, 0x40, 0xbe,
- 0x73, 0xea, 0x93, 0x3d, 0x66, 0x6f, 0x8d, 0x3c, 0xe3, 0x40, 0x17, 0xbb,
- 0xe8, 0x06, 0x05, 0xbd, 0x97, 0x52, 0x5c, 0x3d, 0x42, 0x79, 0xd1, 0x3d,
- 0x25, 0x81, 0xa6, 0x3e, 0xdd, 0xaa, 0x7d, 0xbd, 0xc3, 0x6f, 0x27, 0x3d,
- 0x9b, 0xc6, 0xfb, 0xbd, 0x32, 0x02, 0x7f, 0xbe, 0xa2, 0xd5, 0x72, 0xbe,
- 0x4c, 0x5b, 0x9a, 0xbd, 0x48, 0x16, 0x2a, 0x3e, 0xdd, 0x7b, 0xe2, 0xbd,
- 0xef, 0x87, 0x32, 0x3e, 0xde, 0xdf, 0xd0, 0xbd, 0xc3, 0x5e, 0x83, 0xbd,
- 0xcc, 0x46, 0x64, 0xbe, 0xfc, 0xff, 0x2d, 0x3b, 0x0a, 0xe7, 0xf2, 0xbd,
- 0x96, 0x78, 0x0e, 0xbe, 0xfd, 0x4d, 0x92, 0xbd, 0x3f, 0xe3, 0x32, 0x3e,
- 0xac, 0x35, 0xc5, 0xbd, 0xb2, 0x02, 0xa1, 0xbe, 0xd0, 0x64, 0x3f, 0xbe,
- 0x80, 0x84, 0x89, 0x3e, 0x07, 0x55, 0x0d, 0x3e, 0x0b, 0x44, 0x0a, 0xbc,
- 0x0c, 0x14, 0x74, 0x3e, 0x7b, 0x66, 0xa6, 0xbd, 0x12, 0xf2, 0x10, 0xbe,
- 0x45, 0x77, 0x0d, 0xbe, 0x10, 0x2f, 0x14, 0xbe, 0x44, 0x0f, 0x8f, 0x3e,
- 0x32, 0xfc, 0x2c, 0xbe, 0x06, 0x63, 0x62, 0xbe, 0xfe, 0xe0, 0x15, 0x3d,
- 0xf6, 0x25, 0x60, 0x3d, 0x78, 0x03, 0x55, 0x3d, 0x84, 0xde, 0xa2, 0x3c,
- 0xea, 0xfe, 0x34, 0xbe, 0xc2, 0x3e, 0x89, 0x3d, 0xad, 0xaa, 0x11, 0xbe,
- 0xe3, 0xb5, 0x4e, 0xbe, 0x86, 0x73, 0x01, 0x3c, 0xf3, 0xd4, 0x13, 0xbe,
- 0x95, 0x89, 0xcd, 0x3c, 0xc5, 0x6b, 0xee, 0x3d, 0x96, 0x29, 0xf6, 0x3d,
- 0x1e, 0x59, 0x00, 0x3d, 0xf4, 0x0c, 0x43, 0x3e, 0x87, 0x10, 0x32, 0x3e,
- 0x4b, 0xcf, 0xb3, 0x3d, 0x2f, 0x16, 0x27, 0xbd, 0xf0, 0x83, 0x1a, 0xbe,
- 0xc7, 0xda, 0xc0, 0xbc, 0x98, 0x18, 0x13, 0xbe, 0x29, 0x25, 0xf5, 0xbd,
- 0xe6, 0xf5, 0xa4, 0xbe, 0xa5, 0x38, 0xf8, 0xbd, 0x2e, 0xa1, 0xb7, 0x3c,
- 0xe6, 0x57, 0x07, 0xbd, 0x90, 0xb9, 0xa2, 0x3d, 0x2a, 0xc7, 0x5e, 0xbe,
- 0x66, 0x69, 0x09, 0xbe, 0x7e, 0xfc, 0x3f, 0x3e, 0x48, 0x6a, 0x61, 0xbe,
- 0x54, 0xc9, 0x02, 0xbe, 0x00, 0xee, 0x77, 0x3d, 0xbd, 0x2e, 0x64, 0xbd,
- 0x74, 0x1d, 0x5b, 0x3e, 0x18, 0xdc, 0x67, 0xbe, 0x6b, 0xcc, 0x52, 0x3e,
- 0x30, 0x02, 0xd3, 0x3d, 0xe2, 0xb0, 0x7e, 0xbd, 0x69, 0x67, 0x8c, 0xbd,
- 0xd2, 0xb1, 0xa7, 0xbe, 0x64, 0x19, 0xbe, 0xbd, 0x4c, 0xbe, 0x0d, 0xbd,
- 0xc2, 0x49, 0xa0, 0xbe, 0xf7, 0xc0, 0x93, 0x3d, 0x41, 0x48, 0x0b, 0xbd,
- 0xa1, 0xf4, 0x99, 0xbe, 0x41, 0x2f, 0xfc, 0xbc, 0xad, 0x8c, 0x05, 0xbe,
- 0x4c, 0xed, 0xbd, 0x3c, 0x7b, 0x9d, 0x7d, 0xbc, 0x04, 0x2c, 0x30, 0x3d,
- 0x6b, 0x11, 0x05, 0xbc, 0x06, 0xc9, 0x41, 0xbd, 0x31, 0xb2, 0xb5, 0xbd,
- 0x22, 0x60, 0x7d, 0x3d, 0x06, 0x31, 0x0c, 0x3e, 0x05, 0xd5, 0x0e, 0x3a,
- 0xa8, 0x49, 0xcc, 0xbc, 0x62, 0x97, 0x39, 0x3e, 0x07, 0xc2, 0x97, 0x3e,
- 0x1f, 0x7a, 0xf3, 0xbd, 0x3e, 0xda, 0xd0, 0x3d, 0x74, 0x52, 0x4c, 0xbd,
- 0x4a, 0x6b, 0x4c, 0xbe, 0xee, 0xac, 0xa4, 0xbc, 0xe6, 0xe6, 0x94, 0xbe,
- 0xdd, 0xa5, 0x4c, 0x3d, 0xf8, 0x66, 0xd4, 0x3d, 0x85, 0x10, 0x53, 0xbc,
- 0x76, 0x13, 0xf7, 0xbd, 0x27, 0xe0, 0x79, 0x3d, 0xe3, 0x69, 0x56, 0x3d,
- 0x3e, 0x7a, 0x60, 0x3e, 0x76, 0x04, 0xee, 0x3c, 0x8c, 0xd3, 0x80, 0xbe,
- 0xea, 0xc4, 0x0c, 0x3e, 0x94, 0xe6, 0x35, 0x3b, 0xd6, 0xf1, 0x55, 0xbd,
- 0xb0, 0xf1, 0x40, 0xbe, 0xb4, 0x43, 0xa8, 0xbe, 0xbf, 0x85, 0x01, 0x3e,
- 0xef, 0x78, 0xb7, 0x3d, 0xff, 0x28, 0x87, 0xbe, 0x9f, 0x9a, 0xe8, 0xbc,
- 0x4b, 0x70, 0xc5, 0xbd, 0x87, 0x4a, 0x64, 0x3e, 0x1a, 0x47, 0x7c, 0xbe,
- 0xcf, 0x68, 0x85, 0xbe, 0x59, 0x6a, 0xd1, 0xbe, 0xad, 0xbe, 0xf5, 0x3d,
- 0x6f, 0xc1, 0x3a, 0xbe, 0xae, 0xf7, 0xfd, 0xbd, 0x57, 0x87, 0x82, 0xbc,
- 0xe6, 0xc6, 0x3d, 0xbe, 0xa4, 0x81, 0x9d, 0x3d, 0x6c, 0x13, 0xd0, 0xbc,
- 0xe3, 0x42, 0x73, 0xbe, 0x48, 0x9e, 0xe1, 0xbd, 0x55, 0xb0, 0x3e, 0x3e,
- 0x5b, 0xc2, 0x4d, 0xbc, 0x03, 0x3c, 0xf5, 0xbd, 0x2e, 0xc5, 0x01, 0xbf,
- 0xfc, 0x37, 0xb5, 0xbe, 0x96, 0x2d, 0x48, 0xbd, 0x03, 0xe6, 0x53, 0x3d,
- 0xdf, 0xae, 0x0e, 0x3d, 0xc4, 0x43, 0x36, 0x3e, 0xfb, 0x32, 0x0f, 0x3e,
- 0x28, 0x38, 0xee, 0xbd, 0x2b, 0x4a, 0x7d, 0xbd, 0x6f, 0x15, 0xb5, 0xbe,
- 0xe1, 0xe0, 0x5f, 0x3c, 0x5d, 0x8e, 0x0b, 0x3e, 0x33, 0x69, 0xa0, 0xbe,
- 0x2e, 0x55, 0xc4, 0xbe, 0x22, 0xbf, 0xa2, 0x3c, 0x24, 0x09, 0xcb, 0x3c,
- 0xbf, 0x80, 0x1f, 0xbe, 0xd4, 0xca, 0xd2, 0xbd, 0x1d, 0x0e, 0x92, 0xbe,
- 0x72, 0xd4, 0xff, 0x3d, 0x76, 0x9c, 0xb3, 0xbc, 0x1e, 0x2c, 0x5e, 0x3d,
- 0x7a, 0x18, 0xc0, 0xbb, 0x94, 0xd5, 0x2b, 0xbe, 0xc8, 0x9a, 0x6d, 0xbe,
- 0x2b, 0x3a, 0x20, 0x3e, 0x92, 0x09, 0x7b, 0x3e, 0x9e, 0x30, 0x27, 0xbe,
- 0x38, 0x9b, 0x36, 0xbe, 0xf1, 0xf2, 0x29, 0xbd, 0x06, 0x48, 0xff, 0xbc,
- 0xb8, 0x04, 0x7d, 0xbd, 0x54, 0x12, 0xd0, 0xbd, 0x7d, 0xd0, 0x65, 0x3b,
- 0x0e, 0xca, 0x2c, 0xbe, 0x35, 0xb6, 0x99, 0xbe, 0x19, 0x2a, 0x54, 0xbe,
- 0x78, 0x4e, 0xb8, 0x3d, 0x5b, 0x0c, 0xa6, 0xbd, 0xee, 0x8f, 0x7f, 0xbe,
- 0x9c, 0x6e, 0xaf, 0x3c, 0x9c, 0x07, 0x14, 0xbe, 0x35, 0xd4, 0x54, 0xbe,
- 0x5f, 0x57, 0x15, 0x3e, 0xe8, 0x1f, 0x25, 0x3d, 0x94, 0x1e, 0x0e, 0x3e,
- 0x0b, 0xe8, 0xa5, 0x3d, 0x88, 0xa8, 0x06, 0x3d, 0x09, 0xff, 0x4a, 0xbe,
- 0x52, 0xf0, 0xce, 0x3d, 0xda, 0x8a, 0x85, 0xbe, 0xa6, 0xc6, 0x30, 0x3d,
- 0xe9, 0x09, 0xe0, 0x3d, 0x44, 0x89, 0x32, 0xbd, 0x2b, 0x9f, 0xb3, 0xbd,
- 0x81, 0xe4, 0x29, 0x3d, 0xd1, 0x32, 0xd8, 0xbd, 0xb1, 0x1e, 0x93, 0xbd,
- 0x8b, 0xf0, 0x42, 0xbd, 0x56, 0xdd, 0x99, 0xbd, 0x3f, 0xb2, 0xb1, 0xbd,
- 0x5c, 0x3f, 0xee, 0x3d, 0x7f, 0x5c, 0x99, 0xbb, 0x14, 0xca, 0xb3, 0x3d,
- 0x4c, 0xe2, 0x70, 0xbd, 0x10, 0x5f, 0x63, 0xbd, 0x0b, 0xa3, 0xfb, 0xbd,
- 0x56, 0xd4, 0x3c, 0x3d, 0xd5, 0x60, 0x32, 0xbe, 0xfe, 0xf6, 0xdb, 0x3d,
- 0x9d, 0x44, 0xd7, 0xbd, 0x72, 0xc4, 0xfd, 0x3d, 0x99, 0x47, 0xe2, 0xbd,
- 0xd8, 0x6e, 0xdc, 0xbb, 0xd8, 0x89, 0x81, 0x3d, 0x1c, 0x9a, 0x4b, 0xbc,
- 0x3f, 0x62, 0x80, 0xbc, 0xb2, 0x07, 0x73, 0xbd, 0xf4, 0x22, 0x9e, 0xbd,
- 0x3d, 0xa5, 0x4d, 0xbe, 0xce, 0xbb, 0xb8, 0xbc, 0x6e, 0x0e, 0x9b, 0xbb,
- 0x07, 0xc0, 0xf8, 0x3d, 0xc8, 0x30, 0x19, 0xbe, 0x84, 0x64, 0x7b, 0xbd,
- 0xe9, 0xa1, 0x83, 0xbd, 0xcd, 0xdd, 0x7d, 0xbd, 0x5f, 0xec, 0x9e, 0x3c,
- 0xe0, 0xf0, 0x0c, 0x3c, 0x65, 0x72, 0x57, 0x3d, 0x52, 0x6f, 0xb4, 0xbd,
- 0xc2, 0x6d, 0x4c, 0xbd, 0x88, 0x49, 0xc0, 0xbc, 0x19, 0x8d, 0x29, 0x3e,
- 0x7b, 0xe1, 0xec, 0xbd, 0x3a, 0x58, 0xa7, 0x3d, 0x4b, 0x8d, 0x80, 0xbc,
- 0x48, 0x55, 0xf0, 0xbc, 0xd2, 0x36, 0x94, 0xbd, 0xf8, 0xe6, 0x05, 0x3e,
- 0x7e, 0xbd, 0x9d, 0xbd, 0x50, 0xed, 0x00, 0x3d, 0x25, 0x60, 0xaf, 0xbd,
- 0xf7, 0xdb, 0x88, 0x3d, 0x81, 0x97, 0x98, 0x3d, 0xa5, 0xf8, 0xc1, 0x3c,
- 0xfe, 0xf1, 0xbf, 0x3d, 0x27, 0x49, 0xb4, 0xbd, 0x4e, 0x13, 0x07, 0xbd,
- 0xed, 0xdc, 0x53, 0xbd, 0x2d, 0xd3, 0xbc, 0x3c, 0xef, 0x9d, 0x55, 0xbc,
- 0xe6, 0xb4, 0x0b, 0xbe, 0xaf, 0x09, 0x82, 0xbc, 0x71, 0x66, 0x04, 0x3e,
- 0xdf, 0x10, 0xc6, 0x3d, 0xd5, 0x9c, 0xb1, 0xbd, 0x09, 0xc7, 0xe9, 0x3d,
- 0xf1, 0x15, 0x87, 0xbc, 0x2d, 0x3a, 0x95, 0xbd, 0x02, 0xe3, 0x9c, 0xbd,
- 0xcc, 0xbb, 0xed, 0xbd, 0x34, 0x3a, 0xcd, 0x3d, 0xd5, 0x00, 0x20, 0x3e,
- 0x0b, 0x7f, 0x3b, 0xbe, 0x53, 0x90, 0x3c, 0xbb, 0x87, 0xd9, 0x2f, 0xbd,
- 0x7a, 0x28, 0x35, 0xbe, 0xc2, 0xad, 0x27, 0x3d, 0x0f, 0x96, 0x1c, 0x3e,
- 0xba, 0xbf, 0x07, 0xbe, 0xfc, 0x61, 0xc8, 0xbd, 0xc8, 0x63, 0x0f, 0x3d,
- 0x04, 0x23, 0x01, 0xbe, 0x61, 0xc0, 0xd7, 0xbd, 0x14, 0x0f, 0x36, 0x3d,
- 0xb8, 0x84, 0x49, 0x3d, 0x32, 0xfb, 0x3d, 0xbd, 0x5f, 0xe6, 0xdc, 0x3c,
- 0x5b, 0x3b, 0x10, 0xbe, 0x19, 0x08, 0x44, 0x3b, 0xa0, 0x76, 0xfb, 0x3d,
- 0xca, 0x54, 0xb3, 0xbd, 0xa3, 0x0a, 0x15, 0xbe, 0x85, 0x9e, 0xe6, 0x3d,
- 0xe4, 0x98, 0x19, 0x3e, 0x1c, 0x8f, 0xb5, 0x3d, 0x4f, 0xfb, 0x2b, 0xbb,
- 0x81, 0xef, 0x31, 0xbc, 0x0d, 0x94, 0x9b, 0x3d, 0xec, 0x35, 0xde, 0xbd,
- 0x75, 0xec, 0x1d, 0xbe, 0x90, 0x04, 0xa3, 0x3d, 0x67, 0x9c, 0x89, 0x3d,
- 0x1e, 0x16, 0xa3, 0x3d, 0x3f, 0xf0, 0x15, 0xbd, 0x7d, 0xa9, 0x71, 0xbd,
- 0x0b, 0x22, 0x94, 0x3d, 0x68, 0xac, 0x94, 0xbd, 0x95, 0x1b, 0x8d, 0x3c,
- 0xdc, 0x11, 0xa3, 0x3c, 0x95, 0x1b, 0x22, 0xbd, 0x31, 0x5e, 0xba, 0xbd,
- 0x8a, 0x84, 0xa2, 0x3d, 0x3e, 0xc5, 0x0f, 0xbe, 0xf8, 0xa8, 0xbe, 0x3d,
- 0x09, 0x67, 0xd6, 0xbd, 0x82, 0x73, 0x7d, 0xbd, 0x13, 0x49, 0x2a, 0x3d,
- 0x7b, 0xab, 0xe5, 0x3d, 0x9b, 0xa1, 0xbd, 0xbc, 0x09, 0xae, 0x2b, 0xbe,
- 0xed, 0xb4, 0xa1, 0x3b, 0x5d, 0xb2, 0x4d, 0x3d, 0x98, 0xb9, 0x09, 0x3d,
- 0xee, 0x9c, 0x14, 0xbe, 0x45, 0x3c, 0x08, 0x3e, 0x48, 0x5f, 0x27, 0xbd,
- 0x07, 0xfb, 0x4d, 0xbe, 0x7a, 0xba, 0xab, 0xbd, 0xa4, 0x3e, 0x77, 0x3e,
- 0xca, 0xa5, 0x50, 0x3e, 0x2b, 0x2b, 0xaa, 0xbc, 0x86, 0xc7, 0xa0, 0xba,
- 0xd6, 0x7c, 0xfc, 0x3d, 0x3d, 0x54, 0x91, 0x3e, 0x7e, 0x1c, 0x50, 0xbe,
- 0x79, 0x6a, 0x99, 0xbd, 0xb4, 0x93, 0x28, 0xbe, 0x50, 0xbd, 0xaf, 0xbe,
- 0x24, 0x91, 0xc6, 0xbd, 0x8b, 0x08, 0x1d, 0xbf, 0xa3, 0xb4, 0xde, 0x3e,
- 0x12, 0x15, 0x80, 0xbe, 0xf4, 0xf0, 0x2f, 0xbd, 0x34, 0x48, 0x16, 0x3d,
- 0xd7, 0xbc, 0x36, 0xbe, 0x9a, 0x7c, 0x06, 0x3d, 0xc9, 0x5c, 0x79, 0x3c,
- 0xc1, 0x51, 0x3f, 0x3e, 0x3b, 0x7d, 0xc2, 0xbd, 0x2e, 0xdd, 0x93, 0xbd,
- 0x00, 0x99, 0x50, 0xbe, 0x71, 0x5e, 0x1b, 0x3e, 0x78, 0x8d, 0x33, 0x3e,
- 0x5d, 0xaf, 0x8b, 0x3d, 0xd9, 0xf7, 0xbb, 0x3d, 0x84, 0x73, 0x88, 0xbe,
- 0xa7, 0x2a, 0x00, 0xbd, 0x3e, 0x9f, 0x13, 0xbc, 0x8d, 0x46, 0x52, 0x3e,
- 0x39, 0xd7, 0xd2, 0xbe, 0xcd, 0x83, 0x0e, 0x3e, 0x9e, 0x04, 0x68, 0xbd,
- 0x1a, 0x49, 0xa7, 0xbe, 0xf2, 0xc7, 0xb5, 0xbe, 0xa5, 0x58, 0x09, 0xbe,
- 0x11, 0xaa, 0xa9, 0xbd, 0x79, 0x03, 0xdd, 0x3d, 0x44, 0x0c, 0x96, 0xbd,
- 0xae, 0x7b, 0x69, 0x3e, 0xa4, 0x19, 0xea, 0xbc, 0x5a, 0xb2, 0xa2, 0x39,
- 0x42, 0xfc, 0x64, 0xbe, 0xdf, 0x3d, 0xa0, 0x3e, 0x06, 0xa6, 0x6d, 0xbe,
- 0x6b, 0xd3, 0x18, 0x3e, 0x12, 0x36, 0x21, 0xba, 0xa6, 0x34, 0x42, 0x3e,
- 0xb2, 0x5f, 0x6c, 0x3e, 0xa8, 0xc8, 0x46, 0xbe, 0x61, 0xbe, 0x57, 0x3e,
- 0x69, 0x2a, 0x30, 0x3d, 0x41, 0x4a, 0x84, 0xbe, 0x4c, 0xb4, 0xa7, 0x3e,
- 0x9d, 0x24, 0x7c, 0xbe, 0x9d, 0x20, 0x39, 0x3d, 0x7b, 0xe1, 0x16, 0x3e,
- 0xa6, 0x79, 0xd2, 0xbd, 0x35, 0xd8, 0xae, 0x3d, 0xf4, 0x38, 0x63, 0xbd,
- 0x02, 0x0c, 0xd5, 0xbc, 0xb7, 0x6a, 0xa4, 0x3e, 0xe6, 0x7b, 0x84, 0x3e,
- 0xfa, 0xd1, 0x1d, 0x3d, 0xb3, 0x3c, 0xfc, 0xbd, 0x2b, 0x39, 0xbc, 0x3d,
- 0xf8, 0x1b, 0xcf, 0xbe, 0x50, 0x34, 0x5f, 0x3b, 0x48, 0x5a, 0x6d, 0xbe,
- 0xcb, 0x6c, 0x33, 0x3e, 0x03, 0x2b, 0xe0, 0xbe, 0x5c, 0x62, 0xbf, 0x3d,
- 0x4b, 0x37, 0x9a, 0x3c, 0xae, 0x8e, 0x2a, 0xbe, 0xbb, 0x4c, 0xd4, 0xbd,
- 0x51, 0xda, 0x54, 0xbd, 0x15, 0xce, 0x0f, 0xbe, 0xc5, 0x0a, 0xfe, 0xba,
- 0xb0, 0x5f, 0x6e, 0xbe, 0x37, 0xfa, 0x0f, 0xbd, 0xd0, 0x17, 0x83, 0xbd,
- 0x7c, 0x35, 0xdb, 0x3d, 0xe9, 0xe7, 0x8b, 0x3e, 0x2e, 0xe0, 0x87, 0xbc,
- 0xaa, 0x3f, 0xe6, 0x3d, 0x87, 0x89, 0xf5, 0xbd, 0xb6, 0x52, 0x76, 0xbc,
- 0x5e, 0x9e, 0x75, 0xbd, 0xed, 0x13, 0xc1, 0xbc, 0x7b, 0xd4, 0x91, 0x3d,
- 0x58, 0x8c, 0x79, 0x3e, 0x7b, 0x16, 0x88, 0x3e, 0xa7, 0x5b, 0xd7, 0x3c,
- 0x58, 0x1b, 0xe3, 0x3e, 0x2c, 0x96, 0x53, 0xbe, 0x99, 0xde, 0x2b, 0xbf,
- 0xdc, 0xba, 0x91, 0xbe, 0x53, 0x9b, 0x35, 0x3e, 0xd8, 0xc6, 0x49, 0xbe,
- 0xaa, 0x57, 0x51, 0x3e, 0xbb, 0x33, 0x3e, 0xbe, 0xe4, 0x8c, 0x93, 0xbd,
- 0x56, 0x35, 0xc4, 0xbd, 0xa0, 0x1b, 0xa8, 0xbd, 0xa0, 0xb7, 0x15, 0x3e,
- 0xb3, 0x62, 0xa0, 0xbd, 0x2e, 0xca, 0xdd, 0x3c, 0x41, 0xd2, 0x87, 0xbd,
- 0x8e, 0x10, 0x30, 0xbe, 0x4d, 0x86, 0x82, 0x3e, 0x2a, 0x38, 0x8e, 0x3e,
- 0x6b, 0x77, 0xb2, 0x3e, 0x1a, 0x5d, 0xe4, 0xbe, 0x9d, 0x3f, 0x11, 0xbe,
- 0x30, 0x2f, 0xeb, 0xbd, 0x99, 0x13, 0x84, 0xbe, 0x0c, 0xda, 0xad, 0xbe,
- 0xb4, 0x99, 0x60, 0xbe, 0x8c, 0x98, 0x93, 0x3e, 0xda, 0xcc, 0x06, 0xbe,
- 0xbc, 0x1d, 0x08, 0xbf, 0x67, 0xe6, 0xaa, 0x3d, 0xfe, 0x45, 0x03, 0xbe,
- 0x39, 0x00, 0xe0, 0x3d, 0x92, 0x5d, 0xd7, 0xbd, 0x3c, 0x00, 0xa5, 0x3e,
- 0xcf, 0x24, 0x7c, 0xbe, 0xe2, 0xa9, 0x2e, 0x3e, 0x57, 0xe8, 0x05, 0xbe,
- 0xef, 0x78, 0x9e, 0x3d, 0xe6, 0xd2, 0x90, 0xbd, 0x08, 0xe8, 0xd2, 0x3d,
- 0x43, 0xc8, 0x79, 0xbd, 0xb8, 0x18, 0xf1, 0x3b, 0x6d, 0x3c, 0x86, 0xbd,
- 0x9e, 0x9d, 0xff, 0x3d, 0x64, 0xf0, 0x14, 0xbd, 0x84, 0xb3, 0x40, 0xbd,
- 0x79, 0xa9, 0x2d, 0xbd, 0x5b, 0x83, 0xb1, 0xbe, 0x77, 0x94, 0x4e, 0xbe,
- 0x07, 0x5f, 0x95, 0xbe, 0xdd, 0x81, 0x96, 0xbb, 0xc4, 0x27, 0xc8, 0x3d,
- 0x6a, 0x5c, 0x21, 0xbd, 0xcd, 0x4f, 0xa3, 0x3d, 0xc3, 0xbe, 0x14, 0xbe,
- 0xce, 0x9c, 0xc3, 0xbc, 0x80, 0x68, 0x88, 0x3c, 0x40, 0x8d, 0xa2, 0xbe,
- 0x54, 0xaa, 0x80, 0x3d, 0x1c, 0xc4, 0x1c, 0xbe, 0x36, 0xdc, 0x09, 0x3e,
- 0x16, 0xa6, 0x1e, 0xbe, 0xe4, 0x9c, 0x19, 0xbf, 0xa3, 0xac, 0x6e, 0x3c,
- 0x91, 0x39, 0xdc, 0xbe, 0x63, 0x6c, 0xef, 0xbd, 0x5c, 0x27, 0xfb, 0xbd,
- 0x8e, 0x6d, 0x58, 0xbe, 0x61, 0xf3, 0xa4, 0xbe, 0xdc, 0x5d, 0x2c, 0x3e,
- 0xb9, 0xcc, 0x91, 0xbc, 0xec, 0x42, 0x9a, 0xbe, 0x51, 0xa9, 0xe8, 0xbd,
- 0x16, 0x36, 0x10, 0x3e, 0xc0, 0xd9, 0x4d, 0x3e, 0x9e, 0xf1, 0x29, 0x3d,
- 0x62, 0xac, 0x31, 0x3e, 0xde, 0xc6, 0x86, 0x3c, 0xf0, 0x9a, 0x17, 0xbe,
- 0x22, 0xcc, 0x64, 0xbe, 0x37, 0x74, 0x92, 0x3d, 0x43, 0xa1, 0x77, 0xbe,
- 0xf8, 0xa7, 0x5c, 0xbe, 0xc4, 0x00, 0xbc, 0xbe, 0xce, 0x13, 0x89, 0x3d,
- 0xb5, 0x26, 0x32, 0x3d, 0xc1, 0x40, 0x1c, 0xbc, 0x46, 0xbc, 0x4b, 0xbe,
- 0x53, 0x9d, 0xee, 0x3a, 0xf6, 0xfe, 0x0b, 0x3e, 0xf3, 0x2f, 0x33, 0xbe,
- 0xd7, 0xa0, 0xd7, 0x3d, 0x4e, 0xb5, 0xf8, 0x3c, 0xad, 0xb5, 0x3e, 0x3d,
- 0x09, 0xc6, 0x93, 0xbe, 0x63, 0xb5, 0x6b, 0xbe, 0x23, 0x4c, 0x1d, 0xbe,
- 0x66, 0x59, 0xc1, 0xbe, 0x8f, 0x09, 0x8a, 0xbd, 0x2f, 0x4a, 0x99, 0x3c,
- 0xfd, 0x3b, 0x5f, 0xbe, 0x4c, 0x56, 0xe1, 0xbd, 0x7f, 0x17, 0x19, 0x3e,
- 0x85, 0xd3, 0x1a, 0x3d, 0xb6, 0x2d, 0x12, 0xbe, 0xea, 0x94, 0x54, 0x3e,
- 0x2b, 0x34, 0x4f, 0xbe, 0xf8, 0xe4, 0x4f, 0xbe, 0x9f, 0x9c, 0x17, 0xbe,
- 0x10, 0x6c, 0x17, 0x3e, 0xd3, 0x55, 0xd4, 0xbe, 0x1a, 0x73, 0x27, 0x3e,
- 0xfe, 0x9c, 0xf8, 0xbd, 0xbd, 0x7d, 0x91, 0xbe, 0x40, 0xbb, 0xdd, 0x3d,
- 0xd7, 0x16, 0x9d, 0x3d, 0x15, 0x91, 0x22, 0xbe, 0xbb, 0x81, 0x25, 0xbe,
- 0x18, 0xb3, 0x12, 0xbd, 0xf4, 0x50, 0xa7, 0xbd, 0x6b, 0xea, 0xae, 0xbd,
- 0x02, 0x18, 0x1c, 0xbe, 0x35, 0x40, 0xd8, 0x3c, 0x3f, 0xa9, 0x91, 0x3d,
- 0x33, 0xb1, 0x89, 0x3e, 0x1e, 0x30, 0x4c, 0x3e, 0x0b, 0x4e, 0xcd, 0xbe,
- 0x1b, 0xd4, 0x04, 0xbe, 0x58, 0xa1, 0xec, 0xbe, 0x57, 0x22, 0x46, 0xbe,
- 0xd5, 0xfc, 0x3a, 0xbe, 0x42, 0x3a, 0x81, 0xbc, 0xf8, 0xc3, 0x03, 0xbe,
- 0x54, 0x6a, 0xcd, 0xbd, 0x10, 0x61, 0xa4, 0xbe, 0x22, 0xb2, 0xcd, 0x3d,
- 0x7c, 0x38, 0x4b, 0xbd, 0x7a, 0xc6, 0x7a, 0xbe, 0x32, 0x0c, 0xab, 0xbd,
- 0xe8, 0x2a, 0x7a, 0xbd, 0x87, 0x57, 0x61, 0xbe, 0x0b, 0x4d, 0xd2, 0xbe,
- 0x93, 0x04, 0x1d, 0xbd, 0xf6, 0x68, 0xa4, 0xbe, 0x63, 0xe1, 0x36, 0xbe,
- 0xca, 0xe8, 0x3a, 0xbe, 0x47, 0xdc, 0xff, 0x3c, 0x29, 0x63, 0x18, 0x3d,
- 0xe8, 0x07, 0x00, 0x3e, 0xaf, 0x7f, 0x8e, 0x3d, 0x0e, 0x47, 0x2e, 0x3e,
- 0x31, 0x93, 0xdd, 0x3d, 0x4a, 0x87, 0x77, 0x3d, 0x2f, 0xd8, 0x1e, 0xbd,
- 0x48, 0x72, 0xdc, 0x3d, 0xc7, 0xd0, 0x0c, 0x3d, 0x26, 0x4a, 0x28, 0xbb,
- 0x8c, 0xd7, 0xad, 0x3d, 0xdf, 0xfc, 0x91, 0xbd, 0xca, 0xf1, 0x7e, 0x3d,
- 0xdb, 0x5b, 0x32, 0xbc, 0xc1, 0x21, 0x04, 0xbe, 0x49, 0x9c, 0x14, 0x3e,
- 0x89, 0xb3, 0xcf, 0xbd, 0x83, 0xa9, 0x0f, 0xbe, 0x72, 0x72, 0xf1, 0xbc,
- 0xe9, 0x5b, 0x83, 0x3d, 0xc4, 0xe8, 0xd2, 0x3c, 0x29, 0x26, 0xb1, 0xbd,
- 0x58, 0x5b, 0xc1, 0xbc, 0xd6, 0x28, 0xa7, 0xbc, 0xcd, 0xd0, 0x3f, 0xbd,
- 0x50, 0xc3, 0xc5, 0xbb, 0x52, 0x36, 0xa6, 0xbd, 0xc4, 0x2f, 0x7a, 0xbd,
- 0xdd, 0x8f, 0xbb, 0xbc, 0x72, 0x45, 0xe6, 0xbd, 0x08, 0xde, 0x81, 0x3d,
- 0x8e, 0x7d, 0x37, 0x3d, 0x2d, 0x60, 0x44, 0x3e, 0xd6, 0xf4, 0x57, 0x3d,
- 0x4d, 0x37, 0x0c, 0x3e, 0xcb, 0xcb, 0x88, 0x3d, 0xf7, 0xe3, 0x69, 0x3e,
- 0xd9, 0xbb, 0x80, 0xbe, 0x52, 0x0c, 0xc7, 0x3d, 0x7b, 0x79, 0xd6, 0x3c,
- 0x41, 0x60, 0xe5, 0x3d, 0xbe, 0xc1, 0xd9, 0x3d, 0x29, 0x78, 0x8f, 0x3d,
- 0xbc, 0x96, 0xfb, 0xbd, 0xa6, 0xf7, 0x2a, 0xbe, 0x89, 0xc4, 0x41, 0x3d,
- 0xfc, 0xd0, 0xf2, 0x3d, 0xd4, 0x56, 0xf4, 0xbc, 0xaa, 0xd5, 0x27, 0x3e,
- 0x20, 0x32, 0x9f, 0x3d, 0x33, 0x98, 0x42, 0x3b, 0xd4, 0x89, 0xfb, 0x3d,
- 0x01, 0xcc, 0x8f, 0x3c, 0xc5, 0x8c, 0x9d, 0xbd, 0xda, 0x8c, 0x40, 0xbd,
- 0x4f, 0xb9, 0x24, 0x3e, 0xaf, 0x25, 0xa7, 0xbd, 0xf8, 0x31, 0x27, 0x3e,
- 0xdb, 0x8d, 0x76, 0xbd, 0x3a, 0x2c, 0x39, 0x3e, 0x50, 0x42, 0x9e, 0x3d,
- 0x0f, 0x0a, 0x29, 0xbe, 0x7d, 0xb7, 0xe5, 0xbd, 0x90, 0x07, 0xb6, 0xbd,
- 0xfb, 0x05, 0x09, 0xbd, 0x39, 0x5b, 0xe1, 0x3d, 0xed, 0xb6, 0xe3, 0xbd,
- 0x2b, 0x9d, 0xc9, 0xbd, 0x88, 0xe1, 0x9d, 0xbd, 0xef, 0x0e, 0xb8, 0x3c,
- 0x68, 0xee, 0x76, 0x3d, 0x43, 0x43, 0x8a, 0xbc, 0xef, 0x58, 0x79, 0xbc,
- 0x91, 0x61, 0x64, 0xbe, 0x79, 0x13, 0x28, 0xbe, 0x05, 0x02, 0x8c, 0xbd,
- 0x6c, 0xae, 0xcc, 0xbd, 0x6e, 0x7c, 0x03, 0xbe, 0x18, 0xb5, 0x08, 0x3e,
- 0x8f, 0xf6, 0x4a, 0xbd, 0x55, 0xdf, 0xba, 0xbd, 0x5f, 0xae, 0xa7, 0xbd,
- 0x1a, 0xc9, 0x9a, 0xbd, 0xa9, 0x78, 0x8b, 0x3d, 0x83, 0x2d, 0x09, 0x3e,
- 0xdd, 0xe0, 0xbc, 0xbd, 0x0d, 0xa8, 0x4f, 0x3e, 0x6d, 0xe4, 0x3e, 0xbe,
- 0x77, 0xd0, 0x7e, 0x3d, 0xf1, 0xc2, 0xb1, 0xbd, 0xfb, 0x6d, 0xe6, 0xbd,
- 0x94, 0xb8, 0x0c, 0xbe, 0x92, 0x57, 0xa6, 0xbd, 0xf8, 0x2c, 0x1a, 0xbd,
- 0x62, 0xe7, 0x1a, 0x3e, 0x71, 0x83, 0x89, 0x3d, 0xc1, 0xac, 0x4d, 0x3d,
- 0xc4, 0x10, 0x80, 0x3c, 0xc4, 0xfe, 0x99, 0xbd, 0x8e, 0xea, 0x0b, 0x3d,
- 0x48, 0xf0, 0x57, 0xbd, 0x8a, 0x11, 0xb3, 0xba, 0xe0, 0x09, 0xe9, 0x3d,
- 0xf2, 0x48, 0x10, 0x3d, 0x51, 0xf4, 0xe2, 0x3d, 0xea, 0x1a, 0xb3, 0x3c,
- 0x2c, 0x13, 0x19, 0xbe, 0x37, 0x2c, 0xc8, 0x3d, 0xa3, 0x5f, 0xab, 0xbd,
- 0x85, 0xe4, 0x25, 0xbe, 0x14, 0x63, 0x9c, 0xbc, 0x8e, 0xcb, 0x69, 0x3d,
- 0x1e, 0x84, 0x83, 0xbd, 0x63, 0x94, 0x19, 0xbe, 0x0e, 0x1d, 0x92, 0xbc,
- 0x45, 0x61, 0x9c, 0x3d, 0xb8, 0x83, 0xe0, 0x3c, 0xed, 0xf4, 0x5f, 0x3d,
- 0x58, 0x67, 0x37, 0x3d, 0x4f, 0xf4, 0x12, 0x3d, 0x6d, 0x2a, 0x09, 0x3c,
- 0x7a, 0x77, 0x0b, 0x3e, 0x3f, 0x7f, 0x06, 0x3e, 0x7c, 0x4f, 0x70, 0xbd,
- 0x50, 0x92, 0x8c, 0xbd, 0x8c, 0xba, 0xa8, 0x3e, 0x9c, 0x4d, 0x2d, 0xbe,
- 0xe4, 0x61, 0xd7, 0x3d, 0xa2, 0x82, 0x29, 0xbe, 0xe9, 0xa1, 0xbb, 0xbd,
- 0x2c, 0x3b, 0xd0, 0x3d, 0x58, 0xae, 0x83, 0xbc, 0x5a, 0xe5, 0xd6, 0x3c,
- 0xee, 0xce, 0x30, 0x3c, 0xc2, 0x28, 0x49, 0xbe, 0x34, 0x40, 0xa5, 0xbd,
- 0x58, 0xbb, 0xe2, 0xbd, 0x57, 0x02, 0x8e, 0xbd, 0x75, 0x99, 0x0c, 0xbe,
- 0xe7, 0x32, 0x11, 0x3e, 0xb1, 0x9a, 0x0d, 0xbe, 0x83, 0xef, 0x1e, 0xbe,
- 0x88, 0x21, 0x70, 0x3d, 0x69, 0x49, 0x75, 0x3d, 0xf2, 0xad, 0xd0, 0x3d,
- 0xd9, 0x5d, 0xd0, 0xbd, 0xb3, 0xc1, 0x94, 0xbd, 0x52, 0xc0, 0x3f, 0x3e,
- 0x09, 0x15, 0x06, 0xbb, 0xbd, 0xfb, 0x88, 0xbc, 0x5a, 0x04, 0xe4, 0xbd,
- 0x57, 0xf1, 0xc1, 0xba, 0x3d, 0x9c, 0x03, 0xbd, 0x98, 0xea, 0x2f, 0x3e,
- 0x8e, 0x21, 0x96, 0xbd, 0x34, 0x7d, 0x3b, 0xbe, 0x8d, 0x5b, 0x03, 0xbe,
- 0x5a, 0x97, 0x1f, 0x3e, 0xa4, 0x4e, 0x6e, 0x3e, 0xb4, 0x11, 0x86, 0xbd,
- 0x23, 0x7e, 0x03, 0x3d, 0x2e, 0xdf, 0x8b, 0x3d, 0xda, 0xe1, 0x99, 0xbe,
- 0x7b, 0xa6, 0x1d, 0xbc, 0x57, 0xf1, 0x9e, 0xbe, 0x6b, 0x5f, 0x34, 0xbe,
- 0x1c, 0x5d, 0x12, 0xbe, 0x1a, 0x97, 0x08, 0x3e, 0x4a, 0x65, 0xa1, 0x3e,
- 0x7a, 0x37, 0x4f, 0x3d, 0x4d, 0x23, 0x22, 0x3d, 0xd7, 0xec, 0xb5, 0xbb,
- 0x6f, 0x50, 0xd1, 0x3d, 0x1e, 0x1a, 0xe1, 0x3d, 0x69, 0xc7, 0x71, 0xbe,
- 0x24, 0xb1, 0x07, 0xbe, 0x04, 0x68, 0xab, 0xbd, 0x45, 0x16, 0x1d, 0x3e,
- 0xbf, 0x4b, 0x89, 0x3b, 0x16, 0x6f, 0x6a, 0xbe, 0x63, 0x70, 0x77, 0xbb,
- 0xef, 0xac, 0xb7, 0x3e, 0xc2, 0xed, 0x83, 0x3e, 0xcf, 0xc7, 0x8a, 0xbd,
- 0x1a, 0x1a, 0x1b, 0xbd, 0xe7, 0x1c, 0x1e, 0x3d, 0x90, 0x16, 0x3f, 0xbe,
- 0x23, 0x56, 0xbf, 0x3e, 0xb8, 0x07, 0x8f, 0x3e, 0x52, 0x08, 0xd8, 0x3c,
- 0x00, 0xc0, 0x20, 0x3e, 0x61, 0x27, 0x3b, 0x3e, 0xb4, 0x7a, 0xfe, 0x3c,
- 0xea, 0x41, 0xb9, 0x3d, 0x23, 0xc4, 0xc6, 0xbd, 0x18, 0x02, 0x1a, 0xbe,
- 0x12, 0xed, 0x04, 0x3f, 0x73, 0x83, 0x6b, 0x3e, 0x6d, 0x36, 0xd0, 0xbd,
- 0x79, 0x12, 0x07, 0xbf, 0x73, 0x79, 0xb7, 0xbe, 0xae, 0x27, 0x95, 0x3e,
- 0xb6, 0x90, 0xdc, 0x3d, 0x54, 0xd4, 0x64, 0x3e, 0xf2, 0x30, 0x4c, 0xbe,
- 0x68, 0xa3, 0x5d, 0x3e, 0x45, 0x87, 0xa1, 0xbe, 0xc3, 0x5d, 0x07, 0xbe,
- 0x1d, 0x03, 0x91, 0xbd, 0xe8, 0x70, 0x07, 0x3e, 0x15, 0x47, 0xf0, 0x3d,
- 0x2a, 0xe1, 0x21, 0x3e, 0x4a, 0x79, 0x1c, 0xbe, 0x26, 0x2f, 0xff, 0xbc,
- 0x13, 0x7b, 0x77, 0x3e, 0x49, 0x1c, 0x0b, 0x3d, 0x59, 0x13, 0xea, 0xbc,
- 0x7a, 0x11, 0x83, 0xbe, 0x53, 0x00, 0x35, 0x3e, 0x9f, 0x4b, 0x76, 0x3d,
- 0xfd, 0x19, 0xcb, 0x3d, 0x57, 0x85, 0x1f, 0xbe, 0xd7, 0x6e, 0x0a, 0xbe,
- 0x80, 0xf6, 0x64, 0xbe, 0x45, 0x7c, 0x04, 0x3e, 0xf3, 0x83, 0x55, 0x3e,
- 0x4d, 0xf4, 0x42, 0x3d, 0x9d, 0x45, 0xc7, 0xbd, 0xc5, 0xa4, 0x96, 0xbe,
- 0x78, 0xcc, 0x45, 0xbe, 0xd6, 0x49, 0xe1, 0x3d, 0xb8, 0xc2, 0x6c, 0xbe,
- 0xce, 0xed, 0x07, 0xbe, 0x55, 0x3b, 0x23, 0xbd, 0x8e, 0x7b, 0xba, 0xbc,
- 0x7c, 0x35, 0x8d, 0xbd, 0x2b, 0x6b, 0x9f, 0xbe, 0x77, 0x7b, 0xe3, 0x3d,
- 0x9d, 0x23, 0xad, 0xbc, 0x99, 0x70, 0xa7, 0x3e, 0x55, 0xc6, 0x25, 0xbf,
- 0x9b, 0x18, 0x94, 0xbd, 0xd1, 0xd9, 0xb3, 0xbe, 0xdd, 0x89, 0xfd, 0x3d,
- 0x4a, 0x2e, 0x10, 0xbe, 0xce, 0x3b, 0x83, 0xbe, 0x48, 0x26, 0x89, 0x3d,
- 0x0c, 0x47, 0x42, 0x3e, 0x73, 0xb7, 0x18, 0xbe, 0x10, 0xbc, 0x85, 0xbd,
- 0x63, 0x61, 0x13, 0xbe, 0xe3, 0x44, 0x00, 0x3c, 0xe4, 0xf4, 0xc4, 0x3c,
- 0x56, 0xf7, 0xe7, 0xbd, 0x37, 0xd2, 0x9f, 0x3d, 0x9d, 0x31, 0x24, 0x3c,
- 0x28, 0xa0, 0xa0, 0x3c, 0x15, 0x6d, 0x0f, 0xbb, 0x1e, 0x56, 0x16, 0x3e,
- 0x9c, 0xb3, 0x69, 0xbe, 0x9e, 0xf9, 0xc6, 0x3d, 0x60, 0x42, 0xca, 0x3e,
- 0x68, 0xa0, 0x70, 0xbd, 0x91, 0x83, 0x0b, 0xbe, 0x68, 0x19, 0x54, 0x3e,
- 0x52, 0xb1, 0x39, 0x3e, 0x4d, 0xd7, 0xe1, 0xbd, 0xcf, 0x5f, 0xdb, 0xbd,
- 0xa4, 0x8a, 0xe2, 0xbc, 0x6e, 0xd6, 0x3b, 0x3e, 0xdc, 0x22, 0xeb, 0xbc,
- 0x16, 0xf8, 0xfe, 0xbd, 0x5f, 0x4c, 0xc4, 0xbd, 0xb9, 0xfa, 0x5c, 0xbe,
- 0xb7, 0x08, 0x67, 0x3e, 0x13, 0xe9, 0x33, 0xbd, 0xb1, 0xaa, 0x1f, 0xbe,
- 0x2a, 0xda, 0x2b, 0xbd, 0xc2, 0x0d, 0x09, 0xbd, 0x1e, 0x40, 0x77, 0xbc,
- 0xd7, 0x4b, 0x19, 0x3e, 0x35, 0x38, 0xfc, 0xbd, 0xce, 0x35, 0x01, 0x3d,
- 0x7c, 0x87, 0xc9, 0xbd, 0x45, 0xf3, 0x96, 0x3e, 0xcf, 0x32, 0xb5, 0x3d,
- 0x41, 0xaf, 0x4e, 0xbd, 0xdd, 0xfb, 0x6f, 0x3d, 0x75, 0x42, 0x5c, 0xbe,
- 0xea, 0xd0, 0x64, 0x3e, 0x8a, 0x3b, 0x2e, 0x3e, 0x81, 0x32, 0xcd, 0x3d,
- 0x76, 0xcd, 0x1d, 0x3e, 0x7d, 0xae, 0x8e, 0x3d, 0xf8, 0xf3, 0x1e, 0xbe,
- 0x9b, 0x1b, 0x29, 0x3e, 0x27, 0xa7, 0x11, 0x3e, 0xe3, 0xc6, 0x0d, 0x3e,
- 0x70, 0xbb, 0x4a, 0x3e, 0x8e, 0xe5, 0x07, 0xbe, 0x2a, 0x65, 0x5e, 0x3d,
- 0x2f, 0x95, 0x2f, 0xbe, 0x8c, 0xfe, 0x37, 0xbb, 0x32, 0xa7, 0xc2, 0x3d,
- 0x30, 0x00, 0xa3, 0x3d, 0xf0, 0xad, 0x51, 0x3e, 0x89, 0x0d, 0x08, 0xbe,
- 0x21, 0xba, 0x1d, 0x3e, 0x60, 0xf6, 0xd9, 0xbb, 0xc6, 0xfc, 0x6e, 0xbe,
- 0x9a, 0xe4, 0xad, 0x3c, 0x1a, 0x7c, 0x12, 0x3e, 0x37, 0x6d, 0xee, 0x3c,
- 0x96, 0xf8, 0x1d, 0xbd, 0x8c, 0x3b, 0x96, 0x3e, 0x43, 0xd5, 0x47, 0x3e,
- 0x6d, 0x36, 0x73, 0x3d, 0xf0, 0x49, 0xed, 0x3d, 0x01, 0x74, 0xd6, 0xbd,
- 0x12, 0x00, 0x74, 0x3e, 0x4e, 0xc9, 0x13, 0xbe, 0x10, 0xb2, 0x0e, 0x3d,
- 0xf5, 0xc0, 0x41, 0xbe, 0xf2, 0xb9, 0x34, 0x3d, 0xe2, 0x6c, 0x1a, 0xbd,
- 0x4a, 0xc9, 0x55, 0x3d, 0x9a, 0x10, 0xe8, 0xbd, 0x13, 0xdf, 0x87, 0xbd,
- 0x2e, 0xd0, 0x6c, 0xbe, 0x21, 0xff, 0xa1, 0xbb, 0xf4, 0xe2, 0xe4, 0xbb,
- 0x78, 0x8d, 0x14, 0x3d, 0x0d, 0x95, 0x8e, 0x3c, 0x5d, 0x2f, 0xa2, 0xba,
- 0xb9, 0x6c, 0x87, 0x3d, 0x62, 0xac, 0xd1, 0x3d, 0x47, 0x0c, 0xae, 0xbd,
- 0x99, 0xea, 0x56, 0x3e, 0x4d, 0x4e, 0x99, 0x3b, 0xbf, 0xa6, 0x42, 0x3e,
- 0x5c, 0x27, 0x64, 0xbd, 0xac, 0x4c, 0x35, 0xbd, 0xad, 0x92, 0xb5, 0x3d,
- 0xac, 0x35, 0x85, 0xba, 0x0e, 0x27, 0x00, 0x3e, 0xdd, 0xdd, 0xf6, 0xbd,
- 0xc8, 0x9e, 0x8f, 0x3c, 0xa2, 0xf9, 0x47, 0xbd, 0x17, 0xa7, 0x99, 0xbe,
- 0xf5, 0xf8, 0x80, 0x3d, 0xa2, 0xbe, 0x3f, 0xbe, 0xf8, 0x25, 0xbf, 0x3d,
- 0x0b, 0x57, 0x3b, 0xbd, 0x01, 0xdb, 0xbf, 0x3d, 0x94, 0x0a, 0x95, 0x3c,
- 0xd6, 0x9e, 0x9e, 0x3d, 0xf9, 0x92, 0x8b, 0xbd, 0xae, 0x78, 0xe4, 0x3a,
- 0x21, 0x10, 0x29, 0xbc, 0xd3, 0x17, 0x3a, 0x3c, 0xd8, 0x2a, 0x69, 0x3d,
- 0xd0, 0x40, 0x22, 0x3e, 0x49, 0x3c, 0xfa, 0x3d, 0xda, 0x2a, 0x34, 0x3e,
- 0x74, 0x56, 0x04, 0x3d, 0xd7, 0xe2, 0x51, 0x3d, 0xc0, 0xd4, 0x3e, 0xbc,
- 0xb8, 0xc6, 0xb4, 0xbd, 0xd7, 0x2c, 0xf5, 0xbc, 0x0f, 0xe4, 0xbf, 0x3d,
- 0xcf, 0x62, 0x1e, 0xbc, 0xe9, 0x08, 0x44, 0x3e, 0x56, 0xe7, 0xb0, 0x3d,
- 0xeb, 0x65, 0x2d, 0x3d, 0xb1, 0x93, 0x13, 0x3e, 0x80, 0x63, 0x3e, 0x3d,
- 0x3c, 0x1d, 0x05, 0xbe, 0x9c, 0x3d, 0x0f, 0x3e, 0x99, 0x0c, 0xd4, 0x3d,
- 0xc0, 0x18, 0x36, 0x3e, 0xf4, 0xbe, 0x3f, 0x3e, 0x37, 0x2d, 0x84, 0x3b,
- 0xfb, 0xc7, 0xc4, 0x3c, 0xde, 0x08, 0x73, 0xbc, 0x98, 0xec, 0x4b, 0x3d,
- 0xd7, 0x1b, 0xa1, 0x3d, 0xbb, 0x4d, 0x31, 0x3d, 0x7b, 0x16, 0xb5, 0x3d,
- 0x92, 0xa5, 0x01, 0xbe, 0xfb, 0xf1, 0x20, 0x3e, 0xbb, 0x40, 0x62, 0xbe,
- 0x04, 0xcd, 0x66, 0xbe, 0x34, 0x6f, 0x8b, 0x3d, 0x03, 0xf8, 0x0e, 0xbe,
- 0x3d, 0x05, 0xdc, 0xbd, 0xa3, 0xd4, 0x48, 0x3e, 0xa1, 0x1a, 0xff, 0x3d,
- 0x7f, 0xe1, 0xf2, 0xbd, 0x84, 0xf8, 0xe8, 0xbc, 0x52, 0x45, 0xec, 0xbc,
- 0x27, 0x85, 0x4c, 0xbd, 0x0a, 0xff, 0xc1, 0xbd, 0x69, 0x29, 0x9c, 0xbc,
- 0x66, 0x09, 0x03, 0xbe, 0xf6, 0x4b, 0xfd, 0x3d, 0x7e, 0xc6, 0x15, 0xbe,
- 0x78, 0x7a, 0x98, 0xbc, 0x94, 0xc0, 0xbb, 0xbd, 0xb4, 0x0c, 0x39, 0x3d,
- 0xd7, 0xe9, 0xcf, 0xbd, 0xab, 0xe7, 0xf6, 0x3c, 0xf5, 0x37, 0x58, 0x3e,
- 0xc1, 0x07, 0x3f, 0xbd, 0x46, 0x8c, 0x03, 0x3e, 0x34, 0x54, 0xd9, 0xbd,
- 0x84, 0x65, 0x30, 0xbe, 0x73, 0xd2, 0xb5, 0xbd, 0xef, 0xb2, 0x6d, 0xbd,
- 0x0d, 0xa3, 0x57, 0xbd, 0xc7, 0x69, 0x18, 0x3e, 0x45, 0x8a, 0x0f, 0xbc,
- 0xe7, 0x28, 0x38, 0x3d, 0x11, 0xa0, 0xbe, 0xbd, 0xfa, 0x9c, 0x80, 0xbd,
- 0x0d, 0x4a, 0xa2, 0xbd, 0x95, 0xb3, 0x23, 0x3c, 0x94, 0xef, 0xb4, 0xbc,
- 0x77, 0x52, 0xae, 0x3d, 0xef, 0x98, 0x2c, 0xbd, 0xfb, 0xc1, 0x95, 0xbd,
- 0x19, 0x51, 0x99, 0x3c, 0x88, 0x71, 0xbe, 0xbc, 0xc1, 0x14, 0xdd, 0xbd,
- 0x17, 0xf8, 0xb4, 0xbd, 0xb0, 0xcb, 0x42, 0xbd, 0x9f, 0x5d, 0xf2, 0xbd,
- 0xd8, 0x95, 0x01, 0xbc, 0x1c, 0xf2, 0x01, 0xba, 0x26, 0x27, 0x60, 0xbe,
- 0x48, 0xcd, 0xaf, 0xbd, 0x12, 0xdb, 0xc4, 0x3d, 0x7b, 0xff, 0xeb, 0xbd,
- 0x5f, 0xba, 0x6e, 0x3e, 0xf8, 0x1d, 0x43, 0xbe, 0xf2, 0x65, 0x24, 0xbe,
- 0x0b, 0xec, 0x35, 0x3e, 0x99, 0xc2, 0x4e, 0xbc, 0xf0, 0x07, 0xb7, 0xbd,
- 0xb0, 0x56, 0x81, 0xbd, 0x56, 0x00, 0x01, 0xbe, 0xfb, 0x77, 0x8b, 0x3d,
- 0x4f, 0x65, 0x96, 0xbd, 0xec, 0x00, 0xb0, 0xbd, 0xca, 0xda, 0x01, 0x3d,
- 0x27, 0x45, 0x85, 0x3e, 0xea, 0x48, 0x5a, 0x3d, 0xd6, 0xbb, 0x09, 0x3e,
- 0x88, 0x7f, 0x84, 0xbd, 0x6d, 0x97, 0x43, 0xbe, 0xc6, 0x89, 0x9a, 0xbd,
- 0xcc, 0x58, 0x52, 0xbd, 0x0e, 0x07, 0xf9, 0x3d, 0x6e, 0x03, 0x3a, 0xbe,
- 0x1b, 0x10, 0x80, 0x3e, 0x7f, 0x8a, 0x1f, 0x3e, 0x67, 0x80, 0xa6, 0x3d,
- 0xe2, 0x6e, 0x19, 0xbd, 0x99, 0x74, 0x07, 0xbe, 0x5d, 0x26, 0x69, 0xbd,
- 0x5d, 0x8d, 0x68, 0xbe, 0x3a, 0x8d, 0xc4, 0xbd, 0x1a, 0xf8, 0xd4, 0x3d,
- 0xdd, 0x84, 0x6a, 0xbd, 0x4a, 0x6b, 0xe5, 0xbd, 0xf2, 0x22, 0x8a, 0x3e,
- 0x14, 0x77, 0xb8, 0xbc, 0x37, 0x66, 0x26, 0xbe, 0x52, 0x92, 0xd5, 0xbc,
- 0xa2, 0xbf, 0xb2, 0x3d, 0xf5, 0x3a, 0xa4, 0x3d, 0x1c, 0x0f, 0xf0, 0x3c,
- 0x69, 0x7a, 0x1e, 0xbe, 0x92, 0xed, 0x81, 0xbd, 0x3b, 0xa9, 0xc4, 0x3d,
- 0xcb, 0x9a, 0x07, 0x3d, 0xac, 0x91, 0xa2, 0xbd, 0xdf, 0x5f, 0x26, 0xbd,
- 0xee, 0xff, 0x2b, 0xbd, 0xf2, 0xbc, 0x54, 0xbb, 0xdb, 0x28, 0x71, 0x3e,
- 0x5f, 0xd7, 0x2b, 0xbe, 0x70, 0x1e, 0x75, 0x3d, 0x10, 0xe4, 0xb5, 0xbd,
- 0xc3, 0xbd, 0xd9, 0x3d, 0xac, 0xc7, 0xca, 0x3e, 0x89, 0x22, 0xba, 0x3d,
- 0xf1, 0xf8, 0x8f, 0x3d, 0x58, 0x65, 0xa8, 0xbd, 0x61, 0x6b, 0x8f, 0xbd,
- 0x78, 0xb5, 0xba, 0x3d, 0xed, 0x61, 0x3d, 0x3d, 0xa7, 0xeb, 0x89, 0x3e,
- 0x2a, 0x30, 0xbe, 0xbd, 0x85, 0xa5, 0xf1, 0x3e, 0xf6, 0x33, 0x17, 0xbd,
- 0xb2, 0xe8, 0xfc, 0xbd, 0x64, 0xec, 0x61, 0x3d, 0x10, 0xe9, 0x4c, 0x3e,
- 0xc4, 0x22, 0xa0, 0xbe, 0x87, 0x6e, 0x6f, 0xbc, 0x0f, 0x6c, 0x1e, 0xbd,
- 0x9f, 0xf5, 0x7c, 0xbe, 0x0f, 0x0b, 0xe3, 0xbd, 0xd8, 0x92, 0x5f, 0xbd,
- 0x3c, 0x86, 0x86, 0x3d, 0x91, 0x12, 0x37, 0x3e, 0xd2, 0x24, 0xd0, 0xbd,
- 0x83, 0xeb, 0xdc, 0x3c, 0x73, 0x6c, 0x70, 0x3d, 0xd9, 0x32, 0x9b, 0xbe,
- 0x78, 0xcd, 0x08, 0xbd, 0x49, 0x61, 0x09, 0xbe, 0xeb, 0x15, 0xfd, 0x3d,
- 0x4a, 0x84, 0x40, 0x3c, 0x00, 0xe2, 0x43, 0xbd, 0xdd, 0x4a, 0x93, 0xbe,
- 0x03, 0xb1, 0x14, 0x3e, 0xbd, 0x5d, 0xf0, 0xbd, 0x3b, 0x71, 0x0c, 0x3e,
- 0xe4, 0xa1, 0xbb, 0x3d, 0x95, 0x5a, 0xaa, 0xbd, 0xc8, 0x50, 0x99, 0x3e,
- 0x83, 0xde, 0x7e, 0xbd, 0x26, 0x75, 0xd6, 0xbe, 0x38, 0x96, 0x9c, 0x3d,
- 0x81, 0x78, 0x00, 0x3e, 0x99, 0x47, 0x2e, 0x3e, 0xfc, 0x5f, 0x7d, 0x3d,
- 0x0d, 0x38, 0x0f, 0xbe, 0x80, 0xcb, 0x19, 0xbe, 0x4c, 0x86, 0x5a, 0xbd,
- 0x33, 0x3f, 0xec, 0xbd, 0x7b, 0xa5, 0x13, 0xbe, 0x8d, 0xda, 0x75, 0xbd,
- 0x1c, 0xf4, 0xef, 0x3d, 0x3e, 0x1c, 0x1d, 0x3d, 0xf7, 0xfc, 0x0f, 0x3e,
- 0x48, 0xd0, 0xa4, 0xbc, 0x8f, 0x32, 0x90, 0xbd, 0xc7, 0x31, 0xc1, 0x3d,
- 0x60, 0xc0, 0x7c, 0x3e, 0x06, 0xda, 0x38, 0x3d, 0xdb, 0x64, 0x30, 0x3e,
- 0x84, 0xc5, 0x23, 0xbe, 0xc9, 0x7b, 0x00, 0x3e, 0xf1, 0xf6, 0xc4, 0xbd,
- 0xb0, 0x63, 0x57, 0xbe, 0xa9, 0x61, 0xb7, 0xbd, 0xd9, 0xa0, 0x11, 0xbe,
- 0x0a, 0x8d, 0x63, 0x3e, 0x08, 0x0f, 0xad, 0xbd, 0x5c, 0x37, 0x31, 0x3e,
- 0x5a, 0xc3, 0x7c, 0x3d, 0x40, 0x44, 0x6c, 0xbb, 0x53, 0xe5, 0x57, 0xbd,
- 0x1e, 0xa7, 0xbb, 0xbe, 0x55, 0xa3, 0x9e, 0x3d, 0x53, 0x37, 0x99, 0x3d,
- 0xb1, 0xcb, 0x10, 0xbe, 0x1b, 0x16, 0x15, 0x3d, 0x36, 0x1d, 0x47, 0x3d,
- 0x24, 0x04, 0x77, 0xbb, 0x5f, 0xb4, 0xa8, 0x3d, 0xc5, 0xb6, 0x6b, 0xbe,
- 0x4f, 0x1c, 0x50, 0xbe, 0xfe, 0x5f, 0x49, 0x3d, 0xb2, 0xa2, 0xe1, 0x3b,
- 0xc2, 0x94, 0x57, 0x3e, 0x84, 0xd5, 0xd8, 0xbd, 0xb4, 0x9d, 0x0b, 0xbd,
- 0xf9, 0xc5, 0x25, 0xbe, 0xc1, 0x9e, 0x88, 0x3e, 0x8d, 0xfe, 0x9b, 0xbe,
- 0x19, 0x40, 0xab, 0x3d, 0x63, 0x38, 0xa3, 0x3b, 0x0f, 0x35, 0x4f, 0x3e,
- 0x28, 0xe7, 0x46, 0xbd, 0x3a, 0xb2, 0x2d, 0xbe, 0xac, 0xd4, 0x59, 0xbc,
- 0x0d, 0x1c, 0xe4, 0xbd, 0x8a, 0x50, 0xff, 0x3d, 0x2c, 0x88, 0x9d, 0x3d,
- 0xc5, 0xcf, 0xa5, 0xbd, 0x33, 0xa6, 0x8f, 0x3e, 0x78, 0x9e, 0x6f, 0x3d,
- 0x97, 0x76, 0xe9, 0xbd, 0x42, 0x76, 0x43, 0xbd, 0xd4, 0xd6, 0x65, 0xbe,
- 0x13, 0x4f, 0x90, 0xbe, 0x03, 0x8f, 0xa7, 0x3d, 0xcb, 0xfd, 0x43, 0x3e,
- 0x45, 0xb3, 0x14, 0xbe, 0xbe, 0x70, 0x25, 0xbe, 0xca, 0x5a, 0x14, 0xbd,
- 0xe6, 0xee, 0x7a, 0x3d, 0xc2, 0x5e, 0x23, 0x3e, 0x46, 0x09, 0xbb, 0xb9,
- 0xf3, 0xb8, 0xa6, 0xbd, 0x53, 0xdd, 0xb3, 0x3d, 0x50, 0xc7, 0x91, 0x3e,
- 0x3a, 0x0a, 0x4d, 0xbe, 0x5c, 0x1d, 0x11, 0xbe, 0x38, 0x88, 0x5a, 0x3c,
- 0xc5, 0x08, 0xd6, 0xbd, 0x86, 0x06, 0xb8, 0xbd, 0x01, 0x6d, 0x44, 0x3d,
- 0x19, 0x7f, 0x2d, 0xbd, 0x63, 0xeb, 0xf2, 0xbd, 0x5e, 0x50, 0xb6, 0xbd,
- 0xe4, 0x6f, 0xc1, 0xb9, 0x1b, 0xa5, 0xdc, 0xbc, 0xd9, 0xe7, 0xa4, 0x3c,
- 0x07, 0xb9, 0x36, 0xbd, 0x4f, 0x16, 0x2d, 0xbe, 0xcb, 0x5f, 0x81, 0xbd,
- 0x9b, 0x1f, 0x02, 0x3d, 0x36, 0x62, 0x06, 0x3e, 0xbd, 0xe8, 0xed, 0xbd,
- 0xa2, 0x89, 0x39, 0x3e, 0x60, 0x68, 0x35, 0xbd, 0xac, 0xb2, 0xf0, 0xbd,
- 0x62, 0x81, 0xd2, 0x3d, 0xda, 0x5b, 0xb5, 0xbd, 0x04, 0x5b, 0xc6, 0xbd,
- 0x8c, 0x42, 0xed, 0xbd, 0xf3, 0xd8, 0xa6, 0x3c, 0xa0, 0x28, 0xa9, 0x3c,
- 0x50, 0x0f, 0xc2, 0xbc, 0x97, 0x13, 0x39, 0x3d, 0x12, 0x97, 0x06, 0x3c,
- 0x17, 0xab, 0xbb, 0x3c, 0x73, 0x31, 0xdc, 0x3b, 0xbd, 0x85, 0x9b, 0x3c,
- 0x15, 0xa4, 0xad, 0x3d, 0xf2, 0xed, 0x58, 0x3d, 0xf9, 0x30, 0xbc, 0xbd,
- 0x07, 0x8d, 0xa2, 0x3d, 0xe8, 0xaa, 0x94, 0xbc, 0xdb, 0x98, 0x1b, 0xbe,
- 0x84, 0xbd, 0x03, 0xbb, 0xcc, 0x45, 0x37, 0xbc, 0x21, 0xbe, 0x01, 0xbe,
- 0xce, 0x17, 0x45, 0x3d, 0x3d, 0x5f, 0xf6, 0x3d, 0x5c, 0x0a, 0xf2, 0xbb,
- 0xd4, 0x7e, 0x23, 0xbe, 0xf1, 0x25, 0x24, 0xbd, 0x33, 0xf8, 0x91, 0x3d,
- 0x96, 0xa1, 0xb4, 0xbb, 0x8d, 0x1e, 0x26, 0xbe, 0xee, 0xfd, 0x95, 0xbd,
- 0x90, 0xb1, 0xda, 0x3d, 0xc3, 0xdf, 0x6a, 0x3d, 0xe4, 0x8d, 0xaa, 0xbc,
- 0xfa, 0xea, 0xc5, 0xbd, 0x63, 0xc3, 0x3f, 0x3d, 0x5c, 0x96, 0xc5, 0x3d,
- 0x89, 0x68, 0xc5, 0xbd, 0xca, 0xac, 0x0d, 0x3d, 0x1a, 0x95, 0x4c, 0xbd,
- 0xe4, 0x14, 0x1d, 0x3d, 0xd9, 0x1f, 0xdd, 0xbd, 0x66, 0x7b, 0x40, 0x3d,
- 0x4c, 0x1c, 0x02, 0x3e, 0x0d, 0xc7, 0x8a, 0x3d, 0x9b, 0x10, 0x8b, 0x3d,
- 0x7c, 0x50, 0x8c, 0x3d, 0x1b, 0x26, 0x0b, 0x3e, 0x47, 0x48, 0x8e, 0x3d,
- 0x8f, 0xc7, 0x09, 0xbe, 0x98, 0xb6, 0x12, 0x3d, 0x55, 0x82, 0xfc, 0x3d,
- 0x50, 0xc1, 0x28, 0x3c, 0xf1, 0x76, 0xab, 0x3d, 0xa2, 0xe2, 0xc0, 0xbd,
- 0x9e, 0xbf, 0xbe, 0xbd, 0xeb, 0x64, 0xfc, 0x3d, 0x12, 0x46, 0x25, 0x3d,
- 0x26, 0xca, 0x77, 0x3c, 0x0c, 0xd4, 0xd2, 0x3d, 0x57, 0xa6, 0xbb, 0x3d,
- 0x4b, 0x8e, 0x8e, 0xbc, 0x92, 0xfb, 0x82, 0x3d, 0x43, 0x1b, 0x0c, 0xbe,
- 0x54, 0xd6, 0xff, 0x3d, 0x89, 0xb7, 0xe6, 0xbd, 0x73, 0x69, 0xda, 0xbd,
- 0xf1, 0xf8, 0x18, 0x3d, 0xc7, 0x26, 0x7d, 0xbd, 0xe6, 0xe4, 0xad, 0xbd,
- 0x20, 0x92, 0xc0, 0x3b, 0x42, 0x71, 0x82, 0x3c, 0x18, 0x30, 0x12, 0xbe,
- 0x49, 0x99, 0xb1, 0xbd, 0xa9, 0x3b, 0x0d, 0x3e, 0xaa, 0x1d, 0x9e, 0x3d,
- 0x53, 0x88, 0xd7, 0x3d, 0x28, 0x95, 0xd3, 0x3c, 0xf9, 0x5c, 0x1a, 0xbe,
- 0xb7, 0x2a, 0x1d, 0x3e, 0xd3, 0xa9, 0x2f, 0x3e, 0x0c, 0x95, 0x25, 0x3e,
- 0xa4, 0x46, 0xfd, 0x3c, 0xaf, 0x9f, 0x1f, 0xbd, 0xc7, 0x0f, 0x2a, 0x3e,
- 0x2e, 0x53, 0x93, 0x3d, 0x66, 0x14, 0x04, 0xbe, 0xf8, 0x6d, 0x72, 0xbd,
- 0xcf, 0x29, 0x79, 0x3d, 0xd6, 0xf8, 0x05, 0xbe, 0xe8, 0x76, 0x37, 0x3d,
- 0x33, 0xe1, 0xb7, 0x3d, 0xd1, 0xbe, 0xe3, 0xbd, 0x59, 0xfc, 0x6f, 0x3c,
- 0x16, 0xe0, 0x0f, 0xbe, 0x07, 0xb3, 0x9f, 0x3c, 0x6c, 0x8a, 0xb6, 0x3d,
- 0x86, 0x81, 0x2f, 0xbd, 0x1f, 0x2e, 0x9b, 0x3c, 0x6d, 0xac, 0x94, 0x3b,
- 0x20, 0x03, 0x8b, 0x3d, 0xe3, 0xea, 0x03, 0xbd, 0x83, 0x82, 0xb9, 0x3c,
- 0x98, 0x86, 0xed, 0x3d, 0x5a, 0xfb, 0x30, 0xbd, 0x47, 0x65, 0x91, 0xbd,
- 0xd6, 0x01, 0xef, 0x3d, 0x15, 0x1c, 0xbc, 0xbd, 0xc2, 0x14, 0x55, 0xbd,
- 0x33, 0x71, 0x76, 0x3d, 0x61, 0x1b, 0x6d, 0x3e, 0xbe, 0x21, 0x4f, 0xbe,
- 0xa1, 0xb2, 0x6d, 0x3e, 0x51, 0xdb, 0x78, 0xbd, 0x6a, 0x79, 0xdf, 0x39,
- 0x60, 0xd6, 0xe5, 0xbb, 0x74, 0x63, 0x22, 0xbd, 0x5b, 0x29, 0x20, 0x3e,
- 0x0a, 0xb0, 0x94, 0x3e, 0x30, 0xeb, 0x4b, 0xbc, 0x4a, 0xb1, 0x2b, 0xbe,
- 0xf1, 0x3e, 0xe5, 0xbd, 0x97, 0x26, 0x99, 0xbd, 0xff, 0x2b, 0x2b, 0x3c,
- 0xbd, 0x8f, 0xba, 0xbe, 0x00, 0x9c, 0xab, 0xbe, 0x13, 0xb9, 0xb8, 0x3d,
- 0xbf, 0x99, 0x12, 0x3e, 0xcb, 0xa6, 0x1f, 0xbd, 0x5d, 0x06, 0x41, 0xbb,
- 0x43, 0x22, 0x7d, 0x3d, 0xa5, 0xba, 0xb9, 0xbe, 0xa5, 0x8a, 0x75, 0xbc,
- 0x20, 0x95, 0xac, 0xbe, 0x5b, 0x85, 0xb2, 0xbd, 0x7f, 0x5a, 0x0b, 0x3e,
- 0xe1, 0xda, 0x76, 0xbd, 0x17, 0x0b, 0x6d, 0xbd, 0xab, 0xe4, 0x9d, 0xbe,
- 0x6e, 0x9f, 0x08, 0x3b, 0x3b, 0xdd, 0xf8, 0xbc, 0xff, 0xf3, 0xb0, 0xbd,
- 0x16, 0x6f, 0x15, 0xbd, 0x4e, 0x7d, 0x2c, 0xbe, 0xe3, 0xf3, 0xaf, 0xbd,
- 0xb2, 0x86, 0x8b, 0xbe, 0x3b, 0xa3, 0x83, 0x3e, 0xb0, 0x1f, 0x52, 0xbe,
- 0xec, 0xb9, 0xaf, 0xbe, 0x09, 0xff, 0x85, 0x3b, 0xd0, 0x7d, 0x01, 0xbf,
- 0x53, 0x66, 0x2f, 0x3e, 0xb5, 0x7a, 0x58, 0xbc, 0x71, 0x68, 0xb5, 0xbd,
- 0x2e, 0x85, 0x9b, 0xbe, 0x07, 0x9d, 0xd9, 0x3a, 0xf7, 0xdb, 0xc4, 0xbd,
- 0x52, 0x91, 0x3f, 0xbd, 0x3b, 0xd7, 0x4a, 0xbe, 0xf3, 0x33, 0x8e, 0xbb,
- 0xee, 0x90, 0xb5, 0x3c, 0x9c, 0x35, 0x9c, 0x3d, 0xde, 0x81, 0xaa, 0x3e,
- 0xf2, 0xd9, 0x55, 0xbe, 0x5a, 0xc0, 0xe3, 0xbe, 0xf4, 0xd2, 0xd2, 0xbd,
- 0x8a, 0x3a, 0xee, 0xbe, 0x8a, 0x12, 0xea, 0xbe, 0xbb, 0x46, 0xb3, 0xbb,
- 0x07, 0x77, 0x0f, 0x3e, 0x06, 0x05, 0x65, 0x3e, 0xc5, 0x12, 0xad, 0xbe,
- 0x21, 0x00, 0x57, 0xbe, 0x6b, 0x7f, 0x95, 0xbd, 0x3e, 0x23, 0x90, 0xbe,
- 0x4d, 0xb2, 0xde, 0x3d, 0xcc, 0xe2, 0x4b, 0xbc, 0x0b, 0xa3, 0xc0, 0x3d,
- 0xcb, 0x4c, 0xea, 0xbe, 0xe6, 0xa8, 0x23, 0xbb, 0x4b, 0xa8, 0xe2, 0xbe,
- 0xc5, 0x11, 0xac, 0xbd, 0xad, 0xa8, 0xf3, 0xbd, 0xac, 0x45, 0x0d, 0xbf,
- 0xe1, 0xa5, 0x03, 0x3d, 0xa5, 0x82, 0x99, 0xbe, 0xc9, 0xa8, 0xaa, 0xbe,
- 0x5e, 0xfc, 0x89, 0xbe, 0x20, 0xd7, 0xcf, 0xba, 0xcb, 0x7d, 0xb0, 0xbc,
- 0x43, 0xda, 0x0d, 0xbe, 0xdb, 0x1f, 0x27, 0x3e, 0xf8, 0xb4, 0xf3, 0xbd,
- 0xee, 0x9b, 0xae, 0x3d, 0x43, 0x7c, 0xfd, 0xbd, 0x8d, 0x17, 0x80, 0xbc,
- 0x63, 0x4e, 0xe1, 0xbe, 0x59, 0xe0, 0xa4, 0xbd, 0x40, 0xbb, 0x8b, 0xbd,
- 0xc8, 0x59, 0xb1, 0x3d, 0xf0, 0x63, 0xf5, 0xbc, 0x54, 0x3f, 0xb6, 0xbe,
- 0x56, 0x34, 0xed, 0xbc, 0x2f, 0x56, 0x8a, 0xbd, 0xa3, 0xaf, 0xfc, 0x3c,
- 0x65, 0xea, 0x5f, 0x3c, 0xe5, 0xd7, 0x1a, 0xbe, 0xe2, 0x14, 0x2b, 0xbe,
- 0x21, 0x71, 0xd1, 0xbd, 0x46, 0x41, 0x36, 0xbe, 0x5e, 0x3c, 0xca, 0xbe,
- 0x46, 0xe6, 0x30, 0xbd, 0x65, 0xbf, 0xd5, 0x3d, 0x22, 0xc0, 0xd1, 0xbd,
- 0x2b, 0x76, 0xc7, 0x3c, 0xc0, 0x62, 0xa9, 0xbe, 0x99, 0xbb, 0xc8, 0xbd,
- 0x59, 0xcf, 0x8f, 0xbd, 0xaa, 0xed, 0x8f, 0xbe, 0x99, 0x78, 0x65, 0xbe,
- 0x37, 0xd2, 0x75, 0xbc, 0xdc, 0x82, 0x2c, 0xbe, 0x11, 0x1f, 0x7d, 0xbc,
- 0x33, 0x8b, 0xa2, 0x3e, 0x0c, 0x99, 0xd8, 0x3c, 0xc6, 0x3f, 0xfb, 0xbd,
- 0x3f, 0x55, 0x72, 0x3d, 0xe8, 0xe7, 0xb2, 0xbd, 0x83, 0xfc, 0x04, 0xbe,
- 0x63, 0x0d, 0x8e, 0x3d, 0x65, 0x92, 0x1d, 0x3d, 0x5c, 0x94, 0x21, 0x3e,
- 0x5b, 0xde, 0x6b, 0xbd, 0x15, 0x82, 0x8f, 0x3d, 0x8b, 0x45, 0x2d, 0xbe,
- 0x2b, 0xf4, 0x11, 0xbc, 0x10, 0x5f, 0x53, 0xbe, 0x94, 0x41, 0xe1, 0xbe,
- 0x59, 0x5a, 0x49, 0x3e, 0xc1, 0xba, 0x50, 0x3d, 0x40, 0xd6, 0xa5, 0x3e,
- 0x54, 0x4c, 0xa3, 0xbe, 0xc7, 0x0c, 0xe4, 0xbd, 0x85, 0xd7, 0xc4, 0xbc,
- 0x3e, 0xa0, 0x41, 0xbe, 0x37, 0xaf, 0xd6, 0x3c, 0x35, 0x64, 0x14, 0x3e,
- 0xc7, 0x01, 0xda, 0xbe, 0x19, 0x98, 0xdf, 0xbe, 0x67, 0x97, 0xe5, 0xbd,
- 0x90, 0x57, 0xc9, 0xbd, 0x59, 0xb6, 0xdc, 0x3d, 0x3e, 0xbd, 0x53, 0x3d,
- 0x04, 0xa1, 0x7f, 0x3c, 0xa9, 0xd9, 0x40, 0xbe, 0x13, 0x81, 0xb8, 0x3d,
- 0x8a, 0x23, 0xb8, 0x3d, 0x05, 0x04, 0x40, 0x3e, 0x3d, 0x7a, 0x4f, 0x3e,
- 0xdf, 0xf7, 0x10, 0x3e, 0x16, 0x54, 0xfb, 0x3d, 0x0a, 0x1e, 0x0a, 0xbe,
- 0x97, 0xd0, 0xb4, 0x3c, 0x3e, 0xc2, 0x9f, 0xbe, 0xed, 0x67, 0x28, 0x3d,
- 0x55, 0x84, 0x1c, 0x3d, 0x03, 0x3b, 0x3d, 0xbe, 0xef, 0x75, 0x27, 0xbe,
- 0x53, 0x64, 0x17, 0xbe, 0x3e, 0xf8, 0xeb, 0xbd, 0x45, 0xc0, 0x9e, 0xbe,
- 0x67, 0xeb, 0x90, 0xbe, 0x70, 0x4c, 0xe8, 0x3d, 0xdb, 0x82, 0xda, 0xbc,
- 0x3b, 0xc1, 0x11, 0x3e, 0xbb, 0xe9, 0xf0, 0xbd, 0xa4, 0xe4, 0xb9, 0xbe,
- 0x4d, 0xc9, 0x00, 0xbd, 0x4e, 0x24, 0x11, 0x3b, 0x94, 0x69, 0x9f, 0xbc,
- 0x9b, 0x90, 0x33, 0x3e, 0x23, 0x5c, 0x88, 0x3d, 0x2f, 0x22, 0x0c, 0x3e,
- 0x55, 0xfd, 0x8c, 0xbd, 0xf6, 0x3b, 0xae, 0x3d, 0xd5, 0x54, 0xc6, 0x3d,
- 0x43, 0x61, 0xe9, 0xbe, 0x8b, 0xb0, 0x74, 0xbe, 0xf7, 0x7f, 0x90, 0xbd,
- 0xfe, 0x64, 0xbf, 0x3c, 0x4b, 0xf7, 0x11, 0xbf, 0xe7, 0x46, 0xd0, 0xbd,
- 0x90, 0xec, 0x57, 0xbe, 0x25, 0xda, 0x40, 0xbe, 0x9f, 0x17, 0xc9, 0xbd,
- 0x44, 0x9c, 0x38, 0x3b, 0x4a, 0x6f, 0x46, 0xbb, 0x7c, 0x63, 0xd1, 0x3d,
- 0x16, 0xa6, 0xfd, 0xbd, 0x84, 0xc7, 0x0b, 0xbe, 0x6e, 0x59, 0x87, 0xbd,
- 0x17, 0xb0, 0x4a, 0xbe, 0xe5, 0x2f, 0x49, 0xbe, 0x5e, 0x53, 0xa0, 0xbe,
- 0xef, 0x3e, 0x93, 0x3e, 0x1b, 0x27, 0x15, 0x3d, 0xa4, 0x57, 0xf9, 0xb9,
- 0xf1, 0x1b, 0x86, 0xbe, 0xd1, 0x98, 0xbf, 0xbc, 0xd6, 0x34, 0x96, 0x3d,
- 0x53, 0xf7, 0xa9, 0xbe, 0x49, 0x05, 0x78, 0xbd, 0x3b, 0x4c, 0x18, 0x3e,
- 0x30, 0xd3, 0x0e, 0x3e, 0xe3, 0x12, 0x40, 0x3e, 0x6a, 0x29, 0xc4, 0xbe,
- 0x8f, 0xce, 0xa8, 0x3d, 0x73, 0xec, 0xa9, 0x3b, 0x22, 0xfc, 0x8c, 0x3e,
- 0xa2, 0x16, 0x9f, 0x3c, 0xa5, 0x3a, 0x6d, 0xbe, 0xd6, 0x69, 0xf1, 0xbe,
- 0x62, 0xf8, 0x37, 0xbc, 0x93, 0x3f, 0x0d, 0xbd, 0x34, 0xd1, 0x93, 0xbe,
- 0xdb, 0xc0, 0x0f, 0x3e, 0xf4, 0x80, 0x4f, 0xbe, 0x1a, 0x5c, 0x00, 0x3e,
- 0x87, 0xf7, 0x3a, 0xbd, 0x62, 0x57, 0x82, 0xbe, 0x6b, 0x1d, 0x66, 0xbd,
- 0xea, 0x74, 0x8a, 0x3d, 0xb0, 0x4d, 0x2f, 0x3e, 0xb7, 0x7e, 0x24, 0xbe,
- 0xc9, 0x24, 0xdb, 0x3c, 0x6c, 0xeb, 0x22, 0xbe, 0x0b, 0xea, 0x33, 0x3c,
- 0x7d, 0x86, 0xa9, 0xbe, 0x5d, 0xd0, 0x2e, 0x3e, 0xfa, 0x80, 0x80, 0x3d,
- 0x37, 0x1b, 0xa1, 0xba, 0xfc, 0x81, 0x58, 0x3d, 0x97, 0xbf, 0x37, 0xbe,
- 0x84, 0x56, 0x62, 0xbe, 0xd4, 0x87, 0xb8, 0x3b, 0x8d, 0x4c, 0x3c, 0x3d,
- 0x37, 0x72, 0x73, 0x3e, 0xc7, 0xb2, 0x4b, 0x3d, 0x80, 0x0c, 0x5d, 0xbe,
- 0xe8, 0x87, 0xde, 0xbe, 0x71, 0x96, 0xf3, 0xbd, 0x69, 0x64, 0x19, 0xbe,
- 0x4d, 0xa1, 0x8b, 0x3d, 0xb0, 0x51, 0xc9, 0xbd, 0xa7, 0xfa, 0x05, 0x3e,
- 0xe4, 0x92, 0x49, 0xbe, 0xcd, 0x00, 0x52, 0xbe, 0xf7, 0xa8, 0x00, 0xbe,
- 0x90, 0x86, 0xaa, 0xbe, 0xdb, 0xf0, 0x28, 0x3d, 0xee, 0xbd, 0x2c, 0x3e,
- 0x4f, 0x6e, 0x25, 0x3e, 0x24, 0xdd, 0x85, 0xbe, 0x0f, 0xf5, 0x53, 0x3d,
- 0x44, 0x81, 0x53, 0xbe, 0x07, 0xe6, 0x5a, 0xbe, 0x3c, 0x61, 0x00, 0x3e,
- 0x68, 0x9a, 0xc4, 0xbe, 0x08, 0xef, 0x1e, 0x3d, 0x22, 0x8a, 0x12, 0xbe,
- 0x7b, 0xb7, 0x62, 0xbb, 0x7a, 0xc1, 0xde, 0xbd, 0x23, 0xcf, 0x78, 0xbe,
- 0x81, 0x5a, 0x42, 0x3e, 0xad, 0x3e, 0xe4, 0x3d, 0x26, 0xcc, 0x8a, 0xbe,
- 0x00, 0xbd, 0x4e, 0xbd, 0x13, 0xf1, 0x0a, 0xbe, 0xcb, 0x3b, 0x85, 0xbd,
- 0x4f, 0xd5, 0x77, 0xbe, 0xd1, 0x75, 0x93, 0xbc, 0x05, 0x2a, 0x24, 0x3e,
- 0x11, 0xad, 0x3e, 0x3d, 0xa8, 0x95, 0xa0, 0x3d, 0x43, 0x21, 0xec, 0x3b,
- 0x5c, 0x01, 0xcc, 0xbb, 0xaa, 0xbd, 0x68, 0xbe, 0xfb, 0x4e, 0x4f, 0xbe,
- 0xd0, 0xb3, 0xc9, 0x3d, 0x5a, 0x53, 0xf1, 0x3d, 0xc1, 0x8e, 0x02, 0xbd,
- 0xbf, 0xc3, 0x02, 0xbe, 0x07, 0xc0, 0x9c, 0xbe, 0xac, 0x68, 0x79, 0xbe,
- 0x0a, 0x43, 0x25, 0xbe, 0xfc, 0xfe, 0xc1, 0xbd, 0x85, 0x8c, 0xff, 0xbe,
- 0xc9, 0x82, 0x64, 0xbd, 0x3c, 0xe4, 0x01, 0xbe, 0x42, 0x09, 0xa3, 0xbe,
- 0x34, 0x69, 0x64, 0x3d, 0xe4, 0x95, 0x78, 0xbe, 0xaa, 0xa7, 0x0e, 0x3d,
- 0x2b, 0x0e, 0xbd, 0x3c, 0xe6, 0xa1, 0xda, 0xbe, 0xbd, 0x8b, 0x00, 0x3e,
- 0x9b, 0x8e, 0x07, 0x3e, 0x5f, 0x4e, 0x38, 0x3e, 0xa1, 0x7a, 0xa4, 0xbe,
- 0xcf, 0x8a, 0x23, 0xbe, 0x48, 0xbc, 0xb9, 0xbe, 0x85, 0x91, 0xee, 0xbd,
- 0xe7, 0xbc, 0x39, 0xbc, 0xbe, 0x24, 0x49, 0xbd, 0x32, 0xd1, 0xbf, 0xbe,
- 0x6b, 0x6b, 0x8d, 0x3d, 0xa0, 0x25, 0x99, 0xbe, 0xbc, 0x25, 0x7a, 0x3e,
- 0xbf, 0x86, 0x84, 0xbd, 0x5b, 0xa3, 0xcb, 0xbe, 0x71, 0x8e, 0x89, 0xbe,
- 0x24, 0x07, 0x9b, 0xbe, 0xc5, 0xe4, 0x3e, 0xbe, 0x30, 0xcf, 0xda, 0xbe,
- 0x67, 0x99, 0x06, 0xbe, 0xb4, 0x2d, 0x82, 0xbd, 0xec, 0x48, 0x8b, 0xbe,
- 0x2f, 0x44, 0xe9, 0xbd, 0xd0, 0x2d, 0x60, 0xbe, 0xd2, 0x7c, 0x2a, 0xbe,
- 0x21, 0x8b, 0xf6, 0xbd, 0x15, 0x73, 0x9d, 0x3d, 0x89, 0x2e, 0x65, 0xbd,
- 0xf6, 0xeb, 0xda, 0x3d, 0x4a, 0x2e, 0xdc, 0xbd, 0xd4, 0xd4, 0xa7, 0xbc,
- 0x9d, 0xb2, 0x1c, 0xbd, 0x78, 0x2d, 0x11, 0x3e, 0x8c, 0x9b, 0x94, 0xbc,
- 0x07, 0x33, 0x61, 0x3e, 0x12, 0x88, 0x77, 0xbd, 0x07, 0xc2, 0x2b, 0xbe,
- 0x05, 0xa1, 0xab, 0xbd, 0xb2, 0xbc, 0x12, 0xbe, 0x2a, 0x67, 0xdc, 0xbe,
- 0x15, 0x33, 0x41, 0xbc, 0x59, 0xbb, 0x3b, 0xbd, 0x0b, 0x79, 0x23, 0xbe,
- 0x33, 0xe0, 0xe9, 0xbd, 0x3a, 0xb0, 0x14, 0x3c, 0x76, 0xac, 0xc7, 0x3d,
- 0xd8, 0x83, 0xd3, 0xbd, 0xc9, 0x4d, 0x30, 0xbe, 0x84, 0x2c, 0x1d, 0xbd,
- 0xcc, 0x64, 0x5a, 0xbe, 0xe6, 0x19, 0xa7, 0xbe, 0x52, 0xeb, 0x82, 0x3b,
- 0xfc, 0x03, 0x46, 0x3e, 0x76, 0x82, 0x4a, 0xbe, 0x03, 0x9f, 0x3d, 0x3e,
- 0x55, 0xdc, 0xa8, 0xbd, 0xf3, 0xa4, 0x08, 0x3d, 0xb6, 0xd9, 0x98, 0xbe,
- 0x89, 0x62, 0xe6, 0xbd, 0x39, 0x1b, 0xfd, 0xbd, 0xa9, 0x6f, 0xf8, 0x3d,
- 0xa3, 0xe1, 0xb8, 0xbd, 0x6d, 0xc2, 0x61, 0xbb, 0x44, 0xd2, 0x9a, 0xbb,
- 0xc2, 0x10, 0xe3, 0xbe, 0xe4, 0x62, 0x65, 0xbe, 0x87, 0xb6, 0x38, 0x3e,
- 0xbb, 0x11, 0x7f, 0xbd, 0xd9, 0xe6, 0x8a, 0xbe, 0xba, 0x33, 0x6d, 0xbe,
- 0x24, 0x06, 0x9e, 0xbd, 0xf2, 0x8c, 0x89, 0x3e, 0x29, 0xfc, 0x76, 0x3d,
- 0x32, 0x20, 0x99, 0xbd, 0x0d, 0x25, 0xbd, 0x3d, 0x2d, 0x40, 0xb8, 0x3d,
- 0xe0, 0x86, 0x99, 0xbd, 0xf7, 0xed, 0x14, 0xbd, 0x03, 0xe7, 0x08, 0xbe,
- 0x59, 0x0f, 0x33, 0xbe, 0x50, 0x21, 0xc2, 0xbe, 0x53, 0xe2, 0x1a, 0x3d,
- 0x2d, 0x21, 0xf4, 0x3c, 0x45, 0x6c, 0xd4, 0x3b, 0x94, 0x80, 0x76, 0xbe,
- 0xa4, 0xb8, 0xa8, 0xbd, 0x98, 0xfb, 0x12, 0xbe, 0x85, 0x93, 0x57, 0xbe,
- 0x85, 0x2c, 0x3f, 0xbe, 0x21, 0x3b, 0xa1, 0xbd, 0x07, 0x05, 0x0f, 0xbc,
- 0xae, 0x53, 0x55, 0x3e, 0x91, 0x14, 0x6f, 0xbe, 0xc8, 0xdf, 0x02, 0xbe,
- 0x9d, 0x0f, 0x8b, 0x3e, 0xdd, 0x77, 0x33, 0x3e, 0xd9, 0x4b, 0x4b, 0x3e,
- 0x3a, 0x2e, 0x41, 0xbe, 0x55, 0x33, 0x32, 0xbd, 0x7a, 0xbf, 0x02, 0x3e,
- 0x6f, 0x63, 0x63, 0xbd, 0xa7, 0x74, 0x37, 0xbc, 0x55, 0x59, 0x21, 0x3e,
- 0x17, 0x57, 0xe6, 0xbd, 0x08, 0xff, 0x13, 0xbe, 0x84, 0x89, 0x57, 0xbc,
- 0xdb, 0x74, 0x02, 0xbe, 0x37, 0xd6, 0x0c, 0xbe, 0xb7, 0x6e, 0x0f, 0x3e,
- 0xc2, 0x3d, 0x54, 0xbe, 0x41, 0xb9, 0x76, 0xbe, 0xfb, 0x3c, 0xe5, 0x3d,
- 0x6e, 0x81, 0x14, 0xbe, 0x10, 0xf8, 0x3f, 0xbd, 0x18, 0x9b, 0xdb, 0x3d,
- 0x59, 0x5d, 0x78, 0xbd, 0x48, 0x4c, 0x95, 0x3c, 0xd2, 0x07, 0xc0, 0x3d,
- 0xe6, 0xee, 0xfa, 0xbd, 0xf3, 0xfa, 0x09, 0x3e, 0xf2, 0x29, 0x8c, 0xbc,
- 0x0e, 0x5c, 0x78, 0x3d, 0x56, 0x6c, 0x63, 0xbd, 0xfa, 0x2d, 0x24, 0xbf,
- 0xd2, 0x75, 0x81, 0xbe, 0x89, 0x66, 0x3c, 0xbb, 0x47, 0xad, 0x2f, 0xbe,
- 0xb3, 0xf6, 0x57, 0x3d, 0xb5, 0x3f, 0xc5, 0x3b, 0xf3, 0x5d, 0x03, 0x3e,
- 0xa4, 0xac, 0xde, 0x3d, 0xc0, 0x57, 0xec, 0x3d, 0xc5, 0x52, 0x6e, 0xbc,
- 0x04, 0x99, 0x2c, 0x3c, 0x80, 0xc6, 0xd9, 0xbe, 0xd1, 0x35, 0x80, 0xbe,
- 0x6d, 0xe5, 0x36, 0xbe, 0xa3, 0x80, 0x07, 0xbd, 0x6b, 0xa0, 0x0f, 0x3e,
- 0x3c, 0xac, 0x07, 0x3e, 0x9d, 0x67, 0x07, 0xbe, 0x8c, 0xda, 0xeb, 0x3d,
- 0xe1, 0x23, 0x2e, 0xbe, 0x25, 0x32, 0x81, 0xbd, 0x6c, 0xdd, 0x01, 0xbf,
- 0xfd, 0x9f, 0xc1, 0xbd, 0xcd, 0xf2, 0xbf, 0x3d, 0x91, 0x39, 0xd3, 0xbd,
- 0x10, 0xbf, 0x5f, 0xbe, 0x4f, 0xcc, 0xf9, 0x3c, 0x8a, 0x82, 0xb4, 0x3c,
- 0x86, 0x8d, 0x23, 0xbd, 0xca, 0x9e, 0x3e, 0xbc, 0x13, 0xbb, 0xc2, 0xbe,
- 0xf5, 0x86, 0xb6, 0x3c, 0xb9, 0xaa, 0x4e, 0xbe, 0x89, 0x86, 0x7d, 0x3e,
- 0xf7, 0xab, 0x45, 0xbe, 0x3e, 0x70, 0xbe, 0x3d, 0xc5, 0x45, 0x08, 0x3e,
- 0xdd, 0x78, 0x92, 0xbe, 0x22, 0x80, 0x2c, 0xbe, 0x7e, 0x46, 0x63, 0xbe,
- 0x1f, 0xa6, 0x11, 0x3e, 0x0f, 0xb2, 0xe6, 0x3d, 0xc9, 0x6b, 0x8a, 0x3d,
- 0xa4, 0x11, 0x1b, 0x3d, 0x5c, 0x5e, 0x06, 0x3d, 0x27, 0xaa, 0x3a, 0xbc,
- 0x59, 0x4a, 0xa0, 0xbb, 0x9f, 0x70, 0xa3, 0xbe, 0x3b, 0xf7, 0x1d, 0x3d,
- 0xe4, 0xca, 0x8d, 0xbd, 0x92, 0x73, 0x5c, 0xbb, 0x77, 0x84, 0xb6, 0xbc,
- 0x22, 0x86, 0xeb, 0xbd, 0x40, 0xad, 0x89, 0x3e, 0x7b, 0xe2, 0x09, 0xbd,
- 0xde, 0x44, 0xf1, 0x3c, 0xd7, 0xd8, 0xc5, 0x3d, 0xb1, 0x52, 0xb9, 0xbc,
- 0x08, 0x9b, 0x5f, 0x3d, 0x78, 0x67, 0xe2, 0xbd, 0x3d, 0x57, 0x83, 0xbe,
- 0x0d, 0xfa, 0x0e, 0x3d, 0xa3, 0x0c, 0xdd, 0xbc, 0xfe, 0xb9, 0x30, 0x3d,
- 0x4a, 0x41, 0x66, 0xbd, 0xc7, 0xd8, 0x98, 0xbe, 0xa8, 0x5b, 0xb7, 0xbd,
- 0x0e, 0x8b, 0x66, 0x3c, 0x16, 0x04, 0x34, 0xbd, 0xdd, 0x15, 0x2d, 0xbc,
- 0xa3, 0xe3, 0x95, 0x3d, 0x4c, 0x25, 0xab, 0x3e, 0x5f, 0x65, 0x79, 0xbe,
- 0xbc, 0xc0, 0x2a, 0x3c, 0x4c, 0x05, 0x70, 0xbd, 0x04, 0x6c, 0x13, 0x3e,
- 0x23, 0x49, 0xeb, 0x3d, 0x48, 0xe9, 0x96, 0x3d, 0x70, 0xae, 0xfd, 0x3d,
- 0x90, 0xa3, 0x6b, 0xbd, 0xb6, 0xe0, 0x3b, 0xbd, 0xa7, 0x8c, 0x36, 0xbe,
- 0x7a, 0x64, 0x47, 0xbe, 0x1c, 0xee, 0xe7, 0xbd, 0xe3, 0x51, 0xcd, 0xbd,
- 0xda, 0x0d, 0xbc, 0x3c, 0xa3, 0x16, 0xe3, 0x3d, 0xd1, 0x2b, 0x4e, 0x3e,
- 0x4c, 0x66, 0x7d, 0xbd, 0x44, 0x5e, 0xfd, 0xbd, 0x54, 0xfe, 0x2b, 0xbd,
- 0x85, 0x7a, 0x0b, 0x3c, 0x34, 0xbb, 0xae, 0xbd, 0xde, 0x0b, 0x76, 0xbd,
- 0xd0, 0x8b, 0x75, 0xbd, 0x95, 0x6e, 0xc9, 0xbd, 0x94, 0xd2, 0xa4, 0xbd,
- 0xec, 0x2e, 0x5a, 0xbd, 0x83, 0x90, 0x24, 0x3e, 0x3a, 0x9f, 0x97, 0x3d,
- 0x6c, 0xd2, 0x5d, 0x3d, 0x0e, 0x41, 0x83, 0xbd, 0xee, 0x90, 0xc8, 0xbc,
- 0xd3, 0xc0, 0x3a, 0x3e, 0x3d, 0xbc, 0xae, 0xbd, 0x30, 0x68, 0xaa, 0x3d,
- 0xbf, 0x2c, 0x72, 0xbe, 0x33, 0xc9, 0x73, 0xbd, 0x0d, 0xba, 0xd9, 0xbd,
- 0x08, 0xeb, 0x85, 0xbd, 0xe7, 0xea, 0x2a, 0xbd, 0xd6, 0xa8, 0xbf, 0xbd,
- 0xbd, 0x1d, 0x7f, 0x3d, 0x9d, 0x13, 0xf6, 0xbc, 0x4a, 0x70, 0x07, 0xbd,
- 0x05, 0xfd, 0x90, 0x3d, 0x07, 0x4e, 0x42, 0x3d, 0xcd, 0x64, 0x2d, 0xbd,
- 0x06, 0x76, 0x60, 0x3e, 0x5a, 0x50, 0x82, 0xbe, 0x85, 0x85, 0x20, 0xbe,
- 0x81, 0x22, 0x70, 0xbd, 0xc2, 0x06, 0x11, 0xbe, 0x48, 0x4a, 0x6a, 0x3d,
- 0xf8, 0xfc, 0x09, 0x3e, 0xc8, 0x42, 0xaa, 0xbd, 0x7d, 0x31, 0xd7, 0x3b,
- 0xa7, 0xd1, 0x90, 0x3c, 0x19, 0xb9, 0x4d, 0x3d, 0x06, 0xd9, 0x26, 0xbe,
- 0xce, 0x45, 0x6b, 0xbd, 0xf2, 0x79, 0xfb, 0xbc, 0xd0, 0x01, 0x31, 0xbd,
- 0x0b, 0x46, 0x9a, 0xbd, 0x40, 0x0c, 0x87, 0xbc, 0x60, 0x75, 0xf5, 0xbc,
- 0x95, 0x38, 0x24, 0xbe, 0x71, 0x64, 0xc1, 0x3d, 0x9d, 0x66, 0x13, 0x3d,
- 0xb6, 0x10, 0x1b, 0x3d, 0x05, 0x23, 0x87, 0x3d, 0xd7, 0x0c, 0xd3, 0x3d,
- 0xb5, 0xee, 0xf2, 0x3d, 0xb3, 0x44, 0x9f, 0xbd, 0xdb, 0x8f, 0x82, 0xbc,
- 0xd8, 0x4c, 0x0e, 0xbe, 0x0c, 0x78, 0xd7, 0xbd, 0xe9, 0x10, 0xfb, 0x3c,
- 0xd7, 0x05, 0xfe, 0xbd, 0x2d, 0xfa, 0x64, 0xbd, 0x33, 0xcc, 0xe2, 0xbd,
- 0x64, 0xb8, 0xc3, 0xbd, 0x52, 0x6a, 0x96, 0xbd, 0x62, 0x0f, 0xe7, 0xbc,
- 0xbc, 0xe7, 0x55, 0xbe, 0xd1, 0x4e, 0xff, 0x3d, 0x0c, 0x41, 0x42, 0x3e,
- 0x6f, 0x8a, 0x35, 0xbd, 0x9f, 0x8e, 0xec, 0x3c, 0xec, 0x35, 0xb4, 0x3c,
- 0x98, 0x04, 0x95, 0x3d, 0xdd, 0x9e, 0xd1, 0xbd, 0x9a, 0x59, 0x11, 0xbe,
- 0x46, 0x94, 0xb1, 0xbd, 0xa7, 0x6e, 0x81, 0xbd, 0x31, 0x54, 0x78, 0xbc,
- 0xe6, 0x75, 0xf3, 0x3d, 0xab, 0x55, 0x3f, 0x3d, 0x9b, 0xad, 0xb3, 0xbc,
- 0xf9, 0x9c, 0x2e, 0x3e, 0x94, 0xb4, 0x8c, 0xbd, 0xdb, 0x22, 0xd3, 0x3d,
- 0x1c, 0x9f, 0xbe, 0x3d, 0x84, 0xe4, 0xb5, 0xbd, 0x59, 0x5e, 0xb6, 0x3c,
- 0x13, 0xbd, 0x08, 0x3c, 0xc4, 0x5f, 0x42, 0x3e, 0xbf, 0xc2, 0x23, 0x3d,
- 0xdb, 0xb4, 0xd2, 0xbd, 0x08, 0x5d, 0xc1, 0xbd, 0xd5, 0xae, 0x1d, 0xbe,
- 0x20, 0x07, 0xb6, 0xbd, 0x4f, 0xc6, 0x0b, 0xbe, 0x7d, 0x10, 0x44, 0x3d,
- 0x4d, 0x2d, 0x75, 0x3d, 0x34, 0x5c, 0x97, 0x3d, 0xd1, 0x0d, 0x29, 0xbe,
- 0x6a, 0xbd, 0x11, 0x3e, 0x88, 0x4d, 0x1e, 0x3e, 0xac, 0xa6, 0xa4, 0xbd,
- 0xff, 0xfd, 0xf4, 0x3a, 0xed, 0x9b, 0x61, 0x3e, 0x49, 0x11, 0x9b, 0xbd,
- 0x30, 0x53, 0xcd, 0x3d, 0xf3, 0x83, 0x03, 0xbe, 0xc0, 0x91, 0xed, 0xbd,
- 0x69, 0x6c, 0xab, 0xbe, 0x0f, 0x3f, 0xd5, 0xbe, 0x4a, 0x76, 0x96, 0xbe,
- 0x97, 0xfd, 0x07, 0xbe, 0x27, 0x93, 0x1c, 0x3d, 0x73, 0xe5, 0x43, 0x3d,
- 0x72, 0xfb, 0x34, 0x3e, 0x10, 0x0c, 0x90, 0xbe, 0xde, 0x28, 0x67, 0x3d,
- 0x0e, 0x59, 0xf3, 0xbd, 0x1f, 0x78, 0xd3, 0xbe, 0xe0, 0xa8, 0x12, 0xbe,
- 0x65, 0x8e, 0x88, 0x3c, 0x81, 0x5b, 0xe0, 0xbe, 0x52, 0x13, 0xf6, 0x3b,
- 0x67, 0x4b, 0xff, 0xbc, 0xe8, 0x3c, 0xf4, 0xbe, 0x14, 0xbe, 0x25, 0xbe,
- 0xe1, 0x8f, 0xef, 0x3e, 0x14, 0xec, 0xc5, 0x3e, 0x29, 0xc1, 0xff, 0xbd,
- 0x5c, 0x13, 0xab, 0x3d, 0x19, 0x7b, 0x43, 0xbe, 0xdf, 0x34, 0xaa, 0xbc,
- 0x00, 0xb3, 0xb2, 0x3d, 0xe3, 0x66, 0x26, 0xbe, 0x04, 0x16, 0xed, 0x3d,
- 0x55, 0x82, 0x02, 0x3d, 0xcb, 0x63, 0x06, 0x3e, 0x2d, 0xfb, 0x2b, 0x3d,
- 0xe7, 0xb6, 0x86, 0x3d, 0x94, 0x09, 0x91, 0x3d, 0x07, 0xd1, 0xa8, 0x3d,
- 0xcf, 0xb2, 0x7f, 0xbe, 0xa1, 0x86, 0x0c, 0x3e, 0x89, 0x8c, 0xad, 0x3d,
- 0xcf, 0xa8, 0x6b, 0x3d, 0x1e, 0x85, 0x82, 0x3e, 0x4d, 0xd9, 0xb2, 0x3d,
- 0xec, 0x9e, 0x47, 0x3e, 0xbc, 0x0b, 0x42, 0xbe, 0x0d, 0x52, 0xf8, 0x3d,
- 0x6a, 0x78, 0x92, 0x3b, 0x71, 0x16, 0xc3, 0x3d, 0x79, 0x98, 0xdb, 0x3d,
- 0x4b, 0x28, 0x00, 0x3e, 0x1f, 0x7a, 0x8d, 0xbd, 0x7c, 0x43, 0x1b, 0xbd,
- 0xb2, 0x3c, 0x2b, 0xbe, 0x9c, 0x2c, 0x96, 0xbe, 0xeb, 0xee, 0x90, 0xbd,
- 0xae, 0x97, 0x0a, 0xbf, 0xdc, 0xbf, 0x13, 0xbf, 0xa3, 0x70, 0x6c, 0xbe,
- 0xbb, 0x88, 0x5a, 0xbc, 0xb0, 0xaa, 0x14, 0x3e, 0xf5, 0xb6, 0x0e, 0x3e,
- 0xa3, 0x26, 0x5c, 0xbe, 0xdf, 0xc5, 0x8d, 0xbd, 0xab, 0x9b, 0xac, 0xbc,
- 0x24, 0x45, 0x86, 0xbe, 0x29, 0x67, 0xb8, 0xbe, 0x01, 0xe2, 0x45, 0xbe,
- 0xa3, 0x36, 0x6a, 0x3d, 0x9d, 0x3b, 0xdf, 0x3d, 0x55, 0x51, 0x11, 0x3d,
- 0xdb, 0x47, 0xa8, 0xbe, 0xe1, 0xb4, 0xf4, 0xbe, 0x83, 0xd6, 0x13, 0xbe,
- 0xc5, 0x5f, 0xa0, 0xbd, 0xf9, 0x72, 0x84, 0xbd, 0x07, 0xc3, 0x31, 0x3d,
- 0x0d, 0xd0, 0x62, 0xbc, 0x5c, 0xec, 0x02, 0x3d, 0xa9, 0xfb, 0x0b, 0x3e,
- 0x27, 0x2d, 0x1c, 0x3e, 0x1d, 0x18, 0x61, 0xbe, 0xb6, 0xf0, 0x52, 0x3e,
- 0x98, 0x86, 0x77, 0xbc, 0x75, 0xc8, 0x9c, 0x3d, 0xf4, 0x0b, 0x85, 0xbd,
- 0x27, 0xd0, 0x13, 0xbe, 0xde, 0x37, 0x85, 0x3e, 0xb5, 0x08, 0x3b, 0xbe,
- 0x68, 0x27, 0x4b, 0x3b, 0x37, 0xb5, 0xa9, 0xbc, 0x8d, 0x1f, 0x91, 0xbe,
- 0x77, 0xea, 0xa9, 0xbe, 0x91, 0x6d, 0x8c, 0xbe, 0x74, 0x8c, 0x92, 0xbd,
- 0x61, 0x75, 0x2c, 0xbe, 0x0d, 0x1e, 0x3f, 0x3c, 0x1e, 0xbc, 0x1f, 0xbe,
- 0x51, 0x39, 0x38, 0x3e, 0x71, 0x42, 0x56, 0x3c, 0xe0, 0xbd, 0x4a, 0xbe,
- 0xff, 0xa1, 0x74, 0x3e, 0x09, 0xfd, 0xc3, 0xbe, 0x2b, 0xb4, 0x14, 0xbe,
- 0x94, 0x33, 0xf5, 0xbc, 0x7b, 0x7e, 0x8d, 0xbe, 0x67, 0xd8, 0x93, 0xbd,
- 0x71, 0x0b, 0xb9, 0x3d, 0xda, 0x3d, 0x43, 0xbd, 0x08, 0x50, 0x47, 0xbb,
- 0x8c, 0xf2, 0x82, 0xbe, 0xb3, 0xa8, 0xc2, 0xbd, 0xa2, 0xc4, 0x35, 0x3d,
- 0xd2, 0x77, 0xa9, 0x3d, 0x7c, 0xcf, 0x86, 0xbd, 0x0f, 0x92, 0x87, 0xbe,
- 0xd0, 0x74, 0xc6, 0xbd, 0x8b, 0xfa, 0x3e, 0xbe, 0x0f, 0x96, 0x44, 0x3d,
- 0x21, 0x58, 0x32, 0xbd, 0x79, 0x5f, 0x8b, 0xbe, 0xb1, 0xa6, 0x0b, 0x3e,
- 0x5c, 0x3e, 0x9f, 0xbe, 0xf0, 0x75, 0x7f, 0x3e, 0x25, 0xdb, 0x06, 0xbe,
- 0xf9, 0x45, 0x44, 0x3c, 0xc9, 0xe8, 0x89, 0xbe, 0x33, 0xff, 0x51, 0x3e,
- 0x7f, 0xfb, 0xff, 0xbd, 0xfd, 0xf5, 0x09, 0x3e, 0x28, 0xbf, 0x31, 0xbc,
- 0x45, 0xe3, 0xcd, 0xbe, 0xb8, 0x9d, 0x67, 0xbe, 0x63, 0xd6, 0x59, 0x3c,
- 0xcd, 0xff, 0xc6, 0x3e, 0x4d, 0x32, 0x9c, 0xbe, 0x95, 0x00, 0x85, 0xbd,
- 0xaf, 0xe8, 0x91, 0xbd, 0x29, 0xb0, 0x59, 0xbe, 0x86, 0x69, 0x95, 0xbc,
- 0x7a, 0xfe, 0x52, 0x3e, 0xd5, 0xf4, 0x72, 0x3e, 0xcc, 0x97, 0xdd, 0xbe,
- 0x6a, 0x21, 0x3e, 0x3e, 0x75, 0xfd, 0xad, 0xbe, 0x8b, 0xf2, 0xf6, 0x3d,
- 0xc2, 0xac, 0x15, 0xbe, 0x87, 0x21, 0xcd, 0x3e, 0x39, 0xe6, 0xfc, 0xbc,
- 0x48, 0xea, 0x57, 0x3e, 0x76, 0x70, 0x14, 0x3e, 0xe4, 0xc5, 0xeb, 0xbe,
- 0xd9, 0x4a, 0xc6, 0xbd, 0x54, 0x8a, 0xc9, 0x3e, 0xa9, 0x2a, 0xc8, 0x3e,
- 0x24, 0x81, 0x8c, 0x3e, 0x29, 0xbd, 0x63, 0x3e, 0xdb, 0xfe, 0x04, 0xbe,
- 0x09, 0xba, 0x26, 0xbe, 0x9d, 0x50, 0xe0, 0x3d, 0xdf, 0x51, 0xe4, 0xbe,
- 0xe1, 0x91, 0x12, 0x3c, 0x91, 0x1d, 0xbb, 0x3e, 0x33, 0xcf, 0x23, 0xbd,
- 0xb6, 0x1e, 0x1c, 0xbe, 0xc5, 0x03, 0x1f, 0xbe, 0x8f, 0x28, 0x0d, 0xbe,
- 0x22, 0x16, 0x63, 0x3d, 0x71, 0xae, 0x11, 0x3e, 0x07, 0xb3, 0x7a, 0xbe,
- 0x6e, 0x0f, 0x4b, 0x3d, 0x7c, 0x86, 0x0d, 0xbe, 0x68, 0x76, 0x37, 0x3e,
- 0xee, 0x97, 0xd2, 0x3e, 0x42, 0xb4, 0x86, 0xbe, 0x5c, 0xda, 0xa7, 0x3c,
- 0x27, 0x05, 0xbc, 0x3d, 0xc1, 0x4d, 0x90, 0x3e, 0x36, 0x0b, 0x6a, 0x3d,
- 0x81, 0x3e, 0x9e, 0x3d, 0x1f, 0x49, 0x58, 0xbf, 0x51, 0xb4, 0x5a, 0x3e,
- 0x60, 0x23, 0xcd, 0xbd, 0x53, 0xc3, 0xa9, 0x3e, 0x6e, 0x6c, 0x67, 0xbd,
- 0x44, 0x30, 0xdf, 0xbb, 0x58, 0x52, 0x67, 0xbd, 0xcd, 0xab, 0x41, 0xbe,
- 0x00, 0x22, 0x4b, 0x3e, 0xb5, 0x3b, 0x95, 0x3e, 0xd1, 0x7c, 0xa2, 0x3d,
- 0xa9, 0x92, 0x70, 0x3c, 0x18, 0x37, 0x48, 0xbc, 0xb8, 0x5d, 0x2c, 0xbe,
- 0x9e, 0x3e, 0xe0, 0xbd, 0x74, 0x00, 0x00, 0x3d, 0x56, 0x54, 0x9c, 0x3e,
- 0xf4, 0xcf, 0x50, 0xbf, 0xf5, 0xaa, 0xdb, 0x3c, 0xf8, 0x82, 0x2f, 0xbf,
- 0xe7, 0x4b, 0x09, 0x3d, 0xc7, 0x80, 0x5a, 0xbe, 0xd8, 0xd3, 0xd6, 0xbe,
- 0xda, 0x9b, 0xd6, 0xbd, 0x46, 0x1c, 0x35, 0x3e, 0x6c, 0x79, 0xc8, 0x3e,
- 0xcc, 0xc6, 0x9f, 0xbd, 0x84, 0x86, 0x97, 0x3d, 0xef, 0x36, 0x1e, 0xbf,
- 0x3f, 0x66, 0x68, 0x3e, 0x3f, 0xec, 0xd0, 0xbc, 0xc1, 0x9f, 0x3d, 0x3e,
- 0xdb, 0xe5, 0x47, 0xbe, 0xfd, 0xbd, 0x0d, 0x3c, 0x22, 0x24, 0xac, 0xbe,
- 0xb6, 0x52, 0xe9, 0xbe, 0x61, 0x4e, 0x56, 0xbd, 0x7e, 0x69, 0xc7, 0xbe,
- 0x93, 0xb2, 0xdf, 0x3c, 0x6e, 0x20, 0x31, 0xbe, 0xa7, 0x45, 0x81, 0xbe,
- 0x05, 0x46, 0xe3, 0xbe, 0xa5, 0xed, 0x69, 0xbe, 0x55, 0x33, 0xd2, 0x3d,
- 0x55, 0xb9, 0x41, 0xbd, 0x2c, 0x1c, 0xd6, 0x3c, 0x77, 0x1d, 0xe7, 0xbd,
- 0x79, 0xc1, 0x87, 0x3e, 0x62, 0x5b, 0xb4, 0xbe, 0xfa, 0x7d, 0x1e, 0xbe,
- 0x54, 0x00, 0xa8, 0xbd, 0x3a, 0xda, 0x0e, 0x3e, 0x6c, 0xcb, 0x1d, 0x3e,
- 0xd6, 0x79, 0x11, 0xbf, 0xb5, 0x65, 0xa9, 0xbe, 0x4c, 0x50, 0x88, 0xbe,
- 0x11, 0xde, 0x58, 0xbd, 0xba, 0xef, 0x49, 0xbe, 0xf3, 0x18, 0xb9, 0x3d,
- 0x52, 0x9b, 0x1e, 0xbe, 0x8c, 0xb1, 0xe8, 0xbd, 0xdf, 0x88, 0x8f, 0xbd,
- 0x3c, 0x00, 0xa7, 0xbd, 0x74, 0x9e, 0x97, 0xbe, 0xd0, 0x6f, 0x66, 0x3d,
- 0x7c, 0x41, 0x12, 0xbd, 0x1b, 0xe6, 0x58, 0x3e, 0xc4, 0x08, 0x39, 0xbe,
- 0x5e, 0x1f, 0x06, 0xbe, 0x04, 0xb9, 0x53, 0xbe, 0xef, 0x91, 0x31, 0x3d,
- 0x27, 0xd9, 0x80, 0x3c, 0xf8, 0xd3, 0xc7, 0x3e, 0x6d, 0x91, 0x54, 0xbd,
- 0xa5, 0xeb, 0x2e, 0x3e, 0x1c, 0x19, 0x56, 0xbe, 0x78, 0xd0, 0xb4, 0x3c,
- 0xd1, 0x75, 0x2d, 0xbb, 0x97, 0x29, 0x8e, 0x3e, 0x07, 0x72, 0xed, 0x3e,
- 0x84, 0xd4, 0x52, 0x3e, 0x0b, 0x7d, 0x9d, 0xbe, 0x84, 0xc2, 0x89, 0x3c,
- 0x21, 0x8a, 0x03, 0xbe, 0x60, 0x80, 0xc9, 0x3d, 0xb6, 0x59, 0x91, 0x3e,
- 0xf5, 0x69, 0xb4, 0x3c, 0x7c, 0xb1, 0x1c, 0xbf, 0x43, 0x6a, 0x36, 0x3d,
- 0x1c, 0x9e, 0xd5, 0xbd, 0x2a, 0x41, 0xb6, 0x3d, 0xe7, 0xf0, 0x45, 0xbb,
- 0x1f, 0xa4, 0xa4, 0x3b, 0xd7, 0xcf, 0xe0, 0x3c, 0x9f, 0x20, 0xf9, 0x3c,
- 0x3d, 0x84, 0xaa, 0x3e, 0x5f, 0xd4, 0xe2, 0xbd, 0xa7, 0x98, 0x30, 0xbe,
- 0xd5, 0x0b, 0x56, 0x3e, 0x76, 0x84, 0xcf, 0x3d, 0x1b, 0x7b, 0x31, 0x3d,
- 0x2d, 0xa4, 0x1d, 0x3e, 0x52, 0xa8, 0xb8, 0x3d, 0x27, 0x0f, 0xff, 0xbd,
- 0xf2, 0x50, 0x23, 0x3e, 0x5b, 0x86, 0xa8, 0xbe, 0x2a, 0x51, 0x86, 0xbe,
- 0xb0, 0xe1, 0x81, 0x3e, 0x18, 0x55, 0xfd, 0x3d, 0xb6, 0xa3, 0xe5, 0x3d,
- 0x1c, 0xcc, 0xb2, 0x3d, 0x1c, 0x42, 0x3a, 0x3e, 0x52, 0xbc, 0xf7, 0xbd,
- 0x56, 0x5c, 0xc8, 0x3c, 0x7d, 0x98, 0x0b, 0xbe, 0x7c, 0xcf, 0x38, 0xbe,
- 0xc5, 0x59, 0x70, 0xbd, 0x69, 0x54, 0x7a, 0xbe, 0x9a, 0x62, 0xc7, 0xbe,
- 0x6d, 0x2d, 0x1f, 0xbd, 0x37, 0x64, 0xa3, 0x3e, 0x15, 0x74, 0xcf, 0xbd,
- 0x68, 0x54, 0x31, 0xbb, 0x19, 0xc1, 0x7f, 0xbe, 0x62, 0x8b, 0xf1, 0xbe,
- 0xf2, 0x79, 0xab, 0x3b, 0x50, 0x76, 0x33, 0x3d, 0x3f, 0x7f, 0x0b, 0xbd,
- 0xe2, 0xc1, 0x33, 0x3d, 0xe6, 0x00, 0xcf, 0x3d, 0x00, 0x2f, 0x65, 0x3d,
- 0x63, 0x0a, 0x5f, 0xbd, 0x22, 0xca, 0xf0, 0xbc, 0xf2, 0x88, 0x0c, 0x3e,
- 0x7f, 0xee, 0xcd, 0x3d, 0x54, 0x5b, 0x8a, 0x3e, 0x5e, 0xad, 0xa2, 0x3c,
- 0x61, 0x03, 0x15, 0xbc, 0x9f, 0x47, 0x36, 0x3e, 0x14, 0x1d, 0x52, 0x3e,
- 0x2a, 0xa2, 0x98, 0x3d, 0xb3, 0x2c, 0xcf, 0xbd, 0x6c, 0xec, 0x2b, 0x3e,
- 0xd7, 0x56, 0x8c, 0xbd, 0x30, 0x66, 0x7f, 0xbe, 0x22, 0x5d, 0x83, 0xbe,
- 0xf4, 0x79, 0xef, 0xbe, 0x8a, 0x91, 0xa6, 0x3e, 0x22, 0x79, 0x0b, 0xbe,
- 0xf4, 0x82, 0x71, 0xbd, 0x64, 0x54, 0x03, 0xbe, 0x25, 0x8c, 0x06, 0xbe,
- 0x73, 0x3d, 0x02, 0x3e, 0x06, 0x1c, 0x73, 0x3d, 0xdd, 0x04, 0xa7, 0x3e,
- 0x9e, 0xcd, 0x53, 0x3e, 0xb9, 0x3c, 0x4a, 0x3e, 0x64, 0x4c, 0x56, 0xbe,
- 0x26, 0x2b, 0xd7, 0xbe, 0xcd, 0xe0, 0x02, 0x3e, 0x47, 0xe6, 0x88, 0xbe,
- 0xbe, 0x47, 0x70, 0x3e, 0x21, 0x75, 0xf0, 0x3c, 0x71, 0x19, 0x77, 0xbd,
- 0x81, 0x31, 0x67, 0xbc, 0x64, 0x92, 0x3b, 0x3d, 0xd6, 0x9f, 0x4c, 0x3d,
- 0xb1, 0xdf, 0xb5, 0x3d, 0x26, 0x2e, 0x14, 0xbe, 0xe1, 0x88, 0x21, 0x3d,
- 0xf3, 0x17, 0xe8, 0xba, 0xa0, 0xe2, 0x32, 0x3e, 0x0c, 0x2d, 0xe7, 0x3d,
- 0xa0, 0xf6, 0x94, 0xbd, 0x9a, 0x37, 0xd6, 0x3d, 0x12, 0x79, 0x72, 0x3e,
- 0x65, 0xd8, 0x37, 0x3d, 0x1d, 0xf7, 0x97, 0x3e, 0xe8, 0xf7, 0x4f, 0x3e,
- 0x40, 0x15, 0xbc, 0x3d, 0xa1, 0x70, 0xb3, 0xbd, 0xc6, 0x2b, 0x88, 0xbd,
- 0x0b, 0x71, 0x10, 0xbe, 0x57, 0xaa, 0x2d, 0xbe, 0xc7, 0xcc, 0x0a, 0x3c,
- 0x3b, 0x7c, 0x42, 0xbe, 0x26, 0xe3, 0x9b, 0x3e, 0x16, 0x50, 0xfd, 0x3d,
- 0x31, 0xd6, 0x54, 0xbd, 0x9a, 0x4e, 0x55, 0xbd, 0x78, 0x0a, 0xda, 0xbd,
- 0x0a, 0xba, 0x43, 0xbd, 0x02, 0x85, 0xcd, 0xbe, 0x76, 0xc1, 0x99, 0xbd,
- 0xc3, 0xb0, 0x6b, 0xbe, 0x2e, 0x2c, 0x47, 0x3d, 0x25, 0x65, 0xc0, 0x3d,
- 0x32, 0xa0, 0x19, 0x3d, 0x20, 0xbc, 0x16, 0xbc, 0x2a, 0xba, 0xd6, 0x3d,
- 0xde, 0xff, 0x02, 0xbe, 0xab, 0xf8, 0xfb, 0x3d, 0x9e, 0xba, 0xfb, 0xbd,
- 0x01, 0x1b, 0x13, 0xbe, 0x26, 0xc4, 0x19, 0x3e, 0x88, 0x31, 0x45, 0x3c,
- 0x2e, 0x2a, 0x64, 0x3d, 0xfc, 0xce, 0x7b, 0x3e, 0x46, 0x85, 0xef, 0x3d,
- 0xdf, 0x81, 0xdf, 0xbd, 0xff, 0x5c, 0x34, 0xbe, 0x4e, 0x35, 0xe7, 0xbd,
- 0xde, 0x04, 0x78, 0x3d, 0x74, 0xe3, 0xea, 0x3d, 0x9a, 0x06, 0xd5, 0x3d,
- 0xc5, 0x49, 0xe2, 0x3d, 0xde, 0xe0, 0x58, 0xbd, 0xd0, 0x91, 0x0e, 0x3d,
- 0x06, 0xd4, 0x8e, 0xbe, 0x38, 0x6b, 0x1e, 0x3e, 0x80, 0xef, 0x87, 0x3d,
- 0x0c, 0x46, 0x05, 0xbe, 0xc9, 0xde, 0xb9, 0xbd, 0xc2, 0x4c, 0xd2, 0x3d,
- 0xbc, 0x98, 0xfd, 0x3d, 0x67, 0x17, 0x0a, 0xbe, 0x64, 0xb2, 0x2d, 0x3e,
- 0xc6, 0xdc, 0xa1, 0x3c, 0x95, 0xa6, 0xb4, 0x3d, 0xd0, 0x0d, 0xd3, 0x3b,
- 0x3e, 0xea, 0x18, 0xbd, 0xcf, 0xfa, 0xed, 0x3c, 0x57, 0x66, 0xc8, 0xbd,
- 0x8d, 0x9d, 0x4d, 0x3b, 0x20, 0x70, 0xe6, 0xbc, 0x49, 0x62, 0x4c, 0x3d,
- 0x87, 0x5e, 0xae, 0xbd, 0x67, 0xf8, 0x61, 0x3d, 0xf5, 0xdf, 0xe1, 0x3d,
- 0x79, 0x5f, 0x4d, 0xbd, 0x63, 0xcc, 0xef, 0xbd, 0x8d, 0xa6, 0x16, 0xbd,
- 0x21, 0x6e, 0x38, 0x3d, 0x04, 0xc0, 0xaa, 0xbd, 0xf9, 0x48, 0x15, 0x3d,
- 0x8f, 0x1d, 0xbc, 0x3d, 0x7b, 0x9c, 0x5f, 0xbe, 0x4a, 0x8e, 0x19, 0x3d,
- 0x8d, 0x69, 0xb2, 0x3c, 0xa6, 0xce, 0xe4, 0x3c, 0xb7, 0x08, 0x01, 0xbe,
- 0x8b, 0xb1, 0x1d, 0x3e, 0x0a, 0x09, 0x21, 0xbd, 0x04, 0xe5, 0xd5, 0xbd,
- 0xa5, 0xc1, 0x63, 0xbe, 0x27, 0xea, 0x7c, 0xbd, 0x77, 0x22, 0x47, 0x3e,
- 0xb2, 0xc4, 0x76, 0xbe, 0xfa, 0x52, 0x10, 0x3d, 0x94, 0x80, 0x66, 0xba,
- 0xa8, 0xe7, 0x73, 0xbe, 0x67, 0x56, 0xff, 0x3c, 0x47, 0x59, 0x9c, 0x3d,
- 0xe5, 0x2f, 0x6f, 0xbd, 0xf1, 0x6e, 0xe4, 0xbd, 0x9f, 0x20, 0x76, 0xbc,
- 0xed, 0x41, 0x3d, 0xbd, 0xb2, 0xcf, 0xb6, 0xbd, 0xf3, 0xf8, 0xea, 0x3b,
- 0x9d, 0xa1, 0xbe, 0x3c, 0x55, 0xf8, 0x72, 0x3c, 0x2d, 0x7a, 0xe6, 0x3c,
- 0x46, 0x77, 0x1d, 0xbe, 0x08, 0x90, 0x8f, 0xbd, 0x4e, 0x54, 0x87, 0xbd,
- 0x54, 0x05, 0x84, 0x3e, 0xf8, 0x34, 0xf1, 0xbc, 0xc9, 0x73, 0x79, 0x3d,
- 0xe3, 0x2b, 0x8a, 0x3d, 0xe5, 0xae, 0x73, 0x3d, 0x98, 0xea, 0xd1, 0x3c,
- 0x81, 0xc6, 0x68, 0xbd, 0x2e, 0x50, 0x4c, 0x3d, 0x72, 0xc3, 0x0b, 0x3d,
- 0xa6, 0x0e, 0x2b, 0xbe, 0x63, 0x5d, 0xc3, 0x3c, 0x46, 0xcb, 0x13, 0x3d,
- 0xd5, 0xe2, 0xbf, 0xbd, 0x7b, 0x5b, 0xf0, 0xbc, 0xf9, 0xe0, 0x12, 0x3c,
- 0x7a, 0x33, 0xeb, 0x3d, 0x8f, 0x69, 0x36, 0x3d, 0x0f, 0xca, 0x94, 0xbd,
- 0xf8, 0xd6, 0xe1, 0x3d, 0x59, 0x94, 0xe4, 0xbd, 0x84, 0xf3, 0xb1, 0xbd,
- 0xef, 0x80, 0x29, 0xbd, 0xa8, 0xeb, 0x38, 0x3e, 0x27, 0x47, 0xeb, 0x3d,
- 0xc0, 0x79, 0x14, 0xbe, 0xec, 0x94, 0x04, 0x3e, 0x56, 0xaa, 0x82, 0xbd,
- 0x1c, 0xdf, 0x85, 0xbb, 0xe6, 0x5e, 0x44, 0xbc, 0xa7, 0x06, 0x10, 0x3d,
- 0x5b, 0x69, 0x0a, 0x3e, 0xd2, 0xe3, 0x15, 0xbe, 0x79, 0x00, 0xfa, 0x3d,
- 0xbd, 0xac, 0x9d, 0xbc, 0x6e, 0x4f, 0x4f, 0x3d, 0x59, 0x11, 0xb7, 0x3b,
- 0x71, 0x73, 0x7f, 0x3d, 0x76, 0xf8, 0x48, 0xba, 0xec, 0xcd, 0x4d, 0xbe,
- 0xa7, 0x9f, 0xdb, 0xbd, 0xd6, 0xc0, 0xf2, 0xbc, 0xa9, 0x51, 0x1d, 0x3e,
- 0x51, 0x07, 0xf6, 0x3d, 0xd1, 0x9d, 0xb3, 0x3c, 0xaa, 0x0b, 0x84, 0x3d,
- 0x72, 0x45, 0x82, 0xbe, 0xe5, 0xf2, 0xe2, 0x3d, 0x51, 0x8d, 0x1c, 0x3e,
- 0x4b, 0x4e, 0x09, 0xbe, 0x40, 0xe8, 0x48, 0xbe, 0x17, 0xb4, 0x77, 0x3d,
- 0x1a, 0xfa, 0x9a, 0xbd, 0xb4, 0x86, 0x59, 0x3e, 0xf7, 0xa9, 0xa4, 0x3c,
- 0xaa, 0xe8, 0xc4, 0xbe, 0xcf, 0xa9, 0xaa, 0xbd, 0x55, 0x3a, 0xb6, 0x3e,
- 0xdc, 0xe4, 0x81, 0x3b, 0x22, 0x69, 0x1a, 0xbe, 0x04, 0x10, 0xd5, 0x3c,
- 0x37, 0xb5, 0xc3, 0x3d, 0xdc, 0xcc, 0x49, 0xbe, 0x9a, 0x2d, 0x64, 0xbd,
- 0x9f, 0xce, 0xd4, 0xbe, 0x7d, 0x64, 0xa3, 0x3e, 0xa5, 0x9e, 0x07, 0xbe,
- 0x01, 0xf9, 0x43, 0x3e, 0xd8, 0x81, 0xff, 0x3d, 0xf2, 0x17, 0xe3, 0x3c,
- 0x53, 0x39, 0x58, 0x3e, 0xac, 0x73, 0x39, 0xbe, 0xb1, 0x42, 0xbd, 0xbd,
- 0x9c, 0x9c, 0x87, 0x3c, 0x0b, 0xe4, 0x37, 0xbd, 0xde, 0xb1, 0xa6, 0x3c,
- 0x46, 0x37, 0x87, 0xbd, 0xa5, 0x38, 0x79, 0xbd, 0x3f, 0x85, 0x99, 0x3d,
- 0x2d, 0x5f, 0x8c, 0xbe, 0x1c, 0x38, 0x06, 0xbe, 0x9d, 0xb1, 0x43, 0x3e,
- 0x13, 0x44, 0xb2, 0xbd, 0x6e, 0xda, 0xee, 0xbd, 0x61, 0xe7, 0xc5, 0xbd,
- 0xec, 0x15, 0xe2, 0xbd, 0x74, 0x16, 0x55, 0xbd, 0xe7, 0x14, 0x57, 0x3d,
- 0x4a, 0x22, 0xaa, 0xbe, 0x3b, 0x21, 0x08, 0x3f, 0x47, 0xe8, 0x49, 0x3d,
- 0xc4, 0xb0, 0x7e, 0x3e, 0x17, 0x9f, 0xa1, 0xbe, 0x91, 0x4c, 0xd4, 0x3e,
- 0xac, 0x42, 0x1b, 0xbe, 0x35, 0x32, 0xc2, 0xbe, 0xa7, 0x6d, 0xac, 0x3e,
- 0xad, 0x23, 0x14, 0x3c, 0x94, 0xe5, 0x27, 0xbe, 0x95, 0xfd, 0xe8, 0xbc,
- 0xce, 0x4c, 0x99, 0xbe, 0x59, 0x16, 0xcb, 0xbc, 0xa7, 0x9b, 0x2b, 0xbc,
- 0x27, 0x7c, 0x70, 0x3e, 0x02, 0x19, 0x01, 0x3d, 0x75, 0x95, 0xc1, 0x3d,
- 0x08, 0xfb, 0x96, 0x3d, 0x63, 0x39, 0xa6, 0xbe, 0x19, 0x88, 0x83, 0xbd,
- 0x7e, 0xde, 0xa3, 0x3b, 0x1a, 0x3f, 0x73, 0xbd, 0x4f, 0xee, 0xa7, 0x3a,
- 0x6c, 0x58, 0xb5, 0x3e, 0xbc, 0x0d, 0x1e, 0x3e, 0xe1, 0xa0, 0x51, 0xbc,
- 0xea, 0xd2, 0x3c, 0xbe, 0xe0, 0x6a, 0x38, 0xbe, 0x00, 0x17, 0xcd, 0xbe,
- 0xb6, 0x99, 0xb6, 0x3d, 0x49, 0x7c, 0x18, 0x3d, 0xf6, 0x23, 0x0c, 0xbe,
- 0x64, 0x52, 0xdb, 0x3d, 0x36, 0x40, 0x3b, 0x3e, 0xef, 0x9b, 0xba, 0xbd,
- 0xab, 0xe1, 0x20, 0x3c, 0x46, 0xcd, 0xf5, 0xbd, 0x52, 0xf3, 0x0b, 0x3e,
- 0x6a, 0xfa, 0x16, 0xbe, 0x22, 0x49, 0x72, 0xbd, 0x6f, 0x65, 0x8b, 0x3e,
- 0x1b, 0xaf, 0xe1, 0x3c, 0xc9, 0x99, 0x2a, 0xbd, 0x49, 0xec, 0xa0, 0x3d,
- 0xd9, 0x06, 0x49, 0xbe, 0x58, 0xca, 0xbe, 0x3d, 0xd6, 0x87, 0xdd, 0x3d,
- 0x65, 0x94, 0xfe, 0xbd, 0xb8, 0xda, 0x42, 0x3d, 0x00, 0xb4, 0x10, 0x3e,
- 0xd5, 0x46, 0xd3, 0x3d, 0x96, 0xeb, 0x5b, 0x3d, 0x02, 0x41, 0xb6, 0xbb,
- 0x1b, 0x5b, 0x79, 0x3d, 0x80, 0x3f, 0xe8, 0x3e, 0x93, 0x87, 0x87, 0xbd,
- 0xc0, 0xe0, 0xdb, 0xbe, 0x91, 0xc0, 0xae, 0xbd, 0xe5, 0xf9, 0xc1, 0xbe,
- 0xc8, 0x36, 0x15, 0xbd, 0xe8, 0x40, 0x04, 0x3e, 0x79, 0x39, 0x90, 0x3e,
- 0xa6, 0x38, 0xee, 0x3d, 0xdb, 0x53, 0x4b, 0x3c, 0x60, 0x76, 0x51, 0x3c,
- 0x2d, 0xfc, 0xb2, 0xbd, 0xa6, 0x46, 0xd0, 0x3d, 0xfa, 0xd0, 0x0f, 0xbe,
- 0xae, 0x8e, 0xe7, 0xbd, 0x91, 0x83, 0xde, 0x3c, 0xc0, 0x01, 0x2c, 0xbe,
- 0x5a, 0xb0, 0x3d, 0x3d, 0xb8, 0x08, 0x00, 0xbc, 0xef, 0x84, 0x14, 0x3d,
- 0x63, 0x1a, 0xee, 0x3d, 0xc9, 0xed, 0x36, 0x3e, 0x88, 0x1f, 0x12, 0x3d,
- 0xd9, 0xc6, 0xb0, 0xbd, 0x9d, 0x93, 0x98, 0x3c, 0x1f, 0xba, 0x18, 0xbe,
- 0x60, 0xbc, 0x7a, 0x3e, 0xc8, 0x5b, 0xed, 0xbd, 0x24, 0x9e, 0xd3, 0xbe,
- 0xb6, 0x2f, 0x27, 0x3e, 0x61, 0xa7, 0x1e, 0x3d, 0xdb, 0xa1, 0x72, 0xbd,
- 0x23, 0xd0, 0x29, 0xbf, 0x85, 0x32, 0xdc, 0xbe, 0xfe, 0x6f, 0x9f, 0xbc,
- 0x1f, 0xf8, 0x34, 0xbf, 0x78, 0x23, 0xa4, 0x3e, 0x3f, 0x38, 0x29, 0xbe,
- 0x58, 0x0d, 0x83, 0xbe, 0xc2, 0x5a, 0x2c, 0xbd, 0x9d, 0x55, 0x4a, 0xbe,
- 0x02, 0xc8, 0x16, 0x3e, 0x9d, 0x6d, 0x6e, 0x3e, 0x32, 0x5e, 0x41, 0xbd,
- 0x0d, 0x3c, 0xb0, 0x3e, 0x6b, 0xec, 0xf5, 0x3d, 0xd3, 0x90, 0xd5, 0xbe,
- 0x81, 0x32, 0x16, 0x3d, 0x29, 0x86, 0x2e, 0x3e, 0x91, 0x74, 0x03, 0x3e,
- 0x92, 0x61, 0x9e, 0x3e, 0xf5, 0xfa, 0xd0, 0x3e, 0xd9, 0x57, 0x71, 0xbe,
- 0x7a, 0xd6, 0xfe, 0xbc, 0x77, 0xad, 0x81, 0x3c, 0xff, 0x80, 0x5a, 0x3e,
- 0x86, 0x14, 0x59, 0x3d, 0x3e, 0x17, 0x91, 0xbd, 0xd5, 0x21, 0xdb, 0xbe,
- 0x05, 0x88, 0xb7, 0x3d, 0xd5, 0x43, 0x9e, 0xbe, 0x75, 0x56, 0x78, 0xbe,
- 0x5f, 0xff, 0x84, 0xbe, 0xd6, 0xc4, 0xe9, 0x3d, 0x3a, 0x6b, 0x88, 0x3e,
- 0x6f, 0x87, 0x07, 0xbd, 0xa3, 0xec, 0x33, 0x3d, 0xe1, 0xcb, 0x86, 0xbe,
- 0xed, 0x4d, 0x19, 0xbe, 0x42, 0x6b, 0x33, 0xbd, 0x2f, 0xac, 0xc0, 0xbd,
- 0xb2, 0x9b, 0xb4, 0x3d, 0xe3, 0xe5, 0x0f, 0x3d, 0x5e, 0x11, 0x96, 0x3e,
- 0xd9, 0x1d, 0x92, 0xbe, 0xed, 0xd5, 0xdd, 0xbe, 0x2a, 0x2d, 0xca, 0x3c,
- 0xa3, 0x7a, 0x77, 0xbe, 0x43, 0x6c, 0x7d, 0x3d, 0x87, 0x3e, 0xd4, 0xbe,
- 0x06, 0x1d, 0xe6, 0x3d, 0x8b, 0xaa, 0x3a, 0xbf, 0xaf, 0x66, 0x7b, 0x3d,
- 0x32, 0x23, 0xff, 0x3d, 0xf2, 0x36, 0xec, 0xbe, 0xc1, 0xf7, 0xdf, 0xbc,
- 0x5e, 0xa9, 0xf3, 0x3d, 0xd9, 0x03, 0xba, 0x3d, 0x32, 0x65, 0xb5, 0xbe,
- 0xee, 0x63, 0x55, 0xbd, 0xfe, 0x0a, 0xd3, 0xbe, 0x87, 0x01, 0x68, 0x3e,
- 0x91, 0x77, 0x5e, 0x3d, 0xbe, 0x0e, 0xce, 0xbc, 0xc3, 0xd7, 0x02, 0xbe,
- 0x16, 0x70, 0x3b, 0x3c, 0x80, 0xf0, 0x53, 0xbe, 0x2b, 0xcc, 0x98, 0x3e,
- 0x33, 0x98, 0xb6, 0x3e, 0x94, 0xa1, 0x74, 0xbe, 0xc3, 0x5a, 0xa1, 0x3d,
- 0x12, 0x23, 0x03, 0xbe, 0x32, 0x19, 0x6d, 0x3b, 0xdd, 0xfa, 0xdd, 0x3d,
- 0xc5, 0x95, 0xa2, 0x3c, 0x50, 0x6d, 0x45, 0x3e, 0x8a, 0x83, 0x25, 0xbe,
- 0xe0, 0x39, 0x7d, 0xbc, 0xee, 0xaf, 0x5d, 0xbd, 0x55, 0x62, 0xf7, 0xbd,
- 0xa5, 0x86, 0x84, 0x3e, 0x05, 0x95, 0x35, 0xbd, 0x37, 0xc5, 0x9b, 0xbe,
- 0xb0, 0x32, 0xb0, 0xbd, 0x49, 0x7d, 0xe6, 0x3d, 0x56, 0x0b, 0xe3, 0xbe,
- 0xfc, 0xb5, 0xd1, 0x3d, 0x80, 0x12, 0x89, 0xbd, 0xd4, 0x3a, 0x78, 0xbe,
- 0x02, 0x56, 0x5b, 0xbd, 0xab, 0x7b, 0x87, 0xbe, 0xf7, 0x63, 0x8e, 0xbc,
- 0x6b, 0xc8, 0x24, 0xbe, 0xca, 0x13, 0xbe, 0x3d, 0xe7, 0xf1, 0xf0, 0xbb,
- 0xa2, 0xe2, 0x62, 0xbe, 0xff, 0x85, 0x4f, 0xbe, 0x90, 0x9f, 0x35, 0xbe,
- 0xbf, 0xbd, 0xda, 0xbd, 0x95, 0x3a, 0xf2, 0x3d, 0xa7, 0x07, 0x08, 0xbd,
- 0x15, 0xbb, 0x8b, 0x3d, 0x4a, 0x2d, 0x13, 0xbe, 0xb7, 0xbf, 0x86, 0xbe,
- 0x93, 0xc4, 0xf2, 0x3c, 0x50, 0x33, 0x07, 0x3d, 0xe1, 0x10, 0x01, 0xbe,
- 0x0b, 0x51, 0x89, 0x3e, 0x11, 0xa1, 0x4f, 0x3e, 0x4c, 0xb6, 0x0c, 0xbe,
- 0xdd, 0x86, 0x7f, 0xbe, 0xc7, 0x41, 0x41, 0xbd, 0xac, 0x7b, 0xab, 0x3d,
- 0x55, 0x7c, 0x89, 0x3d, 0xa3, 0x4a, 0xa2, 0xbe, 0x40, 0xc6, 0xee, 0x3e,
+ 0x56, 0xc2, 0x27, 0x3d, 0xd5, 0x4b, 0x75, 0x3d, 0x2d, 0xf2, 0x5a, 0xbd,
+ 0x4b, 0x02, 0x5a, 0x3c, 0x87, 0x49, 0x13, 0x3e, 0xa7, 0x1c, 0x50, 0x3d,
+ 0x6b, 0xb3, 0x71, 0x3c, 0xfd, 0x68, 0x01, 0xbe, 0x7c, 0x12, 0xf3, 0x3d,
+ 0x30, 0x8f, 0x3c, 0x3e, 0x12, 0x53, 0xba, 0x3d, 0x2b, 0xe3, 0x16, 0xbe,
+ 0x18, 0x28, 0xff, 0x3d, 0xa9, 0x3f, 0x49, 0xbe, 0x61, 0xdb, 0xb8, 0x3d,
+ 0xdd, 0x0a, 0x63, 0x3d, 0xe6, 0x65, 0x18, 0xbe, 0x3c, 0xfb, 0xa0, 0xbc,
+ 0x65, 0x2a, 0x5d, 0xbd, 0x66, 0xe7, 0x7a, 0x3c, 0x61, 0x3c, 0x7f, 0xbe,
+ 0x2c, 0x39, 0x58, 0x3e, 0x09, 0x7a, 0x91, 0x3d, 0xbb, 0xc7, 0x40, 0x3d,
+ 0x69, 0x84, 0xb1, 0xbd, 0x34, 0x69, 0x67, 0xbd, 0x64, 0xfe, 0xf9, 0x3d,
+ 0x53, 0x17, 0x21, 0xbe, 0xe9, 0x05, 0x1d, 0x3d, 0x4f, 0xc8, 0xbe, 0x3d,
+ 0x2e, 0x13, 0x0e, 0xbd, 0x9b, 0xa5, 0xd6, 0x3d, 0x10, 0xe6, 0xa8, 0xbc,
+ 0x3f, 0xaf, 0x4e, 0x3c, 0x7e, 0x36, 0x15, 0x3e, 0x42, 0x32, 0x52, 0xbd,
+ 0x83, 0xdb, 0xee, 0x3c, 0xa3, 0x3c, 0x2d, 0x3d, 0x3e, 0xbf, 0x31, 0xbd,
+ 0xbe, 0x7a, 0x54, 0x3e, 0xa4, 0xfc, 0x5a, 0xbd, 0xc5, 0x05, 0x16, 0xbe,
+ 0x76, 0x86, 0x99, 0xbe, 0x1a, 0xe0, 0xc1, 0xbc, 0x30, 0xb0, 0x5b, 0x3d,
+ 0x3f, 0x47, 0x91, 0x3d, 0xb5, 0x8e, 0xb1, 0x3c, 0x1c, 0xed, 0xde, 0xbd,
+ 0x8c, 0xc9, 0xa4, 0xbd, 0x2b, 0xb0, 0xcb, 0x3b, 0x54, 0x28, 0xbe, 0xbd,
+ 0x88, 0x70, 0xc2, 0x3d, 0x22, 0x60, 0x32, 0x3e, 0x8c, 0xde, 0x20, 0xbd,
+ 0x4e, 0x23, 0x38, 0x3d, 0x68, 0x78, 0x13, 0xbe, 0xc8, 0x31, 0xb3, 0x3d,
+ 0x31, 0x2f, 0x29, 0xbd, 0xf5, 0x1c, 0x0b, 0xbe, 0xea, 0x65, 0x88, 0xbd,
+ 0xa3, 0x3c, 0x49, 0xbd, 0x18, 0x2f, 0x4e, 0xbd, 0x01, 0x2b, 0x44, 0xbe,
+ 0x57, 0x7b, 0x9b, 0xbc, 0xfd, 0x09, 0x9e, 0xbd, 0x62, 0x26, 0x20, 0x3d,
+ 0x24, 0x93, 0x2b, 0x3e, 0xe9, 0xb0, 0x92, 0x3d, 0x2a, 0x26, 0xdf, 0x3d,
+ 0xa9, 0x62, 0xa6, 0x3d, 0x4c, 0xda, 0xa2, 0xbd, 0x41, 0x17, 0x1b, 0xbd,
+ 0x34, 0x11, 0x47, 0x3e, 0xf7, 0xeb, 0xea, 0xbd, 0xef, 0x54, 0xc6, 0xbd,
+ 0x7c, 0xdd, 0xf8, 0x3d, 0x5f, 0x40, 0x5c, 0xbe, 0x1b, 0x23, 0xde, 0xbd,
+ 0xfe, 0x02, 0xf5, 0x3d, 0xe6, 0x50, 0xbd, 0x3d, 0x7e, 0x11, 0x85, 0x3d,
+ 0xa6, 0x10, 0x9c, 0xbd, 0x48, 0x06, 0x59, 0xbd, 0x58, 0x28, 0x64, 0xbe,
+ 0xc6, 0x0f, 0xf7, 0x3d, 0xe4, 0x1d, 0x0c, 0xbe, 0x34, 0xee, 0x5a, 0xbe,
+ 0x2e, 0x8f, 0xe2, 0x3d, 0x82, 0xea, 0x15, 0x3e, 0xd5, 0xd8, 0xcf, 0xbc,
+ 0x4e, 0x9c, 0x81, 0xbb, 0x64, 0xaf, 0xc4, 0x3e, 0x31, 0x0c, 0x81, 0x3d,
+ 0xba, 0xa6, 0x82, 0xbd, 0x2f, 0xe8, 0x12, 0xbc, 0xfc, 0xb4, 0x9d, 0xbe,
+ 0xd0, 0xc1, 0x47, 0xbc, 0x1b, 0x4d, 0x35, 0x3d, 0x9e, 0xde, 0x64, 0xbe,
+ 0x28, 0x7c, 0x02, 0xbd, 0x15, 0x05, 0xfb, 0x3c, 0xf3, 0x3a, 0x8c, 0xbd,
+ 0x15, 0x8d, 0xb6, 0xbd, 0x67, 0xa1, 0x2b, 0xbc, 0x18, 0x6b, 0xfe, 0x3d,
+ 0xba, 0xa6, 0x8f, 0x3c, 0x91, 0x19, 0x48, 0x3e, 0x35, 0x33, 0x33, 0xbe,
+ 0x7b, 0x03, 0x41, 0x3e, 0xe3, 0xf0, 0x6e, 0xbd, 0x04, 0x1d, 0x95, 0xbd,
+ 0x0f, 0x49, 0x92, 0x3b, 0x48, 0x7e, 0x58, 0xbd, 0xd5, 0xf9, 0x05, 0xbd,
+ 0x45, 0xa1, 0x37, 0x3e, 0x89, 0xa7, 0x25, 0xbd, 0x62, 0xa2, 0x3b, 0x3d,
+ 0x97, 0xab, 0x75, 0x3d, 0x9c, 0xfe, 0x35, 0xbe, 0xc5, 0x58, 0xd9, 0x3d,
+ 0x53, 0x79, 0x2c, 0xbe, 0x24, 0x19, 0x99, 0x3d, 0xae, 0xe5, 0x00, 0x3c,
+ 0xd7, 0x3f, 0x56, 0xbe, 0x2d, 0x61, 0xec, 0xbd, 0x99, 0x34, 0x7e, 0x3d,
+ 0x40, 0xef, 0xee, 0xbc, 0x1e, 0x52, 0xa0, 0xbb, 0x6d, 0xfb, 0x01, 0x3e,
+ 0x18, 0xfd, 0x12, 0xbe, 0xbe, 0x1c, 0x00, 0xbe, 0x96, 0xd8, 0xb4, 0xbd,
+ 0xac, 0xe8, 0x1d, 0xbe, 0x7a, 0xb1, 0x0c, 0xbe, 0x36, 0x80, 0x4c, 0xbe,
+ 0xb3, 0xf9, 0x89, 0xbe, 0xcc, 0x53, 0xbb, 0xbc, 0xbe, 0x4c, 0xc7, 0x3d,
+ 0x74, 0x49, 0xf0, 0xbc, 0xd9, 0x68, 0x4a, 0xbe, 0x79, 0xa7, 0x91, 0x3d,
+ 0x79, 0xcb, 0x4d, 0xbd, 0x31, 0x5c, 0x11, 0xbd, 0x75, 0xd5, 0x4e, 0xbd,
+ 0x6e, 0x60, 0x40, 0x3d, 0xec, 0x96, 0xf9, 0xbc, 0x87, 0x14, 0xf2, 0xbd,
+ 0x04, 0x99, 0xcf, 0x3d, 0x3a, 0x66, 0xd9, 0xbc, 0x5a, 0xb6, 0x8b, 0x3e,
+ 0xce, 0xa3, 0x62, 0x3e, 0xe2, 0x65, 0x2f, 0xbd, 0x7e, 0x4e, 0x0b, 0xbe,
+ 0x2e, 0x88, 0xd1, 0xbd, 0x73, 0x91, 0xd1, 0xbd, 0xfe, 0x0c, 0xa8, 0x3d,
+ 0xad, 0xbe, 0xd4, 0x3d, 0x55, 0xab, 0x96, 0xbb, 0x74, 0x17, 0xa9, 0xbd,
+ 0xb6, 0x47, 0x94, 0xbd, 0xce, 0xc3, 0xc1, 0x3d, 0x50, 0x7a, 0x00, 0x3e,
+ 0x53, 0xbd, 0xaa, 0x3d, 0xbf, 0x76, 0x0e, 0x3e, 0xba, 0xb5, 0x80, 0x3e,
+ 0xfb, 0x3f, 0xaf, 0x3d, 0x1c, 0x6e, 0xef, 0xbc, 0xa8, 0x36, 0x08, 0x3e,
+ 0x85, 0x0a, 0x2c, 0x3e, 0xa8, 0xbe, 0x7f, 0xbd, 0xc3, 0xd9, 0xba, 0xbe,
+ 0xd0, 0xc0, 0xef, 0x3d, 0xf8, 0x76, 0x3e, 0xbd, 0x27, 0xe6, 0x22, 0x3d,
+ 0xd2, 0xe0, 0x27, 0x3e, 0x69, 0xd6, 0xa7, 0xbd, 0x16, 0x1e, 0x3f, 0xbe,
+ 0x3e, 0xcc, 0xe0, 0xbd, 0xf5, 0x14, 0xec, 0x3d, 0xdb, 0xa2, 0x1e, 0xbd,
+ 0x27, 0x1d, 0x33, 0xbe, 0x04, 0x10, 0x69, 0x3c, 0xa0, 0x5a, 0x36, 0x3d,
+ 0x83, 0xe5, 0x9f, 0x3e, 0x53, 0x04, 0x0a, 0x3d, 0xc5, 0x41, 0xa7, 0xbd,
+ 0xbc, 0xc9, 0x78, 0xbd, 0x1e, 0x6d, 0x18, 0x3d, 0x20, 0xfb, 0x20, 0x3d,
+ 0x52, 0xc8, 0x7a, 0xbe, 0x55, 0x5e, 0xf2, 0xbd, 0x7e, 0xa7, 0x03, 0xbd,
+ 0x7d, 0x37, 0xee, 0x3b, 0x42, 0x4f, 0xa7, 0x3c, 0x78, 0x6d, 0x03, 0x3e,
+ 0x22, 0xa0, 0x20, 0x3e, 0x35, 0xa2, 0x5a, 0xbe, 0xdc, 0x47, 0x2c, 0x3e,
+ 0x6c, 0xb2, 0xcd, 0xbd, 0xf8, 0x40, 0x74, 0xbe, 0x18, 0xb6, 0x7e, 0xbd,
+ 0x39, 0xc1, 0x6e, 0xbc, 0x1c, 0x43, 0x12, 0x3e, 0x9f, 0xc8, 0x8b, 0x3d,
+ 0x72, 0x26, 0x64, 0x3e, 0xdf, 0xf6, 0x93, 0x3e, 0xb7, 0xf1, 0x59, 0xbd,
+ 0x11, 0x09, 0x59, 0x3d, 0x28, 0x08, 0xa7, 0xbb, 0xe7, 0x89, 0xf7, 0x3d,
+ 0x2b, 0x35, 0x81, 0x3e, 0xb9, 0x3e, 0x88, 0x3d, 0xf3, 0x9c, 0xaa, 0xbd,
+ 0x2e, 0xd3, 0x5c, 0x3e, 0x5f, 0xe1, 0x6f, 0x3d, 0x98, 0x02, 0xdd, 0x3d,
+ 0x9b, 0x1c, 0xcb, 0x3d, 0xd2, 0x9a, 0x18, 0x3e, 0xed, 0x86, 0x65, 0xbc,
+ 0x01, 0xc8, 0x64, 0x3d, 0x86, 0x5a, 0x1d, 0xbe, 0x75, 0x3a, 0x26, 0xbd,
+ 0x9b, 0xf0, 0xf9, 0x3d, 0x35, 0x22, 0x98, 0xbe, 0xd5, 0xa4, 0xd0, 0xbc,
+ 0xa4, 0x82, 0xde, 0xbc, 0xf6, 0xee, 0x78, 0x3e, 0xad, 0x8e, 0x86, 0xbd,
+ 0x23, 0xec, 0x05, 0xbc, 0x24, 0xd1, 0x2c, 0xbe, 0xc1, 0x8e, 0x0c, 0x3e,
+ 0x24, 0xb8, 0xd1, 0xbd, 0x10, 0x54, 0x20, 0xbe, 0x23, 0x6d, 0xba, 0x3d,
+ 0x4a, 0xab, 0x26, 0xbd, 0x9a, 0xdd, 0xbf, 0x3c, 0x99, 0x2b, 0xaa, 0x3b,
+ 0x27, 0xae, 0xdd, 0xbd, 0x2b, 0x6c, 0xe6, 0x3d, 0x8f, 0x21, 0x0c, 0x3b,
+ 0x71, 0xc9, 0xda, 0xbd, 0x0d, 0xdb, 0x3e, 0xbd, 0x35, 0xbf, 0x00, 0xbd,
+ 0x2e, 0x6b, 0xdf, 0xbc, 0x2a, 0x5f, 0x2e, 0xbe, 0xd6, 0x97, 0xdb, 0x3c,
+ 0x1e, 0xd6, 0x49, 0xbc, 0xc4, 0x9a, 0x84, 0x3d, 0x8a, 0xb6, 0xbe, 0x3d,
+ 0xce, 0xb1, 0x09, 0x3e, 0x49, 0x3f, 0x03, 0x3d, 0x06, 0xa0, 0x37, 0x3c,
+ 0x82, 0x01, 0x21, 0x3d, 0xa4, 0x09, 0x43, 0xbd, 0x81, 0x78, 0x12, 0x3e,
+ 0x7c, 0x67, 0xfa, 0x3c, 0x37, 0x51, 0xb1, 0x3d, 0x32, 0xea, 0xf7, 0xbb,
+ 0x3e, 0xfe, 0x16, 0x3e, 0x41, 0xdd, 0xf4, 0xbd, 0x00, 0x8f, 0xf1, 0x3c,
+ 0x64, 0xe8, 0x90, 0x3d, 0xae, 0xd3, 0x92, 0xbd, 0xab, 0x87, 0x7f, 0xbd,
+ 0xc5, 0x93, 0x73, 0xbd, 0xfe, 0x19, 0xc3, 0x3d, 0xb8, 0x21, 0x78, 0xbe,
+ 0xea, 0x00, 0x50, 0xbe, 0xf2, 0x83, 0xb5, 0xbd, 0x01, 0xe5, 0x9b, 0x3d,
+ 0xf1, 0xa1, 0xd6, 0x3c, 0x35, 0x67, 0xeb, 0xbd, 0xa9, 0x0b, 0x98, 0xbc,
+ 0xb7, 0x93, 0xc5, 0x3d, 0xba, 0x41, 0x85, 0x3d, 0x9a, 0x24, 0xab, 0xbd,
+ 0x8d, 0xd0, 0xf5, 0xbc, 0x0e, 0x33, 0x47, 0x3b, 0x67, 0x72, 0x30, 0xbe,
+ 0xf7, 0x25, 0x10, 0xbe, 0x84, 0x18, 0x28, 0xbe, 0x6b, 0x05, 0x84, 0xbd,
+ 0xd7, 0x14, 0x8c, 0xbd, 0x81, 0x62, 0xf6, 0x3d, 0xec, 0x31, 0xa0, 0x3d,
+ 0x4f, 0x59, 0x2c, 0xbe, 0x3d, 0x56, 0x37, 0xbd, 0x79, 0xb8, 0x55, 0x3d,
+ 0xb6, 0xbb, 0xc4, 0xbd, 0x27, 0xd8, 0x85, 0xbd, 0xc4, 0x96, 0x24, 0x3e,
+ 0xda, 0x96, 0xe6, 0x3d, 0x4d, 0xd5, 0xa3, 0x3d, 0xd8, 0x6c, 0x0a, 0xbc,
+ 0xe2, 0x08, 0x68, 0x3d, 0xe2, 0x4f, 0x15, 0xbe, 0x86, 0x26, 0xaa, 0x3d,
+ 0xd5, 0x17, 0x48, 0xbe, 0xaa, 0x89, 0x00, 0x3e, 0x90, 0xfc, 0x34, 0xbd,
+ 0x55, 0x91, 0x92, 0x3d, 0x76, 0xdb, 0x3e, 0xbd, 0xea, 0xdc, 0x15, 0xbe,
+ 0x6a, 0x02, 0xe4, 0xbd, 0x2f, 0x7f, 0x06, 0x3e, 0xc4, 0x3c, 0x53, 0xbd,
+ 0x7e, 0xfc, 0xd3, 0xbd, 0x6a, 0xb4, 0xfd, 0x3d, 0xc8, 0xea, 0x1a, 0xbb,
+ 0x17, 0x5b, 0xb7, 0x3d, 0x4a, 0xf7, 0x52, 0x3d, 0x90, 0xa4, 0x9c, 0xbd,
+ 0xc2, 0xef, 0x9f, 0x3a, 0xbe, 0xe4, 0xf4, 0xbc, 0xdc, 0x40, 0xf8, 0xbd,
+ 0x4b, 0x7e, 0x06, 0x3e, 0xae, 0x60, 0x03, 0xbe, 0x30, 0xcc, 0xc6, 0xbd,
+ 0xe6, 0x1b, 0x9a, 0xbd, 0x1f, 0xd3, 0xdf, 0x3c, 0x45, 0xb7, 0x1d, 0xbe,
+ 0xce, 0xf9, 0x05, 0xbd, 0x0e, 0x12, 0x8f, 0x3d, 0xc1, 0x37, 0x90, 0xbc,
+ 0xc2, 0x3c, 0x1f, 0xbd, 0x79, 0xbd, 0x53, 0xbe, 0x6f, 0xfd, 0x4b, 0xbe,
+ 0x41, 0x3d, 0x2c, 0xbe, 0x96, 0xe3, 0x9b, 0xbd, 0x0c, 0x7d, 0x78, 0xbe,
+ 0x26, 0xaa, 0x2a, 0x3d, 0xee, 0x8c, 0x13, 0x3e, 0x24, 0x37, 0x8d, 0xbd,
+ 0xcc, 0xe4, 0x68, 0xbe, 0x6a, 0xbb, 0xc5, 0x3d, 0xac, 0xde, 0xe4, 0x3d,
+ 0x3e, 0x9d, 0x3c, 0xbc, 0x96, 0xd1, 0x0b, 0x3d, 0x40, 0x5e, 0x45, 0x3e,
+ 0x7d, 0x58, 0x0e, 0xbe, 0x2b, 0xc6, 0x0b, 0xbd, 0x4b, 0x60, 0x2e, 0x3e,
+ 0x4c, 0xaa, 0x02, 0x3e, 0x29, 0x00, 0xf1, 0xbc, 0xa5, 0x1b, 0xbf, 0xbc,
+ 0x7b, 0xf6, 0x44, 0xbe, 0xf8, 0xea, 0x66, 0xbd, 0x78, 0xd0, 0xab, 0xbb,
+ 0x60, 0xf7, 0x20, 0xbd, 0xc3, 0xee, 0xd1, 0x3d, 0x2f, 0xa8, 0x8c, 0xbe,
+ 0x89, 0x57, 0xb3, 0xbd, 0x9f, 0x2c, 0xff, 0x3d, 0x0d, 0xae, 0xb6, 0x3d,
+ 0x6b, 0x78, 0x08, 0x3d, 0xe7, 0x62, 0x90, 0x3d, 0x4a, 0x14, 0x01, 0x3e,
+ 0xe7, 0x0b, 0xbb, 0xbd, 0xca, 0x29, 0x8c, 0xbd, 0x7b, 0xaf, 0xd3, 0x3d,
+ 0xdb, 0xf8, 0xaf, 0x3c, 0x88, 0x9e, 0x44, 0xbb, 0xe9, 0x1f, 0x50, 0xbe,
+ 0xd7, 0xfe, 0x35, 0x3e, 0x07, 0x8d, 0x8d, 0xbe, 0xe7, 0x2e, 0x5d, 0xbe,
+ 0xd9, 0x92, 0x30, 0xbd, 0x02, 0x7b, 0x3f, 0xbe, 0x7f, 0xdc, 0xa0, 0x3d,
+ 0x20, 0x7d, 0xd6, 0x39, 0x69, 0x62, 0x24, 0x3e, 0xd5, 0xb6, 0xb2, 0x3d,
+ 0xca, 0xfe, 0x16, 0x3e, 0x0d, 0xee, 0x21, 0xbd, 0xdf, 0x7b, 0x1f, 0xbe,
+ 0x33, 0xea, 0x04, 0xbe, 0xc7, 0x3c, 0xe4, 0xbc, 0x18, 0xdb, 0x13, 0x3d,
+ 0xa4, 0x14, 0x6b, 0x3b, 0xd3, 0x14, 0xbd, 0x3d, 0x22, 0xa4, 0xf7, 0xbc,
+ 0x2a, 0x6c, 0x10, 0xbd, 0xed, 0x9d, 0xac, 0x3d, 0x0a, 0x87, 0x87, 0xbd,
+ 0x90, 0x3f, 0xd2, 0xbd, 0x19, 0xc3, 0xd3, 0x3d, 0x9b, 0x8b, 0xd0, 0x3c,
+ 0x37, 0xe6, 0x22, 0xbe, 0x90, 0x57, 0x02, 0xbe, 0x72, 0xd5, 0xfa, 0x3d,
+ 0xd3, 0xa3, 0xb0, 0xbd, 0x29, 0xce, 0xed, 0x3d, 0xa2, 0x0b, 0xad, 0x3d,
+ 0xfb, 0xf0, 0x68, 0xbc, 0xc5, 0x91, 0x89, 0xbe, 0xc7, 0xcf, 0x34, 0x3d,
+ 0x99, 0x39, 0x82, 0xbd, 0xc1, 0xf2, 0xad, 0x3d, 0x39, 0xbb, 0x22, 0x3e,
+ 0xd4, 0xed, 0x3d, 0x3c, 0xa8, 0x00, 0x78, 0x3d, 0xed, 0xd3, 0xe5, 0xbd,
+ 0xa4, 0x1b, 0x34, 0x3e, 0x7e, 0xc4, 0x84, 0xbc, 0x5f, 0xad, 0xd5, 0x3c,
+ 0x9f, 0x03, 0x20, 0x3e, 0xeb, 0xb1, 0x1a, 0xbd, 0x69, 0x05, 0xc6, 0x3d,
+ 0xe9, 0x94, 0x00, 0xbe, 0xbc, 0x5d, 0x77, 0xbd, 0x02, 0x5d, 0x5f, 0x3e,
+ 0xc3, 0x1d, 0x22, 0xbe, 0x4b, 0x16, 0x11, 0xbe, 0x83, 0x1f, 0xc0, 0x3d,
+ 0x44, 0xc1, 0x04, 0xbe, 0x43, 0xc0, 0xa4, 0x3d, 0xf4, 0xf9, 0x88, 0xbb,
+ 0xbc, 0x4c, 0x85, 0x3c, 0x4b, 0x0f, 0xa6, 0x3d, 0xe0, 0xe4, 0xb8, 0x3d,
+ 0x1e, 0xc9, 0x77, 0xbe, 0x16, 0x5a, 0x06, 0xbe, 0x28, 0x1d, 0x66, 0xbe,
+ 0x38, 0x2f, 0x47, 0x3d, 0x42, 0x19, 0x93, 0x3d, 0xde, 0x90, 0x2b, 0x3e,
+ 0xff, 0xce, 0x07, 0xbe, 0x24, 0xe5, 0x7e, 0x3d, 0x08, 0x74, 0xef, 0x3c,
+ 0xaa, 0x90, 0x44, 0x3e, 0x1e, 0xe3, 0x33, 0x3d, 0xc1, 0x50, 0xd9, 0x3d,
+ 0xde, 0xea, 0xd4, 0xbd, 0x7f, 0xc4, 0x92, 0x3d, 0x46, 0xa2, 0x2a, 0xbd,
+ 0xe1, 0x83, 0xae, 0xbc, 0x72, 0x26, 0xb5, 0xbd, 0xbd, 0x43, 0x24, 0xbe,
+ 0x69, 0xde, 0xb1, 0x3b, 0x70, 0xc6, 0xb7, 0x3d, 0x4c, 0x55, 0x62, 0x3e,
+ 0x60, 0x9a, 0xa9, 0xbd, 0xbf, 0x11, 0x77, 0x3d, 0xae, 0x6f, 0x0e, 0x3e,
+ 0x77, 0x4a, 0x7b, 0xbc, 0xad, 0x82, 0x32, 0x3e, 0x95, 0xb2, 0x44, 0xbd,
+ 0x7a, 0xf5, 0x85, 0xbd, 0xd9, 0xd4, 0xdb, 0xbc, 0x49, 0xed, 0x24, 0x3e,
+ 0x29, 0xd8, 0xde, 0xbd, 0x54, 0x64, 0xe9, 0xbd, 0xd2, 0x60, 0x8d, 0x3d,
+ 0x1b, 0x49, 0xbf, 0xbd, 0x4d, 0x15, 0x85, 0x3d, 0xf7, 0xe8, 0x5b, 0x3e,
+ 0x0a, 0xdc, 0xbe, 0x3d, 0xe9, 0x07, 0xaa, 0x3d, 0xa4, 0x67, 0xb3, 0xbd,
+ 0x1d, 0xca, 0xad, 0x3d, 0xe2, 0xf0, 0xfb, 0xbd, 0x48, 0x62, 0x37, 0xbe,
+ 0x15, 0x05, 0x7a, 0xbe, 0x54, 0x1a, 0x86, 0xbd, 0xd4, 0x84, 0x0a, 0x3e,
+ 0x21, 0x76, 0xe1, 0xbd, 0x83, 0x32, 0x99, 0x3d, 0x0e, 0x73, 0x62, 0x3d,
+ 0x71, 0x1d, 0xea, 0xbd, 0xa8, 0x7a, 0x64, 0xbe, 0xf5, 0x7d, 0x16, 0xbe,
+ 0x59, 0x19, 0x43, 0xbd, 0x14, 0x59, 0x8e, 0x3d, 0xc0, 0x35, 0x75, 0x3d,
+ 0x58, 0xcf, 0x4f, 0xbc, 0x49, 0x63, 0x43, 0x3e, 0x35, 0xb9, 0xc6, 0xbb,
+ 0xa0, 0x3f, 0x3c, 0xbd, 0x75, 0x82, 0x1e, 0x3d, 0x73, 0x1c, 0x4b, 0xbd,
+ 0x3e, 0x53, 0x86, 0xbe, 0xbb, 0x84, 0x0b, 0xbe, 0xf5, 0xa3, 0x07, 0xbe,
+ 0xd0, 0xc4, 0x95, 0x3d, 0x75, 0x95, 0x2a, 0xbd, 0x25, 0x9b, 0x59, 0x3d,
+ 0x34, 0x0f, 0x34, 0xbc, 0x1a, 0x9b, 0xf7, 0xbd, 0x04, 0xed, 0xcb, 0x3d,
+ 0x73, 0xbd, 0x6c, 0x3c, 0x70, 0x2a, 0x2b, 0xbe, 0x8d, 0x31, 0x3a, 0x3d,
+ 0xf6, 0x29, 0x29, 0x3e, 0x2b, 0x21, 0x18, 0xbe, 0x5c, 0xe7, 0xb1, 0xbd,
+ 0x76, 0x1d, 0x0d, 0xbc, 0xcd, 0x1c, 0x93, 0xbb, 0x0e, 0x80, 0x3b, 0xbe,
+ 0x7a, 0xec, 0x96, 0xbd, 0xb8, 0x8a, 0xd4, 0x3d, 0x15, 0xd5, 0x4c, 0xbe,
+ 0xd3, 0xf6, 0x5a, 0x3d, 0x7f, 0x11, 0x04, 0x3e, 0xd2, 0xd7, 0xff, 0xbc,
+ 0xdc, 0x56, 0xeb, 0x3d, 0x73, 0x5e, 0x65, 0x3d, 0x7a, 0x21, 0x96, 0x3d,
+ 0x31, 0x75, 0xf2, 0xbc, 0xfe, 0x7b, 0x0d, 0xbd, 0xff, 0x8a, 0xa0, 0xbb,
+ 0xb2, 0x43, 0x08, 0x3e, 0x0c, 0x7c, 0x1b, 0xbe, 0x15, 0xb6, 0x9c, 0xbd,
+ 0x0e, 0xa4, 0xb7, 0xbd, 0xf0, 0x38, 0x12, 0x3d, 0xab, 0x9e, 0x23, 0x3e,
+ 0xa5, 0x3a, 0xbd, 0x3b, 0xf9, 0x65, 0x24, 0xbe, 0x40, 0xcf, 0x27, 0xbd,
+ 0x0a, 0xfc, 0x96, 0x3d, 0x76, 0x63, 0xb5, 0xbc, 0x10, 0x89, 0xd0, 0xbd,
+ 0x8e, 0x71, 0x05, 0xbc, 0x2b, 0x1c, 0x5a, 0xbc, 0x9a, 0xd7, 0x94, 0xbc,
+ 0xa9, 0x6c, 0xde, 0xbc, 0x91, 0x08, 0xf7, 0x3c, 0xca, 0xe3, 0x4b, 0x3d,
+ 0xcb, 0x45, 0xbc, 0x3d, 0x15, 0x26, 0xca, 0xbc, 0x38, 0xa7, 0x04, 0x3e,
+ 0x5c, 0x19, 0xbd, 0x3d, 0x8f, 0x17, 0x03, 0x3e, 0xc7, 0xce, 0xc5, 0x3d,
+ 0xaf, 0x3b, 0xab, 0xbc, 0x2f, 0x9b, 0xfd, 0xbd, 0x67, 0xf4, 0xa0, 0x3c,
+ 0x52, 0x16, 0xba, 0x3d, 0x2f, 0x3b, 0x22, 0x3e, 0x50, 0xaa, 0x45, 0xbc,
+ 0x37, 0x63, 0x9b, 0x3c, 0x9b, 0xe5, 0x8f, 0xbd, 0xfa, 0xc2, 0x1d, 0x3e,
+ 0x9f, 0x5b, 0x0a, 0x3e, 0x1a, 0xce, 0xb0, 0xbb, 0x0a, 0x2d, 0x8d, 0xbe,
+ 0xbe, 0xf3, 0xd7, 0xbd, 0xa5, 0x44, 0x5d, 0xbe, 0xab, 0x1a, 0x20, 0xbe,
+ 0x5a, 0x4e, 0x97, 0xbe, 0x53, 0x92, 0x12, 0xbe, 0x1c, 0xb6, 0xdb, 0xbd,
+ 0xb5, 0xb2, 0x91, 0x3d, 0xa8, 0xc7, 0xaf, 0x3c, 0x2b, 0xc7, 0x1a, 0xbd,
+ 0xbf, 0xb8, 0x1f, 0xbe, 0xde, 0x8e, 0x27, 0x3d, 0x06, 0x19, 0x7d, 0x3d,
+ 0x34, 0xbd, 0x29, 0x3e, 0x02, 0xf5, 0x36, 0x3e, 0xd4, 0x1f, 0x75, 0x3c,
+ 0x25, 0xd3, 0xfe, 0x3d, 0x67, 0xa7, 0x2a, 0x3c, 0x7c, 0x37, 0x02, 0x3d,
+ 0x43, 0x5b, 0xa9, 0xbd, 0xcc, 0x27, 0x95, 0xbd, 0x8b, 0x9d, 0x24, 0x3e,
+ 0xc7, 0xd5, 0x1e, 0xbe, 0xd8, 0x55, 0xe6, 0x3c, 0xcb, 0x51, 0x4f, 0xbe,
+ 0xea, 0x02, 0x3d, 0x3c, 0x1e, 0x7e, 0x8e, 0xbd, 0x73, 0xb4, 0x70, 0xbd,
+ 0x5f, 0xc1, 0xea, 0x3d, 0x01, 0x6d, 0x8c, 0xbc, 0x40, 0xf3, 0x1b, 0xbe,
+ 0xcd, 0x13, 0x4b, 0x3e, 0xca, 0xee, 0xcd, 0xbd, 0xc2, 0x50, 0x95, 0xbc,
+ 0x1e, 0x02, 0xf2, 0x3d, 0x83, 0x27, 0x92, 0xbd, 0x07, 0x5b, 0xfe, 0x3d,
+ 0xf1, 0x21, 0x46, 0xbc, 0x85, 0x6c, 0xd7, 0xbb, 0x2d, 0xcf, 0xe9, 0x3c,
+ 0x56, 0x63, 0x11, 0xbe, 0x2c, 0xbf, 0x9c, 0x3c, 0x44, 0x2e, 0xa7, 0x3d,
+ 0x30, 0x7d, 0x50, 0xbe, 0x42, 0x91, 0xda, 0xbc, 0xd1, 0x37, 0xbb, 0xbe,
+ 0x49, 0xa1, 0x0b, 0xbd, 0xf9, 0xbf, 0x44, 0x3d, 0xbf, 0xcd, 0x01, 0x3e,
+ 0x25, 0x7b, 0xc1, 0xbd, 0xc4, 0xc0, 0xc9, 0x3d, 0x03, 0xd2, 0x15, 0xbd,
+ 0x14, 0x07, 0x54, 0x3d, 0x20, 0x37, 0x4f, 0x3e, 0x99, 0x21, 0x07, 0x3e,
+ 0xe1, 0xa8, 0x74, 0xbc, 0x8d, 0xab, 0xda, 0x3d, 0x9e, 0x2f, 0x74, 0xbc,
+ 0xd5, 0x47, 0x48, 0xbe, 0x12, 0xea, 0x98, 0xbd, 0xba, 0x42, 0x8a, 0x3e,
+ 0x2e, 0xcf, 0x25, 0xbd, 0x85, 0xdd, 0xe1, 0x3d, 0xa1, 0x76, 0xc8, 0x3d,
+ 0xde, 0x9c, 0x70, 0x3c, 0x59, 0xab, 0x37, 0x3e, 0x16, 0x4c, 0x59, 0xbd,
+ 0xf6, 0xea, 0xd4, 0xbc, 0xb5, 0x12, 0xd2, 0x3d, 0x6d, 0x05, 0x86, 0xbd,
+ 0xd9, 0x19, 0xa8, 0xbd, 0x6c, 0x32, 0xc8, 0x3d, 0x2a, 0x8b, 0x3a, 0xbd,
+ 0x13, 0x77, 0x0d, 0xbd, 0x38, 0x9d, 0x20, 0xbe, 0x34, 0x8b, 0x92, 0x3d,
+ 0x66, 0x09, 0x19, 0xbe, 0x7c, 0x99, 0xac, 0x3d, 0x6f, 0x3e, 0x56, 0x3d,
+ 0x2b, 0xfd, 0x90, 0x3d, 0x58, 0x5a, 0x11, 0x3e, 0x2b, 0x57, 0x66, 0x3d,
+ 0x3a, 0x3a, 0xc4, 0xbd, 0x0c, 0x56, 0xd5, 0xbd, 0x7f, 0xbb, 0xc2, 0xbd,
+ 0x72, 0x36, 0x19, 0xbe, 0x93, 0x2d, 0x7b, 0xbc, 0xc3, 0x9a, 0x46, 0xbe,
+ 0x5d, 0xd5, 0xad, 0xbd, 0xe1, 0xb7, 0x0a, 0xbd, 0x58, 0xd9, 0xac, 0x3d,
+ 0xca, 0x9a, 0xba, 0x3d, 0xcd, 0xb7, 0x1b, 0x3e, 0xf4, 0x74, 0x85, 0xbd,
+ 0xc7, 0xc0, 0x71, 0xbd, 0x9d, 0x6c, 0x4d, 0xbe, 0x91, 0x75, 0x25, 0x3e,
+ 0xbd, 0xbc, 0xae, 0x3d, 0x9e, 0x87, 0x49, 0xbe, 0x0f, 0x88, 0x3a, 0x3e,
+ 0x14, 0xbb, 0xfc, 0xbd, 0x76, 0xc6, 0xaa, 0x3d, 0xd1, 0xeb, 0xd4, 0xbb,
+ 0x1a, 0xa3, 0xcf, 0x3d, 0xdd, 0x71, 0x77, 0x3d, 0x2c, 0x6c, 0x46, 0xbd,
+ 0xed, 0x16, 0x9d, 0xbd, 0x92, 0xe5, 0xaf, 0xbd, 0x36, 0xa8, 0x27, 0xbe,
+ 0x88, 0x5f, 0x4a, 0xbe, 0xe2, 0x70, 0x58, 0xbe, 0xb6, 0xcc, 0x2c, 0xbe,
+ 0x97, 0x20, 0xec, 0x3d, 0x6c, 0x83, 0x16, 0xbe, 0xc8, 0x05, 0x34, 0xbe,
+ 0xfd, 0x8b, 0x39, 0x3d, 0x49, 0xe7, 0x9e, 0xbb, 0xc5, 0x33, 0x32, 0x3c,
+ 0x4c, 0x6f, 0x4d, 0x3e, 0x71, 0xf8, 0x49, 0xbe, 0x76, 0x87, 0x1b, 0x3e,
+ 0xe6, 0x7b, 0x71, 0x3d, 0x51, 0x7f, 0x0d, 0xbd, 0xcf, 0x4c, 0x46, 0xbc,
+ 0xf6, 0xfd, 0xfb, 0x3c, 0x9c, 0x82, 0x98, 0x3e, 0xdf, 0xae, 0xd0, 0x3d,
+ 0x49, 0xa3, 0xcf, 0xbc, 0x9e, 0x50, 0xa6, 0xbd, 0xa2, 0x7c, 0x79, 0xbe,
+ 0x9b, 0x57, 0x98, 0xbd, 0xdc, 0x83, 0x5d, 0x3e, 0x18, 0x71, 0x05, 0xbe,
+ 0xa9, 0x8a, 0xaa, 0x3d, 0xf9, 0x63, 0x9c, 0x3c, 0xde, 0x39, 0x1c, 0x3d,
+ 0x32, 0xca, 0xfd, 0x3c, 0x52, 0x20, 0x11, 0x3e, 0x1e, 0x6e, 0x4d, 0x3d,
+ 0x59, 0xe4, 0x11, 0xbb, 0x9b, 0x9b, 0x10, 0xbe, 0x66, 0x11, 0xf9, 0x3d,
+ 0x3e, 0xb1, 0x09, 0xbe, 0x3f, 0x5b, 0x79, 0x3d, 0xae, 0x3a, 0xa7, 0xbc,
+ 0xf6, 0x12, 0x15, 0x3e, 0x90, 0xf3, 0x6c, 0x3e, 0xde, 0x8b, 0x26, 0xbe,
+ 0xd1, 0xa1, 0x64, 0xbd, 0x14, 0x1b, 0xc3, 0xbd, 0xa3, 0xa5, 0x48, 0xbe,
+ 0xc5, 0xe5, 0x0f, 0xbe, 0x1c, 0x19, 0x08, 0xbe, 0x25, 0xac, 0xff, 0xbd,
+ 0x86, 0x41, 0x38, 0x3c, 0x97, 0x1a, 0xcc, 0xbd, 0x75, 0x08, 0x4f, 0xbe,
+ 0x78, 0x64, 0xda, 0xbd, 0xac, 0x7e, 0xe6, 0xbd, 0x51, 0x9d, 0xb1, 0x3d,
+ 0xea, 0x0c, 0x3c, 0x3e, 0xd9, 0xb9, 0x96, 0x3e, 0x83, 0xad, 0x51, 0xbe,
+ 0x73, 0x81, 0x4c, 0x3e, 0x93, 0xf1, 0xd8, 0x3c, 0x96, 0xa5, 0x16, 0xbe,
+ 0x24, 0x2b, 0x2d, 0x3b, 0xff, 0xaf, 0x07, 0xbe, 0xc4, 0xa2, 0x8c, 0x3d,
+ 0xd2, 0x95, 0xa6, 0x3d, 0x03, 0xfb, 0xef, 0x3d, 0xf7, 0x54, 0x21, 0x3e,
+ 0xd5, 0xf9, 0x3b, 0x3e, 0xd9, 0x07, 0x29, 0xbe, 0x3c, 0xcf, 0xc9, 0x3d,
+ 0x8f, 0x2a, 0x6a, 0x3e, 0x70, 0x32, 0x5a, 0xbd, 0x46, 0x8b, 0x48, 0x3c,
+ 0x9c, 0x4d, 0xa5, 0x3c, 0x50, 0x74, 0x24, 0xbd, 0x8f, 0x68, 0x0e, 0x3e,
+ 0x44, 0x66, 0x64, 0x3e, 0xf0, 0xa4, 0xb3, 0xbd, 0x70, 0x90, 0xb5, 0x3d,
+ 0xbe, 0x37, 0x26, 0xbe, 0x69, 0x7a, 0x80, 0x3b, 0xa7, 0xec, 0x5e, 0x3d,
+ 0x39, 0x09, 0xea, 0xbc, 0x82, 0xe1, 0x68, 0x3d, 0xa3, 0xdb, 0xd1, 0x3d,
+ 0xe6, 0x7a, 0x00, 0x3e, 0xf0, 0x7d, 0x68, 0x3d, 0x90, 0xe7, 0x20, 0x3d,
+ 0xdf, 0xc8, 0xdc, 0xbd, 0xda, 0x63, 0x0e, 0x3c, 0xce, 0x60, 0x05, 0xbe,
+ 0x3c, 0x2b, 0xcb, 0x3d, 0x3c, 0x31, 0xc5, 0xbd, 0x17, 0xb4, 0x03, 0x3d,
+ 0xa3, 0xcf, 0x41, 0xbe, 0x06, 0xf8, 0xd8, 0x3d, 0xb7, 0x78, 0xda, 0xbd,
+ 0x13, 0x98, 0xeb, 0xbd, 0xb3, 0xa9, 0xaa, 0xbd, 0x7e, 0xb7, 0x43, 0xbd,
+ 0xda, 0xa2, 0x55, 0xbd, 0xcb, 0xb2, 0x8e, 0xbe, 0x75, 0x97, 0x97, 0xbc,
+ 0xd2, 0xe1, 0x81, 0xbd, 0xb9, 0xe6, 0x8e, 0xbd, 0x30, 0xf9, 0xbd, 0xbc,
+ 0x51, 0x26, 0xe4, 0xbd, 0xfd, 0xb2, 0xc9, 0xbc, 0xf4, 0x70, 0xc8, 0xbb,
+ 0xd9, 0x93, 0xc1, 0xbb, 0xa7, 0xf1, 0xa8, 0x3d, 0x11, 0xef, 0x57, 0x3e,
+ 0xe5, 0x52, 0x89, 0x3d, 0x2e, 0x94, 0x83, 0xbe, 0x81, 0x65, 0x1e, 0xbe,
+ 0xdb, 0xeb, 0x70, 0x3e, 0x4e, 0xbc, 0xcf, 0x3d, 0xeb, 0x4b, 0x37, 0xbe,
+ 0xa3, 0x26, 0x5f, 0xbe, 0x3f, 0x41, 0x37, 0xbe, 0xab, 0xf8, 0x89, 0x3d,
+ 0x79, 0x1e, 0x6c, 0xbd, 0xe3, 0x33, 0x72, 0x3d, 0x88, 0xb8, 0xad, 0x3e,
+ 0x1e, 0xd9, 0xc9, 0x3c, 0xde, 0x51, 0x3f, 0xbc, 0x2a, 0x64, 0x56, 0xbe,
+ 0x5f, 0x4d, 0x98, 0x3d, 0xaa, 0x7a, 0xb5, 0x3d, 0x20, 0x42, 0x54, 0xbd,
+ 0x6a, 0x7a, 0x39, 0x3d, 0x9e, 0x57, 0x03, 0xbe, 0xca, 0x8f, 0x91, 0xbe,
+ 0x10, 0x3c, 0xd8, 0xbd, 0xd7, 0xaf, 0x8a, 0x3e, 0xe5, 0xb4, 0xdb, 0x3d,
+ 0x45, 0x46, 0x1f, 0x3d, 0x76, 0x9d, 0xf7, 0xbd, 0xe1, 0x57, 0x77, 0x3d,
+ 0xd2, 0xaf, 0x47, 0xbe, 0x1a, 0xfa, 0x1c, 0x3d, 0xc6, 0xc2, 0x79, 0x3d,
+ 0x5a, 0x89, 0x0b, 0x3e, 0x20, 0xd1, 0x2f, 0xbe, 0x58, 0xa8, 0x8a, 0xbe,
+ 0x6c, 0x4e, 0x74, 0xbb, 0xba, 0xa2, 0x1e, 0x3e, 0x87, 0x5e, 0x7f, 0x3e,
+ 0x04, 0x60, 0x8d, 0xbd, 0x43, 0xa0, 0xbb, 0x3d, 0xf1, 0x9b, 0xe3, 0x3d,
+ 0x54, 0xdb, 0x3f, 0xbd, 0x65, 0xf4, 0xd8, 0xbd, 0xcb, 0xdb, 0x02, 0x3c,
+ 0x54, 0x4a, 0x4a, 0x3c, 0x04, 0x2b, 0x9c, 0x3d, 0x50, 0xd1, 0x83, 0xbc,
+ 0xa7, 0x47, 0xde, 0xbc, 0xb5, 0xdb, 0x24, 0x3e, 0xef, 0x28, 0xd1, 0x3d,
+ 0xdd, 0x48, 0x01, 0x3e, 0x4c, 0xab, 0x5d, 0x3d, 0x8e, 0x6c, 0x19, 0xbd,
+ 0xf3, 0xf0, 0x12, 0xbe, 0xf0, 0x01, 0x87, 0xbc, 0xe2, 0x36, 0x84, 0x3d,
+ 0xeb, 0x14, 0x0d, 0xbe, 0xaa, 0xc1, 0x67, 0xbe, 0xcb, 0x50, 0x93, 0x3d,
+ 0x4c, 0x23, 0x97, 0xbd, 0xb2, 0xe0, 0x72, 0x3d, 0x93, 0xaf, 0x28, 0xbe,
+ 0x00, 0x24, 0x3c, 0x3e, 0x37, 0x30, 0x01, 0xbe, 0xf7, 0x8f, 0xe9, 0x3d,
+ 0x51, 0x0f, 0xac, 0xbd, 0xdc, 0xa6, 0x3c, 0xbe, 0xfa, 0x71, 0x07, 0xbe,
+ 0xaf, 0xdf, 0xa6, 0xbc, 0x63, 0x1d, 0x8b, 0xbd, 0x7e, 0x63, 0x8b, 0xbd,
+ 0x79, 0x94, 0xbc, 0x3d, 0x1e, 0xcf, 0x5d, 0x3d, 0xa0, 0xab, 0x1a, 0x3d,
+ 0xd9, 0x82, 0xfd, 0x3d, 0xf0, 0xa5, 0xe9, 0x3d, 0x6d, 0x53, 0x04, 0x3d,
+ 0x5e, 0x25, 0xc2, 0x3d, 0x69, 0x87, 0xbd, 0x3d, 0x8f, 0xf0, 0x04, 0x3d,
+ 0x6d, 0x36, 0x12, 0x3e, 0x7d, 0x2a, 0x2e, 0xbe, 0x57, 0xfb, 0xac, 0xbc,
+ 0x1e, 0x74, 0x37, 0xbd, 0xeb, 0x1b, 0x1a, 0x3e, 0x4b, 0x1f, 0x9b, 0x3d,
+ 0x06, 0xcf, 0x9f, 0x3c, 0x4c, 0xf8, 0x00, 0x3d, 0xde, 0x2b, 0x0e, 0xbe,
+ 0xf6, 0x61, 0x8c, 0x3d, 0xb5, 0x93, 0xec, 0x3d, 0x79, 0xd7, 0xaa, 0xbd,
+ 0xab, 0xa7, 0x8d, 0x3d, 0xfc, 0xc8, 0x11, 0x3d, 0xc8, 0xa8, 0xbe, 0xbc,
+ 0xae, 0x0e, 0x75, 0x3c, 0x56, 0x7b, 0x83, 0x3c, 0x53, 0xd9, 0x90, 0x3d,
+ 0xe2, 0xe9, 0x04, 0x3e, 0x7e, 0x54, 0x70, 0xbd, 0xc0, 0xf2, 0xc0, 0xbd,
+ 0x72, 0xbf, 0xd9, 0xbc, 0xcd, 0x89, 0x38, 0x3d, 0xe3, 0x22, 0x75, 0xbd,
+ 0xb0, 0xdc, 0x80, 0xbd, 0x10, 0x17, 0x02, 0x3d, 0x83, 0x02, 0x9a, 0x3d,
+ 0x40, 0x8e, 0xd8, 0xbc, 0xed, 0xc4, 0x84, 0x3d, 0x98, 0xe8, 0x5d, 0x3e,
+ 0x38, 0x51, 0x3e, 0x3e, 0x6a, 0xeb, 0x0f, 0x3e, 0x0e, 0x4c, 0x4e, 0x3d,
+ 0x27, 0xa5, 0xcb, 0xbd, 0x3d, 0xd2, 0x16, 0xbe, 0x8e, 0xee, 0x06, 0x3e,
+ 0xe8, 0xa5, 0x46, 0x3e, 0x6d, 0x38, 0xd2, 0xbd, 0x82, 0x2f, 0x4f, 0xbc,
+ 0xbc, 0xde, 0x00, 0xbd, 0x77, 0x06, 0x7a, 0x3d, 0x45, 0x34, 0x8b, 0xbd,
+ 0x7d, 0x56, 0x65, 0x3d, 0x9a, 0x36, 0x18, 0x3e, 0x0d, 0x1b, 0x8a, 0xbd,
+ 0x83, 0xca, 0xe7, 0x3d, 0xde, 0x92, 0xea, 0xbd, 0x37, 0x01, 0x0f, 0x3d,
+ 0xc0, 0xd1, 0x57, 0xbc, 0xc2, 0xd8, 0x59, 0xbd, 0x55, 0x21, 0x98, 0xbd,
+ 0xcd, 0x56, 0x75, 0x3b, 0x90, 0x62, 0xcb, 0x3d, 0xf4, 0x1b, 0xda, 0xbd,
+ 0x81, 0x74, 0xcb, 0x3d, 0x71, 0xc3, 0x71, 0x3d, 0xdb, 0xb6, 0x22, 0xbe,
+ 0x7a, 0x25, 0xc0, 0xbd, 0xcf, 0x63, 0x42, 0xbd, 0x8e, 0xa0, 0x13, 0x3e,
+ 0x73, 0xec, 0x16, 0x3d, 0x4c, 0xad, 0xdf, 0x3d, 0x81, 0xd4, 0xee, 0xbd,
+ 0x87, 0x59, 0x09, 0x3e, 0x25, 0x6f, 0xc1, 0xbd, 0x6c, 0xef, 0x5e, 0x3d,
+ 0x82, 0x7a, 0xe2, 0x3d, 0x38, 0xae, 0x52, 0x3d, 0xfc, 0xe0, 0x54, 0xbe,
+ 0xd8, 0x4f, 0xe6, 0xbd, 0xb5, 0x22, 0x32, 0x3e, 0x7c, 0x57, 0xc6, 0x3d,
+ 0x1f, 0xd7, 0x9e, 0x3d, 0x09, 0x22, 0xd0, 0x3c, 0x1e, 0xb8, 0xe5, 0xbd,
+ 0x2c, 0x2e, 0x36, 0xbe, 0x70, 0xc5, 0xeb, 0x3c, 0x96, 0x31, 0x12, 0x3d,
+ 0x7b, 0x5c, 0x83, 0x3c, 0x87, 0xf2, 0x07, 0x3d, 0xf9, 0x09, 0xda, 0xbd,
+ 0xb7, 0xcb, 0x6d, 0x3b, 0x5c, 0xb4, 0x8f, 0x3d, 0x96, 0x41, 0x2f, 0x3d,
+ 0xa9, 0x3b, 0x9d, 0x3d, 0x43, 0x89, 0x92, 0xbd, 0x5d, 0xc4, 0xc5, 0xbc,
+ 0x05, 0x97, 0xd0, 0x3c, 0x94, 0x67, 0x4c, 0x3e, 0x64, 0x0a, 0x48, 0xbd,
+ 0x32, 0x88, 0x04, 0x3e, 0x0c, 0xef, 0x88, 0xbd, 0x33, 0x23, 0x93, 0xbd,
+ 0xab, 0xd6, 0xd1, 0x3d, 0x54, 0x0f, 0x14, 0xbe, 0x0b, 0x94, 0xcd, 0x3d,
+ 0x23, 0x5c, 0x03, 0xbe, 0xf3, 0xe6, 0x8b, 0x3d, 0x2b, 0xd3, 0x3e, 0x3e,
+ 0x5e, 0xa4, 0x7a, 0x3d, 0xf6, 0x8e, 0x16, 0x3c, 0x3c, 0x7a, 0x8a, 0xbe,
+ 0x66, 0x73, 0x00, 0xbe, 0x8c, 0x5e, 0x81, 0xbe, 0x91, 0x41, 0xfd, 0x3c,
+ 0x92, 0x7e, 0x48, 0xbd, 0x7a, 0xb6, 0x97, 0xbd, 0x11, 0x30, 0xd9, 0xbd,
+ 0xec, 0x59, 0x5a, 0xbd, 0x47, 0x55, 0xfe, 0x3c, 0x99, 0x7a, 0xd0, 0xbc,
+ 0x30, 0x4e, 0x23, 0x3e, 0x7c, 0xa8, 0x67, 0x3c, 0x91, 0x52, 0xdb, 0x3d,
+ 0x44, 0xcd, 0xb0, 0xbd, 0xc1, 0xdc, 0x23, 0x3d, 0xce, 0xe5, 0x3b, 0xbd,
+ 0x9e, 0x2f, 0x0c, 0xbd, 0x0c, 0xf2, 0x07, 0x3e, 0x86, 0x96, 0x5a, 0x3e,
+ 0xb0, 0xf6, 0xb8, 0x3b, 0x83, 0x75, 0xdb, 0x3d, 0xaf, 0xf7, 0x1e, 0xbd,
+ 0x7c, 0x31, 0x2a, 0x3d, 0x4b, 0x55, 0x1c, 0xbe, 0x4f, 0xbd, 0x94, 0x3b,
+ 0x50, 0xfe, 0x7e, 0xbe, 0x4e, 0x95, 0x84, 0x3d, 0xaf, 0x95, 0xe4, 0xbd,
+ 0x58, 0xd9, 0x84, 0xbe, 0x74, 0xb4, 0x29, 0xbe, 0xed, 0x61, 0x30, 0xbe,
+ 0x81, 0xcc, 0x5a, 0xbe, 0x31, 0x4f, 0xc8, 0x3b, 0x5f, 0xa8, 0xfb, 0x3d,
+ 0xfd, 0x5b, 0x52, 0xbe, 0x09, 0x00, 0xfb, 0xbd, 0x7c, 0xb9, 0x04, 0x3e,
+ 0x04, 0x8f, 0x6f, 0xbc, 0x59, 0x11, 0x7d, 0xbd, 0x24, 0x5b, 0xd6, 0xbc,
+ 0x51, 0x77, 0x3c, 0x3d, 0x75, 0xe8, 0x0d, 0xbd, 0xc6, 0x86, 0x35, 0x3d,
+ 0x35, 0xe4, 0xa9, 0xbc, 0x2a, 0x9a, 0x86, 0xbb, 0xdd, 0x6c, 0x55, 0x3d,
+ 0x00, 0x9b, 0x9a, 0xbd, 0x25, 0x70, 0x9a, 0x3d, 0x2c, 0x87, 0xd1, 0x3d,
+ 0x47, 0x75, 0x31, 0x3e, 0x24, 0xf4, 0x2f, 0x3e, 0xb5, 0xe8, 0x1c, 0x3e,
+ 0x3c, 0x5c, 0xb3, 0xbd, 0x81, 0x75, 0x56, 0x3b, 0x5b, 0xea, 0x4e, 0x3d,
+ 0xba, 0x00, 0xc3, 0x3d, 0xdf, 0xc2, 0xfb, 0x3d, 0xbd, 0xe4, 0x97, 0xbd,
+ 0x59, 0xcb, 0x6f, 0xbd, 0x04, 0xf0, 0x03, 0x3d, 0x12, 0x15, 0x45, 0x3c,
+ 0xcb, 0xcc, 0x2c, 0x3e, 0x1e, 0xf3, 0x05, 0x3d, 0xae, 0x3c, 0x30, 0x3b,
+ 0xe8, 0xc5, 0x87, 0x3d, 0xa6, 0x84, 0x1f, 0xbe, 0x3a, 0xaa, 0xdb, 0x3d,
+ 0x8f, 0xdb, 0x91, 0xbd, 0xcf, 0x54, 0xdf, 0x3d, 0x7f, 0xc7, 0x4a, 0xbe,
+ 0xf0, 0x88, 0x14, 0xbe, 0x04, 0x97, 0xa3, 0x3d, 0x1d, 0x23, 0x6f, 0xbe,
+ 0xb4, 0x0c, 0xd9, 0x3d, 0xd0, 0x18, 0x8f, 0xbd, 0xe2, 0x27, 0x29, 0xbe,
+ 0x08, 0x2d, 0x4c, 0xbd, 0x09, 0x16, 0x5c, 0xbe, 0xcc, 0x23, 0xea, 0xbc,
+ 0xca, 0xea, 0x94, 0x3c, 0xf2, 0x5f, 0x90, 0xbb, 0x76, 0x59, 0xf8, 0xbd,
+ 0xa2, 0xf6, 0x3a, 0xbe, 0x8f, 0x49, 0x46, 0xbe, 0xbb, 0x17, 0xf5, 0x3c,
+ 0x5f, 0xad, 0x1e, 0xbd, 0xd3, 0x7a, 0xd5, 0xbb, 0xe7, 0x1f, 0xd4, 0xbe,
+ 0x8f, 0x2b, 0x7a, 0xbe, 0x2a, 0xb3, 0x28, 0xbe, 0x26, 0x02, 0x05, 0xbe,
+ 0xf4, 0x36, 0x26, 0x3e, 0x1c, 0xd8, 0xd6, 0xbd, 0x10, 0x9c, 0x97, 0xbc,
+ 0xf3, 0x67, 0x22, 0x3e, 0xc0, 0xde, 0xfb, 0x3c, 0x0f, 0x98, 0xf9, 0xbc,
+ 0x86, 0x78, 0x22, 0x3c, 0x62, 0x94, 0x8c, 0xbd, 0xe8, 0xea, 0x13, 0x3e,
+ 0xb2, 0x9d, 0x09, 0xbe, 0x31, 0xc3, 0x0c, 0xbe, 0x0e, 0x83, 0xeb, 0xbd,
+ 0x78, 0x09, 0xb2, 0x3d, 0x24, 0x5c, 0x9b, 0x3c, 0xc4, 0x3d, 0xc1, 0xbd,
+ 0x57, 0x13, 0xc7, 0x3d, 0x93, 0xd6, 0xb6, 0x3d, 0xcc, 0x01, 0x71, 0xbd,
+ 0xd9, 0x35, 0x1a, 0x3e, 0x6a, 0x30, 0x1c, 0xbd, 0x24, 0x70, 0x1c, 0x3e,
+ 0x66, 0x8c, 0x01, 0x3e, 0x94, 0x2e, 0x52, 0x3e, 0xf6, 0xeb, 0x43, 0x3d,
+ 0x2f, 0x30, 0xbe, 0xbd, 0x45, 0x3a, 0xff, 0xbc, 0x3e, 0xd3, 0xad, 0xbd,
+ 0x98, 0xa7, 0xcd, 0xbd, 0xfc, 0xde, 0xc7, 0x3c, 0xe6, 0xe6, 0x31, 0x3d,
+ 0x8f, 0x4c, 0x52, 0xbc, 0x3f, 0x5b, 0x04, 0x3e, 0xf3, 0x9a, 0x67, 0xbe,
+ 0xe1, 0x09, 0x1d, 0xbd, 0xd8, 0x63, 0xf8, 0x3d, 0x97, 0xc3, 0x00, 0x3e,
+ 0x04, 0xfd, 0xcc, 0xbd, 0x91, 0x9a, 0x21, 0xbe, 0x2b, 0x7e, 0x7c, 0xbc,
+ 0xb8, 0x63, 0x0d, 0x3e, 0xb3, 0x09, 0x39, 0x3e, 0x39, 0xb4, 0x05, 0xbe,
+ 0x7b, 0xd0, 0xe6, 0x3c, 0x6c, 0x3b, 0x1a, 0xbe, 0x26, 0x9e, 0xef, 0xbd,
+ 0xa6, 0x01, 0xbf, 0x3d, 0xdf, 0xe4, 0x26, 0xbe, 0x00, 0xc3, 0x19, 0xbe,
+ 0xfc, 0x48, 0xc3, 0x3d, 0xc8, 0xe1, 0x91, 0x3c, 0x06, 0x58, 0x29, 0x3e,
+ 0x85, 0x36, 0x60, 0xbe, 0xc7, 0x57, 0x87, 0xbd, 0x96, 0x78, 0x18, 0xbe,
+ 0x35, 0xfd, 0xa2, 0x3d, 0x56, 0xf0, 0x72, 0x3d, 0x20, 0x2b, 0x12, 0xbd,
+ 0x15, 0xfb, 0x8d, 0x3c, 0xc0, 0x7d, 0xc0, 0x3d, 0x1a, 0x42, 0x89, 0x3c,
+ 0x36, 0x0d, 0x8f, 0x3c, 0x0d, 0xb9, 0x97, 0xbd, 0x64, 0x52, 0x6f, 0xbd,
+ 0xf6, 0x61, 0x6f, 0x3d, 0x9e, 0xab, 0xd4, 0x3d, 0x63, 0xe2, 0xea, 0xbd,
+ 0xa6, 0xff, 0x9f, 0xbd, 0x06, 0x79, 0x55, 0xbc, 0xe8, 0x58, 0x4f, 0x3d,
+ 0x55, 0x2f, 0x14, 0x3e, 0x38, 0x8c, 0xde, 0xbd, 0xb6, 0x5b, 0x55, 0xbd,
+ 0xf4, 0xde, 0x86, 0x3d, 0x89, 0x43, 0xe4, 0x3d, 0x0c, 0x5a, 0x32, 0x3e,
+ 0x3e, 0xe7, 0x1d, 0xbd, 0x43, 0x64, 0xdf, 0x3d, 0x88, 0x10, 0x83, 0x3d,
+ 0xdd, 0x1c, 0xa5, 0x3c, 0x4d, 0x56, 0x2e, 0xbd, 0xea, 0x3b, 0x57, 0xbe,
+ 0xcf, 0x9e, 0x28, 0x3e, 0xc1, 0x5e, 0xef, 0x3d, 0x5e, 0x41, 0xa9, 0xbd,
+ 0xf0, 0xdd, 0x03, 0xbe, 0xc1, 0xe0, 0xeb, 0xbd, 0x40, 0x01, 0xa7, 0x3d,
+ 0x42, 0xc0, 0x2a, 0xbe, 0xe9, 0x86, 0x92, 0xbd, 0x2c, 0xf0, 0x47, 0xbc,
+ 0x82, 0x29, 0x80, 0xbd, 0x76, 0x69, 0xec, 0xbc, 0xd7, 0xf5, 0x5a, 0x3d,
+ 0x06, 0x1b, 0xd5, 0xbd, 0xab, 0x4e, 0xa7, 0xbd, 0x2e, 0x0d, 0xc0, 0xbd,
+ 0x23, 0xb6, 0x7e, 0xbb, 0x6d, 0xb2, 0xa6, 0xbd, 0x26, 0x2e, 0xa8, 0xbd,
+ 0x85, 0x61, 0x4b, 0xbe, 0x4c, 0x34, 0x32, 0xbd, 0x85, 0xbd, 0x0c, 0x3e,
+ 0x2a, 0x4d, 0x98, 0xbd, 0x67, 0x20, 0xb4, 0x3d, 0xb3, 0x66, 0x2f, 0x3e,
+ 0x2a, 0x0f, 0x83, 0x3c, 0x70, 0xe2, 0x51, 0xbe, 0x30, 0x0d, 0x05, 0xbe,
+ 0x88, 0xd6, 0x25, 0x3d, 0xdd, 0xcb, 0x14, 0xbe, 0x85, 0xbc, 0x41, 0x3c,
+ 0x54, 0xe0, 0x86, 0x3d, 0x74, 0xfa, 0x40, 0xbe, 0x3d, 0xbb, 0x0d, 0xbe,
+ 0xf2, 0x19, 0xb3, 0xbc, 0xc2, 0x08, 0x84, 0x3d, 0x5e, 0x6a, 0xaf, 0x3d,
+ 0x6c, 0x6f, 0xfe, 0xbd, 0x35, 0x4a, 0x1d, 0xbe, 0x22, 0xdd, 0xb3, 0x3d,
+ 0xc0, 0x0c, 0x28, 0xbc, 0x32, 0x83, 0x76, 0x3d, 0xa8, 0x17, 0x1c, 0xbc,
+ 0x34, 0x50, 0xb2, 0xbc, 0x20, 0xf1, 0xa5, 0x3d, 0x60, 0xd2, 0xe3, 0x3c,
+ 0x2c, 0xac, 0xa1, 0xbd, 0x27, 0x8a, 0x39, 0xbd, 0x92, 0xe5, 0x14, 0xbe,
+ 0x56, 0x47, 0x4b, 0xbd, 0xa8, 0x2f, 0x1a, 0x3d, 0x20, 0x89, 0xef, 0xbd,
+ 0x38, 0x3e, 0x5b, 0x3d, 0x99, 0x26, 0x85, 0x3e, 0x7a, 0x5b, 0x86, 0xbd,
+ 0x55, 0x33, 0xbd, 0x3d, 0x71, 0x76, 0xd9, 0x3d, 0x5f, 0x1a, 0xf7, 0xbc,
+ 0x1d, 0x54, 0x56, 0xbe, 0x88, 0x6a, 0x1d, 0xbc, 0x9c, 0xcf, 0x10, 0x3d,
+ 0x62, 0x71, 0xe8, 0x3d, 0xf4, 0x78, 0xb0, 0xbc, 0x7d, 0x7a, 0x46, 0xbc,
+ 0x08, 0x02, 0x13, 0x3e, 0xdb, 0xb4, 0xfe, 0xbd, 0xb4, 0x86, 0xeb, 0x3b,
+ 0x54, 0x12, 0xde, 0x3d, 0x5e, 0x2f, 0x9b, 0x3d, 0x07, 0xdc, 0x24, 0xbd,
+ 0xb6, 0x08, 0x13, 0xbc, 0x7c, 0xbd, 0x09, 0x3e, 0xdf, 0x90, 0xb9, 0xbd,
+ 0x54, 0x2d, 0xdc, 0x3b, 0x3c, 0x17, 0xc2, 0xbd, 0x13, 0xc8, 0xef, 0xbb,
+ 0x2c, 0x6f, 0x96, 0x3c, 0x2c, 0x0a, 0x99, 0x3c, 0xac, 0x5a, 0x6c, 0xbd,
+ 0x75, 0xf1, 0x04, 0x3d, 0xac, 0x6c, 0x1d, 0x3e, 0xcc, 0xf2, 0xe1, 0xbd,
+ 0xa4, 0x4d, 0x7b, 0x3c, 0x5a, 0xf3, 0x6c, 0x3d, 0x93, 0x4f, 0xc3, 0x3d,
+ 0xd6, 0x42, 0x9a, 0x3d, 0x75, 0xe5, 0x3e, 0x3e, 0xdc, 0xb8, 0x21, 0xbd,
+ 0x6c, 0xef, 0xd3, 0xbd, 0x0c, 0x46, 0x9f, 0xbc, 0x65, 0x11, 0x35, 0xbd,
+ 0x29, 0x67, 0x09, 0xbd, 0xe1, 0x76, 0xa9, 0xbc, 0x3e, 0x48, 0x0a, 0xbc,
+ 0xcb, 0x4e, 0xf1, 0xbd, 0xfe, 0xde, 0xbc, 0xbd, 0x2f, 0x35, 0x0f, 0xbb,
+ 0x2a, 0xab, 0x93, 0x3d, 0xe6, 0x55, 0x04, 0xbd, 0x2f, 0xcd, 0x8a, 0x3d,
+ 0xda, 0xd7, 0xe1, 0x3d, 0x8b, 0xf2, 0xf1, 0xbd, 0xf8, 0x71, 0x0c, 0xbd,
+ 0xeb, 0x9a, 0xaf, 0xbd, 0x8a, 0x25, 0xa2, 0x3d, 0x5a, 0xee, 0x0d, 0x3c,
+ 0x2c, 0x1e, 0x3d, 0x3e, 0x8e, 0x9f, 0xc1, 0xbd, 0x25, 0xfb, 0x25, 0x3e,
+ 0xc1, 0xbb, 0x9a, 0x37, 0x9f, 0xc8, 0xa8, 0x3d, 0x28, 0x3a, 0x89, 0x3d,
+ 0xe6, 0xef, 0x7b, 0xbd, 0x3a, 0x72, 0x2c, 0xbd, 0x6f, 0xa9, 0xc6, 0xbd,
+ 0x1f, 0xe1, 0x16, 0x3d, 0xd7, 0xeb, 0x42, 0x3c, 0x9f, 0xe7, 0x1b, 0xbe,
+ 0x86, 0x62, 0x9d, 0xbd, 0x06, 0x82, 0xc8, 0x3d, 0x52, 0x2c, 0xc7, 0xbd,
+ 0xa1, 0xe4, 0x18, 0x3d, 0xcf, 0x4b, 0x5f, 0x3e, 0x4d, 0x9f, 0xc8, 0x3d,
+ 0x99, 0x17, 0xf9, 0x3c, 0xf4, 0xb6, 0x2a, 0x3d, 0x68, 0x9b, 0xc8, 0xbb,
+ 0x01, 0x62, 0xd8, 0xbd, 0xf0, 0x80, 0xc4, 0x3b, 0xed, 0xb1, 0x52, 0x3b,
+ 0xbe, 0x7e, 0x9e, 0x3d, 0x03, 0x4a, 0x37, 0x3e, 0xc6, 0x3b, 0xde, 0xbd,
+ 0x36, 0x95, 0x50, 0x3d, 0x18, 0xe2, 0x80, 0xbd, 0x22, 0x69, 0xde, 0xbc,
+ 0x17, 0xd5, 0x9c, 0x3d, 0x97, 0x0e, 0x23, 0x3d, 0xfb, 0x9d, 0xa8, 0xbd,
+ 0x7c, 0x76, 0x1b, 0x3e, 0xac, 0x3d, 0xdb, 0xbd, 0x90, 0x0c, 0xb2, 0x3d,
+ 0xe2, 0xf5, 0xec, 0x3d, 0xee, 0x2c, 0x0c, 0x3e, 0x89, 0x9e, 0xd2, 0xbb,
+ 0xec, 0x31, 0xbf, 0x3c, 0x1f, 0x57, 0x2b, 0xbc, 0xcb, 0x7d, 0x18, 0x3d,
+ 0x77, 0xc9, 0xc3, 0xbd, 0x7e, 0xa8, 0x96, 0x3c, 0x6b, 0xba, 0xf4, 0xbd,
+ 0x86, 0xf2, 0x0c, 0xbe, 0xf5, 0xa3, 0xac, 0x3d, 0xd0, 0x69, 0x98, 0x3c,
+ 0x15, 0xcb, 0x6d, 0xbd, 0xfd, 0x7a, 0x10, 0x3e, 0x03, 0xd7, 0xb3, 0x3d,
+ 0x05, 0x53, 0xae, 0x3d, 0xf8, 0xad, 0xad, 0x3d, 0xb8, 0x12, 0x1a, 0x3e,
+ 0xc5, 0xb2, 0xaf, 0xbd, 0xc2, 0xe9, 0x63, 0xbe, 0xcc, 0x3d, 0xe2, 0xbd,
+ 0xa9, 0x4f, 0x3b, 0x3d, 0x4e, 0x30, 0xa1, 0xbd, 0x0a, 0xc5, 0x1d, 0xbe,
+ 0x66, 0x65, 0xaf, 0xbc, 0x95, 0x0c, 0xb6, 0x3d, 0xf6, 0x9f, 0x0a, 0x3d,
+ 0xac, 0xb1, 0x7f, 0xbd, 0x75, 0x33, 0x2b, 0x3d, 0x45, 0x79, 0xe1, 0x3d,
+ 0x23, 0x99, 0xf3, 0x3b, 0x6f, 0x66, 0x02, 0x3e, 0xab, 0x87, 0x96, 0xbd,
+ 0xb2, 0x94, 0x86, 0x3d, 0x81, 0x16, 0x0a, 0xbd, 0xd6, 0x5e, 0x24, 0xbe,
+ 0xd3, 0x37, 0x2f, 0x3e, 0x3a, 0x4e, 0xc7, 0x3d, 0x4a, 0x19, 0x2a, 0xbd,
+ 0x9a, 0x35, 0xc3, 0xbd, 0xdb, 0x00, 0xb0, 0xbd, 0xee, 0x42, 0x1c, 0xbe,
+ 0xce, 0x5e, 0x22, 0x3d, 0x81, 0xa3, 0xfa, 0xbd, 0xa7, 0x46, 0x04, 0xbe,
+ 0x45, 0x82, 0x1c, 0xbe, 0x45, 0xce, 0xcc, 0x3d, 0x26, 0x0a, 0xc4, 0x3d,
+ 0x84, 0xdd, 0xf3, 0x3d, 0x98, 0x67, 0x4c, 0xbd, 0xda, 0x13, 0x86, 0xbe,
+ 0x2c, 0xe0, 0xca, 0x3e, 0x0c, 0xf9, 0xd1, 0xbb, 0xae, 0xe9, 0xe1, 0x3d,
+ 0xa4, 0xb2, 0x0f, 0x3e, 0x2e, 0x4e, 0x2e, 0xbe, 0xca, 0xb9, 0xbb, 0xbd,
+ 0x9e, 0x58, 0x8e, 0xbe, 0xe9, 0x48, 0x8f, 0xbd, 0x63, 0xeb, 0xa2, 0x3d,
+ 0xa7, 0x79, 0x6c, 0xbe, 0xc6, 0xf5, 0x39, 0xbd, 0xef, 0x86, 0x4c, 0xbd,
+ 0xf8, 0xa6, 0xe0, 0xbc, 0xdd, 0x6b, 0x0e, 0xbd, 0x02, 0x20, 0x45, 0xbd,
+ 0x82, 0x6e, 0x8f, 0x3d, 0x9b, 0x4e, 0x61, 0xbd, 0xa6, 0x26, 0x44, 0x3d,
+ 0x58, 0x00, 0x19, 0xbc, 0xc1, 0xec, 0x93, 0xbd, 0xea, 0x17, 0xa4, 0xbd,
+ 0x05, 0x7d, 0x8f, 0x3d, 0xd4, 0x1f, 0x0d, 0xbe, 0xe4, 0xfd, 0x89, 0xbc,
+ 0x3e, 0x81, 0xd3, 0x3d, 0x89, 0x1b, 0x27, 0xbe, 0x34, 0x44, 0x14, 0x3e,
+ 0x13, 0x34, 0x1a, 0x3e, 0x8f, 0xaa, 0x85, 0x3e, 0x30, 0x73, 0xf4, 0x3d,
+ 0x34, 0xa3, 0x83, 0xbd, 0x41, 0x9b, 0x20, 0xbe, 0x0f, 0x70, 0xb4, 0x3d,
+ 0x23, 0xc2, 0x93, 0x3d, 0x11, 0xb1, 0x4e, 0x3d, 0xf1, 0x81, 0x59, 0x3d,
+ 0x73, 0xdd, 0x8f, 0xbd, 0xc2, 0xca, 0x18, 0xbe, 0xf9, 0x4b, 0x30, 0x3e,
+ 0xd6, 0xc6, 0xba, 0x3d, 0x4b, 0x36, 0xe0, 0x3c, 0x7a, 0x09, 0xf8, 0x3d,
+ 0x83, 0xf8, 0x46, 0x3c, 0x00, 0xc2, 0x34, 0x3c, 0xfe, 0x26, 0x1b, 0x3c,
+ 0xae, 0x65, 0x61, 0xbd, 0xa5, 0x14, 0xba, 0xbd, 0x99, 0xf2, 0xb2, 0x3e,
+ 0x31, 0x63, 0xf3, 0xbd, 0xe0, 0x9a, 0x1e, 0x3d, 0xe3, 0x45, 0x22, 0x3e,
+ 0x33, 0xec, 0xc3, 0x3d, 0x4d, 0x8e, 0x1c, 0xbe, 0xa5, 0x77, 0x61, 0xbc,
+ 0xb4, 0x14, 0x33, 0x3c, 0xcd, 0xc1, 0x43, 0x3e, 0x04, 0x1f, 0x02, 0xbe,
+ 0x39, 0xca, 0xd1, 0xbc, 0x9c, 0x7d, 0x5a, 0xbc, 0x9f, 0x5a, 0xda, 0x3d,
+ 0x0a, 0x36, 0x69, 0x3c, 0x95, 0x34, 0x8c, 0xbd, 0xd5, 0x09, 0xab, 0xbd,
+ 0xce, 0x32, 0x5f, 0xbd, 0x2b, 0x19, 0x35, 0xbe, 0xcd, 0xa9, 0x8c, 0xbd,
+ 0xca, 0xdb, 0xe4, 0xbd, 0x9b, 0x4f, 0x07, 0xbc, 0x7b, 0x6f, 0x10, 0xbc,
+ 0x40, 0xf1, 0x09, 0x3d, 0x60, 0x55, 0x21, 0x3e, 0x42, 0x13, 0xf8, 0xbd,
+ 0x85, 0xcf, 0x08, 0x3e, 0xc0, 0x17, 0xe0, 0x3d, 0xb3, 0x6f, 0x69, 0xbd,
+ 0x61, 0x4c, 0x40, 0x3e, 0xfe, 0xd4, 0x1e, 0xbe, 0x64, 0x09, 0x89, 0xbd,
+ 0x28, 0xf2, 0x61, 0x3d, 0xb3, 0x81, 0xf5, 0x3b, 0xe1, 0xda, 0x1a, 0xbd,
+ 0x2e, 0xd5, 0x4d, 0xbe, 0xd8, 0x67, 0x2c, 0xbe, 0xa9, 0xbe, 0x74, 0xbe,
+ 0xf3, 0x4e, 0x9b, 0x3d, 0x51, 0x92, 0x1d, 0xbe, 0xb5, 0x06, 0x8a, 0x3c,
+ 0x55, 0x58, 0xba, 0xbd, 0xe6, 0x91, 0xe9, 0x3d, 0x9c, 0xb6, 0xd5, 0x3c,
+ 0x32, 0x59, 0x8b, 0xbe, 0xc8, 0x59, 0x0e, 0x3c, 0xb2, 0xe7, 0x86, 0xbe,
+ 0x7b, 0xbb, 0x8f, 0x3d, 0x73, 0x59, 0xc2, 0x3d, 0x36, 0x69, 0xa1, 0xbe,
+ 0xf6, 0x6b, 0x0c, 0xbe, 0x1f, 0x3d, 0x78, 0x3c, 0x82, 0x80, 0x4c, 0xbd,
+ 0xcd, 0xf6, 0x3c, 0xbd, 0x2d, 0x1f, 0x45, 0xbd, 0x0a, 0xfc, 0x04, 0x3e,
+ 0x65, 0xf8, 0x88, 0xbd, 0x01, 0x14, 0x62, 0xbe, 0x80, 0x3a, 0xd9, 0xbd,
+ 0x82, 0xec, 0x2b, 0xbe, 0x47, 0x40, 0xc3, 0xbc, 0xb1, 0xa1, 0xf2, 0xbd,
+ 0x76, 0xe0, 0x4f, 0xbd, 0x33, 0x1c, 0x5e, 0xbd, 0x12, 0xe4, 0x00, 0xbe,
+ 0x8b, 0x5f, 0x3e, 0xbd, 0xd7, 0x66, 0xc3, 0xbd, 0xb5, 0xbb, 0x5e, 0xbd,
+ 0x2f, 0xa4, 0x18, 0xbd, 0x9d, 0x74, 0xda, 0x3d, 0xad, 0x13, 0xcd, 0xbd,
+ 0xac, 0x8b, 0x3e, 0x3e, 0x14, 0x39, 0x3c, 0xbe, 0x10, 0xfd, 0x0e, 0x3e,
+ 0xec, 0x2a, 0x65, 0xbe, 0x11, 0xa6, 0x14, 0x3e, 0x61, 0xda, 0x18, 0xbe,
+ 0x8f, 0x11, 0x7d, 0xbd, 0x38, 0xa9, 0x5c, 0xbd, 0xe2, 0x16, 0x95, 0xbd,
+ 0xd7, 0xef, 0xf5, 0x3d, 0x6c, 0xdf, 0x94, 0x3d, 0x93, 0xe1, 0x20, 0xbe,
+ 0x46, 0xa6, 0x5d, 0x3d, 0x1d, 0xe4, 0xb7, 0xbc, 0xdf, 0xc3, 0xc6, 0xbc,
+ 0xff, 0xbc, 0x07, 0xbd, 0x16, 0xe6, 0x88, 0xbe, 0x31, 0xbc, 0xd9, 0x3d,
+ 0xbc, 0x60, 0xc4, 0xbc, 0x34, 0x66, 0x96, 0xbd, 0x7c, 0x66, 0x2f, 0xbe,
+ 0xfb, 0xa2, 0x2c, 0x3d, 0x4b, 0x1d, 0xc9, 0xbd, 0xf5, 0x78, 0x7d, 0xbd,
+ 0xd0, 0xa5, 0xa5, 0xbd, 0x29, 0xb6, 0xc9, 0x3c, 0xe8, 0x93, 0x4e, 0xbe,
+ 0xac, 0x2e, 0x51, 0x3d, 0x41, 0x9a, 0x9c, 0xbb, 0xd4, 0x7e, 0x82, 0xbd,
+ 0x1c, 0x6f, 0x56, 0xbe, 0x76, 0x01, 0x25, 0xbd, 0x9d, 0xac, 0x0f, 0xbe,
+ 0xbf, 0x02, 0x61, 0xbd, 0x1e, 0xb3, 0xff, 0xbc, 0x6f, 0xac, 0x2e, 0xbd,
+ 0x7e, 0x36, 0x0d, 0xbe, 0xa2, 0x3f, 0xa2, 0x3d, 0xfc, 0x3d, 0x90, 0x3d,
+ 0x0e, 0x5d, 0x88, 0xbd, 0x40, 0x90, 0x14, 0x3d, 0xd5, 0x3e, 0x23, 0xbe,
+ 0x71, 0x96, 0xcc, 0xbd, 0x80, 0x60, 0x89, 0xbe, 0xb9, 0xac, 0x49, 0xbc,
+ 0xc3, 0x64, 0x1a, 0xbe, 0x5e, 0x27, 0xfa, 0x3d, 0xe6, 0x69, 0xeb, 0xbd,
+ 0xbd, 0xe2, 0xaa, 0x3d, 0xd6, 0x60, 0x04, 0xbe, 0xec, 0xe5, 0xf9, 0x3d,
+ 0x81, 0xdb, 0x5b, 0xbd, 0x37, 0x2d, 0x2d, 0xbe, 0x9e, 0x6b, 0x5c, 0x3d,
+ 0x53, 0x85, 0x03, 0x3c, 0x9b, 0x66, 0x1a, 0x3e, 0x1f, 0xa5, 0x90, 0x3d,
+ 0x1d, 0xe7, 0xa4, 0xbc, 0x66, 0xc9, 0x16, 0xbe, 0x24, 0xb2, 0xeb, 0xbd,
+ 0x60, 0x9d, 0x11, 0x3e, 0xc3, 0xec, 0x13, 0x3d, 0x95, 0xc5, 0xf5, 0x3d,
+ 0x16, 0xc8, 0x8a, 0x3d, 0xe9, 0x2e, 0x1f, 0x3e, 0x99, 0xba, 0xd9, 0xbd,
+ 0x1a, 0x32, 0x55, 0xbe, 0x05, 0x88, 0xf7, 0x3c, 0xfb, 0x99, 0x17, 0xbe,
+ 0x2f, 0x41, 0x0d, 0x3d, 0x43, 0xf9, 0x9a, 0x3c, 0x19, 0xb2, 0xd3, 0xbd,
+ 0x0d, 0xbf, 0xbe, 0x3d, 0x9d, 0xd4, 0xc0, 0x3c, 0x9b, 0x74, 0xa6, 0xbc,
+ 0x56, 0x79, 0xa6, 0xbd, 0x83, 0x41, 0x95, 0xbd, 0x58, 0x1f, 0x18, 0xbe,
+ 0x6d, 0x93, 0x8f, 0x3d, 0xd4, 0x9e, 0x17, 0xbe, 0xba, 0x53, 0x31, 0x3c,
+ 0xde, 0xb2, 0x1c, 0xbd, 0x6c, 0x75, 0xf1, 0xbb, 0x5c, 0x2d, 0x10, 0xbe,
+ 0x70, 0x23, 0xcf, 0xbc, 0x8f, 0x8e, 0x32, 0xbe, 0xb7, 0x03, 0xac, 0x3d,
+ 0xb2, 0x2a, 0x18, 0x3e, 0x3e, 0xd6, 0x05, 0xbd, 0xfa, 0x81, 0xe8, 0xbd,
+ 0x4c, 0x86, 0xf0, 0xbd, 0x50, 0xc5, 0x5f, 0xbd, 0xc3, 0x62, 0xcf, 0x3c,
+ 0x55, 0x91, 0x0f, 0x3e, 0xd5, 0x1b, 0x8a, 0x3b, 0xa9, 0x8c, 0xdd, 0xbd,
+ 0xfe, 0x74, 0x84, 0xbd, 0x7a, 0x4f, 0x0f, 0xbd, 0x48, 0x79, 0xe8, 0xbd,
+ 0x14, 0x8b, 0x2c, 0x3e, 0x70, 0x6b, 0x0d, 0x3e, 0x3d, 0xa2, 0x03, 0xbe,
+ 0xaf, 0x01, 0xeb, 0x3d, 0x74, 0x22, 0x70, 0xbc, 0x68, 0xfd, 0xf5, 0xbd,
+ 0xe4, 0x27, 0xfd, 0x3c, 0xef, 0x2b, 0xb1, 0xbd, 0x5b, 0xa3, 0x0d, 0xbd,
+ 0xb2, 0x72, 0x8a, 0xbd, 0x4a, 0x8d, 0x0b, 0x3e, 0x57, 0x1f, 0x94, 0xbd,
+ 0x01, 0xbf, 0x4c, 0x3d, 0xd9, 0xd2, 0xe0, 0x3d, 0xdb, 0x67, 0xe7, 0xbd,
+ 0xfc, 0xb3, 0x3a, 0xbe, 0xb7, 0xeb, 0x1e, 0x3e, 0x98, 0x6a, 0x2b, 0xbe,
+ 0xaf, 0x56, 0x0b, 0xbd, 0xfd, 0x67, 0x47, 0xbc, 0x03, 0x88, 0xd5, 0x3d,
+ 0x0d, 0x5b, 0x9b, 0x3d, 0x7c, 0x0d, 0x96, 0xbc, 0xdc, 0x2c, 0xdc, 0xbd,
+ 0xb0, 0xf5, 0xfc, 0x3c, 0x46, 0x3b, 0xdc, 0xbd, 0x13, 0x0d, 0x03, 0x3d,
+ 0xf9, 0x29, 0x44, 0xbe, 0x74, 0xdd, 0x3b, 0xbd, 0x9f, 0x52, 0xdd, 0xbd,
+ 0xfc, 0xe7, 0x46, 0xbe, 0x45, 0x2b, 0x0b, 0xbe, 0x00, 0x80, 0x19, 0xbe,
+ 0x28, 0x05, 0xc1, 0x3d, 0xab, 0x6a, 0x1b, 0x3e, 0xed, 0xc6, 0xdf, 0xbd,
+ 0x9f, 0x9b, 0xc7, 0x3d, 0xa1, 0x68, 0x35, 0x3d, 0xf5, 0x35, 0xd6, 0x3d,
+ 0xa0, 0x57, 0x02, 0x3c, 0xb9, 0xfa, 0x41, 0xbd, 0xd8, 0xa0, 0xaa, 0x3d,
+ 0x5b, 0x7c, 0xfb, 0x3d, 0x84, 0x26, 0x90, 0xbd, 0x60, 0x3a, 0xd8, 0xbd,
+ 0xe9, 0x9b, 0xdf, 0x3d, 0xec, 0x1f, 0x07, 0x3e, 0x7d, 0x75, 0x87, 0xbd,
+ 0xca, 0xe0, 0x54, 0xbd, 0xe4, 0x73, 0xd8, 0xbe, 0x8b, 0x21, 0xe4, 0xbc,
+ 0x92, 0xaa, 0x72, 0xbc, 0x59, 0xcd, 0x01, 0xbd, 0x4e, 0x7a, 0x22, 0x3d,
+ 0xf4, 0x65, 0x06, 0xbd, 0x96, 0x86, 0x0b, 0x3d, 0x41, 0x49, 0x3a, 0xbd,
+ 0x2a, 0xa7, 0x6e, 0x3c, 0x50, 0x4b, 0xe5, 0x3d, 0x99, 0xe4, 0xee, 0x3d,
+ 0xf9, 0x94, 0x47, 0x3d, 0xd3, 0x76, 0x48, 0xbe, 0xaf, 0x62, 0x23, 0xbd,
+ 0xa9, 0x25, 0xf3, 0x3d, 0x16, 0xf6, 0xa3, 0x3d, 0x7d, 0x33, 0xbd, 0x3d,
+ 0xad, 0xf6, 0xb3, 0x3d, 0x00, 0x37, 0x34, 0x3e, 0xa7, 0xea, 0x5c, 0xbd,
+ 0xd2, 0x31, 0x92, 0x3d, 0x90, 0xef, 0xf0, 0xbd, 0x23, 0x3a, 0x57, 0xbd,
+ 0x7f, 0x4c, 0xba, 0x3d, 0x2b, 0x1d, 0xb5, 0x3d, 0x34, 0x8e, 0x54, 0xbd,
+ 0xb5, 0x92, 0x70, 0xbd, 0x2a, 0x00, 0x17, 0xbd, 0x8d, 0xf3, 0xc1, 0xbd,
+ 0x5a, 0x36, 0x36, 0xbd, 0x58, 0xcd, 0x43, 0xbd, 0x93, 0x90, 0xfa, 0xbd,
+ 0x7e, 0x45, 0x8f, 0xbd, 0x20, 0x26, 0x0f, 0xbe, 0x1a, 0x85, 0xdb, 0x3d,
+ 0x8d, 0xeb, 0x8d, 0x3d, 0x34, 0x01, 0x80, 0xbd, 0xdc, 0xfc, 0xa7, 0xbd,
+ 0x20, 0x57, 0x5e, 0xbd, 0xd6, 0x7c, 0xdb, 0xbd, 0x68, 0x0c, 0x71, 0xbd,
+ 0x19, 0xb1, 0xa1, 0x3d, 0xd8, 0x2a, 0xe0, 0xbc, 0x3c, 0xca, 0x75, 0xbc,
+ 0x01, 0xb7, 0x04, 0xbd, 0x39, 0xff, 0x96, 0x3e, 0xdf, 0xa4, 0xee, 0xbd,
+ 0xcc, 0x2e, 0xf9, 0xbd, 0x6d, 0xaa, 0x4c, 0xbe, 0xa0, 0xfd, 0xee, 0x3d,
+ 0x6a, 0x80, 0x88, 0x3d, 0xdc, 0x15, 0x1b, 0xbd, 0xa8, 0x9e, 0x1c, 0xbd,
+ 0x0f, 0xdb, 0x69, 0xbd, 0xe5, 0x6d, 0x75, 0xbe, 0x37, 0xc6, 0x8c, 0xbe,
+ 0xe0, 0x37, 0x83, 0x3d, 0x99, 0x27, 0x1b, 0xbd, 0xa5, 0xbb, 0x0b, 0xbe,
+ 0x45, 0x70, 0x1c, 0x3e, 0x41, 0x50, 0xf6, 0x3d, 0xa0, 0x71, 0x84, 0x3b,
+ 0x7b, 0x94, 0xd9, 0xbd, 0xfd, 0x15, 0x80, 0xbd, 0x2b, 0xa7, 0xc2, 0x3d,
+ 0x2a, 0xfc, 0x00, 0x3e, 0xac, 0xb6, 0x10, 0x3b, 0x25, 0x30, 0x2a, 0xbe,
+ 0x78, 0xd0, 0x2d, 0xbe, 0x8e, 0xaa, 0x0b, 0xbe, 0xac, 0x77, 0x16, 0xbe,
+ 0x4c, 0x92, 0xce, 0x3d, 0x1d, 0xf7, 0x30, 0x3e, 0xf4, 0xde, 0x5a, 0x3e,
+ 0xe1, 0x9b, 0xa8, 0xbd, 0x4f, 0x8f, 0xbf, 0xbd, 0xb3, 0x21, 0x2f, 0xbe,
+ 0x96, 0x91, 0x19, 0x3d, 0xa0, 0x8b, 0x3d, 0x3e, 0xa4, 0xa3, 0x11, 0xbe,
+ 0x98, 0x48, 0x83, 0x3c, 0x06, 0x40, 0x1f, 0xbe, 0x1b, 0x08, 0x10, 0x3e,
+ 0xfc, 0x27, 0x37, 0x3e, 0xd8, 0xb2, 0x9f, 0xbd, 0xa4, 0x68, 0x41, 0xbd,
+ 0x26, 0x71, 0xe3, 0xb9, 0xb6, 0x09, 0x1d, 0xbd, 0x8b, 0x2a, 0xf2, 0x3d,
+ 0xbc, 0x97, 0x1f, 0xbe, 0xf8, 0x27, 0x8e, 0x3d, 0x40, 0x5b, 0x16, 0xbd,
+ 0xd8, 0x28, 0x05, 0xbe, 0x06, 0xc0, 0x64, 0xbe, 0x5d, 0xca, 0x96, 0x3d,
+ 0x63, 0x7c, 0x66, 0x3d, 0xfa, 0x0e, 0xdf, 0xbd, 0xf1, 0x34, 0x04, 0x3e,
+ 0x15, 0xea, 0xa0, 0x3c, 0x14, 0x5b, 0xbc, 0x3d, 0x8c, 0xc9, 0xb9, 0x3b,
+ 0x55, 0x05, 0xfb, 0xbd, 0xc8, 0xc4, 0x3d, 0xbe, 0x84, 0x30, 0x91, 0xbd,
+ 0x76, 0xa5, 0xd7, 0x3c, 0x1b, 0xda, 0xeb, 0xbc, 0x78, 0xfb, 0xb5, 0x3c,
+ 0x0f, 0x1f, 0x6a, 0x3d, 0x74, 0x01, 0xb1, 0xbc, 0xb3, 0xa2, 0x4e, 0xbe,
+ 0x37, 0x96, 0x57, 0x3e, 0x8b, 0x79, 0x13, 0x3d, 0x28, 0x57, 0x34, 0x3d,
+ 0xd4, 0xe0, 0x96, 0xbd, 0xc8, 0x1b, 0x1a, 0x3e, 0x0f, 0xd0, 0xa6, 0x3b,
+ 0xa7, 0x96, 0xf1, 0x3d, 0x4e, 0xc1, 0xe8, 0xbd, 0x95, 0xd4, 0x83, 0xbe,
+ 0x45, 0x89, 0x06, 0x3e, 0xda, 0xfc, 0x5d, 0xbd, 0x68, 0xd9, 0x32, 0x3e,
+ 0x1e, 0x55, 0x29, 0x3c, 0xbf, 0xd9, 0xc4, 0xbd, 0x04, 0x3d, 0x83, 0x3d,
+ 0xde, 0x0d, 0x10, 0xbe, 0x36, 0x71, 0x13, 0xbe, 0xfe, 0x68, 0xdd, 0x3c,
+ 0xa3, 0xe5, 0xe9, 0xbc, 0x94, 0x61, 0x25, 0xbe, 0xfc, 0x89, 0x55, 0xbd,
+ 0x43, 0x86, 0xb2, 0xbd, 0xbe, 0xe0, 0x6d, 0x3c, 0x83, 0x9e, 0x95, 0x3e,
+ 0x27, 0x78, 0xb6, 0x3d, 0x05, 0xec, 0xed, 0x3d, 0x2c, 0xb7, 0x9e, 0x3d,
+ 0x84, 0xec, 0x92, 0x3d, 0x96, 0x6a, 0x5f, 0xbe, 0xc9, 0xbc, 0x24, 0xba,
+ 0x9e, 0x0f, 0x9e, 0x3c, 0xab, 0x4c, 0x03, 0x3d, 0x98, 0xdf, 0x71, 0xbd,
+ 0x68, 0xe0, 0x50, 0xbd, 0x6b, 0xda, 0x3d, 0x3d, 0xce, 0x98, 0xb6, 0xbc,
+ 0xc5, 0x6c, 0x41, 0xbe, 0x05, 0xd1, 0xbc, 0xbe, 0x08, 0x63, 0x0d, 0xbe,
+ 0x8b, 0xe8, 0xcb, 0xbd, 0x21, 0x65, 0xc5, 0xbd, 0xb5, 0x3f, 0xa2, 0x3d,
+ 0x32, 0x17, 0x28, 0x3e, 0xda, 0x33, 0xd3, 0xbd, 0xc1, 0x36, 0x17, 0x3e,
+ 0x96, 0xa5, 0x80, 0xbc, 0xb9, 0x0c, 0x41, 0xbd, 0x29, 0x40, 0x8a, 0xbd,
+ 0xc6, 0x5a, 0x20, 0xbe, 0x06, 0xe7, 0x26, 0xbe, 0x8c, 0x17, 0x47, 0xbe,
+ 0xcd, 0x01, 0x35, 0xbd, 0xa1, 0x63, 0x87, 0xbe, 0x8c, 0xc2, 0x1a, 0x3e,
+ 0xe0, 0x61, 0xa9, 0x3c, 0x21, 0xa6, 0xfb, 0xbc, 0x9f, 0x10, 0x3f, 0xbd,
+ 0x0a, 0x43, 0xf1, 0x3d, 0x67, 0xe2, 0xa0, 0xbd, 0x72, 0x9c, 0x63, 0xbd,
+ 0xad, 0x63, 0xca, 0xbe, 0xfd, 0x2d, 0x58, 0xbd, 0xc4, 0x24, 0x9b, 0xbd,
+ 0x6a, 0x3c, 0x97, 0xbd, 0x87, 0x6d, 0x67, 0x3c, 0xbd, 0x70, 0x8a, 0x3e,
+ 0x4b, 0x00, 0xcd, 0xbd, 0x63, 0xf0, 0xd5, 0x3d, 0xfc, 0x6a, 0xfa, 0x3d,
+ 0xd6, 0xe7, 0x20, 0xbe, 0x82, 0xea, 0xd9, 0x3d, 0x90, 0x6e, 0x1f, 0xbd,
+ 0x93, 0x11, 0x1e, 0x3e, 0xaa, 0x8f, 0x79, 0xbe, 0x15, 0x43, 0xbe, 0xbb,
+ 0x6c, 0x34, 0x46, 0xbd, 0xc7, 0x60, 0x81, 0xbe, 0x5a, 0x9a, 0x29, 0xbe,
+ 0x0b, 0x35, 0xf8, 0x3d, 0xa0, 0xac, 0xab, 0xbd, 0xeb, 0xff, 0x5c, 0x3d,
+ 0x36, 0x56, 0x3f, 0xbe, 0xee, 0x34, 0x46, 0xbe, 0xee, 0xc5, 0x9b, 0x3d,
+ 0x7c, 0x90, 0xc4, 0xbe, 0xda, 0x96, 0x95, 0xbd, 0x5c, 0x29, 0x54, 0xbd,
+ 0x4a, 0x16, 0x8c, 0xbd, 0x22, 0x27, 0x7e, 0x3c, 0x2b, 0xae, 0x6f, 0xbc,
+ 0x2e, 0x6d, 0xaf, 0xbc, 0x63, 0x12, 0xb1, 0xbd, 0xf2, 0xd9, 0xe3, 0x3d,
+ 0x9d, 0x18, 0x51, 0xbe, 0x10, 0x43, 0x1c, 0x3f, 0xd4, 0x15, 0x08, 0x3e,
+ 0xc3, 0x13, 0xd6, 0x3d, 0x99, 0xfb, 0x31, 0x3d, 0xbf, 0x66, 0x8f, 0x3d,
+ 0x68, 0xdc, 0x23, 0xbc, 0x0e, 0xe1, 0x11, 0xbe, 0x62, 0x0e, 0xc7, 0x3d,
+ 0x80, 0xf2, 0x25, 0xbe, 0xc3, 0xe1, 0x0a, 0x3e, 0xad, 0xe2, 0xbe, 0xbd,
+ 0xf4, 0xa5, 0xb2, 0x3d, 0xc1, 0x92, 0xd5, 0x3d, 0x66, 0x22, 0xbf, 0xbd,
+ 0x1d, 0x62, 0x07, 0x3e, 0x71, 0xf2, 0x9b, 0xbd, 0x7d, 0xe1, 0x8e, 0xbe,
+ 0x6f, 0xf3, 0xb8, 0xbd, 0x16, 0x76, 0x6b, 0xbd, 0xb4, 0x81, 0x0e, 0xbd,
+ 0x49, 0x8b, 0x2c, 0xbe, 0xc2, 0x82, 0x2e, 0xbe, 0xfd, 0xd8, 0x13, 0xbe,
+ 0x64, 0x4e, 0x06, 0x3e, 0xc5, 0x0a, 0xab, 0x3d, 0xc1, 0x4a, 0x1f, 0xbe,
+ 0xa3, 0xc0, 0x54, 0x3b, 0xc9, 0x15, 0x9b, 0x3d, 0x3a, 0xbe, 0x30, 0x3e,
+ 0x6a, 0x44, 0x92, 0xbd, 0x1b, 0x60, 0x2c, 0xbe, 0x48, 0x91, 0xe1, 0x3c,
+ 0xe0, 0xae, 0xa1, 0x3d, 0x2f, 0x32, 0x45, 0x3d, 0x7c, 0x47, 0x89, 0x3d,
+ 0xff, 0xe3, 0x0f, 0x3e, 0x33, 0x7c, 0x27, 0xbe, 0x47, 0x57, 0xf7, 0x3d,
+ 0x97, 0x44, 0x22, 0x3d, 0xb3, 0x85, 0x00, 0xbe, 0x66, 0xfb, 0xc4, 0x3d,
+ 0x89, 0x56, 0x9e, 0x3d, 0xaf, 0x86, 0x5f, 0x3c, 0x31, 0x0a, 0xcf, 0x3a,
+ 0xae, 0x39, 0xd1, 0xbd, 0xa8, 0xcc, 0x0c, 0x3d, 0x2b, 0xaa, 0x43, 0xbf,
+ 0x89, 0x7a, 0x3e, 0xbe, 0x6f, 0x43, 0x20, 0x3e, 0xdb, 0x87, 0x0d, 0xbe,
+ 0x93, 0xb9, 0x42, 0x3e, 0x12, 0xa7, 0x76, 0xbe, 0xd9, 0xf0, 0x88, 0xbc,
+ 0x58, 0xde, 0x1d, 0x3c, 0xb5, 0x14, 0xa5, 0x3d, 0x15, 0x6d, 0xd6, 0x3d,
+ 0x95, 0x05, 0x1c, 0xbd, 0xdd, 0x57, 0x53, 0xbe, 0x1a, 0xf7, 0x84, 0x3c,
+ 0xe5, 0xe6, 0x9b, 0xbe, 0x63, 0x19, 0x74, 0x3e, 0x61, 0xc2, 0xfe, 0x3d,
+ 0x31, 0x50, 0x56, 0x3d, 0xd8, 0x21, 0x5e, 0xbc, 0xf4, 0x73, 0x7b, 0x3c,
+ 0xa5, 0x6c, 0x1e, 0xbd, 0x3f, 0xbc, 0xce, 0x3d, 0xf6, 0x28, 0xc9, 0x3b,
+ 0x10, 0x3e, 0x12, 0xbe, 0x6d, 0x5e, 0x02, 0x3e, 0x6a, 0xbb, 0x1c, 0x3e,
+ 0x25, 0xa8, 0x06, 0x3e, 0x7e, 0xd5, 0x0f, 0x3e, 0x2e, 0xdc, 0x98, 0xbd,
+ 0xd6, 0xb1, 0x36, 0xbd, 0x85, 0xb5, 0xe4, 0x3d, 0x4c, 0x45, 0xb2, 0xbd,
+ 0x5b, 0x28, 0xf8, 0xbd, 0x9f, 0xf6, 0x0e, 0x3e, 0xbe, 0x91, 0xbf, 0xbd,
+ 0xf7, 0x4a, 0x08, 0x3e, 0x57, 0x75, 0x96, 0x3d, 0x24, 0x3d, 0xe1, 0x3d,
+ 0xb1, 0x4f, 0x27, 0xbd, 0xca, 0x91, 0x27, 0x3d, 0xb8, 0xd5, 0xad, 0x3c,
+ 0x1e, 0x5e, 0x19, 0xbe, 0x62, 0xb1, 0xe2, 0x3d, 0x88, 0xf3, 0x88, 0xbc,
+ 0x74, 0x87, 0x43, 0x3d, 0xe2, 0x17, 0x9d, 0x3d, 0x03, 0xd7, 0x50, 0xbd,
+ 0x7e, 0xed, 0x8c, 0x3c, 0x9a, 0x13, 0x66, 0x3d, 0x4a, 0x1e, 0x1f, 0xbd,
+ 0xc4, 0x4c, 0x42, 0xbb, 0xa0, 0xc6, 0xeb, 0x3c, 0x78, 0xfe, 0x5a, 0x3d,
+ 0x0a, 0xdb, 0xf6, 0x3d, 0xeb, 0x9b, 0xeb, 0xbd, 0x06, 0x4d, 0xa2, 0xbd,
+ 0xcd, 0x7f, 0x0f, 0x3e, 0x9d, 0xf1, 0xb3, 0x3d, 0x7a, 0xa1, 0xd8, 0x3d,
+ 0xc1, 0x8a, 0x72, 0xbd, 0x7e, 0x0b, 0x15, 0x3d, 0x46, 0x3a, 0xad, 0xbd,
+ 0x0a, 0xb1, 0xe6, 0x3a, 0xa5, 0xec, 0x20, 0xbd, 0x2f, 0x30, 0xc3, 0xbc,
+ 0x08, 0xd3, 0x0c, 0xbe, 0x27, 0xb2, 0xcc, 0xbc, 0xc5, 0x4c, 0xb0, 0x3c,
+ 0x04, 0x27, 0xec, 0x3d, 0xec, 0xf3, 0x8f, 0x3c, 0xe9, 0x5b, 0xfb, 0x3c,
+ 0x34, 0x1c, 0xd0, 0x3c, 0xb6, 0x5a, 0x0d, 0x3d, 0x97, 0xa6, 0xa8, 0xbd,
+ 0xcc, 0xe1, 0xa0, 0xbd, 0x07, 0xca, 0x1e, 0x3e, 0xe6, 0x91, 0x84, 0x3d,
+ 0xa4, 0xf2, 0x20, 0x3e, 0x1a, 0x03, 0xc5, 0x3d, 0xdc, 0xd3, 0x00, 0xbe,
+ 0xae, 0x30, 0xb1, 0xbd, 0x29, 0x43, 0x0b, 0xbe, 0x38, 0x40, 0xa6, 0x3d,
+ 0xbf, 0x4d, 0x11, 0xbe, 0x26, 0x93, 0x18, 0x3e, 0x0c, 0xbe, 0xb9, 0xbd,
+ 0x9f, 0xae, 0xef, 0x3d, 0x61, 0x66, 0xd3, 0x3d, 0x6d, 0x3d, 0x2a, 0xbe,
+ 0x72, 0xd7, 0x03, 0x3e, 0x7a, 0x0b, 0xb1, 0x3d, 0x1a, 0x45, 0xc3, 0x3c,
+ 0x11, 0xbc, 0x76, 0x3c, 0xba, 0x09, 0x35, 0x3d, 0xf9, 0xb3, 0x34, 0x3d,
+ 0x16, 0xb8, 0x36, 0x3d, 0x57, 0x10, 0xd4, 0xba, 0x68, 0xe3, 0xf3, 0x3c,
+ 0x8d, 0x23, 0xbd, 0xbb, 0x2a, 0x99, 0xf7, 0xbd, 0xb6, 0xe0, 0x34, 0xbd,
+ 0xff, 0xc5, 0x24, 0xbd, 0xb3, 0xe7, 0x24, 0xbc, 0x92, 0xaa, 0x8b, 0xbc,
+ 0x50, 0x88, 0xe5, 0x3d, 0xde, 0x29, 0x8b, 0xbc, 0xb6, 0x2d, 0x15, 0xbe,
+ 0xf7, 0x58, 0xf3, 0x3c, 0x40, 0xda, 0xe0, 0xbd, 0x64, 0x83, 0x5f, 0x3c,
+ 0x99, 0x70, 0xfc, 0xbd, 0xf4, 0x01, 0x29, 0x3e, 0xb8, 0x08, 0xa5, 0xbd,
+ 0x45, 0x17, 0xbc, 0xbd, 0x68, 0xf6, 0x72, 0x3d, 0x57, 0x16, 0xb6, 0x3d,
+ 0x05, 0x99, 0xa1, 0xbd, 0xed, 0x88, 0x0c, 0xbe, 0x47, 0x18, 0x35, 0x3a,
+ 0x9b, 0x6d, 0xe2, 0xbd, 0x51, 0x45, 0xc7, 0x3c, 0xbb, 0x82, 0x06, 0x3e,
+ 0x40, 0x12, 0x8d, 0x3d, 0xe8, 0x9f, 0x8c, 0xbc, 0x92, 0x0f, 0x08, 0x3e,
+ 0x46, 0xc9, 0x1b, 0x3e, 0x9a, 0x39, 0xe0, 0x3d, 0x16, 0xd3, 0x3e, 0x3d,
+ 0xab, 0x67, 0xfd, 0xbb, 0x85, 0x7c, 0xba, 0x3d, 0x92, 0x1f, 0x9a, 0x3d,
+ 0xe1, 0xe0, 0x06, 0x3e, 0x07, 0x34, 0xd0, 0xbd, 0x40, 0xe6, 0xb5, 0x3d,
+ 0x90, 0x6a, 0x7f, 0x3d, 0xfe, 0x93, 0x0a, 0x3e, 0x7f, 0xac, 0x64, 0xbd,
+ 0xeb, 0x1b, 0x56, 0xbe, 0xd4, 0x74, 0x96, 0x3e, 0x7c, 0xe9, 0x42, 0x3d,
+ 0x34, 0xa1, 0x8c, 0xbc, 0xfb, 0xdf, 0x84, 0xbe, 0x9e, 0x1c, 0x5c, 0x3d,
+ 0x44, 0xfb, 0xc8, 0x3d, 0x7b, 0xd5, 0xb1, 0x3d, 0x26, 0x65, 0xd9, 0x3c,
+ 0x87, 0xd5, 0xab, 0x3d, 0xc9, 0xde, 0x95, 0xbd, 0x23, 0x86, 0x00, 0x3e,
+ 0xc7, 0xda, 0x23, 0x3d, 0x85, 0xcd, 0xd5, 0xbe, 0xe7, 0x31, 0x87, 0x3c,
+ 0x21, 0x1d, 0x01, 0xbe, 0xfc, 0xa3, 0xfe, 0x3d, 0x48, 0x38, 0x43, 0xbe,
+ 0x94, 0x6a, 0x9b, 0xbd, 0xa2, 0xb6, 0x57, 0xbd, 0xa2, 0x65, 0x69, 0x3e,
+ 0x83, 0x80, 0xb5, 0xbd, 0xbc, 0x26, 0x0a, 0x3e, 0xd3, 0x89, 0x1c, 0xbd,
+ 0xbb, 0xf5, 0x00, 0x3d, 0x6b, 0x13, 0xa1, 0xbd, 0x32, 0xe9, 0x5d, 0xbe,
+ 0x5d, 0xeb, 0x39, 0xbc, 0xbb, 0x14, 0x56, 0x3e, 0x1d, 0x81, 0x4b, 0xbd,
+ 0x4c, 0x19, 0x2b, 0x3d, 0xa9, 0x33, 0x01, 0x3d, 0xd3, 0x19, 0xa3, 0xbd,
+ 0xe1, 0x06, 0xe6, 0x3d, 0x3f, 0x81, 0xfb, 0x3c, 0x1e, 0xce, 0x3c, 0x3e,
+ 0x70, 0x18, 0x2d, 0x3e, 0x9b, 0xe8, 0x43, 0xbd, 0xd0, 0xda, 0x71, 0xbd,
+ 0x7f, 0xcb, 0x57, 0x3e, 0x81, 0x0b, 0xfc, 0xbd, 0xe3, 0x58, 0x1f, 0xbe,
+ 0xab, 0xe0, 0xe3, 0x3d, 0x13, 0xdb, 0x12, 0x3d, 0x63, 0x5d, 0x67, 0x3d,
+ 0x22, 0x80, 0x16, 0x3d, 0x7f, 0xb4, 0xac, 0xbd, 0x86, 0xe2, 0x54, 0xbc,
+ 0x34, 0x01, 0x09, 0x3e, 0xee, 0x18, 0x80, 0x3c, 0x9e, 0xa0, 0x4c, 0xbc,
+ 0x1b, 0xd9, 0xcb, 0x3d, 0x88, 0xe9, 0x8c, 0xbd, 0x42, 0x1b, 0x1b, 0xbe,
+ 0xef, 0x56, 0x5b, 0x3d, 0x85, 0xdf, 0x65, 0x3e, 0x7d, 0xe0, 0x1c, 0xbd,
+ 0x5c, 0x47, 0x33, 0x3d, 0x1a, 0xec, 0x2c, 0xbe, 0xce, 0xa1, 0x64, 0xbb,
+ 0xc1, 0x23, 0xa0, 0x3d, 0xe4, 0x1e, 0xbe, 0xbd, 0x3e, 0xe2, 0x87, 0xbc,
+ 0x96, 0x42, 0x31, 0xbe, 0x84, 0xb6, 0x31, 0x3e, 0xdf, 0xe6, 0xe4, 0xbd,
+ 0x13, 0x4e, 0x02, 0x3e, 0xd3, 0xb6, 0xa9, 0x3e, 0x8f, 0xc4, 0x34, 0xbc,
+ 0xa0, 0x6a, 0x3d, 0xbe, 0xa7, 0xd3, 0x06, 0x3d, 0x9f, 0x34, 0x14, 0xbd,
+ 0x83, 0x01, 0xae, 0x3d, 0xc4, 0xa9, 0xd2, 0x3d, 0x30, 0xbf, 0x7c, 0xbd,
+ 0xff, 0x31, 0xff, 0xbd, 0xe7, 0xac, 0x1f, 0xbd, 0xae, 0xe1, 0xdd, 0xbd,
+ 0xe2, 0x14, 0xcd, 0x3b, 0xb5, 0x4e, 0xc7, 0xbe, 0xc6, 0x0e, 0x08, 0xbd,
+ 0x02, 0xad, 0x29, 0xbd, 0x50, 0x44, 0x16, 0xbe, 0xcd, 0x76, 0xb7, 0x3e,
+ 0xb1, 0x40, 0x2e, 0xbe, 0x15, 0x97, 0x16, 0xbe, 0x72, 0xb3, 0x17, 0x3e,
+ 0xdc, 0x23, 0xe9, 0xbd, 0xf6, 0x5e, 0x8a, 0xbe, 0xda, 0x31, 0x23, 0xbe,
+ 0x03, 0x25, 0x2d, 0x3d, 0x8e, 0x4b, 0x20, 0xbe, 0x8b, 0x98, 0xdc, 0xbc,
+ 0x21, 0x86, 0x05, 0x3d, 0x09, 0xd5, 0xca, 0xbd, 0xc0, 0xd3, 0xcb, 0x3d,
+ 0x6e, 0xec, 0xf0, 0xbd, 0xae, 0x1d, 0x37, 0xbe, 0xa2, 0xec, 0xa2, 0x3e,
+ 0xcb, 0x3d, 0xc6, 0xbb, 0x65, 0x7d, 0x09, 0x3e, 0xee, 0x81, 0x02, 0xbe,
+ 0xaa, 0x6e, 0x44, 0xbe, 0xa8, 0xce, 0x71, 0xbd, 0x52, 0x10, 0x48, 0xbd,
+ 0x31, 0x0a, 0x8c, 0x3e, 0xd7, 0xee, 0x09, 0x3e, 0x13, 0xf0, 0x86, 0xbe,
+ 0x86, 0xc8, 0xc5, 0xbe, 0x80, 0xc3, 0xa5, 0xba, 0x18, 0x59, 0xb1, 0xbc,
+ 0xf5, 0x69, 0x42, 0x3d, 0xe5, 0x7d, 0x92, 0xbd, 0xcb, 0x3e, 0x31, 0x3e,
+ 0x64, 0xad, 0xbf, 0xbd, 0x49, 0x05, 0x29, 0x3c, 0xa3, 0x16, 0x04, 0x3d,
+ 0xa3, 0x17, 0x00, 0xbd, 0xb4, 0x87, 0x5a, 0xbd, 0xc3, 0x82, 0xf8, 0xbd,
+ 0x4c, 0x05, 0xc8, 0xbd, 0x56, 0x42, 0x01, 0x3e, 0x90, 0x01, 0x16, 0xbe,
+ 0xcb, 0xd5, 0x66, 0xbe, 0x3f, 0x90, 0x68, 0x3d, 0xcd, 0x17, 0x06, 0xbe,
+ 0x87, 0xd9, 0x5d, 0xbd, 0x65, 0x31, 0x15, 0xbc, 0x7e, 0x03, 0x59, 0xbd,
+ 0x14, 0xd9, 0x27, 0xbe, 0xa0, 0x35, 0x3a, 0xbe, 0x77, 0x28, 0xe1, 0x3d,
+ 0x03, 0x8a, 0xe4, 0xbc, 0xfd, 0x48, 0x12, 0x3e, 0xbc, 0x03, 0xa1, 0xbe,
+ 0xd4, 0x63, 0x16, 0xbe, 0x05, 0x67, 0x43, 0xbd, 0x77, 0x81, 0xd7, 0x3d,
+ 0xfc, 0x2e, 0x06, 0xbe, 0xcf, 0xf1, 0x14, 0x3d, 0xfd, 0x31, 0x30, 0xbe,
+ 0x9d, 0xf9, 0xfd, 0x3d, 0xa8, 0x01, 0xd6, 0xbd, 0xfc, 0xac, 0xd5, 0xbd,
+ 0xbf, 0x5e, 0x2d, 0xbe, 0x33, 0x1c, 0x34, 0xbd, 0xe8, 0x48, 0xe4, 0x3d,
+ 0xfb, 0xfb, 0x4f, 0x3d, 0x3e, 0xa7, 0x59, 0xbe, 0xc7, 0x02, 0x24, 0x3e,
+ 0x49, 0x0f, 0xa4, 0x3d, 0xba, 0x10, 0x25, 0xbe, 0x0b, 0x87, 0xcb, 0xbc,
+ 0x4d, 0xa8, 0x1e, 0xbe, 0x45, 0xd7, 0x5e, 0xbe, 0x13, 0x67, 0x30, 0x3e,
+ 0xb6, 0x2e, 0x41, 0x3d, 0x0e, 0x9b, 0x8b, 0xbc, 0x18, 0x51, 0x13, 0xbc,
+ 0x03, 0xa2, 0xba, 0x3d, 0x8b, 0x03, 0x21, 0xbd, 0xd9, 0x98, 0xb3, 0x3d,
+ 0x5b, 0xc3, 0x60, 0x3d, 0xcc, 0xde, 0x1b, 0xbd, 0x45, 0x56, 0x8a, 0xbc,
+ 0x12, 0xaf, 0xe5, 0x3b, 0xde, 0xbe, 0xa9, 0xbd, 0xf0, 0x58, 0x03, 0x3d,
+ 0xc5, 0x99, 0x10, 0x3d, 0xba, 0x43, 0xa0, 0x3d, 0x48, 0x76, 0x2f, 0x3e,
+ 0x46, 0x3d, 0xa3, 0xbc, 0xce, 0xce, 0x38, 0xbd, 0x72, 0x0f, 0x26, 0x3d,
+ 0x28, 0x3c, 0x10, 0x3c, 0x4c, 0xee, 0xf6, 0x3d, 0x9f, 0x29, 0xf8, 0x3d,
+ 0x1f, 0x3d, 0x5f, 0xbd, 0x5b, 0x84, 0x77, 0x3d, 0xd4, 0xaf, 0x07, 0x3d,
+ 0x7a, 0x7d, 0x00, 0xbe, 0x97, 0x8c, 0xf5, 0x3c, 0x0f, 0x52, 0x3e, 0xbe,
+ 0x70, 0x67, 0x26, 0xbe, 0x6c, 0x10, 0xf9, 0x3d, 0x89, 0x24, 0x4a, 0x3b,
+ 0xf5, 0x97, 0x5e, 0xbd, 0xe2, 0xd3, 0x2d, 0x39, 0xc4, 0x30, 0xdd, 0x3d,
+ 0xbc, 0x7c, 0xcd, 0x3d, 0x25, 0xa2, 0x3d, 0xbe, 0xf2, 0x18, 0x10, 0x3e,
+ 0x3a, 0x63, 0xe5, 0xbb, 0xea, 0x98, 0x5c, 0x3e, 0x28, 0xca, 0xcd, 0x3d,
+ 0x97, 0xa4, 0xd3, 0xbd, 0x96, 0x2b, 0x89, 0xbd, 0x93, 0x29, 0x16, 0xbd,
+ 0x01, 0xf8, 0xb9, 0xbd, 0x02, 0x3e, 0x91, 0x3c, 0x43, 0xc9, 0xc3, 0xbd,
+ 0xbf, 0x2c, 0xf7, 0xbc, 0x6a, 0xb6, 0x05, 0xbe, 0x9b, 0xa9, 0x9c, 0x3d,
+ 0xa2, 0x35, 0x29, 0xbe, 0xed, 0xa8, 0xbe, 0x3a, 0xc3, 0xef, 0x06, 0xbe,
+ 0x04, 0x54, 0x95, 0x3d, 0x50, 0xa0, 0x4f, 0x3c, 0x02, 0xf2, 0xd7, 0xbd,
+ 0x8b, 0x70, 0x06, 0xbe, 0x31, 0x47, 0x89, 0x3d, 0xab, 0xbd, 0x0b, 0xbe,
+ 0x4d, 0x2a, 0x1b, 0xbe, 0x5c, 0xb6, 0x0c, 0xbe, 0x90, 0xbb, 0x91, 0xbd,
+ 0x26, 0x02, 0x10, 0xbe, 0x30, 0x2d, 0x11, 0x3e, 0x4e, 0x56, 0x1c, 0x3d,
+ 0x85, 0x35, 0x97, 0x3d, 0x9f, 0x37, 0xd7, 0xbd, 0x55, 0x46, 0x90, 0xbc,
+ 0x69, 0x33, 0x09, 0xbe, 0x16, 0x19, 0xbe, 0xbc, 0x07, 0xd4, 0x11, 0xbe,
+ 0xc3, 0x26, 0x2a, 0x3e, 0xac, 0xb3, 0xd5, 0x3d, 0xeb, 0x98, 0x8a, 0x3d,
+ 0xe9, 0x99, 0xea, 0xbc, 0xb3, 0x40, 0x3f, 0xbe, 0xee, 0x6d, 0xa8, 0xbd,
+ 0xd9, 0x5f, 0x92, 0xbd, 0x82, 0x51, 0xd6, 0xbe, 0x2f, 0xe3, 0x1b, 0xbd,
+ 0x53, 0xbc, 0x06, 0xbc, 0x65, 0xca, 0xce, 0x3c, 0xe3, 0xf7, 0xe9, 0xbe,
+ 0x31, 0x49, 0xd1, 0x3c, 0xab, 0x47, 0x01, 0x3e, 0x4a, 0x69, 0xb0, 0xbe,
+ 0x43, 0x24, 0xea, 0x3a, 0xbd, 0xa1, 0xe4, 0xbd, 0x8b, 0x25, 0xa5, 0xbd,
+ 0xbb, 0x95, 0xc0, 0x3d, 0xc5, 0x76, 0x84, 0x3d, 0x84, 0x7b, 0x7c, 0x3e,
+ 0x85, 0x9d, 0x55, 0x3e, 0xf5, 0xe5, 0x56, 0xbe, 0xd8, 0xe0, 0x17, 0xbe,
+ 0xd7, 0xbc, 0x85, 0xbe, 0xdd, 0x2c, 0xad, 0x3b, 0x6a, 0x4a, 0x2d, 0x3e,
+ 0x7a, 0xb7, 0xa5, 0xbd, 0xf2, 0xba, 0xb8, 0x3d, 0x13, 0x90, 0xb6, 0x3d,
+ 0x96, 0xe9, 0xd6, 0x3d, 0x06, 0x02, 0x49, 0xbe, 0x39, 0x9e, 0x49, 0x3e,
+ 0xde, 0xc4, 0xb9, 0x3d, 0x96, 0x1b, 0xa3, 0x3c, 0xc4, 0xc6, 0x1f, 0xbd,
+ 0x13, 0x1b, 0x3f, 0x3e, 0xe5, 0x4a, 0xd2, 0x3e, 0xcc, 0x3a, 0x23, 0xbe,
+ 0x3a, 0x90, 0x6d, 0xbe, 0xe6, 0x6a, 0x6a, 0x3e, 0xdf, 0xc3, 0x5c, 0xbb,
+ 0x73, 0x08, 0x6a, 0xbd, 0xde, 0xf7, 0xa7, 0x3d, 0xaa, 0xd2, 0x8b, 0xbe,
+ 0xa9, 0x90, 0x4b, 0xbe, 0x3e, 0xc6, 0x55, 0xbe, 0x09, 0xf6, 0x25, 0xbe,
+ 0x73, 0xa9, 0xe8, 0xbd, 0x94, 0xdc, 0x43, 0x3e, 0x20, 0x08, 0x73, 0x3d,
+ 0x1d, 0xb8, 0x11, 0x3d, 0x41, 0x43, 0x04, 0xbd, 0x97, 0x2a, 0x39, 0xbe,
+ 0xf0, 0x79, 0x92, 0x3e, 0x94, 0xa2, 0xc4, 0xbc, 0x19, 0x4c, 0x81, 0xbd,
+ 0x85, 0x2b, 0x29, 0xbe, 0x0d, 0x03, 0x54, 0x3e, 0x8a, 0xcc, 0x2e, 0x3e,
+ 0x1d, 0xd0, 0x0c, 0xbd, 0x43, 0xd9, 0x1a, 0x3d, 0xce, 0xaa, 0xb3, 0xbe,
+ 0x40, 0xce, 0xa0, 0xbd, 0xd0, 0xa6, 0x90, 0x3e, 0xab, 0x6b, 0x80, 0xbd,
+ 0xad, 0xfb, 0x9c, 0xbe, 0x1f, 0xe6, 0xff, 0x3c, 0xb1, 0xf2, 0x17, 0xbe,
+ 0xef, 0xa2, 0xd1, 0xbd, 0x89, 0xf1, 0x67, 0x3d, 0xe7, 0x58, 0x57, 0xbd,
+ 0xe5, 0x7b, 0x35, 0xbe, 0x72, 0xcd, 0x06, 0x3d, 0x34, 0x31, 0x20, 0x3d,
+ 0x3a, 0x0f, 0x99, 0xbe, 0x6e, 0x02, 0x83, 0xbe, 0x17, 0xdc, 0x03, 0xbd,
+ 0xe4, 0x25, 0x59, 0xbd, 0x2f, 0x70, 0xd5, 0xbd, 0xbc, 0xb7, 0x22, 0xbd,
+ 0x12, 0x32, 0x4d, 0xbd, 0x1e, 0xf4, 0x97, 0xbe, 0x58, 0x69, 0x5c, 0xbe,
+ 0xb0, 0x9e, 0xf1, 0xbc, 0x6a, 0x20, 0x44, 0x3e, 0x8e, 0x4d, 0x5a, 0x3e,
+ 0x11, 0x1b, 0x92, 0x3d, 0x51, 0x63, 0x5a, 0x3d, 0x61, 0x8c, 0xb9, 0xbe,
+ 0xf2, 0x5c, 0x3a, 0xbe, 0xf2, 0xa9, 0xa3, 0x3d, 0x10, 0xb1, 0x91, 0x3e,
+ 0xf8, 0x13, 0xb0, 0xbd, 0xa5, 0x71, 0x9c, 0xbd, 0x4b, 0x1c, 0x06, 0xbe,
+ 0xf5, 0x93, 0x5e, 0x3e, 0x41, 0x37, 0xd6, 0x3e, 0x87, 0x82, 0xcc, 0x3e,
+ 0x52, 0xf5, 0xaf, 0x3d, 0xd0, 0xf8, 0x17, 0x3d, 0xac, 0xa0, 0xe5, 0x3d,
+ 0xc8, 0x87, 0x6b, 0x3e, 0xfb, 0xcf, 0x34, 0xbe, 0xc9, 0x14, 0xa7, 0xbb,
+ 0xaf, 0x8d, 0x25, 0x3e, 0x20, 0x83, 0xc6, 0x3d, 0x0a, 0x40, 0x2c, 0x3e,
+ 0xa1, 0x64, 0x5d, 0x3e, 0x80, 0x34, 0x3a, 0x3c, 0x1d, 0xd8, 0x21, 0xbe,
+ 0x0d, 0x7a, 0x19, 0x3e, 0x3f, 0x8c, 0xe4, 0x3c, 0x44, 0x6d, 0x49, 0xbc,
+ 0x03, 0x73, 0x1d, 0x3d, 0x1e, 0xfd, 0xbe, 0xbc, 0xb5, 0x72, 0xc6, 0xbc,
+ 0x4b, 0x75, 0x7f, 0xbd, 0xb4, 0x5f, 0x41, 0xbe, 0xee, 0x29, 0x0c, 0x3d,
+ 0x65, 0xfd, 0x0c, 0xbe, 0x9b, 0x01, 0xa5, 0x3d, 0x5d, 0x4b, 0x03, 0x3e,
+ 0x2c, 0xd1, 0xb4, 0x3d, 0x83, 0x6a, 0xb1, 0x3e, 0x90, 0xf2, 0xcd, 0x3c,
+ 0xab, 0xf5, 0x44, 0x3e, 0xfa, 0xbf, 0x46, 0x3c, 0x70, 0xe6, 0x3a, 0xbd,
+ 0xdc, 0x4e, 0x04, 0xbe, 0x67, 0xb8, 0x30, 0xbe, 0x96, 0x11, 0x2c, 0xbe,
+ 0x7b, 0x72, 0x1c, 0x3e, 0xb0, 0x15, 0x24, 0xbe, 0x22, 0xa3, 0x5b, 0xbd,
+ 0x4f, 0x98, 0x10, 0x3e, 0xfb, 0xae, 0x40, 0x3c, 0x75, 0x82, 0x5a, 0x3d,
+ 0x98, 0x0c, 0x42, 0xbe, 0x54, 0xab, 0xc3, 0xbe, 0xe0, 0x08, 0x4b, 0xbb,
+ 0x71, 0x84, 0xe0, 0x3d, 0x12, 0x33, 0x4c, 0x3e, 0xe0, 0x2b, 0x27, 0x3e,
+ 0x84, 0x11, 0x1e, 0x3e, 0xc2, 0x01, 0xad, 0x3d, 0x94, 0xaa, 0xf8, 0xbc,
+ 0xca, 0xd9, 0x3d, 0x3e, 0xb6, 0x42, 0x15, 0xbe, 0xac, 0x77, 0x81, 0x3d,
+ 0x75, 0x5d, 0x41, 0xbd, 0x56, 0x7c, 0xbd, 0x3d, 0xb8, 0xa1, 0x51, 0x3d,
+ 0x8c, 0x1c, 0x08, 0x3c, 0x3f, 0x9c, 0x4a, 0xbd, 0x93, 0x19, 0x02, 0xbe,
+ 0x02, 0xf2, 0xce, 0x3c, 0x28, 0x56, 0xc5, 0x3d, 0xff, 0xfe, 0x98, 0x3d,
+ 0xa8, 0xb6, 0xde, 0x3d, 0xac, 0x41, 0xb0, 0xbd, 0x64, 0x50, 0x3f, 0x3e,
+ 0xe2, 0x71, 0xbd, 0xbd, 0xfb, 0x39, 0x3a, 0xbe, 0xfe, 0xc8, 0x8f, 0x3b,
+ 0x95, 0x09, 0x3f, 0xbe, 0x18, 0xbc, 0xc9, 0x3d, 0x7b, 0x77, 0x2b, 0x3e,
+ 0x4e, 0xa5, 0xd5, 0x3d, 0x75, 0x77, 0x4e, 0x3e, 0x32, 0xa6, 0x99, 0xbd,
+ 0xba, 0x9e, 0xa7, 0xbd, 0xf1, 0x78, 0xf2, 0xba, 0x6c, 0x25, 0xd2, 0x3d,
+ 0x20, 0x61, 0x86, 0xbd, 0x84, 0x4e, 0xf3, 0x3d, 0x86, 0x73, 0x25, 0x3e,
+ 0xd8, 0x3c, 0x07, 0xbe, 0x22, 0xb9, 0xaf, 0xbd, 0x39, 0x3d, 0x16, 0x3e,
+ 0x5c, 0x39, 0x11, 0xbe, 0x0b, 0xee, 0x3e, 0x3e, 0x41, 0x46, 0x02, 0x3e,
+ 0xd4, 0xa8, 0x48, 0x3e, 0xfb, 0x3c, 0x81, 0x3d, 0x5e, 0x21, 0x46, 0x3e,
+ 0x98, 0xaa, 0xc8, 0x3c, 0x0a, 0x1b, 0xf1, 0x3d, 0xe1, 0x57, 0xec, 0xbd,
+ 0xc3, 0x5e, 0x51, 0x3d, 0x76, 0x0e, 0x95, 0x3d, 0x18, 0x89, 0x9b, 0x3d,
+ 0x41, 0x4d, 0xcb, 0xbd, 0xd9, 0x1d, 0xa2, 0x3d, 0x93, 0x32, 0xd2, 0xbd,
+ 0xfe, 0xa0, 0x8c, 0xbe, 0xb3, 0x9a, 0x15, 0x3e, 0x2e, 0xc7, 0x76, 0xbe,
+ 0x4b, 0xfe, 0xa4, 0x3e, 0x41, 0x07, 0xb2, 0xbc, 0xf0, 0xb5, 0x5c, 0xbd,
+ 0x8f, 0x44, 0x8c, 0x3d, 0x70, 0xee, 0xcf, 0x3b, 0x79, 0x49, 0xfe, 0x3e,
+ 0x0c, 0x0e, 0x5e, 0xbd, 0x4f, 0xc6, 0x0f, 0xbc, 0x0f, 0xbd, 0x2f, 0x3e,
+ 0xee, 0x41, 0xde, 0xbd, 0xce, 0x68, 0x41, 0x3d, 0x2d, 0xad, 0xec, 0x3d,
+ 0x99, 0x01, 0x86, 0x3d, 0xf8, 0x95, 0x5b, 0x37, 0x14, 0x80, 0x01, 0x3e,
+ 0x8b, 0x31, 0xa1, 0x39, 0xfc, 0x97, 0xc0, 0x3c, 0x12, 0xb1, 0x4c, 0x3d,
+ 0x19, 0x87, 0x00, 0xbe, 0x44, 0xad, 0x85, 0xbc, 0xee, 0x98, 0x8f, 0x3e,
+ 0x57, 0x0b, 0x7c, 0x3d, 0x01, 0xab, 0x5c, 0x3e, 0x5c, 0x93, 0x07, 0xbc,
+ 0x79, 0x3e, 0x41, 0xbe, 0x3f, 0x5c, 0x26, 0xbe, 0x60, 0xfe, 0x2e, 0x3e,
+ 0x6e, 0x5c, 0xd8, 0xbe, 0xf8, 0xe0, 0x85, 0x3d, 0x24, 0x4f, 0xb1, 0x3e,
+ 0x01, 0xc7, 0x2a, 0xbc, 0x49, 0xbb, 0xe3, 0xbd, 0x0d, 0x4b, 0xc6, 0x3d,
+ 0x8a, 0x94, 0x8d, 0x3d, 0x2d, 0xeb, 0xa1, 0xbd, 0x31, 0x70, 0x14, 0x3e,
+ 0x47, 0xb2, 0xe0, 0xbb, 0x9e, 0xd5, 0x41, 0x3e, 0xb9, 0xfd, 0x1c, 0xbe,
+ 0x9a, 0x9b, 0x94, 0x3d, 0xcd, 0x22, 0x11, 0x3d, 0x90, 0x87, 0xe2, 0xbb,
+ 0x3f, 0x60, 0x14, 0x3e, 0xa5, 0x8e, 0x25, 0x3e, 0x08, 0x87, 0x0f, 0x3e,
+ 0x1f, 0x2e, 0xe2, 0xbd, 0x3e, 0x6f, 0x7d, 0xbd, 0x94, 0x09, 0xff, 0xbd,
+ 0xb5, 0x4f, 0x8f, 0xbd, 0x16, 0x96, 0xba, 0x3d, 0xc1, 0xcc, 0xeb, 0x3d,
+ 0x02, 0xfd, 0xe9, 0xbe, 0xe5, 0x13, 0x5f, 0xbd, 0x3d, 0x54, 0xa0, 0x3d,
+ 0xc2, 0x2b, 0xbc, 0x3d, 0x79, 0x29, 0x22, 0xbc, 0x70, 0x55, 0x60, 0x3e,
+ 0x9e, 0x2e, 0x19, 0x3e, 0xbf, 0x64, 0x15, 0x3e, 0x13, 0xaa, 0x51, 0x3c,
+ 0xab, 0xbb, 0x23, 0xbe, 0x38, 0x3e, 0x1d, 0xbd, 0x13, 0xa5, 0xc2, 0xbd,
+ 0x63, 0x04, 0x1e, 0xbe, 0x2c, 0x74, 0xf2, 0x3d, 0x6c, 0x53, 0x3a, 0xbe,
+ 0x5c, 0x15, 0x16, 0x3e, 0x83, 0xd6, 0xbb, 0xbd, 0x21, 0x35, 0x03, 0xbe,
+ 0xae, 0x9e, 0x58, 0xbd, 0x8b, 0x2f, 0xb1, 0x3d, 0x27, 0xf4, 0x16, 0xbe,
+ 0x83, 0x9a, 0x6e, 0xbe, 0x90, 0x04, 0xa1, 0xbc, 0x0a, 0x67, 0x22, 0xbe,
+ 0xec, 0xc3, 0xa3, 0x3d, 0xea, 0xc0, 0x88, 0x3d, 0xf4, 0x3e, 0x62, 0xbd,
+ 0xf8, 0xf0, 0xc3, 0x3d, 0x8e, 0x35, 0xe3, 0x3d, 0x4d, 0xed, 0xcc, 0x3d,
+ 0x19, 0x0c, 0x5d, 0xbd, 0xde, 0x57, 0xc4, 0xbd, 0xf0, 0x79, 0xa5, 0x3b,
+ 0x70, 0xf8, 0xe3, 0x3d, 0xe7, 0x60, 0x52, 0xbe, 0xec, 0x6f, 0x36, 0xbe,
+ 0x8b, 0x51, 0x0e, 0x3b, 0xc0, 0x0f, 0x16, 0xbe, 0x6d, 0x5c, 0x8e, 0x3d,
+ 0x5c, 0x89, 0x5a, 0x3c, 0x1b, 0x2b, 0x59, 0xbe, 0x09, 0x2e, 0xac, 0x3b,
+ 0xb9, 0xbb, 0x9a, 0x3d, 0x8c, 0x1d, 0xc2, 0x3d, 0x13, 0xb1, 0x14, 0xbe,
+ 0x5d, 0xd9, 0x64, 0x3d, 0xfa, 0x97, 0x32, 0xbd, 0xbe, 0x84, 0x16, 0x3e,
+ 0x4b, 0xf3, 0xaa, 0x3d, 0x40, 0x70, 0xe6, 0x3d, 0x05, 0x77, 0x0c, 0xbe,
+ 0x05, 0xa8, 0xa9, 0x3d, 0x67, 0xa6, 0xba, 0xbd, 0x9d, 0x34, 0x57, 0xbd,
+ 0x9b, 0x5e, 0xc7, 0xbd, 0xcb, 0xfe, 0xed, 0x3c, 0xb2, 0xfb, 0xba, 0x3d,
+ 0xd9, 0xd6, 0xa5, 0x3d, 0x8e, 0x0a, 0x6a, 0xbd, 0xb2, 0xf0, 0x4e, 0x3d,
+ 0xe8, 0x08, 0x3f, 0x3e, 0x93, 0xe3, 0x16, 0x3e, 0xe9, 0x52, 0x5e, 0xbe,
+ 0x22, 0x43, 0xd3, 0x3c, 0x73, 0x9c, 0x55, 0x3e, 0x0e, 0xae, 0x1c, 0xbe,
+ 0x49, 0x24, 0xca, 0x3d, 0x6c, 0x32, 0x55, 0x3d, 0x96, 0x77, 0xdf, 0xbd,
+ 0x9f, 0x4b, 0x4a, 0xbe, 0x97, 0xb7, 0xdc, 0x3c, 0x72, 0x95, 0x58, 0x3d,
+ 0x49, 0xa6, 0x18, 0xbe, 0x0f, 0x05, 0xd6, 0xbd, 0x2c, 0x1c, 0x1e, 0xbe,
+ 0xc7, 0xb7, 0x43, 0xbd, 0xb2, 0xb1, 0x76, 0xbd, 0x4e, 0xb7, 0xf5, 0xbd,
+ 0x36, 0x53, 0x1e, 0xbe, 0x3a, 0x5a, 0x07, 0x3e, 0x02, 0xc8, 0x18, 0xbd,
+ 0xd0, 0xdf, 0xff, 0xbd, 0x68, 0xaa, 0x6c, 0x3d, 0xfa, 0x4b, 0xc7, 0x3d,
+ 0x95, 0xfc, 0x59, 0xbe, 0x91, 0xb2, 0x92, 0x3d, 0x3c, 0xb4, 0x2a, 0x3d,
+ 0xfd, 0xc6, 0x02, 0x3e, 0xeb, 0xc7, 0x0f, 0x3d, 0x0e, 0xca, 0x67, 0x3d,
+ 0xf7, 0x1f, 0xe4, 0x3d, 0xcd, 0x69, 0x01, 0xbe, 0xb2, 0x87, 0x7c, 0x3e,
+ 0x91, 0x19, 0x19, 0xbe, 0x49, 0xd4, 0x14, 0xbd, 0xfe, 0xdf, 0x44, 0x3e,
+ 0x77, 0xd0, 0xb6, 0xbd, 0xba, 0xdf, 0x15, 0x3e, 0xda, 0xdd, 0x2b, 0xbe,
+ 0x64, 0x1a, 0x8d, 0xbd, 0x0c, 0xb6, 0x54, 0x3e, 0x5e, 0xd4, 0x20, 0x3e,
+ 0xe8, 0x14, 0xdf, 0xbc, 0x2a, 0xe9, 0x97, 0xbd, 0x72, 0x58, 0xae, 0xbd,
+ 0x92, 0x2b, 0x41, 0xbe, 0xca, 0xf6, 0x57, 0xbe, 0xf2, 0xc1, 0xad, 0xbc,
+ 0x36, 0xee, 0x78, 0xbe, 0xa1, 0x15, 0x74, 0xb9, 0x04, 0xc8, 0x20, 0x3e,
+ 0xd8, 0x0e, 0x32, 0xbe, 0xb3, 0xb2, 0xb6, 0x3e, 0x4f, 0x7e, 0x58, 0xbd,
+ 0xf0, 0xca, 0x36, 0xbd, 0xb9, 0x25, 0x0e, 0xbb, 0x85, 0x5b, 0xc8, 0x3d,
+ 0xc8, 0x31, 0x8e, 0xbe, 0x6d, 0xc3, 0xfb, 0xbd, 0x29, 0xbb, 0xe4, 0xbe,
+ 0x8d, 0x7d, 0x20, 0x3e, 0x34, 0xc8, 0x29, 0xbe, 0x79, 0xf2, 0xf6, 0xbc,
+ 0x59, 0x40, 0x7c, 0x3e, 0x5b, 0xe1, 0x22, 0x3e, 0x79, 0x31, 0x83, 0xbc,
+ 0xce, 0x61, 0x25, 0xbe, 0x53, 0xe0, 0x1f, 0xbe, 0x2e, 0xbf, 0x14, 0xbe,
+ 0xae, 0x5d, 0x21, 0x3c, 0x8f, 0x6b, 0xc8, 0x3c, 0x6d, 0x22, 0x78, 0xbe,
+ 0x0a, 0x5c, 0x9d, 0xbc, 0xab, 0x78, 0xf0, 0xbd, 0x89, 0xf4, 0x9b, 0xbe,
+ 0xcc, 0x20, 0x1a, 0x3d, 0x89, 0x46, 0xa4, 0x3d, 0x43, 0xd8, 0x98, 0x3d,
+ 0x5e, 0x0d, 0x7c, 0x3d, 0xa1, 0x0e, 0x8b, 0xbe, 0x89, 0xa9, 0x19, 0x3e,
+ 0x2e, 0x4e, 0xce, 0x3d, 0xd0, 0x6c, 0x1c, 0x3d, 0xdd, 0x62, 0xac, 0xbd,
+ 0x3b, 0xee, 0x14, 0x3e, 0x64, 0xe6, 0x20, 0xbe, 0x54, 0xdf, 0x0e, 0x3e,
+ 0xc0, 0x37, 0x13, 0xbd, 0x33, 0xfd, 0x17, 0xbe, 0xbf, 0x92, 0xc0, 0xbc,
+ 0x4c, 0x8d, 0x8e, 0xbe, 0xb4, 0xfb, 0xfe, 0x3a, 0xc5, 0x7e, 0x82, 0x3a,
+ 0x97, 0xb4, 0xa8, 0x3d, 0xda, 0x31, 0x90, 0x3e, 0x77, 0x1a, 0x59, 0x3e,
+ 0x0a, 0xb7, 0x8b, 0xbd, 0x21, 0x7b, 0x63, 0xbe, 0x28, 0x08, 0x21, 0x3e,
+ 0x29, 0x6e, 0x6e, 0x3e, 0x0e, 0xc5, 0xa1, 0x3d, 0x74, 0x61, 0xd5, 0x3b,
+ 0xe0, 0xb2, 0xf8, 0xbd, 0x0e, 0x32, 0xae, 0xbc, 0x74, 0xe2, 0x5b, 0xbd,
+ 0x5c, 0x3f, 0xc6, 0xbd, 0xd1, 0xb2, 0x0a, 0xbe, 0x38, 0x6e, 0x0c, 0xbe,
+ 0xea, 0xac, 0x40, 0x3e, 0x07, 0x1c, 0x34, 0xbd, 0x28, 0xca, 0x79, 0xbe,
+ 0x8a, 0x32, 0x13, 0xbe, 0xc8, 0x7b, 0x4c, 0x3e, 0x44, 0x1c, 0x77, 0x3d,
+ 0x49, 0x0c, 0x34, 0xbd, 0x2c, 0x2e, 0xc5, 0x3e, 0x67, 0xd5, 0x85, 0xbd,
+ 0x0b, 0x7e, 0x4a, 0x3d, 0x6c, 0x26, 0x2e, 0xbe, 0xae, 0x97, 0x16, 0xbe,
+ 0x4b, 0x55, 0x6c, 0x3e, 0xf5, 0x84, 0x86, 0xbe, 0xe7, 0x71, 0x6d, 0xbe,
+ 0x0b, 0xb3, 0xbe, 0x3c, 0xb3, 0xe8, 0xf2, 0x3d, 0x74, 0xca, 0x48, 0x3e,
+ 0xb3, 0x13, 0x54, 0xbe, 0xa2, 0xd0, 0xa1, 0x3e, 0xb4, 0x36, 0x4b, 0x3e,
+ 0x78, 0x5e, 0x69, 0xbe, 0xb5, 0xd4, 0x6b, 0x3d, 0x76, 0x34, 0x26, 0xbe,
+ 0x18, 0x34, 0x6f, 0xbc, 0x94, 0x4b, 0x36, 0xbe, 0x94, 0x20, 0x32, 0x3d,
+ 0x1d, 0x97, 0x71, 0xbd, 0x13, 0x07, 0x2b, 0xbc, 0xb7, 0xde, 0x23, 0x3e,
+ 0x1b, 0xcb, 0x66, 0x3e, 0x33, 0x34, 0x22, 0xbb, 0xb2, 0x97, 0x38, 0xbd,
+ 0x41, 0xe5, 0xd0, 0xbd, 0xce, 0x9d, 0x07, 0x3e, 0x0c, 0x5c, 0xc9, 0x3e,
+ 0x9c, 0xb7, 0xca, 0x3c, 0x90, 0xa4, 0xd5, 0xbd, 0x37, 0xe0, 0x8b, 0x3e,
+ 0x13, 0xee, 0x56, 0xbd, 0x28, 0xc6, 0x70, 0xbe, 0x91, 0x2e, 0x41, 0x3d,
+ 0x0b, 0x57, 0x9b, 0x3d, 0x5c, 0x92, 0xfd, 0x3d, 0x46, 0x77, 0xa8, 0xbd,
+ 0x80, 0xc2, 0x57, 0xbc, 0x68, 0x14, 0x9d, 0x3e, 0x2d, 0x4b, 0xfa, 0x3b,
+ 0xf0, 0xa6, 0x06, 0xbe, 0x60, 0x40, 0xd1, 0xbd, 0x49, 0x0b, 0xfe, 0xbc,
+ 0xc0, 0x78, 0x84, 0x3d, 0x73, 0x2b, 0x0a, 0xbe, 0x49, 0xc9, 0x32, 0xbe,
+ 0x1c, 0xe1, 0x23, 0xbe, 0x38, 0x71, 0xd5, 0x3d, 0xc0, 0x10, 0x02, 0x3e,
+ 0xfa, 0xaa, 0xda, 0x3d, 0xa6, 0x63, 0xb6, 0xbd, 0x8e, 0xbb, 0x05, 0x3e,
+ 0xaa, 0x16, 0x87, 0x3b, 0x6b, 0xda, 0x83, 0xbb, 0x45, 0xe3, 0x35, 0xbe,
+ 0xf4, 0xc1, 0x01, 0xbd, 0x2e, 0xfa, 0xde, 0xbd, 0x1a, 0x9a, 0xef, 0xbd,
+ 0x23, 0x0c, 0x85, 0x3d, 0x5d, 0xbf, 0x00, 0xbe, 0x9c, 0x31, 0xb1, 0xbd,
+ 0x95, 0x3e, 0x01, 0xbe, 0xa7, 0xa2, 0xcc, 0xbd, 0xd3, 0xbc, 0xcf, 0x3d,
+ 0xda, 0xfe, 0x0d, 0xbc, 0xe5, 0x81, 0xba, 0x3d, 0x66, 0xda, 0xd2, 0xbd,
+ 0x1a, 0xa7, 0xb6, 0x3c, 0xc4, 0x2f, 0x03, 0xbe, 0xc3, 0x47, 0xdd, 0xbd,
+ 0x24, 0x66, 0xbb, 0xbd, 0x49, 0xbb, 0x1a, 0xbe, 0x49, 0x78, 0x00, 0x3e,
+ 0xea, 0xf9, 0x54, 0x3d, 0x8b, 0x6d, 0x13, 0x3e, 0x87, 0x5d, 0xcb, 0xbd,
+ 0xaa, 0xde, 0x37, 0x3c, 0xa4, 0x72, 0xaf, 0x3d, 0x8d, 0xfc, 0x16, 0x3e,
+ 0xc1, 0xa4, 0x8d, 0xbc, 0x56, 0x6b, 0xc4, 0x3c, 0x23, 0x1c, 0x17, 0x3d,
+ 0x83, 0x26, 0x1d, 0x3e, 0xd2, 0xa2, 0x0e, 0xbe, 0x22, 0x5e, 0xc3, 0x3d,
+ 0x52, 0xea, 0xec, 0xbd, 0xcc, 0x08, 0xad, 0xbd, 0x74, 0x36, 0x9a, 0xbc,
+ 0x16, 0x85, 0x47, 0x3d, 0xb5, 0x17, 0x51, 0x3d, 0x09, 0x28, 0x15, 0x3b,
+ 0x60, 0x6f, 0x0c, 0x3e, 0xde, 0xd5, 0x05, 0xbe, 0xb3, 0x3c, 0xe2, 0x3d,
+ 0x39, 0x82, 0xa3, 0x3c, 0x97, 0xc9, 0xa8, 0x3d, 0xb7, 0x80, 0x0c, 0xbd,
+ 0xb5, 0x1c, 0x04, 0xbe, 0xea, 0x0d, 0xac, 0x3d, 0x25, 0x73, 0x19, 0x3d,
+ 0xec, 0xdf, 0x01, 0xbe, 0x46, 0xf9, 0x8b, 0x3c, 0x30, 0xe9, 0xb4, 0x3d,
+ 0x54, 0xfc, 0x1b, 0x3e, 0xd9, 0xd6, 0x40, 0xbe, 0x35, 0xfe, 0xa3, 0x3c,
+ 0x7e, 0xb1, 0x1d, 0xbe, 0x31, 0x9b, 0xc4, 0xbd, 0x37, 0xd2, 0xa7, 0x3c,
+ 0x9c, 0x3e, 0xc6, 0x3b, 0xac, 0x5d, 0xa3, 0x3d, 0x76, 0x66, 0x91, 0x3d,
+ 0x7a, 0x34, 0xfd, 0x3d, 0x51, 0x81, 0x0c, 0x3e, 0x9c, 0xda, 0x06, 0x3e,
+ 0x05, 0xe8, 0x3e, 0x3d, 0x3c, 0xd9, 0x48, 0x3e, 0x26, 0x6c, 0x1c, 0xbe,
+ 0x8f, 0x75, 0x8f, 0xbb, 0x79, 0xac, 0xc5, 0x3d, 0xcd, 0x47, 0x28, 0xbe,
+ 0x28, 0xf8, 0xa1, 0xbd, 0x71, 0x6c, 0xb0, 0xbd, 0x78, 0x68, 0xa6, 0xbd,
+ 0x7b, 0x71, 0xb3, 0xbd, 0x25, 0xe9, 0xd9, 0xbd, 0x87, 0xfc, 0x0d, 0xbc,
+ 0xbd, 0xe8, 0x19, 0xbd, 0x1f, 0xf3, 0xab, 0xbd, 0x04, 0x48, 0x2d, 0x3d,
+ 0xaf, 0x05, 0x0e, 0x3e, 0x1f, 0xdd, 0xe6, 0xbd, 0x85, 0x6e, 0xc8, 0xbd,
+ 0xb7, 0xe9, 0x76, 0xbd, 0xa0, 0xc0, 0xb6, 0x3a, 0xe4, 0x08, 0x11, 0xbe,
+ 0x78, 0x59, 0xcc, 0x3d, 0xae, 0x74, 0x15, 0x3d, 0xf9, 0x7d, 0x58, 0x3c,
+ 0xeb, 0x9b, 0x0c, 0x3b, 0x5c, 0xea, 0x18, 0x3e, 0x4c, 0x00, 0x8b, 0xbd,
+ 0x30, 0xf8, 0x92, 0x3d, 0xba, 0x74, 0x13, 0xbe, 0x8f, 0x60, 0x9a, 0x3d,
+ 0xf4, 0x7f, 0x57, 0xbc, 0x4a, 0xa1, 0x76, 0x3d, 0x6e, 0x51, 0x3e, 0x3e,
+ 0x75, 0xcc, 0x0c, 0xbe, 0xdc, 0xe2, 0x99, 0x3d, 0x8b, 0x96, 0x92, 0x3c,
+ 0x6b, 0x1b, 0xb2, 0xbc, 0x3d, 0x70, 0xf6, 0x3d, 0x02, 0x24, 0xe1, 0xbb,
+ 0x60, 0x4e, 0x60, 0xbe, 0x4b, 0x5d, 0x45, 0xbe, 0x49, 0xfa, 0xe5, 0xbd,
+ 0x13, 0xcf, 0x94, 0xbc, 0xab, 0x60, 0xa6, 0xbd, 0x12, 0x82, 0xa9, 0x3e,
+ 0x21, 0xec, 0x6c, 0x3e, 0x7d, 0x44, 0x80, 0x3e, 0x45, 0xb0, 0xba, 0x3d,
+ 0x44, 0x35, 0x93, 0xbd, 0x17, 0xba, 0x63, 0xbe, 0x49, 0x6b, 0xef, 0x3d,
+ 0x39, 0x6d, 0x48, 0x3d, 0xdb, 0xfa, 0x06, 0xbe, 0x3f, 0x4e, 0x0c, 0x3c,
+ 0xbd, 0xff, 0x22, 0x3d, 0xda, 0xb2, 0xab, 0xba, 0x02, 0xb5, 0x1a, 0x3e,
+ 0x19, 0xf3, 0xc0, 0xbe, 0xb2, 0xa9, 0x07, 0x3d, 0x53, 0x9e, 0x14, 0xbc,
+ 0xc0, 0x1f, 0x8d, 0x3c, 0xa3, 0x03, 0xa8, 0x3d, 0x7d, 0x96, 0x41, 0x3e,
+ 0xbe, 0xd0, 0x58, 0x3d, 0x65, 0xf1, 0x31, 0x3e, 0x57, 0x05, 0x64, 0x3e,
+ 0x1b, 0x2e, 0xa8, 0xbe, 0x53, 0x73, 0x20, 0x3e, 0x03, 0xf9, 0x5f, 0x3d,
+ 0x95, 0x80, 0x88, 0x3e, 0x70, 0xcb, 0xa2, 0x3e, 0x37, 0xd8, 0x02, 0x3d,
+ 0x69, 0x1c, 0xad, 0x3e, 0xe5, 0xf3, 0xa0, 0xbd, 0x46, 0x0d, 0xe7, 0xbd,
+ 0xf1, 0xc9, 0xff, 0xbd, 0x01, 0x6b, 0xd5, 0xbd, 0x5b, 0x46, 0x2d, 0x3e,
+ 0xd8, 0x3a, 0x5c, 0x3e, 0x93, 0xac, 0x2f, 0x3d, 0x2f, 0xd4, 0x61, 0xbd,
+ 0x96, 0xaf, 0x06, 0xbe, 0x82, 0x6e, 0xa1, 0x3d, 0x93, 0x6f, 0xea, 0xbd,
+ 0xe4, 0x0f, 0x20, 0xbe, 0x99, 0xdc, 0x2e, 0xbf, 0xbf, 0xd5, 0x04, 0xbd,
+ 0x56, 0x64, 0xaa, 0x3d, 0xb1, 0xcf, 0x67, 0xbe, 0xde, 0xa7, 0xb7, 0x3e,
+ 0xd4, 0xe4, 0x83, 0xbd, 0x39, 0xa4, 0x6a, 0x3c, 0x8c, 0x0d, 0x26, 0xbe,
+ 0xaf, 0x26, 0xdd, 0x3d, 0x7a, 0x8e, 0x19, 0x3f, 0xba, 0x62, 0x2a, 0x3e,
+ 0xef, 0x17, 0xba, 0x39, 0x14, 0xb1, 0xf8, 0x3d, 0x30, 0x0c, 0xc5, 0x3c,
+ 0x66, 0x03, 0x6f, 0x3e, 0xf5, 0xe7, 0x69, 0xbe, 0xee, 0x81, 0xda, 0x3d,
+ 0x5b, 0x2b, 0x04, 0x3f, 0xf4, 0xef, 0x4b, 0x3e, 0xb7, 0x3a, 0x36, 0x3e,
+ 0x63, 0xfa, 0x7e, 0xbd, 0x20, 0x3f, 0x12, 0x3e, 0x2e, 0x0c, 0x52, 0x3e,
+ 0x90, 0xf3, 0xbb, 0x3d, 0xd4, 0xef, 0x96, 0x3e, 0x24, 0xde, 0x0c, 0xbe,
+ 0x50, 0x87, 0xb9, 0xbe, 0x63, 0xfa, 0x86, 0x3e, 0x41, 0xa7, 0x12, 0x3e,
+ 0x43, 0xdb, 0x57, 0x3d, 0xc1, 0x6a, 0xe0, 0xbd, 0xd4, 0xa2, 0xbd, 0x3e,
+ 0x23, 0xb9, 0xb6, 0xbe, 0x34, 0x4d, 0x69, 0x3e, 0x69, 0x86, 0x44, 0x3d,
+ 0x95, 0xf9, 0x0d, 0x3d, 0x9e, 0x0b, 0xe2, 0x3d, 0x62, 0xe7, 0x80, 0x3d,
+ 0xd3, 0xd3, 0xc0, 0x3e, 0xd2, 0x86, 0xe6, 0xbe, 0x9a, 0x43, 0xa9, 0xbc,
+ 0xdf, 0xe7, 0x3b, 0x3e, 0xe4, 0xff, 0x3e, 0x3e, 0xc2, 0x31, 0x1a, 0xbe,
+ 0x5b, 0xf5, 0xd9, 0x3d, 0xb3, 0xcd, 0xe1, 0xba, 0x1f, 0x76, 0xfc, 0x3d,
+ 0x58, 0x69, 0x77, 0x3e, 0xc8, 0xfb, 0xb3, 0xbe, 0xc2, 0xc0, 0x41, 0x3d,
+ 0x75, 0x69, 0x29, 0xbe, 0xcd, 0xe1, 0xb2, 0x3d, 0x36, 0xf2, 0x74, 0xbe,
+ 0xec, 0x5d, 0x78, 0x3e, 0x10, 0x45, 0xd9, 0x3d, 0xa4, 0x10, 0xa4, 0x3d,
+ 0xf2, 0xa9, 0xe7, 0xbc, 0x2b, 0xcd, 0x2b, 0x3e, 0xb5, 0x78, 0xcf, 0x3c,
+ 0xd0, 0x87, 0x4d, 0x3e, 0x5a, 0x6d, 0x02, 0xbf, 0xd2, 0x20, 0xb9, 0xbe,
+ 0xc5, 0xf4, 0x12, 0xbd, 0xd0, 0x15, 0x9d, 0xbd, 0x2a, 0xe3, 0xad, 0xbd,
+ 0x0e, 0x04, 0x6d, 0xbd, 0x51, 0x96, 0x03, 0xbd, 0x8a, 0xad, 0xe8, 0xbd,
+ 0x0f, 0x1a, 0x6f, 0x3e, 0x44, 0x09, 0x5b, 0xbd, 0xc6, 0x9e, 0x38, 0x3e,
+ 0x44, 0x92, 0xc2, 0xbd, 0x5a, 0x0d, 0x5b, 0xbe, 0x64, 0x5c, 0x27, 0x3e,
+ 0x08, 0xcc, 0x98, 0x3b, 0xcf, 0x6e, 0x76, 0xbe, 0xb7, 0x75, 0x3b, 0x3d,
+ 0x97, 0xe0, 0x4f, 0xbe, 0x27, 0x95, 0x0d, 0x3e, 0xd9, 0x87, 0x2d, 0xbe,
+ 0xd7, 0x7a, 0xdf, 0xbb, 0xa5, 0x19, 0x24, 0xbe, 0xe7, 0xe7, 0xa2, 0xbd,
+ 0xc6, 0x4d, 0x6c, 0x3d, 0x68, 0x43, 0xd3, 0x3d, 0x44, 0xf1, 0xb3, 0xbb,
+ 0x19, 0x02, 0x8d, 0xbb, 0xbe, 0x14, 0x75, 0x3e, 0xfc, 0xd9, 0x0a, 0xbe,
+ 0x1d, 0x90, 0xb6, 0xbc, 0xd2, 0xf6, 0x92, 0x3d, 0x3d, 0xf1, 0x21, 0xbe,
+ 0x87, 0xce, 0xdb, 0xbd, 0x27, 0xdc, 0xd8, 0x3d, 0x54, 0x7c, 0x1d, 0xbe,
+ 0x90, 0x58, 0x16, 0x3e, 0xc3, 0x7f, 0xf1, 0x3c, 0x5b, 0x91, 0x61, 0xbe,
+ 0x59, 0x8e, 0xef, 0x3d, 0x87, 0x6c, 0x23, 0x3e, 0xe9, 0x6d, 0x31, 0xbe,
+ 0xf0, 0xb9, 0x13, 0xbd, 0x01, 0xd4, 0x99, 0x3d, 0xf9, 0x47, 0x42, 0xbd,
+ 0xdd, 0x4d, 0x3d, 0x3d, 0xaa, 0xd0, 0x48, 0xbd, 0xe8, 0xef, 0x78, 0xbd,
+ 0xb6, 0x79, 0xfe, 0x3c, 0x52, 0x91, 0xc0, 0x3d, 0xa4, 0x75, 0x1f, 0xbe,
+ 0x77, 0x17, 0x8d, 0x3c, 0xbd, 0xa6, 0x2b, 0x3e, 0x89, 0x52, 0xaf, 0x3d,
+ 0x70, 0xba, 0x00, 0x3e, 0x7d, 0x1e, 0x8c, 0xbc, 0x33, 0x6c, 0x54, 0x3d,
+ 0x4d, 0x69, 0x76, 0x3c, 0xe9, 0x3c, 0x28, 0x3e, 0xb8, 0xbd, 0xd2, 0x3d,
+ 0xba, 0x7d, 0xe8, 0x3d, 0x33, 0x79, 0x14, 0xbc, 0x9b, 0x2e, 0x7f, 0xbd,
+ 0xe7, 0x99, 0xb4, 0xbc, 0xaa, 0x86, 0x29, 0xbd, 0xee, 0x7b, 0x3e, 0x3d,
+ 0xd1, 0x63, 0xae, 0x3d, 0x20, 0xa9, 0xd9, 0x3d, 0xb8, 0x2e, 0x9a, 0x3c,
+ 0x18, 0x83, 0x08, 0xbe, 0x12, 0x60, 0x05, 0xbe, 0xb7, 0x6c, 0x07, 0xbe,
+ 0x85, 0xf6, 0xfb, 0xbd, 0xa8, 0x1e, 0xae, 0xbd, 0x28, 0x06, 0x8b, 0x3d,
+ 0x3d, 0x01, 0x63, 0x3e, 0xc8, 0x5a, 0x22, 0x3e, 0x3e, 0xac, 0x59, 0x3d,
+ 0xcc, 0x56, 0x2d, 0x3c, 0xaf, 0x44, 0xcd, 0xbd, 0x3f, 0x63, 0xa1, 0x3d,
+ 0xc1, 0xc3, 0x80, 0xbd, 0x25, 0xb9, 0xb4, 0x3d, 0x1d, 0xd6, 0xd2, 0xbd,
+ 0x30, 0xb6, 0x33, 0xbc, 0xef, 0x96, 0xa7, 0x3d, 0xca, 0x6a, 0xb2, 0xbb,
+ 0xf3, 0x7c, 0xc9, 0xbd, 0x09, 0x8d, 0x6b, 0xbd, 0x71, 0x25, 0xbd, 0xbd,
+ 0x8f, 0x52, 0xba, 0xbd, 0xa5, 0x78, 0x3d, 0xbe, 0x35, 0x64, 0xf5, 0xbc,
+ 0x14, 0x3a, 0x10, 0x3e, 0x23, 0xc4, 0xd6, 0x3d, 0x88, 0xad, 0x1b, 0xbe,
+ 0x6e, 0x76, 0x26, 0xbe, 0xd6, 0x8f, 0x38, 0x3d, 0xdd, 0xb2, 0x4d, 0x3e,
+ 0x72, 0x4e, 0x9d, 0xbe, 0x39, 0x13, 0xaf, 0xbd, 0x9a, 0x1b, 0x15, 0xbe,
+ 0x29, 0xa9, 0x65, 0x3d, 0x44, 0xfc, 0x3b, 0x3b, 0x4d, 0x44, 0xc6, 0xbc,
+ 0x95, 0x84, 0xf5, 0x3d, 0xdf, 0xfb, 0xa8, 0x3d, 0xc4, 0xaa, 0x87, 0xbd,
+ 0xe3, 0x14, 0xe6, 0x3a, 0x35, 0x1f, 0x0b, 0x3d, 0x66, 0x19, 0x70, 0xbd,
+ 0x75, 0x8b, 0x15, 0xbd, 0x14, 0x58, 0xc2, 0xbd, 0x45, 0xe0, 0x07, 0xbe,
+ 0xb4, 0x6f, 0xfb, 0x3d, 0x34, 0xae, 0x16, 0x3e, 0x68, 0x9b, 0x26, 0xbc,
+ 0xc1, 0xf3, 0xc3, 0xbe, 0x25, 0x40, 0xb2, 0xbe, 0xff, 0x23, 0x21, 0x3e,
+ 0x65, 0x42, 0x68, 0x3d, 0x78, 0x0f, 0x13, 0x3c, 0x30, 0xe1, 0x09, 0x3e,
+ 0x94, 0xa3, 0x1a, 0x38, 0x7f, 0x4e, 0x07, 0x3e, 0xd7, 0xbc, 0xb0, 0x3c,
+ 0x62, 0x0c, 0x13, 0xbe, 0xef, 0xb4, 0x30, 0x3d, 0x00, 0x10, 0x05, 0x3e,
+ 0x55, 0xfd, 0xdb, 0x3c, 0x94, 0xf5, 0xcc, 0x3d, 0xd0, 0x1b, 0x00, 0xbe,
+ 0xe7, 0x10, 0x9c, 0x3c, 0x60, 0xd5, 0x14, 0x3d, 0x58, 0x53, 0x33, 0xbe,
+ 0x25, 0xd5, 0xac, 0xbd, 0x30, 0x49, 0x35, 0xbc, 0x0a, 0xc2, 0xcc, 0xbd,
+ 0x6b, 0x76, 0x81, 0xbd, 0x86, 0x20, 0x37, 0x3e, 0xa7, 0x36, 0xbe, 0xbd,
+ 0xce, 0x2d, 0x99, 0x3d, 0x8b, 0x65, 0x22, 0x3d, 0x9b, 0x6a, 0x6f, 0xbd,
+ 0x9b, 0x33, 0x4f, 0x3d, 0x22, 0xf5, 0x4f, 0xbd, 0x59, 0x41, 0xf4, 0x3c,
+ 0xeb, 0x13, 0x2c, 0xbe, 0xcf, 0xbf, 0xaa, 0xbd, 0x45, 0x73, 0x3d, 0x3d,
+ 0x02, 0x5c, 0xab, 0xbd, 0x17, 0xe0, 0x3f, 0x3d, 0x3f, 0x17, 0x2f, 0x3d,
+ 0x98, 0x24, 0x12, 0xbe, 0x26, 0x8f, 0xc8, 0x3d, 0xd6, 0x52, 0x85, 0xbe,
+ 0x96, 0x85, 0x0a, 0xbe, 0x35, 0xef, 0x37, 0x3e, 0xba, 0x32, 0xd7, 0xbc,
+ 0x88, 0x38, 0x2b, 0xbd, 0xc7, 0x45, 0xc9, 0xbd, 0x3e, 0x87, 0x46, 0xbd,
+ 0xfa, 0x4b, 0x0f, 0xbe, 0xa3, 0x3d, 0x2f, 0x3d, 0x88, 0x04, 0xbb, 0x3d,
+ 0x64, 0x29, 0x01, 0xbe, 0x42, 0xa2, 0x12, 0x3e, 0xd4, 0x95, 0xc1, 0x3c,
+ 0xd3, 0xb0, 0xfb, 0xbd, 0xde, 0x79, 0xcc, 0x3d, 0x1e, 0x5b, 0x98, 0xbd,
+ 0x20, 0xaa, 0xaa, 0x3d, 0xe6, 0xd1, 0x06, 0x3c, 0xb2, 0xd5, 0xde, 0xbd,
+ 0x5a, 0xd0, 0x21, 0xbd, 0x2d, 0x2f, 0x8e, 0xbd, 0x34, 0x82, 0x9e, 0x3d,
+ 0x42, 0xdf, 0x40, 0xbc, 0x9a, 0xbe, 0x77, 0x3c, 0x2a, 0xb3, 0x17, 0x3e,
+ 0xcd, 0xbf, 0x3b, 0x3d, 0x28, 0x62, 0xb3, 0xbd, 0xf8, 0xd6, 0x44, 0xbd,
+ 0x07, 0x05, 0xe7, 0x3d, 0x41, 0x97, 0xf5, 0xbd, 0x9d, 0x89, 0x18, 0xbe,
+ 0x42, 0xe2, 0xe4, 0xbb, 0x02, 0x46, 0x03, 0x3c, 0x4f, 0x03, 0xc0, 0x3d,
+ 0x0e, 0xa6, 0x52, 0xbe, 0x72, 0x77, 0xca, 0xbd, 0x99, 0x3e, 0x8f, 0x3d,
+ 0xdc, 0x4a, 0x49, 0x3d, 0x30, 0x29, 0x5f, 0x3d, 0x71, 0xde, 0xfd, 0xbc,
+ 0xfb, 0x9b, 0x09, 0x3e, 0xab, 0xd4, 0xc2, 0x3c, 0x78, 0x93, 0xde, 0x3d,
+ 0x58, 0xf1, 0x6e, 0xbd, 0xa6, 0xc3, 0x72, 0xbc, 0xe6, 0x1f, 0x8e, 0xbe,
+ 0xf2, 0xc0, 0x22, 0xbe, 0x6b, 0xd0, 0xbc, 0xbc, 0x64, 0x72, 0x7b, 0x3d,
+ 0x7e, 0x9c, 0xb7, 0x3c, 0x38, 0xc3, 0x3a, 0x3d, 0xb2, 0xfc, 0x4e, 0xbd,
+ 0x75, 0xb8, 0x02, 0x3e, 0x48, 0x7c, 0x93, 0xbc, 0xa8, 0xed, 0x26, 0xbd,
+ 0x77, 0xdb, 0x20, 0xbe, 0xf2, 0x25, 0x38, 0xbd, 0x58, 0xd4, 0x57, 0xbe,
+ 0x71, 0xa4, 0x93, 0x3d, 0x38, 0x90, 0xc4, 0xbc, 0x6e, 0x4a, 0x31, 0x3c,
+ 0x73, 0x4c, 0x1a, 0x3e, 0x20, 0xcb, 0x19, 0xbd, 0x84, 0xc6, 0x8c, 0xbc,
+ 0x71, 0xb1, 0x9e, 0x3d, 0xf4, 0x36, 0xab, 0xbe, 0xb5, 0x23, 0x0f, 0xbe,
+ 0x7f, 0x5e, 0x87, 0x3d, 0xbb, 0x71, 0x57, 0xbe, 0xb4, 0xf2, 0x3d, 0xbe,
+ 0x34, 0xa3, 0x65, 0xbb, 0x60, 0x0f, 0xdd, 0xbd, 0x20, 0xe6, 0x6d, 0xbc,
+ 0xfe, 0x7b, 0x61, 0xbe, 0xe6, 0x36, 0x26, 0xbe, 0xa6, 0x60, 0x22, 0x3e,
+ 0x85, 0x82, 0xcd, 0x3d, 0xec, 0x3e, 0x8f, 0xbe, 0x0f, 0xcf, 0x1d, 0xbe,
+ 0x0d, 0x29, 0x28, 0xbd, 0x31, 0x47, 0x0d, 0x3e, 0x2d, 0x69, 0xac, 0x3b,
+ 0xfb, 0x07, 0xef, 0xbc, 0x23, 0xe1, 0x5a, 0x3d, 0xc4, 0x78, 0x29, 0x3e,
+ 0x39, 0x8b, 0x94, 0xbd, 0x55, 0x0d, 0x36, 0xbd, 0xcb, 0x29, 0xdd, 0x3d,
+ 0x73, 0x5c, 0x02, 0xbc, 0xf8, 0x54, 0x27, 0xbe, 0xad, 0xa1, 0xa0, 0x3e,
+ 0x0e, 0x01, 0x3d, 0x3e, 0xc0, 0xfb, 0x51, 0x3e, 0x27, 0xc8, 0x6f, 0xbd,
+ 0x1d, 0x51, 0xab, 0x3d, 0x32, 0x1a, 0xd4, 0xbd, 0x12, 0x8f, 0x75, 0xbd,
+ 0xa3, 0x0c, 0xbd, 0xbd, 0x32, 0xa2, 0x0d, 0x3c, 0xbe, 0x23, 0xe9, 0xbd,
+ 0xdd, 0x6e, 0x2a, 0xbd, 0x65, 0x64, 0x02, 0x3d, 0x92, 0x49, 0x47, 0x3e,
+ 0x61, 0xa4, 0x7f, 0x3c, 0x76, 0xef, 0x7c, 0x3d, 0x9e, 0x34, 0xc1, 0xbd,
+ 0x8d, 0x3e, 0x4a, 0x3b, 0x80, 0x34, 0x7a, 0xbc, 0xa4, 0xd7, 0x10, 0xbe,
+ 0x86, 0xab, 0x59, 0xbe, 0x42, 0x61, 0x46, 0x3e, 0x7d, 0x4e, 0xd5, 0x3d,
+ 0xf1, 0x71, 0x9c, 0xbe, 0xb7, 0xdd, 0x5b, 0xbe, 0x8e, 0x0b, 0x1f, 0xbe,
+ 0x7b, 0x22, 0xeb, 0xbd, 0xb5, 0x34, 0xb6, 0x3d, 0xae, 0x49, 0x70, 0x3e,
+ 0xc6, 0xfa, 0x32, 0x3e, 0x8d, 0x27, 0x8c, 0xbe, 0xb9, 0x80, 0x86, 0xbd,
+ 0x92, 0xe8, 0x38, 0xbb, 0x80, 0x11, 0x9b, 0xbe, 0xad, 0xab, 0x46, 0x3e,
+ 0x75, 0x16, 0x63, 0x3e, 0xcd, 0x94, 0x8e, 0x3d, 0x3c, 0x0f, 0x26, 0xbe,
+ 0xfe, 0x83, 0x59, 0x3b, 0x72, 0x81, 0xd8, 0xbb, 0xeb, 0x0e, 0x28, 0xbd,
+ 0x5f, 0x92, 0x1e, 0x3d, 0x55, 0xac, 0x0c, 0xbd, 0x76, 0x8f, 0x75, 0xbe,
+ 0xdd, 0x79, 0xb8, 0x3c, 0x43, 0x3d, 0x8e, 0x3d, 0x88, 0x06, 0xd9, 0xbd,
+ 0x87, 0x03, 0xe9, 0x3c, 0x96, 0x7d, 0x20, 0xbe, 0xc4, 0x48, 0x29, 0xbe,
+ 0x9c, 0xfd, 0x59, 0xbe, 0xbf, 0x6e, 0x0d, 0x3e, 0x05, 0xdf, 0x61, 0x3d,
+ 0x28, 0x4f, 0xc9, 0xbd, 0x5a, 0x53, 0xae, 0xbe, 0x74, 0x2f, 0x93, 0x3e,
+ 0x97, 0x60, 0xce, 0x3d, 0x85, 0x9d, 0x31, 0x3e, 0x1b, 0x97, 0x3f, 0x3e,
+ 0x51, 0x81, 0x40, 0x3d, 0xec, 0x1d, 0x5b, 0x3e, 0xfa, 0xc7, 0x58, 0xbd,
+ 0xd6, 0xfc, 0x0b, 0xbe, 0x55, 0x43, 0x43, 0x3e, 0x17, 0x0e, 0x1e, 0xbe,
+ 0xb7, 0x7d, 0x07, 0x3d, 0xad, 0x24, 0xa0, 0x3d, 0x7e, 0xdf, 0x90, 0x3c,
+ 0x1b, 0x64, 0x61, 0x3d, 0x00, 0x06, 0x5b, 0x3e, 0x35, 0x94, 0xc8, 0x3d,
+ 0x70, 0x6c, 0x29, 0x3e, 0x48, 0x74, 0x39, 0xbe, 0xb1, 0x20, 0x4c, 0xbb,
+ 0xe4, 0xcc, 0xce, 0xbd, 0x18, 0x78, 0x3b, 0xbc, 0xbd, 0x1b, 0x47, 0x3d,
+ 0xa1, 0x95, 0x01, 0x3e, 0xb8, 0x4e, 0x90, 0xbe, 0x2a, 0xd5, 0xe2, 0xbd,
+ 0x09, 0x30, 0x5c, 0x3e, 0xa6, 0xf6, 0x0f, 0x3d, 0x5c, 0xe8, 0xb5, 0x3b,
+ 0x35, 0xf9, 0x90, 0x3d, 0x0e, 0xd5, 0x3d, 0xbc, 0xdf, 0x64, 0xd5, 0x3a,
+ 0x48, 0x53, 0x84, 0x3d, 0xb1, 0xc9, 0x80, 0x3c, 0x70, 0x7e, 0x8f, 0x3d,
+ 0xe8, 0x40, 0x10, 0xbe, 0x03, 0x4e, 0xd8, 0x3d, 0xb0, 0xd2, 0xf3, 0x3d,
+ 0x6f, 0x60, 0x17, 0x3d, 0x5b, 0xdd, 0xc8, 0xbc, 0x36, 0xaa, 0xb7, 0xbe,
+ 0xdb, 0x89, 0x17, 0xbe, 0xf9, 0x1c, 0xd0, 0xbd, 0x58, 0x19, 0xc9, 0x3d,
+ 0x55, 0xee, 0x4c, 0xbc, 0xb1, 0x10, 0xaf, 0xbe, 0x76, 0x51, 0xfd, 0x3d,
+ 0xe0, 0xdb, 0x4e, 0xbe, 0x2f, 0xb8, 0xbc, 0xbc, 0x66, 0xdd, 0x1b, 0xbe,
+ 0x95, 0x00, 0x06, 0x3d, 0x12, 0x75, 0x51, 0xbd, 0x9c, 0xfa, 0x04, 0xbe,
+ 0xc6, 0xcd, 0xcf, 0xbd, 0xea, 0x6e, 0x17, 0x3e, 0xf3, 0x00, 0x59, 0xbd,
+ 0xa2, 0xd7, 0xf4, 0x3c, 0xe9, 0x66, 0x41, 0x3d, 0x32, 0x4e, 0x1e, 0x3e,
+ 0x03, 0x15, 0xb4, 0xbd, 0xb9, 0x45, 0x2f, 0x3e, 0xbb, 0x5c, 0x50, 0xbd,
+ 0x83, 0x1f, 0x5f, 0x3e, 0x8e, 0x80, 0x89, 0xbd, 0xbf, 0x89, 0x14, 0xbe,
+ 0xb0, 0x10, 0xde, 0xbc, 0x6a, 0x0e, 0x17, 0x3e, 0xcd, 0x0f, 0x85, 0x3d,
+ 0xb8, 0x89, 0x1a, 0x3e, 0x1b, 0x1c, 0x0a, 0xbe, 0x31, 0x3f, 0xa5, 0x3e,
+ 0xa8, 0xbd, 0x5e, 0xbd, 0xdf, 0x48, 0xa3, 0xbd, 0x30, 0x88, 0x59, 0xbe,
+ 0x2b, 0xb8, 0x70, 0xbe, 0x97, 0x34, 0x3d, 0xbe, 0x97, 0x04, 0x55, 0x3d,
+ 0x1e, 0x11, 0x99, 0xbe, 0x84, 0x4a, 0x8a, 0x3d, 0xe2, 0x70, 0xbd, 0xbd,
+ 0xbb, 0x5a, 0xd4, 0x3d, 0xf1, 0x09, 0x38, 0xbe, 0x0a, 0x9e, 0xb3, 0x3b,
+ 0xa0, 0x1a, 0x1c, 0xbd, 0x71, 0xe7, 0x3a, 0x3d, 0xae, 0xbc, 0x4a, 0xbe,
+ 0x4d, 0x44, 0x27, 0xbd, 0x6a, 0x51, 0x28, 0x3e, 0x75, 0x64, 0xc7, 0x3d,
+ 0xf3, 0x43, 0xe6, 0x3c, 0xfb, 0xe9, 0x46, 0xbe, 0x8a, 0x0e, 0x27, 0x3e,
+ 0xce, 0xd3, 0xde, 0xbd, 0x58, 0x8c, 0x48, 0x3d, 0x68, 0x90, 0xe3, 0x3d,
+ 0x65, 0xa9, 0x88, 0x3d, 0xae, 0x6a, 0x58, 0xbe, 0xe3, 0xb0, 0xb1, 0xbd,
+ 0x6a, 0x5e, 0x66, 0x3d, 0x08, 0x95, 0x45, 0xbe, 0xb9, 0x16, 0x87, 0x3d,
+ 0x1d, 0xd6, 0xc1, 0xbd, 0x01, 0x89, 0xd6, 0xbd, 0x88, 0x8d, 0x64, 0xbd,
+ 0x55, 0xb3, 0x49, 0x3e, 0xb6, 0xdd, 0x97, 0xbd, 0x98, 0xb6, 0x04, 0x3d,
+ 0xd1, 0xc1, 0xa6, 0xbd, 0x65, 0x33, 0x18, 0x3e, 0xfb, 0x53, 0x05, 0x3d,
+ 0x9d, 0x7f, 0x3c, 0xbd, 0x8a, 0x00, 0x9d, 0xba, 0x39, 0x85, 0x04, 0x3d,
+ 0x70, 0x32, 0x5f, 0x3d, 0x30, 0x37, 0x59, 0x3e, 0xb5, 0x0d, 0x1b, 0x3d,
+ 0x27, 0xbf, 0x8c, 0xbc, 0x90, 0xdf, 0x49, 0xbe, 0x1c, 0x88, 0xed, 0xbc,
+ 0x3c, 0x2e, 0x44, 0xbd, 0xb7, 0x20, 0x0f, 0xbe, 0x05, 0x2f, 0xa5, 0x3d,
+ 0x9f, 0xbf, 0x64, 0xbe, 0x34, 0xbf, 0xfe, 0x3d, 0x0d, 0x2b, 0xe6, 0xbd,
+ 0x06, 0x08, 0x0a, 0x3e, 0x00, 0x4a, 0xaa, 0x3d, 0xa9, 0x8a, 0x70, 0xbd,
+ 0xa9, 0xdf, 0xd7, 0xbd, 0x3c, 0x12, 0x92, 0x3d, 0x2e, 0x66, 0xf2, 0xbd,
+ 0x6b, 0x9d, 0x12, 0xbe, 0xec, 0x06, 0x37, 0x3d, 0x2d, 0x31, 0x44, 0xbc,
+ 0xeb, 0x2e, 0x93, 0x3c, 0x27, 0x9b, 0x88, 0xbc, 0x1d, 0x72, 0xc3, 0x3c,
+ 0x69, 0xef, 0x2e, 0x3e, 0xce, 0xa0, 0xb8, 0xbc, 0xaf, 0xb9, 0x4a, 0x3c,
+ 0xbc, 0xe9, 0xf9, 0xbd, 0x6d, 0xd4, 0x08, 0x3e, 0xcb, 0x4d, 0x8f, 0xbd,
+ 0x1e, 0xcd, 0x9e, 0xbd, 0xa1, 0xdd, 0x01, 0xbe, 0x33, 0x72, 0x6e, 0xbd,
+ 0x9f, 0x96, 0xab, 0xbd, 0x6b, 0x4b, 0xb2, 0xbd, 0x83, 0xb9, 0xbd, 0x3b,
+ 0x7b, 0xb5, 0x8b, 0xbe, 0xfc, 0x4f, 0x7d, 0xbd, 0x56, 0xe9, 0x4c, 0x3d,
+ 0xfb, 0xad, 0x27, 0x3d, 0x62, 0xd6, 0x0e, 0xbe, 0x59, 0xde, 0xa9, 0xbd,
+ 0xa1, 0x81, 0x6d, 0xbd, 0x59, 0x7a, 0x81, 0x3d, 0x23, 0x32, 0xd6, 0x3d,
+ 0x4f, 0x04, 0x1d, 0xbe, 0x4d, 0xe4, 0x2e, 0x3e, 0xba, 0x55, 0x2c, 0xbb,
+ 0x5b, 0x4f, 0xa3, 0x3c, 0x78, 0xe2, 0xff, 0x3c, 0x0c, 0xbb, 0x2a, 0x3d,
+ 0x76, 0xba, 0x4a, 0xbd, 0x3d, 0xec, 0x66, 0x3e, 0x2b, 0x7d, 0x62, 0xbd,
+ 0x35, 0x6c, 0xdf, 0x3b, 0x3d, 0x96, 0x1c, 0xbe, 0x98, 0x51, 0xf5, 0xbc,
+ 0x71, 0x0a, 0x41, 0xbe, 0x23, 0x9d, 0xa1, 0x3d, 0x56, 0x03, 0xfb, 0x3d,
+ 0x6c, 0xf1, 0x2e, 0xbe, 0x99, 0x59, 0x5e, 0xbe, 0x8c, 0x18, 0x8b, 0x3e,
+ 0x8c, 0xb6, 0x6d, 0xbe, 0xcd, 0x57, 0xcc, 0x3c, 0xba, 0xf2, 0xe7, 0xbd,
+ 0xcd, 0x6a, 0x07, 0x3d, 0x4a, 0x48, 0x43, 0x3c, 0xa0, 0x87, 0x2b, 0xbc,
+ 0x22, 0x56, 0x15, 0x3e, 0x9f, 0x92, 0x34, 0xbe, 0x4e, 0xca, 0x0b, 0x39,
+ 0xe2, 0x05, 0xe5, 0x3d, 0x3c, 0x24, 0x0d, 0xbe, 0x15, 0x55, 0x64, 0x3c,
+ 0xbc, 0xdb, 0x1e, 0xbe, 0x66, 0xd3, 0x73, 0xbe, 0x14, 0x91, 0x9d, 0x3d,
+ 0x62, 0x60, 0x45, 0xbe, 0x14, 0xa4, 0x7f, 0x3e, 0xf7, 0x79, 0xf7, 0x3d,
+ 0xac, 0xde, 0x08, 0xbe, 0x5d, 0x6b, 0x31, 0x3e, 0x71, 0xff, 0xa0, 0xbd,
+ 0x32, 0x5a, 0x34, 0x3e, 0x0e, 0xbe, 0xa9, 0x3d, 0x83, 0x9d, 0x12, 0xbe,
+ 0x2d, 0x37, 0xcd, 0x3d, 0x73, 0xe2, 0x12, 0x3e, 0x12, 0xc6, 0x4b, 0xbd,
+ 0x0a, 0xb6, 0x58, 0xbd, 0xe6, 0x9a, 0xba, 0xbc, 0x07, 0x77, 0x20, 0x3c,
+ 0x03, 0xa6, 0x71, 0x3d, 0x4c, 0x90, 0xf0, 0xbc, 0xe7, 0x37, 0x41, 0xbd,
+ 0x07, 0x48, 0xcc, 0x3d, 0x31, 0xbb, 0xfa, 0x3d, 0x3e, 0xf9, 0x63, 0xbe,
+ 0x5d, 0xd6, 0x13, 0xbd, 0x99, 0xd1, 0x82, 0xbd, 0x88, 0x26, 0x24, 0x3e,
+ 0x5e, 0x6e, 0x63, 0x3d, 0xc6, 0x79, 0xce, 0xbd, 0xc1, 0xe3, 0x5b, 0xbd,
+ 0x51, 0x78, 0x4d, 0xbd, 0x07, 0x1e, 0x35, 0x3c, 0xcf, 0xd0, 0xb4, 0x3d,
+ 0x68, 0xb0, 0x71, 0xbd, 0x10, 0xdf, 0x6f, 0x3d, 0xef, 0xac, 0x00, 0xbe,
+ 0xe5, 0x5a, 0xe3, 0x3d, 0x9e, 0x54, 0x05, 0xbe, 0xe2, 0x50, 0x6c, 0x3d,
+ 0xd1, 0x38, 0x55, 0xbd, 0x16, 0x10, 0x19, 0xbe, 0xd9, 0x64, 0x12, 0x3e,
+ 0xdd, 0xb8, 0x6a, 0x3c, 0x57, 0x2e, 0x5f, 0x3c, 0x6e, 0x3b, 0xa1, 0xbc,
+ 0x75, 0x53, 0x33, 0xbd, 0x6e, 0x41, 0xeb, 0x3d, 0xbe, 0x98, 0x28, 0xbe,
+ 0x00, 0x43, 0xea, 0xbd, 0x15, 0x34, 0xc7, 0x3c, 0xc5, 0x01, 0x02, 0x3e,
+ 0x0e, 0x0b, 0x73, 0xbd, 0xe0, 0xba, 0xd7, 0xbb, 0x37, 0x3b, 0x0f, 0xbe,
+ 0x62, 0x24, 0xdc, 0xbd, 0x88, 0xc2, 0xdb, 0xbd, 0x17, 0x51, 0xa5, 0x3d,
+ 0xfb, 0x19, 0x30, 0xbd, 0xa9, 0x05, 0x2e, 0xbe, 0x99, 0x0c, 0x86, 0xb9,
+ 0x40, 0x3a, 0xde, 0xbd, 0x7e, 0x6d, 0x66, 0x3d, 0xdc, 0x38, 0x0b, 0xbd,
+ 0xcf, 0x11, 0x32, 0xbd, 0xc6, 0xe8, 0xb1, 0xbc, 0x3f, 0xe3, 0xb3, 0xbd,
+ 0x25, 0x21, 0x6e, 0xbe, 0xdf, 0x90, 0x87, 0x3d, 0xfd, 0xd1, 0x58, 0xbd,
+ 0xa7, 0xd1, 0x02, 0x3e, 0xee, 0xff, 0x4b, 0x3d, 0x9d, 0x43, 0xdf, 0xbd,
+ 0x12, 0xba, 0x1e, 0xbe, 0xee, 0xf7, 0xdb, 0xbd, 0xd3, 0x3c, 0xf3, 0xbd,
+ 0x30, 0x40, 0x40, 0xbe, 0x34, 0xaa, 0x98, 0xbb, 0xa8, 0x33, 0x16, 0x3d,
+ 0xb7, 0x5d, 0x20, 0xbe, 0xc6, 0xf9, 0x03, 0x3e, 0xb2, 0x89, 0x1a, 0xbe,
+ 0x97, 0x24, 0xcb, 0xbd, 0x35, 0xe0, 0x1c, 0x3e, 0xb4, 0xc3, 0x1f, 0x3e,
+ 0xb4, 0x5e, 0xeb, 0xbc, 0x96, 0xa8, 0x3e, 0x3e, 0xca, 0xeb, 0x68, 0x3d,
+ 0xcf, 0xf0, 0xf0, 0x3d, 0xf8, 0xbe, 0x91, 0xbe, 0x82, 0xa7, 0x56, 0x3d,
+ 0x51, 0x89, 0xc9, 0xbd, 0xf4, 0xa8, 0x87, 0x3e, 0x91, 0xd0, 0xe9, 0xbc,
+ 0xff, 0xa8, 0x0f, 0xbd, 0x99, 0xaa, 0x71, 0xbe, 0xe1, 0xee, 0xe6, 0xbd,
+ 0x34, 0xf9, 0xf8, 0xbb, 0x79, 0xe6, 0xe2, 0x3d, 0x66, 0xe1, 0x8c, 0xbd,
+ 0xe5, 0x4e, 0x50, 0x3e, 0xae, 0x4c, 0xa8, 0xbc, 0xfc, 0x89, 0x0d, 0x3e,
+ 0x13, 0xf6, 0x38, 0x3d, 0x29, 0xfe, 0x0a, 0xbe, 0x05, 0xc8, 0x62, 0x3e,
+ 0x88, 0xb5, 0xe4, 0xbc, 0xf5, 0xd7, 0x8f, 0x3d, 0x67, 0xd0, 0x86, 0xbd,
+ 0x5e, 0x5f, 0x43, 0xbe, 0x71, 0x11, 0xe9, 0x3d, 0xf0, 0xd2, 0x8f, 0x3d,
+ 0x97, 0x31, 0x14, 0xbe, 0x9a, 0x8a, 0xd8, 0xbd, 0x27, 0xa7, 0x9f, 0x3d,
+ 0x42, 0xfa, 0x48, 0xbd, 0xd1, 0x16, 0xa2, 0xbc, 0x75, 0x1a, 0xeb, 0x3d,
+ 0x04, 0x60, 0x0d, 0xbe, 0x3b, 0xed, 0x22, 0x3d, 0x29, 0xc2, 0x98, 0x3d,
+ 0x26, 0xba, 0x0b, 0xbe, 0xbd, 0x87, 0x59, 0x3b, 0xf6, 0x5b, 0xd9, 0x3d,
+ 0xa5, 0x44, 0x08, 0x3e, 0x18, 0x75, 0xd8, 0x3d, 0xa0, 0x04, 0x3a, 0x3e,
+ 0x50, 0x9e, 0x6c, 0xbd, 0x3a, 0x3d, 0xe8, 0xbc, 0x0c, 0xcd, 0x86, 0x3d,
+ 0x0d, 0x3c, 0x12, 0x3d, 0x3a, 0x12, 0x97, 0x3d, 0xfc, 0xea, 0xd4, 0xbd,
+ 0x7c, 0xa5, 0xb0, 0xbd, 0x80, 0xda, 0xcb, 0x3d, 0x88, 0x53, 0x58, 0xbe,
+ 0xd5, 0x8b, 0x3e, 0x3e, 0xa3, 0x50, 0x9b, 0xbd, 0xd2, 0x9c, 0xee, 0x3d,
+ 0x91, 0x7c, 0x2b, 0xbe, 0xd1, 0x43, 0x8a, 0x3d, 0x51, 0x6b, 0xf5, 0x3d,
+ 0x33, 0xd0, 0x8c, 0xbc, 0xa1, 0xda, 0x1a, 0xbe, 0xb1, 0xf3, 0xad, 0xbd,
+ 0xfe, 0xa7, 0xa5, 0x3d, 0xcc, 0x45, 0x88, 0x3d, 0x19, 0x53, 0x9f, 0x3d,
+ 0x72, 0x3f, 0xb8, 0x3d, 0x93, 0x6d, 0x75, 0x3d, 0xe5, 0x97, 0x81, 0x3d,
+ 0x64, 0x49, 0xb3, 0xbd, 0x30, 0xc7, 0x27, 0x3e, 0xcb, 0xe6, 0xd3, 0xbd,
+ 0xa7, 0xe0, 0xd5, 0xba, 0x16, 0xb6, 0xc2, 0xbd, 0x57, 0x6f, 0x3f, 0xbe,
+ 0x6c, 0x8e, 0x69, 0xbd, 0x64, 0xb9, 0xa5, 0x3d, 0x1e, 0xcf, 0xf8, 0xbd,
+ 0xf3, 0x3f, 0x1c, 0xbe, 0x0c, 0x30, 0xd6, 0x3d, 0xd6, 0x8e, 0xd3, 0x3d,
+ 0x45, 0xe3, 0xaa, 0xbd, 0x4e, 0x60, 0x9b, 0xbd, 0x38, 0xfb, 0x9d, 0x3d,
+ 0xa4, 0xf3, 0x46, 0xbe, 0x92, 0xc5, 0x31, 0x3d, 0x19, 0x6e, 0x32, 0x3e,
+ 0xc6, 0xb5, 0x1a, 0x3d, 0xb7, 0xa8, 0xa1, 0xbd, 0x0f, 0xb8, 0x13, 0xbe,
+ 0x3b, 0x09, 0x66, 0x3d, 0x39, 0x76, 0x22, 0x3e, 0x46, 0x53, 0xb9, 0xbd,
+ 0x6f, 0xe8, 0x50, 0xbe, 0xf3, 0x11, 0x0b, 0x3e, 0xb3, 0x1f, 0x0b, 0xbe,
+ 0xd4, 0x3a, 0x5f, 0xbd, 0x74, 0x96, 0xa9, 0xbd, 0x9a, 0xf2, 0x2b, 0x3e,
+ 0x0c, 0xd7, 0x6e, 0xbd, 0x9f, 0x6a, 0xdb, 0xbd, 0x0c, 0xaf, 0x3c, 0x3c,
+ 0x6a, 0xfe, 0x39, 0xbe, 0xe2, 0x39, 0x13, 0x3e, 0x1b, 0x25, 0x8e, 0xbd,
+ 0x94, 0x3f, 0x00, 0x3d, 0xa2, 0xf4, 0x31, 0x3e, 0x51, 0xd4, 0xe8, 0xbc,
+ 0x77, 0xea, 0x24, 0x3d, 0xcc, 0x58, 0x36, 0xbe, 0x12, 0x4d, 0xdd, 0x3d,
+ 0xf9, 0x0e, 0xea, 0xbd, 0x1c, 0xbb, 0x63, 0xbe, 0xee, 0xb6, 0x4a, 0xbd,
+ 0xab, 0x3f, 0x1e, 0xbe, 0xd3, 0x63, 0x17, 0xbc, 0xaf, 0x77, 0x00, 0x3e,
+ 0x06, 0xb5, 0xda, 0xbd, 0x7d, 0x6a, 0x23, 0xbd, 0xea, 0x2e, 0x38, 0x3e,
+ 0xe1, 0x25, 0x99, 0xbd, 0x87, 0x79, 0xba, 0x3d, 0x8a, 0x8e, 0x35, 0x3e,
+ 0x4f, 0xe1, 0x11, 0x3d, 0x76, 0x90, 0xb0, 0xbd, 0xe8, 0x94, 0x19, 0xbe,
+ 0xc3, 0xa0, 0xd2, 0x3d, 0xc8, 0x4f, 0x0a, 0x3e, 0xd1, 0x27, 0xfe, 0x3d,
+ 0x1c, 0x6d, 0x2e, 0xbd, 0xd0, 0xd9, 0x49, 0xbe, 0xb9, 0x6a, 0xdc, 0xbd,
+ 0x2d, 0xc2, 0x65, 0x3e, 0x44, 0x40, 0xae, 0x3b, 0x21, 0x41, 0x21, 0x3e,
+ 0xb2, 0x0d, 0x27, 0xbc, 0x4c, 0x95, 0x10, 0x3d, 0x26, 0x6c, 0x59, 0x3c,
+ 0x35, 0xb6, 0x8d, 0xbd, 0xb8, 0xeb, 0x94, 0x3d, 0xaa, 0xf4, 0x8b, 0x3d,
+ 0xee, 0x50, 0x3f, 0x3d, 0xaf, 0xc1, 0xc2, 0xbd, 0x79, 0x9a, 0x23, 0x3e,
+ 0xa6, 0x23, 0x3a, 0xbd, 0x0a, 0xa9, 0xb6, 0x3c, 0x59, 0x3d, 0x25, 0xbe,
+ 0xe1, 0x51, 0xc7, 0xbd, 0xb0, 0x45, 0x30, 0x3e, 0x35, 0xd1, 0x5f, 0x3e,
+ 0x64, 0xfa, 0x7c, 0xbb, 0xbc, 0xea, 0x3b, 0xbe, 0x85, 0x37, 0xff, 0xbc,
+ 0x5a, 0x89, 0x14, 0xbe, 0x83, 0xd4, 0xac, 0xbb, 0x98, 0x33, 0x9b, 0x3d,
+ 0x8b, 0x92, 0x79, 0x3e, 0x6d, 0x87, 0xfa, 0xbc, 0xb2, 0xad, 0x0a, 0xbe,
+ 0xd5, 0x4d, 0x41, 0xbc, 0xe4, 0xf1, 0xc0, 0x3d, 0x7f, 0x38, 0x97, 0x3d,
+ 0xc6, 0x4a, 0x74, 0xbd, 0x13, 0xab, 0xb4, 0x3d, 0x9b, 0x59, 0xa6, 0x3d,
+ 0x55, 0xae, 0x6a, 0x3d, 0x49, 0x85, 0x56, 0xbd, 0x74, 0xd2, 0xd4, 0xbd,
+ 0xf6, 0x2e, 0x12, 0xbe, 0xab, 0x80, 0x17, 0x3d, 0xa4, 0x32, 0x4a, 0x3c,
+ 0x3a, 0x3f, 0x21, 0xbe, 0x0d, 0x42, 0xc2, 0x3d, 0x0b, 0x6f, 0x88, 0xbd,
+ 0x21, 0x42, 0x3f, 0x3e, 0x86, 0x4c, 0x53, 0x3d, 0x6e, 0x87, 0xd4, 0x3d,
+ 0x58, 0x7f, 0xfd, 0xbd, 0x4f, 0xb8, 0xed, 0xbd, 0x88, 0xe1, 0xc2, 0xbd,
+ 0xee, 0x09, 0x82, 0xbe, 0xbf, 0xe2, 0xce, 0xbd, 0x42, 0xce, 0x00, 0x3c,
+ 0x6c, 0xa8, 0x2e, 0x3e, 0xfd, 0xd0, 0xe2, 0x3b, 0xbd, 0x28, 0x39, 0x3e,
+ 0xa5, 0xd0, 0x0f, 0x3d, 0xe5, 0x1a, 0x8a, 0xbd, 0x13, 0xd4, 0xa0, 0x3d,
+ 0x73, 0x78, 0xcd, 0xbd, 0x72, 0x67, 0x33, 0x3e, 0x32, 0x4e, 0x2b, 0x3e,
+ 0x00, 0x2c, 0x00, 0xbe, 0xac, 0x7e, 0x70, 0xbe, 0x01, 0xf6, 0xd7, 0x3d,
+ 0x79, 0x10, 0xf6, 0xbd, 0x1c, 0xaa, 0x33, 0xbe, 0x80, 0x38, 0x1f, 0xbe,
+ 0x8e, 0x58, 0xa3, 0xbd, 0x47, 0xc9, 0xb5, 0x3d, 0x20, 0xf1, 0xdd, 0x3d,
+ 0x55, 0xe1, 0x64, 0x3e, 0x78, 0x5a, 0x75, 0xbd, 0xc9, 0x01, 0x40, 0xbb,
+ 0xc5, 0xaf, 0x98, 0x3d, 0xa7, 0x55, 0x12, 0xbe, 0x21, 0xbd, 0xec, 0x3d,
+ 0x73, 0x88, 0x06, 0x3a, 0x8e, 0x83, 0x6a, 0x3d, 0xdc, 0xbd, 0xed, 0x3d,
+ 0x0e, 0xee, 0xbd, 0xbd, 0x1d, 0x96, 0xb6, 0xbc, 0x96, 0x3f, 0x2d, 0x3d,
+ 0x00, 0x08, 0x3e, 0xbe, 0xa2, 0x4d, 0x7f, 0x3d, 0x0e, 0x3b, 0x4a, 0xbe,
+ 0x7d, 0xb5, 0xd0, 0x3d, 0x27, 0xfd, 0x65, 0x3e, 0xbe, 0x4b, 0x17, 0xbc,
+ 0xce, 0x1a, 0x91, 0xbd, 0x53, 0x7c, 0xa9, 0x3d, 0x42, 0x54, 0xd3, 0xbc,
+ 0x45, 0x02, 0x35, 0xbe, 0x2b, 0x83, 0x11, 0xbd, 0x13, 0x54, 0x7e, 0xbd,
+ 0xa1, 0x80, 0x80, 0xbd, 0xad, 0xdd, 0x96, 0x3a, 0x86, 0xaa, 0xd3, 0x3d,
+ 0x25, 0xee, 0x14, 0xbe, 0xbe, 0x04, 0x16, 0x3e, 0x1f, 0x40, 0xd5, 0x3d,
+ 0xbc, 0x0b, 0x53, 0x3e, 0x60, 0xce, 0xf6, 0x3c, 0x79, 0x18, 0x01, 0xbc,
+ 0xb0, 0x06, 0x27, 0x3e, 0x10, 0xbf, 0xe5, 0x3c, 0x4f, 0xfb, 0xdc, 0x3d,
+ 0x69, 0xc9, 0x36, 0x3e, 0x9f, 0x3d, 0x80, 0xbd, 0x74, 0x50, 0xe5, 0x3d,
+ 0xd9, 0x3f, 0xf9, 0xbd, 0x44, 0xfb, 0x3e, 0xbe, 0x4f, 0x7f, 0x98, 0x3c,
+ 0xfe, 0xd4, 0x4b, 0x3d, 0x14, 0xcb, 0x4d, 0x3d, 0x42, 0x38, 0x93, 0xbb,
+ 0x2f, 0xf1, 0x4e, 0x3c, 0x0a, 0x97, 0xa4, 0xbd, 0xfd, 0xd9, 0x3d, 0xbe,
+ 0xaa, 0x6d, 0x44, 0x3e, 0x45, 0xe9, 0x3c, 0x3e, 0x54, 0x53, 0x45, 0xbe,
+ 0x96, 0x23, 0x7d, 0x3d, 0x04, 0xf9, 0x29, 0x3e, 0x7b, 0x72, 0x32, 0x3e,
+ 0x0e, 0xe5, 0x1e, 0x3c, 0xc6, 0x15, 0x5e, 0x3b, 0x25, 0x6b, 0x04, 0x3d,
+ 0x63, 0xb9, 0xe0, 0xbd, 0x46, 0xf0, 0x21, 0xbe, 0x93, 0x22, 0xc6, 0xbd,
+ 0x50, 0x74, 0x8d, 0xbd, 0xdd, 0xce, 0x98, 0xbc, 0x0c, 0xbe, 0x7e, 0xbe,
+ 0x3a, 0xb1, 0xf0, 0x3d, 0x02, 0xc5, 0x2c, 0x3e, 0x47, 0x56, 0x11, 0x3e,
+ 0x97, 0x68, 0x6a, 0xbe, 0x09, 0xcd, 0xe4, 0x3d, 0xad, 0xa7, 0xeb, 0xbd,
+ 0x1b, 0x8e, 0x91, 0xbd, 0x58, 0xf1, 0x95, 0xbe, 0x7d, 0x6c, 0x2e, 0xbd,
+ 0x18, 0x84, 0x50, 0x3e, 0xbf, 0xb0, 0x7a, 0x3e, 0xf7, 0x3b, 0xf9, 0xbd,
+ 0x70, 0xb6, 0x4c, 0x3e, 0xf7, 0xed, 0x51, 0xbe, 0x20, 0xeb, 0x20, 0xbe,
+ 0x1e, 0xe5, 0x98, 0x3d, 0xa6, 0x40, 0xd1, 0xbc, 0x33, 0xf1, 0x3c, 0xbd,
+ 0x3e, 0x7e, 0xbe, 0x3d, 0x65, 0x85, 0xc0, 0x3d, 0x1f, 0x26, 0x31, 0x3d,
+ 0x88, 0xbf, 0xa3, 0xbe, 0xb2, 0xec, 0x63, 0x3e, 0x5f, 0x5e, 0xad, 0x3d,
+ 0x91, 0xca, 0x3b, 0x3d, 0x82, 0x0b, 0x82, 0xbb, 0x9b, 0x84, 0x0f, 0xbe,
+ 0x43, 0x5e, 0xd2, 0xbc, 0x8f, 0x33, 0x5e, 0xbe, 0x3d, 0x8b, 0x98, 0x3e,
+ 0xce, 0x7b, 0xeb, 0xbd, 0xe8, 0x58, 0x59, 0xbd, 0x76, 0x79, 0x00, 0x3e,
+ 0xba, 0x0b, 0xdd, 0xbc, 0xcc, 0x5a, 0xfd, 0x3c, 0xac, 0x8c, 0x10, 0x3e,
+ 0xe4, 0xce, 0xee, 0x3d, 0x31, 0x76, 0x56, 0xbe, 0x97, 0x8d, 0x0b, 0x3e,
+ 0x0a, 0x30, 0xc8, 0xbd, 0xb4, 0xd9, 0xdb, 0xbd, 0xeb, 0xce, 0x8b, 0x3c,
+ 0xc4, 0x46, 0x8e, 0xbd, 0xef, 0x2e, 0x47, 0xbd, 0x8d, 0x68, 0xb8, 0x3e,
+ 0xaa, 0x38, 0x18, 0x3d, 0xef, 0xf6, 0x36, 0x3b, 0xa8, 0x08, 0x67, 0xbd,
+ 0x62, 0xdd, 0x24, 0x3c, 0x24, 0xb4, 0x3f, 0x3e, 0x14, 0x3b, 0x0d, 0xbe,
+ 0xb9, 0xfc, 0x64, 0xbe, 0x11, 0x45, 0x17, 0x3e, 0xd0, 0xf3, 0xa1, 0x3d,
+ 0x2b, 0x03, 0x92, 0x3d, 0xdc, 0x64, 0x47, 0xbe, 0xc3, 0x33, 0xbe, 0xbd,
+ 0x66, 0xb3, 0x19, 0x3e, 0x7a, 0xab, 0xfc, 0x3d, 0xb9, 0xd4, 0xf5, 0x3b,
+ 0xcb, 0xd1, 0x9c, 0xbe, 0x56, 0x8d, 0xd8, 0xbd, 0xbc, 0x59, 0xf1, 0xbd,
+ 0xf7, 0x8a, 0x87, 0xbb, 0x2a, 0x06, 0x63, 0xbe, 0x98, 0x82, 0x73, 0x3d,
+ 0x53, 0x50, 0x96, 0xbe, 0xc2, 0x11, 0xe1, 0xbd, 0x40, 0xe4, 0x2e, 0x3d,
+ 0xf8, 0x3c, 0x27, 0xbe, 0x54, 0x04, 0x93, 0xbd, 0x79, 0x3e, 0x2b, 0x3e,
+ 0x17, 0x3c, 0xc9, 0xbd, 0x05, 0xe2, 0x5e, 0xbe, 0xaf, 0xb6, 0xe5, 0xbd,
+ 0xca, 0xd1, 0x8e, 0x3d, 0xb5, 0xd8, 0x6f, 0xbe, 0xf4, 0x2e, 0xf6, 0xbd,
+ 0xa9, 0x5e, 0xa8, 0x3d, 0x79, 0xca, 0xe3, 0x3c, 0x3a, 0xf5, 0x0a, 0x3c,
+ 0xa8, 0xa7, 0x29, 0xbd, 0x50, 0xb8, 0xc1, 0x3d, 0x55, 0x93, 0x1e, 0x3e,
+ 0xbf, 0x61, 0xd2, 0xbd, 0x44, 0xa4, 0x32, 0x3d, 0x89, 0x80, 0x02, 0x3e,
+ 0x1d, 0xa6, 0x86, 0xbe, 0x90, 0xec, 0xf1, 0x3d, 0x3a, 0x70, 0x2c, 0x3d,
+ 0x3d, 0x54, 0xdd, 0x3d, 0xdd, 0x46, 0x45, 0x3e, 0x64, 0x76, 0x33, 0x3e,
+ 0x51, 0xef, 0xab, 0x3c, 0xc1, 0x27, 0x42, 0x3d, 0xc0, 0x61, 0xdf, 0xbd,
+ 0x34, 0x12, 0x53, 0x3e, 0xc5, 0x63, 0x78, 0xbe, 0x96, 0xd4, 0x46, 0x3e,
+ 0x64, 0xd4, 0x33, 0x3e, 0x98, 0x48, 0x04, 0x3e, 0x7f, 0xdb, 0x01, 0xbe,
+ 0x3b, 0x3a, 0x97, 0xbd, 0xe0, 0xfe, 0x74, 0xbd, 0x32, 0xb1, 0x12, 0xbe,
+ 0xc3, 0xd9, 0x92, 0xbd, 0x49, 0x83, 0x33, 0x3d, 0x3e, 0xa2, 0x8a, 0xbe,
+ 0x37, 0x73, 0x24, 0x3d, 0xc4, 0x76, 0x20, 0x3e, 0x41, 0x07, 0xfe, 0xbc,
+ 0xad, 0xc3, 0x8f, 0x3d, 0x28, 0x37, 0x32, 0xbe, 0xd1, 0xc7, 0x16, 0x3d,
+ 0xb3, 0xfb, 0x89, 0xbe, 0x0f, 0x13, 0xaf, 0xbd, 0x5f, 0x82, 0xdd, 0xbd,
+ 0xd4, 0x11, 0xea, 0xbd, 0xe4, 0xcf, 0x38, 0xbe, 0xe7, 0xf2, 0x25, 0x3d,
+ 0x23, 0x16, 0x37, 0xbe, 0x42, 0x4a, 0x8b, 0xbd, 0x22, 0x21, 0xc0, 0xbd,
+ 0x33, 0xc3, 0x01, 0x3e, 0x98, 0x94, 0x17, 0x3e, 0xc2, 0xe0, 0xd9, 0xbd,
+ 0x70, 0x1f, 0xef, 0x3d, 0xb8, 0x12, 0x17, 0x3e, 0xdf, 0x2c, 0x1e, 0xbe,
+ 0x9a, 0x2f, 0x01, 0xbd, 0x90, 0x64, 0x00, 0x3c, 0xe6, 0xec, 0x51, 0xbc,
+ 0xee, 0xd7, 0x16, 0x3d, 0xc8, 0x30, 0x0e, 0xbd, 0xa0, 0x25, 0x49, 0x3d,
+ 0xd3, 0x60, 0xe8, 0x3c, 0xac, 0x23, 0x8a, 0x3d, 0x66, 0xcd, 0x7f, 0xbd,
+ 0x97, 0x87, 0xcf, 0xbd, 0x69, 0x3e, 0x10, 0xbe, 0x10, 0x59, 0x7e, 0xbd,
+ 0x27, 0x58, 0x08, 0xbe, 0x82, 0x7f, 0x36, 0xbb, 0x35, 0xa3, 0xb3, 0xbb,
+ 0xf6, 0x77, 0x57, 0x3d, 0x14, 0x40, 0x58, 0x3d, 0xbb, 0x51, 0xe6, 0xbd,
+ 0x4b, 0x56, 0x52, 0xbd, 0x5b, 0xac, 0x5a, 0x3e, 0xae, 0x32, 0xe1, 0xbc,
+ 0xb4, 0xe2, 0xa2, 0x3d, 0x8f, 0xcc, 0xea, 0xbd, 0xa6, 0x81, 0x0b, 0x3c,
+ 0xdc, 0x68, 0xda, 0x3d, 0x63, 0x26, 0x87, 0xbe, 0xbe, 0x20, 0x07, 0x3d,
+ 0x9a, 0x1e, 0xb0, 0x3d, 0x4a, 0xa8, 0x56, 0x3e, 0xbd, 0x9c, 0x64, 0xbd,
+ 0x51, 0x62, 0x2b, 0xbe, 0x95, 0x04, 0x3f, 0x3e, 0x45, 0x22, 0xc1, 0x3d,
+ 0x34, 0x78, 0x69, 0xbd, 0xfa, 0x1b, 0xf6, 0x3d, 0x49, 0x7f, 0x04, 0x3e,
+ 0x4b, 0x52, 0x4c, 0xbe, 0x52, 0xf4, 0xfb, 0xbd, 0x1f, 0x91, 0x32, 0xbe,
+ 0x3d, 0xca, 0xc1, 0xbd, 0x00, 0x1b, 0x49, 0xbd, 0x38, 0x57, 0x35, 0x3c,
+ 0xe5, 0xd7, 0xd2, 0xbd, 0x92, 0x19, 0x0f, 0x3e, 0x71, 0xe6, 0x85, 0x3d,
+ 0xd2, 0x86, 0x55, 0x3e, 0xe5, 0x2a, 0x78, 0x3e, 0xb3, 0x28, 0x65, 0xbd,
+ 0x46, 0x9b, 0x25, 0x3c, 0xb7, 0xde, 0xd6, 0x3d, 0xa8, 0xce, 0xf3, 0xbd,
+ 0xae, 0xc3, 0x90, 0xbd, 0x1b, 0x70, 0x85, 0xbd, 0x52, 0x9e, 0x1e, 0xbc,
+ 0x5e, 0x77, 0xfa, 0x3d, 0x55, 0xda, 0x59, 0x3e, 0xee, 0x4d, 0x7d, 0xbd,
+ 0x35, 0x14, 0xf6, 0x3b, 0x18, 0x65, 0x91, 0x3d, 0xf4, 0x35, 0xc9, 0x3d,
+ 0x38, 0x5f, 0xce, 0x3d, 0x95, 0xc9, 0x74, 0x3d, 0x9c, 0x59, 0x8a, 0x3d,
+ 0xcf, 0xf4, 0xa2, 0xbc, 0x89, 0x1c, 0xa1, 0x3b, 0x60, 0xfd, 0x78, 0xbc,
+ 0xbb, 0x1a, 0xc2, 0x3b, 0xad, 0xd4, 0x77, 0x3c, 0x8f, 0x05, 0x80, 0x3c,
+ 0xf3, 0x37, 0x72, 0x3b, 0x06, 0x05, 0xe1, 0x3d, 0xbb, 0x67, 0xd4, 0x3d,
+ 0x33, 0x78, 0x03, 0x3e, 0x52, 0x46, 0x1e, 0x3e, 0x08, 0x84, 0x76, 0x3d,
+ 0x66, 0x89, 0xcf, 0xbd, 0x06, 0xe0, 0xd7, 0xbc, 0x21, 0x0e, 0xd9, 0xbd,
+ 0xd6, 0x63, 0x1c, 0xbd, 0xbd, 0xfd, 0xfd, 0x3d, 0x8c, 0x5a, 0xfe, 0xbd,
+ 0x8b, 0x44, 0x09, 0x3e, 0x15, 0x36, 0xe3, 0x3d, 0x2d, 0x3d, 0xbd, 0x3d,
+ 0xa5, 0x45, 0x98, 0x3d, 0xa4, 0x77, 0xd2, 0xbd, 0x3b, 0xde, 0x08, 0xbd,
+ 0x1b, 0x6f, 0x2c, 0xbe, 0xc0, 0x57, 0x58, 0xbd, 0x78, 0x8d, 0x74, 0x3c,
+ 0x89, 0x7a, 0x52, 0xbe, 0x6f, 0x68, 0x38, 0xbe, 0xe5, 0xa8, 0x89, 0xbe,
+ 0xd4, 0x36, 0xfd, 0xb8, 0x3f, 0xc4, 0xf3, 0xbd, 0xdd, 0xf4, 0xa8, 0x3b,
+ 0x9d, 0x4e, 0x81, 0x3d, 0x0a, 0x58, 0xa8, 0x3c, 0xa0, 0x5a, 0xda, 0x3c,
+ 0x19, 0x63, 0xe2, 0xbc, 0x51, 0x20, 0x11, 0x3e, 0xd1, 0x55, 0xca, 0x3c,
+ 0x8a, 0x0c, 0x08, 0x3e, 0xed, 0xfc, 0x33, 0x3d, 0x13, 0xa2, 0x97, 0xbc,
+ 0x1f, 0xba, 0x09, 0x3e, 0x5a, 0x28, 0x02, 0xbe, 0x5c, 0xfe, 0x62, 0x3d,
+ 0x31, 0xea, 0x05, 0xbe, 0xe8, 0x04, 0xbb, 0xbd, 0xef, 0xe2, 0x3d, 0xbe,
+ 0xe7, 0xbf, 0x82, 0x3d, 0x13, 0x6e, 0xfe, 0x3c, 0x84, 0xc8, 0x0e, 0xbe,
+ 0x34, 0x72, 0xf9, 0x3d, 0x69, 0x86, 0x1a, 0xbe, 0x59, 0x95, 0xd4, 0x3d,
+ 0x6c, 0x50, 0x2c, 0x3e, 0x7b, 0x53, 0xee, 0x3e, 0xe0, 0x59, 0x4d, 0xbe,
+ 0x7a, 0x6d, 0x85, 0x3e, 0x50, 0xd8, 0x01, 0x3e, 0x58, 0xcf, 0x27, 0x3d,
+ 0x2d, 0x5e, 0x60, 0xbd, 0x70, 0x7d, 0xf3, 0xbd, 0x06, 0xf8, 0x92, 0xbd,
+ 0x1b, 0x48, 0xb9, 0x3d, 0x20, 0x08, 0xd5, 0x3d, 0xe6, 0x79, 0x64, 0xbd,
+ 0x87, 0xe1, 0x98, 0xbd, 0x21, 0x37, 0x2e, 0x3d, 0xb7, 0x8f, 0xc0, 0x3d,
+ 0x7a, 0x91, 0x22, 0xbe, 0x2d, 0xcf, 0xfa, 0x3e, 0x27, 0x55, 0x57, 0x3d,
+ 0x2d, 0x87, 0x9d, 0xbd, 0xcb, 0xcf, 0x52, 0x3d, 0x39, 0xf9, 0xbe, 0x3d,
+ 0x87, 0x68, 0x3e, 0x3d, 0x6f, 0xdf, 0xd3, 0x3c, 0xba, 0xc9, 0x21, 0x3d,
+ 0xe2, 0x31, 0x2f, 0x3d, 0xc6, 0xe4, 0x18, 0xbe, 0xab, 0x20, 0x65, 0x3d,
+ 0x0e, 0x31, 0x99, 0xba, 0x26, 0x06, 0x78, 0xbe, 0xea, 0x1d, 0x28, 0x3e,
+ 0xb2, 0x4b, 0x6e, 0xbe, 0xfd, 0xa4, 0x65, 0x3b, 0x17, 0x1c, 0xcf, 0xbc,
+ 0xd5, 0xae, 0x03, 0x3e, 0x75, 0x0e, 0xd1, 0x3d, 0x07, 0xf5, 0xc5, 0x3d,
+ 0x27, 0xe5, 0x29, 0x3e, 0xb3, 0xde, 0xe3, 0xbd, 0x95, 0x61, 0xaf, 0xbd,
+ 0x0f, 0xbe, 0x8d, 0x3e, 0x44, 0xa6, 0x9a, 0xbd, 0x82, 0xf2, 0x49, 0xbd,
+ 0xac, 0x99, 0xd3, 0xbd, 0xc0, 0x64, 0x89, 0x3e, 0x17, 0x6f, 0x0d, 0x3d,
+ 0x77, 0x54, 0x8a, 0x3e, 0x00, 0x46, 0x15, 0xbd, 0x52, 0x4e, 0x1e, 0x3e,
+ 0x18, 0xde, 0x09, 0x3d, 0x76, 0xda, 0x03, 0xbf, 0x98, 0x8a, 0xde, 0xbd,
+ 0xb5, 0x99, 0x34, 0xbd, 0xa3, 0x34, 0x1e, 0x3e, 0x29, 0xe9, 0xc3, 0x3d,
+ 0xe7, 0xa1, 0xd6, 0xbd, 0x93, 0x16, 0x02, 0x3e, 0x76, 0x4c, 0x08, 0xbe,
+ 0x0c, 0x45, 0xf6, 0x3d, 0xf6, 0x01, 0xa3, 0x3d, 0x45, 0x57, 0x61, 0x3e,
+ 0x1d, 0x11, 0xf3, 0xba, 0xf8, 0xdc, 0x2d, 0x3e, 0x65, 0x60, 0x39, 0x3d,
+ 0x61, 0x1d, 0xbd, 0x3e, 0xb1, 0x88, 0xf2, 0xbd, 0x36, 0x96, 0xcf, 0xbd,
+ 0x8b, 0x20, 0x1e, 0x3e, 0x2b, 0x45, 0xb3, 0x3d, 0x3a, 0x7f, 0x7b, 0x3d,
+ 0x47, 0x58, 0x3e, 0xbe, 0x9b, 0xe1, 0x04, 0xbe, 0x5a, 0xf5, 0x94, 0x3d,
+ 0x80, 0x01, 0x38, 0x3d, 0xc2, 0xa4, 0xd3, 0x3d, 0xc2, 0xf9, 0x63, 0xbe,
+ 0xfc, 0xb4, 0xa3, 0xbe, 0x52, 0x85, 0x83, 0xbe, 0xc6, 0x3d, 0x7b, 0xbe,
+ 0xb3, 0x3c, 0x90, 0x3d, 0x90, 0x48, 0x42, 0x3e, 0xc3, 0xbd, 0x00, 0x3e,
+ 0x1a, 0xbf, 0xcd, 0x3d, 0xf7, 0xf7, 0x9e, 0xbd, 0xcc, 0x17, 0xcd, 0x3d,
+ 0x0c, 0xdd, 0x61, 0xbd, 0x7f, 0xe1, 0x0b, 0x3e, 0x08, 0xe7, 0xd5, 0x3d,
+ 0xd8, 0xc6, 0x96, 0xbd, 0xec, 0x54, 0x9c, 0xbc, 0xa8, 0x20, 0x3d, 0xbe,
+ 0x94, 0x78, 0x12, 0x3e, 0xf3, 0xb6, 0x18, 0x3d, 0x18, 0x16, 0xaf, 0xbd,
+ 0x2f, 0x67, 0xd9, 0x3d, 0xf2, 0x5d, 0x06, 0xbe, 0xbd, 0xee, 0xf1, 0xbd,
+ 0x5d, 0xa4, 0x24, 0x3e, 0xf9, 0x65, 0x4e, 0xbe, 0x44, 0xa9, 0x14, 0xbc,
+ 0xba, 0x1e, 0x20, 0x3d, 0xf1, 0x8b, 0x5c, 0x3b, 0x6c, 0x7e, 0x1f, 0x3d,
+ 0x6a, 0x0d, 0x74, 0xbe, 0xa7, 0xd6, 0x7e, 0x3d, 0x78, 0x28, 0xab, 0x3d,
+ 0xc6, 0xd5, 0xfa, 0x3d, 0x28, 0xd5, 0xc8, 0xbc, 0x3c, 0xe3, 0xb4, 0x3c,
+ 0xa1, 0xf9, 0x24, 0xbe, 0x22, 0xcb, 0x0f, 0xbc, 0x89, 0xb7, 0x7f, 0xbd,
+ 0x35, 0x29, 0xfc, 0xbd, 0x59, 0x39, 0xcb, 0xbc, 0xa2, 0xab, 0xe7, 0xbd,
+ 0x4b, 0xf0, 0x2b, 0xbe, 0xe7, 0x40, 0xae, 0xbc, 0x81, 0x18, 0xd9, 0xbd,
+ 0xb0, 0x93, 0x00, 0xbe, 0xe8, 0x25, 0x84, 0x3d, 0xab, 0xf7, 0xfc, 0x3d,
+ 0xc2, 0x9a, 0xe8, 0xbd, 0x75, 0xd5, 0x8f, 0xbd, 0x48, 0x4a, 0x82, 0xbc,
+ 0x3b, 0xd3, 0x41, 0x3e, 0x7b, 0x2f, 0x87, 0x3d, 0x81, 0xd5, 0xd3, 0x3d,
+ 0xc3, 0x03, 0xaa, 0x3d, 0x7e, 0x97, 0xc8, 0xbd, 0xee, 0xa0, 0x25, 0xbd,
+ 0x97, 0x9d, 0x25, 0xbd, 0x15, 0x05, 0x0d, 0x3e, 0x84, 0x50, 0xae, 0x3d,
+ 0x6b, 0x3a, 0xfa, 0xbd, 0xef, 0x40, 0xa0, 0x3d, 0xdc, 0xb0, 0x7a, 0xbd,
+ 0x7c, 0x4f, 0x1e, 0x3e, 0xdc, 0xe4, 0x23, 0xbd, 0x6c, 0x40, 0xdd, 0x3d,
+ 0xa6, 0x12, 0x83, 0x3e, 0x98, 0x84, 0x54, 0x3c, 0xb6, 0x8d, 0xcb, 0x3b,
+ 0x2e, 0xa0, 0x1d, 0x3e, 0x05, 0x59, 0x86, 0xbe, 0x65, 0x1e, 0xe9, 0x3d,
+ 0xbe, 0x92, 0x4d, 0xbd, 0x28, 0x0f, 0xe6, 0xbb, 0xa5, 0x45, 0x17, 0xbe,
+ 0x56, 0x6a, 0xc0, 0xbd, 0x90, 0x0a, 0x10, 0x3d, 0xae, 0xf8, 0x12, 0x3d,
+ 0x05, 0x89, 0x18, 0x3e, 0xc6, 0xc1, 0x2f, 0x3e, 0x3d, 0x9c, 0x56, 0x3c,
+ 0x2f, 0x0c, 0x1b, 0x3d, 0x1d, 0x1d, 0x86, 0x3d, 0xfc, 0x53, 0x04, 0x3e,
+ 0xa3, 0xe4, 0x4b, 0xbd, 0xfc, 0xd4, 0x92, 0xbd, 0xfb, 0x3a, 0x06, 0x3e,
+ 0x34, 0x0f, 0xf2, 0x3e, 0x42, 0x61, 0xf2, 0xbc, 0xc8, 0x74, 0xe2, 0xbd,
+ 0xf9, 0xd1, 0xee, 0xbc, 0xe7, 0x8e, 0x09, 0x3c, 0x7b, 0x7f, 0x0e, 0x3e,
+ 0x4a, 0xb6, 0x2c, 0x3d, 0x08, 0x26, 0x00, 0x3d, 0xc1, 0x68, 0xcb, 0xbd,
+ 0x13, 0xb3, 0x6e, 0xbe, 0x3e, 0x63, 0x3d, 0x3d, 0x4c, 0xc8, 0x3c, 0xbe,
+ 0x75, 0x6f, 0xfa, 0xbd, 0x63, 0x24, 0x9f, 0xbd, 0x60, 0x5b, 0xa6, 0xbe,
+ 0xa1, 0xdd, 0xfb, 0xbd, 0x60, 0xde, 0x6a, 0x3d, 0x16, 0x78, 0xa6, 0xbd,
+ 0xbc, 0xc5, 0x0a, 0x3e, 0xd1, 0x9e, 0x24, 0xbe, 0xf8, 0x18, 0x7c, 0x3c,
+ 0x0e, 0x40, 0x1b, 0x3d, 0xa4, 0x32, 0x27, 0xbe, 0x26, 0xf5, 0x81, 0x3e,
+ 0x91, 0x72, 0x6f, 0x3d, 0x31, 0x4d, 0x11, 0xbe, 0x6b, 0xa6, 0x63, 0xbb,
+ 0x0d, 0x45, 0x26, 0xbe, 0xd2, 0x76, 0x9a, 0xbd, 0xd4, 0xe4, 0x47, 0x3b,
+ 0xbe, 0xab, 0x04, 0xbb, 0x31, 0xb5, 0xc6, 0x3d, 0x2b, 0x08, 0x09, 0x3c,
+ 0x73, 0xf4, 0x3f, 0x3e, 0xeb, 0x77, 0x51, 0x3d, 0xbb, 0x85, 0xc7, 0xbd,
+ 0x85, 0x1a, 0x7b, 0x3d, 0xec, 0xb1, 0xa3, 0xbc, 0x77, 0xa7, 0xa9, 0x3c,
+ 0xb8, 0xfc, 0x1d, 0x3d, 0xba, 0xd9, 0x87, 0xbd, 0xe3, 0xfe, 0x52, 0xbd,
+ 0x63, 0xc0, 0x31, 0xbe, 0xc5, 0xd0, 0xf8, 0xbd, 0xd3, 0x6b, 0xe9, 0x3c,
+ 0xc3, 0xa1, 0xfe, 0x3d, 0xbf, 0xd3, 0x39, 0xbe, 0x12, 0xa3, 0x94, 0x3d,
+ 0x04, 0x5f, 0xae, 0x3d, 0xe9, 0x1a, 0x4b, 0xbd, 0x73, 0xc2, 0xf9, 0xbd,
+ 0x03, 0x1a, 0xae, 0xbd, 0x70, 0x98, 0x96, 0x3d, 0x5a, 0x34, 0x7f, 0xbd,
+ 0x07, 0x2c, 0xfd, 0xbc, 0xca, 0x11, 0x1f, 0xbe, 0x37, 0xaa, 0xdc, 0x3d,
+ 0x4c, 0x8c, 0x21, 0x3d, 0x3b, 0xba, 0x9d, 0x3d, 0x8b, 0x41, 0x18, 0xbe,
+ 0xc0, 0x10, 0x1a, 0x3e, 0xd9, 0x7a, 0xcf, 0xbd, 0x77, 0x78, 0xab, 0xbd,
+ 0xc5, 0x4f, 0xe7, 0x3d, 0x00, 0x9f, 0xb2, 0x3d, 0x35, 0x2b, 0x42, 0xbd,
+ 0x1b, 0x55, 0xf2, 0x3b, 0x6a, 0x95, 0x8a, 0xbd, 0xb5, 0x8e, 0x4b, 0xb7,
+ 0x5c, 0x85, 0x97, 0x3d, 0xdc, 0xba, 0x1d, 0x3e, 0xa1, 0x88, 0x09, 0xbe,
+ 0x18, 0x53, 0x15, 0xbe, 0x4b, 0xaa, 0x60, 0x3d, 0x34, 0x3a, 0x4b, 0xbb,
+ 0xbd, 0x48, 0x59, 0xbd, 0x79, 0xbb, 0xaf, 0xbd, 0x3c, 0x83, 0xbf, 0xbd,
+ 0xe7, 0xd0, 0xdf, 0x3d, 0x69, 0x7a, 0x06, 0x3e, 0x25, 0x7a, 0xc8, 0x3d,
+ 0x3d, 0xe1, 0xc2, 0x3d, 0x85, 0xb2, 0x27, 0x3d, 0xc5, 0xba, 0x2f, 0xbb,
+ 0x65, 0x31, 0x11, 0x3e, 0x0c, 0x3b, 0x2a, 0x3d, 0xb3, 0xde, 0x08, 0xb7,
+ 0x06, 0x64, 0x0f, 0x3d, 0x1f, 0x07, 0x7b, 0xbd, 0x84, 0x9d, 0xc9, 0xbd,
+ 0x3a, 0xe1, 0xdf, 0x3d, 0xd5, 0x29, 0x76, 0x3c, 0xd5, 0x7d, 0x7a, 0xbd,
+ 0xd0, 0x2c, 0x15, 0x3e, 0xe8, 0xe3, 0x2e, 0xbe, 0xe2, 0x6e, 0x9a, 0x3d,
+ 0x68, 0x37, 0xc2, 0x3d, 0x23, 0x52, 0x13, 0x3e, 0x84, 0x68, 0xa5, 0xbb,
+ 0x56, 0xc4, 0x81, 0x3c, 0x71, 0x7a, 0xc0, 0xbd, 0xf8, 0x5a, 0x9b, 0x3c,
+ 0xee, 0x4b, 0x55, 0x3e, 0xd4, 0xfa, 0x12, 0x3e, 0x2e, 0x93, 0xf7, 0xbb,
+ 0x9c, 0x1c, 0xf8, 0x3d, 0xde, 0x06, 0xab, 0x3d, 0x6e, 0xfa, 0xbe, 0x3c,
+ 0x9d, 0x99, 0x08, 0x3c, 0xca, 0x77, 0xe3, 0xbd, 0xc4, 0xb3, 0xa6, 0x3c,
+ 0xd2, 0xd0, 0x02, 0x3e, 0x35, 0x3d, 0x7a, 0x3d, 0x57, 0x0b, 0x13, 0xbe,
+ 0x6f, 0x12, 0x50, 0xbe, 0x2c, 0xf8, 0x04, 0x3d, 0xb0, 0xd7, 0xdf, 0x3d,
+ 0x0d, 0x90, 0xbf, 0xbd, 0xbb, 0x2a, 0x1c, 0x3e, 0xf8, 0xf4, 0x77, 0x3d,
+ 0xd7, 0x39, 0x0c, 0xbe, 0x49, 0x04, 0xe7, 0x3d, 0x7c, 0x2e, 0x15, 0xbe,
+ 0x52, 0x8d, 0xb5, 0x3d, 0xe8, 0xc0, 0xd6, 0xbc, 0xfa, 0x6b, 0x50, 0xbd,
+ 0x9f, 0x40, 0xee, 0xbc, 0xce, 0xd0, 0xbf, 0xbd, 0x4d, 0x24, 0xa1, 0xbd,
+ 0x16, 0xda, 0xa8, 0x3d, 0x70, 0xe2, 0x78, 0x3c, 0x35, 0x92, 0x5f, 0x3c,
+ 0xef, 0x0f, 0x8c, 0xbd, 0xa3, 0x69, 0x9d, 0xbc, 0x1a, 0x83, 0xcf, 0x3d,
+ 0xc7, 0xb5, 0x98, 0xbd, 0x9f, 0x00, 0xe1, 0xbd, 0x2c, 0x61, 0x29, 0xbe,
+ 0xff, 0x30, 0xca, 0x3d, 0x8b, 0xef, 0x37, 0xbd, 0x5e, 0xef, 0x0e, 0xbe,
+ 0x2e, 0x1f, 0xb1, 0x3b, 0x37, 0x4f, 0xf9, 0x3d, 0xa5, 0x73, 0x33, 0xbb,
+ 0x03, 0x8c, 0xad, 0xbc, 0x62, 0x3e, 0x2a, 0x3d, 0x6c, 0xdb, 0x54, 0x3d,
+ 0x39, 0xbf, 0xcc, 0xbd, 0xab, 0xa2, 0xcd, 0x3d, 0x46, 0xfd, 0xf5, 0xbd,
+ 0x52, 0x4d, 0xd9, 0x3d, 0x9d, 0xdd, 0x0a, 0xbe, 0xb8, 0xb6, 0x04, 0xbe,
+ 0xd4, 0x93, 0xf3, 0xbd, 0xed, 0x43, 0x8b, 0x3c, 0xdb, 0x22, 0x0e, 0x3d,
+ 0xb2, 0xa5, 0xdf, 0xbc, 0x41, 0xc2, 0x36, 0xbe, 0x80, 0x40, 0x29, 0x3d,
+ 0x9d, 0xab, 0xbb, 0x3d, 0xf6, 0xb5, 0xf6, 0xbc, 0xed, 0x4b, 0x06, 0xbe,
+ 0x97, 0x99, 0x20, 0xbb, 0xe8, 0x1a, 0x4a, 0xbc, 0x4d, 0x94, 0xef, 0x3d,
+ 0xb7, 0xb5, 0xa9, 0xbd, 0x8b, 0xfc, 0xff, 0x3a, 0x6f, 0x57, 0x79, 0xbd,
+ 0x2a, 0x0d, 0x3a, 0x3d, 0x92, 0x7b, 0x79, 0xbd, 0xbc, 0xd4, 0x84, 0xbd,
+ 0xbc, 0xa2, 0x81, 0xbd, 0xa5, 0x24, 0xde, 0x3c, 0x98, 0x13, 0xb1, 0xbd,
+ 0x52, 0x2c, 0x90, 0xbe, 0x9e, 0x98, 0x92, 0xbd, 0x2a, 0x24, 0xb0, 0x3d,
+ 0xff, 0x0c, 0x01, 0x3e, 0xb1, 0x1b, 0x49, 0x3e, 0x3e, 0x66, 0x02, 0xbe,
+ 0xd8, 0xeb, 0xa0, 0xbb, 0x1c, 0xe8, 0x76, 0x3d, 0x27, 0x21, 0xd8, 0x3b,
+ 0x36, 0x75, 0xb1, 0xbd, 0xd9, 0xbb, 0xe3, 0x3d, 0xc3, 0x79, 0x10, 0x3e,
+ 0x35, 0x30, 0xd2, 0x3d, 0xc4, 0xa5, 0x05, 0x3e, 0xf8, 0x29, 0xc1, 0x3d,
+ 0xd0, 0xae, 0x4c, 0x3e, 0xad, 0x62, 0xd0, 0xbd, 0xbb, 0x0f, 0x13, 0x3e,
+ 0x38, 0x78, 0xba, 0xbd, 0x6c, 0xd2, 0x83, 0x3c, 0x87, 0x76, 0xd0, 0xbd,
+ 0x90, 0x89, 0xec, 0xbd, 0x77, 0x62, 0xd8, 0xbd, 0xc0, 0x80, 0xd4, 0xbd,
+ 0x75, 0x9a, 0x73, 0xbc, 0x74, 0x26, 0xd5, 0x3d, 0x94, 0x82, 0x82, 0xbd,
+ 0xbd, 0x0d, 0x22, 0xbe, 0x20, 0xbc, 0x05, 0x3e, 0xad, 0xf9, 0x89, 0xbe,
+ 0xfd, 0xa6, 0x04, 0xbe, 0x65, 0x04, 0x2b, 0xbe, 0x50, 0x40, 0x4b, 0x3d,
+ 0x40, 0xb0, 0xb1, 0xbd, 0xcd, 0x1f, 0x1e, 0xbe, 0xb4, 0x8c, 0x81, 0xbe,
+ 0x8a, 0xbc, 0x05, 0x3d, 0xd3, 0x18, 0x35, 0xbe, 0xaa, 0xb1, 0x20, 0x3c,
+ 0x6d, 0xe6, 0xbe, 0x3c, 0x80, 0xf2, 0x98, 0xbc, 0x1f, 0xbc, 0xad, 0xbc,
+ 0x51, 0x12, 0x00, 0xbe, 0xaa, 0xc5, 0x61, 0x3d, 0xd5, 0x56, 0x1b, 0xbc,
+ 0x48, 0x6d, 0x2b, 0xbe, 0x01, 0x9a, 0x1e, 0x3d, 0xf9, 0x46, 0xe8, 0x3d,
+ 0xba, 0x6f, 0xb0, 0xbc, 0xaf, 0xc9, 0xd8, 0x3d, 0x87, 0xda, 0x31, 0x3e,
+ 0xdf, 0x6a, 0x8d, 0x3d, 0x94, 0xb9, 0x70, 0xbd, 0xd9, 0x39, 0x17, 0x3d,
+ 0xf6, 0x9a, 0x8e, 0xbd, 0x8a, 0x1c, 0xf0, 0xbd, 0x37, 0x3f, 0x02, 0xbe,
+ 0xb2, 0x23, 0x8a, 0x3c, 0x82, 0xf3, 0xd1, 0xbd, 0x40, 0x5b, 0x21, 0xbe,
+ 0xc8, 0xf1, 0x10, 0xbb, 0xd0, 0x7d, 0x89, 0xbe, 0xd9, 0x6e, 0x98, 0x3c,
+ 0x40, 0xa6, 0x02, 0xbe, 0x67, 0xff, 0x52, 0x3d, 0xb5, 0x82, 0x62, 0xbd,
+ 0x34, 0xca, 0xe5, 0xbd, 0xfd, 0xb7, 0x81, 0xbd, 0xf9, 0xda, 0x73, 0xbd,
+ 0x7e, 0x4a, 0xc6, 0xbd, 0x6b, 0x10, 0xe1, 0x3d, 0x19, 0xdf, 0x81, 0xbc,
+ 0x0c, 0xee, 0xe5, 0xbd, 0x30, 0x90, 0x7d, 0x3e, 0xe9, 0x0c, 0xdd, 0xbd,
+ 0x7f, 0xb4, 0xa7, 0x3e, 0x93, 0xf3, 0x1e, 0xbe, 0xc1, 0x96, 0x31, 0x3e,
+ 0x46, 0xe8, 0x30, 0xbe, 0xe3, 0x0a, 0xc5, 0x3d, 0x63, 0xf0, 0x05, 0xbc,
+ 0x79, 0x36, 0xad, 0x3d, 0x48, 0x8d, 0x08, 0x3e, 0x01, 0x43, 0x94, 0x3d,
+ 0x01, 0x03, 0xbe, 0x3c, 0x4f, 0xd4, 0x04, 0xbe, 0x12, 0x25, 0xeb, 0xbd,
+ 0xa2, 0xb9, 0x62, 0xbe, 0xfb, 0xeb, 0xcb, 0xbd, 0xed, 0x92, 0x8e, 0xbd,
+ 0x63, 0x7b, 0x31, 0xbe, 0x47, 0x3f, 0x9a, 0x3d, 0xb2, 0xbb, 0x1d, 0x3e,
+ 0x85, 0x88, 0x60, 0xbd, 0xee, 0xb9, 0x20, 0xbd, 0x57, 0xbe, 0xa6, 0xbb,
+ 0xa4, 0xde, 0x47, 0xbd, 0x8c, 0x9d, 0xf5, 0x3d, 0x2f, 0xb0, 0x82, 0x3d,
+ 0xd7, 0x5c, 0x6c, 0xbd, 0xd6, 0x2a, 0x48, 0x3d, 0x15, 0x07, 0x7c, 0x3e,
+ 0x2b, 0x74, 0x24, 0xbe, 0x13, 0x67, 0x2b, 0xbd, 0x1e, 0xe1, 0xa2, 0x3d,
+ 0x13, 0x58, 0x01, 0x3b, 0x21, 0x93, 0xa8, 0x3d, 0x3b, 0x66, 0xc7, 0x3c,
+ 0xe6, 0x02, 0xcd, 0xbc, 0x41, 0xc7, 0x20, 0x3e, 0x61, 0x91, 0x2e, 0xbe,
+ 0x82, 0x4e, 0x2b, 0x3e, 0x7a, 0xc8, 0x06, 0x3e, 0x68, 0x92, 0x76, 0x3e,
+ 0xb8, 0xd7, 0xd2, 0x3d, 0xca, 0x5b, 0x0b, 0xbd, 0x5e, 0x52, 0xf4, 0xb9,
+ 0x8b, 0x1b, 0x72, 0x3d, 0xc0, 0xd9, 0x78, 0x3d, 0x77, 0xa3, 0x2b, 0x3d,
+ 0xfd, 0xd9, 0xa7, 0xbd, 0x9e, 0xd8, 0x01, 0x3d, 0x6d, 0x0a, 0x98, 0x3e,
+ 0x6f, 0x87, 0x90, 0x3d, 0x09, 0xdc, 0x6b, 0xbd, 0x84, 0xa6, 0x87, 0x3d,
+ 0xa8, 0x50, 0xee, 0x3d, 0xf8, 0xad, 0xec, 0x3c, 0x01, 0x60, 0x14, 0x3e,
+ 0x08, 0x36, 0xa3, 0x3d, 0x6d, 0xc7, 0x6c, 0x3e, 0x66, 0x40, 0xb2, 0xbd,
+ 0xb8, 0x10, 0xe4, 0xbd, 0x5a, 0x20, 0xec, 0x3d, 0x3b, 0xf3, 0x63, 0xbd,
+ 0xe0, 0x1b, 0xf1, 0xbd, 0x60, 0x61, 0x4b, 0x3e, 0x6e, 0xec, 0x9b, 0x3d,
+ 0x28, 0x6a, 0x42, 0xbc, 0xbe, 0xf5, 0xdf, 0x3d, 0x20, 0x15, 0xd1, 0x3d,
+ 0xac, 0x4d, 0xe2, 0xbc, 0xbe, 0x50, 0x21, 0x3e, 0x10, 0xe7, 0x5b, 0x3e,
+ 0x6e, 0x62, 0x4a, 0x3d, 0x49, 0x2d, 0x7c, 0xbc, 0xb3, 0xab, 0x04, 0x3e,
+ 0x67, 0xb3, 0xca, 0xbd, 0x92, 0xca, 0x58, 0xbd, 0x71, 0x92, 0x20, 0xbe,
+ 0x45, 0xac, 0x96, 0x3d, 0x54, 0xd2, 0xe1, 0x3d, 0x0d, 0xdc, 0xa7, 0xbd,
+ 0x83, 0x2a, 0x5d, 0xbc, 0x60, 0x8f, 0xa3, 0xbd, 0x6f, 0x71, 0xaa, 0xbe,
+ 0x84, 0xc3, 0xb1, 0x3c, 0x6f, 0xa8, 0xa4, 0xbc, 0x73, 0x59, 0x2e, 0xbe,
+ 0xb6, 0x32, 0x17, 0x3e, 0x43, 0xca, 0x23, 0x3d, 0xbf, 0xa4, 0xdd, 0x3d,
+ 0x11, 0xd5, 0xfa, 0x3b, 0xee, 0x09, 0x5b, 0x3e, 0x84, 0x5a, 0xac, 0xbd,
+ 0x0a, 0x69, 0x1d, 0x3d, 0xf0, 0x3c, 0xf3, 0x3d, 0x84, 0xa2, 0x66, 0x3e,
+ 0xb7, 0xd3, 0x0d, 0xbe, 0x5d, 0x10, 0x88, 0x3c, 0x34, 0x7d, 0x74, 0x3e,
+ 0x08, 0x69, 0x27, 0x3e, 0x10, 0x87, 0x31, 0xbd, 0x3d, 0xea, 0xb9, 0x3d,
+ 0xe7, 0x2a, 0x98, 0xbd, 0xb3, 0xd0, 0x63, 0x3d, 0x87, 0xbe, 0x35, 0xbd,
+ 0x8c, 0xd3, 0xc2, 0x3b, 0xef, 0x24, 0x13, 0xbc, 0x65, 0xaa, 0x45, 0x3d,
+ 0xf2, 0x49, 0x1d, 0xbd, 0xcd, 0xa4, 0x5f, 0x3c, 0x93, 0xac, 0x17, 0xbe,
+ 0xf9, 0x71, 0xb7, 0x3b, 0x3c, 0xa0, 0xee, 0xbb, 0x57, 0x57, 0xd4, 0x3c,
+ 0x1a, 0x50, 0xc0, 0xbc, 0x9a, 0x02, 0x21, 0x3b, 0xb4, 0xff, 0x2e, 0xbd,
+ 0xba, 0x80, 0x3f, 0x3e, 0xb0, 0xdb, 0x36, 0x3e, 0xac, 0x84, 0xe3, 0x3d,
+ 0xa0, 0x9f, 0x16, 0x3e, 0x5a, 0xb6, 0xfd, 0xbd, 0x27, 0x76, 0x8a, 0x3b,
+ 0x91, 0x74, 0xfb, 0xbd, 0x60, 0x07, 0xc4, 0xbd, 0x36, 0xbc, 0x4b, 0xbd,
+ 0x7d, 0x74, 0xb6, 0xbc, 0xc8, 0x5d, 0x10, 0xbd, 0x89, 0x90, 0x55, 0x3e,
+ 0xe4, 0xf2, 0x73, 0x3e, 0x1c, 0x98, 0x22, 0xbe, 0xde, 0x63, 0x16, 0xbc,
+ 0x81, 0x49, 0x01, 0xbd, 0x49, 0x62, 0xb6, 0x3c, 0x27, 0x31, 0x64, 0xbd,
+ 0xa1, 0xce, 0xff, 0x3d, 0x09, 0xe8, 0x3e, 0x3c, 0xfb, 0x9c, 0x31, 0xbd,
+ 0x18, 0xbe, 0x93, 0x3d, 0xc2, 0xc3, 0xaf, 0x3d, 0x17, 0x43, 0x29, 0x3d,
+ 0xed, 0x87, 0x19, 0xbd, 0xfa, 0x18, 0x18, 0x3d, 0xe2, 0xb9, 0x17, 0x3b,
+ 0x06, 0x19, 0x1f, 0x3e, 0xef, 0x60, 0x9a, 0x3c, 0x16, 0xe8, 0xc6, 0xbc,
+ 0x4b, 0xac, 0x14, 0x3d, 0x15, 0x6a, 0xa3, 0x3b, 0xda, 0xc2, 0xa5, 0xbd,
+ 0x6b, 0xbe, 0x5a, 0xbc, 0x44, 0x4b, 0x31, 0x3d, 0x77, 0xfe, 0x55, 0x3d,
+ 0xdc, 0x5b, 0xbb, 0xbe, 0x79, 0x19, 0x82, 0xbd, 0x7e, 0x2a, 0xd4, 0x3d,
+ 0x93, 0xff, 0xa2, 0xbd, 0xe5, 0x3b, 0xfb, 0x3d, 0xbf, 0x7b, 0x8d, 0x3d,
+ 0x08, 0xfe, 0x23, 0xbd, 0x89, 0x0b, 0x93, 0x3d, 0x7d, 0x27, 0xbc, 0x3d,
+ 0x06, 0x71, 0x94, 0x3d, 0x5c, 0xfe, 0x1f, 0x3d, 0xf1, 0xaf, 0x22, 0xbe,
+ 0x42, 0x3c, 0x72, 0xbd, 0x79, 0x37, 0x06, 0x3e, 0xe1, 0xef, 0x92, 0x3c,
+ 0x63, 0x9d, 0xc0, 0x3d, 0xe0, 0xf4, 0xfa, 0xbd, 0x04, 0x05, 0x00, 0xbe,
+ 0x59, 0xf8, 0x8b, 0xbe, 0xa5, 0x3b, 0x05, 0x3d, 0xb9, 0xce, 0xe0, 0xbd,
+ 0x08, 0x83, 0x51, 0xbe, 0x7d, 0xa1, 0xdf, 0x3d, 0xbf, 0x8e, 0xc6, 0x3d,
+ 0x7d, 0xf8, 0xf2, 0x3d, 0xd5, 0x78, 0x7c, 0x3d, 0x8e, 0x8f, 0x39, 0x3d,
+ 0xff, 0xfd, 0x93, 0xbc, 0xeb, 0xfd, 0xd3, 0x3d, 0xb6, 0xe8, 0x34, 0xbe,
+ 0x44, 0x6a, 0xbb, 0xbd, 0xb1, 0x9e, 0x19, 0xbe, 0x20, 0x60, 0x4a, 0x3b,
+ 0x25, 0x6a, 0x7f, 0xbc, 0x82, 0x63, 0x38, 0xbe, 0x78, 0x31, 0x46, 0xbc,
+ 0xf4, 0xcc, 0x97, 0x3d, 0x14, 0x8a, 0x8c, 0x3a, 0xcd, 0x24, 0x01, 0x3e,
+ 0xbf, 0x0b, 0xca, 0xbd, 0x69, 0xd6, 0xf5, 0x3d, 0x31, 0xe3, 0x19, 0x3e,
+ 0x43, 0xd0, 0x3b, 0xbd, 0xa9, 0x87, 0x0c, 0x3d, 0xaa, 0x1c, 0xe3, 0xbd,
+ 0x01, 0x4d, 0xdf, 0xbc, 0x32, 0x71, 0xe1, 0xbd, 0xb7, 0xae, 0x17, 0xbd,
+ 0x55, 0x2f, 0x77, 0x3d, 0x28, 0xb6, 0xed, 0xbd, 0x13, 0xad, 0xfe, 0xbd,
+ 0xa9, 0x47, 0x30, 0xbb, 0xa7, 0xaa, 0x42, 0x3e, 0x51, 0x1e, 0x41, 0x3d,
+ 0x76, 0x64, 0xd6, 0x3d, 0x2b, 0xbe, 0x10, 0x3e, 0x85, 0xe4, 0xc9, 0xbc,
+ 0xd4, 0xfd, 0x3c, 0xbe, 0x52, 0x57, 0x2c, 0xbe, 0xc3, 0x34, 0xa4, 0xbb,
+ 0x16, 0xea, 0xc5, 0x3d, 0xcf, 0x79, 0xa1, 0x3d, 0x4d, 0xac, 0xc3, 0xbd,
+ 0xb1, 0x27, 0x21, 0xbc, 0x0d, 0x48, 0x90, 0xbd, 0x18, 0x22, 0x43, 0xbd,
+ 0xa8, 0x8c, 0x8f, 0xbd, 0xcd, 0xda, 0x42, 0x3d, 0x22, 0x41, 0xf1, 0x3d,
+ 0x1e, 0x8f, 0xc6, 0x3d, 0x10, 0x32, 0x8c, 0xbc, 0x95, 0x7c, 0x65, 0x3d,
+ 0xa5, 0xc5, 0x3e, 0xbd, 0x6f, 0x98, 0x16, 0x3e, 0xd4, 0xcb, 0x10, 0xbd,
+ 0x03, 0x12, 0xa9, 0x3d, 0x9c, 0xc2, 0x18, 0x3d, 0x4f, 0x00, 0x2b, 0xbe,
+ 0xb9, 0xdb, 0x74, 0xba, 0x18, 0x6d, 0x8f, 0x3d, 0xdd, 0x8f, 0x78, 0xbe,
+ 0xb0, 0x58, 0x57, 0xbd, 0xf0, 0xb6, 0xee, 0xbd, 0x35, 0x85, 0x8a, 0x3d,
+ 0xdb, 0x82, 0x69, 0xbe, 0x0d, 0xc8, 0x07, 0xbd, 0x60, 0xf9, 0x0d, 0xbe,
+ 0xbb, 0x5d, 0xc8, 0xbd, 0x79, 0x0d, 0x7a, 0xbc, 0x3c, 0xd2, 0x2a, 0x3e,
+ 0x21, 0x25, 0xa5, 0xbd, 0x86, 0xb6, 0x0a, 0x3e, 0xe8, 0xbc, 0x19, 0x3e,
+ 0x17, 0x48, 0x8c, 0x3e, 0xfd, 0x81, 0xbb, 0x3d, 0x80, 0x28, 0x50, 0xbc,
+ 0xb1, 0xf4, 0x75, 0xbd, 0xae, 0x4e, 0xc4, 0x3d, 0xa3, 0xcb, 0x74, 0x3d,
+ 0x0c, 0xbe, 0x7c, 0xbd, 0x61, 0x2c, 0x9b, 0xbd, 0xd5, 0xaf, 0xaf, 0x3d,
+ 0xb0, 0x2b, 0x47, 0xbe, 0x84, 0xe9, 0x21, 0xbe, 0xf6, 0x3e, 0xaf, 0xbd,
+ 0xe0, 0xc3, 0xc0, 0xbd, 0xdd, 0xb6, 0x32, 0x3e, 0x00, 0x01, 0xc5, 0xbd,
+ 0x4d, 0xeb, 0x41, 0x3d, 0x62, 0x16, 0x16, 0xbe, 0x0f, 0xb8, 0x08, 0x3e,
+ 0xf2, 0x44, 0xdc, 0xbc, 0x42, 0x46, 0xb2, 0x3d, 0x2f, 0x92, 0x54, 0xbc,
+ 0x5a, 0xe9, 0x4e, 0x3d, 0x92, 0x08, 0x8f, 0xbb, 0x89, 0xac, 0xdf, 0x3c,
+ 0x37, 0xbd, 0xee, 0xbd, 0xce, 0x6d, 0x64, 0xbd, 0x8f, 0xbd, 0xde, 0x3d,
+ 0xc9, 0xb1, 0x11, 0x3c, 0xef, 0xa7, 0xf5, 0xbd, 0x23, 0x26, 0x2f, 0xbe,
+ 0x44, 0x6d, 0x4d, 0xbc, 0xaf, 0x40, 0x2e, 0x3e, 0xe6, 0x4c, 0x09, 0xbe,
+ 0x4c, 0x56, 0x17, 0xbc, 0xbd, 0xf5, 0xd3, 0x3d, 0x8d, 0x58, 0x83, 0xbd,
+ 0x47, 0x56, 0xaf, 0x3d, 0x84, 0x6a, 0x05, 0xbe, 0x22, 0x77, 0x1c, 0x3e,
+ 0xf3, 0x13, 0x0e, 0x3d, 0x3e, 0xd8, 0x5c, 0xbd, 0xf3, 0x73, 0xe9, 0x3d,
+ 0xd7, 0xe7, 0x00, 0x3e, 0xcc, 0x2b, 0xce, 0x3d, 0x41, 0x54, 0x5c, 0xbe,
+ 0xbb, 0x1b, 0xf1, 0x3c, 0xce, 0xd1, 0xee, 0x3b, 0xc5, 0xe0, 0xab, 0x3b,
+ 0x6d, 0x10, 0x59, 0x3e, 0x9c, 0x4a, 0x18, 0xbe, 0x9b, 0xda, 0xae, 0x3c,
+ 0x87, 0x10, 0xab, 0x3d, 0xec, 0x02, 0xfa, 0x3d, 0xbd, 0xdc, 0x41, 0xbd,
+ 0xb2, 0xd1, 0x3c, 0xbd, 0x00, 0xd3, 0xc4, 0x3c, 0xcc, 0x74, 0xc8, 0x3d,
+ 0x13, 0xdb, 0x41, 0x3e, 0x8b, 0x71, 0xa1, 0x3d, 0xd9, 0xba, 0xeb, 0xbd,
+ 0x82, 0x71, 0xa4, 0x3d, 0xaa, 0x6b, 0xe8, 0x3d, 0x26, 0x2e, 0xb2, 0x3d,
+ 0x73, 0x9b, 0xbd, 0xbd, 0xb0, 0x13, 0x34, 0x3e, 0x8a, 0x23, 0x37, 0x3d,
+ 0x40, 0x16, 0x14, 0x3e, 0xf8, 0xd2, 0xd8, 0xbd, 0x5f, 0x7b, 0x02, 0x3e,
+ 0x1f, 0xa6, 0xd5, 0xbd, 0xc0, 0x95, 0xe8, 0xbd, 0x22, 0xcb, 0xe0, 0x3d,
+ 0x2c, 0x7c, 0xbf, 0x3d, 0x42, 0x5c, 0x99, 0x3d, 0xb9, 0x27, 0x30, 0xbd,
+ 0x17, 0x19, 0xc8, 0xbd, 0x58, 0x64, 0xf6, 0x3d, 0x48, 0xcb, 0x97, 0xbd,
+ 0xff, 0xc5, 0xaa, 0x3d, 0xcb, 0xe6, 0x56, 0xbd, 0x3f, 0xf2, 0x11, 0x3d,
+ 0x27, 0x87, 0xfe, 0xbc, 0x5e, 0x75, 0xa9, 0x3e, 0x42, 0xf5, 0x8a, 0x3e,
+ 0x3f, 0x93, 0x85, 0xbd, 0x5f, 0xfe, 0x94, 0x3d, 0x57, 0x30, 0x4c, 0x3d,
+ 0xba, 0x8c, 0x4d, 0xbd, 0x14, 0x8d, 0xde, 0x3c, 0x97, 0x55, 0xf6, 0x3d,
+ 0x8d, 0xff, 0x75, 0xbd, 0xd2, 0xae, 0x43, 0xbe, 0x8f, 0x4b, 0x9c, 0x3e,
+ 0x32, 0x7c, 0x23, 0x3c, 0x90, 0x7f, 0x68, 0xbd, 0xd9, 0xbe, 0xa4, 0x3c,
+ 0xe3, 0x4c, 0x21, 0x3d, 0xd4, 0x9a, 0x6d, 0xbd, 0x2a, 0x37, 0xb1, 0x3d,
+ 0x43, 0x7f, 0x1a, 0x3e, 0xa3, 0x60, 0x85, 0xbe, 0x9b, 0xf6, 0x88, 0xbd,
+ 0x30, 0xb5, 0xba, 0x3b, 0xa9, 0xd8, 0x19, 0xbe, 0x87, 0xb1, 0x30, 0xbe,
+ 0xf0, 0x7d, 0xbb, 0x3c, 0x23, 0xcb, 0x29, 0x3e, 0x55, 0x8a, 0xca, 0x3b,
+ 0x13, 0x2f, 0x84, 0xbd, 0xe4, 0xc3, 0x50, 0xbd, 0x58, 0xf4, 0xe2, 0x3c,
+ 0x15, 0x3f, 0x0f, 0xbe, 0xee, 0xc1, 0x1b, 0xbe, 0xf1, 0x36, 0xa0, 0xbc,
+ 0xa8, 0xe8, 0xb8, 0x3b, 0x1f, 0xa2, 0x61, 0xbe, 0x1e, 0xec, 0x81, 0x3c,
+ 0x42, 0x65, 0xd8, 0x3d, 0xee, 0x22, 0x24, 0xbc, 0x2f, 0xc1, 0x0b, 0x3e,
+ 0x31, 0xb5, 0x92, 0xbc, 0x59, 0xec, 0x37, 0xbd, 0x09, 0x81, 0xb9, 0xbd,
+ 0xeb, 0xd5, 0xf8, 0x3d, 0x4e, 0x79, 0xd4, 0xbd, 0xd5, 0xd9, 0x0f, 0xbe,
+ 0x9c, 0x7f, 0x82, 0xbd, 0xe1, 0x2b, 0x2a, 0xbe, 0xda, 0x9c, 0x36, 0xbe,
+ 0x1d, 0x66, 0x3b, 0xbe, 0xee, 0xa1, 0x27, 0xbe, 0x13, 0xc8, 0xfd, 0xbc,
+ 0x00, 0x5d, 0x10, 0x3e, 0xea, 0xd5, 0x1f, 0xbe, 0xac, 0x05, 0x86, 0xbc,
+ 0xc8, 0x25, 0x10, 0xbe, 0x41, 0x93, 0x52, 0xbe, 0xb6, 0x5b, 0x54, 0x3e,
+ 0xd4, 0x64, 0x01, 0xbe, 0xb1, 0xd8, 0x08, 0xbe, 0xa6, 0x45, 0xbf, 0x3d,
+ 0x18, 0xa8, 0xdf, 0xbd, 0xcb, 0xe8, 0x74, 0xbd, 0x22, 0xe1, 0x61, 0xbe,
+ 0x42, 0x4f, 0x29, 0xbe, 0x7b, 0x8d, 0x12, 0xbd, 0xd9, 0x71, 0x0f, 0xbe,
+ 0xe7, 0x7a, 0xf6, 0xbc, 0x19, 0x88, 0x06, 0x3e, 0x81, 0xf0, 0x10, 0xbd,
+ 0x3c, 0xf4, 0x0d, 0xbe, 0xb9, 0x3a, 0x3a, 0xbe, 0x14, 0x10, 0x19, 0xbc,
+ 0x0a, 0x0a, 0xa3, 0x3c, 0xb5, 0x0a, 0x28, 0xbe, 0x52, 0xb8, 0x14, 0x3d,
+ 0x63, 0xbe, 0xa7, 0x3d, 0x2f, 0xbe, 0x96, 0x3d, 0x4e, 0x6b, 0x0d, 0xbe,
+ 0xed, 0xd0, 0x94, 0xbd, 0xe4, 0xca, 0x14, 0xbe, 0x56, 0x9b, 0x70, 0xbe,
+ 0x54, 0x85, 0x14, 0xbe, 0xce, 0x58, 0x2e, 0x3e, 0x66, 0x86, 0x5c, 0xbc,
+ 0x56, 0x09, 0xba, 0xbd, 0xa4, 0xfc, 0x32, 0xbe, 0x80, 0x8b, 0xdf, 0xbd,
+ 0x1b, 0x21, 0x66, 0xbc, 0x5e, 0x51, 0xc0, 0xbd, 0x81, 0x04, 0x4f, 0xbe,
+ 0x7d, 0x84, 0x09, 0x3e, 0x48, 0x63, 0x80, 0x3d, 0xfe, 0x21, 0x22, 0xbe,
+ 0xca, 0xa1, 0x9b, 0x3d, 0x6b, 0x93, 0xda, 0xbc, 0x05, 0xf2, 0xc3, 0x3d,
+ 0x80, 0xc3, 0x56, 0xbe, 0x49, 0x6b, 0x34, 0xbd, 0x0d, 0x82, 0xcc, 0xbb,
+ 0x13, 0x68, 0x6e, 0x3c, 0xfe, 0xbc, 0x8f, 0x3d, 0x89, 0xf2, 0x05, 0x3e,
+ 0x6a, 0xf4, 0x2a, 0x3e, 0xb2, 0xcf, 0xc3, 0xbd, 0x07, 0x63, 0x86, 0xbd,
+ 0x00, 0xdd, 0xe0, 0x3d, 0x18, 0xf6, 0xcc, 0x3d, 0xe8, 0xb5, 0x91, 0x3c,
+ 0x31, 0x82, 0x10, 0xbd, 0xe0, 0x35, 0x49, 0xbe, 0xe9, 0x11, 0x8d, 0x3d,
+ 0xa1, 0x6a, 0xc8, 0xbd, 0x9e, 0x96, 0xc9, 0x3d, 0x43, 0x79, 0x1c, 0xbd,
+ 0x5a, 0x08, 0x1d, 0xbe, 0x02, 0xbf, 0xde, 0xbd, 0x79, 0x11, 0x16, 0xbe,
+ 0x01, 0x6d, 0x49, 0xbe, 0x80, 0x88, 0x0f, 0xbe, 0x30, 0x30, 0x26, 0xbe,
+ 0xb5, 0xb9, 0x9f, 0x3d, 0x5b, 0xfa, 0x95, 0x3d, 0xd0, 0xc0, 0xdb, 0x3d,
+ 0x79, 0x82, 0xf7, 0x3d, 0x09, 0x79, 0xbf, 0xbd, 0x75, 0x1e, 0x20, 0xbe,
+ 0x68, 0xab, 0xfe, 0x3d, 0x8f, 0x70, 0x09, 0x3e, 0x13, 0xfb, 0xeb, 0x3c,
+ 0x54, 0x8c, 0xd0, 0x3d, 0xb7, 0x26, 0x1e, 0x3e, 0xe2, 0x30, 0x0b, 0xbe,
+ 0x56, 0xac, 0xef, 0x3c, 0x60, 0x92, 0x04, 0x3d, 0xa7, 0xb0, 0x00, 0x3e,
+ 0xef, 0x1d, 0xa1, 0xbd, 0x7d, 0xa7, 0x84, 0xbe, 0x1c, 0xbe, 0xfe, 0x3b,
+ 0xab, 0x9d, 0x2f, 0xbd, 0x3a, 0x70, 0xfd, 0xbd, 0x44, 0x0f, 0x2d, 0xbe,
+ 0x68, 0x74, 0x2b, 0xbe, 0xde, 0xdc, 0xf3, 0x3d, 0x2f, 0xb2, 0xe7, 0xbd,
+ 0x8b, 0x18, 0x4a, 0x3c, 0x01, 0x3a, 0x8a, 0x3d, 0x55, 0x0b, 0x54, 0x3d,
+ 0xc9, 0x5e, 0x2e, 0xbe, 0x33, 0xb6, 0x6c, 0xbd, 0xac, 0x92, 0x4e, 0xbe,
+ 0xdb, 0x59, 0x8d, 0x3d, 0xe0, 0x93, 0x84, 0x3d, 0xa5, 0x34, 0xc4, 0x3d,
+ 0x26, 0x2b, 0x4e, 0xbc, 0xa5, 0x6b, 0x04, 0xbe, 0x57, 0xb7, 0xa9, 0xbd,
+ 0x9a, 0x55, 0x90, 0xbc, 0x2e, 0xd5, 0x30, 0x3e, 0xe2, 0xf6, 0x8b, 0x3e,
+ 0x45, 0x03, 0x8c, 0x3d, 0x2c, 0x0a, 0x6c, 0x3d, 0x47, 0xf3, 0x39, 0xbe,
+ 0xb5, 0xbc, 0x2e, 0x3e, 0x95, 0x18, 0xa1, 0x3b, 0x61, 0xb3, 0x82, 0x3e,
+ 0xdd, 0x02, 0x7d, 0xbd, 0x33, 0x4b, 0x27, 0x3e, 0xd8, 0xf8, 0x36, 0x3d,
+ 0xae, 0x65, 0xdd, 0x3c, 0x48, 0x11, 0x38, 0x3e, 0x65, 0x05, 0x09, 0xbe,
+ 0x4b, 0x12, 0x1a, 0x3d, 0xec, 0x71, 0x99, 0x3d, 0x58, 0x8d, 0x99, 0xbe,
+ 0x57, 0xb1, 0x2b, 0xbe, 0x25, 0xb4, 0x24, 0xbe, 0x83, 0xd1, 0xfe, 0x3d,
+ 0x5c, 0x46, 0x39, 0x3d, 0x8c, 0x39, 0x32, 0xbe, 0xfb, 0xb7, 0x43, 0x3c,
+ 0xf0, 0x47, 0x7b, 0x3e, 0x43, 0xbd, 0x15, 0xbe, 0x0f, 0x3d, 0x3a, 0xbd,
+ 0xfa, 0xdb, 0x05, 0xbe, 0x27, 0x37, 0xf0, 0xbd, 0x14, 0xea, 0xda, 0xbc,
+ 0x8a, 0xfd, 0x06, 0xbe, 0xae, 0xdc, 0x33, 0x3e, 0xd1, 0x6e, 0x25, 0x3e,
+ 0x07, 0xff, 0x08, 0xbf, 0xa8, 0x9a, 0x21, 0x3e, 0x78, 0x8a, 0x7b, 0xbd,
+ 0x00, 0x61, 0x38, 0x3e, 0x35, 0xc1, 0x4b, 0xbe, 0x73, 0xe9, 0x6a, 0xbe,
+ 0x5a, 0x43, 0x0f, 0x3e, 0x48, 0xea, 0x1e, 0x3e, 0x3d, 0x75, 0xca, 0xbd,
+ 0x2a, 0xf5, 0xcf, 0xbd, 0x43, 0x2c, 0x9d, 0xbd, 0xa7, 0xfe, 0x19, 0xbe,
+ 0x5c, 0x71, 0x57, 0xbd, 0x2b, 0xfc, 0x3f, 0xbd, 0xb3, 0x54, 0xae, 0xbd,
+ 0x4f, 0x0b, 0x11, 0x3e, 0x14, 0xd9, 0x04, 0x3e, 0xb9, 0x4d, 0x2e, 0xbd,
+ 0x7f, 0x91, 0xdb, 0xbd, 0xca, 0x74, 0xae, 0x3d, 0x0e, 0xb6, 0xfa, 0x3d,
+ 0xf7, 0x0a, 0xce, 0xbc, 0x2c, 0xc5, 0xbb, 0xbc, 0x40, 0xda, 0x3a, 0xbe,
+ 0x49, 0xad, 0x4f, 0xbc, 0x8a, 0x0f, 0x2d, 0xbd, 0xbf, 0xa6, 0x60, 0xbe,
+ 0x15, 0x6e, 0x0b, 0x3d, 0x0f, 0xa5, 0xac, 0xbd, 0xae, 0xd4, 0x58, 0xbe,
+ 0x54, 0xe4, 0xac, 0x3d, 0x8d, 0x4a, 0xb4, 0xbc, 0x50, 0x09, 0x48, 0x3d,
+ 0x78, 0x27, 0x11, 0x3e, 0xdc, 0xcd, 0x63, 0xbc, 0xe4, 0x40, 0xd3, 0x3d,
+ 0xec, 0xc7, 0xdd, 0xbd, 0xe4, 0xf4, 0x17, 0xbd, 0x66, 0x5b, 0xb7, 0x3d,
+ 0xe9, 0xb8, 0x22, 0xbb, 0x94, 0xd7, 0x12, 0x3e, 0xb1, 0xee, 0xc0, 0x3c,
+ 0x60, 0x89, 0x0b, 0xbe, 0x6e, 0x1f, 0x2c, 0xbe, 0x7b, 0x04, 0x8b, 0x3d,
+ 0xb4, 0xfa, 0x80, 0xbd, 0x8f, 0xbc, 0xaf, 0x3d, 0x7e, 0xd5, 0x8f, 0xbd,
+ 0x63, 0xea, 0x09, 0x3e, 0xfd, 0x62, 0x0c, 0xbe, 0x15, 0x78, 0x9c, 0x3d,
+ 0x59, 0x23, 0x35, 0x3d, 0x80, 0xdf, 0x1c, 0x3e, 0x75, 0x3f, 0x5b, 0x3e,
+ 0x28, 0x14, 0x60, 0xbe, 0x05, 0xcc, 0xf3, 0x3d, 0x0c, 0x20, 0x8c, 0x3e,
+ 0xe4, 0x84, 0xce, 0x3d, 0xd0, 0xbc, 0xee, 0xbc, 0x7d, 0xf1, 0x95, 0x3d,
+ 0xdc, 0x32, 0x0d, 0x3e, 0x3c, 0x41, 0x92, 0xbc, 0xcc, 0x3d, 0x89, 0x3d,
+ 0xd2, 0xcf, 0xeb, 0xbd, 0x0e, 0x8c, 0x80, 0xbd, 0x9c, 0x58, 0xad, 0xb9,
+ 0x07, 0x1f, 0x23, 0x3e, 0x7c, 0xc5, 0x94, 0xbc, 0xe6, 0xf9, 0xbf, 0x3d,
+ 0x42, 0x41, 0x03, 0xbe, 0x5e, 0xd5, 0x7e, 0xbd, 0xf1, 0xb6, 0xc4, 0x3d,
+ 0x61, 0xfd, 0x9f, 0xbd, 0xa8, 0x2f, 0x18, 0xbd, 0x6a, 0x99, 0x76, 0x3e,
+ 0x86, 0xf7, 0x3b, 0xbe, 0x3b, 0xa2, 0x2d, 0x3b, 0xec, 0xe0, 0x8c, 0xbd,
+ 0x33, 0x4b, 0x1a, 0xbe, 0xaf, 0xe0, 0x4f, 0x3b, 0x03, 0x5e, 0x07, 0xbe,
+ 0x03, 0x1c, 0xb7, 0x3d, 0xdc, 0x50, 0x5a, 0x3d, 0x33, 0x08, 0x17, 0x3e,
+ 0xb6, 0xdf, 0x83, 0x3d, 0xd2, 0x29, 0x89, 0xba, 0xef, 0x22, 0xa5, 0xbc,
+ 0xb9, 0x6d, 0x07, 0xbe, 0x6a, 0xf6, 0xc8, 0xbd, 0x77, 0xc1, 0xae, 0x3d,
+ 0x21, 0xfd, 0xd8, 0xbd, 0x6e, 0x3b, 0x29, 0xbd, 0xbb, 0xc8, 0x42, 0xbd,
+ 0x6e, 0x0c, 0x19, 0xbe, 0x68, 0xf3, 0x3b, 0x3d, 0x2f, 0x0e, 0xa5, 0xbd,
+ 0x85, 0xc4, 0x50, 0x3e, 0x30, 0x89, 0x89, 0xbc, 0xb4, 0x4f, 0x97, 0xbc,
+ 0x91, 0x26, 0xcb, 0xbd, 0xc1, 0x42, 0xc2, 0x3d, 0x8f, 0xca, 0x35, 0xbc,
+ 0x1d, 0x08, 0x66, 0x3e, 0xca, 0x2a, 0xf6, 0xbc, 0xfb, 0x2c, 0xb9, 0xbd,
+ 0x3e, 0xde, 0x92, 0x3e, 0xe8, 0x02, 0xe3, 0x3d, 0x82, 0xb0, 0x15, 0x3d,
+ 0x81, 0xc9, 0x70, 0x3d, 0x77, 0x3b, 0xee, 0xbc, 0xe5, 0xab, 0xde, 0x3d,
+ 0x1f, 0x6c, 0x9f, 0x3d, 0x32, 0x3b, 0xb1, 0xbd, 0x14, 0x8e, 0xcc, 0x3d,
+ 0x48, 0xf3, 0x05, 0xbe, 0x54, 0x59, 0xea, 0xbc, 0x74, 0x1f, 0xcb, 0xbd,
+ 0xca, 0xe0, 0x87, 0xbc, 0xfd, 0xd2, 0xb0, 0x3d, 0x50, 0xaa, 0xa8, 0x3c,
+ 0x80, 0xe7, 0x92, 0xbe, 0x57, 0xf9, 0xaa, 0x3d, 0x82, 0x55, 0x01, 0x3e,
+ 0x0d, 0x35, 0x9b, 0xbc, 0xb7, 0xa1, 0x9b, 0x3d, 0xd9, 0x68, 0x2e, 0xbe,
+ 0x7a, 0x41, 0x0e, 0x3d, 0xb7, 0x5d, 0xd5, 0x3d, 0x3f, 0x74, 0x8d, 0xbd,
+ 0xf7, 0x95, 0x87, 0xbe, 0x78, 0x1b, 0xa3, 0x3c, 0xd0, 0x38, 0x93, 0x3d,
+ 0xfc, 0xed, 0x1e, 0xbd, 0xbb, 0xdb, 0x27, 0xbd, 0x94, 0xf2, 0x0d, 0x3e,
+ 0x4b, 0xa3, 0x24, 0x3e, 0x76, 0x2c, 0x0f, 0xbe, 0x8c, 0x1f, 0x13, 0xbe,
+ 0xaf, 0x42, 0x90, 0xbd, 0xc9, 0x31, 0x50, 0x3d, 0xe2, 0xc6, 0x5a, 0x3e,
+ 0xc5, 0x96, 0x2f, 0xbd, 0xef, 0x5b, 0xf2, 0x3c, 0x54, 0xa7, 0x2c, 0xbe,
+ 0x21, 0xb3, 0x2c, 0x3e, 0x7a, 0xff, 0x2f, 0xbe, 0x09, 0x37, 0x44, 0xbe,
+ 0x97, 0x4a, 0xee, 0x3c, 0xd3, 0x9a, 0xf7, 0xbd, 0x84, 0x2f, 0x0b, 0xbc,
+ 0x98, 0xb7, 0x4e, 0x3e, 0xed, 0xd5, 0x59, 0xbd, 0x0f, 0xe1, 0x92, 0xbd,
+ 0xb1, 0x42, 0x07, 0xbd, 0xb6, 0xde, 0x46, 0xbe, 0xdb, 0x98, 0x41, 0x3c,
+ 0x4b, 0x74, 0xf1, 0x3d, 0xcb, 0xf5, 0xf9, 0x3d, 0x72, 0x41, 0x1a, 0x3e,
+ 0x51, 0x44, 0x35, 0xbe, 0xa8, 0x83, 0x72, 0x3d, 0x21, 0x9b, 0x1a, 0x3e,
+ 0x68, 0x8e, 0xa6, 0xbe, 0x36, 0x26, 0x7c, 0x3d, 0x17, 0xf3, 0x3c, 0xbe,
+ 0x9e, 0x60, 0x54, 0xbd, 0x98, 0x3e, 0x44, 0x3e, 0x66, 0x0d, 0x65, 0x3d,
+ 0xb2, 0xad, 0xaa, 0x3d, 0xad, 0xc3, 0x03, 0x3e, 0xd3, 0x46, 0xb8, 0x3d,
+ 0xcf, 0x25, 0x89, 0xbd, 0x23, 0x40, 0xe0, 0xbd, 0xee, 0x2b, 0x81, 0x3d,
+ 0x38, 0xaf, 0x5c, 0xbe, 0x41, 0x29, 0x3c, 0x3e, 0xeb, 0x60, 0x15, 0xbc,
+ 0xa6, 0x1a, 0x0e, 0x3e, 0x56, 0xf0, 0x97, 0x3d, 0xf5, 0x5e, 0x34, 0x3e,
+ 0x6c, 0x95, 0xfb, 0xbd, 0xd7, 0xac, 0x84, 0x3d, 0x86, 0x1a, 0x72, 0xbd,
+ 0xbf, 0x89, 0x21, 0xbe, 0x39, 0x1f, 0xb5, 0xbd, 0xae, 0xaa, 0x2a, 0x3e,
+ 0x0b, 0x49, 0xbd, 0x3c, 0x90, 0xb8, 0x1d, 0x3c, 0x86, 0x14, 0x14, 0xbe,
+ 0x58, 0x8e, 0xb4, 0xbe, 0xe4, 0x8d, 0x47, 0xbd, 0x0b, 0xa2, 0xe3, 0x3c,
+ 0xbc, 0xc9, 0x9f, 0xbd, 0x9c, 0x24, 0xaf, 0xbd, 0x28, 0xf5, 0x96, 0x3d,
+ 0x65, 0xee, 0x81, 0xbd, 0x8e, 0xe5, 0x6e, 0x3d, 0xda, 0xe7, 0x92, 0x3d,
+ 0x1e, 0x84, 0x9e, 0x3d, 0xaa, 0x40, 0x42, 0xbd, 0x3c, 0xb1, 0x95, 0xbe,
+ 0xaf, 0x8c, 0x3d, 0x3d, 0x0d, 0x0a, 0x13, 0x3e, 0xf5, 0x38, 0xf1, 0xbd,
+ 0xb9, 0xd6, 0xa7, 0xbe, 0xb3, 0xd4, 0xd2, 0xbd, 0x62, 0x1d, 0x0c, 0xbe,
+ 0xbf, 0xde, 0x11, 0xbe, 0xea, 0x8a, 0x84, 0x3d, 0x71, 0x7b, 0x11, 0x3d,
+ 0x7b, 0x2e, 0x7e, 0x3e, 0x64, 0x22, 0x65, 0xbe, 0x4e, 0x98, 0x53, 0xbe,
+ 0x0e, 0x81, 0x39, 0x3e, 0x50, 0xa1, 0xee, 0xbd, 0xb7, 0xe4, 0x28, 0xbe,
+ 0x6f, 0x2c, 0x66, 0xbe, 0xd5, 0xb2, 0x2e, 0xbd, 0x09, 0x84, 0x77, 0x3e,
+ 0xa3, 0x20, 0x37, 0xbd, 0xed, 0x15, 0x96, 0xbd, 0xec, 0x4e, 0x46, 0x3b,
+ 0xb1, 0xfc, 0xb7, 0x3c, 0x5b, 0xe8, 0xe8, 0x3d, 0xe6, 0x9c, 0xcc, 0xbd,
+ 0x54, 0x51, 0x0a, 0x3e, 0xd6, 0x91, 0xb7, 0x3d, 0x90, 0x33, 0xfa, 0xbd,
+ 0xd1, 0x3e, 0x3e, 0xbd, 0xa3, 0x2f, 0x66, 0xbd, 0x05, 0x6a, 0xd3, 0x3d,
+ 0xb6, 0x0a, 0x12, 0xbc, 0x4e, 0x9e, 0xcb, 0x3d, 0xd1, 0x64, 0x9c, 0xbd,
+ 0x76, 0xe7, 0xcb, 0x3d, 0xe3, 0x29, 0x13, 0x3e, 0x7c, 0x1c, 0x9f, 0xbc,
+ 0x72, 0x45, 0x57, 0x3d, 0x22, 0x5e, 0xd3, 0x3c, 0x29, 0x41, 0xa9, 0x3d,
+ 0x53, 0x15, 0x10, 0xbe, 0xa0, 0xdc, 0xb6, 0xbc, 0x75, 0x94, 0x2a, 0x3e,
+ 0xd3, 0xa1, 0xa0, 0xbe, 0xff, 0x43, 0x10, 0x3d, 0x2c, 0x77, 0x70, 0x3d,
+ 0x83, 0xe7, 0x9f, 0x3d, 0x3f, 0xa7, 0x5b, 0x3e, 0x81, 0x5c, 0x45, 0xbe,
+ 0xf4, 0x3c, 0x98, 0xbd, 0x8a, 0x13, 0x1d, 0xbd, 0x66, 0xe9, 0x55, 0x3e,
+ 0x27, 0xc3, 0x55, 0x3d, 0x26, 0x85, 0x69, 0x3d, 0x39, 0xff, 0xb5, 0x3d,
+ 0xdd, 0xab, 0x1a, 0xbe, 0xc5, 0x6b, 0x1c, 0xbd, 0x63, 0x83, 0x53, 0x3e,
+ 0xd1, 0x30, 0x3c, 0xbe, 0x6c, 0xfc, 0xb5, 0xbd, 0x10, 0xb1, 0x60, 0x3d,
+ 0x31, 0xf7, 0x8b, 0x3d, 0x60, 0xc9, 0x22, 0xbd, 0x9d, 0x64, 0x2c, 0x3e,
+ 0xc1, 0x7d, 0x12, 0xbe, 0x29, 0x59, 0xc2, 0xbc, 0xaf, 0x07, 0x90, 0x3d,
+ 0xe5, 0x90, 0x66, 0x3d, 0x4e, 0x84, 0x6b, 0xbe, 0x3c, 0x89, 0x48, 0xbd,
+ 0xae, 0xa7, 0xb0, 0xba, 0x60, 0x80, 0x98, 0xba, 0x6d, 0x06, 0x38, 0xbe,
+ 0xdb, 0xc4, 0x28, 0xbd, 0xe7, 0xd7, 0xb6, 0xbc, 0xba, 0x94, 0x8a, 0x3a,
+ 0xbc, 0xaf, 0x60, 0x3d, 0xb7, 0x5f, 0x02, 0xbe, 0x76, 0xf4, 0xf3, 0x3d,
+ 0x05, 0x65, 0xde, 0xbb, 0xb8, 0xd5, 0xc5, 0xbd, 0xe7, 0x88, 0xae, 0x3d,
+ 0xc7, 0xcf, 0x64, 0x3d, 0x98, 0x0c, 0x0a, 0x3d, 0xca, 0x21, 0xf6, 0x3d,
+ 0x60, 0xdc, 0x9f, 0xbd, 0x81, 0x8a, 0x0d, 0xbd, 0x12, 0x51, 0xa8, 0x3d,
+ 0x78, 0x66, 0x07, 0xbd, 0x6f, 0x21, 0x29, 0x3e, 0x4e, 0xdf, 0x24, 0x3e,
+ 0x9c, 0xd5, 0xa8, 0x3b, 0xf9, 0x0a, 0xfe, 0xbd, 0x29, 0x90, 0xd5, 0xbd,
+ 0xc6, 0x90, 0xfc, 0x3d, 0x89, 0x05, 0xa8, 0xbc, 0xff, 0x99, 0xb1, 0xbc,
+ 0x1c, 0x48, 0xdb, 0xbd, 0x4e, 0xe9, 0x41, 0xbe, 0xe5, 0x4e, 0xe8, 0x3c,
+ 0x61, 0x3c, 0x89, 0xbe, 0x67, 0x10, 0x27, 0x3e, 0xd8, 0x2b, 0xbe, 0xbd,
+ 0xff, 0x3f, 0x4f, 0xbe, 0xbc, 0xa3, 0xb5, 0x3c, 0xe5, 0x1c, 0xaf, 0xbd,
+ 0x39, 0xe3, 0xef, 0xbd, 0x90, 0x28, 0x2c, 0xbe, 0xc1, 0xff, 0x66, 0xba,
+ 0x20, 0x0e, 0xdd, 0xbd, 0x70, 0x71, 0x0d, 0x3d, 0x3f, 0x16, 0x28, 0x3e,
+ 0xdf, 0x08, 0x0c, 0xbe, 0x0d, 0x52, 0xfa, 0xbd, 0x06, 0xe9, 0x2a, 0xbe,
+ 0x86, 0x4b, 0x19, 0xbe, 0x8a, 0xd5, 0x83, 0xbc, 0x35, 0xae, 0xa4, 0xbd,
+ 0xd2, 0x7a, 0xe9, 0x3d, 0x35, 0xf0, 0x78, 0x3d, 0x1d, 0x5f, 0x5e, 0x3c,
+ 0xc9, 0x16, 0x0b, 0xbd, 0xdf, 0x44, 0xb1, 0x3d, 0x5b, 0x94, 0xd0, 0x3d,
+ 0x22, 0xd6, 0xb6, 0x3d, 0xd7, 0x01, 0x40, 0xbd, 0x83, 0x1c, 0x5b, 0xbc,
+ 0xc2, 0x02, 0x2e, 0x3e, 0x08, 0x5b, 0xc5, 0x3d, 0x54, 0x74, 0xf2, 0x3d,
+ 0x2f, 0x30, 0xcc, 0xbc, 0xe4, 0x36, 0x47, 0x3d, 0x6f, 0xd9, 0xc0, 0xbd,
+ 0x00, 0xa6, 0x8a, 0xbd, 0xe4, 0x51, 0x3e, 0xbe, 0x94, 0x72, 0x98, 0xbd,
+ 0x98, 0xca, 0x7f, 0xbe, 0x14, 0x0e, 0x12, 0x3e, 0x89, 0x72, 0x00, 0x3e,
+ 0x85, 0x07, 0xd5, 0xbd, 0xf6, 0xff, 0x12, 0x3e, 0x80, 0x1d, 0xe2, 0x3c,
+ 0x02, 0xbd, 0xe2, 0x3c, 0xd7, 0x28, 0x15, 0xbe, 0xd2, 0xa9, 0x8a, 0xbd,
+ 0x75, 0xfa, 0x8b, 0xbd, 0x3c, 0x0b, 0xf3, 0xbd, 0xc7, 0x6c, 0x60, 0x3d,
+ 0xf9, 0x55, 0x2c, 0xbe, 0xbe, 0xf1, 0xf3, 0x3d, 0x4a, 0xc5, 0x60, 0x3d,
+ 0x73, 0x58, 0x77, 0x3d, 0xc0, 0x94, 0xd2, 0xbb, 0xbd, 0x5c, 0xe2, 0x3d,
+ 0x93, 0xb4, 0xce, 0x3d, 0x24, 0x46, 0xf4, 0xbd, 0x6d, 0xbf, 0xbb, 0x3d,
+ 0x96, 0x07, 0x0e, 0xbe, 0x5e, 0x7d, 0x12, 0xbe, 0x15, 0xf4, 0xda, 0x3d,
+ 0x41, 0x96, 0x0e, 0x3b, 0xd0, 0x77, 0x47, 0xbe, 0x23, 0x78, 0x99, 0xbd,
+ 0x9d, 0xff, 0xb4, 0x3d, 0x1c, 0x8f, 0x36, 0xbe, 0xed, 0x97, 0xc7, 0xbc,
+ 0x43, 0x10, 0xac, 0xbd, 0x2f, 0x9d, 0x05, 0xbe, 0xf3, 0x3a, 0x27, 0x3e,
+ 0xae, 0xc7, 0xbd, 0x3d, 0x28, 0x69, 0xba, 0xbd, 0xf8, 0xe4, 0xab, 0xbc,
+ 0x85, 0x56, 0xb3, 0x3c, 0x59, 0xae, 0x9e, 0x3b, 0x4f, 0x47, 0x44, 0xbc,
+ 0x7b, 0x98, 0xd5, 0xbd, 0x15, 0xa0, 0x29, 0x3e, 0x8f, 0xbd, 0x25, 0x3e,
+ 0xe8, 0x07, 0xea, 0x3d, 0xff, 0x87, 0x39, 0xbe, 0x05, 0x1b, 0x1b, 0xbd,
+ 0x83, 0xf3, 0x08, 0x3d, 0xec, 0x99, 0x39, 0x3d, 0x96, 0x42, 0x37, 0x3d,
+ 0xca, 0x52, 0xf8, 0xbd, 0xb4, 0xd9, 0x18, 0xbc, 0x53, 0x8c, 0x66, 0x3a,
+ 0xc4, 0x60, 0x3c, 0xbe, 0xe3, 0x62, 0x66, 0xbe, 0x29, 0x53, 0xaa, 0xbd,
+ 0xa0, 0x31, 0x8e, 0xbd, 0xec, 0xaf, 0x3e, 0x3c, 0x6e, 0xb2, 0xf5, 0xbd,
+ 0x16, 0x31, 0x00, 0xbe, 0x5b, 0x87, 0xb7, 0xbc, 0xec, 0xcf, 0xd7, 0xbd,
+ 0x70, 0xa1, 0x9f, 0x3d, 0x5a, 0x3e, 0x95, 0xbd, 0x7f, 0xcf, 0xee, 0xbd,
+ 0x4d, 0xac, 0xe4, 0xbc, 0x9f, 0xf7, 0xb4, 0x3d, 0x89, 0x22, 0x69, 0xbd,
+ 0x9c, 0x0b, 0xf5, 0x3c, 0xae, 0xf5, 0xb3, 0x3d, 0x23, 0x8b, 0x06, 0x3c,
+ 0x21, 0x4f, 0x44, 0xbd, 0x6a, 0xd0, 0x96, 0xbd, 0x00, 0x48, 0xae, 0xbd,
+ 0xcb, 0x8f, 0x14, 0xbe, 0x11, 0x5f, 0x39, 0xbe, 0x70, 0xda, 0x0a, 0xbc,
+ 0x6e, 0x98, 0x0a, 0xbe, 0x1b, 0x72, 0xfa, 0xbb, 0xcf, 0x07, 0xdb, 0x3d,
+ 0x0d, 0x73, 0x96, 0x3d, 0x04, 0x00, 0x8f, 0xbc, 0x09, 0xbf, 0x7c, 0xbd,
+ 0x67, 0xd3, 0x94, 0xbd, 0x82, 0xc4, 0x25, 0x3d, 0xc9, 0x42, 0x22, 0xbd,
+ 0xdb, 0xc0, 0x52, 0x3d, 0x88, 0x3f, 0xdf, 0xbd, 0x28, 0x41, 0x51, 0xbc,
+ 0x0c, 0x78, 0xfd, 0x3d, 0x54, 0xc1, 0x27, 0x3e, 0x0e, 0x17, 0x16, 0x3d,
+ 0x9d, 0x0b, 0x26, 0xbe, 0x43, 0x3a, 0xcc, 0xbd, 0x5a, 0xc6, 0x90, 0x3d,
+ 0x4e, 0x62, 0x9c, 0xbd, 0x79, 0x36, 0x56, 0x3e, 0x0e, 0xf3, 0x28, 0x3d,
+ 0x6c, 0xd0, 0x4d, 0xbd, 0x1c, 0xe7, 0xa6, 0x3d, 0x65, 0x0d, 0x6c, 0xbd,
+ 0x38, 0xd8, 0x2f, 0x3e, 0x0f, 0x60, 0x2e, 0xbd, 0x46, 0x38, 0x04, 0xbe,
+ 0x2f, 0x56, 0x26, 0xbe, 0x86, 0x40, 0x55, 0x3e, 0x09, 0x22, 0x9a, 0x3d,
+ 0x5a, 0x0d, 0x80, 0xbe, 0x8f, 0x3a, 0x20, 0xbe, 0xf8, 0x88, 0x2a, 0xbe,
+ 0x57, 0x81, 0xb1, 0x3d, 0x1e, 0x5d, 0xc7, 0xbd, 0xc7, 0xfc, 0x3d, 0xbe,
+ 0xdc, 0x51, 0x1c, 0xbe, 0x49, 0x8d, 0x97, 0xbd, 0x86, 0x8b, 0x54, 0xbd,
+ 0x30, 0xe9, 0xea, 0x3d, 0x66, 0x5e, 0x42, 0xbe, 0xc9, 0x14, 0x0e, 0xbe,
+ 0x08, 0x76, 0x88, 0xbb, 0xd2, 0x54, 0xba, 0x3d, 0x6d, 0x8d, 0x92, 0xbd,
+ 0x1e, 0xc8, 0xd8, 0xbd, 0x0a, 0xc7, 0x42, 0xbe, 0x32, 0x93, 0xeb, 0x3d,
+ 0xae, 0xff, 0x6a, 0xbe, 0xf3, 0xb7, 0x7f, 0x3e, 0xa8, 0xe1, 0x86, 0x3d,
+ 0x42, 0x76, 0xce, 0xbc, 0x18, 0x6f, 0xfa, 0xbc, 0x15, 0xbd, 0xbe, 0xba,
+ 0x13, 0x81, 0x26, 0xbe, 0xfd, 0xbf, 0x7b, 0xbd, 0x74, 0x3c, 0x01, 0x3e,
+ 0x11, 0x2a, 0x31, 0x3d, 0xc4, 0x86, 0x03, 0x3e, 0x51, 0x3d, 0x60, 0xbe,
+ 0x41, 0xa8, 0x3b, 0x3d, 0xa3, 0x25, 0x23, 0xbe, 0xce, 0x09, 0x94, 0x3a,
+ 0x25, 0x79, 0xce, 0xbd, 0x9c, 0xcb, 0x4d, 0xbe, 0x4c, 0x95, 0x99, 0xbd,
+ 0xa7, 0x46, 0x97, 0x3d, 0x41, 0x0a, 0xc3, 0xbd, 0x52, 0x17, 0x62, 0xbc,
+ 0x6f, 0xa9, 0xf7, 0x3d, 0x76, 0x3a, 0x5d, 0x3e, 0x69, 0x00, 0x43, 0xbe,
+ 0xd7, 0x09, 0x9b, 0x3d, 0x7b, 0xcb, 0x24, 0xbe, 0x34, 0x78, 0x29, 0xbd,
+ 0x31, 0x8a, 0x1f, 0xbe, 0xc0, 0xb1, 0xfd, 0xbd, 0x6d, 0xff, 0xa2, 0xbd,
+ 0x2c, 0x65, 0xa9, 0x3c, 0xe1, 0x8e, 0x4d, 0xbe, 0xe3, 0x64, 0x05, 0x3e,
+ 0x75, 0x84, 0x6f, 0xbe, 0x02, 0x0b, 0x8d, 0xbd, 0x1b, 0xf2, 0x73, 0xbe,
+ 0x1b, 0x25, 0xf6, 0x3d, 0x0d, 0xb1, 0xaa, 0x3b, 0xdc, 0xc9, 0x24, 0xbe,
+ 0x76, 0x7c, 0x53, 0xbc, 0x3f, 0x29, 0xb4, 0xbd, 0x5b, 0xad, 0x93, 0xbd,
+ 0xea, 0xe3, 0x60, 0xba, 0xcd, 0xdc, 0x51, 0xbd, 0x87, 0x2e, 0xc2, 0xbb,
+ 0x3d, 0x15, 0xb0, 0xbd, 0xfd, 0xdd, 0xa1, 0x3d, 0x1f, 0x36, 0x0a, 0xbd,
+ 0x44, 0xb1, 0x36, 0xbe, 0xf7, 0xff, 0x9c, 0xbd, 0xa5, 0x8e, 0x57, 0x3e,
+ 0x78, 0xc7, 0xde, 0xbd, 0xee, 0xce, 0x7d, 0xbe, 0x14, 0x5c, 0xe3, 0x3c,
+ 0x38, 0xda, 0x84, 0x3d, 0x27, 0x81, 0x2f, 0xbe, 0x98, 0x2f, 0x11, 0xbc,
+ 0x28, 0x89, 0x16, 0x3e, 0x13, 0xe5, 0x8c, 0x3d, 0x72, 0x26, 0x41, 0xbd,
+ 0xf3, 0x90, 0xae, 0xbd, 0x7f, 0x13, 0x79, 0x3d, 0x95, 0xcd, 0x31, 0xbd,
+ 0xcd, 0x20, 0xba, 0xbe, 0x5c, 0xc4, 0xd6, 0xbb, 0x3a, 0x70, 0x30, 0xbe,
+ 0x1b, 0x22, 0xa3, 0xbc, 0x69, 0x8e, 0x9c, 0x3d, 0x97, 0xba, 0x68, 0xbd,
+ 0x3b, 0x16, 0x94, 0xbd, 0x52, 0xca, 0xcd, 0x3c, 0x34, 0x26, 0xba, 0xbc,
+ 0xb2, 0xfe, 0x43, 0xbe, 0x91, 0x28, 0x2d, 0xbd, 0x22, 0x30, 0xfc, 0xbd,
+ 0x3c, 0x31, 0x7f, 0x3b, 0x23, 0x68, 0x3e, 0x3d, 0x79, 0x24, 0x90, 0x3c,
+ 0x25, 0x6a, 0xa1, 0x3d, 0xff, 0x26, 0xfe, 0x3d, 0x2d, 0x9b, 0x17, 0x3e,
+ 0xb9, 0x40, 0x00, 0x3e, 0xe1, 0xb2, 0x42, 0xbe, 0x2f, 0x6d, 0x17, 0xbe,
+ 0xe4, 0xd2, 0x89, 0xbc, 0x37, 0x10, 0x2c, 0x3d, 0x7f, 0x4c, 0xde, 0x3c,
+ 0x87, 0xcd, 0xe8, 0x3d, 0x37, 0x0b, 0x8e, 0xbd, 0x12, 0xd3, 0x2c, 0x3e,
+ 0x91, 0xf6, 0x07, 0x3d, 0x0d, 0xa4, 0x88, 0xbd, 0x58, 0xdb, 0x20, 0xbe,
+ 0xe6, 0x22, 0xc2, 0xbd, 0x2a, 0x16, 0x12, 0x3e, 0x86, 0x49, 0xa4, 0xbd,
+ 0xbe, 0x20, 0x3e, 0xbe, 0x79, 0x8f, 0xc1, 0x3d, 0x72, 0x7f, 0xca, 0xbd,
+ 0x73, 0x65, 0xc3, 0x3c, 0x6b, 0xbe, 0x1c, 0xbd, 0x3e, 0x05, 0x40, 0x3d,
+ 0x73, 0xff, 0xa0, 0x3b, 0x44, 0xd4, 0xf8, 0x3c, 0xd5, 0x62, 0x1c, 0xbe,
+ 0x1d, 0x1c, 0xa9, 0x3c, 0x91, 0x80, 0xb0, 0xbc, 0xf9, 0xba, 0x3d, 0x3d,
+ 0xa7, 0xd4, 0x23, 0xbe, 0x0b, 0x1f, 0xc0, 0x3d, 0xe6, 0xd7, 0x13, 0x3d,
+ 0x13, 0xd4, 0x4b, 0xbd, 0x82, 0xcc, 0x82, 0x3c, 0xd8, 0xea, 0xc4, 0xbd,
+ 0x1e, 0xd5, 0x40, 0x3e, 0x0f, 0xb2, 0xe1, 0xbd, 0xfd, 0x6d, 0x2d, 0x3e,
+ 0x66, 0x61, 0x37, 0x3d, 0x12, 0xc6, 0x77, 0x3d, 0x44, 0xc2, 0x11, 0xbe,
+ 0xdd, 0x9b, 0xe9, 0x3c, 0x06, 0x39, 0xaf, 0x3d, 0x1a, 0xd4, 0x10, 0xbe,
+ 0x41, 0xad, 0xae, 0x3e, 0x6c, 0xa9, 0xc1, 0x3d, 0x29, 0x0e, 0xd9, 0xbd,
+ 0x90, 0x61, 0x68, 0xbd, 0x2a, 0xcc, 0x97, 0x3d, 0x99, 0xda, 0x38, 0xbd,
+ 0x6e, 0xc2, 0x07, 0xbe, 0xb7, 0xa8, 0xb4, 0x3d, 0xb1, 0x20, 0x19, 0x3e,
+ 0xf6, 0x8c, 0x95, 0x3d, 0x47, 0x22, 0x13, 0x3e, 0x2f, 0xbf, 0xa4, 0x3a,
+ 0xb9, 0x3e, 0x8c, 0xbd, 0xed, 0xbd, 0xd1, 0xbd, 0xf2, 0x84, 0xc3, 0xbd,
+ 0x8e, 0x0b, 0x42, 0xbe, 0x36, 0xd7, 0x89, 0x3d, 0xfe, 0x2d, 0x62, 0x3d,
+ 0x25, 0x45, 0x55, 0x3e, 0xa9, 0x23, 0x66, 0xbe, 0x3d, 0x48, 0xb7, 0xbc,
+ 0x51, 0x85, 0x35, 0x3d, 0xdc, 0x7b, 0x08, 0x3c, 0xfb, 0x57, 0x71, 0xbe,
+ 0xb8, 0x6a, 0x28, 0x3e, 0xd6, 0x0c, 0x49, 0xbd, 0x6a, 0xc5, 0x63, 0x3c,
+ 0xbe, 0xac, 0x74, 0xbd, 0xfa, 0xd5, 0x84, 0x3d, 0x1c, 0x4c, 0xac, 0xbd,
+ 0xdf, 0x6b, 0x10, 0xbe, 0x4d, 0x9f, 0x11, 0x3e, 0xc5, 0x64, 0x25, 0x3e,
+ 0xcc, 0x97, 0x86, 0x3d, 0xb5, 0x5d, 0x08, 0xbe, 0x99, 0xd7, 0x66, 0x3d,
+ 0xaa, 0x13, 0x81, 0xbe, 0xba, 0xac, 0x81, 0xbd, 0x49, 0xfe, 0x7d, 0xbd,
+ 0xd7, 0x25, 0xd2, 0x3d, 0x80, 0x11, 0xa0, 0xbd, 0x08, 0xb1, 0x96, 0x3c,
+ 0xa2, 0x55, 0xc3, 0x3d, 0x5b, 0xcb, 0xe0, 0xbd, 0x1c, 0x5b, 0x0c, 0xbe,
+ 0x9e, 0x04, 0xa2, 0xbc, 0x32, 0x39, 0xe4, 0xbd, 0x40, 0x88, 0xab, 0x3d,
+ 0x43, 0xb7, 0x52, 0xbe, 0x1b, 0x7b, 0x83, 0x3e, 0x17, 0xda, 0x45, 0xbd,
+ 0x47, 0x45, 0xb8, 0xbd, 0x43, 0xc5, 0x45, 0xbe, 0xff, 0x10, 0x66, 0xbe,
+ 0xe9, 0xe5, 0x0e, 0x3e, 0x46, 0xac, 0x84, 0x3e, 0x47, 0x4a, 0x20, 0xbe,
+ 0xa5, 0x1b, 0x50, 0x3d, 0x21, 0x9c, 0x47, 0x3d, 0x10, 0x1e, 0x81, 0x3e,
+ 0x3e, 0xc8, 0x59, 0x3e, 0xec, 0x25, 0xb6, 0xbd, 0x1d, 0x22, 0x47, 0x3b,
+ 0xd3, 0x91, 0x0b, 0xbe, 0x7a, 0xde, 0xd3, 0x3c, 0x9a, 0x3d, 0xa0, 0xbd,
+ 0x01, 0x23, 0xaf, 0xbd, 0x90, 0x9b, 0x1a, 0x3e, 0x7e, 0x50, 0xf7, 0xbe,
+ 0xeb, 0x29, 0xab, 0xbc, 0xba, 0x49, 0x13, 0x3d, 0xca, 0xc3, 0x43, 0xbe,
+ 0xde, 0xe4, 0x37, 0x3e, 0xa1, 0x25, 0x09, 0x3e, 0x1c, 0xd4, 0x42, 0xbd,
+ 0x65, 0x49, 0xaf, 0xbb, 0x87, 0x5d, 0xb9, 0x3d, 0x2d, 0x69, 0xc2, 0xbd,
+ 0xad, 0x8e, 0xfd, 0xbd, 0xd9, 0x36, 0x10, 0x3e, 0x9f, 0x91, 0x86, 0x3d,
+ 0x9b, 0xcd, 0x1f, 0xbe, 0xe7, 0x9e, 0x50, 0xbe, 0x6f, 0xfe, 0x5b, 0xbe,
+ 0x05, 0x01, 0xf0, 0x3d, 0xdd, 0xa5, 0xfd, 0x3d, 0xc8, 0x34, 0x28, 0xbe,
+ 0x3c, 0xe4, 0x47, 0xbc, 0xd9, 0x81, 0x8d, 0x3d, 0xff, 0xa6, 0x0c, 0x3e,
+ 0x72, 0x35, 0x41, 0xbe, 0x1a, 0x59, 0x98, 0xbd, 0xe8, 0x75, 0x15, 0xbd,
+ 0xb5, 0x17, 0x6d, 0x3d, 0xd6, 0x19, 0x4e, 0x3d, 0xdc, 0x0a, 0x12, 0x3d,
+ 0x51, 0xca, 0x92, 0x3d, 0x74, 0x7f, 0x80, 0x3d, 0x44, 0x92, 0xdb, 0x3d,
+ 0xb3, 0x7a, 0x16, 0xbd, 0xc9, 0x0f, 0xb8, 0x3d, 0xb4, 0x43, 0xbc, 0x3d,
+ 0x29, 0x0f, 0x01, 0x3e, 0x40, 0xee, 0x89, 0x3d, 0x74, 0x67, 0x1b, 0x3c,
+ 0xd6, 0x72, 0x34, 0x3d, 0x5e, 0xa8, 0xb6, 0x3d, 0x47, 0x2b, 0xa4, 0x3d,
+ 0xba, 0xf2, 0xeb, 0xbd, 0x4c, 0xde, 0x9f, 0xbd, 0x1d, 0xfb, 0x76, 0x3d,
+ 0x49, 0xbf, 0xd5, 0x3d, 0xbd, 0x33, 0x23, 0x3e, 0x09, 0x58, 0x1b, 0x3d,
+ 0x32, 0xfe, 0xd9, 0xbd, 0x28, 0xba, 0xc6, 0xbd, 0x05, 0x6d, 0x09, 0x3e,
+ 0x74, 0x7f, 0x6f, 0x3d, 0xf9, 0xab, 0x2b, 0x3d, 0x5d, 0x96, 0x92, 0xbd,
+ 0x54, 0x5e, 0xc0, 0x3d, 0xfe, 0x19, 0xa6, 0x3d, 0x59, 0xfd, 0x05, 0x3e,
+ 0x59, 0xcd, 0x2c, 0xbe, 0x81, 0x29, 0x54, 0x3d, 0x54, 0x5f, 0xe1, 0x3d,
+ 0x8f, 0xfd, 0xf4, 0xbd, 0x02, 0xd5, 0xe5, 0xbb, 0xd1, 0x51, 0xc6, 0x3d,
+ 0xff, 0x20, 0x02, 0xbe, 0x86, 0x8a, 0x95, 0x3b, 0x3a, 0x5a, 0x1e, 0x3e,
+ 0xd7, 0xc0, 0x25, 0xbb, 0x29, 0x06, 0xd4, 0x3d, 0x1c, 0xe1, 0x2a, 0x3e,
+ 0x20, 0x29, 0xae, 0xbd, 0x4b, 0xc5, 0xcd, 0xbd, 0x14, 0x32, 0x79, 0xbb,
+ 0x3b, 0x1d, 0x47, 0xbd, 0x56, 0x93, 0x03, 0x3e, 0x5f, 0x91, 0x0a, 0xbe,
+ 0xcf, 0x7d, 0x77, 0xbd, 0x1e, 0x8f, 0x16, 0x3c, 0xf6, 0x3b, 0x8a, 0x3d,
+ 0x15, 0xa2, 0x05, 0xbe, 0x2f, 0x01, 0x18, 0xbe, 0x8f, 0x32, 0xd6, 0x3d,
+ 0xf1, 0xbd, 0xb5, 0x3d, 0x8b, 0x69, 0xa8, 0x3d, 0x10, 0x54, 0x40, 0xbe,
+ 0x2a, 0x47, 0xc4, 0xbc, 0xa0, 0x33, 0xed, 0xbd, 0xb1, 0x20, 0x5b, 0xbc,
+ 0xee, 0xeb, 0x60, 0xbd, 0x92, 0xce, 0x5b, 0xbd, 0xff, 0x19, 0xbb, 0xbd,
+ 0x8e, 0x6c, 0x89, 0xbd, 0x8e, 0x81, 0x8d, 0x3c, 0xdf, 0xe1, 0xb7, 0x3d,
+ 0xb9, 0xb9, 0x05, 0x3e, 0xcd, 0x1f, 0x9e, 0x3c, 0x62, 0x05, 0xa3, 0x3d,
+ 0x46, 0x05, 0x47, 0xbc, 0x38, 0x30, 0xbc, 0x3d, 0xdc, 0xc1, 0x88, 0xbe,
+ 0xdf, 0xbe, 0x83, 0xbd, 0xe8, 0x66, 0x15, 0xbe, 0x32, 0x38, 0x0f, 0xbe,
+ 0x50, 0x88, 0x1e, 0xbe, 0x08, 0x87, 0xf6, 0x3d, 0x8c, 0xaa, 0x16, 0xbc,
+ 0x25, 0x2b, 0x26, 0xbe, 0x33, 0x43, 0x19, 0xbe, 0xef, 0x57, 0xa2, 0xbc,
+ 0xb3, 0xb6, 0x10, 0xbc, 0xc8, 0xda, 0x86, 0xbd, 0x9f, 0xaf, 0x1d, 0xbe,
+ 0xad, 0x38, 0x29, 0xbe, 0x56, 0x6b, 0xd4, 0x3d, 0x33, 0x32, 0x95, 0xbc,
+ 0x25, 0xc2, 0x47, 0x3d, 0xb5, 0x5e, 0x49, 0xbe, 0xb9, 0x8e, 0xc5, 0x3d,
+ 0xcc, 0x56, 0x35, 0x3d, 0x31, 0x42, 0xf1, 0x3d, 0x6c, 0x8c, 0x35, 0xbe,
+ 0xb5, 0x38, 0xcd, 0x3d, 0xd4, 0xea, 0xcc, 0xbd, 0x70, 0x02, 0x04, 0xbe,
+ 0x79, 0x6b, 0x96, 0x3d, 0x27, 0x8d, 0x4d, 0x3c, 0x85, 0xc0, 0x4f, 0x3e,
+ 0xa2, 0x04, 0x10, 0xbe, 0x66, 0x3f, 0x95, 0x3d, 0x23, 0xfd, 0x1a, 0x3e,
+ 0xed, 0x73, 0x47, 0xbe, 0xae, 0x6a, 0x1c, 0xbe, 0x80, 0x94, 0xe5, 0xbd,
+ 0x1a, 0x08, 0xcd, 0x3d, 0xc7, 0x57, 0x96, 0xbc, 0x03, 0xa5, 0x0b, 0x3e,
+ 0x9f, 0x46, 0xa6, 0xbd, 0x84, 0x73, 0x97, 0x3e, 0x18, 0x39, 0x18, 0xbe,
+ 0xed, 0x6f, 0xa5, 0xbd, 0x18, 0xd7, 0x7d, 0xbe, 0xdc, 0x83, 0xde, 0x3d,
+ 0x0c, 0x88, 0xa1, 0x3d, 0xbd, 0xa8, 0x7c, 0x3d, 0xde, 0x75, 0xc4, 0xbd,
+ 0x4b, 0x01, 0xcf, 0x3d, 0x12, 0x54, 0xcd, 0x3c, 0x4e, 0xec, 0x26, 0xbe,
+ 0x84, 0xb1, 0x12, 0xbe, 0xd3, 0x71, 0x6b, 0xbe, 0x63, 0x72, 0xd5, 0xbd,
+ 0x36, 0x49, 0x77, 0xbe, 0xc8, 0x85, 0x10, 0x3e, 0x4f, 0xcf, 0xbf, 0xbd,
+ 0x02, 0xa3, 0xfb, 0xbb, 0x30, 0xbe, 0x9b, 0x3c, 0xfc, 0x68, 0x6f, 0xbd,
+ 0x77, 0x78, 0x8b, 0xbd, 0xfd, 0xfe, 0x42, 0x3e, 0x55, 0xb9, 0xe2, 0xbd,
+ 0xe3, 0x85, 0x14, 0x3d, 0x9b, 0x9d, 0x4e, 0xbd, 0xdd, 0xc1, 0x7d, 0x3e,
+ 0x77, 0xae, 0x26, 0x3d, 0x72, 0x35, 0x2e, 0x3e, 0x7d, 0xa9, 0x0e, 0x3d,
+ 0x11, 0xec, 0x4a, 0x3e, 0xf1, 0x45, 0x3e, 0xbe, 0xd0, 0x5d, 0xe0, 0xbd,
+ 0x97, 0x46, 0x81, 0xbe, 0x99, 0x03, 0x21, 0xbe, 0xd6, 0x58, 0x2f, 0x3d,
+ 0x73, 0xad, 0xdc, 0x3d, 0x08, 0xfd, 0x06, 0xbe, 0x93, 0x23, 0x52, 0x3e,
+ 0x43, 0x0f, 0x03, 0xbd, 0xc4, 0x66, 0x7a, 0x3b, 0x06, 0x86, 0x1b, 0xbe,
+ 0x69, 0xe5, 0xaa, 0xbd, 0xeb, 0x45, 0xe5, 0x3d, 0x27, 0x9d, 0x19, 0x3e,
+ 0x53, 0x47, 0x07, 0xbe, 0x0f, 0x4a, 0xb9, 0x3d, 0x78, 0x0b, 0xcf, 0x3d,
+ 0x99, 0x0e, 0x10, 0x3c, 0x68, 0x54, 0x6c, 0xbc, 0xeb, 0x0b, 0x91, 0xbd,
+ 0x4b, 0x90, 0x56, 0x3c, 0xd0, 0x97, 0xc4, 0xbd, 0xaf, 0xbc, 0x7f, 0xbd,
+ 0x28, 0x59, 0xf1, 0xbd, 0x07, 0xc9, 0x6e, 0x3d, 0xe6, 0x1b, 0x10, 0xbe,
+ 0x06, 0x1a, 0xf5, 0xbd, 0xc1, 0x2c, 0x73, 0xbd, 0x57, 0x22, 0xa1, 0xbc,
+ 0x59, 0x5c, 0x10, 0x3e, 0x3d, 0x9a, 0x64, 0x3d, 0x03, 0x7d, 0x16, 0xbe,
+ 0x1c, 0x50, 0x24, 0xbe, 0x15, 0x7d, 0x72, 0x3e, 0x20, 0xa8, 0x8d, 0x3e,
+ 0x1d, 0x89, 0x55, 0xbe, 0xff, 0xef, 0xc4, 0x3d, 0xf3, 0xcd, 0x02, 0xbe,
+ 0x23, 0xf4, 0x85, 0x3d, 0x3f, 0xfa, 0x4b, 0xbe, 0x86, 0x0b, 0xae, 0x3c,
+ 0x26, 0x27, 0xae, 0xba, 0xd3, 0xf0, 0x09, 0x3e, 0xb8, 0x79, 0xbc, 0x3d,
+ 0x4e, 0xff, 0x8d, 0x3d, 0xce, 0x4d, 0xf1, 0xbd, 0x04, 0x7f, 0xad, 0xbd,
+ 0xd8, 0xcc, 0xe8, 0xbd, 0x0e, 0x21, 0x0c, 0x3d, 0xb0, 0x1f, 0xed, 0x3d,
+ 0xd2, 0x23, 0x08, 0x3d, 0x33, 0xe3, 0xf1, 0x3d, 0x0b, 0xec, 0x1b, 0xbd,
+ 0xb6, 0xd0, 0x5a, 0xbe, 0x3c, 0xe6, 0xb2, 0x3d, 0xc0, 0xbf, 0x1c, 0x3e,
+ 0x8b, 0x1c, 0x01, 0xbc, 0x31, 0xe4, 0xaf, 0x3e, 0xe7, 0x00, 0x8b, 0xbd,
+ 0x86, 0xb8, 0x03, 0xbe, 0x64, 0xf8, 0x3d, 0x3d, 0xb6, 0xd8, 0x32, 0x3e,
+ 0x1d, 0xad, 0x30, 0x3d, 0x5b, 0xd4, 0xe4, 0xbc, 0x8f, 0xb5, 0x51, 0x3e,
+ 0x5a, 0xb5, 0xb9, 0x3d, 0x79, 0x34, 0x59, 0xbe, 0xc4, 0xcc, 0x9f, 0x3e,
+ 0xfb, 0x2a, 0xad, 0x3d, 0xbf, 0x53, 0x68, 0x3e, 0xe6, 0xb9, 0x05, 0x3c,
+ 0xc4, 0xbf, 0x5c, 0xbd, 0x12, 0xb1, 0xf1, 0xbd, 0xa6, 0x3b, 0x7d, 0xbd,
+ 0x26, 0xc3, 0xc4, 0xbd, 0xb5, 0x52, 0x75, 0x3d, 0x16, 0x87, 0x13, 0x3e,
+ 0x3d, 0x5c, 0xff, 0x3d, 0x3c, 0xe8, 0xe4, 0x3d, 0x43, 0x4f, 0x27, 0xbe,
+ 0xb3, 0xab, 0x30, 0x3d, 0x23, 0x5b, 0xf6, 0x3d, 0x19, 0x8c, 0x96, 0x3d,
+ 0x5e, 0x45, 0x20, 0x3e, 0x22, 0x4e, 0x82, 0xbd, 0x84, 0x9b, 0x3f, 0xbe,
+ 0xb9, 0x6d, 0xb8, 0x3d, 0x75, 0x95, 0xa5, 0xbd, 0x80, 0x4d, 0xac, 0xbd,
+ 0x50, 0x33, 0x21, 0x3b, 0x86, 0xc2, 0x25, 0x3d, 0xb0, 0xf8, 0x17, 0xbe,
+ 0x97, 0xb2, 0x3e, 0xbd, 0x29, 0x48, 0x9b, 0x3d, 0x05, 0x8f, 0x93, 0x3d,
+ 0x94, 0x9a, 0x2c, 0xbe, 0xb1, 0x8c, 0x6f, 0xbd, 0x3a, 0xee, 0xf8, 0x3d,
+ 0x2a, 0x72, 0x50, 0x3d, 0x2f, 0x47, 0xf2, 0x3d, 0x08, 0x49, 0x9d, 0x3b,
+ 0x15, 0x33, 0xf2, 0xbc, 0xda, 0xa4, 0x6f, 0x3d, 0x55, 0x99, 0xb5, 0x3d,
+ 0x06, 0xc3, 0x46, 0x3d, 0xeb, 0xd0, 0xee, 0xbd, 0x5f, 0x16, 0xf9, 0xbd,
+ 0x6d, 0x8d, 0xf7, 0xbc, 0xc3, 0x17, 0x35, 0xbd, 0xc8, 0x78, 0xfb, 0xbd,
+ 0x13, 0x4f, 0x71, 0xbe, 0x16, 0xb1, 0x3e, 0xbe, 0x8d, 0x19, 0xc7, 0x3d,
+ 0xdb, 0x5c, 0x98, 0xbd, 0xe6, 0xb7, 0xa6, 0x3d, 0x5f, 0x64, 0xb4, 0x3d,
+ 0x88, 0xe3, 0x9f, 0xbd, 0xc3, 0x8a, 0x60, 0xbe, 0x87, 0xf2, 0xd9, 0xbd,
+ 0x89, 0x6a, 0x6b, 0xbd, 0x40, 0xc4, 0x7d, 0x3d, 0x5f, 0xbb, 0x41, 0x3c,
+ 0xdf, 0x1a, 0xd7, 0x3d, 0xb1, 0x40, 0xc0, 0x3c, 0x64, 0x26, 0xa1, 0x3d,
+ 0x00, 0x39, 0x9c, 0xbd, 0x19, 0x7e, 0xc6, 0x3d, 0x76, 0x8b, 0xa5, 0x3d,
+ 0x3f, 0xbd, 0xe8, 0xbd, 0x51, 0x08, 0xd6, 0x3b, 0x89, 0x93, 0x9b, 0xbd,
+ 0x8f, 0xe7, 0xed, 0x3d, 0xc0, 0xf7, 0xe5, 0x3d, 0x84, 0xa2, 0x18, 0x3e,
+ 0x3f, 0xd6, 0x0d, 0x3e, 0x00, 0xd9, 0x48, 0xbe, 0xe8, 0xf4, 0xa7, 0x3d,
+ 0x25, 0x49, 0x58, 0x3d, 0x54, 0x7b, 0x93, 0xbc, 0xab, 0xc8, 0x60, 0x3d,
+ 0xc4, 0x25, 0x9d, 0x3d, 0x91, 0x33, 0x81, 0x3c, 0xb0, 0x2c, 0xc8, 0xbd,
+ 0xe6, 0x7e, 0x70, 0x3d, 0xd6, 0xc3, 0x2f, 0xbd, 0x1a, 0xb7, 0xad, 0x3d,
+ 0x32, 0x1a, 0x02, 0x3c, 0xeb, 0x76, 0xf3, 0xbc, 0x49, 0x08, 0x9a, 0x3c,
+ 0x0b, 0x01, 0xbd, 0x3d, 0xc1, 0xa2, 0x1a, 0xbe, 0x82, 0x4c, 0x40, 0x3e,
+ 0x9c, 0xb0, 0x43, 0xbd, 0x2c, 0xaf, 0x74, 0x3d, 0x26, 0x38, 0x0e, 0xbd,
+ 0xc5, 0xba, 0x1a, 0xbe, 0xfe, 0x8f, 0x83, 0xbd, 0xe0, 0x92, 0x4c, 0xbe,
+ 0x08, 0x7b, 0x57, 0x3e, 0x80, 0x83, 0xcb, 0xbd, 0x99, 0xfc, 0x99, 0xbd,
+ 0x36, 0xc3, 0x5b, 0xbd, 0x0d, 0xf5, 0xdb, 0x3d, 0x8a, 0x80, 0x0d, 0xbe,
+ 0x77, 0x6e, 0x8a, 0x3d, 0xde, 0x4d, 0x53, 0x3d, 0x6b, 0xa5, 0x8c, 0xbd,
+ 0x7f, 0x64, 0xc9, 0xbd, 0x90, 0xbc, 0x22, 0x3d, 0x1b, 0x58, 0x43, 0xbd,
+ 0x59, 0x46, 0x3a, 0x3d, 0xa9, 0xc5, 0xaf, 0xbd, 0x50, 0x00, 0x51, 0x3d,
+ 0xd1, 0x2b, 0x68, 0xbc, 0x1c, 0xe4, 0x65, 0xbd, 0x9d, 0x90, 0x34, 0xbe,
+ 0x01, 0xff, 0xfa, 0x3d, 0xca, 0xde, 0xda, 0x3d, 0x06, 0x00, 0xea, 0xbd,
+ 0xaf, 0x4b, 0xda, 0x3c, 0x7c, 0xd9, 0x04, 0x3d, 0x51, 0x2e, 0xa9, 0x3d,
+ 0xba, 0x1f, 0xf1, 0xbd, 0x72, 0x64, 0x8f, 0xbd, 0x16, 0x91, 0x9e, 0x3d,
+ 0xb8, 0xe1, 0x27, 0xbe, 0x8c, 0xa3, 0xe1, 0x3d, 0x81, 0x35, 0x8c, 0xbc,
+ 0xe2, 0x8a, 0xc8, 0x3d, 0xf2, 0x6a, 0x81, 0x3d, 0xb9, 0x53, 0xc7, 0x3d,
+ 0x26, 0x9c, 0x2f, 0x3e, 0x20, 0xb0, 0x40, 0xbe, 0xa5, 0xb8, 0x6f, 0x3d,
+ 0x25, 0xed, 0x6b, 0x3d, 0xa8, 0x4f, 0x15, 0x3e, 0x4c, 0x70, 0x2a, 0x3e,
+ 0xfa, 0x1b, 0x87, 0x3d, 0x87, 0xfd, 0x39, 0xbe, 0xab, 0x03, 0x1f, 0xbe,
+ 0x4b, 0x9b, 0xf1, 0x3d, 0x7e, 0xa5, 0x49, 0x3e, 0xfc, 0x2b, 0x41, 0xbd,
+ 0xce, 0xe2, 0x6a, 0x3e, 0x54, 0x4f, 0xfe, 0x3c, 0xc1, 0x36, 0xbf, 0x3d,
+ 0x91, 0xd8, 0xf8, 0x3d, 0x00, 0x9d, 0xad, 0x3d, 0x0e, 0xe8, 0x89, 0xbb,
+ 0x8e, 0x3f, 0x5a, 0x3e, 0x4f, 0x57, 0xb6, 0xbd, 0xa4, 0x88, 0x09, 0x3e,
+ 0xa3, 0x3b, 0x98, 0x3b, 0x46, 0x19, 0x0c, 0xbd, 0x48, 0xaf, 0x9e, 0x3d,
+ 0x28, 0xe3, 0x04, 0xbe, 0xcb, 0x52, 0xf1, 0x3d, 0xbc, 0x64, 0x95, 0xbc,
+ 0x0b, 0x55, 0xfc, 0xbc, 0x4b, 0x19, 0x26, 0xbd, 0x04, 0x8e, 0x0f, 0x3e,
+ 0xe2, 0x09, 0x45, 0xbe, 0x89, 0xd8, 0x10, 0xbc, 0x3d, 0x19, 0x91, 0x3d,
+ 0x92, 0x1c, 0xa1, 0xbc, 0x4c, 0x52, 0x9c, 0xba, 0xef, 0xb5, 0x07, 0xbd,
+ 0xe1, 0xb5, 0x9c, 0x3c, 0xb3, 0xc7, 0xe2, 0x3d, 0x9b, 0x48, 0x3c, 0xbe,
+ 0x9b, 0x28, 0x23, 0x3e, 0x30, 0x3a, 0x98, 0x3c, 0x5d, 0x08, 0xb8, 0xbd,
+ 0x36, 0x37, 0xdf, 0x3b, 0x8b, 0x2f, 0x96, 0x3d, 0x93, 0x88, 0xa5, 0xbd,
+ 0xb2, 0xbc, 0x04, 0x3e, 0x32, 0xb2, 0x20, 0xbe, 0x03, 0x44, 0xbc, 0x3d,
+ 0x4f, 0x1c, 0x9a, 0x3c, 0xa9, 0x71, 0xfa, 0xbd, 0xf3, 0xd1, 0xc6, 0x3d,
+ 0xbd, 0xa3, 0x4b, 0xbe, 0x31, 0xf8, 0x6b, 0xbd, 0x93, 0x71, 0x44, 0xbe,
+ 0x23, 0x3c, 0x9c, 0x3d, 0xfc, 0x06, 0xa3, 0xbd, 0xe6, 0xf1, 0x5e, 0x3d,
+ 0xff, 0x36, 0xbd, 0xbd, 0xa8, 0xc5, 0x80, 0xbd, 0x9f, 0xec, 0x11, 0xbd,
+ 0xb2, 0x87, 0x10, 0xbe, 0xc2, 0xe7, 0x93, 0x3c, 0x80, 0x9d, 0xfa, 0x3d,
+ 0x6e, 0xe1, 0x6b, 0xbe, 0x22, 0x85, 0x86, 0xbb, 0x80, 0x98, 0xed, 0xbd,
+ 0x5a, 0xb5, 0xca, 0xbc, 0x47, 0xbc, 0x94, 0xbd, 0xb8, 0x14, 0xf0, 0x3d,
+ 0x6a, 0xf1, 0xc0, 0x3d, 0x33, 0x44, 0xc4, 0x3d, 0x97, 0x30, 0xc7, 0x3c,
+ 0x69, 0xb5, 0x57, 0x3d, 0xa9, 0x2d, 0x2b, 0x3e, 0xa9, 0xa9, 0x56, 0x3c,
+ 0xf4, 0x43, 0x1a, 0x3e, 0xf7, 0xdb, 0x6c, 0xbd, 0x29, 0xeb, 0x98, 0x3c,
+ 0x25, 0xe6, 0x93, 0xbd, 0x4d, 0x80, 0x3e, 0x3d, 0xbe, 0x04, 0xf9, 0x3d,
+ 0x02, 0x09, 0xe2, 0xbd, 0xf5, 0x16, 0xeb, 0x3d, 0x84, 0x5d, 0x00, 0xbe,
+ 0x7e, 0xc8, 0x8c, 0xbe, 0x54, 0xc2, 0x71, 0xbd, 0x91, 0x10, 0xd7, 0x3b,
+ 0x23, 0xca, 0x0f, 0x3d, 0x5f, 0x2c, 0x13, 0x3e, 0xc2, 0x55, 0x35, 0xbb,
+ 0xa4, 0xc8, 0x34, 0xbe, 0xf1, 0x9c, 0x68, 0x3d, 0x62, 0x7d, 0x6c, 0x3e,
+ 0xd2, 0x25, 0xe0, 0x3d, 0xb5, 0xd2, 0x09, 0xbe, 0x49, 0x3c, 0xc8, 0xb9,
+ 0x29, 0x71, 0x66, 0x3d, 0xa8, 0xba, 0xf3, 0x3d, 0x56, 0x37, 0x01, 0xbe,
+ 0xf4, 0xae, 0x2a, 0xbd, 0x2c, 0xfd, 0x84, 0xbe, 0xcd, 0x58, 0x0a, 0x3e,
+ 0x6d, 0x50, 0x45, 0xbe, 0xe4, 0x55, 0x84, 0x3c, 0x82, 0x09, 0x21, 0xbe,
+ 0xae, 0x8b, 0x43, 0x3e, 0x80, 0xde, 0x09, 0xbe, 0x37, 0x62, 0x60, 0x3d,
+ 0x7c, 0x84, 0x15, 0xbe, 0x1e, 0x64, 0xa2, 0xbd, 0x1b, 0xca, 0x28, 0xbe,
+ 0xa5, 0x04, 0xc9, 0x3d, 0x40, 0x85, 0x1f, 0xbd, 0x0f, 0x96, 0x0e, 0x3d,
+ 0xcb, 0xfd, 0x07, 0xbe, 0xcd, 0x95, 0x94, 0x3c, 0x4c, 0xaa, 0x61, 0xbd,
+ 0x33, 0x6d, 0x55, 0x3d, 0x60, 0x01, 0x95, 0xbd, 0xe0, 0x12, 0x85, 0xbe,
+ 0x1b, 0x72, 0x3e, 0x3d, 0x2f, 0x4a, 0xb8, 0x3d, 0xd9, 0x84, 0x83, 0x3d,
+ 0x5f, 0xeb, 0xb5, 0x3c, 0x4f, 0x19, 0xb4, 0xbd, 0x2d, 0xf2, 0x87, 0xbd,
+ 0x56, 0x8b, 0x3e, 0xbd, 0x28, 0x25, 0xe4, 0xbd, 0xdc, 0x7d, 0x80, 0xbd,
+ 0x0b, 0x1a, 0x09, 0x3e, 0x89, 0xd8, 0x1a, 0x3e, 0x48, 0x0d, 0x60, 0x3e,
+ 0x87, 0x92, 0x93, 0xbc, 0x9e, 0x2f, 0x2e, 0xbe, 0xcb, 0xf3, 0x2f, 0xbe,
+ 0x48, 0x2d, 0x1b, 0x3e, 0x9f, 0xcb, 0x4f, 0x3e, 0x31, 0x75, 0x87, 0x3c,
+ 0xb7, 0x03, 0x83, 0xbb, 0x60, 0x28, 0x83, 0x3d, 0x5c, 0x7b, 0x28, 0x3d,
+ 0xe7, 0xf1, 0x3d, 0x3e, 0x9c, 0x69, 0x3d, 0x3e, 0x45, 0x20, 0x1e, 0x3e,
+ 0x78, 0xd5, 0x4b, 0x3e, 0xf7, 0xca, 0x8e, 0x3e, 0x33, 0x0d, 0x15, 0x3d,
+ 0xd3, 0x88, 0x94, 0x3d, 0x46, 0xe1, 0x01, 0xbd, 0x16, 0x48, 0xb7, 0x3b,
+ 0xa8, 0x28, 0x03, 0xbe, 0xf8, 0xd5, 0x5c, 0x3e, 0x99, 0xd3, 0xc8, 0x3d,
+ 0x7b, 0x28, 0x03, 0xbe, 0x94, 0xd0, 0x64, 0x3e, 0xe2, 0x37, 0x4c, 0xbe,
+ 0x0c, 0x53, 0xac, 0x3d, 0x71, 0x0c, 0xd3, 0xbd, 0xec, 0x75, 0x09, 0xbe,
+ 0x54, 0x1f, 0x5d, 0x3e, 0x93, 0xdf, 0x76, 0xbc, 0x05, 0x51, 0xe0, 0xbd,
+ 0x0c, 0xb0, 0x98, 0x3d, 0x4a, 0x11, 0x70, 0xbd, 0xb2, 0xe3, 0x89, 0x3d,
+ 0x13, 0xeb, 0xb7, 0x3d, 0x6f, 0x8a, 0x14, 0x3d, 0x67, 0x67, 0xc4, 0x3b,
+ 0xd6, 0x28, 0xa8, 0xbc, 0x4f, 0x29, 0x14, 0xbe, 0x66, 0x5c, 0x47, 0x3c,
+ 0x0c, 0x9d, 0xcc, 0x3d, 0x38, 0x65, 0x86, 0xbb, 0xb1, 0xbb, 0x1c, 0x3d,
+ 0x3c, 0xf6, 0xf1, 0xbd, 0x1f, 0x47, 0x82, 0x3b, 0x09, 0xa5, 0x49, 0x3e,
+ 0x58, 0xd6, 0x1c, 0xbe, 0x13, 0x7a, 0x93, 0x3d, 0xbd, 0x4c, 0xf5, 0xbd,
+ 0x9e, 0x7d, 0xa0, 0x3d, 0x1e, 0x55, 0x30, 0x3d, 0x92, 0x18, 0xd5, 0x3d,
+ 0xff, 0xcd, 0x9d, 0xbd, 0x89, 0x4a, 0x2e, 0xbd, 0xc5, 0x86, 0x49, 0x3c,
+ 0x7d, 0x2c, 0xe5, 0x3c, 0xc6, 0xa9, 0x8f, 0x3d, 0x30, 0xd6, 0xea, 0x3d,
+ 0x63, 0xf4, 0xab, 0x3d, 0x7f, 0x30, 0x35, 0x3d, 0x63, 0x62, 0x88, 0xbc,
+ 0x06, 0x80, 0x3d, 0x3d, 0x64, 0x3f, 0xe1, 0x3d, 0xdf, 0x5e, 0x0c, 0xbe,
+ 0x8c, 0xf9, 0xe4, 0xbd, 0x92, 0x77, 0xc3, 0xbd, 0xea, 0x29, 0x7f, 0xbe,
+ 0x70, 0x87, 0x29, 0xbe, 0x2b, 0x5b, 0x4a, 0xbd, 0x34, 0x9e, 0x56, 0xbe,
+ 0x9a, 0x37, 0x89, 0xbd, 0x79, 0xb3, 0x24, 0xbe, 0xce, 0x1b, 0x2e, 0xbe,
+ 0x18, 0xce, 0xd4, 0xbd, 0xc9, 0x9e, 0x15, 0xbe, 0xec, 0xf7, 0x8c, 0x3e,
+ 0x65, 0xa4, 0xbc, 0xbd, 0xf5, 0x64, 0x22, 0xbe, 0x42, 0x6a, 0x1c, 0x3e,
+ 0xea, 0x20, 0x18, 0x3e, 0x38, 0xa8, 0xb3, 0xbe, 0x7b, 0x13, 0xff, 0xbc,
+ 0xcd, 0x5d, 0x14, 0x3d, 0x2c, 0x83, 0x2c, 0xbd, 0x71, 0x1f, 0x13, 0xbe,
+ 0x1a, 0x06, 0xed, 0x3d, 0x52, 0xc3, 0x80, 0xbd, 0x54, 0xdb, 0x41, 0xbd,
+ 0xfe, 0x2a, 0x59, 0xbe, 0xc4, 0xc6, 0x40, 0x3d, 0x4a, 0x3c, 0xce, 0x3c,
+ 0x73, 0x72, 0x1b, 0x3e, 0x14, 0x9c, 0x00, 0xbe, 0xef, 0xf0, 0x40, 0x3b,
+ 0xf3, 0xe4, 0x17, 0x3e, 0x5b, 0x45, 0xa9, 0x3c, 0x5d, 0xaf, 0x54, 0xbd,
+ 0xa8, 0x08, 0xd2, 0xbd, 0x01, 0x09, 0x86, 0xbd, 0x72, 0x29, 0x72, 0xbc,
+ 0x75, 0x30, 0xfd, 0x3b, 0xf1, 0xca, 0xcd, 0xbd, 0xb8, 0x14, 0xeb, 0x3d,
+ 0x26, 0x8c, 0xd3, 0xbd, 0x30, 0xe5, 0x7c, 0xbc, 0xd4, 0x0e, 0x93, 0xbd,
+ 0x86, 0x7a, 0xfe, 0xbc, 0x7c, 0x31, 0x2c, 0xbe, 0x95, 0x3f, 0xe5, 0x3d,
+ 0x28, 0x0f, 0x2a, 0x3d, 0x8a, 0xb7, 0xb5, 0x3d, 0xf9, 0x96, 0xba, 0xbd,
+ 0xa3, 0x06, 0x80, 0x3d, 0x08, 0x8e, 0x18, 0x3d, 0x03, 0x7e, 0xb9, 0x3d,
+ 0x34, 0x7e, 0x6e, 0x3d, 0x5a, 0xd6, 0x22, 0xbe, 0x66, 0x2f, 0x46, 0xbe,
+ 0x03, 0x65, 0xce, 0xbd, 0x3f, 0xb8, 0x2f, 0xbe, 0x60, 0xd3, 0x03, 0x3d,
+ 0x81, 0x75, 0xe2, 0xbd, 0x25, 0x2c, 0xe6, 0x3d, 0x08, 0x15, 0x1f, 0xbc,
+ 0xc0, 0x13, 0x79, 0xbc, 0x49, 0xbd, 0xbb, 0xbc, 0x02, 0x10, 0xbf, 0xbc,
+ 0xaf, 0x78, 0xc5, 0x3d, 0xc3, 0xab, 0x40, 0xbc, 0x5e, 0xb1, 0x5a, 0xbd,
+ 0x82, 0x97, 0x68, 0x3c, 0xd3, 0xf1, 0x4e, 0x3d, 0x39, 0x84, 0x6e, 0xbc,
+ 0xa1, 0xf5, 0x4d, 0xbe, 0xc2, 0x7a, 0xd9, 0x3d, 0x1c, 0x0e, 0x01, 0xbe,
+ 0x12, 0x88, 0x0e, 0xbe, 0x5d, 0xd8, 0x44, 0x3d, 0xe1, 0x80, 0x97, 0x3d,
+ 0xff, 0xee, 0x28, 0xbe, 0x4a, 0x91, 0xfa, 0x3d, 0xd2, 0xef, 0x25, 0x3c,
+ 0xd1, 0xda, 0x3b, 0xbd, 0x2b, 0x12, 0x80, 0xbd, 0x00, 0x95, 0x34, 0xbe,
+ 0x21, 0x42, 0x16, 0x3e, 0xbd, 0x5b, 0x55, 0x3d, 0x4a, 0x7c, 0x28, 0xbe,
+ 0x0d, 0xdc, 0x89, 0xbd, 0xd7, 0x43, 0xd8, 0xbd, 0x3f, 0x88, 0xd7, 0xbd,
+ 0xd2, 0xe1, 0x2e, 0xbe, 0xf5, 0x91, 0xd1, 0x3d, 0xfe, 0xc2, 0x1d, 0x3e,
+ 0xe7, 0x04, 0x9b, 0x3c, 0xef, 0x40, 0x8e, 0xbd, 0x34, 0x14, 0x09, 0xbd,
+ 0xf2, 0x45, 0xc9, 0x3d, 0xb4, 0x13, 0x9a, 0x3c, 0xcc, 0x6c, 0xd8, 0xbd,
+ 0x85, 0x3b, 0xe4, 0xbd, 0x5b, 0x4c, 0xb8, 0x3d, 0x6c, 0x19, 0x58, 0x3d,
+ 0xe6, 0xf8, 0x66, 0xbc, 0x30, 0xfc, 0x20, 0xbe, 0x95, 0x7a, 0x70, 0x3a,
+ 0x61, 0x34, 0x09, 0x3e, 0xe5, 0xba, 0x8e, 0x3d, 0x3a, 0xab, 0xe1, 0xbd,
+ 0xdd, 0x5f, 0xdc, 0xbc, 0xf1, 0xac, 0xae, 0x3d, 0xe6, 0x97, 0x87, 0x3d,
+ 0xe1, 0x74, 0x20, 0xbe, 0xca, 0xfd, 0x0f, 0xbe, 0x05, 0xe9, 0xc0, 0x3c,
+ 0xca, 0x19, 0xc3, 0xbd, 0x4c, 0xba, 0x1c, 0xbd, 0xcf, 0xe5, 0x7b, 0xbd,
+ 0xf4, 0x97, 0x8b, 0x3d, 0xbf, 0x9e, 0x85, 0x3d, 0xe5, 0xbf, 0xc3, 0xbd,
+ 0x3a, 0xf1, 0xff, 0xbd, 0xeb, 0x64, 0x0d, 0xbe, 0xd3, 0x0b, 0x1e, 0xbc,
+ 0xa6, 0xd8, 0x19, 0x3e, 0x1e, 0x2a, 0xee, 0x3b, 0x48, 0x91, 0x31, 0xbc,
+ 0xbd, 0x82, 0x24, 0x3e, 0x62, 0x93, 0x75, 0x3b, 0xb4, 0x0b, 0x6a, 0xbe,
+ 0x51, 0x7c, 0x0e, 0xbe, 0x31, 0x27, 0x39, 0xbe, 0x80, 0x5e, 0x28, 0x3c,
+ 0x50, 0x9b, 0x04, 0x3d, 0x8f, 0xbf, 0xf8, 0xbc, 0x4e, 0x36, 0x13, 0xbe,
+ 0xea, 0x1b, 0xef, 0x3d, 0x97, 0x90, 0x47, 0xbe, 0xfa, 0x51, 0x3c, 0xbe,
+ 0x2a, 0x02, 0x32, 0xbe, 0x41, 0xc9, 0x2d, 0xbd, 0x7e, 0xbc, 0x32, 0x3d,
+ 0xdb, 0x8b, 0xe8, 0x3c, 0xff, 0x5f, 0xb5, 0xbe, 0x0a, 0x1d, 0x37, 0xbd,
+ 0x98, 0x21, 0xfc, 0xbd, 0x1d, 0x31, 0xb7, 0xbc, 0x6c, 0x87, 0x48, 0xbd,
+ 0x04, 0x40, 0x72, 0xbd, 0x38, 0xe8, 0x56, 0x3c, 0xdf, 0xe2, 0x0e, 0x3d,
+ 0x73, 0x7f, 0xfe, 0xbd, 0xfe, 0xb9, 0x18, 0x3d, 0x97, 0x9d, 0x7c, 0xbd,
+ 0x04, 0xca, 0xdb, 0xbe, 0x00, 0xce, 0x90, 0xbd, 0x27, 0x10, 0xcd, 0xbd,
+ 0x37, 0x94, 0x9a, 0xbd, 0x1e, 0x21, 0xfb, 0xbd, 0xae, 0x80, 0x12, 0xbe,
+ 0x07, 0xcc, 0x93, 0xbd, 0x73, 0xe4, 0xb6, 0x3d, 0x2e, 0x72, 0xe2, 0x3d,
+ 0x03, 0xe1, 0x9e, 0x3d, 0xb0, 0x44, 0x7c, 0xbd, 0xbf, 0xa5, 0xa2, 0x3d,
+ 0x04, 0x21, 0x24, 0xbe, 0xa7, 0xf5, 0x61, 0x3d, 0xdb, 0x91, 0x9e, 0x3c,
+ 0xd3, 0xc3, 0x4a, 0xbe, 0x22, 0x77, 0x70, 0x3d, 0xe0, 0xd8, 0x8d, 0xbe,
+ 0xff, 0xfc, 0x23, 0xbe, 0xd9, 0xf9, 0x3e, 0x3c, 0x21, 0x3b, 0xdb, 0x3d,
+ 0xb3, 0xda, 0x34, 0x3d, 0x4c, 0xd0, 0x05, 0xbe, 0x1f, 0x35, 0x06, 0x3d,
+ 0xde, 0x98, 0x5f, 0x3d, 0x13, 0x14, 0xee, 0xbc, 0xb7, 0xf9, 0x91, 0xbd,
+ 0x25, 0xcf, 0xd7, 0x3d, 0xf2, 0x62, 0x6a, 0x3c, 0xdf, 0x27, 0x92, 0x3d,
+ 0x62, 0x61, 0x5d, 0xbe, 0x8c, 0xce, 0xa0, 0xbe, 0x5d, 0x5c, 0x0c, 0xbe,
+ 0xa1, 0x43, 0x75, 0xbd, 0x90, 0x88, 0xe7, 0xbc, 0xd2, 0x23, 0xf7, 0xbd,
+ 0x16, 0x0b, 0x56, 0xbd, 0xd7, 0xf1, 0xe0, 0xbc, 0xee, 0xb8, 0x8f, 0x3d,
+ 0x98, 0xf0, 0xea, 0xbd, 0x8a, 0xc8, 0xe1, 0x3c, 0xfd, 0x14, 0x25, 0xbe,
+ 0x67, 0xa7, 0xce, 0x3d, 0x57, 0x2a, 0x8a, 0xba, 0x37, 0x5c, 0x91, 0xbd,
+ 0xca, 0x95, 0x07, 0xbe, 0xb6, 0x70, 0x7b, 0xbd, 0x61, 0xca, 0xb3, 0x3c,
+ 0x46, 0x0d, 0x9f, 0xbd, 0xaa, 0x09, 0x3c, 0x3e, 0xc2, 0x2f, 0x55, 0xbd,
+ 0x76, 0xeb, 0x6c, 0xbd, 0xf6, 0x26, 0x2e, 0xbe, 0x0c, 0x62, 0xc3, 0xbd,
+ 0x50, 0x36, 0x6b, 0x3d, 0x78, 0x5b, 0x33, 0x3c, 0xbf, 0x0d, 0x86, 0x3d,
+ 0x7c, 0x08, 0x0e, 0xbe, 0xb3, 0x54, 0x18, 0xbe, 0x96, 0xdf, 0x2f, 0xbe,
+ 0x39, 0x63, 0xee, 0xbd, 0x1f, 0x61, 0x18, 0xbd, 0x33, 0x85, 0x2b, 0xbe,
+ 0x25, 0x98, 0xc5, 0xbc, 0xee, 0xab, 0xe1, 0xbd, 0xf3, 0x41, 0x36, 0xbe,
+ 0xbd, 0x5d, 0x62, 0xbc, 0xe8, 0xc7, 0xdc, 0x3b, 0x1a, 0xab, 0x1b, 0xbe,
+ 0x78, 0x05, 0x19, 0x3e, 0xba, 0x2d, 0xd1, 0xbd, 0xf9, 0x92, 0xda, 0xbd,
+ 0x7b, 0xbf, 0xee, 0x3d, 0x90, 0x3e, 0xe0, 0x3d, 0x3e, 0x0d, 0xa2, 0x3d,
+ 0x37, 0x06, 0x05, 0xbd, 0x77, 0xde, 0x18, 0x3e, 0x18, 0xeb, 0x19, 0x3e,
+ 0x41, 0xc6, 0xe0, 0x3c, 0x10, 0x04, 0x6e, 0xbe, 0x0b, 0x30, 0x1c, 0xbe,
+ 0xfd, 0x36, 0x1d, 0x3d, 0xad, 0xaa, 0x8a, 0x3b, 0x03, 0x0b, 0x01, 0xbe,
+ 0xda, 0x41, 0x17, 0xbe, 0xb2, 0xa9, 0x3c, 0x3e, 0x7a, 0xa7, 0xcb, 0xbb,
+ 0x39, 0xc2, 0xfb, 0x3c, 0xc4, 0xa3, 0x40, 0x3c, 0x68, 0x13, 0xc5, 0x3d,
+ 0x44, 0x4f, 0x0f, 0xbe, 0x89, 0x65, 0xd7, 0xbd, 0x70, 0xa7, 0x71, 0xbe,
+ 0x63, 0xce, 0xd9, 0x3d, 0x6f, 0xc6, 0xe9, 0xbd, 0x41, 0x2f, 0xc5, 0x3d,
+ 0x90, 0xc9, 0x34, 0xbe, 0x53, 0x72, 0x0a, 0x3e, 0x08, 0xc5, 0x89, 0xbd,
+ 0x1b, 0xe5, 0x33, 0xbe, 0xdf, 0x9a, 0xf0, 0x3d, 0x1b, 0xdc, 0xa8, 0x3c,
+ 0xca, 0x66, 0xbb, 0x3d, 0x7b, 0x50, 0x37, 0xbe, 0xec, 0xf1, 0x70, 0xbe,
+ 0x22, 0xc8, 0x56, 0x3d, 0x84, 0x2c, 0x21, 0x3e, 0x56, 0x0f, 0xc4, 0x3d,
+ 0x61, 0x60, 0x06, 0x3e, 0xa7, 0xaa, 0xd6, 0x3c, 0xb6, 0xa2, 0x33, 0x3c,
+ 0x34, 0x60, 0x6b, 0x3d, 0xd0, 0x51, 0x93, 0xbd, 0x91, 0x41, 0x94, 0x3d,
+ 0xaa, 0xd2, 0x74, 0x3d, 0x58, 0x61, 0x43, 0xbd, 0xc6, 0x25, 0x20, 0x3d,
+ 0xf3, 0xa0, 0xef, 0x3d, 0x50, 0x16, 0xa1, 0x3c, 0x35, 0x62, 0x56, 0x3d,
+ 0x38, 0x38, 0xc0, 0x3d, 0x8b, 0xb4, 0x7a, 0xbd, 0xa3, 0x48, 0x2e, 0x3e,
+ 0x23, 0x05, 0xd3, 0xbd, 0xd2, 0x22, 0x1e, 0x3d, 0xe4, 0x07, 0x4d, 0x3e,
+ 0x06, 0x16, 0x9b, 0xbc, 0x01, 0xc9, 0x34, 0xbe, 0x27, 0xc5, 0xdc, 0xbc,
+ 0x4d, 0xc8, 0x6b, 0x3d, 0x3e, 0x36, 0xeb, 0xbd, 0x96, 0x2b, 0x56, 0xbe,
+ 0xe1, 0x54, 0x93, 0x3e, 0x77, 0x35, 0xae, 0xbd, 0x60, 0x6c, 0xe6, 0x3c,
+ 0xbc, 0x73, 0xe1, 0xbd, 0xe6, 0x04, 0x23, 0x3e, 0x32, 0x43, 0x82, 0xbd,
+ 0xa9, 0x24, 0xf1, 0x3c, 0x92, 0x46, 0xea, 0xbd, 0xa3, 0x60, 0x60, 0x3e,
+ 0xc8, 0x40, 0x0f, 0x3d, 0x74, 0xa5, 0x5b, 0xbe, 0x3b, 0x47, 0x08, 0xbe,
+ 0x5c, 0xac, 0x8d, 0xbc, 0xcd, 0xa4, 0xb1, 0xbd, 0xd8, 0x18, 0x43, 0xbd,
+ 0xc0, 0xcd, 0x0d, 0x3e, 0x6c, 0xb2, 0x31, 0xbe, 0xf0, 0x54, 0x80, 0xbe,
+ 0x4c, 0x49, 0xeb, 0x3d, 0x2f, 0xcf, 0x27, 0x3d, 0xfa, 0x9f, 0x90, 0x39,
+ 0xed, 0x39, 0x4b, 0xbc, 0x2f, 0x37, 0x1a, 0x3d, 0x52, 0xfc, 0x30, 0xbe,
+ 0xba, 0xea, 0x95, 0xbd, 0x50, 0x17, 0xb9, 0x3d, 0x04, 0x80, 0x14, 0x3e,
+ 0xf7, 0xd8, 0x31, 0x3c, 0x76, 0x7d, 0x64, 0x3e, 0xee, 0x0c, 0x28, 0xbe,
+ 0x10, 0x47, 0x2c, 0x3d, 0x2d, 0x80, 0x5e, 0xbd, 0x4b, 0x77, 0x49, 0xbd,
+ 0x91, 0xc0, 0x34, 0x3c, 0x9b, 0x35, 0x04, 0x3e, 0x84, 0x2e, 0xfa, 0xbd,
+ 0x05, 0xd6, 0xbf, 0xbd, 0x3b, 0x7d, 0x3c, 0xbe, 0x4f, 0x7f, 0x9f, 0x3a,
+ 0x85, 0xb5, 0x88, 0x3e, 0xf3, 0x5d, 0xb6, 0x3d, 0x62, 0x5b, 0xbe, 0x3c,
+ 0xa2, 0xec, 0x27, 0x3e, 0xac, 0x3f, 0x67, 0xbb, 0x95, 0x3c, 0xe2, 0x3b,
+ 0xde, 0xd3, 0xcd, 0x3d, 0x16, 0x7a, 0x18, 0x3e, 0x7f, 0x48, 0x84, 0x3d,
+ 0x49, 0x2b, 0xe9, 0x3e, 0x60, 0xd6, 0x47, 0x3e, 0x76, 0x37, 0x9a, 0x3a,
+ 0x5f, 0x29, 0xcb, 0xbb, 0xd2, 0x7b, 0x5e, 0x3e, 0xc1, 0xf3, 0x7e, 0x3d,
+ 0xdc, 0x1f, 0xc4, 0x3d, 0xad, 0xf4, 0x2a, 0x3e, 0x58, 0x84, 0x39, 0x3e,
+ 0x3e, 0x6f, 0x44, 0x3e, 0xb8, 0x95, 0x3e, 0x3d, 0x33, 0x87, 0x0d, 0xbd,
+ 0x53, 0x77, 0x17, 0xbd, 0xb3, 0x7d, 0x35, 0x3e, 0xcb, 0xaf, 0xba, 0xbd,
+ 0x02, 0x22, 0x68, 0xbe, 0xbd, 0x14, 0x88, 0xbc, 0x1a, 0x1a, 0x76, 0x3d,
+ 0x09, 0x00, 0x1d, 0xbe, 0x8b, 0xe3, 0x17, 0xbd, 0xfd, 0x89, 0x88, 0x3d,
+ 0x37, 0xfe, 0x1b, 0x3e, 0x02, 0xe0, 0xb3, 0x3d, 0xfa, 0x75, 0x97, 0x3d,
+ 0x78, 0x25, 0x4f, 0x3e, 0x77, 0x78, 0xcf, 0xbc, 0x5c, 0xe7, 0x31, 0xbd,
+ 0xf7, 0xac, 0x3f, 0xbe, 0x70, 0xcf, 0xb6, 0x3d, 0xb9, 0xa9, 0x10, 0x3e,
+ 0xcd, 0xf3, 0xf7, 0xbb, 0x66, 0xef, 0xda, 0x3d, 0x86, 0x11, 0x0e, 0x3e,
+ 0x2c, 0x08, 0xb2, 0x3d, 0x1a, 0x7d, 0x84, 0x3d, 0xc5, 0x51, 0x5a, 0x3e,
+ 0x47, 0x06, 0x47, 0x3d, 0x81, 0x31, 0x16, 0xbe, 0xbe, 0x75, 0x7f, 0xbe,
+ 0x22, 0xcf, 0x0d, 0xbe, 0x05, 0x3b, 0x19, 0x3e, 0x47, 0xc6, 0x67, 0x3e,
+ 0xd6, 0x79, 0x10, 0xbe, 0xa1, 0x1d, 0x04, 0x3d, 0xbd, 0x67, 0x51, 0xbe,
+ 0x32, 0xde, 0x59, 0xbd, 0x5b, 0xa4, 0x19, 0x3e, 0x79, 0x98, 0x34, 0xbe,
+ 0xee, 0xd6, 0x37, 0x3b, 0x2b, 0x04, 0x05, 0xbe, 0x68, 0xa9, 0x87, 0xbc,
+ 0x30, 0x69, 0xa2, 0xbd, 0x59, 0x86, 0x37, 0x3e, 0x3f, 0xee, 0x3e, 0xbe,
+ 0x1a, 0x4b, 0x8e, 0xbe, 0x21, 0x2f, 0x36, 0xbc, 0xac, 0x7c, 0xa6, 0xbd,
+ 0x36, 0x48, 0x5c, 0x3e, 0x94, 0xab, 0xda, 0x3d, 0x5c, 0xf8, 0xde, 0xbb,
+ 0x65, 0x81, 0x2c, 0x3e, 0x3f, 0xd1, 0x9f, 0xbd, 0x0c, 0x14, 0xb5, 0xbe,
+ 0x15, 0x8c, 0x16, 0x3d, 0x11, 0x20, 0x5d, 0x3e, 0x07, 0x6e, 0x4b, 0xbd,
+ 0x60, 0x4f, 0xb2, 0xbd, 0x93, 0x45, 0xfe, 0xbc, 0x95, 0xd1, 0x0a, 0x3d,
+ 0x77, 0x4d, 0xad, 0x3d, 0x60, 0xee, 0x17, 0x3e, 0x11, 0x4b, 0x9a, 0x3d,
+ 0xfd, 0xf2, 0x31, 0xbe, 0x48, 0x92, 0xba, 0xbd, 0xfa, 0xd2, 0x07, 0xbe,
+ 0xf5, 0x16, 0x83, 0x3c, 0x8e, 0x77, 0xa1, 0x3d, 0x3a, 0x0b, 0x28, 0xbd,
+ 0xb2, 0x16, 0x0c, 0xbd, 0xf9, 0x6a, 0x49, 0xbd, 0x5b, 0x42, 0x2f, 0xbe,
+ 0xa4, 0xb1, 0x9a, 0x3c, 0xc9, 0x38, 0x2a, 0xbe, 0x7e, 0x42, 0x9a, 0x3c,
+ 0xe9, 0x3f, 0x2a, 0x3e, 0xc3, 0xed, 0xb9, 0xbc, 0x25, 0x05, 0x52, 0x3e,
+ 0x15, 0xd6, 0xb7, 0xbd, 0x9d, 0x85, 0xeb, 0x3d, 0x60, 0xab, 0xde, 0x3d,
+ 0xff, 0x21, 0x12, 0x3e, 0xf1, 0x36, 0x93, 0xbd, 0xc9, 0xb6, 0x80, 0x3e,
+ 0x64, 0xc1, 0x7a, 0x3d, 0x11, 0x66, 0xae, 0x3d, 0xd2, 0xad, 0xbd, 0x3e,
+ 0x89, 0x21, 0x47, 0x3e, 0x64, 0x26, 0x04, 0xbe, 0x39, 0x19, 0xe1, 0xbd,
+ 0x38, 0x5f, 0x11, 0xbd, 0xe0, 0x18, 0xff, 0xbc, 0x74, 0x3d, 0x1d, 0xbd,
+ 0xc5, 0x41, 0xac, 0xbc, 0xea, 0xd9, 0xba, 0x3d, 0x8c, 0x60, 0x79, 0xbe,
+ 0xa0, 0xfc, 0x49, 0x3e, 0x0a, 0x39, 0x23, 0x3d, 0x7f, 0x93, 0x3a, 0xbe,
+ 0x4e, 0x47, 0xab, 0xbc, 0x05, 0xaa, 0x1f, 0x3e, 0x44, 0x82, 0x45, 0xbd,
+ 0x5d, 0x88, 0x34, 0xbd, 0xa7, 0x14, 0x2e, 0x3a, 0x8b, 0x76, 0x23, 0x3e,
+ 0x78, 0x77, 0xe8, 0xbc, 0xd3, 0xb1, 0x2a, 0xbd, 0x64, 0x75, 0x31, 0x3c,
+ 0x23, 0xe8, 0x2b, 0x3d, 0xbc, 0xdf, 0xc8, 0x3d, 0xa5, 0xbd, 0x31, 0x3e,
+ 0xcf, 0xf7, 0x1c, 0xbe, 0x1e, 0xdb, 0x04, 0x3d, 0x02, 0x67, 0x0b, 0x3e,
+ 0xfb, 0x32, 0x3e, 0x3e, 0xe5, 0x5e, 0xb4, 0x3d, 0x1f, 0x07, 0xcc, 0x3d,
+ 0xdf, 0x4f, 0x89, 0x3d, 0x52, 0xce, 0xff, 0x3d, 0xcc, 0x61, 0xcf, 0xbd,
+ 0x06, 0x98, 0x20, 0x3d, 0x39, 0x8f, 0x7e, 0xbd, 0x15, 0x8d, 0xa2, 0xbc,
+ 0x40, 0xec, 0x5c, 0x3d, 0xf9, 0x0b, 0x92, 0x3d, 0x9f, 0x6b, 0x29, 0xbe,
+ 0x34, 0x4d, 0xbd, 0xbd, 0xf2, 0xe5, 0x2b, 0x3e, 0x85, 0xfc, 0x00, 0x3c,
+ 0x69, 0xf7, 0x3c, 0x3d, 0x96, 0x3d, 0xde, 0x3c, 0x20, 0x5d, 0x2a, 0x3e,
+ 0x22, 0x67, 0x8c, 0xbd, 0xe7, 0xf6, 0x96, 0x3e, 0xb2, 0x6f, 0xf5, 0xbd,
+ 0x89, 0xa6, 0x7c, 0x3e, 0x5c, 0xb6, 0x18, 0x3d, 0xe1, 0x1d, 0xc0, 0xbd,
+ 0x0a, 0x7e, 0x2c, 0xbe, 0x4a, 0x83, 0x49, 0x3d, 0x96, 0x7f, 0x13, 0xbe,
+ 0x99, 0xf4, 0xbd, 0x3b, 0x88, 0x4f, 0xe4, 0x3d, 0x25, 0x33, 0xa2, 0x3c,
+ 0x7a, 0x0d, 0x19, 0xbd, 0x1b, 0xb5, 0x1d, 0x3e, 0x2e, 0xd6, 0x39, 0xbd,
+ 0xef, 0x30, 0x45, 0x3b, 0x8c, 0x9b, 0xe9, 0x3d, 0xd6, 0x2a, 0x67, 0x3c,
+ 0x44, 0x5b, 0x09, 0xbc, 0x81, 0xcb, 0x14, 0xbe, 0x6a, 0x03, 0x13, 0xbe,
+ 0x54, 0xa9, 0x8e, 0xbd, 0x31, 0x9f, 0x1a, 0xbe, 0x9c, 0x33, 0x05, 0xbe,
+ 0xca, 0xf1, 0x81, 0xbd, 0x5a, 0x88, 0x78, 0xbd, 0xa9, 0x9c, 0x8d, 0xbd,
+ 0xc5, 0x1b, 0xbb, 0x3d, 0x7a, 0x97, 0x31, 0x3e, 0x60, 0x9d, 0xb8, 0xbc,
+ 0x9f, 0x4f, 0x7f, 0x3d, 0x03, 0x5e, 0x01, 0xbe, 0x3e, 0xf2, 0x9c, 0xbd,
+ 0x4f, 0xcd, 0xd4, 0xbd, 0xe3, 0xdb, 0xb3, 0x3d, 0xf5, 0x04, 0xd7, 0x3d,
+ 0x09, 0xc4, 0x17, 0x3b, 0xc9, 0x18, 0x27, 0x3e, 0xa1, 0x1c, 0xcf, 0x3c,
+ 0x90, 0x54, 0x5c, 0xbd, 0xa5, 0xd7, 0xf8, 0x3d, 0x59, 0x73, 0x96, 0xbe,
+ 0xd8, 0x74, 0xdb, 0xbd, 0xce, 0x1b, 0xed, 0x3d, 0xb4, 0x52, 0x14, 0xbe,
+ 0xe5, 0x6d, 0xc9, 0xbc, 0x8e, 0x7e, 0xc1, 0x3d, 0x00, 0x8b, 0x91, 0x3c,
+ 0x8e, 0xcc, 0xba, 0x3a, 0xea, 0xb3, 0xd0, 0xbb, 0xdd, 0x2a, 0x61, 0xbb,
+ 0xed, 0x0a, 0x94, 0x3d, 0xab, 0x74, 0x1d, 0x3e, 0x85, 0x4f, 0x18, 0xbe,
+ 0xec, 0x10, 0xfc, 0xbd, 0x82, 0x1f, 0x2b, 0xbe, 0xe0, 0x04, 0x04, 0x3e,
+ 0xa2, 0xee, 0xaf, 0xbd, 0x6a, 0xd5, 0x28, 0xbd, 0xce, 0x01, 0x15, 0xbe,
+ 0x01, 0x0c, 0x68, 0x3a, 0xd1, 0x1d, 0x20, 0xbe, 0xbc, 0x86, 0x15, 0xbd,
+ 0x8b, 0x16, 0xa2, 0x3d, 0xfe, 0xbb, 0x3a, 0xbe, 0xbd, 0x0d, 0xf0, 0xbd,
+ 0x40, 0x03, 0x64, 0xbd, 0x75, 0x04, 0x37, 0xbe, 0xd6, 0x94, 0x37, 0xbe,
+ 0x37, 0x36, 0xd6, 0xbc, 0x40, 0x6a, 0x26, 0x3d, 0x9a, 0xa5, 0x05, 0x3e,
+ 0x17, 0x14, 0x43, 0xbd, 0x93, 0x2c, 0x3f, 0xbc, 0xac, 0x5f, 0x86, 0x3d,
+ 0xb7, 0x10, 0x7c, 0xbc, 0x99, 0xdf, 0x69, 0x3d, 0x98, 0xb0, 0xd0, 0x3c,
+ 0x51, 0x6d, 0x9b, 0xbd, 0x83, 0x51, 0x65, 0xbd, 0xae, 0xf3, 0xf1, 0xbd,
+ 0xee, 0x91, 0x0a, 0x3d, 0x0d, 0xa0, 0x00, 0xbd, 0x98, 0x51, 0xc9, 0x3d,
+ 0xbb, 0x0a, 0xb6, 0xbd, 0x7d, 0x99, 0x1d, 0x3d, 0x74, 0x9a, 0x50, 0x3d,
+ 0xcf, 0x3a, 0xdb, 0xbd, 0x79, 0x15, 0x0f, 0xbd, 0x7b, 0x26, 0x8d, 0xbd,
+ 0x25, 0xb9, 0x2f, 0x3d, 0xba, 0xa1, 0xcf, 0x3d, 0x2f, 0xe4, 0x30, 0x3d,
+ 0xd9, 0x68, 0x8c, 0x3d, 0x5f, 0xdb, 0xe5, 0xbd, 0x61, 0x54, 0x0a, 0xbd,
+ 0x55, 0x0d, 0x06, 0xbe, 0x84, 0x5e, 0xaf, 0xbc, 0xc7, 0x93, 0xc8, 0x3b,
+ 0x27, 0xbd, 0x96, 0xbc, 0xef, 0xd0, 0xdd, 0xbc, 0x4d, 0x46, 0xe4, 0x3d,
+ 0x7d, 0x39, 0xbd, 0xbd, 0x3a, 0x76, 0x64, 0x3c, 0x73, 0x97, 0xb7, 0xbd,
+ 0xc8, 0x8d, 0x21, 0xbe, 0x0b, 0x96, 0xc6, 0x3d, 0x6f, 0xae, 0x7d, 0x3d,
+ 0x55, 0x59, 0xca, 0xbd, 0x41, 0x50, 0x94, 0xbc, 0x03, 0x10, 0xe9, 0xbc,
+ 0x58, 0x22, 0xb0, 0x3d, 0xee, 0xe6, 0xaa, 0xbd, 0x2e, 0xae, 0x28, 0x3e,
+ 0xe4, 0x9d, 0xef, 0xbd, 0x6c, 0x3f, 0xcf, 0x3d, 0xca, 0xbe, 0xf9, 0xbc,
+ 0x19, 0x28, 0x30, 0xbe, 0xaa, 0x1e, 0x08, 0xbc, 0x3a, 0x7c, 0xd0, 0xbd,
+ 0xda, 0xc5, 0x89, 0xbd, 0x0e, 0x81, 0xfb, 0xbd, 0xac, 0xe0, 0xf6, 0xbd,
+ 0x72, 0x6d, 0xce, 0xbd, 0xf2, 0x79, 0x8d, 0xbe, 0x3d, 0xfa, 0x20, 0xbd,
+ 0xef, 0x5e, 0x31, 0xbd, 0x7f, 0x8f, 0xa0, 0x3d, 0x76, 0x88, 0x98, 0x3d,
+ 0xd6, 0x18, 0x53, 0xbe, 0x54, 0x3c, 0x0f, 0xbe, 0x04, 0x21, 0x2c, 0xbe,
+ 0x4c, 0xf0, 0xea, 0x3d, 0x8a, 0x27, 0x8d, 0x3c, 0xde, 0x08, 0xf7, 0xbd,
+ 0xcc, 0x64, 0xaa, 0x3d, 0x41, 0x19, 0x05, 0x3e, 0xd1, 0xef, 0xf2, 0x3d,
+ 0x04, 0xf1, 0x67, 0xbe, 0xeb, 0xac, 0x84, 0x3d, 0x8f, 0x25, 0x3a, 0x3d,
+ 0x1e, 0x3b, 0xe3, 0xbd, 0x76, 0xbe, 0xef, 0x3d, 0x9f, 0x29, 0xd1, 0xbd,
+ 0xe9, 0x5b, 0x50, 0xbe, 0xb8, 0xd5, 0x8e, 0xbd, 0xfb, 0x97, 0xb6, 0x3d,
+ 0x40, 0xa8, 0x1e, 0xbc, 0x4b, 0x2b, 0x8a, 0xbd, 0xf4, 0x11, 0x03, 0x3d,
+ 0xdd, 0x3f, 0x38, 0x3d, 0x56, 0xf8, 0xe5, 0xbd, 0x5b, 0x02, 0x4f, 0xbe,
+ 0x65, 0xcb, 0x98, 0xbc, 0xbc, 0x0f, 0xf7, 0xbd, 0x12, 0x10, 0xcf, 0xbd,
+ 0x0f, 0x01, 0x10, 0xbd, 0x3f, 0x7f, 0x82, 0x3e, 0x4d, 0x4a, 0xde, 0x3d,
+ 0xef, 0x9e, 0xb4, 0xbd, 0xa5, 0xb6, 0x04, 0x3e, 0xfe, 0x8e, 0xa0, 0xbc,
+ 0xb3, 0x32, 0x24, 0xbe, 0x3d, 0x1e, 0xfc, 0xbd, 0x11, 0x44, 0xba, 0xbd,
+ 0xa8, 0x73, 0x5f, 0x3d, 0x89, 0x3d, 0x10, 0x3c, 0x01, 0x87, 0xe6, 0x3d,
+ 0xcb, 0xbd, 0x96, 0x3d, 0xee, 0xc3, 0x11, 0xbe, 0x8e, 0x3f, 0xea, 0x3d,
+ 0xcd, 0xe1, 0x83, 0x3e, 0x2f, 0x7a, 0x76, 0xbd, 0x94, 0x3c, 0xc3, 0x3c,
+ 0x52, 0x39, 0x40, 0x3e, 0xb1, 0xd5, 0x04, 0xbe, 0xf6, 0x02, 0x4a, 0xbd,
+ 0x7a, 0xad, 0x3a, 0x3d, 0x23, 0xa6, 0x55, 0xbe, 0xc0, 0xa5, 0x82, 0x3d,
+ 0x03, 0x54, 0x40, 0xbe, 0x40, 0xda, 0xf4, 0x3c, 0xc8, 0x25, 0x31, 0xbe,
+ 0x92, 0xed, 0x79, 0xbd, 0x1c, 0xe7, 0xe3, 0xbd, 0x85, 0x7a, 0x44, 0x3e,
+ 0xb8, 0x70, 0xec, 0x3d, 0x2e, 0xc3, 0x00, 0xbe, 0xea, 0xa1, 0x31, 0xbe,
+ 0xd5, 0xd5, 0x35, 0x3e, 0xf5, 0x4b, 0x8f, 0x3c, 0x42, 0x4c, 0x20, 0xbe,
+ 0x13, 0x0e, 0x9e, 0x3d, 0x73, 0xd1, 0x0d, 0x3d, 0x7f, 0x1d, 0xfe, 0x3d,
+ 0xe0, 0xf4, 0x94, 0xbc, 0x52, 0xc3, 0x13, 0xbe, 0x85, 0x8b, 0xa1, 0xbd,
+ 0x68, 0xd6, 0xc5, 0xbd, 0x7c, 0x54, 0x99, 0xbc, 0xbe, 0xfc, 0x89, 0xbc,
+ 0x02, 0x80, 0x22, 0x3e, 0xc3, 0x6b, 0x65, 0x3e, 0x08, 0xc6, 0x33, 0xbc,
+ 0x92, 0xbb, 0xa8, 0xbd, 0x27, 0x13, 0x37, 0xbe, 0x8d, 0x46, 0xe3, 0x3d,
+ 0x1b, 0x2c, 0xe2, 0x3d, 0x37, 0x80, 0xc7, 0xbd, 0x4f, 0x15, 0x82, 0x3d,
+ 0x0a, 0x89, 0x66, 0xbe, 0x30, 0x55, 0x43, 0x3e, 0x9d, 0x82, 0x84, 0xbe,
+ 0x53, 0x20, 0xf9, 0x3d, 0x1b, 0xbb, 0xbd, 0x3d, 0xea, 0x67, 0x3e, 0x3e,
+ 0xe9, 0x0a, 0xf4, 0x3d, 0xff, 0x7a, 0x4b, 0xbe, 0x30, 0x56, 0xca, 0x3c,
+ 0xe3, 0x94, 0xdb, 0x3c, 0x44, 0x91, 0x80, 0x3e, 0x89, 0x28, 0x4e, 0x3e,
+ 0xa7, 0xc5, 0xd7, 0x3c, 0x52, 0x32, 0xbe, 0xbc, 0x47, 0x94, 0xea, 0xbd,
+ 0xf0, 0xc0, 0x3d, 0xbe, 0x86, 0xb3, 0x89, 0x3d, 0x91, 0xf6, 0xc7, 0x3c,
+ 0xdb, 0x74, 0x68, 0x3d, 0x71, 0xd0, 0xe6, 0x3d, 0x3c, 0x5d, 0x82, 0xbd,
+ 0x46, 0x74, 0xa2, 0xbe, 0xbf, 0x1c, 0x1f, 0x3d, 0xd6, 0xb1, 0x66, 0x3c,
+ 0xa0, 0xee, 0x77, 0x3d, 0xc2, 0xa4, 0x4b, 0x3e, 0xd6, 0x19, 0x9d, 0xbd,
+ 0x73, 0x18, 0x6a, 0xbc, 0xe2, 0x08, 0x5a, 0xbc, 0x63, 0x4b, 0x6c, 0xbe,
+ 0x8a, 0x2a, 0x54, 0xbe, 0xda, 0x22, 0xab, 0xbd, 0x69, 0x7a, 0x97, 0x3d,
+ 0xc4, 0xcf, 0x77, 0xbe, 0xe5, 0x8c, 0x6a, 0xbe, 0x01, 0x41, 0x7a, 0xbc,
+ 0x4e, 0x41, 0x59, 0xbe, 0x60, 0x88, 0x30, 0x3e, 0xea, 0x66, 0x5c, 0xbc,
+ 0x5e, 0x25, 0x1b, 0xbe, 0x42, 0x24, 0xd6, 0x3d, 0x5b, 0xbd, 0x9f, 0xbd,
+ 0x8a, 0xde, 0x33, 0xbe, 0xdb, 0x4d, 0x76, 0xbe, 0xe1, 0x15, 0x09, 0x3e,
+ 0x29, 0x5c, 0xaf, 0xbd, 0xb9, 0x25, 0xe4, 0xbc, 0x91, 0xd4, 0x93, 0x3d,
+ 0xeb, 0xa8, 0x3c, 0x3e, 0x77, 0xc7, 0xf2, 0xbd, 0x66, 0x3f, 0xf1, 0x3d,
+ 0x14, 0x90, 0x1f, 0xbd, 0xbc, 0xe5, 0xb9, 0x3d, 0x7c, 0x86, 0x0c, 0x3e,
+ 0x02, 0x9b, 0x89, 0xbd, 0xdb, 0xd7, 0xf3, 0x3d, 0x5d, 0x4e, 0x4a, 0xbd,
+ 0xa1, 0x37, 0xc2, 0xbc, 0x8e, 0x92, 0x21, 0xbe, 0x15, 0xb1, 0x8e, 0xbd,
+ 0x20, 0x7c, 0x06, 0xbe, 0x15, 0x12, 0x9e, 0xbd, 0x25, 0x4a, 0x2c, 0xbe,
+ 0x66, 0x61, 0x64, 0x3e, 0xeb, 0xc8, 0x3e, 0xbc, 0x5b, 0xb9, 0x03, 0xbe,
+ 0x47, 0x25, 0x48, 0x3e, 0xf0, 0x39, 0xc5, 0xbd, 0x9e, 0x2d, 0x12, 0xbd,
+ 0x0f, 0x25, 0x57, 0x3e, 0x76, 0xc2, 0x14, 0xbd, 0xec, 0x70, 0xd7, 0x3c,
+ 0xef, 0x98, 0x3c, 0x3e, 0xd6, 0x11, 0xc3, 0x3d, 0xd9, 0x13, 0xdd, 0xbd,
+ 0x38, 0xdf, 0xe1, 0xbd, 0xe7, 0x75, 0x51, 0x3d, 0x11, 0x62, 0xa1, 0x3d,
+ 0x57, 0x75, 0x31, 0x3d, 0xf2, 0xd0, 0xce, 0xbc, 0x7b, 0xe1, 0xa9, 0x3d,
+ 0xb1, 0xc1, 0x92, 0x3d, 0x51, 0xc8, 0x0e, 0xbe, 0xea, 0x1e, 0x0d, 0x3e,
+ 0x71, 0xd0, 0x08, 0x3e, 0x95, 0xd8, 0x7a, 0x3d, 0xa7, 0x64, 0x9a, 0xbd,
+ 0xfb, 0x2c, 0x1a, 0xbe, 0xdd, 0x7f, 0x4a, 0x3d, 0x69, 0x28, 0x31, 0x3e,
+ 0xea, 0x61, 0xd9, 0xbd, 0xe8, 0x9c, 0x46, 0xbd, 0x97, 0x2c, 0x79, 0xbd,
+ 0x88, 0x2b, 0xaf, 0x3d, 0x04, 0xf2, 0xdc, 0xbd, 0x77, 0x58, 0xc0, 0x3d,
+ 0xaa, 0x81, 0xf5, 0xbc, 0x0a, 0xc6, 0x0c, 0x3e, 0xa1, 0xca, 0x5a, 0x3d,
+ 0x9a, 0x78, 0x2f, 0x3e, 0xdd, 0xd0, 0xd5, 0xbd, 0x95, 0xc6, 0x14, 0xbe,
+ 0xbf, 0x71, 0x60, 0xbd, 0xf6, 0x6a, 0x37, 0xbe, 0x6d, 0x34, 0xcf, 0x3d,
+ 0x73, 0x09, 0x09, 0xbe, 0x97, 0x3d, 0xcd, 0xbd, 0xdf, 0x47, 0x07, 0x3e,
+ 0xa4, 0x70, 0x84, 0x3c, 0x1a, 0xc2, 0x5d, 0x3d, 0x78, 0xc6, 0x73, 0x3d,
+ 0x40, 0xba, 0x2a, 0x3b, 0x58, 0xa6, 0x05, 0x3e, 0x2f, 0xad, 0xd4, 0x3d,
+ 0x80, 0x29, 0x32, 0x3d, 0xe2, 0x2a, 0xd2, 0x3d, 0xbe, 0x37, 0xba, 0x3d,
+ 0x8f, 0x4b, 0x05, 0x3d, 0x68, 0x92, 0x33, 0x3d, 0x2e, 0x3d, 0x49, 0xbb,
+ 0x62, 0x68, 0x70, 0xbd, 0xaa, 0x46, 0x5d, 0x3e, 0xc1, 0x59, 0x50, 0x3c,
+ 0xe7, 0x88, 0x03, 0x3e, 0x3a, 0x88, 0xbd, 0xbd, 0xaf, 0xde, 0xf3, 0x3d,
+ 0x46, 0xb1, 0x81, 0x3c, 0x83, 0xaf, 0xdf, 0xbd, 0x08, 0x2a, 0x19, 0x3e,
+ 0xee, 0x13, 0x00, 0x3e, 0x98, 0xf9, 0x2e, 0xbe, 0xfa, 0x9e, 0xbf, 0x3c,
+ 0xa1, 0xf4, 0xf8, 0x3d, 0xa0, 0xf7, 0xe7, 0x3d, 0x16, 0x4a, 0x01, 0xbe,
+ 0x9f, 0x6c, 0x3c, 0xbc, 0x86, 0x14, 0x16, 0x3e, 0x00, 0x67, 0x04, 0x3e,
+ 0x31, 0x72, 0xe9, 0x3c, 0x48, 0xa5, 0xae, 0xbd, 0x2d, 0x13, 0x11, 0xbe,
+ 0x3b, 0x2a, 0x5d, 0x3c, 0x9c, 0xb7, 0x98, 0xbd, 0x90, 0xa6, 0x4b, 0x3c,
+ 0x99, 0x0c, 0x05, 0x3d, 0xe1, 0x39, 0x0b, 0xbe, 0xd9, 0x80, 0x48, 0xbd,
+ 0x80, 0xa3, 0x3c, 0x3d, 0xdf, 0xf4, 0x02, 0xbe, 0x73, 0x2e, 0xc5, 0xbd,
+ 0x96, 0xa5, 0xd0, 0xbd, 0xcb, 0xd7, 0xf7, 0xbd, 0xf2, 0xb1, 0x00, 0x3d,
+ 0xe6, 0xac, 0x6a, 0xbc, 0x85, 0xb8, 0x48, 0x3d, 0xe6, 0xf3, 0xa4, 0x3d,
+ 0xca, 0xda, 0x84, 0xbe, 0x9c, 0x2e, 0xf3, 0x3d, 0xc1, 0x15, 0x5c, 0xbd,
+ 0xdb, 0xfb, 0x5e, 0x3d, 0x9b, 0x77, 0xc9, 0x3d, 0x7b, 0x9c, 0xc4, 0xbd,
+ 0x3b, 0x31, 0x06, 0x39, 0x71, 0xa6, 0x79, 0xbc, 0x4f, 0xaf, 0xd5, 0x3d,
+ 0xf8, 0x94, 0x44, 0xbc, 0x64, 0x58, 0x3e, 0x3c, 0x92, 0x83, 0x04, 0x3d,
+ 0x0e, 0xea, 0x4a, 0xbe, 0xfd, 0xa5, 0xb9, 0xbd, 0x91, 0x7f, 0x29, 0xbe,
+ 0xa5, 0x58, 0x0c, 0x3e, 0xb1, 0x39, 0x15, 0x3e, 0xc7, 0xf4, 0x2e, 0x3e,
+ 0x2f, 0x81, 0xf2, 0x3d, 0xeb, 0x50, 0xb9, 0x3d, 0x10, 0xe9, 0x82, 0xbd,
+ 0x72, 0x00, 0xff, 0x3d, 0x00, 0x89, 0x9f, 0x3d, 0xda, 0xe1, 0x95, 0x3d,
+ 0xab, 0x44, 0xc9, 0xbd, 0x94, 0x8e, 0x4d, 0xbd, 0xe6, 0x99, 0xf6, 0x3d,
+ 0xf7, 0x7f, 0xef, 0x3c, 0xd3, 0x2d, 0x73, 0x3c, 0x04, 0xc1, 0x34, 0xbd,
+ 0x5a, 0x74, 0x87, 0x3d, 0xb5, 0x9d, 0xb9, 0xbd, 0xd2, 0xf8, 0x51, 0xbd,
+ 0xdd, 0x78, 0xfb, 0x3d, 0x7b, 0xb1, 0x18, 0xbd, 0xbc, 0x9b, 0xc1, 0x3d,
+ 0xdb, 0x0c, 0x05, 0x3e, 0x0b, 0xdf, 0xa4, 0xbc, 0x31, 0x39, 0x1c, 0x3d,
+ 0xe7, 0x15, 0x14, 0x3e, 0x36, 0xc3, 0x2d, 0xbe, 0xe4, 0x2c, 0x20, 0xbd,
+ 0x2f, 0x46, 0xf0, 0x3c, 0x57, 0x9e, 0xf5, 0x3d, 0x11, 0xa3, 0xe2, 0x3d,
+ 0x25, 0x40, 0x4d, 0x3c, 0x3c, 0x51, 0x91, 0x3d, 0x6c, 0xf7, 0xe6, 0x3d,
+ 0x70, 0x23, 0xe6, 0xbd, 0xd3, 0xa2, 0xd7, 0xbc, 0x76, 0x95, 0x0b, 0xbc,
+ 0x92, 0xf3, 0xc2, 0x3d, 0x19, 0x41, 0xa7, 0x3d, 0xb2, 0x9a, 0x17, 0x3e,
+ 0x59, 0x2f, 0x17, 0xbe, 0x7a, 0xe9, 0x75, 0x3d, 0xdb, 0xb6, 0x39, 0xbd,
+ 0xb1, 0xa0, 0xcd, 0xbd, 0x2b, 0xc2, 0x05, 0xbc, 0xbf, 0xc9, 0xc7, 0x3d,
+ 0x2f, 0xc6, 0xe5, 0xbd, 0x76, 0x27, 0x49, 0x3c, 0x41, 0x54, 0xe8, 0xbd,
+ 0x7b, 0x73, 0x90, 0xbd, 0x7d, 0x53, 0xd1, 0x3d, 0x81, 0x11, 0x8a, 0x3d,
+ 0x0d, 0x3c, 0x0a, 0xbd, 0x42, 0x3a, 0x81, 0x3d, 0xf1, 0x81, 0x3b, 0xbe,
+ 0x67, 0x52, 0x33, 0xbd, 0x21, 0x03, 0xaf, 0xbd, 0xb7, 0x12, 0x3b, 0x3d,
+ 0x64, 0xfc, 0x7c, 0x3d, 0xf8, 0x07, 0xd7, 0xbd, 0xbc, 0x6d, 0x3a, 0xbd,
+ 0x59, 0x2b, 0xd3, 0xbc, 0xba, 0x67, 0x1c, 0x3e, 0xa5, 0xc4, 0x5f, 0x3e,
+ 0x05, 0xd8, 0x0c, 0x3e, 0x67, 0x2b, 0x57, 0x3e, 0x1e, 0x5c, 0x80, 0x39,
+ 0xe8, 0xc5, 0xd5, 0x3d, 0xe9, 0x1a, 0x18, 0xbc, 0xe3, 0xa8, 0xc5, 0x3d,
+ 0x59, 0x12, 0x62, 0x3e, 0x38, 0x3d, 0xf0, 0x3d, 0x65, 0xe9, 0xea, 0xbd,
+ 0x4b, 0xf2, 0x0e, 0xbe, 0xe5, 0x3f, 0xef, 0xbb, 0x44, 0x9b, 0xdd, 0xbd,
+ 0x73, 0x4e, 0x8d, 0x3d, 0xf8, 0x16, 0x24, 0xbe, 0x07, 0x1e, 0xbe, 0x3d,
+ 0x1d, 0xa1, 0x9b, 0x3b, 0x7a, 0x4b, 0x03, 0xbb, 0x58, 0xf4, 0xa4, 0x3d,
+ 0xac, 0x5d, 0x04, 0xbe, 0xcb, 0x5a, 0xe2, 0x3d, 0xb2, 0xe7, 0x5e, 0xbd,
+ 0x0a, 0x62, 0x8f, 0xbe, 0xe3, 0xb5, 0xf3, 0xbd, 0xb0, 0xd0, 0x0a, 0xbe,
+ 0xf5, 0x16, 0x17, 0xbd, 0x86, 0x6c, 0x85, 0xbe, 0xbc, 0xd9, 0xee, 0x3b,
+ 0x62, 0x9f, 0x00, 0x3d, 0x88, 0x5e, 0xe6, 0x3d, 0x4f, 0xab, 0xcc, 0x3c,
+ 0x70, 0xf2, 0xb5, 0x3c, 0x8c, 0xcb, 0xeb, 0xbd, 0xb1, 0x4c, 0xf8, 0x3d,
+ 0x9d, 0xdb, 0xac, 0x3d, 0x11, 0x74, 0x26, 0xbe, 0x59, 0x79, 0xd0, 0xbd,
+ 0x12, 0xd0, 0x25, 0xbe, 0xca, 0x2b, 0x71, 0xbd, 0x75, 0x52, 0xc8, 0xbd,
+ 0x12, 0x2b, 0x3c, 0xbe, 0x75, 0xf7, 0x28, 0x3e, 0xee, 0xf5, 0x77, 0xbc,
+ 0x0a, 0x23, 0x82, 0x3d, 0xc5, 0x03, 0xe0, 0xbd, 0xbb, 0xce, 0xd5, 0x3d,
+ 0xd8, 0x12, 0x04, 0xbe, 0xd7, 0xf1, 0x53, 0xbc, 0x0a, 0xe5, 0xbd, 0xbc,
+ 0x2d, 0xb0, 0x3a, 0xbe, 0x45, 0x51, 0x1b, 0x3e, 0x18, 0xce, 0xab, 0xbd,
+ 0x80, 0x3e, 0x1c, 0x3d, 0xc9, 0x8b, 0x8c, 0xbd, 0xaa, 0x4b, 0x28, 0x3c,
+ 0x4a, 0x35, 0xec, 0x3c, 0xc9, 0xdc, 0xda, 0x3c, 0x3b, 0x70, 0x6f, 0xbe,
+ 0x99, 0xa1, 0xb6, 0xbd, 0x37, 0x8d, 0x3d, 0xbe, 0x1e, 0x9a, 0xf1, 0x3d,
+ 0x72, 0x87, 0xdf, 0xbd, 0xb6, 0x34, 0x7c, 0x3d, 0xc2, 0x85, 0xfa, 0x3d,
+ 0x01, 0xf7, 0xe2, 0x3d, 0x8d, 0x19, 0x9b, 0x3d, 0x02, 0x08, 0xff, 0xbc,
+ 0x2e, 0x33, 0xfb, 0x3b, 0x22, 0x31, 0x41, 0x3e, 0x81, 0xac, 0x15, 0xbe,
+ 0x38, 0xfb, 0x01, 0x3c, 0x46, 0xbf, 0x5b, 0x3c, 0x60, 0xf2, 0x70, 0x3d,
+ 0xf3, 0xaa, 0x2a, 0xbe, 0xe9, 0x16, 0x4e, 0x3e, 0xe5, 0x43, 0xea, 0x3d,
+ 0x37, 0x5d, 0x01, 0x3e, 0x76, 0xa5, 0x3a, 0xbe, 0x21, 0x96, 0x91, 0xbc,
+ 0x35, 0xc5, 0xed, 0xbb, 0x83, 0x45, 0xb6, 0xbd, 0xc5, 0x11, 0x69, 0x3d,
+ 0xfb, 0xa6, 0x81, 0x3c, 0xa6, 0x64, 0x00, 0xbe, 0xbc, 0xa1, 0x24, 0x3e,
+ 0x44, 0xcc, 0x27, 0xbd, 0x4b, 0x32, 0x2c, 0x3d, 0x76, 0x6e, 0xac, 0x3c,
+ 0x80, 0xce, 0x1d, 0xbe, 0x5b, 0x72, 0x24, 0xbe, 0xc2, 0x86, 0xd7, 0x3d,
+ 0xf7, 0xe7, 0x4e, 0x3d, 0x08, 0xa1, 0x9b, 0x3d, 0xa3, 0x36, 0x82, 0xbe,
+ 0xee, 0xe9, 0x00, 0xbe, 0x49, 0x23, 0xa3, 0x3d, 0x36, 0xb9, 0x27, 0x3e,
+ 0x83, 0x67, 0x1f, 0xbe, 0xcb, 0xeb, 0xe9, 0x3d, 0x68, 0xd9, 0x15, 0x3d,
+ 0x5e, 0xb6, 0x93, 0xbd, 0x41, 0xc0, 0xe1, 0xbd, 0x81, 0x29, 0x12, 0x3e,
+ 0xfd, 0x41, 0x9f, 0x3d, 0x10, 0x60, 0xc1, 0x3b, 0x3a, 0x70, 0x40, 0xbe,
+ 0x17, 0x36, 0x61, 0xbe, 0x70, 0x94, 0xfd, 0x3c, 0x22, 0xdd, 0x3f, 0xba,
+ 0xd0, 0x7f, 0xc2, 0x3c, 0x8c, 0xdc, 0xfe, 0xbd, 0x29, 0x15, 0xa3, 0x3d,
+ 0xa2, 0x36, 0x54, 0x3d, 0xd6, 0x02, 0xf4, 0x3d, 0xb3, 0xe5, 0xba, 0xbd,
+ 0xab, 0x0d, 0x51, 0xbe, 0xf2, 0xc4, 0x08, 0x3d, 0x9e, 0x9e, 0x78, 0x3d,
+ 0x28, 0x2d, 0x25, 0x3e, 0xe7, 0xf1, 0xc2, 0x3d, 0x24, 0xd3, 0xfc, 0xbc,
+ 0x54, 0x1d, 0x12, 0xbe, 0x38, 0x82, 0x4a, 0x3e, 0x3a, 0x71, 0x1f, 0xbd,
+ 0xb1, 0x66, 0x09, 0x3e, 0xa7, 0x14, 0x5e, 0xbe, 0xc6, 0xb3, 0x32, 0x3b,
+ 0xe5, 0x45, 0x4e, 0xbe, 0xa1, 0x07, 0x08, 0xbe, 0xe7, 0xef, 0x68, 0xbd,
+ 0xe2, 0xec, 0x5f, 0xbd, 0x7b, 0x72, 0x8d, 0x3d, 0xab, 0x46, 0x98, 0x3d,
+ 0x0c, 0x26, 0xf7, 0x3c, 0xa6, 0x25, 0x60, 0xbe, 0xd0, 0xd9, 0x65, 0xbd,
+ 0x66, 0x0d, 0x01, 0x3c, 0xca, 0x13, 0x55, 0x3d, 0xd2, 0x30, 0x08, 0xbe,
+ 0xc5, 0xf9, 0x14, 0x3e, 0x37, 0x00, 0xfe, 0xbd, 0xaa, 0xe5, 0x5b, 0x3d,
+ 0x23, 0xe0, 0x3d, 0xbe, 0x79, 0x68, 0x7a, 0xbd, 0x56, 0x11, 0xfa, 0xba,
+ 0x22, 0xb3, 0x94, 0xbc, 0x87, 0x3e, 0xeb, 0xbd, 0x1c, 0x0e, 0x27, 0xbb,
+ 0x65, 0x50, 0x20, 0xbe, 0xd3, 0x1c, 0x74, 0xbd, 0x67, 0x6c, 0x2d, 0x3d,
+ 0xb9, 0x51, 0xf8, 0x3d, 0xe6, 0x10, 0xc7, 0xbd, 0x6a, 0x83, 0x41, 0x3e,
+ 0x80, 0xae, 0x3f, 0xbd, 0x3b, 0x52, 0x86, 0xbd, 0xba, 0x5c, 0x19, 0x3d,
+ 0xf1, 0xe9, 0x02, 0x3e, 0x67, 0xf9, 0x30, 0xbe, 0xc4, 0x80, 0x82, 0x3d,
+ 0x90, 0x7d, 0x50, 0xbd, 0x19, 0x14, 0xf1, 0x3d, 0x88, 0xeb, 0xce, 0x3d,
+ 0x86, 0x3e, 0xe8, 0x3d, 0x03, 0x2d, 0xf3, 0xbd, 0x50, 0xd1, 0x9d, 0x3e,
+ 0xc0, 0x56, 0x1e, 0xbe, 0x20, 0xb8, 0x2f, 0x3d, 0x38, 0x32, 0xfc, 0x3d,
+ 0x1c, 0xf2, 0x37, 0xbe, 0x01, 0x57, 0x13, 0xbd, 0x69, 0x05, 0xc0, 0x3d,
+ 0x69, 0xb6, 0x14, 0xbe, 0xc0, 0x7e, 0x82, 0x3e, 0xdf, 0x1b, 0xe8, 0xbd,
+ 0xaa, 0xd9, 0xa1, 0xbd, 0x2d, 0x2d, 0x56, 0xbe, 0x71, 0x7d, 0x4a, 0xbe,
+ 0xf4, 0x91, 0xa7, 0xbe, 0xfd, 0xba, 0xec, 0xbd, 0x8b, 0x2a, 0x9b, 0xbc,
+ 0x25, 0xf4, 0x44, 0xbd, 0xe0, 0xe5, 0xf2, 0xbd, 0x23, 0xd0, 0x8d, 0xbe,
+ 0x5a, 0xa9, 0xa3, 0xbd, 0x1b, 0x88, 0xe7, 0xbd, 0x6f, 0x95, 0x62, 0xbd,
+ 0x2f, 0xeb, 0x3f, 0x3e, 0x62, 0x31, 0x36, 0x3e, 0xfc, 0x80, 0x24, 0x3e,
+ 0xa0, 0x97, 0x25, 0xbe, 0xf5, 0xa0, 0xbe, 0xbd, 0x2a, 0x11, 0x7b, 0x3d,
+ 0xca, 0x63, 0x03, 0x3d, 0x76, 0xc6, 0x75, 0x3e, 0xb9, 0x7c, 0xcc, 0xbc,
+ 0x00, 0xf5, 0xcc, 0xbc, 0x03, 0xcc, 0xd5, 0x3d, 0x9f, 0x71, 0x7f, 0xbe,
+ 0x13, 0x3b, 0x93, 0xbc, 0xc0, 0xcb, 0xf7, 0xbc, 0x38, 0x99, 0x9e, 0x3d,
+ 0x38, 0xe8, 0xc2, 0xbd, 0x54, 0x22, 0xc2, 0xbd, 0x86, 0xce, 0x54, 0x3d,
+ 0xf7, 0x79, 0xf4, 0xbd, 0x9e, 0x44, 0xf7, 0xbc, 0x44, 0x05, 0x22, 0x3e,
+ 0xbb, 0x4e, 0xa6, 0x3e, 0xa6, 0x96, 0x75, 0x3d, 0xed, 0xa8, 0x98, 0xbd,
+ 0xf5, 0x45, 0x67, 0x3e, 0x25, 0xb6, 0x31, 0xbe, 0xdc, 0x98, 0xc2, 0xbd,
+ 0xd5, 0x75, 0x0c, 0x3d, 0xcd, 0x1f, 0xd0, 0xbd, 0xf2, 0xb3, 0x9a, 0x3a,
+ 0xfd, 0x0f, 0xe6, 0xbd, 0x1e, 0x54, 0x34, 0x3e, 0xc3, 0x4e, 0x38, 0xbe,
+ 0x8a, 0x1a, 0xb8, 0xbd, 0x5c, 0xf2, 0x8d, 0xbe, 0xa3, 0xd5, 0x53, 0x3e,
+ 0x31, 0x1e, 0xfd, 0xbc, 0x21, 0x7b, 0x15, 0x3e, 0x5a, 0x9c, 0xd7, 0xbd,
+ 0xf9, 0xb0, 0x28, 0xbd, 0x44, 0x1f, 0xbf, 0x3d, 0x9e, 0x12, 0x4a, 0x3e,
+ 0x36, 0x89, 0x9d, 0x3d, 0xe0, 0x85, 0x79, 0xbe, 0xde, 0xcf, 0x64, 0x3e,
+ 0xff, 0xa7, 0x87, 0xbd, 0xdd, 0x82, 0x8b, 0x3d, 0x43, 0x9a, 0x6c, 0x3d,
+ 0x51, 0x7e, 0x76, 0xbe, 0x12, 0x71, 0x6d, 0x3e, 0xe0, 0xa8, 0x26, 0xbe,
+ 0x0e, 0x27, 0xc7, 0x3d, 0xa1, 0xc6, 0x98, 0x3d, 0xdb, 0x59, 0x47, 0x3e,
+ 0x2b, 0xed, 0x07, 0x3d, 0x94, 0x27, 0x8e, 0xbd, 0x9a, 0x3f, 0x72, 0xbe,
+ 0xc6, 0x90, 0xf0, 0xbb, 0x9b, 0x9d, 0xfa, 0xbd, 0xfb, 0x87, 0x30, 0xbe,
+ 0x5e, 0xcb, 0xcf, 0xbd, 0x86, 0x85, 0x98, 0xbd, 0x1e, 0xd8, 0x2b, 0x3d,
+ 0xcc, 0x28, 0x15, 0x3e, 0x32, 0x89, 0x9a, 0xbe, 0x2d, 0x32, 0xa7, 0x3d,
+ 0x07, 0x36, 0x06, 0xbd, 0xfa, 0x76, 0x8d, 0xbe, 0x54, 0x36, 0x90, 0x3d,
+ 0x8a, 0xaf, 0x38, 0x3e, 0x9d, 0x64, 0x26, 0xbc, 0x5e, 0xd1, 0x20, 0xbd,
+ 0xe1, 0x15, 0x4b, 0x3e, 0x07, 0x7a, 0x05, 0xbe, 0xb3, 0xc2, 0x66, 0x3e,
+ 0xb7, 0xae, 0xb3, 0x3d, 0x0f, 0x02, 0x45, 0x3e, 0x20, 0xd9, 0xa8, 0x3e,
+ 0xfe, 0xfd, 0xad, 0x3d, 0xba, 0xa7, 0x7e, 0xbd, 0x76, 0x2a, 0x8b, 0xbd,
+ 0x84, 0x75, 0x63, 0xbc, 0x51, 0xbb, 0x55, 0x3d, 0xcc, 0x7a, 0x12, 0x3d,
+ 0x15, 0x9c, 0x72, 0xbc, 0xb8, 0x29, 0xa7, 0xbb, 0xc8, 0x90, 0x32, 0x3e,
+ 0xa5, 0xa4, 0xce, 0xbc, 0x82, 0xe2, 0xca, 0x3d, 0x3a, 0xf8, 0xe9, 0xbd,
+ 0x5b, 0x46, 0x0d, 0xbe, 0xb9, 0xeb, 0x87, 0x3c, 0x1d, 0x56, 0x31, 0x3d,
+ 0xbd, 0x47, 0xdc, 0xbd, 0xf7, 0xc4, 0xeb, 0x3d, 0xb3, 0x7b, 0xed, 0xbd,
+ 0xd5, 0x2f, 0x0c, 0xbd, 0x41, 0x66, 0xe5, 0x3d, 0x86, 0x4f, 0x20, 0xbe,
+ 0x59, 0xa8, 0x05, 0xbe, 0x87, 0xa0, 0x25, 0xbe, 0x72, 0xa1, 0xa5, 0x3d,
+ 0xfd, 0x6f, 0xcf, 0xbd, 0x10, 0x05, 0x37, 0xbd, 0x0c, 0xc2, 0x62, 0x3d,
+ 0x0a, 0xae, 0x30, 0xbe, 0xc9, 0x25, 0x11, 0x3e, 0x30, 0x52, 0xf5, 0x39,
+ 0xe5, 0x64, 0xdb, 0x3d, 0xcd, 0x48, 0xd7, 0x3d, 0x5c, 0x0a, 0x62, 0xbd,
+ 0x80, 0xae, 0xe2, 0xbd, 0xf2, 0x11, 0x38, 0xbe, 0xd7, 0x81, 0xad, 0x3d,
+ 0xe4, 0x7a, 0x03, 0xbe, 0x88, 0xbc, 0xb8, 0x3c, 0xa3, 0xa2, 0x86, 0xbd,
+ 0x73, 0xfb, 0x2d, 0xbc, 0x26, 0x62, 0xa2, 0xbd, 0x3c, 0x03, 0x0c, 0x3e,
+ 0xac, 0xae, 0x1f, 0xbd, 0xb1, 0x45, 0x85, 0xbc, 0x62, 0xd1, 0x98, 0xbd,
+ 0xeb, 0x2c, 0x56, 0xbb, 0xbc, 0xd4, 0x1a, 0xbe, 0x50, 0x5b, 0x34, 0xbe,
+ 0xd4, 0x53, 0x56, 0x3d, 0x82, 0x8f, 0xf8, 0xbd, 0x75, 0xdc, 0xc3, 0xbd,
+ 0x7c, 0x12, 0x27, 0x3e, 0x2a, 0x46, 0x05, 0xbe, 0xbd, 0x75, 0x23, 0x3e,
+ 0x7d, 0x8d, 0xd7, 0x3d, 0xf5, 0x5e, 0xf7, 0xbc, 0x96, 0xb1, 0x17, 0x3e,
+ 0xe3, 0x12, 0xcb, 0x3d, 0x40, 0x43, 0x04, 0xbe, 0x10, 0x77, 0xd7, 0x3d,
+ 0x6e, 0xd1, 0x03, 0x3d, 0x17, 0xb7, 0x65, 0x3d, 0xca, 0xca, 0x15, 0xbd,
+ 0x3c, 0xdc, 0x03, 0x3e, 0x71, 0x43, 0x32, 0x3d, 0x29, 0x3a, 0xf0, 0x3c,
+ 0x3b, 0x13, 0x67, 0xbe, 0xec, 0xdd, 0x92, 0x3d, 0xf0, 0x18, 0xaf, 0xbc,
+ 0x5c, 0x92, 0x0c, 0xbe, 0x13, 0xfa, 0x40, 0x3d, 0x6d, 0xe2, 0xd3, 0xbd,
+ 0x5a, 0x03, 0x83, 0xbd, 0xbc, 0xf2, 0x27, 0xbe, 0x73, 0xa0, 0x97, 0xbd,
+ 0x21, 0xa9, 0x1c, 0x3e, 0x06, 0xea, 0x8c, 0x3b, 0x3a, 0x58, 0xaf, 0x3c,
+ 0x42, 0x49, 0xee, 0xbd, 0x62, 0x42, 0x4f, 0x3d, 0x99, 0xe9, 0x07, 0xbe,
+ 0x36, 0xb8, 0xd2, 0xbb, 0x01, 0x55, 0x18, 0xbd, 0xce, 0x1e, 0x1b, 0x3e,
+ 0x2f, 0x85, 0xa6, 0xbc, 0x0a, 0x3d, 0x15, 0x3d, 0xf3, 0xc3, 0x19, 0x3d,
+ 0x4c, 0x1a, 0xbb, 0xbd, 0x93, 0xaf, 0xae, 0xbd, 0x3f, 0xb8, 0x06, 0x3e,
+ 0x32, 0xc8, 0x24, 0xbe, 0x7f, 0xc9, 0xf1, 0x3d, 0x6c, 0x97, 0x5c, 0x3d,
+ 0x10, 0xc9, 0x36, 0x3e, 0xd3, 0xc1, 0xbb, 0x3c, 0x07, 0x3c, 0x3a, 0x3e,
+ 0x3e, 0x86, 0xe7, 0xbd, 0xbe, 0x33, 0xcb, 0xbb, 0x1d, 0xfb, 0x64, 0xbd,
+ 0xb6, 0x51, 0xf3, 0xbd, 0x7a, 0x6f, 0xca, 0xbd, 0x83, 0x2a, 0xc5, 0xbd,
+ 0x20, 0xc7, 0xe3, 0xbb, 0xae, 0x9e, 0xd3, 0xbd, 0xed, 0x6f, 0x26, 0x3d,
+ 0xa8, 0x1a, 0x2d, 0xbd, 0xee, 0xb1, 0x3f, 0x3d, 0xf9, 0x58, 0x14, 0xbe,
+ 0x03, 0x08, 0x96, 0xbd, 0x11, 0x75, 0x0d, 0xbe, 0x7b, 0x69, 0xc9, 0xbc,
+ 0xb6, 0x10, 0xc2, 0x3d, 0x84, 0x3c, 0xf2, 0x3d, 0x35, 0x3a, 0x4c, 0xbe,
+ 0xd8, 0x63, 0x3e, 0xbd, 0xda, 0xb9, 0xe0, 0xbb, 0x92, 0xb5, 0xa9, 0x3c,
+ 0x88, 0xff, 0x07, 0x3d, 0xe3, 0x18, 0xf6, 0xbc, 0xa8, 0xaa, 0x2b, 0xbe,
+ 0x48, 0xe0, 0x7c, 0x3d, 0xea, 0x9f, 0xc9, 0x3d, 0x8c, 0xfd, 0x6d, 0xbd,
+ 0x6d, 0xe9, 0xdd, 0x3d, 0x2c, 0x08, 0x46, 0x3e, 0x3a, 0xc5, 0x34, 0xbd,
+ 0xc4, 0x5f, 0xea, 0xbb, 0x42, 0x5c, 0x83, 0x3d, 0xc1, 0xeb, 0x37, 0x3e,
+ 0xf8, 0xf7, 0x68, 0xbe, 0x1f, 0x18, 0x24, 0xbe, 0xb2, 0xe2, 0x33, 0x3e,
+ 0xb7, 0xd9, 0x0c, 0x3d, 0xf2, 0x70, 0x4e, 0x3d, 0xa1, 0x8f, 0xb2, 0xbd,
+ 0x86, 0x80, 0x18, 0x3e, 0xf2, 0xb9, 0x12, 0xbe, 0x9c, 0x98, 0xb2, 0x3d,
+ 0x22, 0xfc, 0x92, 0xbe, 0x50, 0x01, 0xba, 0xbd, 0xc9, 0x54, 0x07, 0xbe,
+ 0x02, 0x36, 0xbc, 0xbd, 0xb9, 0xb4, 0xab, 0x3d, 0x4e, 0x76, 0x0f, 0x3d,
+ 0xe2, 0xb0, 0xa9, 0x3a, 0xba, 0x37, 0x6e, 0x3d, 0xb1, 0x82, 0x00, 0xbe,
+ 0xca, 0x96, 0xd3, 0x3d, 0x8e, 0x13, 0x39, 0x3d, 0x6e, 0x01, 0x26, 0xbd,
+ 0x9a, 0x49, 0x1c, 0xbe, 0x97, 0xbe, 0x62, 0x3c, 0xa0, 0x5e, 0x68, 0xbd,
+ 0xbd, 0x73, 0x55, 0xbd, 0x10, 0xad, 0x18, 0xbe, 0x3e, 0xf5, 0x99, 0xbd,
+ 0xbf, 0xc6, 0x16, 0xbe, 0x08, 0x2f, 0x85, 0xbe, 0xc2, 0x4d, 0xe2, 0x3d,
+ 0x2f, 0xeb, 0xb6, 0xbd, 0x5e, 0x39, 0x9b, 0x3d, 0xdd, 0x58, 0xe4, 0xbd,
+ 0x8b, 0xb0, 0x85, 0xbc, 0x80, 0xa0, 0x11, 0xbe, 0xfe, 0xf7, 0xb3, 0x3d,
+ 0xb9, 0x34, 0x5f, 0xbd, 0x0a, 0x66, 0x21, 0xbe, 0xca, 0x71, 0x06, 0xbe,
+ 0xbd, 0x09, 0x02, 0x3d, 0x55, 0x4b, 0x36, 0xbd, 0x5a, 0xca, 0x9e, 0xbd,
+ 0xac, 0x6d, 0xd7, 0x3d, 0x43, 0x58, 0x09, 0xbe, 0x71, 0x35, 0x4d, 0xbd,
+ 0x16, 0x65, 0xfc, 0xbd, 0x79, 0x6a, 0xff, 0x3d, 0x43, 0x6a, 0xcd, 0xbd,
+ 0x33, 0xb5, 0x27, 0xbe, 0xc8, 0xb2, 0xf4, 0xbd, 0x70, 0x9e, 0x86, 0xba,
+ 0x9e, 0x63, 0x16, 0x3d, 0xf2, 0x79, 0xba, 0x3c, 0x51, 0xdd, 0xf3, 0xbc,
+ 0xbc, 0x62, 0x24, 0x3e, 0x59, 0x6c, 0x81, 0x3d, 0xfb, 0x42, 0xc9, 0x3d,
+ 0xf7, 0x36, 0x6c, 0xbe, 0xef, 0xfd, 0x51, 0x3d, 0x80, 0x96, 0xac, 0xbd,
+ 0x27, 0x32, 0xb0, 0xbc, 0xeb, 0x82, 0x80, 0x3d, 0x54, 0x43, 0xd5, 0xbc,
+ 0x40, 0x2a, 0x46, 0xbd, 0x70, 0x32, 0x92, 0x3d, 0xe7, 0x01, 0x22, 0xbe,
+ 0x1b, 0xaa, 0x95, 0x3d, 0xd0, 0x0b, 0x4d, 0xbe, 0x05, 0xe6, 0x50, 0x3e,
+ 0x1e, 0xbc, 0xf7, 0x3d, 0xc9, 0x6d, 0xd0, 0xbd, 0xfb, 0x1a, 0x13, 0xbe,
+ 0x84, 0x5f, 0x9c, 0xbd, 0xdf, 0x9a, 0x2c, 0xbd, 0x68, 0x61, 0x35, 0x3e,
+ 0x13, 0x9c, 0x1e, 0xbd, 0x6a, 0x4a, 0xdc, 0x3d, 0x0c, 0xfe, 0xe7, 0xbd,
+ 0x16, 0x92, 0x5d, 0xbd, 0x95, 0x0b, 0x07, 0x3e, 0x62, 0x2b, 0xcd, 0xbd,
+ 0x9a, 0x76, 0x57, 0xbe, 0x54, 0x46, 0x8e, 0x3c, 0x95, 0xed, 0xfc, 0x3d,
+ 0x4a, 0x1a, 0x8f, 0x3e, 0xc7, 0x29, 0xb9, 0xbc, 0x75, 0xf3, 0x14, 0xbe,
+ 0xc5, 0xa1, 0x10, 0x3e, 0x82, 0xed, 0xa6, 0x3d, 0xbc, 0x1f, 0x1e, 0xbe,
+ 0x34, 0x1b, 0x2a, 0x3d, 0xa0, 0x0e, 0xd1, 0x3d, 0xda, 0x1f, 0xf6, 0xbd,
+ 0xae, 0x0b, 0x40, 0x3d, 0x4b, 0xe9, 0x04, 0x3e, 0xee, 0x0d, 0xdb, 0x3d,
+ 0x3d, 0x81, 0xa9, 0xbd, 0x65, 0x20, 0x1c, 0x3d, 0xda, 0x85, 0x16, 0x3e,
+ 0x78, 0x41, 0x43, 0x3e, 0xe2, 0x46, 0xf0, 0x3d, 0xc0, 0xc6, 0xdf, 0x3d,
+ 0xd8, 0x3c, 0x1b, 0xbe, 0xef, 0xf5, 0x83, 0xbd, 0x60, 0xba, 0xb6, 0x3d,
+ 0xb7, 0x7c, 0x72, 0x3d, 0xc7, 0xb8, 0x59, 0x3d, 0xfd, 0xe8, 0x46, 0xbe,
+ 0x42, 0x77, 0x0d, 0xbe, 0xb4, 0xfe, 0xf5, 0xbe, 0x4e, 0x9e, 0x95, 0xbd,
+ 0x34, 0x42, 0x90, 0xbe, 0xc3, 0x1e, 0x4f, 0xbd, 0xdd, 0x80, 0x13, 0x3c,
+ 0xd4, 0x9d, 0x9c, 0xbd, 0x64, 0xb4, 0xb7, 0x3d, 0x7a, 0x12, 0x98, 0x3e,
+ 0xa3, 0x5b, 0xc4, 0x3b, 0xa3, 0xb5, 0x3c, 0x3e, 0xed, 0x95, 0x6b, 0xbd,
+ 0x08, 0x56, 0x2b, 0x3d, 0xad, 0xbc, 0xc1, 0xbe, 0x27, 0x5b, 0x0c, 0xbe,
+ 0xf6, 0x9e, 0x14, 0xbd, 0x72, 0x61, 0x0f, 0x3f, 0xbe, 0x0f, 0xb1, 0x3c,
+ 0xd6, 0x3b, 0xa2, 0x3e, 0xf4, 0x0b, 0x00, 0x3e, 0x75, 0x24, 0xc9, 0x3e,
+ 0x52, 0xc4, 0xa5, 0xbe, 0xef, 0x9d, 0xe0, 0xbe, 0xb4, 0x16, 0xbf, 0x3e,
+ 0x01, 0x88, 0x1a, 0x3e, 0x8a, 0x55, 0x14, 0x3e, 0xe6, 0x1b, 0x03, 0x3f,
+ 0xa1, 0xe6, 0x8d, 0x3e, 0xe7, 0x19, 0x78, 0xbe, 0xb7, 0xbd, 0x9a, 0xbe,
+ 0x15, 0x46, 0xfd, 0x3d, 0x01, 0x41, 0xc0, 0xbb, 0x06, 0x55, 0xce, 0xbe,
+ 0xb9, 0xa3, 0x98, 0x3d, 0x33, 0x3d, 0x5a, 0xbe, 0x66, 0x27, 0xa1, 0xbd,
+ 0xeb, 0x7d, 0xf0, 0x3b, 0xe0, 0x0e, 0x80, 0x3e, 0x26, 0x5c, 0xa6, 0xbe,
+ 0xde, 0x6e, 0x4c, 0x3e, 0x62, 0xe3, 0x06, 0x3e, 0x9f, 0x44, 0x06, 0x3e,
+ 0xf9, 0x62, 0x73, 0x3e, 0x99, 0xf8, 0xbc, 0x3b, 0xb3, 0x8b, 0xb6, 0xbd,
+ 0x04, 0xdf, 0x74, 0x3c, 0x8c, 0xb2, 0x5e, 0x3e, 0x12, 0x91, 0x60, 0x3d,
+ 0xcb, 0x9e, 0xc9, 0xbe, 0x47, 0x95, 0x92, 0x3e, 0x86, 0x9c, 0xe6, 0xbb,
+ 0x10, 0xed, 0x34, 0x3d, 0xe9, 0xd6, 0x17, 0xbe, 0x8e, 0x58, 0x34, 0xbc,
+ 0x03, 0x2b, 0x31, 0x3e, 0x84, 0x7d, 0xb4, 0x3d, 0x78, 0x6b, 0x69, 0x3d,
+ 0xf3, 0xfd, 0xc3, 0xbe, 0xf4, 0xcb, 0x08, 0xbe, 0xb5, 0x18, 0x87, 0xbd,
+ 0xd7, 0xda, 0x29, 0xbe, 0x8b, 0x4d, 0x10, 0xbd, 0xa5, 0xd0, 0xa0, 0x3e,
+ 0x1d, 0xe7, 0x83, 0x3d, 0xa8, 0xfe, 0x64, 0x3e, 0xe3, 0x76, 0x8b, 0x3c,
+ 0x10, 0x6b, 0x04, 0xbe, 0x21, 0xdb, 0xf5, 0xbd, 0x46, 0x44, 0xbe, 0xbd,
+ 0x15, 0xce, 0xf9, 0xbd, 0x6e, 0x47, 0x4f, 0xbd, 0x16, 0x5d, 0xc9, 0x3e,
+ 0x80, 0xff, 0xd0, 0x3c, 0x27, 0x65, 0x22, 0xbd, 0x76, 0xec, 0x1e, 0x3e,
+ 0x7e, 0xc3, 0xd1, 0xbd, 0x7e, 0x72, 0x9a, 0xbd, 0xd1, 0x40, 0xb3, 0x3d,
+ 0x04, 0x39, 0xa2, 0xbe, 0x7b, 0x6f, 0xff, 0x3d, 0xd4, 0xe8, 0xb5, 0xbd,
+ 0xf3, 0xe3, 0x91, 0x3e, 0xe9, 0xd8, 0x50, 0xbe, 0x7e, 0x03, 0xa7, 0xbd,
+ 0xbd, 0x80, 0xbe, 0x3e, 0xa1, 0x4f, 0xf2, 0x3e, 0x31, 0x4b, 0x3b, 0x3f,
+ 0x7a, 0xa8, 0x59, 0xbe, 0x89, 0xb7, 0x8e, 0xbe, 0x52, 0x90, 0x28, 0xbe,
+ 0xcb, 0x68, 0xf5, 0x3d, 0x9f, 0x3c, 0xef, 0xbd, 0x12, 0xd6, 0x8e, 0x3d,
+ 0xa8, 0x4d, 0xc6, 0xbd, 0x8c, 0xcf, 0x93, 0x3d, 0x88, 0x4b, 0xa8, 0xbd,
+ 0xb7, 0xa3, 0x3a, 0xbe, 0xf5, 0x4b, 0xb8, 0xbd, 0x40, 0xb3, 0x11, 0x3d,
+ 0xaf, 0x7e, 0x21, 0x3e, 0x92, 0x87, 0x60, 0xbe, 0xb2, 0x87, 0x05, 0x3e,
+ 0x91, 0x34, 0xf4, 0xbd, 0x2b, 0x7b, 0x1a, 0xbd, 0x91, 0xdc, 0x6d, 0xbe,
+ 0xe6, 0x8c, 0xb6, 0x3e, 0x10, 0xaf, 0x5d, 0x3e, 0x71, 0x26, 0xe7, 0x3d,
+ 0x96, 0xab, 0x72, 0xbe, 0x3e, 0xfd, 0x42, 0x3e, 0x56, 0x66, 0xde, 0xbd,
+ 0xe6, 0x74, 0x8e, 0xbc, 0x83, 0xf6, 0x8c, 0xbd, 0x39, 0x54, 0xfd, 0xbd,
+ 0xbd, 0xc0, 0x00, 0xbe, 0x25, 0x04, 0x49, 0x3d, 0x15, 0x03, 0x2a, 0x3d,
+ 0xf9, 0x3c, 0x04, 0xbe, 0xc4, 0x61, 0xd8, 0xbd, 0xd3, 0x78, 0x59, 0x3b,
+ 0x2b, 0x74, 0x16, 0xbe, 0xe2, 0x38, 0x18, 0xba, 0xe7, 0x12, 0xa1, 0xbd,
+ 0xeb, 0xb9, 0x29, 0xbe, 0xb6, 0x9e, 0xa0, 0x3c, 0x0c, 0x07, 0x2d, 0x3e,
+ 0x01, 0x6f, 0x94, 0xbc, 0x17, 0x58, 0xcc, 0x3d, 0x3d, 0xb0, 0xa3, 0xbc,
+ 0x18, 0x03, 0x34, 0x3d, 0xf2, 0x3c, 0xe1, 0xbc, 0xea, 0x4c, 0x9c, 0xbd,
+ 0x96, 0xdc, 0xc0, 0xbd, 0x1a, 0xe3, 0xc4, 0xbd, 0xbd, 0xb0, 0xd7, 0x3d,
+ 0xa6, 0x13, 0x8e, 0xbd, 0x98, 0xb7, 0xc6, 0x3d, 0xc4, 0xc9, 0xfd, 0x3d,
+ 0xd9, 0x60, 0x9a, 0xbd, 0x78, 0x75, 0x88, 0x3d, 0x5b, 0xeb, 0x93, 0xbd,
+ 0x32, 0x3f, 0x0a, 0x3e, 0xef, 0xae, 0xd5, 0xbd, 0x39, 0x74, 0x12, 0x3e,
+ 0x44, 0xda, 0x7a, 0x3c, 0x93, 0x9a, 0x26, 0xbe, 0x4a, 0xad, 0x0e, 0x3c,
+ 0xa1, 0x72, 0xe7, 0xbd, 0xfc, 0xe2, 0x8d, 0xbd, 0x83, 0x51, 0x24, 0x3d,
+ 0xc5, 0x16, 0xb8, 0x3d, 0xae, 0xb3, 0x9d, 0xbb, 0xfb, 0x3c, 0x25, 0x3c,
+ 0xd8, 0xd8, 0xc7, 0x3d, 0x8c, 0xbc, 0x01, 0xbe, 0x92, 0xc4, 0x8b, 0xbd,
+ 0x83, 0x76, 0x5f, 0xbc, 0x53, 0x84, 0x24, 0xbc, 0x5f, 0x5a, 0x92, 0x3d,
+ 0xee, 0xd6, 0x2c, 0xbd, 0xc2, 0x77, 0xcb, 0x3d, 0x2a, 0x60, 0xd0, 0x3d,
+ 0x81, 0xf4, 0xcd, 0xbd, 0xd2, 0xa6, 0xc1, 0x3d, 0x66, 0xc5, 0x92, 0xba,
+ 0x3c, 0xf5, 0x0f, 0x39, 0xac, 0xe9, 0xbc, 0xbd, 0x8a, 0xf8, 0x10, 0xbd,
+ 0x59, 0x0a, 0x64, 0x3d, 0x74, 0xcd, 0x62, 0xbc, 0x80, 0x30, 0x55, 0xbc,
+ 0x2c, 0x95, 0x31, 0xbd, 0x17, 0xb6, 0x76, 0xbe, 0x12, 0x29, 0x64, 0xbe,
+ 0xfe, 0xf5, 0x6f, 0xbe, 0xb3, 0xd5, 0x03, 0xbe, 0xf0, 0x9f, 0x62, 0xbd,
+ 0x11, 0x0b, 0xed, 0x3d, 0x18, 0x8b, 0x26, 0x3d, 0x42, 0x47, 0x69, 0x3d,
+ 0x63, 0x6e, 0xa8, 0xbd, 0xea, 0x6c, 0x30, 0x3a, 0xde, 0x90, 0xc2, 0x3d,
+ 0x4c, 0xec, 0xed, 0xbd, 0xad, 0xa2, 0x59, 0x3d, 0xa9, 0x1b, 0xd1, 0xbd,
+ 0xfd, 0x98, 0x72, 0xbe, 0x53, 0x3e, 0x23, 0xbe, 0xbc, 0x81, 0xaf, 0xbd,
+ 0x51, 0x0d, 0xfe, 0x3d, 0x78, 0x27, 0xaa, 0xbd, 0xb5, 0x75, 0xe5, 0x3d,
+ 0xbe, 0xac, 0xb2, 0x3d, 0xff, 0xd5, 0x0d, 0x3e, 0xc9, 0x34, 0xcf, 0xbd,
+ 0x14, 0xa9, 0x16, 0xbc, 0x74, 0x27, 0x71, 0xbd, 0x0c, 0xd1, 0x39, 0x3d,
+ 0x01, 0x64, 0x3f, 0xbe, 0xd7, 0x64, 0x4d, 0x3d, 0x6f, 0x06, 0x8d, 0xbe,
+ 0x5e, 0x0c, 0x1b, 0xbc, 0x9b, 0x2b, 0x80, 0x3c, 0x4f, 0x0e, 0xc7, 0x3d,
+ 0x94, 0x3b, 0x2f, 0xbe, 0x29, 0x7f, 0x21, 0x3e, 0x95, 0xf4, 0x66, 0xbd,
+ 0x64, 0xf9, 0x53, 0xbe, 0xa2, 0x69, 0xd0, 0x3d, 0xcc, 0x9e, 0x14, 0xbe,
+ 0x52, 0x7d, 0x01, 0xbe, 0x94, 0x53, 0x05, 0xbe, 0xf3, 0xf3, 0xcd, 0x3d,
+ 0xf8, 0x6d, 0xe4, 0xbd, 0x78, 0x82, 0x93, 0xbe, 0xef, 0x9a, 0xf3, 0xbd,
+ 0xff, 0xee, 0xdb, 0xbd, 0x12, 0xd5, 0x1d, 0xbe, 0x3c, 0x3a, 0x0c, 0xbe,
+ 0x48, 0x39, 0x42, 0x3e, 0xe0, 0x02, 0x8c, 0x3d, 0x17, 0x26, 0xd8, 0x3c,
+ 0x62, 0xc7, 0xe5, 0xbd, 0xe4, 0x00, 0x15, 0xbc, 0x71, 0xa3, 0x58, 0x3d,
+ 0x4e, 0x17, 0xac, 0x3d, 0x4e, 0x1b, 0x95, 0xbb, 0x52, 0x05, 0x87, 0x3d,
+ 0x4d, 0x4e, 0xba, 0xbd, 0xf3, 0x56, 0x2b, 0xbe, 0x81, 0xd7, 0x81, 0x3c,
+ 0xde, 0xd1, 0x23, 0xbd, 0x87, 0x28, 0xe4, 0xbc, 0xa9, 0x45, 0x98, 0xbd,
+ 0x90, 0xdc, 0xaf, 0xbd, 0xe9, 0x13, 0xed, 0xbd, 0x43, 0x5e, 0x07, 0xbe,
+ 0x2f, 0x3f, 0xb1, 0xbd, 0xc2, 0xd5, 0x03, 0x3e, 0x5b, 0xbf, 0x5f, 0xbd,
+ 0x75, 0xbb, 0xe7, 0x3d, 0xde, 0xbe, 0x66, 0xbe, 0x17, 0xd9, 0x17, 0xbe,
+ 0x89, 0x55, 0xcb, 0x3c, 0x50, 0xdc, 0xaf, 0xbd, 0xaf, 0xdf, 0xf1, 0xbd,
+ 0x11, 0x32, 0xc1, 0xbd, 0xdc, 0x30, 0xb7, 0xbd, 0x09, 0x86, 0x6d, 0xbd,
+ 0x4d, 0x05, 0xdf, 0x3c, 0xe5, 0x59, 0xdd, 0x3d, 0x66, 0xe9, 0xa2, 0xbd,
+ 0x38, 0x26, 0x96, 0xbd, 0xc2, 0x0e, 0x1c, 0x3e, 0x0c, 0x96, 0x2d, 0xbe,
+ 0x6b, 0x9d, 0x06, 0x3c, 0x31, 0x8e, 0xea, 0xbd, 0xd5, 0x57, 0x25, 0xbe,
+ 0x22, 0xcd, 0x85, 0x3d, 0x38, 0x16, 0xf8, 0xbd, 0x62, 0xf5, 0xff, 0x3d,
+ 0x9f, 0xd3, 0x4b, 0xbd, 0x83, 0x05, 0x9a, 0xbd, 0xe7, 0x2e, 0xf7, 0x3d,
+ 0x0d, 0xba, 0xfe, 0x3d, 0x9a, 0x0f, 0xfa, 0xbd, 0x98, 0x6c, 0xc9, 0xbd,
+ 0xbc, 0x9f, 0xe1, 0xbd, 0x26, 0xd3, 0x8a, 0xbc, 0x49, 0x27, 0x8a, 0xbd,
+ 0x64, 0xe3, 0x05, 0xbd, 0xe1, 0xa0, 0xb0, 0xbc, 0x52, 0xf6, 0xc5, 0xbd,
+ 0x83, 0x5f, 0xc8, 0xbd, 0xbe, 0x6c, 0x48, 0xbe, 0xa9, 0x43, 0xbd, 0x3d,
+ 0xb5, 0xf4, 0x3f, 0xbe, 0x4b, 0x30, 0xd7, 0x3b, 0x7b, 0xb4, 0xd4, 0x3d,
+ 0x06, 0x13, 0xf2, 0x3d, 0x9a, 0x0e, 0x86, 0x3d, 0xea, 0xa6, 0x23, 0xbd,
+ 0xac, 0xd2, 0x87, 0x3d, 0x7d, 0x45, 0x10, 0xbe, 0x80, 0x92, 0xfb, 0xbd,
+ 0xad, 0xbd, 0x6c, 0xbd, 0x3d, 0x7b, 0x80, 0xbd, 0x0f, 0x8d, 0x92, 0x3d,
+ 0x36, 0x40, 0x94, 0x3b, 0x8d, 0xa8, 0x00, 0xbe, 0x96, 0x56, 0xa0, 0xbd,
+ 0x07, 0xac, 0xf2, 0xbd, 0x87, 0x47, 0x58, 0x3d, 0x4c, 0x91, 0xf0, 0xbc,
+ 0x2f, 0x33, 0xe7, 0xbd, 0x9f, 0x16, 0xcf, 0x3c, 0x59, 0xa9, 0x0b, 0xbe,
+ 0xac, 0x8a, 0xb2, 0x3d, 0x4d, 0x16, 0xc2, 0xbd, 0x10, 0x84, 0xbe, 0x3c,
+ 0xf3, 0xf0, 0xb4, 0xbc, 0xc9, 0xd3, 0xde, 0xbd, 0x07, 0xa7, 0x12, 0xbe,
+ 0x40, 0xc3, 0xc4, 0xbd, 0x62, 0xf0, 0x08, 0xbb, 0x1f, 0x41, 0x3a, 0x3c,
+ 0xf4, 0xa0, 0x7e, 0x3c, 0xc1, 0x11, 0x37, 0x3b, 0xbd, 0xfa, 0xfc, 0x3a,
+ 0xbb, 0xeb, 0x0a, 0x3e, 0x2c, 0x2b, 0x58, 0x3d, 0x46, 0xd9, 0x05, 0x3e,
+ 0xa3, 0x07, 0xb9, 0x3d, 0x0e, 0xa6, 0x1a, 0xbe, 0x2c, 0x35, 0xee, 0x3d,
+ 0x3b, 0x0f, 0x90, 0x3c, 0xd4, 0xcc, 0x58, 0x3d, 0xe2, 0x6c, 0x88, 0xbd,
+ 0xde, 0x1a, 0xe3, 0xbb, 0x97, 0xd5, 0x10, 0xbe, 0xe2, 0xa4, 0x06, 0xbe,
+ 0x21, 0xf6, 0x3b, 0xbe, 0x2b, 0xc1, 0xda, 0xbd, 0x1d, 0x30, 0x15, 0x3d,
+ 0x8e, 0xd9, 0x76, 0x3a, 0x93, 0x7c, 0x9d, 0x3d, 0x13, 0xff, 0x82, 0x3a,
+ 0x9e, 0x82, 0xe7, 0xbd, 0xeb, 0xdd, 0x19, 0xbe, 0x17, 0xbc, 0xac, 0xbd,
+ 0x08, 0x58, 0xe7, 0xbd, 0xac, 0xaa, 0xcc, 0xbd, 0xe0, 0xe6, 0xc3, 0x3d,
+ 0xf7, 0x46, 0x9b, 0xbe, 0xa0, 0xb2, 0x77, 0xbc, 0x02, 0x45, 0xbc, 0xbd,
+ 0x7d, 0x34, 0x16, 0xbe, 0xe7, 0x33, 0xb0, 0x3c, 0xc8, 0x61, 0x8d, 0xbd,
+ 0x50, 0xc5, 0x35, 0xbe, 0x87, 0xa3, 0x95, 0xbc, 0x34, 0xd0, 0x65, 0x3d,
+ 0xd9, 0x2e, 0x05, 0x3d, 0x11, 0xf6, 0x90, 0xbd, 0x16, 0xd4, 0xe8, 0xbd,
+ 0xc4, 0x86, 0xb2, 0x3d, 0x37, 0x82, 0x4d, 0x3e, 0x44, 0x81, 0xdb, 0x3c,
+ 0xb2, 0x3b, 0xee, 0xbb, 0xa4, 0x39, 0xae, 0x3d, 0xf5, 0xc0, 0xa7, 0xbb,
+ 0xaa, 0xc4, 0x02, 0xbd, 0xee, 0xf4, 0x04, 0x3d, 0x24, 0xd6, 0xa5, 0x3d,
+ 0x00, 0xea, 0x96, 0x3c, 0xa2, 0x02, 0x48, 0xbe, 0x83, 0x17, 0x1a, 0x3e,
+ 0x67, 0x0c, 0xb8, 0x3c, 0x69, 0x96, 0xb8, 0xbd, 0x47, 0x8b, 0x71, 0x3d,
+ 0x80, 0xb3, 0x30, 0xbe, 0x2e, 0x74, 0x5b, 0xbd, 0x0e, 0x73, 0x1a, 0x3e,
+ 0x48, 0x60, 0x0b, 0xbe, 0x46, 0x8f, 0xce, 0x3c, 0x5f, 0xd8, 0x03, 0x3e,
+ 0xcd, 0xc9, 0x43, 0x3d, 0x8f, 0xcc, 0x90, 0x3d, 0xf4, 0xae, 0xe5, 0x3d,
+ 0xd9, 0xfa, 0x52, 0x3e, 0xaf, 0xae, 0x20, 0x3e, 0x90, 0x73, 0x11, 0x3e,
+ 0xce, 0x6d, 0x08, 0x3d, 0x42, 0x5e, 0xec, 0x3d, 0x9f, 0x98, 0x02, 0x3d,
+ 0x8a, 0x35, 0xb3, 0x3c, 0x09, 0xdb, 0x04, 0x3e, 0x0c, 0xee, 0x25, 0xbe,
+ 0x06, 0x87, 0x5d, 0x3e, 0x2b, 0x39, 0x51, 0xbe, 0x45, 0x63, 0x42, 0x3d,
+ 0xd2, 0x1e, 0x20, 0xbe, 0x25, 0x68, 0xc2, 0xbb, 0xed, 0x48, 0x3c, 0xbb,
+ 0x5d, 0x8d, 0xe0, 0xbc, 0xe5, 0x5a, 0xf3, 0x3d, 0x59, 0xd7, 0xd2, 0x3d,
+ 0x81, 0xcf, 0xda, 0x3d, 0x05, 0x74, 0x40, 0xbc, 0x6d, 0x3d, 0xc2, 0x3c,
+ 0xbe, 0x68, 0x54, 0x3e, 0x49, 0x53, 0x26, 0x3e, 0xe2, 0xda, 0x99, 0x38,
+ 0x89, 0xde, 0x10, 0xbe, 0xd7, 0xae, 0xf6, 0x3c, 0x79, 0x98, 0xec, 0x3c,
+ 0xbd, 0x4a, 0x9b, 0xbe, 0x26, 0xb7, 0x04, 0x3e, 0xdb, 0x59, 0x9c, 0xbb,
+ 0xcf, 0x0f, 0xd4, 0x3d, 0x4a, 0xf8, 0x9e, 0x3d, 0x80, 0xe3, 0xdb, 0xbd,
+ 0x05, 0x0f, 0x2c, 0xbe, 0xdf, 0xc9, 0x4a, 0xbe, 0xa5, 0xdf, 0xb5, 0xbd,
+ 0xf7, 0x60, 0xdb, 0xbd, 0x53, 0x33, 0x37, 0x3d, 0xcd, 0xa0, 0x87, 0x3b,
+ 0x3b, 0x5f, 0xc8, 0xbd, 0xf2, 0x71, 0xe9, 0x3c, 0xdb, 0x1a, 0xe9, 0xbd,
+ 0x40, 0x64, 0x43, 0xbe, 0xd5, 0x17, 0x3e, 0xbd, 0x7f, 0x2a, 0xa3, 0x3c,
+ 0x1b, 0x72, 0x15, 0xbc, 0x9e, 0x30, 0x13, 0xbe, 0x49, 0xea, 0x89, 0xbc,
+ 0x4f, 0x90, 0x90, 0x3a, 0x86, 0xe7, 0x01, 0x3e, 0xf5, 0xa2, 0x84, 0x3d,
+ 0xdb, 0x23, 0xe2, 0x3c, 0x15, 0xb0, 0xc3, 0xbd, 0xdd, 0xe6, 0xd2, 0xbd,
+ 0x70, 0x34, 0x74, 0x3d, 0x57, 0xc5, 0x2c, 0xbc, 0x83, 0xbd, 0x81, 0xbd,
+ 0x71, 0x4c, 0x1c, 0x3e, 0x98, 0x3c, 0x5f, 0xbc, 0x50, 0x93, 0x9c, 0x3d,
+ 0x1b, 0x9b, 0xbd, 0x3d, 0x31, 0x24, 0x72, 0x3c, 0x67, 0xb4, 0xd2, 0xbd,
+ 0x69, 0x96, 0xb7, 0x3d, 0x3e, 0xc8, 0x69, 0xbd, 0x56, 0x7a, 0xeb, 0x3d,
+ 0x29, 0xf8, 0x1b, 0xbd, 0x41, 0x17, 0x6f, 0xbe, 0x5d, 0x01, 0x8f, 0xbd,
+ 0x9e, 0x8c, 0x36, 0xbe, 0x02, 0x49, 0x42, 0x3d, 0x3c, 0x75, 0x55, 0xbd,
+ 0xd4, 0x97, 0x08, 0xbe, 0x3b, 0x20, 0xfd, 0x3c, 0xbd, 0x72, 0x17, 0xbe,
+ 0xd6, 0xe2, 0x36, 0xbc, 0x12, 0x41, 0x43, 0xbd, 0xd2, 0xb5, 0x0a, 0xbd,
+ 0x49, 0x07, 0x7d, 0xbe, 0xd1, 0x22, 0x29, 0x3e, 0xcd, 0x78, 0xb8, 0xbd,
+ 0xa1, 0x7c, 0x12, 0x3d, 0x40, 0x92, 0x06, 0xbe, 0x34, 0xd9, 0x17, 0xbd,
+ 0x69, 0x04, 0xed, 0xbd, 0x28, 0x21, 0xb1, 0xbd, 0x91, 0x06, 0xbc, 0x3c,
+ 0xc3, 0xb5, 0x71, 0x3c, 0x41, 0x12, 0x24, 0x3d, 0xb1, 0xe6, 0x63, 0xbe,
+ 0xa2, 0xae, 0x8c, 0xbe, 0x32, 0x39, 0x7d, 0x3d, 0x2a, 0x01, 0xa3, 0xbd,
+ 0xbd, 0x0e, 0x58, 0xbd, 0x09, 0x35, 0xa1, 0xbd, 0x4a, 0xe9, 0x7a, 0xbc,
+ 0x36, 0x4d, 0xf3, 0xbd, 0xca, 0x22, 0x52, 0xbe, 0xfe, 0x42, 0xf4, 0xbd,
+ 0xa4, 0xe1, 0x2a, 0xbe, 0x4a, 0xf4, 0xb3, 0xbd, 0x29, 0x15, 0x0a, 0x3e,
+ 0xe4, 0x3b, 0x32, 0x3e, 0xa8, 0x6c, 0xe3, 0x3d, 0x4c, 0x45, 0xa3, 0xbc,
+ 0x52, 0x96, 0xda, 0xbd, 0xcb, 0x47, 0x13, 0x3c, 0xe1, 0x1b, 0xf3, 0xbe,
+ 0x0d, 0x04, 0xb7, 0xbd, 0x40, 0x09, 0xe5, 0x3c, 0x0f, 0x03, 0x56, 0xbe,
+ 0x35, 0xb5, 0x64, 0xbd, 0x48, 0x8e, 0x10, 0xbd, 0x69, 0xd6, 0xce, 0x3c,
+ 0x42, 0xf5, 0xe4, 0xbd, 0x18, 0x72, 0x11, 0x3e, 0x14, 0xd3, 0x86, 0xbd,
+ 0xd2, 0x3a, 0x4e, 0xbd, 0xee, 0x95, 0x0e, 0x3e, 0x8e, 0x06, 0xbd, 0x3d,
+ 0xce, 0x1f, 0xc4, 0xbe, 0x3e, 0x69, 0xd8, 0xbe, 0xf7, 0x5c, 0x6c, 0xbd,
+ 0x27, 0xda, 0xe0, 0x3d, 0xed, 0x29, 0x82, 0xbd, 0xec, 0xf2, 0xbf, 0xbc,
+ 0xbf, 0x58, 0xce, 0x3d, 0x66, 0x5a, 0xa2, 0xbd, 0xbf, 0x4a, 0x15, 0xbe,
+ 0x12, 0x9e, 0x5a, 0xbd, 0x42, 0x7c, 0xce, 0xbc, 0x30, 0xb8, 0x97, 0x3d,
+ 0x85, 0x2b, 0x0d, 0x3e, 0xfe, 0x44, 0xc6, 0xbd, 0xbe, 0x2d, 0xde, 0x3c,
+ 0x8c, 0xbd, 0xf3, 0xbd, 0x28, 0x44, 0x9b, 0xbe, 0xad, 0x8a, 0xc1, 0xbd,
+ 0x65, 0x8c, 0x27, 0x3b, 0x27, 0x99, 0x23, 0x3e, 0x5f, 0x63, 0xac, 0x3d,
+ 0xd6, 0x75, 0x2f, 0xbe, 0xd0, 0xfc, 0x5e, 0x3d, 0x4b, 0x69, 0x45, 0x3e,
+ 0x5b, 0xaa, 0xe6, 0x3c, 0x6b, 0x8c, 0xd3, 0xbd, 0xc1, 0xd3, 0xc8, 0x3d,
+ 0x29, 0x92, 0x02, 0x3e, 0xbd, 0xbf, 0xea, 0xbd, 0xfa, 0x9a, 0xaa, 0x3d,
+ 0x19, 0x22, 0x1c, 0xbe, 0x7e, 0xb8, 0xe4, 0xbd, 0xdc, 0x9c, 0xa6, 0xbd,
+ 0xcf, 0xc0, 0xa8, 0xbc, 0xdd, 0x06, 0x03, 0x3d, 0xb6, 0x16, 0x93, 0xbe,
+ 0xe4, 0x7c, 0xef, 0x3b, 0x2b, 0xd6, 0x18, 0x3e, 0xa8, 0xd1, 0x08, 0xbe,
+ 0x82, 0x58, 0xb4, 0xbd, 0x32, 0xb1, 0x8d, 0x3d, 0x1f, 0x3f, 0x10, 0xbe,
+ 0x75, 0x80, 0x6a, 0xbd, 0x9e, 0x37, 0x0c, 0xbe, 0x9e, 0x0f, 0x29, 0xbc,
+ 0x24, 0xfa, 0x57, 0xbd, 0x79, 0x89, 0x89, 0xbd, 0x35, 0x38, 0xc0, 0x3d,
+ 0x9b, 0x43, 0x69, 0xbe, 0x36, 0x37, 0x26, 0xbe, 0xef, 0x8e, 0x94, 0xbd,
+ 0x08, 0x93, 0xc2, 0x3c, 0xe5, 0x7f, 0x22, 0xbe, 0x8c, 0x6e, 0xf4, 0x3d,
+ 0x2f, 0xaa, 0x36, 0xbd, 0x5b, 0xf5, 0x53, 0x3d, 0xd4, 0xeb, 0x13, 0x3d,
+ 0xe1, 0x80, 0x78, 0x3d, 0x5c, 0x4e, 0xf0, 0xbb, 0x45, 0x27, 0xc9, 0xbd,
+ 0x2e, 0x7c, 0xf2, 0xbc, 0xc5, 0x1d, 0x97, 0xbd, 0x0c, 0x31, 0xaf, 0xbe,
+ 0x98, 0x8d, 0x20, 0x3e, 0x23, 0x28, 0x19, 0xbd, 0x83, 0x9b, 0x63, 0xbd,
+ 0x3a, 0x8c, 0x1e, 0x3d, 0xa6, 0xc1, 0x6a, 0xbc, 0xd4, 0x42, 0x3f, 0x3e,
+ 0x3c, 0xd5, 0xc5, 0x3c, 0xac, 0xf2, 0x76, 0xbd, 0x51, 0xf9, 0x01, 0xbe,
+ 0xc0, 0xac, 0x1f, 0x3d, 0x10, 0x4c, 0x3e, 0xbe, 0x9b, 0x2d, 0xb8, 0xbd,
+ 0xaf, 0x5e, 0x88, 0x3d, 0xb9, 0xc4, 0xdf, 0x3d, 0x8e, 0x5e, 0xde, 0x3d,
+ 0x10, 0x4c, 0xc8, 0x3d, 0x56, 0xeb, 0x28, 0x3e, 0x49, 0x4e, 0x58, 0xbe,
+ 0xad, 0x37, 0x97, 0xbd, 0x95, 0xd7, 0x8d, 0x3e, 0x5d, 0xef, 0xab, 0x3e,
+ 0x05, 0xa0, 0xb0, 0x3d, 0x9b, 0x59, 0x0e, 0x3d, 0xf0, 0xf1, 0x57, 0xbe,
+ 0x4f, 0xb1, 0x21, 0xbe, 0xc1, 0x37, 0x76, 0xbe, 0x95, 0x96, 0xcf, 0xbd,
+ 0x93, 0xf0, 0x9f, 0xbd, 0x4f, 0x18, 0x59, 0x3c, 0xa0, 0xdb, 0x24, 0x3c,
+ 0x3c, 0xcc, 0x66, 0x3d, 0xb1, 0x69, 0x44, 0xbd, 0xbb, 0xb2, 0x85, 0x3d,
+ 0xd3, 0x70, 0x72, 0xbd, 0x6e, 0xb6, 0x7d, 0xbd, 0xee, 0x65, 0xd3, 0xbd,
+ 0x34, 0x67, 0xc6, 0xbd, 0x0d, 0x78, 0x34, 0x3d, 0x8a, 0x2e, 0xb0, 0x3c,
+ 0x69, 0xe5, 0x3c, 0xbc, 0x98, 0x6e, 0x2e, 0xbe, 0xa3, 0xc8, 0x2c, 0xbe,
+ 0x35, 0x0e, 0xb4, 0x3b, 0xd1, 0x5a, 0x5b, 0x3c, 0x3e, 0x83, 0xf1, 0x3d,
+ 0x9e, 0x99, 0xdb, 0x3c, 0xee, 0xdf, 0x52, 0x3e, 0x10, 0x48, 0x16, 0x3e,
+ 0x00, 0x8f, 0x01, 0xbd, 0xff, 0x1a, 0x3d, 0x3e, 0x6a, 0x5b, 0xf1, 0x3d,
+ 0xd4, 0x99, 0x02, 0xbe, 0x02, 0xd0, 0x0c, 0x3d, 0x3d, 0xfb, 0x61, 0xbd,
+ 0xff, 0x2b, 0xa1, 0xbd, 0xa6, 0xe5, 0xf7, 0xbd, 0x72, 0x25, 0x44, 0x3c,
+ 0x30, 0x75, 0xd3, 0x3d, 0x68, 0xd6, 0x1e, 0xbc, 0x3b, 0x38, 0x6c, 0x3e,
+ 0x3d, 0x27, 0x3b, 0x3c, 0xe4, 0xb8, 0x8d, 0x3d, 0xe8, 0x19, 0xbf, 0xbc,
+ 0xdd, 0x33, 0x21, 0xbd, 0x1d, 0xf4, 0x28, 0x3e, 0xd4, 0xfc, 0x28, 0x3b,
+ 0x69, 0x66, 0xa9, 0x3c, 0xc7, 0x86, 0xe5, 0x3c, 0xbb, 0x87, 0x8b, 0xbd,
+ 0x25, 0x03, 0x35, 0xbe, 0x62, 0xf1, 0x27, 0xbd, 0x4e, 0xc4, 0xde, 0xbd,
+ 0x1a, 0xaa, 0xb5, 0x3d, 0x47, 0x3d, 0xfd, 0xbd, 0xfb, 0xf8, 0xd6, 0x3d,
+ 0xdf, 0x7f, 0x67, 0x3b, 0xad, 0x51, 0xbd, 0x3e, 0x43, 0x08, 0x20, 0x3e,
+ 0x28, 0xf5, 0x98, 0xbd, 0x2a, 0x94, 0xa6, 0xbc, 0x74, 0x93, 0xa4, 0xbe,
+ 0x5a, 0x9b, 0x0d, 0x3e, 0x5e, 0x3c, 0x10, 0x3e, 0x77, 0xeb, 0xfa, 0x3d,
+ 0xab, 0x1c, 0x56, 0x3d, 0xdd, 0x60, 0xa4, 0xba, 0xa2, 0x8f, 0x11, 0x3e,
+ 0xb6, 0x35, 0x74, 0x3c, 0xd4, 0x43, 0x9a, 0xbb, 0x3d, 0x56, 0x0b, 0x3e,
+ 0x3d, 0xaa, 0x2c, 0xbe, 0xe7, 0x19, 0xaa, 0x3d, 0x4b, 0x1c, 0x07, 0xbe,
+ 0x38, 0xc7, 0x74, 0xbe, 0xcd, 0x3a, 0x2a, 0x3e, 0xc5, 0x64, 0xf4, 0x3c,
+ 0x5c, 0x74, 0xb6, 0x3d, 0x7c, 0x23, 0xf8, 0xbd, 0x27, 0x86, 0x55, 0x3e,
+ 0x3c, 0xb5, 0x57, 0x3d, 0xc9, 0x23, 0x29, 0x3e, 0x62, 0xdf, 0xd7, 0xbd,
+ 0xd9, 0x7b, 0x83, 0x3d, 0xf9, 0xec, 0x28, 0xbe, 0x05, 0x49, 0x1f, 0xbe,
+ 0x7d, 0x7d, 0xe3, 0xbd, 0xab, 0x5e, 0x35, 0x3e, 0x99, 0x0c, 0x80, 0x3b,
+ 0x39, 0xcc, 0x16, 0xbe, 0x99, 0xe8, 0x50, 0x3d, 0x9d, 0x51, 0x5c, 0xbb,
+ 0xe7, 0x45, 0x58, 0x3e, 0xb9, 0x15, 0xb0, 0xbd, 0x1b, 0x8e, 0x56, 0x3e,
+ 0x68, 0xd1, 0x51, 0x3e, 0xa3, 0x76, 0xc7, 0x3c, 0x0b, 0xa2, 0xac, 0xbd,
+ 0xbd, 0xf5, 0x5a, 0x3c, 0xb4, 0x9a, 0xa5, 0x3d, 0xe5, 0x89, 0x2e, 0x3e,
+ 0x40, 0xea, 0x23, 0x3e, 0x17, 0x24, 0x82, 0xbd, 0x9f, 0x96, 0xfa, 0xbd,
+ 0x38, 0x3a, 0x25, 0xbe, 0x6b, 0xa0, 0xd4, 0x3d, 0xee, 0x65, 0xd6, 0x3d,
+ 0x74, 0x06, 0x8a, 0x3e, 0x71, 0x0b, 0x6b, 0xbe, 0x3b, 0xf1, 0xc1, 0x3c,
+ 0x78, 0x1d, 0x12, 0x3e, 0x82, 0x7d, 0x5b, 0xbd, 0x4f, 0xaf, 0xc5, 0xbd,
+ 0x95, 0x3c, 0xac, 0x3d, 0x6a, 0x48, 0xee, 0xbd, 0x20, 0x7c, 0x24, 0x3e,
+ 0xb1, 0x50, 0x29, 0xbd, 0x2e, 0x54, 0x35, 0xbe, 0x32, 0x2d, 0x33, 0xbe,
+ 0xe2, 0x46, 0x80, 0x3d, 0x07, 0x80, 0x14, 0x3d, 0x36, 0x56, 0xe9, 0xbc,
+ 0x23, 0x85, 0x67, 0x3e, 0xba, 0x73, 0xea, 0xbc, 0xfb, 0xa8, 0xd6, 0xbd,
+ 0x8c, 0x4d, 0x99, 0xb9, 0x5a, 0x0d, 0x62, 0x3d, 0x50, 0x67, 0x45, 0xbc,
+ 0x17, 0x1b, 0xd5, 0x3d, 0x9f, 0xf1, 0xdd, 0xbc, 0x32, 0xe8, 0x85, 0xbb,
+ 0xec, 0xfd, 0x94, 0xbd, 0xb6, 0x12, 0x78, 0xbc, 0x7d, 0x63, 0xa6, 0xbc,
+ 0x4d, 0x37, 0xf7, 0x3c, 0x92, 0x08, 0x35, 0xbe, 0x5c, 0xe2, 0x7a, 0x3e,
+ 0xc4, 0x78, 0xf7, 0x3d, 0x74, 0x8e, 0x35, 0xbe, 0x94, 0x4d, 0x86, 0xbd,
+ 0x45, 0x91, 0x9f, 0xbd, 0xc5, 0x02, 0x94, 0x3c, 0x1f, 0x13, 0x88, 0x3d,
+ 0x24, 0x58, 0xc2, 0xbd, 0xeb, 0x05, 0x3b, 0xbe, 0x68, 0x05, 0x94, 0x3e,
+ 0x3e, 0x6a, 0x03, 0x3c, 0x99, 0xe4, 0xed, 0x3d, 0xdc, 0xb1, 0x5c, 0xbe,
+ 0x34, 0xf1, 0xfe, 0x3d, 0xd4, 0x24, 0xe0, 0xbd, 0xe8, 0xea, 0x31, 0xbe,
+ 0xbb, 0x29, 0x30, 0x3e, 0xbb, 0x59, 0x0d, 0x3d, 0x04, 0x64, 0x62, 0xbd,
+ 0x63, 0x58, 0x8e, 0x3d, 0xab, 0x19, 0x04, 0x3e, 0x4c, 0x56, 0xbd, 0x3b,
+ 0x83, 0x25, 0xab, 0x3d, 0x3e, 0xe1, 0xd6, 0xbd, 0x48, 0x7f, 0xd9, 0x3d,
+ 0x97, 0xb9, 0x23, 0xbe, 0x42, 0x9d, 0x0e, 0x3d, 0x61, 0x5c, 0xc5, 0x3d,
+ 0xa6, 0x32, 0x43, 0xbd, 0xe8, 0x40, 0x3f, 0xbe, 0x94, 0x4d, 0xb6, 0xbb,
+ 0xd8, 0x75, 0x37, 0x3d, 0x49, 0x79, 0xf6, 0x3d, 0x79, 0x1a, 0xee, 0x3d,
+ 0x87, 0xb5, 0x7c, 0xbe, 0x13, 0x1c, 0x8b, 0x3c, 0xce, 0x3b, 0x90, 0xbd,
+ 0x07, 0x04, 0xee, 0xbd, 0xbd, 0x75, 0x4c, 0x3d, 0xf2, 0x70, 0xc7, 0x3d,
+ 0xe2, 0x48, 0x11, 0x3c, 0x2f, 0x86, 0x95, 0xbb, 0x44, 0x66, 0x10, 0xbd,
+ 0x89, 0x39, 0x4f, 0xbe, 0x68, 0x08, 0xa4, 0xbd, 0x12, 0x1d, 0x29, 0x3c,
+ 0x3f, 0xe8, 0x17, 0x3e, 0x16, 0x4a, 0xba, 0xbd, 0x63, 0x19, 0x0f, 0xbe,
+ 0x57, 0x10, 0xac, 0x3d, 0x99, 0x27, 0x29, 0xbc, 0x57, 0xae, 0x84, 0xbd,
+ 0x18, 0x91, 0x7d, 0xbd, 0x22, 0x7d, 0xbc, 0xbc, 0x4c, 0x3d, 0x56, 0x3e,
+ 0x04, 0x8d, 0x30, 0x3e, 0xc2, 0xba, 0x0a, 0x3d, 0xe9, 0x31, 0xe8, 0xbd,
+ 0x44, 0xdc, 0xf5, 0xbb, 0x4e, 0x2b, 0x1f, 0x3e, 0xbc, 0x54, 0x26, 0x3e,
+ 0x34, 0x16, 0xab, 0x3d, 0x3c, 0x8b, 0x47, 0xbc, 0xc5, 0x15, 0xef, 0x3c,
+ 0xfe, 0x68, 0x27, 0x3e, 0x70, 0x1b, 0x80, 0x3d, 0x15, 0x71, 0x07, 0xbe,
+ 0x47, 0x16, 0x18, 0x3e, 0xb2, 0x2d, 0x00, 0x3e, 0x09, 0xce, 0x6f, 0xbd,
+ 0xc9, 0x16, 0x2b, 0xbd, 0xa0, 0x3f, 0x98, 0x3e, 0xa8, 0x16, 0x31, 0xbe,
+ 0x95, 0x63, 0xde, 0x3c, 0x28, 0x8c, 0x8e, 0x3c, 0x6a, 0xcb, 0xb1, 0x3d,
+ 0x3b, 0x53, 0x06, 0x3e, 0x02, 0x03, 0xe4, 0xbd, 0x55, 0x4a, 0x92, 0x3d,
+ 0x8b, 0x7f, 0xd5, 0x3d, 0x3d, 0x7f, 0xe2, 0x3d, 0xa4, 0xb1, 0x03, 0xbd,
+ 0x7c, 0x58, 0x44, 0xbd, 0x42, 0x6f, 0x81, 0xbd, 0xab, 0x28, 0xb3, 0xbc,
+ 0x29, 0x30, 0xe6, 0x3d, 0xb3, 0xa2, 0x3f, 0xbd, 0x4d, 0xb8, 0x7a, 0xbe,
+ 0xdb, 0x7f, 0x47, 0x3d, 0x4b, 0x72, 0x52, 0xbd, 0xed, 0x8c, 0x4f, 0x3e,
+ 0xd6, 0xe9, 0xe3, 0xbd, 0xb2, 0xda, 0xc5, 0xbd, 0xa5, 0xf4, 0x83, 0x3d,
+ 0x5a, 0xb3, 0x11, 0x3c, 0xbf, 0x46, 0xc7, 0xbd, 0x59, 0x25, 0x03, 0xbe,
+ 0x55, 0x2a, 0x03, 0x3e, 0x89, 0x7e, 0x94, 0xbd, 0xb3, 0x6b, 0xaf, 0xbd,
+ 0x8b, 0xc4, 0x57, 0xbd, 0xdc, 0x25, 0x6c, 0x3e, 0x6c, 0xdb, 0xa3, 0x3c,
+ 0xa2, 0x91, 0x13, 0xbe, 0x25, 0xea, 0x2e, 0x3e, 0x7c, 0x57, 0x79, 0x3c,
+ 0xce, 0x20, 0x73, 0xbd, 0x1f, 0x83, 0x19, 0x3c, 0xa2, 0x4c, 0x97, 0xbd,
+ 0x93, 0xe0, 0x91, 0x3d, 0x6a, 0x95, 0xa7, 0x3d, 0xcd, 0x4e, 0x3d, 0xbe,
+ 0x15, 0x44, 0x83, 0x3c, 0x86, 0x38, 0xf3, 0xbc, 0x85, 0x0c, 0xe1, 0x3d,
+ 0xa9, 0xd7, 0x22, 0x3d, 0x75, 0x97, 0x1a, 0xbe, 0x6a, 0x11, 0x82, 0xbc,
+ 0xfb, 0x0e, 0x25, 0xbe, 0x78, 0x95, 0xc2, 0xbd, 0xf7, 0x5e, 0x36, 0xbe,
+ 0x54, 0x03, 0xda, 0xbd, 0xd6, 0x5d, 0xa5, 0xbd, 0xef, 0xca, 0x3b, 0x3d,
+ 0x1a, 0x11, 0xbb, 0xbc, 0x67, 0xa5, 0x3a, 0xbe, 0xa8, 0x98, 0x22, 0xbe,
+ 0xc6, 0x6a, 0x0b, 0xbe, 0x6b, 0xe3, 0xb5, 0xbd, 0x67, 0x66, 0x24, 0xbe,
+ 0xc0, 0x61, 0x0c, 0x3c, 0x78, 0x7d, 0x91, 0xbe, 0xd9, 0xf5, 0x16, 0x3e,
+ 0x39, 0xde, 0x05, 0xbe, 0xe9, 0x54, 0x36, 0x3c, 0xa1, 0xca, 0xe0, 0x3d,
+ 0xe0, 0x43, 0x05, 0x3e, 0xc9, 0x37, 0x0f, 0x3e, 0x0c, 0x51, 0x0d, 0x3d,
+ 0xe0, 0x2e, 0x15, 0x3e, 0x79, 0x6d, 0x4a, 0x3e, 0x74, 0x27, 0x78, 0xbc,
+ 0x02, 0x24, 0x88, 0xbe, 0x1b, 0x45, 0xbf, 0x3c, 0x9e, 0x7a, 0xa9, 0x3c,
+ 0x22, 0xa2, 0x8b, 0x3d, 0x8c, 0xe4, 0xec, 0xbd, 0x5a, 0xdb, 0x05, 0x3e,
+ 0xae, 0xde, 0xa2, 0x3d, 0x5b, 0x9d, 0x2a, 0x3c, 0x9d, 0x82, 0x00, 0xbe,
+ 0x9d, 0xa3, 0xe0, 0x3c, 0xe8, 0x6b, 0x4d, 0x3e, 0x97, 0x8d, 0xf2, 0x3d,
+ 0xfe, 0x0c, 0xe1, 0xbb, 0x76, 0xee, 0xbb, 0xbd, 0x96, 0x50, 0xc7, 0xbd,
+ 0x62, 0x4c, 0x28, 0xbe, 0xcc, 0x02, 0x7e, 0xbd, 0x2b, 0x7b, 0x49, 0xbe,
+ 0x9f, 0x30, 0x48, 0x3c, 0xf1, 0xb7, 0x61, 0xbe, 0x83, 0xa5, 0x5b, 0xbd,
+ 0x8e, 0x69, 0x29, 0x3d, 0xac, 0xcc, 0xae, 0x3d, 0x0e, 0xf8, 0x93, 0xba,
+ 0x58, 0xa5, 0x11, 0x3d, 0x55, 0x19, 0xdc, 0xbd, 0x60, 0x67, 0xaf, 0x3d,
+ 0xb3, 0xc3, 0xe3, 0xbd, 0xd4, 0x85, 0x25, 0x3e, 0xed, 0xb2, 0x84, 0xbd,
+ 0x1d, 0xeb, 0x3b, 0x3e, 0x22, 0x89, 0xf1, 0x3d, 0xe3, 0x7c, 0x1b, 0xbe,
+ 0x05, 0x44, 0x1f, 0x3d, 0xea, 0x4c, 0x00, 0x3e, 0x36, 0x76, 0x8c, 0x3d,
+ 0x7a, 0x73, 0x99, 0xbe, 0x05, 0xbb, 0xb6, 0x3b, 0x8f, 0x19, 0xa9, 0x3d,
+ 0x4e, 0xb5, 0x64, 0xbe, 0x45, 0x1a, 0x81, 0x3d, 0x81, 0xe1, 0x0e, 0x3c,
+ 0x02, 0x54, 0xb2, 0x3d, 0xc5, 0x4a, 0xb0, 0x3d, 0xdb, 0x71, 0x82, 0x3d,
+ 0x9f, 0xc5, 0x85, 0x3e, 0x52, 0xeb, 0xf2, 0xbc, 0xa4, 0x78, 0x11, 0xbf,
+ 0xb1, 0x92, 0xf7, 0x3d, 0x76, 0x02, 0x48, 0xbe, 0x24, 0xae, 0x12, 0x3c,
+ 0xd4, 0xdf, 0x87, 0x3d, 0xb9, 0xba, 0x87, 0xbd, 0xea, 0x0e, 0x2c, 0x3c,
+ 0x46, 0x11, 0x32, 0xbd, 0x19, 0x0b, 0x03, 0x3e, 0x54, 0xed, 0x97, 0x3d,
+ 0x27, 0x4c, 0x25, 0xbd, 0x26, 0xd7, 0x10, 0x3e, 0x7a, 0x74, 0x20, 0x3e,
+ 0x15, 0x62, 0x31, 0x3e, 0x65, 0x63, 0x87, 0xbd, 0xd6, 0x52, 0x08, 0xbe,
+ 0x3c, 0x3d, 0x96, 0x3c, 0x30, 0x47, 0xb5, 0x3d, 0x0f, 0xb4, 0xbd, 0x3d,
+ 0xf8, 0x49, 0x37, 0xbd, 0x1b, 0x9a, 0xee, 0xbd, 0xe7, 0xdc, 0xd7, 0x3d,
+ 0x26, 0x7c, 0xa0, 0x3c, 0x8d, 0x11, 0xf4, 0xbb, 0x17, 0xcb, 0x12, 0xbc,
+ 0x1f, 0xf7, 0x06, 0xbe, 0xab, 0x9a, 0xa8, 0xbd, 0x44, 0x43, 0x9c, 0xbe,
+ 0x57, 0xaa, 0x3d, 0x3d, 0x65, 0x4c, 0xe3, 0xbd, 0x80, 0xce, 0x62, 0xbd,
+ 0x13, 0xd9, 0x11, 0x3d, 0x98, 0x73, 0x12, 0x3e, 0xe2, 0xb4, 0x05, 0x3c,
+ 0x59, 0x2a, 0x75, 0xbd, 0xbb, 0x7a, 0x98, 0x3d, 0x44, 0x36, 0x17, 0x3e,
+ 0x16, 0xf8, 0x59, 0xbe, 0x60, 0xf7, 0xb4, 0xbd, 0x4f, 0xc6, 0x62, 0x3d,
+ 0xaf, 0xb9, 0x15, 0x3c, 0x43, 0xb6, 0x8b, 0x3d, 0x49, 0x70, 0x38, 0x3c,
+ 0x30, 0x26, 0xfe, 0xbd, 0xd6, 0xc7, 0x38, 0x3e, 0x2f, 0xeb, 0xce, 0x3d,
+ 0xbe, 0x1d, 0x6d, 0x3d, 0x5e, 0x47, 0x71, 0x3d, 0x02, 0x0a, 0x09, 0xbe,
+ 0x19, 0xc8, 0x4b, 0xbd, 0x73, 0xe2, 0xab, 0x3c, 0x70, 0xad, 0x3b, 0xbd,
+ 0xcd, 0xfe, 0xcc, 0x3b, 0x62, 0xd1, 0x9c, 0x3e, 0x08, 0xb3, 0x0a, 0xbd,
+ 0xd4, 0x65, 0xca, 0xbd, 0xb5, 0xe6, 0x5c, 0x3d, 0xc6, 0x75, 0x65, 0xbd,
+ 0xd7, 0x2e, 0xb1, 0xbe, 0xf5, 0xdb, 0xe2, 0xbd, 0xab, 0x30, 0xe8, 0x3d,
+ 0x20, 0x4f, 0x66, 0x3e, 0x32, 0x05, 0x19, 0x3e, 0xd7, 0x6a, 0xf2, 0x3d,
+ 0x40, 0xc1, 0x48, 0x3d, 0xee, 0x17, 0x8c, 0x3d, 0xa9, 0x60, 0x21, 0xbd,
+ 0x30, 0xd2, 0x27, 0x3e, 0x1f, 0xba, 0x59, 0x3e, 0x8d, 0x30, 0x23, 0xbd,
+ 0x0a, 0xa6, 0xc2, 0x3d, 0x64, 0x54, 0xb6, 0xbb, 0x6f, 0x53, 0x0d, 0xbc,
+ 0x9e, 0x72, 0x42, 0x3d, 0xf6, 0xba, 0x3c, 0xbd, 0x96, 0x6a, 0x22, 0x3e,
+ 0xdf, 0x59, 0x8e, 0x3e, 0x58, 0x97, 0xb1, 0x3e, 0x8e, 0x3e, 0xcf, 0x3c,
+ 0xd0, 0xbe, 0x5d, 0xbd, 0x68, 0xe2, 0x99, 0xbe, 0x00, 0x3c, 0x9d, 0xbd,
+ 0x1d, 0x0e, 0x76, 0xbe, 0x6e, 0x14, 0x53, 0xbd, 0x81, 0x29, 0x9d, 0xbc,
+ 0x56, 0x9d, 0x0b, 0x3e, 0x01, 0x5c, 0x42, 0x3e, 0x2b, 0x70, 0x02, 0xbe,
+ 0xd9, 0xa7, 0xad, 0xbc, 0x4e, 0x11, 0xff, 0xbd, 0x50, 0x18, 0xd6, 0xbc,
+ 0xa1, 0x15, 0x9a, 0x3d, 0xf4, 0xd0, 0x40, 0xbe, 0x5b, 0x0d, 0xdd, 0x3c,
+ 0x7d, 0x4b, 0x4a, 0x3c, 0x91, 0xb1, 0x0d, 0x3e, 0x0e, 0xb1, 0xe4, 0xbd,
+ 0x69, 0xfa, 0x90, 0x3d, 0x5d, 0xa2, 0x3b, 0xbe, 0x28, 0x66, 0x1d, 0x3e,
+ 0xc7, 0x17, 0xce, 0xbc, 0x09, 0x8d, 0x37, 0x3d, 0xd9, 0x3c, 0x10, 0x3e,
+ 0x42, 0x97, 0x41, 0x3e, 0xc9, 0x1b, 0x33, 0xbe, 0xab, 0xee, 0x3f, 0xbe,
+ 0x6c, 0x07, 0x29, 0xbd, 0xdf, 0x94, 0x3d, 0xbd, 0x35, 0xca, 0x28, 0x3e,
+ 0x84, 0x76, 0x47, 0xbe, 0x11, 0x83, 0xf9, 0x3d, 0x5f, 0xcf, 0x85, 0x3d,
+ 0x6c, 0x16, 0x8d, 0xbd, 0x06, 0x15, 0xa4, 0x3d, 0xd9, 0x63, 0x70, 0x3b,
+ 0x10, 0xf0, 0x3b, 0x3b, 0x3c, 0x61, 0xbf, 0x3c, 0x0e, 0x24, 0xf0, 0x3d,
+ 0xa4, 0xbf, 0x59, 0xbe, 0x4c, 0x70, 0xa3, 0x3e, 0x01, 0xc9, 0x06, 0x3c,
+ 0xcf, 0x59, 0x36, 0xbe, 0x1e, 0x17, 0x9d, 0x3d, 0xe8, 0x51, 0xa6, 0x3d,
+ 0x91, 0x26, 0xfe, 0x3b, 0x31, 0x76, 0x38, 0xbd, 0xbc, 0xdb, 0xf8, 0xbd,
+ 0xa9, 0x3e, 0x00, 0xbd, 0x1b, 0x34, 0xa1, 0xbd, 0x62, 0xf1, 0x43, 0x3e,
+ 0x82, 0x43, 0xa5, 0xbd, 0x9a, 0x5b, 0xc1, 0xbd, 0xf2, 0x89, 0x6e, 0x3d,
+ 0xae, 0x07, 0x43, 0xbe, 0xd4, 0xce, 0x4a, 0xbe, 0x33, 0xe7, 0xef, 0xba,
+ 0x8e, 0x31, 0x1e, 0xbd, 0x43, 0xb4, 0x19, 0xbe, 0x01, 0xeb, 0x83, 0xbd,
+ 0x61, 0x62, 0x09, 0xbe, 0xb0, 0xe6, 0xc1, 0x3c, 0x1e, 0x07, 0x5c, 0xbd,
+ 0x1c, 0x84, 0x14, 0x3e, 0xc4, 0x23, 0xaf, 0xbd, 0xd3, 0xbe, 0xd7, 0x3d,
+ 0x5b, 0xbe, 0x3c, 0xbe, 0x48, 0x95, 0x1f, 0xbe, 0xbd, 0xe2, 0x57, 0xbd,
+ 0xea, 0x20, 0xf9, 0x3d, 0x9d, 0x63, 0x5d, 0xbd, 0xd1, 0xc8, 0xcd, 0x3d,
+ 0x08, 0xe5, 0xe0, 0xbd, 0xca, 0x5d, 0x15, 0xbe, 0x9f, 0x9d, 0x53, 0x3d,
+ 0x14, 0x57, 0x7b, 0x3d, 0x6c, 0x8e, 0x97, 0x3d, 0x35, 0x85, 0x10, 0x3e,
+ 0x57, 0xb8, 0x0f, 0xbd, 0x8e, 0xa4, 0x66, 0xbd, 0x39, 0xcf, 0x96, 0xbd,
+ 0x3b, 0x75, 0xb9, 0x3d, 0x9e, 0x2c, 0x30, 0x3d, 0xed, 0xd0, 0x1d, 0x3e,
+ 0xd1, 0x69, 0x39, 0x3e, 0x94, 0x7d, 0x09, 0xbe, 0x96, 0x79, 0x37, 0x3e,
+ 0x30, 0x39, 0x3c, 0x3d, 0xbc, 0x58, 0xa0, 0x3d, 0xcb, 0x4e, 0xe0, 0xbd,
+ 0xac, 0x6f, 0xf8, 0x3d, 0xa6, 0x3e, 0x18, 0xbe, 0x00, 0xaf, 0xda, 0x3d,
+ 0xcf, 0x77, 0xff, 0xbd, 0x14, 0x32, 0x92, 0xbd, 0xb0, 0xf9, 0x16, 0x3e,
+ 0x6d, 0xce, 0x97, 0xbd, 0xbe, 0x17, 0x83, 0xbb, 0x2e, 0x31, 0x1a, 0xbd,
+ 0x5f, 0xf5, 0xbc, 0xbd, 0xff, 0x1e, 0x16, 0x3c, 0xd3, 0x4e, 0xf0, 0x3d,
+ 0xa4, 0xbc, 0xca, 0x3d, 0x9b, 0x9e, 0x42, 0x3e, 0x7c, 0xb7, 0xff, 0xbd,
+ 0x91, 0xa8, 0x76, 0xbe, 0x3b, 0xf9, 0x0f, 0x3e, 0xbc, 0x11, 0xd7, 0xbd,
+ 0x1e, 0xa4, 0x20, 0xbe, 0xff, 0xf7, 0xe2, 0x3d, 0x56, 0x8f, 0xce, 0x3d,
+ 0x87, 0x35, 0xb9, 0xbd, 0x17, 0x7c, 0xb4, 0x3d, 0xfa, 0xbe, 0xee, 0xbd,
+ 0x10, 0x86, 0x14, 0xbe, 0xca, 0x7c, 0x08, 0x3e, 0x11, 0x47, 0x04, 0x3e,
+ 0x37, 0xf0, 0xd6, 0xbd, 0xd4, 0x45, 0x39, 0x3d, 0x76, 0x9b, 0x8f, 0xbc,
+ 0x70, 0xb1, 0xe1, 0x3d, 0x6e, 0x24, 0xb9, 0x3d, 0x64, 0xab, 0xd3, 0xbd,
+ 0xe2, 0xd9, 0x55, 0xbc, 0x36, 0x55, 0x4c, 0x3e, 0x6d, 0x9d, 0xe4, 0x3c,
+ 0xc8, 0x9f, 0x2a, 0x3d, 0xe2, 0x88, 0x42, 0xbd, 0x84, 0xfa, 0x13, 0x3e,
+ 0x55, 0x48, 0xcc, 0x3d, 0x2a, 0x31, 0x01, 0xbe, 0x3e, 0xfe, 0xb6, 0xbd,
+ 0x56, 0x5f, 0x12, 0x3e, 0xad, 0x4a, 0xbf, 0x3b, 0xd3, 0x9e, 0xd4, 0x3b,
+ 0xd3, 0x93, 0xa5, 0x3d, 0x95, 0x17, 0x2e, 0x3e, 0xb8, 0x65, 0xc8, 0xbd,
+ 0x9b, 0xb1, 0x63, 0x3d, 0x6e, 0x0c, 0xb7, 0xbc, 0x6b, 0x34, 0x5b, 0xbd,
+ 0xa7, 0x9b, 0x99, 0x3d, 0x54, 0x50, 0x94, 0x3d, 0xd8, 0x82, 0xb9, 0xbd,
+ 0x55, 0xa1, 0x91, 0x3d, 0x66, 0xdc, 0x18, 0x3d, 0xc2, 0x86, 0x6b, 0xbd,
+ 0x09, 0x63, 0x0e, 0xbe, 0xaf, 0x2a, 0x11, 0x3e, 0x53, 0x9d, 0xaf, 0xbd,
+ 0x0f, 0xf6, 0xe9, 0xbd, 0xae, 0xb9, 0x29, 0xbe, 0x2f, 0x4e, 0xc6, 0xbd,
+ 0x57, 0x28, 0x4e, 0x3d, 0xb6, 0xb8, 0x2a, 0x3e, 0x16, 0x74, 0xd9, 0xbd,
+ 0x9e, 0x05, 0x99, 0xbd, 0x7e, 0x59, 0x09, 0xbd, 0x96, 0xc8, 0x05, 0xbe,
+ 0x7d, 0x2a, 0x3a, 0x3e, 0x9b, 0x64, 0xc2, 0x3d, 0x70, 0x33, 0xbf, 0x3c,
+ 0xa8, 0xc1, 0xd2, 0xbd, 0x45, 0xd1, 0x4a, 0x3e, 0x3b, 0xd1, 0x0d, 0xbe,
+ 0xb9, 0xe6, 0x50, 0x3d, 0x64, 0x13, 0x5a, 0xbd, 0x2f, 0x12, 0xc6, 0x3d,
+ 0x32, 0xe3, 0xaf, 0xbd, 0xa9, 0xcf, 0x1c, 0xbe, 0xcf, 0xab, 0xb6, 0xbd,
+ 0xc0, 0x48, 0x29, 0x3e, 0xbe, 0x06, 0xea, 0x3d, 0xc7, 0x37, 0x72, 0x3d,
+ 0x24, 0x1f, 0x32, 0x3d, 0xaa, 0x8a, 0xb3, 0xbd, 0x47, 0xb3, 0x3c, 0x3e,
+ 0xe4, 0x26, 0x76, 0xbe, 0x15, 0xef, 0x6e, 0xbc, 0xb6, 0x09, 0x6c, 0xbe,
+ 0xfe, 0x5c, 0xef, 0xbd, 0x7d, 0x2f, 0x3a, 0xbe, 0x80, 0x2f, 0x02, 0xbe,
+ 0x4c, 0x54, 0x24, 0x3e, 0xe4, 0x0f, 0xc7, 0x3d, 0xb7, 0x0a, 0x38, 0x3e,
+ 0xa6, 0x2c, 0x20, 0x3d, 0x1a, 0xfa, 0xfe, 0x3d, 0xd3, 0xe2, 0x1e, 0xbd,
+ 0xd1, 0x14, 0xbc, 0xbd, 0xdf, 0x61, 0x8d, 0x3d, 0x85, 0x63, 0x86, 0xbc,
+ 0x8f, 0x77, 0xc9, 0xbe, 0x3d, 0x17, 0xad, 0x3d, 0x8a, 0xfa, 0x6b, 0x3e,
+ 0x7a, 0xad, 0x5b, 0xbd, 0xa3, 0x7b, 0xf5, 0xbc, 0xd0, 0x3a, 0xef, 0x3d,
+ 0xbf, 0x0f, 0x04, 0xbe, 0x42, 0xa3, 0x6a, 0x3c, 0x85, 0xad, 0xc6, 0x3c,
+ 0x1e, 0x0b, 0x28, 0xbd, 0xdc, 0xd4, 0x03, 0xbd, 0xa1, 0x73, 0x25, 0xbd,
+ 0x75, 0x35, 0xae, 0xbe, 0x09, 0xee, 0x83, 0xbc, 0x86, 0x68, 0x78, 0xbe,
+ 0xfc, 0x96, 0x14, 0xbe, 0xd6, 0xd0, 0xb4, 0x3d, 0x1f, 0x81, 0xa2, 0x3e,
+ 0x10, 0xfa, 0x49, 0xbd, 0xad, 0x3c, 0x99, 0xbd, 0x69, 0xb5, 0x91, 0xbd,
+ 0xe0, 0xf7, 0x58, 0x3e, 0x6d, 0x45, 0x08, 0xbd, 0x4d, 0x9f, 0x0b, 0xbe,
+ 0xd7, 0x60, 0x1e, 0xbe, 0x7b, 0x7e, 0x88, 0xbe, 0x21, 0x3c, 0x90, 0xbd,
+ 0xeb, 0xf8, 0x3c, 0x3e, 0x73, 0x97, 0x12, 0xbd, 0x7c, 0x0d, 0x94, 0xbd,
+ 0xd2, 0xdf, 0x0e, 0x3e, 0xbf, 0xaf, 0xd8, 0xbe, 0xad, 0x51, 0xe7, 0xbd,
+ 0xa3, 0x24, 0x27, 0xbe, 0x49, 0x8c, 0xa6, 0x3d, 0xe3, 0x3b, 0x20, 0xbe,
+ 0x74, 0xad, 0x53, 0xbe, 0x0d, 0x86, 0x4f, 0xbe, 0xae, 0x0c, 0x85, 0x3e,
+ 0xad, 0x96, 0x82, 0x3e, 0x3c, 0x9e, 0xa7, 0xbd, 0x74, 0xe4, 0xbb, 0x3d,
+ 0x49, 0x30, 0xd4, 0xbd, 0x21, 0xcd, 0xd9, 0x3c, 0x83, 0x0c, 0xa5, 0xbd,
+ 0x39, 0xff, 0xd2, 0xbd, 0xd8, 0x57, 0x93, 0xbc, 0x99, 0x97, 0x8e, 0x3e,
+ 0x97, 0x51, 0x35, 0xbe, 0xdc, 0xa8, 0x18, 0x3d, 0x54, 0xb6, 0xbe, 0xbc,
+ 0xdf, 0x3c, 0x40, 0xbe, 0x91, 0x9d, 0x25, 0x3e, 0xe1, 0xa7, 0x4d, 0x3e,
+ 0xc5, 0x0a, 0xb7, 0xbd, 0xb2, 0xac, 0xe9, 0xbc, 0x2e, 0x62, 0x8e, 0xbe,
+ 0x8a, 0x86, 0x44, 0xbd, 0x7b, 0x76, 0xc9, 0xbd, 0x4b, 0xb0, 0x78, 0x3e,
+ 0xa0, 0x7b, 0x16, 0x3e, 0xc7, 0x43, 0x8a, 0x3b, 0xa3, 0x30, 0x5e, 0x3d,
+ 0xa9, 0xb0, 0x3b, 0xbd, 0x17, 0x17, 0x12, 0xbe, 0x88, 0xc4, 0xfa, 0x3c,
+ 0x90, 0xe6, 0x1d, 0xbe, 0x1c, 0x37, 0xb6, 0x3d, 0x9c, 0xec, 0xd0, 0x3d,
+ 0x72, 0x04, 0x5b, 0xbe, 0x2c, 0xb7, 0xb6, 0x3d, 0x64, 0x7a, 0x92, 0x3e,
+ 0x2a, 0x85, 0x27, 0xbe, 0x51, 0x74, 0x84, 0xbe, 0x60, 0xd1, 0x88, 0x3e,
+ 0x5f, 0x7d, 0x10, 0xbe, 0xe7, 0x33, 0x89, 0x3d, 0xc6, 0x0c, 0x10, 0xbd,
+ 0x89, 0x8b, 0x09, 0xbe, 0x10, 0xac, 0xed, 0xbd, 0xcf, 0x44, 0x64, 0x3d,
+ 0x54, 0x98, 0x13, 0xbe, 0x6d, 0xb8, 0x40, 0x3d, 0x6a, 0xf9, 0x20, 0x3e,
+ 0x06, 0x65, 0xbb, 0xbd, 0xd2, 0x3e, 0x99, 0x3c, 0x5b, 0xc6, 0xa5, 0xbb,
+ 0xb8, 0x85, 0xf2, 0xbb, 0x66, 0x0c, 0xb5, 0x3d, 0x65, 0xfa, 0xd2, 0x3a,
+ 0x0f, 0x8b, 0x1d, 0xbd, 0x7d, 0x3a, 0x39, 0xbe, 0x50, 0x4a, 0x39, 0x3d,
+ 0xd3, 0x55, 0x26, 0x3e, 0x4b, 0xbc, 0xd3, 0xbd, 0x04, 0x90, 0x9d, 0x3d,
+ 0x8e, 0xa6, 0x93, 0x3d, 0x63, 0x04, 0x7e, 0xbc, 0xeb, 0x7c, 0x88, 0x3d,
+ 0x21, 0x96, 0x51, 0x3d, 0x6d, 0xee, 0xb5, 0xbd, 0xcb, 0x6c, 0x79, 0xbe,
+ 0xe0, 0x79, 0x75, 0xbd, 0xf9, 0x85, 0xdb, 0xbd, 0x25, 0x31, 0xcd, 0x3d,
+ 0x42, 0x8b, 0xfa, 0x3d, 0x95, 0xc2, 0x41, 0x3e, 0xfd, 0xb0, 0xa2, 0xbd,
+ 0xa2, 0x92, 0x07, 0x3e, 0x07, 0x2f, 0x15, 0x3d, 0x9c, 0x7a, 0xdd, 0xba,
+ 0x4e, 0x50, 0xb8, 0x3d, 0xd9, 0x2e, 0x01, 0x3e, 0x78, 0x0e, 0xc6, 0x3d,
+ 0xb1, 0xc7, 0x3d, 0xbe, 0xc8, 0xd4, 0xb7, 0xbd, 0x82, 0x57, 0x1e, 0x3d,
+ 0x23, 0xc2, 0x57, 0x3d, 0xa5, 0x9a, 0x9f, 0x3d, 0x28, 0xf8, 0x0d, 0x3e,
+ 0x55, 0xd6, 0x10, 0xbe, 0x23, 0xe6, 0x18, 0x3e, 0xfa, 0x31, 0xe2, 0xbc,
+ 0x8b, 0x2c, 0xb5, 0xbd, 0x7e, 0x22, 0xff, 0xbd, 0xb1, 0x9b, 0xb8, 0xbd,
+ 0x70, 0xd7, 0x16, 0x3e, 0xd4, 0x49, 0x6d, 0x3d, 0x3a, 0xaa, 0x3b, 0x3e,
+ 0x80, 0xa1, 0x19, 0xbd, 0xf3, 0x88, 0xf4, 0x3d, 0x5d, 0x68, 0x32, 0x3d,
+ 0x39, 0x91, 0x8e, 0x3d, 0xbf, 0x36, 0x6c, 0x3d, 0x3e, 0x59, 0x8c, 0x3e,
+ 0x69, 0xd0, 0xc0, 0xbc, 0xd1, 0x95, 0xc3, 0xbd, 0x79, 0x22, 0xcc, 0x3d,
+ 0x51, 0xde, 0x2f, 0xb9, 0xc8, 0xaa, 0x1c, 0x3e, 0xfc, 0x29, 0xa8, 0x3d,
+ 0xd3, 0x60, 0xae, 0x3d, 0x4e, 0x86, 0xb2, 0xbd, 0x27, 0x82, 0x32, 0x3c,
+ 0xba, 0x27, 0xf8, 0x3d, 0xee, 0xb0, 0xf0, 0x3d, 0x8b, 0xb9, 0x17, 0xbe,
+ 0xac, 0x87, 0xda, 0x3d, 0xc9, 0x8d, 0xe2, 0xbd, 0x89, 0xda, 0x9f, 0xbd,
+ 0x65, 0x55, 0x01, 0xbe, 0x63, 0xa3, 0xd4, 0x3c, 0x23, 0x04, 0x1f, 0x3e,
+ 0xab, 0x9a, 0x9d, 0xbd, 0x1e, 0xd8, 0xc7, 0xbc, 0x58, 0xe9, 0xbc, 0xbd,
+ 0x08, 0x60, 0x11, 0x3e, 0x5e, 0xa4, 0xbf, 0x3d, 0x5c, 0x9d, 0x42, 0xbd,
+ 0x75, 0x37, 0x99, 0xbd, 0x4e, 0xc7, 0x48, 0x3d, 0x53, 0x4d, 0x13, 0xbe,
+ 0x1f, 0x69, 0xe4, 0x3d, 0x92, 0xb0, 0xec, 0xbb, 0x21, 0x6f, 0x74, 0x3c,
+ 0x70, 0x69, 0xa0, 0xbd, 0x7f, 0xa9, 0x14, 0x3e, 0xdc, 0x37, 0x97, 0xbd,
+ 0x4f, 0x68, 0x54, 0xbd, 0x2d, 0x3d, 0xd0, 0x3d, 0xb4, 0xaa, 0xbc, 0x3c,
+ 0x92, 0xb1, 0xd8, 0x3d, 0x32, 0x2e, 0x07, 0xbe, 0x9b, 0x29, 0x71, 0xbd,
+ 0xed, 0x49, 0xe7, 0x3d, 0xfd, 0x4b, 0xc5, 0xbd, 0xf9, 0xcc, 0xc6, 0xbd,
+ 0x1d, 0x72, 0x26, 0x3d, 0x73, 0xd8, 0x98, 0x3d, 0x6d, 0x75, 0x45, 0x3d,
+ 0x31, 0xd7, 0xb1, 0xbb, 0x92, 0xc5, 0x52, 0x3e, 0x9d, 0x6a, 0x04, 0x3d,
+ 0xb3, 0x01, 0x26, 0xbe, 0x04, 0x03, 0xdd, 0xbd, 0x17, 0x8b, 0x08, 0x3e,
+ 0x32, 0xd1, 0x56, 0x3d, 0xd8, 0x79, 0xc1, 0x3d, 0x5d, 0x53, 0xdc, 0x3d,
+ 0x98, 0x2f, 0x96, 0x3e, 0x86, 0x17, 0xa7, 0xbd, 0x37, 0xbd, 0x39, 0xbd,
+ 0x26, 0x92, 0xf0, 0x3d, 0x58, 0x2e, 0x24, 0xbc, 0xc4, 0xfc, 0xa6, 0x3d,
+ 0x65, 0xef, 0x6a, 0xbd, 0x6a, 0x93, 0x00, 0x3e, 0x93, 0x76, 0x00, 0xbe,
+ 0xc6, 0x80, 0xd7, 0x3d, 0x49, 0x9e, 0x96, 0xbc, 0x35, 0xe9, 0xa2, 0xbc,
+ 0xe0, 0x61, 0x6d, 0x3e, 0xdc, 0x52, 0xdc, 0x3d, 0xc0, 0x98, 0xc7, 0xbd,
+ 0xa1, 0x92, 0xe1, 0xbd, 0x79, 0xf9, 0x9b, 0x3b, 0xc6, 0xbb, 0xa7, 0xba,
+ 0x96, 0x49, 0x86, 0xbb, 0x0c, 0x81, 0x07, 0x3e, 0xe5, 0x93, 0x95, 0x3d,
+ 0xcf, 0x1c, 0xe2, 0x3d, 0x24, 0xbe, 0xc3, 0x3d, 0xc6, 0x6e, 0x80, 0xbd,
+ 0x77, 0xb3, 0x10, 0xbb, 0x1e, 0x0c, 0x3e, 0xbd, 0x05, 0x4a, 0x9e, 0x3d,
+ 0x63, 0xa1, 0xd9, 0xbc, 0xa8, 0x5b, 0x4c, 0xbe, 0x58, 0x4f, 0x9d, 0x3d,
+ 0x58, 0x40, 0x1c, 0xbe, 0x08, 0x91, 0xc7, 0xbc, 0x1c, 0xe0, 0x8c, 0x3d,
+ 0x85, 0x3e, 0x2a, 0x3e, 0x4f, 0x6f, 0xc7, 0x3d, 0x42, 0x3e, 0x06, 0xbe,
+ 0x08, 0xb2, 0x90, 0xbc, 0x81, 0xa6, 0x09, 0x3e, 0xda, 0xe5, 0x9b, 0xbd,
+ 0x41, 0x61, 0x6e, 0x3c, 0x03, 0x3d, 0xba, 0xbd, 0x67, 0xfc, 0xd5, 0x3d,
+ 0x4b, 0xdd, 0xd9, 0x3d, 0x34, 0x5a, 0xf1, 0x3d, 0xad, 0xaa, 0xb3, 0xbc,
+ 0xb1, 0x91, 0xa8, 0xbd, 0xe6, 0x52, 0x96, 0x3c, 0xd6, 0x76, 0xb0, 0x3d,
+ 0x20, 0x7e, 0xca, 0xbd, 0x43, 0x4f, 0xd7, 0x3d, 0xf6, 0x62, 0x33, 0x3e,
+ 0x3d, 0x8b, 0x71, 0xbd, 0x84, 0x71, 0x8d, 0xbd, 0x8c, 0x30, 0xa1, 0xbe,
+ 0x5f, 0x5c, 0xbd, 0x3d, 0xd9, 0x22, 0x03, 0xbe, 0xae, 0x4f, 0xb7, 0xbc,
+ 0xa3, 0x98, 0x18, 0x3e, 0xd8, 0xc0, 0x06, 0x3e, 0x04, 0x6c, 0x47, 0xbc,
+ 0x72, 0xe7, 0x9b, 0x3d, 0xc3, 0x7f, 0xae, 0xbd, 0x7d, 0xa2, 0xe2, 0x3d,
+ 0xc2, 0x28, 0x03, 0xbd, 0x66, 0x1f, 0x23, 0x3d, 0x88, 0x90, 0x86, 0x3d,
+ 0x1c, 0x3c, 0x96, 0x3d, 0x68, 0x26, 0x5c, 0xbd, 0x88, 0xaf, 0xc8, 0xbd,
+ 0x85, 0x9c, 0xb3, 0x3c, 0xde, 0x83, 0xd6, 0xbd, 0x19, 0x27, 0x3a, 0xbd,
+ 0xd2, 0xd2, 0xe7, 0xbc, 0x03, 0x77, 0x65, 0x3c, 0x83, 0x21, 0xac, 0xbd,
+ 0xcb, 0x2b, 0xe2, 0x3d, 0x67, 0x44, 0x17, 0x3e, 0xc8, 0x15, 0xd9, 0x3d,
+ 0xaa, 0x3d, 0x47, 0x3c, 0x0f, 0x3c, 0xca, 0x3b, 0x63, 0x4c, 0xfb, 0x3d,
+ 0x85, 0x5d, 0x1f, 0x3d, 0xa8, 0x97, 0x58, 0xbe, 0x50, 0x46, 0xc2, 0x3d,
+ 0xad, 0x25, 0x07, 0x3d, 0x40, 0xc4, 0x97, 0x3c, 0x56, 0x91, 0x24, 0xbd,
+ 0x6d, 0x83, 0x08, 0x3d, 0xd9, 0x4b, 0xdc, 0x3d, 0x37, 0x48, 0xea, 0x3a,
+ 0xe0, 0x62, 0x14, 0xbe, 0xa3, 0x7e, 0x8f, 0x3d, 0x88, 0xa0, 0x67, 0xbc,
+ 0xc1, 0x53, 0x6a, 0xbd, 0xfd, 0x77, 0xf8, 0xbc, 0x57, 0x4a, 0x36, 0xbe,
+ 0xd9, 0xdf, 0xb0, 0x3d, 0xe8, 0xee, 0x65, 0x3d, 0xe6, 0x37, 0x38, 0x3e,
+ 0x97, 0x41, 0x3e, 0x38, 0xe5, 0xb8, 0x9d, 0x3d, 0x0f, 0xd3, 0xe2, 0xbc,
+ 0x7a, 0x6a, 0xc8, 0x3d, 0xaa, 0x29, 0x23, 0x3e, 0xbe, 0x0a, 0x44, 0x3c,
+ 0x55, 0x53, 0xd2, 0xbd, 0x9c, 0x60, 0x02, 0xbe, 0xa5, 0xe2, 0x24, 0xbe,
+ 0xd1, 0x36, 0x49, 0xbd, 0x43, 0x31, 0xf4, 0x3d, 0x79, 0xc5, 0xb2, 0x3b,
+ 0x20, 0x2d, 0x1f, 0xbe, 0x0f, 0x00, 0x24, 0x3d, 0x99, 0x0c, 0xa4, 0xbe,
+ 0xfe, 0x29, 0x77, 0x3d, 0x05, 0x4c, 0x38, 0x3e, 0xff, 0xd8, 0xc2, 0xbd,
+ 0x74, 0xcf, 0xee, 0xbd, 0xe9, 0xbc, 0x88, 0xbd, 0xb7, 0x17, 0x54, 0xbe,
+ 0xea, 0x56, 0xd4, 0x3d, 0xa2, 0x99, 0x9b, 0x3d, 0x88, 0x04, 0xa7, 0x3c,
+ 0x77, 0x04, 0x34, 0xbd, 0x9a, 0xcb, 0xe1, 0x3b, 0x1e, 0xd4, 0x01, 0x3b,
+ 0xae, 0xa1, 0x1b, 0x3b, 0xc4, 0x3b, 0xb7, 0x3d, 0xa6, 0xfc, 0x9d, 0xbd,
+ 0xb8, 0x7b, 0x0d, 0xbd, 0x7f, 0x5d, 0x25, 0x3d, 0xdc, 0x43, 0xaf, 0xbd,
+ 0x3c, 0x3f, 0xa8, 0x3c, 0x90, 0xb7, 0x10, 0x3d, 0x1a, 0x23, 0x21, 0x3b,
+ 0xac, 0x4c, 0x68, 0x3d, 0x30, 0x51, 0xad, 0xbd, 0xa1, 0xa3, 0x0b, 0xbe,
+ 0xa2, 0xf0, 0xd2, 0x3d, 0x4d, 0x11, 0xc8, 0x3c, 0x05, 0x9f, 0x6f, 0xbd,
+ 0x48, 0x0e, 0xd0, 0x3d, 0xdd, 0x54, 0xf1, 0x3d, 0xff, 0x55, 0x7b, 0x3d,
+ 0x8d, 0x35, 0x4d, 0xbe, 0x32, 0xee, 0x8a, 0x3a, 0xfa, 0x89, 0x41, 0x3d,
+ 0xce, 0xf0, 0x0f, 0xbe, 0x94, 0x07, 0xf9, 0x3d, 0x43, 0x79, 0x8d, 0xbc,
+ 0xf0, 0x09, 0xc4, 0x3c, 0x2f, 0xa5, 0xae, 0x3c, 0x9d, 0x3e, 0xb6, 0xbd,
+ 0x26, 0xbb, 0xde, 0xbd, 0xc7, 0x52, 0xe3, 0xbd, 0x67, 0xd9, 0x8e, 0xbd,
+ 0x11, 0xba, 0x23, 0x3d, 0x8d, 0xa9, 0x47, 0xbd, 0x04, 0x9f, 0x18, 0xbd,
+ 0x4d, 0x6e, 0x43, 0xbe, 0xdc, 0xf6, 0x5c, 0x3d, 0x6e, 0x90, 0xbd, 0x3d,
+ 0x93, 0x3e, 0x93, 0xbd, 0x98, 0x63, 0xac, 0x3d, 0xcd, 0xaa, 0x98, 0x3c,
+ 0x67, 0xfe, 0xe9, 0x3d, 0x86, 0x37, 0xbd, 0xbd, 0x04, 0xea, 0xaa, 0xbc,
+ 0x0d, 0x8e, 0xd4, 0xbc, 0x16, 0xd8, 0x95, 0x3d, 0xaf, 0xe2, 0x1a, 0xbe,
+ 0x6e, 0x8b, 0xec, 0x3d, 0x77, 0xe2, 0xad, 0xbd, 0x32, 0x74, 0xb2, 0xbd,
+ 0xc2, 0x24, 0x00, 0x3e, 0xca, 0x76, 0x32, 0x3e, 0x90, 0xca, 0x51, 0x3b,
+ 0xcd, 0x32, 0x37, 0xbe, 0x90, 0x6a, 0x09, 0xbd, 0x6f, 0x2f, 0x1f, 0x3e,
+ 0x7b, 0x39, 0xfe, 0x3d, 0xfc, 0xbd, 0xd2, 0xbd, 0x91, 0x0b, 0x00, 0x3d,
+ 0xbb, 0x76, 0x1f, 0xbe, 0x27, 0x9e, 0x18, 0xbd, 0x2a, 0xed, 0x9c, 0x3a,
+ 0x51, 0xa7, 0x71, 0x3c, 0x55, 0x4c, 0xed, 0x3d, 0xb5, 0x6a, 0xee, 0xbd,
+ 0xe6, 0x1d, 0x0f, 0x3e, 0xaf, 0xb9, 0x43, 0x3c, 0x2e, 0xcf, 0xd7, 0x3d,
+ 0xb6, 0x34, 0xa1, 0x3d, 0xab, 0x43, 0xba, 0x3d, 0xa9, 0x3d, 0x3a, 0xbd,
+ 0x35, 0x46, 0xd8, 0xbd, 0x25, 0x7a, 0x81, 0xbe, 0x98, 0x7b, 0xe4, 0xbd,
+ 0xa6, 0xd1, 0xf9, 0xbd, 0xa9, 0x24, 0x2b, 0x3b, 0xab, 0xff, 0x4f, 0x3e,
+ 0x10, 0x2d, 0x82, 0xbd, 0x1f, 0xe4, 0xa6, 0x3d, 0x57, 0x4a, 0x09, 0x3e,
+ 0x46, 0xf7, 0x1f, 0xbc, 0xcc, 0x2e, 0x24, 0xbc, 0x89, 0x91, 0x32, 0x3b,
+ 0x00, 0x8d, 0x13, 0x3e, 0x25, 0x0a, 0x31, 0x3e, 0x66, 0xde, 0x11, 0x3e,
+ 0x34, 0x69, 0x2b, 0xbe, 0xa5, 0x20, 0xc5, 0x3d, 0xe0, 0xb5, 0xb7, 0xbd,
+ 0x58, 0x22, 0x12, 0x3e, 0xa5, 0x4e, 0x32, 0xbe, 0xa1, 0x1e, 0xfe, 0xba,
+ 0xc6, 0x56, 0x28, 0xbe, 0xf0, 0x3c, 0xc7, 0xbc, 0x4b, 0x58, 0xd0, 0xbc,
+ 0xc7, 0x75, 0xdb, 0x3d, 0xd9, 0x82, 0xe9, 0x3d, 0x51, 0xda, 0xae, 0xbd,
+ 0x29, 0x5d, 0xb1, 0xbd, 0xbb, 0xa4, 0x96, 0x3d, 0x1a, 0x0d, 0x35, 0x3e,
+ 0x7d, 0xa9, 0x45, 0xbe, 0xdd, 0x4a, 0xb7, 0x3d, 0x01, 0x6d, 0x12, 0xbe,
+ 0xf8, 0xc9, 0x1b, 0x3e, 0xbc, 0xa3, 0xa1, 0x3c, 0xa7, 0xe5, 0x19, 0x3e,
+ 0xb7, 0x4f, 0x29, 0xbe, 0xee, 0x51, 0xce, 0x3d, 0x11, 0x7d, 0xfd, 0x3d,
+ 0x88, 0x1c, 0xef, 0xbd, 0xba, 0x1c, 0x33, 0xbe, 0xc8, 0x94, 0x47, 0x3e,
+ 0x96, 0xa6, 0xaf, 0xba, 0xe8, 0x67, 0x4b, 0x3e, 0x7a, 0xc2, 0x63, 0x3d,
+ 0xfd, 0xcc, 0x0d, 0x3e, 0x30, 0x72, 0xf4, 0xbb, 0x64, 0x81, 0x98, 0x3d,
+ 0x16, 0x33, 0x4b, 0xbd, 0xa3, 0xcb, 0xab, 0xbd, 0x48, 0xfa, 0xa4, 0xbe,
+ 0xe0, 0x06, 0x76, 0x3c, 0x86, 0x02, 0x96, 0x3d, 0x26, 0xe1, 0x17, 0xbe,
+ 0x1b, 0xdd, 0xa9, 0x3d, 0x5e, 0xe0, 0xf9, 0x3c, 0xc6, 0x10, 0x51, 0x3d,
+ 0xde, 0xc4, 0x79, 0xbd, 0xa8, 0x84, 0x5d, 0xbd, 0x29, 0x32, 0x0e, 0x3e,
+ 0xcb, 0x76, 0x39, 0x3c, 0x6f, 0x57, 0xb9, 0x3d, 0x8f, 0xcc, 0x32, 0x3e,
+ 0xd1, 0x4b, 0x48, 0xbd, 0xb3, 0xb1, 0xe2, 0xbd, 0x19, 0x26, 0xb1, 0x3c,
+ 0x90, 0xee, 0x09, 0xbe, 0xeb, 0x55, 0x8f, 0x3d, 0x93, 0x4f, 0x55, 0x3e,
+ 0x82, 0x2c, 0x01, 0xbc, 0x65, 0x55, 0xc2, 0x3c, 0xbf, 0x41, 0x2c, 0x3e,
+ 0xe2, 0x9f, 0x09, 0x3e, 0x4d, 0x7a, 0x0e, 0x3d, 0xe8, 0x12, 0x12, 0xbb,
+ 0x7c, 0x70, 0x07, 0x3e, 0xb3, 0x0e, 0xae, 0x3d, 0xba, 0x23, 0x4c, 0x3c,
+ 0xdb, 0xc1, 0xab, 0xbd, 0x68, 0x10, 0x04, 0x3e, 0xe3, 0x96, 0x0c, 0x3e,
+ 0xcd, 0xd8, 0xf7, 0xbc, 0xaf, 0x1d, 0xa9, 0x3d, 0x4c, 0x70, 0x3b, 0x3e,
+ 0x2f, 0x77, 0xc4, 0xbd, 0x1e, 0x28, 0x3a, 0xbe, 0xb3, 0x83, 0xb7, 0x3d,
+ 0x66, 0x49, 0xf6, 0x3d, 0x84, 0x9f, 0x58, 0x3d, 0xd3, 0xb6, 0x1d, 0xbe,
+ 0xf7, 0xb3, 0x09, 0x3d, 0xbd, 0xdb, 0x93, 0xbd, 0x0c, 0x0b, 0x84, 0x3c,
+ 0xdc, 0x14, 0xe0, 0xbd, 0x1b, 0x0e, 0x9a, 0x3c, 0x19, 0xcb, 0xb5, 0xbd,
+ 0xcd, 0xba, 0x8a, 0xbc, 0xf6, 0xb9, 0x19, 0xbe, 0x99, 0x1a, 0x35, 0xbd,
+ 0xe0, 0x78, 0x26, 0x3d, 0x0e, 0xfc, 0x09, 0x3c, 0x8d, 0x9a, 0x01, 0xbe,
+ 0xf0, 0x28, 0x10, 0xbe, 0xd6, 0x77, 0xbe, 0x3d, 0x09, 0x4f, 0x00, 0xbe,
+ 0xda, 0x2b, 0xa0, 0xbd, 0x59, 0x78, 0xa2, 0x3c, 0x56, 0xda, 0x01, 0xbe,
+ 0x9d, 0xb4, 0x2c, 0x3c, 0xc9, 0x5e, 0xf4, 0xbd, 0xff, 0x84, 0xff, 0xbd,
+ 0xc7, 0x57, 0x80, 0x3d, 0x7b, 0xd8, 0x8f, 0xbd, 0x33, 0xd8, 0xb7, 0x3d,
+ 0xdb, 0x35, 0x14, 0xbd, 0x0e, 0x57, 0x34, 0x3d, 0x98, 0x95, 0x7e, 0xbc,
+ 0x23, 0x9e, 0x0b, 0x3e, 0x97, 0x9c, 0xa9, 0xbc, 0x76, 0xbf, 0x0a, 0xbe,
+ 0x1b, 0xbb, 0xd0, 0x3d, 0xe0, 0x9c, 0xb5, 0x3c, 0xae, 0xc8, 0x2f, 0x3d,
+ 0xf3, 0x09, 0x1f, 0xbd, 0x29, 0xc8, 0x43, 0xbe, 0xd1, 0xd7, 0xc1, 0x3d,
+ 0x42, 0xaa, 0x3e, 0xbe, 0x26, 0x16, 0xd6, 0x3d, 0xc6, 0xc5, 0xbb, 0xbd,
+ 0xbf, 0x6b, 0x2b, 0x3e, 0xf4, 0x25, 0x98, 0x3d, 0x5c, 0x4e, 0x30, 0xbc,
+ 0x11, 0x77, 0x17, 0xbe, 0x96, 0xbe, 0x91, 0xbb, 0x36, 0xbb, 0xa6, 0xbd,
+ 0xaa, 0x2f, 0x9d, 0xbb, 0x60, 0x00, 0x1e, 0x3e, 0x3b, 0xb0, 0x8d, 0x3d,
+ 0xae, 0x2b, 0x5b, 0x3d, 0x9f, 0x2b, 0x08, 0xbd, 0x31, 0xf9, 0xc2, 0x3d,
+ 0x3a, 0x5d, 0x2c, 0xbd, 0x28, 0x28, 0x0b, 0xbd, 0xeb, 0x77, 0xbc, 0xbd,
+ 0x68, 0x7d, 0x57, 0x3d, 0xe5, 0xa7, 0x05, 0xbe, 0x4a, 0x22, 0x5b, 0x3d,
+ 0x65, 0x6e, 0x18, 0xbd, 0xb7, 0x8d, 0xe8, 0x3d, 0xa8, 0xf9, 0xa3, 0x3c,
+ 0x42, 0xd2, 0x27, 0xbe, 0x6f, 0xfb, 0xf9, 0xbc, 0xef, 0x72, 0x85, 0x3d,
+ 0xc8, 0x9e, 0xcd, 0xbc, 0xe2, 0xd2, 0x7d, 0xbd, 0xc1, 0xbb, 0x80, 0x3c,
+ 0xe4, 0xb8, 0x75, 0xbd, 0x84, 0xd8, 0xf0, 0xbd, 0xfe, 0x96, 0x89, 0x3c,
+ 0x7a, 0xa6, 0x24, 0x3e, 0x9b, 0xcf, 0x65, 0x3d, 0xd7, 0xf7, 0x29, 0xbe,
+ 0x7c, 0x37, 0x7b, 0x3c, 0xe9, 0x69, 0x20, 0x3d, 0x97, 0x3f, 0x3e, 0x3e,
+ 0x49, 0x3e, 0x5d, 0xbc, 0x8b, 0xac, 0xf5, 0x3c, 0x24, 0xa9, 0xe7, 0x3c,
+ 0x1b, 0xc1, 0x2d, 0xbe, 0xa2, 0x1c, 0x4d, 0xbd, 0x2a, 0x16, 0x8a, 0x3d,
+ 0x79, 0x25, 0x01, 0x3d, 0x8a, 0xaf, 0xa8, 0x3c, 0x19, 0x05, 0xbd, 0xbe,
+ 0x4c, 0xf6, 0x2b, 0x3e, 0x5c, 0x58, 0x0f, 0xbe, 0xdc, 0xf7, 0xd9, 0x3c,
+ 0x2b, 0xbf, 0xba, 0xbc, 0xfc, 0x61, 0xbf, 0xbd, 0xf1, 0xf4, 0xfc, 0xbd,
+ 0xce, 0x01, 0xaf, 0xbd, 0x40, 0xf4, 0x82, 0xbd, 0xdd, 0x45, 0x86, 0xbd,
+ 0xf2, 0x55, 0x83, 0xbe, 0x1c, 0x3b, 0x58, 0xbd, 0xd1, 0xf8, 0x28, 0xbe,
+ 0x13, 0xe6, 0xdf, 0x3d, 0x49, 0x6c, 0xf1, 0x3c, 0xcc, 0x78, 0x75, 0x3e,
+ 0x9e, 0xab, 0x07, 0xbe, 0x46, 0xe6, 0x03, 0xbc, 0xcb, 0x2c, 0xcf, 0xbc,
+ 0xe1, 0x9b, 0x33, 0x3e, 0xa9, 0x8b, 0xd2, 0xbd, 0x45, 0xb1, 0xf2, 0x3d,
+ 0x76, 0x35, 0xb0, 0xbd, 0xa7, 0x87, 0xb0, 0x3d, 0x41, 0x43, 0x09, 0x3d,
+ 0xb0, 0x50, 0x40, 0xbe, 0x3b, 0x37, 0x60, 0xbd, 0x27, 0xe6, 0xce, 0x3d,
+ 0xe7, 0x0f, 0xbb, 0x3d, 0xfe, 0xe6, 0x40, 0xbe, 0xb5, 0xc7, 0xb0, 0x3d,
+ 0x34, 0xea, 0x98, 0xbe, 0x6c, 0x8e, 0x18, 0x3e, 0x29, 0xe5, 0xbc, 0xbe,
+ 0xf8, 0xf8, 0x25, 0xbd, 0xba, 0xae, 0x0e, 0x3e, 0x5c, 0xee, 0x8c, 0xbe,
+ 0x6d, 0xe9, 0xb0, 0x3d, 0x43, 0xe4, 0xaa, 0xbd, 0x8c, 0x76, 0xb7, 0x3d,
+ 0xef, 0x42, 0x13, 0x3d, 0xc3, 0xc1, 0xa1, 0x3d, 0xea, 0xcd, 0x33, 0xbe,
+ 0xdb, 0x29, 0xb8, 0x3d, 0x5a, 0xc0, 0x53, 0x3c, 0x1f, 0xc1, 0x22, 0xbd,
+ 0xa2, 0x64, 0xd2, 0xbd, 0xd1, 0x0d, 0xf5, 0xbd, 0x48, 0x93, 0x11, 0xbe,
+ 0xe0, 0x8f, 0x11, 0x3c, 0xe0, 0x4d, 0xf8, 0x3d, 0x54, 0x3a, 0xd1, 0xbd,
+ 0x59, 0x83, 0x2f, 0x3e, 0xfa, 0x3d, 0x30, 0x3e, 0xb6, 0x03, 0x92, 0x3d,
+ 0x47, 0xcd, 0xd0, 0xbd, 0x83, 0x1a, 0x70, 0x3c, 0xd5, 0x1a, 0xeb, 0xbd,
+ 0x37, 0x5d, 0x02, 0xbe, 0x00, 0x0e, 0xe9, 0xbd, 0x25, 0x6e, 0x20, 0xbd,
+ 0xe8, 0x1e, 0x0e, 0xbb, 0x1d, 0x2e, 0x48, 0xbe, 0xa3, 0xc1, 0x52, 0x3e,
+ 0x3c, 0xf1, 0xcd, 0xbd, 0xc0, 0xa6, 0x6e, 0xbe, 0x81, 0xf2, 0x86, 0x3d,
+ 0x48, 0x84, 0x10, 0xbe, 0x97, 0x9d, 0x5b, 0xbd, 0x69, 0x68, 0x64, 0x3e,
+ 0x19, 0x0e, 0x2d, 0xbd, 0x9b, 0x1a, 0x8b, 0xbc, 0xb9, 0xed, 0x58, 0x3e,
+ 0x5c, 0xcf, 0xeb, 0x3d, 0x47, 0x50, 0x8c, 0xbd, 0x52, 0x97, 0x0e, 0x3d,
+ 0xe5, 0x91, 0xa4, 0xbc, 0xf6, 0x0c, 0x8f, 0xbd, 0x00, 0x55, 0xf2, 0x3d,
+ 0xa5, 0x8b, 0xee, 0x3b, 0xf7, 0x95, 0x92, 0x3d, 0x44, 0x1a, 0x68, 0xbe,
+ 0x45, 0x73, 0x3f, 0x3e, 0xf0, 0x6a, 0x18, 0x3e, 0x01, 0x12, 0xe7, 0xbc,
+ 0x15, 0xe2, 0x02, 0xbe, 0x69, 0x6c, 0x2b, 0xbe, 0xd8, 0x34, 0x9b, 0x3b,
+ 0xd9, 0x81, 0x05, 0xbd, 0x89, 0x40, 0xe4, 0xbd, 0x39, 0xc4, 0x21, 0xbe,
+ 0x19, 0xb5, 0xb6, 0xbd, 0xbe, 0x42, 0x24, 0xbe, 0xa2, 0xf8, 0x72, 0xbd,
+ 0xf8, 0x4a, 0xf3, 0x3d, 0x2d, 0x80, 0x49, 0xba, 0x5c, 0x10, 0x5b, 0x3e,
+ 0x3e, 0x3c, 0x30, 0xbe, 0xbd, 0x5c, 0x6f, 0xbe, 0x82, 0x78, 0x9b, 0x3d,
+ 0x8b, 0xb7, 0x97, 0x3d, 0x66, 0x43, 0x53, 0x3d, 0x21, 0x24, 0x2b, 0x3e,
+ 0xdf, 0x35, 0x0d, 0x3e, 0xfa, 0xa6, 0x85, 0xbd, 0x96, 0x79, 0x9e, 0xbe,
+ 0x6a, 0x36, 0xa9, 0xbd, 0x32, 0xfc, 0x58, 0xbd, 0x03, 0xa0, 0xd8, 0xbd,
+ 0x1f, 0x40, 0xbe, 0xbc, 0x53, 0x87, 0x0a, 0x3e, 0x53, 0x97, 0x56, 0xbd,
+ 0x58, 0xa7, 0xe3, 0xbd, 0xa6, 0x44, 0x05, 0xbe, 0xf6, 0x6f, 0x88, 0xbd,
+ 0xed, 0x6a, 0xcb, 0xbd, 0x85, 0x95, 0xf6, 0x3d, 0x52, 0x46, 0x44, 0xbc,
+ 0xab, 0x7d, 0x42, 0xbe, 0x99, 0x63, 0xba, 0x3d, 0x4e, 0x8c, 0x87, 0xbd,
+ 0xc4, 0xb6, 0x4d, 0xbe, 0x70, 0x0e, 0x17, 0xbe, 0x4b, 0xfe, 0x00, 0x3e,
+ 0xce, 0x1e, 0x9e, 0xbd, 0xbd, 0x11, 0x08, 0x3e, 0x47, 0x24, 0xc7, 0x3d,
+ 0x62, 0x5b, 0xb4, 0xbd, 0x95, 0xa7, 0x12, 0x3c, 0xad, 0xea, 0xb0, 0x3d,
+ 0x69, 0xa2, 0x54, 0xbe, 0x57, 0x8d, 0xc3, 0x3d, 0x27, 0xc0, 0x8a, 0xbe,
+ 0xda, 0x0b, 0xd8, 0x3d, 0x5e, 0xd0, 0x27, 0xbe, 0x4a, 0xce, 0xe9, 0xbd,
+ 0x1b, 0x94, 0x03, 0xbc, 0x11, 0xd6, 0x55, 0x3d, 0x23, 0x8b, 0x04, 0x3e,
+ 0x5e, 0x5f, 0xdc, 0x3d, 0x15, 0x00, 0x18, 0xbe, 0x1d, 0x2a, 0xbf, 0xbd,
+ 0x57, 0x0c, 0x0e, 0x3e, 0x0d, 0x0b, 0x31, 0xbd, 0x76, 0x42, 0x9c, 0x39,
+ 0xc8, 0x31, 0x90, 0xbe, 0x8b, 0xf2, 0x0d, 0xbe, 0x94, 0x91, 0xd8, 0xbc,
+ 0x3d, 0xa3, 0x8f, 0xbd, 0xbc, 0x91, 0x07, 0xbd, 0xec, 0x81, 0x8a, 0x3d,
+ 0x9d, 0xa7, 0xbc, 0xbd, 0xaf, 0x4c, 0x47, 0xbe, 0xef, 0x46, 0xaf, 0x3d,
+ 0x61, 0xa1, 0x8e, 0x3d, 0xd6, 0xcd, 0xcf, 0x3d, 0x6f, 0xe9, 0x2a, 0xbe,
+ 0xa3, 0x85, 0x0c, 0x3e, 0xe6, 0x75, 0x3b, 0xbd, 0xde, 0x11, 0xf6, 0x3d,
+ 0x06, 0x28, 0x2d, 0xbe, 0x64, 0x8b, 0x1e, 0xbe, 0xda, 0xeb, 0xe5, 0xbc,
+ 0x1d, 0xc7, 0x50, 0x3c, 0x27, 0x1f, 0x9b, 0xbd, 0x5c, 0xcc, 0xb5, 0x3d,
+ 0x1c, 0xf0, 0xfb, 0xbd, 0x32, 0x6e, 0x21, 0xbe, 0x03, 0x1a, 0xd6, 0xbd,
+ 0xcf, 0x68, 0x0d, 0xbe, 0x98, 0xe5, 0x33, 0x3d, 0xad, 0xcf, 0x94, 0xbd,
+ 0x17, 0x25, 0xe7, 0x3d, 0x36, 0xee, 0x01, 0x3d, 0x0f, 0x22, 0xa0, 0x3d,
+ 0x61, 0xa6, 0x23, 0x3b, 0xd5, 0x1d, 0xe7, 0x3c, 0x4d, 0x61, 0xd0, 0x39,
+ 0x92, 0x92, 0x79, 0xbb, 0x51, 0xab, 0x00, 0x3e, 0xfa, 0xb4, 0x1a, 0xbd,
+ 0xea, 0xef, 0x6a, 0x3d, 0xda, 0x88, 0x8a, 0xbd, 0x17, 0xdb, 0xf6, 0xbd,
+ 0xfb, 0x88, 0x1f, 0x3e, 0xf1, 0xac, 0x6d, 0xbc, 0xe0, 0xee, 0xce, 0x3d,
+ 0x1b, 0x4d, 0x4e, 0x3d, 0xad, 0x87, 0xbb, 0x3c, 0xe2, 0x71, 0x3d, 0xbe,
+ 0x1a, 0x8c, 0xc6, 0xbc, 0x81, 0xf4, 0x86, 0xbd, 0x44, 0x7f, 0x85, 0x3d,
+ 0xd7, 0x0d, 0xb8, 0xbd, 0x2d, 0xba, 0x96, 0x3d, 0x7e, 0x6c, 0xd8, 0x3d,
+ 0xbf, 0x58, 0x90, 0x3a, 0xc3, 0xd4, 0x0f, 0xbe, 0x75, 0xe5, 0x1d, 0x3d,
+ 0x23, 0xb0, 0x54, 0x3d, 0x07, 0x82, 0x55, 0x3d, 0xba, 0x69, 0x6a, 0xbe,
+ 0x49, 0xd7, 0x60, 0x3d, 0xee, 0xf1, 0xdb, 0x3d, 0x2a, 0x17, 0xaf, 0xbd,
+ 0x51, 0x23, 0x3e, 0xbe, 0x72, 0x24, 0x92, 0xbd, 0x0d, 0x4c, 0x5c, 0xbe,
+ 0x89, 0x52, 0x07, 0xbe, 0x3e, 0x0a, 0x0a, 0x3e, 0xc7, 0x8a, 0x2b, 0x3d,
+ 0xd1, 0x97, 0x0b, 0xbe, 0xb4, 0x7a, 0x81, 0x3a, 0xa1, 0xf6, 0x32, 0x3b,
+ 0xe4, 0xee, 0xf4, 0xbd, 0x11, 0xc8, 0x6b, 0xbe, 0xf1, 0xd6, 0xf2, 0x3d,
+ 0x81, 0xb0, 0xa2, 0x3d, 0x12, 0x79, 0x93, 0x3d, 0xa1, 0x31, 0x94, 0xbe,
+ 0x75, 0x1f, 0x8b, 0xbd, 0x6f, 0xe1, 0x04, 0x3d, 0x16, 0x02, 0x99, 0x3c,
+ 0x5e, 0x74, 0xfb, 0xbd, 0x9f, 0x51, 0x57, 0xbd, 0xd7, 0x71, 0x09, 0xbc,
+ 0xac, 0x90, 0x83, 0x3b, 0x29, 0x51, 0xb7, 0x3d, 0x9d, 0x07, 0xc3, 0xbd,
+ 0x2b, 0x4d, 0x01, 0xbe, 0x38, 0xef, 0xc7, 0x3d, 0x70, 0xe8, 0x4a, 0xbd,
+ 0xc7, 0x8b, 0x65, 0xbe, 0xf0, 0xd0, 0x3a, 0xbb, 0x75, 0xd0, 0x6c, 0xbe,
+ 0x70, 0x31, 0xd8, 0xbd, 0xc6, 0x5a, 0x32, 0xbe, 0xdd, 0x87, 0xf6, 0xbd,
+ 0x5e, 0x13, 0x18, 0x3d, 0xfb, 0x08, 0xac, 0xbc, 0x34, 0xd5, 0x67, 0xbd,
+ 0xe4, 0x76, 0xa6, 0x3d, 0x66, 0x72, 0x8f, 0xbe, 0x53, 0x74, 0xb8, 0xbd,
+ 0x8a, 0x24, 0xea, 0xbd, 0xee, 0x35, 0x01, 0x3e, 0xb0, 0x22, 0xf7, 0x3b,
+ 0xcf, 0xb8, 0x05, 0x3e, 0x1f, 0xaa, 0x33, 0x3d, 0xf8, 0x50, 0x87, 0xbd,
+ 0x07, 0xde, 0x63, 0x3d, 0x4c, 0xeb, 0x76, 0xbd, 0x13, 0x06, 0x3e, 0x3d,
+ 0x4a, 0x4a, 0x4f, 0x3d, 0xda, 0xe9, 0x15, 0x3e, 0xcf, 0x4f, 0x1f, 0x3e,
+ 0x99, 0xdf, 0xca, 0x3c, 0x2c, 0x23, 0x05, 0xbe, 0xa6, 0xf1, 0x93, 0x3d,
+ 0xbf, 0xa5, 0x8a, 0xbd, 0x70, 0x94, 0x02, 0x3f, 0x70, 0xf3, 0x97, 0xbc,
+ 0x2d, 0xc6, 0x7e, 0x3d, 0xe6, 0xf6, 0x37, 0x3d, 0xe3, 0x46, 0xa5, 0x3d,
+ 0x90, 0xb6, 0x1f, 0xbe, 0xbf, 0x48, 0x7b, 0xbd, 0x1f, 0x07, 0x07, 0xbe,
+ 0x03, 0xde, 0x31, 0x3e, 0xee, 0x86, 0x8d, 0x3d, 0xfd, 0x68, 0x13, 0xbe,
+ 0xaa, 0x29, 0x0d, 0x3e, 0x08, 0xc3, 0xf2, 0xbd, 0xaf, 0xc2, 0x56, 0x3e,
+ 0x0d, 0xa0, 0x3a, 0x3b, 0x0f, 0xbf, 0x6b, 0xbe, 0x28, 0x00, 0x52, 0x3e,
+ 0x82, 0xb4, 0x8a, 0x3d, 0xbf, 0x6a, 0x9b, 0xbd, 0xe7, 0x53, 0xf7, 0xbd,
+ 0xaf, 0x40, 0xe5, 0x3d, 0x4c, 0xba, 0x9c, 0x3d, 0x14, 0x6b, 0x1a, 0xbe,
+ 0x95, 0x64, 0xcf, 0xbd, 0x24, 0x12, 0x44, 0xbd, 0x75, 0x81, 0xab, 0xbd,
+ 0x9d, 0xa9, 0xe3, 0xbd, 0x48, 0x17, 0x13, 0xbe, 0x19, 0xe4, 0xb6, 0x3e,
+ 0x5b, 0x14, 0xc5, 0x3d, 0xe9, 0xcc, 0xf9, 0x3c, 0x73, 0x9d, 0x54, 0xbe,
+ 0xb7, 0x57, 0xdf, 0xbe, 0x77, 0xc8, 0x87, 0x3e, 0x8b, 0xae, 0x60, 0xbd,
+ 0x26, 0x56, 0x72, 0xbd, 0x16, 0x44, 0x34, 0x3d, 0x45, 0xc7, 0xb0, 0xbd,
+ 0x47, 0xc7, 0x0f, 0xbe, 0xb5, 0x08, 0x8e, 0x3e, 0x0a, 0x73, 0x91, 0xbd,
+ 0xab, 0x15, 0xf4, 0x3d, 0x9b, 0x0b, 0xf5, 0x3d, 0xa2, 0x20, 0x9b, 0x3c,
+ 0x6f, 0x83, 0xc8, 0xbd, 0x7c, 0x67, 0x27, 0x3e, 0xe5, 0x88, 0xe5, 0xbd,
+ 0xda, 0xc1, 0xe3, 0xbd, 0x5d, 0x93, 0x84, 0xbc, 0x26, 0x0c, 0x06, 0x3e,
+ 0xcb, 0x61, 0x26, 0x3d, 0xde, 0x83, 0xcc, 0xbe, 0x50, 0x9a, 0x48, 0xbd,
+ 0xf7, 0xbd, 0x1f, 0xbe, 0x8a, 0x65, 0xce, 0x3d, 0xba, 0xf9, 0x0c, 0x3e,
+ 0x33, 0xb6, 0xab, 0x3d, 0xe7, 0x87, 0x30, 0x3e, 0xcc, 0x71, 0x0e, 0xbe,
+ 0x11, 0x0f, 0x5c, 0xbc, 0xb7, 0xad, 0x77, 0x3e, 0x44, 0x7b, 0x9c, 0x3d,
+ 0xf7, 0x9a, 0x24, 0xbf, 0x47, 0x05, 0x1f, 0x3d, 0x16, 0xdc, 0x55, 0x3d,
+ 0xcc, 0xcf, 0x25, 0xbe, 0x34, 0xb2, 0x13, 0xbe, 0x5c, 0xcc, 0xc3, 0xbd,
+ 0xdc, 0xf6, 0xcf, 0xbd, 0xd8, 0xef, 0x57, 0x3d, 0x84, 0x28, 0x09, 0x3d,
+ 0x10, 0x89, 0x61, 0x3e, 0x68, 0xa6, 0x62, 0x3e, 0x7a, 0x12, 0x54, 0x3e,
+ 0x54, 0xcd, 0xed, 0xbd, 0xd6, 0xa1, 0x29, 0xbe, 0xd2, 0x67, 0xe5, 0xbd,
+ 0x1d, 0x71, 0x88, 0x3d, 0x2b, 0x9d, 0x07, 0x3e, 0x0f, 0xe8, 0x22, 0x3e,
+ 0xca, 0x87, 0x02, 0x3e, 0x71, 0xcf, 0xd2, 0x3b, 0xb5, 0x20, 0xa6, 0x38,
+ 0x16, 0xe1, 0x3d, 0xbd, 0x99, 0xc5, 0x25, 0x3d, 0x94, 0x04, 0xe2, 0xb9,
+ 0xc3, 0xed, 0x23, 0x3d, 0xb8, 0x16, 0x47, 0x3d, 0xde, 0x19, 0x33, 0xbe,
+ 0x09, 0x98, 0xdd, 0x3b, 0xe1, 0x5e, 0xfc, 0xbd, 0x9f, 0x88, 0x3f, 0xbe,
+ 0x3f, 0x87, 0x71, 0x3d, 0x0a, 0xf7, 0xbb, 0xbb, 0x07, 0xf0, 0x2b, 0x3e,
+ 0x9d, 0xba, 0xba, 0x3d, 0x8a, 0x60, 0x3c, 0xbd, 0x9b, 0xfc, 0x2a, 0x3c,
+ 0xe2, 0x32, 0x0d, 0xbe, 0x22, 0xcb, 0xd4, 0x3c, 0xa2, 0xbe, 0xba, 0xbd,
+ 0x72, 0xec, 0xfb, 0xbb, 0xfb, 0xbc, 0x98, 0xbd, 0x4f, 0xcd, 0x05, 0xbe,
+ 0xb4, 0x0a, 0x0a, 0xbe, 0xae, 0x6e, 0xd6, 0x3c, 0xea, 0x60, 0xa2, 0xbd,
+ 0x62, 0xce, 0xc3, 0xbd, 0x89, 0x51, 0x8b, 0x3d, 0x34, 0x18, 0x18, 0x3e,
+ 0x32, 0x2d, 0x10, 0xbe, 0x7e, 0x46, 0xe8, 0x3c, 0x01, 0xe7, 0x10, 0xbe,
+ 0x42, 0xc3, 0x12, 0x3e, 0x90, 0x95, 0xee, 0x3d, 0xa2, 0x59, 0x03, 0xbe,
+ 0x13, 0xf3, 0x35, 0xbe, 0xa0, 0x96, 0x3b, 0xbd, 0x9e, 0x9c, 0x3a, 0x3c,
+ 0xe4, 0xec, 0x89, 0x3d, 0xcf, 0xc8, 0x1a, 0x3e, 0x69, 0xa7, 0x8a, 0x3d,
+ 0x33, 0x9c, 0x34, 0xbd, 0x81, 0x8d, 0xef, 0xbd, 0x4a, 0x23, 0xa4, 0xbd,
+ 0x4f, 0xbd, 0xfb, 0x3d, 0x81, 0xbc, 0xd8, 0xbd, 0xfb, 0x6d, 0x4a, 0xbd,
+ 0x5b, 0x20, 0xed, 0x3d, 0x9c, 0xe3, 0x13, 0xbd, 0xb2, 0x9e, 0xf3, 0x3d,
+ 0xe2, 0x45, 0xce, 0x3b, 0xa1, 0x66, 0xb0, 0x3b, 0x8d, 0x71, 0xb1, 0xbd,
+ 0x6a, 0x29, 0x00, 0xbe, 0x65, 0xbf, 0x4e, 0xbb, 0x3f, 0xea, 0x11, 0xbc,
+ 0x4b, 0x8f, 0xa3, 0xbd, 0xa4, 0x5c, 0xad, 0xbd, 0x47, 0x6d, 0x31, 0xbd,
+ 0xde, 0xf6, 0x60, 0x3d, 0xf5, 0x68, 0xa0, 0x3c, 0x85, 0xd1, 0x1a, 0x3e,
+ 0x1c, 0xcd, 0xd6, 0xbd, 0xfb, 0x4a, 0xf0, 0xbc, 0xe8, 0xad, 0xd4, 0x3c,
+ 0x2b, 0xfd, 0x27, 0x3d, 0xe3, 0x36, 0x46, 0x3d, 0x83, 0x32, 0x76, 0xbd,
+ 0x53, 0xad, 0x40, 0x3c, 0xa9, 0x4e, 0xaf, 0x3d, 0x39, 0x89, 0x96, 0xbd,
+ 0x9f, 0xf3, 0x9b, 0xbc, 0xa6, 0x86, 0x83, 0xbd, 0xcb, 0xd2, 0x98, 0xbd,
+ 0x00, 0x12, 0x1b, 0x3e, 0xca, 0x3a, 0xb6, 0x3c, 0x55, 0x57, 0x39, 0x3c,
+ 0x3b, 0xdf, 0x00, 0x3d, 0x9c, 0x3a, 0x2d, 0x3e, 0xaa, 0x1f, 0xe7, 0xbd,
+ 0xa2, 0x4a, 0x17, 0xbe, 0x91, 0x70, 0xfe, 0xbc, 0x95, 0xfc, 0xc7, 0xbc,
+ 0xad, 0x2e, 0x25, 0xbc, 0xc5, 0x33, 0xb4, 0xbd, 0xe1, 0x11, 0x96, 0xbd,
+ 0x7a, 0xf3, 0x4a, 0x3e, 0xc1, 0xa2, 0x13, 0xbd, 0x11, 0x67, 0xf5, 0xbd,
+ 0x72, 0x65, 0x30, 0x3d, 0x25, 0xf9, 0x06, 0x3e, 0xc7, 0x75, 0x12, 0x3e,
+ 0x47, 0xcc, 0x9f, 0xbd, 0x58, 0x29, 0xba, 0x3d, 0x06, 0x77, 0x78, 0xbe,
+ 0x6f, 0xdf, 0xed, 0x3c, 0x94, 0xc2, 0x23, 0x3e, 0xd6, 0x77, 0x3d, 0x3d,
+ 0x49, 0x7d, 0x06, 0xbe, 0x3e, 0xb2, 0x34, 0x3d, 0x26, 0x3c, 0x58, 0x3d,
+ 0x7a, 0x2c, 0x51, 0xbe, 0xb0, 0x93, 0xe7, 0xbc, 0xa9, 0xe9, 0xb0, 0xbd,
+ 0x86, 0x48, 0x95, 0x3d, 0x8c, 0x3c, 0x0f, 0x3e, 0x99, 0xf9, 0x50, 0xbe,
+ 0x45, 0x44, 0xea, 0x3d, 0x31, 0x03, 0x20, 0xbe, 0x72, 0x8d, 0xb5, 0xbd,
+ 0x5d, 0x25, 0x84, 0x3d, 0x9a, 0x5f, 0x0b, 0xbe, 0x99, 0xcf, 0xb8, 0x3d,
+ 0x43, 0x65, 0xce, 0x3d, 0x0f, 0x84, 0x50, 0xbe, 0xc3, 0xef, 0xdd, 0x3d,
+ 0x90, 0x6b, 0x08, 0x3e, 0x44, 0x3b, 0xbe, 0xbd, 0x7e, 0x97, 0x75, 0x3d,
+ 0x46, 0x03, 0x93, 0xbe, 0x8e, 0xa2, 0x65, 0xbe, 0x6e, 0x44, 0xe7, 0x3d,
+ 0x33, 0x93, 0x87, 0x3d, 0x70, 0x9f, 0x2e, 0xbe, 0x1f, 0xdb, 0x37, 0xbd,
+ 0x70, 0x80, 0xad, 0x3d, 0x23, 0x1a, 0xa9, 0x3c, 0x24, 0x6e, 0x4b, 0xbd,
+ 0xdc, 0x97, 0x33, 0x3e, 0x0d, 0xd7, 0x54, 0xbd, 0xa2, 0x3b, 0xa8, 0x3d,
+ 0xab, 0x25, 0x0f, 0xbe, 0xfa, 0x60, 0x34, 0xbd, 0xe6, 0x54, 0x77, 0xbe,
+ 0xe9, 0xfc, 0x32, 0xbd, 0x6b, 0x5b, 0x91, 0x3d, 0xba, 0xca, 0x93, 0x3e,
+ 0x40, 0x12, 0xe0, 0xbc, 0x61, 0x06, 0x3a, 0xbd, 0x84, 0x1b, 0xed, 0xbc,
+ 0x9f, 0x66, 0x8e, 0x3c, 0x0e, 0xc0, 0x5e, 0x3e, 0x8e, 0x0c, 0xbe, 0xbc,
+ 0x3a, 0x10, 0xb5, 0x3d, 0x65, 0xe8, 0x96, 0xbd, 0xe2, 0xdc, 0x99, 0x3d,
+ 0xf8, 0xf5, 0x97, 0xbb, 0xf9, 0x11, 0xa1, 0xbd, 0xc4, 0xba, 0x10, 0xbd,
+ 0x90, 0x6a, 0xc2, 0x3c, 0xaf, 0xbd, 0x26, 0x3e, 0x9b, 0xdd, 0x41, 0xbb,
+ 0x1a, 0x58, 0x46, 0x3e, 0x63, 0xb6, 0x13, 0x3e, 0x48, 0xc1, 0x33, 0x3e,
+ 0x6d, 0xdc, 0x20, 0x3e, 0x7f, 0x21, 0xb7, 0x3c, 0xbb, 0x47, 0xa0, 0x3d,
+ 0x05, 0xbb, 0xde, 0xbd, 0xab, 0xa6, 0x3e, 0x3d, 0x24, 0x68, 0x2b, 0xbe,
+ 0xcd, 0x82, 0xf8, 0xbd, 0xfe, 0x2b, 0x78, 0x3d, 0xce, 0xa2, 0xcd, 0x3d,
+ 0x68, 0x93, 0x91, 0x3d, 0xfc, 0x91, 0x67, 0x3d, 0x56, 0x30, 0xc2, 0xbb,
+ 0x49, 0xa6, 0xc7, 0x3d, 0x1a, 0x9c, 0x8b, 0x3c, 0xae, 0xe4, 0x8c, 0xbd,
+ 0x18, 0x1a, 0x2b, 0xbd, 0x04, 0x39, 0x82, 0xbd, 0x66, 0x70, 0x3c, 0x3d,
+ 0xbe, 0x1e, 0xbb, 0x3c, 0xb9, 0x7a, 0x70, 0x3d, 0xdd, 0x5e, 0x22, 0x3e,
+ 0x8b, 0x2e, 0xe7, 0x3c, 0x54, 0x13, 0x52, 0x3c, 0x4e, 0x27, 0xf2, 0x3d,
+ 0x41, 0x3e, 0x24, 0x3b, 0x77, 0x37, 0x57, 0x3e, 0x6e, 0xdf, 0x87, 0xbe,
+ 0xc6, 0x88, 0x87, 0xbd, 0xf5, 0x9d, 0x01, 0x3d, 0x28, 0x54, 0x79, 0xbd,
+ 0xb7, 0x71, 0x03, 0xbe, 0x42, 0xcf, 0xb8, 0xbd, 0xc0, 0xc9, 0xe9, 0xbd,
+ 0x1e, 0x24, 0x95, 0x3d, 0xe8, 0x60, 0xee, 0xbd, 0xf5, 0x8c, 0x0f, 0xbe,
+ 0x39, 0x10, 0xcf, 0xbd, 0xd4, 0xf1, 0x8b, 0x3c, 0xc0, 0x3e, 0xab, 0xbd,
+ 0x2b, 0x4e, 0x8d, 0xbd, 0xe8, 0x06, 0x80, 0x3d, 0x3c, 0xd1, 0x84, 0x3e,
+ 0x87, 0x59, 0x2b, 0x3e, 0xe9, 0xb5, 0xae, 0x3d, 0x75, 0x8b, 0x90, 0x3a,
+ 0x13, 0x01, 0x9b, 0xbc, 0xdd, 0x26, 0xbd, 0x3d, 0x61, 0xba, 0x9a, 0x3d,
+ 0x96, 0xc2, 0x37, 0xbb, 0xf9, 0x25, 0x70, 0xbd, 0xfe, 0x53, 0x22, 0x3e,
+ 0xda, 0x10, 0x54, 0xbd, 0xf8, 0x1a, 0x34, 0x3b, 0xd6, 0x4c, 0x02, 0x3e,
+ 0x28, 0x64, 0x42, 0xbd, 0x25, 0x14, 0x73, 0xbd, 0xbc, 0xc8, 0x78, 0xbd,
+ 0xbf, 0x89, 0xbc, 0xbb, 0x44, 0x15, 0x99, 0x3c, 0xb8, 0x4c, 0x2b, 0xbd,
+ 0xfd, 0x34, 0xde, 0x3c, 0x24, 0xcc, 0x4a, 0xbe, 0x80, 0x05, 0xd4, 0xbc,
+ 0x88, 0x32, 0x18, 0x3e, 0x06, 0x4a, 0xfe, 0x3c, 0x54, 0x90, 0x65, 0xbe,
+ 0x3b, 0xa1, 0x13, 0xbe, 0xf8, 0x22, 0x85, 0x3e, 0x39, 0x2e, 0xa3, 0x3d,
+ 0xf2, 0x5a, 0x08, 0x3c, 0xb1, 0x9b, 0x36, 0x3d, 0x22, 0xd3, 0xbb, 0x3d,
+ 0x69, 0xa6, 0x2d, 0xbe, 0x92, 0xbd, 0xba, 0xbb, 0x93, 0xd0, 0xc5, 0xbd,
+ 0xd3, 0xf3, 0x1d, 0x3e, 0xfd, 0x3f, 0x4a, 0xbe, 0x35, 0xd4, 0xab, 0x3d,
+ 0xb0, 0x5c, 0x6b, 0xbe, 0x27, 0xf4, 0x07, 0xbe, 0x1f, 0x83, 0x09, 0x3e,
+ 0xe1, 0x65, 0xb6, 0xbd, 0xfb, 0xdb, 0x69, 0xbc, 0xd6, 0x2f, 0x4f, 0xbb,
+ 0xea, 0x7a, 0xb1, 0x3e, 0x47, 0x52, 0x4f, 0xbe, 0xa4, 0xe3, 0xa9, 0x3d,
+ 0x43, 0xe7, 0x99, 0x3d, 0x05, 0xb8, 0x32, 0xbd, 0x68, 0x3d, 0x06, 0xbe,
+ 0x89, 0x7c, 0x43, 0x3e, 0x0d, 0xad, 0x06, 0xbd, 0xc1, 0x86, 0x23, 0x3e,
+ 0x9b, 0xf1, 0x72, 0xbe, 0x33, 0xad, 0xb7, 0x3d, 0xfe, 0x0e, 0x33, 0x3e,
+ 0x48, 0xfe, 0xa4, 0xbc, 0x1e, 0xd4, 0x12, 0x3d, 0xb1, 0xd0, 0xb3, 0x3d,
+ 0xc4, 0x42, 0x0e, 0x3e, 0xa2, 0x30, 0xe0, 0x3d, 0x76, 0xc6, 0x55, 0x3e,
+ 0x79, 0xa3, 0x16, 0xbe, 0xdc, 0xfb, 0xf1, 0xbc, 0xd4, 0x16, 0x36, 0x3d,
+ 0xd4, 0x8b, 0xb0, 0xbd, 0xeb, 0x4e, 0xd7, 0x3b, 0xe8, 0xa2, 0x15, 0x3e,
+ 0x7c, 0x4f, 0x06, 0xbe, 0xe9, 0x42, 0xae, 0xbd, 0x49, 0xf1, 0x63, 0xbb,
+ 0x4b, 0xd3, 0x79, 0x3e, 0xc5, 0x15, 0xfa, 0xbd, 0x7e, 0x5c, 0x48, 0x3d,
+ 0xa8, 0x21, 0x81, 0x3b, 0x40, 0x89, 0x7d, 0xbe, 0x7c, 0x8f, 0x77, 0x3e,
+ 0x0a, 0xb3, 0x3f, 0x3c, 0x7c, 0x07, 0x95, 0x3b, 0x3f, 0x7a, 0xd8, 0xbd,
+ 0xdf, 0x70, 0xcd, 0x3d, 0x9a, 0x46, 0x93, 0x3d, 0xb4, 0xcb, 0xcd, 0xbd,
+ 0xdf, 0x08, 0x81, 0xbd, 0x56, 0x9f, 0x7c, 0xbd, 0x26, 0x0c, 0x78, 0xbe,
+ 0xce, 0xe6, 0x8c, 0xbd, 0x86, 0x6d, 0x6b, 0xbe, 0x23, 0xd8, 0x7f, 0x3b,
+ 0xc6, 0x52, 0x59, 0x3e, 0x2f, 0xa4, 0x58, 0xbd, 0x7b, 0xed, 0x0b, 0x3e,
+ 0x98, 0xf5, 0x06, 0x3d, 0xaa, 0x0f, 0xb8, 0x3d, 0x3b, 0x52, 0x07, 0xbe,
+ 0x6c, 0xa6, 0x57, 0x3c, 0x3f, 0x3d, 0x10, 0xbc, 0x3b, 0xa8, 0x2e, 0xbe,
+ 0x55, 0x4c, 0x96, 0xbd, 0x9e, 0xa8, 0x36, 0x3d, 0x03, 0x96, 0xfb, 0xbd,
+ 0xc8, 0x6a, 0xa9, 0x3d, 0xcc, 0x11, 0x86, 0xbc, 0xf4, 0xc6, 0x82, 0x3d,
+ 0x9c, 0x42, 0x3e, 0xbe, 0x51, 0x9b, 0x84, 0xbd, 0x83, 0x7a, 0x99, 0x3d,
+ 0x2c, 0x29, 0x03, 0x3d, 0xef, 0x45, 0x66, 0xbd, 0x35, 0x0b, 0x86, 0xbc,
+ 0x68, 0x0e, 0x30, 0xbe, 0xda, 0xc7, 0xac, 0x3d, 0x5a, 0x33, 0xa1, 0x3d,
+ 0x04, 0x14, 0xa7, 0xbd, 0xee, 0xfc, 0xf8, 0x3d, 0xbd, 0x3e, 0x1d, 0x3e,
+ 0x8c, 0x5a, 0x76, 0xbd, 0x17, 0x5b, 0xce, 0x3d, 0x17, 0xaa, 0x3c, 0x3e,
+ 0xfe, 0x9f, 0xbf, 0xbd, 0x3a, 0xbe, 0x2b, 0x3e, 0x7a, 0x28, 0x9a, 0xbd,
+ 0x0c, 0xae, 0x47, 0xbd, 0xb9, 0xa1, 0x21, 0x3e, 0x0b, 0x0a, 0x3b, 0xbe,
+ 0xa1, 0x5b, 0x10, 0xbc, 0xbe, 0x67, 0x9a, 0x3e, 0x93, 0x71, 0xd6, 0x3d,
+ 0xb0, 0x60, 0x14, 0xbe, 0x57, 0x46, 0x1f, 0x3d, 0x37, 0x6f, 0xf9, 0xbd,
+ 0x50, 0xa1, 0x89, 0xbe, 0x61, 0x13, 0x42, 0xbe, 0x81, 0x7a, 0xcf, 0xbe,
+ 0x6e, 0x57, 0x32, 0x3e, 0x37, 0x4e, 0xaa, 0x3d, 0x7d, 0x19, 0xb4, 0x3d,
+ 0xd0, 0x96, 0x00, 0x3e, 0xe0, 0x3c, 0xe6, 0xbd, 0x2b, 0x73, 0x95, 0xbc,
+ 0xe9, 0x8b, 0x55, 0x3d, 0x5d, 0x36, 0xda, 0xbd, 0x25, 0xc2, 0x90, 0xbe,
+ 0x86, 0xd8, 0xe0, 0xbc, 0x74, 0x53, 0xc2, 0x3c, 0x83, 0x98, 0x74, 0xbe,
+ 0xf6, 0xae, 0x28, 0x3e, 0x43, 0xbe, 0x33, 0x3e, 0x64, 0x96, 0xea, 0x3d,
+ 0x53, 0xf9, 0x93, 0x3d, 0xd1, 0xde, 0x58, 0xbe, 0xe8, 0x24, 0x02, 0xbe,
+ 0x06, 0x35, 0x65, 0x3b, 0x5b, 0x65, 0x23, 0xbc, 0x53, 0x36, 0x14, 0x3e,
+ 0x26, 0xee, 0x2a, 0x3e, 0x50, 0x81, 0x46, 0x3d, 0x55, 0xb5, 0x99, 0x3d,
+ 0x04, 0x0b, 0x0a, 0x3e, 0xa0, 0x50, 0xde, 0x3d, 0xd6, 0x87, 0x80, 0xbe,
+ 0x3f, 0xf4, 0x4a, 0x3d, 0x93, 0x66, 0x7f, 0xba, 0x68, 0xef, 0x4f, 0xbe,
+ 0x36, 0xcc, 0x95, 0xbc, 0x03, 0x5a, 0xc0, 0xbd, 0x8d, 0xfd, 0x65, 0xbe,
+ 0x6e, 0x6e, 0x07, 0xbe, 0xd1, 0x55, 0xeb, 0xbd, 0xa9, 0xa8, 0xa9, 0x3b,
+ 0x7f, 0x4f, 0xdc, 0xba, 0x34, 0xad, 0xdd, 0xbb, 0xb2, 0xc4, 0xad, 0x3c,
+ 0xd5, 0xb7, 0x36, 0xbd, 0x6f, 0x60, 0xc8, 0x3d, 0xcc, 0x7c, 0x64, 0xbe,
+ 0xdd, 0x9a, 0xd5, 0xbd, 0xca, 0x47, 0xe5, 0xbd, 0xe4, 0xa3, 0x11, 0x3d,
+ 0x1f, 0x9c, 0x1b, 0xbe, 0x1a, 0xb8, 0xd0, 0x3d, 0x8c, 0x28, 0xaa, 0xbe,
+ 0x1d, 0x28, 0x23, 0x3e, 0x19, 0xf9, 0x98, 0x3d, 0x22, 0xe0, 0x0b, 0x3c,
+ 0x2c, 0x00, 0x8b, 0xbe, 0x2c, 0x68, 0xd9, 0x3d, 0x5e, 0xee, 0xd4, 0xbb,
+ 0x0d, 0x5c, 0x21, 0xbe, 0x68, 0x80, 0xf5, 0x3d, 0x87, 0xd2, 0x68, 0xbb,
+ 0x31, 0x14, 0x14, 0x3e, 0x0a, 0xbb, 0x72, 0xbc, 0x02, 0x5b, 0xce, 0x3d,
+ 0xb7, 0x72, 0x45, 0xbe, 0x69, 0x16, 0x2d, 0xbe, 0xfa, 0xec, 0xc3, 0x3c,
+ 0x2b, 0x55, 0x8f, 0xbd, 0x4f, 0x7f, 0x04, 0x3e, 0x0b, 0x7a, 0x20, 0xbe,
+ 0x7a, 0x6a, 0x50, 0xbd, 0xfb, 0x54, 0xad, 0x3d, 0x61, 0xe3, 0x4a, 0xbe,
+ 0x70, 0x36, 0x09, 0xbe, 0x6b, 0xf6, 0x23, 0x3e, 0xf5, 0x8d, 0x0d, 0x3e,
+ 0xa0, 0x63, 0x1d, 0xbd, 0x1b, 0x18, 0x70, 0xbd, 0xbe, 0x1c, 0xdd, 0x3d,
+ 0x36, 0xf7, 0x82, 0x3c, 0x90, 0xf8, 0x18, 0xbd, 0x68, 0xc1, 0x90, 0x37,
+ 0x2b, 0xda, 0x25, 0x3e, 0x7c, 0x4e, 0xb7, 0xbd, 0x13, 0xbb, 0x45, 0xbe,
+ 0x5a, 0xd2, 0x43, 0xbd, 0x1c, 0xc0, 0x10, 0xbe, 0x84, 0x56, 0xbf, 0x3d,
+ 0xc8, 0x60, 0x7f, 0x3d, 0xaa, 0x5a, 0x55, 0x3d, 0x19, 0x1f, 0x1f, 0x3c,
+ 0x1c, 0xbb, 0xc6, 0x3d, 0xd1, 0x3c, 0x5e, 0x3d, 0xde, 0x20, 0x54, 0xbb,
+ 0xf6, 0xe6, 0xd2, 0x3c, 0x10, 0xe5, 0xf0, 0x3c, 0x83, 0x24, 0x73, 0xbc,
+ 0x5e, 0x41, 0xfe, 0x3d, 0xf2, 0xea, 0x0b, 0x3e, 0x1c, 0xf3, 0xee, 0x3c,
+ 0xbc, 0xb3, 0x47, 0x3c, 0xb3, 0xf0, 0x20, 0xbe, 0x67, 0x09, 0x2d, 0x3d,
+ 0xaf, 0x0f, 0xd3, 0x3c, 0x0d, 0xca, 0x7c, 0xbd, 0x91, 0x1d, 0xf0, 0x3d,
+ 0x02, 0x83, 0xa0, 0x3b, 0xb1, 0xfe, 0x1f, 0xbe, 0xea, 0x18, 0xe9, 0xbd,
+ 0xcb, 0x99, 0x97, 0x3d, 0x4f, 0x4e, 0xca, 0x3d, 0x24, 0xd6, 0x8e, 0xbb,
+ 0x29, 0x6f, 0x57, 0xbe, 0x21, 0xbb, 0xf8, 0xbc, 0xcf, 0x3a, 0x91, 0xbe,
+ 0xcb, 0xdc, 0xd3, 0xbd, 0xf8, 0xfd, 0x0b, 0x3e, 0x38, 0x35, 0x85, 0xbd,
+ 0x53, 0x75, 0x31, 0xbe, 0x1e, 0x37, 0xa6, 0xbe, 0x8e, 0xc7, 0x06, 0xbe,
+ 0x56, 0xe6, 0x9b, 0x3b, 0x4c, 0x57, 0xe8, 0xbd, 0x3b, 0xb4, 0x91, 0x3d,
+ 0x93, 0x19, 0x0e, 0xbe, 0xe1, 0x32, 0xf4, 0xbd, 0x27, 0x93, 0x36, 0x3e,
+ 0x35, 0x52, 0x59, 0x3d, 0x50, 0x70, 0xb2, 0x3d, 0x2a, 0xde, 0xc5, 0xbd,
+ 0xd6, 0x64, 0x02, 0xbe, 0x79, 0xdc, 0x8b, 0x3e, 0x46, 0xdd, 0x0d, 0x3e,
+ 0x5b, 0xf4, 0x1e, 0x3e, 0x8d, 0x6b, 0x2d, 0xbe, 0x3d, 0x7b, 0xb6, 0x3d,
+ 0xa0, 0xf7, 0x2d, 0xbd, 0xfc, 0x6b, 0x69, 0xbd, 0xb8, 0x83, 0xa5, 0xbd,
+ 0x06, 0xbc, 0xac, 0x3d, 0x02, 0x3d, 0xc6, 0x3d, 0x2d, 0xe9, 0x0a, 0x3e,
+ 0xb1, 0x5f, 0xb8, 0xbc, 0x37, 0x4d, 0xee, 0x3d, 0x37, 0x38, 0xd1, 0xbc,
+ 0x8d, 0xf1, 0x38, 0xbe, 0xcf, 0x1c, 0x43, 0xbe, 0x4d, 0x2c, 0x3d, 0xbe,
+ 0xd5, 0x8f, 0x79, 0xbd, 0x34, 0x39, 0x26, 0xbe, 0x23, 0x12, 0xe8, 0x3d,
+ 0x2a, 0x9e, 0x43, 0x3d, 0x94, 0x77, 0xf8, 0x3d, 0x89, 0x1d, 0xa9, 0xbd,
+ 0xb2, 0x64, 0x62, 0x3b, 0x9e, 0x10, 0x18, 0x3d, 0x0f, 0x4f, 0x2d, 0xbe,
+ 0x24, 0x5a, 0xa9, 0xbc, 0x59, 0x0e, 0x88, 0xbd, 0x16, 0xc4, 0x3b, 0xbe,
+ 0x46, 0x55, 0xa0, 0x3d, 0xd8, 0x8d, 0x93, 0xbc, 0x83, 0x77, 0x08, 0x3b,
+ 0xae, 0x8b, 0xdc, 0x3d, 0x4a, 0x7b, 0x30, 0xbe, 0x23, 0x73, 0x1a, 0x3d,
+ 0x63, 0xfd, 0x44, 0xbe, 0xad, 0x92, 0xbc, 0x3d, 0x03, 0x6a, 0x16, 0x3e,
+ 0x6e, 0x36, 0xd3, 0xbd, 0x35, 0x23, 0xb7, 0x3d, 0xae, 0x56, 0x6d, 0xbd,
+ 0x7e, 0x94, 0x80, 0xbd, 0xfd, 0xcc, 0x31, 0x3d, 0xb4, 0x31, 0x2f, 0xbd,
+ 0x65, 0x5b, 0x84, 0x3e, 0x41, 0xd9, 0xf6, 0xbd, 0x9b, 0xbe, 0x2b, 0xbe,
+ 0xa2, 0xf0, 0xde, 0x3c, 0x7d, 0x54, 0x81, 0x3d, 0x3b, 0xbf, 0x09, 0xbe,
+ 0xea, 0x36, 0x02, 0xbe, 0x56, 0x62, 0xf5, 0x3b, 0x59, 0x89, 0x9c, 0x3d,
+ 0x71, 0x9a, 0x71, 0x3c, 0xe6, 0x6a, 0xfb, 0x3d, 0xf2, 0x6f, 0x4a, 0x3d,
+ 0x75, 0x16, 0xb4, 0x3d, 0xc7, 0x44, 0xc2, 0x3d, 0xe0, 0xe7, 0x46, 0x3c,
+ 0x11, 0xfe, 0x98, 0xbd, 0x57, 0x36, 0xaa, 0x3d, 0xeb, 0xa0, 0x19, 0x3d,
+ 0x25, 0x25, 0xf9, 0xbd, 0x3d, 0x36, 0x0a, 0x3e, 0x64, 0x6b, 0x1c, 0x3e,
+ 0xb5, 0x3e, 0x2a, 0x3e, 0xbe, 0x83, 0xaf, 0xbd, 0xa7, 0x6e, 0x0e, 0x3e,
+ 0x7e, 0x5b, 0x1f, 0x3c, 0xf5, 0xe1, 0xf7, 0x3d, 0x76, 0x5d, 0xe0, 0x3d,
+ 0x41, 0x99, 0x21, 0xbd, 0x0b, 0x9b, 0x03, 0xbe, 0xc3, 0x69, 0x4e, 0x3d,
+ 0xea, 0x49, 0xf9, 0x3d, 0x2d, 0xe7, 0x15, 0x3e, 0x1c, 0xac, 0x0e, 0x3e,
+ 0x49, 0x01, 0x4a, 0xbd, 0x65, 0x02, 0xd9, 0x3c, 0x5d, 0xbb, 0x18, 0x3e,
+ 0x87, 0xd5, 0x03, 0x3d, 0x90, 0x4c, 0x28, 0x3e, 0xfb, 0x06, 0x19, 0xbe,
+ 0x6d, 0xdf, 0xd9, 0x3b, 0x44, 0x7a, 0x87, 0xbc, 0xe4, 0xf0, 0xd1, 0x3c,
+ 0xa8, 0xdb, 0x9f, 0xbd, 0x77, 0xa1, 0xf5, 0x3d, 0x51, 0x55, 0x1a, 0xbe,
+ 0xee, 0xdd, 0x3a, 0x3e, 0xcb, 0xb7, 0x3d, 0xbc, 0xaf, 0xc5, 0x22, 0xbd,
+ 0x25, 0x0f, 0xa2, 0xbd, 0xba, 0xe4, 0x08, 0xbe, 0xfa, 0x5c, 0xf1, 0xbd,
+ 0x3b, 0x51, 0x6b, 0x3d, 0xc2, 0xa3, 0x20, 0x3e, 0x78, 0x0c, 0x62, 0x3c,
+ 0xf9, 0x2e, 0x6f, 0x3d, 0x13, 0x57, 0xa2, 0x3d, 0x22, 0xb0, 0x02, 0x3e,
+ 0x28, 0x3f, 0x24, 0xbe, 0x8b, 0x22, 0xe4, 0xbc, 0x58, 0xa3, 0x26, 0xbd,
+ 0x99, 0xd1, 0xf3, 0xbd, 0x6d, 0xbb, 0xfc, 0x3c, 0x1f, 0x70, 0x14, 0x3c,
+ 0x53, 0x90, 0x3f, 0xbc, 0x39, 0xcd, 0xa4, 0xbd, 0x7a, 0xa7, 0xfa, 0xbd,
+ 0xe4, 0xf7, 0x48, 0xbe, 0xf2, 0x0e, 0x2d, 0xbe, 0xe0, 0xd9, 0x94, 0xbe,
+ 0x7d, 0x77, 0x1c, 0xbe, 0xb2, 0x37, 0xcb, 0xbd, 0x52, 0x0b, 0x8c, 0xbe,
+ 0xd4, 0x2b, 0x2a, 0x3d, 0x92, 0xdb, 0x11, 0x3d, 0x28, 0x0e, 0x43, 0xbe,
+ 0x1c, 0x87, 0x3d, 0x3d, 0xed, 0x63, 0x1f, 0x3a, 0x7e, 0x4e, 0xa5, 0x3d,
+ 0x8a, 0x7b, 0x99, 0xbd, 0x4e, 0xcb, 0xa4, 0x3d, 0xde, 0xfe, 0xdf, 0xbc,
+ 0x67, 0xc6, 0x87, 0xbe, 0x56, 0xb2, 0x76, 0xbe, 0x07, 0xb8, 0x56, 0xbe,
+ 0x99, 0x74, 0x58, 0xbe, 0x71, 0xa0, 0xfe, 0x3d, 0x9a, 0x83, 0xbb, 0x3d,
+ 0x68, 0x86, 0xd4, 0xbd, 0xe9, 0xae, 0x47, 0xbe, 0xa3, 0x7d, 0x84, 0xbd,
+ 0xe8, 0x5f, 0xc2, 0x3b, 0x21, 0x13, 0x16, 0x3e, 0x87, 0x7e, 0x87, 0xbd,
+ 0x0e, 0xe5, 0xfd, 0xbc, 0xc0, 0x13, 0x83, 0xbd, 0xda, 0xe3, 0x6d, 0xbd,
+ 0x24, 0x46, 0xf2, 0xbd, 0xf8, 0x40, 0xf7, 0x3d, 0x4d, 0x57, 0x6a, 0xbd,
+ 0x02, 0x80, 0xb5, 0x3c, 0xb9, 0xfa, 0x06, 0x3d, 0x25, 0x44, 0x29, 0x3d,
+ 0xd4, 0xc2, 0x91, 0xbd, 0x40, 0xd1, 0xa7, 0xbd, 0x27, 0x8e, 0xa1, 0x3c,
+ 0xf9, 0x95, 0x5e, 0x3e, 0x19, 0x04, 0x63, 0x3c, 0xb3, 0xf7, 0x18, 0x3e,
+ 0xdc, 0xaf, 0xd2, 0xbd, 0x87, 0x15, 0xb4, 0x3e, 0x31, 0x20, 0xe4, 0xbd,
+ 0x5c, 0xc8, 0xb6, 0x3d, 0x67, 0xb3, 0xf6, 0xbc, 0xef, 0xd0, 0x26, 0x3e,
+ 0x96, 0x06, 0xc3, 0xbd, 0x85, 0xd6, 0x4a, 0xbd, 0x53, 0xe6, 0x20, 0x3d,
+ 0xf4, 0x64, 0x27, 0x3e, 0xd8, 0xd3, 0x1c, 0xbe, 0x79, 0x52, 0x40, 0x3d,
+ 0x62, 0x4a, 0xae, 0xbd, 0x12, 0x34, 0x76, 0xbd, 0x0e, 0xf0, 0x8e, 0x3d,
+ 0x91, 0x64, 0xb7, 0x3d, 0x4d, 0xfc, 0x68, 0x3e, 0x44, 0x35, 0x4d, 0x3e,
+ 0xc8, 0x9a, 0x10, 0x3c, 0x38, 0x7c, 0x8b, 0x3d, 0x27, 0x4e, 0xd6, 0xbb,
+ 0xfa, 0x3f, 0xc7, 0x3d, 0xe3, 0xbf, 0xd0, 0xbd, 0x69, 0xc6, 0x8c, 0x3e,
+ 0x33, 0xb6, 0xaa, 0xbd, 0x99, 0x2e, 0x71, 0x3e, 0xf4, 0xac, 0x29, 0xbe,
+ 0xdd, 0x2d, 0xa1, 0xbe, 0xe5, 0x28, 0xe5, 0xbd, 0x4f, 0x34, 0xf4, 0xbd,
+ 0xcc, 0x73, 0x33, 0xbe, 0x27, 0x86, 0xbd, 0x3d, 0x7d, 0xca, 0x3d, 0xbc,
+ 0x3f, 0xa4, 0xc2, 0x3d, 0x09, 0x8c, 0xac, 0x3d, 0xfd, 0x3e, 0xfc, 0xbc,
+ 0xd5, 0x40, 0xcc, 0xbc, 0x4c, 0x1f, 0x82, 0xbd, 0xba, 0xd5, 0x94, 0x3c,
+ 0xfc, 0xb6, 0x69, 0x3b, 0xd0, 0x95, 0x09, 0xbd, 0xe4, 0xf2, 0x8a, 0xbd,
+ 0x9e, 0x7d, 0x81, 0x3d, 0x82, 0x2a, 0x80, 0x3a, 0x06, 0x47, 0xe8, 0xbd,
+ 0x53, 0x94, 0xdc, 0xbc, 0x9d, 0x31, 0xdf, 0xbd, 0x4b, 0x0a, 0xf7, 0xbc,
+ 0xaf, 0x88, 0xad, 0xbc, 0x5a, 0x09, 0xb2, 0x3d, 0x81, 0xc6, 0xa9, 0xbd,
+ 0x07, 0x5f, 0x24, 0xbd, 0x30, 0x01, 0x7d, 0xbd, 0xe0, 0x0d, 0x21, 0xbe,
+ 0xdb, 0x67, 0xdf, 0x3d, 0xc6, 0x38, 0x36, 0x3d, 0xde, 0x06, 0x55, 0xbe,
+ 0xf0, 0xf5, 0xf8, 0xbd, 0x6a, 0x52, 0xfa, 0x3d, 0x09, 0x24, 0xc7, 0xbd,
+ 0x01, 0x81, 0xf8, 0xbd, 0x9e, 0xae, 0x81, 0xbe, 0xcc, 0x1b, 0x90, 0xbb,
+ 0x6c, 0xc1, 0x94, 0x3e, 0xee, 0x4b, 0xee, 0xbd, 0xae, 0xfb, 0xc0, 0xbb,
+ 0xf1, 0x2f, 0x78, 0x3d, 0x01, 0xdf, 0x35, 0x3e, 0x6f, 0xfe, 0x93, 0xbd,
+ 0x7e, 0xb5, 0x13, 0xbe, 0x8d, 0x98, 0xc3, 0x39, 0xfc, 0x53, 0x45, 0xbe,
+ 0xea, 0xbf, 0xc8, 0xbd, 0x0d, 0xe1, 0x8a, 0x3d, 0x09, 0x9f, 0x2e, 0x3a,
+ 0x4c, 0x68, 0xa5, 0x3c, 0x5f, 0x04, 0x03, 0xbe, 0x7f, 0x61, 0x37, 0x3e,
+ 0xc5, 0xe2, 0x82, 0xbd, 0x60, 0x8f, 0x80, 0x3d, 0x99, 0x1b, 0x31, 0xbe,
+ 0xf2, 0x08, 0x1d, 0xbe, 0x4f, 0xf9, 0x7b, 0xbe, 0x7f, 0x09, 0x0c, 0x3e,
+ 0x8a, 0x9b, 0xef, 0x3d, 0x61, 0x20, 0x7c, 0xbe, 0xa7, 0xaa, 0xab, 0xbd,
+ 0x49, 0x61, 0x38, 0x3e, 0x4f, 0xa4, 0xbd, 0x3d, 0x7a, 0x13, 0xbe, 0xbd,
+ 0x24, 0xb9, 0x0a, 0xbe, 0x48, 0x12, 0x5f, 0xbe, 0x5a, 0xe9, 0x6e, 0xbc,
+ 0x62, 0x15, 0x70, 0xbd, 0x1e, 0xb7, 0xb1, 0xbd, 0x36, 0x07, 0x1c, 0xbe,
+ 0x59, 0xb3, 0x6c, 0xbd, 0x11, 0x89, 0x21, 0xbe, 0xcf, 0x86, 0xaf, 0xbe,
+ 0xc4, 0x4b, 0xdc, 0x3c, 0xab, 0x4a, 0x6f, 0x3d, 0xd1, 0x29, 0x71, 0x3d,
+ 0x57, 0x3e, 0x87, 0xbd, 0xc6, 0x5a, 0x40, 0xbe, 0xee, 0x0f, 0x08, 0xbe,
+ 0xd5, 0x1d, 0x44, 0xbe, 0xdd, 0xb7, 0x5e, 0xbe, 0x97, 0xcd, 0xce, 0xbd,
+ 0x54, 0x84, 0xbf, 0x3b, 0xb1, 0x7d, 0x6a, 0xbd, 0xca, 0x68, 0x08, 0x3e,
+ 0x1f, 0x1b, 0x60, 0xbd, 0xc2, 0xe5, 0xe3, 0xbc, 0xb5, 0x17, 0x03, 0xbe,
+ 0x46, 0x16, 0xf9, 0x3d, 0x02, 0x19, 0x3c, 0xbc, 0xab, 0xd3, 0x4d, 0x3e,
+ 0xf1, 0x0f, 0x29, 0x3d, 0xed, 0xe7, 0x51, 0xbd, 0xe7, 0x37, 0xee, 0xbd,
+ 0x5d, 0x33, 0x0c, 0xbe, 0x2f, 0x1e, 0x00, 0xbe, 0x2b, 0x2b, 0x40, 0xbe,
+ 0xe0, 0xe2, 0x5b, 0xbe, 0x37, 0xce, 0xff, 0x3d, 0x63, 0x02, 0x50, 0xbd,
+ 0x1d, 0x64, 0x0e, 0xbe, 0x67, 0xda, 0x9e, 0x3d, 0x7f, 0x1a, 0x83, 0xbc,
+ 0xa3, 0xf7, 0xde, 0xbd, 0x33, 0x79, 0x04, 0xbe, 0x71, 0xc1, 0xa2, 0xbd,
+ 0x51, 0x4a, 0xe6, 0xbd, 0x7f, 0xec, 0x6b, 0x3d, 0xc9, 0xb2, 0x20, 0xbe,
+ 0x1d, 0x5e, 0x58, 0x3d, 0x93, 0xdb, 0x05, 0x3e, 0xe2, 0x68, 0xeb, 0x3d,
+ 0x41, 0xec, 0x57, 0xbe, 0xe7, 0x22, 0xb2, 0x3b, 0xe5, 0x0e, 0x6b, 0x3c,
+ 0xa3, 0x69, 0x15, 0x3e, 0x26, 0xf3, 0xe9, 0xbd, 0x95, 0x03, 0x50, 0x3c,
+ 0x69, 0x84, 0x24, 0x3e, 0x17, 0x5b, 0x32, 0xbe, 0x46, 0xe1, 0x88, 0x3d,
+ 0x60, 0x9f, 0xeb, 0xbd, 0x4c, 0x58, 0x5b, 0x3c, 0xf4, 0xef, 0xb0, 0x3c,
+ 0x7b, 0xe2, 0x0c, 0xbe, 0xe9, 0x75, 0x1d, 0xbe, 0x13, 0xf0, 0x0b, 0x3e,
+ 0x81, 0x02, 0xb6, 0x3c, 0x64, 0x23, 0x1c, 0x3e, 0x3a, 0xd8, 0x77, 0x3c,
+ 0xdd, 0xc6, 0xd2, 0x3d, 0xb3, 0xd2, 0x6f, 0x3d, 0x58, 0xa0, 0x22, 0xbd,
+ 0x0e, 0xe3, 0x45, 0xbd, 0xc0, 0x9f, 0x8c, 0xbd, 0x10, 0x15, 0x53, 0xbd,
+ 0xe3, 0x2f, 0x9b, 0x3c, 0x18, 0x7a, 0xf6, 0xbd, 0x0d, 0x5e, 0xf7, 0x3d,
+ 0x0a, 0x1f, 0x08, 0x3e, 0xc3, 0x6d, 0x8d, 0x3d, 0x70, 0xe3, 0x44, 0xbe,
+ 0xf5, 0xae, 0xb0, 0xbd, 0xd1, 0x8d, 0xd2, 0xbd, 0xd4, 0x75, 0x13, 0xbe,
+ 0x3d, 0x57, 0xc0, 0xbd, 0x0a, 0x14, 0x7b, 0xbe, 0x23, 0x24, 0x93, 0xbd,
+ 0xc0, 0x35, 0xb8, 0x3d, 0xf3, 0x47, 0xaa, 0xbd, 0xc0, 0x1b, 0x57, 0xbe,
+ 0x00, 0x67, 0x83, 0xbd, 0x0b, 0xd0, 0xc8, 0xbe, 0x80, 0x53, 0x46, 0xbd,
+ 0xc9, 0x8b, 0xd2, 0x3c, 0x9e, 0x91, 0xd0, 0x3d, 0x26, 0x47, 0x18, 0xbd,
+ 0x03, 0x81, 0x8a, 0xbd, 0xac, 0x3f, 0x04, 0x3c, 0x63, 0xb1, 0x1d, 0x3d,
+ 0x0f, 0x07, 0x8f, 0x3c, 0x9c, 0x4f, 0x49, 0x3d, 0x36, 0x22, 0x0c, 0x3e,
+ 0xe1, 0xf8, 0x95, 0xbd, 0x09, 0x37, 0x08, 0xbe, 0x6e, 0x69, 0x35, 0xbe,
+ 0xe9, 0x6d, 0xdb, 0xbc, 0x62, 0x6b, 0xc9, 0xbc, 0x52, 0xcb, 0x8c, 0xbd,
+ 0xa9, 0x5e, 0x1b, 0x3e, 0xff, 0x60, 0x51, 0x3d, 0xc0, 0x5f, 0xc2, 0xbb,
+ 0x09, 0x6f, 0xfa, 0x3d, 0x7f, 0x04, 0x1e, 0x3e, 0xfa, 0x0c, 0x6f, 0x3e,
+ 0xb9, 0x88, 0xe4, 0xbd, 0x6f, 0x3a, 0xc5, 0xbd, 0x1a, 0x6d, 0x04, 0xbe,
+ 0x3e, 0xff, 0x23, 0x3b, 0x29, 0xcc, 0x15, 0xbe, 0xb1, 0x15, 0x05, 0x3d,
+ 0x9f, 0xed, 0xe2, 0xbd, 0x52, 0x07, 0x02, 0x3e, 0xa6, 0xb6, 0xab, 0xbd,
+ 0xdf, 0xc5, 0xa4, 0xbc, 0x74, 0x27, 0x8c, 0x3c, 0x11, 0xfb, 0x3e, 0xbe,
+ 0xeb, 0x91, 0xd2, 0xbd, 0x3c, 0xd6, 0xf3, 0x3c, 0xcc, 0x3a, 0x02, 0x3e,
+ 0xf5, 0xc1, 0xfa, 0x3b, 0x6c, 0x1a, 0xca, 0xbd, 0x7a, 0xef, 0x94, 0xbc,
+ 0x4d, 0x02, 0x5e, 0xbd, 0x81, 0xfd, 0xb8, 0x3d, 0xa0, 0xcd, 0x97, 0xbd,
+ 0xbf, 0xaf, 0xa7, 0xbd, 0x45, 0x06, 0xa5, 0xbd, 0x06, 0x44, 0x0b, 0xbe,
+ 0xea, 0x65, 0xb2, 0x3b, 0x01, 0x9d, 0x26, 0xbe, 0xd8, 0x9e, 0x82, 0xbd,
+ 0x3e, 0xcd, 0x98, 0xbd, 0xcd, 0x36, 0x07, 0xbc, 0x8c, 0x2c, 0x73, 0xbc,
+ 0x17, 0x8f, 0x58, 0xbe, 0xa0, 0x12, 0xf3, 0xbd, 0x5f, 0xc2, 0x87, 0xbd,
+ 0xa7, 0x17, 0x1b, 0xbe, 0x1a, 0x89, 0x80, 0xbe, 0xb0, 0x27, 0xd9, 0xbd,
+ 0x21, 0x24, 0x59, 0xbe, 0xe4, 0x7e, 0x8c, 0xbd, 0xda, 0x19, 0x8b, 0xbd,
+ 0x18, 0x04, 0x47, 0xbe, 0xb1, 0xeb, 0x35, 0xbd, 0xa9, 0x4e, 0x14, 0xbe,
+ 0x7c, 0x02, 0xbe, 0xbd, 0x41, 0x2f, 0x52, 0xbd, 0x66, 0x5e, 0x13, 0xbd,
+ 0xef, 0x65, 0x92, 0xbe, 0x62, 0xfd, 0x0a, 0x3e, 0x9c, 0x4d, 0xd3, 0xbc,
+ 0x77, 0x73, 0x3b, 0x3d, 0x9b, 0x3f, 0x44, 0x3e, 0x28, 0x91, 0x53, 0x3d,
+ 0xb9, 0x5d, 0xc1, 0x3d, 0x13, 0x69, 0x2b, 0xbd, 0x46, 0x0f, 0x86, 0x3c,
+ 0x58, 0x75, 0x2c, 0x3c, 0x28, 0x22, 0x84, 0xbd, 0xba, 0x16, 0xb1, 0xbd,
+ 0x05, 0x1e, 0xf3, 0x3d, 0x20, 0xd5, 0xd1, 0x3b, 0x77, 0x59, 0x1f, 0x3d,
+ 0x9e, 0x4f, 0xb1, 0x3d, 0x92, 0x95, 0x11, 0xbe, 0x4d, 0x25, 0xb0, 0xbe,
+ 0xf0, 0x12, 0x78, 0x3d, 0xfd, 0xc3, 0x0b, 0xbe, 0x99, 0xa1, 0x29, 0xbe,
+ 0x19, 0xb7, 0x78, 0x3d, 0xaa, 0x16, 0xa6, 0xbc, 0x31, 0xba, 0xf6, 0x3d,
+ 0x82, 0x47, 0xdb, 0xbd, 0xb2, 0xf4, 0x21, 0x3e, 0x99, 0x45, 0xd1, 0xbd,
+ 0x14, 0xf8, 0x18, 0x3d, 0xf3, 0x4b, 0x48, 0x3c, 0x33, 0x76, 0x73, 0x3b,
+ 0xec, 0x92, 0xe8, 0x3d, 0xd4, 0xdd, 0x7d, 0x3e, 0x09, 0xb5, 0xd1, 0x3c,
+ 0x5a, 0xb4, 0xc4, 0x3d, 0xf0, 0xc9, 0xf8, 0x3c, 0x15, 0x31, 0xdc, 0xbd,
+ 0x21, 0x0c, 0x74, 0x3e, 0x1b, 0x28, 0xe9, 0x3b, 0x05, 0x35, 0x35, 0xbd,
+ 0x48, 0x7b, 0x58, 0x3d, 0x65, 0x3b, 0xc3, 0x3d, 0x1a, 0x16, 0x89, 0x3c,
+ 0x2f, 0xbb, 0xa2, 0xbd, 0x0a, 0xf1, 0x84, 0x3b, 0x94, 0x4f, 0x46, 0x3b,
+ 0x75, 0xb7, 0x4e, 0xbe, 0x39, 0xc1, 0x4b, 0x3e, 0x81, 0x19, 0x83, 0x3d,
+ 0x57, 0xa3, 0x27, 0x3c, 0x24, 0x64, 0xd4, 0xbc, 0x65, 0x60, 0x8d, 0x3d,
+ 0x62, 0xb1, 0xc4, 0x3d, 0x6a, 0x96, 0x1e, 0xbe, 0x4f, 0x6b, 0x63, 0xbe,
+ 0x31, 0x48, 0x03, 0xbe, 0x3c, 0x58, 0x83, 0x3e, 0xb6, 0x9e, 0x25, 0xbd,
+ 0xe4, 0xfd, 0x04, 0xbe, 0x35, 0x39, 0x99, 0xbd, 0x2f, 0x16, 0xd6, 0xbd,
+ 0x39, 0x4e, 0xb0, 0xbd, 0x44, 0x69, 0x08, 0x3e, 0xa6, 0x17, 0xbc, 0xbc,
+ 0xeb, 0xdb, 0x0a, 0x3d, 0xb0, 0x26, 0xbf, 0x3c, 0xe2, 0xbe, 0x3c, 0xbe,
+ 0xd3, 0xd7, 0x07, 0xbd, 0xd3, 0x97, 0x02, 0xbe, 0x10, 0xb3, 0x54, 0xbd,
+ 0xf8, 0xbb, 0xa3, 0x3c, 0x4f, 0x4c, 0x90, 0x3d, 0x15, 0xcb, 0x37, 0x3e,
+ 0x48, 0x69, 0x10, 0xbc, 0xee, 0x69, 0x04, 0x3c, 0xe3, 0x52, 0x35, 0xbe,
+ 0xdb, 0x4b, 0x0f, 0xbe, 0x6d, 0xf7, 0x2d, 0xbe, 0xe3, 0x50, 0xb0, 0xbd,
+ 0xa4, 0x40, 0x0d, 0x3d, 0x03, 0x97, 0xa5, 0xbd, 0x60, 0x2b, 0xcc, 0x3c,
+ 0xa3, 0xde, 0xbd, 0x3d, 0x17, 0xca, 0x52, 0xbe, 0xd1, 0xc8, 0x56, 0xbe,
+ 0xb3, 0xe3, 0x25, 0x3e, 0x42, 0x0f, 0x5f, 0xbd, 0x35, 0xa7, 0xc0, 0xbc,
+ 0x11, 0xb9, 0x01, 0xbe, 0xd2, 0xf6, 0x99, 0x3d, 0x6d, 0x86, 0xfb, 0x3d,
+ 0xc1, 0x57, 0x73, 0x3c, 0x0c, 0x2b, 0x70, 0xbe, 0x2b, 0x3a, 0x44, 0xbe,
+ 0xc5, 0x1b, 0x87, 0xbd, 0xe9, 0x7f, 0xb3, 0x3b, 0x25, 0x36, 0xd3, 0xbd,
+ 0x4e, 0xf7, 0x96, 0xbd, 0xa5, 0x16, 0xb9, 0x3d, 0x47, 0x60, 0x8f, 0x3b,
+ 0x2f, 0x48, 0x04, 0x3e, 0xdf, 0x1c, 0x08, 0x3e, 0x2a, 0x33, 0x45, 0x3e,
+ 0x62, 0xa6, 0x69, 0xbc, 0xee, 0x25, 0x70, 0xbe, 0x9c, 0xab, 0xb2, 0xbd,
+ 0x15, 0x81, 0x3b, 0xbd, 0xdd, 0xe6, 0x2c, 0xbe, 0xf9, 0x39, 0xe7, 0x3d,
+ 0xe9, 0x22, 0xe8, 0xbc, 0x1b, 0xff, 0x49, 0xbd, 0xd5, 0x68, 0x15, 0x3e,
+ 0x7b, 0x23, 0x65, 0x3d, 0xce, 0xbb, 0x49, 0x3e, 0x23, 0x64, 0xe7, 0xbc,
+ 0x3d, 0xcc, 0x0d, 0xbe, 0x9f, 0x20, 0xa7, 0x3d, 0x31, 0x32, 0x72, 0xbd,
+ 0x43, 0xe8, 0x25, 0xbe, 0x61, 0x93, 0xc5, 0x3d, 0x68, 0xe7, 0x27, 0xbe,
+ 0xc7, 0x37, 0x2d, 0x3e, 0x65, 0x44, 0x6d, 0xbe, 0x7c, 0x81, 0xc9, 0x3d,
+ 0x69, 0x00, 0x00, 0x3d, 0x51, 0x18, 0xa9, 0x3d, 0x95, 0xcd, 0xdc, 0xbd,
+ 0x83, 0x85, 0xdf, 0xbc, 0xdf, 0xdd, 0xae, 0x3d, 0xc9, 0x2b, 0x3a, 0x3e,
+ 0x8a, 0x25, 0x3f, 0xbd, 0x79, 0x80, 0x39, 0xbe, 0x91, 0x65, 0xa2, 0xbd,
+ 0x5c, 0xf1, 0xbb, 0xbd, 0x08, 0xfe, 0x2d, 0x3e, 0xf9, 0x40, 0xfc, 0xbc,
+ 0xa8, 0xd4, 0xc4, 0xbd, 0x79, 0x92, 0xee, 0xbd, 0x46, 0xa5, 0x97, 0x3d,
+ 0x3b, 0x6d, 0xb4, 0xbd, 0xd5, 0x07, 0x13, 0xbd, 0x58, 0x85, 0xd5, 0x3c,
+ 0x08, 0x6e, 0x62, 0x3d, 0x8c, 0x56, 0xf1, 0xbd, 0x67, 0x98, 0x76, 0xbe,
+ 0x7b, 0xce, 0xaa, 0xbd, 0x82, 0x0b, 0xf8, 0x3c, 0x2a, 0xed, 0xaa, 0xbc,
+ 0x7d, 0x2e, 0x29, 0x3c, 0x37, 0xd8, 0x4b, 0xbe, 0x8b, 0xdf, 0x22, 0xbc,
+ 0x5c, 0x08, 0xca, 0x3d, 0x2f, 0x8d, 0x8e, 0xbd, 0xae, 0x97, 0xb7, 0x3c,
+ 0x29, 0x56, 0xf6, 0x3d, 0x45, 0xc2, 0x4a, 0xbd, 0x4d, 0x3e, 0xa1, 0xbd,
+ 0xca, 0xfc, 0x4e, 0x3b, 0x58, 0x14, 0x16, 0x3e, 0x22, 0xb9, 0xa2, 0x3d,
+ 0x57, 0x36, 0xf4, 0xbb, 0x41, 0x13, 0x05, 0x3e, 0x44, 0x77, 0x90, 0x3b,
+ 0x11, 0xd0, 0x3d, 0x3e, 0x04, 0x65, 0xea, 0x3d, 0x50, 0x10, 0x6a, 0xbd,
+ 0xa3, 0xbd, 0xf1, 0x3d, 0x2c, 0x8c, 0x46, 0xbd, 0xab, 0x23, 0xb7, 0x3b,
+ 0x00, 0x0e, 0x83, 0xbd, 0xb4, 0x51, 0x84, 0x3d, 0xbe, 0x0c, 0x87, 0xbd,
+ 0x7a, 0xb8, 0x49, 0xbe, 0x75, 0xb6, 0x97, 0x3d, 0x9a, 0x90, 0xf9, 0xbd,
+ 0x04, 0x0a, 0xc6, 0x3d, 0x2e, 0x0a, 0x06, 0xbd, 0xeb, 0x14, 0x92, 0x3c,
+ 0x69, 0xe4, 0x60, 0xbd, 0x81, 0xd5, 0xc3, 0xbd, 0x9f, 0xa0, 0x2f, 0x3d,
+ 0xb0, 0xa9, 0x6d, 0xbc, 0x91, 0x1f, 0x1b, 0x3c, 0xb4, 0x93, 0xf3, 0x3d,
+ 0xb1, 0xb8, 0xac, 0xbd, 0xe7, 0x36, 0xa5, 0xbd, 0x50, 0x28, 0xe9, 0x3a,
+ 0x28, 0xa5, 0xcb, 0x3d, 0xc7, 0x41, 0xb4, 0xbd, 0x6c, 0xce, 0x2b, 0xbd,
+ 0x1e, 0xb3, 0xf6, 0x3d, 0xce, 0xcf, 0x63, 0xbe, 0x53, 0xb6, 0xb3, 0x3d,
+ 0x28, 0xee, 0x33, 0x3e, 0x97, 0xb8, 0xa6, 0xbd, 0x43, 0xde, 0x05, 0xbe,
+ 0xd1, 0x0d, 0xff, 0xbd, 0x98, 0x37, 0x57, 0x3c, 0x37, 0x61, 0x00, 0xbf,
+ 0x4f, 0x5f, 0x42, 0x3d, 0xb9, 0x98, 0xe6, 0xbd, 0x5b, 0x00, 0x06, 0xbe,
+ 0xd5, 0xb1, 0x23, 0x3d, 0x59, 0x55, 0x0b, 0xbd, 0x0c, 0x45, 0x8d, 0xbe,
+ 0x29, 0x35, 0x4b, 0xbe, 0x1c, 0x29, 0x9e, 0x3c, 0x1b, 0x57, 0x21, 0xbe,
+ 0xa9, 0x3e, 0x5d, 0x3d, 0x71, 0x30, 0xe4, 0xbc, 0x5d, 0x0a, 0x3c, 0x3d,
+ 0xa8, 0x52, 0x0c, 0xbe, 0xd8, 0x7d, 0x82, 0x3d, 0x7c, 0x19, 0xc6, 0xbb,
+ 0xdc, 0x76, 0x25, 0x3e, 0xbe, 0x60, 0x6a, 0x3b, 0xf9, 0xec, 0x9c, 0x3d,
+ 0xf2, 0x46, 0xc3, 0x3d, 0xc8, 0xc2, 0xfc, 0x3d, 0xd0, 0x12, 0xf8, 0xbd,
+ 0xe8, 0x4a, 0x62, 0x3c, 0x4f, 0xab, 0x85, 0xbb, 0x6f, 0x2f, 0x86, 0xbd,
+ 0x29, 0x04, 0xe0, 0xbd, 0xed, 0x05, 0xf6, 0xbd, 0x2f, 0x51, 0xa7, 0xbd,
+ 0xdb, 0x05, 0xdf, 0xbd, 0x6e, 0xa8, 0x26, 0x3d, 0x42, 0x07, 0x9e, 0x3c,
+ 0x96, 0xbf, 0x4b, 0xbd, 0xf5, 0xc6, 0xe3, 0x3d, 0xac, 0xd5, 0x9b, 0xbc,
+ 0x52, 0x34, 0x87, 0xbd, 0x7a, 0xe9, 0xc0, 0x3d, 0x2a, 0x2b, 0x6e, 0x3d,
+ 0x5e, 0x34, 0x12, 0xbe, 0x5a, 0xab, 0x4b, 0xbd, 0x7c, 0xf6, 0x22, 0x3d,
+ 0xa6, 0xb0, 0x29, 0xbd, 0x70, 0xd4, 0xb3, 0xbd, 0xdb, 0xa6, 0xe0, 0x3d,
+ 0xc0, 0x57, 0xaf, 0xbd, 0x8d, 0x05, 0x98, 0xbd, 0x79, 0x3c, 0x9c, 0xbd,
+ 0x65, 0x81, 0x09, 0xbd, 0xf0, 0x57, 0x09, 0x3e, 0x73, 0x28, 0xf3, 0x3d,
+ 0xa1, 0x7a, 0x82, 0x3d, 0x11, 0x78, 0xa9, 0x3d, 0x47, 0x12, 0x76, 0xbd,
+ 0xc2, 0x9e, 0xc0, 0x3d, 0x3f, 0x4d, 0x55, 0xbe, 0xe5, 0x76, 0xba, 0xbc,
+ 0xb0, 0x5f, 0xaf, 0x3d, 0xc8, 0x9e, 0xcf, 0x3d, 0x59, 0x48, 0x25, 0xbc,
+ 0x9d, 0xe8, 0x13, 0xbe, 0xf5, 0xa4, 0x0d, 0xbe, 0xbb, 0x12, 0x37, 0x3c,
+ 0x7c, 0x4c, 0xa2, 0x3d, 0x76, 0x40, 0x94, 0xbd, 0x96, 0x43, 0x58, 0xbe,
+ 0xd7, 0x27, 0x32, 0x3c, 0xa5, 0xdd, 0x4b, 0x3d, 0x99, 0x73, 0xe5, 0x3d,
+ 0x51, 0x6d, 0xad, 0x3d, 0x24, 0x04, 0x10, 0x3e, 0x7b, 0xef, 0x1b, 0x3e,
+ 0x74, 0xa8, 0xbb, 0xbc, 0xfa, 0x79, 0xc9, 0x3a, 0xb5, 0x7b, 0x29, 0xbe,
+ 0x02, 0x52, 0xcd, 0xbd, 0x8c, 0xe5, 0xb9, 0x3b, 0x05, 0x01, 0x04, 0xbb,
+ 0xe7, 0x84, 0x48, 0xbd, 0x8a, 0x9c, 0xac, 0x3d, 0xfa, 0xe1, 0xc4, 0xbb,
+ 0xec, 0xad, 0x82, 0xbd, 0x3e, 0x83, 0xf2, 0xbd, 0x2b, 0x27, 0x21, 0xbd,
+ 0x81, 0x3a, 0xdf, 0x3c, 0xe8, 0x77, 0xd6, 0x3d, 0xad, 0x34, 0xbf, 0x3d,
+ 0xf7, 0xc4, 0xee, 0x3a, 0x9e, 0x93, 0xb5, 0xbd, 0xd2, 0xdc, 0x7e, 0x3c,
+ 0xf3, 0xcb, 0x35, 0x3d, 0x4f, 0x32, 0x0b, 0x3e, 0x9a, 0x30, 0x90, 0xbd,
+ 0xfa, 0xd2, 0x01, 0xbe, 0xd0, 0xf3, 0xae, 0x3d, 0xf9, 0xba, 0x11, 0xbd,
+ 0xfd, 0x6c, 0x17, 0x3d, 0xfa, 0x98, 0x33, 0xbe, 0xa9, 0x75, 0x22, 0x3e,
+ 0xc0, 0x0d, 0xd3, 0x3d, 0x6a, 0xaf, 0x00, 0x3e, 0x19, 0x2b, 0x09, 0x3d,
+ 0x6b, 0x1b, 0xe6, 0x3d, 0xf5, 0xb7, 0x39, 0xbe, 0xec, 0x48, 0x55, 0xbe,
+ 0x2d, 0x30, 0xec, 0xbc, 0xfb, 0x43, 0x07, 0x3d, 0x34, 0xa5, 0x0c, 0x3e,
+ 0xa8, 0xd8, 0x01, 0xbe, 0x9f, 0x0c, 0x06, 0xbe, 0x8d, 0xf6, 0x58, 0xbd,
+ 0x07, 0x0e, 0x34, 0xbe, 0x61, 0x37, 0x0c, 0x3e, 0xf6, 0x91, 0x8c, 0x3d,
+ 0x45, 0xef, 0x02, 0x3e, 0xcb, 0x3d, 0x5c, 0xbd, 0x99, 0x96, 0xa5, 0xbd,
+ 0x40, 0xab, 0x0b, 0x3b, 0xd0, 0xe5, 0x3b, 0x3d, 0xd4, 0x2f, 0xfd, 0x3d,
+ 0x54, 0xe2, 0x1b, 0xbe, 0x61, 0x7e, 0x29, 0x3e, 0x6b, 0x9f, 0x7b, 0xbe,
+ 0x5f, 0x15, 0xd1, 0xbd, 0xe0, 0xf4, 0xb4, 0x3d, 0xdb, 0x15, 0x64, 0xbd,
+ 0x8d, 0xe2, 0x35, 0x3c, 0xb5, 0x5b, 0xb4, 0x3c, 0x95, 0x91, 0xf2, 0xbc,
+ 0x45, 0x98, 0xf0, 0x3a, 0x73, 0x66, 0xfe, 0xbd, 0xf5, 0x96, 0x4c, 0xbe,
+ 0x1e, 0x20, 0xb4, 0xbd, 0xae, 0x84, 0x1c, 0x3e, 0x6f, 0xfc, 0x5e, 0x3d,
+ 0x38, 0xc0, 0x12, 0x3e, 0x6e, 0x4b, 0x81, 0xbe, 0xbc, 0xde, 0x0c, 0xbe,
+ 0xb1, 0x40, 0x28, 0x3e, 0x23, 0x25, 0x16, 0x3e, 0x60, 0x65, 0xe0, 0x3d,
+ 0x37, 0x8c, 0x2a, 0x3e, 0x52, 0x2b, 0xdf, 0xbd, 0x6b, 0xe4, 0xa6, 0x3d,
+ 0xfa, 0xa2, 0x5a, 0x3d, 0x9b, 0x23, 0x07, 0xbe, 0xba, 0xa3, 0xe2, 0x3d,
+ 0x80, 0x0d, 0x88, 0x3c, 0x77, 0x96, 0xc3, 0x3d, 0x4b, 0x34, 0x0b, 0xbe,
+ 0xbf, 0x58, 0xa1, 0x3c, 0x3b, 0xc7, 0x05, 0xbe, 0x6e, 0xca, 0xce, 0xbd,
+ 0x41, 0x67, 0xe4, 0x3d, 0xa8, 0x07, 0x1a, 0xbc, 0xa5, 0x48, 0xa0, 0x3c,
+ 0x5c, 0xb3, 0x80, 0xbd, 0x3d, 0xe2, 0x25, 0x3d, 0x01, 0x67, 0xe5, 0xbd,
+ 0x4a, 0xfd, 0x49, 0x3d, 0x4c, 0x78, 0xe3, 0xbd, 0xca, 0xbc, 0x2c, 0xbc,
+ 0xf1, 0x4f, 0xc2, 0x3d, 0x72, 0x84, 0xdc, 0xbd, 0xfb, 0xea, 0xf8, 0x3d,
+ 0x30, 0x87, 0x60, 0x3d, 0xb7, 0x6c, 0x17, 0x3e, 0x12, 0x7c, 0xab, 0xbd,
+ 0xdb, 0x0a, 0xfa, 0xbd, 0x62, 0xf8, 0xbc, 0xbd, 0x2f, 0x54, 0x4e, 0xbe,
+ 0xa2, 0xba, 0x1f, 0xbe, 0x47, 0xac, 0x1b, 0x3e, 0xcd, 0xd8, 0x56, 0x3c,
+ 0x72, 0xc6, 0xba, 0xbd, 0x3d, 0x5f, 0x1a, 0xbd, 0x67, 0x37, 0xb9, 0xbd,
+ 0xe2, 0xa2, 0x28, 0xbe, 0x0f, 0x70, 0x8b, 0xbd, 0x91, 0x41, 0xba, 0x3d,
+ 0x85, 0xd1, 0x74, 0x3c, 0xaf, 0xb3, 0xaa, 0xbc, 0x70, 0x65, 0xff, 0x3c,
+ 0x47, 0x78, 0x06, 0xbe, 0x83, 0x20, 0xa4, 0xbd, 0xad, 0xa0, 0x08, 0x3e,
+ 0x6b, 0x05, 0x00, 0xbe, 0x29, 0xc4, 0xd8, 0xbd, 0x06, 0xb8, 0x25, 0xbd,
+ 0x36, 0x82, 0x91, 0xbc, 0x7c, 0x74, 0x17, 0x3e, 0x3d, 0x0a, 0x2e, 0xbd,
+ 0x61, 0x9a, 0x32, 0xbe, 0x60, 0xaf, 0x54, 0xbd, 0x1f, 0x26, 0x49, 0xbd,
+ 0xda, 0xc1, 0x43, 0xbc, 0xdb, 0x81, 0xdc, 0xbd, 0xc8, 0x2b, 0x01, 0xbe,
+ 0x49, 0xb6, 0x8b, 0xba, 0xc7, 0xb9, 0x37, 0xbd, 0xb3, 0xbd, 0xec, 0xbd,
+ 0x93, 0x44, 0xab, 0xbe, 0x17, 0xcf, 0x1d, 0xbe, 0x54, 0xad, 0x2d, 0xbd,
+ 0x09, 0x11, 0xcb, 0xbc, 0x25, 0xf3, 0xd8, 0xbc, 0xa9, 0x23, 0xb4, 0xbc,
+ 0x0d, 0xba, 0xd8, 0x3d, 0x2d, 0x39, 0xc7, 0x3c, 0x53, 0x50, 0x53, 0xbe,
+ 0x65, 0x6a, 0x34, 0xbd, 0x9e, 0x87, 0x9b, 0xbc, 0x4b, 0xca, 0x04, 0xbe,
+ 0x74, 0xb5, 0xa3, 0x3d, 0x69, 0x9b, 0x09, 0x3e, 0x37, 0x11, 0x39, 0xbe,
+ 0x51, 0x57, 0x02, 0xbd, 0xd5, 0xc1, 0x18, 0xbe, 0x8c, 0xd5, 0x58, 0xbe,
+ 0x05, 0xee, 0xc8, 0xbd, 0x36, 0x11, 0xea, 0x3d, 0xc1, 0xb3, 0x81, 0xbd,
+ 0x03, 0xee, 0xea, 0x3d, 0xd9, 0xc5, 0x15, 0x3e, 0x1c, 0xc7, 0x52, 0xbd,
+ 0xba, 0xe6, 0x1f, 0x3e, 0x7b, 0x89, 0x74, 0x3d, 0xe5, 0x52, 0x2d, 0xbd,
+ 0x1e, 0x37, 0x09, 0x3e, 0x1c, 0x68, 0x8e, 0xbd, 0x5c, 0x53, 0x27, 0x3d,
+ 0xb7, 0x4d, 0x78, 0xbd, 0x69, 0xe0, 0x57, 0xbe, 0x40, 0x8e, 0x08, 0xbc,
+ 0x54, 0x01, 0xe4, 0xbd, 0x48, 0xca, 0x27, 0x3d, 0x49, 0x02, 0x8d, 0xbd,
+ 0xd1, 0x93, 0xc1, 0xbd, 0x39, 0x90, 0xac, 0xbd, 0x28, 0x41, 0x06, 0xbe,
+ 0x93, 0x53, 0x30, 0x3e, 0xb7, 0xb6, 0x81, 0xbe, 0x51, 0x9f, 0x1e, 0x3d,
+ 0xe4, 0x17, 0x92, 0x3d, 0x97, 0x27, 0x2f, 0xbe, 0xd2, 0x39, 0xa1, 0x3e,
+ 0x1b, 0x67, 0x1f, 0x3e, 0x39, 0x7f, 0x2c, 0x3e, 0x4d, 0x61, 0x85, 0xbd,
+ 0xe3, 0xf9, 0x1d, 0x3e, 0xff, 0x5a, 0xc6, 0xbc, 0x70, 0xea, 0x80, 0xbe,
+ 0x01, 0x36, 0xa4, 0xbe, 0x48, 0xbc, 0xf8, 0xbd, 0xac, 0x2a, 0x2d, 0x3e,
+ 0x6d, 0xf7, 0x70, 0xbe, 0x67, 0x64, 0x7d, 0x3e, 0x0d, 0x8e, 0xce, 0x3d,
+ 0x37, 0x88, 0x02, 0x3e, 0x29, 0xe1, 0x25, 0x3e, 0xaa, 0x45, 0xbc, 0xbd,
+ 0x58, 0x8e, 0x87, 0xbd, 0x16, 0x85, 0x38, 0x3e, 0x0a, 0xa9, 0xa5, 0xbd,
+ 0x56, 0x09, 0x4d, 0x3d, 0x52, 0x0e, 0x54, 0xbe, 0xa8, 0x9c, 0xfd, 0xbc,
+ 0xd5, 0xbb, 0x5d, 0xbd, 0xda, 0x9f, 0xd7, 0xbd, 0xb7, 0x06, 0xda, 0xbd,
+ 0x6f, 0x91, 0x3d, 0xbd, 0xfe, 0x53, 0xdb, 0xbd, 0x4c, 0x82, 0xf1, 0xb9,
+ 0x07, 0xe5, 0x41, 0xbe, 0x8c, 0xfe, 0xed, 0x3d, 0xe5, 0x3a, 0x1d, 0x3e,
+ 0xfb, 0x4d, 0xec, 0xbd, 0x2f, 0x86, 0xd2, 0x3d, 0xb4, 0x40, 0x7a, 0xbe,
+ 0x37, 0xa8, 0xc6, 0x3d, 0x90, 0xb7, 0xc4, 0xbd, 0x48, 0x53, 0x22, 0xbd,
+ 0xf5, 0xb3, 0x03, 0xbe, 0x90, 0xb9, 0xc7, 0xbd, 0x8d, 0x9f, 0x59, 0x3c,
+ 0xb7, 0xc4, 0x30, 0x3d, 0x8a, 0xa4, 0x51, 0x3e, 0x94, 0x17, 0x38, 0xbc,
+ 0x82, 0xcc, 0x89, 0xbd, 0x47, 0x41, 0xce, 0x3c, 0x91, 0xb8, 0x91, 0xbc,
+ 0x11, 0x67, 0x6b, 0xbe, 0x0d, 0xc9, 0x22, 0xbe, 0xa3, 0xc1, 0x2f, 0x3e,
+ 0xba, 0x00, 0x01, 0x3d, 0xc6, 0x61, 0x1e, 0xbe, 0x85, 0x10, 0xdc, 0xbd,
+ 0xd1, 0x70, 0x78, 0x3d, 0x39, 0xe8, 0x47, 0x3e, 0xb7, 0x4f, 0x0b, 0xbe,
+ 0x3e, 0xaa, 0x63, 0xbc, 0x25, 0xda, 0xd1, 0x3c, 0x97, 0xc3, 0xff, 0x39,
+ 0xe5, 0xf1, 0x09, 0xbd, 0x55, 0x3e, 0x12, 0x3e, 0x9e, 0xdf, 0xd4, 0xbd,
+ 0xf0, 0xb7, 0xe5, 0xbd, 0x24, 0x10, 0x06, 0xbe, 0x77, 0x00, 0x0a, 0xbe,
+ 0x00, 0x1d, 0x3a, 0x3e, 0x74, 0xcb, 0x40, 0xbe, 0x5e, 0x40, 0x22, 0x3e,
+ 0xa6, 0xc7, 0x95, 0xbe, 0x36, 0x04, 0x01, 0xbe, 0xc0, 0xb5, 0x27, 0xbe,
+ 0xee, 0xe2, 0x31, 0xbe, 0xbe, 0x57, 0x29, 0x3e, 0x78, 0x90, 0x5f, 0x3d,
+ 0x5d, 0x46, 0x12, 0x3e, 0x00, 0x28, 0x5e, 0x3d, 0x4e, 0x2c, 0x4d, 0x3e,
+ 0x7b, 0xae, 0xe9, 0xbd, 0xa7, 0xa4, 0xd8, 0x3d, 0xae, 0xc2, 0x83, 0xbc,
+ 0xb7, 0xd1, 0x3e, 0xbd, 0xb8, 0x05, 0x23, 0xbd, 0xe1, 0x33, 0xc1, 0x3d,
+ 0x6e, 0xc3, 0xf4, 0x3c, 0x1f, 0x52, 0x3b, 0xbd, 0x21, 0x9c, 0x0f, 0xbe,
+ 0x68, 0x51, 0x84, 0xbd, 0xa0, 0x7c, 0x90, 0xbe, 0x2e, 0xf5, 0x2e, 0x3e,
+ 0x31, 0x2f, 0xd8, 0x3d, 0xb8, 0x95, 0x51, 0xbe, 0x65, 0x03, 0xfa, 0x3d,
+ 0x8a, 0x5e, 0x34, 0xbe, 0xbc, 0x7f, 0x81, 0xbc, 0xac, 0x79, 0xf3, 0xbb,
+ 0xff, 0x9b, 0x11, 0x3d, 0x3a, 0xb4, 0x35, 0xbe, 0xb9, 0x74, 0x50, 0xbc,
+ 0x09, 0x86, 0xb6, 0x3d, 0xf7, 0x74, 0x24, 0xbd, 0xe6, 0x45, 0x1a, 0xbc,
+ 0x94, 0x79, 0x34, 0xbe, 0xb7, 0xd1, 0x11, 0xbe, 0x25, 0x30, 0xd3, 0xbd,
+ 0x2a, 0xaf, 0x71, 0xbb, 0x57, 0x4f, 0x3f, 0xbe, 0xc8, 0x06, 0x27, 0x3d,
+ 0x5e, 0x91, 0xc3, 0xbd, 0x80, 0xfd, 0xaa, 0xbd, 0x4b, 0x9e, 0xc4, 0xbd,
+ 0xcf, 0xd8, 0x1f, 0xbe, 0x7a, 0x51, 0xd6, 0xbd, 0xc6, 0x2d, 0x83, 0xbd,
+ 0x93, 0x49, 0x99, 0xbd, 0x21, 0xfc, 0xc0, 0x3c, 0x6c, 0x2a, 0xaf, 0x3c,
+ 0xb2, 0x2e, 0x27, 0xbe, 0x58, 0xba, 0x0a, 0xbd, 0x46, 0xfb, 0xd0, 0x3d,
+ 0x2d, 0x4c, 0x1a, 0xbe, 0x5e, 0x46, 0x1f, 0xbd, 0xad, 0x23, 0x29, 0x3d,
+ 0xc0, 0x63, 0x30, 0xbe, 0x22, 0x79, 0x40, 0xbd, 0x6f, 0xaa, 0x17, 0x3d,
+ 0x24, 0x23, 0xa6, 0xbd, 0x33, 0xfd, 0xc9, 0xbc, 0xa5, 0xe0, 0x90, 0xbd,
+ 0x73, 0xb0, 0x97, 0x3b, 0x20, 0xbc, 0x0f, 0xbe, 0xda, 0x4a, 0x4c, 0x3d,
+ 0x25, 0x2b, 0x64, 0x3d, 0x48, 0xf9, 0x95, 0x3d, 0x0e, 0x34, 0x30, 0xbd,
+ 0xd0, 0x03, 0xfd, 0x3d, 0x52, 0x10, 0xe7, 0x3d, 0xad, 0xad, 0x00, 0xbe,
+ 0x9a, 0x38, 0xbd, 0xbd, 0xe4, 0x6c, 0xa6, 0x3c, 0xea, 0xb4, 0x9b, 0x3b,
+ 0x34, 0xce, 0x11, 0xbc, 0xe4, 0x09, 0x19, 0xbe, 0xb3, 0x14, 0x20, 0xbd,
+ 0xba, 0xc1, 0xb1, 0x3d, 0xac, 0x3f, 0x01, 0x3e, 0x81, 0x05, 0x81, 0xbd,
+ 0xc4, 0xbe, 0x89, 0xbd, 0xbf, 0xd4, 0x0b, 0x3d, 0x3f, 0xbb, 0x0c, 0xbd,
+ 0x6f, 0x0c, 0xa7, 0x3d, 0x8e, 0x2a, 0xf1, 0xbc, 0xe3, 0x08, 0x59, 0xbe,
+ 0x5e, 0xcb, 0xb1, 0xbb, 0x0b, 0x03, 0xad, 0x3d, 0x5e, 0x9b, 0xc0, 0xbc,
+ 0x1c, 0x8c, 0x7b, 0xbd, 0x9d, 0x2a, 0xe0, 0xbd, 0xd2, 0x92, 0x4a, 0x3c,
+ 0x71, 0xe4, 0x90, 0x3c, 0x7a, 0x4a, 0xfe, 0xbd, 0x04, 0x4f, 0x3b, 0xbe,
+ 0x71, 0xc3, 0x7b, 0x3d, 0xd1, 0xf0, 0x2b, 0x3e, 0xfe, 0x4f, 0x29, 0xba,
+ 0xd2, 0x3a, 0x79, 0x3d, 0x13, 0x5e, 0x08, 0x3e, 0x00, 0x25, 0x50, 0xbd,
+ 0x88, 0xeb, 0x33, 0xbc, 0x68, 0x16, 0x10, 0x3d, 0x04, 0xcb, 0x32, 0xbe,
+ 0xe5, 0xc6, 0x87, 0xbd, 0x8b, 0x21, 0x03, 0x3e, 0xb5, 0x44, 0x30, 0xbe,
+ 0x17, 0xf8, 0x85, 0xbd, 0x9d, 0x18, 0xb6, 0xbd, 0xd6, 0x41, 0x0b, 0xbe,
+ 0x8f, 0xad, 0xc4, 0x3d, 0x7f, 0xdf, 0x06, 0xbe, 0x5c, 0xf4, 0xec, 0xbd,
+ 0x97, 0x50, 0xc5, 0xbd, 0x34, 0x87, 0x4a, 0xbd, 0x6f, 0x36, 0x80, 0x3b,
+ 0x88, 0x28, 0xd1, 0xb8, 0xcf, 0x5b, 0x83, 0xbe, 0x09, 0xa7, 0x3b, 0xbe,
+ 0xde, 0xf0, 0x19, 0x3b, 0x96, 0x08, 0xd5, 0x3d, 0xc6, 0xa7, 0xeb, 0x3d,
+ 0xa2, 0x2b, 0x1b, 0x3e, 0xff, 0x2d, 0x16, 0x3e, 0x29, 0x7f, 0xbb, 0x3d,
+ 0xc4, 0x72, 0x87, 0x3d, 0x58, 0x13, 0xa8, 0xbd, 0x03, 0x2a, 0xd0, 0x3c,
+ 0xfd, 0xbe, 0x84, 0x3d, 0xc9, 0xc9, 0xb0, 0xbd, 0x4d, 0x45, 0xf6, 0x3d,
+ 0x4b, 0xcd, 0xae, 0x3d, 0x94, 0x72, 0x40, 0x3d, 0xcb, 0x77, 0x3a, 0xbe,
+ 0x9a, 0xc9, 0xca, 0x3d, 0xb4, 0x2f, 0x45, 0xbe, 0x61, 0x71, 0x13, 0x3e,
+ 0x67, 0xfe, 0x1d, 0x3e, 0x4d, 0x89, 0xaf, 0x3d, 0xbc, 0x9a, 0x15, 0x3e,
+ 0x3e, 0x24, 0xfb, 0x3c, 0x8f, 0x9d, 0xe7, 0x3b, 0x24, 0x7c, 0x7c, 0x3d,
+ 0x70, 0x12, 0x17, 0xbd, 0xc9, 0x7f, 0xe5, 0x3d, 0x88, 0xf3, 0x44, 0xbe,
+ 0xf7, 0xa1, 0xb4, 0xbd, 0xe9, 0x5f, 0x0a, 0xbe, 0xc2, 0x09, 0x59, 0xbd,
+ 0x1e, 0x43, 0xe7, 0xbc, 0x4f, 0x5b, 0xaa, 0x3d, 0x23, 0x6f, 0x42, 0x3e,
+ 0xe0, 0x26, 0x8e, 0xbd, 0xa5, 0xbf, 0xc4, 0xbc, 0x12, 0xdf, 0x9f, 0xbd,
+ 0xc0, 0xa7, 0x8e, 0xbd, 0x66, 0x34, 0x1d, 0xbe, 0xf3, 0x94, 0x35, 0xbe,
+ 0xd9, 0x62, 0x45, 0x3e, 0x5b, 0x60, 0xeb, 0xbc, 0xd2, 0x84, 0x43, 0x3d,
+ 0x94, 0x30, 0xde, 0xbc, 0xb8, 0x24, 0x65, 0x3c, 0x90, 0x60, 0xe7, 0xbc,
+ 0xa6, 0xc9, 0xf5, 0x3d, 0x86, 0x62, 0x74, 0xbd, 0x78, 0x24, 0x1f, 0xbd,
+ 0x6b, 0x9d, 0x4e, 0xbd, 0xe8, 0x42, 0x80, 0xbd, 0xfb, 0x8b, 0xf7, 0x3c,
+ 0xdc, 0xe1, 0xe7, 0xbe, 0x72, 0x93, 0x6d, 0xbd, 0x5a, 0x8f, 0x86, 0x3b,
+ 0x1f, 0xbf, 0xcf, 0xbd, 0x6d, 0x2b, 0x15, 0x3e, 0x6f, 0x97, 0x50, 0x3d,
+ 0x1d, 0xba, 0x7e, 0xbc, 0xf1, 0xc7, 0x04, 0x3e, 0x73, 0x8e, 0xc8, 0xbd,
+ 0x43, 0x13, 0xb8, 0x3b, 0xbc, 0x37, 0xa3, 0xbb, 0xf9, 0xe1, 0xed, 0xbd,
+ 0xdc, 0x99, 0x7b, 0x3d, 0x7f, 0xc5, 0xf0, 0xbd, 0x61, 0xb3, 0x8f, 0xbc,
+ 0xe5, 0x6f, 0x20, 0xbe, 0x43, 0x46, 0x49, 0xbc, 0xa2, 0x2b, 0x0b, 0xbe,
+ 0x69, 0xaf, 0xcd, 0x3b, 0x5c, 0xaa, 0xe7, 0x3d, 0x3d, 0x4c, 0x01, 0xbc,
+ 0xb1, 0x0b, 0x10, 0x3e, 0x87, 0x72, 0xbd, 0xbd, 0x89, 0xa4, 0xeb, 0x3d,
+ 0xc5, 0x38, 0x82, 0xbd, 0x04, 0x52, 0x3a, 0xbe, 0xf3, 0xc3, 0xe9, 0xbc,
+ 0x00, 0xd7, 0x5c, 0x3d, 0x2d, 0x8b, 0x9c, 0xbd, 0xe5, 0xd4, 0x18, 0xbe,
+ 0x88, 0xcf, 0x30, 0x3c, 0x32, 0x5d, 0xbf, 0x3d, 0x08, 0xd8, 0x58, 0xbe,
+ 0x9a, 0xeb, 0xcd, 0xbd, 0x41, 0x9b, 0xaf, 0x3d, 0x56, 0xaf, 0xd2, 0x3c,
+ 0xfc, 0xb1, 0x2f, 0x3d, 0x2a, 0xbd, 0x23, 0xbe, 0x38, 0xcf, 0xbc, 0xbd,
+ 0x95, 0x2f, 0x52, 0x3c, 0xcd, 0x8d, 0xe9, 0x3c, 0x75, 0xa6, 0x61, 0x3d,
+ 0xef, 0x49, 0x3a, 0xbc, 0x42, 0x01, 0xb2, 0xbd, 0x9e, 0xa2, 0x27, 0xbe,
+ 0x53, 0xb3, 0xc8, 0x3d, 0x1e, 0xd0, 0xd1, 0x3d, 0x19, 0x21, 0x05, 0xbe,
+ 0x42, 0x93, 0xcf, 0x3c, 0x31, 0xe8, 0x3c, 0x3d, 0x83, 0x3c, 0x02, 0x3e,
+ 0x00, 0x0b, 0x44, 0xbb, 0x60, 0x07, 0x75, 0xbd, 0x28, 0x0d, 0x33, 0xbe,
+ 0xcd, 0x79, 0x89, 0x3c, 0xbd, 0x32, 0x4a, 0x3d, 0x45, 0x53, 0x58, 0xbe,
+ 0x10, 0x62, 0x93, 0x3d, 0xab, 0x13, 0x6b, 0xbd, 0xe2, 0x4a, 0x11, 0xbe,
+ 0xac, 0x20, 0xd3, 0xbd, 0x54, 0xbc, 0x4e, 0x3d, 0x12, 0x18, 0x83, 0xba,
+ 0x2f, 0xec, 0x26, 0xbd, 0xa9, 0xc9, 0xa7, 0x3d, 0xb9, 0xde, 0xa3, 0x3d,
+ 0x37, 0x49, 0x4b, 0xbc, 0x11, 0x1d, 0x72, 0xbd, 0xde, 0xea, 0xd0, 0x3d,
+ 0xd0, 0x4d, 0x89, 0xbc, 0xf8, 0xf3, 0x81, 0xbd, 0xe8, 0xbd, 0x81, 0xbd,
+ 0x66, 0xe8, 0x73, 0xbd, 0x87, 0xc9, 0x87, 0x3d, 0x85, 0x5b, 0x94, 0xbe,
+ 0x59, 0x6b, 0x06, 0x3d, 0x9a, 0x4c, 0x39, 0x3e, 0x70, 0xe7, 0x14, 0x3d,
+ 0x85, 0x86, 0x29, 0xbe, 0xf2, 0x8d, 0x6d, 0x3c, 0x9a, 0x3a, 0x08, 0xbe,
+ 0x92, 0x6c, 0x07, 0x3e, 0x82, 0xd2, 0x63, 0x3d, 0xbf, 0xc7, 0x3e, 0x3e,
+ 0x9e, 0x76, 0x8f, 0x3d, 0x0d, 0x0f, 0xa0, 0xbd, 0xed, 0x3c, 0xaa, 0xbc,
+ 0x98, 0xfe, 0xc2, 0xbd, 0x51, 0x80, 0xc9, 0x3c, 0x1b, 0xbc, 0x47, 0xbe,
+ 0xbe, 0x7a, 0x25, 0xbe, 0x92, 0x28, 0x1c, 0xbe, 0xd0, 0x73, 0x18, 0xbe,
+ 0x49, 0x9a, 0xec, 0xbd, 0x88, 0xec, 0x48, 0x3e, 0x8b, 0xda, 0x29, 0x3e,
+ 0x0c, 0x26, 0x03, 0x3e, 0x94, 0xc5, 0xf9, 0x3c, 0xce, 0x1d, 0xcf, 0x3b,
+ 0xd5, 0x16, 0x6d, 0x3c, 0xc0, 0x79, 0x8c, 0xbe, 0x30, 0xad, 0x3b, 0xbe,
+ 0x00, 0x55, 0x9e, 0xbd, 0x9b, 0x6d, 0xfb, 0xbc, 0x22, 0x73, 0xc0, 0xbd,
+ 0xc6, 0xf6, 0x5b, 0xbd, 0xe5, 0xb5, 0x81, 0x3d, 0x60, 0x75, 0x1d, 0xbd,
+ 0x9a, 0x4e, 0x13, 0xbe, 0xfa, 0x13, 0xc5, 0xbd, 0x7a, 0xca, 0xbb, 0xbd,
+ 0x24, 0x0f, 0x0a, 0x3b, 0xc1, 0xf6, 0x66, 0x3b, 0x66, 0x7b, 0xe9, 0xbc,
+ 0xdb, 0xf9, 0x40, 0x3d, 0x02, 0xb7, 0xe9, 0xbe, 0x57, 0x1d, 0x5f, 0xbd,
+ 0x19, 0x5f, 0x9b, 0xbd, 0xed, 0x6e, 0x43, 0xbe, 0x9f, 0x2e, 0x49, 0x3d,
+ 0xde, 0x34, 0x07, 0x3e, 0x2c, 0x4a, 0x12, 0xbe, 0x40, 0xe8, 0xbd, 0xbd,
+ 0xab, 0x7c, 0xa5, 0xbc, 0xe4, 0x6a, 0xf8, 0xbc, 0xb0, 0x48, 0xff, 0x3d,
+ 0x3a, 0x0c, 0x90, 0xbd, 0xd8, 0xd2, 0x1b, 0xbc, 0x25, 0xef, 0xca, 0x3d,
+ 0x29, 0xf8, 0x48, 0xbe, 0xeb, 0x70, 0x28, 0xbe, 0x89, 0x19, 0x97, 0xbd,
+ 0x30, 0x33, 0xbd, 0xbd, 0xd8, 0xdd, 0x89, 0x3c, 0x8e, 0x5e, 0xad, 0xbd,
+ 0xd4, 0xee, 0x61, 0xbd, 0x73, 0x7c, 0x01, 0x3d, 0xf1, 0x27, 0x26, 0xbd,
+ 0x0d, 0x44, 0x70, 0xbc, 0xe5, 0xd7, 0x3b, 0x3c, 0x16, 0xa1, 0x98, 0xbc,
+ 0xc6, 0x28, 0xe7, 0xbd, 0x01, 0xe8, 0xca, 0x3d, 0x95, 0x60, 0xce, 0x3d,
+ 0x34, 0xdd, 0xcc, 0xbd, 0x44, 0x02, 0xdf, 0xbd, 0xd3, 0xba, 0x52, 0xbe,
+ 0x1c, 0x8f, 0x18, 0xbd, 0xa3, 0x3d, 0x94, 0x3d, 0x3e, 0xc4, 0xd2, 0x3d,
+ 0xd3, 0x06, 0xea, 0x3c, 0x11, 0xb9, 0x9a, 0x3d, 0x8e, 0xd1, 0xc0, 0x3d,
+ 0x6c, 0x1e, 0x2d, 0x3d, 0x25, 0x3c, 0x44, 0xbe, 0xb3, 0x8f, 0x13, 0x3e,
+ 0x6a, 0xab, 0x46, 0xbe, 0x94, 0x1c, 0xd8, 0x3b, 0xc8, 0xbf, 0x12, 0xbe,
+ 0xd6, 0x38, 0x2c, 0x3d, 0x0d, 0xd5, 0xdf, 0x3d, 0x17, 0x00, 0x33, 0xbe,
+ 0x03, 0xcb, 0x2b, 0xbd, 0xe4, 0x70, 0x93, 0xbe, 0x2b, 0x34, 0x05, 0x3d,
+ 0x81, 0x68, 0x84, 0x3d, 0x26, 0x2e, 0x7f, 0x3d, 0x48, 0xdb, 0x25, 0xbd,
+ 0x02, 0x7c, 0xe6, 0x3d, 0xd5, 0x53, 0xa0, 0xbc, 0x72, 0x92, 0xca, 0xbd,
+ 0x35, 0x30, 0x75, 0xbd, 0x5a, 0x3f, 0x4f, 0xbd, 0xee, 0x35, 0x83, 0xbb,
+ 0xf1, 0xea, 0xca, 0xbd, 0x97, 0x62, 0x01, 0x3d, 0x01, 0x65, 0xbc, 0x3d,
+ 0x6a, 0xf5, 0x99, 0xbe, 0x7d, 0x3f, 0x30, 0xbc, 0x3d, 0xa2, 0x53, 0x3e,
+ 0x32, 0xe7, 0x1b, 0x3e, 0x42, 0xc2, 0x01, 0xbe, 0x9c, 0x49, 0x29, 0xbe,
+ 0x9d, 0x11, 0x8a, 0x3d, 0x54, 0x9e, 0xcd, 0x3d, 0xdc, 0x7a, 0x63, 0xbe,
+ 0xe4, 0xe4, 0xb8, 0xbd, 0xac, 0x36, 0x3b, 0x3d, 0xae, 0xa9, 0xbf, 0x3d,
+ 0x99, 0xac, 0x90, 0xbe, 0x59, 0xcd, 0x4f, 0xbe, 0x72, 0x7e, 0x51, 0x3e,
+ 0xf3, 0xcc, 0xe0, 0xbd, 0x25, 0x58, 0x7d, 0xba, 0x46, 0x95, 0xe0, 0x3c,
+ 0xa1, 0x23, 0xa7, 0x3c, 0xc4, 0xa3, 0x40, 0x3e, 0x3b, 0x78, 0x41, 0xbe,
+ 0x34, 0x75, 0x25, 0xbd, 0xc7, 0xc1, 0x18, 0xbc, 0x18, 0x77, 0x2f, 0xbd,
+ 0xe6, 0x32, 0xef, 0x3a, 0x8e, 0x5f, 0x92, 0xbd, 0x73, 0xcf, 0xec, 0x3d,
+ 0x54, 0x25, 0x22, 0x3d, 0xb1, 0xf0, 0xcc, 0x3d, 0xd0, 0xd6, 0x49, 0xbd,
+ 0x2e, 0xda, 0x9b, 0x3c, 0x31, 0x6b, 0x49, 0x3c, 0xc7, 0x44, 0x08, 0x3e,
+ 0x6d, 0x8f, 0xac, 0x3c, 0xe7, 0xe0, 0x69, 0xbc, 0x81, 0x7c, 0x17, 0xbe,
+ 0x6a, 0x7f, 0xd1, 0x3d, 0x9c, 0x7f, 0xba, 0x3d, 0x0b, 0x77, 0x48, 0xbe,
+ 0xd0, 0xb7, 0x5f, 0xbd, 0xbf, 0xdf, 0x1b, 0xbe, 0xa8, 0x83, 0xb3, 0xbd,
+ 0xed, 0x36, 0xc1, 0xbd, 0x03, 0x25, 0x4e, 0x3e, 0x11, 0xb6, 0x7c, 0x3d,
+ 0x80, 0x73, 0x22, 0x3d, 0xe4, 0x3b, 0x2d, 0x3e, 0xb3, 0xe9, 0x1a, 0x3e,
+ 0x48, 0xa8, 0x3c, 0x3e, 0xc3, 0x5f, 0xb9, 0x3c, 0x3d, 0x33, 0xd2, 0x3d,
+ 0x8f, 0x13, 0x12, 0x3e, 0x5a, 0x90, 0xc3, 0x3d, 0x2d, 0x5b, 0x40, 0x3e,
+ 0xd3, 0x9d, 0x35, 0x3e, 0x95, 0x01, 0xda, 0xbc, 0x31, 0xfe, 0xf5, 0x3c,
+ 0x62, 0xec, 0x82, 0xbd, 0xd2, 0x98, 0x34, 0xbd, 0x54, 0xed, 0xfd, 0xbc,
+ 0xca, 0xe6, 0xcd, 0xbc, 0x70, 0x0a, 0x98, 0xbd, 0x67, 0xfa, 0x89, 0xbd,
+ 0xb5, 0x2e, 0x16, 0x3e, 0x2e, 0x83, 0x5b, 0x3d, 0x74, 0x1b, 0x09, 0xbd,
+ 0x1c, 0xe0, 0xcd, 0xbd, 0x9d, 0x7e, 0xef, 0xbd, 0x89, 0xaf, 0x8e, 0x3b,
+ 0x06, 0x56, 0x88, 0xbe, 0xf1, 0x15, 0xc1, 0x3d, 0x12, 0x9a, 0xb9, 0xbd,
+ 0x18, 0xa1, 0x03, 0xbe, 0x57, 0xc1, 0x68, 0xbc, 0xac, 0x15, 0xfd, 0xbc,
+ 0x53, 0x95, 0x36, 0xbe, 0xe5, 0x73, 0x00, 0xbe, 0x2b, 0x3c, 0x11, 0x3d,
+ 0x64, 0x5c, 0x41, 0xbe, 0x77, 0xba, 0xcc, 0x3d, 0x35, 0x43, 0xce, 0x3d,
+ 0x46, 0x82, 0x0a, 0xbe, 0x33, 0x98, 0x72, 0xbc, 0x85, 0x37, 0x3f, 0xbe,
+ 0x75, 0x51, 0xbb, 0xbd, 0x88, 0x43, 0xf5, 0xbd, 0x42, 0x6f, 0xaf, 0x3d,
+ 0x26, 0x2f, 0x89, 0x3d, 0x00, 0xb3, 0xa8, 0xbd, 0xb4, 0x59, 0x0c, 0x3d,
+ 0x2b, 0x1d, 0x07, 0xbd, 0x65, 0xde, 0x83, 0xbd, 0x1c, 0x10, 0x0e, 0xbe,
+ 0x69, 0xbc, 0x2e, 0x3d, 0xad, 0x4e, 0xbd, 0x3d, 0x2a, 0x2a, 0x3c, 0x3e,
+ 0xc8, 0x99, 0xcf, 0x3c, 0x27, 0xa8, 0x8f, 0x3d, 0x12, 0x81, 0x9c, 0x3c,
+ 0x11, 0x60, 0xb1, 0xbd, 0x59, 0x11, 0x4d, 0x3d, 0xac, 0xc9, 0x80, 0xbd,
+ 0x44, 0x73, 0x62, 0xbd, 0x37, 0xca, 0xf4, 0x3d, 0xea, 0x65, 0x91, 0x3c,
+ 0xfe, 0x44, 0x3e, 0xbd, 0x90, 0x14, 0xb5, 0x3c, 0x46, 0xf2, 0xff, 0xbd,
+ 0xb4, 0x0b, 0x4f, 0x3b, 0x90, 0x1f, 0x91, 0xbd, 0x05, 0x10, 0x2c, 0x3e,
+ 0x3d, 0xbf, 0xfd, 0x3c, 0x02, 0x9c, 0xff, 0xbd, 0xf9, 0xc0, 0xbb, 0xbd,
+ 0x59, 0x9e, 0x81, 0x3e, 0xb1, 0x65, 0xae, 0x3d, 0x64, 0xb6, 0x8f, 0xbd,
+ 0x1d, 0xef, 0x7e, 0x3e, 0x7e, 0x02, 0x69, 0xbb, 0x9f, 0x35, 0xbd, 0xbd,
+ 0x0e, 0x1f, 0xda, 0x3d, 0x68, 0xe1, 0xf4, 0xbd, 0x33, 0xe3, 0xe6, 0x3d,
+ 0x6b, 0x3b, 0x0f, 0xbb, 0xe8, 0xcb, 0xee, 0x3d, 0xfb, 0xf9, 0xd2, 0x3d,
+ 0xde, 0x3a, 0x98, 0x3b, 0x49, 0x5c, 0x52, 0xbd, 0xa8, 0x68, 0xac, 0x3d,
+ 0x38, 0x3e, 0xa3, 0xbd, 0x6f, 0x83, 0xb8, 0xbd, 0x87, 0x76, 0x38, 0xbe,
+ 0x89, 0xb8, 0x04, 0x3e, 0x29, 0x22, 0x0c, 0x3d, 0x9a, 0x0c, 0x82, 0xbd,
+ 0x60, 0x86, 0xfe, 0xbd, 0x52, 0x92, 0xfa, 0xbc, 0xb2, 0x39, 0xe3, 0x3c,
+ 0xcc, 0x59, 0xb6, 0xbd, 0x73, 0x8f, 0x27, 0x3e, 0x98, 0x5f, 0xe8, 0xbc,
+ 0x33, 0x8a, 0x04, 0x3b, 0x95, 0x7b, 0xe0, 0x3d, 0x63, 0x95, 0x17, 0xbd,
+ 0x58, 0x7d, 0x59, 0x3e, 0xb3, 0x4c, 0x27, 0xbe, 0x58, 0x73, 0x9d, 0x3d,
+ 0x90, 0xf4, 0xc4, 0x3d, 0x1a, 0x2b, 0x8d, 0xbd, 0x5d, 0x5f, 0xe5, 0xbd,
+ 0xf2, 0xa9, 0xac, 0xbd, 0x82, 0x6b, 0x4a, 0x3d, 0x7b, 0xea, 0x9e, 0xbd,
+ 0x2d, 0xb9, 0x47, 0xbd, 0x43, 0x00, 0x4e, 0x3e, 0x20, 0xcd, 0x8c, 0xbe,
+ 0x77, 0xf7, 0x4f, 0xbd, 0x0b, 0x97, 0x3b, 0xbe, 0x6d, 0xd2, 0x7b, 0xbe,
+ 0x74, 0xa3, 0x99, 0xbe, 0x58, 0xb1, 0x09, 0x3d, 0x4c, 0x7b, 0x34, 0xbd,
+ 0xc1, 0xc8, 0xb0, 0x3d, 0x05, 0x50, 0x12, 0x3e, 0x0e, 0x3c, 0x4c, 0xbe,
+ 0xae, 0xee, 0xba, 0x3d, 0x5a, 0x0c, 0x26, 0x3e, 0x06, 0x70, 0xe4, 0x3d,
+ 0x6c, 0x81, 0xcb, 0xbd, 0xef, 0x91, 0xd1, 0x3d, 0xd5, 0x76, 0x2f, 0x3e,
+ 0x58, 0x5e, 0xec, 0x3d, 0x3d, 0xd1, 0xf8, 0x3d, 0xe9, 0xe6, 0x81, 0x3d,
+ 0x46, 0x52, 0x90, 0x3d, 0x05, 0x90, 0xe8, 0x3c, 0xe5, 0x8e, 0x1f, 0x3e,
+ 0x7a, 0xac, 0xea, 0xbd, 0xe5, 0x18, 0x8c, 0x3d, 0x0e, 0x43, 0x23, 0xbe,
+ 0xf3, 0x59, 0xc2, 0x3d, 0x5c, 0x0f, 0x67, 0xbe, 0xd9, 0x5a, 0x13, 0x3e,
+ 0x95, 0xd9, 0x3a, 0xbe, 0xab, 0x34, 0x0d, 0xbe, 0x14, 0x29, 0x9f, 0xbd,
+ 0x15, 0xff, 0xba, 0xbc, 0xd6, 0x16, 0x1e, 0xbe, 0x32, 0x03, 0xb3, 0x3d,
+ 0x1b, 0xf1, 0x36, 0x3b, 0xe7, 0xc2, 0xe4, 0x3c, 0x15, 0xb7, 0x08, 0x3e,
+ 0xd2, 0x1b, 0xe6, 0xbd, 0x2c, 0xa5, 0x0e, 0xbe, 0xf2, 0xaf, 0x6b, 0xbd,
+ 0x4b, 0x0a, 0x5a, 0x3d, 0x28, 0xc6, 0xdf, 0x3c, 0xf7, 0x5c, 0xb9, 0x3c,
+ 0xd1, 0x54, 0x91, 0xbb, 0x31, 0x1f, 0x08, 0xbe, 0xa0, 0xdc, 0x00, 0xbe,
+ 0x7b, 0xcb, 0xf8, 0x3d, 0x91, 0x8a, 0x35, 0x3d, 0x04, 0xf7, 0x2c, 0x3d,
+ 0x08, 0xb3, 0x1d, 0x3e, 0xe6, 0xea, 0xe3, 0x3a, 0xad, 0x13, 0x06, 0x3e,
+ 0x8b, 0x93, 0x48, 0xbd, 0x6e, 0x61, 0x8c, 0x3d, 0xe2, 0x9f, 0x64, 0x3d,
+ 0xeb, 0xc4, 0xee, 0xbd, 0x68, 0x5a, 0x0e, 0xbe, 0x70, 0xcb, 0xa7, 0xbd,
+ 0x22, 0x4e, 0x51, 0x3d, 0x57, 0x05, 0x31, 0x3d, 0x4c, 0x8c, 0x07, 0x3e,
+ 0xe0, 0x51, 0x18, 0x3e, 0x74, 0x4f, 0x04, 0x3e, 0x78, 0xa6, 0x22, 0x3e,
+ 0x73, 0x36, 0x34, 0x3e, 0x7a, 0x2e, 0xc0, 0xbb, 0x91, 0x7f, 0x09, 0xbe,
+ 0xda, 0x1b, 0x87, 0xbd, 0xad, 0x2f, 0x3c, 0xbe, 0xc2, 0x22, 0x20, 0x3e,
+ 0xe3, 0x94, 0x27, 0x3b, 0x87, 0x57, 0x02, 0xbd, 0x82, 0x06, 0x58, 0x3d,
+ 0x78, 0xaf, 0x3e, 0xbd, 0x39, 0x25, 0x34, 0xbd, 0xa9, 0x26, 0x71, 0xbd,
+ 0x82, 0xe3, 0x58, 0xbd, 0xc4, 0x52, 0x6c, 0xbe, 0xaa, 0x42, 0x21, 0x3c,
+ 0x5b, 0xfa, 0x7c, 0xbe, 0xd5, 0x64, 0x04, 0x3e, 0xb9, 0xb2, 0x11, 0xbe,
+ 0xc4, 0x50, 0xa6, 0x3d, 0xcc, 0x3f, 0xe1, 0x3d, 0x63, 0xf3, 0x24, 0x3e,
+ 0x5c, 0x84, 0xb8, 0xbc, 0xf3, 0xfb, 0x86, 0xbe, 0x9e, 0x81, 0x5e, 0x3e,
+ 0xc8, 0xc0, 0xf3, 0xba, 0x80, 0x3c, 0x66, 0xbe, 0x65, 0x67, 0x6a, 0xbd,
+ 0x21, 0xc0, 0x98, 0xbd, 0x67, 0xe5, 0xeb, 0x3c, 0xda, 0x1b, 0xd3, 0xbb,
+ 0xdc, 0x80, 0x98, 0xbc, 0x83, 0x66, 0x96, 0x3d, 0x2f, 0x57, 0xc6, 0x3b,
+ 0xb2, 0x7c, 0xa6, 0x3d, 0xfa, 0xce, 0x05, 0x3e, 0x44, 0xe1, 0xca, 0x3d,
+ 0x03, 0xc9, 0x71, 0xbe, 0x55, 0x99, 0xd0, 0x3d, 0x3b, 0xc3, 0xb4, 0x3c,
+ 0x6e, 0xfb, 0x22, 0xbd, 0x4c, 0xa4, 0x59, 0xbd, 0x75, 0xcf, 0x07, 0x3e,
+ 0xac, 0x53, 0x19, 0x3e, 0x8b, 0x20, 0xa1, 0x3d, 0xb6, 0x9b, 0xdf, 0xbd,
+ 0x78, 0x1f, 0x62, 0x3e, 0x41, 0x2d, 0x88, 0xbd, 0x49, 0x73, 0xd0, 0x3d,
+ 0x3b, 0xa6, 0x3a, 0x3d, 0x24, 0x37, 0x34, 0x3e, 0xe8, 0x15, 0x44, 0xbe,
+ 0xcb, 0x37, 0xb8, 0xbd, 0xef, 0xec, 0xc2, 0x3c, 0x3b, 0xf2, 0x53, 0x3c,
+ 0xb1, 0xae, 0x01, 0x3e, 0xd9, 0x72, 0xcb, 0x3d, 0x36, 0x28, 0x0c, 0xbe,
+ 0x68, 0x77, 0x8b, 0xbd, 0x93, 0xe1, 0x65, 0x3d, 0x1d, 0x1c, 0xae, 0x3d,
+ 0x16, 0x1a, 0x0b, 0xbe, 0x3f, 0x7b, 0xf7, 0x3d, 0x94, 0x11, 0xcf, 0x3c,
+ 0xa6, 0x67, 0xcd, 0xbd, 0x68, 0x0b, 0xf0, 0x3e, 0xaf, 0xc7, 0x77, 0x3d,
+ 0xdd, 0x4b, 0x66, 0x3d, 0x2a, 0xa2, 0x04, 0xbe, 0x01, 0x45, 0xc9, 0xbd,
+ 0x48, 0xe6, 0x1c, 0xbe, 0x4b, 0xf7, 0x44, 0x3d, 0x95, 0x50, 0x8b, 0xbc,
+ 0xab, 0x26, 0x45, 0x3e, 0xb1, 0x06, 0x8b, 0xbe, 0xe8, 0x54, 0x75, 0x3c,
+ 0x5b, 0x93, 0xeb, 0x3c, 0x18, 0xc9, 0x28, 0xbe, 0x1d, 0xac, 0xb7, 0x3d,
+ 0xe6, 0x3a, 0xbc, 0xbd, 0x35, 0xac, 0x9e, 0x3d, 0x0f, 0x06, 0x33, 0x3e,
+ 0xe3, 0xf5, 0x0a, 0x3d, 0x35, 0xaf, 0x32, 0xbd, 0x3a, 0x95, 0xbd, 0x3d,
+ 0x57, 0xfa, 0xb6, 0x3d, 0xf7, 0x6b, 0x17, 0x3e, 0x9e, 0xc7, 0xf0, 0x3d,
+ 0x1f, 0x26, 0x84, 0xbd, 0xb2, 0x2b, 0xf1, 0xbc, 0xeb, 0xb8, 0x26, 0xbe,
+ 0xfb, 0x28, 0x34, 0xbe, 0xd6, 0xf7, 0x05, 0xbe, 0x91, 0x10, 0xe8, 0x3b,
+ 0x87, 0x0d, 0xbc, 0xbd, 0xd1, 0x87, 0x44, 0xbe, 0x17, 0xe8, 0xf5, 0xbd,
+ 0xb6, 0x51, 0xec, 0x3d, 0xef, 0xbf, 0x4a, 0xbe, 0x2d, 0x27, 0xad, 0xbd,
+ 0x19, 0x84, 0x02, 0x3e, 0x69, 0x33, 0x81, 0x3d, 0xdd, 0x36, 0x05, 0xbe,
+ 0x47, 0x1d, 0xb2, 0x3d, 0xd6, 0x9a, 0x0e, 0xbe, 0xb2, 0xc7, 0x40, 0xbe,
+ 0xb0, 0xd6, 0x6c, 0xbd, 0x3b, 0x92, 0x81, 0xbe, 0x00, 0xaa, 0xfe, 0xbd,
+ 0x77, 0xa4, 0x9b, 0x3d, 0xca, 0xd6, 0x09, 0x3d, 0xfe, 0x09, 0xf8, 0xbd,
+ 0x74, 0xfa, 0x9f, 0xbe, 0x3c, 0x71, 0x87, 0x3d, 0x34, 0x1b, 0x11, 0x3e,
+ 0xc6, 0x1b, 0x8a, 0x3d, 0xee, 0xa6, 0x55, 0xbe, 0x5a, 0xf0, 0x27, 0xbc,
+ 0x29, 0xdc, 0xc8, 0xbd, 0x4a, 0xb5, 0x29, 0x39, 0xd8, 0x71, 0x3e, 0xbc,
+ 0x86, 0x3f, 0x4b, 0xb9, 0x95, 0x0b, 0x91, 0xbe, 0xf7, 0x36, 0xab, 0x3c,
+ 0xa3, 0x34, 0x84, 0xbe, 0x14, 0x26, 0xb3, 0xbd, 0x68, 0x9c, 0x8f, 0x3d,
+ 0xb1, 0xf0, 0xaa, 0xbc, 0x52, 0x5f, 0x00, 0x3e, 0x89, 0xa8, 0x21, 0x3e,
+ 0xe4, 0xdc, 0x17, 0xbe, 0x58, 0xe3, 0xa4, 0x3d, 0x6c, 0x5f, 0xae, 0xbd,
+ 0x69, 0xc0, 0x11, 0x3e, 0x88, 0x5e, 0x43, 0x3d, 0x2b, 0x68, 0x8a, 0x3d,
+ 0x14, 0x29, 0x47, 0xbc, 0x21, 0xd1, 0xa9, 0xbd, 0x4e, 0x03, 0xfd, 0xbd,
+ 0xc0, 0xbd, 0x28, 0x3e, 0xe0, 0xf7, 0x2e, 0x3e, 0x68, 0xd9, 0xa3, 0xbd,
+ 0x31, 0x50, 0x7e, 0x3d, 0x36, 0x1d, 0x59, 0x3d, 0xc0, 0xb1, 0xe8, 0x3d,
+ 0xb9, 0x31, 0x2f, 0xbe, 0xfa, 0x0e, 0x76, 0xbe, 0x90, 0x5b, 0x67, 0xbc,
+ 0x30, 0xa5, 0x8e, 0xbd, 0x54, 0xcb, 0x32, 0x3c, 0xa2, 0xc6, 0x30, 0xbd,
+ 0x8e, 0x5e, 0x59, 0x3e, 0x98, 0x70, 0x0f, 0xbe, 0x3f, 0x51, 0x36, 0xbe,
+ 0x0f, 0x80, 0x88, 0xbe, 0xeb, 0x77, 0xcb, 0x3d, 0x91, 0x69, 0x78, 0x3b,
+ 0x59, 0x1d, 0x2e, 0x3e, 0x9a, 0xe8, 0xf4, 0xba, 0xf4, 0x0d, 0x91, 0xbd,
+ 0xce, 0x69, 0x36, 0xbe, 0x1f, 0x68, 0xb5, 0xbd, 0xaa, 0x87, 0xc6, 0x3d,
+ 0x56, 0x0a, 0x98, 0xbe, 0xc3, 0xde, 0xd3, 0xbd, 0x41, 0x45, 0xa3, 0x3e,
+ 0x3b, 0x5a, 0x40, 0x3d, 0xb2, 0xf3, 0x42, 0x3e, 0xbf, 0xb7, 0x1c, 0x3e,
+ 0x45, 0x4e, 0x95, 0xbd, 0x82, 0x77, 0xd0, 0xbd, 0x2f, 0x9a, 0x23, 0x3e,
+ 0x26, 0x61, 0x38, 0xbd, 0x49, 0x81, 0xc5, 0xbd, 0x52, 0x61, 0x18, 0x3e,
+ 0x60, 0x81, 0x83, 0xbd, 0x77, 0x73, 0x49, 0xbe, 0x02, 0x15, 0x27, 0x3e,
+ 0xce, 0xcf, 0x38, 0x3d, 0xec, 0x7f, 0x70, 0xbe, 0xfe, 0xda, 0x9e, 0xbe,
+ 0x51, 0x8d, 0xf2, 0xbd, 0x9e, 0xde, 0xac, 0xbc, 0x49, 0x67, 0x58, 0xbc,
+ 0xbb, 0x58, 0x10, 0xbe, 0x13, 0xec, 0x0c, 0xbe, 0xff, 0x41, 0xae, 0xbe,
+ 0xae, 0x38, 0xf3, 0x3d, 0x96, 0x9c, 0x6e, 0x3e, 0x4c, 0xc8, 0xd0, 0x3d,
+ 0x98, 0x93, 0x9b, 0xbd, 0x9a, 0xc7, 0x6b, 0xbd, 0x42, 0x92, 0xa9, 0x3b,
+ 0x93, 0x55, 0x53, 0x3e, 0xab, 0x8a, 0xe8, 0x3d, 0x9a, 0x47, 0xd3, 0x3c,
+ 0xcc, 0x58, 0xbb, 0xbd, 0x55, 0x57, 0x39, 0x3e, 0x58, 0xc6, 0x01, 0xbe,
+ 0x9e, 0x5c, 0x10, 0xbe, 0xd5, 0xa7, 0xee, 0xbd, 0xee, 0xd6, 0x24, 0x3e,
+ 0xd5, 0x76, 0x91, 0xbe, 0xb0, 0x52, 0x08, 0xbe, 0x57, 0x82, 0x48, 0xbd,
+ 0xf2, 0xd6, 0xb7, 0xbd, 0x9c, 0x84, 0x2c, 0xbc, 0x0f, 0x39, 0xf6, 0xbd,
+ 0x02, 0xd1, 0xdb, 0xbd, 0xed, 0x30, 0x5c, 0x3e, 0x61, 0x21, 0x6f, 0x3c,
+ 0x48, 0xdf, 0x8d, 0xbe, 0x72, 0xb2, 0xb3, 0xbe, 0x9c, 0x60, 0xfa, 0xbb,
+ 0x03, 0xac, 0xd1, 0xbc, 0x7d, 0x99, 0xe0, 0xbd, 0x05, 0x8d, 0xa9, 0xbd,
+ 0x44, 0x4d, 0x62, 0xbe, 0x62, 0x6d, 0xfd, 0xbc, 0xa4, 0x04, 0x56, 0xbd,
+ 0x46, 0x53, 0x85, 0xbe, 0xe6, 0x58, 0xa0, 0x3d, 0x6f, 0x97, 0x27, 0x3e,
+ 0xfc, 0x8c, 0x72, 0x3c, 0xa1, 0xf9, 0x7b, 0x3d, 0x62, 0x52, 0x48, 0x3e,
+ 0x83, 0xc8, 0x7c, 0xbd, 0x0b, 0x04, 0xa6, 0xbe, 0xe4, 0xa0, 0xd3, 0xbc,
+ 0x51, 0x4b, 0xbc, 0x3d, 0x50, 0x84, 0xca, 0xbc, 0x5e, 0xf0, 0xad, 0xbe,
+ 0x76, 0x1e, 0x83, 0x3e, 0xc7, 0x99, 0x02, 0xbd, 0x59, 0x0b, 0xb0, 0x3d,
+ 0xd1, 0x70, 0xc3, 0xbc, 0x09, 0x28, 0x6c, 0x3d, 0x29, 0x29, 0x84, 0xbe,
+ 0xa1, 0x6d, 0xec, 0xbd, 0x80, 0xed, 0xa9, 0xbd, 0x01, 0xab, 0xb4, 0x3e,
+ 0x88, 0xff, 0x0d, 0xbb, 0xcb, 0x8f, 0x72, 0x3d, 0x31, 0x58, 0x27, 0xbe,
+ 0x7a, 0xe2, 0xdb, 0x3b, 0xc3, 0xc8, 0xde, 0xbd, 0x45, 0xa4, 0x91, 0xbd,
+ 0x88, 0x7e, 0x85, 0x3c, 0x42, 0x04, 0xf5, 0xbd, 0x90, 0x1d, 0x59, 0x3d,
+ 0x10, 0x51, 0x5c, 0xbe, 0x98, 0x07, 0xd8, 0xbc, 0x17, 0x33, 0x5b, 0x3e,
+ 0xb9, 0x46, 0x35, 0x3e, 0x4f, 0xff, 0x77, 0x3e, 0x62, 0xed, 0x33, 0x3e,
+ 0x5a, 0xa3, 0x24, 0xbe, 0xf8, 0x32, 0x59, 0x3d, 0x52, 0x9f, 0xa8, 0xbd,
+ 0x30, 0xc0, 0xfb, 0x3d, 0xd9, 0x3b, 0x0a, 0xbe, 0x13, 0xc6, 0x92, 0x3c,
+ 0x6c, 0xd3, 0x4d, 0x3e, 0x61, 0x32, 0x18, 0x3c, 0x65, 0xee, 0x1d, 0xbd,
+ 0xbc, 0x33, 0x4b, 0x3d, 0x6b, 0xe7, 0x9a, 0x3c, 0x24, 0x2c, 0x48, 0xbd,
+ 0xc7, 0xea, 0x0f, 0xbe, 0x2f, 0xf4, 0xe7, 0x3b, 0x23, 0x36, 0x01, 0x3e,
+ 0x28, 0x59, 0x48, 0xbd, 0xc8, 0x29, 0x73, 0xbd, 0x97, 0x54, 0xcf, 0xbc,
+ 0x61, 0x71, 0x21, 0x3e, 0x57, 0x44, 0x05, 0x3e, 0x24, 0x78, 0xb8, 0x3d,
+ 0xa9, 0x40, 0x4e, 0x3d, 0x7a, 0x88, 0x3c, 0x3d, 0x00, 0x19, 0xc7, 0xbc,
+ 0x24, 0x49, 0x1c, 0xbe, 0xe8, 0x0f, 0x73, 0x3d, 0x21, 0x30, 0x5c, 0x3d,
+ 0x8b, 0x56, 0xfc, 0xbc, 0xa6, 0x1c, 0x1c, 0x3c, 0xad, 0x9b, 0x11, 0xbe,
+ 0x26, 0x3f, 0x5b, 0xbd, 0x8a, 0x7c, 0x3e, 0x3c, 0x33, 0x1f, 0x38, 0xbe,
+ 0xb8, 0x54, 0x0a, 0xbe, 0x96, 0x76, 0x0b, 0xbd, 0xdc, 0x20, 0x05, 0x3c,
+ 0x91, 0x28, 0x11, 0xbe, 0x9b, 0xa8, 0xf8, 0x3d, 0xaa, 0x68, 0x0a, 0x3d,
+ 0xb1, 0xf0, 0x08, 0xbd, 0xca, 0xfc, 0x0b, 0x3e, 0x92, 0xe2, 0x3d, 0x3e,
+ 0x7b, 0x1b, 0x87, 0xbd, 0xf1, 0x07, 0x5d, 0x3e, 0xdb, 0x07, 0xfe, 0x3d,
+ 0xc6, 0x19, 0x32, 0x3e, 0xc7, 0xe3, 0x4a, 0xbd, 0x07, 0xe1, 0x76, 0x3e,
+ 0x52, 0xb9, 0x6f, 0xbe, 0x2f, 0x8e, 0x0b, 0xbe, 0xa3, 0x80, 0x72, 0xbd,
+ 0x6c, 0xe1, 0x0d, 0xbe, 0xe7, 0x3c, 0x0b, 0xbc, 0xe7, 0x64, 0x15, 0x3d,
+ 0x8f, 0xef, 0xc7, 0x3d, 0x94, 0x87, 0xd7, 0xbd, 0x86, 0x35, 0xd7, 0xbc,
+ 0x04, 0xdf, 0x58, 0xbd, 0xaf, 0x92, 0x06, 0xbc, 0x1a, 0x3b, 0x2f, 0x3e,
+ 0xba, 0x77, 0xac, 0xbd, 0xfa, 0x16, 0x08, 0x3b, 0x0d, 0x79, 0x29, 0x3d,
+ 0x5f, 0xa1, 0x50, 0x3b, 0xf8, 0xd2, 0x3f, 0xbd, 0xdc, 0xcb, 0x87, 0x3d,
+ 0xef, 0x38, 0xa4, 0x3d, 0x79, 0x64, 0x50, 0xbd, 0x5e, 0xa9, 0xd4, 0xbd,
+ 0x3f, 0xbd, 0xd8, 0x3d, 0xba, 0xff, 0x59, 0xbd, 0x17, 0xd8, 0x18, 0xbe,
+ 0xb5, 0x72, 0xb0, 0x3c, 0xa6, 0x98, 0x8c, 0x3c, 0x86, 0x64, 0x31, 0x3d,
+ 0x6c, 0x5f, 0xf9, 0x3d, 0xfa, 0x9e, 0x48, 0xbe, 0x5d, 0x1d, 0xc0, 0x3d,
+ 0xa3, 0xfc, 0x69, 0x3d, 0xd1, 0x14, 0x78, 0x3c, 0x68, 0x44, 0x53, 0x3d,
+ 0x4b, 0x31, 0x1a, 0xbe, 0x8a, 0x1e, 0x92, 0xbd, 0x0e, 0x80, 0x8d, 0xbd,
+ 0xa4, 0xcb, 0x0a, 0xbe, 0xfa, 0x7f, 0x73, 0x3d, 0x2e, 0x5a, 0x0b, 0x3d,
+ 0xc7, 0xa8, 0x14, 0x3e, 0xac, 0x80, 0x09, 0xbd, 0x8c, 0xb8, 0xf1, 0xbc,
+ 0x04, 0x22, 0x94, 0xbd, 0x75, 0xdd, 0xe1, 0xbd, 0xce, 0x1c, 0x67, 0xbe,
+ 0xd0, 0xbd, 0xef, 0x3c, 0xaf, 0x52, 0x2e, 0xbe, 0xdb, 0xfe, 0xd3, 0xbd,
+ 0xd6, 0x5b, 0x07, 0x3d, 0xc0, 0x70, 0x72, 0xbd, 0x44, 0x06, 0x33, 0x3d,
+ 0x96, 0x18, 0x8c, 0x3d, 0x4a, 0xd3, 0xc6, 0x3d, 0xc0, 0x85, 0x3e, 0xbc,
+ 0x6c, 0x34, 0x11, 0x3d, 0xb7, 0x81, 0xba, 0xbd, 0xd1, 0xdf, 0x11, 0x3d,
+ 0x13, 0xb1, 0x8e, 0x3d, 0xdf, 0x1c, 0xd3, 0x3d, 0x6c, 0x67, 0x27, 0xbe,
+ 0xe0, 0x98, 0xb0, 0x3b, 0x84, 0x97, 0xa7, 0xbd, 0x89, 0x4e, 0x95, 0xbd,
+ 0xee, 0x12, 0x12, 0x3e, 0x53, 0xab, 0x47, 0xbd, 0x0a, 0xf5, 0x4e, 0x3d,
+ 0xd2, 0x40, 0xb5, 0xbd, 0x4b, 0xec, 0x74, 0xbd, 0x0d, 0x6c, 0x1f, 0x3e,
+ 0x6c, 0xe1, 0xc5, 0xbd, 0xdf, 0x0a, 0xa2, 0x3d, 0x85, 0xf0, 0x0d, 0xbe,
+ 0x0c, 0x1c, 0x73, 0xbd, 0x26, 0xc8, 0x81, 0x3e, 0x41, 0x9d, 0x74, 0xbd,
+ 0xc1, 0xb9, 0x86, 0xbd, 0x2c, 0x08, 0x4f, 0x3d, 0x77, 0x4b, 0xc4, 0x3d,
+ 0xd3, 0xa8, 0x01, 0x3d, 0x01, 0x96, 0x82, 0x3d, 0xc0, 0x12, 0x89, 0xbc,
+ 0xdb, 0x36, 0x82, 0x3d, 0x4f, 0x5f, 0x4b, 0xbd, 0x78, 0x19, 0x41, 0xbe,
+ 0xbb, 0x21, 0x4b, 0x3d, 0xaf, 0x61, 0x66, 0xbd, 0x3b, 0x04, 0x30, 0x3e,
+ 0xce, 0xf0, 0xb2, 0x3d, 0x1e, 0x78, 0x7f, 0xbd, 0x6b, 0x1e, 0x19, 0x3d,
+ 0xd7, 0x3d, 0x85, 0xbd, 0x5a, 0xf6, 0x36, 0xbb, 0x35, 0x07, 0x8f, 0xbd,
+ 0x65, 0x47, 0xe7, 0xbd, 0x3f, 0xc1, 0x16, 0x3e, 0x07, 0xa4, 0xf3, 0x3c,
+ 0x9b, 0x17, 0xa6, 0xbc, 0x9a, 0x7b, 0x0e, 0x3e, 0x99, 0x9a, 0xc4, 0xbd,
+ 0x65, 0xac, 0x33, 0x3e, 0xd2, 0x7c, 0x93, 0x3d, 0x6a, 0x36, 0xed, 0x3d,
+ 0x68, 0xc6, 0xa1, 0x3d, 0xc5, 0x3f, 0x54, 0xbe, 0x94, 0x11, 0x52, 0xbe,
+ 0x87, 0x36, 0x10, 0x3e, 0xbd, 0x57, 0xd5, 0x3d, 0x26, 0x28, 0x74, 0x3d,
+ 0x15, 0x63, 0x64, 0xbd, 0x80, 0xc1, 0x9f, 0xbd, 0x81, 0x2c, 0xa1, 0xbd,
+ 0xb7, 0x85, 0xcc, 0x3c, 0x1d, 0xc8, 0xdc, 0xbd, 0x2e, 0x28, 0x5d, 0xbe,
+ 0xf0, 0x55, 0xf6, 0x3d, 0x73, 0x0c, 0x0a, 0x3e, 0xac, 0xd7, 0x0b, 0xbe,
+ 0x44, 0x12, 0xa8, 0xbc, 0x17, 0xf5, 0x26, 0xbe, 0x02, 0x33, 0x91, 0x3d,
+ 0xaa, 0x6f, 0xf2, 0xbd, 0xc8, 0x78, 0x8c, 0x3d, 0x25, 0x3a, 0xbe, 0xbd,
+ 0x6a, 0x1c, 0x3a, 0xbd, 0xc6, 0x27, 0x8e, 0xbd, 0x3c, 0x5f, 0x88, 0xbd,
+ 0xbd, 0x2f, 0x9a, 0xbd, 0x91, 0xf5, 0x0e, 0x3d, 0xb6, 0x8e, 0x44, 0x3d,
+ 0xe4, 0x63, 0x9a, 0xbd, 0x39, 0x88, 0xdc, 0x3c, 0x03, 0x49, 0x0f, 0xbd,
+ 0x27, 0x5d, 0xd0, 0x3d, 0x16, 0x5b, 0x43, 0x3d, 0x8c, 0xce, 0xca, 0xbc,
+ 0x49, 0xb1, 0x9e, 0x3d, 0xbf, 0x42, 0x76, 0x3d, 0xac, 0x66, 0x8f, 0xbb,
+ 0x0d, 0xff, 0xf1, 0xbd, 0x5f, 0xd0, 0xad, 0xbd, 0x7f, 0x88, 0x11, 0xbe,
+ 0x81, 0xe1, 0xee, 0xbc, 0x04, 0x86, 0x9d, 0xbd, 0x56, 0x47, 0xaf, 0x3c,
+ 0xaa, 0x1e, 0x54, 0x3d, 0xcb, 0x6d, 0x27, 0xbd, 0xab, 0x9a, 0x31, 0x3e,
+ 0xb0, 0xeb, 0xb7, 0xbd, 0xdc, 0x00, 0x2c, 0x3e, 0x09, 0x64, 0xde, 0xbd,
+ 0x98, 0xfc, 0x10, 0xbe, 0x59, 0x84, 0x2d, 0x3e, 0x52, 0x31, 0x48, 0xbe,
+ 0xd9, 0x86, 0x68, 0x3e, 0x60, 0x26, 0xaf, 0x3d, 0xbd, 0xc5, 0x44, 0xbe,
+ 0x36, 0xde, 0x83, 0xbb, 0x5f, 0x58, 0x1f, 0x3e, 0xc3, 0xc0, 0x59, 0x3b,
+ 0xd1, 0x24, 0x0d, 0xbd, 0x3c, 0x81, 0xa5, 0x3d, 0xa1, 0xf5, 0x6b, 0x3e,
+ 0xa1, 0x49, 0x2d, 0xbe, 0x6a, 0x60, 0x88, 0xbd, 0x65, 0xe7, 0x25, 0xbd,
+ 0x27, 0x04, 0x20, 0x3e, 0x41, 0x3f, 0xca, 0xbe, 0x5a, 0x07, 0x09, 0x3d,
+ 0xd9, 0xb0, 0xb5, 0xbd, 0x92, 0x0d, 0xf6, 0xbb, 0x59, 0x2b, 0xa6, 0xbd,
+ 0x70, 0x3a, 0xc9, 0x3d, 0x2d, 0x48, 0xcc, 0xbc, 0x9f, 0x5b, 0xbd, 0x3c,
+ 0xc1, 0x89, 0x9d, 0xbd, 0xc9, 0xd4, 0x0c, 0x3c, 0x6c, 0xd2, 0xb1, 0xbd,
+ 0x5e, 0x74, 0x9f, 0x3d, 0xc6, 0x6d, 0xbd, 0x3d, 0x97, 0x36, 0x9b, 0x3c,
+ 0xa9, 0x3f, 0x0d, 0xbe, 0x55, 0x43, 0x74, 0x3d, 0x68, 0x8f, 0x9c, 0x3d,
+ 0x62, 0xf0, 0xbe, 0xbd, 0xb2, 0x65, 0xf0, 0xbd, 0x49, 0xf3, 0xdb, 0xbd,
+ 0x9b, 0x64, 0x1c, 0xbe, 0x9e, 0x23, 0x75, 0x3e, 0xf4, 0xd2, 0xa2, 0xbe,
+ 0x1c, 0x01, 0x07, 0xbd, 0xbb, 0x0b, 0xaf, 0xbb, 0xad, 0x17, 0xb5, 0x3d,
+ 0xc6, 0x44, 0xd3, 0x3d, 0xf4, 0x97, 0xa4, 0xbd, 0x3c, 0xd2, 0x06, 0xbe,
+ 0x76, 0xc2, 0x43, 0xbe, 0x65, 0xf4, 0x08, 0xbe, 0xb7, 0x2d, 0x27, 0xbe,
+ 0xf1, 0x87, 0x5a, 0xbc, 0xe0, 0xf4, 0x99, 0xbd, 0xab, 0xa4, 0x20, 0xbe,
+ 0x49, 0xad, 0xc3, 0x3b, 0x9b, 0x93, 0xa6, 0xbd, 0xd3, 0x74, 0x09, 0x3d,
+ 0x16, 0xde, 0x1b, 0x3d, 0x20, 0x91, 0x3f, 0x3e, 0x1e, 0xa9, 0x7d, 0x3d,
+ 0x8e, 0x64, 0x0c, 0x3e, 0x96, 0x02, 0x99, 0xbe, 0x62, 0x0e, 0xdb, 0xbe,
+ 0x90, 0x04, 0x80, 0x3d, 0x75, 0x79, 0x20, 0xbe, 0x55, 0x36, 0x9f, 0xbd,
+ 0xa0, 0x6b, 0x06, 0xbd, 0x07, 0x56, 0xed, 0x3d, 0xac, 0x4a, 0x9a, 0x3d,
+ 0x7e, 0x37, 0x7e, 0x3b, 0x9b, 0xb5, 0xad, 0x3c, 0x8c, 0x23, 0x30, 0x3e,
+ 0x0f, 0xe0, 0x20, 0xbe, 0x69, 0x95, 0x17, 0x3d, 0xdd, 0xd7, 0x44, 0x3d,
+ 0x4c, 0xeb, 0x94, 0x3d, 0x81, 0x0f, 0x53, 0x3e, 0xfa, 0xcc, 0x48, 0x3d,
+ 0x2e, 0x24, 0xa6, 0x3d, 0xde, 0x4f, 0x23, 0xbe, 0xda, 0x2e, 0x3c, 0xbe,
+ 0x02, 0xd7, 0x16, 0xbe, 0xb3, 0x0e, 0xf1, 0xbd, 0x62, 0xf4, 0x95, 0x3d,
+ 0x33, 0x21, 0x83, 0xbd, 0x29, 0x18, 0xcb, 0xbd, 0xcc, 0x29, 0xeb, 0x3d,
+ 0x18, 0xf5, 0x58, 0xbe, 0x28, 0x8d, 0x8b, 0x3e, 0x5a, 0x94, 0x36, 0xbe,
+ 0x5e, 0x0c, 0xe8, 0x3d, 0x57, 0x01, 0x81, 0xbd, 0x30, 0x02, 0x1e, 0xbe,
+ 0x6c, 0x88, 0x57, 0xbd, 0x66, 0x97, 0x99, 0x3c, 0xd8, 0xc8, 0xcb, 0xbd,
+ 0x4d, 0x53, 0xe4, 0xbd, 0xd1, 0x11, 0x09, 0x3e, 0xac, 0x4d, 0x2a, 0xbe,
+ 0x3d, 0x50, 0x2a, 0xbe, 0xbe, 0xd9, 0x2a, 0xbd, 0x73, 0x12, 0x95, 0xbd,
+ 0x5b, 0xc3, 0x5a, 0xbe, 0xa0, 0xb8, 0x7d, 0x3e, 0x8d, 0x25, 0xb0, 0xbc,
+ 0x65, 0x12, 0x9e, 0xbd, 0x75, 0x76, 0xf5, 0x3b, 0x29, 0xac, 0x43, 0x3e,
+ 0xf6, 0xcd, 0xd7, 0xbd, 0x53, 0xe5, 0x07, 0xbe, 0x6f, 0x4c, 0xca, 0x3d,
+ 0xe0, 0xe8, 0x87, 0x3d, 0x45, 0xa0, 0x3b, 0x3c, 0xb2, 0xfb, 0x50, 0x3e,
+ 0xd2, 0xb7, 0x79, 0x3d, 0x49, 0x04, 0xd1, 0xbd, 0x37, 0xe7, 0x9e, 0x3c,
+ 0x8a, 0x13, 0x91, 0x3b, 0x4a, 0xea, 0x0d, 0xbe, 0x1f, 0xf8, 0xb1, 0xbd,
+ 0xeb, 0x5a, 0xac, 0x3d, 0x6a, 0x0f, 0xde, 0xbd, 0x25, 0xb3, 0xa1, 0xbd,
+ 0x9d, 0x56, 0x6c, 0xbe, 0xe0, 0xc6, 0x9c, 0x3c, 0x89, 0xf4, 0xb9, 0x3d,
+ 0xe7, 0x7f, 0xa2, 0xbe, 0x39, 0x34, 0x0a, 0x3c, 0xab, 0x64, 0x08, 0x3d,
+ 0x6c, 0x63, 0x08, 0xbc, 0xe5, 0x3d, 0x78, 0x3d, 0xa7, 0x15, 0x19, 0xbe,
+ 0xc5, 0x3c, 0xac, 0x3c, 0x48, 0x67, 0x1c, 0xbe, 0x28, 0xe9, 0x93, 0xbc,
+ 0xa9, 0xa3, 0x95, 0xba, 0x2a, 0x73, 0xb8, 0x3d, 0x95, 0x9d, 0x3e, 0xbe,
+ 0x9f, 0x6d, 0x57, 0x3d, 0x8e, 0xc5, 0x09, 0x3e, 0x3a, 0xa5, 0xde, 0xbd,
+ 0x7c, 0x26, 0x5e, 0xbe, 0x37, 0x0c, 0x45, 0x3e, 0x16, 0xe7, 0xbb, 0x3d,
+ 0x9c, 0x08, 0x89, 0xbd, 0xef, 0xde, 0x24, 0xbd, 0xbc, 0xe3, 0x60, 0x3d,
+ 0xa5, 0x78, 0x4a, 0xbd, 0xcb, 0xbf, 0x8e, 0xbb, 0x82, 0xe1, 0xb0, 0xbc,
+ 0x30, 0x28, 0xd6, 0xbd, 0x6d, 0x74, 0x5d, 0xbe, 0x60, 0x37, 0xed, 0xbd,
+ 0x4b, 0xc8, 0x86, 0xbc, 0xe4, 0x96, 0xeb, 0xbd, 0x17, 0xd5, 0xf8, 0xba,
+ 0x1a, 0xce, 0x7c, 0x3e, 0x0b, 0x4f, 0x85, 0xbc, 0xc0, 0xa5, 0xba, 0x3d,
+ 0xcc, 0x4d, 0x1c, 0xbe, 0x2e, 0xc0, 0xd0, 0xbd, 0x74, 0x66, 0x6e, 0xbe,
+ 0x95, 0xf1, 0x03, 0x3e, 0x62, 0xd9, 0xb0, 0xbd, 0x23, 0x05, 0x93, 0xbd,
+ 0x1f, 0x66, 0x42, 0xbe, 0x12, 0xa4, 0xe6, 0xbc, 0x25, 0xdb, 0x8d, 0xbd,
+ 0x5d, 0xb7, 0xf8, 0xbd, 0xf8, 0xa9, 0x97, 0x3d, 0xc7, 0x84, 0x77, 0x3d,
+ 0x4c, 0xbb, 0x40, 0xbe, 0xd4, 0xfa, 0x48, 0xbd, 0x3c, 0xbb, 0xfc, 0x3d,
+ 0xeb, 0x71, 0x0f, 0x3e, 0xe1, 0x9d, 0x9e, 0xbe, 0xd2, 0xc0, 0xcd, 0xbd,
+ 0x6a, 0xf9, 0xe1, 0xbd, 0x8c, 0xa9, 0x8d, 0xbd, 0x3c, 0x0d, 0xfc, 0x3c,
+ 0x32, 0x8a, 0x5c, 0x3c, 0x11, 0x75, 0xd4, 0xbc, 0xba, 0xc4, 0xb6, 0x3c,
+ 0x10, 0xd6, 0x3e, 0x3e, 0xc8, 0xb5, 0x81, 0xbe, 0x04, 0x10, 0x78, 0x3d,
+ 0x6c, 0xab, 0xa6, 0x3d, 0x2f, 0xd8, 0x75, 0x3d, 0xb4, 0x76, 0xe4, 0xbd,
+ 0xdf, 0x62, 0x6c, 0xbe, 0x22, 0xc6, 0x38, 0x3e, 0xd8, 0x11, 0xc5, 0x3d,
+ 0x4f, 0x0e, 0x92, 0xbb, 0x32, 0x6d, 0xca, 0xbd, 0xb6, 0x01, 0xaf, 0xbc,
+ 0x3c, 0xf8, 0x84, 0xbe, 0xf1, 0xd5, 0x99, 0x3b, 0xea, 0xa2, 0x39, 0x3e,
+ 0x97, 0x80, 0xfc, 0xbe, 0xb4, 0x2d, 0xaa, 0x3d, 0x6d, 0x72, 0xb8, 0x3d,
+ 0x1e, 0x4d, 0x10, 0xbe, 0x3b, 0xb9, 0x63, 0x3d, 0x85, 0x75, 0xa9, 0xbd,
+ 0x7f, 0xda, 0x71, 0xbc, 0x47, 0xe4, 0x8c, 0xbd, 0xbc, 0x92, 0x27, 0xbe,
+ 0x3e, 0xe5, 0x1c, 0xbe, 0x47, 0xcf, 0x2a, 0xbe, 0x06, 0x3a, 0x09, 0x3e,
+ 0x8d, 0x0d, 0x10, 0x3d, 0x04, 0x1f, 0x4f, 0x3d, 0x7d, 0x2f, 0x66, 0xb9,
+ 0x2c, 0xb2, 0x31, 0x3e, 0x1c, 0x8c, 0x86, 0xbd, 0xbe, 0xa6, 0x2f, 0xbe,
+ 0x3a, 0x5a, 0x79, 0xbe, 0x55, 0x6b, 0xd8, 0xbc, 0x18, 0x8d, 0xef, 0x3d,
+ 0x24, 0xde, 0xa1, 0x3d, 0xa7, 0xac, 0xf1, 0x3d, 0x35, 0x67, 0x3d, 0x3d,
+ 0x10, 0x62, 0x55, 0xbd, 0x19, 0xfa, 0x0c, 0x3d, 0x0e, 0xb3, 0x6c, 0xbd,
+ 0x1c, 0x3f, 0x42, 0x3e, 0xaa, 0x1e, 0x0e, 0x3d, 0xd1, 0xde, 0x1e, 0xbd,
+ 0x3b, 0x64, 0x28, 0x3e, 0xd9, 0x34, 0x83, 0xbc, 0x48, 0xd2, 0x6c, 0xbd,
+ 0xd9, 0x95, 0xb3, 0x3e, 0xda, 0x1e, 0x36, 0xbe, 0x93, 0xee, 0x1d, 0x3e,
+ 0x78, 0x5f, 0x29, 0xbd, 0xd2, 0xc0, 0xd1, 0x3d, 0xe7, 0x98, 0xb2, 0xbd,
+ 0xda, 0xd5, 0xe2, 0x3b, 0x99, 0x53, 0x57, 0x3e, 0x84, 0xbc, 0x15, 0x3d,
+ 0x08, 0x16, 0x0c, 0xbe, 0xcd, 0x32, 0x05, 0xbe, 0xb8, 0x05, 0xea, 0xbb,
+ 0xb0, 0x1f, 0xd5, 0x3d, 0x66, 0xd7, 0xa5, 0xbd, 0xc9, 0xc4, 0x36, 0xbe,
+ 0x97, 0xc6, 0x45, 0x3e, 0x0c, 0xdb, 0xf7, 0x3c, 0x26, 0xf4, 0x4b, 0xbe,
+ 0xe0, 0xec, 0xdb, 0x3d, 0x4c, 0x9f, 0xa9, 0x3d, 0x7d, 0x1e, 0x0a, 0xbd,
+ 0x1c, 0xb7, 0xe2, 0x3d, 0xd6, 0x5a, 0xbc, 0x3c, 0x47, 0x43, 0xe7, 0xbc,
+ 0xdc, 0x67, 0x2a, 0x3e, 0x13, 0x6f, 0x6d, 0xbe, 0x7c, 0x2e, 0x3d, 0x3c,
+ 0x72, 0x7f, 0xc2, 0x3d, 0x59, 0x36, 0xab, 0x3d, 0xfc, 0xff, 0xe6, 0xbd,
+ 0xce, 0x82, 0x6a, 0x3e, 0x9f, 0x7e, 0x7a, 0xbd, 0xd7, 0x90, 0x78, 0x3c,
+ 0x93, 0xf2, 0xf8, 0x3d, 0xfd, 0xf9, 0x83, 0x3d, 0xc3, 0x5f, 0xfe, 0x3d,
+ 0xac, 0x69, 0x2c, 0x3e, 0x16, 0x4a, 0x89, 0xbc, 0xbd, 0x36, 0x3b, 0x3e,
+ 0x67, 0x7f, 0x29, 0x3e, 0x63, 0x63, 0xf3, 0xbd, 0x8f, 0x07, 0xad, 0x3d,
+ 0x6f, 0x3b, 0xf6, 0xbd, 0x0d, 0xdf, 0x3c, 0x3e, 0x1c, 0xcc, 0x08, 0x3d,
+ 0xf7, 0x02, 0x07, 0xbd, 0x49, 0x92, 0xf6, 0x3c, 0x6a, 0x60, 0x05, 0x3e,
+ 0xc3, 0xef, 0x49, 0x3e, 0xc9, 0x12, 0xf1, 0xbd, 0xd9, 0x78, 0x48, 0xba,
+ 0x6f, 0x49, 0xac, 0x3d, 0xa2, 0x6a, 0x86, 0x3d, 0x1a, 0xe4, 0x76, 0x3d,
+ 0xb5, 0xa5, 0x12, 0x3e, 0x76, 0x5b, 0xea, 0xbd, 0xec, 0x0a, 0x83, 0x3d,
+ 0xee, 0x13, 0xfe, 0xbd, 0x0b, 0x74, 0xfe, 0xbd, 0x28, 0x2b, 0x72, 0xbc,
+ 0x70, 0x5c, 0x2e, 0xbe, 0x24, 0x93, 0xf6, 0x3d, 0x99, 0x66, 0x55, 0x3e,
+ 0xf9, 0xa4, 0x71, 0x3d, 0x5c, 0xf2, 0x9d, 0xbe, 0xe2, 0x5a, 0xdd, 0x3d,
+ 0x72, 0xcc, 0xe2, 0x3c, 0xd0, 0xe9, 0xdc, 0xbc, 0xd3, 0xd7, 0x76, 0xbd,
+ 0xd4, 0x66, 0xb1, 0xbd, 0x1d, 0xd5, 0x6d, 0xbd, 0x0b, 0xe4, 0x4c, 0x3e,
+ 0x8d, 0x7d, 0x5f, 0xbd, 0x93, 0xe1, 0xc8, 0x3d, 0x48, 0x33, 0x3c, 0x3e,
+ 0xe5, 0x55, 0x4c, 0xbd, 0x05, 0x48, 0xf2, 0x3d, 0xad, 0x9b, 0x23, 0x3c,
+ 0xf3, 0x86, 0x4a, 0x3e, 0x2b, 0xc3, 0x9b, 0xbd, 0x9e, 0x17, 0x3c, 0xbd,
+ 0x10, 0xb5, 0x48, 0x3d, 0x8e, 0x1a, 0x90, 0xbd, 0x87, 0x9f, 0x27, 0xbe,
+ 0x6f, 0xa7, 0x64, 0x3d, 0xd0, 0x67, 0x89, 0x3e, 0x1e, 0x80, 0x16, 0x3e,
+ 0x60, 0x37, 0x13, 0xbe, 0xf4, 0xfb, 0xd7, 0x3d, 0x35, 0xf8, 0xe1, 0xbd,
+ 0xff, 0x16, 0x24, 0x3e, 0x96, 0xde, 0x28, 0x3e, 0x0b, 0x02, 0xc6, 0x3d,
+ 0x5d, 0xe7, 0xad, 0x3d, 0x76, 0xaa, 0xb8, 0x3d, 0x61, 0xe7, 0x87, 0x3d,
+ 0xc3, 0xc0, 0xd3, 0xbd, 0x2c, 0x0c, 0xac, 0xbd, 0xf8, 0x45, 0x50, 0x3c,
+ 0x9d, 0x61, 0x95, 0xbd, 0x23, 0xfb, 0x93, 0xbd, 0xc5, 0x8b, 0x32, 0xbe,
+ 0xaa, 0x3b, 0xb5, 0x3d, 0x9a, 0xd2, 0xc0, 0xbd, 0x42, 0xb7, 0xeb, 0x3c,
+ 0x4f, 0x01, 0x15, 0xbe, 0xfa, 0xa5, 0x1d, 0xbe, 0x2c, 0x71, 0x92, 0x3d,
+ 0xf2, 0x2c, 0x7a, 0xbe, 0xec, 0x5d, 0xf9, 0x3d, 0x80, 0x86, 0xa3, 0x3d,
+ 0x07, 0x1c, 0x0d, 0x3d, 0xb2, 0x98, 0x78, 0x3d, 0x63, 0x62, 0xfc, 0x3c,
+ 0x9f, 0x76, 0xc9, 0x3d, 0x64, 0x63, 0x82, 0x3d, 0xfa, 0x31, 0x64, 0xbd,
+ 0x29, 0x6d, 0x31, 0x3d, 0xf4, 0xf9, 0x2e, 0x3d, 0xf4, 0x41, 0x4b, 0x3e,
+ 0x63, 0x82, 0xc7, 0x3d, 0x0e, 0x91, 0x1d, 0xbe, 0x00, 0x59, 0xc4, 0x3d,
+ 0x85, 0xb0, 0x56, 0xbc, 0xde, 0xa8, 0x8b, 0xbc, 0x73, 0x8f, 0xf3, 0xbd,
+ 0xff, 0xbd, 0xbc, 0x3c, 0xfd, 0xe7, 0x4a, 0x3e, 0xbd, 0x6c, 0x03, 0xbd,
+ 0xb2, 0x71, 0xaa, 0xbd, 0xdf, 0x94, 0xa4, 0xbd, 0x27, 0x0a, 0xf3, 0xbc,
+ 0x46, 0x61, 0xd4, 0x3d, 0x0a, 0x36, 0x0a, 0xbe, 0xf8, 0x89, 0x16, 0x3e,
+ 0x7f, 0xc2, 0x89, 0x3e, 0x38, 0xb3, 0x0e, 0x3e, 0x66, 0xc4, 0xf2, 0x3d,
+ 0x3e, 0x2b, 0x90, 0xbd, 0x4a, 0xb9, 0x70, 0x3d, 0xd0, 0x17, 0xb3, 0x39,
+ 0xc5, 0xcb, 0x5d, 0xbe, 0x30, 0x93, 0x37, 0x3d, 0xe2, 0x77, 0xc6, 0x3d,
+ 0x40, 0x3f, 0xb9, 0xbd, 0x9e, 0xf2, 0x51, 0x3e, 0xeb, 0x51, 0x3f, 0xbe,
+ 0x66, 0x13, 0x17, 0xbe, 0xae, 0x1b, 0xd5, 0xbd, 0xdb, 0xd3, 0xd8, 0xbd,
+ 0xb8, 0xbf, 0x86, 0xbc, 0x55, 0xfd, 0x8b, 0xbd, 0x94, 0x80, 0x34, 0x3e,
+ 0x06, 0xa7, 0xed, 0xbd, 0x7d, 0xd3, 0x96, 0x3d, 0x30, 0xa3, 0x98, 0xbd,
+ 0xac, 0xe0, 0x66, 0x3c, 0x19, 0x64, 0x09, 0xbd, 0xe2, 0xfd, 0x90, 0x3e,
+ 0xda, 0xdc, 0xba, 0x3d, 0x6a, 0x83, 0x5e, 0xbe, 0xb5, 0x75, 0x14, 0xbe,
+ 0x7c, 0x5c, 0xbb, 0xbb, 0xce, 0x31, 0xec, 0x3d, 0x71, 0xb5, 0x05, 0x3d,
+ 0xe0, 0xdf, 0xd5, 0x3d, 0x59, 0x4f, 0xb5, 0x3c, 0x14, 0x5e, 0x6a, 0xbd,
+ 0xba, 0x43, 0x81, 0xbc, 0x06, 0xd0, 0xa2, 0xbd, 0x05, 0xe0, 0x2c, 0x3e,
+ 0x40, 0x96, 0x92, 0xbb, 0xfa, 0x8c, 0x88, 0xbc, 0x3a, 0x92, 0x4b, 0x3d,
+ 0xb1, 0xe4, 0x7d, 0xbe, 0x5b, 0x0a, 0x36, 0x3e, 0x9b, 0xb9, 0xb3, 0xbd,
+ 0xab, 0xa4, 0x44, 0xbe, 0xbf, 0x21, 0x19, 0x3e, 0xeb, 0xf6, 0xc4, 0x3d,
+ 0xaf, 0xd6, 0xb1, 0x3d, 0xac, 0x90, 0x07, 0xbe, 0xc4, 0x3e, 0x59, 0x3e,
+ 0x9b, 0xc5, 0xdb, 0xbd, 0xac, 0x42, 0x17, 0xbe, 0xec, 0xe0, 0xde, 0xbc,
+ 0x96, 0x03, 0xad, 0xbd, 0xa6, 0x0e, 0x2e, 0xbe, 0xad, 0xf2, 0xd0, 0xbe,
+ 0xbf, 0x61, 0x04, 0x3e, 0x41, 0xdd, 0x13, 0xbd, 0x85, 0xc2, 0xe4, 0xbd,
+ 0x62, 0xa9, 0x36, 0xbe, 0x6d, 0xa2, 0x0f, 0xbe, 0x6c, 0x33, 0x50, 0xbe,
+ 0x2d, 0x50, 0x20, 0xbb, 0xd3, 0xcc, 0x85, 0x3d, 0xba, 0xb1, 0xa6, 0xbe,
+ 0xf6, 0xe4, 0xa8, 0xbd, 0xd6, 0xc0, 0x77, 0x3c, 0x7b, 0xd2, 0xe6, 0xbd,
+ 0x0f, 0xe5, 0x3b, 0x3e, 0x49, 0x92, 0x0c, 0xbd, 0xfd, 0x82, 0xd5, 0x3d,
+ 0x56, 0x0f, 0x2f, 0x3e, 0x4d, 0x10, 0x0d, 0xbe, 0xca, 0xc9, 0x00, 0xbd,
+ 0x47, 0x4f, 0x1e, 0x3d, 0xf3, 0x91, 0x46, 0x3e, 0x8a, 0x55, 0x4d, 0x3e,
+ 0x5c, 0x31, 0x0f, 0x3e, 0xfe, 0x74, 0x33, 0x3e, 0x0a, 0xb9, 0x5b, 0x3e,
+ 0xcb, 0x58, 0x48, 0xbe, 0x0d, 0x8d, 0xeb, 0xbd, 0x11, 0xf7, 0x0d, 0xbe,
+ 0x66, 0x0b, 0x5e, 0x3e, 0x60, 0xcc, 0x9a, 0x3c, 0x4d, 0x40, 0x03, 0xbd,
+ 0xcd, 0x56, 0x77, 0x3d, 0x10, 0x63, 0x1c, 0xbb, 0xf8, 0x19, 0x28, 0x3d,
+ 0x7a, 0xfc, 0x78, 0x3d, 0xeb, 0xf7, 0x70, 0xbd, 0x0a, 0x05, 0xbc, 0xbd,
+ 0x05, 0x72, 0x85, 0xbd, 0xe9, 0xdc, 0x87, 0x3c, 0x97, 0xe8, 0x0e, 0x3e,
+ 0x4c, 0x7e, 0xf9, 0xbd, 0xaa, 0xa1, 0x97, 0xbd, 0x5d, 0x02, 0xce, 0xbc,
+ 0xa8, 0xbd, 0x8a, 0xbe, 0x76, 0xe3, 0xa9, 0x3e, 0xd0, 0x3a, 0xcf, 0x3d,
+ 0xde, 0x74, 0xcf, 0x3d, 0x78, 0x9b, 0x34, 0xbe, 0x5d, 0xe2, 0xea, 0xbd,
+ 0x46, 0x64, 0x16, 0x3e, 0x90, 0xeb, 0xab, 0x3c, 0x01, 0x9c, 0x65, 0x3d,
+ 0xe2, 0xe8, 0x25, 0xbd, 0x0b, 0x0e, 0x10, 0x3e, 0x2e, 0xbc, 0x4b, 0xbd,
+ 0x58, 0x38, 0xb6, 0x3d, 0x9d, 0x98, 0xc6, 0xbd, 0x57, 0x2b, 0x9a, 0x3d,
+ 0xc3, 0x17, 0x1e, 0xbe, 0x30, 0xe7, 0x46, 0xbd, 0x63, 0xe0, 0xd1, 0x3c,
+ 0x27, 0x27, 0x00, 0xbe, 0x42, 0x3e, 0x28, 0x3e, 0x2e, 0x28, 0xac, 0xbd,
+ 0x90, 0x42, 0x50, 0x3d, 0x4e, 0xdc, 0xae, 0xbd, 0xde, 0xda, 0x33, 0xbe,
+ 0x91, 0xa0, 0x1c, 0xbe, 0xd3, 0xc6, 0xab, 0xbd, 0x8e, 0xe0, 0x10, 0xbe,
+ 0x77, 0xe5, 0xe6, 0xbc, 0x9d, 0x7c, 0xfa, 0xbd, 0x42, 0xd8, 0x21, 0x3e,
+ 0xa1, 0x70, 0x5a, 0x3e, 0x61, 0x09, 0x6d, 0x3d, 0xa1, 0xec, 0x3d, 0xbe,
+ 0x0a, 0x84, 0x19, 0xbd, 0xa6, 0x51, 0x12, 0xbc, 0x92, 0xb6, 0x99, 0x3c,
+ 0x93, 0x0a, 0x48, 0xbd, 0xa5, 0x19, 0xd4, 0xbd, 0x3f, 0x8a, 0x26, 0xbe,
+ 0xd4, 0x71, 0xc4, 0x3d, 0x30, 0xec, 0xed, 0xbd, 0xfc, 0xe3, 0x86, 0x3d,
+ 0xd0, 0x20, 0x07, 0xbe, 0x2e, 0x67, 0x7f, 0xbd, 0xa6, 0x38, 0xf8, 0xbb,
+ 0xe4, 0xa8, 0x0e, 0x3e, 0xc3, 0x0c, 0x1c, 0xbc, 0x10, 0xaf, 0xbd, 0x3c,
+ 0xe2, 0x41, 0x12, 0xbe, 0x2c, 0xf7, 0x61, 0xbd, 0xb2, 0xa1, 0x18, 0xbe,
+ 0x0f, 0x29, 0xcb, 0xbd, 0x3c, 0x0c, 0x59, 0xbc, 0x81, 0x57, 0xd9, 0x3d,
+ 0x40, 0x0e, 0x61, 0x3b, 0x5b, 0x5e, 0xfc, 0x3d, 0x34, 0x6c, 0x0b, 0xbe,
+ 0x1b, 0x5e, 0x1b, 0x3e, 0x3e, 0x22, 0xa6, 0x3d, 0x93, 0x24, 0x2e, 0xbd,
+ 0x59, 0xcf, 0xc7, 0xbd, 0x30, 0x34, 0xaa, 0xbc, 0xd9, 0x3d, 0xb8, 0xbd,
+ 0xdb, 0xf5, 0xf9, 0x3d, 0x6d, 0x82, 0xb3, 0x3d, 0xc0, 0xcd, 0x06, 0xbe,
+ 0xed, 0x4c, 0xd4, 0xbd, 0xd3, 0x81, 0x13, 0x3d, 0x81, 0x3a, 0x0e, 0x3d,
+ 0x15, 0xae, 0x0b, 0xbe, 0xf5, 0x37, 0x0f, 0xbe, 0xb0, 0xc3, 0x6d, 0x3d,
+ 0xab, 0xa0, 0x97, 0xbd, 0x63, 0x80, 0xaf, 0x3d, 0xe1, 0x7d, 0xec, 0x3d,
+ 0x96, 0x12, 0x0c, 0x3e, 0xd5, 0xbe, 0x54, 0xbd, 0x0e, 0x5c, 0xe0, 0xbd,
+ 0x0d, 0x09, 0x85, 0x3a, 0x92, 0x6c, 0xe5, 0x3d, 0x3f, 0x78, 0xb9, 0xbc,
+ 0x84, 0xe6, 0xaf, 0x3d, 0x9c, 0xa5, 0xe6, 0x3d, 0x06, 0x92, 0xab, 0x3d,
+ 0xd8, 0x9d, 0x1b, 0xbd, 0x5c, 0x40, 0x1a, 0x3e, 0x19, 0x5d, 0xfa, 0x3d,
+ 0x23, 0x13, 0x48, 0xbe, 0x18, 0xf3, 0x15, 0x3e, 0xe1, 0x36, 0x59, 0xbb,
+ 0x9c, 0xf8, 0xc7, 0xbd, 0x71, 0x6e, 0xa9, 0xbd, 0x5e, 0x96, 0x82, 0xbc,
+ 0xa4, 0x0e, 0x29, 0x3e, 0xd9, 0xf6, 0x41, 0x3e, 0x97, 0x75, 0x98, 0xbc,
+ 0x45, 0x7c, 0x8c, 0x3b, 0xe6, 0x0e, 0x78, 0x3d, 0x8b, 0xc1, 0x83, 0xbd,
+ 0x92, 0x34, 0x1e, 0xbe, 0xe1, 0xe9, 0x2c, 0xbd, 0xd7, 0x5c, 0x20, 0x3e,
+ 0x2a, 0xd7, 0xd7, 0xbc, 0xb5, 0x20, 0xb5, 0xbc, 0xa9, 0x7a, 0x85, 0xbd,
+ 0x9f, 0xa4, 0x46, 0x3d, 0xce, 0x9e, 0x07, 0x3e, 0xe5, 0xad, 0x08, 0xbe,
+ 0x20, 0xc8, 0xb7, 0xbd, 0x3e, 0x2e, 0x03, 0x3e, 0x08, 0x46, 0x5e, 0x3d,
+ 0x5b, 0x0d, 0xe0, 0x3d, 0xfb, 0xe1, 0x07, 0xbc, 0x7a, 0x16, 0x75, 0x3c,
+ 0xcb, 0x66, 0x03, 0xbe, 0xb0, 0x7a, 0x4b, 0xbc, 0x17, 0xeb, 0x9a, 0x3d,
+ 0x6b, 0x11, 0xa6, 0x3d, 0xdd, 0x7a, 0xd1, 0x3d, 0xbf, 0xa0, 0x71, 0x3d,
+ 0x73, 0x1d, 0xde, 0x3d, 0xe5, 0x36, 0x15, 0x3e, 0x28, 0x39, 0x1d, 0xbd,
+ 0x50, 0x79, 0x8f, 0x3d, 0x1d, 0xba, 0x2d, 0x3c, 0x2f, 0xfd, 0xda, 0xbc,
+ 0x99, 0x2b, 0xb5, 0xbd, 0xac, 0xac, 0x10, 0xbe, 0xfc, 0x34, 0x29, 0xbe,
+ 0xe8, 0x6e, 0xfc, 0x3d, 0x0f, 0x98, 0x1b, 0xbd, 0xc3, 0x1a, 0x44, 0xbe,
+ 0xfc, 0xbf, 0xf4, 0xbd, 0x70, 0x51, 0xda, 0xbd, 0xb6, 0x8e, 0x7b, 0x3d,
+ 0x0c, 0xe5, 0xc2, 0x3d, 0x39, 0x5d, 0xba, 0x3c, 0x06, 0xe8, 0xf4, 0xbd,
+ 0xc4, 0xea, 0x0f, 0xbe, 0xaf, 0x9d, 0xc2, 0xbd, 0xad, 0xc7, 0x1c, 0xbe,
+ 0x68, 0x99, 0x32, 0xbd, 0xa0, 0xf3, 0x87, 0x3b, 0xa4, 0x7d, 0xbf, 0x3c,
+ 0xbe, 0xb9, 0x09, 0x3e, 0x87, 0xc4, 0xaf, 0x3c, 0x44, 0x9f, 0x00, 0x3d,
+ 0x70, 0x57, 0xfd, 0x3d, 0x75, 0xd2, 0xcd, 0xbc, 0xe6, 0x67, 0xf0, 0xbd,
+ 0xd3, 0x55, 0x90, 0xbd, 0xc0, 0x20, 0x29, 0xbe, 0x48, 0xf4, 0xc2, 0x3a,
+ 0x36, 0x54, 0x14, 0x3e, 0x6f, 0xef, 0x0f, 0xbe, 0x1e, 0x03, 0x17, 0x3e,
+ 0xce, 0xf0, 0x67, 0xbe, 0x0e, 0x06, 0x92, 0x3e, 0xc3, 0xf3, 0xfe, 0x3d,
+ 0xca, 0x7b, 0xa0, 0xbe, 0x3e, 0x00, 0x2f, 0x3c, 0x95, 0x10, 0x3b, 0x3e,
+ 0x53, 0x32, 0xbf, 0x3d, 0xbc, 0x38, 0x6d, 0xbd, 0xe7, 0x79, 0xbe, 0xbd,
+ 0x7d, 0x32, 0x52, 0x3d, 0x54, 0xf4, 0x8e, 0x3b, 0xea, 0x04, 0x8a, 0x3d,
+ 0xe5, 0x32, 0x85, 0x3e, 0x79, 0xe4, 0x69, 0xbd, 0xd5, 0xff, 0x1c, 0xbe,
+ 0xaf, 0x97, 0xfb, 0x3c, 0x22, 0x48, 0xfb, 0x3d, 0xfa, 0x47, 0xa2, 0x3d,
+ 0x07, 0x59, 0x0d, 0xbe, 0x16, 0xb9, 0x56, 0x3c, 0x14, 0xc9, 0x89, 0x3d,
+ 0x1b, 0x6c, 0xd2, 0xbc, 0xfd, 0x19, 0x9f, 0x3d, 0x24, 0x2b, 0x9a, 0xbd,
+ 0x32, 0x6e, 0x9e, 0xbe, 0xa2, 0xa3, 0x6b, 0x3e, 0x73, 0xe0, 0xfa, 0x3d,
+ 0x67, 0xc2, 0x39, 0xbe, 0x15, 0x26, 0xc0, 0x3d, 0x43, 0x55, 0x8d, 0xbd,
+ 0xba, 0xce, 0x98, 0xbe, 0x3f, 0x19, 0x03, 0x3d, 0xcd, 0x7f, 0xbd, 0xbd,
+ 0x40, 0xe7, 0x41, 0x3d, 0xb4, 0x8e, 0x8d, 0x3d, 0x39, 0xeb, 0x23, 0xbe,
+ 0xb6, 0xf9, 0x28, 0xbe, 0x0e, 0x62, 0xea, 0x3b, 0x80, 0x40, 0x36, 0xbd,
+ 0x63, 0xbc, 0x8e, 0x3e, 0x84, 0xc4, 0x6d, 0xbe, 0x19, 0xd3, 0xce, 0xbd,
+ 0x81, 0x69, 0x0b, 0xbe, 0x6b, 0xe4, 0x22, 0x3d, 0x8d, 0x8f, 0x2a, 0x3e,
+ 0x83, 0xc4, 0xd2, 0x3d, 0xc4, 0xb3, 0x8e, 0xbe, 0x09, 0xc8, 0x5a, 0x3e,
+ 0xdd, 0x51, 0x29, 0x3e, 0x75, 0xe2, 0x07, 0x3d, 0x0b, 0x1f, 0x91, 0x3d,
+ 0x77, 0x55, 0xb7, 0x3d, 0x81, 0xca, 0xf7, 0xbd, 0xa0, 0xbd, 0xe6, 0xbd,
+ 0xd1, 0xbe, 0x25, 0x3e, 0xb8, 0x43, 0x2e, 0xbc, 0x04, 0xe4, 0xc5, 0xbd,
+ 0xf0, 0x73, 0xaa, 0xbe, 0x03, 0x9f, 0x74, 0xbe, 0x97, 0x02, 0x86, 0x3e,
+ 0xa8, 0x42, 0x7b, 0x3c, 0x70, 0xae, 0x81, 0x3d, 0x92, 0x08, 0x86, 0xbe,
+ 0xcc, 0xcc, 0xfb, 0x3c, 0xdb, 0xdb, 0x8e, 0x3e, 0xbd, 0xe4, 0x12, 0x3d,
+ 0x47, 0xc8, 0xc5, 0xbc, 0xd3, 0x58, 0xed, 0xbd, 0x93, 0x24, 0x3f, 0x3d,
+ 0xcc, 0x21, 0x69, 0x3e, 0x06, 0x97, 0x24, 0xbe, 0x8e, 0x1d, 0x62, 0x3c,
+ 0x1e, 0x44, 0xd6, 0x3d, 0x65, 0xd0, 0x28, 0xbe, 0xa7, 0x9e, 0x2e, 0xbe,
+ 0x82, 0x22, 0x02, 0x3e, 0xac, 0xe1, 0x92, 0x3b, 0x81, 0x7b, 0x9f, 0x3d,
+ 0x25, 0x50, 0x79, 0xbe, 0x55, 0x5f, 0xbc, 0xbe, 0x99, 0xba, 0x30, 0xbe,
+ 0x75, 0x96, 0x8c, 0x3e, 0xc5, 0xe9, 0xba, 0x3d, 0xdf, 0x14, 0xb9, 0xbd,
+ 0xce, 0x70, 0x01, 0xbe, 0x57, 0xc8, 0x05, 0xbd, 0x74, 0x79, 0x97, 0xbc,
+ 0x16, 0x11, 0x36, 0xbe, 0x9c, 0x2f, 0x3f, 0x3e, 0x38, 0x42, 0xcc, 0x3c,
+ 0xd0, 0x54, 0x60, 0xbe, 0x3e, 0x4d, 0xd3, 0xbd, 0x3b, 0xa2, 0xb4, 0xbc,
+ 0x9e, 0x18, 0x7c, 0xbe, 0x1f, 0x99, 0x8a, 0x3d, 0xa3, 0x84, 0xe7, 0xbd,
+ 0x4f, 0xc5, 0x6b, 0x3e, 0xbe, 0x2f, 0x11, 0x3e, 0x87, 0x16, 0xef, 0x3d,
+ 0x30, 0xc3, 0x9a, 0xbd, 0x8b, 0x16, 0x6c, 0xbd, 0x66, 0x0d, 0x97, 0xbc,
+ 0x14, 0xde, 0x48, 0xbe, 0x2d, 0x15, 0x30, 0x3e, 0xbe, 0x50, 0xe3, 0x3c,
+ 0xdd, 0x59, 0xbf, 0xbd, 0x5e, 0xa4, 0x7a, 0x3e, 0xfd, 0x04, 0x68, 0x3d,
+ 0x2a, 0x09, 0x88, 0x3c, 0x0b, 0x5a, 0xdc, 0x3d, 0xc7, 0x6a, 0x44, 0x3e,
+ 0xd4, 0x58, 0x48, 0xbe, 0x71, 0xfc, 0x7d, 0xbe, 0x4d, 0xd0, 0x09, 0x3e,
+ 0x3a, 0xec, 0xb8, 0x3d, 0x18, 0x7b, 0x87, 0xbd, 0x4e, 0x59, 0x7a, 0x3d,
+ 0x17, 0x6d, 0x99, 0xbc, 0x23, 0x1b, 0x8b, 0x3d, 0x11, 0xfb, 0xa1, 0xbd,
+ 0x66, 0x35, 0x11, 0xbe, 0x1e, 0x97, 0x20, 0xbe, 0x62, 0xd4, 0x86, 0xbd,
+ 0x94, 0x49, 0x7b, 0xbd, 0x9d, 0xb5, 0x4b, 0xbe, 0xf8, 0xdc, 0x98, 0x3d,
+ 0x91, 0x92, 0x3d, 0xbd, 0x48, 0xce, 0x1d, 0xbe, 0x6c, 0x89, 0xce, 0x3d,
+ 0x9b, 0x16, 0xd8, 0x3d, 0x20, 0xdb, 0x15, 0x3d, 0x33, 0x8f, 0x5d, 0xbe,
+ 0x9f, 0xf1, 0x1d, 0x3e, 0x81, 0xd7, 0x9c, 0xbd, 0x07, 0xc5, 0xa3, 0xbd,
+ 0xdf, 0xbe, 0x77, 0x3d, 0x84, 0x3c, 0x30, 0x3d, 0x52, 0x26, 0x95, 0xbd,
+ 0xb3, 0xb0, 0x85, 0xbd, 0xb3, 0xf2, 0x12, 0xbe, 0xf7, 0x32, 0x2c, 0xbd,
+ 0xcd, 0x2e, 0x0a, 0xbe, 0x07, 0x41, 0x73, 0x3d, 0x73, 0xf1, 0x00, 0xbe,
+ 0x5b, 0x89, 0xbc, 0x3c, 0x84, 0xb3, 0x74, 0xbd, 0xa9, 0xa8, 0x09, 0xbe,
+ 0x9d, 0xf7, 0x2e, 0xbe, 0x46, 0x42, 0x4a, 0x3d, 0x23, 0xab, 0x46, 0x3d,
+ 0x32, 0x07, 0x5e, 0xbd, 0x13, 0xbe, 0xe4, 0x3d, 0xd7, 0x58, 0x74, 0x3c,
+ 0x16, 0x8e, 0x31, 0xbe, 0x58, 0x9a, 0x08, 0x3e, 0xaa, 0x78, 0xf1, 0x3d,
+ 0x6d, 0xdf, 0xda, 0xbd, 0xf3, 0xae, 0x4f, 0xbe, 0x17, 0xdb, 0x18, 0xbe,
+ 0x3a, 0x04, 0x60, 0xbe, 0x6c, 0x92, 0x9e, 0xbd, 0xc1, 0x27, 0x35, 0xbd,
+ 0xbe, 0x18, 0xff, 0xbd, 0xa1, 0x6d, 0x0d, 0xbe, 0xc8, 0x81, 0x33, 0x3d,
+ 0x27, 0x74, 0xeb, 0xbd, 0xff, 0x44, 0x0d, 0x3e, 0xab, 0xba, 0x5e, 0xbd,
+ 0xcf, 0x24, 0xd7, 0xbd, 0x57, 0xda, 0x14, 0xbe, 0x5a, 0x26, 0x9c, 0x3d,
+ 0xbb, 0x86, 0xad, 0x3d, 0x14, 0x65, 0xb5, 0x3d, 0xe0, 0x51, 0xe1, 0x3d,
+ 0x40, 0xbc, 0xb8, 0xbc, 0xf9, 0x29, 0x00, 0xbe, 0x67, 0xb1, 0x03, 0x3c,
+ 0x6b, 0x5a, 0xd7, 0xbb, 0xfc, 0xce, 0x81, 0xbd, 0x44, 0x6d, 0xd7, 0xbd,
+ 0x94, 0x95, 0x07, 0xbe, 0x83, 0x06, 0x58, 0xbe, 0xee, 0x29, 0xca, 0xbd,
+ 0xe3, 0x5a, 0x09, 0xbd, 0x0d, 0x30, 0x1a, 0xbd, 0x84, 0x79, 0x6c, 0xbd,
+ 0x01, 0x7a, 0x98, 0xbc, 0x7f, 0x23, 0xb6, 0xbd, 0xc8, 0xce, 0x67, 0xbd,
+ 0x35, 0xc8, 0x32, 0x3d, 0xf4, 0xe9, 0x91, 0x3d, 0xcd, 0x15, 0x08, 0x3e,
+ 0x41, 0xdc, 0x9e, 0xbd, 0x98, 0x5e, 0x88, 0x3c, 0x4a, 0xd0, 0xba, 0x3b,
+ 0x30, 0x14, 0xcf, 0xbd, 0x4e, 0xde, 0xdd, 0x3d, 0xfe, 0xf8, 0x67, 0x3d,
+ 0x42, 0xfd, 0x03, 0xbc, 0xd2, 0x6f, 0xc0, 0x3d, 0xa0, 0x21, 0x71, 0x3d,
+ 0x60, 0xdc, 0xea, 0x3c, 0x62, 0xe4, 0xec, 0xbd, 0x1c, 0x5e, 0xe4, 0xbb,
+ 0x47, 0x12, 0x0a, 0xbe, 0x84, 0x77, 0x35, 0x3d, 0x71, 0xa6, 0x4b, 0xbe,
+ 0x63, 0x3d, 0x04, 0x3e, 0xca, 0x48, 0xcb, 0xbd, 0xd2, 0x20, 0x06, 0xbd,
+ 0x1d, 0x54, 0xd5, 0xbd, 0xf4, 0x2c, 0xbc, 0x3c, 0x3a, 0x07, 0xd0, 0xbd,
+ 0x46, 0xfc, 0xf1, 0xbd, 0x17, 0x0f, 0x23, 0x3d, 0x98, 0x01, 0xe4, 0xba,
+ 0xad, 0x6a, 0x91, 0xbd, 0xe3, 0x4d, 0x01, 0x3e, 0x1b, 0x88, 0x98, 0x3d,
+ 0xe4, 0x4d, 0x10, 0x3e, 0x30, 0xbe, 0x37, 0x3e, 0x26, 0x80, 0x11, 0xbe,
+ 0x7a, 0xcd, 0x2c, 0xbe, 0x6c, 0x9c, 0x02, 0xbb, 0xbd, 0xf6, 0xab, 0x3d,
+ 0x7d, 0x1b, 0x0b, 0x3d, 0x44, 0xbb, 0x38, 0xbe, 0x91, 0x5e, 0x9c, 0x3d,
+ 0xff, 0x49, 0xbe, 0x3d, 0x8c, 0xbb, 0x9a, 0xbd, 0x4c, 0x7a, 0x04, 0xbe,
+ 0xa0, 0x9a, 0x8f, 0x3c, 0x29, 0xdf, 0x0a, 0x3d, 0xe1, 0x05, 0x05, 0xbc,
+ 0x45, 0x58, 0x44, 0xbc, 0x5a, 0xa7, 0x31, 0xbe, 0xf2, 0xd7, 0x23, 0xbe,
+ 0xe0, 0x5f, 0xa8, 0xbc, 0x00, 0xd4, 0x76, 0xbe, 0x0d, 0x30, 0xd3, 0xbd,
+ 0x66, 0xb4, 0x24, 0x3d, 0x2b, 0x6a, 0x3b, 0xbd, 0x07, 0xc1, 0x95, 0xbd,
+ 0x00, 0x71, 0x1c, 0xbd, 0xb7, 0x85, 0x06, 0x3e, 0x46, 0x48, 0x65, 0x3b,
+ 0xa1, 0x1a, 0xf6, 0xbd, 0x6d, 0x25, 0xe7, 0xbd, 0x9b, 0x5d, 0x6d, 0xbd,
+ 0xf5, 0x39, 0xa7, 0xbd, 0x0c, 0x5a, 0x99, 0x3d, 0xdc, 0xe8, 0x01, 0x3e,
+ 0x20, 0x7e, 0x43, 0xbe, 0xd6, 0x59, 0xdd, 0xbd, 0xf0, 0xa2, 0xf8, 0x3d,
+ 0x1b, 0x9c, 0xd1, 0x3d, 0x92, 0x3e, 0x18, 0x3e, 0xc9, 0x67, 0x0c, 0xbc,
+ 0x3f, 0x54, 0xc5, 0x3d, 0x40, 0xa1, 0x5b, 0xbe, 0xd1, 0x50, 0x1a, 0xbd,
+ 0x15, 0xd8, 0x9f, 0xbd, 0xc9, 0x80, 0xe5, 0x3d, 0x99, 0xe0, 0x2d, 0x3e,
+ 0x21, 0xd7, 0xfa, 0xbb, 0x90, 0xb0, 0x88, 0xbe, 0x65, 0xb9, 0x3c, 0xbd,
+ 0x35, 0xbc, 0x8b, 0xbe, 0x93, 0x96, 0xab, 0xbc, 0x8f, 0x7d, 0x57, 0x3b,
+ 0x03, 0xa5, 0xab, 0xbd, 0x2a, 0xf5, 0xee, 0x3c, 0x45, 0x8f, 0xbc, 0x3d,
+ 0x2b, 0x7b, 0x8a, 0x3d, 0x92, 0x18, 0x89, 0xbd, 0x8d, 0x59, 0x80, 0xbd,
+ 0x62, 0xdb, 0xae, 0xbb, 0xd2, 0xd8, 0x88, 0xbd, 0x4c, 0xb3, 0xeb, 0xbd,
+ 0xc5, 0x34, 0xf6, 0xbd, 0x55, 0x40, 0x62, 0xbd, 0x1e, 0x11, 0xaa, 0xbc,
+ 0xf1, 0xb7, 0x75, 0x3c, 0xe1, 0x51, 0xec, 0xbc, 0x8c, 0xbe, 0x38, 0xbe,
+ 0x19, 0x64, 0x16, 0x3d, 0x7e, 0xf9, 0x0e, 0xbe, 0xde, 0xda, 0x2f, 0x3b,
+ 0xae, 0x5c, 0xf6, 0x3d, 0x40, 0x66, 0xca, 0xbb, 0xfa, 0xd7, 0x0b, 0xbe,
+ 0x73, 0xb8, 0x99, 0x3d, 0xf2, 0xa3, 0x6b, 0xbe, 0xff, 0x10, 0x8e, 0xbd,
+ 0x31, 0x2d, 0xbc, 0x3d, 0xc5, 0x70, 0x17, 0xbe, 0x1e, 0x29, 0x2b, 0xbe,
+ 0x45, 0x77, 0x7d, 0xbe, 0x18, 0x90, 0x80, 0x3d, 0x5c, 0x34, 0x6a, 0xbe,
+ 0x2c, 0x38, 0x01, 0xbe, 0xa1, 0x67, 0x75, 0xbd, 0xcf, 0x19, 0x19, 0xbe,
+ 0xdb, 0xb8, 0x4c, 0x3b, 0x60, 0x84, 0x31, 0xbd, 0x14, 0x6e, 0x36, 0xbe,
+ 0xc7, 0x13, 0xd9, 0xbc, 0xe8, 0x12, 0x2f, 0xbe, 0xc7, 0xa2, 0x34, 0x3e,
+ 0xd0, 0x63, 0x0e, 0x3e, 0xe9, 0xb5, 0x25, 0x3d, 0x75, 0x77, 0xdb, 0xbd,
+ 0xcf, 0xc0, 0xc9, 0xbd, 0x61, 0xb6, 0x92, 0x3d, 0x0a, 0x66, 0x05, 0x3e,
+ 0x2d, 0xd8, 0x2a, 0x3d, 0x00, 0xe2, 0x3a, 0x3e, 0x23, 0x5a, 0x4c, 0x3d,
+ 0x14, 0x1e, 0x17, 0x3e, 0x06, 0x4b, 0x96, 0xbc, 0xcd, 0x2a, 0x90, 0xbd,
+ 0x2a, 0xd5, 0x70, 0xbd, 0x00, 0xae, 0x4f, 0x3e, 0x16, 0xcf, 0xc4, 0xbd,
+ 0x93, 0xcd, 0x02, 0x3e, 0x39, 0x04, 0x43, 0x3e, 0x1e, 0xa6, 0x4e, 0xbd,
+ 0xa1, 0x7d, 0x85, 0xbe, 0xa0, 0x52, 0x02, 0xbe, 0xae, 0x7c, 0x04, 0xbc,
+ 0xd0, 0xc5, 0x66, 0xbd, 0x20, 0xf2, 0xec, 0xb9, 0x6f, 0x8c, 0xf7, 0xbc,
+ 0x09, 0xc4, 0x94, 0xbd, 0x43, 0xc0, 0x0e, 0xbe, 0x95, 0x7d, 0xfd, 0xbd,
+ 0x32, 0x57, 0xac, 0x3c, 0x27, 0xa5, 0x1e, 0x3e, 0x4a, 0x06, 0xb5, 0x3d,
+ 0x59, 0xce, 0x07, 0xbe, 0x69, 0x97, 0x0f, 0x3d, 0x3d, 0xa6, 0xdb, 0x3c,
+ 0xb7, 0x28, 0x9b, 0x3d, 0x86, 0x8c, 0xf6, 0xbd, 0x16, 0xb6, 0xbf, 0x3a,
+ 0x98, 0x51, 0x85, 0xbe, 0x04, 0xb5, 0x07, 0xbe, 0xdb, 0x32, 0x83, 0xbd,
+ 0x2a, 0x04, 0xec, 0x3d, 0x55, 0x9d, 0x46, 0xbd, 0xbc, 0x31, 0x20, 0x3e,
+ 0xf9, 0xda, 0x36, 0xba, 0x69, 0xf8, 0x30, 0x3d, 0xe5, 0x40, 0x05, 0x3b,
+ 0x25, 0x4b, 0x52, 0x3d, 0xfd, 0x08, 0x96, 0x3c, 0x2c, 0x08, 0x4e, 0x3e,
+ 0x0c, 0x45, 0x38, 0xbd, 0x28, 0x15, 0xe9, 0x3d, 0x7c, 0xd9, 0x44, 0xbd,
+ 0xe4, 0x5c, 0x0b, 0xbe, 0xd7, 0xee, 0x19, 0x3e, 0xce, 0x25, 0x0b, 0xbb,
+ 0xcf, 0x0a, 0x73, 0x3d, 0x25, 0xd3, 0xbc, 0xbd, 0xc4, 0xa2, 0x05, 0x3c,
+ 0x05, 0x48, 0xc0, 0x3c, 0xf6, 0x99, 0x3c, 0xbe, 0x28, 0x98, 0x5b, 0x3d,
+ 0x3a, 0x2e, 0xa0, 0xbc, 0x8a, 0xf8, 0xcc, 0x3d, 0xda, 0xfa, 0x2e, 0xbc,
+ 0xc1, 0x7d, 0x07, 0xbc, 0xbd, 0xa2, 0x1f, 0xbe, 0x91, 0x1a, 0xfb, 0x3d,
+ 0x55, 0x33, 0xd7, 0x3d, 0xeb, 0xe7, 0x0e, 0xbe, 0x71, 0x5b, 0xfd, 0xbd,
+ 0x1c, 0x42, 0xb8, 0xbb, 0x2a, 0xf6, 0x63, 0x3d, 0x73, 0x1f, 0xfe, 0x3d,
+ 0xf9, 0x91, 0xca, 0xbb, 0xc6, 0x12, 0x42, 0x3e, 0x0f, 0x27, 0x3f, 0xbe,
+ 0xa4, 0x6d, 0xf7, 0x3d, 0xe1, 0x35, 0xa7, 0x3d, 0xea, 0x46, 0x9f, 0xbd,
+ 0x23, 0x76, 0x26, 0x3e, 0x45, 0x48, 0x1e, 0xbe, 0xdd, 0x5e, 0x00, 0xbe,
+ 0x7f, 0x62, 0x0d, 0xbe, 0xef, 0x37, 0x9a, 0xbd, 0x70, 0xce, 0x89, 0xbd,
+ 0xe4, 0x37, 0x24, 0x3e, 0xa4, 0x09, 0xbd, 0x3b, 0xfe, 0x04, 0x97, 0xbd,
+ 0xf4, 0xac, 0x41, 0x3d, 0xb3, 0xeb, 0x7a, 0x3b, 0x83, 0x60, 0x9b, 0x3d,
+ 0x92, 0x9f, 0x14, 0x3e, 0x16, 0x2c, 0xa4, 0xbd, 0xf3, 0x91, 0x38, 0xbe,
+ 0xf8, 0xe9, 0x6f, 0x3d, 0xea, 0x24, 0x23, 0x3d, 0x46, 0x19, 0x30, 0x3e,
+ 0xe0, 0x3a, 0xcc, 0xbd, 0xe3, 0xc0, 0x40, 0xbe, 0x02, 0x75, 0xeb, 0xbc,
+ 0xb3, 0x1e, 0x25, 0x3e, 0x2d, 0x67, 0xaf, 0xbd, 0x5f, 0x2f, 0xc6, 0xbd,
+ 0x10, 0xce, 0x93, 0xbd, 0xe2, 0xc9, 0xee, 0xbd, 0x67, 0xa2, 0x04, 0x3e,
+ 0x1e, 0x1c, 0xa1, 0xbc, 0x83, 0xf9, 0x01, 0xbe, 0xc7, 0x61, 0xc2, 0x3d,
+ 0x54, 0x15, 0x7e, 0x3d, 0x6f, 0x7f, 0x34, 0xbe, 0xb7, 0xc1, 0x91, 0x3d,
+ 0xa3, 0x0c, 0x8c, 0x3d, 0xb8, 0x77, 0x46, 0xbd, 0x54, 0xe4, 0xe4, 0x3d,
+ 0xac, 0x23, 0x87, 0x3d, 0x4f, 0x1b, 0x81, 0xbe, 0x28, 0xae, 0xf2, 0xbd,
+ 0x48, 0x3a, 0xe5, 0x3d, 0x5d, 0x72, 0xd2, 0x3d, 0x18, 0x80, 0x70, 0x3c,
+ 0xad, 0xbb, 0xa2, 0xbe, 0x27, 0x86, 0x48, 0xbe, 0x33, 0x8a, 0x91, 0xbd,
+ 0x20, 0xb7, 0x9a, 0xbd, 0x4f, 0xd6, 0x5d, 0xbe, 0x54, 0xc4, 0xad, 0xbc,
+ 0x7c, 0x11, 0x24, 0x3e, 0x0d, 0x80, 0x60, 0x3d, 0xd9, 0xde, 0x3b, 0xbe,
+ 0xca, 0x72, 0xff, 0x3d, 0xfc, 0x9d, 0xe2, 0x3b, 0xe4, 0x9e, 0xb5, 0xbd,
+ 0x03, 0xeb, 0xd9, 0xbc, 0x4a, 0xae, 0xcc, 0x3d, 0x1d, 0xb3, 0x0e, 0x3e,
+ 0x67, 0x03, 0x9b, 0xbc, 0xc6, 0xff, 0x1e, 0xbe, 0x7c, 0x55, 0xa8, 0xbd,
+ 0x0c, 0x22, 0x7c, 0xbe, 0x21, 0x1a, 0x0c, 0xbe, 0x5e, 0x21, 0xdf, 0x3d,
+ 0x91, 0xd2, 0x0c, 0xbe, 0x5d, 0xa9, 0x16, 0x3e, 0xe1, 0xb3, 0xef, 0xbc,
+ 0x02, 0x25, 0x8c, 0xbc, 0x0b, 0x5f, 0xca, 0xbc, 0x41, 0x4a, 0x12, 0xbc,
+ 0xf9, 0xf0, 0xf0, 0x3d, 0x82, 0x31, 0x91, 0x3d, 0xf2, 0xc0, 0xdd, 0xbd,
+ 0x3c, 0xff, 0xe0, 0xbc, 0x81, 0xee, 0x13, 0xbe, 0xdc, 0xe7, 0x4f, 0x3e,
+ 0xdd, 0xee, 0xa3, 0xbd, 0x65, 0x1a, 0x2f, 0x3e, 0x68, 0x1b, 0xa3, 0xbd,
+ 0x28, 0x02, 0xf4, 0x3d, 0x09, 0x05, 0x9e, 0xbe, 0x74, 0xc0, 0x23, 0xbe,
+ 0x48, 0x43, 0x6e, 0x3e, 0x18, 0xd0, 0xc0, 0xbc, 0x3f, 0x0d, 0x2a, 0xbe,
+ 0x85, 0xc6, 0x76, 0x3d, 0x5f, 0xda, 0x57, 0xbe, 0xb0, 0xfb, 0xfd, 0x3d,
+ 0x89, 0xca, 0xda, 0xbd, 0x6a, 0x8e, 0x2f, 0xbe, 0x78, 0xae, 0x03, 0xbe,
+ 0x3c, 0xa5, 0x5b, 0xbd, 0xcf, 0xf5, 0x8b, 0x3c, 0xc5, 0x2e, 0x5b, 0x3c,
+ 0x2a, 0x05, 0x39, 0xbe, 0x18, 0x13, 0x10, 0x3e, 0xcd, 0x0f, 0xb4, 0xbd,
+ 0xa6, 0xea, 0x16, 0x3e, 0xb8, 0xab, 0xf5, 0x3d, 0x4a, 0x62, 0xeb, 0xbd,
+ 0x83, 0x34, 0x8b, 0x3e, 0x2b, 0x0e, 0x3a, 0x3e, 0x76, 0x0f, 0xc2, 0xbd,
+ 0x4d, 0x38, 0x12, 0x3d, 0x16, 0xdb, 0x44, 0x3d, 0x6e, 0xf6, 0x29, 0xbb,
+ 0x17, 0x2a, 0x75, 0xbb, 0x29, 0x62, 0x37, 0x3e, 0x71, 0x1e, 0x93, 0xbc,
+ 0xd6, 0x46, 0xe7, 0x3b, 0xd9, 0x20, 0x27, 0xbd, 0xd6, 0x0e, 0x87, 0x3c,
+ 0xbf, 0x84, 0xea, 0x3d, 0xd2, 0x97, 0xb9, 0xbd, 0x49, 0x13, 0x8a, 0x3d,
+ 0xa9, 0x32, 0x93, 0x3d, 0x9c, 0x92, 0x79, 0x3b, 0xa2, 0x52, 0xbd, 0xbc,
+ 0x9e, 0x67, 0xb1, 0x3b, 0xac, 0x11, 0x26, 0xbd, 0xcd, 0xf2, 0x6e, 0xbe,
+ 0x25, 0x79, 0x74, 0x3e, 0x0e, 0xaa, 0xba, 0x3d, 0xb1, 0x6b, 0x4b, 0xbd,
+ 0x0b, 0x2d, 0xc9, 0x3c, 0xcd, 0x08, 0x3d, 0xbd, 0xaf, 0x55, 0x1c, 0x3d,
+ 0xe6, 0x73, 0x90, 0xbc, 0xbc, 0xd9, 0xf3, 0xbc, 0xa5, 0x09, 0x85, 0x3e,
+ 0xeb, 0x39, 0xe7, 0x3d, 0x86, 0x17, 0x4f, 0x3d, 0xc4, 0xd6, 0x06, 0xbe,
+ 0x74, 0x57, 0xe8, 0xbd, 0x22, 0x81, 0x9a, 0x3d, 0xe6, 0xbb, 0xd7, 0x3c,
+ 0x0d, 0xbd, 0x33, 0xbe, 0x93, 0x83, 0xd5, 0x3d, 0xe1, 0xc5, 0xaa, 0x3d,
+ 0x22, 0xe9, 0xb1, 0xbd, 0x51, 0x78, 0x3e, 0xbe, 0x87, 0xbb, 0x92, 0x3d,
+ 0xd1, 0x08, 0xbd, 0x3d, 0x7e, 0x2c, 0x02, 0x3d, 0x7b, 0x99, 0xfa, 0xbd,
+ 0x07, 0x51, 0x08, 0x3c, 0x21, 0x42, 0x6a, 0x3d, 0x4c, 0x98, 0x99, 0xbd,
+ 0xf7, 0x80, 0x6d, 0xbe, 0x7d, 0x86, 0x41, 0xbe, 0x91, 0xd9, 0x88, 0xbd,
+ 0x08, 0x1b, 0xa8, 0x3d, 0x61, 0xf3, 0x14, 0xbe, 0xfd, 0xc3, 0x08, 0x3c,
+ 0x7b, 0x40, 0x29, 0xbe, 0xaf, 0x1f, 0xe4, 0xbd, 0x18, 0xac, 0x4f, 0x3e,
+ 0x1e, 0x7d, 0x6c, 0x3e, 0xe9, 0x4f, 0x3f, 0xbe, 0xb8, 0x34, 0xb5, 0x3d,
+ 0xfe, 0x4d, 0x02, 0xbe, 0xca, 0xd4, 0x8d, 0xbd, 0x67, 0x0d, 0x84, 0x3e,
+ 0x09, 0x45, 0x19, 0x3e, 0xd9, 0x06, 0x1e, 0xbe, 0xe6, 0xcd, 0x57, 0x3d,
+ 0x43, 0x2c, 0x55, 0xbe, 0xc2, 0xa0, 0xac, 0x3d, 0x5d, 0x22, 0x7a, 0x3d,
+ 0x38, 0xc1, 0xdc, 0xbd, 0xcc, 0x3d, 0xc6, 0x3b, 0x72, 0xd4, 0x0d, 0xbc,
+ 0x5e, 0x1f, 0x1f, 0xbe, 0xd1, 0xe1, 0x3d, 0xbd, 0x46, 0x0c, 0xc2, 0xbc,
+ 0x7c, 0x34, 0x12, 0x3d, 0xf7, 0x18, 0x9a, 0x3d, 0x7d, 0x0d, 0x37, 0xbd,
+ 0xe1, 0x90, 0x68, 0x3d, 0xf3, 0x4a, 0x5f, 0xbd, 0xda, 0x44, 0x08, 0x3e,
+ 0xe4, 0xd4, 0x19, 0x3d, 0x01, 0x0d, 0xf5, 0xbd, 0x6f, 0x03, 0x46, 0xbe,
+ 0xf8, 0x34, 0xd6, 0xbc, 0xe7, 0x8a, 0x94, 0x3d, 0xe3, 0x31, 0x98, 0xbc,
+ 0xa8, 0xb3, 0x4d, 0x3e, 0x8a, 0x63, 0xf0, 0x3d, 0x96, 0x3f, 0x3d, 0xbe,
+ 0xde, 0x60, 0x97, 0xbe, 0x73, 0xdd, 0x29, 0x3c, 0x71, 0x50, 0x69, 0xbe,
+ 0x39, 0x8a, 0x2c, 0xbd, 0x99, 0x2e, 0x68, 0xbe, 0x6e, 0x6f, 0x58, 0xbe,
+ 0xdd, 0xdb, 0xac, 0x3c, 0x09, 0x81, 0xfb, 0x3d, 0x72, 0x28, 0x11, 0x3c,
+ 0xba, 0xbf, 0xba, 0xbd, 0x99, 0xea, 0xab, 0xbe, 0x16, 0x4a, 0x99, 0xbd,
+ 0x36, 0x7c, 0x66, 0x3d, 0xa5, 0xab, 0x0f, 0xbe, 0x8e, 0xc9, 0xa9, 0xbd,
+ 0xc9, 0x86, 0xdd, 0x3e, 0xd8, 0xdc, 0x8a, 0xbe, 0x36, 0x30, 0x98, 0x3e,
+ 0x17, 0x1c, 0xcb, 0x3b, 0x06, 0xb8, 0xc3, 0xbd, 0x6f, 0x8f, 0x65, 0x3d,
+ 0xb3, 0xee, 0x39, 0x3e, 0x4d, 0xb7, 0x62, 0xbe, 0xb7, 0x5a, 0x6c, 0xbe,
+ 0x96, 0xfb, 0xd9, 0x3d, 0xcb, 0x5d, 0x0a, 0xbe, 0xfe, 0x38, 0x61, 0xbd,
+ 0x93, 0xae, 0x8f, 0x3d, 0xb8, 0x06, 0x77, 0xbe, 0x15, 0x56, 0x86, 0xbe,
+ 0x14, 0x09, 0xf2, 0x3e, 0x17, 0xf6, 0x8f, 0xbd, 0xbb, 0xc8, 0xb6, 0x3e,
+ 0x5e, 0x27, 0x59, 0xbd, 0x1c, 0xef, 0x59, 0xbd, 0x2e, 0xb1, 0x54, 0xbe,
+ 0x10, 0xd3, 0xd4, 0xbd, 0x81, 0xe9, 0x14, 0x3e, 0x66, 0x07, 0x89, 0x3e,
+ 0x76, 0xda, 0x53, 0xbe, 0xb9, 0x30, 0x9e, 0xbd, 0x37, 0xdb, 0x8b, 0x3c,
+ 0x39, 0x6c, 0x22, 0x3e, 0x55, 0x3e, 0xce, 0x3e, 0xa3, 0xb3, 0x5d, 0x3e,
+ 0xb0, 0xab, 0xc6, 0x3e, 0x69, 0x09, 0xb5, 0x3d, 0x95, 0x52, 0xcf, 0xb8,
+ 0xa3, 0x9b, 0x3b, 0xbd, 0x61, 0x69, 0xc3, 0xbd, 0x0a, 0x79, 0xef, 0x3e,
+ 0x78, 0x1e, 0x68, 0x3e, 0x21, 0xee, 0x08, 0x3e, 0xe8, 0xc7, 0xa9, 0x3e,
+ 0x03, 0x67, 0xa8, 0x3c, 0xad, 0x0d, 0x05, 0x3e, 0x7e, 0x68, 0x1a, 0xbd,
+ 0x12, 0x43, 0x32, 0xbe, 0x3f, 0xfb, 0xc1, 0x3e, 0x82, 0xe8, 0x98, 0xbe,
+ 0x11, 0x9e, 0x24, 0xbe, 0xc3, 0xb4, 0xfd, 0xbd, 0x5e, 0x54, 0x81, 0x3e,
+ 0x51, 0x1d, 0x50, 0x3e, 0x15, 0xcf, 0xbe, 0xbd, 0x86, 0x94, 0x0a, 0xbd,
+ 0x61, 0x49, 0x48, 0x3e, 0xaf, 0xf7, 0xb5, 0xbe, 0x3c, 0xb7, 0x82, 0x3e,
+ 0xbb, 0xb7, 0xac, 0x3e, 0x5e, 0xc1, 0x63, 0xbe, 0xcf, 0xc5, 0xb7, 0xbe,
+ 0x17, 0x65, 0x3a, 0x3e, 0xbb, 0xc3, 0x10, 0xbe, 0x78, 0xa3, 0xa8, 0x3e,
+ 0x57, 0x86, 0x2d, 0x3c, 0x8e, 0xad, 0xff, 0xbd, 0xbd, 0x38, 0x43, 0xbe,
+ 0xfa, 0xfc, 0x05, 0x3d, 0x4f, 0x30, 0xcf, 0xbc, 0x40, 0xd2, 0xe6, 0xbb,
+ 0x5d, 0x0b, 0xd5, 0xbe, 0x3c, 0xa9, 0xdc, 0xbd, 0x09, 0x0c, 0x3f, 0xbb,
+ 0x87, 0xec, 0x80, 0x3e, 0x03, 0x11, 0x86, 0x3d, 0x8c, 0x25, 0x61, 0xbc,
+ 0x56, 0x3a, 0xe1, 0x3d, 0xa3, 0xf5, 0x0e, 0xbd, 0x7d, 0x0e, 0xfa, 0xbd,
+ 0x48, 0x04, 0x81, 0xbe, 0x22, 0x72, 0x83, 0xbd, 0xc1, 0x26, 0xae, 0x3e,
+ 0xef, 0xe6, 0x9c, 0x3d, 0x3e, 0x43, 0xe8, 0x3c, 0x51, 0x4d, 0x04, 0xbe,
+ 0x9b, 0xed, 0x0c, 0x3f, 0x57, 0x4a, 0xf6, 0xbc, 0x12, 0x1d, 0x50, 0x3d,
+ 0x6a, 0xed, 0x1a, 0xbe, 0x25, 0x8a, 0x02, 0xbb, 0xd5, 0xc2, 0x54, 0xbe,
+ 0x80, 0x9a, 0x8e, 0x3e, 0xdd, 0x1a, 0x2b, 0x3e, 0x47, 0x94, 0xe4, 0xbe,
+ 0x2d, 0xfa, 0xcc, 0xbe, 0xb1, 0xb0, 0x59, 0x3e, 0x95, 0x7d, 0x17, 0x3e,
+ 0x36, 0xc6, 0x5c, 0xba, 0x50, 0xd5, 0xc9, 0xbd, 0x63, 0x50, 0x05, 0xbe,
+ 0x9b, 0x64, 0x97, 0xbd, 0xb2, 0xd8, 0x71, 0xbc, 0x65, 0x5c, 0xe5, 0xbd,
+ 0xb6, 0xef, 0xe3, 0x3c, 0x0c, 0x2e, 0x4d, 0x3d, 0x7c, 0x32, 0x35, 0xbe,
+ 0x56, 0x80, 0x18, 0xbe, 0x2d, 0x0b, 0x0d, 0x3e, 0x5a, 0x25, 0x50, 0x3e,
+ 0x19, 0x5c, 0x42, 0x3e, 0x6e, 0xc6, 0x38, 0xbe, 0x82, 0xd5, 0x79, 0x3c,
+ 0xbe, 0xdd, 0x05, 0xbe, 0xa5, 0xee, 0x3b, 0x3c, 0x3b, 0xb3, 0xa9, 0x3d,
+ 0x6a, 0x7c, 0xd4, 0x3d, 0x93, 0x94, 0x08, 0x3e, 0x21, 0xbf, 0xf0, 0xbd,
+ 0x8d, 0xce, 0x21, 0xbd, 0x71, 0xfe, 0xdf, 0xbc, 0xd3, 0xe9, 0xae, 0xbb,
+ 0x5f, 0x80, 0x91, 0x3e, 0xc5, 0xba, 0x79, 0xbd, 0xa8, 0x10, 0x0a, 0xbe,
+ 0x8e, 0x4c, 0xad, 0x3c, 0x15, 0xf5, 0xdc, 0xbd, 0x4b, 0xbf, 0x11, 0x3d,
+ 0x34, 0x39, 0xbc, 0xbb, 0x65, 0x20, 0xba, 0x3d, 0x83, 0x1d, 0xfa, 0xbc,
+ 0x78, 0x9b, 0x6c, 0x3b, 0x82, 0x25, 0x3a, 0xbe, 0x3d, 0xe3, 0x09, 0xbc,
+ 0x32, 0x0b, 0x2a, 0x3e, 0x90, 0x82, 0xbc, 0xbd, 0x72, 0x04, 0xf0, 0x3d,
+ 0xe5, 0x58, 0x0c, 0xbe, 0xec, 0xf3, 0x5d, 0x3e, 0x8c, 0xac, 0xf8, 0x3d,
+ 0x95, 0xea, 0xbc, 0xbc, 0xb3, 0x9d, 0xf1, 0xbb, 0x25, 0x2f, 0x8f, 0x3d,
+ 0x24, 0x49, 0xb0, 0xbd, 0x2c, 0x15, 0xd2, 0x3d, 0xa4, 0xe3, 0xf5, 0xbd,
+ 0x70, 0xc5, 0xa4, 0xbd, 0x1c, 0x25, 0x33, 0xbe, 0xe7, 0xec, 0x62, 0xbd,
+ 0x03, 0x3f, 0xbf, 0x3c, 0xbf, 0x4a, 0x76, 0x3d, 0x14, 0x86, 0xcc, 0xbd,
+ 0x4a, 0xad, 0xdb, 0xbd, 0xdf, 0x4c, 0x9f, 0xbd, 0xd8, 0xdd, 0x3b, 0xbd,
+ 0xce, 0x10, 0xa9, 0x3c, 0xd0, 0x8e, 0x55, 0xba, 0x91, 0x83, 0x12, 0x3d,
+ 0x37, 0xe7, 0x1e, 0xbd, 0x83, 0x59, 0x94, 0x3e, 0xc5, 0x8d, 0x7f, 0xbd,
+ 0xbd, 0x91, 0x74, 0x3e, 0x43, 0x4c, 0x91, 0xbd, 0xec, 0xfc, 0xc5, 0x3c,
+ 0x88, 0x1f, 0x25, 0xbe, 0x73, 0x00, 0xa1, 0x3d, 0x1e, 0x5a, 0x42, 0xbd,
+ 0xe6, 0xbf, 0x23, 0x3e, 0x5e, 0x2c, 0xa1, 0x3d, 0x59, 0x02, 0xf7, 0xbd,
+ 0x84, 0x86, 0xbf, 0x3d, 0x7c, 0x65, 0x84, 0x3d, 0x03, 0x0d, 0xbc, 0xbd,
+ 0x29, 0xec, 0x09, 0x3d, 0x5a, 0x65, 0x76, 0xbd, 0x8d, 0x81, 0xb4, 0xbd,
+ 0x3c, 0x0c, 0x59, 0x3d, 0xf7, 0x14, 0x4a, 0x3e, 0xd5, 0x41, 0xdc, 0xbd,
+ 0x5d, 0x0c, 0x27, 0x3e, 0x11, 0xf2, 0xf3, 0x3d, 0x55, 0xc9, 0x3a, 0x3e,
+ 0xef, 0xbe, 0x07, 0x3d, 0xd3, 0x7a, 0x7b, 0xbc, 0x38, 0xbb, 0x7b, 0xbd,
+ 0xc3, 0xfb, 0xba, 0x3d, 0x91, 0xb0, 0x37, 0x3d, 0x91, 0x63, 0x8c, 0xbd,
+ 0x73, 0x06, 0x50, 0x3c, 0xdd, 0x33, 0x9b, 0xbc, 0xf5, 0x62, 0x88, 0x3d,
+ 0xdb, 0xc0, 0x19, 0xbe, 0x33, 0x57, 0x37, 0x3e, 0xec, 0xe4, 0x53, 0x3d,
+ 0xa0, 0x08, 0x01, 0xbe, 0x4b, 0x36, 0x1d, 0xbe, 0xd6, 0xfa, 0x96, 0x3c,
+ 0xe3, 0xb7, 0x9c, 0x3d, 0x60, 0x78, 0xf8, 0xbc, 0x55, 0xa4, 0x15, 0x3c,
+ 0xc5, 0x7f, 0x95, 0x3d, 0x28, 0xf5, 0x24, 0x3d, 0x81, 0x1c, 0xab, 0xbd,
+ 0xaa, 0x82, 0xa2, 0x3d, 0x6e, 0x5c, 0x04, 0x3e, 0xb7, 0xb1, 0xb1, 0xbd,
+ 0x29, 0x8a, 0x5d, 0x3d, 0xd8, 0x4b, 0x88, 0xbe, 0x73, 0x31, 0x3c, 0xbd,
+ 0xd0, 0xfc, 0x7e, 0xbd, 0x01, 0xd9, 0xe1, 0xbd, 0x7a, 0xec, 0x7f, 0x3d,
+ 0x18, 0x44, 0xcb, 0x3d, 0x78, 0x2e, 0xf7, 0xbd, 0x11, 0x92, 0xe1, 0x3d,
+ 0xc2, 0xc1, 0xfc, 0xbc, 0x50, 0x5c, 0xd7, 0xbd, 0x2b, 0xff, 0x01, 0xbd,
+ 0x75, 0x69, 0xe0, 0xbd, 0x49, 0x99, 0x96, 0x3d, 0xdd, 0x1f, 0x6e, 0xbe,
+ 0x9e, 0xb0, 0x9c, 0xbc, 0xee, 0xe5, 0x3b, 0xbe, 0x88, 0x61, 0x91, 0xbd,
+ 0x27, 0x9e, 0xb2, 0xbd, 0xb1, 0x9d, 0x1f, 0x3d, 0x7f, 0xf9, 0x8e, 0x3c,
+ 0x64, 0x23, 0x2f, 0x3e, 0x88, 0x32, 0x0c, 0xbe, 0x66, 0x2d, 0x2e, 0xbe,
+ 0xe7, 0x9b, 0x5a, 0xbd, 0x6b, 0x46, 0xd1, 0xbd, 0x8d, 0xf7, 0xb7, 0xbd,
+ 0xd9, 0x36, 0xc5, 0xbd, 0x5e, 0x95, 0xe2, 0xbd, 0xb8, 0x78, 0x22, 0xbd,
+ 0xd8, 0x3c, 0x32, 0xbe, 0x9d, 0x36, 0xea, 0xbd, 0x8a, 0xdb, 0x31, 0xbe,
+ 0x7a, 0x4c, 0x2c, 0xbe, 0x26, 0x68, 0x15, 0x3e, 0x89, 0xd9, 0x12, 0x3e,
+ 0x5b, 0x18, 0xaf, 0xbc, 0x5a, 0x04, 0xaa, 0x3c, 0x60, 0x62, 0x46, 0x3c,
+ 0x68, 0xcb, 0x85, 0x3c, 0x17, 0x76, 0xb0, 0x3b, 0xd3, 0x8e, 0x76, 0x3d,
+ 0x1e, 0x7a, 0xa3, 0x3d, 0x3b, 0x30, 0xc8, 0xbd, 0x37, 0x73, 0x9a, 0xbe,
+ 0x34, 0xc2, 0x8f, 0x3d, 0x85, 0x71, 0xee, 0x3d, 0xcf, 0x51, 0xcc, 0x3b,
+ 0xda, 0xe2, 0xdd, 0xbb, 0x89, 0x57, 0x8d, 0x3d, 0x91, 0x04, 0x8d, 0x3d,
+ 0x50, 0xd3, 0x49, 0xbe, 0x4d, 0x1a, 0x1f, 0x3e, 0x7f, 0xc9, 0x40, 0xbe,
+ 0x47, 0x98, 0x1f, 0x3d, 0xa4, 0xa9, 0xdc, 0x3d, 0x68, 0x7f, 0x9a, 0xbd,
+ 0xc9, 0xe8, 0x0c, 0xbe, 0x1d, 0x6e, 0x08, 0xbe, 0xf0, 0xa1, 0xde, 0xbb,
+ 0x92, 0xdf, 0x24, 0x3e, 0x18, 0x37, 0xc9, 0xbd, 0x3f, 0x61, 0x69, 0xbd,
+ 0x29, 0x62, 0x30, 0x3e, 0xcc, 0xc8, 0xc7, 0x3b, 0xe2, 0x79, 0x07, 0x3e,
+ 0xf0, 0xc5, 0xa4, 0x3d, 0x27, 0x6f, 0x69, 0xbd, 0x74, 0x55, 0x59, 0xbc,
+ 0xa6, 0x3f, 0x29, 0x3e, 0x99, 0x0a, 0xaf, 0x3d, 0x48, 0xb4, 0x10, 0xbe,
+ 0x3f, 0x70, 0xeb, 0xbd, 0x3c, 0xb5, 0x03, 0xba, 0x91, 0xdd, 0xfe, 0xbc,
+ 0x27, 0xab, 0x6b, 0xbe, 0xfc, 0x05, 0x5c, 0xbd, 0xda, 0x00, 0xbb, 0x3d,
+ 0x44, 0xf8, 0x81, 0x3d, 0xf8, 0x6a, 0x93, 0xbd, 0x75, 0x11, 0x7b, 0x3d,
+ 0x06, 0x46, 0x11, 0xbe, 0x69, 0xff, 0x0c, 0x3d, 0x27, 0x6d, 0x03, 0x3e,
+ 0x22, 0x8e, 0xb7, 0xbd, 0x41, 0xf4, 0x97, 0x3d, 0x95, 0x72, 0xb0, 0x3d,
+ 0x3d, 0x71, 0xd7, 0x3d, 0xe6, 0x61, 0xf3, 0xbc, 0xe7, 0xba, 0xb0, 0x3d,
+ 0x8c, 0x9d, 0x42, 0xba, 0x14, 0x47, 0x34, 0xbe, 0xd6, 0x17, 0xed, 0xbd,
+ 0x31, 0x8c, 0x07, 0x3e, 0x36, 0xb1, 0x34, 0x3d, 0xa5, 0x5b, 0x0b, 0x3e,
+ 0xdc, 0x00, 0xe9, 0xbd, 0x24, 0x95, 0x02, 0x3d, 0xb3, 0x82, 0x72, 0xbe,
+ 0x83, 0xa7, 0xc9, 0x3d, 0xe1, 0x0d, 0x53, 0xbd, 0x82, 0x3a, 0x37, 0x3e,
+ 0x36, 0x6e, 0x0b, 0xbe, 0x4c, 0xbf, 0x62, 0xbd, 0xe4, 0xa4, 0x79, 0x3d,
+ 0xcf, 0x79, 0x79, 0x3d, 0xc0, 0x21, 0x11, 0xbe, 0x84, 0xc4, 0xa9, 0xbd,
+ 0xb3, 0x2a, 0xfb, 0xbc, 0x86, 0xf3, 0x17, 0xbd, 0xc5, 0xc3, 0x08, 0x3e,
+ 0x1f, 0xff, 0x61, 0xbe, 0xc1, 0x03, 0x30, 0x3e, 0x9a, 0x0c, 0x06, 0x3d,
+ 0x55, 0x4e, 0x9e, 0xbc, 0x38, 0x0a, 0x7b, 0xbd, 0x0c, 0xed, 0xd2, 0x3d,
+ 0x47, 0x0c, 0x93, 0xbd, 0xdf, 0x46, 0xfb, 0x3d, 0x03, 0x92, 0x2e, 0xbe,
+ 0x19, 0x31, 0xc3, 0x3c, 0x43, 0xf8, 0x9f, 0xbe, 0x6e, 0x51, 0x15, 0x3d,
+ 0xbf, 0xde, 0x1d, 0xbe, 0x6c, 0xe7, 0x2c, 0xbe, 0xe1, 0x81, 0xf6, 0xbd,
}};
-const int32_t dnn_hiddenlayer_2_bias_part_0_shape[1] = {132};
+const int32_t dnn_hiddenlayer_2_bias_part_0_shape[1] = {59};
const union {
- uint8_t bytes[528];
- float values[132];
+ uint8_t bytes[236];
+ float values[59];
} dnn_hiddenlayer_2_bias_part_0 = {{
- 0x86, 0x3d, 0x06, 0xbf, 0x80, 0x17, 0xaf, 0xbe, 0x29, 0xd2, 0x0c, 0xc0,
- 0x67, 0x20, 0x9c, 0xbf, 0x5e, 0x45, 0xd0, 0x3c, 0xbb, 0xff, 0x00, 0x3e,
- 0xfa, 0xa8, 0x6c, 0xbe, 0x5a, 0x61, 0xa9, 0xbe, 0xff, 0x7a, 0xd2, 0xbe,
- 0x6a, 0x84, 0xd4, 0xbd, 0x79, 0xe7, 0x6b, 0xbe, 0xb8, 0xd4, 0xb9, 0x3e,
- 0x4b, 0xb4, 0xb6, 0x3c, 0x6e, 0x9c, 0x8e, 0xbe, 0xc0, 0x23, 0x7a, 0xbe,
- 0xf5, 0x4e, 0x91, 0xbe, 0xea, 0x54, 0xee, 0xbe, 0x74, 0xf5, 0x67, 0xbe,
- 0x8e, 0xf4, 0x4c, 0xbf, 0x43, 0xb2, 0x06, 0xbf, 0x2b, 0x8e, 0xac, 0x3e,
- 0x8d, 0x5f, 0xb7, 0xbf, 0x17, 0xa4, 0x76, 0xbf, 0x3c, 0x46, 0x81, 0xbe,
- 0x7e, 0x27, 0x93, 0x3f, 0x55, 0x55, 0x59, 0xbe, 0x55, 0x88, 0xd8, 0xbd,
- 0xd6, 0xb1, 0xfd, 0x3e, 0xf8, 0xbf, 0xae, 0xbe, 0x17, 0xc0, 0x43, 0xbf,
- 0x03, 0xac, 0xc1, 0xbe, 0xe8, 0x70, 0x41, 0xbe, 0xaf, 0x41, 0x3a, 0xbe,
- 0x65, 0xcc, 0x91, 0xbd, 0xec, 0x89, 0xc8, 0x3e, 0x71, 0x7f, 0xb4, 0xbe,
- 0x5d, 0xc5, 0x8b, 0x3e, 0x55, 0xc2, 0x26, 0xbe, 0x28, 0xc9, 0xbf, 0xbd,
- 0xf6, 0x9b, 0x07, 0x3e, 0x31, 0x33, 0x01, 0xbe, 0xa2, 0x9f, 0x07, 0x3f,
- 0x94, 0xeb, 0x57, 0xbf, 0xa1, 0x77, 0xd7, 0xbe, 0x6e, 0x1f, 0xc0, 0xbe,
- 0xcd, 0xf6, 0xcb, 0xbf, 0x57, 0xfb, 0x03, 0xbf, 0xb5, 0x66, 0xec, 0xbd,
- 0xbb, 0xa8, 0xac, 0x3d, 0x8e, 0xc7, 0x7d, 0xbe, 0x71, 0x56, 0xb5, 0x3d,
- 0x74, 0x28, 0x81, 0xbb, 0x85, 0x27, 0x58, 0x3e, 0x83, 0x92, 0x99, 0xbe,
- 0x9c, 0xed, 0xb1, 0x3e, 0xfa, 0x24, 0xa1, 0x3d, 0x1d, 0x11, 0xa6, 0xbd,
- 0x41, 0xb8, 0x87, 0xbe, 0x8b, 0xdc, 0x67, 0x3f, 0xc0, 0x50, 0x29, 0x3f,
- 0xaa, 0x31, 0x97, 0x3e, 0xfd, 0xc1, 0xbd, 0xbd, 0x31, 0xcf, 0xad, 0xbe,
- 0xc2, 0xd9, 0xb6, 0xbd, 0x59, 0xbc, 0x0c, 0x3e, 0x85, 0xa2, 0x7d, 0xbe,
- 0x14, 0x03, 0x38, 0x3d, 0xe0, 0x84, 0x63, 0xbd, 0xa2, 0xdd, 0x23, 0x3f,
- 0xf4, 0x04, 0x28, 0xbf, 0x0e, 0xfa, 0x6d, 0xbd, 0xac, 0xde, 0x45, 0xbc,
- 0x91, 0x19, 0x83, 0xbe, 0x11, 0x00, 0x7a, 0xbe, 0xfc, 0x57, 0xd0, 0x3e,
- 0xbe, 0xbd, 0x66, 0xbe, 0x5f, 0xa4, 0x83, 0xbe, 0xa9, 0x66, 0xc8, 0xbe,
- 0xff, 0xdf, 0x64, 0xbc, 0x36, 0xf2, 0xb7, 0xbe, 0xe2, 0x3e, 0x0a, 0xbe,
- 0x51, 0x93, 0x97, 0xbe, 0xb9, 0xa2, 0x48, 0x3e, 0x39, 0x02, 0x83, 0xbd,
- 0x82, 0x0c, 0xf9, 0x3c, 0x9d, 0xcb, 0x8c, 0x3e, 0x3f, 0x02, 0x6e, 0xbe,
- 0x8e, 0x1e, 0xda, 0xbe, 0x9b, 0xd5, 0xed, 0xbe, 0x09, 0x58, 0x8e, 0x3e,
- 0x9f, 0xd0, 0x49, 0x3d, 0x60, 0xc1, 0x1e, 0xbe, 0xd7, 0x2a, 0xac, 0xbe,
- 0x8c, 0xac, 0x95, 0xbe, 0x3a, 0xf7, 0xc9, 0xbe, 0xe5, 0xf3, 0xae, 0xbd,
- 0xb2, 0x6c, 0xd8, 0xbd, 0x6f, 0xf6, 0x86, 0xbe, 0x3a, 0x41, 0x4b, 0x3f,
- 0x73, 0x4d, 0x30, 0xbe, 0x2b, 0x59, 0x93, 0xbe, 0xfe, 0xb1, 0x94, 0xbe,
- 0x71, 0x04, 0xf8, 0xbd, 0x4f, 0xf6, 0xa7, 0xbe, 0x93, 0x1c, 0x3b, 0x3e,
- 0x2c, 0x3f, 0x42, 0xbe, 0xad, 0xc5, 0xa2, 0xbe, 0xcd, 0xf6, 0x96, 0xbc,
- 0x95, 0x43, 0xd8, 0xbe, 0x57, 0x31, 0xf7, 0xbf, 0xbc, 0xb5, 0x83, 0xbe,
- 0x08, 0x50, 0x0a, 0x3e, 0x29, 0x68, 0xcd, 0xbe, 0x34, 0xab, 0xc6, 0x3d,
- 0x94, 0xde, 0x2b, 0x3d, 0x1e, 0x1c, 0x95, 0xbe, 0xe0, 0x19, 0x8d, 0xbe,
- 0x92, 0x45, 0x5d, 0xbe, 0x34, 0xcf, 0x31, 0xbf, 0x5c, 0xb2, 0xaa, 0x3e,
- 0x51, 0x91, 0xa6, 0xbe, 0x04, 0x21, 0x7a, 0xbd, 0x6a, 0xe7, 0x0d, 0xbe,
- 0xaa, 0x57, 0xcf, 0x3e, 0x12, 0x12, 0xf4, 0xbe, 0xf1, 0xf5, 0xcb, 0xbe,
- 0x9b, 0x46, 0x3c, 0xbf, 0x19, 0x9d, 0xf5, 0x3c, 0x52, 0x47, 0x5f, 0xbe,
- 0x24, 0x37, 0x67, 0xbe, 0x8b, 0x06, 0xf9, 0xbe, 0xf7, 0x46, 0x28, 0xbe,
+ 0x85, 0x26, 0x5f, 0x3e, 0x9a, 0x81, 0xe8, 0xbb, 0x23, 0x68, 0x92, 0xbe,
+ 0x5f, 0x0b, 0x17, 0x3e, 0x0d, 0xb2, 0x59, 0xbe, 0x1d, 0x74, 0x80, 0xbe,
+ 0x5a, 0x99, 0x73, 0x3c, 0xba, 0x61, 0x2c, 0xbe, 0x3b, 0x3f, 0xca, 0x3d,
+ 0x5f, 0x45, 0x32, 0x3e, 0x9b, 0x14, 0x07, 0x3e, 0xe3, 0x93, 0x36, 0x3e,
+ 0xc9, 0xae, 0x66, 0x3e, 0x63, 0x68, 0x2e, 0x3e, 0xb2, 0xc3, 0x1b, 0xbc,
+ 0xcc, 0xfd, 0x51, 0xbe, 0xb4, 0xd2, 0x2b, 0x3e, 0xb7, 0x6c, 0x5a, 0xbd,
+ 0x11, 0x52, 0x9e, 0x3b, 0x38, 0x19, 0x7a, 0xbc, 0x37, 0x74, 0x4f, 0xbe,
+ 0x77, 0x1f, 0xb0, 0xbd, 0x4e, 0xd9, 0xda, 0xbd, 0x93, 0xaa, 0x5a, 0xbd,
+ 0xdc, 0x43, 0x0f, 0x3e, 0x9a, 0x03, 0x32, 0x3d, 0xec, 0x5e, 0x9b, 0x3d,
+ 0x4f, 0x84, 0x24, 0xbe, 0x63, 0x0a, 0x26, 0x3e, 0x2c, 0x16, 0x33, 0x3e,
+ 0x95, 0x2f, 0x6e, 0xbe, 0x98, 0x1f, 0x3f, 0x3d, 0x02, 0x60, 0x05, 0x3e,
+ 0xeb, 0xc8, 0x24, 0x3d, 0x6e, 0xa8, 0x80, 0xbe, 0x52, 0xc5, 0x14, 0x3e,
+ 0xfe, 0x5f, 0xb2, 0xbe, 0xb0, 0xe2, 0x98, 0xbe, 0x0c, 0xe0, 0xde, 0xbc,
+ 0x62, 0x8f, 0xb2, 0xbd, 0x6c, 0x7f, 0x00, 0x3e, 0xe0, 0x77, 0x08, 0x3e,
+ 0x31, 0x4a, 0x25, 0xbe, 0xdd, 0x67, 0x60, 0xbe, 0xf8, 0x64, 0x73, 0x3d,
+ 0x21, 0xcd, 0x5a, 0xbe, 0x1b, 0x86, 0xf4, 0xbb, 0xd3, 0xb2, 0x29, 0xbe,
+ 0xe3, 0xde, 0x9e, 0xbc, 0x0f, 0x26, 0x7d, 0xbd, 0xfb, 0xcd, 0xfd, 0x3c,
+ 0xba, 0x72, 0x8f, 0xbe, 0xbb, 0xa8, 0x6e, 0x3d, 0xe6, 0x93, 0x80, 0xbd,
+ 0xa9, 0x99, 0x1a, 0xbe, 0xc5, 0x4f, 0x29, 0x3e, 0xd9, 0xd1, 0x06, 0x3e,
+ 0x87, 0x17, 0xc5, 0xbd, 0x42, 0x42, 0x9d, 0xbe,
}};
-const int32_t dnn_hiddenlayer_2_kernel_part_0_shape[2] = {123, 132};
+const int32_t dnn_hiddenlayer_2_kernel_part_0_shape[2] = {115, 59};
const union {
- uint8_t bytes[64944];
- float values[16236];
+ uint8_t bytes[27140];
+ float values[6785];
} dnn_hiddenlayer_2_kernel_part_0 = {{
- 0x39, 0xba, 0xd4, 0x3e, 0xf5, 0x80, 0xd4, 0x3d, 0x7f, 0x54, 0x86, 0xbc,
- 0xcf, 0x26, 0xfa, 0x3d, 0xa5, 0xfc, 0x77, 0x3d, 0x2f, 0x6b, 0x52, 0x3d,
- 0x62, 0x2c, 0x22, 0x3d, 0x40, 0x9c, 0xba, 0xbc, 0x57, 0xb6, 0x35, 0x3e,
- 0x34, 0x42, 0xe1, 0xbe, 0x17, 0x95, 0x0e, 0xbd, 0x84, 0x96, 0x4c, 0xbe,
- 0xde, 0x60, 0x27, 0x3e, 0x7e, 0xfd, 0x86, 0x3d, 0x64, 0x6e, 0x11, 0xbe,
- 0x5d, 0xa7, 0xb4, 0x3d, 0x94, 0x43, 0x96, 0x3e, 0x29, 0x01, 0xdd, 0xbd,
- 0x64, 0xd6, 0xa8, 0xbd, 0x31, 0xeb, 0x89, 0xbe, 0x03, 0x68, 0x98, 0x3d,
- 0x86, 0x69, 0xba, 0x3b, 0x92, 0x7c, 0xae, 0x3d, 0xd1, 0xd6, 0x49, 0xbd,
- 0xd6, 0xd2, 0x8f, 0xbe, 0x58, 0x1a, 0x66, 0x3d, 0x33, 0x17, 0xbf, 0xbd,
- 0x82, 0xf5, 0x43, 0xbd, 0xa4, 0xd6, 0x96, 0xbd, 0x1e, 0x47, 0x61, 0x3d,
- 0x1a, 0x1f, 0x0c, 0xbe, 0x76, 0xc7, 0xef, 0x3c, 0x76, 0x28, 0x57, 0x3c,
- 0x93, 0xe3, 0x81, 0x3e, 0x98, 0x3d, 0x59, 0x3e, 0xe4, 0xf1, 0x14, 0x3e,
- 0x11, 0xbf, 0x7d, 0x3e, 0x5e, 0x1d, 0x06, 0xbd, 0x07, 0x4d, 0xc3, 0x3c,
- 0xa7, 0x34, 0x9a, 0xbd, 0x7e, 0xf6, 0xe6, 0x3c, 0x97, 0x2c, 0xa5, 0xbc,
- 0xa2, 0xae, 0xe7, 0xbd, 0xe5, 0x25, 0x12, 0xbd, 0xad, 0x87, 0x11, 0x3d,
- 0xc5, 0xc2, 0xa0, 0xbd, 0xfa, 0x69, 0x5a, 0x3d, 0x3a, 0x56, 0x6f, 0x3d,
- 0x85, 0x09, 0x4f, 0xbd, 0x9b, 0xdb, 0x11, 0xbe, 0x28, 0x1f, 0x0e, 0xbe,
- 0x68, 0xd3, 0xb3, 0x3d, 0x0f, 0x1b, 0x4a, 0x3e, 0xab, 0xde, 0xef, 0xbd,
- 0x9b, 0x00, 0x6b, 0xbe, 0x92, 0xf5, 0x4f, 0xbc, 0x7d, 0xc8, 0x85, 0x3e,
- 0xe3, 0xb2, 0xdf, 0xbd, 0x1d, 0x47, 0x99, 0x3d, 0xfa, 0xf8, 0xf9, 0xbd,
- 0x3b, 0x10, 0x0d, 0xbe, 0x98, 0x44, 0xdc, 0xbd, 0x26, 0x8a, 0x8a, 0x3d,
- 0xc3, 0x79, 0x8a, 0x3d, 0x88, 0xcb, 0xfc, 0xbd, 0x44, 0x40, 0x7a, 0xbd,
- 0x9e, 0x12, 0x85, 0xbc, 0x57, 0x54, 0xd6, 0x3d, 0xd2, 0xd0, 0xc4, 0x3d,
- 0x43, 0x11, 0x17, 0xbd, 0x49, 0x71, 0xf4, 0xbd, 0x52, 0xc3, 0x76, 0xbb,
- 0xd4, 0x17, 0x2a, 0x3d, 0xda, 0x44, 0x02, 0x3d, 0x0f, 0xd3, 0x1b, 0x3e,
- 0x00, 0x1f, 0x7b, 0xbd, 0xf1, 0x7a, 0xa3, 0x3d, 0xfe, 0x7c, 0x2a, 0x3d,
- 0x9a, 0xe1, 0x4a, 0x3e, 0xc1, 0xb0, 0x68, 0xbd, 0x9e, 0xbd, 0xbe, 0xbd,
- 0xcf, 0x10, 0xef, 0xbc, 0x62, 0xd3, 0x97, 0x3c, 0xa7, 0x73, 0x34, 0x3e,
- 0x9e, 0xd6, 0x62, 0x3e, 0xb4, 0xf7, 0x9c, 0xbd, 0x24, 0xdd, 0x63, 0xbd,
- 0x04, 0x68, 0xb0, 0x3d, 0x16, 0xaf, 0x99, 0xbb, 0xde, 0xc5, 0x45, 0xbe,
- 0x71, 0x90, 0xe8, 0x3c, 0x84, 0xcf, 0xc6, 0xbd, 0x3e, 0xc7, 0x3d, 0x3c,
- 0x80, 0x79, 0xea, 0xbd, 0xe8, 0xa8, 0x72, 0xbd, 0x71, 0x85, 0x85, 0x3d,
- 0xfb, 0x8f, 0xb5, 0xbc, 0x8b, 0x2c, 0x17, 0xbe, 0xfe, 0x22, 0xec, 0xbd,
- 0x53, 0x69, 0x43, 0xbd, 0x9d, 0x3e, 0x0b, 0xbe, 0xb4, 0xfd, 0xa2, 0xbb,
- 0x77, 0xab, 0xd6, 0xbd, 0xa7, 0x40, 0x31, 0x3e, 0xad, 0xd6, 0xa5, 0xbe,
- 0x94, 0x62, 0x6b, 0xbe, 0x59, 0x54, 0xf7, 0x3c, 0xdc, 0x13, 0xc3, 0x3d,
- 0xeb, 0xcb, 0xed, 0xbc, 0x3a, 0x41, 0x26, 0x3e, 0xe1, 0x39, 0x28, 0x3d,
- 0x7d, 0x2f, 0xb6, 0xbe, 0x2e, 0x14, 0x1d, 0x3d, 0xcb, 0xe3, 0x9c, 0xbe,
- 0xa1, 0xc5, 0x8b, 0x3d, 0xfc, 0xc2, 0x89, 0x3d, 0x29, 0x2e, 0x51, 0x3d,
- 0x89, 0xb6, 0x40, 0xbd, 0xdd, 0xcf, 0x73, 0x3e, 0x12, 0xd2, 0xc0, 0xbe,
- 0x7c, 0xf0, 0xba, 0xbd, 0xc3, 0xfc, 0x72, 0xbb, 0x30, 0x92, 0xc3, 0xbc,
- 0x9f, 0x31, 0x58, 0xbe, 0xc7, 0x2f, 0xd4, 0xbd, 0x1f, 0x04, 0x1c, 0xbd,
- 0x06, 0x39, 0xcc, 0xbd, 0xc1, 0xce, 0xcd, 0xbd, 0xa3, 0x3b, 0xfb, 0xbc,
- 0x97, 0xb6, 0x1d, 0xbe, 0x99, 0x6b, 0xaa, 0xbc, 0x0e, 0x54, 0x5b, 0x3e,
- 0x0c, 0xd7, 0x44, 0xbd, 0x5b, 0xf6, 0xc4, 0x3c, 0x7e, 0x09, 0xb5, 0xbd,
- 0xc5, 0x82, 0xa9, 0xbe, 0x67, 0xc2, 0x16, 0xbe, 0x16, 0x5a, 0x74, 0xbe,
- 0x6b, 0x26, 0x0c, 0x3e, 0x8d, 0xfb, 0x81, 0x3e, 0x33, 0xb8, 0x59, 0xbd,
- 0x70, 0xac, 0xa9, 0x3e, 0x2c, 0x8f, 0x90, 0xbd, 0x14, 0x53, 0xd5, 0x3c,
- 0xf8, 0xdf, 0xec, 0x3d, 0x62, 0xbb, 0x2e, 0x3c, 0x69, 0xd3, 0x50, 0xbb,
- 0x56, 0x8e, 0x89, 0xbd, 0xf2, 0x89, 0x0f, 0x3d, 0xbc, 0xe4, 0xc6, 0x3c,
- 0x4f, 0x26, 0xc1, 0xbd, 0xb6, 0x4e, 0x2d, 0xbe, 0x3f, 0xa6, 0xa1, 0xbe,
- 0x4c, 0x1a, 0xd7, 0xbe, 0xaa, 0xcd, 0x53, 0x3e, 0x83, 0x1b, 0x3d, 0x3e,
- 0x64, 0x0e, 0x60, 0xbe, 0x11, 0x00, 0x31, 0x3c, 0xb3, 0x45, 0x27, 0x3e,
- 0x71, 0xbb, 0xf3, 0x3c, 0x3e, 0x43, 0x85, 0xbd, 0xb3, 0xa6, 0x57, 0x3e,
- 0x34, 0x2c, 0xb0, 0xbd, 0xbc, 0x08, 0x82, 0xbd, 0x92, 0x51, 0xfa, 0xbd,
- 0x24, 0xf9, 0xa3, 0x3c, 0xd4, 0x03, 0x4c, 0xbe, 0xa6, 0x7f, 0xc5, 0xbe,
- 0x4b, 0x10, 0x74, 0x3e, 0xc4, 0xed, 0x50, 0xbe, 0xc2, 0x56, 0x0b, 0x3e,
- 0xe1, 0x18, 0x24, 0xbd, 0x3c, 0x77, 0x17, 0xbe, 0x53, 0xce, 0x23, 0xbd,
- 0xca, 0xcf, 0x09, 0xbe, 0x05, 0xae, 0x33, 0xbe, 0x42, 0xb9, 0xbb, 0xbe,
- 0x8f, 0xce, 0x1a, 0x3d, 0x89, 0x37, 0x04, 0x3e, 0x15, 0x21, 0x02, 0x3e,
- 0x33, 0xf5, 0xf5, 0xbd, 0xf7, 0x76, 0x55, 0x3d, 0x1d, 0x10, 0xbb, 0x3e,
- 0xb7, 0xc7, 0x14, 0xbe, 0xae, 0x7a, 0x86, 0xbd, 0x3d, 0xb1, 0x05, 0xbe,
- 0x8e, 0xbf, 0xcd, 0x3d, 0x0b, 0xfb, 0x99, 0xbd, 0x96, 0xda, 0x40, 0x3e,
- 0x6e, 0xb4, 0xea, 0x3d, 0x48, 0xce, 0xe8, 0x3d, 0x4c, 0x35, 0xfa, 0x3d,
- 0xef, 0xef, 0x30, 0xbd, 0xef, 0x7f, 0x81, 0xbe, 0x1f, 0xfd, 0x69, 0xbd,
- 0x16, 0x13, 0x54, 0x3d, 0xd9, 0x48, 0xba, 0xbd, 0x9c, 0x13, 0x3c, 0xbe,
- 0xdb, 0x10, 0x5e, 0xbe, 0xde, 0xa6, 0x01, 0x3e, 0xc7, 0x18, 0x24, 0x3e,
- 0xb7, 0xab, 0x9e, 0x3d, 0xf8, 0xd2, 0xc4, 0xbe, 0xba, 0xef, 0x5c, 0x3c,
- 0x3a, 0x9c, 0x05, 0x3c, 0x9f, 0x27, 0x32, 0xbe, 0x40, 0x7e, 0x47, 0x3d,
- 0x3f, 0x56, 0x43, 0xbd, 0x50, 0x8c, 0x37, 0xbe, 0x96, 0x92, 0x6e, 0x3e,
- 0xac, 0x9a, 0xcf, 0x3e, 0x02, 0x93, 0x0e, 0xbe, 0xea, 0x89, 0xa7, 0x3d,
- 0xad, 0x5e, 0xe7, 0x3d, 0xd2, 0xf0, 0x4f, 0x3e, 0x75, 0x0f, 0xdc, 0xbd,
- 0x79, 0xac, 0xb6, 0xbe, 0xa0, 0x32, 0xf3, 0xbd, 0x99, 0x4e, 0x7b, 0x3e,
- 0x57, 0xd4, 0xd3, 0x3c, 0x5f, 0xfe, 0xd6, 0xbd, 0x7c, 0x60, 0x1c, 0x3e,
- 0xc2, 0xee, 0x1d, 0x3c, 0xfc, 0xe1, 0xad, 0xbc, 0x13, 0x61, 0xf4, 0xbd,
- 0x5f, 0x64, 0x9f, 0x3d, 0x60, 0xae, 0xde, 0x3e, 0xeb, 0xb5, 0x21, 0x3e,
- 0xcf, 0xb5, 0x25, 0x3c, 0x1c, 0x11, 0x5a, 0xbd, 0xef, 0xfc, 0xde, 0x3d,
- 0x3a, 0xec, 0xdf, 0xbc, 0xd0, 0x9b, 0x6e, 0xbe, 0xc9, 0x18, 0x39, 0x3d,
- 0x59, 0xce, 0xf9, 0xbe, 0x28, 0xae, 0xc7, 0x3d, 0x90, 0xd5, 0xcd, 0xbc,
- 0x52, 0xc9, 0xad, 0xbd, 0x29, 0x17, 0x87, 0xbd, 0x5e, 0x52, 0x02, 0x3e,
- 0xb7, 0x60, 0x36, 0x3e, 0xde, 0xde, 0xbf, 0xbe, 0x8b, 0x4c, 0xe2, 0x3d,
- 0xb0, 0x15, 0x13, 0xbd, 0x41, 0x4a, 0x04, 0xbe, 0xac, 0xf7, 0x34, 0xbe,
- 0x91, 0x7a, 0x5e, 0x3e, 0x17, 0x9d, 0xf7, 0xbd, 0x0e, 0xa5, 0xc2, 0x3d,
- 0x02, 0xe5, 0xb2, 0xbd, 0x82, 0x5f, 0x97, 0x3e, 0x6c, 0x3f, 0x0d, 0xbd,
- 0x3e, 0x9d, 0xeb, 0xbe, 0x49, 0x33, 0x58, 0xbe, 0x3f, 0x7c, 0x63, 0xbd,
- 0x36, 0x73, 0x07, 0x3e, 0xb9, 0x62, 0xa6, 0xbd, 0xfb, 0x04, 0xc2, 0x3e,
- 0x51, 0xae, 0x31, 0x3e, 0xf5, 0xc8, 0xfb, 0x3c, 0x75, 0x9c, 0xea, 0xbd,
- 0xe6, 0x1d, 0x66, 0xbe, 0xc4, 0xa4, 0x72, 0xbd, 0xd3, 0x95, 0x69, 0x3d,
- 0x2d, 0x75, 0x91, 0x3d, 0xd7, 0x7a, 0x52, 0x3d, 0x2b, 0xd8, 0xcc, 0x3d,
- 0x59, 0xa8, 0xf6, 0xbd, 0x16, 0xc3, 0x16, 0x3d, 0x7c, 0x21, 0xae, 0xbc,
- 0x16, 0xb2, 0x97, 0x3e, 0x9d, 0x64, 0x39, 0xbe, 0x4f, 0xd8, 0x09, 0xbe,
- 0xb9, 0xb3, 0x99, 0xbd, 0x8f, 0x74, 0x53, 0xbd, 0xa2, 0xec, 0x43, 0x3c,
- 0xc9, 0x14, 0xaf, 0xbe, 0x1b, 0x13, 0xb0, 0x3b, 0x81, 0xfd, 0x98, 0xbd,
- 0x8e, 0x01, 0x81, 0x3d, 0x4b, 0xb6, 0xd8, 0x3d, 0x0d, 0xb8, 0x5b, 0x3d,
- 0x94, 0x04, 0x53, 0x3e, 0x78, 0x2d, 0xf5, 0xbd, 0x26, 0xba, 0x91, 0xbe,
- 0x3d, 0x96, 0xfc, 0x3d, 0x1e, 0x53, 0x83, 0xbd, 0x5e, 0x06, 0x87, 0xbc,
- 0x42, 0x91, 0x0e, 0xbe, 0x00, 0xd4, 0xf4, 0x3d, 0x42, 0x42, 0x22, 0x3e,
- 0x77, 0x34, 0xc4, 0xbd, 0x13, 0x9d, 0xbc, 0xbd, 0x3b, 0xc5, 0x46, 0xbd,
- 0x3b, 0x93, 0x37, 0x3d, 0xfc, 0xc7, 0xf9, 0xbc, 0x2e, 0x45, 0x0d, 0x3e,
- 0xc9, 0x09, 0xbe, 0x3d, 0xe4, 0x00, 0xc0, 0x3c, 0xad, 0x98, 0x1b, 0x3d,
- 0x5d, 0x94, 0x0d, 0x3e, 0x5c, 0xd4, 0xbf, 0xbd, 0x9f, 0x82, 0x3e, 0x3e,
- 0xee, 0x52, 0x1a, 0x3d, 0xfc, 0xf9, 0xaa, 0x3d, 0x2a, 0x6c, 0xbe, 0x3d,
- 0x70, 0xb8, 0x0d, 0x3d, 0xbe, 0xc6, 0x21, 0xbe, 0x9c, 0x3b, 0xf0, 0xbc,
- 0xac, 0xe7, 0x4c, 0xbe, 0x27, 0xdc, 0x69, 0xbc, 0xdc, 0xfd, 0x35, 0xbe,
- 0xf6, 0xe3, 0xd5, 0xbc, 0x28, 0xee, 0x28, 0xbe, 0x0f, 0x1a, 0x17, 0xbd,
- 0xbb, 0xbe, 0xd1, 0x3c, 0xcf, 0x38, 0x08, 0xbe, 0xc1, 0xc1, 0x31, 0xbe,
- 0xe0, 0x22, 0x36, 0xbd, 0x52, 0xb2, 0xfd, 0xbd, 0x6e, 0x9a, 0x1d, 0x3d,
- 0x8c, 0x5c, 0xae, 0x3d, 0x2e, 0xa0, 0x73, 0xbe, 0x83, 0x55, 0x3f, 0x3e,
- 0xbd, 0xd2, 0xb3, 0x3d, 0x3b, 0xce, 0x3b, 0xbd, 0xeb, 0x6e, 0x92, 0x3c,
- 0xbf, 0x5c, 0xb4, 0xbb, 0x61, 0x81, 0x33, 0x3d, 0x08, 0x52, 0xed, 0xbc,
- 0xe5, 0x87, 0x14, 0x3e, 0x21, 0x41, 0x25, 0x3d, 0xe2, 0xab, 0x17, 0x3e,
- 0xfc, 0xe7, 0x70, 0x3d, 0x36, 0x46, 0xd0, 0x3d, 0x87, 0x63, 0x33, 0x3e,
- 0x72, 0xbb, 0xa8, 0xbc, 0xa7, 0x5b, 0x98, 0xbd, 0x4c, 0xee, 0x91, 0xbc,
- 0x51, 0x05, 0x15, 0xbd, 0xf3, 0x29, 0x8c, 0x3d, 0x06, 0x2d, 0xcc, 0xbd,
- 0xd3, 0x4a, 0x1c, 0xbe, 0x73, 0xae, 0xb8, 0x3d, 0xc3, 0xda, 0x05, 0x3e,
- 0xac, 0x1d, 0xcb, 0x3d, 0x8f, 0x4a, 0x6e, 0x3d, 0x1b, 0xef, 0x0d, 0xbe,
- 0xee, 0xd4, 0x94, 0x3d, 0x4a, 0x41, 0x03, 0xba, 0x32, 0x3f, 0xbe, 0xbd,
- 0x54, 0xdd, 0x1c, 0x3d, 0x10, 0x6a, 0x88, 0xbd, 0x4f, 0x73, 0x20, 0xbd,
- 0x9b, 0x48, 0x0f, 0x3e, 0xef, 0x82, 0x88, 0x3d, 0x57, 0xcf, 0x01, 0xbe,
- 0xf9, 0x93, 0x4c, 0xbd, 0x04, 0xc6, 0x36, 0x3d, 0xb5, 0x40, 0xe4, 0x3d,
- 0x6b, 0x6b, 0x59, 0xbc, 0x7a, 0x71, 0x57, 0xbc, 0x53, 0x72, 0x89, 0xbd,
- 0xc7, 0x2b, 0x55, 0x3d, 0x90, 0x6d, 0x85, 0xbd, 0x2c, 0x16, 0x37, 0xbc,
- 0x9b, 0x1d, 0x38, 0xbe, 0x44, 0xd7, 0x0c, 0x3d, 0x48, 0x3b, 0xe9, 0x3d,
- 0xb0, 0x81, 0x03, 0xbd, 0xec, 0xc4, 0xcc, 0xbd, 0x53, 0xca, 0x9e, 0x3a,
- 0xb5, 0x48, 0x30, 0x3c, 0x15, 0x9f, 0xc9, 0x3d, 0xc9, 0x5d, 0x63, 0x3e,
- 0xb3, 0x90, 0x8e, 0x3b, 0xf9, 0x59, 0xb8, 0xbd, 0x1b, 0x63, 0x2c, 0xbd,
- 0x86, 0x36, 0x1c, 0x3e, 0x29, 0x26, 0x0d, 0xbd, 0x8d, 0xb0, 0x1b, 0x3d,
- 0x48, 0xc6, 0x18, 0xbd, 0x15, 0x90, 0x84, 0x3e, 0xb4, 0xb9, 0x03, 0xbe,
- 0xc8, 0xfe, 0xf6, 0x3d, 0x82, 0xf4, 0x43, 0xbd, 0x99, 0xa6, 0x97, 0xbd,
- 0x21, 0x13, 0x45, 0x3e, 0xe3, 0x63, 0xbb, 0x3d, 0x0f, 0x8a, 0x37, 0xbc,
- 0xc1, 0x82, 0xff, 0xbd, 0x05, 0xf4, 0x16, 0x3e, 0x7b, 0x64, 0xec, 0xbd,
- 0x98, 0xae, 0x73, 0x3c, 0x54, 0x40, 0xa7, 0xbd, 0x2e, 0xef, 0x31, 0xbb,
- 0x9f, 0xac, 0xaf, 0x3d, 0x85, 0x63, 0x15, 0x3e, 0xad, 0xdb, 0x91, 0xbd,
- 0x76, 0xe2, 0xf9, 0xbc, 0x1e, 0x7f, 0x8f, 0x3e, 0xdf, 0xe9, 0x4a, 0x3d,
- 0xf2, 0x28, 0x25, 0x3c, 0x25, 0x0c, 0x1c, 0x3e, 0x88, 0x6b, 0x91, 0xbd,
- 0x68, 0xe6, 0x30, 0xbe, 0xad, 0xc3, 0x02, 0x3e, 0x4f, 0xeb, 0xcb, 0xbd,
- 0xfe, 0xd7, 0x40, 0x3e, 0x01, 0x10, 0x63, 0x3b, 0x0d, 0x50, 0xdd, 0x3d,
- 0xa9, 0xa7, 0x01, 0xbe, 0x8f, 0x86, 0x26, 0x3e, 0x03, 0xba, 0x34, 0xbe,
- 0xae, 0x76, 0x29, 0xbd, 0x95, 0x4b, 0x03, 0x3e, 0x96, 0x16, 0xa4, 0xbc,
- 0x05, 0x35, 0xa7, 0xbd, 0xe8, 0xdf, 0xb2, 0x3e, 0xf9, 0x6f, 0x83, 0x3e,
- 0x67, 0x6f, 0x8e, 0xbe, 0x91, 0x4e, 0xe4, 0xbd, 0x96, 0x8a, 0x09, 0x3e,
- 0xc6, 0x06, 0x5e, 0xbe, 0x20, 0xa8, 0x7d, 0x3d, 0x1e, 0xdf, 0x6e, 0xbe,
- 0xac, 0x1a, 0x3d, 0xbe, 0xdf, 0xa5, 0xee, 0xbb, 0x6a, 0x0d, 0x20, 0xbe,
- 0x82, 0xd9, 0xc6, 0x3d, 0xd8, 0x1e, 0xcd, 0xbe, 0x25, 0x23, 0x8c, 0x3d,
- 0x74, 0xf9, 0x29, 0xbe, 0xe9, 0x47, 0x1b, 0xbe, 0x3a, 0xb7, 0x8a, 0x3d,
- 0x16, 0x89, 0xa0, 0xbb, 0x91, 0x05, 0xe0, 0xbe, 0x1e, 0xf4, 0xa0, 0xbd,
- 0xb1, 0x49, 0x73, 0x3e, 0x7c, 0x9a, 0x86, 0xbc, 0xf7, 0x77, 0x1a, 0xbe,
- 0x98, 0xf3, 0x6f, 0x3d, 0x67, 0x7e, 0x02, 0xbe, 0xfd, 0xeb, 0x70, 0xbd,
- 0xca, 0xfb, 0x94, 0x3d, 0x19, 0x66, 0x01, 0xbe, 0x0c, 0xbc, 0x14, 0x3e,
- 0x75, 0xe0, 0x83, 0x3d, 0x82, 0x7e, 0x0a, 0x3e, 0x2b, 0x2e, 0x69, 0xbe,
- 0x90, 0x8d, 0x42, 0x3e, 0xe0, 0x79, 0x48, 0xbe, 0x91, 0x95, 0xe5, 0xbd,
- 0x6c, 0x8c, 0x2e, 0xbd, 0x6a, 0x23, 0x91, 0xbe, 0xb0, 0x97, 0x99, 0xbd,
- 0xb6, 0x8b, 0x84, 0x3c, 0xcb, 0x59, 0x84, 0xbd, 0xc7, 0x7e, 0xce, 0xbd,
- 0x18, 0x26, 0x1f, 0x3e, 0x04, 0x18, 0x8a, 0xbe, 0x50, 0x88, 0xa7, 0xbe,
- 0x96, 0xf4, 0x80, 0x3d, 0x0d, 0x1c, 0x2e, 0x3e, 0x48, 0x98, 0xb2, 0xbd,
- 0xe5, 0xc1, 0xa4, 0x3b, 0x75, 0x75, 0x5a, 0xbe, 0x2b, 0x4b, 0x2b, 0xbe,
- 0xe5, 0x69, 0xf2, 0x3d, 0xa3, 0x53, 0x4c, 0x3c, 0x34, 0x72, 0xd8, 0x3d,
- 0xfe, 0x6f, 0x88, 0x3c, 0x84, 0x9a, 0x3c, 0xbc, 0x83, 0x11, 0x3e, 0xbe,
- 0x01, 0xf4, 0x96, 0x3d, 0xe3, 0xe7, 0xaf, 0x3d, 0x3d, 0xa5, 0x26, 0xbd,
- 0x48, 0xcb, 0xb3, 0xbe, 0x4a, 0x24, 0x05, 0x3c, 0x67, 0xc6, 0xc9, 0x3e,
- 0xd2, 0xac, 0x48, 0x3e, 0x02, 0x6e, 0xc4, 0x3e, 0x37, 0x49, 0x18, 0xbe,
- 0x0a, 0xfd, 0x46, 0xbe, 0x98, 0xaf, 0x6d, 0x3e, 0x00, 0x41, 0xa6, 0x3d,
- 0x38, 0xd3, 0x39, 0x3e, 0xb2, 0x34, 0xe0, 0xbd, 0xa3, 0x67, 0x10, 0xbe,
- 0x12, 0x11, 0x59, 0x3d, 0xef, 0x96, 0x8a, 0xbc, 0x9d, 0x4f, 0xe7, 0xbd,
- 0xd6, 0x95, 0x96, 0x3c, 0x92, 0x3f, 0x22, 0xbc, 0xa3, 0x2c, 0xbe, 0x3c,
- 0xe2, 0xed, 0x8c, 0x3c, 0xba, 0x87, 0x5d, 0x3c, 0x84, 0xa3, 0xe6, 0xbc,
- 0xb1, 0x5c, 0x25, 0x3e, 0x99, 0x67, 0xb6, 0x3d, 0x1f, 0x01, 0xe8, 0x3d,
- 0xa6, 0x1f, 0x0e, 0xbe, 0x69, 0x62, 0xe4, 0x3d, 0xf9, 0x86, 0x78, 0x3d,
- 0x17, 0x2c, 0xe5, 0x3c, 0x11, 0x45, 0x18, 0x3e, 0xad, 0xbb, 0xa3, 0x3d,
- 0xf1, 0x46, 0xc1, 0xbe, 0x42, 0x53, 0x84, 0xbe, 0x2f, 0xab, 0x19, 0xbc,
- 0xad, 0xec, 0x90, 0xbe, 0xee, 0xb5, 0xe6, 0x3d, 0xb3, 0x55, 0x4e, 0xbc,
- 0xd8, 0xb4, 0x38, 0x3e, 0xff, 0x9f, 0xaa, 0x3e, 0xf5, 0x88, 0x3c, 0xbf,
- 0xa0, 0x37, 0x9f, 0x3d, 0xb0, 0xcf, 0xb2, 0x3d, 0x05, 0x0e, 0x00, 0xbf,
- 0xdb, 0xbd, 0x84, 0x3e, 0xe5, 0x55, 0xbc, 0xbd, 0x0d, 0x5a, 0x10, 0x3d,
- 0xcb, 0xe2, 0x0f, 0x3d, 0x75, 0xce, 0x02, 0xbc, 0xa3, 0x0b, 0x85, 0xbe,
- 0x08, 0xb1, 0xc9, 0xbd, 0xd0, 0x12, 0xb0, 0x3d, 0xe3, 0x6c, 0x21, 0xbe,
- 0x9d, 0x57, 0x6b, 0x3d, 0x91, 0x20, 0x54, 0xbc, 0x3d, 0x3b, 0x8e, 0xbd,
- 0xc6, 0x8d, 0x4a, 0x3e, 0xf0, 0x89, 0xca, 0xbe, 0x6e, 0x62, 0x12, 0x3e,
- 0xb7, 0xe7, 0x3f, 0x3e, 0x86, 0xc0, 0xba, 0xbe, 0x7b, 0x56, 0x47, 0x3d,
- 0x7f, 0x1b, 0x1e, 0x3e, 0x0b, 0x28, 0xe3, 0xbd, 0xb8, 0x7b, 0xc4, 0x3b,
- 0xdf, 0xe7, 0xeb, 0xbd, 0x67, 0xca, 0x8e, 0xbd, 0xad, 0xa3, 0x15, 0xbe,
- 0x1f, 0x0b, 0x41, 0x3d, 0xc7, 0x8b, 0xe4, 0x3b, 0xa3, 0x60, 0x81, 0xbe,
- 0xce, 0xa8, 0x4c, 0xbd, 0x62, 0x92, 0xbf, 0xbd, 0x40, 0xa4, 0xbb, 0xbc,
- 0xa6, 0x46, 0x12, 0xbe, 0x4b, 0x04, 0x91, 0xbd, 0x03, 0xca, 0xab, 0x3d,
- 0x99, 0x2d, 0x69, 0xbe, 0x71, 0x93, 0x92, 0xbd, 0xa9, 0x6d, 0x00, 0xbe,
- 0x4d, 0x50, 0x30, 0xbe, 0xc4, 0x91, 0x80, 0xbe, 0x31, 0x9d, 0x54, 0xbe,
- 0xce, 0x8c, 0xf0, 0x3d, 0x3d, 0x1b, 0xe9, 0xbd, 0x7e, 0xe9, 0x5e, 0xbe,
- 0xd6, 0xe8, 0xaa, 0x3e, 0x77, 0x31, 0x42, 0x3e, 0xe1, 0x36, 0x5d, 0x3d,
- 0x3a, 0x34, 0x7c, 0xbd, 0x62, 0xe5, 0xb2, 0xbe, 0x38, 0xba, 0x0a, 0x3e,
- 0xb1, 0xbe, 0x21, 0xbe, 0xbc, 0xbb, 0xe4, 0x3d, 0x60, 0xa3, 0xb8, 0xbc,
- 0xa4, 0xb0, 0x08, 0x3b, 0x8c, 0xd6, 0x2b, 0x3e, 0xf9, 0x79, 0x69, 0x3d,
- 0xf9, 0xf5, 0xfb, 0xbd, 0x16, 0x9d, 0xff, 0x3d, 0x6a, 0x54, 0x5c, 0xbd,
- 0xe8, 0x33, 0x8e, 0xbd, 0xa8, 0xe7, 0x08, 0x3e, 0x24, 0x26, 0x9e, 0xbd,
- 0xaa, 0x26, 0x32, 0x3d, 0x5c, 0x12, 0xee, 0x3c, 0xb1, 0x9e, 0x10, 0xbe,
- 0x25, 0x88, 0x7a, 0xbe, 0xbb, 0xf6, 0x25, 0x3e, 0x93, 0x59, 0x4d, 0x3e,
- 0x60, 0x94, 0x9b, 0xbb, 0x07, 0x30, 0x79, 0xbe, 0x1e, 0xf8, 0x7c, 0x3d,
- 0x4a, 0xec, 0x07, 0xbe, 0xea, 0xf9, 0x36, 0xbe, 0x19, 0xb3, 0xb8, 0xbc,
- 0x2c, 0x99, 0x24, 0x3d, 0xa2, 0x05, 0x24, 0xbd, 0xb6, 0xc2, 0x8b, 0xbe,
- 0xb3, 0x64, 0x2e, 0xbe, 0x8a, 0xa5, 0x0f, 0xbc, 0x09, 0x72, 0x1d, 0x3c,
- 0x12, 0x37, 0x24, 0xbe, 0x30, 0x1e, 0x0c, 0x3d, 0x51, 0x06, 0x01, 0xbf,
- 0x33, 0xa4, 0x82, 0xbd, 0xb7, 0x84, 0x1f, 0xbe, 0x46, 0x4a, 0x41, 0xbe,
- 0x88, 0x0b, 0x88, 0x3e, 0x52, 0x07, 0x1a, 0xbe, 0x87, 0xc7, 0x92, 0xbd,
- 0x84, 0xa3, 0x95, 0xbe, 0x17, 0x90, 0x8b, 0xbe, 0x64, 0xb2, 0x07, 0xbe,
- 0xed, 0x58, 0x00, 0xbd, 0x76, 0x57, 0x41, 0x3e, 0x42, 0x44, 0xa5, 0xbb,
- 0x15, 0xd2, 0x97, 0xbe, 0x7f, 0x88, 0xdd, 0xbe, 0xa8, 0x0b, 0x80, 0x3c,
- 0x51, 0x04, 0x2c, 0x3d, 0xd3, 0x9a, 0xcf, 0xbd, 0x8f, 0x5b, 0x87, 0xbe,
- 0xf2, 0x33, 0x40, 0xbe, 0xc8, 0x52, 0xe1, 0xbc, 0xbe, 0xac, 0x80, 0xbe,
- 0x6a, 0x5e, 0x65, 0xbd, 0xa6, 0x84, 0x35, 0xbe, 0x0f, 0xfb, 0x5e, 0x3e,
- 0x38, 0xfb, 0x6a, 0xbd, 0x98, 0x20, 0x8c, 0xbe, 0xab, 0xc1, 0xda, 0xbd,
- 0x27, 0xe6, 0x3b, 0xbc, 0x2f, 0x9e, 0xe7, 0x3d, 0xb4, 0x85, 0x95, 0xbd,
- 0x52, 0x2f, 0xb1, 0xbe, 0x23, 0x40, 0x96, 0xbd, 0x44, 0x7f, 0x19, 0xbe,
- 0x50, 0x39, 0x90, 0xbe, 0x29, 0xff, 0x9c, 0xbc, 0x0c, 0x47, 0x4e, 0xbe,
- 0xf2, 0x06, 0x6e, 0xbe, 0x9e, 0xfe, 0x41, 0x3d, 0x9d, 0xb5, 0x9b, 0xbb,
- 0xd3, 0xde, 0xc3, 0xbe, 0x94, 0x6d, 0xd9, 0xbd, 0xb7, 0xc4, 0xa5, 0xbd,
- 0xc8, 0xee, 0x80, 0xbe, 0x57, 0xe1, 0x68, 0xbe, 0xec, 0x0e, 0x83, 0xbc,
- 0x3d, 0x39, 0x7f, 0xba, 0x4e, 0xc1, 0xb6, 0xbc, 0xd8, 0x39, 0xdd, 0xbd,
- 0x8a, 0x42, 0x3e, 0xbe, 0x9e, 0x10, 0xb1, 0xbe, 0xb0, 0xb3, 0x09, 0x3e,
- 0x24, 0x5a, 0x4d, 0xbe, 0xda, 0x5d, 0x3d, 0x3d, 0xc5, 0x27, 0xa6, 0x3d,
- 0x77, 0x33, 0xce, 0xbd, 0x16, 0x7e, 0xa0, 0xbc, 0x40, 0x3a, 0x11, 0xbc,
- 0xb8, 0x66, 0x51, 0x3e, 0xcc, 0x88, 0x2f, 0xbd, 0x34, 0xf6, 0x39, 0xbe,
- 0xc0, 0x09, 0x9e, 0xbe, 0xdd, 0x7d, 0xa5, 0xbc, 0x53, 0x82, 0x52, 0xbd,
- 0xe0, 0xb2, 0x4a, 0xbb, 0xfb, 0x9d, 0xa7, 0xbe, 0x73, 0xa8, 0x0d, 0xbe,
- 0x8c, 0x2e, 0xe9, 0xbd, 0x7b, 0x98, 0x21, 0xbe, 0xb3, 0xb7, 0xa6, 0x3d,
- 0x15, 0x21, 0x69, 0x3d, 0x70, 0xa0, 0x15, 0xbe, 0xce, 0x89, 0x26, 0x3e,
- 0x9e, 0xac, 0x2d, 0xbd, 0x21, 0xef, 0x95, 0xbc, 0x10, 0x54, 0x8a, 0xbd,
- 0xaf, 0x24, 0xa0, 0xbe, 0x5b, 0x03, 0x30, 0xbe, 0x2a, 0xfe, 0xb9, 0xbd,
- 0x3d, 0x9b, 0x65, 0xbe, 0xfa, 0x0c, 0x88, 0xbe, 0xd8, 0x4d, 0xaa, 0xbe,
- 0x7b, 0x80, 0x6e, 0x3e, 0xfa, 0xd8, 0x83, 0xbe, 0xee, 0xa2, 0x4f, 0xbb,
- 0x45, 0x70, 0xc9, 0x3c, 0xbc, 0x27, 0x9f, 0xbd, 0x7e, 0x38, 0xb9, 0xbe,
- 0x9c, 0xa0, 0x81, 0xbe, 0x7b, 0x7e, 0xd2, 0x3d, 0xfe, 0x72, 0xa6, 0xbe,
- 0x7d, 0xaa, 0x1b, 0xbe, 0x86, 0x8c, 0x15, 0xbe, 0x0f, 0x7e, 0x47, 0xbe,
- 0x7a, 0x53, 0x2c, 0xbe, 0x9a, 0x1c, 0xe5, 0xbe, 0xb8, 0x05, 0xc6, 0xbe,
- 0xb1, 0xa7, 0xb8, 0xbe, 0xf6, 0x8e, 0xb4, 0x3d, 0xc2, 0xff, 0xaa, 0xbd,
- 0xe2, 0x0c, 0x2a, 0xbc, 0x17, 0x1f, 0x90, 0x3c, 0xba, 0x43, 0x32, 0xbc,
- 0xf5, 0x70, 0xbe, 0x3d, 0x4b, 0xbf, 0xb5, 0xbe, 0x93, 0x0e, 0x9c, 0xbc,
- 0x99, 0x26, 0xe9, 0x3d, 0x85, 0xab, 0x71, 0xbc, 0xe3, 0x01, 0x03, 0xbe,
- 0x86, 0x74, 0xe6, 0xbd, 0x13, 0xc7, 0x14, 0xbe, 0xed, 0xce, 0xfe, 0x3d,
- 0x19, 0xcc, 0x99, 0x3d, 0x34, 0xce, 0x39, 0xbe, 0xbb, 0x9f, 0xdd, 0x3d,
- 0x7b, 0xe7, 0xe7, 0xbe, 0xce, 0x70, 0xe0, 0xbe, 0x73, 0x9e, 0x48, 0xbd,
- 0x3b, 0x59, 0xbe, 0xbd, 0x3b, 0x05, 0xc2, 0x3c, 0xd8, 0xec, 0xb0, 0xbd,
- 0xb0, 0xa6, 0x04, 0x3e, 0x5f, 0x5e, 0x5a, 0xbe, 0x4b, 0xa7, 0x9e, 0x3c,
- 0xb7, 0x91, 0xbd, 0xbd, 0xd9, 0xd4, 0xc5, 0x3d, 0x91, 0x91, 0xfe, 0xbd,
- 0x14, 0x5a, 0x20, 0xbe, 0x83, 0x77, 0xb8, 0xbe, 0xd4, 0xd0, 0xe7, 0xbd,
- 0xed, 0x5a, 0xb5, 0xbd, 0xb2, 0x2d, 0xbb, 0xbe, 0xb9, 0xf9, 0xa4, 0xbd,
- 0xc6, 0x33, 0x04, 0x3e, 0x78, 0xa0, 0xf8, 0xbd, 0x6f, 0x85, 0x51, 0xbe,
- 0xd8, 0xbf, 0xc4, 0xbe, 0x2f, 0xec, 0x2e, 0xbd, 0x6d, 0x0c, 0x29, 0xbe,
- 0x76, 0x5a, 0x92, 0x3d, 0x27, 0x52, 0xcd, 0xbd, 0xa2, 0x24, 0xad, 0xbe,
- 0xde, 0x2a, 0x27, 0xbe, 0xe7, 0xec, 0xa7, 0xbd, 0xaf, 0xfd, 0x8b, 0xbe,
- 0x8d, 0xbb, 0xce, 0xbe, 0xb0, 0x11, 0xa6, 0xbd, 0x14, 0x95, 0xaa, 0x3c,
- 0x33, 0x75, 0xe6, 0x3c, 0x55, 0x88, 0x23, 0xbc, 0x4a, 0x26, 0x86, 0xbd,
- 0xdf, 0x5a, 0x67, 0xbe, 0x10, 0x20, 0xe8, 0xbc, 0x2d, 0x69, 0x97, 0xbe,
- 0x4f, 0x9c, 0x78, 0x3d, 0x6e, 0x5b, 0x13, 0xbd, 0xc8, 0xcf, 0x42, 0xbe,
- 0x54, 0xde, 0x02, 0xbe, 0x77, 0x1f, 0x59, 0xbe, 0x49, 0x31, 0x0a, 0xbd,
- 0x0e, 0x75, 0x28, 0xbd, 0x52, 0x99, 0x43, 0x3d, 0x66, 0x48, 0x3b, 0xbd,
- 0xe1, 0x91, 0x19, 0x3d, 0x2d, 0x4c, 0xf8, 0x3d, 0x6d, 0xc0, 0x7f, 0xbe,
- 0xdc, 0x1f, 0x2e, 0x3d, 0x2f, 0x15, 0x03, 0x3e, 0x7d, 0xe4, 0x12, 0xbe,
- 0x71, 0x96, 0x72, 0x3d, 0x32, 0xd2, 0x5a, 0xbe, 0xb9, 0xaf, 0x86, 0x3d,
- 0x06, 0xe3, 0x0e, 0x3d, 0x08, 0x8b, 0x71, 0xbe, 0xe6, 0xe4, 0xaf, 0xbe,
- 0x6f, 0x26, 0x1c, 0xbd, 0xa1, 0x97, 0x82, 0xbe, 0x8d, 0x4e, 0x0d, 0x3e,
- 0x95, 0xd0, 0x1a, 0xbc, 0x65, 0x40, 0xac, 0xbe, 0xcd, 0x48, 0xe7, 0xbd,
- 0x43, 0x79, 0x69, 0xbe, 0xb5, 0x78, 0xaa, 0xbe, 0x3d, 0xe3, 0xf3, 0xbd,
- 0x84, 0x4a, 0x68, 0xbd, 0x55, 0x0b, 0x3d, 0xbe, 0x6c, 0x2d, 0x89, 0xbe,
- 0x07, 0xfa, 0x9c, 0xbe, 0xd1, 0x27, 0xe8, 0xbe, 0x93, 0x8e, 0xab, 0xbd,
- 0xc1, 0x51, 0x15, 0xbe, 0xf6, 0x73, 0x01, 0xbe, 0x2a, 0x24, 0x7f, 0xbd,
- 0xec, 0x41, 0x21, 0xbe, 0x63, 0xeb, 0x5e, 0xbe, 0x4c, 0x7d, 0x7e, 0x3d,
- 0xe4, 0xc0, 0x1a, 0xbd, 0x44, 0x7e, 0x94, 0xbe, 0x62, 0x9f, 0x9e, 0x3c,
- 0x78, 0x09, 0xda, 0xbc, 0xa7, 0x44, 0x9d, 0x3d, 0xf0, 0x27, 0xd2, 0xbd,
- 0xc7, 0x21, 0x59, 0xbe, 0xd1, 0x03, 0x59, 0xbe, 0x11, 0xaf, 0x83, 0x3d,
- 0x23, 0x46, 0x93, 0xbe, 0x30, 0x8b, 0x22, 0xbd, 0xdd, 0x9b, 0x7a, 0xbd,
- 0x81, 0x8d, 0x3c, 0x3e, 0xf7, 0x50, 0x9f, 0xbe, 0xc6, 0xf3, 0xb3, 0xbe,
- 0x8f, 0x92, 0x9c, 0xbd, 0x57, 0xf1, 0x0c, 0x3d, 0xd4, 0x4a, 0x00, 0xbf,
- 0x5d, 0x1e, 0xfb, 0x3d, 0xaa, 0xf3, 0x90, 0xbe, 0x70, 0x24, 0x10, 0x3e,
- 0xe1, 0xdf, 0xf0, 0x3d, 0xd2, 0x44, 0x23, 0x3d, 0x55, 0x35, 0x3d, 0xbd,
- 0x3b, 0x96, 0xbb, 0xbe, 0x55, 0x8f, 0xeb, 0xbd, 0xe5, 0xc3, 0xcf, 0x3d,
- 0xaf, 0x86, 0x18, 0x3c, 0x7b, 0xa4, 0x80, 0xbd, 0x3b, 0x7b, 0x14, 0xbd,
- 0xeb, 0x55, 0x58, 0xbe, 0x91, 0x94, 0x30, 0xbd, 0x84, 0x59, 0x7a, 0x3d,
- 0xb7, 0xc5, 0xcf, 0xbd, 0x21, 0xa9, 0xf3, 0xbd, 0x67, 0x47, 0xd5, 0x3c,
- 0x29, 0x39, 0x0e, 0x3d, 0x12, 0x59, 0xf6, 0xbd, 0xc5, 0x2a, 0x36, 0xbe,
- 0x71, 0xd8, 0x80, 0x3d, 0x7c, 0xd0, 0x40, 0x3c, 0xce, 0x35, 0x73, 0xbe,
- 0x62, 0x0e, 0xb3, 0xbd, 0xef, 0x7d, 0x94, 0xbd, 0x4a, 0xbd, 0x52, 0xbe,
- 0x31, 0xad, 0x9c, 0xbd, 0x54, 0x8c, 0x02, 0x3d, 0x47, 0xe9, 0xb8, 0x3d,
- 0x0c, 0xef, 0x17, 0x3e, 0x38, 0x1e, 0x71, 0xbe, 0x77, 0x9f, 0x07, 0x3e,
- 0xf0, 0xee, 0x16, 0x3d, 0xb1, 0x8c, 0x55, 0xbc, 0x53, 0xd9, 0xad, 0x3c,
- 0xa9, 0x31, 0x93, 0xbd, 0x2c, 0xf8, 0x90, 0xbe, 0xe0, 0x43, 0x47, 0xbd,
- 0x2a, 0xcf, 0x89, 0x3c, 0x84, 0xf7, 0x68, 0xbe, 0xf5, 0x00, 0x8a, 0xbe,
- 0x28, 0x8a, 0xac, 0xbe, 0xd9, 0xae, 0x86, 0xbe, 0x2f, 0x2b, 0x9d, 0xbd,
- 0x8d, 0xca, 0x46, 0xbe, 0x14, 0x8b, 0xf2, 0xbe, 0x88, 0x63, 0x89, 0x3c,
- 0xe8, 0xa3, 0x8d, 0xbe, 0x68, 0x10, 0xc2, 0xbe, 0xfd, 0x40, 0xe5, 0xbc,
- 0x8c, 0xd1, 0x7f, 0xbe, 0xb8, 0x43, 0x11, 0xbc, 0xd3, 0x10, 0x80, 0xbe,
- 0x30, 0x65, 0x30, 0x3c, 0xad, 0x8d, 0x27, 0xbe, 0xe3, 0xa2, 0xc0, 0xbe,
- 0x12, 0xdd, 0xe0, 0xbe, 0x0f, 0x43, 0xd6, 0x3c, 0x83, 0xf8, 0xe7, 0xbe,
- 0xda, 0x80, 0x30, 0xbe, 0x8d, 0xfd, 0x57, 0xbe, 0x96, 0x79, 0xf3, 0xbd,
- 0x5e, 0xcc, 0x6d, 0x3e, 0xef, 0x81, 0x4e, 0x3d, 0x3c, 0xca, 0x81, 0x3d,
- 0xcb, 0x3e, 0x49, 0xbe, 0x51, 0x48, 0x28, 0xbe, 0xa0, 0xf7, 0x57, 0x3d,
- 0xf5, 0x4a, 0x41, 0xbe, 0x57, 0xcd, 0x80, 0xbc, 0xd8, 0x1b, 0x8b, 0x3c,
- 0x76, 0x3f, 0x52, 0xbe, 0x8d, 0xa6, 0x89, 0xbc, 0x57, 0x57, 0xc8, 0xbc,
- 0xd7, 0xd0, 0x85, 0xbd, 0x9d, 0xb5, 0x3e, 0x3e, 0xfe, 0x93, 0x18, 0xbe,
- 0x02, 0xa9, 0xfa, 0xbd, 0x55, 0xe0, 0xd1, 0xbd, 0xc1, 0x14, 0xa6, 0xbe,
- 0x5b, 0xa5, 0x88, 0x3c, 0xca, 0x15, 0xec, 0xbc, 0x82, 0x91, 0x1e, 0x3e,
- 0x73, 0x4d, 0x3c, 0x3c, 0x37, 0x42, 0x16, 0x3d, 0x5a, 0x85, 0x40, 0x3d,
- 0x8a, 0x31, 0x23, 0x3e, 0xea, 0xaf, 0x28, 0xbb, 0xb8, 0x5c, 0xae, 0xbd,
- 0xb4, 0xa5, 0xb1, 0xbe, 0x08, 0x79, 0x8c, 0xbe, 0xfe, 0x60, 0x09, 0xbe,
- 0x52, 0x7b, 0x3d, 0xbe, 0xe8, 0x09, 0xc8, 0xbe, 0xc9, 0x4b, 0x89, 0xbc,
- 0x07, 0x50, 0x9c, 0xbd, 0xeb, 0x75, 0xa2, 0xbe, 0xd2, 0xd1, 0x22, 0xbd,
- 0x32, 0x3a, 0xb9, 0xbe, 0x88, 0x04, 0xa5, 0xbe, 0x1f, 0xbb, 0xac, 0xbe,
- 0x17, 0xf4, 0xa9, 0x3d, 0x9b, 0x56, 0x41, 0xbd, 0xa8, 0xa8, 0xa8, 0xbe,
- 0x9c, 0x0e, 0x4b, 0xbe, 0x13, 0x65, 0x8d, 0xbe, 0xd9, 0xbe, 0x3d, 0xbe,
- 0x79, 0xe0, 0x9c, 0xbc, 0xf0, 0x99, 0x88, 0xbe, 0x7e, 0xaf, 0x22, 0x3e,
- 0x5c, 0xa6, 0x33, 0xbe, 0x6d, 0xfa, 0x6c, 0xbd, 0x34, 0x5a, 0x6b, 0xbe,
- 0x2d, 0x22, 0xd7, 0xbe, 0xf9, 0x9f, 0xba, 0x3e, 0x42, 0x33, 0x2c, 0xbf,
- 0x79, 0xd5, 0x6c, 0xbe, 0x12, 0xe7, 0x67, 0x3d, 0x79, 0x0e, 0x03, 0xbe,
- 0x6a, 0xf0, 0x8a, 0xbe, 0x59, 0x67, 0x93, 0x3d, 0x2c, 0xca, 0x39, 0xbe,
- 0xec, 0xd6, 0x86, 0x3d, 0x68, 0x1d, 0xbd, 0xbd, 0x56, 0x1a, 0x7c, 0x3c,
- 0xc5, 0x33, 0xfd, 0xbe, 0xbf, 0x12, 0x06, 0x3c, 0x4c, 0xfc, 0x99, 0x3c,
- 0x27, 0x97, 0x88, 0xbe, 0xe6, 0x36, 0x05, 0xbe, 0xfc, 0x9d, 0x3f, 0xbe,
- 0xac, 0x67, 0x11, 0xbe, 0xd9, 0xfe, 0x96, 0xbe, 0x67, 0x30, 0xaf, 0xbe,
- 0xa5, 0xee, 0x6c, 0xbd, 0xfe, 0xc5, 0x00, 0xbf, 0xc8, 0x19, 0x13, 0x3e,
- 0xd4, 0x7c, 0x38, 0x3d, 0x8d, 0x01, 0x34, 0xbd, 0xd8, 0xdc, 0x3d, 0x3e,
- 0x4b, 0xcf, 0x8f, 0xbe, 0xff, 0x70, 0x27, 0xbc, 0x07, 0x86, 0x0e, 0x3d,
- 0xcc, 0x43, 0xad, 0xbc, 0x45, 0x47, 0x25, 0x3e, 0xae, 0xb2, 0x10, 0x3d,
- 0xa1, 0x5f, 0x9f, 0x3d, 0x61, 0xb8, 0x03, 0xbe, 0x6a, 0x50, 0x18, 0x3d,
- 0xac, 0xd5, 0x05, 0xbe, 0xa0, 0x92, 0xe2, 0xbd, 0x77, 0xc0, 0x18, 0x3e,
- 0xc3, 0x09, 0x8e, 0x3c, 0x74, 0xfa, 0xbc, 0xbe, 0x8c, 0xfd, 0xbc, 0xbe,
- 0x4f, 0xf5, 0x2a, 0xbe, 0x9a, 0xb0, 0x71, 0xbe, 0x71, 0x5d, 0x8f, 0xbd,
- 0x29, 0xfb, 0xf6, 0xbc, 0x42, 0x0e, 0x56, 0xbe, 0x8a, 0x9b, 0x2e, 0xbd,
- 0x12, 0xa1, 0x01, 0xbd, 0x76, 0x57, 0xb7, 0xb9, 0x8f, 0x7f, 0xca, 0xbe,
- 0x3c, 0xd0, 0x97, 0xbc, 0x1a, 0x00, 0xe3, 0xbc, 0x97, 0xbe, 0xe2, 0x3c,
- 0xfa, 0xf1, 0xae, 0xbb, 0x57, 0x74, 0x02, 0x3e, 0xb6, 0x7b, 0xcf, 0xbc,
- 0xcd, 0x06, 0x25, 0xbe, 0x7d, 0x27, 0x2f, 0xbd, 0x7b, 0xe4, 0x02, 0xbe,
- 0xfe, 0x1c, 0x80, 0xbe, 0x14, 0x12, 0x97, 0xbe, 0xcc, 0x1e, 0x35, 0x3e,
- 0x44, 0xe2, 0xea, 0xbd, 0x92, 0x16, 0x85, 0xbe, 0xd5, 0x08, 0x93, 0xbe,
- 0xc9, 0x2a, 0x39, 0x3d, 0x71, 0x96, 0xa5, 0xbc, 0xa8, 0x55, 0xa2, 0x3d,
- 0x3f, 0x98, 0x97, 0xbe, 0x10, 0x88, 0xcc, 0xbd, 0xab, 0x6b, 0x87, 0x3e,
- 0x12, 0x78, 0x8a, 0x3d, 0x35, 0xe8, 0xaf, 0xbe, 0x25, 0xca, 0x0c, 0x3e,
- 0xca, 0x3c, 0xd4, 0x3d, 0xf4, 0x31, 0x67, 0xbe, 0x38, 0x07, 0x8d, 0x3e,
- 0x9d, 0xeb, 0xb2, 0xbc, 0x62, 0x26, 0x91, 0x3d, 0x6d, 0x46, 0xfd, 0xbd,
- 0xf7, 0xdf, 0xc0, 0xbd, 0x31, 0x48, 0xff, 0x3d, 0xf5, 0xac, 0x16, 0xbe,
- 0x2c, 0xf2, 0x54, 0xbe, 0xd2, 0x14, 0xfd, 0xbd, 0x1b, 0xe9, 0x17, 0xbd,
- 0x9e, 0xf0, 0xa7, 0xbc, 0xe2, 0x3a, 0x40, 0xbe, 0xdc, 0xb4, 0x36, 0xbe,
- 0x90, 0x4a, 0x87, 0xbc, 0x0d, 0xf5, 0x1a, 0xbe, 0x90, 0xda, 0x33, 0xbe,
- 0xab, 0xb1, 0x08, 0xbe, 0x4d, 0x0b, 0x09, 0xbe, 0xb9, 0xc0, 0xf7, 0x3d,
- 0x9f, 0xa4, 0x34, 0xbe, 0xbe, 0x1c, 0x84, 0xbe, 0xf1, 0x4a, 0x9d, 0xbd,
- 0x71, 0x84, 0x5a, 0xbe, 0x9b, 0xca, 0x0f, 0xbd, 0xc0, 0xb3, 0x2c, 0xbe,
- 0xa3, 0x4f, 0x8e, 0xbc, 0xe8, 0xff, 0x95, 0xbe, 0xec, 0x15, 0x40, 0xbe,
- 0x9c, 0xc1, 0x36, 0x3d, 0x31, 0x75, 0x48, 0x3d, 0x26, 0xc3, 0x4b, 0x3d,
- 0xe4, 0x2f, 0x0b, 0x3e, 0x5b, 0x84, 0xf1, 0x3d, 0x7e, 0x7f, 0xe7, 0xbb,
- 0x81, 0xdc, 0x98, 0x3e, 0x31, 0x43, 0x9d, 0xbd, 0xc5, 0x3e, 0x22, 0xbd,
- 0x2e, 0x98, 0x8f, 0xbe, 0xf6, 0xa2, 0x39, 0xbe, 0x74, 0x92, 0x54, 0x3e,
- 0xf0, 0x7a, 0x14, 0xbe, 0x9c, 0x55, 0x6e, 0xbd, 0x51, 0x55, 0x7b, 0x3e,
- 0x35, 0xbe, 0x0c, 0x3e, 0x36, 0x04, 0xec, 0xbe, 0x2b, 0xc0, 0x93, 0x3d,
- 0xc3, 0x51, 0xab, 0x3c, 0x4e, 0x2c, 0x21, 0xbe, 0x94, 0x46, 0x19, 0xbe,
- 0xe6, 0x7d, 0x8e, 0xbe, 0x08, 0xda, 0xed, 0xbc, 0xd0, 0xbe, 0x8d, 0xbe,
- 0xfe, 0xaf, 0xe8, 0xbd, 0xbe, 0x4c, 0x91, 0xbd, 0xdd, 0x47, 0x5c, 0x3d,
- 0x3a, 0xbe, 0x77, 0xbe, 0x74, 0x0e, 0x21, 0xbe, 0x5c, 0xa3, 0x10, 0x3e,
- 0xa9, 0xd5, 0x57, 0xbe, 0x70, 0x1a, 0x82, 0xbe, 0x9a, 0x1c, 0xfd, 0x3b,
- 0xee, 0xd8, 0x2e, 0xbe, 0x1b, 0xde, 0x5c, 0x3e, 0xa4, 0x91, 0x7b, 0xbe,
- 0xe6, 0xe3, 0x14, 0x3e, 0x88, 0x5b, 0x8e, 0xbe, 0x3b, 0xab, 0xaa, 0xbe,
- 0x07, 0x70, 0x63, 0x3d, 0x80, 0xba, 0xf4, 0x3d, 0x23, 0x0c, 0xb9, 0xbd,
- 0x6d, 0xc1, 0xdd, 0x3b, 0x5e, 0x3c, 0x6f, 0x3e, 0x43, 0x69, 0x96, 0x3d,
- 0xbe, 0xfb, 0xda, 0xbd, 0x0b, 0x66, 0x5e, 0x3c, 0x66, 0x63, 0x64, 0xbe,
- 0xe7, 0x9c, 0xab, 0xbd, 0xb5, 0x8b, 0x0c, 0x3f, 0x04, 0x97, 0x87, 0x3e,
- 0x24, 0x71, 0x73, 0x3e, 0x93, 0x32, 0x63, 0x3e, 0x8d, 0xed, 0xee, 0x3d,
- 0xe6, 0xe7, 0x4e, 0xbd, 0x56, 0x27, 0x87, 0xbe, 0x03, 0x0c, 0x19, 0xbd,
- 0xf7, 0x06, 0x94, 0x3d, 0x02, 0xee, 0x4d, 0x3e, 0xe5, 0xdf, 0x01, 0xbe,
- 0xa8, 0xa0, 0x94, 0x3e, 0x1f, 0x9f, 0xc3, 0xba, 0x68, 0x5a, 0x04, 0x3e,
- 0x30, 0x98, 0x24, 0x3e, 0xda, 0xc1, 0xd7, 0xbd, 0x86, 0x95, 0xe7, 0xbe,
- 0x9d, 0x5b, 0x98, 0x3c, 0xe0, 0x4e, 0x46, 0x3e, 0x9b, 0x5e, 0xe1, 0x3d,
- 0x55, 0x5b, 0x8a, 0xbe, 0x5a, 0x5d, 0x15, 0x38, 0x6c, 0xdb, 0x1f, 0xbe,
- 0xc1, 0xcc, 0x6c, 0xbe, 0xc1, 0xed, 0x21, 0xbd, 0x90, 0xa8, 0x3c, 0xbd,
- 0x6f, 0xe0, 0x4f, 0xbe, 0xc3, 0x24, 0xdb, 0x3d, 0xa9, 0xbd, 0x91, 0xbe,
- 0x49, 0x5f, 0x2b, 0x3e, 0x6c, 0xf0, 0x89, 0xbe, 0xbe, 0x53, 0xdf, 0x3d,
- 0xfa, 0xe3, 0x16, 0xbe, 0x5a, 0xf9, 0x75, 0x3e, 0x4b, 0x94, 0x49, 0xbd,
- 0x09, 0x75, 0xa5, 0xbe, 0x93, 0xf3, 0x8a, 0x3d, 0x59, 0xae, 0xc8, 0xbd,
- 0xf2, 0x12, 0x5a, 0x3e, 0x2e, 0x7a, 0x12, 0xbe, 0xa1, 0x1b, 0x65, 0xbe,
- 0xa4, 0x38, 0x68, 0x3e, 0xab, 0xf1, 0x89, 0x3e, 0xb8, 0x40, 0x58, 0x3d,
- 0x8c, 0xed, 0x7b, 0x3d, 0xa7, 0xc1, 0xaa, 0xbd, 0x60, 0x0c, 0x82, 0x3d,
- 0xef, 0xde, 0xb9, 0x3d, 0x29, 0xcf, 0x0b, 0xbc, 0xf7, 0xb8, 0x78, 0x3d,
- 0x31, 0x3a, 0x6b, 0xbd, 0x7f, 0x8b, 0xf0, 0x3d, 0x67, 0x4b, 0xe2, 0xbc,
- 0x52, 0x09, 0x18, 0x3e, 0x52, 0x27, 0x08, 0xbd, 0x65, 0x87, 0x6e, 0x3c,
- 0x0d, 0x11, 0x82, 0x3e, 0x41, 0xb2, 0x64, 0x3e, 0xb6, 0x07, 0x23, 0xbe,
- 0x01, 0x6d, 0xf3, 0xbc, 0x01, 0x20, 0x3b, 0x3d, 0xad, 0x1c, 0x23, 0xbe,
- 0xd3, 0x29, 0x92, 0xbd, 0xf4, 0x0f, 0x54, 0x3e, 0x28, 0x3c, 0xd7, 0x3d,
- 0x80, 0xed, 0x1e, 0x3e, 0xf0, 0x66, 0xa5, 0x3d, 0xf2, 0x0d, 0xa7, 0x3d,
- 0x42, 0x57, 0x38, 0xbe, 0x3a, 0x8d, 0xb9, 0x3d, 0x6c, 0x19, 0x8c, 0x3e,
- 0x05, 0x51, 0xc1, 0xbc, 0x78, 0x94, 0xe0, 0xbd, 0x82, 0x1b, 0x38, 0x3e,
- 0x86, 0xe9, 0x26, 0xbe, 0x16, 0xeb, 0x21, 0xbe, 0x4b, 0x9c, 0x96, 0xbe,
- 0xad, 0x90, 0x12, 0x3e, 0x48, 0x48, 0x2d, 0xbe, 0xfd, 0xdb, 0x30, 0xbe,
- 0x3d, 0x0d, 0x8e, 0x3b, 0xc0, 0xb1, 0x7a, 0x3e, 0x5e, 0x42, 0xd8, 0xbe,
- 0x63, 0x54, 0x02, 0x3b, 0xbb, 0xce, 0x44, 0xbd, 0x6e, 0x9a, 0xbe, 0xbe,
- 0xe3, 0x1e, 0x30, 0x3e, 0xec, 0xa3, 0xa1, 0x3d, 0xbd, 0x7b, 0x8a, 0xbe,
- 0x60, 0x89, 0x1b, 0x3d, 0x56, 0x68, 0x79, 0xbe, 0xb7, 0xd6, 0xbb, 0x3c,
- 0xec, 0x9a, 0x92, 0xbe, 0xc8, 0xf4, 0x92, 0x3d, 0xc9, 0xb8, 0x1e, 0xbd,
- 0xf8, 0x25, 0xd6, 0xbe, 0xa4, 0x81, 0x0d, 0xbf, 0x55, 0xc6, 0xdf, 0xbe,
- 0x39, 0x03, 0x01, 0xbe, 0x77, 0xc8, 0x8c, 0x3e, 0xbd, 0xf2, 0xf3, 0x3b,
- 0x59, 0xcd, 0xb4, 0x3d, 0x93, 0x06, 0x98, 0xbe, 0xa7, 0x89, 0x16, 0x3d,
- 0x8e, 0x1a, 0xf8, 0xbd, 0xfc, 0x8b, 0xc9, 0xbd, 0xe0, 0x76, 0xd4, 0xbe,
- 0x1a, 0x0d, 0xb3, 0x3d, 0x42, 0x4c, 0x17, 0x3c, 0x6e, 0x4a, 0x67, 0x3e,
- 0xf4, 0xd9, 0xf9, 0x3d, 0x5a, 0xb3, 0xa3, 0xbd, 0x19, 0x05, 0xb3, 0xbe,
- 0x9b, 0xf1, 0x8b, 0xbe, 0xc1, 0x12, 0x0f, 0xbd, 0x41, 0xbe, 0x48, 0xbe,
- 0x9e, 0xf9, 0x2a, 0xbe, 0xa8, 0xed, 0x3a, 0x3e, 0xad, 0x9b, 0xbb, 0x3d,
- 0x9d, 0x9e, 0x2b, 0x3d, 0x01, 0x60, 0x69, 0xbe, 0xd3, 0x7e, 0x6b, 0xbd,
- 0xfb, 0x6b, 0x81, 0xbd, 0x80, 0xf0, 0xad, 0x3e, 0x0d, 0x29, 0xb5, 0xbb,
- 0xa1, 0xaa, 0x8a, 0xbd, 0x00, 0xad, 0x75, 0x3d, 0xbe, 0x97, 0x65, 0xbe,
- 0x55, 0xec, 0xb8, 0xbd, 0x34, 0x5c, 0x67, 0x3e, 0x89, 0xa1, 0x95, 0x3d,
- 0x0a, 0xbf, 0x91, 0x3d, 0xf3, 0x18, 0x1a, 0xbe, 0xae, 0xc3, 0x6e, 0x3e,
- 0xd7, 0xc1, 0xc6, 0x3e, 0xe5, 0x7e, 0x93, 0xbd, 0x7f, 0xa6, 0x11, 0x3c,
- 0x94, 0x1f, 0x89, 0x3e, 0x29, 0x23, 0x04, 0xbf, 0xae, 0x72, 0xc9, 0x3d,
- 0xbc, 0x79, 0x8d, 0x3e, 0x69, 0x6a, 0xef, 0x3c, 0x35, 0x8f, 0x29, 0x3e,
- 0xe5, 0x60, 0x22, 0x3d, 0xbd, 0xf1, 0x77, 0xbe, 0x72, 0x89, 0x62, 0xbe,
- 0x44, 0x17, 0x53, 0xbe, 0x45, 0xa2, 0xe1, 0xbd, 0x16, 0x58, 0x80, 0xbe,
- 0xe4, 0xf1, 0x26, 0xbe, 0x07, 0x7b, 0xcc, 0x3d, 0xac, 0xcd, 0x24, 0xbe,
- 0xb1, 0xd1, 0xac, 0x3d, 0x36, 0x33, 0xdc, 0x3d, 0x05, 0x09, 0xa0, 0xbe,
- 0x6d, 0x99, 0xe9, 0x3d, 0x19, 0x2d, 0x50, 0xbe, 0x8e, 0x51, 0x63, 0xbe,
- 0x65, 0xb0, 0x26, 0x3e, 0x17, 0xbb, 0xad, 0xbc, 0xe3, 0xc3, 0x7b, 0xbe,
- 0xae, 0xa9, 0xe9, 0xbb, 0x3a, 0x60, 0xab, 0x3e, 0x6f, 0x86, 0xf1, 0x3e,
- 0x52, 0x84, 0x29, 0x3d, 0xa3, 0x17, 0x07, 0x3e, 0x2a, 0x0e, 0x84, 0xbe,
- 0x97, 0xc8, 0x26, 0x3e, 0xc2, 0x16, 0x92, 0x3e, 0x88, 0xfd, 0xb7, 0xbd,
- 0x1f, 0x0d, 0xb3, 0xbd, 0x79, 0xe2, 0x31, 0x3e, 0xf4, 0xe4, 0xcc, 0xbd,
- 0x08, 0x9f, 0x32, 0xbe, 0x99, 0x11, 0x89, 0xbe, 0x0e, 0x73, 0x58, 0xbe,
- 0x15, 0x6a, 0xf0, 0xbd, 0x59, 0x50, 0x83, 0x3d, 0x47, 0x6c, 0x79, 0x3e,
- 0x1f, 0x6b, 0xa2, 0xbe, 0xc7, 0x06, 0x64, 0x3d, 0x19, 0x78, 0xe4, 0x3d,
- 0x35, 0xd1, 0xb6, 0x3e, 0x64, 0x7b, 0xad, 0x3d, 0x9d, 0x8e, 0x11, 0x3e,
- 0x03, 0xb6, 0x21, 0x3e, 0x0d, 0x09, 0xcf, 0xbd, 0x05, 0xe6, 0xe4, 0xbe,
- 0x52, 0x57, 0xfa, 0xbc, 0xb6, 0x25, 0xde, 0x3d, 0x24, 0xbc, 0x94, 0x3e,
- 0x41, 0xa8, 0x72, 0x3e, 0xa4, 0xd3, 0x63, 0xbd, 0xa2, 0x3d, 0xcd, 0x3c,
- 0x99, 0xf4, 0x83, 0xbe, 0x6f, 0x50, 0xa8, 0x3d, 0x35, 0x75, 0x3a, 0x3e,
- 0xeb, 0x46, 0xa2, 0xbe, 0x8a, 0x88, 0x9e, 0x3d, 0x18, 0x68, 0xb7, 0xbd,
- 0xc1, 0x87, 0x98, 0x3d, 0xee, 0x46, 0x14, 0xbe, 0xea, 0xc8, 0x32, 0xbe,
- 0xe4, 0xd1, 0xc9, 0xbd, 0x40, 0x9c, 0x16, 0x3b, 0x7c, 0x6f, 0x69, 0x3e,
- 0x1e, 0x16, 0x45, 0x3d, 0x39, 0x02, 0x2d, 0xbd, 0x9b, 0x25, 0xec, 0x3d,
- 0xe6, 0x55, 0x14, 0x3e, 0xd2, 0xf5, 0x5e, 0x3e, 0x7e, 0x37, 0x7c, 0x3d,
- 0x88, 0x50, 0xf9, 0x3d, 0xa1, 0x64, 0x7f, 0xbe, 0x0d, 0x1b, 0xc5, 0xbd,
- 0xfb, 0x28, 0x85, 0x3c, 0x3d, 0x31, 0xbe, 0x3e, 0xb6, 0x6a, 0x0d, 0xbe,
- 0x8e, 0x82, 0x1b, 0x3f, 0xcd, 0x60, 0x89, 0x3e, 0xaa, 0xf0, 0x1b, 0xbd,
- 0xaa, 0x06, 0x8b, 0xbe, 0x04, 0x80, 0x64, 0xbd, 0x07, 0xe2, 0x36, 0xbd,
- 0x26, 0x89, 0x7b, 0xbd, 0xb2, 0x6a, 0x85, 0x3e, 0x1d, 0x9b, 0xbb, 0xbd,
- 0xa7, 0x6f, 0x44, 0x3d, 0x6b, 0xe4, 0x6d, 0x3c, 0x7e, 0xfd, 0x67, 0xbe,
- 0xed, 0x67, 0xac, 0xbd, 0x2b, 0x91, 0x15, 0xbd, 0xa0, 0x5a, 0x60, 0x3e,
- 0x0a, 0xb8, 0xee, 0x3e, 0x1b, 0x06, 0x0b, 0x3e, 0x1a, 0x78, 0x8b, 0x3d,
- 0x5b, 0x91, 0xd6, 0xbb, 0x9b, 0x7d, 0x1b, 0xbf, 0x93, 0xd6, 0xa7, 0xbd,
- 0xa8, 0x7a, 0x96, 0x3e, 0x27, 0x81, 0xba, 0x3c, 0x50, 0xa1, 0x6f, 0xbe,
- 0xf5, 0xa7, 0x84, 0x3d, 0x0c, 0xb3, 0x61, 0xbe, 0x74, 0x10, 0x58, 0xbe,
- 0x21, 0xb3, 0xae, 0xbd, 0x52, 0x79, 0xd1, 0x3d, 0x82, 0x1a, 0x53, 0x3e,
- 0x10, 0x2a, 0xba, 0xbe, 0x63, 0xe4, 0x1b, 0xbe, 0x03, 0xce, 0x83, 0x3e,
- 0x44, 0x96, 0xc5, 0x3d, 0xff, 0xa3, 0x30, 0xbe, 0x6c, 0x61, 0xa9, 0x3d,
- 0xb0, 0x58, 0xa4, 0x3e, 0x8e, 0xde, 0x1b, 0xbb, 0xff, 0x0d, 0x66, 0x3e,
- 0x24, 0xc6, 0x4c, 0x3e, 0xe9, 0x28, 0x91, 0xbc, 0x7b, 0x80, 0x65, 0x3e,
- 0x80, 0x33, 0x5e, 0xbe, 0x90, 0x40, 0xa4, 0x3d, 0x5e, 0x24, 0x84, 0xbe,
- 0xdd, 0x88, 0xc3, 0x3d, 0x3d, 0x58, 0x59, 0x3e, 0xc5, 0xf4, 0x22, 0x3e,
- 0xb5, 0xad, 0x3d, 0x3e, 0xe7, 0x10, 0x19, 0xbe, 0x95, 0x08, 0x6a, 0x3e,
- 0x02, 0xa2, 0x19, 0xbe, 0x4e, 0x32, 0x29, 0xbe, 0x42, 0xc1, 0x22, 0xbe,
- 0xe2, 0x9d, 0x07, 0xbe, 0x73, 0xbc, 0x36, 0xbe, 0xa5, 0x35, 0xa1, 0xbc,
- 0x8d, 0x31, 0x98, 0x3d, 0x3c, 0xa8, 0x1e, 0xbe, 0x02, 0x8e, 0x7c, 0xbe,
- 0x2e, 0x98, 0xe2, 0xbd, 0xf5, 0x2d, 0x83, 0xbe, 0xfc, 0x60, 0x75, 0xbd,
- 0x34, 0x3a, 0xa6, 0x3c, 0xd5, 0x09, 0xa2, 0x3e, 0x92, 0x81, 0xde, 0xbe,
- 0x83, 0x88, 0x22, 0xbe, 0xed, 0xf0, 0x8a, 0x3d, 0x07, 0xb2, 0x22, 0xbc,
- 0x85, 0x60, 0x5f, 0x3d, 0xdd, 0xe2, 0xb1, 0xbc, 0x58, 0xe4, 0x58, 0x3d,
- 0xce, 0xfe, 0x11, 0x3e, 0x26, 0x0f, 0x54, 0x3d, 0x25, 0xa3, 0x91, 0x3d,
- 0x2b, 0xa0, 0x4a, 0x3e, 0xd3, 0x4d, 0x2a, 0x3d, 0xbb, 0x6b, 0x56, 0x3e,
- 0x87, 0x92, 0x8e, 0xbd, 0xe2, 0x16, 0x14, 0xbe, 0x47, 0x1b, 0xc2, 0xbe,
- 0xd0, 0x85, 0x13, 0xbe, 0x4a, 0x5a, 0xf2, 0xbe, 0x74, 0x49, 0xc6, 0x3d,
- 0xc2, 0x3d, 0x40, 0xbe, 0x73, 0x5b, 0xbd, 0xbd, 0xe0, 0xa8, 0x54, 0xbe,
- 0x84, 0x3c, 0x84, 0x3d, 0x93, 0xfd, 0xcc, 0x3d, 0x0e, 0x32, 0xb1, 0xbe,
- 0x22, 0x40, 0x67, 0xbd, 0xa5, 0x35, 0x8b, 0xbe, 0x74, 0xcf, 0x32, 0x3e,
- 0xe4, 0x2c, 0x71, 0xbb, 0xe9, 0xa4, 0x09, 0x3d, 0x69, 0x30, 0xc4, 0x3d,
- 0x5e, 0xa4, 0x33, 0x3d, 0x4c, 0xe8, 0xda, 0xbc, 0xfe, 0xa6, 0xac, 0x3e,
- 0x88, 0x05, 0xad, 0x3e, 0x96, 0xa7, 0x46, 0xbd, 0x3d, 0x43, 0xf2, 0xbd,
- 0xbd, 0xa5, 0xdb, 0x3d, 0xf0, 0xb5, 0xff, 0xbc, 0x58, 0xa2, 0x56, 0x3c,
- 0x82, 0xd0, 0x48, 0xbd, 0xda, 0xbf, 0x38, 0x3e, 0x5d, 0xf5, 0x88, 0x3c,
- 0x19, 0xb6, 0x23, 0xbe, 0xf0, 0xa2, 0x7c, 0xbe, 0xf4, 0x34, 0x19, 0x3d,
- 0x62, 0xa9, 0xa0, 0x3c, 0x96, 0x63, 0xc9, 0xbd, 0xcc, 0x25, 0xb4, 0x3d,
- 0x8d, 0xba, 0x07, 0x3e, 0x49, 0xb8, 0xf3, 0xbc, 0x9f, 0x02, 0x0b, 0xbc,
- 0x54, 0xdd, 0x88, 0x3c, 0xf2, 0xf9, 0x9d, 0xbd, 0x04, 0x9c, 0x80, 0x3d,
- 0xaa, 0xab, 0x1c, 0xbd, 0x53, 0x73, 0x6b, 0xbe, 0xa9, 0x9a, 0xa8, 0xbe,
- 0xcb, 0x1b, 0x01, 0xbe, 0xf4, 0x48, 0xf4, 0x3d, 0xbe, 0xe6, 0xe3, 0xbd,
- 0xb9, 0x17, 0x43, 0xbe, 0xf7, 0x3f, 0x16, 0x3d, 0x30, 0x73, 0x86, 0x3e,
- 0x99, 0xd9, 0x06, 0xbe, 0xc8, 0xb6, 0xe9, 0x3c, 0xda, 0x98, 0x2e, 0x3e,
- 0x13, 0xa1, 0x03, 0xbe, 0xbf, 0x61, 0x8b, 0xbd, 0xaf, 0x26, 0x44, 0xbe,
- 0x5c, 0x6b, 0xb0, 0xbd, 0x70, 0x26, 0x8c, 0x3e, 0x51, 0xc9, 0x40, 0xbe,
- 0x00, 0xe4, 0xb2, 0xbe, 0x16, 0x5f, 0xee, 0x3e, 0xb8, 0x99, 0xe1, 0x3d,
- 0xb2, 0x37, 0x56, 0xbe, 0x1f, 0x8e, 0x50, 0x3e, 0x57, 0x4d, 0xe6, 0xbd,
- 0xcf, 0x3d, 0xc4, 0x3d, 0x65, 0x22, 0x93, 0x3e, 0xba, 0xcb, 0x2b, 0x3c,
- 0x13, 0xa5, 0xea, 0x3d, 0xcb, 0x21, 0x11, 0x3e, 0x80, 0x06, 0x24, 0xbe,
- 0xdb, 0xb9, 0x86, 0x3e, 0x06, 0xaa, 0xd5, 0xbe, 0x3d, 0x7d, 0xd4, 0x3d,
- 0x47, 0x90, 0x6a, 0xbb, 0x39, 0x24, 0xd3, 0x3c, 0xd7, 0x94, 0x9b, 0xbc,
- 0x1d, 0x31, 0xdf, 0xbd, 0x4e, 0x48, 0xb0, 0xbe, 0xb3, 0x1a, 0xf0, 0xbc,
- 0x1f, 0xc9, 0x90, 0x3c, 0x0a, 0x04, 0xee, 0xbe, 0xfc, 0x34, 0x56, 0xbe,
- 0x14, 0x6e, 0xe1, 0xbe, 0xc4, 0xa0, 0x5c, 0x3e, 0x57, 0x49, 0x87, 0x3e,
- 0x67, 0xf2, 0x8f, 0xbd, 0x0c, 0xbb, 0x3d, 0x3e, 0xae, 0x00, 0x4e, 0xbb,
- 0x53, 0x26, 0xbd, 0x3e, 0x60, 0xc5, 0x72, 0x3d, 0x36, 0x09, 0xc9, 0xbe,
- 0x85, 0xdb, 0x19, 0xbe, 0x61, 0x77, 0x79, 0xbe, 0x7b, 0x09, 0x89, 0xbd,
- 0xa7, 0xa6, 0x5c, 0x3e, 0xfe, 0x8b, 0xea, 0xbd, 0x51, 0x31, 0x4f, 0xbe,
- 0xae, 0xa1, 0xc1, 0x3d, 0x6c, 0x91, 0xf1, 0x3c, 0x3b, 0x7f, 0xdd, 0x3d,
- 0xa8, 0x55, 0x83, 0x3e, 0xd5, 0x35, 0x3a, 0x3e, 0xfc, 0xa8, 0x34, 0x3e,
- 0xf4, 0x1b, 0x39, 0xbe, 0x51, 0x1e, 0x17, 0x3e, 0x5c, 0xa8, 0x9c, 0xbe,
- 0x21, 0x10, 0x20, 0x3e, 0xb5, 0x7e, 0x3d, 0xbd, 0x9f, 0x75, 0x3d, 0x3e,
- 0xfd, 0x19, 0x60, 0xbd, 0xf7, 0x89, 0x80, 0x3e, 0x3c, 0x81, 0x40, 0xbe,
- 0xe7, 0xb7, 0xcb, 0xbd, 0xa5, 0x3f, 0x11, 0x3c, 0x04, 0xed, 0x92, 0x3e,
- 0x38, 0xe1, 0x23, 0x3e, 0xc6, 0xd0, 0x58, 0xbd, 0xd3, 0xa9, 0x6e, 0xbd,
- 0x48, 0x85, 0x0f, 0xbe, 0x7e, 0x73, 0xd1, 0xbc, 0x51, 0xb8, 0x31, 0xbe,
- 0x68, 0x4b, 0x6f, 0xbe, 0x0b, 0x60, 0x94, 0x3e, 0x0f, 0x3f, 0xe1, 0x3d,
- 0x5b, 0x60, 0x91, 0xbd, 0xe8, 0xb9, 0x65, 0x3e, 0xd7, 0x36, 0xd3, 0xbd,
- 0xcb, 0xde, 0x52, 0xbc, 0x0f, 0x78, 0x08, 0xba, 0xd0, 0x9f, 0x1f, 0xbe,
- 0x9e, 0x60, 0xf1, 0x3d, 0x57, 0x55, 0xa0, 0xbd, 0x3a, 0x22, 0x5c, 0x3e,
- 0x6f, 0xe3, 0xbd, 0xbd, 0x1d, 0xc1, 0x93, 0xbe, 0x55, 0x52, 0x58, 0xbd,
- 0x4a, 0x93, 0x6d, 0x3d, 0x1f, 0x7c, 0x83, 0x3c, 0x4e, 0x3f, 0x5a, 0xbe,
- 0x05, 0xcc, 0x32, 0xbe, 0x63, 0xd2, 0x30, 0xbe, 0xe4, 0xc8, 0x02, 0x3d,
- 0xf2, 0x39, 0xb7, 0xbd, 0xed, 0x0b, 0xb1, 0xbe, 0x8c, 0xd3, 0xba, 0x3d,
- 0x53, 0xc9, 0x3a, 0xbe, 0x0c, 0x63, 0x17, 0xbe, 0x19, 0xc0, 0xc1, 0xbd,
- 0xb1, 0x88, 0x52, 0xbe, 0x33, 0xc0, 0x0b, 0xbe, 0xd9, 0xab, 0xae, 0x3d,
- 0xd9, 0x1e, 0x72, 0x3e, 0xea, 0xf4, 0xcf, 0x3d, 0x3e, 0x96, 0x9f, 0x3e,
- 0x99, 0x0b, 0xa1, 0x3e, 0x08, 0xdd, 0x29, 0x3e, 0xff, 0xc2, 0x99, 0x3c,
- 0xe3, 0xef, 0x55, 0xbb, 0x0f, 0xa4, 0x58, 0x3d, 0x93, 0xff, 0x84, 0xbd,
- 0x64, 0x39, 0xe3, 0x3b, 0x3d, 0x73, 0x9c, 0xbd, 0x0b, 0xbd, 0x13, 0xbe,
- 0x1b, 0x8a, 0x01, 0xbe, 0x30, 0xfe, 0x97, 0xbd, 0xed, 0x2e, 0xb6, 0xbd,
- 0x4b, 0xc8, 0xeb, 0xbd, 0x18, 0x85, 0x49, 0xbc, 0x0f, 0x7a, 0x04, 0x3e,
- 0x9c, 0x85, 0xa2, 0x3d, 0x84, 0x4f, 0xd7, 0x3a, 0xa5, 0x92, 0x88, 0x3b,
- 0xfb, 0xa6, 0x84, 0xbe, 0x66, 0x0a, 0x4e, 0xbe, 0x14, 0x42, 0xc8, 0x3d,
- 0x8d, 0x47, 0xd9, 0xbe, 0xf0, 0xfb, 0x35, 0x3e, 0x52, 0xe2, 0x88, 0xbd,
- 0x5f, 0x10, 0x78, 0xbd, 0x96, 0x6e, 0x81, 0x3d, 0x06, 0xa3, 0x0b, 0x3d,
- 0x1d, 0x68, 0x32, 0xbe, 0x40, 0xa9, 0xbc, 0x3d, 0x0b, 0x9c, 0x7c, 0xbd,
- 0xe4, 0x79, 0x58, 0x3e, 0x1b, 0xd1, 0x6a, 0x3d, 0x74, 0x15, 0x6b, 0x3e,
- 0xa8, 0x0f, 0x6e, 0x3e, 0x78, 0x86, 0x88, 0x3d, 0x83, 0xb1, 0xc9, 0x3e,
- 0x47, 0x9c, 0x9c, 0x3e, 0xd5, 0xba, 0xb3, 0x3e, 0xe2, 0x15, 0xa0, 0xbe,
- 0xf9, 0x29, 0x84, 0x3d, 0x9d, 0xa6, 0x35, 0x3e, 0xf8, 0x14, 0x2b, 0xbf,
- 0x74, 0x20, 0xb2, 0x3d, 0x20, 0xa9, 0x20, 0x3e, 0x08, 0x5f, 0x1d, 0x3c,
- 0xcb, 0x5a, 0x65, 0x3d, 0x76, 0xca, 0x00, 0x3d, 0x4a, 0x69, 0x2e, 0x3d,
- 0x23, 0x78, 0xf2, 0x3d, 0x62, 0xab, 0x92, 0xbd, 0x2a, 0x35, 0x30, 0xbc,
- 0x24, 0x1b, 0xa0, 0x3d, 0x1f, 0xcb, 0x65, 0xbd, 0x25, 0x7e, 0x97, 0xbd,
- 0x71, 0x85, 0x71, 0xbe, 0x9d, 0x2b, 0xc7, 0xbe, 0x30, 0x2e, 0x1a, 0xbd,
- 0xa9, 0xae, 0x13, 0xbe, 0x6b, 0xc5, 0xca, 0x3c, 0x7d, 0xa7, 0x26, 0xbe,
- 0xfb, 0xb8, 0x31, 0xbe, 0x81, 0xa6, 0x03, 0x3d, 0xe9, 0x6a, 0xc1, 0x3d,
- 0x85, 0xed, 0x33, 0xbe, 0xfe, 0xa4, 0xfa, 0xbd, 0xbb, 0x5d, 0x4b, 0xbe,
- 0x8e, 0x24, 0xcc, 0x3d, 0x19, 0x09, 0xab, 0x3d, 0x49, 0x55, 0x7a, 0xbe,
- 0xc5, 0x51, 0x03, 0x3c, 0x6a, 0x9a, 0xce, 0xbd, 0x9f, 0x41, 0x96, 0xbd,
- 0x5b, 0x13, 0xaf, 0xbd, 0xdf, 0x47, 0x59, 0xbe, 0x26, 0xe2, 0x97, 0xbe,
- 0xf1, 0x9e, 0x9a, 0x3d, 0xbe, 0x0f, 0x0e, 0xbe, 0x90, 0xe7, 0xe1, 0xbe,
- 0x1c, 0x75, 0x1b, 0xbe, 0x3c, 0x10, 0x7e, 0xbe, 0x3e, 0x8d, 0x75, 0xbe,
- 0x91, 0xb8, 0xf7, 0xbd, 0x96, 0x89, 0x25, 0xbe, 0x50, 0x3e, 0xf0, 0xbc,
- 0x7e, 0x6f, 0x85, 0x3c, 0x8c, 0xf0, 0xbc, 0xbc, 0x58, 0xcb, 0x16, 0xbc,
- 0xb5, 0x47, 0x42, 0xbe, 0x03, 0xb0, 0xe7, 0x3d, 0x0a, 0x98, 0x5b, 0xbd,
- 0x1c, 0x74, 0xb8, 0x3c, 0x1b, 0xab, 0xba, 0xbc, 0xf5, 0x2b, 0xfc, 0xbd,
- 0xbb, 0x7b, 0x82, 0xbc, 0x24, 0x0d, 0xa9, 0xbe, 0xb9, 0x7f, 0xcc, 0x3d,
- 0xca, 0xc7, 0x06, 0x3e, 0xdf, 0x2e, 0x33, 0xbe, 0x9d, 0xe2, 0xa2, 0xbd,
- 0x88, 0x42, 0xc6, 0xbc, 0xff, 0xbd, 0x4f, 0xbe, 0x5e, 0x90, 0x01, 0xbe,
- 0xfe, 0x83, 0xa1, 0xbd, 0x3d, 0x6d, 0x1d, 0xbe, 0x80, 0x45, 0x82, 0xbe,
- 0x05, 0xd7, 0x70, 0xbd, 0x5b, 0xc1, 0x37, 0x3d, 0x64, 0xee, 0x2b, 0x3d,
- 0xe6, 0x26, 0x17, 0xbd, 0x38, 0xb3, 0x1c, 0xbe, 0xa8, 0x31, 0x3a, 0x3e,
- 0x0a, 0x2d, 0x4c, 0x3e, 0x1a, 0x8a, 0x2d, 0xbd, 0x2d, 0x91, 0x4a, 0xbd,
- 0xbe, 0xd8, 0x3b, 0xbd, 0x47, 0xe0, 0x39, 0xbe, 0x5b, 0x8a, 0x19, 0xbc,
- 0xc7, 0x3a, 0x67, 0x3e, 0x77, 0x74, 0x65, 0x3c, 0xf1, 0x46, 0xff, 0xbe,
- 0x7e, 0x53, 0x83, 0xbd, 0xe1, 0x44, 0x71, 0xbe, 0x31, 0xe4, 0x4c, 0xbe,
- 0xc9, 0x14, 0xab, 0xbe, 0x3b, 0xa1, 0xd5, 0xbd, 0xa9, 0x91, 0x80, 0xbe,
- 0x5a, 0xe5, 0xd7, 0x3d, 0x91, 0x7c, 0x0d, 0xbe, 0xdf, 0xd6, 0x2a, 0xbe,
- 0x91, 0xe9, 0x17, 0xbd, 0x58, 0x5f, 0x07, 0xbe, 0x11, 0xd3, 0xf0, 0x3d,
- 0xb6, 0xf9, 0x30, 0xbe, 0x71, 0x1d, 0xda, 0xbe, 0xdd, 0xfc, 0x83, 0xbd,
- 0xb7, 0x29, 0x60, 0xbd, 0xb8, 0xa3, 0xd8, 0xbe, 0xdd, 0x11, 0xf1, 0xbd,
- 0x56, 0xa5, 0x16, 0xbd, 0xe3, 0x0e, 0x1c, 0x3d, 0x66, 0x12, 0x68, 0xbe,
- 0x0a, 0xe6, 0x61, 0x3d, 0x17, 0x56, 0xbc, 0xbd, 0xbc, 0x8b, 0xbf, 0xbd,
- 0x06, 0x1b, 0x1b, 0xbb, 0xcc, 0x1c, 0x41, 0xbe, 0x96, 0xfc, 0x8b, 0xbe,
- 0x1b, 0x1b, 0xed, 0x3b, 0xaf, 0xe0, 0x59, 0xbe, 0x2a, 0xb8, 0x1f, 0xbd,
- 0x08, 0x66, 0xaf, 0xbd, 0x39, 0x3e, 0xf7, 0xbd, 0x27, 0xf6, 0xce, 0xbd,
- 0x30, 0x6a, 0x17, 0x3e, 0x2c, 0x6b, 0x49, 0xbd, 0x80, 0x60, 0x6b, 0x3e,
- 0x05, 0x69, 0x1c, 0x3c, 0x2f, 0x5a, 0x62, 0xbd, 0xe9, 0x3a, 0x9e, 0xbd,
- 0xf3, 0x73, 0x38, 0xbe, 0xc2, 0x8f, 0x80, 0xbc, 0xdf, 0x0a, 0x5a, 0xbe,
- 0xd2, 0xac, 0xcd, 0xbe, 0x8e, 0x26, 0x82, 0xbe, 0x4d, 0x78, 0x25, 0x3c,
- 0x6c, 0x1f, 0x27, 0x3c, 0x0d, 0x17, 0x10, 0x3e, 0xab, 0xa1, 0xe0, 0x3d,
- 0x49, 0x64, 0xe7, 0x3d, 0x11, 0xa0, 0x8f, 0x3d, 0x83, 0x50, 0x6e, 0x3e,
- 0x90, 0x40, 0xa5, 0xbd, 0x29, 0x7f, 0x92, 0x3d, 0x9c, 0x36, 0x9b, 0xbe,
- 0x5d, 0x71, 0xf0, 0xbd, 0x02, 0x6f, 0x4b, 0xbe, 0x06, 0x2e, 0x8f, 0xbd,
- 0x92, 0x98, 0x89, 0xbe, 0x82, 0xeb, 0x5f, 0x3d, 0x27, 0x43, 0xc3, 0xb9,
- 0x8f, 0x85, 0xcc, 0xbc, 0xe7, 0xa5, 0x8b, 0x3d, 0x93, 0x6d, 0xca, 0xbc,
- 0x67, 0x59, 0xc0, 0xbc, 0x59, 0xd7, 0x31, 0xbe, 0x32, 0x7e, 0xba, 0xbe,
- 0x58, 0x16, 0x2c, 0xbe, 0x83, 0x0e, 0x33, 0xbd, 0x01, 0xd1, 0xd2, 0xbd,
- 0x3f, 0xc3, 0x25, 0xbd, 0x98, 0x77, 0x2a, 0xbe, 0xa7, 0x48, 0x27, 0xbd,
- 0xce, 0xea, 0x59, 0xbc, 0xb7, 0xa8, 0xab, 0xbe, 0x93, 0x60, 0x39, 0xbd,
- 0x69, 0xf5, 0x69, 0xbe, 0x99, 0x86, 0xdc, 0xbd, 0xb4, 0x0b, 0x6f, 0x3c,
- 0x82, 0x27, 0xca, 0xbd, 0x99, 0xf3, 0xf9, 0x3c, 0x01, 0x87, 0xbe, 0xbc,
- 0xd1, 0xa6, 0x0d, 0xbe, 0xe3, 0x4e, 0x2f, 0xbe, 0xea, 0x3d, 0x7d, 0x3e,
- 0x1f, 0x39, 0xb4, 0x3d, 0x98, 0xa6, 0x76, 0xbe, 0xe8, 0x63, 0x06, 0x3d,
- 0xb6, 0x3c, 0x2a, 0x3e, 0xd7, 0xe7, 0x7d, 0xbd, 0x4f, 0x0e, 0xa5, 0xbe,
- 0x53, 0x45, 0xe7, 0xbe, 0x11, 0x2f, 0x08, 0xbe, 0x9b, 0x2f, 0x72, 0xbe,
- 0xa9, 0x8d, 0x9e, 0xbe, 0xec, 0x95, 0x61, 0xbe, 0x46, 0x0a, 0x3f, 0xbd,
- 0x03, 0x87, 0x5f, 0xbe, 0xe7, 0x3b, 0x90, 0xbc, 0x50, 0xa3, 0x50, 0xbe,
- 0xab, 0x68, 0xaa, 0x3d, 0xc5, 0x49, 0xa0, 0x3d, 0xe0, 0x93, 0xfa, 0x3c,
- 0x26, 0x36, 0x60, 0x3d, 0x3a, 0xef, 0xcd, 0xbd, 0x25, 0x87, 0x8b, 0xbd,
- 0x58, 0xd2, 0xc3, 0x3c, 0xdc, 0x31, 0xd9, 0xbe, 0xa4, 0xf6, 0x8c, 0xbd,
- 0x67, 0x89, 0x43, 0xbd, 0x8b, 0xbc, 0x3b, 0x3d, 0xd4, 0xdb, 0x8d, 0x3d,
- 0xcd, 0x1c, 0x9c, 0xbd, 0xd8, 0x9b, 0x50, 0xbe, 0x0c, 0xd6, 0x3f, 0xbe,
- 0xb2, 0x38, 0x26, 0xbe, 0x9f, 0x4b, 0x6f, 0xbc, 0x85, 0xf4, 0x1d, 0xbe,
- 0x97, 0x81, 0x89, 0xbe, 0x5c, 0x90, 0x73, 0xbe, 0x81, 0x8d, 0x64, 0x3d,
- 0x31, 0xba, 0x6b, 0xbb, 0x88, 0x60, 0xae, 0x3d, 0xd9, 0x35, 0x35, 0x3d,
- 0x8d, 0x28, 0xcd, 0x3d, 0x87, 0xa9, 0x00, 0xbf, 0x2b, 0xcd, 0x76, 0xbc,
- 0xc5, 0x8a, 0xe6, 0x3d, 0x9a, 0x0a, 0x86, 0xbe, 0xac, 0xeb, 0x2e, 0xbe,
- 0xbb, 0x41, 0x1e, 0x3d, 0x4a, 0x2e, 0xcc, 0xbd, 0x4e, 0xa1, 0x82, 0xbe,
- 0x82, 0x22, 0x83, 0xbd, 0x59, 0x67, 0x14, 0x3d, 0xd2, 0x99, 0x23, 0xbe,
- 0x4c, 0xb1, 0xd5, 0xbe, 0xdc, 0x72, 0x86, 0xbd, 0xc1, 0x53, 0xb1, 0xbd,
- 0xbb, 0x29, 0x19, 0xbd, 0x78, 0x5e, 0x82, 0xbd, 0xc1, 0xb6, 0x74, 0xbe,
- 0x7c, 0x13, 0xab, 0xbd, 0x45, 0x1c, 0xdd, 0xbc, 0xb5, 0x85, 0x16, 0xbe,
- 0x45, 0xb3, 0x12, 0xbe, 0x3f, 0xfe, 0x05, 0xbe, 0xbb, 0x97, 0x9f, 0xbe,
- 0x37, 0x37, 0x82, 0xbe, 0xed, 0x99, 0xef, 0x3d, 0xce, 0x6c, 0xf9, 0xbd,
- 0x61, 0x3c, 0x64, 0xbe, 0xc3, 0x6f, 0xbc, 0xbd, 0xf7, 0x02, 0x85, 0x3c,
- 0xe5, 0x08, 0x15, 0xbe, 0x67, 0x8c, 0x77, 0xbe, 0x33, 0xfc, 0xb5, 0xbe,
- 0x15, 0xa9, 0xa9, 0xbc, 0x63, 0x02, 0xd7, 0xbe, 0x64, 0x8d, 0x96, 0xbe,
- 0x4c, 0xbd, 0x5d, 0xbd, 0x72, 0x54, 0x08, 0x3e, 0xfe, 0x6a, 0x6a, 0x3d,
- 0x3c, 0xf1, 0xa6, 0xbb, 0x2b, 0x7a, 0x0b, 0xbd, 0x66, 0x8c, 0x63, 0xbd,
- 0xc9, 0xa3, 0xc3, 0xbe, 0x9a, 0x2f, 0xad, 0x3d, 0xc9, 0x47, 0xdf, 0xbd,
- 0xfd, 0xd5, 0xb2, 0xbe, 0x02, 0x6a, 0x74, 0xbe, 0x2b, 0x70, 0x09, 0x3d,
- 0x5e, 0xc2, 0x24, 0xbe, 0x61, 0x59, 0xb4, 0x3a, 0xa4, 0x80, 0xa8, 0x3d,
- 0x79, 0xe3, 0x71, 0xbe, 0x25, 0xaf, 0xac, 0xbd, 0x89, 0xc0, 0x32, 0xbe,
- 0x92, 0x75, 0x07, 0xbe, 0xfb, 0xb7, 0x36, 0x3e, 0x4d, 0x6c, 0x10, 0xbe,
- 0xdc, 0x15, 0x8b, 0xbe, 0xf7, 0xd5, 0x10, 0x3e, 0xed, 0xae, 0x16, 0x3d,
- 0x3a, 0x56, 0xf6, 0x3d, 0x32, 0xb3, 0xe9, 0x3d, 0x06, 0xf8, 0x33, 0x3e,
- 0x12, 0xf6, 0x60, 0xbd, 0xf7, 0xe5, 0xbc, 0xbe, 0x5e, 0x20, 0x23, 0xbd,
- 0x93, 0x84, 0x6d, 0x3e, 0xc6, 0x5e, 0x93, 0x3e, 0x5f, 0xd9, 0x01, 0xbe,
- 0xc4, 0x98, 0xbb, 0xbe, 0x9a, 0x15, 0x61, 0xbd, 0x66, 0x68, 0x28, 0x3d,
- 0xbb, 0x8c, 0x30, 0xbe, 0xe3, 0x42, 0xd3, 0xbd, 0x75, 0x87, 0x8e, 0xbe,
- 0x84, 0x62, 0xdc, 0xbd, 0x66, 0x25, 0xb2, 0xbe, 0x7a, 0x61, 0x8b, 0xbe,
- 0xf3, 0x8f, 0x42, 0x3d, 0x8d, 0x3c, 0x33, 0xbb, 0x83, 0x90, 0x72, 0xbd,
- 0x25, 0xed, 0x51, 0xbe, 0x7b, 0x5b, 0x90, 0xbd, 0xd5, 0x00, 0xcd, 0xbe,
- 0x2b, 0x96, 0x4e, 0xbe, 0xd9, 0xea, 0xc2, 0xbc, 0x43, 0x2a, 0x8d, 0xbc,
- 0x22, 0xe8, 0x78, 0xbe, 0xeb, 0xfa, 0x51, 0x3e, 0x73, 0x99, 0xd6, 0x3d,
- 0xe3, 0xfb, 0xa9, 0xbd, 0x87, 0x15, 0xee, 0x3d, 0xd6, 0x8c, 0xfb, 0x3d,
- 0x24, 0x90, 0x48, 0x3e, 0x95, 0xef, 0xd7, 0xbe, 0xe5, 0xcb, 0x99, 0x3e,
- 0xa7, 0xf9, 0x7d, 0x3c, 0x59, 0xda, 0x79, 0xbe, 0x50, 0x84, 0xa9, 0x3d,
- 0x12, 0xe9, 0x8c, 0x3e, 0xd0, 0x53, 0xa1, 0xbe, 0x42, 0x5f, 0x12, 0x3e,
- 0x62, 0x7c, 0x52, 0x3e, 0xde, 0xb9, 0xd7, 0xbd, 0x68, 0x01, 0xe5, 0x3c,
- 0x60, 0x01, 0xb5, 0x3d, 0xdd, 0xb8, 0x81, 0x3e, 0xf4, 0xa1, 0x88, 0x3e,
- 0xed, 0xf6, 0x0b, 0x3e, 0x71, 0x8c, 0x78, 0xbe, 0x00, 0x22, 0x2a, 0x3e,
- 0x1a, 0x2e, 0xbf, 0xbd, 0x77, 0x61, 0x58, 0xbe, 0x03, 0xf8, 0xe1, 0xbb,
- 0x41, 0x15, 0xd1, 0xbe, 0xfc, 0x29, 0x0d, 0xbd, 0x8d, 0x91, 0xad, 0x3c,
- 0xb2, 0xb0, 0xdf, 0xbe, 0xad, 0xa5, 0x38, 0xbe, 0x82, 0x1b, 0x17, 0x3d,
- 0x4f, 0x7c, 0x38, 0xbe, 0x52, 0x3d, 0x68, 0xbe, 0x2e, 0x1a, 0x41, 0xbd,
- 0x80, 0x18, 0xaf, 0xbb, 0x17, 0xf0, 0x1b, 0xbd, 0x72, 0xd2, 0xa9, 0x3d,
- 0x47, 0xdc, 0x6f, 0x3d, 0x1c, 0xa0, 0x1d, 0x3e, 0x62, 0xda, 0xdc, 0xbd,
- 0xb4, 0x17, 0xe8, 0xbc, 0x08, 0x54, 0xb9, 0x3c, 0xf6, 0x73, 0x26, 0x3e,
- 0xe8, 0x24, 0x14, 0x3c, 0xc5, 0x63, 0x9f, 0x3e, 0x77, 0x28, 0x97, 0x3d,
- 0x36, 0xa9, 0x33, 0xbe, 0x46, 0x18, 0x00, 0xbe, 0x6e, 0xe8, 0x73, 0xbe,
- 0x5b, 0x59, 0x2d, 0xbe, 0xcc, 0x8b, 0x4b, 0xbd, 0xed, 0x99, 0x44, 0xbd,
- 0xb3, 0x25, 0x4e, 0x3e, 0x06, 0xe3, 0xad, 0xbd, 0x29, 0x41, 0xb5, 0xbd,
- 0xd9, 0x21, 0xc7, 0xbd, 0xbb, 0xae, 0x0b, 0xbe, 0x59, 0xec, 0xb5, 0x3d,
- 0x21, 0x2c, 0x95, 0x3e, 0xac, 0xa4, 0x3a, 0x3d, 0xde, 0x09, 0x72, 0x3e,
- 0x9f, 0xbd, 0x04, 0xbf, 0xac, 0x7d, 0x39, 0xbd, 0x7a, 0xc6, 0x6b, 0xbe,
- 0xd3, 0xac, 0x53, 0x3e, 0x49, 0x09, 0x9a, 0xbe, 0x60, 0x28, 0x7d, 0xbe,
- 0x42, 0xb7, 0x0c, 0x3d, 0x03, 0x1d, 0x1b, 0x3b, 0xc7, 0x35, 0x05, 0x3e,
- 0x7d, 0x43, 0x86, 0xbe, 0x0e, 0x9d, 0x92, 0xbd, 0xb5, 0x8d, 0x1a, 0x3d,
- 0x37, 0xce, 0x05, 0x3e, 0xe7, 0x06, 0x42, 0xbe, 0xc0, 0xce, 0x25, 0xbe,
- 0x34, 0x29, 0x2c, 0xbc, 0x2b, 0x3b, 0x68, 0xbe, 0x05, 0x22, 0xaf, 0xbe,
- 0xf6, 0xac, 0xb5, 0xbd, 0xf9, 0x48, 0x68, 0xbe, 0xc4, 0x93, 0xd4, 0x3d,
- 0xa6, 0xba, 0xb3, 0x3d, 0x7c, 0xfb, 0x80, 0xbe, 0xe9, 0xeb, 0x7f, 0xbe,
- 0xb1, 0x7c, 0xe9, 0xbd, 0xe7, 0xb1, 0x73, 0xbc, 0xce, 0x62, 0xee, 0xbe,
- 0x79, 0x8c, 0x13, 0xbd, 0xdc, 0x28, 0xcc, 0xbd, 0xa4, 0xd2, 0x95, 0xbd,
- 0x07, 0x10, 0xf7, 0xbd, 0x77, 0x00, 0xc8, 0xbd, 0x3b, 0x7d, 0x9c, 0xbc,
- 0x8b, 0x7c, 0x97, 0x3e, 0xc3, 0xac, 0x52, 0xbd, 0x7e, 0x7e, 0x84, 0x3e,
- 0x63, 0x1c, 0x86, 0xbd, 0x7e, 0xe8, 0xaa, 0xbe, 0x72, 0x52, 0xaf, 0x3d,
- 0xce, 0x2a, 0x7a, 0xbe, 0xea, 0x09, 0x30, 0xbd, 0x7d, 0x55, 0x76, 0x3e,
- 0x2d, 0xf0, 0x30, 0x3e, 0x77, 0xf8, 0x5a, 0xbd, 0x88, 0xb6, 0xf8, 0x3c,
- 0x58, 0x1f, 0x27, 0xbd, 0x80, 0x88, 0x04, 0xbc, 0x89, 0x60, 0x92, 0xbd,
- 0x2f, 0xd0, 0x04, 0xbe, 0xa3, 0x18, 0x33, 0xbe, 0x75, 0x8e, 0xb7, 0xbd,
- 0x22, 0xb8, 0x19, 0xbf, 0x99, 0xce, 0x53, 0xbe, 0x89, 0x76, 0x6c, 0xbe,
- 0xae, 0x4c, 0xb6, 0xbc, 0x33, 0x62, 0xc3, 0x3d, 0xc6, 0x3b, 0x09, 0x3e,
- 0xb2, 0x04, 0xc4, 0x3d, 0xa5, 0xb8, 0x07, 0x3e, 0xfb, 0xfc, 0x58, 0x3e,
- 0xef, 0x9d, 0xe6, 0xbc, 0xde, 0x16, 0x22, 0xbf, 0x4e, 0xaf, 0x48, 0x3d,
- 0x3d, 0xac, 0xd6, 0xbd, 0x97, 0xe1, 0x51, 0x3e, 0x7c, 0xc7, 0x06, 0xbe,
- 0xe1, 0x0a, 0x45, 0xbd, 0xdd, 0x00, 0x8a, 0x3d, 0xfc, 0xc9, 0xf9, 0xbd,
- 0x59, 0x81, 0xc8, 0xbd, 0x1e, 0x57, 0xe8, 0xbd, 0xd1, 0x77, 0x22, 0xbe,
- 0x33, 0x09, 0x96, 0x3e, 0x5b, 0xa5, 0x42, 0x3e, 0xe5, 0xc3, 0xf9, 0x3d,
- 0x4b, 0x79, 0x12, 0x3e, 0xd6, 0xfe, 0x0f, 0x3c, 0x32, 0x10, 0xdb, 0xbd,
- 0xbe, 0x1b, 0x10, 0xbd, 0x4a, 0xfe, 0x11, 0xbe, 0x22, 0xb8, 0x34, 0xbe,
- 0x98, 0xc9, 0xd0, 0x3d, 0xe7, 0xee, 0x64, 0xbe, 0x60, 0x6b, 0x41, 0xbe,
- 0x29, 0xb9, 0x33, 0x3e, 0x30, 0x5a, 0xa4, 0x3d, 0x03, 0xb0, 0x9d, 0xbe,
- 0xb4, 0x0a, 0xd4, 0x3e, 0x06, 0xdb, 0x08, 0x3d, 0x23, 0x79, 0xf6, 0xbd,
- 0x2a, 0x78, 0x10, 0xbd, 0xad, 0xee, 0xe5, 0xbd, 0xf9, 0x98, 0x47, 0xbe,
- 0x7e, 0xef, 0x3e, 0xbe, 0x04, 0x7c, 0x6e, 0xbe, 0xbe, 0x07, 0xd1, 0x3b,
- 0x85, 0xd2, 0x10, 0xbe, 0x38, 0x85, 0xd9, 0xbc, 0x34, 0x22, 0xeb, 0x3d,
- 0xaa, 0x8d, 0x90, 0x3e, 0x55, 0xae, 0x29, 0x3e, 0x56, 0x8a, 0x90, 0xbc,
- 0x65, 0x76, 0x10, 0xbe, 0xba, 0x80, 0xf3, 0xbd, 0xfb, 0x48, 0x86, 0xbd,
- 0xf6, 0xe3, 0xc8, 0x3e, 0x90, 0xf3, 0x60, 0x3e, 0x88, 0xbe, 0x67, 0xbd,
- 0x17, 0x7d, 0x13, 0x3e, 0x04, 0xf4, 0x45, 0x3e, 0xb7, 0xdc, 0xaf, 0x3b,
- 0xa0, 0x9f, 0x71, 0x3c, 0xdc, 0x91, 0xf3, 0x3c, 0xac, 0x7f, 0x0d, 0xbd,
- 0xa9, 0x5a, 0x94, 0xbd, 0x4a, 0x61, 0x96, 0x3e, 0x04, 0xf0, 0x71, 0xbd,
- 0xe9, 0x83, 0x10, 0xbc, 0x82, 0x77, 0x0f, 0xbe, 0xd9, 0x77, 0x1d, 0xbc,
- 0xac, 0x05, 0x29, 0x3e, 0x84, 0xf1, 0xed, 0x3b, 0xbc, 0xd3, 0x76, 0xbe,
- 0xa3, 0x6e, 0x9c, 0x3d, 0xaf, 0x27, 0x6f, 0xbd, 0x54, 0x2b, 0x06, 0xbe,
- 0x91, 0x3e, 0xf0, 0x3c, 0x5c, 0xf2, 0xf4, 0xbc, 0xbd, 0x62, 0x83, 0x3e,
- 0x6c, 0xc3, 0x51, 0xbe, 0x6f, 0x49, 0x41, 0xbe, 0xff, 0x46, 0xcb, 0x3d,
- 0x95, 0xfc, 0x75, 0xbc, 0x30, 0xdd, 0x87, 0xbe, 0xa5, 0x1e, 0xb0, 0xbd,
- 0xc6, 0xf4, 0x83, 0x3d, 0xc3, 0xb8, 0xa6, 0xbc, 0xa4, 0x67, 0x2c, 0x3e,
- 0x58, 0x5e, 0x26, 0xbe, 0x96, 0x46, 0x86, 0x3c, 0xad, 0x9b, 0x7c, 0xbd,
- 0xa6, 0xc4, 0x84, 0x3d, 0x9b, 0x8c, 0x51, 0xbe, 0xf2, 0xd6, 0x57, 0xbd,
- 0x08, 0xa4, 0xbc, 0xbe, 0x9d, 0x4d, 0x61, 0xbd, 0x39, 0x7d, 0xf6, 0x3c,
- 0xa9, 0x25, 0x36, 0xbe, 0xed, 0xda, 0x86, 0x3c, 0xff, 0x4c, 0x8b, 0xbe,
- 0x5d, 0xa6, 0x51, 0x3e, 0x8d, 0x71, 0xa7, 0xbe, 0x70, 0xd9, 0x39, 0x3e,
- 0xe9, 0x57, 0xc3, 0xbd, 0x0c, 0xce, 0xf9, 0xbc, 0x71, 0xc0, 0xfd, 0xbd,
- 0x7a, 0x00, 0xb8, 0xbd, 0xea, 0xf8, 0xa9, 0x3b, 0x12, 0x05, 0x28, 0x3c,
- 0x06, 0x1a, 0xec, 0x3b, 0xb5, 0xe9, 0xb9, 0xbd, 0x95, 0xbb, 0x29, 0xbe,
- 0x4e, 0x7d, 0x18, 0x3d, 0xec, 0x73, 0xf2, 0xbc, 0x93, 0x22, 0x82, 0xbd,
- 0xfa, 0x5e, 0x36, 0x3e, 0x6a, 0xf9, 0x84, 0x3d, 0xa8, 0x49, 0xe6, 0xbd,
- 0xff, 0x4d, 0x82, 0xbc, 0x56, 0x2d, 0xd7, 0x3e, 0xac, 0x74, 0x3d, 0x3e,
- 0x16, 0xb2, 0x73, 0x3e, 0x12, 0x54, 0x99, 0x3d, 0x82, 0x72, 0xa3, 0xbe,
- 0x69, 0x9a, 0xbe, 0x3c, 0x44, 0x2d, 0x6d, 0x3e, 0x5d, 0x24, 0x41, 0x3e,
- 0xe9, 0xac, 0xdc, 0x3b, 0x97, 0x19, 0x3b, 0xbe, 0x41, 0x4b, 0x88, 0xbd,
- 0x2b, 0x42, 0x07, 0xbd, 0xab, 0xb4, 0xba, 0xbe, 0x3c, 0xe3, 0x09, 0x3d,
- 0x3e, 0x11, 0xc8, 0x3e, 0x70, 0x8a, 0xfe, 0x3c, 0x55, 0xe8, 0xb8, 0xbe,
- 0x9f, 0x2f, 0x08, 0x3d, 0x1d, 0xd6, 0xd1, 0xbd, 0x1f, 0xfb, 0xfa, 0xbd,
- 0x98, 0xe4, 0x87, 0xbd, 0x98, 0x3a, 0x91, 0x3c, 0xb2, 0x53, 0x18, 0xbf,
- 0x86, 0x8f, 0x9e, 0x3d, 0x72, 0xb6, 0xd3, 0xbe, 0xac, 0x4a, 0x54, 0xbe,
- 0xb3, 0xde, 0xaf, 0xbe, 0x40, 0x43, 0x68, 0xbe, 0xab, 0xd9, 0xa8, 0x3d,
- 0x4d, 0xb8, 0x0c, 0xbe, 0xa7, 0xee, 0x84, 0x39, 0x84, 0x25, 0xcd, 0xba,
- 0x8c, 0x89, 0xaf, 0xbd, 0x47, 0xa1, 0xd9, 0x3d, 0xe2, 0x07, 0x0a, 0xbe,
- 0xfc, 0xb0, 0x52, 0x3e, 0x0b, 0x64, 0x0a, 0x3e, 0x43, 0xad, 0x86, 0x3d,
- 0x31, 0x1f, 0xfd, 0xbd, 0xd9, 0x2b, 0x0c, 0xbe, 0x40, 0x7e, 0xbe, 0x3d,
- 0xf1, 0x64, 0xb7, 0xbb, 0xf2, 0x0f, 0xb6, 0xbe, 0x92, 0xaf, 0x73, 0xbe,
- 0xc4, 0xfb, 0xff, 0x3d, 0xa8, 0x6b, 0xa6, 0x3d, 0x5d, 0x5f, 0xaf, 0xbe,
- 0x0c, 0x9f, 0xa1, 0x3d, 0xb8, 0xdf, 0x42, 0x3e, 0xee, 0xf9, 0x62, 0xbe,
- 0x22, 0x83, 0xc5, 0x3d, 0xb2, 0xfd, 0x8b, 0x3d, 0x6d, 0x1b, 0x33, 0x3e,
- 0x12, 0x64, 0x40, 0x3c, 0x7d, 0x73, 0x4b, 0x3e, 0xab, 0xa9, 0xf8, 0xbd,
- 0x00, 0xb2, 0xb2, 0xbc, 0x7d, 0xbb, 0xa8, 0xbe, 0x00, 0x0b, 0x2c, 0xbe,
- 0x52, 0xf7, 0x0d, 0xbe, 0x2e, 0x6a, 0xa7, 0x3c, 0x67, 0xb2, 0x9c, 0xbc,
- 0xd7, 0x3a, 0x23, 0x3e, 0x28, 0x3e, 0x2e, 0xbd, 0x6a, 0x22, 0x3d, 0xbe,
- 0x52, 0xcb, 0xe0, 0xbb, 0x07, 0x91, 0xae, 0xbe, 0x7b, 0x8f, 0x03, 0xbe,
- 0x67, 0xb9, 0xdc, 0xbd, 0x42, 0x9c, 0xca, 0xbe, 0x1b, 0xcc, 0xc4, 0xbd,
- 0x2d, 0xd6, 0xa2, 0xbd, 0x51, 0x18, 0xa7, 0xbd, 0x20, 0x16, 0xf6, 0xbc,
- 0xa9, 0x21, 0x07, 0x3e, 0x14, 0x95, 0x1e, 0xbe, 0x11, 0xc4, 0xb7, 0xbe,
- 0xc7, 0x0c, 0xdb, 0xbd, 0x45, 0xb1, 0x47, 0xbe, 0xc2, 0x0c, 0x2a, 0xbe,
- 0xef, 0x7e, 0x48, 0x3e, 0xe2, 0x80, 0x25, 0xbd, 0x2b, 0x8b, 0xbd, 0x3d,
- 0x78, 0xba, 0x46, 0xbe, 0x72, 0xe6, 0x57, 0x3e, 0xb1, 0x1d, 0x0d, 0xbf,
- 0x04, 0xe0, 0x7f, 0xbe, 0x3c, 0x54, 0x13, 0xbe, 0x05, 0x42, 0x11, 0xbf,
- 0xa1, 0xe4, 0xe6, 0xbe, 0x24, 0xb2, 0x8b, 0xbe, 0xad, 0xf6, 0x6a, 0xbe,
- 0x1e, 0x09, 0xeb, 0x3d, 0xf8, 0xde, 0xa3, 0xbe, 0xc1, 0x98, 0x80, 0xbe,
- 0x81, 0xbe, 0xa8, 0xbe, 0xfd, 0x56, 0x28, 0x3c, 0x8c, 0x90, 0xaa, 0x3d,
- 0x8f, 0xdc, 0x65, 0xbe, 0x44, 0x0f, 0x96, 0xbe, 0xbe, 0x49, 0x72, 0xbe,
- 0x67, 0x84, 0x20, 0xbe, 0x0a, 0x0d, 0x11, 0x3c, 0x0b, 0xec, 0xac, 0xbd,
- 0x0e, 0x13, 0xc3, 0xbc, 0x91, 0xb7, 0x2b, 0xbe, 0xb4, 0x52, 0x8d, 0xbe,
- 0xa1, 0xf8, 0x15, 0x3e, 0x71, 0x95, 0xca, 0xbd, 0x1a, 0x88, 0x88, 0xbd,
- 0x12, 0x91, 0x06, 0xbe, 0x0c, 0x50, 0x22, 0xbe, 0x67, 0x43, 0x8d, 0xbd,
- 0x58, 0x28, 0xb4, 0xbd, 0x58, 0xe0, 0x6a, 0xbe, 0x87, 0xf3, 0xd5, 0xbe,
- 0xe8, 0xe4, 0xbf, 0xbd, 0xa1, 0x93, 0xc7, 0xbd, 0xaf, 0x60, 0x9e, 0xbd,
- 0x57, 0xfd, 0xba, 0xbe, 0xab, 0x14, 0x82, 0xbe, 0x21, 0xcb, 0x91, 0xbe,
- 0xaa, 0xc0, 0x18, 0xbe, 0x26, 0xd2, 0x04, 0x3d, 0x5d, 0xe8, 0xfd, 0xbe,
- 0xc7, 0x90, 0x1f, 0xbe, 0x2a, 0x36, 0xb7, 0xbd, 0x64, 0x48, 0x16, 0xbe,
- 0x6c, 0xd8, 0x17, 0xbd, 0x1f, 0x55, 0x43, 0xbe, 0x96, 0x26, 0xef, 0xbb,
- 0xc0, 0x76, 0x2b, 0x3c, 0xbe, 0x59, 0x0c, 0xbc, 0x00, 0xc0, 0x39, 0xbc,
- 0xf6, 0x9b, 0xe9, 0x3d, 0x87, 0xe7, 0x50, 0xbd, 0x89, 0x65, 0xbc, 0xbd,
- 0x9d, 0x23, 0x20, 0x3e, 0x21, 0xcd, 0xdc, 0x3c, 0x27, 0x1e, 0xc9, 0xbe,
- 0x0c, 0x88, 0x4f, 0xbe, 0xe4, 0xff, 0x7d, 0xbd, 0xa2, 0x81, 0x70, 0x3d,
- 0x4a, 0x6e, 0x21, 0xbe, 0xf9, 0x41, 0x07, 0x3e, 0xc5, 0x5c, 0xa6, 0xbc,
- 0x35, 0x1d, 0x1e, 0xbe, 0xe9, 0xf9, 0x85, 0xbd, 0x74, 0x26, 0x07, 0xbe,
- 0x7c, 0x5f, 0x6f, 0xbe, 0x0a, 0x58, 0x17, 0xbe, 0xbf, 0x0b, 0x56, 0xbd,
- 0x86, 0x99, 0x3b, 0xbd, 0x85, 0x1c, 0xa7, 0xbb, 0xd3, 0x18, 0x7d, 0xbe,
- 0xfb, 0xf8, 0x9f, 0xbd, 0x3e, 0x84, 0xfb, 0xbc, 0x82, 0x7a, 0x5d, 0xbe,
- 0x43, 0xbc, 0xc0, 0xbd, 0x56, 0x58, 0x96, 0xbe, 0x54, 0x14, 0x39, 0x3d,
- 0x4e, 0xfb, 0xad, 0xbc, 0x27, 0x8d, 0x8e, 0xbd, 0xf1, 0x46, 0x7c, 0xbd,
- 0x08, 0x77, 0x4a, 0xbe, 0xaa, 0x86, 0xf1, 0xbd, 0xfb, 0xb0, 0x1a, 0xbe,
- 0x6e, 0xc7, 0x9a, 0xbe, 0x19, 0x96, 0xc5, 0x3c, 0xef, 0xe7, 0x16, 0xbe,
- 0x3a, 0x74, 0x7c, 0x3d, 0xec, 0x55, 0xe4, 0xbd, 0xf7, 0x0c, 0xc8, 0xbe,
- 0xb3, 0xa4, 0x92, 0xbe, 0x48, 0xdc, 0x0a, 0xbe, 0xf1, 0x9e, 0x69, 0xbe,
- 0xac, 0xb2, 0x98, 0xbe, 0x7f, 0xbc, 0x13, 0xbe, 0xeb, 0x6f, 0x12, 0xbe,
- 0x38, 0x32, 0x6f, 0xbe, 0xdc, 0x3d, 0xbf, 0xbe, 0x8f, 0x0f, 0x84, 0xbe,
- 0x1f, 0xb7, 0x00, 0x3e, 0x06, 0x21, 0xaf, 0x3d, 0x18, 0x43, 0xb4, 0xbe,
- 0x48, 0xba, 0xdb, 0x3d, 0xfa, 0xbe, 0x86, 0x3b, 0x1d, 0x3b, 0x2b, 0x3c,
- 0xd8, 0xb0, 0xb7, 0xba, 0x53, 0x0e, 0x69, 0xbe, 0xc2, 0x6f, 0x98, 0xbd,
- 0xe4, 0xdd, 0x10, 0x3e, 0x0f, 0x2f, 0x6d, 0xbe, 0xcf, 0x80, 0x4c, 0x3d,
- 0x5a, 0xd1, 0x36, 0xbd, 0x87, 0xdf, 0x12, 0xbd, 0x15, 0x32, 0x58, 0xbe,
- 0x82, 0x9d, 0xb9, 0xbd, 0x59, 0xbb, 0x8a, 0x3d, 0xc6, 0x3d, 0xb9, 0x3d,
- 0x6b, 0x9b, 0x10, 0x3e, 0x8a, 0x4c, 0x2a, 0xbe, 0x93, 0x93, 0x5d, 0xbe,
- 0x38, 0x28, 0x88, 0xbe, 0x33, 0xfa, 0x99, 0xbe, 0x92, 0x3d, 0x0a, 0xbf,
- 0x6b, 0x75, 0xc8, 0x3c, 0x91, 0x58, 0x66, 0xbe, 0x97, 0x97, 0xb4, 0xbd,
- 0xbf, 0x9a, 0x72, 0xbe, 0x32, 0x5d, 0xe6, 0xbd, 0x46, 0x64, 0x9e, 0xbd,
- 0x22, 0x49, 0x6f, 0xbd, 0xa0, 0xfa, 0x09, 0xbe, 0x7a, 0x00, 0x05, 0xba,
- 0x6b, 0x20, 0x99, 0xbe, 0xda, 0xac, 0xff, 0xbe, 0x11, 0xda, 0x3e, 0x3e,
- 0xa8, 0x69, 0x96, 0xbc, 0x25, 0x46, 0x03, 0xbe, 0xca, 0xa8, 0x83, 0x3d,
- 0x9d, 0x46, 0x91, 0xbb, 0x98, 0xe7, 0x1c, 0xbc, 0xfe, 0xe6, 0x0a, 0xbe,
- 0x1a, 0x8a, 0x92, 0x3d, 0x5b, 0xfd, 0x9e, 0xbd, 0x9a, 0x85, 0xc0, 0xbb,
- 0x12, 0x49, 0xb2, 0xbd, 0x55, 0x50, 0x66, 0xbd, 0x8d, 0x50, 0x82, 0xbe,
- 0x5f, 0x44, 0x01, 0x3b, 0x10, 0x46, 0xb5, 0x3d, 0xa9, 0xdc, 0xca, 0x3d,
- 0x1f, 0xae, 0x91, 0xbe, 0x82, 0x15, 0x5f, 0xbe, 0xa5, 0x43, 0xcf, 0xbe,
- 0x9c, 0xb4, 0x68, 0xbc, 0x06, 0x6c, 0x21, 0xbe, 0xbb, 0x45, 0xc0, 0xbe,
- 0xc3, 0xe8, 0x86, 0xbe, 0x5f, 0x72, 0x20, 0xbe, 0xd4, 0x78, 0x72, 0x3b,
- 0x4d, 0x70, 0x39, 0x3d, 0x8f, 0xf9, 0x09, 0xbe, 0x6b, 0x4f, 0x7a, 0xbe,
- 0x75, 0x22, 0xfd, 0xbd, 0x15, 0x07, 0x0b, 0xbe, 0x52, 0xa2, 0x4f, 0x3d,
- 0x78, 0x7b, 0xc8, 0x3d, 0xcb, 0x00, 0x08, 0xbe, 0xe9, 0xb9, 0x9b, 0xbe,
- 0x2e, 0x7c, 0x9c, 0x3c, 0x71, 0x71, 0xb5, 0x3d, 0xd5, 0x63, 0x23, 0xbb,
- 0x33, 0x91, 0x02, 0xbd, 0xec, 0x58, 0x2b, 0xbe, 0xc4, 0xc7, 0x62, 0xbe,
- 0x04, 0xd0, 0x64, 0xbd, 0xaa, 0x4c, 0x3a, 0x3c, 0xf2, 0x77, 0x99, 0xbd,
- 0x93, 0xad, 0xa2, 0xbe, 0x80, 0xd0, 0x7a, 0xbe, 0x30, 0x15, 0x1a, 0xbd,
- 0xdb, 0x2d, 0x81, 0xbe, 0xcc, 0x62, 0x6a, 0xbe, 0xa8, 0x05, 0x1d, 0xbe,
- 0x37, 0xd4, 0xbd, 0xbd, 0x07, 0x39, 0xa3, 0x3b, 0xe3, 0x43, 0xb6, 0xbe,
- 0x63, 0x7d, 0x56, 0xbd, 0x25, 0x8c, 0x13, 0x3d, 0xed, 0x93, 0x05, 0xbe,
- 0x31, 0xb3, 0x43, 0x3e, 0xee, 0x52, 0x88, 0xb9, 0xf3, 0x81, 0x1c, 0xbe,
- 0x92, 0x0b, 0xd6, 0xbc, 0x4f, 0xa0, 0xba, 0xbe, 0x3b, 0xaa, 0x3e, 0xbd,
- 0x78, 0x3a, 0x87, 0xbe, 0x7c, 0x98, 0xee, 0xbe, 0x69, 0x56, 0xb9, 0xbe,
- 0x78, 0x09, 0x00, 0xbe, 0x24, 0xbc, 0xbc, 0x3d, 0xe8, 0x0d, 0x64, 0xbd,
- 0x22, 0xff, 0x23, 0xbe, 0x1a, 0x51, 0xe5, 0xbd, 0x47, 0xed, 0xd6, 0xbe,
- 0xd2, 0x24, 0x33, 0x3e, 0xd2, 0x4c, 0xa6, 0xbd, 0x30, 0xe0, 0x07, 0xbe,
- 0x3c, 0xff, 0xbf, 0xbd, 0x42, 0x06, 0x36, 0xbe, 0x3f, 0xdc, 0x01, 0xbd,
- 0x8e, 0x5b, 0x4d, 0xbe, 0xd5, 0xfa, 0x1c, 0xbe, 0x02, 0xfb, 0x96, 0x3b,
- 0xca, 0xdd, 0x44, 0x3c, 0xe9, 0xc7, 0x25, 0x3c, 0xb9, 0x08, 0x22, 0xbe,
- 0xee, 0xa1, 0x2f, 0xbe, 0xa4, 0x2f, 0x45, 0xbe, 0x39, 0x89, 0x92, 0xbe,
- 0xb2, 0x76, 0x8c, 0xbe, 0x82, 0x6b, 0xcb, 0xbb, 0xf2, 0x3b, 0x79, 0x3e,
- 0xf2, 0x66, 0x8a, 0x3d, 0x26, 0x0e, 0x29, 0xbe, 0x0b, 0x8c, 0xcd, 0xbe,
- 0xfa, 0x13, 0xab, 0xbe, 0xfb, 0xd9, 0xf7, 0x3d, 0x6d, 0xae, 0x43, 0xbd,
- 0xec, 0x22, 0x2b, 0xbc, 0xaf, 0xd5, 0xd8, 0xbc, 0x41, 0x69, 0xd4, 0xbe,
- 0xf1, 0xc3, 0x5c, 0x3e, 0xc6, 0x11, 0x78, 0x3e, 0x36, 0xc1, 0x35, 0xbe,
- 0xcc, 0x0c, 0xca, 0x3d, 0x28, 0x12, 0xc9, 0xbd, 0x69, 0x92, 0xad, 0x3c,
- 0x0b, 0xc5, 0x6d, 0xbd, 0xf1, 0x41, 0x34, 0xbe, 0x35, 0x00, 0x09, 0xbf,
- 0x5e, 0x60, 0x98, 0xbd, 0x64, 0x47, 0x13, 0xbc, 0x6b, 0xdc, 0x0a, 0xbe,
- 0xef, 0xea, 0x91, 0x3d, 0x57, 0xee, 0x8e, 0x3c, 0xfb, 0x3b, 0x13, 0xbe,
- 0xff, 0x9d, 0x05, 0x3e, 0xcd, 0x02, 0x9a, 0x3d, 0x8c, 0x23, 0x20, 0x3c,
- 0x12, 0xe5, 0x60, 0x3e, 0xfd, 0x26, 0x4d, 0x3e, 0xb2, 0xc0, 0xa8, 0x3d,
- 0x06, 0x66, 0xae, 0xbd, 0xc0, 0x02, 0x06, 0x3e, 0x47, 0xd3, 0x87, 0xbe,
- 0x5d, 0x69, 0x50, 0x3d, 0x1f, 0xbf, 0x1b, 0xbe, 0x90, 0xc1, 0xea, 0x3d,
- 0x61, 0x5b, 0xcf, 0xbe, 0x0c, 0x76, 0x2a, 0x3e, 0x24, 0xa3, 0x32, 0xbe,
- 0xed, 0xfe, 0x05, 0x3b, 0x13, 0x41, 0xf4, 0x3d, 0x67, 0xf3, 0x96, 0x3d,
- 0x7c, 0x49, 0x97, 0xbd, 0x4d, 0x95, 0x04, 0xbe, 0xc9, 0x41, 0x3a, 0x3d,
- 0x90, 0xf0, 0xec, 0x3d, 0xa9, 0x8c, 0x8c, 0xbe, 0x56, 0xf6, 0x17, 0xbe,
- 0x6a, 0x77, 0x28, 0xbc, 0xb9, 0x55, 0x92, 0xbd, 0x44, 0x4f, 0x73, 0x3e,
- 0xdc, 0xdd, 0xa0, 0xbd, 0x42, 0x9a, 0x32, 0x3d, 0x1d, 0x46, 0x38, 0xbe,
- 0xaa, 0x94, 0x64, 0x3c, 0x4a, 0xf0, 0x50, 0xbe, 0x64, 0xbd, 0xa9, 0x3d,
- 0x4a, 0xbe, 0x84, 0xba, 0xa0, 0x61, 0x37, 0x3d, 0x17, 0x7c, 0x43, 0xbe,
- 0x37, 0x5f, 0x6d, 0x3e, 0x0d, 0xdd, 0xf3, 0xbc, 0x0a, 0x35, 0x4a, 0xbd,
- 0xc6, 0xc0, 0x72, 0x3d, 0xbe, 0x1e, 0x29, 0x3d, 0x0e, 0x4b, 0xbb, 0xba,
- 0x6f, 0x8f, 0xbd, 0x3d, 0xf0, 0xcd, 0x2e, 0xbe, 0x79, 0x16, 0xbd, 0xbd,
- 0x84, 0x28, 0x43, 0xbe, 0x0f, 0x1f, 0xb2, 0xbc, 0x99, 0x9b, 0x0a, 0xbd,
- 0x34, 0x3f, 0xce, 0x3d, 0xfa, 0xba, 0x90, 0xbd, 0x18, 0x54, 0x4b, 0x3e,
- 0x77, 0xad, 0x94, 0x3d, 0xa2, 0x9a, 0x17, 0x3e, 0x71, 0x93, 0xa9, 0x3c,
- 0x2d, 0xc7, 0x87, 0xbe, 0x96, 0x3d, 0x26, 0xbe, 0xf9, 0xa8, 0x3f, 0x3e,
- 0x25, 0x34, 0x7f, 0xbc, 0x46, 0xa4, 0xa7, 0xbe, 0x9f, 0x7f, 0xd5, 0xbd,
- 0xe3, 0xa3, 0x89, 0xbd, 0x0a, 0xae, 0x00, 0xbe, 0x31, 0xbc, 0x73, 0xbe,
- 0x7b, 0x88, 0x8b, 0xbe, 0x1b, 0x33, 0x3d, 0x3e, 0x56, 0x91, 0xad, 0x3d,
- 0x5e, 0x43, 0x18, 0xbe, 0x9c, 0xad, 0xe4, 0xbe, 0xdf, 0xe9, 0xf0, 0xbb,
- 0x59, 0x30, 0x05, 0x3e, 0x5f, 0xff, 0xa5, 0xbe, 0x2f, 0x7f, 0xe4, 0xbd,
- 0xf9, 0x3c, 0x83, 0xbd, 0xb9, 0x0e, 0x29, 0xbe, 0x96, 0xcb, 0x75, 0xbe,
- 0x3c, 0x15, 0x63, 0xbe, 0x10, 0xfe, 0x69, 0x3d, 0x60, 0xaf, 0xa9, 0xbd,
- 0x12, 0x64, 0x1c, 0xbc, 0x01, 0x60, 0x3e, 0x3c, 0x96, 0xd6, 0x81, 0x3d,
- 0x8c, 0xfb, 0x2a, 0x3e, 0xf1, 0x1f, 0x38, 0xbe, 0xbb, 0x33, 0x95, 0x3c,
- 0x32, 0x86, 0x60, 0xbe, 0x01, 0x76, 0x73, 0xbe, 0x39, 0xaa, 0xf1, 0x3d,
- 0x02, 0x5d, 0x32, 0x3e, 0x14, 0xef, 0xce, 0x3d, 0x92, 0x90, 0x9c, 0x3d,
- 0x09, 0x7d, 0x37, 0x3d, 0x3b, 0x2c, 0x0a, 0xbf, 0xd5, 0x1a, 0x05, 0x3d,
- 0x71, 0xaf, 0x0d, 0xbe, 0x59, 0xe8, 0xce, 0xbd, 0x2c, 0x2e, 0x14, 0x3e,
- 0xbb, 0x63, 0x42, 0x3d, 0x9c, 0x59, 0xf6, 0xbb, 0x21, 0xd6, 0x81, 0x3d,
- 0x7d, 0x98, 0xe7, 0x3d, 0xc3, 0x81, 0xd4, 0xbd, 0x23, 0xb6, 0xdd, 0x3d,
- 0xc3, 0xf3, 0x4e, 0xbe, 0x49, 0xdd, 0xd2, 0x3c, 0x8a, 0x7c, 0x8b, 0xbe,
- 0x7e, 0xdc, 0x10, 0xbd, 0x46, 0x17, 0x90, 0xbe, 0x17, 0x0e, 0x2b, 0xbc,
- 0x3e, 0x5f, 0x84, 0xbd, 0xf8, 0x68, 0x26, 0xbe, 0xae, 0x7b, 0x9e, 0xbe,
- 0x00, 0x78, 0x26, 0xbf, 0x6a, 0xcb, 0x44, 0xbe, 0x65, 0x75, 0x89, 0xbd,
- 0x89, 0x61, 0x55, 0x3e, 0x5b, 0xe2, 0x7a, 0xbd, 0x2e, 0xb0, 0x84, 0xbe,
- 0xe5, 0x34, 0x06, 0xbf, 0x6c, 0x67, 0xe3, 0xbe, 0x88, 0xa0, 0xcb, 0x3d,
- 0x9d, 0xb3, 0xdd, 0xbd, 0x31, 0x98, 0x46, 0xbe, 0xcc, 0xe0, 0xc7, 0xbd,
- 0xd9, 0x01, 0x27, 0xbe, 0x2b, 0xc8, 0x13, 0x3e, 0x2a, 0xfe, 0x33, 0x3c,
- 0x83, 0xc0, 0xa7, 0x3d, 0x64, 0x9d, 0xb9, 0xbd, 0xd4, 0xca, 0x82, 0x3b,
- 0x8d, 0x53, 0xd3, 0xbe, 0xa4, 0x2d, 0x55, 0xbe, 0x1e, 0x16, 0x83, 0xbe,
- 0x4e, 0x5f, 0x1e, 0xbd, 0x40, 0xa9, 0x3c, 0x3b, 0x2c, 0x2b, 0xf2, 0xbd,
- 0xa7, 0x92, 0x27, 0xbe, 0x0d, 0x27, 0x8b, 0xbd, 0x49, 0xa9, 0x08, 0xbd,
- 0xe5, 0x17, 0x5e, 0xbe, 0xd4, 0x3a, 0xa5, 0xbe, 0xa9, 0x99, 0xb6, 0xbd,
- 0xe3, 0x92, 0x29, 0xbd, 0x6e, 0x44, 0xe7, 0xbe, 0x84, 0x5c, 0x24, 0x3c,
- 0x30, 0xd2, 0x1d, 0x3e, 0xfa, 0x2b, 0x4c, 0xbf, 0xf2, 0x3d, 0x87, 0x3d,
- 0xb6, 0xc2, 0x9d, 0xbb, 0x74, 0xa5, 0x5f, 0xbe, 0x68, 0x17, 0x9e, 0x3c,
- 0x4b, 0x41, 0x80, 0xbe, 0x58, 0x55, 0xd8, 0xbe, 0xe2, 0x3e, 0x12, 0x3d,
- 0xbb, 0xf3, 0x61, 0xbc, 0x6f, 0xbb, 0x9d, 0xbe, 0x1b, 0x5d, 0xbc, 0xbe,
- 0xb1, 0x21, 0x34, 0xbe, 0xbd, 0x34, 0x07, 0xbd, 0x97, 0x98, 0x02, 0xbf,
- 0x53, 0xfc, 0x99, 0x3d, 0xaa, 0xbc, 0x16, 0xbc, 0x0b, 0x87, 0xd7, 0xbd,
- 0xe2, 0xa3, 0xe9, 0x3d, 0x2f, 0x43, 0xe9, 0xbd, 0x58, 0x9b, 0xc2, 0x3d,
- 0xfe, 0x55, 0xf4, 0xbe, 0x6a, 0xc8, 0xc8, 0xbe, 0xd5, 0x37, 0xc9, 0xbd,
- 0xe4, 0xc8, 0x1d, 0xbe, 0x7f, 0x7a, 0x95, 0x3d, 0xfe, 0x9d, 0xb3, 0x3d,
- 0xca, 0x14, 0x23, 0xbd, 0x24, 0xc3, 0x91, 0xbd, 0x83, 0x82, 0x0a, 0x3d,
- 0xab, 0xc9, 0x85, 0xbe, 0xc0, 0x54, 0xe8, 0x3d, 0x7d, 0x38, 0xc0, 0xbd,
- 0x9c, 0xb1, 0x79, 0xbe, 0xaf, 0xb8, 0x1b, 0xbe, 0xdc, 0x60, 0xa5, 0x3d,
- 0x7e, 0x15, 0x8d, 0xbd, 0x3d, 0xf2, 0xd8, 0x3d, 0x9c, 0x8f, 0x00, 0xbf,
- 0xc3, 0x44, 0x5b, 0xbe, 0x67, 0x4b, 0xe5, 0xbb, 0xe8, 0x3b, 0xf9, 0xbd,
- 0x8d, 0x7b, 0x03, 0xbf, 0x3f, 0x74, 0x90, 0xbe, 0x97, 0x6c, 0xa7, 0x3d,
- 0x72, 0x80, 0x79, 0x3d, 0x7b, 0x05, 0xeb, 0x3d, 0x08, 0x35, 0x7c, 0x3d,
- 0xc1, 0x78, 0x35, 0xbe, 0x47, 0xed, 0xb2, 0x3d, 0x52, 0x31, 0x80, 0xbd,
- 0x8d, 0x55, 0x4c, 0xbf, 0xfa, 0xb4, 0x05, 0xbd, 0x12, 0x34, 0xdb, 0x3d,
- 0x01, 0x0c, 0x81, 0x3d, 0x29, 0x4f, 0x2a, 0xbc, 0x40, 0x42, 0x88, 0xbe,
- 0xca, 0xe2, 0xe9, 0xbe, 0xfc, 0x59, 0x00, 0x39, 0x6c, 0xbd, 0x3b, 0xbe,
- 0x6c, 0x84, 0x12, 0x3e, 0x59, 0x46, 0x85, 0xbe, 0xd6, 0x08, 0x4d, 0xbc,
- 0x03, 0x08, 0x1b, 0x3e, 0x62, 0x91, 0xff, 0x3c, 0xd8, 0xce, 0x57, 0xbe,
- 0x9e, 0x2e, 0x8f, 0xbd, 0xc3, 0x6e, 0x69, 0xbe, 0xbb, 0x6c, 0xb5, 0x3d,
- 0xbb, 0x81, 0x01, 0xbf, 0xd2, 0x04, 0xb4, 0xbd, 0xae, 0xda, 0xfd, 0xbe,
- 0x3c, 0x19, 0xb9, 0xbd, 0x3c, 0x7e, 0x20, 0x3d, 0x4c, 0x5a, 0xa3, 0x3d,
- 0xe5, 0x75, 0x0f, 0xbd, 0x7d, 0x3a, 0xf5, 0x3c, 0x51, 0xde, 0x89, 0x3d,
- 0x1a, 0xf3, 0x15, 0xbe, 0xee, 0xcb, 0x55, 0xbe, 0xc9, 0x21, 0x98, 0x3d,
- 0xe2, 0xce, 0xbf, 0xbd, 0x86, 0xcf, 0x9c, 0x3d, 0x3a, 0xd5, 0xa9, 0x3d,
- 0xf2, 0x27, 0x58, 0xbd, 0xfa, 0xf2, 0x35, 0x3d, 0x5f, 0xc3, 0x53, 0xbe,
- 0x0e, 0xd9, 0x96, 0xbd, 0xbe, 0x95, 0xc0, 0xbd, 0xb7, 0xf3, 0x56, 0x3d,
- 0x79, 0x43, 0x1b, 0xbe, 0x09, 0x2b, 0x2a, 0x3d, 0x13, 0xe5, 0x96, 0xbd,
- 0x3b, 0xf0, 0xe9, 0x3d, 0xb5, 0x99, 0x0a, 0x3e, 0x0c, 0xba, 0xcc, 0x3c,
- 0x28, 0xde, 0x61, 0xbd, 0x0b, 0xbb, 0x77, 0x3d, 0x1a, 0xdd, 0x1b, 0xbe,
- 0x66, 0x9f, 0x71, 0x3e, 0x84, 0xa5, 0x4b, 0x3d, 0xa1, 0x0e, 0x45, 0xbd,
- 0x04, 0x68, 0xd1, 0x3d, 0x61, 0x02, 0xdf, 0x3b, 0x79, 0x0b, 0x38, 0x3d,
- 0x91, 0x1a, 0x1f, 0x3e, 0x4c, 0x75, 0xd1, 0xbc, 0x79, 0xb7, 0xeb, 0xbd,
- 0x00, 0xed, 0x02, 0xbd, 0x2a, 0xde, 0x53, 0xbd, 0xae, 0x84, 0x23, 0x3c,
- 0x14, 0x5b, 0x13, 0xbd, 0xea, 0xa9, 0x19, 0x3d, 0x07, 0x13, 0xaa, 0x3d,
- 0xf9, 0x3e, 0x4a, 0x3d, 0x1d, 0x3d, 0xdf, 0x3d, 0x57, 0x1f, 0xf1, 0xbc,
- 0xf5, 0x4b, 0x07, 0xbe, 0x71, 0x1a, 0x32, 0xbc, 0x15, 0xdf, 0x7d, 0xbc,
- 0xe1, 0x0d, 0xb5, 0x3b, 0x5b, 0xf5, 0x3c, 0xbe, 0x74, 0x3e, 0x33, 0x3d,
- 0x5e, 0x9e, 0x71, 0xbd, 0x7c, 0xce, 0xc5, 0x3d, 0xbd, 0xe1, 0x3b, 0x3c,
- 0xd3, 0x39, 0xbc, 0x3d, 0x7e, 0x5f, 0xbc, 0x3b, 0x24, 0xcc, 0x92, 0xbd,
- 0x84, 0x21, 0x21, 0x3e, 0x6a, 0x18, 0xd7, 0x3d, 0xe0, 0x10, 0xb4, 0xbd,
- 0x77, 0xa0, 0xee, 0xbd, 0x52, 0x39, 0xea, 0x3d, 0x95, 0x75, 0x93, 0xbd,
- 0xcc, 0x67, 0xd7, 0xbd, 0xe9, 0x3e, 0xa8, 0xbd, 0xfe, 0x8a, 0x17, 0x3e,
- 0x2a, 0x86, 0x8c, 0xbc, 0xbe, 0x27, 0x4d, 0xbc, 0xdf, 0xdd, 0x33, 0xbd,
- 0x27, 0xb7, 0x31, 0x3e, 0xa2, 0x2f, 0x5d, 0xbd, 0xf0, 0xc8, 0x0b, 0xbd,
- 0xcb, 0xb9, 0x39, 0x3d, 0xac, 0xc7, 0x86, 0xbd, 0x1e, 0x71, 0xaf, 0xbd,
- 0xa5, 0xbf, 0x41, 0x3e, 0x21, 0xbe, 0x90, 0xbd, 0x98, 0x9b, 0x38, 0x3e,
- 0x32, 0x55, 0xae, 0xbc, 0x01, 0x31, 0x86, 0xbd, 0x05, 0xc4, 0x5a, 0x3d,
- 0x59, 0xbd, 0x08, 0xbd, 0x79, 0x0b, 0x05, 0x3d, 0x44, 0x8f, 0xa6, 0x3c,
- 0xbd, 0xcd, 0x22, 0x3e, 0xdf, 0xd4, 0x2d, 0xbc, 0xe7, 0x10, 0x3f, 0xbd,
- 0x97, 0x52, 0x84, 0x3d, 0x49, 0xb5, 0xb3, 0xbd, 0x79, 0x9f, 0xb8, 0x3d,
- 0xef, 0xa1, 0x1b, 0xbe, 0xca, 0x1d, 0x43, 0xbd, 0xa0, 0xdd, 0xee, 0x3c,
- 0x71, 0x70, 0x2c, 0xb8, 0xb2, 0x48, 0x83, 0x3c, 0xdc, 0x23, 0xc2, 0x3d,
- 0x26, 0x82, 0xde, 0x3d, 0x46, 0x4f, 0xa7, 0xbd, 0x1d, 0x51, 0x15, 0xbe,
- 0x69, 0x5b, 0x98, 0xbc, 0x53, 0xd8, 0xca, 0x3d, 0x98, 0x81, 0x88, 0x3d,
- 0xe2, 0xa1, 0x82, 0x3d, 0x2c, 0x3c, 0x44, 0x3c, 0xd5, 0xc2, 0x87, 0xbd,
- 0xd0, 0x96, 0xf3, 0xbd, 0x30, 0xfe, 0xde, 0xbd, 0x41, 0x0f, 0xcb, 0xbd,
- 0x5a, 0xa4, 0x02, 0x3e, 0x7f, 0x38, 0xd1, 0x3c, 0x5e, 0x28, 0x06, 0xbc,
- 0x04, 0xa4, 0x4d, 0xbe, 0x21, 0x63, 0x8f, 0xbd, 0x99, 0xf4, 0x6a, 0x3d,
- 0xf2, 0xfa, 0x9f, 0x3d, 0x66, 0x19, 0xaf, 0x3d, 0xc3, 0x48, 0x9f, 0xbd,
- 0x52, 0x0e, 0x38, 0xbe, 0x2b, 0xfb, 0x02, 0x3d, 0xc9, 0xe1, 0x47, 0x3d,
- 0xaf, 0x6c, 0xad, 0x3d, 0x88, 0x7e, 0x15, 0xbe, 0x6b, 0x53, 0x51, 0x3c,
- 0x92, 0xb3, 0xb5, 0x3c, 0xb6, 0x9b, 0x1d, 0x3d, 0x07, 0x9e, 0xcd, 0x3d,
- 0x86, 0x77, 0xba, 0xbd, 0x70, 0xbb, 0x97, 0x3d, 0xfb, 0x25, 0xd6, 0xbc,
- 0xda, 0xb2, 0xa6, 0x3d, 0xe7, 0x6d, 0xd1, 0xb9, 0x11, 0x55, 0x81, 0x3c,
- 0xd8, 0x68, 0xaa, 0xbe, 0x39, 0x82, 0xc4, 0x39, 0x55, 0xb8, 0x35, 0x3e,
- 0x08, 0x2b, 0xb3, 0x3d, 0x6a, 0xe8, 0x6f, 0xbe, 0xe4, 0x0e, 0x10, 0x3d,
- 0x1e, 0xfe, 0xf1, 0xbd, 0x94, 0x11, 0x53, 0x3c, 0x97, 0xf6, 0x38, 0xbe,
- 0xc8, 0x5e, 0xbf, 0xbe, 0xb6, 0x2b, 0x5c, 0xbe, 0x33, 0x9e, 0x25, 0x3e,
- 0xc8, 0x09, 0x2e, 0x3e, 0xe1, 0xa3, 0x9e, 0x3d, 0xe1, 0xd8, 0xbd, 0x3c,
- 0x36, 0xbb, 0x92, 0xbd, 0xa8, 0xae, 0x1a, 0xbe, 0x01, 0x3e, 0x5d, 0xbe,
- 0x0f, 0xf6, 0x3f, 0x3e, 0xcb, 0xad, 0xa2, 0xbd, 0xd9, 0xbc, 0xbe, 0xbd,
- 0x99, 0xa5, 0x09, 0x3e, 0x7c, 0xfb, 0x83, 0x3d, 0x33, 0x25, 0x73, 0x3e,
- 0x4c, 0x74, 0xf4, 0x3d, 0x69, 0x94, 0x6a, 0xbe, 0x5b, 0xdb, 0xba, 0xbe,
- 0x25, 0xff, 0x56, 0xbe, 0xc5, 0x55, 0xec, 0x3d, 0x35, 0xed, 0x7d, 0x3d,
- 0x8b, 0x39, 0x11, 0xbe, 0xdb, 0xfc, 0xa7, 0xbe, 0x4c, 0xbc, 0xc4, 0xbd,
- 0x95, 0xf1, 0xd6, 0xbe, 0x32, 0xde, 0x9a, 0xbe, 0x80, 0xf9, 0xc4, 0xbd,
- 0xea, 0x74, 0xa5, 0xbe, 0xa9, 0x6e, 0x2f, 0xbd, 0x53, 0xcc, 0x92, 0xbd,
- 0xbc, 0xca, 0xeb, 0x3d, 0x6a, 0x74, 0x94, 0xbe, 0xc4, 0x51, 0x54, 0x3e,
- 0x26, 0x94, 0x6e, 0x3e, 0xf9, 0x94, 0x9d, 0xbe, 0x49, 0xa2, 0xd4, 0xbe,
- 0x64, 0x87, 0x15, 0x3e, 0x84, 0xc2, 0x1a, 0xbe, 0x17, 0x2e, 0xc5, 0xbe,
- 0x0c, 0x82, 0x41, 0xbe, 0x41, 0xba, 0x85, 0xbd, 0xd1, 0x6c, 0x30, 0x3e,
- 0xad, 0x04, 0x69, 0xbe, 0x32, 0x7a, 0x5f, 0xbe, 0x11, 0xea, 0xb9, 0x3d,
- 0x76, 0xc7, 0x14, 0xbe, 0x6b, 0x31, 0xeb, 0x3c, 0x9f, 0x79, 0xea, 0xbe,
- 0xc9, 0x5c, 0x87, 0x3d, 0x0b, 0x9e, 0xcc, 0xbe, 0xfe, 0x3f, 0x52, 0x3e,
- 0x4a, 0xc8, 0x9d, 0x3d, 0x9d, 0x99, 0xdd, 0xbc, 0xe0, 0x59, 0x3c, 0xbe,
- 0x0c, 0x7b, 0xc8, 0xbd, 0x09, 0x3a, 0xe6, 0xbd, 0xb7, 0xd4, 0x13, 0x3e,
- 0x72, 0xfb, 0x23, 0xbe, 0x45, 0x46, 0xf0, 0xbc, 0xd6, 0x51, 0x44, 0xbb,
- 0xbd, 0x8f, 0x8d, 0xbe, 0x78, 0xf0, 0xf6, 0xbd, 0x78, 0x13, 0x9f, 0xbd,
- 0x0a, 0x32, 0xbf, 0x3c, 0x8e, 0x54, 0x36, 0xbb, 0x2e, 0xe5, 0x00, 0xbf,
- 0x36, 0x82, 0x97, 0xbe, 0xb4, 0xc6, 0xc3, 0xbe, 0x38, 0x46, 0xe8, 0x3b,
- 0xdf, 0x4e, 0x9e, 0xbe, 0xed, 0xd3, 0x92, 0xbd, 0xbb, 0xb1, 0xac, 0x3d,
- 0x84, 0x52, 0x5f, 0xbd, 0xef, 0x2a, 0xfd, 0xbe, 0x8f, 0x57, 0xce, 0xbe,
- 0xef, 0x93, 0x3e, 0xbe, 0xfa, 0x10, 0x41, 0x3d, 0x65, 0x1a, 0x56, 0xbe,
- 0x6e, 0x29, 0x34, 0xbe, 0xa8, 0xfb, 0xac, 0xbc, 0xa7, 0x3a, 0xe2, 0xbd,
- 0x2c, 0xaa, 0x2e, 0x3c, 0x55, 0x48, 0x2c, 0xbe, 0x87, 0x0c, 0xdc, 0xbd,
- 0xd5, 0x3f, 0x15, 0xbe, 0xb5, 0x1c, 0x30, 0x3d, 0x9a, 0x1e, 0x18, 0x3e,
- 0xe3, 0xad, 0x9f, 0x3c, 0xb2, 0x07, 0x86, 0x3c, 0xbd, 0x96, 0x04, 0xbf,
- 0xa6, 0x0b, 0xc0, 0xbd, 0x7e, 0x79, 0x2d, 0xbe, 0x15, 0x8d, 0xf3, 0xbd,
- 0x8d, 0xdc, 0x44, 0xbd, 0xe4, 0x42, 0x8d, 0xbd, 0x8d, 0x23, 0xc5, 0xbe,
- 0x60, 0x51, 0x12, 0xbd, 0x1d, 0xb3, 0xae, 0xbd, 0x3a, 0x5b, 0xc5, 0xbd,
- 0x36, 0x5b, 0x8b, 0xbd, 0x5b, 0x50, 0x21, 0x3e, 0xaa, 0xab, 0x1f, 0xbe,
- 0x7c, 0x72, 0xd8, 0xbd, 0xef, 0x4b, 0x28, 0xbe, 0x05, 0x7e, 0x29, 0x3c,
- 0x7c, 0x09, 0xd6, 0xbd, 0x18, 0x29, 0x0e, 0xbd, 0x17, 0xa4, 0x62, 0xbc,
- 0xa3, 0xf5, 0x13, 0x3e, 0x2c, 0x6d, 0x95, 0xbe, 0x45, 0xd3, 0x14, 0xbe,
- 0xa9, 0x9d, 0xa3, 0xbc, 0xf5, 0x25, 0xe3, 0xbd, 0xd2, 0xe5, 0x41, 0xbf,
- 0x13, 0xc3, 0x4f, 0xbc, 0xf2, 0x57, 0xae, 0x3d, 0x25, 0x6c, 0x97, 0x3c,
- 0x42, 0xb0, 0x10, 0xbd, 0x72, 0xe1, 0x09, 0x3e, 0xec, 0x62, 0xb6, 0xbd,
- 0x59, 0x9e, 0xbf, 0xbe, 0x49, 0xb9, 0x0d, 0xbe, 0x5d, 0xf5, 0x81, 0x3c,
- 0x50, 0x4c, 0xb4, 0x3e, 0x41, 0x40, 0x6f, 0x3d, 0x51, 0x47, 0x91, 0x3d,
- 0xae, 0x72, 0xd9, 0xbd, 0x05, 0x92, 0xa5, 0xbe, 0xd3, 0x47, 0x9e, 0x3d,
- 0x27, 0x1e, 0x1f, 0x3e, 0x21, 0x3c, 0x12, 0xbe, 0xeb, 0x51, 0x08, 0xbe,
- 0x96, 0x81, 0x75, 0xbd, 0xb2, 0x12, 0x03, 0x3e, 0xc6, 0xed, 0x0c, 0x3e,
- 0xe3, 0xe1, 0xda, 0xbc, 0xce, 0xd9, 0xde, 0xbd, 0xe7, 0xeb, 0xcb, 0xbd,
- 0xb2, 0xc1, 0xb5, 0x3d, 0x1c, 0x5e, 0x3a, 0xbd, 0x4a, 0x34, 0xc4, 0x3d,
- 0xda, 0xcb, 0x77, 0xbd, 0xf5, 0x55, 0xe7, 0xbe, 0xa1, 0x62, 0x71, 0xbd,
- 0x6b, 0xd4, 0xc5, 0xbd, 0x86, 0x44, 0x61, 0x3e, 0x32, 0xfc, 0xc0, 0x3c,
- 0x8e, 0xa2, 0xfd, 0xbd, 0xcd, 0x4f, 0x31, 0x3a, 0x52, 0x12, 0x8d, 0xbd,
- 0x5d, 0xee, 0x01, 0x3d, 0x3f, 0x9d, 0xcc, 0xba, 0xeb, 0xd9, 0x40, 0x3d,
- 0x5c, 0x73, 0x60, 0xbd, 0xf1, 0x8f, 0x1a, 0xbc, 0xbe, 0x23, 0xa4, 0x3d,
- 0xa0, 0xfe, 0x97, 0x3e, 0xa7, 0xc5, 0x59, 0x3e, 0x42, 0xc6, 0x0f, 0x3e,
- 0xe2, 0xb5, 0x0e, 0x3d, 0xd1, 0x8d, 0xfe, 0xbd, 0x2b, 0x26, 0xc1, 0x3d,
- 0x21, 0x77, 0xb9, 0x3d, 0x36, 0x8d, 0x28, 0x3e, 0x16, 0x62, 0xe7, 0xbd,
- 0x3e, 0x91, 0x21, 0x3e, 0x26, 0xfa, 0x8a, 0x3d, 0x14, 0x6c, 0x41, 0x3e,
- 0x9f, 0x41, 0x7e, 0xbc, 0x98, 0x8b, 0x2d, 0x3e, 0x44, 0xdb, 0xca, 0xbd,
- 0x16, 0x74, 0x88, 0x3d, 0x68, 0xe6, 0x81, 0xbe, 0x1e, 0x12, 0x8e, 0xbe,
- 0x7e, 0x98, 0x92, 0xbd, 0x19, 0xf5, 0xd7, 0x3e, 0x89, 0xbe, 0xd2, 0x3b,
- 0x03, 0x83, 0x59, 0xbe, 0x21, 0x70, 0xbc, 0x3c, 0x91, 0x52, 0x0b, 0x3c,
- 0x94, 0xb5, 0x03, 0xbe, 0x40, 0xff, 0xc9, 0xbc, 0x64, 0xbb, 0x09, 0xbd,
- 0x41, 0xd1, 0x80, 0x3e, 0xcf, 0x12, 0x10, 0xbe, 0x2e, 0x0a, 0x1e, 0xbe,
- 0xc7, 0x1c, 0xa9, 0xbd, 0x01, 0x14, 0x30, 0x3e, 0x93, 0x6c, 0x57, 0xbc,
- 0x6b, 0x69, 0xa8, 0x3c, 0xe3, 0xb4, 0xab, 0x3e, 0x50, 0x38, 0xa7, 0xbe,
- 0x7c, 0x29, 0xec, 0x3d, 0x72, 0x19, 0x0b, 0xbb, 0x62, 0xec, 0x86, 0x3c,
- 0xfe, 0x8a, 0x27, 0x3e, 0x7b, 0x77, 0x78, 0xbd, 0xf8, 0x46, 0x03, 0x3e,
- 0x5a, 0xf2, 0x2c, 0x3e, 0xaf, 0x8d, 0x7a, 0x3d, 0x32, 0xbe, 0x6e, 0x3d,
- 0x7b, 0xfe, 0x05, 0x3e, 0x1a, 0x80, 0x94, 0x3d, 0xfc, 0x9f, 0xb1, 0x3d,
- 0x54, 0x43, 0x04, 0x3e, 0x37, 0x97, 0x24, 0x3e, 0x95, 0x22, 0x92, 0x3e,
- 0x05, 0xae, 0xd0, 0xbc, 0xb2, 0x1a, 0x41, 0x3e, 0xc8, 0x9d, 0x62, 0xbe,
- 0xe7, 0xd9, 0x12, 0xbe, 0xeb, 0xb8, 0x03, 0xbe, 0xdc, 0x5e, 0x4b, 0xbc,
- 0x2e, 0x4c, 0x96, 0xbd, 0x99, 0x78, 0x98, 0x3d, 0x9e, 0x8a, 0x51, 0x3a,
- 0xf4, 0xc0, 0xf1, 0xbd, 0x3c, 0x39, 0x27, 0x3e, 0x9c, 0xa6, 0x3d, 0xbe,
- 0x54, 0xb2, 0x75, 0x3d, 0x39, 0xf7, 0x50, 0x3e, 0x70, 0x68, 0x07, 0x3c,
- 0xe2, 0xc2, 0xf1, 0x3d, 0x42, 0x12, 0x71, 0xbd, 0x03, 0xf9, 0x48, 0x3d,
- 0x9a, 0x7a, 0xaa, 0x3c, 0x92, 0x00, 0xc1, 0x3d, 0x1b, 0x31, 0x59, 0xbe,
- 0x03, 0x18, 0x3e, 0xbd, 0xa0, 0x37, 0xbd, 0x3b, 0x7b, 0x06, 0xa7, 0xbd,
- 0xea, 0x74, 0xec, 0xbc, 0x43, 0x1c, 0x8c, 0xbc, 0x5c, 0xfc, 0x54, 0x3d,
- 0xca, 0x13, 0x3c, 0x3e, 0x0f, 0x30, 0x08, 0xbe, 0xff, 0xdb, 0x89, 0x3d,
- 0x01, 0xf0, 0x58, 0x3e, 0x70, 0x22, 0x5b, 0x3e, 0x99, 0x38, 0x3e, 0x3c,
- 0xbe, 0x57, 0xe2, 0x3c, 0x48, 0x48, 0x42, 0x3e, 0xae, 0x8c, 0xc2, 0x3e,
- 0x6d, 0xb2, 0x88, 0xbe, 0x14, 0x59, 0xb0, 0x3d, 0x64, 0x38, 0xd5, 0x3c,
- 0x0f, 0x26, 0xa4, 0xbc, 0x05, 0x1b, 0xaf, 0x3d, 0x6e, 0x15, 0x77, 0x3c,
- 0xe1, 0xeb, 0x24, 0xbe, 0xcc, 0x8a, 0x48, 0xbd, 0x96, 0xfd, 0x90, 0xbd,
- 0xdb, 0x39, 0xb5, 0x3d, 0x72, 0xeb, 0x49, 0x3e, 0xa5, 0xd5, 0x2e, 0x3d,
- 0x12, 0xe8, 0x75, 0xbd, 0x2b, 0x03, 0x8a, 0xbc, 0xca, 0xf4, 0x84, 0xbe,
- 0x55, 0x40, 0x8f, 0x3e, 0x8b, 0xda, 0x24, 0xbe, 0x1a, 0x40, 0x63, 0xbc,
- 0xa9, 0xe3, 0x06, 0x3e, 0x51, 0x1b, 0xc3, 0xbd, 0x35, 0xe7, 0xa1, 0xbd,
- 0x66, 0xc0, 0xa3, 0xbe, 0xa0, 0x8c, 0xc1, 0xbb, 0xf3, 0x5d, 0xd8, 0xbd,
- 0xd0, 0x12, 0x7c, 0xbc, 0xc6, 0xf4, 0x4a, 0xbe, 0x1c, 0x07, 0xdb, 0xbd,
- 0xda, 0xfd, 0x11, 0xbe, 0xbe, 0x17, 0xa9, 0x3c, 0x2c, 0x33, 0x36, 0xbe,
- 0x08, 0x08, 0x02, 0x3d, 0x3d, 0x0f, 0x83, 0xbe, 0x53, 0x13, 0x99, 0xbe,
- 0xe5, 0xa5, 0x9e, 0x3d, 0x01, 0xe3, 0x38, 0x3d, 0x10, 0xaa, 0x83, 0x3e,
- 0xb9, 0x7b, 0x62, 0xbd, 0x85, 0xa7, 0x2b, 0xbd, 0x86, 0x35, 0x87, 0x3e,
- 0x14, 0x9d, 0x8b, 0xbd, 0x4f, 0x94, 0xcc, 0xbe, 0xbd, 0xf8, 0x0a, 0x3d,
- 0x63, 0xb9, 0x2f, 0xbc, 0xbe, 0x00, 0xa5, 0xbe, 0xb4, 0x19, 0x55, 0xbe,
- 0x77, 0x03, 0x4d, 0x3d, 0x34, 0x66, 0x09, 0xbe, 0x3b, 0x71, 0x0e, 0xbe,
- 0x1f, 0xb5, 0x35, 0x3d, 0xd7, 0x7b, 0x4b, 0xbe, 0x4b, 0x2b, 0x52, 0x3e,
- 0xbb, 0x9a, 0x1e, 0xbe, 0x57, 0x3b, 0xb6, 0x3d, 0xc4, 0x64, 0x25, 0xbe,
- 0xc8, 0x5b, 0x37, 0xbd, 0x16, 0x39, 0x99, 0xbe, 0x9a, 0xac, 0xc5, 0x3d,
- 0xc0, 0xee, 0x32, 0x3d, 0xb1, 0x6a, 0xd5, 0xbd, 0x68, 0x99, 0x46, 0xbe,
- 0xbe, 0xe9, 0x2f, 0xbe, 0x4a, 0x99, 0xc8, 0xbc, 0x3f, 0x5a, 0x8a, 0xbe,
- 0x43, 0xfa, 0x1c, 0xbe, 0x9e, 0x5f, 0xc2, 0x3c, 0xb4, 0x73, 0xa4, 0xbd,
- 0xcf, 0x2d, 0x82, 0xbd, 0x16, 0x53, 0xcf, 0x3d, 0x2e, 0xa6, 0x57, 0x3e,
- 0xee, 0xc6, 0x4b, 0x3d, 0x13, 0xad, 0x57, 0xbd, 0xcc, 0x1b, 0x29, 0xbc,
- 0xf8, 0x12, 0x26, 0xbe, 0xbb, 0xd3, 0xb8, 0x3d, 0xd2, 0xba, 0xaa, 0xbd,
- 0x53, 0x87, 0x1d, 0xbd, 0xe3, 0x3b, 0x03, 0xbc, 0xfb, 0x35, 0x32, 0xbe,
- 0xa9, 0xbb, 0x96, 0x3c, 0x8f, 0xde, 0x27, 0xbe, 0x85, 0xee, 0x1a, 0xbe,
- 0xcd, 0x34, 0xc1, 0xbc, 0xb8, 0x32, 0xed, 0x3c, 0xdf, 0xc9, 0xe7, 0x3d,
- 0x55, 0x51, 0x4a, 0xbe, 0x89, 0xfd, 0x56, 0xbd, 0xd1, 0x4d, 0x25, 0x3e,
- 0x59, 0x79, 0x0b, 0xbe, 0xc1, 0x2d, 0xd6, 0x3b, 0x43, 0x35, 0x77, 0x3e,
- 0xa8, 0xde, 0x5f, 0xbd, 0xac, 0xcb, 0x6c, 0xbd, 0xa9, 0x15, 0x11, 0xbd,
- 0xd5, 0x8c, 0xd8, 0x3d, 0x66, 0xd9, 0xd3, 0x3d, 0xfb, 0x0a, 0xa2, 0x3e,
- 0xca, 0x79, 0x4c, 0x3e, 0xc1, 0x8d, 0x7a, 0x3e, 0xfd, 0x69, 0xfc, 0xbd,
- 0xf3, 0xee, 0x83, 0xbd, 0x1f, 0x91, 0x26, 0xbe, 0x83, 0xd1, 0x47, 0x3d,
- 0x70, 0x70, 0x82, 0xbe, 0xe5, 0xa8, 0x8b, 0xbd, 0xbd, 0xe7, 0xac, 0x3d,
- 0x69, 0xf0, 0x9b, 0x3c, 0x14, 0x25, 0xc7, 0xbc, 0xaf, 0x0c, 0x3f, 0xbe,
- 0x94, 0x46, 0x8a, 0xbc, 0x89, 0x32, 0x39, 0xba, 0xd6, 0xf1, 0x0c, 0xbe,
- 0x46, 0xf7, 0x68, 0xbe, 0xd4, 0xb2, 0x24, 0xbe, 0xd2, 0xfa, 0x41, 0x3e,
- 0x5e, 0x79, 0x48, 0x3e, 0x2e, 0xe2, 0x6a, 0xbd, 0x0e, 0x2b, 0xb4, 0xbd,
- 0xd2, 0x9d, 0x35, 0xbe, 0x0b, 0x22, 0x3a, 0xbe, 0xfd, 0xad, 0x8f, 0xbd,
- 0xc6, 0xd7, 0x18, 0xbe, 0x80, 0xe4, 0x08, 0x3e, 0x68, 0x58, 0x8a, 0xbe,
- 0xbe, 0xbe, 0x8c, 0xbd, 0x08, 0x16, 0xb9, 0x3d, 0xd8, 0xc5, 0xfd, 0x3c,
- 0xb1, 0x58, 0x12, 0x3b, 0x64, 0xb5, 0x5c, 0x3e, 0xae, 0xac, 0x00, 0xbe,
- 0x86, 0xd3, 0x67, 0xbe, 0xd4, 0xe8, 0x4d, 0x3e, 0x87, 0xb8, 0xb3, 0xbe,
- 0x12, 0x1f, 0x9e, 0x3c, 0x84, 0x4c, 0x05, 0xbe, 0x9d, 0x83, 0x33, 0x3e,
- 0x89, 0x11, 0x27, 0xbd, 0xf2, 0xbf, 0x67, 0xbd, 0xe5, 0x1a, 0xf3, 0xbd,
- 0x07, 0x7c, 0x4e, 0xbe, 0x21, 0x1e, 0x17, 0xbe, 0xc1, 0x13, 0x05, 0x3d,
- 0x9b, 0x88, 0x2c, 0x3e, 0x2f, 0x6f, 0x99, 0xbe, 0x1c, 0x09, 0xbf, 0xbe,
- 0x13, 0xe5, 0x15, 0x3e, 0x2f, 0xb6, 0xcf, 0xb7, 0x1e, 0xb8, 0x6e, 0x3c,
- 0x66, 0x27, 0x87, 0x3e, 0x90, 0xb7, 0x3d, 0xbe, 0x97, 0x17, 0x5e, 0x3d,
- 0xf3, 0x6b, 0x77, 0xbd, 0xaa, 0x96, 0x63, 0xbd, 0xb5, 0x8b, 0x19, 0xbe,
- 0x3c, 0x0b, 0x03, 0x3d, 0xb7, 0xf6, 0x0c, 0xbe, 0x47, 0x3f, 0xf0, 0x3d,
- 0x28, 0x0a, 0xbf, 0x3e, 0x94, 0xbd, 0x58, 0x3e, 0x27, 0x84, 0xeb, 0x3d,
- 0x37, 0xbb, 0xc2, 0x3d, 0x86, 0x96, 0x49, 0x3e, 0xbc, 0x67, 0x68, 0xbe,
- 0x75, 0x67, 0x59, 0xbe, 0x14, 0xab, 0x22, 0xbe, 0x50, 0x43, 0xf2, 0x3d,
- 0x63, 0x09, 0x10, 0xbe, 0x87, 0x1d, 0x93, 0x3d, 0xc3, 0xd9, 0x3a, 0x3e,
- 0xd3, 0x70, 0x92, 0x3e, 0x33, 0x16, 0x9e, 0xbe, 0x4c, 0x7a, 0x46, 0x3e,
- 0xf7, 0x5b, 0x6d, 0x3e, 0xb6, 0x26, 0x0b, 0x3e, 0x2a, 0x7c, 0x8e, 0x3c,
- 0x47, 0x28, 0x32, 0x3d, 0x9d, 0x85, 0x92, 0xbd, 0x74, 0xe0, 0x0d, 0x3e,
- 0x08, 0x2e, 0xe8, 0x3c, 0x95, 0xe6, 0x53, 0x3d, 0xf0, 0x55, 0x53, 0x3b,
- 0x93, 0x82, 0x9d, 0xbc, 0xf9, 0x6a, 0xc7, 0x3c, 0xf4, 0x13, 0x94, 0x3c,
- 0x7a, 0xbe, 0x53, 0xbd, 0x8c, 0xb7, 0xc6, 0xbe, 0x04, 0xdd, 0xb3, 0x3d,
- 0xc9, 0xba, 0xb8, 0xbd, 0x96, 0x06, 0x9a, 0x3e, 0xfd, 0x60, 0x82, 0xbe,
- 0xac, 0xce, 0x95, 0xbd, 0xb1, 0x7e, 0xbc, 0xbc, 0xa2, 0xe3, 0x08, 0xbe,
- 0x63, 0x9d, 0x0e, 0x3e, 0xde, 0x42, 0x56, 0x3e, 0xc1, 0x62, 0x02, 0xbe,
- 0x52, 0x0d, 0x60, 0x3d, 0xb7, 0x4d, 0xaf, 0x3d, 0x09, 0x4a, 0x4f, 0xbe,
- 0x68, 0xa3, 0xea, 0x3e, 0x54, 0x39, 0x82, 0x3e, 0xc4, 0x01, 0x25, 0x3e,
- 0x26, 0x8e, 0x2f, 0x3d, 0x77, 0x40, 0x60, 0xbd, 0x33, 0x70, 0xf5, 0x3d,
- 0x59, 0xfe, 0xcf, 0xbd, 0xbe, 0xe2, 0x53, 0xbd, 0xc7, 0xa0, 0x72, 0xbd,
- 0x1e, 0xa2, 0x3a, 0xbc, 0xe1, 0xe9, 0x38, 0xbd, 0x76, 0x28, 0x34, 0x3e,
- 0xd0, 0x7a, 0x89, 0xbd, 0xe1, 0x02, 0xaf, 0x3e, 0x27, 0x61, 0xa9, 0x3d,
- 0xb5, 0x1d, 0xc4, 0xbc, 0xa6, 0xd1, 0x37, 0x3e, 0x6b, 0xbd, 0x84, 0x3e,
- 0x72, 0x19, 0xa9, 0xbe, 0x00, 0x53, 0xc9, 0x3a, 0x8a, 0x3a, 0x15, 0x3e,
- 0x0c, 0xf8, 0x84, 0xbc, 0x78, 0x63, 0x65, 0x3d, 0x23, 0x62, 0x1a, 0x3e,
- 0x1e, 0xf7, 0xb0, 0x3e, 0xc3, 0xfe, 0xc2, 0x3d, 0x3c, 0x37, 0xd7, 0xbd,
- 0x5b, 0x69, 0x0a, 0xbe, 0x7a, 0x71, 0x02, 0xbd, 0x65, 0x34, 0x4f, 0x3d,
- 0x66, 0x7d, 0xc9, 0xbc, 0xa3, 0x8b, 0xf5, 0x3d, 0x5a, 0x23, 0xec, 0x3d,
- 0xec, 0x67, 0xa3, 0xba, 0x24, 0xf8, 0x3f, 0xbe, 0x76, 0x73, 0x4a, 0xbd,
- 0xdb, 0x25, 0xe3, 0x3d, 0x00, 0xbf, 0x8c, 0xbe, 0x6d, 0xb2, 0xc5, 0xbd,
- 0x3c, 0x4f, 0x38, 0xbe, 0x33, 0x72, 0x4e, 0x3e, 0x46, 0x24, 0x2b, 0x3e,
- 0x14, 0x54, 0xfa, 0xbd, 0xa2, 0x1a, 0xb5, 0xbd, 0x55, 0xcd, 0x57, 0x3e,
- 0xaa, 0xfb, 0x84, 0xbe, 0xd6, 0x36, 0xb0, 0xbc, 0xda, 0x13, 0xbe, 0xbd,
- 0x18, 0xc2, 0x95, 0xbe, 0xe6, 0x13, 0xb0, 0xbb, 0xa2, 0x86, 0x8a, 0x3e,
- 0x15, 0x35, 0x6b, 0x3e, 0xc7, 0xfa, 0x26, 0x3e, 0xf5, 0x4e, 0xd6, 0x3d,
- 0x84, 0x07, 0x57, 0x3e, 0x66, 0x10, 0xd9, 0x3e, 0x94, 0x35, 0xa9, 0xbd,
- 0xc4, 0x52, 0x81, 0xbc, 0xec, 0xd9, 0xd4, 0x3d, 0xb9, 0x42, 0x77, 0xbd,
- 0xe9, 0x21, 0x8b, 0x3d, 0xa3, 0x2b, 0x22, 0xbd, 0x7b, 0x39, 0xd3, 0x3d,
- 0xdc, 0x48, 0x22, 0xbd, 0xf4, 0xdf, 0x21, 0xbb, 0x3b, 0x81, 0x80, 0x3b,
- 0x2b, 0xd5, 0x4a, 0xbe, 0xae, 0x80, 0xf6, 0x3c, 0x7e, 0x19, 0x86, 0xbd,
- 0x2c, 0xd1, 0x5d, 0x3e, 0xe6, 0x4d, 0x06, 0x3e, 0xcf, 0xbb, 0x37, 0x3e,
- 0xb7, 0xcc, 0xb9, 0xba, 0xd1, 0x49, 0x10, 0xbd, 0x16, 0xdf, 0x2a, 0xbe,
- 0xbd, 0xc1, 0xf0, 0x3e, 0xb4, 0x35, 0x40, 0x3e, 0x92, 0x21, 0x6f, 0x3d,
- 0x48, 0x39, 0x1a, 0x3d, 0x68, 0x8a, 0x8d, 0x3a, 0x41, 0x8c, 0x87, 0xbd,
- 0x53, 0x8d, 0x08, 0xbe, 0xd4, 0x75, 0xdf, 0xbd, 0xd5, 0x5e, 0xa2, 0x3b,
- 0xd4, 0xa0, 0xbd, 0xbd, 0xa5, 0x62, 0x4f, 0xbd, 0x64, 0x8c, 0xe9, 0xbd,
- 0x77, 0x20, 0xf9, 0xbe, 0x4d, 0x58, 0xe7, 0xbd, 0x1e, 0x29, 0x73, 0x3d,
- 0xb1, 0x68, 0x05, 0xbe, 0x08, 0x0c, 0x42, 0xbd, 0xd7, 0x6e, 0xaf, 0xbd,
- 0xe2, 0xd7, 0xbe, 0xbe, 0xca, 0xcb, 0x2e, 0x3e, 0xe0, 0x88, 0x44, 0xbe,
- 0xa9, 0xfc, 0xbd, 0x3c, 0xe1, 0xdb, 0x93, 0x3e, 0x9f, 0x45, 0x1a, 0xbe,
- 0xa5, 0xc9, 0x11, 0x3e, 0x36, 0x87, 0xa6, 0x3e, 0x2f, 0x64, 0x63, 0x3c,
- 0x34, 0x6d, 0x33, 0x3e, 0xc0, 0x9e, 0xad, 0xbe, 0x61, 0xe5, 0x27, 0x3e,
- 0x47, 0x56, 0x3b, 0xbe, 0x71, 0xfe, 0x99, 0x3d, 0x8c, 0x22, 0xcf, 0xbd,
- 0x6f, 0x83, 0x17, 0xbd, 0xfe, 0x38, 0x2a, 0x3e, 0x6d, 0xef, 0x23, 0xbe,
- 0x22, 0x55, 0x0d, 0x3e, 0xf2, 0x7c, 0xa8, 0xbe, 0x39, 0xf6, 0x98, 0xbd,
- 0xf1, 0xa1, 0xf4, 0xbd, 0xce, 0x75, 0xa3, 0xbe, 0xcc, 0xf9, 0x87, 0xbc,
- 0x59, 0x4d, 0x16, 0x3c, 0xc9, 0x2a, 0x30, 0x3e, 0x50, 0xdf, 0x15, 0x3e,
- 0xf3, 0x38, 0x84, 0xbd, 0x51, 0xbd, 0x3c, 0x3d, 0xee, 0x86, 0x1f, 0x3e,
- 0xf3, 0x02, 0xd6, 0xbd, 0x58, 0x82, 0x7f, 0xbe, 0x4e, 0x1f, 0xda, 0xbe,
- 0xd2, 0x99, 0x6a, 0xbd, 0x26, 0xa0, 0x2c, 0xbe, 0xe9, 0x02, 0x20, 0xbe,
- 0x49, 0xc5, 0x4b, 0xbe, 0x79, 0x30, 0xb5, 0xbd, 0x1c, 0x3b, 0x6f, 0xbe,
- 0x9e, 0x05, 0x28, 0xbe, 0xab, 0x98, 0xb2, 0xbe, 0x2b, 0xe7, 0xa1, 0x3e,
- 0x4c, 0x96, 0x55, 0xbd, 0x23, 0x37, 0x57, 0xbe, 0xc2, 0x4c, 0xf1, 0x3c,
- 0xd6, 0x51, 0xa5, 0x3d, 0xbe, 0x44, 0xa2, 0xbe, 0xc1, 0xda, 0x63, 0x3d,
- 0x90, 0x07, 0x60, 0x3d, 0x75, 0xeb, 0x83, 0xbb, 0xb2, 0x69, 0x3b, 0xbe,
- 0x4b, 0xe4, 0xe0, 0x37, 0x4b, 0xd2, 0xaf, 0x3c, 0x73, 0xce, 0xa5, 0x3c,
- 0x37, 0xf6, 0x08, 0xbe, 0xab, 0x39, 0x28, 0x3e, 0x58, 0x6c, 0x5a, 0xbe,
- 0x70, 0xdc, 0xff, 0xbd, 0x67, 0xe1, 0x86, 0xbe, 0x87, 0x0e, 0x26, 0xbf,
- 0xca, 0x1f, 0x6b, 0x3e, 0x45, 0x11, 0x4d, 0x3a, 0xef, 0x7a, 0xb6, 0xbe,
- 0x61, 0x56, 0x40, 0x3d, 0x57, 0xd7, 0x15, 0x3d, 0x9a, 0x3d, 0xfe, 0xbd,
- 0x08, 0x8d, 0x88, 0x3d, 0x6e, 0xdf, 0x63, 0xbe, 0x9d, 0x39, 0x37, 0xbc,
- 0xbe, 0x14, 0x43, 0xbe, 0x53, 0x24, 0x3f, 0x3c, 0xef, 0x20, 0xb6, 0x3b,
- 0x88, 0x40, 0x1d, 0xbc, 0x1a, 0xb0, 0x10, 0x3e, 0x59, 0xef, 0xca, 0x3d,
- 0x6d, 0x7a, 0x4c, 0x3d, 0xd8, 0x25, 0xb1, 0xbd, 0x9f, 0x48, 0x5e, 0xbe,
- 0x70, 0x3c, 0xea, 0x3d, 0x8e, 0xa3, 0xcf, 0xbd, 0x9a, 0xfd, 0x65, 0x3e,
- 0x33, 0x1b, 0x30, 0xbd, 0x34, 0xb2, 0xc7, 0xbe, 0xcc, 0xde, 0x97, 0xbe,
- 0xfe, 0x9a, 0xb5, 0xbd, 0x32, 0xfe, 0xe0, 0x3d, 0x48, 0x90, 0xf3, 0xbd,
- 0x7d, 0x8a, 0x26, 0xbf, 0xa0, 0x91, 0xb8, 0xbe, 0x89, 0xd7, 0x9a, 0x3d,
- 0x50, 0x4f, 0x1a, 0xbe, 0xde, 0x48, 0x9a, 0xbd, 0xab, 0xa5, 0x07, 0x3e,
- 0xf4, 0x66, 0x90, 0xbd, 0xd8, 0xf3, 0x1a, 0x3e, 0xd4, 0x80, 0x56, 0x3d,
- 0x73, 0xc0, 0xb5, 0xbe, 0xb4, 0x16, 0x3a, 0xbe, 0x14, 0xe5, 0xee, 0x3c,
- 0x78, 0xb8, 0x57, 0xbd, 0xb0, 0x95, 0x31, 0xbc, 0x8c, 0x9d, 0x37, 0xbe,
- 0xc9, 0x21, 0x95, 0xbe, 0xa0, 0xd1, 0xa4, 0xbd, 0x99, 0x6f, 0x28, 0x3d,
- 0xa5, 0x3d, 0x4f, 0xbe, 0x3d, 0x80, 0x7f, 0xbe, 0x7a, 0x4c, 0xb5, 0x3d,
- 0x17, 0x01, 0x30, 0x3d, 0x8b, 0x5b, 0xc4, 0xbe, 0x2f, 0x2b, 0x19, 0xbe,
- 0xb2, 0xbf, 0xb5, 0xbc, 0x75, 0x5e, 0x11, 0xbe, 0xfa, 0x9c, 0x03, 0x3e,
- 0xce, 0x95, 0xbd, 0x3c, 0x4c, 0x50, 0xa7, 0x3d, 0xb1, 0x3a, 0xc8, 0x3c,
- 0xd8, 0x75, 0xc9, 0x3d, 0x4f, 0x50, 0x2c, 0xbd, 0x78, 0xa5, 0x1d, 0xbe,
- 0xe0, 0xee, 0xc7, 0xbd, 0x59, 0x7c, 0x80, 0xbe, 0xb2, 0xe8, 0x52, 0x3e,
- 0x42, 0xea, 0xa5, 0xbe, 0xd9, 0xa1, 0x28, 0xbf, 0x62, 0x3b, 0xc9, 0xbd,
- 0x89, 0x65, 0x45, 0x3e, 0xa9, 0xa5, 0x0b, 0x3e, 0x8c, 0x14, 0x32, 0xbe,
- 0xf4, 0xde, 0xf4, 0x3d, 0xb3, 0xa0, 0x2a, 0xbe, 0x99, 0x35, 0x7a, 0xbe,
- 0xe9, 0xc6, 0xa1, 0x3d, 0x34, 0xc2, 0xbf, 0xbd, 0x4a, 0x96, 0xef, 0x3d,
- 0x67, 0x28, 0xcb, 0x3c, 0xa9, 0xdd, 0x14, 0xbd, 0xf3, 0x2a, 0xa4, 0xbe,
- 0x0d, 0x1b, 0x02, 0x3e, 0xa6, 0x5e, 0x09, 0x3d, 0x92, 0x1a, 0x3e, 0x3e,
- 0x28, 0x6e, 0xfb, 0xbd, 0xe6, 0xc0, 0x05, 0xbe, 0xbc, 0x34, 0x91, 0xbd,
- 0x34, 0xfa, 0x3a, 0xbd, 0x32, 0xfd, 0x83, 0x3a, 0xa2, 0xa8, 0x81, 0x3e,
- 0x23, 0x90, 0x8f, 0x3d, 0x87, 0x02, 0xb4, 0x3e, 0x61, 0x55, 0x27, 0xbe,
- 0x19, 0x8e, 0x9a, 0x3d, 0x74, 0x00, 0x0b, 0x3e, 0x36, 0x1b, 0x21, 0x3d,
- 0x6c, 0xcf, 0xb2, 0xbb, 0xb7, 0x8f, 0x34, 0x3e, 0x86, 0x06, 0xfc, 0xbd,
- 0x26, 0xc5, 0x35, 0xbc, 0xe4, 0x03, 0xa1, 0x3c, 0x86, 0xac, 0xa5, 0xbd,
- 0x36, 0x33, 0xc7, 0xbd, 0xef, 0xc4, 0x90, 0x3e, 0xc6, 0x17, 0x36, 0x3d,
- 0xdb, 0xd9, 0xff, 0xbd, 0xe4, 0x02, 0xca, 0x3d, 0xea, 0x23, 0x1e, 0xbe,
- 0x0a, 0xc7, 0xd4, 0xbb, 0xca, 0xda, 0xa4, 0xbe, 0x0c, 0x6d, 0x1f, 0xbe,
- 0x59, 0xf1, 0xb8, 0xbe, 0x63, 0xf5, 0x76, 0xbf, 0xd2, 0x67, 0x41, 0xbc,
- 0x0c, 0x87, 0x75, 0x3e, 0xdd, 0x14, 0xee, 0x3c, 0x12, 0xa9, 0xa6, 0xbe,
- 0x67, 0x94, 0x53, 0x3e, 0x8a, 0xbc, 0x3c, 0xbc, 0xc1, 0x0c, 0x13, 0xbf,
- 0x75, 0x9c, 0xc5, 0x3d, 0x66, 0xdd, 0xfa, 0x3e, 0x0a, 0x86, 0xf1, 0xbc,
- 0x10, 0x71, 0x45, 0x3c, 0xf9, 0xd2, 0xa1, 0xbe, 0x65, 0x43, 0xea, 0xbd,
- 0x66, 0xb2, 0x95, 0x3d, 0xff, 0x56, 0xe5, 0x3d, 0x79, 0x80, 0x8b, 0x3d,
- 0x5a, 0xee, 0xfa, 0x3d, 0x58, 0x63, 0x88, 0x3e, 0x41, 0x98, 0xfe, 0x3b,
- 0x7b, 0x7c, 0xea, 0xbd, 0x18, 0x99, 0x03, 0x3c, 0x58, 0xe8, 0x2b, 0xbe,
- 0x1a, 0xc5, 0x01, 0xbd, 0x88, 0x28, 0x43, 0xbe, 0xae, 0x17, 0x01, 0x3c,
- 0x32, 0x81, 0x09, 0xbe, 0xec, 0x47, 0xee, 0xb9, 0xb1, 0x60, 0xdb, 0xbe,
- 0x17, 0x3f, 0x33, 0xbd, 0xb7, 0x3e, 0x95, 0xbe, 0x9d, 0x78, 0x4f, 0x3c,
- 0x6b, 0xfa, 0xee, 0x3d, 0xed, 0xbd, 0xe2, 0xbe, 0x62, 0xb7, 0x1b, 0x3e,
- 0x75, 0xe3, 0xa1, 0xbe, 0x1b, 0xb4, 0xdf, 0xbd, 0x85, 0x22, 0xe5, 0xbc,
- 0xfd, 0x8b, 0xb7, 0xbd, 0x75, 0x85, 0x33, 0xbe, 0xdd, 0x24, 0x50, 0xbd,
- 0x2f, 0xa3, 0xc2, 0xbd, 0x5f, 0x9a, 0x33, 0x3e, 0xa0, 0x14, 0xa6, 0x3e,
- 0x0b, 0x0f, 0x82, 0xbd, 0xda, 0x2b, 0x5e, 0x3e, 0xa6, 0x02, 0x13, 0xbd,
- 0xfd, 0x47, 0xe4, 0xbd, 0xbe, 0xd5, 0x37, 0xbe, 0x66, 0x46, 0xdf, 0xbd,
- 0xe8, 0xf8, 0x75, 0xbe, 0x90, 0x4e, 0xbb, 0x3d, 0x1c, 0x47, 0x5d, 0x3e,
- 0x7c, 0x3c, 0x07, 0x3d, 0x62, 0xfb, 0x57, 0x3e, 0x98, 0xb6, 0xda, 0xbc,
- 0xeb, 0xc9, 0x12, 0xbe, 0x43, 0xaa, 0x2f, 0xbe, 0x7b, 0xb1, 0x32, 0xbd,
- 0xf7, 0x1e, 0xb2, 0x3d, 0x43, 0x40, 0xfc, 0x3d, 0x31, 0xba, 0x60, 0xbe,
- 0xcc, 0xba, 0x1d, 0xbf, 0xc1, 0xe1, 0x1a, 0xbe, 0xf4, 0x9c, 0x02, 0x3e,
- 0x90, 0x45, 0xa0, 0xbe, 0x23, 0x13, 0x47, 0xbe, 0x4f, 0x40, 0x04, 0xbf,
- 0xbd, 0xf3, 0xbd, 0xbd, 0x31, 0xf0, 0xec, 0xbd, 0xc0, 0xae, 0xd4, 0xbd,
- 0xb8, 0x13, 0xca, 0xbd, 0x58, 0xe8, 0x4b, 0x3d, 0x41, 0x39, 0x34, 0xbe,
- 0x60, 0x9d, 0xfd, 0xbd, 0x46, 0x0e, 0x49, 0xbe, 0xe7, 0x67, 0x0b, 0xbe,
- 0x5d, 0xba, 0xc1, 0xbd, 0x45, 0x2b, 0xab, 0xbd, 0x6c, 0xf8, 0x10, 0xbd,
- 0x0d, 0x8e, 0x68, 0xbe, 0x93, 0xd4, 0xa0, 0xbd, 0xcb, 0x49, 0x16, 0xbe,
- 0x16, 0x56, 0x48, 0xbd, 0x47, 0x37, 0x0e, 0x3e, 0x28, 0x11, 0xd2, 0xbd,
- 0x94, 0x4a, 0xf4, 0x3d, 0x89, 0x54, 0xda, 0xbd, 0x0c, 0x4f, 0xec, 0x3c,
- 0xb9, 0xaf, 0x37, 0xbe, 0x3a, 0xe3, 0x7f, 0xbd, 0x46, 0x77, 0x9c, 0xbc,
- 0x4b, 0x1b, 0x3b, 0x3e, 0x2e, 0x29, 0x42, 0xbe, 0xad, 0x62, 0xdd, 0xbd,
- 0x3f, 0x0f, 0x53, 0xbe, 0x2e, 0x3a, 0x11, 0x3c, 0xbe, 0x87, 0x0c, 0xbf,
- 0xe5, 0x26, 0xdc, 0xbd, 0x92, 0x7c, 0x3d, 0x3e, 0x10, 0xae, 0x7c, 0x3d,
- 0x78, 0xa5, 0xb1, 0x3d, 0x19, 0xfe, 0xf8, 0xbd, 0x43, 0x99, 0x21, 0xbe,
- 0x37, 0x53, 0x37, 0x3e, 0xfb, 0x4e, 0xb5, 0xbe, 0x66, 0xc8, 0xb3, 0xbd,
- 0x4a, 0x70, 0xdf, 0x3d, 0x03, 0x07, 0xf6, 0xbd, 0xa8, 0x09, 0x1b, 0xbe,
- 0x34, 0xda, 0x74, 0xbe, 0x31, 0xb0, 0xe5, 0x3c, 0xc6, 0x29, 0x99, 0xbe,
- 0xb3, 0x24, 0xce, 0xbe, 0x94, 0x63, 0x1e, 0xbf, 0x04, 0x5b, 0x5e, 0xbe,
- 0xc5, 0xed, 0x3b, 0xbd, 0x79, 0x7a, 0xf7, 0xbd, 0xc2, 0x52, 0x27, 0x3d,
- 0xc9, 0x36, 0x1c, 0x3d, 0x0b, 0xf0, 0x6f, 0xbe, 0x0a, 0x30, 0xdb, 0x3d,
- 0x62, 0x4d, 0x40, 0x3d, 0xeb, 0xd5, 0x89, 0xbd, 0x46, 0x8f, 0xee, 0xbd,
- 0x10, 0x61, 0x7c, 0x3e, 0x29, 0xf8, 0x29, 0xbd, 0x15, 0xc4, 0x04, 0xbe,
- 0x9f, 0x58, 0x50, 0x3e, 0x89, 0xda, 0x1a, 0xbe, 0x80, 0xcb, 0x89, 0x3d,
- 0x78, 0x63, 0x8b, 0xbd, 0x48, 0xd5, 0x9e, 0x3e, 0xfd, 0xf0, 0x12, 0xbe,
- 0x26, 0x11, 0xd3, 0xbd, 0xfc, 0x32, 0x63, 0x3d, 0x96, 0x02, 0xaa, 0x3e,
- 0x66, 0xb4, 0xb0, 0xbd, 0x61, 0xcb, 0x98, 0xbe, 0x0b, 0xa7, 0x53, 0x3e,
- 0x3e, 0x43, 0x39, 0x3e, 0xfd, 0xd2, 0x6e, 0x3e, 0x4c, 0xa4, 0x04, 0xbe,
- 0x57, 0xf3, 0xd6, 0xbd, 0x81, 0xcf, 0x87, 0x3e, 0xdf, 0x29, 0x6e, 0xbe,
- 0x4d, 0x98, 0xd6, 0xbe, 0xeb, 0x48, 0x90, 0x3e, 0x7b, 0x14, 0x00, 0xbe,
- 0xd1, 0x51, 0x65, 0xbe, 0x2f, 0x5f, 0x5d, 0x3e, 0xe1, 0xda, 0x15, 0xbe,
- 0x8b, 0x64, 0x54, 0xbe, 0x17, 0x10, 0xa6, 0x3d, 0x99, 0x09, 0x5c, 0xbe,
- 0x0a, 0xa2, 0x87, 0x3e, 0xc5, 0xcb, 0xe4, 0xbd, 0xb2, 0xd5, 0xea, 0x3d,
- 0x23, 0x2f, 0x23, 0x3e, 0x23, 0x0f, 0xfc, 0xbb, 0x99, 0x6b, 0xa3, 0x3e,
- 0x1e, 0x93, 0xf3, 0x3c, 0xec, 0x81, 0xfc, 0xbe, 0x2d, 0x4a, 0x21, 0xbe,
- 0xeb, 0xd4, 0xae, 0xbe, 0x41, 0xd0, 0x4d, 0x3e, 0xb5, 0x39, 0x08, 0xbd,
- 0x25, 0x49, 0x85, 0x3c, 0x5a, 0x0f, 0x99, 0x3d, 0xc2, 0xf3, 0xef, 0x3d,
- 0x43, 0x89, 0x62, 0x3d, 0x5e, 0x20, 0x38, 0xbe, 0xd5, 0x3a, 0x1e, 0xbe,
- 0xc2, 0x9c, 0xeb, 0xbd, 0x80, 0x0e, 0xb9, 0xbd, 0xed, 0x25, 0x9e, 0xbd,
- 0x65, 0xd7, 0x1d, 0x3b, 0xb5, 0x7a, 0xda, 0x3d, 0xf9, 0x44, 0x91, 0xbe,
- 0x89, 0xcd, 0x31, 0x3d, 0x64, 0x44, 0x21, 0x3c, 0x03, 0x20, 0x31, 0xbe,
- 0x1b, 0x3b, 0xad, 0xbe, 0x53, 0x70, 0x0a, 0xbe, 0x75, 0x30, 0x9a, 0xbe,
- 0x38, 0x53, 0x1f, 0xbd, 0x4a, 0x22, 0x38, 0xbb, 0x7c, 0x50, 0x3d, 0xbd,
- 0x59, 0x5d, 0xb0, 0xbd, 0x9b, 0xa6, 0xa1, 0x3e, 0xb0, 0xc5, 0x23, 0xbe,
- 0xa4, 0xb5, 0xb3, 0x3d, 0x8d, 0xac, 0x42, 0xba, 0x4c, 0xc4, 0xa3, 0x3d,
- 0x3f, 0xb6, 0xfa, 0x3d, 0x8e, 0x32, 0x94, 0x3e, 0x1d, 0xf1, 0x74, 0xbe,
- 0x21, 0x3e, 0x57, 0xbd, 0x56, 0xf0, 0x2c, 0x3e, 0x80, 0xac, 0xa1, 0x3e,
- 0x78, 0xcf, 0x04, 0xbd, 0x21, 0xd0, 0xbe, 0x3c, 0x9f, 0xc6, 0x02, 0xbf,
- 0x64, 0x44, 0x78, 0x3d, 0xe1, 0x01, 0x1d, 0xbe, 0xf1, 0xb6, 0x8d, 0x3d,
- 0x33, 0x2c, 0x89, 0x3d, 0xb8, 0xe2, 0x61, 0x3d, 0xc4, 0x21, 0x98, 0x3c,
- 0x78, 0xd4, 0x9e, 0xbe, 0x38, 0x8a, 0xb5, 0x3d, 0xa9, 0x13, 0x98, 0x3d,
- 0xc7, 0xb5, 0x62, 0xbe, 0xa0, 0x3c, 0x3c, 0xbe, 0x3d, 0x26, 0xa7, 0x3c,
- 0x03, 0x16, 0x93, 0xbd, 0x5a, 0x91, 0x15, 0xbe, 0xda, 0x22, 0x38, 0xbc,
- 0x34, 0x77, 0xaf, 0xbd, 0xa5, 0x0f, 0x24, 0xbf, 0x62, 0x21, 0x4b, 0xbe,
- 0x57, 0xaa, 0x3d, 0xbf, 0x97, 0x32, 0xf5, 0x3c, 0xf0, 0xb2, 0x2e, 0x3e,
- 0xe2, 0xa1, 0x80, 0xbe, 0xf3, 0xf2, 0x39, 0xbd, 0x69, 0xcd, 0xb5, 0xbc,
- 0x4d, 0x31, 0x44, 0xbe, 0x75, 0x8d, 0xa4, 0xbd, 0x0a, 0x24, 0x97, 0xbe,
- 0xdd, 0xb0, 0xb2, 0xbd, 0xb7, 0xdb, 0xd5, 0x3d, 0x0e, 0x8b, 0xaf, 0xbe,
- 0xa7, 0xfd, 0x58, 0x3c, 0xb9, 0xcb, 0xbb, 0xbe, 0x2d, 0x04, 0x03, 0x3e,
- 0xfe, 0xf9, 0xb3, 0x3e, 0x66, 0x88, 0x33, 0xbd, 0x58, 0x40, 0x1d, 0xbf,
- 0x60, 0x95, 0x03, 0xbb, 0xaf, 0x5f, 0xf5, 0xbb, 0xe4, 0x17, 0xe5, 0xbd,
- 0x3c, 0x87, 0x18, 0xbe, 0x5f, 0x82, 0x98, 0xbe, 0x28, 0x40, 0x7c, 0xbe,
- 0x36, 0x66, 0xa2, 0x3d, 0xcc, 0xfc, 0x8e, 0x3d, 0x29, 0x7c, 0xd8, 0xbd,
- 0x91, 0x87, 0xbe, 0xbd, 0xd3, 0x26, 0x0c, 0x3e, 0xec, 0x7f, 0x3b, 0xbd,
- 0xa6, 0xcc, 0x03, 0xbe, 0x8b, 0x51, 0xe5, 0xbd, 0x61, 0xa8, 0x3a, 0x3e,
- 0x58, 0x12, 0xd1, 0xbd, 0x1b, 0xd7, 0x8d, 0x3d, 0xa6, 0xed, 0x2e, 0xbe,
- 0x3d, 0x94, 0xa8, 0x3d, 0x08, 0x29, 0xa5, 0xbd, 0x0b, 0x82, 0xbd, 0xbe,
- 0x8b, 0xdc, 0x0b, 0x3d, 0x14, 0x3b, 0xc6, 0x3c, 0x57, 0x6b, 0x71, 0xbe,
- 0x53, 0x79, 0x81, 0x3d, 0xea, 0x15, 0xdb, 0xbd, 0x3e, 0x46, 0xe7, 0xbd,
- 0x46, 0xd2, 0x8c, 0xbe, 0x8f, 0xe4, 0x0c, 0xbf, 0x7e, 0x94, 0x10, 0xbe,
- 0xf8, 0xc8, 0x1b, 0xbe, 0x67, 0x2c, 0xc6, 0x3d, 0xc1, 0x17, 0xca, 0x3d,
- 0x8b, 0x69, 0x15, 0x3e, 0x2f, 0xe1, 0x09, 0xbf, 0xbb, 0x0c, 0x46, 0x3d,
- 0x8a, 0x20, 0x8d, 0xbe, 0x72, 0x60, 0x85, 0x3d, 0xc9, 0xf5, 0xa5, 0xbd,
- 0x87, 0xd0, 0xea, 0x3c, 0x34, 0x3d, 0x30, 0xbe, 0x30, 0x1c, 0x07, 0x3e,
- 0x2e, 0x9a, 0x78, 0xbe, 0xf9, 0xc0, 0x0a, 0xbe, 0xc0, 0xe9, 0x9f, 0xbb,
- 0x7e, 0xa5, 0x86, 0xbe, 0xfb, 0xf2, 0xbc, 0xbe, 0xc7, 0x42, 0x49, 0x3e,
- 0x8c, 0x74, 0x18, 0xbd, 0xdd, 0x02, 0x91, 0xbe, 0xc5, 0x05, 0x0f, 0xbf,
- 0xe6, 0x2c, 0x81, 0xbe, 0xf7, 0xd2, 0x1e, 0xbe, 0xfa, 0x2c, 0x13, 0x3e,
- 0x4f, 0x93, 0x9a, 0xbe, 0x5c, 0xc8, 0xef, 0x3d, 0x5c, 0x67, 0x65, 0x3b,
- 0x9f, 0x07, 0x66, 0xbd, 0xff, 0xfb, 0x4e, 0x3d, 0x66, 0xb5, 0x71, 0xbe,
- 0x05, 0x9c, 0x46, 0xbe, 0x9b, 0x5d, 0x47, 0xbe, 0xbc, 0xa9, 0xc0, 0xbe,
- 0x52, 0xff, 0xb3, 0xbe, 0xba, 0x58, 0x41, 0xbc, 0x90, 0xec, 0xc3, 0xbd,
- 0x98, 0xd3, 0xaf, 0xbe, 0x9a, 0x78, 0x33, 0x3c, 0x6b, 0x14, 0x84, 0xbe,
- 0x98, 0x33, 0x29, 0xbd, 0x98, 0xfe, 0x8e, 0xbe, 0xdc, 0xa4, 0xa7, 0xbc,
- 0xf3, 0xaa, 0x69, 0xbd, 0xdb, 0xc3, 0xc9, 0x3c, 0xcd, 0x63, 0x29, 0xbc,
- 0xcc, 0xda, 0xd8, 0x3d, 0xc7, 0x0d, 0x9a, 0xbd, 0xc2, 0x04, 0xd4, 0x3d,
- 0x25, 0x0d, 0x0e, 0xbd, 0x29, 0x3c, 0x94, 0x3b, 0xa0, 0x50, 0x7d, 0xbc,
- 0x03, 0x6a, 0xcb, 0xbd, 0x45, 0xc0, 0x0d, 0xbe, 0xb4, 0x1b, 0x4b, 0x3b,
- 0xca, 0xf9, 0x0d, 0x3d, 0x74, 0x4c, 0x32, 0x3e, 0xed, 0xfc, 0xf3, 0x3b,
- 0xcd, 0xf7, 0x28, 0xbe, 0x5f, 0x37, 0xe6, 0xbd, 0x8d, 0x16, 0x3c, 0xbe,
- 0x95, 0x67, 0xcf, 0xbd, 0x9f, 0x0e, 0x01, 0xbe, 0x7f, 0x43, 0xc9, 0xbd,
- 0x64, 0x0c, 0x94, 0xbe, 0x70, 0xaa, 0x9e, 0xbd, 0xde, 0x6f, 0xf9, 0xbe,
- 0xb9, 0xdd, 0x73, 0x3e, 0x60, 0x4e, 0x16, 0x3e, 0xac, 0xbb, 0x65, 0xbe,
- 0xb3, 0x6c, 0x54, 0xbe, 0x5f, 0x19, 0x27, 0xbe, 0x72, 0xbe, 0xd7, 0x3c,
- 0x48, 0xb0, 0xe7, 0x3d, 0x01, 0xd8, 0x97, 0x3d, 0xbf, 0xe7, 0x3b, 0xbd,
- 0x91, 0xe4, 0x0a, 0xbe, 0xec, 0x8b, 0x62, 0xbe, 0x48, 0x0f, 0x02, 0xbe,
- 0x93, 0x76, 0x7a, 0x3c, 0xa6, 0xb4, 0x2c, 0xbe, 0xa9, 0xda, 0x07, 0xbe,
- 0xe7, 0x81, 0x51, 0xbe, 0x78, 0x43, 0x7a, 0xbe, 0xd0, 0xd9, 0xeb, 0x3d,
- 0x43, 0x05, 0x51, 0x3d, 0x05, 0x75, 0x9a, 0x3c, 0xab, 0x20, 0xf0, 0xbe,
- 0xf4, 0xd0, 0xf3, 0x3a, 0xb3, 0x62, 0xf7, 0x3d, 0xcd, 0xb1, 0x2f, 0x3d,
- 0x0c, 0x9a, 0x41, 0x3e, 0x9c, 0x8a, 0xa6, 0xbd, 0x0a, 0x13, 0xfd, 0xbc,
- 0x45, 0x51, 0x2e, 0x3e, 0x9d, 0x1e, 0xfb, 0x3c, 0xa5, 0x8d, 0x08, 0xbf,
- 0xeb, 0x6a, 0x17, 0x3e, 0x45, 0x56, 0xce, 0xbd, 0x47, 0xa8, 0xce, 0x3d,
- 0x1c, 0x03, 0x7b, 0xbd, 0xf2, 0x3b, 0xab, 0x3c, 0x13, 0x0f, 0x5c, 0x3d,
- 0x81, 0x19, 0x13, 0xbd, 0x66, 0x37, 0xcd, 0xbd, 0xfc, 0x92, 0x8c, 0x3d,
- 0x25, 0xb1, 0x1b, 0xbe, 0xd2, 0x0b, 0x52, 0x3e, 0xfb, 0x1d, 0x2d, 0x3e,
- 0xf0, 0xe0, 0x53, 0x3e, 0x67, 0xd2, 0x3d, 0x3d, 0x87, 0xee, 0xa1, 0xbe,
- 0xa1, 0x87, 0xfb, 0x3d, 0x76, 0x88, 0x6e, 0xbc, 0xd4, 0x4b, 0x0d, 0xbe,
- 0x76, 0xcd, 0x0d, 0xbc, 0x30, 0x91, 0x96, 0xbe, 0x11, 0xdd, 0x48, 0xbd,
- 0x38, 0x60, 0xbf, 0xbe, 0xe9, 0x2f, 0x88, 0xbd, 0x3b, 0xea, 0x25, 0xbd,
- 0xda, 0xf2, 0xb2, 0xbe, 0x89, 0x5b, 0xdb, 0xbd, 0xe5, 0x29, 0x59, 0x3e,
- 0xd4, 0xc4, 0xf5, 0x3d, 0xd7, 0x3f, 0x8d, 0xbe, 0xe8, 0x8d, 0x11, 0x3e,
- 0x28, 0x3a, 0x5a, 0xbe, 0x4c, 0x77, 0x4f, 0xbd, 0xa0, 0xba, 0xed, 0xbd,
- 0xa1, 0x1a, 0x9b, 0x3d, 0x95, 0x44, 0x14, 0xbe, 0x8d, 0xe9, 0xa1, 0xbd,
- 0xae, 0x3b, 0xc4, 0x3d, 0x0f, 0x21, 0x3d, 0xbe, 0x13, 0xda, 0x80, 0xbe,
- 0x5a, 0x3b, 0x95, 0xbe, 0x5b, 0x01, 0xad, 0x3c, 0x14, 0x23, 0xa4, 0xbd,
- 0x7d, 0x33, 0xd8, 0x3c, 0xe0, 0x8c, 0xbc, 0xbe, 0x61, 0x2d, 0x71, 0xbe,
- 0x85, 0xa0, 0xa2, 0x3e, 0x55, 0xd5, 0xb2, 0xbd, 0x64, 0x04, 0x2b, 0x3e,
- 0x4a, 0x40, 0x20, 0xbe, 0x83, 0xeb, 0x85, 0xbd, 0x61, 0xc7, 0x24, 0x3d,
- 0xba, 0x80, 0x81, 0xbd, 0xce, 0xbc, 0x51, 0x3d, 0x10, 0xe8, 0x06, 0xbe,
- 0x75, 0xab, 0x90, 0xbd, 0x07, 0x7a, 0x23, 0xbe, 0x3d, 0xe0, 0x07, 0xbe,
- 0x08, 0x34, 0x00, 0xbf, 0xe0, 0x1f, 0x97, 0xbe, 0x09, 0x80, 0x8d, 0xbe,
- 0xb2, 0x8b, 0xd0, 0x3d, 0x53, 0x34, 0x35, 0xbb, 0xcc, 0x4a, 0xda, 0xbd,
- 0x36, 0x7c, 0x55, 0xbd, 0x9a, 0x26, 0x9f, 0x3c, 0x1e, 0x46, 0xb2, 0xbd,
- 0xeb, 0x8e, 0x37, 0xbd, 0xf2, 0xa3, 0x86, 0x3a, 0xf3, 0xf1, 0x2b, 0xbe,
- 0x4a, 0x09, 0x90, 0x3e, 0x36, 0x4f, 0x09, 0xbe, 0xcf, 0xab, 0x19, 0xbe,
- 0x36, 0x21, 0x75, 0xbd, 0x6d, 0xc0, 0xae, 0xbe, 0x56, 0x03, 0xc4, 0xbe,
- 0x76, 0xc2, 0x5d, 0xbd, 0xed, 0x1f, 0x1e, 0x3e, 0xb8, 0x0a, 0xb6, 0xbd,
- 0x46, 0x04, 0x04, 0x3e, 0x09, 0xfb, 0xc4, 0xbb, 0xa8, 0x13, 0x71, 0xbe,
- 0xc8, 0x9a, 0x15, 0xbd, 0x00, 0x14, 0xe1, 0xbe, 0x00, 0xee, 0xa4, 0x3c,
- 0xc9, 0xdf, 0xf6, 0xbd, 0x73, 0x5a, 0x51, 0xbd, 0x0b, 0xf0, 0x85, 0x3e,
- 0x55, 0xa8, 0x50, 0xbe, 0x6f, 0xe9, 0xa9, 0xbe, 0x1b, 0xb0, 0xcc, 0xbd,
- 0x78, 0xe1, 0x54, 0xbe, 0xf2, 0x1d, 0x52, 0xbe, 0x08, 0x91, 0xc1, 0xbe,
- 0x6f, 0x57, 0x2d, 0xbd, 0x48, 0x8f, 0xc8, 0xbe, 0xf2, 0x47, 0xe8, 0x3c,
- 0x7d, 0x57, 0xbd, 0xbe, 0xbe, 0xc6, 0x18, 0x3e, 0xa1, 0xc2, 0x96, 0x3e,
- 0x4f, 0x39, 0xcb, 0xbe, 0xb7, 0x0d, 0xb6, 0xbe, 0xad, 0x81, 0xf9, 0x3d,
- 0x60, 0x09, 0x58, 0xbb, 0x01, 0xf1, 0xf4, 0xbe, 0xfb, 0x9f, 0x13, 0x3d,
- 0x4f, 0x68, 0x13, 0x3d, 0xbd, 0x93, 0x81, 0xbe, 0x38, 0xff, 0x25, 0xbe,
- 0xd0, 0xfb, 0x40, 0x3d, 0x8b, 0x3d, 0x21, 0xbf, 0xd1, 0x5d, 0xd0, 0xbd,
- 0x65, 0xf6, 0xe5, 0xbe, 0x5a, 0x1c, 0x78, 0xbe, 0x6e, 0x4d, 0x01, 0xbe,
- 0xc4, 0x17, 0xc1, 0x3d, 0x5c, 0x7f, 0x9c, 0xbd, 0x8f, 0xe8, 0x22, 0x3b,
- 0xbf, 0x33, 0x43, 0xbe, 0x4f, 0x12, 0x1f, 0x3d, 0x9d, 0x35, 0x7e, 0xbe,
- 0x2a, 0x28, 0x6d, 0x3d, 0x4f, 0xc5, 0x64, 0xbe, 0x87, 0x65, 0x11, 0xbd,
- 0x73, 0xa5, 0x16, 0x3e, 0x5e, 0xc4, 0x07, 0xbe, 0x73, 0x31, 0x75, 0xbd,
- 0x9a, 0x32, 0xed, 0xbd, 0xa0, 0xa1, 0x44, 0xbe, 0x19, 0xde, 0xdb, 0xbd,
- 0x0e, 0xc4, 0x8c, 0xbe, 0x8a, 0xfd, 0xaf, 0xbe, 0x55, 0xe2, 0x2a, 0x3e,
- 0x5e, 0xfd, 0x2b, 0xbe, 0x36, 0x4c, 0xea, 0xbd, 0x49, 0x9c, 0xb3, 0xbe,
- 0x0c, 0x4f, 0xe4, 0xbc, 0xb3, 0x46, 0xd2, 0xbd, 0x43, 0x52, 0xed, 0xbd,
- 0x99, 0x37, 0xd8, 0x3d, 0xc9, 0x34, 0xdd, 0xbd, 0xfe, 0xa2, 0xf6, 0x3d,
- 0x8d, 0xbf, 0x95, 0xbd, 0x5f, 0x54, 0x31, 0xbe, 0x18, 0x85, 0x89, 0xbd,
- 0xef, 0xba, 0x88, 0xbe, 0x1c, 0x3d, 0xc5, 0xbc, 0xad, 0xc7, 0x06, 0x3b,
- 0x35, 0x20, 0xb6, 0xbe, 0x3a, 0xe3, 0x03, 0xbf, 0xed, 0xa9, 0x50, 0xbe,
- 0x18, 0x42, 0xad, 0xbd, 0xc0, 0x22, 0xa9, 0x3d, 0x24, 0x53, 0x35, 0xbd,
- 0x34, 0xa0, 0xb9, 0xbe, 0x73, 0x23, 0x6c, 0xbe, 0x09, 0x70, 0x49, 0xbe,
- 0x15, 0x8f, 0x6c, 0xbe, 0xc4, 0x36, 0x71, 0xbe, 0xd6, 0xc6, 0x1c, 0xbe,
- 0x2d, 0x4c, 0x34, 0xbe, 0x1d, 0xbd, 0xd3, 0xbe, 0x96, 0x3a, 0x0b, 0xbd,
- 0x29, 0x3a, 0x8f, 0xbe, 0x5e, 0x3b, 0x85, 0xbe, 0x11, 0x1d, 0xc4, 0xbe,
- 0xe8, 0x61, 0x39, 0x3e, 0x43, 0xdd, 0xcf, 0x3d, 0x0b, 0xa3, 0x7d, 0xbe,
- 0xde, 0xeb, 0x5e, 0xbe, 0x3f, 0x13, 0x13, 0x3e, 0x59, 0xd4, 0x98, 0xbd,
- 0x5d, 0xe4, 0x3a, 0xbc, 0x50, 0xcd, 0x0d, 0xbe, 0xc5, 0x66, 0x82, 0xbd,
- 0x6d, 0x18, 0xf8, 0xbd, 0xda, 0x16, 0x0f, 0xbf, 0x32, 0xd4, 0x90, 0xbd,
- 0x0a, 0x7c, 0x53, 0xbe, 0xc7, 0xad, 0x13, 0xbe, 0x3b, 0x77, 0xa3, 0xbe,
- 0x5c, 0x3d, 0x9b, 0xbd, 0xd1, 0x66, 0xc4, 0xbd, 0xf8, 0xd2, 0xef, 0x3c,
- 0x1b, 0xe7, 0x3a, 0x3d, 0x9f, 0x38, 0xc3, 0xbd, 0x4e, 0xc5, 0x8b, 0xbc,
- 0x5a, 0x21, 0x93, 0xbe, 0x51, 0x79, 0x76, 0xbe, 0xb6, 0x07, 0xdd, 0x3d,
- 0xbe, 0xb0, 0x5d, 0xbe, 0x1b, 0x31, 0x35, 0xbe, 0x61, 0xa2, 0x66, 0xbe,
- 0xf3, 0x00, 0xfa, 0x3b, 0x2f, 0xa7, 0x8a, 0x3d, 0x5a, 0xf2, 0xb6, 0xbe,
- 0x5d, 0x44, 0xa0, 0xbd, 0x34, 0xd9, 0x65, 0xbb, 0x75, 0x7c, 0x97, 0xbe,
- 0x0c, 0xbc, 0x53, 0xbe, 0x4c, 0x3d, 0x74, 0xbe, 0xbe, 0xbd, 0x40, 0x3d,
- 0x32, 0x0b, 0xa3, 0xbe, 0xac, 0x7d, 0x62, 0xbe, 0xc5, 0x80, 0xef, 0xbd,
- 0x65, 0x1a, 0x5d, 0xbe, 0x92, 0x2b, 0xea, 0xbd, 0x2b, 0xbc, 0xf0, 0xbe,
- 0x9e, 0xab, 0x2f, 0xbd, 0xd2, 0x1d, 0x25, 0xbd, 0xe7, 0x9a, 0x8a, 0x3d,
- 0xf9, 0xf2, 0xbf, 0xbd, 0xad, 0xf3, 0x71, 0xbe, 0xf0, 0x2e, 0xe9, 0xbd,
- 0xee, 0xb4, 0x70, 0xbe, 0xd7, 0xe3, 0x83, 0xbe, 0xd6, 0x5f, 0x05, 0xbe,
- 0x74, 0x00, 0x38, 0xbd, 0x70, 0x6c, 0xb1, 0xbd, 0xfa, 0x1a, 0xa6, 0x3d,
- 0x4e, 0xdb, 0x65, 0xbe, 0x4d, 0x16, 0x42, 0xbe, 0x70, 0xab, 0x99, 0xbd,
- 0x29, 0x48, 0xcd, 0xbd, 0x78, 0x04, 0xeb, 0xbd, 0xf6, 0xbc, 0x43, 0xbe,
- 0x4b, 0x1a, 0x39, 0xbe, 0x8c, 0x8c, 0x22, 0xbe, 0xb6, 0x6f, 0x96, 0xbc,
- 0x63, 0xb8, 0xa3, 0xbe, 0x2b, 0x46, 0x76, 0xbe, 0xdf, 0x47, 0xa0, 0xbd,
- 0x1e, 0x13, 0xa5, 0xbd, 0xf6, 0x35, 0x66, 0xbe, 0x83, 0xb9, 0x80, 0xbc,
- 0x04, 0x90, 0xce, 0x3c, 0xf0, 0x71, 0xe2, 0x3d, 0x20, 0x6e, 0xa6, 0xbe,
- 0x53, 0x62, 0x28, 0xbe, 0xa0, 0x11, 0xd9, 0xbd, 0xab, 0xa2, 0x5f, 0xbd,
- 0x2f, 0x70, 0x07, 0xbe, 0x6f, 0xde, 0xcf, 0xbe, 0x0b, 0x42, 0x33, 0xbd,
- 0x14, 0x9b, 0xe0, 0x3d, 0x09, 0xf8, 0x30, 0x3e, 0x81, 0x8d, 0x9e, 0xbd,
- 0xde, 0x51, 0x3c, 0x3e, 0xb9, 0x3c, 0x89, 0xbd, 0x69, 0x5d, 0x25, 0xbe,
- 0x21, 0x79, 0x26, 0x3e, 0x55, 0x7c, 0xc8, 0x3d, 0xec, 0x41, 0x12, 0x3c,
- 0xc5, 0x9a, 0x92, 0xbd, 0xb2, 0x22, 0x1a, 0x3e, 0x09, 0xa0, 0xf0, 0x3c,
- 0x65, 0x12, 0x95, 0xbd, 0x6b, 0x15, 0xd4, 0x3d, 0xe1, 0x4f, 0x8a, 0xbd,
- 0x30, 0x83, 0x81, 0xbd, 0xd7, 0x5b, 0x3c, 0xbd, 0xaa, 0x8e, 0x2e, 0xbd,
- 0x99, 0x1b, 0x30, 0x3e, 0x27, 0xdb, 0x6d, 0x3e, 0x6d, 0x0c, 0x7f, 0xbb,
- 0x6a, 0xce, 0xca, 0x3d, 0x03, 0xfc, 0x17, 0x3e, 0x81, 0x3a, 0x05, 0x3e,
- 0x01, 0xbe, 0xd8, 0xbd, 0xcd, 0xac, 0xd9, 0x3d, 0x04, 0x61, 0x27, 0x3e,
- 0xf4, 0xe7, 0x91, 0x3e, 0x99, 0xc8, 0x9d, 0xbd, 0xe5, 0xdb, 0xd5, 0xbd,
- 0x09, 0xa3, 0xd8, 0xbd, 0xaa, 0x21, 0x8c, 0x3d, 0x51, 0xdc, 0xed, 0xbc,
- 0x8f, 0x7a, 0xce, 0x3d, 0xd2, 0x11, 0x8c, 0x3c, 0x38, 0x38, 0x59, 0x3d,
- 0xb3, 0xc6, 0x3d, 0x3c, 0x7e, 0xf5, 0xba, 0xbd, 0xf9, 0xe9, 0xfb, 0xbd,
- 0x62, 0x1b, 0x5b, 0xbe, 0x69, 0x9a, 0xe5, 0xbd, 0x90, 0x3b, 0xd1, 0xbc,
- 0x6b, 0xf6, 0xd6, 0x3d, 0x33, 0x74, 0xc9, 0x3d, 0x41, 0x2a, 0x7c, 0xbc,
- 0x1b, 0xb0, 0x7d, 0x3e, 0x81, 0x88, 0x81, 0x3e, 0xae, 0x06, 0x0a, 0xbc,
- 0x90, 0x70, 0x49, 0x3d, 0x64, 0x1a, 0x5b, 0xbd, 0x0d, 0xb1, 0x15, 0xbc,
- 0x45, 0x1c, 0xf7, 0xbd, 0x9c, 0x41, 0x58, 0xbc, 0xda, 0x0d, 0x1a, 0x3d,
- 0xa5, 0xd5, 0x57, 0xbd, 0x20, 0x81, 0xe5, 0xbc, 0x83, 0x3f, 0x22, 0x3d,
- 0xf2, 0x21, 0xfb, 0xbd, 0x47, 0x63, 0xae, 0x3d, 0x46, 0x0a, 0x57, 0xbd,
- 0x2a, 0x1b, 0x95, 0xbe, 0x4e, 0x84, 0x91, 0xbd, 0x54, 0xba, 0x8d, 0xbd,
- 0x7c, 0xbd, 0xea, 0x3d, 0xf8, 0xb5, 0x39, 0xbe, 0x6a, 0x13, 0x1e, 0x3e,
- 0x79, 0x8b, 0x6f, 0xbd, 0xba, 0x8a, 0x8d, 0x3d, 0x0a, 0x16, 0xa5, 0xbc,
- 0x30, 0xc4, 0xb5, 0x3c, 0x5f, 0x79, 0x28, 0x3d, 0xe2, 0xe9, 0x84, 0x3e,
- 0xfb, 0x1a, 0xb9, 0xbd, 0x00, 0x5c, 0xaa, 0x3d, 0x92, 0x94, 0x36, 0x3e,
- 0xce, 0x50, 0x5c, 0x3e, 0xc8, 0xce, 0x95, 0xbd, 0x0c, 0x2e, 0x0f, 0x3d,
- 0x7b, 0xc0, 0x03, 0x3e, 0x81, 0x4a, 0xc3, 0xbd, 0x2b, 0x0c, 0x7f, 0xbe,
- 0x1f, 0x4a, 0x63, 0x3d, 0xe3, 0xa3, 0xa5, 0x3e, 0x21, 0xed, 0xfc, 0x3d,
- 0x62, 0x86, 0x58, 0xbd, 0x31, 0x14, 0x0c, 0xbd, 0xf2, 0x46, 0xe2, 0xbd,
- 0x4f, 0x8a, 0xb6, 0xbc, 0xac, 0xfe, 0x5a, 0x3e, 0xcb, 0xa6, 0x1d, 0xbe,
- 0x54, 0x8e, 0x5c, 0xbd, 0x7e, 0x4d, 0xfd, 0xbd, 0xe6, 0x9e, 0x20, 0x3e,
- 0x90, 0x95, 0x46, 0xbd, 0xc1, 0x71, 0xac, 0x3c, 0x4e, 0xfd, 0xa1, 0xbd,
- 0x9c, 0x35, 0xef, 0xbd, 0x7c, 0x15, 0x24, 0xbe, 0xaa, 0x84, 0xa0, 0x3d,
- 0x6d, 0x02, 0xf9, 0xbd, 0xe0, 0x6d, 0x7f, 0x3d, 0xc3, 0x1d, 0x53, 0xbd,
- 0x8c, 0x66, 0x43, 0x3c, 0x78, 0x39, 0xed, 0x3d, 0x96, 0x7a, 0xac, 0xbd,
- 0xe5, 0xec, 0x21, 0x3c, 0x88, 0x22, 0x08, 0x3e, 0x3d, 0x38, 0x45, 0xbe,
- 0x76, 0x2e, 0x8e, 0xbd, 0xec, 0xaa, 0xac, 0x3d, 0xb7, 0x59, 0x3d, 0x3e,
- 0x2c, 0xdd, 0x82, 0x3e, 0x7f, 0x66, 0x6d, 0xbe, 0x86, 0xcc, 0xae, 0xbc,
- 0x55, 0xcf, 0xef, 0x3d, 0xc6, 0x91, 0x4e, 0x3e, 0xdc, 0x60, 0x35, 0x3e,
- 0xa5, 0x26, 0x93, 0x3d, 0xb2, 0x1f, 0xf8, 0x3c, 0x32, 0x22, 0x5a, 0xbe,
- 0x41, 0x24, 0x19, 0xbe, 0xf9, 0x22, 0x70, 0x3d, 0x44, 0xc1, 0xd7, 0xbd,
- 0x52, 0xed, 0x46, 0xbe, 0x42, 0x0b, 0x2f, 0xbd, 0xea, 0x09, 0x22, 0x3e,
- 0xf9, 0xff, 0x02, 0xbe, 0xf6, 0xe5, 0x18, 0xbc, 0xf5, 0x07, 0x53, 0x3d,
- 0x43, 0x8a, 0x95, 0x3c, 0x5a, 0xb0, 0x8f, 0x3c, 0x43, 0x0d, 0x95, 0xbe,
- 0xda, 0xb4, 0xbd, 0x3d, 0xf9, 0x14, 0x46, 0xbe, 0xc6, 0x78, 0x32, 0xbe,
- 0xb3, 0x83, 0x3e, 0xbd, 0x86, 0xc9, 0x16, 0xbe, 0xf2, 0xd4, 0x4f, 0xbd,
- 0xb4, 0xbd, 0xd9, 0xbd, 0x23, 0xcb, 0x56, 0xbe, 0xb7, 0x5c, 0x0d, 0xbe,
- 0x8e, 0x5f, 0xdf, 0xbd, 0x66, 0x4e, 0xd8, 0x3d, 0xb8, 0x28, 0x24, 0x3e,
- 0xa7, 0x56, 0xfe, 0xbc, 0x37, 0xf5, 0xa2, 0xbd, 0xb8, 0xb3, 0x1e, 0xbe,
- 0x0c, 0xa0, 0xdf, 0xbd, 0xbc, 0xe6, 0x1b, 0x3d, 0x01, 0xb7, 0x1f, 0x3e,
- 0xa0, 0x2b, 0x48, 0xbe, 0x9a, 0x74, 0x93, 0xbe, 0x9b, 0x43, 0xaf, 0x3e,
- 0x42, 0xd1, 0x93, 0xbe, 0xe4, 0x2f, 0x4c, 0x3d, 0xb4, 0xee, 0x72, 0x3d,
- 0x65, 0x95, 0xa6, 0xbe, 0x3d, 0x14, 0xff, 0xbd, 0xc8, 0xd8, 0x26, 0xbd,
- 0x9f, 0x6b, 0x1b, 0xbf, 0x12, 0x43, 0xe5, 0x3c, 0x2e, 0xf5, 0xdb, 0xbd,
- 0xf0, 0x1f, 0xd0, 0x3e, 0xe9, 0xbd, 0x68, 0x3d, 0xcc, 0xb8, 0x63, 0x3d,
- 0x56, 0xbe, 0x27, 0x3d, 0x59, 0xd1, 0xc1, 0xbd, 0x43, 0xbc, 0x21, 0x3e,
- 0xce, 0x9d, 0x6c, 0xbe, 0x5f, 0xd7, 0x8a, 0x3d, 0x76, 0xa0, 0xd5, 0x3e,
- 0xa8, 0x9a, 0x3c, 0x3e, 0xc5, 0x76, 0x53, 0x3c, 0xb6, 0xb2, 0x5d, 0x3d,
- 0x36, 0x28, 0x48, 0xbd, 0x9f, 0x69, 0x05, 0xbc, 0xf0, 0xaf, 0x29, 0x3d,
- 0x66, 0xd5, 0xbf, 0x3e, 0x83, 0xb3, 0xd0, 0x3d, 0x7c, 0x76, 0x36, 0x3d,
- 0x89, 0xc1, 0x37, 0xbe, 0xcd, 0x45, 0x8a, 0x3e, 0x17, 0x06, 0xac, 0x3c,
- 0x32, 0xf4, 0x8a, 0xbe, 0xf2, 0xab, 0x23, 0x3e, 0x25, 0x06, 0x34, 0xbe,
- 0x48, 0xc3, 0x97, 0xbe, 0xfb, 0x78, 0xd2, 0xbd, 0x28, 0x06, 0x73, 0xbe,
- 0x93, 0x1b, 0xf6, 0x3d, 0xcb, 0x05, 0x9a, 0xbc, 0x18, 0xf0, 0x45, 0x3e,
- 0xe4, 0xfa, 0x0d, 0xbe, 0x55, 0xb8, 0x65, 0xbc, 0x61, 0xf4, 0x8d, 0xbd,
- 0xf7, 0x25, 0x48, 0xbd, 0x2a, 0x20, 0x81, 0x3d, 0x86, 0x2f, 0x3c, 0xbc,
- 0xa8, 0xd4, 0x67, 0xbe, 0xe0, 0x90, 0x5b, 0xbd, 0x6e, 0x3d, 0x57, 0x3e,
- 0xc1, 0xfa, 0x24, 0xbe, 0x27, 0x1e, 0x5f, 0xbe, 0x86, 0x0b, 0x00, 0x3e,
- 0x71, 0xf6, 0x92, 0xbd, 0xa8, 0x51, 0x22, 0xbd, 0xb5, 0xc2, 0xbf, 0x3d,
- 0x36, 0x87, 0xcf, 0xbd, 0x99, 0xd5, 0x4a, 0x3c, 0xd7, 0x68, 0xe2, 0xbe,
- 0x20, 0x8b, 0xa0, 0x3e, 0x8c, 0xe6, 0x85, 0x3c, 0x04, 0x37, 0xcc, 0xbe,
- 0xa9, 0xd5, 0xd4, 0xbe, 0xa2, 0x60, 0x17, 0x3d, 0x40, 0xab, 0xca, 0x3a,
- 0xf1, 0x7a, 0x79, 0x3e, 0xb2, 0x6f, 0x65, 0xbe, 0x18, 0x51, 0x5b, 0xbb,
- 0x09, 0x10, 0x2f, 0xbc, 0xd2, 0xab, 0x20, 0x3d, 0x28, 0x2e, 0x17, 0xbc,
- 0x0c, 0xb0, 0x40, 0x3e, 0x43, 0xbb, 0xb9, 0x3d, 0x65, 0x8c, 0xa7, 0x3d,
- 0xae, 0x0a, 0xcb, 0xbd, 0xb5, 0xaf, 0x42, 0x3e, 0xd0, 0xc6, 0x30, 0xbe,
- 0x40, 0x5a, 0x24, 0xbe, 0x3f, 0x55, 0x7a, 0xbd, 0xd5, 0x11, 0xf9, 0x3d,
- 0x55, 0x66, 0x9e, 0x3d, 0x9a, 0x54, 0x37, 0xbe, 0xf5, 0x9c, 0xd5, 0xbd,
- 0xe5, 0xa2, 0x15, 0x3f, 0x54, 0x8a, 0x3e, 0x3e, 0x65, 0x7b, 0xf7, 0x3d,
- 0x0a, 0x3e, 0xd0, 0xbd, 0x64, 0xf4, 0x06, 0xbb, 0xfc, 0x26, 0x40, 0xbd,
- 0x12, 0xd0, 0x99, 0xbd, 0xf0, 0xfe, 0x6b, 0xbe, 0xfa, 0x0b, 0xe2, 0xbd,
- 0x64, 0x0d, 0x00, 0xbe, 0xdf, 0xaf, 0x57, 0x3e, 0x6f, 0xf4, 0xb4, 0xbe,
- 0xc8, 0x53, 0x50, 0x3d, 0x07, 0x14, 0x8f, 0x3e, 0x22, 0x2c, 0xd7, 0xbd,
- 0x11, 0xce, 0x1a, 0x3e, 0xa6, 0x19, 0xb5, 0x3e, 0xc1, 0xc1, 0x11, 0xbd,
- 0x32, 0x42, 0x09, 0x3f, 0x92, 0x7c, 0x09, 0x3e, 0x04, 0xd8, 0x88, 0xbe,
- 0x1b, 0xd3, 0x1a, 0xbe, 0x01, 0x52, 0x92, 0xbe, 0xd6, 0x11, 0xa3, 0x3e,
- 0xa2, 0xb7, 0x81, 0x3e, 0x43, 0x88, 0xbe, 0x3e, 0xb7, 0x75, 0x07, 0x3e,
- 0x70, 0xeb, 0x62, 0x3d, 0x01, 0xea, 0xa9, 0x3d, 0xe1, 0xbb, 0x68, 0xbe,
- 0x83, 0x24, 0x7a, 0x3e, 0xc4, 0xfd, 0xca, 0x3d, 0xfd, 0xad, 0xd3, 0x3c,
- 0x6e, 0x3c, 0x58, 0x3e, 0xf5, 0x98, 0x8d, 0xbe, 0x9f, 0x10, 0xd6, 0xbc,
- 0xaa, 0x3a, 0x5c, 0xbe, 0x57, 0xee, 0xee, 0x3e, 0x1a, 0x10, 0xad, 0x3e,
- 0x40, 0xff, 0x5f, 0xbe, 0x64, 0x35, 0x50, 0x3d, 0x3c, 0x0b, 0x85, 0x3c,
- 0xa0, 0x81, 0xdc, 0xbe, 0x7b, 0xef, 0x5a, 0x3e, 0x67, 0x71, 0xbe, 0x3d,
- 0x16, 0x57, 0x18, 0xbd, 0xab, 0xe4, 0x8e, 0xbd, 0x82, 0x82, 0x3f, 0xbe,
- 0x3c, 0x07, 0xe1, 0xbd, 0x20, 0xd1, 0xd2, 0x3d, 0xa7, 0x5d, 0x1f, 0x3e,
- 0xba, 0x95, 0x11, 0x3e, 0x87, 0x30, 0x95, 0xbe, 0xe3, 0x82, 0xd7, 0xbd,
- 0x03, 0x1b, 0xd0, 0x3d, 0x6f, 0x6d, 0xec, 0xbd, 0x52, 0xcc, 0x38, 0xbe,
- 0xf6, 0x2a, 0x96, 0xbe, 0xf2, 0x55, 0x34, 0xbe, 0xe7, 0x7d, 0x4b, 0xbd,
- 0x67, 0xb8, 0x46, 0x3d, 0x14, 0x66, 0x0e, 0xbe, 0x23, 0x09, 0x25, 0xbe,
- 0xc6, 0x95, 0x1e, 0x3e, 0x32, 0x8e, 0xe2, 0xbd, 0xce, 0xc2, 0x62, 0x3d,
- 0xd3, 0x9e, 0xc2, 0xbd, 0x3a, 0xf2, 0xc3, 0xbe, 0xb5, 0xda, 0x8d, 0x3e,
- 0xc6, 0xa4, 0xe4, 0xbb, 0x92, 0xc0, 0x48, 0x3c, 0x38, 0x04, 0xc7, 0xbe,
- 0x73, 0x24, 0xbe, 0xbe, 0x03, 0x06, 0x28, 0x3d, 0xc0, 0xab, 0x1d, 0x3e,
- 0x4f, 0x38, 0x53, 0xbe, 0xe6, 0xc9, 0x00, 0x3e, 0x55, 0xc9, 0x1c, 0xbe,
- 0x8a, 0x55, 0xeb, 0xbd, 0xe1, 0x5a, 0x92, 0xbe, 0x40, 0xb7, 0x56, 0xbd,
- 0xd7, 0xcb, 0x50, 0xbe, 0xb3, 0x34, 0xe4, 0xbe, 0xc5, 0x9a, 0x6e, 0xbb,
- 0xd4, 0x4b, 0x9b, 0xbe, 0xee, 0x7b, 0x30, 0x3d, 0x61, 0x3b, 0xf3, 0xba,
- 0xc1, 0x16, 0x7a, 0xbd, 0x07, 0x39, 0xbd, 0xbe, 0xe0, 0x3d, 0xa9, 0xbe,
- 0x24, 0x9e, 0x9b, 0xbd, 0x89, 0x76, 0x75, 0xbe, 0xd4, 0x24, 0x12, 0x3e,
- 0x24, 0xc6, 0x5e, 0x3d, 0x25, 0x3a, 0x34, 0x3e, 0xc0, 0x23, 0x8c, 0xbe,
- 0x1d, 0xfc, 0x44, 0x3e, 0xda, 0x47, 0x8c, 0xbe, 0xa3, 0x16, 0xc7, 0x3d,
- 0xc6, 0x3d, 0xeb, 0x3e, 0x0a, 0xe6, 0xee, 0xbd, 0x58, 0x2b, 0xe3, 0x3d,
- 0xda, 0x40, 0xe6, 0x3d, 0xfd, 0x79, 0x2d, 0xbe, 0x4a, 0x1c, 0x68, 0xbe,
- 0xf7, 0xde, 0x86, 0x3e, 0x65, 0x68, 0xae, 0x3d, 0x14, 0xa5, 0x74, 0xbe,
- 0x11, 0xaf, 0x84, 0xbe, 0x89, 0x40, 0x0c, 0xbd, 0xf9, 0xf4, 0xc4, 0xbe,
- 0x99, 0x88, 0x2b, 0x3b, 0xdf, 0x69, 0x3c, 0xbd, 0xaa, 0xb5, 0x9a, 0x3d,
- 0x00, 0x36, 0xae, 0xbe, 0xc4, 0xa1, 0x51, 0xbe, 0xc8, 0xe8, 0x35, 0xbe,
- 0x0a, 0x38, 0x73, 0x3d, 0x14, 0x80, 0x0b, 0x3e, 0xf8, 0x5f, 0x1c, 0xbe,
- 0xf4, 0x9c, 0xce, 0xbe, 0x80, 0xce, 0xc6, 0x3d, 0x3a, 0x9d, 0x3a, 0xbd,
- 0x46, 0xaf, 0xa9, 0x3d, 0xc2, 0xde, 0x2d, 0xbe, 0x40, 0xfe, 0x34, 0xbe,
- 0xee, 0xb9, 0xfc, 0x3d, 0x04, 0x0a, 0x89, 0xbe, 0x40, 0xf5, 0xd6, 0xbe,
- 0xe8, 0xec, 0xb7, 0x3c, 0xaf, 0x85, 0xbf, 0xbd, 0x52, 0x32, 0x7a, 0xbe,
- 0x18, 0x13, 0x70, 0xbd, 0xaf, 0x66, 0x11, 0xbe, 0x16, 0xf1, 0xa2, 0xbd,
- 0x20, 0x94, 0x66, 0xbe, 0xe1, 0xc3, 0x81, 0xbe, 0xfe, 0x78, 0xd7, 0x3d,
- 0xc5, 0x2a, 0x10, 0x3e, 0x33, 0x2d, 0x80, 0xbd, 0x00, 0x0d, 0x54, 0xbe,
- 0xaf, 0x50, 0x3a, 0xbb, 0x03, 0x2d, 0x68, 0xbe, 0x74, 0xea, 0xda, 0xbe,
- 0x10, 0x5a, 0x6b, 0xbe, 0xab, 0x64, 0xa1, 0x3e, 0xee, 0x8b, 0x90, 0x3e,
- 0xf7, 0x76, 0x09, 0x3e, 0xba, 0x17, 0x0c, 0x3b, 0x5b, 0xdc, 0x76, 0xbe,
- 0x17, 0x81, 0x1a, 0xbe, 0x25, 0xc7, 0x0c, 0x3e, 0x00, 0x40, 0x95, 0xbe,
- 0xa1, 0xdf, 0x79, 0xbd, 0xa0, 0x96, 0x0a, 0xbe, 0x75, 0x86, 0x44, 0x3d,
- 0x2e, 0x74, 0xa5, 0xbe, 0xaf, 0x0a, 0x79, 0xbe, 0xc8, 0x1e, 0x90, 0x3d,
- 0x28, 0xda, 0x8c, 0xbd, 0x2d, 0x9d, 0x94, 0xbe, 0x8d, 0x67, 0x42, 0xbe,
- 0xe2, 0x97, 0x1c, 0xbd, 0x7a, 0xb4, 0xdd, 0x3b, 0xe1, 0x53, 0xdb, 0xbd,
- 0xda, 0xd3, 0xa1, 0xba, 0xda, 0x7a, 0x4d, 0x3c, 0xba, 0x59, 0x6b, 0xbd,
- 0x14, 0x34, 0x20, 0xbd, 0xcf, 0xae, 0x04, 0xbe, 0x46, 0xd6, 0x62, 0x3c,
- 0x2a, 0x9c, 0x2e, 0xbd, 0x4f, 0xaa, 0x8e, 0x3c, 0xb2, 0x7d, 0x79, 0x3e,
- 0x5c, 0x01, 0xb9, 0xbd, 0x5f, 0xe5, 0x14, 0xbd, 0xf0, 0x21, 0xda, 0x3d,
- 0xfc, 0x30, 0xa8, 0x3c, 0xa4, 0x1c, 0x02, 0xbe, 0xa1, 0x8a, 0x4e, 0xbd,
- 0x48, 0xdd, 0xd7, 0x3b, 0xf9, 0x35, 0x0c, 0xbd, 0x89, 0xca, 0x57, 0xbe,
- 0x4f, 0xbc, 0x1c, 0xbd, 0x51, 0x95, 0x2c, 0xbd, 0x4a, 0xa5, 0x31, 0xbe,
- 0xc8, 0x4d, 0x77, 0xbe, 0x1a, 0x10, 0x9d, 0xbc, 0x73, 0x54, 0x81, 0x3e,
- 0x7a, 0x2c, 0xc1, 0xbc, 0x7d, 0xef, 0x95, 0x3b, 0x17, 0x57, 0x33, 0xbd,
- 0xa3, 0x68, 0xdb, 0xbd, 0x6f, 0x34, 0x5d, 0x3e, 0xb2, 0xb5, 0x30, 0x3e,
- 0x4e, 0x3b, 0x6d, 0xbe, 0xa6, 0x6d, 0xe0, 0xbd, 0xf6, 0x0b, 0xc2, 0xbe,
- 0x4b, 0x6b, 0xb4, 0xbd, 0xb5, 0x46, 0x5e, 0xbe, 0xfd, 0xb9, 0x39, 0xbe,
- 0xe4, 0xd4, 0x2c, 0xbe, 0x45, 0xdb, 0x48, 0x3b, 0x7a, 0x21, 0xeb, 0xbc,
- 0xfe, 0x2d, 0x14, 0xbd, 0x7d, 0x63, 0x73, 0x3e, 0x3d, 0xbb, 0x84, 0xbc,
- 0x4d, 0x7a, 0x38, 0x3e, 0xca, 0x6e, 0x2c, 0xbe, 0xec, 0x51, 0x10, 0xbe,
- 0x13, 0x71, 0x6c, 0x3c, 0x31, 0x1f, 0x52, 0x3d, 0x3a, 0x5c, 0x1b, 0xbe,
- 0xe3, 0x8d, 0x2b, 0xbe, 0x78, 0xcf, 0x1a, 0xbf, 0x58, 0x5c, 0x9c, 0xbd,
- 0xc3, 0xc9, 0x89, 0x3c, 0x4a, 0x15, 0xae, 0x3e, 0x7b, 0xc2, 0x23, 0xbc,
- 0xcf, 0x59, 0x43, 0xbe, 0xd7, 0xba, 0x0e, 0xbe, 0xfe, 0xf7, 0x85, 0xbe,
- 0x9f, 0x26, 0xa6, 0xbe, 0xb0, 0xd3, 0x7e, 0xbe, 0xe2, 0xb8, 0x6b, 0xbe,
- 0x22, 0xb9, 0xe2, 0xbd, 0xa5, 0x63, 0x91, 0x3e, 0xcd, 0x85, 0x97, 0xbd,
- 0x90, 0x8d, 0x9c, 0xbe, 0x58, 0x36, 0x82, 0xbe, 0x90, 0x70, 0x34, 0x3e,
- 0x31, 0xc2, 0xa7, 0xbd, 0x52, 0x01, 0x37, 0x3e, 0xd8, 0xe0, 0xc9, 0x3d,
- 0x05, 0x92, 0xac, 0x3d, 0x24, 0x3f, 0xaf, 0x3d, 0x7a, 0x93, 0xa1, 0xbe,
- 0x54, 0x22, 0x21, 0x3d, 0x54, 0x6b, 0x01, 0xbe, 0x5c, 0x65, 0x49, 0x3e,
- 0x7b, 0xe1, 0x4d, 0xbc, 0xa1, 0x50, 0x76, 0xbd, 0xd9, 0x33, 0xd4, 0xbe,
- 0x70, 0x7e, 0xa4, 0x3d, 0x3f, 0x06, 0xa7, 0xbe, 0x39, 0xe6, 0xe6, 0x3d,
- 0x2d, 0x3d, 0x97, 0x3d, 0xf0, 0xfb, 0x43, 0xbe, 0xae, 0x6e, 0xcb, 0x3c,
- 0xdf, 0x09, 0xc8, 0xbd, 0x29, 0x5a, 0x10, 0x3e, 0x40, 0x59, 0xf8, 0xbc,
- 0x15, 0x35, 0xa1, 0xbe, 0xba, 0x6a, 0x62, 0xbb, 0x8b, 0x75, 0xe2, 0xbd,
- 0xba, 0x3a, 0x97, 0xbd, 0x35, 0xda, 0xa3, 0xbd, 0xe9, 0xd5, 0x31, 0x3e,
- 0xee, 0x9e, 0xae, 0x3d, 0x3d, 0x64, 0x9b, 0x3d, 0x82, 0x30, 0xbf, 0xbe,
- 0x09, 0xb5, 0x19, 0xbe, 0x7d, 0xd0, 0xeb, 0x3d, 0x31, 0x3e, 0xb1, 0x3c,
- 0x55, 0x70, 0xa4, 0x3d, 0xd5, 0x4b, 0x48, 0x3e, 0x33, 0x2e, 0xb9, 0xbe,
- 0xa0, 0xdd, 0x7f, 0x3d, 0x06, 0x68, 0xba, 0x3c, 0x08, 0xfd, 0x81, 0x3d,
- 0xdb, 0xc0, 0x09, 0x3e, 0xf2, 0xaa, 0xc2, 0x3c, 0xc1, 0x04, 0x04, 0x3d,
- 0x83, 0xfd, 0x70, 0x3e, 0xfe, 0x84, 0xb4, 0xbd, 0x63, 0xc9, 0x37, 0xbe,
- 0x2b, 0x06, 0x8c, 0xbe, 0xcb, 0x26, 0x15, 0x3d, 0x74, 0xe3, 0x05, 0xbd,
- 0x1f, 0x12, 0x7f, 0xbd, 0xf3, 0xde, 0x03, 0x3e, 0xc5, 0x3a, 0x31, 0xbf,
- 0xf2, 0xd0, 0x7a, 0x3d, 0x65, 0xe5, 0x71, 0x3e, 0xa1, 0x21, 0x5c, 0xbe,
- 0x2e, 0xd9, 0x2c, 0xbe, 0xbc, 0x84, 0xf7, 0x3c, 0x4a, 0x0d, 0x4c, 0x3e,
- 0xa3, 0x5f, 0xc1, 0x3d, 0xf2, 0xe0, 0x6f, 0x3e, 0x26, 0xb4, 0xd0, 0x3d,
- 0xc5, 0x63, 0xd3, 0x3d, 0xfe, 0x1d, 0xc1, 0xbd, 0xe7, 0x35, 0x1d, 0x3e,
- 0xd5, 0x1e, 0xf8, 0xbd, 0xae, 0x86, 0x4f, 0xbc, 0x8b, 0x6c, 0x08, 0x3e,
- 0x68, 0xb7, 0xa3, 0xbb, 0x80, 0x7e, 0xb6, 0xbc, 0x5f, 0xee, 0x82, 0x3d,
- 0xe6, 0x61, 0x51, 0xbd, 0xa8, 0xb1, 0xd6, 0xbd, 0x87, 0x89, 0x27, 0xbc,
- 0xc7, 0x25, 0x26, 0xbd, 0xc7, 0xe1, 0x64, 0xbd, 0xba, 0x63, 0xe8, 0xbd,
- 0x53, 0xdd, 0xf0, 0x3c, 0xe9, 0xb0, 0x23, 0x3c, 0x98, 0xfc, 0xc7, 0x3c,
- 0xf0, 0xcb, 0x1c, 0xbd, 0x53, 0x46, 0xbd, 0xbd, 0x11, 0xd3, 0xf9, 0xbd,
- 0x6c, 0xea, 0x49, 0x3d, 0xcb, 0x18, 0x58, 0xbd, 0x12, 0x63, 0xa3, 0x3e,
- 0x6f, 0x4c, 0x8d, 0x3c, 0x80, 0x21, 0x41, 0x3d, 0xb5, 0x9b, 0x4b, 0xbe,
- 0x1c, 0x16, 0xaa, 0x3d, 0x17, 0xf6, 0x0d, 0x3e, 0x9f, 0xf9, 0x41, 0xbe,
- 0x92, 0x2e, 0x3c, 0xbe, 0x38, 0xdb, 0x86, 0x3e, 0xd0, 0x7b, 0x34, 0x3e,
- 0x75, 0x48, 0x9d, 0xbc, 0x03, 0x1c, 0x33, 0xbe, 0x32, 0xab, 0xf3, 0xbc,
- 0x31, 0x14, 0x0f, 0xbe, 0xdc, 0x5c, 0x45, 0xbe, 0xbb, 0x32, 0x49, 0xbc,
- 0x42, 0x67, 0x24, 0xbf, 0xa8, 0x14, 0xae, 0xbd, 0xd8, 0x5a, 0x1d, 0xbe,
- 0x3a, 0xa4, 0x23, 0xbd, 0x48, 0x8e, 0xd3, 0xbd, 0xc7, 0x0c, 0x1a, 0x3e,
- 0xbc, 0x41, 0x33, 0x3d, 0xaa, 0x9c, 0xb0, 0xbd, 0x94, 0x61, 0x9e, 0xbc,
- 0xc2, 0xf2, 0x98, 0x3e, 0x9c, 0x0c, 0x83, 0x3d, 0x99, 0x6e, 0x32, 0xbe,
- 0xc5, 0xb6, 0x2d, 0xbe, 0xdf, 0x52, 0x91, 0x3d, 0x10, 0xcf, 0xd6, 0x3d,
- 0xaf, 0xb7, 0xf9, 0xbc, 0x1a, 0x8b, 0x71, 0x3e, 0x25, 0xf8, 0x2d, 0x3e,
- 0x7c, 0xfc, 0x6c, 0x3d, 0xac, 0x1e, 0x33, 0x3e, 0xf4, 0x53, 0xa2, 0xbe,
- 0xb2, 0x0d, 0x46, 0xbe, 0x92, 0x1c, 0x8d, 0xbd, 0x4e, 0x7f, 0x81, 0xbd,
- 0x1d, 0xe9, 0x34, 0x3e, 0x8a, 0x62, 0x2e, 0x3e, 0x43, 0xe1, 0xdc, 0xbd,
- 0xcd, 0x39, 0x2a, 0x3e, 0x77, 0x89, 0x87, 0x3d, 0xf6, 0xed, 0x94, 0xbd,
- 0x7c, 0xa0, 0xcc, 0xbd, 0x13, 0x32, 0x31, 0x3e, 0xc0, 0xdf, 0x68, 0xbc,
- 0xf6, 0x1b, 0xf2, 0xbd, 0xc9, 0xd8, 0xc5, 0x3d, 0x80, 0x62, 0x0b, 0x3e,
- 0x1b, 0x2a, 0xd1, 0xbd, 0xc9, 0x59, 0x17, 0xbe, 0xb5, 0x25, 0x3b, 0xbd,
- 0x51, 0x2d, 0x8e, 0xbe, 0x23, 0x3f, 0x97, 0x3d, 0xc2, 0xc3, 0x8d, 0xbe,
- 0x59, 0x8e, 0x4f, 0xbe, 0x1d, 0x2d, 0x78, 0xbd, 0x19, 0xe2, 0xcf, 0xbd,
- 0x6b, 0x13, 0x09, 0xbe, 0xd3, 0x5b, 0x9f, 0xbe, 0x0f, 0x5a, 0x39, 0xbe,
- 0x8a, 0xaa, 0xb2, 0xbc, 0x2e, 0xa1, 0xb0, 0x3d, 0x3c, 0xe5, 0xa1, 0x3c,
- 0x97, 0xaa, 0x23, 0xbe, 0xf7, 0x86, 0x7f, 0xbc, 0xb4, 0xd8, 0xed, 0x3d,
- 0xf8, 0xfa, 0xe6, 0x3e, 0xe2, 0xf2, 0xfa, 0xbd, 0x3b, 0xfd, 0x7c, 0xbd,
- 0xa2, 0x0a, 0x0d, 0xbe, 0x0c, 0x8d, 0xb1, 0xbd, 0x58, 0x65, 0xbf, 0xbc,
- 0x91, 0xde, 0x00, 0x3e, 0x18, 0x52, 0xa8, 0xbd, 0x83, 0xf4, 0xb3, 0xbe,
- 0xeb, 0xb9, 0xf4, 0x3d, 0x08, 0x17, 0x6c, 0xbd, 0xae, 0x71, 0x46, 0x3d,
- 0xb3, 0xdb, 0x01, 0x3e, 0xa5, 0x82, 0xb3, 0xbd, 0xe5, 0x93, 0x3f, 0xbe,
- 0xdb, 0xa7, 0xd4, 0xbc, 0x38, 0xbe, 0x83, 0x3e, 0x6a, 0xb9, 0x9b, 0xbb,
- 0x0e, 0xfc, 0xaf, 0x3c, 0x0b, 0xd3, 0xed, 0xbd, 0x0e, 0xb1, 0x6a, 0xbd,
- 0x7d, 0xbc, 0xd6, 0x3c, 0x82, 0x08, 0x15, 0x3d, 0x7f, 0x20, 0xed, 0x3d,
- 0x50, 0xa3, 0xa1, 0xbd, 0xc1, 0xd0, 0x87, 0x3b, 0x11, 0x7f, 0x3f, 0x3d,
- 0x78, 0x60, 0xac, 0x3d, 0xe5, 0xb2, 0x13, 0xbf, 0x3f, 0x8c, 0x7d, 0x3e,
- 0xcb, 0x95, 0x09, 0x3e, 0x49, 0xc6, 0x97, 0xbe, 0x4c, 0x9e, 0x97, 0xbd,
- 0x33, 0x03, 0x68, 0x3e, 0x7a, 0x29, 0x21, 0x3e, 0xe0, 0xf0, 0xa3, 0xbd,
- 0xf2, 0xf4, 0xb4, 0x3d, 0xd7, 0xb0, 0x55, 0x3e, 0x8f, 0x76, 0x10, 0xbe,
- 0x19, 0x6b, 0x9f, 0x3d, 0xcf, 0x1a, 0x13, 0xbe, 0x13, 0x47, 0x20, 0xbe,
- 0xf4, 0x19, 0x8f, 0xbd, 0xc9, 0xe7, 0x0a, 0x3d, 0x9a, 0x02, 0xae, 0x3d,
- 0xf5, 0x68, 0xa2, 0x3b, 0x6c, 0x90, 0x9c, 0x3e, 0xec, 0x49, 0xe3, 0xbd,
- 0x69, 0x7a, 0xc9, 0x3d, 0x23, 0x31, 0xfe, 0xbe, 0x09, 0x95, 0x93, 0x3b,
- 0x29, 0x46, 0x26, 0xbe, 0x92, 0xb6, 0x15, 0x3d, 0xd0, 0x56, 0x95, 0x3c,
- 0xc0, 0x9e, 0x10, 0x3e, 0xba, 0x50, 0x46, 0x3d, 0xfa, 0x4a, 0x51, 0xbc,
- 0xd3, 0x29, 0x3a, 0x3d, 0x09, 0xff, 0x55, 0xbd, 0xb7, 0x3b, 0xfa, 0xbd,
- 0xe7, 0xc9, 0xf8, 0x3d, 0x39, 0xbb, 0x10, 0x3d, 0xc6, 0xba, 0x88, 0xbe,
- 0x01, 0xba, 0xb1, 0xbc, 0x7e, 0xe2, 0x24, 0x3e, 0x69, 0x33, 0x4d, 0x3e,
- 0x05, 0x84, 0xa3, 0x3d, 0x22, 0x03, 0x3b, 0x3e, 0x88, 0x94, 0x33, 0xbd,
- 0x9e, 0xf9, 0x82, 0xbe, 0x5c, 0x22, 0x8d, 0x3e, 0x4c, 0xa5, 0x70, 0xbd,
- 0x6e, 0xe5, 0xbc, 0x3c, 0xf4, 0x9f, 0x71, 0xbd, 0xf3, 0xf1, 0x13, 0x3d,
- 0x38, 0xef, 0xb5, 0xbd, 0x81, 0x3a, 0xd4, 0x3d, 0xe5, 0xeb, 0x83, 0xbe,
- 0xa4, 0x60, 0x10, 0xbe, 0xba, 0x84, 0x6b, 0x3e, 0xae, 0xe6, 0x44, 0xbe,
- 0x9a, 0xf6, 0xc7, 0xbc, 0xd7, 0xa3, 0xb7, 0x3e, 0xfb, 0x4b, 0xa4, 0x3e,
- 0xad, 0x30, 0x0a, 0x3e, 0x9a, 0x45, 0x05, 0xbc, 0x5e, 0x47, 0xdc, 0xbd,
- 0x2e, 0x1e, 0xae, 0x3d, 0xd6, 0xaf, 0xd3, 0x3d, 0x66, 0x59, 0x19, 0xbd,
- 0x16, 0x35, 0x06, 0x3d, 0x9c, 0x48, 0x45, 0xbd, 0x03, 0xa0, 0xe9, 0xbd,
- 0x7b, 0x25, 0x1c, 0xbd, 0x53, 0x26, 0xd9, 0x3e, 0xa4, 0xc5, 0x30, 0xbe,
- 0x41, 0x0b, 0x2c, 0x3d, 0x01, 0x8a, 0x4e, 0xbc, 0xce, 0x4b, 0xf2, 0xbc,
- 0x32, 0x44, 0x48, 0x3e, 0xf9, 0xac, 0x00, 0xbe, 0x03, 0x54, 0x7e, 0x3d,
- 0x2d, 0x67, 0x04, 0x3d, 0x0e, 0xe6, 0x56, 0xbd, 0x9a, 0x5f, 0x2d, 0xbe,
- 0xbf, 0x39, 0x5b, 0xbd, 0xa8, 0x48, 0x7d, 0xbe, 0x19, 0xa3, 0x63, 0x3e,
- 0x2c, 0x1b, 0xab, 0xbd, 0x1d, 0x4a, 0x47, 0x3e, 0x4f, 0xd4, 0x03, 0xbe,
- 0x37, 0x19, 0x91, 0xbe, 0x45, 0x6f, 0x68, 0xbd, 0x76, 0xe7, 0x11, 0xbe,
- 0xe9, 0xf7, 0xc2, 0x3d, 0x6b, 0x62, 0x3e, 0xbd, 0x86, 0xc3, 0x82, 0xbd,
- 0x9d, 0xad, 0x3f, 0xbe, 0x6d, 0x45, 0x5c, 0xbd, 0x77, 0xb1, 0x5c, 0xbe,
- 0x67, 0xcb, 0x0e, 0x3e, 0xb5, 0x8f, 0xfb, 0xbc, 0x1b, 0x57, 0x45, 0x3e,
- 0xb5, 0xf9, 0x43, 0x3e, 0x11, 0xab, 0x7f, 0xbe, 0xd9, 0x57, 0x2d, 0x3d,
- 0x1c, 0x3d, 0x23, 0xbe, 0x6e, 0xb4, 0x12, 0x3d, 0xf0, 0x0f, 0x72, 0xbe,
- 0x7e, 0xb8, 0x0a, 0xbd, 0x7e, 0x1c, 0xf3, 0xbd, 0xaa, 0x0c, 0x61, 0xbe,
- 0x47, 0x10, 0xd3, 0x3d, 0x8a, 0x47, 0x0c, 0xbe, 0x95, 0xf5, 0x5c, 0x3d,
- 0xcc, 0xbe, 0x09, 0xbe, 0x6b, 0x69, 0x1c, 0x3d, 0x2b, 0x36, 0x62, 0x3e,
- 0xc4, 0x28, 0x8c, 0xbd, 0x52, 0x7c, 0xa0, 0x3d, 0xa3, 0xa4, 0x10, 0x3e,
- 0xe2, 0xf9, 0x28, 0xbe, 0x5c, 0x72, 0x8a, 0x3e, 0xa7, 0x25, 0x85, 0x3e,
- 0x70, 0x3d, 0x6b, 0x3e, 0x8c, 0xea, 0xd3, 0x3c, 0x46, 0x65, 0x7d, 0xbe,
- 0xc1, 0x3b, 0x87, 0x3c, 0x9a, 0x44, 0xed, 0xbd, 0x4e, 0x96, 0xd0, 0xbc,
- 0x96, 0x22, 0x2b, 0xbd, 0xb3, 0xf7, 0x2b, 0x3e, 0x31, 0x59, 0xc7, 0xbd,
- 0x92, 0xb8, 0x5b, 0xbe, 0x01, 0xa7, 0xba, 0x3e, 0x6d, 0x1c, 0x8f, 0x3d,
- 0x08, 0x87, 0xab, 0xbd, 0x9b, 0xbe, 0x3a, 0x3e, 0x2e, 0xe1, 0xca, 0x3d,
- 0x9a, 0x1a, 0xd1, 0x3e, 0x09, 0xb0, 0x06, 0xbe, 0x3a, 0x2c, 0xad, 0x3c,
- 0x7a, 0x82, 0x28, 0x3e, 0x76, 0x3c, 0x33, 0x3e, 0x8d, 0x89, 0x42, 0xbe,
- 0xf8, 0x81, 0xec, 0x3e, 0x91, 0x03, 0x22, 0x3e, 0x18, 0x43, 0x1e, 0xbe,
- 0xb7, 0xed, 0x86, 0x3d, 0x94, 0x25, 0x62, 0x3e, 0x23, 0x44, 0x7d, 0x3c,
- 0xda, 0xeb, 0x5c, 0xbe, 0x6e, 0x8c, 0xea, 0x3d, 0x1e, 0x66, 0x91, 0xbc,
- 0x6c, 0x7d, 0xf9, 0x3d, 0x28, 0x58, 0xe4, 0x3d, 0xa6, 0x99, 0xb1, 0xbd,
- 0xf6, 0x87, 0xa2, 0x3e, 0x0a, 0x1d, 0x42, 0x3e, 0xdf, 0x2e, 0x1f, 0x3e,
- 0xe2, 0xc9, 0x0a, 0xbe, 0x20, 0x24, 0x3a, 0xbe, 0x25, 0xc4, 0x62, 0xbd,
- 0x50, 0x9f, 0x9f, 0xbe, 0xfa, 0x9d, 0xf5, 0xbd, 0x86, 0xc2, 0x89, 0xbe,
- 0x34, 0x3e, 0x26, 0x3e, 0x24, 0xd6, 0x10, 0xbe, 0xb4, 0xbf, 0x66, 0xbe,
- 0x26, 0x37, 0x8d, 0xbe, 0x23, 0xdb, 0xa2, 0x3d, 0x81, 0xf4, 0x4a, 0xbe,
- 0xe4, 0xde, 0xba, 0xbe, 0x3f, 0xcb, 0xd8, 0xbd, 0x0d, 0x93, 0x50, 0x3e,
- 0x8d, 0x5f, 0x53, 0xbe, 0x28, 0x8c, 0xf4, 0x3d, 0x1c, 0x5e, 0xe8, 0x3d,
- 0xeb, 0x71, 0x5a, 0xbe, 0xed, 0x6a, 0x3e, 0xbe, 0x05, 0x6e, 0x94, 0x3d,
- 0x9b, 0x6e, 0x5c, 0x3e, 0x36, 0x41, 0x8b, 0xbe, 0x81, 0x55, 0xd4, 0xbd,
- 0xb9, 0x3e, 0x71, 0xbd, 0x8f, 0x18, 0x16, 0xbe, 0x3e, 0x89, 0x51, 0x3d,
- 0xaa, 0x6a, 0x0f, 0x3e, 0x6d, 0x66, 0x65, 0xbd, 0x3e, 0xf4, 0x4f, 0x3c,
- 0x3b, 0x29, 0x74, 0x3e, 0x8e, 0x9a, 0x6d, 0x3d, 0xe3, 0x8f, 0xde, 0xbd,
- 0x40, 0xaf, 0x3a, 0xbe, 0xc4, 0xb8, 0xdd, 0xbd, 0x78, 0x3b, 0xe6, 0xbd,
- 0xc0, 0x1b, 0xa3, 0xbd, 0x77, 0x5f, 0xf9, 0x3d, 0x76, 0x97, 0xda, 0xbd,
- 0xbf, 0xc0, 0xe3, 0x3d, 0x2e, 0x77, 0x8a, 0x3d, 0x4f, 0xf6, 0x94, 0xba,
- 0x8f, 0x68, 0x15, 0xbe, 0x27, 0xbe, 0x0f, 0x3e, 0x04, 0xdd, 0x98, 0xbe,
- 0x5b, 0x0f, 0x1d, 0xbe, 0x48, 0xbd, 0x82, 0xbe, 0xcd, 0xea, 0x4d, 0xbd,
- 0x7d, 0xfb, 0x27, 0x3e, 0x3c, 0x37, 0xc5, 0xbb, 0x5e, 0x3a, 0x71, 0x3d,
- 0xd4, 0xc7, 0x22, 0xbe, 0x08, 0x01, 0x0f, 0xbe, 0x69, 0xc2, 0x23, 0x3e,
- 0xf0, 0x7b, 0x17, 0xbe, 0x7b, 0xd9, 0xf7, 0x3d, 0x12, 0xf6, 0x45, 0xbe,
- 0xc6, 0x7e, 0x94, 0xbd, 0x37, 0xe0, 0x5c, 0x3d, 0x28, 0xa9, 0x7a, 0xbe,
- 0x76, 0x56, 0x3f, 0xbe, 0xca, 0x6a, 0x1e, 0xbe, 0x55, 0xb2, 0xfd, 0x3d,
- 0xf1, 0xaa, 0x48, 0xbe, 0x2b, 0x66, 0x32, 0x3e, 0x9f, 0x14, 0x80, 0x3d,
- 0x4f, 0x5d, 0x73, 0x3e, 0x2e, 0x9e, 0xb4, 0x3d, 0xf8, 0x63, 0xbf, 0x3e,
- 0xc7, 0x53, 0x2b, 0xbe, 0xd0, 0x8c, 0x02, 0xbe, 0x31, 0xdc, 0x53, 0xbd,
- 0xca, 0x79, 0x4c, 0x3e, 0x02, 0x42, 0x44, 0x3d, 0x78, 0x1c, 0x24, 0xbe,
- 0xa7, 0x78, 0x91, 0xbe, 0xdd, 0x20, 0x33, 0xbe, 0x65, 0xde, 0x81, 0xbd,
- 0x94, 0xc1, 0x3d, 0xbe, 0xf7, 0x34, 0x11, 0x3e, 0xf7, 0x75, 0xde, 0xbd,
- 0x83, 0x37, 0x12, 0x3d, 0x56, 0xa6, 0x2e, 0x3e, 0x77, 0x3f, 0xdb, 0x3e,
- 0x31, 0x4e, 0x30, 0xbe, 0x4c, 0x2a, 0xbd, 0x3b, 0xc4, 0x7f, 0xb7, 0xbb,
- 0x83, 0x45, 0x92, 0xbe, 0x48, 0xe5, 0x26, 0x3a, 0x23, 0x5d, 0x06, 0xbe,
- 0xe6, 0x10, 0x72, 0xbd, 0x57, 0x7e, 0x7e, 0xbe, 0x87, 0xf1, 0x08, 0x3e,
- 0x8f, 0x0c, 0xc7, 0xbd, 0xf1, 0x6d, 0x02, 0xbd, 0xfc, 0xa9, 0x8d, 0xbb,
- 0x22, 0xc6, 0xc5, 0xbe, 0x93, 0xe9, 0xdf, 0xbd, 0x67, 0x34, 0xd6, 0xbc,
- 0xbb, 0x4b, 0xd6, 0xbc, 0xcd, 0x97, 0x4d, 0xbd, 0xdd, 0x07, 0x50, 0xbe,
- 0xbb, 0x20, 0x34, 0xbe, 0x56, 0x3c, 0xd5, 0xbd, 0xa0, 0x65, 0x2d, 0xbd,
- 0xd8, 0x95, 0xb8, 0x3d, 0x61, 0x20, 0x1c, 0xbe, 0x48, 0xa4, 0x04, 0xbd,
- 0xa2, 0xc7, 0xab, 0xbe, 0xe4, 0x04, 0x8c, 0x3c, 0x64, 0xdf, 0x24, 0xbe,
- 0xae, 0x58, 0x65, 0xbe, 0xee, 0x10, 0x86, 0x3e, 0xb5, 0xaf, 0xd6, 0xbd,
- 0xcf, 0x6d, 0x66, 0x3e, 0x76, 0xb2, 0x51, 0x3b, 0x2d, 0x80, 0xbc, 0xbe,
- 0xb0, 0xd7, 0xea, 0x3d, 0x87, 0xe2, 0x5e, 0x3e, 0xef, 0x81, 0x1d, 0xbd,
- 0x18, 0x55, 0x2d, 0x3d, 0x7c, 0x0c, 0x34, 0x3e, 0xda, 0xce, 0x4d, 0xbe,
- 0x98, 0xf6, 0x40, 0x3d, 0xd6, 0xc2, 0x1c, 0xbd, 0xb9, 0xbd, 0xa5, 0xbc,
- 0x9f, 0xed, 0x91, 0x3e, 0x98, 0xb3, 0x53, 0xbd, 0xd7, 0x33, 0xe5, 0xbd,
- 0x75, 0x72, 0x8f, 0xbc, 0xca, 0x0f, 0xff, 0xbd, 0xea, 0x6d, 0x17, 0xbe,
- 0x7a, 0x2e, 0x17, 0x3e, 0xf6, 0x36, 0x20, 0xbd, 0xb9, 0x60, 0xf7, 0x3d,
- 0x04, 0xc6, 0x39, 0xbb, 0xf3, 0x73, 0x8e, 0x3d, 0x80, 0x30, 0xc3, 0x3e,
- 0xb5, 0x8a, 0x35, 0xbe, 0xe8, 0x38, 0x1a, 0x3e, 0xf4, 0x37, 0x55, 0xbe,
- 0xd3, 0x7c, 0x26, 0x3d, 0x14, 0x9e, 0x01, 0xbe, 0x30, 0xec, 0xb3, 0xbe,
- 0xfc, 0xc0, 0x79, 0x3d, 0xd3, 0x7f, 0xb2, 0xbd, 0x97, 0xf9, 0x2f, 0x3e,
- 0xc4, 0x5d, 0x87, 0xbd, 0xac, 0xe5, 0xce, 0x3d, 0xcc, 0xde, 0x25, 0x3e,
- 0xc2, 0xd3, 0x65, 0xbe, 0x3b, 0xc1, 0x4c, 0x3d, 0xe0, 0xbc, 0x38, 0xbd,
- 0xea, 0xbf, 0x01, 0x3e, 0x88, 0x44, 0xb1, 0xbd, 0x1f, 0x41, 0x39, 0xbe,
- 0xcd, 0x61, 0x14, 0x3e, 0xdb, 0x59, 0x21, 0xbd, 0x6e, 0xd1, 0x3b, 0xbe,
- 0xc5, 0x65, 0x93, 0x3d, 0x4b, 0x8e, 0x42, 0x3d, 0x04, 0x67, 0xab, 0xbc,
- 0xa8, 0xc8, 0x57, 0x3e, 0xa0, 0x52, 0x10, 0xbe, 0x02, 0x79, 0xe6, 0xbd,
- 0x3b, 0xfe, 0x51, 0x3e, 0xf6, 0xc6, 0x3a, 0xbe, 0xfe, 0x8b, 0x04, 0xbe,
- 0x57, 0xe3, 0xe4, 0x3d, 0x6a, 0x6c, 0xb3, 0xbd, 0xe9, 0x32, 0xa2, 0xbd,
- 0x20, 0x28, 0x90, 0x3c, 0x98, 0xd8, 0x43, 0x3e, 0xa7, 0x01, 0x5d, 0x3d,
- 0x7a, 0xe8, 0x3a, 0xbd, 0xaa, 0xcb, 0xe9, 0x3c, 0x43, 0xdf, 0x9e, 0xbd,
- 0x83, 0xa3, 0x37, 0xbe, 0x38, 0x57, 0x06, 0xbe, 0xda, 0x41, 0xd1, 0xbc,
- 0xca, 0x55, 0x62, 0xbd, 0xdf, 0xfb, 0xfd, 0x3c, 0xaa, 0xbc, 0x2c, 0x3e,
- 0x00, 0x55, 0x8b, 0x3d, 0x8e, 0xa1, 0x12, 0xbe, 0x94, 0x03, 0x24, 0x3e,
- 0xfc, 0x70, 0x58, 0xbd, 0x55, 0xaa, 0xad, 0xbe, 0x7c, 0xcd, 0x89, 0xbd,
- 0xf9, 0xc3, 0x62, 0xbd, 0xcb, 0x3d, 0xa1, 0xbd, 0x8d, 0x45, 0x48, 0xbe,
- 0xc0, 0xea, 0x67, 0x3d, 0x87, 0xcc, 0x68, 0xbe, 0xcc, 0x66, 0x5a, 0x3e,
- 0x7a, 0xb8, 0x02, 0xbe, 0xb2, 0x60, 0xc8, 0xbe, 0x6c, 0xd1, 0xcf, 0xbd,
- 0x81, 0x3f, 0x7d, 0x3c, 0x63, 0xff, 0x1c, 0xbe, 0xef, 0xe5, 0x20, 0xbe,
- 0x4d, 0x22, 0x86, 0x3e, 0x1f, 0xcb, 0x1d, 0x3e, 0x55, 0x1d, 0x8d, 0x3d,
- 0x31, 0xe6, 0x8c, 0x3b, 0xc5, 0xe3, 0xc5, 0x3d, 0xed, 0x4f, 0xd5, 0xbe,
- 0x4e, 0xb1, 0x4f, 0x3d, 0x12, 0xf9, 0xf3, 0x3c, 0x99, 0x80, 0xf0, 0xbc,
- 0x4f, 0x16, 0xca, 0x3b, 0x79, 0x76, 0x9b, 0xbd, 0x29, 0xed, 0xba, 0xbd,
- 0xd6, 0xfd, 0x86, 0xbd, 0xc6, 0x1b, 0xc1, 0x3e, 0x66, 0xbb, 0xac, 0xbb,
- 0x17, 0x85, 0x92, 0xbe, 0x92, 0xc3, 0x25, 0x3e, 0x02, 0x67, 0x3b, 0xbe,
- 0x5d, 0xf0, 0xcf, 0xbd, 0x85, 0xc1, 0x05, 0xbe, 0x17, 0x26, 0x86, 0xbe,
- 0x64, 0xc2, 0x07, 0x3e, 0xc8, 0xe8, 0xb4, 0x3d, 0xf6, 0x80, 0x1f, 0xbe,
- 0x41, 0xe8, 0xe0, 0x3d, 0x4e, 0xd8, 0x86, 0xbe, 0xfe, 0xd6, 0x6a, 0xbd,
- 0x06, 0x74, 0x8c, 0xbe, 0x98, 0xc1, 0x3d, 0xbe, 0x02, 0x1d, 0xd5, 0x3c,
- 0xbd, 0xd9, 0x8f, 0xbd, 0x52, 0xe9, 0x9d, 0xbc, 0x28, 0x35, 0x81, 0xbd,
- 0xb2, 0x39, 0x47, 0x3d, 0xc9, 0xed, 0xba, 0x3d, 0xb1, 0xe5, 0xd6, 0x3d,
- 0x81, 0x88, 0x60, 0x3e, 0x00, 0xd5, 0xa6, 0xbe, 0x51, 0xac, 0x5b, 0xbe,
- 0xc4, 0x7b, 0xa9, 0xbe, 0x2a, 0x4c, 0x9d, 0x3d, 0x95, 0xc8, 0x8d, 0x3d,
- 0xfb, 0x02, 0x5c, 0xbe, 0x7d, 0xb0, 0x82, 0xbd, 0x72, 0xca, 0x30, 0xbf,
- 0x9e, 0x35, 0xa3, 0x3d, 0xa9, 0xde, 0x4f, 0x3e, 0x83, 0x22, 0x05, 0xbd,
- 0x0f, 0xde, 0xa4, 0x3e, 0x67, 0x42, 0x1e, 0xbd, 0x32, 0xa0, 0xf2, 0x3d,
- 0xfb, 0x87, 0xde, 0xbd, 0xb5, 0x66, 0xe7, 0x3d, 0xfe, 0x53, 0x97, 0x3d,
- 0xed, 0xfd, 0x95, 0x3c, 0x81, 0xe8, 0x1a, 0x3b, 0x54, 0x08, 0x61, 0xbe,
- 0xa3, 0xad, 0x86, 0xbd, 0x6f, 0xcf, 0x34, 0x3e, 0x0e, 0x6d, 0xaa, 0xbe,
- 0x27, 0xed, 0xcb, 0xbd, 0x3d, 0x81, 0x35, 0xbc, 0x30, 0x80, 0xe2, 0xbd,
- 0x59, 0x37, 0x6f, 0xbe, 0xa1, 0xe6, 0x7e, 0x3d, 0x9a, 0x0f, 0x91, 0xbe,
- 0x03, 0x6c, 0x6e, 0xbe, 0x0b, 0x91, 0x70, 0x3e, 0x7f, 0x4c, 0x40, 0xbe,
- 0x4f, 0x2a, 0xb5, 0x3d, 0x00, 0x5e, 0xfe, 0xbb, 0x0e, 0x39, 0x80, 0xbd,
- 0xd8, 0xf7, 0x36, 0xbe, 0x2b, 0x13, 0x5b, 0x3c, 0xa7, 0x42, 0x0b, 0xbe,
- 0x9f, 0x4c, 0x80, 0xbe, 0x0e, 0xbe, 0x70, 0xbe, 0x1b, 0xd6, 0xa1, 0x3e,
- 0x03, 0x15, 0xdf, 0xbd, 0xce, 0xc0, 0xc7, 0x3d, 0xd8, 0xb2, 0xed, 0x3b,
- 0x28, 0x07, 0x87, 0xbe, 0xe6, 0xfd, 0x95, 0xbd, 0xa5, 0xe6, 0x0e, 0xbe,
- 0x80, 0x96, 0xa7, 0x3e, 0xfc, 0x7b, 0x78, 0xbd, 0x79, 0xfc, 0x0f, 0xbd,
- 0xef, 0x6e, 0xf6, 0x3c, 0x52, 0x77, 0xb5, 0x3c, 0xfe, 0x44, 0x74, 0x3c,
- 0xf2, 0x6b, 0x4c, 0x3c, 0xdc, 0x9d, 0x48, 0xbe, 0x78, 0xeb, 0xb2, 0x3d,
- 0x99, 0x13, 0x33, 0xbc, 0x38, 0x53, 0xc7, 0xbd, 0xed, 0xbf, 0xec, 0x3d,
- 0x66, 0x0b, 0x01, 0x3c, 0xf2, 0x32, 0x41, 0xbe, 0xb0, 0xc8, 0x3e, 0xbe,
- 0x08, 0x8b, 0xd8, 0x3c, 0x9a, 0x75, 0xda, 0xbd, 0x57, 0xe0, 0x7c, 0xbd,
- 0x38, 0x15, 0x36, 0x3e, 0xb5, 0x89, 0xea, 0x3d, 0x2d, 0xd4, 0xcd, 0xbc,
- 0xbc, 0xe5, 0x04, 0xbd, 0x41, 0x70, 0x31, 0xbe, 0x05, 0x20, 0xe0, 0xbd,
- 0x20, 0xeb, 0x3b, 0x3e, 0x81, 0x8f, 0xa6, 0x3d, 0x95, 0x2a, 0x46, 0xbe,
- 0xf9, 0x95, 0x01, 0xbf, 0x58, 0x37, 0x54, 0x3d, 0xe8, 0x82, 0x0a, 0xbe,
- 0xe2, 0x9f, 0x17, 0x3d, 0x0a, 0xb2, 0x6a, 0x3e, 0x89, 0x4a, 0xad, 0xbe,
- 0x29, 0x1e, 0x9f, 0xbe, 0x78, 0x8b, 0x1c, 0xbe, 0x2c, 0xbf, 0x92, 0x3d,
- 0x12, 0xfb, 0x83, 0xbc, 0x2a, 0x1d, 0x94, 0x3d, 0x6c, 0x22, 0x22, 0xbe,
- 0x93, 0xbb, 0x8c, 0xbe, 0xf6, 0x3e, 0xba, 0x3d, 0xb9, 0x21, 0xc0, 0xbe,
- 0x5d, 0x8b, 0x5e, 0xbe, 0xd4, 0xa9, 0x72, 0x3c, 0x50, 0x20, 0x5b, 0xbe,
- 0x16, 0xea, 0x1b, 0xbe, 0xca, 0xde, 0xfa, 0xbd, 0xde, 0x26, 0xed, 0xbd,
- 0x0b, 0x2d, 0x07, 0x3e, 0xd2, 0x20, 0x6c, 0xbd, 0x48, 0xa9, 0x49, 0xbd,
- 0xff, 0x52, 0xae, 0x3e, 0x44, 0xcb, 0x28, 0xbe, 0x2f, 0x98, 0xc9, 0xbb,
- 0xc6, 0xe9, 0x2b, 0xbd, 0xf6, 0x9d, 0x25, 0x3c, 0xb8, 0x0e, 0x10, 0x3e,
- 0xae, 0xa1, 0xc7, 0xbc, 0xef, 0x71, 0x90, 0xbd, 0xb8, 0xd3, 0x6a, 0x3c,
- 0x77, 0x7f, 0xa2, 0xbd, 0xb6, 0x41, 0x10, 0xbe, 0x97, 0xbc, 0xc3, 0xbd,
- 0x10, 0x02, 0xfa, 0x3e, 0x7d, 0xf5, 0xb2, 0xbe, 0xb8, 0x2b, 0x75, 0xbc,
- 0x4a, 0x44, 0x82, 0x3c, 0x0d, 0xd0, 0xde, 0xbd, 0xce, 0xc0, 0xa9, 0xbe,
- 0xd6, 0x04, 0x57, 0xbe, 0x21, 0x34, 0x83, 0xbb, 0xc4, 0xc0, 0xe2, 0xbc,
- 0x20, 0xab, 0x34, 0xbe, 0x34, 0xa0, 0xc4, 0xbd, 0x96, 0x7c, 0xa3, 0xbe,
- 0x0d, 0xd9, 0x75, 0x3c, 0x2f, 0x8c, 0x5a, 0x3e, 0x9d, 0x19, 0xa2, 0x3e,
- 0xb5, 0xbb, 0x70, 0x3e, 0x63, 0x0f, 0x49, 0x3e, 0xe3, 0xd0, 0xbf, 0xbd,
- 0xfb, 0xbd, 0xcf, 0x3d, 0x6d, 0x93, 0x4a, 0x3d, 0x1b, 0x70, 0xee, 0xbd,
- 0x92, 0x33, 0x9a, 0x3e, 0x96, 0x0d, 0x3e, 0xbd, 0xef, 0xf4, 0x36, 0x3e,
- 0xf1, 0x69, 0xea, 0x3d, 0x6b, 0xc2, 0x50, 0xbe, 0x98, 0x25, 0xa7, 0xbd,
- 0x78, 0x9b, 0xd7, 0xbd, 0x06, 0x33, 0xef, 0xbd, 0x6b, 0x0d, 0x46, 0x3e,
- 0x35, 0x70, 0x62, 0xbe, 0xbd, 0xe3, 0x86, 0x3e, 0x97, 0x45, 0x51, 0x3e,
- 0x17, 0x3a, 0x19, 0xbe, 0xad, 0xbb, 0x40, 0xbe, 0x6d, 0x5d, 0x0d, 0x3e,
- 0xa9, 0x7b, 0x8f, 0x3c, 0x57, 0x18, 0xb4, 0x3e, 0x05, 0x0c, 0x96, 0xbe,
- 0x4b, 0x7f, 0x11, 0x3e, 0x60, 0x58, 0xd3, 0xbd, 0xd4, 0x83, 0x5c, 0xbe,
- 0x6e, 0xda, 0xa2, 0x3d, 0x23, 0x15, 0xab, 0xbd, 0x1e, 0x26, 0x51, 0x3c,
- 0xa8, 0xe6, 0x75, 0xbe, 0x94, 0x3e, 0x15, 0x3e, 0x81, 0x24, 0xab, 0x3d,
- 0x00, 0x02, 0xbc, 0x3d, 0xdf, 0x7e, 0x56, 0x3e, 0xa9, 0x8d, 0x40, 0xbd,
- 0x96, 0x80, 0x1f, 0xbe, 0xde, 0xdb, 0x54, 0x3e, 0x42, 0xb8, 0x8f, 0x3c,
- 0x73, 0x4e, 0xea, 0x3d, 0x2a, 0x8e, 0x88, 0x3d, 0x29, 0x4c, 0x17, 0xbe,
- 0x73, 0x47, 0x41, 0x3e, 0x35, 0x86, 0xf9, 0x3d, 0x77, 0xba, 0x56, 0xbd,
- 0x0a, 0xb4, 0xac, 0x3d, 0xdd, 0x00, 0xe5, 0xbd, 0xff, 0xac, 0x8b, 0x3e,
- 0x0a, 0x21, 0xa5, 0xbd, 0x7f, 0x5a, 0x82, 0x3e, 0x01, 0x8d, 0x0d, 0xbd,
- 0x4c, 0x5f, 0xbf, 0x3c, 0x0f, 0xf6, 0xc3, 0x3b, 0x06, 0x5f, 0x55, 0x3e,
- 0x01, 0x4c, 0x41, 0x3e, 0x14, 0x6d, 0xea, 0x3c, 0x9a, 0xab, 0x0b, 0xbe,
- 0x7e, 0x4e, 0x06, 0xbd, 0x2d, 0x0d, 0x5c, 0xbc, 0xd1, 0x3e, 0xde, 0xbd,
- 0x1b, 0xac, 0xa0, 0xbd, 0x14, 0x41, 0x23, 0xbe, 0x15, 0x69, 0xbd, 0xbd,
- 0x1b, 0x52, 0x5a, 0xbd, 0x31, 0xbf, 0xa3, 0x3d, 0x82, 0x8f, 0xbe, 0x3d,
- 0x2c, 0x8e, 0x28, 0xbe, 0x81, 0x14, 0x1a, 0x3e, 0x56, 0x65, 0xc2, 0xbe,
- 0x6c, 0x89, 0xf9, 0x3d, 0x5d, 0x04, 0x22, 0xbe, 0xaf, 0x3c, 0xa1, 0x3c,
- 0x7b, 0x4c, 0x31, 0xbc, 0x68, 0x82, 0x01, 0x3d, 0x52, 0x5c, 0x99, 0xbc,
- 0x36, 0x14, 0x98, 0xbd, 0x6a, 0xcd, 0xf0, 0x3d, 0xac, 0x0e, 0x07, 0xbe,
- 0xf6, 0xdc, 0x33, 0xbe, 0xc6, 0x3a, 0xae, 0x3e, 0x12, 0x10, 0x8e, 0xbd,
- 0x09, 0x94, 0xb4, 0xbd, 0xe0, 0xd2, 0xe0, 0x3c, 0x3f, 0x57, 0x9e, 0xbd,
- 0x98, 0xe5, 0x8e, 0xbd, 0x22, 0x14, 0x9c, 0xbd, 0x88, 0xb4, 0x04, 0xbd,
- 0x42, 0xe0, 0x58, 0x3e, 0x87, 0x27, 0x16, 0xbe, 0x58, 0xec, 0xf5, 0xbc,
- 0xd5, 0x06, 0xb1, 0xbd, 0x52, 0x6b, 0xd8, 0x3c, 0x14, 0x6f, 0x86, 0xbe,
- 0x64, 0xc2, 0x22, 0xbd, 0x13, 0x0a, 0x7f, 0x3e, 0x7e, 0x3f, 0x0e, 0x3e,
- 0x81, 0x62, 0x17, 0xbe, 0xc0, 0xce, 0x38, 0x3e, 0xcb, 0x8e, 0x8c, 0xbe,
- 0x62, 0x50, 0x27, 0x3e, 0xc8, 0xcb, 0xe0, 0x3d, 0x4f, 0x35, 0xe2, 0xbd,
- 0x17, 0x24, 0x16, 0x3d, 0x95, 0x36, 0x06, 0x3c, 0x13, 0xbe, 0x3e, 0x3e,
- 0x29, 0xc7, 0xed, 0x3d, 0x26, 0x5b, 0xf9, 0x3d, 0x15, 0xaa, 0x84, 0x3d,
- 0x16, 0xca, 0xf8, 0x3d, 0xb1, 0xb4, 0xcb, 0xbd, 0xf7, 0x5c, 0xe6, 0x3e,
- 0x3d, 0xa1, 0x51, 0x3e, 0x66, 0x4d, 0xd2, 0x39, 0xad, 0x7d, 0x31, 0xbd,
- 0x93, 0xe8, 0x2b, 0x3c, 0xb8, 0xc7, 0xec, 0xbc, 0x1d, 0x43, 0x59, 0xbe,
- 0x5d, 0x96, 0x5c, 0x3e, 0x87, 0xad, 0x00, 0xbd, 0x61, 0x57, 0xae, 0xbd,
- 0xfb, 0x55, 0xec, 0xbd, 0xf8, 0x51, 0x32, 0xbe, 0xf7, 0xe3, 0xdd, 0x3e,
- 0x74, 0x51, 0x40, 0xbe, 0x03, 0x7f, 0x38, 0x3e, 0xc8, 0x2f, 0xfe, 0xbd,
- 0x3d, 0x8f, 0x3c, 0xbd, 0x6f, 0x34, 0xed, 0x3d, 0x9c, 0x47, 0xfe, 0x3d,
- 0xb0, 0xbb, 0x1d, 0x3e, 0x49, 0xad, 0x0a, 0x3e, 0x7f, 0xd6, 0xe6, 0x3d,
- 0x4f, 0x72, 0xb8, 0xbd, 0xc9, 0xb4, 0x9d, 0xbc, 0x08, 0xba, 0xd5, 0x3c,
- 0xe1, 0x1f, 0x36, 0x3c, 0xb8, 0xf5, 0x6c, 0x3c, 0x19, 0x3d, 0x0a, 0x3e,
- 0x7b, 0x9d, 0x33, 0x3c, 0xe1, 0x6b, 0xbc, 0x3b, 0x8c, 0x8c, 0xb1, 0xbd,
- 0x66, 0x6a, 0x54, 0x3d, 0x29, 0x80, 0x58, 0xbc, 0xca, 0xda, 0x69, 0xbd,
- 0x12, 0x9c, 0x2a, 0xbe, 0x33, 0xb2, 0x85, 0x3e, 0x28, 0xba, 0x27, 0x3e,
- 0xb9, 0xef, 0x40, 0xbd, 0x76, 0x9f, 0x90, 0xbd, 0x84, 0x5e, 0xe5, 0xbe,
- 0xa8, 0x70, 0x2a, 0xbd, 0xfc, 0x1f, 0x30, 0xbd, 0x95, 0xe3, 0x1d, 0x3d,
- 0x09, 0xca, 0xd8, 0x3d, 0x82, 0x47, 0x26, 0x3e, 0x2a, 0xa9, 0x1a, 0x3c,
- 0xe8, 0xa3, 0x0f, 0xbe, 0x73, 0x69, 0x0a, 0xbe, 0xaf, 0x64, 0x5a, 0xbe,
- 0x93, 0x4e, 0x4b, 0xbc, 0x6d, 0x72, 0xaf, 0xbe, 0xa5, 0xf6, 0x5c, 0xbd,
- 0x19, 0xa2, 0x55, 0xbc, 0xe3, 0xcb, 0xf8, 0xbe, 0xe2, 0xe8, 0x2c, 0xbe,
- 0x4b, 0x3b, 0xed, 0xbc, 0x28, 0x47, 0xa6, 0x3d, 0x68, 0x7a, 0x53, 0xbc,
- 0xd6, 0x51, 0x97, 0xbe, 0xcc, 0x7b, 0x01, 0xbe, 0xe4, 0xcb, 0x3b, 0xbd,
- 0x90, 0x40, 0xb9, 0xbe, 0x09, 0x92, 0x8a, 0xbe, 0xef, 0x03, 0x91, 0xbd,
- 0xdc, 0xaa, 0xc9, 0xbd, 0x3f, 0x7a, 0xbb, 0xbe, 0x48, 0x64, 0x82, 0xbe,
- 0x3a, 0xf4, 0x5e, 0xbd, 0x4d, 0x73, 0x2c, 0x3d, 0x73, 0xe6, 0xa3, 0xbd,
- 0x62, 0x41, 0xb2, 0x3c, 0x70, 0xa9, 0x92, 0xbe, 0xe3, 0x43, 0x96, 0xbe,
- 0x3b, 0x20, 0x8f, 0x3e, 0x39, 0xd9, 0xdd, 0xbd, 0xae, 0x1f, 0xc2, 0xbd,
- 0xf2, 0x40, 0xb1, 0x3b, 0xca, 0xff, 0x9d, 0xbe, 0x8e, 0xe2, 0xf6, 0xbc,
- 0x6d, 0xf0, 0xa0, 0xbd, 0x93, 0x32, 0xae, 0xbe, 0x63, 0x49, 0x99, 0xbc,
- 0xfd, 0x46, 0x43, 0x3d, 0x7c, 0x85, 0x3f, 0x3e, 0x8d, 0xa6, 0xa3, 0xbe,
- 0x6d, 0x99, 0x9e, 0x3e, 0x69, 0x71, 0x19, 0xbe, 0x61, 0x4f, 0xdd, 0xbd,
- 0x69, 0xf2, 0x8b, 0xbc, 0xa9, 0xd8, 0x80, 0xbe, 0xc1, 0x4f, 0x76, 0x3e,
- 0x18, 0xb1, 0x62, 0xbe, 0x4d, 0x55, 0xd4, 0xbd, 0x25, 0x29, 0x5e, 0x3d,
- 0xb2, 0x3b, 0x9d, 0xbd, 0x64, 0xc8, 0xe3, 0xbd, 0xc8, 0xea, 0x97, 0x3d,
- 0x95, 0x3c, 0xa1, 0xbd, 0xcc, 0xe2, 0x3c, 0xbe, 0xfc, 0x8f, 0x75, 0x3d,
- 0xa8, 0x9a, 0xc8, 0x3c, 0x03, 0xeb, 0x30, 0xbd, 0x9e, 0xae, 0x11, 0xbe,
- 0x38, 0x8c, 0xbc, 0x3d, 0x16, 0xfc, 0x84, 0xbe, 0x0c, 0x07, 0xb3, 0xbd,
- 0xe7, 0x43, 0x00, 0xbe, 0x46, 0xfa, 0x5c, 0x3d, 0x2a, 0x66, 0x85, 0xbc,
- 0x6b, 0x9e, 0x13, 0x3e, 0x73, 0x1a, 0xa2, 0xbe, 0xcd, 0xac, 0x6a, 0xbe,
- 0x0c, 0x3b, 0x64, 0x3d, 0xd3, 0x7b, 0x0f, 0x3e, 0x57, 0x8a, 0xc8, 0xbd,
- 0x82, 0xf8, 0x08, 0x3e, 0x8e, 0x3a, 0x1e, 0x3e, 0xdc, 0x65, 0xed, 0xbd,
- 0x73, 0x5c, 0xbf, 0x3d, 0xde, 0xf4, 0xfc, 0x3d, 0xd8, 0xa4, 0x1e, 0xbd,
- 0x2e, 0x2a, 0x17, 0xbc, 0x4f, 0x74, 0x06, 0xbe, 0x58, 0x10, 0x75, 0x3e,
- 0xcb, 0xa1, 0x7f, 0xbe, 0x47, 0x52, 0x7d, 0xbe, 0x6a, 0xa4, 0xc4, 0x3c,
- 0xde, 0x8e, 0x2f, 0xbe, 0x86, 0x00, 0x96, 0x3d, 0xe6, 0x72, 0xe5, 0xbd,
- 0x6f, 0x49, 0x55, 0xbd, 0x13, 0x97, 0x2c, 0x3e, 0x80, 0xda, 0xab, 0x3d,
- 0x25, 0xbf, 0xd4, 0x3d, 0x5d, 0xc9, 0x4d, 0xbe, 0x04, 0x39, 0x91, 0xbe,
- 0xbc, 0x00, 0xe3, 0xbd, 0x8d, 0x48, 0x56, 0xbe, 0x95, 0xff, 0xae, 0xbe,
- 0x7a, 0x14, 0xce, 0x3d, 0xc3, 0x6d, 0x51, 0x3c, 0x52, 0x80, 0x19, 0x3c,
- 0xa3, 0x49, 0x17, 0xbd, 0x51, 0x3f, 0xe7, 0xbe, 0x88, 0xf9, 0xcb, 0xbd,
- 0x45, 0x36, 0x95, 0xbc, 0xae, 0xc6, 0x25, 0xbe, 0xa7, 0xf8, 0xad, 0x3e,
- 0xad, 0x6c, 0x61, 0xbd, 0x86, 0x21, 0x87, 0xbe, 0xcf, 0x92, 0x46, 0x3e,
- 0xc6, 0x74, 0x37, 0x3e, 0x61, 0x6b, 0xa2, 0x3d, 0x29, 0x0a, 0x05, 0xbd,
- 0x2f, 0x1c, 0x95, 0xbe, 0xd5, 0x62, 0x40, 0x3d, 0xf5, 0xfe, 0xc7, 0x3d,
- 0xe8, 0x1f, 0x2f, 0xbe, 0xd9, 0xc6, 0x10, 0x3d, 0x33, 0x3a, 0xeb, 0xbd,
- 0xc0, 0x0b, 0xd1, 0xbe, 0xcb, 0xbe, 0xc3, 0xbd, 0xf0, 0x67, 0xa7, 0xbd,
- 0x57, 0x60, 0x8a, 0x3d, 0x2d, 0xff, 0x06, 0xbf, 0xe3, 0x40, 0x5c, 0x3e,
- 0xe5, 0xae, 0x19, 0x3e, 0xb0, 0x02, 0x08, 0xbe, 0x7c, 0xfa, 0x22, 0x3d,
- 0xf7, 0x2f, 0x31, 0x3e, 0x55, 0xf3, 0x3e, 0x3e, 0x21, 0xdb, 0x7d, 0x3e,
- 0x22, 0xb0, 0x4c, 0xbd, 0x21, 0xe0, 0x68, 0xbe, 0xea, 0xa8, 0xa0, 0xbe,
- 0x99, 0xf0, 0x04, 0x3d, 0xf4, 0xc6, 0xed, 0xbc, 0x8d, 0xac, 0xd2, 0xbd,
- 0x64, 0x96, 0x33, 0x3e, 0x70, 0x40, 0x12, 0xbe, 0xcb, 0x35, 0x37, 0xbd,
- 0x40, 0x51, 0x35, 0x3e, 0x25, 0x44, 0x99, 0x3d, 0x4b, 0x53, 0x23, 0x3d,
- 0xd9, 0x2f, 0x8a, 0xbe, 0xd8, 0xfb, 0xd8, 0xbe, 0xb0, 0x55, 0x32, 0xbe,
- 0x29, 0x38, 0xaf, 0x3b, 0x94, 0x75, 0xbd, 0x3c, 0x07, 0x98, 0x63, 0xbc,
- 0xd5, 0xbc, 0x12, 0xbe, 0x7f, 0xa6, 0xb9, 0x3d, 0x2e, 0xab, 0x47, 0x3d,
- 0xcb, 0xfc, 0xc4, 0x3b, 0x67, 0x2f, 0x6d, 0xbd, 0xa6, 0x4c, 0x37, 0xbd,
- 0x0c, 0x83, 0xd7, 0x3c, 0x67, 0xcb, 0x71, 0xbe, 0xa0, 0xd4, 0xe9, 0xbc,
- 0x35, 0xe4, 0xde, 0xbc, 0x14, 0x4e, 0x2c, 0xbe, 0x3a, 0x3f, 0x01, 0x3e,
- 0x37, 0x83, 0x25, 0xbe, 0xc0, 0x65, 0xc8, 0x3d, 0x70, 0xbf, 0xa1, 0x3d,
- 0xb0, 0x7d, 0x3f, 0x3e, 0x25, 0x3a, 0x7f, 0xbe, 0xa0, 0x89, 0xd0, 0xbe,
- 0x7e, 0xba, 0x8e, 0xbe, 0xec, 0x16, 0x3c, 0xbe, 0xe5, 0xe7, 0x4d, 0x3e,
- 0x31, 0x32, 0x2e, 0xbe, 0xae, 0xdc, 0x9e, 0xbd, 0x4c, 0xe1, 0x01, 0xbe,
- 0x59, 0x5c, 0xf0, 0x3b, 0xea, 0x08, 0xf8, 0xbc, 0x93, 0xb3, 0x31, 0xbe,
- 0x01, 0xc8, 0x88, 0xbd, 0x04, 0x5b, 0x02, 0xbe, 0x3c, 0x18, 0x94, 0xbd,
- 0x3f, 0x95, 0xab, 0xbd, 0x16, 0xb5, 0x25, 0xbe, 0xe0, 0x51, 0xbe, 0x3d,
- 0x21, 0x4d, 0x09, 0xbd, 0xb9, 0x76, 0xe2, 0x3d, 0x3e, 0x36, 0x8f, 0x3c,
- 0xfe, 0x35, 0x85, 0x3d, 0x71, 0xf8, 0xff, 0x3c, 0x26, 0xba, 0x50, 0xbe,
- 0x79, 0x7c, 0x27, 0x3e, 0x93, 0xca, 0x17, 0xbe, 0x95, 0xa3, 0x25, 0x3e,
- 0x25, 0x47, 0x0d, 0xbd, 0x56, 0xf8, 0xc5, 0xbc, 0x5c, 0x7d, 0x31, 0x3d,
- 0x34, 0x2c, 0x24, 0x3e, 0x02, 0x26, 0xf2, 0x3d, 0x2c, 0x49, 0xd4, 0x3d,
- 0x57, 0x05, 0x86, 0xbd, 0x05, 0x75, 0x84, 0xbe, 0x35, 0x39, 0x0f, 0xbe,
- 0x0c, 0x0c, 0x70, 0x3e, 0xc5, 0x41, 0x0c, 0x3e, 0xec, 0xb0, 0xf5, 0xbc,
- 0x6b, 0xa4, 0x4e, 0x3e, 0x16, 0x19, 0x5e, 0x3b, 0xab, 0x57, 0xae, 0xbd,
- 0x29, 0xf5, 0x95, 0xbe, 0x94, 0x3e, 0x53, 0x3e, 0x35, 0x16, 0x45, 0xbe,
- 0x8e, 0x60, 0x22, 0xbe, 0xca, 0xa8, 0x7c, 0x3d, 0x76, 0x85, 0x00, 0x3e,
- 0x67, 0x04, 0x75, 0xbd, 0xd9, 0x24, 0x4e, 0x3d, 0xcf, 0xc1, 0xb6, 0x3d,
- 0x81, 0xb8, 0x83, 0x3d, 0x4c, 0x06, 0x7a, 0x3d, 0x44, 0x27, 0xc4, 0x3d,
- 0x68, 0xf0, 0x75, 0xbd, 0x3a, 0x39, 0x94, 0xbc, 0xbf, 0x80, 0x85, 0x3b,
- 0x68, 0xbe, 0x90, 0x3d, 0x2c, 0xca, 0xbf, 0x3d, 0xb5, 0x9a, 0x33, 0xbd,
- 0xc3, 0xf7, 0x91, 0x3c, 0x0d, 0x98, 0xf9, 0x3d, 0xd1, 0xb6, 0xfc, 0xbd,
- 0x29, 0x84, 0x72, 0xbd, 0x8a, 0x00, 0x58, 0xbe, 0x8f, 0x26, 0xe4, 0x3d,
- 0xf0, 0xc9, 0x1f, 0xbe, 0x5d, 0xd6, 0x92, 0xbd, 0xd1, 0xfd, 0xd2, 0xbd,
- 0x63, 0xc8, 0x1a, 0xbe, 0xf4, 0x73, 0x21, 0xbe, 0xd6, 0x23, 0xa2, 0xbe,
- 0x8f, 0x82, 0x1e, 0xbe, 0x86, 0xb5, 0x22, 0x3e, 0xbd, 0x8b, 0xc2, 0x3c,
- 0xca, 0x77, 0xd3, 0xbc, 0x65, 0x23, 0xb1, 0xbd, 0x1b, 0xda, 0xbb, 0xbd,
- 0x88, 0xa1, 0xb5, 0xbe, 0x89, 0x8d, 0x73, 0xbe, 0x54, 0xa5, 0x09, 0xbe,
- 0x6d, 0x36, 0xf9, 0xbd, 0xa2, 0x31, 0xa8, 0x3d, 0x03, 0x72, 0x27, 0x3e,
- 0xd0, 0xf2, 0x91, 0xbb, 0x3d, 0x04, 0x94, 0x3d, 0x5c, 0xcd, 0xd9, 0xbc,
- 0xac, 0x9c, 0x19, 0xbe, 0xaa, 0xc8, 0xf2, 0x3d, 0x74, 0x87, 0x6d, 0x3d,
- 0xbb, 0xdc, 0x7c, 0xbe, 0x49, 0xdd, 0xf0, 0xbc, 0xf5, 0x5e, 0xe6, 0x3b,
- 0x80, 0x6d, 0x02, 0x3d, 0xd6, 0x0a, 0xa4, 0xbe, 0x0b, 0x4f, 0x81, 0xbe,
- 0x09, 0x93, 0x9f, 0xbe, 0x53, 0x67, 0x40, 0xbe, 0xcb, 0xa8, 0x0b, 0xbb,
- 0x4f, 0x5d, 0xb5, 0x3c, 0x7a, 0xa5, 0x23, 0x3e, 0x82, 0x03, 0xc0, 0x3d,
- 0x40, 0x94, 0x02, 0xbe, 0xe6, 0x60, 0x70, 0xbe, 0xdd, 0x9b, 0x1a, 0xbd,
- 0x76, 0xbc, 0xad, 0x3d, 0x44, 0x93, 0xb1, 0xbe, 0x78, 0xb1, 0x75, 0xbd,
- 0x5c, 0x92, 0xe5, 0xbd, 0x38, 0x5b, 0x66, 0xbe, 0x96, 0xc3, 0x18, 0xbc,
- 0x5b, 0x8a, 0x12, 0xbe, 0xef, 0x5d, 0x8f, 0xbe, 0x44, 0xd8, 0xeb, 0xbd,
- 0xf9, 0x9c, 0x82, 0xbe, 0xdd, 0x29, 0x83, 0xbd, 0x54, 0xc3, 0xcd, 0x3d,
- 0x30, 0x3e, 0x8d, 0xbc, 0x53, 0x21, 0xbc, 0xbc, 0xd4, 0x2d, 0x98, 0x3d,
- 0xaf, 0x24, 0xca, 0x3d, 0xf5, 0xad, 0x6c, 0xbe, 0x64, 0x15, 0x36, 0xbd,
- 0xc7, 0x49, 0x68, 0x3e, 0xc3, 0xe0, 0x99, 0x3e, 0x7e, 0x94, 0xbd, 0x3d,
- 0xd2, 0x7b, 0xee, 0x3d, 0x53, 0x11, 0x84, 0xbd, 0xf9, 0x42, 0x23, 0xbd,
- 0x74, 0xaf, 0xfe, 0x3d, 0x50, 0x49, 0x82, 0x3c, 0xcf, 0x7c, 0x20, 0x3e,
- 0x33, 0xd9, 0x96, 0xbc, 0x67, 0x45, 0xae, 0x3d, 0x57, 0x3d, 0x5b, 0x3e,
- 0x86, 0x4f, 0x6a, 0x3c, 0x50, 0x34, 0x5c, 0xbe, 0x2f, 0xb3, 0xc9, 0xba,
- 0x36, 0xa2, 0x92, 0xbc, 0xc9, 0x69, 0x17, 0xbe, 0xe2, 0x26, 0x16, 0x3d,
- 0x2c, 0x12, 0x21, 0x3e, 0x35, 0xe8, 0x4f, 0x3e, 0x54, 0x03, 0x16, 0x3d,
- 0x08, 0x47, 0xac, 0x3d, 0x57, 0x7b, 0x96, 0xbd, 0x70, 0x1d, 0x1f, 0x3d,
- 0x26, 0x33, 0xba, 0x3c, 0x0e, 0xf0, 0xc0, 0xbd, 0xc0, 0x49, 0xf0, 0x3d,
- 0xad, 0x08, 0xa3, 0x3d, 0x4d, 0xdd, 0x68, 0x3d, 0x2f, 0x57, 0xa7, 0x3e,
- 0x64, 0x35, 0x5c, 0x3e, 0x6c, 0xd3, 0xa2, 0x3d, 0x63, 0x03, 0xfe, 0xbd,
- 0x60, 0x89, 0x11, 0x3e, 0x6f, 0x98, 0x04, 0xbe, 0xed, 0x98, 0xbe, 0x3d,
- 0xe2, 0x49, 0xfa, 0xbc, 0x25, 0x52, 0xbf, 0xbd, 0x69, 0x27, 0x81, 0xb8,
- 0xc4, 0x94, 0xaa, 0x3d, 0x06, 0x27, 0x43, 0xbc, 0x95, 0x4a, 0x24, 0xbe,
- 0x27, 0x8b, 0x4f, 0x3c, 0xcf, 0x50, 0x1e, 0x3e, 0xd8, 0x94, 0x87, 0xbe,
- 0x70, 0xd1, 0x13, 0x3e, 0x63, 0x93, 0x90, 0xbe, 0x3a, 0x59, 0x43, 0x3e,
- 0x3a, 0x33, 0x28, 0x3e, 0x71, 0x60, 0xf8, 0x3d, 0x53, 0x57, 0x46, 0xbe,
- 0x1d, 0xf6, 0x89, 0xbd, 0xf9, 0x4b, 0x91, 0xbe, 0x80, 0x74, 0x88, 0xbe,
- 0x8c, 0x9c, 0x2b, 0x3e, 0x54, 0xa1, 0x4c, 0xbe, 0xa7, 0x5c, 0x16, 0x3d,
- 0xdb, 0x6a, 0x0f, 0xbe, 0x6e, 0x04, 0x81, 0x3d, 0x70, 0x07, 0x85, 0x3e,
- 0x4f, 0x20, 0x33, 0x3d, 0x2a, 0xac, 0xb0, 0xbc, 0x05, 0x53, 0x22, 0x3e,
- 0x3b, 0x37, 0x8e, 0x3e, 0xbf, 0x75, 0x08, 0x3e, 0x1a, 0x79, 0xc6, 0xbd,
- 0x94, 0x25, 0xca, 0x3d, 0x16, 0xd7, 0xae, 0xbd, 0x1f, 0x9c, 0x02, 0xbd,
- 0xd0, 0x26, 0x94, 0x3e, 0x5c, 0x04, 0xac, 0x3a, 0x91, 0xb1, 0xab, 0x3d,
- 0xb2, 0xe3, 0x8e, 0x3d, 0x51, 0x9b, 0xb9, 0x3d, 0xd4, 0x77, 0x33, 0x3e,
- 0xc3, 0x4a, 0x77, 0xbe, 0x34, 0xf8, 0xa5, 0x3d, 0x14, 0x9d, 0xa0, 0x3d,
- 0x80, 0xe8, 0xe1, 0xbd, 0x0e, 0xb5, 0xf2, 0xbd, 0x4b, 0xb5, 0xbd, 0x3d,
- 0x33, 0x81, 0x2c, 0xbe, 0xd8, 0xf9, 0x0c, 0x3e, 0x92, 0x2e, 0xd5, 0x3d,
- 0x73, 0xfa, 0xb7, 0xbb, 0xfc, 0xde, 0x05, 0xbe, 0xc7, 0x72, 0x46, 0xbe,
- 0x4b, 0x7a, 0xa9, 0xbd, 0xe9, 0x60, 0x69, 0xbc, 0x47, 0xa4, 0x50, 0x3e,
- 0xe1, 0x53, 0xac, 0x3c, 0xe0, 0x48, 0x38, 0xbc, 0xba, 0xde, 0xaf, 0x3d,
- 0x9c, 0xc1, 0x81, 0xbd, 0x1b, 0x33, 0x94, 0xbd, 0x6e, 0x83, 0x6d, 0xbc,
- 0xb4, 0xbb, 0x2c, 0x3e, 0x1b, 0x32, 0x7b, 0xbe, 0x71, 0x55, 0x59, 0x3d,
- 0xf8, 0xae, 0x95, 0xbd, 0x5c, 0xd7, 0xbd, 0xbd, 0xbc, 0x9e, 0x67, 0xbd,
- 0xdc, 0xe0, 0x62, 0xbd, 0xa3, 0x8a, 0xe8, 0xbc, 0x36, 0x1d, 0xca, 0x3b,
- 0xea, 0x35, 0x46, 0x3d, 0x6f, 0x66, 0xd8, 0x3e, 0xa7, 0x75, 0x3d, 0xbe,
- 0xa0, 0xc3, 0xf0, 0x3c, 0xff, 0xb1, 0xc2, 0xbd, 0xc7, 0xf7, 0xbe, 0x3d,
- 0x25, 0x91, 0x7f, 0xbd, 0x9b, 0xd1, 0x96, 0x3e, 0x23, 0x09, 0xea, 0x3d,
- 0x8d, 0xa9, 0xcc, 0x3d, 0x6a, 0xfd, 0x2f, 0x3d, 0xa6, 0xbd, 0xdd, 0xbd,
- 0xe2, 0xfb, 0x0e, 0x3d, 0xfa, 0x34, 0x42, 0xbd, 0x3b, 0x03, 0x97, 0x3c,
- 0x8c, 0x33, 0x9a, 0xbd, 0x65, 0xed, 0x99, 0x3e, 0x14, 0xe1, 0xaa, 0xbe,
- 0x0d, 0xc8, 0xa3, 0xbd, 0xae, 0x1b, 0x83, 0xbd, 0xba, 0xcb, 0x0f, 0xbd,
- 0xbb, 0x21, 0xb1, 0xbe, 0x17, 0xb7, 0x85, 0x3e, 0x4e, 0x6d, 0x9d, 0xbd,
- 0xf8, 0xdc, 0xc3, 0x3c, 0xf5, 0xcc, 0x7f, 0xbb, 0x53, 0xbd, 0x50, 0x3e,
- 0x9a, 0xf8, 0x3a, 0xbd, 0x0a, 0x24, 0x30, 0x3e, 0x2c, 0x96, 0xb7, 0x3b,
- 0x36, 0x6a, 0xca, 0x3e, 0x2f, 0x6d, 0x17, 0x3e, 0xc6, 0x73, 0xff, 0x3d,
- 0x57, 0x33, 0xaa, 0x3d, 0x66, 0xe7, 0x82, 0x3e, 0xaf, 0xd3, 0xae, 0xbd,
- 0xd3, 0x09, 0xd5, 0xbd, 0x1b, 0x79, 0x56, 0xbe, 0x08, 0xab, 0xd5, 0x3d,
- 0xa6, 0x67, 0x4e, 0x3e, 0xa6, 0x6d, 0xca, 0xbd, 0xab, 0xda, 0x5b, 0x3e,
- 0x36, 0x81, 0x0c, 0x3e, 0x40, 0x0a, 0xb7, 0x3e, 0x21, 0xe1, 0xba, 0x3b,
- 0x08, 0x2f, 0x92, 0x3e, 0xb5, 0x51, 0x8c, 0x3e, 0x7a, 0x7a, 0xf6, 0x3d,
- 0x80, 0x4e, 0x58, 0x3d, 0x77, 0xe9, 0x0e, 0x3d, 0xb8, 0x50, 0x61, 0x3e,
- 0xa1, 0x58, 0xd7, 0xbd, 0xfb, 0x65, 0x1d, 0x3e, 0x04, 0x40, 0x34, 0x3e,
- 0xfb, 0xa0, 0x18, 0xbe, 0xbc, 0x92, 0x58, 0xbe, 0xe8, 0xcd, 0xe1, 0xbd,
- 0xe9, 0x32, 0x1e, 0x3e, 0xd0, 0x9f, 0x08, 0xbd, 0xe4, 0xfc, 0x9d, 0xbe,
- 0xc6, 0xb4, 0x13, 0x3d, 0x2c, 0x41, 0xea, 0x3c, 0x95, 0xc0, 0xa1, 0x3d,
- 0x74, 0x50, 0xed, 0x3d, 0x5a, 0x15, 0xa5, 0xbd, 0x1d, 0xb3, 0x43, 0xbd,
- 0x6a, 0xd4, 0xcc, 0x3c, 0x1c, 0xfe, 0x17, 0xbc, 0x1f, 0x59, 0x9e, 0x3c,
- 0x2c, 0xbc, 0xeb, 0xbd, 0x28, 0x4e, 0x94, 0x3d, 0x43, 0xfc, 0x10, 0xbd,
- 0xd8, 0xdd, 0x8a, 0xbd, 0x23, 0x45, 0xfd, 0x3a, 0xaa, 0x31, 0xc6, 0xbd,
- 0x4a, 0xd5, 0x4e, 0x3e, 0xa1, 0x86, 0xe3, 0x3d, 0xc1, 0x40, 0x63, 0x3e,
- 0x05, 0xce, 0x40, 0x3d, 0xc1, 0x81, 0x77, 0xbc, 0x63, 0x06, 0x2a, 0x3e,
- 0xf0, 0x2e, 0x82, 0x3d, 0x72, 0x78, 0x04, 0x3e, 0xb5, 0x58, 0x4b, 0x3e,
- 0xb9, 0x4d, 0x25, 0xbe, 0x09, 0x14, 0x7f, 0xbc, 0x9c, 0x27, 0x88, 0x3e,
- 0x0a, 0x8a, 0x7d, 0xbe, 0x5d, 0x84, 0xbd, 0xbc, 0x28, 0x47, 0xad, 0x3d,
- 0x67, 0x17, 0x79, 0x3d, 0xcc, 0x93, 0xc8, 0x3d, 0xfe, 0xb5, 0x8e, 0x3d,
- 0xf0, 0x77, 0x21, 0xbe, 0xbf, 0x97, 0x8a, 0x3d, 0x5c, 0x2a, 0xe7, 0x3c,
- 0x0c, 0x6f, 0xb5, 0x3d, 0xe1, 0xae, 0xdc, 0x3d, 0x51, 0x72, 0x3c, 0x3e,
- 0x0e, 0x02, 0x05, 0xbe, 0xf2, 0x31, 0xab, 0xbd, 0x1d, 0xd7, 0xde, 0x3c,
- 0xcc, 0x3a, 0x8b, 0x3d, 0xa1, 0xe6, 0xf3, 0xbd, 0x26, 0xf1, 0xf4, 0xbd,
- 0xb8, 0x1d, 0x43, 0x3e, 0xc3, 0x6b, 0xa8, 0x3d, 0xfe, 0x74, 0xdc, 0x3c,
- 0x80, 0xda, 0x36, 0xbd, 0xcb, 0x47, 0x66, 0xbd, 0x40, 0x99, 0xc9, 0xbd,
- 0x4d, 0xe5, 0x83, 0xbd, 0xab, 0x8b, 0x58, 0xbe, 0x03, 0xdd, 0xb2, 0xbd,
- 0xe1, 0x04, 0x38, 0xbe, 0x52, 0xe1, 0x3e, 0x3e, 0x64, 0xc8, 0x18, 0x3e,
- 0x9d, 0x2b, 0x40, 0x3d, 0x13, 0xb8, 0x72, 0x3d, 0x89, 0xcc, 0x28, 0xbc,
- 0x08, 0x16, 0x40, 0xbd, 0x88, 0xe4, 0x0f, 0x3e, 0x2a, 0xe1, 0xe7, 0xbb,
- 0x69, 0x4f, 0x45, 0x3e, 0xb8, 0xa4, 0x97, 0x3e, 0x53, 0xcd, 0x15, 0xbe,
- 0xa5, 0x38, 0xa3, 0x3e, 0x79, 0xcb, 0x3f, 0xbd, 0x7e, 0x67, 0xc6, 0x3d,
- 0x4f, 0xc7, 0xdd, 0x3d, 0xa3, 0xc8, 0x48, 0x3e, 0x63, 0x79, 0xea, 0xbd,
- 0xaf, 0x9d, 0x62, 0x3e, 0xd2, 0x3c, 0x1f, 0xbd, 0x98, 0xdd, 0x67, 0x3e,
- 0x7f, 0xcc, 0xc8, 0x3e, 0x26, 0xa1, 0x83, 0xbe, 0xf3, 0x56, 0xd6, 0x3d,
- 0x78, 0x95, 0x0b, 0x3e, 0xac, 0x7d, 0xf6, 0x3d, 0xd6, 0x5b, 0x36, 0xbe,
- 0x42, 0xae, 0x52, 0x3e, 0x8b, 0x7c, 0x4a, 0xbe, 0x44, 0x80, 0x96, 0x3d,
- 0xba, 0x12, 0x1f, 0xbd, 0x3c, 0x48, 0x2d, 0xbe, 0x9e, 0xd3, 0x7b, 0xbc,
- 0x03, 0xd6, 0xa0, 0x3e, 0x64, 0x09, 0x91, 0x3d, 0x1f, 0x2b, 0x63, 0xbe,
- 0xa1, 0x18, 0x23, 0xbd, 0x24, 0x3a, 0x3e, 0xbf, 0x28, 0xc8, 0x30, 0x3e,
- 0xda, 0x8e, 0x2f, 0x3e, 0x6e, 0x82, 0xb9, 0x3d, 0x77, 0xb1, 0xb7, 0x3d,
- 0xd1, 0x3d, 0x12, 0xbe, 0x70, 0xa2, 0x19, 0xbd, 0x34, 0x5a, 0x33, 0xbe,
- 0x05, 0x4e, 0x1f, 0xbe, 0xfa, 0xc6, 0xc8, 0xbd, 0xdf, 0x1a, 0x04, 0xbe,
- 0x25, 0xf8, 0x85, 0xbe, 0xd3, 0x8b, 0x03, 0x3e, 0x60, 0xc9, 0x7f, 0x3e,
- 0x2d, 0x96, 0xf6, 0x3d, 0x2f, 0xf7, 0x28, 0xbe, 0x16, 0x44, 0x48, 0xbe,
- 0x93, 0xa2, 0x4a, 0x3c, 0xb6, 0xc6, 0x82, 0xbe, 0x04, 0x84, 0x09, 0xbe,
- 0xa1, 0xa8, 0xb5, 0xbe, 0x7e, 0x97, 0x10, 0xbe, 0x02, 0xdc, 0xb4, 0xbe,
- 0xf3, 0xe3, 0x9f, 0x3e, 0x37, 0x41, 0x89, 0x3e, 0xbf, 0xe3, 0x07, 0x3d,
- 0x0a, 0x3c, 0x1b, 0xbf, 0x2b, 0xee, 0x73, 0xbe, 0x0c, 0x46, 0x7d, 0x3e,
- 0x21, 0xb7, 0x15, 0x3e, 0x92, 0xd6, 0x5d, 0x3d, 0xb4, 0x62, 0x5c, 0xbe,
- 0x4b, 0xa8, 0xa4, 0xbe, 0xd9, 0xd5, 0xe3, 0xbe, 0x5e, 0x20, 0xa5, 0xbd,
- 0xaa, 0xeb, 0x1a, 0x3b, 0xae, 0x12, 0x6e, 0xbd, 0x99, 0x15, 0x82, 0xbe,
- 0x76, 0xc5, 0x49, 0x3d, 0x78, 0x82, 0xe4, 0xbc, 0x74, 0x4f, 0x39, 0xbe,
- 0x3f, 0x9d, 0x7e, 0x3e, 0x31, 0x33, 0xd1, 0x3c, 0x22, 0xd7, 0xfb, 0xbd,
- 0x96, 0xf4, 0x3d, 0x3d, 0xd2, 0x54, 0x0b, 0xbf, 0x9a, 0x7c, 0x7c, 0xbd,
- 0x1d, 0x53, 0x21, 0xbe, 0xb7, 0x54, 0xb5, 0x3d, 0x33, 0x03, 0xec, 0xbd,
- 0xb2, 0xea, 0x26, 0xbe, 0xe4, 0xae, 0xab, 0xbe, 0x86, 0x77, 0x02, 0xbc,
- 0x47, 0x32, 0xaa, 0xbd, 0x47, 0x49, 0xf4, 0xbe, 0x73, 0x3d, 0xdb, 0xbd,
- 0xea, 0x22, 0x66, 0x3d, 0x74, 0x18, 0x64, 0x3e, 0x8d, 0xfc, 0x46, 0xbe,
- 0x6b, 0x57, 0x0c, 0xbe, 0x18, 0xc1, 0x4c, 0xbe, 0x75, 0x64, 0x2d, 0x3e,
- 0x86, 0xac, 0xd7, 0xbd, 0x8d, 0x4b, 0x4d, 0x3e, 0x62, 0x05, 0x04, 0xbe,
- 0x9c, 0x70, 0xb1, 0xbd, 0x6f, 0x1d, 0x2c, 0xbd, 0x85, 0x7b, 0xa4, 0xbe,
- 0x7b, 0x10, 0xc4, 0xbd, 0xe7, 0x85, 0x36, 0xb9, 0x70, 0x2e, 0x8d, 0xbe,
- 0x67, 0x6c, 0x89, 0xbd, 0xdf, 0x4f, 0xb9, 0x3d, 0x99, 0xef, 0x83, 0x3e,
- 0x01, 0xce, 0xee, 0xbe, 0x89, 0xd2, 0x2b, 0xbf, 0x68, 0x42, 0x91, 0x3b,
- 0x80, 0x19, 0x3c, 0xbe, 0x30, 0x83, 0x98, 0xbe, 0xdf, 0x47, 0x96, 0xbd,
- 0x20, 0xa7, 0x64, 0xbd, 0x95, 0x52, 0x0a, 0x3e, 0x6b, 0xab, 0x32, 0x3e,
- 0x45, 0xd5, 0xc7, 0x3d, 0x71, 0xce, 0xbf, 0xbd, 0xa8, 0x8b, 0x20, 0x3c,
- 0x69, 0x74, 0x90, 0xbd, 0x86, 0x71, 0x23, 0xbe, 0xe6, 0xd1, 0x5e, 0x3e,
- 0x97, 0x1f, 0x06, 0xbe, 0xf0, 0x88, 0xd5, 0xbe, 0x8d, 0x1a, 0x19, 0xbf,
- 0x32, 0xd6, 0xc5, 0x3c, 0xd2, 0x67, 0x35, 0xbc, 0xa0, 0x51, 0xc6, 0x3c,
- 0x20, 0x15, 0xf6, 0xbe, 0x7c, 0x8c, 0x81, 0x3e, 0xd0, 0xda, 0xf9, 0x3d,
- 0xb1, 0xaf, 0xf3, 0xbd, 0x95, 0x73, 0x1f, 0xbd, 0xac, 0x5b, 0xf2, 0xbe,
- 0x50, 0x30, 0x4f, 0xba, 0x85, 0x57, 0xeb, 0x3d, 0xf1, 0xcc, 0x63, 0xbd,
- 0x83, 0x8f, 0x15, 0xbd, 0x41, 0xe5, 0xe1, 0xbd, 0xc2, 0x02, 0xa8, 0x3d,
- 0x88, 0x87, 0x7f, 0x3d, 0x38, 0x73, 0x38, 0xbe, 0x6c, 0x8e, 0x43, 0x3e,
- 0x5c, 0xab, 0xe7, 0x3d, 0x04, 0x97, 0x40, 0xbe, 0xae, 0xeb, 0xdf, 0xbe,
- 0x26, 0xeb, 0x3d, 0x3e, 0xce, 0xe1, 0xa9, 0x3d, 0x06, 0x6b, 0x9f, 0xbe,
- 0xae, 0x51, 0x14, 0x3c, 0x0a, 0x83, 0x80, 0xbd, 0x13, 0x21, 0x81, 0xbe,
- 0x21, 0xc8, 0x6c, 0xbd, 0x94, 0xb8, 0x11, 0xbe, 0xe7, 0x79, 0xa8, 0xbd,
- 0xab, 0x78, 0xe2, 0xbb, 0xd6, 0xd6, 0xe7, 0x3d, 0x70, 0x14, 0x8b, 0xbe,
- 0x39, 0x20, 0x36, 0x3e, 0xa1, 0x24, 0xc2, 0xbd, 0x3c, 0x20, 0x37, 0x3e,
- 0x84, 0xf6, 0x07, 0x3e, 0xd3, 0xa0, 0x0a, 0xbe, 0x9b, 0x7f, 0xc3, 0xbe,
- 0x7e, 0x32, 0x27, 0xbe, 0xd2, 0x90, 0x04, 0xbe, 0x06, 0x74, 0xe2, 0xbc,
- 0xde, 0xdc, 0x4a, 0xbe, 0xaf, 0xc9, 0x0b, 0xbe, 0xfc, 0x96, 0xdb, 0x3d,
- 0x5f, 0x83, 0x6f, 0x3c, 0x29, 0x18, 0xb5, 0x3d, 0x50, 0x34, 0x26, 0xbe,
- 0x3d, 0xfa, 0x7f, 0xbe, 0x54, 0x49, 0x0c, 0x3e, 0x7e, 0x5a, 0x80, 0xbe,
- 0x07, 0x41, 0x06, 0xbd, 0x5e, 0x35, 0xd1, 0x3d, 0x0d, 0x6f, 0xce, 0xbc,
- 0x43, 0x6a, 0x41, 0x3e, 0x53, 0xb8, 0x66, 0x3d, 0xd6, 0x25, 0x15, 0x3e,
- 0x80, 0x67, 0x0e, 0xbd, 0x6f, 0x7b, 0xe4, 0x3d, 0x2f, 0x98, 0x94, 0xbd,
- 0x9e, 0x33, 0x45, 0xbe, 0x60, 0x2c, 0xeb, 0xbd, 0xf7, 0x27, 0x71, 0xbe,
- 0x80, 0xa3, 0xbc, 0xbd, 0x2c, 0xed, 0xbd, 0xbb, 0x16, 0xee, 0x82, 0xbd,
- 0x28, 0x58, 0xc7, 0xbd, 0x84, 0x9f, 0x67, 0x3d, 0x51, 0xe6, 0x23, 0xbe,
- 0x2a, 0x1b, 0x90, 0xbe, 0x0a, 0x1d, 0x2d, 0x3d, 0xf7, 0x82, 0x16, 0x3b,
- 0x56, 0xc9, 0x81, 0xbe, 0xd7, 0x3f, 0xce, 0x3d, 0xfa, 0x84, 0x4e, 0xbd,
- 0x0d, 0xc4, 0x03, 0xbe, 0xa0, 0x01, 0x5b, 0x3e, 0xb8, 0xea, 0x13, 0xbe,
- 0x89, 0xdb, 0x93, 0x3d, 0xb8, 0xd6, 0x5d, 0xbd, 0x5d, 0x21, 0xab, 0xbd,
- 0x25, 0x79, 0x48, 0xbe, 0x68, 0x99, 0x1b, 0x3e, 0xf8, 0xee, 0x56, 0xbe,
- 0x83, 0x1c, 0x17, 0xbd, 0xfa, 0x21, 0xa0, 0xbb, 0xc0, 0xda, 0x91, 0x3c,
- 0xc9, 0xe3, 0x33, 0xbe, 0x16, 0x19, 0x55, 0xbc, 0xf5, 0xc4, 0xa9, 0xbd,
- 0x23, 0x2e, 0xc8, 0xbc, 0x53, 0xf9, 0xde, 0xbc, 0x65, 0x3e, 0x5b, 0x3d,
- 0x84, 0x3d, 0x37, 0xbc, 0x3c, 0x09, 0x25, 0xbe, 0x3e, 0x62, 0x80, 0xbd,
- 0xd0, 0x2d, 0x5d, 0xbe, 0x43, 0x5f, 0xfa, 0xbd, 0x0a, 0x48, 0xc2, 0xbb,
- 0x25, 0x8c, 0x51, 0x3c, 0x31, 0x81, 0xe2, 0xbd, 0x80, 0x61, 0xef, 0x3d,
- 0x97, 0x98, 0xb8, 0xbe, 0x5b, 0x25, 0xc7, 0x3c, 0xad, 0x70, 0x92, 0xbd,
- 0x4c, 0x19, 0x31, 0xbd, 0x64, 0x89, 0x81, 0xbd, 0x92, 0xca, 0xdc, 0xbd,
- 0xd0, 0x91, 0x9d, 0x3d, 0x92, 0x0b, 0xad, 0xbe, 0x24, 0x23, 0xa3, 0x3c,
- 0x5f, 0x28, 0xbb, 0xbd, 0x4d, 0xc8, 0x2e, 0xbe, 0xaf, 0xa3, 0x03, 0x3e,
- 0x19, 0x44, 0x91, 0x3d, 0x3b, 0xba, 0x14, 0x3e, 0x9e, 0x69, 0xce, 0x3d,
- 0x6e, 0x49, 0xc8, 0x3d, 0xd7, 0xeb, 0x47, 0x3e, 0xe1, 0x1d, 0x2c, 0x3c,
- 0x49, 0x6f, 0x66, 0xbd, 0x97, 0xce, 0xd9, 0xbd, 0x1b, 0x6a, 0x4e, 0x3d,
- 0x88, 0x7e, 0x3f, 0x3e, 0xd6, 0xa6, 0x2a, 0xbd, 0xf0, 0xb1, 0x49, 0xbd,
- 0x88, 0x8a, 0x54, 0xbe, 0x53, 0x03, 0xc6, 0x3c, 0xbd, 0x6d, 0xf2, 0x3c,
- 0xec, 0x5f, 0x7d, 0xbd, 0x7c, 0xb4, 0x93, 0xbe, 0x2a, 0x55, 0x18, 0xbd,
- 0x2e, 0xe7, 0x41, 0x3b, 0x72, 0xe3, 0x02, 0xbe, 0x71, 0x77, 0xa5, 0x3c,
- 0x7e, 0x4b, 0xe7, 0xbd, 0xf2, 0xf0, 0xd2, 0xbe, 0x7a, 0x68, 0x06, 0xbe,
- 0x00, 0x21, 0xa3, 0x3c, 0xc6, 0xe4, 0x17, 0xbe, 0xa5, 0x57, 0x86, 0x3d,
- 0x5a, 0xf9, 0x84, 0x3e, 0x85, 0x1d, 0x23, 0x3e, 0x2a, 0xd0, 0xe5, 0xbd,
- 0xe6, 0x89, 0x29, 0xbe, 0x15, 0x60, 0x25, 0xbc, 0x8f, 0xc6, 0xf5, 0xbe,
- 0x2f, 0x46, 0x4b, 0x3e, 0x28, 0x83, 0x85, 0xbc, 0x54, 0x73, 0xa2, 0x3d,
- 0x30, 0xdf, 0xe6, 0xbd, 0xe4, 0xca, 0x1f, 0x3e, 0xe5, 0xde, 0x93, 0x3b,
- 0x42, 0x20, 0x67, 0xbe, 0x4b, 0xe2, 0x1c, 0x3e, 0xf5, 0xf9, 0x10, 0x3d,
- 0xac, 0x93, 0xb0, 0xbc, 0x07, 0x17, 0xd7, 0x3d, 0x02, 0x61, 0x14, 0x3e,
- 0xf7, 0x9f, 0x9b, 0xbb, 0x7a, 0x81, 0x87, 0xba, 0x05, 0x42, 0x5d, 0xbc,
- 0x11, 0x93, 0x48, 0x3e, 0xa0, 0x83, 0x75, 0x3d, 0x67, 0x8d, 0x8e, 0xbe,
- 0xa8, 0x67, 0xb2, 0xbc, 0xf5, 0x6b, 0x9b, 0x3d, 0x07, 0x84, 0x6c, 0xbd,
- 0xd2, 0x71, 0x90, 0xbd, 0x05, 0xe8, 0x5a, 0xbe, 0xe6, 0x27, 0xa0, 0xbd,
- 0x62, 0x32, 0x2e, 0x3e, 0xd1, 0x71, 0x2a, 0x3d, 0x00, 0x55, 0x8a, 0xbc,
- 0xb3, 0xc5, 0x21, 0xbe, 0xef, 0x83, 0x10, 0xbe, 0x24, 0x6d, 0xa3, 0x3d,
- 0xaa, 0xe1, 0x3f, 0xbc, 0x99, 0x8c, 0x7c, 0x3d, 0x66, 0x76, 0x25, 0xbe,
- 0x42, 0x10, 0x14, 0xbe, 0x9e, 0x19, 0x34, 0x3b, 0xfc, 0x94, 0x14, 0xbe,
- 0xa5, 0x0b, 0x50, 0x3e, 0x54, 0x27, 0xdf, 0xbd, 0x27, 0x8a, 0x0c, 0xbe,
- 0xab, 0x88, 0xbc, 0xbd, 0x39, 0x4f, 0xe0, 0xbb, 0xe1, 0x58, 0xec, 0xbd,
- 0x8a, 0xb0, 0x3a, 0xbd, 0xd3, 0x49, 0xae, 0x3d, 0x29, 0xf9, 0x06, 0x3e,
- 0x4d, 0x87, 0xf2, 0xbc, 0x15, 0xf7, 0x90, 0xbd, 0x41, 0x5f, 0xcb, 0xbd,
- 0xc0, 0x73, 0xca, 0xbd, 0xe0, 0xe6, 0x21, 0x3d, 0xe9, 0x6f, 0xbb, 0x3d,
- 0x23, 0x77, 0x21, 0x3e, 0x79, 0x98, 0x2a, 0x3c, 0xcc, 0x84, 0x2c, 0xbd,
- 0x5c, 0xbb, 0x3d, 0xbe, 0x7d, 0xe7, 0x75, 0x3d, 0xfd, 0xd1, 0x85, 0xbe,
- 0x4b, 0x40, 0x0f, 0xbe, 0x0f, 0x5d, 0x54, 0x3e, 0xc4, 0x4e, 0x63, 0x3c,
- 0xe7, 0x46, 0x30, 0x3e, 0xe9, 0x0f, 0xc6, 0xbc, 0xc1, 0x9d, 0x42, 0xbc,
- 0x25, 0x4a, 0xc2, 0x3d, 0x93, 0x8a, 0x01, 0xbe, 0x1d, 0x4c, 0xcc, 0xbd,
- 0xa5, 0x3f, 0x80, 0x3b, 0x18, 0x03, 0xf8, 0xbc, 0xa7, 0x42, 0x8b, 0x3c,
- 0xe1, 0x97, 0x43, 0x3e, 0xe1, 0xd9, 0x96, 0xbd, 0x80, 0x3e, 0x52, 0xbd,
- 0x3d, 0x92, 0x59, 0xbd, 0xcd, 0x94, 0x8a, 0xbd, 0xc9, 0x1a, 0xcb, 0x3a,
- 0x54, 0x0a, 0x3e, 0xbd, 0x0d, 0xa5, 0xee, 0xbd, 0x42, 0xa5, 0x65, 0x3d,
- 0x5a, 0xd1, 0x55, 0xbd, 0x24, 0x21, 0x6d, 0xbe, 0x33, 0xa2, 0x49, 0xbe,
- 0x5c, 0xb3, 0x0f, 0xbe, 0xd4, 0x5b, 0x66, 0xbe, 0x6a, 0x81, 0x5b, 0xbd,
- 0xc8, 0xa8, 0x49, 0x3e, 0x73, 0x5b, 0x1b, 0xbe, 0xdb, 0x4e, 0x6f, 0xbe,
- 0xe8, 0x64, 0x7d, 0xbe, 0x99, 0x64, 0x90, 0xbd, 0x40, 0x3b, 0x8f, 0xbd,
- 0x9a, 0xf0, 0x00, 0x3e, 0x1b, 0x82, 0xfa, 0x3d, 0x2e, 0x20, 0x07, 0xbd,
- 0x7b, 0x36, 0x75, 0xbe, 0xe3, 0x19, 0xfd, 0x3b, 0x63, 0x7a, 0x67, 0x3c,
- 0xf0, 0x74, 0xcc, 0x3d, 0x6e, 0xd6, 0x6f, 0xbe, 0x96, 0x7f, 0x31, 0x3e,
- 0xe0, 0xe1, 0x73, 0xbd, 0xf6, 0xea, 0xe0, 0xbd, 0x83, 0xc1, 0xcc, 0xbd,
- 0xec, 0x64, 0x8e, 0x3d, 0x64, 0xac, 0x24, 0xbd, 0xab, 0x35, 0x1e, 0xbe,
- 0xd5, 0x30, 0x70, 0x3c, 0xe3, 0x5f, 0xf0, 0x3d, 0x65, 0xb0, 0x17, 0xbe,
- 0x74, 0x4f, 0x34, 0xbe, 0x5f, 0xcf, 0x92, 0xbc, 0x3e, 0x67, 0xd5, 0xbd,
- 0x65, 0x4a, 0xe4, 0xbc, 0x2a, 0x81, 0xd4, 0x3d, 0xc9, 0x3f, 0x1e, 0xbe,
- 0x27, 0xa1, 0xc3, 0xbd, 0x55, 0x92, 0x72, 0xbd, 0xcc, 0x90, 0xdf, 0xbe,
- 0x8d, 0x57, 0x29, 0xbe, 0xa8, 0xf7, 0x6b, 0xbd, 0xab, 0x23, 0x4a, 0xbd,
- 0x20, 0x9e, 0x84, 0xbe, 0x17, 0x1d, 0xb6, 0x3d, 0x63, 0x75, 0xe3, 0x3d,
- 0xee, 0x50, 0xc9, 0x3d, 0x87, 0xbf, 0x6b, 0x3d, 0x38, 0xd5, 0x8c, 0xbe,
- 0x62, 0x40, 0x5f, 0xbe, 0xaa, 0xd4, 0x5a, 0xbb, 0xcc, 0xc2, 0x94, 0xbd,
- 0xfd, 0x4c, 0x98, 0x3e, 0xe6, 0x56, 0x6c, 0xbc, 0x2a, 0x6d, 0x02, 0x3e,
- 0xc8, 0xc6, 0xa7, 0x39, 0xa3, 0xd7, 0x03, 0x3d, 0x7c, 0xc3, 0x47, 0x3d,
- 0x81, 0xfb, 0x38, 0xbd, 0xf9, 0xb3, 0x10, 0x3d, 0xb1, 0x2d, 0x4c, 0xbe,
- 0xb7, 0xba, 0x61, 0xbe, 0xec, 0x0d, 0x0d, 0xbc, 0x36, 0xee, 0x94, 0xbe,
- 0x2c, 0xf2, 0x28, 0xbe, 0xb3, 0xc2, 0x88, 0xbe, 0x23, 0xe0, 0x83, 0x3d,
- 0x48, 0x79, 0xff, 0xbd, 0xa7, 0xcd, 0x27, 0x3e, 0x20, 0x5c, 0x29, 0x3d,
- 0xcf, 0x11, 0x41, 0x3c, 0x02, 0xb2, 0x02, 0x3e, 0xfb, 0x28, 0x93, 0xbc,
- 0x56, 0xc2, 0x61, 0xbc, 0x65, 0x8d, 0xf6, 0xbc, 0xf9, 0x71, 0x1d, 0x39,
- 0x6e, 0x5d, 0xf7, 0xbc, 0xbc, 0xe3, 0xc0, 0x3d, 0x93, 0xde, 0x9d, 0xbd,
- 0x0e, 0xa7, 0x63, 0xbe, 0xa3, 0x16, 0x83, 0xbe, 0x9c, 0x5c, 0xa5, 0xbd,
- 0xbe, 0x14, 0x6f, 0xbd, 0x60, 0xa0, 0x1b, 0x3e, 0x1b, 0xc7, 0xf7, 0xbd,
- 0xa2, 0xcd, 0x63, 0x3d, 0x27, 0x5e, 0xf4, 0xbd, 0x39, 0x63, 0x1b, 0xbd,
- 0x8d, 0xc9, 0x5f, 0xbd, 0x7f, 0x44, 0xbd, 0xbd, 0x10, 0x96, 0x05, 0xbe,
- 0x7d, 0xcf, 0x05, 0x3d, 0x3d, 0x52, 0xdb, 0xbd, 0xdb, 0x1c, 0x92, 0xbc,
- 0x7d, 0x5f, 0xfa, 0xbd, 0x98, 0xfe, 0x4b, 0x3e, 0xe6, 0xcc, 0xd6, 0xbd,
- 0xcd, 0x2d, 0x18, 0xbe, 0x69, 0x41, 0xa2, 0xbe, 0xf6, 0xb2, 0xa8, 0x3d,
- 0xa8, 0xf0, 0x69, 0xbe, 0xe3, 0xa6, 0xee, 0x3d, 0x3c, 0x23, 0x7b, 0x3e,
- 0x06, 0x20, 0xce, 0xbe, 0x30, 0x26, 0x0a, 0x3e, 0x77, 0x76, 0x14, 0xbe,
- 0x8d, 0x84, 0x52, 0x3e, 0x7b, 0x28, 0x7b, 0xbd, 0x69, 0x21, 0x91, 0xbd,
- 0xb0, 0xf9, 0x3c, 0x3e, 0x7f, 0xd1, 0xea, 0xbd, 0x8e, 0xe2, 0x41, 0xbe,
- 0x76, 0x79, 0x45, 0x3d, 0xdd, 0x99, 0x90, 0x3d, 0x73, 0x27, 0x2f, 0xbc,
- 0x88, 0x2e, 0xe1, 0x3d, 0x6c, 0x17, 0x1d, 0xbe, 0xda, 0xb9, 0xb8, 0xbc,
- 0xf2, 0xe5, 0xcd, 0x3e, 0x97, 0x91, 0x9c, 0x3e, 0x58, 0x5b, 0x4f, 0xbe,
- 0x38, 0xdf, 0x8c, 0xbe, 0xe3, 0x46, 0x25, 0x3e, 0x75, 0xd7, 0xcd, 0x3c,
- 0x0a, 0x2d, 0xef, 0x3e, 0x2c, 0xe7, 0x3a, 0xbe, 0x00, 0xc0, 0xfc, 0xbd,
- 0x6b, 0x49, 0xfc, 0xbc, 0xd5, 0xbb, 0x6a, 0xbe, 0xc6, 0x05, 0x10, 0xbd,
- 0x64, 0x04, 0x23, 0xbe, 0x0f, 0x07, 0x23, 0x3d, 0x2d, 0x04, 0x68, 0x3e,
- 0x37, 0x1a, 0x85, 0xbe, 0xbb, 0xec, 0xed, 0x3d, 0x12, 0x18, 0x3a, 0xbe,
- 0xbe, 0xba, 0x11, 0xbe, 0x2b, 0x45, 0x37, 0xbe, 0x88, 0x7b, 0x21, 0xbe,
- 0xe2, 0xdb, 0x8a, 0x3e, 0x42, 0x2e, 0x8a, 0xbd, 0xfc, 0x89, 0x61, 0xbe,
- 0x0a, 0xc8, 0x6e, 0x3d, 0x95, 0x00, 0x7c, 0xbc, 0x9c, 0x16, 0x90, 0x3d,
- 0xc4, 0x08, 0x88, 0x3c, 0xbf, 0x0e, 0x03, 0xbc, 0xb7, 0xa5, 0x9d, 0x3d,
- 0x95, 0xea, 0x63, 0xbd, 0xa0, 0xd2, 0xa6, 0xbe, 0x08, 0x99, 0xd7, 0x3d,
- 0x33, 0x89, 0xd6, 0x3d, 0xcd, 0x18, 0x1b, 0xbe, 0xf2, 0x30, 0xe8, 0xbe,
- 0xc4, 0x65, 0x59, 0xbd, 0x49, 0x9e, 0x68, 0x3e, 0xad, 0xae, 0xbb, 0x3d,
- 0x53, 0xaf, 0x67, 0x3e, 0x7e, 0x48, 0xf0, 0xbc, 0xb7, 0x70, 0xdb, 0xbb,
- 0xea, 0x24, 0x21, 0xbd, 0x42, 0xba, 0xb5, 0x3d, 0x7c, 0xf9, 0x3a, 0x3d,
- 0xd4, 0xf9, 0x1b, 0xbe, 0xc0, 0x74, 0x02, 0x3d, 0x17, 0x25, 0xb5, 0x3d,
- 0x69, 0x40, 0x6d, 0x3e, 0xb6, 0x84, 0xb8, 0x3e, 0xfb, 0x86, 0x24, 0x3e,
- 0x71, 0xa9, 0x9b, 0xbd, 0x6f, 0x2f, 0xa6, 0x3d, 0x66, 0xb8, 0x80, 0xbd,
- 0xba, 0xdb, 0x34, 0x3e, 0x49, 0x1d, 0xe5, 0xbd, 0x6f, 0x27, 0xb2, 0xba,
- 0x6e, 0x26, 0x87, 0x3d, 0xc7, 0xd0, 0x82, 0xbe, 0x67, 0x65, 0x94, 0xbe,
- 0x9a, 0xc9, 0xc4, 0xbd, 0x3e, 0xb2, 0x30, 0xbe, 0xa4, 0x54, 0xa1, 0x3b,
- 0x05, 0x65, 0x14, 0x3d, 0x4a, 0x60, 0x89, 0xbe, 0xef, 0x78, 0x3d, 0xbe,
- 0x41, 0xa2, 0x19, 0x3e, 0x45, 0x92, 0x86, 0x3b, 0x98, 0x4a, 0xe1, 0xbd,
- 0xc7, 0x1a, 0x6d, 0xbd, 0xee, 0x44, 0x85, 0xbc, 0xf5, 0x99, 0x45, 0x3e,
- 0x85, 0xe7, 0x5b, 0xbe, 0xdc, 0xe6, 0x14, 0xbe, 0xe1, 0x7f, 0x95, 0xbd,
- 0x18, 0x59, 0x9a, 0xbc, 0x3a, 0xd8, 0x1a, 0x3e, 0xcb, 0x71, 0xfb, 0xbd,
- 0x71, 0x09, 0x14, 0x3e, 0xb9, 0x75, 0xa1, 0x3e, 0x57, 0x33, 0x37, 0x3e,
- 0xd5, 0x31, 0x2c, 0xbd, 0x2c, 0x0f, 0x8e, 0xbd, 0x6e, 0xc4, 0x55, 0xbe,
- 0x11, 0x55, 0x80, 0x3e, 0x94, 0x76, 0x16, 0xbe, 0x44, 0xa8, 0x14, 0xbe,
- 0xe0, 0xf5, 0xed, 0x3d, 0x1d, 0x67, 0x27, 0x3e, 0x71, 0x6d, 0x09, 0x3d,
- 0xaa, 0x79, 0xad, 0x3c, 0xb3, 0x98, 0x57, 0x3d, 0xc9, 0x5b, 0xe4, 0xbe,
- 0xb8, 0xce, 0xa0, 0xbd, 0xd0, 0x95, 0x3b, 0xbe, 0xd8, 0xe5, 0x09, 0x3e,
- 0xcd, 0x14, 0x0e, 0xbe, 0xd0, 0xd9, 0x74, 0xbd, 0xb9, 0x3a, 0x7c, 0xbe,
- 0x8f, 0x85, 0xee, 0x3d, 0x62, 0xcc, 0x98, 0xbc, 0xb9, 0xd6, 0xb0, 0xbe,
- 0x09, 0x74, 0x0c, 0xbe, 0x49, 0x9c, 0x76, 0xbe, 0x57, 0x59, 0x47, 0xbe,
- 0x84, 0xd6, 0xb0, 0x3d, 0x15, 0xb3, 0x58, 0x3e, 0xf6, 0xb2, 0x01, 0x3e,
- 0x08, 0x19, 0x8a, 0x3c, 0x86, 0xe1, 0x1c, 0x3e, 0xee, 0xc1, 0x58, 0xbe,
- 0x04, 0x71, 0xbc, 0x3c, 0xce, 0x8b, 0x64, 0xbe, 0xea, 0xf6, 0x2f, 0xbd,
- 0x6d, 0x5f, 0x79, 0xbc, 0x4b, 0x21, 0xc5, 0xbd, 0x06, 0xe9, 0x6a, 0x3e,
- 0x67, 0x96, 0xa4, 0x3d, 0xb4, 0xad, 0xb0, 0xbd, 0x39, 0xea, 0x81, 0x3c,
- 0x05, 0xbd, 0xa5, 0xbd, 0xca, 0x4e, 0x5a, 0xbe, 0x0d, 0x64, 0xda, 0x3d,
- 0x67, 0x62, 0x09, 0xbe, 0x40, 0xcd, 0x64, 0xbe, 0x72, 0xe9, 0x04, 0xbe,
- 0x16, 0x6a, 0x38, 0x3e, 0xa5, 0xc9, 0x50, 0xbe, 0xd0, 0x60, 0xab, 0xbe,
- 0xeb, 0xc0, 0x80, 0x3d, 0xe4, 0xba, 0x05, 0x3e, 0xae, 0xca, 0x8d, 0xbe,
- 0x72, 0x97, 0x15, 0x3e, 0xca, 0x53, 0x65, 0x3c, 0x1a, 0xee, 0xb2, 0xbd,
- 0xd2, 0x88, 0x20, 0xbe, 0x55, 0x8e, 0x3e, 0xbe, 0xa8, 0x4e, 0x35, 0xbe,
- 0x78, 0x88, 0xcd, 0x3c, 0xe3, 0x28, 0x87, 0x3c, 0xef, 0xa8, 0x1d, 0xbd,
- 0xed, 0x82, 0xfa, 0x3d, 0x96, 0x57, 0x15, 0xbe, 0x16, 0x30, 0x05, 0x3d,
- 0x8a, 0x6b, 0x95, 0xbd, 0x17, 0x2a, 0x9e, 0x3d, 0xf9, 0xa2, 0x9d, 0xbd,
- 0x2d, 0x5c, 0x8b, 0xbd, 0xee, 0x6a, 0x08, 0xbf, 0xd0, 0x11, 0x13, 0xbe,
- 0x78, 0x17, 0x95, 0xbd, 0x1e, 0x03, 0xdf, 0xbd, 0xdb, 0xcf, 0xbd, 0x3b,
- 0x9f, 0x66, 0xc5, 0xbc, 0x01, 0xd1, 0x8e, 0xbe, 0x58, 0x1b, 0x1c, 0xbe,
- 0x27, 0x08, 0x77, 0xbe, 0xa4, 0xc0, 0x73, 0xbe, 0x66, 0x26, 0x80, 0xbd,
- 0xc3, 0x58, 0xd8, 0xbe, 0x78, 0xce, 0xb1, 0x3c, 0xd0, 0xb0, 0x3e, 0xbf,
- 0xe6, 0x5a, 0xbe, 0xbd, 0x5e, 0xb1, 0xd4, 0xbe, 0xb7, 0xd6, 0xfd, 0xbc,
- 0xb9, 0x25, 0x8a, 0x3c, 0x5b, 0x9c, 0x33, 0xbe, 0xfd, 0xbb, 0x36, 0xbe,
- 0x7a, 0xf9, 0x90, 0x3d, 0xa3, 0xcb, 0x4c, 0xbe, 0x72, 0x83, 0x4b, 0x3d,
- 0xc7, 0xb5, 0x4e, 0xbe, 0xc2, 0x91, 0x1d, 0xbe, 0xea, 0x53, 0x04, 0x3e,
- 0x56, 0x7c, 0x8b, 0xbd, 0xe9, 0x08, 0x92, 0x3d, 0x93, 0x84, 0x8d, 0x3d,
- 0xcf, 0x47, 0x7a, 0xbe, 0x73, 0xfb, 0xb7, 0xbd, 0x73, 0xef, 0x27, 0x39,
- 0x5a, 0xab, 0x65, 0x3b, 0x08, 0x92, 0xc8, 0x3d, 0x69, 0xc6, 0xb3, 0xbd,
- 0x0f, 0xc5, 0x8c, 0xbd, 0x34, 0xfa, 0x97, 0xbd, 0xf7, 0xc7, 0xb0, 0xbe,
- 0x62, 0x18, 0x91, 0xbd, 0x8c, 0xfc, 0x14, 0xbe, 0xa4, 0xcc, 0xe9, 0xbe,
- 0xba, 0x89, 0x9d, 0xbe, 0xd4, 0x91, 0x92, 0x3e, 0x6d, 0xa2, 0x95, 0x3e,
- 0xbb, 0xca, 0x26, 0x3e, 0xb1, 0xc1, 0x03, 0xbe, 0x8b, 0x8f, 0x86, 0xbd,
- 0x44, 0x67, 0x3d, 0x3d, 0x92, 0xbc, 0xc0, 0xbd, 0xba, 0xfe, 0x83, 0xbd,
- 0x51, 0x18, 0x10, 0x3d, 0x33, 0xda, 0xaf, 0xbe, 0x97, 0xfe, 0xc6, 0xbe,
- 0x59, 0x07, 0x4f, 0x3d, 0x07, 0xe9, 0xf4, 0x3d, 0xa6, 0x2f, 0x90, 0xbe,
- 0x12, 0x66, 0x93, 0xbe, 0xcd, 0xa8, 0xa0, 0x3b, 0x60, 0xbf, 0x4f, 0xbe,
- 0xe3, 0x76, 0x60, 0xbd, 0x2e, 0xb0, 0x62, 0x3e, 0x3f, 0xce, 0x86, 0x3d,
- 0xea, 0x00, 0x26, 0xbe, 0x5d, 0xb7, 0x12, 0x3e, 0xd0, 0xe7, 0xdd, 0x3c,
- 0x5f, 0x79, 0x99, 0x3d, 0xa6, 0xa9, 0x0c, 0x3d, 0x21, 0x98, 0x3a, 0xbe,
- 0x5c, 0x51, 0xd3, 0xbe, 0x8a, 0x08, 0x4e, 0x3e, 0xa8, 0x62, 0xf7, 0xbd,
- 0x75, 0x2d, 0x1d, 0x3d, 0x14, 0x4a, 0xb5, 0xbd, 0xe2, 0xf4, 0x1a, 0x3e,
- 0x59, 0x2a, 0xbe, 0x3c, 0x55, 0x0e, 0x80, 0x3e, 0x1d, 0x02, 0x9c, 0xbe,
- 0x0d, 0x1b, 0x4d, 0x3e, 0xce, 0x15, 0xef, 0xbe, 0x19, 0x99, 0xe2, 0xbd,
- 0x20, 0xba, 0x4a, 0xbe, 0xec, 0x32, 0x28, 0xbd, 0xaf, 0x3f, 0xa6, 0x3d,
- 0x5f, 0xcd, 0x49, 0xbe, 0x17, 0x7b, 0xb9, 0x3c, 0x50, 0x39, 0xfd, 0x3d,
- 0x89, 0x49, 0x36, 0xbe, 0x3f, 0x24, 0xf7, 0x3d, 0x1e, 0xdc, 0x54, 0xbe,
- 0xc5, 0x9d, 0xaf, 0xbd, 0xee, 0xb5, 0xcc, 0x3d, 0x64, 0x88, 0xf8, 0xbe,
- 0x43, 0xed, 0x68, 0xbe, 0xe5, 0x68, 0x09, 0xbc, 0x2b, 0xda, 0xec, 0x3d,
- 0xe3, 0x48, 0x93, 0x3e, 0xc6, 0x35, 0x31, 0x3d, 0x1a, 0x47, 0x9c, 0x3d,
- 0xe1, 0x5c, 0x80, 0xbe, 0x6e, 0x74, 0x09, 0x3d, 0xe8, 0x74, 0x95, 0xbe,
- 0xe7, 0x4e, 0xce, 0xbe, 0x4d, 0xf7, 0xf8, 0xbd, 0x50, 0xb0, 0x6d, 0xbe,
- 0x06, 0x52, 0x7c, 0xbe, 0x23, 0xcb, 0xe0, 0xbd, 0x81, 0xe8, 0x8c, 0xbe,
- 0x9b, 0x45, 0x6e, 0x3d, 0xbe, 0xc5, 0xb2, 0x3b, 0x14, 0x95, 0xe0, 0x3a,
- 0x7a, 0x58, 0x97, 0x3e, 0x49, 0xa1, 0x50, 0xbe, 0xc5, 0x5a, 0x9a, 0x3d,
- 0xf3, 0x9b, 0xc1, 0xbe, 0xb9, 0x93, 0x69, 0x3c, 0xea, 0x6d, 0xac, 0x3d,
- 0xf2, 0x30, 0xf3, 0x3d, 0x3b, 0x47, 0x00, 0xbe, 0x9c, 0xfc, 0xe2, 0xbb,
- 0x61, 0x1f, 0x12, 0xbe, 0x3b, 0xbf, 0x1d, 0xbe, 0x4a, 0x66, 0x5a, 0x3d,
- 0xdc, 0xd3, 0x55, 0xbc, 0xa9, 0xea, 0x87, 0x3e, 0x52, 0x78, 0xb7, 0x3d,
- 0x3f, 0x4b, 0xe7, 0xbe, 0x9e, 0x47, 0x7b, 0xbe, 0x4b, 0xa7, 0x0a, 0x3e,
- 0xca, 0x0d, 0x0d, 0x3d, 0x42, 0x81, 0xb3, 0xbe, 0x5c, 0x1c, 0x94, 0x3e,
- 0x87, 0xad, 0xc2, 0x3d, 0xef, 0x79, 0xb3, 0xbe, 0xae, 0x51, 0x24, 0xbd,
- 0xbb, 0xa0, 0x55, 0xbe, 0xa0, 0x77, 0xc0, 0x3e, 0x0f, 0xcf, 0x88, 0xbd,
- 0xc2, 0x08, 0x45, 0xbe, 0x20, 0x12, 0x1e, 0xbd, 0x8a, 0x67, 0x73, 0xbb,
- 0x1e, 0xca, 0xe9, 0xbe, 0x2d, 0x59, 0x49, 0xbf, 0x00, 0x58, 0x39, 0xbe,
- 0xb1, 0x48, 0x29, 0xbe, 0x7c, 0x2f, 0xf9, 0xbd, 0xfa, 0x76, 0x97, 0xbe,
- 0xf5, 0x7b, 0xc1, 0x3d, 0x9c, 0x30, 0x13, 0x3d, 0xf0, 0x26, 0x94, 0xbe,
- 0xff, 0x35, 0x84, 0x3c, 0x58, 0xd2, 0xcf, 0xbd, 0xe4, 0x5e, 0xd4, 0x3e,
- 0x4b, 0xb3, 0xdd, 0xbe, 0x5e, 0x19, 0xb9, 0x38, 0xb4, 0x96, 0x0b, 0x3e,
- 0xe1, 0x0e, 0x19, 0xbe, 0x47, 0x88, 0xf4, 0xbd, 0xb9, 0x02, 0x92, 0x3e,
- 0xf7, 0xb1, 0xb3, 0xbb, 0x2c, 0x90, 0x18, 0xbe, 0xbc, 0x05, 0x30, 0xbe,
- 0x72, 0x85, 0x8c, 0x3e, 0xd0, 0x08, 0x2c, 0xbe, 0xc9, 0x21, 0x0e, 0x3e,
- 0x36, 0xbb, 0x4a, 0xbe, 0x5e, 0x48, 0x7a, 0xbe, 0x65, 0x21, 0x8c, 0x3d,
- 0xc1, 0x90, 0x3e, 0x3d, 0x9a, 0x6c, 0x2a, 0xbe, 0x3c, 0xa3, 0x8d, 0xbd,
- 0xf3, 0xc7, 0xcb, 0xbd, 0xa8, 0xc6, 0x40, 0x3e, 0x3c, 0x01, 0xa9, 0xbc,
- 0x6e, 0xb2, 0x6f, 0xbe, 0x63, 0x68, 0x62, 0x3d, 0x21, 0xcb, 0x0c, 0xbe,
- 0xfe, 0x08, 0x01, 0xbe, 0x0b, 0xef, 0x0d, 0xbc, 0x2b, 0x34, 0xcd, 0x3d,
- 0xc0, 0x1d, 0xd7, 0xbc, 0x28, 0xaf, 0x8a, 0x3e, 0xfa, 0x23, 0x9f, 0xbc,
- 0x96, 0xdb, 0x2a, 0xbe, 0xc5, 0x6f, 0xb2, 0x3e, 0x4e, 0x0c, 0x9f, 0x3e,
- 0x6e, 0x64, 0x9b, 0x3e, 0x4b, 0x23, 0xc1, 0xbd, 0x06, 0xee, 0xf6, 0xbe,
- 0xe6, 0xdf, 0x59, 0xbe, 0x7f, 0xc5, 0x0b, 0x3e, 0xb2, 0x88, 0x73, 0x3e,
- 0x37, 0xb2, 0xef, 0xbd, 0x78, 0xf7, 0x40, 0xbd, 0x73, 0x74, 0x06, 0xbf,
- 0x46, 0xb6, 0x85, 0x3e, 0x6a, 0xd1, 0x16, 0x3e, 0x0d, 0xae, 0xcb, 0x3d,
- 0x15, 0xc8, 0x26, 0x3e, 0xeb, 0xb4, 0x6b, 0xbd, 0xb9, 0xd9, 0xd3, 0xbd,
- 0xe7, 0xd6, 0x60, 0xbe, 0x0f, 0xb4, 0x9b, 0xbe, 0xc3, 0xe2, 0x3b, 0x3e,
- 0xb8, 0xa4, 0xe3, 0xbd, 0x05, 0x6e, 0x18, 0x3d, 0xa5, 0xb2, 0xdb, 0x3c,
- 0xd8, 0x79, 0x24, 0xbe, 0x41, 0x0b, 0x6a, 0xbe, 0x70, 0x44, 0x59, 0xbe,
- 0x29, 0x7a, 0xfb, 0xbd, 0xf3, 0xc7, 0xef, 0xbe, 0x73, 0xd8, 0x49, 0xbe,
- 0x3e, 0xe7, 0xeb, 0xbe, 0xf7, 0x6b, 0x14, 0xbc, 0xff, 0x6e, 0x55, 0xbe,
- 0xa1, 0x20, 0x5f, 0xbd, 0x80, 0xce, 0xc6, 0xbd, 0x31, 0xcb, 0x9a, 0xbd,
- 0xd1, 0xbf, 0xaf, 0x3d, 0x2f, 0x90, 0x91, 0xbe, 0xe6, 0x6e, 0xe6, 0xbd,
- 0xe0, 0xe0, 0x10, 0x3e, 0x7c, 0x79, 0xe4, 0xbc, 0x65, 0xc0, 0x1a, 0x3e,
- 0xcf, 0xd9, 0x1b, 0xbe, 0xbf, 0xe6, 0x04, 0xbd, 0xf0, 0xfb, 0x40, 0x3e,
- 0x24, 0x32, 0x2c, 0xbe, 0x63, 0xee, 0x0c, 0xbd, 0xa5, 0xa9, 0xf8, 0xbe,
- 0xf5, 0xdf, 0xe6, 0xbd, 0x1a, 0x75, 0xa6, 0xbd, 0xd5, 0xf0, 0xdb, 0x3d,
- 0x59, 0xc8, 0x9e, 0xbe, 0xc7, 0x74, 0x72, 0x3e, 0xc5, 0x54, 0xe6, 0xbd,
- 0x48, 0xb6, 0x31, 0x3e, 0xac, 0x60, 0x67, 0x3e, 0x92, 0x19, 0xec, 0xbe,
- 0x5e, 0x8b, 0x87, 0xbd, 0xc8, 0xb7, 0x31, 0xbe, 0xf8, 0x77, 0x30, 0xbd,
- 0x0b, 0x79, 0x4f, 0x3b, 0x49, 0xed, 0x41, 0xbd, 0xdd, 0xd0, 0x14, 0xbe,
- 0xec, 0x72, 0xc8, 0xbd, 0x09, 0xe2, 0xbd, 0x3d, 0xd5, 0x07, 0x1b, 0xbd,
- 0x0b, 0xbe, 0x6d, 0x3c, 0x6c, 0x15, 0xbd, 0x3b, 0x06, 0xac, 0x52, 0xbd,
- 0x0a, 0xc0, 0x97, 0xbd, 0x2b, 0xeb, 0xe0, 0xbe, 0x1c, 0x5f, 0x95, 0xbe,
- 0x89, 0xea, 0x2b, 0xbe, 0x32, 0x3c, 0xa0, 0xbe, 0x07, 0x2a, 0xc6, 0xbd,
- 0x2f, 0x71, 0x65, 0xbe, 0xdd, 0xf1, 0xa3, 0xbe, 0x24, 0x03, 0x37, 0x3d,
- 0xe8, 0xf5, 0x8a, 0xbe, 0x76, 0xb4, 0x26, 0xbe, 0x1a, 0x96, 0x07, 0xbe,
- 0x4e, 0xa3, 0x33, 0xbe, 0x5e, 0x9b, 0x10, 0x3c, 0x86, 0xe3, 0x55, 0x3d,
- 0xe6, 0xad, 0x59, 0x3e, 0xf4, 0x27, 0x40, 0xbe, 0xbc, 0xfc, 0xe3, 0xbc,
- 0x60, 0x0a, 0x92, 0xbd, 0xe3, 0x90, 0x83, 0x3d, 0x46, 0xc8, 0x05, 0xbf,
- 0x5c, 0xe3, 0x09, 0xbc, 0x89, 0x9c, 0xa9, 0x3d, 0x85, 0x74, 0xde, 0xbb,
- 0x87, 0x35, 0xc6, 0x3d, 0xe5, 0xf0, 0xa5, 0xbd, 0x99, 0x67, 0xe3, 0xbd,
- 0xef, 0xec, 0x56, 0xbe, 0xde, 0xf7, 0xc7, 0xbd, 0xa3, 0x47, 0x5a, 0xbe,
- 0xb1, 0x06, 0x48, 0x3d, 0xc1, 0x14, 0x03, 0xbe, 0x98, 0x13, 0x93, 0x3d,
- 0x76, 0xbf, 0x88, 0x3b, 0xee, 0xc4, 0x9c, 0xbc, 0x37, 0x93, 0x8c, 0xbc,
- 0xbd, 0x0b, 0x20, 0xbe, 0x2e, 0xc6, 0x15, 0xbe, 0x72, 0x8c, 0xa6, 0xbe,
- 0xa1, 0x68, 0xdc, 0x3b, 0x0b, 0x31, 0xa2, 0x3d, 0xce, 0xa7, 0x93, 0xbe,
- 0x89, 0xf5, 0xb7, 0xbd, 0xcd, 0x90, 0x55, 0x3d, 0xa4, 0x3a, 0x05, 0xbd,
- 0x65, 0xba, 0xc4, 0xbd, 0x08, 0xad, 0x61, 0xbc, 0xf8, 0x71, 0xde, 0xbc,
- 0xcb, 0x14, 0xb9, 0xbd, 0x46, 0x11, 0xa2, 0xbc, 0x95, 0x40, 0xd7, 0xbe,
- 0x6a, 0x45, 0x6c, 0xbe, 0x9a, 0x9a, 0x2c, 0x3d, 0xe0, 0x66, 0x95, 0xbe,
- 0x9a, 0x18, 0xad, 0x3d, 0xd5, 0xf0, 0xbb, 0x3d, 0xad, 0x6c, 0xd0, 0xbe,
- 0x41, 0x9b, 0x0b, 0xbe, 0x42, 0x3c, 0xbf, 0xbd, 0x5b, 0xad, 0x08, 0xbe,
- 0x50, 0xa0, 0xf7, 0xbd, 0x73, 0xe7, 0x6a, 0xbd, 0x62, 0x27, 0x0f, 0xbe,
- 0x89, 0x93, 0xf0, 0xbd, 0x4d, 0x98, 0x3c, 0xbc, 0xab, 0x84, 0xac, 0xbd,
- 0x64, 0xf4, 0xea, 0xbc, 0x0a, 0x61, 0xc0, 0x3d, 0x76, 0x2c, 0xf2, 0xbd,
- 0x14, 0x02, 0x09, 0xbe, 0x94, 0x08, 0x96, 0xbe, 0x2e, 0x2e, 0xe4, 0xbd,
- 0xcf, 0x68, 0x90, 0xbe, 0x04, 0xa3, 0xeb, 0xbb, 0xb2, 0x06, 0x17, 0x3e,
- 0xed, 0xd2, 0x18, 0xbe, 0x62, 0xd2, 0x0a, 0x3d, 0xbe, 0x15, 0xd0, 0xbd,
- 0xc1, 0x9e, 0x5a, 0x3d, 0x5d, 0x04, 0x62, 0x3e, 0x4a, 0xf3, 0xaf, 0xbd,
- 0x5b, 0xff, 0xf1, 0x3d, 0x65, 0xae, 0x0a, 0xbe, 0x06, 0x8c, 0xe1, 0x3d,
- 0xec, 0xd4, 0xa0, 0x3d, 0x9f, 0x11, 0x5a, 0x3d, 0x1a, 0x4f, 0x38, 0xbe,
- 0x99, 0x86, 0x1e, 0x3d, 0x54, 0xf0, 0xa3, 0xbe, 0x31, 0x6f, 0x71, 0x3e,
- 0xb9, 0x4d, 0x90, 0xbd, 0x83, 0xb7, 0xe5, 0x3d, 0x35, 0x6b, 0xd8, 0xbd,
- 0xe1, 0x78, 0xa4, 0xbe, 0xfd, 0x91, 0xc9, 0xbd, 0x67, 0xbf, 0x61, 0xbe,
- 0x14, 0x7d, 0x0a, 0x3d, 0xd3, 0x0e, 0xda, 0xbd, 0x2d, 0x11, 0x47, 0x3d,
- 0x56, 0xd3, 0xa3, 0xbc, 0xba, 0x26, 0x68, 0xbe, 0x83, 0x53, 0x24, 0x3e,
- 0x16, 0x26, 0xc8, 0x3d, 0xd7, 0xe7, 0x0c, 0xbe, 0xf9, 0x09, 0x1a, 0x3e,
- 0x64, 0xf7, 0xf5, 0x3d, 0x1d, 0x3b, 0x14, 0xbe, 0xa4, 0xcf, 0x28, 0x3d,
- 0x02, 0x4a, 0xc4, 0xbe, 0x64, 0x97, 0x84, 0xbe, 0x83, 0xfb, 0x97, 0xbe,
- 0x95, 0x0d, 0x2f, 0x3e, 0x74, 0xa7, 0xf5, 0x3c, 0x40, 0xf0, 0x97, 0xbb,
- 0x94, 0x22, 0x50, 0x3e, 0x07, 0xe6, 0xe4, 0x3c, 0x32, 0x0e, 0xe1, 0x3d,
- 0x61, 0xf3, 0x2c, 0x3e, 0x90, 0xef, 0x99, 0x3d, 0xd3, 0x34, 0x4e, 0xbe,
- 0x96, 0x0f, 0xa9, 0x3d, 0xdd, 0x42, 0x69, 0xbe, 0xdc, 0x5b, 0xb3, 0xbd,
- 0x81, 0xdb, 0xcb, 0xbd, 0x25, 0x43, 0xb4, 0xbe, 0x4c, 0x96, 0x6b, 0xbe,
- 0x98, 0x24, 0xbe, 0xbd, 0x0e, 0x71, 0x4e, 0x3e, 0xcb, 0x3c, 0x17, 0xbd,
- 0x27, 0x18, 0x50, 0x3e, 0xfd, 0x32, 0x40, 0xbe, 0x86, 0x52, 0xa5, 0xbe,
- 0x79, 0x2b, 0x08, 0x3c, 0x12, 0x5e, 0x8a, 0x3d, 0xd1, 0x16, 0x93, 0xbd,
- 0xc2, 0x41, 0xcd, 0xbc, 0x1a, 0x1b, 0xab, 0xbe, 0xc9, 0x2c, 0xb8, 0x3c,
- 0xbe, 0x67, 0x41, 0xbd, 0xb5, 0x43, 0x00, 0x3e, 0xd4, 0x84, 0x63, 0x3d,
- 0x8e, 0x35, 0x17, 0xbd, 0x78, 0x93, 0x95, 0xbe, 0x04, 0xda, 0x9d, 0x3d,
- 0xff, 0x96, 0x36, 0xbe, 0x90, 0xcf, 0x90, 0xbe, 0xc3, 0xc2, 0x58, 0xbe,
- 0x89, 0x62, 0x36, 0xbe, 0xae, 0xbb, 0xea, 0xbd, 0xeb, 0x12, 0x3b, 0xbe,
- 0x5b, 0x6a, 0x9f, 0x3c, 0x52, 0x93, 0xaa, 0xbe, 0x28, 0xe6, 0x0d, 0xbe,
- 0x21, 0xe9, 0x54, 0xbe, 0xb9, 0x14, 0x0d, 0xbe, 0xf4, 0x65, 0xea, 0x3d,
- 0xa4, 0x21, 0x9a, 0xbe, 0xb8, 0xc6, 0x5e, 0xbe, 0x6b, 0xa2, 0xd4, 0x3d,
- 0x39, 0x3d, 0xb4, 0xbe, 0x26, 0x62, 0x98, 0xbd, 0xee, 0x8a, 0xc9, 0xbd,
- 0x01, 0xb9, 0x04, 0xbe, 0xa1, 0x82, 0x9d, 0xbd, 0xd7, 0xcb, 0x4f, 0xbd,
- 0xac, 0xbb, 0x08, 0x3d, 0x0c, 0xd7, 0x0c, 0xbe, 0xe9, 0xdb, 0xba, 0xbe,
- 0x7a, 0x30, 0xbc, 0xbd, 0xfb, 0x98, 0x3a, 0xbf, 0x7f, 0x02, 0x80, 0x3c,
- 0x08, 0xb6, 0x11, 0xbd, 0xd0, 0x2e, 0x88, 0xbc, 0xbd, 0x1e, 0x7e, 0x3e,
- 0x27, 0x62, 0x86, 0xbe, 0x06, 0xa1, 0xbf, 0xbd, 0x02, 0xbd, 0x1c, 0x3e,
- 0xee, 0xa4, 0x1d, 0xbe, 0x28, 0x00, 0xa3, 0xbe, 0x28, 0xe4, 0x07, 0xbe,
- 0x4c, 0x67, 0x9f, 0xbd, 0xe8, 0x2a, 0x48, 0xbd, 0xdb, 0xa8, 0xef, 0xbd,
- 0xa9, 0x10, 0xbe, 0xbd, 0xdf, 0x80, 0xaa, 0x3b, 0x9b, 0x33, 0x5e, 0x3d,
- 0x91, 0x8b, 0xa9, 0xbe, 0x6c, 0x70, 0x85, 0x3e, 0x2e, 0xc5, 0xb2, 0xbe,
- 0xa4, 0x29, 0x99, 0xbd, 0xba, 0x96, 0x2d, 0x3e, 0x74, 0x6f, 0xff, 0x3d,
- 0xcd, 0xf8, 0x8d, 0xbe, 0x9f, 0x3c, 0x11, 0xbf, 0xa5, 0x9d, 0x86, 0xbe,
- 0xe2, 0x8f, 0x95, 0x3d, 0x5e, 0x8c, 0x80, 0xbe, 0x2f, 0x74, 0x0e, 0x3e,
- 0x23, 0x23, 0xd2, 0x3c, 0x65, 0x24, 0xa3, 0x3e, 0x9e, 0x48, 0x9a, 0x3d,
- 0x72, 0x75, 0xef, 0xbd, 0xaf, 0x19, 0x0b, 0xbe, 0x06, 0x3a, 0xbc, 0x3d,
- 0x23, 0xb0, 0x48, 0xbe, 0x51, 0x34, 0xea, 0x3d, 0x03, 0x70, 0x83, 0x3e,
- 0x47, 0xca, 0xda, 0xbe, 0xa8, 0x46, 0x71, 0x3e, 0xa9, 0x58, 0x27, 0x3b,
- 0x67, 0x2b, 0xd9, 0xbe, 0xaf, 0x71, 0x4f, 0x3d, 0x33, 0x6c, 0x97, 0xbd,
- 0x2a, 0x56, 0xa7, 0x3e, 0xe7, 0x4f, 0x82, 0xbe, 0x3b, 0x90, 0x92, 0xbe,
- 0x0c, 0x97, 0x90, 0x3e, 0x83, 0x78, 0x8d, 0xbe, 0x57, 0x79, 0x06, 0xbe,
- 0xb5, 0xec, 0x1f, 0xbe, 0xf8, 0x21, 0x5e, 0xbe, 0x65, 0xf3, 0xf4, 0xbe,
- 0x3d, 0xed, 0x81, 0xbd, 0xb4, 0x5f, 0x75, 0xbd, 0xbc, 0x7d, 0xe4, 0x3d,
- 0x8c, 0x06, 0x41, 0xbf, 0x7a, 0x10, 0x3f, 0x3d, 0x14, 0xb6, 0x17, 0x3e,
- 0xfd, 0xe7, 0x0d, 0xbc, 0x11, 0xcf, 0x00, 0xbd, 0x84, 0x97, 0xa8, 0x3d,
- 0xe4, 0x14, 0x63, 0xbe, 0x58, 0xbf, 0xb4, 0x3c, 0x8d, 0xf1, 0x91, 0xbe,
- 0xcc, 0x90, 0x0b, 0x3e, 0x70, 0xe8, 0x05, 0xbf, 0x7a, 0x2c, 0xb3, 0xbe,
- 0xc7, 0x44, 0x8b, 0x3d, 0x7a, 0xe5, 0x97, 0xbe, 0x1b, 0xc5, 0x41, 0xbe,
- 0x96, 0x98, 0xbb, 0x3d, 0x36, 0x06, 0x8b, 0xbe, 0xcd, 0x9f, 0x16, 0x3e,
- 0xef, 0x86, 0x54, 0xbb, 0xd6, 0x97, 0xb1, 0xbd, 0x4c, 0x45, 0x13, 0x3e,
- 0x12, 0x61, 0x87, 0x3d, 0xff, 0xe1, 0x47, 0x3d, 0xfe, 0x41, 0x9e, 0x3b,
- 0xbf, 0xd4, 0xd1, 0x3d, 0x77, 0x53, 0x86, 0x3e, 0x7f, 0xdd, 0x79, 0x3c,
- 0xba, 0x83, 0xb2, 0x3e, 0x7d, 0x09, 0x41, 0x3e, 0xa6, 0xec, 0x0a, 0xbe,
- 0x6a, 0x3c, 0x37, 0xbd, 0x6b, 0xb5, 0x09, 0xbf, 0xa1, 0x88, 0x37, 0x3e,
- 0xea, 0x4a, 0x72, 0xbe, 0xe6, 0x58, 0x80, 0xbe, 0xcb, 0xfe, 0x9a, 0x3d,
- 0xe8, 0xb0, 0x90, 0x3b, 0x6f, 0x1b, 0xd9, 0xbd, 0xf6, 0x06, 0x62, 0x3e,
- 0x97, 0x07, 0x50, 0xbe, 0xde, 0x2d, 0xcd, 0x3c, 0x7c, 0x34, 0xca, 0xbd,
- 0xd1, 0xd1, 0x87, 0xbe, 0x7b, 0x88, 0x4c, 0x3d, 0x77, 0x01, 0xea, 0xbd,
- 0xec, 0x05, 0x14, 0x3e, 0xa2, 0xe0, 0xdc, 0xbd, 0x58, 0xf2, 0x74, 0x3e,
- 0x46, 0x80, 0xa1, 0xbd, 0x25, 0xd7, 0xae, 0x3d, 0xd4, 0xeb, 0x63, 0x3e,
- 0xca, 0x9d, 0x84, 0x3e, 0x4d, 0x58, 0xfa, 0xbd, 0x4c, 0x01, 0x5e, 0x3c,
- 0xb8, 0xe6, 0x52, 0xbd, 0x08, 0x51, 0x31, 0x3e, 0x73, 0xa4, 0x1a, 0xbe,
- 0xf7, 0x04, 0xf3, 0xbd, 0x7b, 0xd0, 0x29, 0x3d, 0xc0, 0x6f, 0x58, 0x3e,
- 0xdd, 0x6e, 0xbe, 0xbd, 0x93, 0x07, 0xc4, 0xbe, 0x9d, 0xd2, 0x74, 0x3e,
- 0x4f, 0x0b, 0x13, 0x3d, 0x5b, 0xc6, 0xbc, 0x3d, 0x61, 0xa3, 0x0f, 0x3e,
- 0x7f, 0x77, 0x89, 0xbd, 0x7a, 0xcc, 0x05, 0xbe, 0xd5, 0x86, 0xc6, 0x3e,
- 0xe2, 0x80, 0xcf, 0xbd, 0xd1, 0x9c, 0x1e, 0xbb, 0xcb, 0x82, 0x32, 0x3e,
- 0xa7, 0x6c, 0x68, 0xbe, 0x14, 0x4d, 0x39, 0x3d, 0xd2, 0x61, 0xe2, 0x3e,
- 0x2b, 0xdb, 0x2b, 0x3e, 0x47, 0xfa, 0x54, 0x3e, 0x3b, 0x7a, 0xf9, 0xbd,
- 0xc4, 0x9f, 0x03, 0xbe, 0x9b, 0xd1, 0x9a, 0xbe, 0x93, 0x70, 0x33, 0x3e,
- 0x53, 0xca, 0xda, 0xbd, 0x6b, 0x1d, 0x22, 0xbe, 0x3f, 0xf6, 0xa0, 0xbe,
- 0xc0, 0xc6, 0x5e, 0xbd, 0x9a, 0x8d, 0x34, 0xbe, 0x41, 0xea, 0x50, 0xbe,
- 0x5c, 0x98, 0xec, 0x3c, 0xc9, 0x7d, 0xe6, 0xbb, 0xc6, 0xd0, 0x52, 0x3d,
- 0xb3, 0xe2, 0x02, 0xbe, 0x3a, 0x57, 0x06, 0x3d, 0xd4, 0x97, 0x43, 0xbe,
- 0xae, 0x05, 0x17, 0xbe, 0x55, 0x15, 0xd1, 0x3d, 0x9f, 0x66, 0x22, 0xbe,
- 0x99, 0x88, 0xa0, 0x3d, 0x99, 0x51, 0xa2, 0x3d, 0xa4, 0xf8, 0x5a, 0x3e,
- 0x96, 0x62, 0xa5, 0x3d, 0x0c, 0x6a, 0xbe, 0xbd, 0x4a, 0x2d, 0x69, 0xbe,
- 0x7a, 0x15, 0x7f, 0xbe, 0x5a, 0x8a, 0x9b, 0x38, 0x97, 0x5b, 0x11, 0x3e,
- 0x44, 0xd3, 0xff, 0x3d, 0x1a, 0x7a, 0x55, 0x3d, 0x1b, 0xa8, 0x0c, 0x3e,
- 0x63, 0x43, 0x73, 0x3e, 0xe6, 0xd0, 0x28, 0x3e, 0x12, 0xb4, 0x1d, 0xbd,
- 0x64, 0x38, 0xc6, 0xbd, 0xe4, 0xde, 0x71, 0x3e, 0xb8, 0x8b, 0xcf, 0xbe,
- 0xa0, 0x21, 0x14, 0x3e, 0xfe, 0x33, 0x3f, 0x3e, 0xe3, 0xbe, 0x98, 0x3d,
- 0xce, 0x6f, 0x55, 0x3e, 0x3d, 0x61, 0x71, 0x3e, 0x00, 0x23, 0x4f, 0x3d,
- 0x5a, 0xf8, 0x6a, 0x3e, 0x18, 0x2a, 0x9f, 0x3d, 0xea, 0xa0, 0x57, 0x3e,
- 0x62, 0x90, 0x97, 0xbd, 0x4d, 0x57, 0x1d, 0x3d, 0xd8, 0xe9, 0x15, 0xbe,
- 0x06, 0x5d, 0x8a, 0xbe, 0x6a, 0x9b, 0xdd, 0xbe, 0xbc, 0xa8, 0xd6, 0xbe,
- 0xef, 0x21, 0x4c, 0x3c, 0x4c, 0xa2, 0x22, 0xbe, 0x18, 0x8a, 0x2b, 0x3c,
- 0x86, 0xa8, 0x15, 0xbd, 0x21, 0x2d, 0x75, 0xbc, 0x18, 0x4f, 0x37, 0xbe,
- 0x76, 0xd4, 0xca, 0xbc, 0xe0, 0x58, 0x55, 0xbe, 0x2c, 0x8e, 0xd8, 0xbd,
- 0x8b, 0x98, 0x40, 0xbe, 0x80, 0xb0, 0x72, 0xbe, 0x50, 0xd1, 0xbc, 0xbd,
- 0xdc, 0xb6, 0xc7, 0x3d, 0x2f, 0xa3, 0x40, 0xbd, 0x18, 0x39, 0xa6, 0xbd,
- 0x75, 0x5b, 0x8c, 0xbe, 0xe0, 0xc4, 0xa4, 0xbd, 0xc5, 0xc3, 0xf1, 0xbd,
- 0xbd, 0x77, 0x93, 0xbe, 0x0d, 0xc4, 0x18, 0xbe, 0x17, 0xf6, 0x21, 0xbe,
- 0x67, 0x4d, 0x5a, 0xbe, 0x81, 0x8e, 0x3b, 0xbe, 0xdc, 0x16, 0x9c, 0xbe,
- 0x70, 0x43, 0x00, 0xbe, 0xf6, 0x9e, 0x0f, 0xbe, 0x77, 0x33, 0x3d, 0xbe,
- 0x76, 0xc7, 0x8b, 0xbe, 0x24, 0xc2, 0x8b, 0xbe, 0x57, 0x8c, 0xa0, 0xbd,
- 0x52, 0xec, 0x7c, 0xbe, 0xd6, 0x05, 0x3c, 0xbe, 0x28, 0x5f, 0x5c, 0x3d,
- 0xbe, 0x3a, 0x52, 0xbe, 0xf2, 0x9f, 0x0c, 0xbe, 0x4b, 0x07, 0x8d, 0xbe,
- 0x40, 0x1e, 0x58, 0x3d, 0x96, 0xa3, 0x87, 0xbd, 0xd2, 0x2d, 0x64, 0xbe,
- 0x40, 0x53, 0x81, 0xbe, 0x99, 0x82, 0xfb, 0xbd, 0x26, 0xb6, 0x24, 0xbe,
- 0x57, 0xbf, 0x9d, 0xbe, 0xa6, 0xe4, 0x48, 0x3e, 0x86, 0xd6, 0x92, 0xbd,
- 0x49, 0x6e, 0x5a, 0xbd, 0x8c, 0xb0, 0xd3, 0xbd, 0xc1, 0x3a, 0x8e, 0xbd,
- 0x94, 0xba, 0x34, 0xbe, 0x95, 0x3a, 0x69, 0xbe, 0x2f, 0x2b, 0x2d, 0xbe,
- 0x71, 0x22, 0x17, 0xbe, 0x15, 0xf1, 0xb1, 0xbd, 0xc0, 0xf7, 0x34, 0xbe,
- 0xa1, 0xd0, 0x03, 0xbc, 0x15, 0xf0, 0xd6, 0xbe, 0xb9, 0x57, 0xea, 0xbd,
- 0x19, 0xa7, 0xa3, 0xbd, 0xf3, 0x94, 0x16, 0x3e, 0x6b, 0xee, 0xbe, 0xbd,
- 0xa9, 0x9d, 0x7e, 0x3d, 0x03, 0x75, 0x0c, 0xbf, 0xe4, 0xbc, 0x4f, 0x3d,
- 0x96, 0x37, 0x44, 0xbd, 0x91, 0x8a, 0x1f, 0xbf, 0x6e, 0xad, 0xa7, 0xbe,
- 0x2d, 0xed, 0x88, 0xbe, 0xf0, 0xae, 0xda, 0xbd, 0x86, 0xb6, 0x77, 0xbe,
- 0xd5, 0xd7, 0xba, 0x3b, 0xa4, 0x60, 0x36, 0xbe, 0x07, 0x16, 0xcf, 0xbe,
- 0x1b, 0x57, 0xaa, 0xbc, 0x7f, 0x0e, 0xa5, 0xbd, 0xfc, 0x07, 0x12, 0xbe,
- 0xc9, 0xe6, 0x9d, 0xbe, 0x69, 0xa4, 0xef, 0xbd, 0xee, 0xda, 0x8b, 0xbe,
- 0xf2, 0xac, 0x8a, 0xbe, 0x22, 0x16, 0x7e, 0xbe, 0xcc, 0x23, 0xc1, 0x3c,
- 0x32, 0xb7, 0x0f, 0xbe, 0x95, 0x4a, 0x53, 0x3d, 0xc3, 0x44, 0x51, 0xbe,
- 0xda, 0x1b, 0xae, 0xbe, 0xd2, 0x1e, 0xec, 0xbd, 0x65, 0x74, 0xdd, 0xbd,
- 0xaa, 0xa7, 0x11, 0xbe, 0x40, 0xc9, 0xf0, 0xbd, 0x7b, 0x6d, 0x3a, 0xba,
- 0x26, 0x6d, 0x80, 0xbc, 0xc2, 0x7e, 0xce, 0xbd, 0x63, 0xd1, 0x6c, 0xbe,
- 0xa5, 0x8d, 0x59, 0xba, 0x6b, 0xd0, 0xae, 0xbe, 0x92, 0x59, 0x6c, 0xbe,
- 0x2d, 0x06, 0xad, 0xbe, 0x3a, 0x56, 0xb7, 0xbd, 0xcb, 0xe5, 0x20, 0x3c,
- 0xbc, 0xf0, 0x95, 0xbd, 0x84, 0x04, 0x39, 0xbe, 0x45, 0x86, 0xcb, 0xbd,
- 0x6a, 0xb1, 0xf7, 0xbe, 0xa5, 0x70, 0x01, 0xbe, 0x7d, 0x2c, 0xb8, 0x3d,
- 0x8d, 0xca, 0x36, 0xbe, 0x15, 0x49, 0x8c, 0xbe, 0x6b, 0x2a, 0x60, 0xbe,
- 0x82, 0x9b, 0x46, 0xbe, 0x7d, 0x63, 0x93, 0xbe, 0x2b, 0xc6, 0x0c, 0xbe,
- 0xa5, 0x1e, 0x22, 0xbd, 0xdd, 0x0e, 0xc9, 0xbe, 0x19, 0xd0, 0xac, 0xbe,
- 0x34, 0xb7, 0xac, 0xbe, 0x97, 0xc8, 0x28, 0x3e, 0x32, 0x04, 0x60, 0xbe,
- 0x53, 0xdb, 0xb1, 0xbe, 0x86, 0xff, 0x9a, 0xbd, 0x1a, 0xd9, 0xf0, 0xbe,
- 0x93, 0x93, 0x92, 0xbd, 0xe9, 0x24, 0x38, 0xbd, 0xdf, 0x71, 0xd1, 0xbd,
- 0x96, 0xe6, 0xe1, 0xbd, 0xa3, 0x1a, 0x30, 0xbe, 0xd3, 0x8d, 0x84, 0x3d,
- 0x8b, 0xd8, 0x84, 0xbd, 0x52, 0xe0, 0x83, 0x3b, 0x5c, 0x5b, 0x27, 0x3e,
- 0xfc, 0xbc, 0x08, 0xbf, 0x4f, 0x9c, 0x52, 0xbe, 0x64, 0x70, 0x1f, 0xbe,
- 0x83, 0x65, 0xe8, 0x3d, 0x97, 0x44, 0x3d, 0x3e, 0xe5, 0x3a, 0xe8, 0xbd,
- 0xd1, 0x44, 0x1e, 0x3f, 0x3f, 0x64, 0xc3, 0xbd, 0xd1, 0x3d, 0xd1, 0x3e,
- 0xdb, 0x89, 0x0c, 0xbd, 0xc1, 0x31, 0x95, 0xbd, 0xf4, 0x32, 0x02, 0x3e,
- 0xd6, 0xdf, 0xac, 0x3e, 0x91, 0xd7, 0xf5, 0xbc, 0x06, 0xb5, 0xcb, 0x3d,
- 0xc3, 0x7c, 0x67, 0x3d, 0xe6, 0x68, 0xca, 0x3d, 0x69, 0x0a, 0x60, 0xbe,
- 0x90, 0xf7, 0xaa, 0xbc, 0xdd, 0x19, 0x38, 0x3e, 0x06, 0xcd, 0xf7, 0x3d,
- 0x2c, 0xf5, 0xcc, 0xbd, 0x36, 0x36, 0x38, 0x3d, 0xa5, 0x01, 0xf1, 0x3d,
- 0xbc, 0x10, 0xfc, 0x3d, 0x90, 0x5d, 0x41, 0xbd, 0x1e, 0x77, 0x0f, 0x3e,
- 0xeb, 0x03, 0x48, 0xbe, 0xb3, 0xf1, 0x6a, 0x3e, 0x17, 0x21, 0x3e, 0x3b,
- 0x2e, 0xa4, 0xbb, 0x3d, 0x0b, 0x93, 0x52, 0x3e, 0xba, 0x93, 0xc2, 0xbe,
- 0x53, 0x31, 0x37, 0xbe, 0x66, 0xa6, 0x7a, 0xbd, 0xf2, 0x80, 0x80, 0x3e,
- 0x76, 0x42, 0xc8, 0x3c, 0x43, 0x38, 0xf8, 0x3c, 0x5c, 0x83, 0xed, 0x3e,
- 0xc8, 0xd4, 0x39, 0xbe, 0x4d, 0x92, 0x37, 0x3d, 0x4c, 0x46, 0xed, 0xbd,
- 0xa7, 0xcd, 0x2e, 0x3c, 0x3e, 0x06, 0x43, 0x3d, 0x9f, 0xcb, 0xeb, 0xbd,
- 0xde, 0x42, 0xa2, 0xbc, 0x30, 0xd5, 0x09, 0x3e, 0x3b, 0x58, 0x69, 0x3e,
- 0x0a, 0x6a, 0xbf, 0xbe, 0x3e, 0xaa, 0x2c, 0xbe, 0x97, 0x61, 0x45, 0xbc,
- 0x88, 0xa8, 0x53, 0x3d, 0x1c, 0x53, 0x8a, 0x3c, 0xcf, 0xcd, 0xb7, 0x3d,
- 0xec, 0x16, 0xa3, 0xbd, 0x71, 0x2b, 0x92, 0xbd, 0x5c, 0xeb, 0xeb, 0x3e,
- 0xcd, 0x1d, 0xc1, 0xbe, 0x0b, 0xbd, 0x89, 0x3d, 0xd0, 0xff, 0xaf, 0x3d,
- 0x05, 0x35, 0x59, 0xbe, 0x49, 0x5d, 0x5f, 0x3e, 0x0b, 0x18, 0xab, 0xbb,
- 0xdf, 0xae, 0xc2, 0xbe, 0xaa, 0x2d, 0x33, 0x3d, 0xee, 0xf9, 0x9f, 0x3e,
- 0x4e, 0x30, 0x2a, 0x3e, 0xee, 0x53, 0x45, 0xbe, 0xfc, 0x32, 0x31, 0x3d,
- 0xa8, 0x4a, 0xb2, 0xbe, 0x43, 0x7d, 0x31, 0x3e, 0x44, 0xc0, 0x01, 0x3e,
- 0xc3, 0x6f, 0xf3, 0xbc, 0x2e, 0x06, 0x05, 0x3e, 0xfe, 0xee, 0x4e, 0xbd,
- 0x03, 0xa6, 0x2c, 0xbe, 0x0b, 0x49, 0xd3, 0xbd, 0x40, 0xd6, 0x2f, 0xbc,
- 0xa5, 0xec, 0x48, 0x3e, 0x25, 0xa0, 0x26, 0x3c, 0xba, 0x79, 0x02, 0x3e,
- 0x73, 0x48, 0xfe, 0xbc, 0xde, 0xe1, 0x7d, 0xbe, 0x78, 0xde, 0x47, 0x3e,
- 0x2e, 0xa5, 0xfa, 0xbd, 0x68, 0x32, 0x38, 0xbe, 0xbc, 0x7f, 0x35, 0x3e,
- 0x95, 0x34, 0xa0, 0xbd, 0x7c, 0xc7, 0x00, 0xbe, 0x3d, 0x59, 0x98, 0xbb,
- 0xdb, 0xf4, 0x95, 0xbd, 0x1f, 0xb0, 0x8b, 0x3d, 0xdc, 0x11, 0x13, 0x3f,
- 0x79, 0x11, 0x8e, 0x3d, 0x16, 0x71, 0xea, 0x3d, 0x5a, 0xee, 0xed, 0xbd,
- 0xee, 0x9f, 0x50, 0xbc, 0x19, 0x35, 0x8e, 0x3e, 0x1b, 0x49, 0xac, 0xbd,
- 0x24, 0x34, 0xb5, 0xbd, 0xd2, 0x96, 0x53, 0x3c, 0xc1, 0xba, 0xd0, 0xbd,
- 0xd1, 0xe1, 0x1a, 0xbe, 0x9e, 0xff, 0x07, 0xbe, 0xb2, 0x77, 0x8e, 0x3e,
- 0xab, 0x43, 0xaa, 0x3d, 0x99, 0x5f, 0x3b, 0x3e, 0xb0, 0x83, 0xfe, 0xbd,
- 0x8f, 0x65, 0x20, 0xbe, 0x85, 0x0f, 0x08, 0xbe, 0xcd, 0xbc, 0xe8, 0x3d,
- 0xf7, 0x4c, 0x5a, 0x3d, 0x89, 0x55, 0x2d, 0xbe, 0x62, 0x72, 0xa0, 0x3b,
- 0x4d, 0x5c, 0x00, 0xbd, 0x14, 0x60, 0x34, 0xbc, 0x2d, 0xbf, 0x06, 0xbc,
- 0xb9, 0xb9, 0x75, 0xbe, 0x53, 0xeb, 0x8d, 0x3b, 0xa1, 0xe8, 0x71, 0xbe,
- 0xe5, 0x83, 0xcd, 0x3d, 0x30, 0x5b, 0xba, 0xbe, 0xe5, 0x33, 0x46, 0xbe,
- 0x27, 0xaa, 0x9d, 0x3c, 0x31, 0xc8, 0x32, 0xbe, 0x25, 0x9a, 0x3d, 0xbe,
- 0xad, 0x0e, 0x57, 0xbe, 0x0f, 0xba, 0x03, 0xbe, 0xe7, 0xf9, 0x30, 0x3e,
- 0x16, 0x7a, 0x89, 0x3c, 0xd7, 0xfb, 0x3c, 0x3e, 0xb1, 0xd4, 0xd7, 0xbc,
- 0x55, 0xfd, 0x11, 0x3e, 0x14, 0x16, 0xcb, 0xbc, 0x71, 0x04, 0xc6, 0x3d,
- 0x45, 0x35, 0x09, 0xbc, 0x7a, 0xb5, 0x0d, 0x3e, 0x68, 0xb3, 0x3b, 0xbd,
- 0x43, 0x1c, 0x1d, 0xbe, 0x35, 0xa1, 0x43, 0xbd, 0xd4, 0xae, 0x7d, 0xbe,
- 0x7b, 0x20, 0x20, 0x3d, 0x44, 0xaf, 0x3e, 0x3e, 0x22, 0x15, 0x06, 0xbd,
- 0x96, 0xaf, 0xac, 0xbd, 0xa8, 0xbb, 0xc1, 0xbd, 0x93, 0xbd, 0x88, 0xbd,
- 0x58, 0x92, 0xfc, 0xbd, 0x61, 0x02, 0xbe, 0xbc, 0x30, 0x93, 0x4f, 0xbd,
- 0xe7, 0x5c, 0xba, 0xbe, 0xc4, 0xe5, 0x35, 0xbd, 0xa2, 0x65, 0x4a, 0xbc,
- 0xd7, 0x6e, 0x93, 0xbd, 0x72, 0x6f, 0x9a, 0x3d, 0x5b, 0x3c, 0x81, 0xbd,
- 0xf3, 0x4b, 0x3f, 0x3e, 0xc9, 0xa8, 0x8a, 0xbd, 0x42, 0x10, 0xf3, 0x3c,
- 0xe7, 0xf3, 0x3e, 0x3d, 0x41, 0xce, 0x90, 0x3d, 0x75, 0x15, 0x86, 0xbd,
- 0xa8, 0x9a, 0x0e, 0xbe, 0x43, 0xab, 0xf4, 0x3d, 0x29, 0x6b, 0xe4, 0x3c,
- 0xca, 0x47, 0x91, 0xbe, 0xf4, 0x77, 0xb5, 0x3d, 0x0a, 0xb6, 0x2d, 0xbc,
- 0x73, 0xea, 0x8f, 0xbd, 0xc8, 0x37, 0x68, 0xbe, 0x53, 0x6a, 0xc6, 0xbd,
- 0x2d, 0xf2, 0xdb, 0xbc, 0xe9, 0x09, 0x27, 0xbe, 0xf0, 0xd6, 0x32, 0x3d,
- 0xde, 0xda, 0x13, 0xbe, 0x70, 0x72, 0x83, 0xbd, 0x9e, 0xe1, 0x21, 0x3c,
- 0xe5, 0xc9, 0x9d, 0xbd, 0x95, 0xed, 0x9b, 0xbe, 0x01, 0xec, 0x58, 0xbe,
- 0x67, 0xc6, 0x60, 0xbd, 0x97, 0xb6, 0x36, 0xbe, 0x7a, 0xb7, 0xa7, 0xbb,
- 0x83, 0x89, 0x07, 0xbe, 0xa9, 0x0d, 0xcd, 0xbd, 0x50, 0x2f, 0x8f, 0xbd,
- 0xf9, 0xdc, 0x73, 0x3d, 0x2d, 0x24, 0xb4, 0x3d, 0x32, 0xa2, 0xcc, 0xbd,
- 0x60, 0x87, 0x0a, 0x3c, 0xba, 0x0a, 0xd8, 0xbd, 0x26, 0xa2, 0x00, 0xbe,
- 0x07, 0x3e, 0x01, 0x3e, 0xb8, 0xd3, 0x0e, 0x3d, 0x62, 0x23, 0x16, 0x3c,
- 0x55, 0x6c, 0x7e, 0xbd, 0x7f, 0x10, 0xc6, 0x3d, 0x38, 0x1d, 0x18, 0x3e,
- 0x55, 0xa6, 0x97, 0x3d, 0xb7, 0x62, 0xba, 0x3d, 0xf0, 0xde, 0x08, 0xbe,
- 0x09, 0x33, 0xb1, 0xbd, 0x51, 0x40, 0x16, 0xbd, 0x6d, 0x8d, 0x66, 0xbc,
- 0xa1, 0xc8, 0x24, 0xbe, 0xea, 0x07, 0xe2, 0xbd, 0x3c, 0xf3, 0xa9, 0xbe,
- 0x09, 0x9c, 0x94, 0x3d, 0xca, 0x41, 0x05, 0xbd, 0x96, 0x7f, 0x23, 0xbe,
- 0xbd, 0xa0, 0x0a, 0x3e, 0x62, 0x96, 0x14, 0xbe, 0x7e, 0x67, 0xe9, 0xbe,
- 0x32, 0x1c, 0x87, 0x3b, 0x10, 0xe0, 0xd1, 0xbd, 0x33, 0x77, 0x5b, 0x3d,
- 0x6b, 0x05, 0x43, 0xbd, 0xd6, 0xb7, 0xa3, 0xbd, 0xbe, 0x8d, 0x1a, 0x3d,
- 0x13, 0x2c, 0xf8, 0xbd, 0x8e, 0xed, 0x72, 0x3d, 0x49, 0xd4, 0x72, 0xbd,
- 0x37, 0x72, 0x12, 0xbd, 0xcc, 0x17, 0x5b, 0xbd, 0x62, 0xf1, 0x21, 0x3d,
- 0x47, 0x5f, 0xe1, 0xbb, 0xf7, 0x6e, 0x13, 0xbe, 0x26, 0x21, 0x21, 0xbd,
- 0xff, 0x65, 0x29, 0x3d, 0x7c, 0x90, 0x76, 0xbc, 0x05, 0xed, 0x11, 0xbe,
- 0x7d, 0x5c, 0x81, 0xbe, 0x09, 0x8f, 0x7c, 0xbe, 0xa1, 0xe9, 0xf4, 0xbd,
- 0x2d, 0x7d, 0x6c, 0x3e, 0x40, 0xfc, 0x0d, 0xbe, 0x46, 0xcf, 0x21, 0xbd,
- 0x48, 0x22, 0x14, 0x3d, 0x6a, 0x4b, 0x35, 0xbd, 0x5d, 0xb0, 0xc6, 0xbd,
- 0xd0, 0x30, 0x52, 0xbd, 0x91, 0x3e, 0x07, 0xbe, 0xdb, 0xb9, 0xd8, 0xbc,
- 0xd7, 0x22, 0xe5, 0xbc, 0x37, 0x46, 0xa5, 0xbb, 0x6e, 0xa5, 0x2d, 0xbe,
- 0x90, 0x8e, 0x84, 0x3d, 0x70, 0x3c, 0x78, 0xbe, 0xb5, 0x99, 0xaf, 0xbe,
- 0xda, 0xad, 0x2b, 0x3e, 0xe1, 0xe6, 0x2b, 0xbe, 0xe5, 0x19, 0xcc, 0x39,
- 0xbc, 0x43, 0xe7, 0xbd, 0xe0, 0x29, 0x31, 0xbd, 0x4a, 0x51, 0x86, 0xbd,
- 0xc4, 0x98, 0x45, 0xbd, 0xf3, 0xe3, 0x5b, 0xbe, 0x19, 0x27, 0xda, 0xbd,
- 0x3c, 0xee, 0x64, 0x3c, 0x0f, 0x69, 0x11, 0xbe, 0x6f, 0x27, 0xc7, 0xbe,
- 0x26, 0x0e, 0x7a, 0x3e, 0x7d, 0xff, 0x41, 0x3e, 0xe8, 0xe5, 0x81, 0xbd,
- 0x66, 0x10, 0x1e, 0xbe, 0x8a, 0x4c, 0xa1, 0xbe, 0x6f, 0xda, 0x7a, 0x3d,
- 0x78, 0x5f, 0x1f, 0xbe, 0x1a, 0xfc, 0xf0, 0x3d, 0x14, 0x57, 0xb2, 0xbe,
- 0xad, 0x87, 0xec, 0xbd, 0xa9, 0x65, 0xf8, 0xbd, 0x86, 0x6b, 0x83, 0xbe,
- 0x0d, 0x04, 0x51, 0xbd, 0x77, 0x0d, 0x96, 0xbd, 0x34, 0x52, 0xb6, 0xbc,
- 0x25, 0xcb, 0xd2, 0xbd, 0x2d, 0x69, 0xd4, 0x3d, 0x75, 0x02, 0xda, 0x3e,
- 0xb6, 0x90, 0xa2, 0x3d, 0x2c, 0x37, 0x06, 0xbd, 0x00, 0x62, 0xb6, 0xbe,
- 0xfc, 0x72, 0xbc, 0xbd, 0x1c, 0xef, 0xdf, 0x3e, 0xc1, 0x6c, 0x83, 0xbe,
- 0x78, 0x14, 0x07, 0xbf, 0x45, 0xd2, 0x72, 0xbe, 0x1a, 0x8c, 0xf3, 0x3d,
- 0xee, 0xa9, 0x2f, 0x3e, 0xd4, 0x26, 0xea, 0xbb, 0xdf, 0xc7, 0x39, 0xbe,
- 0x4a, 0xa8, 0x25, 0xbe, 0x6a, 0x6c, 0x35, 0x3e, 0x68, 0xc5, 0x23, 0xbe,
- 0x65, 0xd7, 0xa3, 0x3e, 0xd7, 0xcd, 0xa8, 0x3e, 0x38, 0xf9, 0x0a, 0xbc,
- 0xd1, 0x3f, 0xb5, 0x3e, 0x7a, 0x69, 0x74, 0x3e, 0x85, 0xb1, 0x81, 0xbd,
- 0xfc, 0x53, 0x8b, 0x3d, 0x25, 0x94, 0xeb, 0xbd, 0xe9, 0xcb, 0x7c, 0xbd,
- 0xab, 0xfc, 0x1c, 0xbc, 0x3d, 0x71, 0x8f, 0xbd, 0x48, 0xdd, 0x76, 0xbe,
- 0x5e, 0x90, 0x00, 0x3e, 0xab, 0x16, 0x7b, 0x3e, 0xea, 0x24, 0x90, 0xbe,
- 0x91, 0x50, 0xba, 0xbd, 0x70, 0x9c, 0x40, 0x3e, 0x6a, 0x86, 0xcb, 0xbe,
- 0xe8, 0xeb, 0xc0, 0x3e, 0x46, 0x3a, 0x1c, 0xbd, 0x9e, 0x32, 0xa6, 0xbe,
- 0xca, 0x80, 0xe4, 0x3d, 0xce, 0xd3, 0x97, 0xbc, 0x2a, 0xf9, 0xaa, 0xbe,
- 0xe3, 0xe7, 0x06, 0xbe, 0xec, 0xc8, 0xd9, 0xbe, 0x6b, 0x07, 0x2d, 0xbe,
- 0x41, 0x86, 0xf1, 0x3a, 0x55, 0x65, 0x3f, 0xbe, 0xd9, 0xd6, 0xc7, 0xbd,
- 0x2f, 0x30, 0x31, 0xbd, 0x11, 0x8d, 0x71, 0x3c, 0x0e, 0xc2, 0x59, 0xbe,
- 0x4a, 0x16, 0x31, 0x3e, 0xc9, 0xda, 0x76, 0xbe, 0xb1, 0xab, 0x39, 0xbe,
- 0x41, 0x68, 0x81, 0x3e, 0xf2, 0x5d, 0x88, 0xbe, 0x60, 0x4b, 0x7c, 0x3e,
- 0xf7, 0x92, 0x9f, 0xbe, 0x21, 0xd3, 0x5b, 0x3d, 0x9b, 0x82, 0x18, 0x3e,
- 0xe5, 0xcb, 0x6e, 0xbe, 0xd3, 0x50, 0x91, 0x3e, 0x34, 0x4e, 0x76, 0x3e,
- 0xb5, 0xba, 0x98, 0x3d, 0x5e, 0x39, 0x36, 0xbe, 0x42, 0xb9, 0x3a, 0xbd,
- 0x78, 0x84, 0x0f, 0x3e, 0x28, 0x01, 0x54, 0x3e, 0xed, 0x66, 0xe0, 0x3e,
- 0x2e, 0x2c, 0xb0, 0xbe, 0x1e, 0x5e, 0xb9, 0x3d, 0x4c, 0x5a, 0x16, 0x3d,
- 0x9f, 0x3a, 0xce, 0xbd, 0xe5, 0xb1, 0xf3, 0x3d, 0x21, 0x12, 0x69, 0x3e,
- 0x69, 0x58, 0x53, 0xbd, 0x3f, 0xc8, 0x12, 0xbe, 0x58, 0xff, 0x20, 0xbe,
- 0x70, 0x09, 0x44, 0xbe, 0xda, 0xc2, 0xa9, 0x3e, 0xd7, 0xf4, 0x50, 0x3e,
- 0xe8, 0x7c, 0x40, 0x3e, 0xc7, 0x45, 0x67, 0x3e, 0x8b, 0x60, 0x68, 0x3e,
- 0x51, 0x9c, 0x05, 0x3e, 0xb5, 0x37, 0x9e, 0x3d, 0x94, 0x40, 0x7c, 0x3e,
- 0x5c, 0xdf, 0x3a, 0x3e, 0x59, 0x34, 0x6d, 0x3e, 0x8e, 0x99, 0x85, 0xbc,
- 0xa3, 0x3f, 0x2d, 0x3e, 0x78, 0x9c, 0x01, 0xbe, 0xb7, 0xde, 0x1e, 0x3e,
- 0xb6, 0x48, 0x40, 0xbd, 0xc4, 0x9a, 0x3b, 0x3d, 0xf3, 0x9e, 0x5c, 0xbd,
- 0x5e, 0x41, 0xf1, 0x3e, 0x56, 0x27, 0xc5, 0xbd, 0x1f, 0x37, 0xc1, 0x3d,
- 0xf5, 0xf8, 0x85, 0xbe, 0xed, 0x91, 0x37, 0x3e, 0xef, 0xa3, 0x15, 0xbe,
- 0xc4, 0x4b, 0x14, 0xbe, 0xc9, 0xcb, 0x8e, 0x3e, 0xb7, 0x33, 0x54, 0xbd,
- 0x38, 0x34, 0xf0, 0xbc, 0xad, 0x16, 0x19, 0xbe, 0xaf, 0xd3, 0x90, 0xbd,
- 0xfd, 0xbe, 0xac, 0xbe, 0x7c, 0xfc, 0x2f, 0xbe, 0x76, 0xe3, 0xd6, 0x3d,
- 0x3c, 0xa6, 0x40, 0xbd, 0xab, 0xdd, 0x83, 0xbc, 0x11, 0x39, 0xfb, 0x3c,
- 0x1a, 0x19, 0x09, 0xbb, 0x8c, 0x48, 0x25, 0xbe, 0x58, 0x79, 0x79, 0x3e,
- 0xba, 0x00, 0xe0, 0xbc, 0x3f, 0x2f, 0x88, 0xbd, 0xec, 0x8a, 0xd0, 0x3e,
- 0x1b, 0x5f, 0x93, 0xbb, 0xc8, 0x6e, 0x00, 0xbf, 0x0a, 0x6c, 0x28, 0x3c,
- 0x73, 0x40, 0x95, 0xbe, 0xb3, 0x16, 0x65, 0x3e, 0x73, 0x08, 0x2b, 0xbe,
- 0x13, 0xe5, 0x05, 0xbf, 0x85, 0x3d, 0xb1, 0x3e, 0x6e, 0x86, 0x48, 0xbe,
- 0x81, 0xda, 0x04, 0x3e, 0x9b, 0xff, 0x2e, 0x3d, 0x1c, 0x20, 0xbc, 0xbe,
- 0x1b, 0x99, 0x7d, 0x3c, 0x61, 0xcd, 0x18, 0x3e, 0x15, 0x23, 0x6e, 0xbe,
- 0x64, 0xa7, 0x6f, 0xbe, 0xda, 0x76, 0x0e, 0xbd, 0x00, 0x1d, 0x2e, 0x3e,
- 0x37, 0xc4, 0xb2, 0xbe, 0x06, 0x9c, 0x61, 0xbe, 0x1a, 0x44, 0x2f, 0xbc,
- 0x57, 0x5e, 0x81, 0x3e, 0xf6, 0x82, 0xe3, 0x3d, 0x71, 0x2e, 0xdc, 0x3e,
- 0x35, 0x60, 0xcf, 0x3e, 0x83, 0x18, 0xfd, 0xbc, 0x6d, 0x71, 0x04, 0x3e,
- 0x07, 0xba, 0xd8, 0xbc, 0xa6, 0x8b, 0x2a, 0xbd, 0xf7, 0x44, 0x54, 0xbd,
- 0xfa, 0x10, 0x3f, 0xbe, 0x6b, 0xc4, 0xd3, 0xbb, 0x62, 0xd6, 0x39, 0x3d,
- 0x70, 0x2a, 0xc5, 0x3e, 0x4e, 0x6a, 0x6c, 0xbe, 0xbd, 0xdb, 0x1c, 0xbd,
- 0x07, 0xed, 0xb5, 0xbe, 0xc6, 0x48, 0x9e, 0xbe, 0xc3, 0xe2, 0xec, 0xbe,
- 0x39, 0x7d, 0x31, 0x3d, 0x36, 0x0a, 0x94, 0x3e, 0x32, 0x66, 0x5e, 0x3e,
- 0x16, 0xee, 0x5b, 0x3e, 0x94, 0x2b, 0x2a, 0x3d, 0x46, 0xfb, 0x8e, 0xbe,
- 0x15, 0x2e, 0x3a, 0xbe, 0xa1, 0xc0, 0xaf, 0xbc, 0x24, 0xff, 0x0b, 0x3d,
- 0x22, 0x5c, 0x4e, 0x3e, 0x09, 0x24, 0xae, 0xbd, 0xc9, 0xb2, 0xb5, 0xbd,
- 0x9a, 0xe7, 0x37, 0x3e, 0x0e, 0x12, 0x6c, 0x3d, 0x29, 0xc0, 0x23, 0x3e,
- 0x00, 0x15, 0x89, 0xbe, 0xb5, 0x99, 0x64, 0x3e, 0xb1, 0xc7, 0x8e, 0xbe,
- 0x0f, 0x17, 0xc4, 0x3d, 0x17, 0x69, 0xa5, 0xbe, 0x4f, 0xee, 0x9d, 0xbc,
- 0x7e, 0xb4, 0xe4, 0xbc, 0x09, 0x2c, 0xda, 0x3d, 0xdc, 0xb7, 0xfb, 0xbd,
- 0x3e, 0x01, 0x37, 0xbe, 0xc4, 0x40, 0xf1, 0x3e, 0x51, 0xa3, 0x90, 0xbe,
- 0x89, 0x92, 0x13, 0x3e, 0xe8, 0x77, 0x20, 0xbe, 0xb2, 0x97, 0xf2, 0xbd,
- 0x7d, 0x00, 0x4d, 0x3d, 0x32, 0x61, 0x82, 0xbd, 0x32, 0xc6, 0x8a, 0x3e,
- 0xaf, 0x33, 0xf5, 0x3e, 0xe6, 0x5c, 0x87, 0xbe, 0x52, 0x87, 0x39, 0x3e,
- 0x1f, 0x6e, 0x65, 0x3e, 0xbd, 0x6f, 0xa7, 0xbe, 0xcf, 0x90, 0xce, 0xbe,
- 0x05, 0x9d, 0xab, 0x3d, 0x43, 0xd2, 0xc2, 0x3d, 0xdd, 0x0f, 0xa2, 0x3e,
- 0xdf, 0xd9, 0xb2, 0xbe, 0x6f, 0xa9, 0x97, 0xbe, 0x4e, 0x6b, 0x36, 0xbe,
- 0x58, 0x8f, 0x7b, 0x3d, 0x1a, 0xf4, 0xf2, 0xbc, 0x70, 0xfc, 0x87, 0x3d,
- 0xc5, 0x51, 0xde, 0xbe, 0x79, 0xaf, 0xa3, 0xbd, 0x6c, 0x63, 0xa3, 0x3d,
- 0x3a, 0xe9, 0x48, 0x3e, 0x62, 0x19, 0x05, 0xbe, 0x10, 0x48, 0x26, 0xbe,
- 0x81, 0x3b, 0x99, 0xbc, 0x88, 0x29, 0x96, 0xbd, 0xe4, 0x9b, 0xb7, 0x3e,
- 0x97, 0x04, 0x1d, 0x3e, 0xaf, 0xe0, 0x53, 0xbe, 0x65, 0x62, 0x46, 0xbe,
- 0x00, 0x7d, 0x7d, 0xbe, 0x36, 0x45, 0xdf, 0x3d, 0xe7, 0x6c, 0xe7, 0xbe,
- 0x14, 0x6b, 0x94, 0xbc, 0x1f, 0x57, 0x34, 0x3e, 0x46, 0xb4, 0x83, 0x3e,
- 0x5e, 0x26, 0xf6, 0xbd, 0x76, 0x36, 0xca, 0x3e, 0x3e, 0xa0, 0x81, 0x3d,
- 0x11, 0x0a, 0xd0, 0x3e, 0xb6, 0xb2, 0x91, 0xbd, 0x13, 0x5d, 0x4a, 0xbe,
- 0x07, 0x2c, 0xa6, 0xbc, 0xc2, 0x39, 0x27, 0x3e, 0xcc, 0xd0, 0x1d, 0x3b,
- 0xcc, 0x9a, 0x3b, 0xbd, 0xec, 0x5d, 0x00, 0x3e, 0x47, 0xe9, 0x01, 0xbf,
- 0xff, 0x7c, 0xc0, 0x3e, 0xa9, 0xd4, 0x52, 0x3e, 0x34, 0x59, 0x6b, 0xbe,
- 0xa1, 0xbe, 0x3e, 0xbe, 0xa4, 0x3a, 0x0f, 0x3e, 0xd5, 0x0b, 0x22, 0xbd,
- 0x9d, 0xc4, 0x50, 0x3e, 0xf3, 0x66, 0x01, 0x3e, 0xb1, 0x5e, 0x7d, 0xbd,
- 0xf8, 0x08, 0x1a, 0x3d, 0xdd, 0x30, 0x9c, 0x3d, 0x61, 0x75, 0xbf, 0xbe,
- 0xfb, 0xc3, 0x1c, 0x3e, 0x87, 0xb3, 0xab, 0x3d, 0xf5, 0xd9, 0x6a, 0xbc,
- 0x6e, 0x4d, 0x8b, 0x3e, 0xec, 0x11, 0x9b, 0x3d, 0x8c, 0x35, 0xc2, 0x3a,
- 0xa3, 0x64, 0x2e, 0xbd, 0xdd, 0xba, 0xe5, 0xbd, 0x51, 0x90, 0xbf, 0xbd,
- 0xc2, 0x1b, 0x69, 0xbe, 0x3d, 0x85, 0x14, 0xbc, 0x8a, 0xdd, 0x9a, 0xbc,
- 0x3d, 0xbd, 0xa5, 0xbc, 0x63, 0x9a, 0xb8, 0x3d, 0x08, 0x38, 0x4f, 0x3d,
- 0x08, 0x0f, 0x8c, 0xbe, 0x4e, 0xa7, 0x26, 0x3d, 0x2f, 0xc9, 0xa9, 0xbd,
- 0xb3, 0xa9, 0xa4, 0x3d, 0x6f, 0x35, 0xb0, 0xbd, 0x38, 0x87, 0xc8, 0xbd,
- 0x27, 0x22, 0x94, 0xbe, 0xb9, 0xba, 0x47, 0x3e, 0x1b, 0xeb, 0x8f, 0xbe,
- 0xb4, 0x34, 0x70, 0xbe, 0x3e, 0xf9, 0xd9, 0x3b, 0x1a, 0x34, 0x35, 0x3e,
- 0x73, 0x7f, 0x8a, 0xbb, 0x90, 0xa6, 0x4c, 0x3c, 0xfb, 0x15, 0x88, 0x3c,
- 0x48, 0xa4, 0x76, 0x3e, 0xfa, 0x06, 0x44, 0x3e, 0xff, 0xfc, 0x07, 0xbd,
- 0xd3, 0x1b, 0xc6, 0xbd, 0x78, 0xde, 0x40, 0xbe, 0xdb, 0x63, 0xde, 0xbd,
- 0xe9, 0xfc, 0xc1, 0xbd, 0xea, 0x65, 0xd4, 0xbd, 0x04, 0x9c, 0x38, 0xbe,
- 0x83, 0x40, 0x50, 0xbd, 0x34, 0x99, 0x43, 0xbe, 0xb4, 0x0a, 0x16, 0xbd,
- 0xe8, 0x12, 0xb2, 0x3d, 0xfa, 0x00, 0xdb, 0x3d, 0xf4, 0x3d, 0x15, 0xbd,
- 0x1d, 0x5f, 0x16, 0x3d, 0x79, 0x3a, 0x50, 0xbd, 0x55, 0xbf, 0x93, 0xbd,
- 0x67, 0x2d, 0x66, 0xbd, 0x6a, 0xc0, 0xa8, 0xbd, 0x2d, 0x63, 0xb5, 0xbe,
- 0xc2, 0x19, 0xaa, 0x3e, 0x60, 0xd1, 0x15, 0x3d, 0x75, 0x3f, 0x74, 0xbe,
- 0xf1, 0x64, 0xa2, 0x3d, 0xfc, 0xca, 0xfe, 0xbc, 0x09, 0x00, 0x43, 0xbe,
- 0x0a, 0xab, 0x85, 0xbe, 0xb1, 0x66, 0x86, 0x3e, 0x09, 0x78, 0xec, 0xbc,
- 0xa0, 0x07, 0xfa, 0x3d, 0x70, 0x6f, 0xa9, 0xba, 0x77, 0x7b, 0x45, 0xbe,
- 0x2d, 0x57, 0xd4, 0xbd, 0xed, 0xe7, 0x2f, 0xbe, 0x83, 0xa9, 0x4d, 0xbe,
- 0x38, 0x9d, 0xd5, 0xbe, 0x6c, 0xa6, 0xf7, 0xbd, 0x61, 0x5f, 0xb7, 0x3e,
- 0x69, 0x05, 0xd4, 0x3d, 0xc9, 0xfd, 0xe8, 0xbd, 0x78, 0x1d, 0x4b, 0x3e,
- 0x67, 0x19, 0xee, 0xbe, 0x22, 0x4f, 0x6a, 0x3d, 0xb3, 0x5c, 0xf8, 0xbd,
- 0x54, 0x02, 0xac, 0xbe, 0x1b, 0xf5, 0x49, 0xbe, 0x4f, 0xea, 0xfd, 0x3d,
- 0x3d, 0x47, 0xf3, 0x3d, 0x4f, 0x87, 0x0e, 0xbe, 0x5f, 0xb8, 0x27, 0xbe,
- 0xe6, 0x9f, 0xc1, 0xbe, 0x6d, 0x29, 0x9d, 0xbe, 0x3b, 0xfd, 0x0c, 0xbe,
- 0xe6, 0xd9, 0xf3, 0x3d, 0x43, 0x88, 0x30, 0x3e, 0x2c, 0x65, 0x88, 0xbd,
- 0x05, 0xc0, 0x82, 0xbd, 0xd8, 0x5f, 0x15, 0xbe, 0xb5, 0x8d, 0xe1, 0x3d,
- 0xc1, 0xe1, 0x32, 0xbe, 0xba, 0x4b, 0x68, 0x3d, 0x3d, 0xb9, 0xbf, 0xbd,
- 0x38, 0x33, 0x4a, 0xbe, 0xf9, 0x22, 0x31, 0xbe, 0xb4, 0x61, 0x89, 0x3e,
- 0x3d, 0x5e, 0x2a, 0xbe, 0xf8, 0xbb, 0xf9, 0xbe, 0xeb, 0x45, 0x0d, 0xbd,
- 0x7a, 0x9f, 0x4a, 0xbe, 0x19, 0x82, 0x91, 0x3d, 0x45, 0xa0, 0x84, 0xbd,
- 0x80, 0xe4, 0x3f, 0x3d, 0x08, 0xe9, 0x5b, 0x3d, 0x2b, 0x97, 0x03, 0x3e,
- 0x99, 0x2d, 0x85, 0x3c, 0x59, 0x7c, 0x9f, 0xbd, 0x2c, 0x91, 0x3b, 0xbd,
- 0x61, 0xf1, 0x2a, 0xbd, 0xa3, 0xdc, 0xf1, 0x3a, 0xa8, 0x62, 0x12, 0x3e,
- 0x9c, 0xe5, 0xc5, 0xbc, 0x9f, 0x29, 0x07, 0x3e, 0xb6, 0xf5, 0x1b, 0x3e,
- 0x7c, 0xd0, 0xbf, 0xbe, 0x78, 0xf6, 0x53, 0xbd, 0x2f, 0x19, 0x71, 0xbe,
- 0xc8, 0x76, 0xcb, 0xbd, 0x84, 0xe6, 0x1c, 0xbb, 0x13, 0x12, 0xee, 0xbe,
- 0x6d, 0xbf, 0xa3, 0xbd, 0x6d, 0x74, 0xc0, 0x3d, 0x06, 0xfc, 0xb4, 0x3d,
- 0xc8, 0x19, 0xa2, 0xbe, 0xc2, 0x47, 0xc9, 0xbd, 0xbd, 0x18, 0xbc, 0xbd,
- 0x59, 0x2d, 0x95, 0xbb, 0x2e, 0xfc, 0x4d, 0x3e, 0xfa, 0xc1, 0xb3, 0x3d,
- 0x4e, 0xac, 0xa6, 0xbc, 0xc0, 0xa3, 0x03, 0xbf, 0x7e, 0xd8, 0xbc, 0xbc,
- 0xdd, 0xd8, 0x98, 0x3d, 0xa0, 0xa0, 0x41, 0xbd, 0xbc, 0xe6, 0x47, 0x3e,
- 0xb4, 0xfa, 0x30, 0xbe, 0x16, 0xe0, 0xc1, 0xbd, 0xfa, 0xfe, 0x89, 0xbc,
- 0x74, 0x0a, 0x01, 0xbe, 0x39, 0x68, 0x8d, 0x3e, 0x77, 0x3f, 0xd5, 0x3c,
- 0x59, 0xf0, 0x02, 0xbe, 0x86, 0x06, 0x66, 0x3d, 0xcc, 0xbd, 0xdb, 0xbd,
- 0xd3, 0x08, 0x3f, 0xbd, 0xac, 0x61, 0xe9, 0xbd, 0xf9, 0x47, 0x15, 0xbe,
- 0xaf, 0x6d, 0x05, 0x3e, 0xac, 0x00, 0xa5, 0x3d, 0x6b, 0x35, 0x3b, 0xbe,
- 0xb6, 0x54, 0x27, 0x3c, 0x73, 0x8f, 0x91, 0x3d, 0x64, 0xc0, 0xd3, 0xbd,
- 0x9a, 0x52, 0xda, 0xbc, 0xed, 0xe1, 0x0c, 0x3e, 0x3c, 0x97, 0x15, 0xbd,
- 0xee, 0x3f, 0xcd, 0x3d, 0xa3, 0x84, 0x22, 0x3d, 0x7e, 0x74, 0x9b, 0x3d,
- 0x8b, 0x8c, 0x73, 0x3e, 0xf5, 0x90, 0xe3, 0x3c, 0x99, 0xd6, 0x9f, 0xbd,
- 0x90, 0xc7, 0x01, 0xbe, 0xc3, 0x7b, 0x2f, 0xbe, 0xdc, 0xf0, 0x1d, 0xbd,
- 0xc4, 0x1d, 0x7d, 0x3e, 0x56, 0x18, 0x2d, 0xbe, 0xd1, 0xb9, 0x79, 0xbe,
- 0x74, 0x88, 0xe9, 0x3d, 0x44, 0x3a, 0x28, 0x3e, 0x74, 0xa8, 0xcd, 0xbb,
- 0x42, 0xce, 0xa8, 0xbd, 0xe4, 0xfa, 0xb3, 0xbd, 0x46, 0xf2, 0x2f, 0xbe,
- 0xa7, 0x11, 0x13, 0x3e, 0xfb, 0x8f, 0x0f, 0x3e, 0x28, 0x84, 0x77, 0xbe,
- 0xf3, 0x4b, 0x14, 0x3e, 0x5f, 0xb4, 0x5b, 0x3e, 0x2e, 0xa1, 0xba, 0x3d,
- 0xb1, 0xc6, 0x44, 0xbe, 0xbc, 0x28, 0xd9, 0x3e, 0x4f, 0x0a, 0x90, 0xbd,
- 0x9a, 0x49, 0x00, 0xbe, 0x36, 0xa3, 0x5b, 0xbe, 0x5d, 0xf7, 0x1f, 0xbe,
- 0x0b, 0x11, 0x50, 0xbe, 0xca, 0xfa, 0xac, 0x3d, 0xad, 0x70, 0x1c, 0xbe,
- 0xfb, 0x27, 0xb4, 0x3d, 0x21, 0xe4, 0x24, 0xbe, 0xa9, 0x0e, 0x11, 0xbe,
- 0x73, 0x24, 0xa1, 0xbc, 0xb3, 0xa9, 0xcf, 0xbd, 0xb1, 0x74, 0xa6, 0xbd,
- 0xfb, 0xb0, 0x73, 0x3d, 0x9f, 0x7d, 0x08, 0xbd, 0xa9, 0x78, 0x74, 0xbe,
- 0x63, 0x0c, 0xa2, 0xbc, 0x7a, 0xb5, 0x73, 0x3d, 0xf9, 0x2c, 0x9f, 0x3d,
- 0xe4, 0x72, 0x5d, 0xbe, 0xec, 0xa6, 0x2e, 0xbe, 0x03, 0x39, 0xdd, 0x3c,
- 0x37, 0x28, 0xfd, 0xbd, 0x1a, 0xea, 0x23, 0xbe, 0xf9, 0x05, 0xd1, 0xbd,
- 0xe3, 0xe8, 0x4f, 0xbd, 0x6f, 0xcd, 0xc7, 0xbd, 0xcc, 0xf3, 0x33, 0x3e,
- 0x87, 0x64, 0x73, 0x3e, 0x42, 0x33, 0xd4, 0xbd, 0x23, 0x9c, 0xca, 0xbc,
- 0x00, 0xb1, 0xd4, 0xbc, 0x79, 0xb5, 0x07, 0xbe, 0xad, 0x9b, 0x3b, 0xbe,
- 0x82, 0x75, 0x00, 0x3c, 0x29, 0x98, 0x9e, 0xbc, 0x3c, 0x27, 0xa3, 0xbe,
- 0x29, 0x1e, 0xb9, 0xbd, 0xe1, 0xc3, 0xf8, 0x3d, 0x4b, 0xbb, 0x36, 0xbe,
- 0x6a, 0x75, 0x11, 0x3c, 0x2c, 0x69, 0xfd, 0x3c, 0x8e, 0xee, 0xfb, 0xbc,
- 0x5f, 0x37, 0x33, 0xbb, 0xc4, 0x46, 0xb5, 0xbd, 0x63, 0x81, 0xdb, 0x3c,
- 0x75, 0x9b, 0x09, 0xbd, 0x13, 0x46, 0x9e, 0x3d, 0x54, 0xd3, 0xaa, 0x3d,
- 0x25, 0xcc, 0x92, 0xbd, 0x0b, 0x2e, 0x7c, 0xbe, 0x36, 0x6e, 0x11, 0xbe,
- 0xe0, 0x84, 0xcd, 0x3d, 0x33, 0x31, 0x68, 0x3e, 0xf0, 0x8e, 0x52, 0xbe,
- 0xa7, 0x94, 0xa9, 0xbd, 0x00, 0x4e, 0x85, 0xbd, 0x54, 0xa1, 0x32, 0xbe,
- 0xbf, 0xb0, 0x1d, 0x3e, 0xbd, 0x8c, 0x9b, 0xbd, 0xca, 0x1d, 0xfa, 0xbb,
- 0x19, 0x6a, 0x9f, 0x3e, 0x89, 0xd0, 0x03, 0xbe, 0xe8, 0x4f, 0x7a, 0xbd,
- 0x02, 0xd6, 0x7a, 0xbd, 0xce, 0xe5, 0x2e, 0xbe, 0x01, 0xb7, 0x3e, 0x3e,
- 0x23, 0x9e, 0x01, 0xbe, 0x09, 0x2e, 0xcd, 0xbe, 0x1f, 0x9e, 0x13, 0x3c,
- 0x37, 0x4d, 0x54, 0x3d, 0x19, 0x90, 0x6d, 0x3d, 0x49, 0xb5, 0xa3, 0xbe,
- 0x9f, 0x5c, 0xa6, 0xbc, 0x08, 0xb6, 0xc8, 0xbd, 0xf8, 0x61, 0xe5, 0xbd,
- 0x90, 0x9c, 0xf6, 0x3d, 0x88, 0x8c, 0x88, 0x3d, 0x0b, 0x2c, 0xd4, 0xbd,
- 0x04, 0x8e, 0x37, 0x3e, 0xdd, 0x15, 0x83, 0xbe, 0xbf, 0xe3, 0xee, 0xbc,
- 0x4a, 0x95, 0x64, 0x3d, 0xfe, 0x45, 0x7a, 0x3c, 0x01, 0x2c, 0x29, 0x3e,
- 0x69, 0x38, 0xea, 0x3d, 0x08, 0x85, 0x4c, 0xbe, 0x24, 0x1a, 0x49, 0xbe,
- 0x72, 0xf6, 0xbb, 0x3d, 0x24, 0xac, 0x8c, 0x3e, 0xfb, 0xb2, 0x45, 0xbe,
- 0x07, 0x2c, 0x69, 0xbe, 0xa9, 0x0d, 0x1b, 0xbd, 0xa8, 0xe7, 0xb8, 0x3d,
- 0x3d, 0x8e, 0x8a, 0x3e, 0xcf, 0x33, 0xd3, 0xbd, 0x70, 0x18, 0x6f, 0x3d,
- 0x0c, 0x5a, 0x4a, 0x3c, 0x2b, 0x14, 0xa7, 0x3d, 0xe3, 0xbd, 0x92, 0x3d,
- 0xc8, 0x21, 0x8c, 0xbb, 0x51, 0x66, 0x41, 0xbe, 0x79, 0xa6, 0x20, 0x3e,
- 0x7c, 0x0c, 0xf9, 0xbd, 0xc3, 0x7f, 0x91, 0x3e, 0xf7, 0x76, 0x71, 0xbc,
- 0x4f, 0xbc, 0x5a, 0x3e, 0x8c, 0x42, 0x46, 0xbe, 0x5a, 0x04, 0xde, 0x3d,
- 0x42, 0x56, 0xa3, 0xbd, 0x28, 0x1f, 0xee, 0xbc, 0x3d, 0x07, 0x3d, 0x3e,
- 0xa1, 0xee, 0xa7, 0x3e, 0x07, 0xfa, 0x4b, 0xbd, 0x19, 0xd7, 0xdb, 0x3d,
- 0x7f, 0x8f, 0x08, 0x3e, 0x52, 0xdf, 0x16, 0x3e, 0xa0, 0x91, 0xbf, 0xbd,
- 0x99, 0xe8, 0x17, 0x3d, 0x40, 0x2e, 0x68, 0xbc, 0x80, 0x4a, 0x22, 0xbe,
- 0x8c, 0xa7, 0x3a, 0xbe, 0x4a, 0x4f, 0x28, 0xbe, 0x46, 0x47, 0x91, 0x3e,
- 0xc2, 0x1d, 0x85, 0x3d, 0x27, 0x6c, 0x2c, 0xbd, 0xb2, 0x55, 0x6a, 0xbe,
- 0x90, 0x0c, 0xc2, 0xbe, 0xc0, 0x18, 0x08, 0xbe, 0x59, 0xd0, 0xaa, 0x3d,
- 0xc3, 0x5b, 0x24, 0x3d, 0x5a, 0x26, 0x96, 0xbe, 0xb5, 0x81, 0x35, 0x3e,
- 0xfa, 0xab, 0xc5, 0xbd, 0x35, 0x59, 0x8b, 0xbe, 0x88, 0x84, 0x25, 0xbe,
- 0xeb, 0xe0, 0x10, 0x3d, 0x86, 0x22, 0x11, 0x3e, 0x5d, 0xeb, 0xcc, 0x3d,
- 0x55, 0x65, 0x14, 0x3d, 0x39, 0xc0, 0x3c, 0x3e, 0x10, 0x97, 0x52, 0x3e,
- 0x37, 0x57, 0x40, 0x3d, 0xed, 0xbe, 0x6e, 0x3d, 0x17, 0x56, 0x85, 0x3d,
- 0xbf, 0xa5, 0x02, 0xbd, 0x2e, 0xcf, 0x43, 0xbd, 0xa1, 0x8d, 0x36, 0xbd,
- 0x9e, 0x60, 0x99, 0xbd, 0xe0, 0xf1, 0x8c, 0x3c, 0x5e, 0x8e, 0x50, 0x3b,
- 0xab, 0x00, 0x5c, 0xbe, 0xa3, 0xab, 0x13, 0xbd, 0xf0, 0x05, 0xa2, 0x3e,
- 0xcb, 0x84, 0x02, 0xbf, 0x0e, 0xde, 0xe8, 0x3b, 0x88, 0xfa, 0x25, 0x3d,
- 0x10, 0x12, 0x90, 0xbe, 0x99, 0x54, 0x55, 0x3d, 0x66, 0x82, 0x91, 0x3e,
- 0xc1, 0xc7, 0x95, 0x3d, 0xe1, 0xed, 0x19, 0x3c, 0xbf, 0xdf, 0xef, 0x3c,
- 0x46, 0x6b, 0x1d, 0xbc, 0x36, 0x8d, 0xbf, 0x3d, 0x97, 0xa6, 0x09, 0xbe,
- 0xd8, 0xcd, 0x9b, 0x3d, 0xe8, 0x25, 0x4d, 0x3e, 0xf2, 0xc8, 0xc2, 0xbb,
- 0xe7, 0xea, 0x37, 0xbe, 0xb3, 0xdc, 0xc6, 0xbd, 0x11, 0x1f, 0x3a, 0x3d,
- 0x81, 0xbf, 0x6b, 0xbd, 0x3a, 0x35, 0xe0, 0xbd, 0x6d, 0x0b, 0x7a, 0xba,
- 0x7c, 0xcb, 0x0a, 0x3c, 0xe5, 0x13, 0x48, 0x3e, 0xd2, 0x98, 0x4d, 0xbd,
- 0xbf, 0x19, 0xa3, 0xbd, 0x45, 0x2a, 0xa0, 0x3d, 0xf0, 0x1e, 0xca, 0x3d,
- 0x9d, 0xb5, 0x22, 0xbe, 0xe2, 0x48, 0x67, 0xbe, 0x63, 0x87, 0x72, 0xbe,
- 0xe6, 0xab, 0x73, 0xbe, 0x55, 0x17, 0x6e, 0x3e, 0x1a, 0x74, 0x0d, 0xbe,
- 0x69, 0x5b, 0x04, 0xbe, 0xa6, 0xdb, 0xfb, 0xbd, 0x91, 0x5f, 0x9c, 0xbd,
- 0xa2, 0x76, 0xf7, 0x3d, 0x32, 0xf8, 0x3c, 0x3d, 0xf4, 0xe2, 0xd1, 0xbd,
- 0xf4, 0x92, 0x0f, 0x3d, 0x4b, 0xbb, 0x85, 0xbe, 0xbd, 0x2f, 0x52, 0x3e,
- 0x5d, 0x09, 0x2f, 0x3e, 0x11, 0x9a, 0xa0, 0x3d, 0x27, 0x5b, 0x0b, 0x3e,
- 0xbd, 0xf6, 0xca, 0xbd, 0x9d, 0x56, 0x25, 0x3e, 0xdf, 0x83, 0x07, 0xbd,
- 0xdc, 0xe2, 0x55, 0x3e, 0xe0, 0x70, 0x80, 0x3e, 0x79, 0x47, 0xbf, 0xbe,
- 0xb8, 0xe8, 0xac, 0x3d, 0xe2, 0xfd, 0xea, 0x3d, 0xe9, 0x57, 0x6c, 0x3e,
- 0x48, 0xf3, 0xa9, 0x3e, 0x26, 0x89, 0xa6, 0x3e, 0x5a, 0x30, 0xfe, 0xbd,
- 0xbb, 0x7a, 0x59, 0x3d, 0x53, 0x3f, 0x89, 0xbe, 0x0d, 0xd0, 0xbe, 0x3d,
- 0xf0, 0x49, 0x10, 0xbe, 0x75, 0x2f, 0xfd, 0x3d, 0x57, 0xa3, 0x3c, 0xbe,
- 0x45, 0x07, 0x77, 0xbe, 0x4c, 0x2d, 0xfa, 0xbd, 0x11, 0xa9, 0x04, 0x3f,
- 0xef, 0xf2, 0x4c, 0x3d, 0xe6, 0xdb, 0xca, 0x3e, 0x30, 0x37, 0xb0, 0xbc,
- 0x10, 0x84, 0xf0, 0xbb, 0xf2, 0x37, 0x1a, 0x3e, 0xfc, 0x7a, 0x1f, 0xbe,
- 0xbb, 0x97, 0x84, 0x3c, 0xbc, 0xc2, 0xb2, 0x3c, 0xb5, 0xaf, 0x1a, 0x3e,
- 0x5f, 0x25, 0x4c, 0xbe, 0x99, 0x81, 0x4f, 0xbe, 0xb8, 0x1d, 0x0e, 0xbe,
- 0x23, 0x07, 0x08, 0x3e, 0xf7, 0x24, 0x3a, 0x3e, 0x2b, 0xc6, 0xdf, 0x3d,
- 0xe7, 0x51, 0x71, 0xbd, 0x42, 0x20, 0xe2, 0xbe, 0xde, 0x45, 0xb5, 0xbe,
- 0x0e, 0x90, 0x0d, 0x3f, 0x94, 0x6d, 0xa7, 0x3d, 0x4e, 0x3c, 0x61, 0x3c,
- 0xf4, 0xee, 0x66, 0x3d, 0xf7, 0xe3, 0x10, 0x3d, 0xc2, 0xe2, 0x64, 0x3d,
- 0x03, 0x3b, 0xf0, 0x3c, 0x2b, 0xed, 0x35, 0x3e, 0x9e, 0xa9, 0x59, 0xbe,
- 0xf7, 0xf6, 0x6c, 0x3e, 0x26, 0x61, 0xc9, 0xbd, 0x1a, 0xb6, 0xaa, 0xbd,
- 0x85, 0xb8, 0xb3, 0x3d, 0x54, 0xc9, 0xfb, 0xbd, 0x13, 0x03, 0xbb, 0xbd,
- 0x8c, 0xfc, 0xa5, 0x3d, 0xb0, 0x1c, 0xde, 0x3e, 0xee, 0xa2, 0x60, 0xbc,
- 0xa5, 0xdc, 0xdb, 0x3b, 0xab, 0x3a, 0x8c, 0xbc, 0x52, 0xdb, 0x40, 0x3e,
- 0x00, 0x2f, 0xa2, 0x3d, 0x2c, 0x71, 0xf7, 0x3d, 0x1f, 0x67, 0x96, 0xbd,
- 0x6e, 0x88, 0xbf, 0x3e, 0x9d, 0xbc, 0xd1, 0xbd, 0xe2, 0x1d, 0x11, 0xbe,
- 0x8d, 0x38, 0xd0, 0x3d, 0x66, 0x55, 0x52, 0x3d, 0x6a, 0x70, 0xd0, 0xbd,
- 0xb8, 0x30, 0x2a, 0xbe, 0xda, 0x65, 0x7a, 0x3d, 0x4c, 0xd5, 0x2a, 0x3e,
- 0x59, 0x33, 0xc1, 0xbd, 0x03, 0xcc, 0x4c, 0xbe, 0x21, 0x38, 0x25, 0x3d,
- 0xb8, 0xb7, 0xa3, 0xbd, 0xb7, 0x88, 0xcc, 0x3e, 0x10, 0xcd, 0x45, 0x3e,
- 0x2e, 0x92, 0xb5, 0x3b, 0x55, 0x31, 0x09, 0x3f, 0x90, 0x64, 0x50, 0x3d,
- 0x22, 0x0f, 0x02, 0x3d, 0xcc, 0x51, 0xd4, 0xbe, 0x3a, 0xba, 0x95, 0xbe,
- 0x20, 0xd8, 0x24, 0x3e, 0x3b, 0x94, 0xb1, 0xbd, 0xec, 0x54, 0xe0, 0xbd,
- 0x7a, 0x44, 0xff, 0x3e, 0x70, 0x27, 0xd9, 0x3c, 0xfd, 0x44, 0x43, 0x3e,
- 0x59, 0x26, 0xa9, 0xbe, 0xcf, 0x6e, 0xf7, 0x3d, 0xd0, 0x80, 0x1c, 0xbe,
- 0xea, 0x7c, 0x07, 0xbc, 0x60, 0x81, 0x24, 0x3e, 0x98, 0x1c, 0x13, 0xbe,
- 0x97, 0xa0, 0x0a, 0xbe, 0x86, 0x4b, 0xe1, 0x3d, 0x70, 0x52, 0x39, 0xbe,
- 0x9f, 0x61, 0x8a, 0xbe, 0x3a, 0xbc, 0x3b, 0xbe, 0x02, 0xea, 0xe3, 0xbd,
- 0xe7, 0x5a, 0x66, 0x3e, 0x26, 0x0e, 0xea, 0xbd, 0x4c, 0x0c, 0xcb, 0xbe,
- 0xec, 0xdd, 0x62, 0x3e, 0x13, 0x15, 0xb1, 0xba, 0x8d, 0x7e, 0xf7, 0xbd,
- 0xc7, 0xaf, 0xb7, 0xbc, 0x9e, 0x77, 0x9b, 0x3d, 0x8b, 0xd0, 0x3b, 0xbd,
- 0xa9, 0xb8, 0xf1, 0x3d, 0x6a, 0xb5, 0xe1, 0x3c, 0x82, 0x83, 0x34, 0x3e,
- 0x0d, 0x27, 0xd3, 0x3e, 0x69, 0x8a, 0xcc, 0xbd, 0x10, 0xa5, 0xcc, 0x3d,
- 0x27, 0x2c, 0x10, 0x3f, 0x1b, 0x5b, 0x3b, 0xbd, 0x4a, 0xea, 0xba, 0x3d,
- 0x3b, 0x64, 0x18, 0xbe, 0xfe, 0x6c, 0xb6, 0xbc, 0x0e, 0x9e, 0x69, 0xbc,
- 0x82, 0xf1, 0xf0, 0xbd, 0x4a, 0x6c, 0x18, 0xbe, 0xb3, 0x2f, 0x8c, 0xbe,
- 0x42, 0xaf, 0xa7, 0x3d, 0x80, 0x92, 0x1e, 0x3f, 0xe1, 0xc8, 0xcd, 0x3e,
- 0xe5, 0x76, 0x22, 0x3f, 0x24, 0x06, 0x94, 0xbd, 0x54, 0x49, 0xed, 0xbd,
- 0x0e, 0x3c, 0x3f, 0x3f, 0xdc, 0xc9, 0x49, 0x3d, 0xdb, 0xc0, 0xfe, 0xbd,
- 0xe8, 0x3a, 0x42, 0xbd, 0xa1, 0x3a, 0x8e, 0xbe, 0x1d, 0xb9, 0x38, 0xbe,
- 0xfe, 0xd0, 0x24, 0x3f, 0x28, 0x57, 0x50, 0xbe, 0x2b, 0x38, 0x04, 0xbe,
- 0x31, 0x49, 0x67, 0xbd, 0x59, 0x98, 0x97, 0xbd, 0x3f, 0x9d, 0xeb, 0x3d,
- 0xa1, 0x39, 0x23, 0xbe, 0x5e, 0xbe, 0x00, 0x3e, 0x8e, 0x7f, 0xd5, 0x3e,
- 0xb7, 0x08, 0x00, 0x3d, 0x21, 0x9d, 0xf6, 0xbd, 0x86, 0x8d, 0x8b, 0x3e,
- 0xaf, 0xdd, 0x49, 0x3e, 0x2f, 0x80, 0x01, 0x3d, 0x49, 0x75, 0x30, 0xbe,
- 0x00, 0x87, 0x03, 0xbd, 0xe6, 0x6d, 0xc2, 0xbe, 0x2a, 0xd1, 0x86, 0xbd,
- 0x32, 0xfc, 0x90, 0xbd, 0x03, 0xd1, 0xd2, 0xbd, 0xbe, 0x60, 0x2a, 0xbe,
- 0x10, 0x30, 0x4a, 0xbe, 0xf2, 0xe1, 0xec, 0xbc, 0x66, 0xf8, 0x20, 0xbd,
- 0x17, 0xf6, 0x7a, 0xbd, 0x2d, 0xe1, 0x20, 0x3e, 0x25, 0xec, 0x52, 0xbe,
- 0x22, 0x2d, 0x96, 0x3b, 0x66, 0x97, 0x82, 0x3e, 0xa1, 0xe4, 0x70, 0x3b,
- 0x11, 0x28, 0xa3, 0x3e, 0xd6, 0x2b, 0x3a, 0xbe, 0x4d, 0x6f, 0xf4, 0xbd,
- 0x13, 0xff, 0xf8, 0xbd, 0xb4, 0xf5, 0xe6, 0xbc, 0x1b, 0x20, 0x51, 0x3e,
- 0x29, 0x5d, 0xda, 0xbe, 0xbc, 0xe9, 0x06, 0xbe, 0x3c, 0x17, 0x55, 0xbe,
- 0x2c, 0xa8, 0x22, 0x3e, 0xf5, 0xe0, 0x2e, 0x3d, 0x7d, 0x7d, 0x29, 0x3e,
- 0xa2, 0x30, 0x13, 0xbe, 0xa9, 0x29, 0x3e, 0xbd, 0x68, 0x1f, 0xbd, 0x3e,
- 0x04, 0x4b, 0xb5, 0x3d, 0x40, 0x10, 0x21, 0x3e, 0x3c, 0xe6, 0xb3, 0x3d,
- 0x09, 0x2d, 0x98, 0xbd, 0x7e, 0xb3, 0xf4, 0xbb, 0x1e, 0x88, 0xe9, 0xbd,
- 0x83, 0x8b, 0x53, 0x3e, 0x30, 0x4a, 0x21, 0xbe, 0x2b, 0xd1, 0xa4, 0xbd,
- 0xc7, 0x35, 0xb7, 0x3d, 0xb0, 0xf6, 0xb8, 0xbd, 0x03, 0xfc, 0x48, 0xbe,
- 0x45, 0x0e, 0x96, 0xb8, 0xde, 0x6b, 0x0c, 0xbd, 0x7f, 0x5e, 0x2d, 0x3e,
- 0xfe, 0xce, 0xa3, 0x3e, 0x96, 0xe5, 0xa7, 0x3e, 0x31, 0x9a, 0xba, 0x3c,
- 0x18, 0x46, 0x56, 0x3d, 0xb1, 0xc2, 0xc4, 0xbc, 0x18, 0x50, 0x55, 0x3d,
- 0x3f, 0x42, 0x0e, 0xbc, 0xa3, 0x3a, 0x2c, 0xbd, 0x46, 0xc0, 0xfa, 0x3d,
- 0x5f, 0x66, 0x19, 0xbd, 0x79, 0x97, 0xbe, 0xbe, 0x38, 0x84, 0x64, 0xbd,
- 0x32, 0xd1, 0x0d, 0xbe, 0x92, 0x94, 0xa1, 0xbd, 0x76, 0xff, 0x24, 0xbe,
- 0xa4, 0x16, 0x9e, 0xbd, 0x3b, 0x8a, 0x71, 0xbd, 0xbc, 0x6d, 0x33, 0xbe,
- 0xe7, 0xc4, 0x10, 0xbe, 0x9c, 0xb2, 0x95, 0xbd, 0xcc, 0xc4, 0xcd, 0xbd,
- 0x12, 0x97, 0x98, 0xbe, 0x7f, 0xe1, 0xf9, 0xbd, 0xb2, 0xfa, 0x22, 0xbe,
- 0x5b, 0x3a, 0x9b, 0x3d, 0xdb, 0xc0, 0xd9, 0xbd, 0x4c, 0xe0, 0x17, 0x3d,
- 0x7f, 0x02, 0x43, 0x3c, 0x75, 0x68, 0xbd, 0xbd, 0x51, 0x4f, 0x85, 0x3e,
- 0x9c, 0x04, 0xa9, 0xbe, 0xd8, 0x32, 0x02, 0xbe, 0x07, 0xb0, 0xc1, 0x3e,
- 0x20, 0xba, 0xb0, 0xbd, 0xd1, 0x60, 0x4f, 0x3d, 0x27, 0xe1, 0x88, 0xbd,
- 0xc8, 0xe6, 0x0f, 0xbe, 0x2e, 0xa9, 0x95, 0xbc, 0x5d, 0x5a, 0xd2, 0x3d,
- 0xc8, 0xef, 0x4d, 0xbe, 0x32, 0xe7, 0x4f, 0x3d, 0xf8, 0x0d, 0x11, 0x3d,
- 0xc4, 0x74, 0x61, 0xbd, 0xdc, 0x38, 0x98, 0x3e, 0xfa, 0xe3, 0x50, 0xbe,
- 0xac, 0x50, 0x2c, 0xbd, 0xd3, 0x61, 0x57, 0xbe, 0x82, 0xd0, 0xe1, 0x3d,
- 0xee, 0xcc, 0xf2, 0xbc, 0xb0, 0x57, 0x3f, 0xbd, 0x3a, 0x45, 0xc3, 0x39,
- 0x5a, 0x2f, 0xdd, 0x3d, 0xee, 0x11, 0xf3, 0xba, 0xf3, 0xcf, 0xaa, 0x3e,
- 0x4a, 0xa3, 0x13, 0x3e, 0xa0, 0xb0, 0x70, 0xbe, 0xac, 0x9d, 0xda, 0x3c,
- 0x71, 0xf1, 0x4d, 0x3c, 0x97, 0x57, 0x85, 0xbc, 0x89, 0xbd, 0x27, 0xbe,
- 0xbc, 0xe5, 0x83, 0x3e, 0x99, 0x5d, 0xa1, 0x3d, 0x22, 0x9a, 0xca, 0xbd,
- 0x45, 0xc0, 0x07, 0xbe, 0x4c, 0xc1, 0x81, 0xbe, 0xc2, 0xba, 0x30, 0x3d,
- 0x5b, 0xbe, 0xbd, 0xbd, 0x68, 0xc6, 0x54, 0x3e, 0x3e, 0x50, 0x11, 0x3f,
- 0x20, 0x23, 0xc6, 0x3d, 0x80, 0x10, 0x3f, 0x3e, 0x0c, 0x61, 0xf4, 0x3e,
- 0xee, 0xdd, 0x44, 0xbd, 0x4d, 0xe5, 0x90, 0x3e, 0x05, 0x81, 0xc2, 0xbd,
- 0x38, 0x9b, 0xac, 0x3d, 0x39, 0x8e, 0xb2, 0xbb, 0xc2, 0xef, 0x93, 0xbd,
- 0x58, 0xa6, 0xc6, 0xbc, 0x75, 0x95, 0x4b, 0x3e, 0xfb, 0x63, 0x82, 0xbe,
- 0x94, 0xfd, 0xbc, 0x3e, 0x68, 0x0a, 0x10, 0xbe, 0x0a, 0x07, 0xdb, 0xbc,
- 0x97, 0xf0, 0xbc, 0xbe, 0xe3, 0x82, 0xc7, 0xbd, 0x45, 0xba, 0x25, 0xbe,
- 0x64, 0x5d, 0x71, 0x3d, 0xdd, 0xed, 0x20, 0xbe, 0x6e, 0x67, 0xfa, 0xbd,
- 0x58, 0xc0, 0xf4, 0x3d, 0xbb, 0x5e, 0x12, 0xbe, 0xbc, 0x58, 0x84, 0x3e,
- 0xc7, 0x51, 0xc5, 0xbd, 0x3c, 0xf5, 0x9f, 0xbe, 0xb9, 0x1f, 0xfc, 0x3d,
- 0x50, 0x3a, 0x03, 0xbe, 0x70, 0x55, 0x08, 0xbd, 0xb6, 0xca, 0x85, 0xbd,
- 0x4c, 0x0e, 0x98, 0xbd, 0x71, 0x7a, 0x89, 0xbe, 0x0b, 0xc1, 0x18, 0xbe,
- 0x7d, 0xe5, 0xf4, 0xbe, 0xc0, 0x35, 0x65, 0x3e, 0xb9, 0xb7, 0x7b, 0xbd,
- 0x7f, 0x97, 0xdf, 0x3c, 0xc2, 0xd5, 0x6f, 0x3e, 0x8f, 0x6a, 0x09, 0x3e,
- 0xcd, 0x22, 0x65, 0x3d, 0x40, 0xe7, 0x76, 0xbd, 0x92, 0xc0, 0x3e, 0x3c,
- 0x00, 0xa8, 0xb5, 0xbe, 0x49, 0xb8, 0xa6, 0xbd, 0x92, 0x9b, 0x43, 0xbd,
- 0x74, 0xae, 0xd5, 0x3b, 0x27, 0x2e, 0x0d, 0x3d, 0x62, 0x87, 0x80, 0xbe,
- 0xdf, 0x2f, 0x5f, 0x3d, 0x18, 0xdb, 0x2e, 0xbe, 0x63, 0xfb, 0x32, 0x3e,
- 0x31, 0x43, 0x06, 0x3d, 0x60, 0x5c, 0x1d, 0xbe, 0x23, 0xe4, 0xac, 0xbe,
- 0x3e, 0xe8, 0x4c, 0xbe, 0x4e, 0xd0, 0x2e, 0x3e, 0xc4, 0xa5, 0x1a, 0xbe,
- 0xd1, 0x14, 0xd9, 0x3c, 0xfb, 0x7d, 0x54, 0xbd, 0x08, 0x11, 0x55, 0xbd,
- 0x4c, 0xa7, 0x37, 0x3e, 0x51, 0x94, 0x6c, 0xbe, 0xe0, 0xea, 0x84, 0xbd,
- 0xa5, 0x48, 0xa3, 0x3d, 0x56, 0xe2, 0x9d, 0x3e, 0xba, 0x05, 0xa7, 0xbe,
- 0x7a, 0xe3, 0x28, 0xbd, 0x08, 0xd9, 0x58, 0x3d, 0xd8, 0xc1, 0xa0, 0x3d,
- 0x89, 0xf0, 0x4e, 0xbe, 0xaf, 0x9e, 0x08, 0xbe, 0x53, 0x82, 0x48, 0xbe,
- 0x13, 0xf1, 0xe4, 0x3d, 0x7e, 0xe3, 0x6e, 0x3e, 0xc8, 0xdb, 0xbd, 0xbd,
- 0xf8, 0x18, 0x87, 0xbb, 0x0a, 0x60, 0xae, 0xbe, 0x73, 0xcb, 0x88, 0xbd,
- 0x7e, 0x0f, 0x3d, 0x3e, 0xc7, 0x8a, 0x93, 0xbb, 0x3a, 0xc7, 0x09, 0xbf,
- 0xc5, 0x24, 0x6e, 0xbe, 0x38, 0x81, 0x24, 0x3e, 0xa7, 0xf1, 0x29, 0x3e,
- 0x77, 0x7d, 0x59, 0xbe, 0x7d, 0x30, 0xa9, 0x3c, 0x85, 0x2e, 0xd3, 0x3d,
- 0x3d, 0x14, 0xb1, 0xbd, 0x07, 0x89, 0x56, 0x3d, 0xb3, 0x28, 0x6a, 0x3e,
- 0xdc, 0x79, 0x8b, 0xbd, 0x1b, 0x57, 0xb1, 0xbc, 0x4b, 0x48, 0x9a, 0xbe,
- 0xcf, 0xbf, 0x64, 0x3e, 0x71, 0xde, 0x81, 0x3e, 0xd0, 0x0d, 0xb6, 0x3e,
- 0x53, 0x44, 0xc5, 0x3c, 0xd0, 0xac, 0x94, 0x3c, 0x2c, 0xda, 0x7b, 0xbe,
- 0x0f, 0xac, 0x24, 0xbd, 0x3e, 0x9d, 0xce, 0xbc, 0xe8, 0x80, 0x01, 0xbb,
- 0x55, 0xb4, 0x56, 0x3b, 0x64, 0x63, 0xb4, 0x3d, 0x53, 0x1f, 0x07, 0xbe,
- 0x31, 0x7b, 0x92, 0xbc, 0xec, 0xda, 0x1e, 0x3e, 0xde, 0xa8, 0x33, 0x3e,
- 0xe4, 0xc8, 0x5e, 0x3d, 0x7f, 0x77, 0xcb, 0xbd, 0xe9, 0xb2, 0xf5, 0x3d,
- 0xc4, 0xca, 0x75, 0xbe, 0xeb, 0x05, 0x35, 0xbe, 0xe4, 0xb4, 0x91, 0xbe,
- 0x74, 0x56, 0xb0, 0x3d, 0x5b, 0x82, 0x23, 0x3e, 0x86, 0x2a, 0x9e, 0xbe,
- 0xfe, 0x43, 0x5f, 0xbe, 0xf8, 0x50, 0x35, 0x3e, 0x97, 0x15, 0x63, 0xbe,
- 0x83, 0x96, 0x4c, 0xbe, 0xb2, 0x43, 0xa5, 0xbd, 0xdf, 0x7f, 0xc0, 0xbd,
- 0xfa, 0x3a, 0x07, 0xbe, 0xc9, 0x20, 0x14, 0x3e, 0x91, 0x56, 0xe0, 0xba,
- 0x90, 0xa4, 0x06, 0xbe, 0xd2, 0xe8, 0x94, 0x3d, 0x9a, 0xc2, 0xdc, 0x3d,
- 0xbc, 0xcc, 0x52, 0xbe, 0xf9, 0x35, 0xc1, 0x3e, 0xde, 0x1d, 0x36, 0xbd,
- 0x6b, 0x61, 0x7a, 0xbe, 0x48, 0x26, 0x4c, 0xbe, 0xf9, 0x09, 0x9e, 0xbe,
- 0x44, 0xad, 0x1f, 0x3e, 0xc3, 0xb7, 0x59, 0xbe, 0xc6, 0xc5, 0xec, 0xbd,
- 0xd0, 0x62, 0xcb, 0xbc, 0xe6, 0x08, 0x73, 0xbc, 0x65, 0xc2, 0x3f, 0xbe,
- 0x77, 0x80, 0x91, 0xbd, 0x5f, 0xf0, 0x3b, 0xbe, 0xfb, 0xe4, 0x7a, 0xbe,
- 0xb2, 0x19, 0x0d, 0x3e, 0xd0, 0x24, 0x0c, 0xbe, 0x93, 0x4e, 0x2c, 0x3e,
- 0xb6, 0xb2, 0x50, 0xbc, 0xd4, 0x1d, 0xe1, 0xbd, 0x41, 0x61, 0x4e, 0xbe,
- 0xb4, 0x75, 0xf0, 0xbd, 0x92, 0x21, 0xa1, 0xbe, 0x9e, 0x12, 0x13, 0x3e,
- 0xb9, 0xb4, 0x30, 0xbe, 0x95, 0xb6, 0xc7, 0xbd, 0x66, 0x9e, 0x6f, 0x3e,
- 0x26, 0x9c, 0x13, 0xbe, 0xb5, 0x67, 0x15, 0x3e, 0x5f, 0xf4, 0xc3, 0xbb,
- 0x7b, 0xd2, 0x6e, 0x3d, 0xe1, 0x8c, 0x9f, 0xbd, 0x88, 0xe8, 0xc3, 0xbd,
- 0x18, 0x49, 0x13, 0x3e, 0x23, 0xf2, 0x6a, 0x3e, 0xba, 0x3c, 0x4d, 0xbd,
- 0x40, 0x74, 0x26, 0x3e, 0x25, 0xe2, 0xf0, 0x3d, 0x66, 0x9b, 0x96, 0x3b,
- 0x73, 0x7e, 0x02, 0xbe, 0x78, 0xab, 0xdd, 0xbd, 0x76, 0x0d, 0x5e, 0xbc,
- 0xba, 0xd9, 0x00, 0xbe, 0x98, 0xd2, 0x15, 0x3e, 0x60, 0x72, 0xa4, 0x3d,
- 0xd2, 0x72, 0xf9, 0xbd, 0x67, 0x3b, 0x13, 0x3d, 0xac, 0xfe, 0x94, 0x3d,
- 0xa3, 0x62, 0x64, 0xbe, 0x87, 0x60, 0x5d, 0xbe, 0x15, 0x7b, 0xc9, 0x3b,
- 0x02, 0xa5, 0x53, 0xbc, 0xf2, 0xb7, 0x5e, 0xbd, 0x8d, 0xaf, 0xe9, 0xbd,
- 0xf3, 0x56, 0x3b, 0xbe, 0xbe, 0x23, 0xc5, 0xbd, 0x46, 0x0a, 0xca, 0x3b,
- 0x80, 0xb1, 0xe5, 0x3e, 0x1f, 0x30, 0xf9, 0x3c, 0x47, 0xef, 0xac, 0x3d,
- 0x54, 0x33, 0x9d, 0xbd, 0x6a, 0x57, 0x0b, 0x3e, 0x78, 0xdc, 0xda, 0xbd,
- 0x19, 0x3d, 0x16, 0xbe, 0x4b, 0x08, 0x16, 0x3e, 0x65, 0x8b, 0x9c, 0xbe,
- 0x84, 0xd0, 0x44, 0x3d, 0xda, 0x04, 0x0f, 0xbc, 0x44, 0xdf, 0x11, 0xbe,
- 0x62, 0x48, 0x00, 0xbd, 0xc4, 0x36, 0xd0, 0x3c, 0x79, 0x09, 0xc1, 0x3c,
- 0xc4, 0x68, 0xcf, 0x3d, 0xb4, 0xc4, 0x2f, 0x3d, 0x05, 0x1c, 0x80, 0x3e,
- 0xaa, 0xd9, 0x7e, 0x3d, 0x1f, 0x22, 0x2f, 0x3c, 0xb3, 0x0f, 0x31, 0x3d,
- 0x79, 0x1e, 0xbc, 0x3d, 0x2b, 0x29, 0x06, 0xbe, 0x7d, 0x4c, 0x3b, 0x3c,
- 0xb6, 0x56, 0x23, 0x3e, 0x91, 0xcd, 0x67, 0x3d, 0xda, 0x4c, 0x94, 0xbe,
- 0x00, 0x07, 0xc7, 0x3d, 0xd8, 0x18, 0x8a, 0xbe, 0x3d, 0xb3, 0xae, 0x3d,
- 0x7a, 0xf5, 0x55, 0xbe, 0x08, 0x8c, 0x1d, 0x3d, 0x9c, 0x8d, 0x64, 0x3e,
- 0xef, 0x8b, 0x20, 0x3e, 0x6a, 0xec, 0x47, 0xbd, 0x28, 0xf2, 0x41, 0x3e,
- 0x70, 0x8a, 0xaa, 0xbd, 0x8f, 0x7b, 0xbc, 0xbd, 0xe6, 0x4d, 0xae, 0x3d,
- 0x0b, 0xc1, 0xb4, 0x3d, 0x2a, 0xb7, 0x82, 0x3e, 0x53, 0x00, 0xd7, 0xbc,
- 0xa4, 0x6f, 0x37, 0x3e, 0xee, 0x0a, 0x5e, 0x3d, 0xa3, 0x70, 0x00, 0xbe,
- 0xfc, 0x2c, 0x01, 0xbb, 0x93, 0x34, 0x5f, 0xbe, 0x00, 0xa3, 0x82, 0xbe,
- 0x4b, 0x60, 0x71, 0x3e, 0x4c, 0x0a, 0x65, 0x3c, 0xa3, 0xee, 0xa7, 0x3d,
- 0x89, 0x91, 0xda, 0xbc, 0x98, 0xbe, 0x1c, 0x3e, 0x0b, 0x24, 0x1b, 0xbd,
- 0x7b, 0x28, 0x66, 0x3d, 0x5c, 0x51, 0x42, 0x3d, 0x20, 0xad, 0x8a, 0x3d,
- 0x49, 0x35, 0x6d, 0xbd, 0xc0, 0x55, 0x49, 0x3c, 0x16, 0x09, 0x2e, 0x3e,
- 0x1c, 0x2f, 0x0c, 0xbc, 0x28, 0x54, 0xf4, 0x3d, 0x22, 0x88, 0x24, 0xbe,
- 0xb9, 0x88, 0xe5, 0xbd, 0x01, 0xda, 0x66, 0x3e, 0xee, 0xec, 0x72, 0xbd,
- 0x47, 0x92, 0x84, 0xbd, 0xf8, 0xa3, 0x03, 0xbc, 0xe8, 0x6d, 0x41, 0x3d,
- 0x91, 0x38, 0x86, 0x3d, 0xe3, 0x85, 0x2b, 0x3e, 0xd5, 0xdf, 0x71, 0x3d,
- 0x94, 0xf0, 0x29, 0xbe, 0x63, 0xed, 0x2a, 0x3d, 0xa9, 0x52, 0xe9, 0xbd,
- 0xcf, 0x18, 0xb8, 0xbc, 0x2d, 0xcf, 0xb2, 0x3e, 0x33, 0xa3, 0xea, 0xbd,
- 0x8e, 0x44, 0x12, 0xbe, 0xf7, 0x49, 0x24, 0xbd, 0xc8, 0xeb, 0xf6, 0xbd,
- 0x6f, 0xb0, 0xab, 0x3d, 0x2b, 0x24, 0xa9, 0xbd, 0xbd, 0x4d, 0xf5, 0xbd,
- 0x4d, 0xea, 0x4c, 0xbd, 0x55, 0x32, 0x63, 0xbd, 0x66, 0x65, 0x41, 0x3d,
- 0xd0, 0x5b, 0xfa, 0x3c, 0x72, 0xc3, 0x13, 0xbe, 0x55, 0x64, 0x60, 0x3e,
- 0x11, 0x5b, 0x40, 0xbc, 0x68, 0xe2, 0x12, 0x3d, 0xad, 0xa1, 0xa0, 0xbc,
- 0xdf, 0x17, 0xb9, 0xbe, 0x42, 0x42, 0x93, 0x3e, 0x69, 0x54, 0x8c, 0xbe,
- 0xae, 0xa7, 0x48, 0xbe, 0x17, 0x48, 0xb0, 0x3d, 0x81, 0xdb, 0x2e, 0x3e,
- 0xfc, 0x59, 0xf0, 0xbd, 0x25, 0xed, 0x1c, 0xbe, 0x66, 0x0d, 0x30, 0x3e,
- 0x96, 0xc0, 0x93, 0xbe, 0xb0, 0xb8, 0xa9, 0xbd, 0x72, 0xc7, 0xab, 0xbd,
- 0x22, 0x58, 0x96, 0x3d, 0x75, 0xae, 0x2b, 0xbe, 0xfd, 0x3f, 0x24, 0xbe,
- 0xd5, 0x6f, 0xdd, 0x3d, 0x91, 0x9e, 0x30, 0xbd, 0x59, 0x37, 0xd1, 0x3d,
- 0xf5, 0x16, 0x45, 0xbd, 0x30, 0x16, 0x04, 0xbe, 0x5c, 0x16, 0x69, 0xbe,
- 0x93, 0xc6, 0xb3, 0x3d, 0x32, 0xbf, 0xbc, 0xbb, 0x8c, 0xb3, 0x4c, 0x3c,
- 0xf2, 0xf0, 0x3b, 0xbd, 0x57, 0xaf, 0x2d, 0x3e, 0x32, 0xba, 0x82, 0xbe,
- 0x27, 0x3e, 0x08, 0xbd, 0x5e, 0xca, 0x74, 0x3e, 0x0a, 0x5b, 0x8d, 0xbd,
- 0x0b, 0xb7, 0x93, 0xbe, 0x20, 0xfc, 0x2d, 0xbe, 0x1e, 0x84, 0x23, 0x3e,
- 0x4c, 0xe1, 0xca, 0xbd, 0xdc, 0xdd, 0xd2, 0x3d, 0xc4, 0x08, 0xe9, 0xbd,
- 0x2b, 0x98, 0x94, 0xbb, 0x11, 0x1d, 0xf5, 0xbd, 0x8a, 0x27, 0x97, 0x3d,
- 0x65, 0xb4, 0x14, 0xbe, 0x5b, 0xfe, 0x57, 0xbd, 0xca, 0x4f, 0xfd, 0xbd,
- 0x5b, 0x9e, 0xdc, 0xbd, 0x4e, 0xce, 0x30, 0xbe, 0xa3, 0x4e, 0x0d, 0xbe,
- 0x31, 0xbf, 0xc7, 0xbd, 0xd5, 0xe4, 0xb4, 0xbd, 0xbc, 0x35, 0xe6, 0x3c,
- 0xab, 0x69, 0x08, 0xbe, 0x26, 0x17, 0x75, 0x3d, 0xe1, 0x2c, 0x37, 0xbe,
- 0x32, 0xa0, 0xbb, 0xbe, 0x49, 0x93, 0x11, 0xbc, 0xb0, 0xba, 0xdb, 0xbd,
- 0x49, 0xa2, 0x8f, 0x3d, 0x7d, 0x53, 0x17, 0x3d, 0x1f, 0x28, 0xcb, 0xbd,
- 0xf1, 0xf6, 0x18, 0xbe, 0x32, 0xbd, 0x5f, 0x3d, 0x90, 0xf2, 0x13, 0xbe,
- 0x12, 0x54, 0x15, 0xbe, 0xdf, 0x38, 0x6a, 0xbe, 0x62, 0x8a, 0xeb, 0xbc,
- 0xe7, 0x11, 0x74, 0xbe, 0x15, 0x5a, 0x86, 0x3d, 0x09, 0x43, 0xda, 0x3d,
- 0x6f, 0x1b, 0x1e, 0xbe, 0x9f, 0xdd, 0x26, 0x3e, 0x64, 0x52, 0xec, 0xbe,
- 0x11, 0x6c, 0x84, 0x3b, 0x8d, 0x97, 0x08, 0x3d, 0xfb, 0x49, 0xd9, 0x3d,
- 0x29, 0x8a, 0x8a, 0x3e, 0x3a, 0xa7, 0x32, 0xbc, 0x5d, 0xde, 0x38, 0x3c,
- 0x90, 0xf4, 0x03, 0xbe, 0x0b, 0xe7, 0xb1, 0x3d, 0xf3, 0xf1, 0x70, 0x3e,
- 0x1e, 0xb4, 0xa3, 0x3d, 0x39, 0x66, 0x1f, 0xbe, 0x38, 0x9e, 0xba, 0xbe,
- 0x25, 0x95, 0x3d, 0xbd, 0x4a, 0x06, 0xb9, 0x3a, 0xf7, 0xae, 0xa1, 0x3d,
- 0x78, 0x02, 0xfe, 0xbd, 0x86, 0x0a, 0x94, 0x3d, 0xb0, 0xd3, 0x8c, 0x3d,
- 0x3e, 0x95, 0x53, 0x3d, 0x04, 0x73, 0x18, 0xbd, 0xdb, 0xc3, 0x98, 0x3d,
- 0x41, 0xe1, 0xfb, 0xbd, 0xfe, 0x91, 0x78, 0xbd, 0x51, 0xb5, 0xdd, 0xbd,
- 0x50, 0xb8, 0x10, 0xbe, 0x9b, 0x7e, 0xdc, 0x3d, 0x70, 0x53, 0x8b, 0xbd,
- 0x25, 0xb6, 0x4f, 0x3c, 0x63, 0xfb, 0xc1, 0xbd, 0x85, 0xe7, 0x1e, 0xbe,
- 0x20, 0x6e, 0xa7, 0xbe, 0x30, 0x96, 0x69, 0xbe, 0xb4, 0x41, 0x05, 0xbe,
- 0xd2, 0x4c, 0x07, 0xbe, 0xa9, 0xf0, 0x2f, 0x3e, 0x08, 0x35, 0x7a, 0x3c,
- 0x41, 0xb9, 0xc3, 0x3d, 0x97, 0x2b, 0x3b, 0xbe, 0x86, 0x8c, 0xf5, 0xbd,
- 0xea, 0xc2, 0x03, 0x3e, 0x04, 0x7e, 0x43, 0x3d, 0x8d, 0x26, 0xcc, 0xbe,
- 0x8f, 0x1f, 0x8e, 0x3e, 0xf8, 0xc2, 0x30, 0xbd, 0x8c, 0x56, 0xec, 0xbd,
- 0xcc, 0x88, 0x0f, 0xbd, 0x81, 0x8d, 0x86, 0x3e, 0x44, 0xfe, 0x01, 0xbe,
- 0x3a, 0xa6, 0xb4, 0xbd, 0x11, 0x1a, 0xe3, 0x3d, 0x2e, 0x24, 0x37, 0xbe,
- 0xf3, 0x9e, 0xe9, 0x3d, 0x9d, 0x4d, 0xae, 0x3a, 0x60, 0xb5, 0x2c, 0xbe,
- 0xab, 0x28, 0xf1, 0x3d, 0xf9, 0xb2, 0x87, 0x3d, 0x5a, 0xb9, 0x8e, 0xbd,
- 0x25, 0x03, 0x4b, 0xbe, 0xcc, 0x53, 0x49, 0xbd, 0xee, 0x67, 0x1b, 0x3e,
- 0x98, 0x0c, 0xe2, 0x3d, 0xc8, 0x61, 0x26, 0xbe, 0xca, 0xb1, 0x9f, 0x3c,
- 0x41, 0x57, 0x79, 0xbe, 0x5f, 0x42, 0x14, 0x3d, 0xf1, 0xd8, 0x62, 0x3e,
- 0x8b, 0x10, 0x15, 0xbe, 0x94, 0xbc, 0xa6, 0xbe, 0xa1, 0x58, 0x69, 0xbe,
- 0x34, 0x09, 0x3d, 0xbe, 0x0e, 0x50, 0x47, 0xbe, 0x2d, 0x35, 0x94, 0xbe,
- 0x13, 0xdb, 0x37, 0x3e, 0xe5, 0x3e, 0x4f, 0xbe, 0x6f, 0x96, 0xa1, 0xbe,
- 0x68, 0xc7, 0x81, 0xbe, 0x41, 0x09, 0xa6, 0xbd, 0x4d, 0x6f, 0xbd, 0xbe,
- 0xac, 0xc7, 0x92, 0xbe, 0x81, 0x7f, 0xd5, 0x3c, 0x31, 0x55, 0x20, 0xbe,
- 0xf6, 0xcb, 0x31, 0xbc, 0x17, 0xd1, 0x48, 0x3e, 0x24, 0x8a, 0xbc, 0xbd,
- 0xb3, 0x6c, 0xb7, 0xbd, 0x2d, 0x15, 0x10, 0xbd, 0x81, 0x30, 0xb6, 0x3d,
- 0xed, 0xc3, 0x3e, 0xbe, 0xcf, 0x75, 0xe1, 0xbe, 0xa7, 0xac, 0x8a, 0xbd,
- 0xb4, 0x41, 0x83, 0xbd, 0xbd, 0x59, 0xf7, 0x3c, 0xec, 0x86, 0x16, 0x3d,
- 0x57, 0x6d, 0x92, 0xbe, 0xb6, 0x8b, 0x45, 0x3c, 0xbe, 0x56, 0x04, 0xbe,
- 0xf5, 0x8b, 0x40, 0xbe, 0x19, 0xbb, 0x95, 0xbe, 0xf9, 0xc5, 0xe5, 0xbc,
- 0xaa, 0x86, 0x72, 0xbe, 0x7f, 0x0c, 0xff, 0x3d, 0x33, 0x3b, 0xa4, 0xbe,
- 0x6d, 0x62, 0x22, 0x3e, 0x2f, 0x10, 0x23, 0x3e, 0xe7, 0x68, 0xa7, 0xbd,
- 0x8f, 0xd9, 0x35, 0xbe, 0xc6, 0x62, 0xaf, 0xbd, 0xd9, 0x07, 0xd1, 0xbd,
- 0x9f, 0x11, 0x76, 0x3d, 0xb3, 0xe1, 0xad, 0xbe, 0x04, 0x5c, 0xd9, 0xbd,
- 0xab, 0xff, 0xe2, 0x3c, 0x85, 0x4b, 0x35, 0xbe, 0x7d, 0xb5, 0x83, 0xbd,
- 0x33, 0x83, 0x84, 0xbc, 0x52, 0xe4, 0xc4, 0xbd, 0x9e, 0x3b, 0xbb, 0x3d,
- 0x69, 0xbf, 0x8c, 0xbe, 0x0c, 0x94, 0x5b, 0x3d, 0x74, 0x03, 0x34, 0xbe,
- 0x50, 0x45, 0xd2, 0xbd, 0xd8, 0xda, 0xa6, 0xbc, 0x81, 0x2f, 0x1d, 0xbd,
- 0x75, 0xee, 0xd8, 0xbc, 0x42, 0xa3, 0x95, 0xbd, 0x17, 0x67, 0x09, 0xbe,
- 0x34, 0x59, 0xdf, 0x3c, 0x75, 0x41, 0xd9, 0xbd, 0xbb, 0x86, 0x2c, 0x3e,
- 0x28, 0x33, 0x7e, 0xbe, 0x7e, 0x07, 0xc5, 0xbe, 0xd5, 0x0c, 0xa2, 0x3d,
- 0xc5, 0xbb, 0x03, 0x3e, 0xcf, 0x33, 0x0c, 0xbe, 0x48, 0xa7, 0x9f, 0xbd,
- 0xc3, 0x35, 0xca, 0x3c, 0xd7, 0x60, 0xb6, 0xbe, 0x40, 0x70, 0x0f, 0x3e,
- 0xcc, 0x14, 0x01, 0x3e, 0xdc, 0x94, 0x3a, 0xbd, 0xa8, 0x34, 0x48, 0xbc,
- 0x51, 0xa2, 0xde, 0x3b, 0x3c, 0x10, 0xfe, 0xbd, 0x60, 0xb6, 0x34, 0x3e,
- 0xd1, 0x78, 0xd1, 0xbe, 0x91, 0x07, 0x7c, 0x3e, 0x7e, 0x7e, 0xb6, 0xbc,
- 0xc4, 0xd1, 0x6a, 0xbe, 0xcb, 0xf8, 0x87, 0xbd, 0xde, 0x34, 0x2a, 0x3b,
- 0x21, 0x36, 0x54, 0x3c, 0xa4, 0x8e, 0x1b, 0xbe, 0x21, 0x85, 0x75, 0xb9,
- 0xa2, 0xca, 0xf0, 0xbd, 0xb6, 0x54, 0x95, 0xbc, 0x7e, 0x5d, 0xb3, 0xbd,
- 0x56, 0xab, 0xd2, 0xbd, 0x7f, 0xbb, 0xbf, 0xbe, 0x35, 0x0b, 0x5f, 0xbd,
- 0x69, 0xec, 0x8d, 0x3b, 0xda, 0xe2, 0x2c, 0xbe, 0x44, 0xfa, 0xce, 0x3c,
- 0x85, 0x78, 0x34, 0xbf, 0x91, 0xb5, 0x34, 0x3e, 0x3b, 0xfc, 0x99, 0xbe,
- 0xdf, 0xa7, 0x75, 0x3c, 0x71, 0x7b, 0x8c, 0xbe, 0xac, 0x86, 0xee, 0xbe,
- 0x9b, 0xaf, 0x0a, 0xbe, 0xa8, 0xa9, 0x99, 0x3d, 0xad, 0x18, 0x24, 0xbd,
- 0x19, 0xe2, 0xf9, 0xbd, 0x06, 0x73, 0xa1, 0xbe, 0x9a, 0x97, 0x01, 0xbe,
- 0x99, 0xb7, 0x01, 0x3e, 0xf0, 0xe1, 0x93, 0xbc, 0x8e, 0xb9, 0x8b, 0xbd,
- 0xd6, 0xd0, 0xe8, 0xbe, 0xe5, 0xc2, 0x69, 0x3d, 0xd8, 0x84, 0xa7, 0x3c,
- 0x9d, 0x6b, 0xf2, 0xbd, 0x43, 0x33, 0x12, 0x3d, 0x9b, 0xa9, 0x3a, 0xbe,
- 0x89, 0xec, 0x6e, 0xbe, 0x71, 0xab, 0x11, 0xbe, 0xaf, 0x4f, 0x2d, 0x3e,
- 0x45, 0xf6, 0xb7, 0x3d, 0xc1, 0x00, 0x39, 0x3b, 0x07, 0x0a, 0x1d, 0xbd,
- 0x3e, 0xf9, 0x10, 0xbe, 0x0a, 0x99, 0x34, 0xbe, 0x5d, 0xb0, 0x3d, 0xbe,
- 0xd5, 0xda, 0x42, 0x3d, 0x61, 0xe2, 0xdc, 0xbd, 0x3e, 0x5f, 0xc2, 0x3d,
- 0x65, 0xfd, 0x9d, 0xbd, 0x37, 0x6b, 0x06, 0x3e, 0x65, 0x08, 0xcf, 0xbd,
- 0x0d, 0xbe, 0x73, 0x3c, 0x50, 0xd8, 0x45, 0xbe, 0x06, 0xb0, 0xbe, 0xbd,
- 0x47, 0x68, 0x37, 0xbf, 0xbb, 0x3d, 0x8d, 0xbb, 0xd4, 0xfe, 0x70, 0xbd,
- 0xe6, 0xc7, 0x0a, 0x3e, 0x49, 0x3f, 0x35, 0x3b, 0xe0, 0x8a, 0x00, 0xbe,
- 0xe0, 0x4a, 0x16, 0x3d, 0xa7, 0xad, 0xeb, 0x3d, 0xc6, 0x61, 0x99, 0xbd,
- 0x86, 0xd6, 0x8c, 0xbe, 0xe7, 0xdb, 0xd6, 0x3c, 0x9e, 0x38, 0xa4, 0x3e,
- 0xf1, 0xaa, 0x25, 0xbe, 0xa5, 0x2e, 0xe2, 0x3d, 0xb9, 0x75, 0x9c, 0x3d,
- 0x19, 0xdf, 0xfa, 0xba, 0xd6, 0x52, 0x81, 0x3d, 0xde, 0xbc, 0xd0, 0x3d,
- 0x33, 0x9a, 0x4f, 0x3e, 0x1d, 0xd2, 0x91, 0x3c, 0x25, 0x11, 0xfb, 0x3d,
- 0x2e, 0x31, 0x91, 0x3d, 0x16, 0xea, 0x70, 0xbc, 0xac, 0xfb, 0x9e, 0x3d,
- 0x4f, 0xc7, 0x54, 0x3e, 0x30, 0x4a, 0xfd, 0xbb, 0xa4, 0x7b, 0x97, 0x3e,
- 0xa1, 0x45, 0x07, 0x3e, 0x88, 0x35, 0x45, 0x3e, 0xae, 0x78, 0x90, 0xbd,
- 0x4e, 0xc3, 0x20, 0xb8, 0x0b, 0x0e, 0xfb, 0xbc, 0x46, 0x99, 0x4b, 0xbd,
- 0xc6, 0xd9, 0x43, 0xbe, 0x3c, 0x97, 0x5e, 0xbe, 0x8c, 0xb2, 0x25, 0xbd,
- 0xc6, 0xfc, 0xd3, 0xbd, 0xf4, 0x93, 0xcf, 0x3d, 0x94, 0x9b, 0x40, 0xbe,
- 0x20, 0x9a, 0x62, 0x3b, 0x42, 0x41, 0xc2, 0x3d, 0xa9, 0xaa, 0xc4, 0xbd,
- 0x1c, 0x1a, 0xc3, 0xbd, 0xd1, 0x04, 0x42, 0x3e, 0x23, 0x39, 0x1c, 0xbe,
- 0xa4, 0x4d, 0x8f, 0xbd, 0xeb, 0x2b, 0xde, 0x3d, 0x9d, 0x87, 0x6d, 0xbd,
- 0x11, 0x09, 0x30, 0x3e, 0x7d, 0x9e, 0x13, 0x3e, 0x36, 0xa5, 0x2e, 0xbe,
- 0x25, 0x0a, 0x1f, 0xbe, 0x3e, 0xbe, 0x4a, 0xbe, 0x29, 0xf1, 0xa6, 0x3c,
- 0xe1, 0x4d, 0x8d, 0x3d, 0xf2, 0xb9, 0x6b, 0xbe, 0x08, 0xa7, 0x3b, 0x3d,
- 0x81, 0x14, 0x03, 0xbe, 0xcb, 0x4b, 0xd5, 0x3d, 0x17, 0x8a, 0x04, 0xbd,
- 0xb3, 0x9c, 0x3c, 0xbe, 0xcc, 0x29, 0xd8, 0xbd, 0x40, 0x76, 0xe3, 0xbd,
- 0xaf, 0x5e, 0xcf, 0xbe, 0x52, 0x0a, 0x4a, 0x3c, 0xa2, 0xce, 0x4e, 0x3e,
- 0xa3, 0x2f, 0x93, 0x3e, 0x66, 0x52, 0x45, 0xbe, 0xa3, 0x3f, 0x5d, 0x3e,
- 0x62, 0x0f, 0x11, 0x3e, 0x76, 0xc1, 0xb3, 0x3d, 0x8a, 0x87, 0xe9, 0xbd,
- 0x3c, 0x53, 0xb5, 0xbd, 0x22, 0xdb, 0xd4, 0x3c, 0x79, 0x54, 0xea, 0x3d,
- 0x4b, 0xca, 0x1b, 0x3d, 0x87, 0x27, 0x8e, 0x3d, 0xf4, 0x6c, 0x74, 0xbe,
- 0x15, 0xb2, 0x1e, 0xbe, 0x68, 0x3f, 0x4b, 0x3e, 0xbb, 0xc7, 0x9a, 0x3e,
- 0x8f, 0xd7, 0xb8, 0x3d, 0x41, 0x88, 0x24, 0x3d, 0x43, 0x01, 0x8d, 0x3c,
- 0x90, 0x87, 0xd3, 0x3b, 0x73, 0xb1, 0x8b, 0x3d, 0xf3, 0x6f, 0xee, 0x3d,
- 0x08, 0x3c, 0x86, 0xbd, 0x12, 0x47, 0xf8, 0x3d, 0xbf, 0xd1, 0x89, 0xbe,
- 0x02, 0xca, 0x8f, 0xbe, 0xd3, 0xef, 0x73, 0xbc, 0x1a, 0x62, 0x50, 0x3e,
- 0x58, 0xcb, 0x29, 0xbe, 0xf2, 0x89, 0xf6, 0x3d, 0xe1, 0xf4, 0xcf, 0xbe,
- 0x8b, 0x95, 0xe2, 0x3a, 0x2e, 0x12, 0x1b, 0x3d, 0x7f, 0x7d, 0x63, 0xbd,
- 0xdc, 0x3a, 0xd2, 0x3d, 0x49, 0xa8, 0xea, 0xbd, 0xf3, 0x32, 0x63, 0xbd,
- 0xa0, 0xc7, 0x25, 0x3e, 0x14, 0x5f, 0x82, 0x3e, 0x64, 0xbd, 0x69, 0xbe,
- 0xab, 0x23, 0xbf, 0xbd, 0x5b, 0xfe, 0x45, 0x3e, 0x6b, 0xa9, 0x83, 0xbd,
- 0x3f, 0x45, 0x02, 0x3e, 0xd4, 0x44, 0x87, 0x3d, 0x48, 0x5f, 0x01, 0xbf,
- 0xdf, 0x76, 0x11, 0xbd, 0x68, 0xfa, 0x57, 0x3e, 0x31, 0x7f, 0x30, 0x3d,
- 0x6c, 0x45, 0x41, 0x3e, 0x30, 0xc1, 0xec, 0x3d, 0x3b, 0x55, 0x9b, 0xbc,
- 0x9a, 0x2e, 0x35, 0x3e, 0x85, 0xb3, 0xcf, 0x3d, 0x74, 0x29, 0x76, 0x3d,
- 0x34, 0xe6, 0x4f, 0xbe, 0x87, 0xb4, 0xd4, 0x3d, 0x90, 0x23, 0x01, 0xbf,
- 0x96, 0xf8, 0x49, 0x3e, 0x9b, 0x3a, 0xb7, 0x3c, 0xeb, 0xbe, 0x91, 0xbd,
- 0x13, 0xa2, 0xce, 0x3d, 0x32, 0x82, 0x1a, 0xbe, 0x71, 0x8f, 0x30, 0x3e,
- 0xa0, 0x70, 0x11, 0x3e, 0x63, 0x0a, 0xf8, 0xbd, 0x93, 0x9a, 0x17, 0x3e,
- 0x7c, 0xb9, 0x2b, 0x3d, 0x51, 0x65, 0x7a, 0xbd, 0xcd, 0xc3, 0x05, 0xbd,
- 0x57, 0x5a, 0x0d, 0xbe, 0xd3, 0x2a, 0x05, 0x3c, 0x6c, 0x8a, 0xac, 0xbd,
- 0x52, 0xa8, 0x34, 0xbe, 0xec, 0xd4, 0x4e, 0xbe, 0x2c, 0x45, 0x21, 0x3e,
- 0x68, 0x82, 0xc6, 0xbd, 0x49, 0x79, 0xbe, 0xbd, 0x55, 0x61, 0x17, 0xbe,
- 0x76, 0x04, 0x8f, 0x3d, 0xbe, 0xb9, 0x3e, 0x3a, 0x49, 0x6d, 0x63, 0x3e,
- 0x54, 0xb6, 0xa2, 0x3e, 0xcf, 0x6b, 0xf1, 0xbd, 0x9e, 0x9a, 0x5a, 0xbe,
- 0x18, 0x3e, 0x96, 0xbe, 0x58, 0xbb, 0x94, 0xbe, 0x61, 0xfb, 0xa0, 0xbd,
- 0xf6, 0x38, 0x0e, 0xbd, 0x2e, 0xdf, 0xce, 0x3d, 0xb9, 0x28, 0xd2, 0xbc,
- 0xc3, 0xe5, 0x67, 0x3e, 0xf6, 0x8f, 0x78, 0x3d, 0xaf, 0x96, 0x4b, 0xbe,
- 0x76, 0xe7, 0x50, 0xbd, 0xeb, 0xba, 0xd5, 0xbe, 0x9a, 0x7f, 0x9c, 0x3e,
- 0xaf, 0x14, 0x41, 0x3e, 0x46, 0x2a, 0xbf, 0xbe, 0x55, 0xaf, 0xad, 0xbe,
- 0x37, 0x4d, 0x0b, 0xbe, 0xc2, 0x06, 0x4e, 0x3e, 0x6e, 0xd2, 0xb2, 0xbd,
- 0xe7, 0x69, 0xbf, 0xbe, 0x46, 0x24, 0x78, 0x3d, 0xe7, 0x63, 0x4d, 0xbe,
- 0x1a, 0xbe, 0xcf, 0x3d, 0xbd, 0xf0, 0xfd, 0xbd, 0xd7, 0xc1, 0x75, 0x3e,
- 0x29, 0x2e, 0x8b, 0x3d, 0x3a, 0x48, 0x94, 0xbe, 0x33, 0x6f, 0xa7, 0xbe,
- 0x57, 0x46, 0x92, 0xbe, 0x43, 0x5d, 0x35, 0xbd, 0xb0, 0x1b, 0x00, 0xbe,
- 0xa3, 0x5e, 0xb1, 0xbd, 0x44, 0xf8, 0xed, 0xbd, 0xff, 0x06, 0x06, 0x3c,
- 0x7f, 0xd3, 0x13, 0xbd, 0xe7, 0xe7, 0x74, 0x3e, 0x89, 0xf9, 0xb9, 0xbd,
- 0xa6, 0x96, 0x8a, 0x3d, 0x34, 0x77, 0xf2, 0xbd, 0xf1, 0xe8, 0x23, 0xbe,
- 0x84, 0x15, 0xa4, 0x3d, 0x42, 0x09, 0xa5, 0xbd, 0x2c, 0x38, 0x07, 0xbe,
- 0x9a, 0x71, 0x69, 0x3d, 0x05, 0xfe, 0x04, 0xbe, 0x03, 0xbc, 0x05, 0xbe,
- 0xc7, 0x7d, 0xfe, 0xbd, 0x65, 0x17, 0x0b, 0xbe, 0xd4, 0x76, 0x5f, 0xbd,
- 0x57, 0x80, 0x54, 0xbe, 0x97, 0x74, 0x2b, 0x3e, 0xe6, 0xab, 0x24, 0xbe,
- 0xb6, 0x2b, 0xb8, 0xbe, 0x41, 0xd0, 0xe4, 0xbc, 0x94, 0xf4, 0x8c, 0xbe,
- 0xea, 0x4d, 0xee, 0x3c, 0x3a, 0x6c, 0x4b, 0x3c, 0x4e, 0x7b, 0x00, 0xbe,
- 0x17, 0xd4, 0x2e, 0x3e, 0xd1, 0xb2, 0xec, 0xbd, 0x2a, 0x66, 0x00, 0xbe,
- 0x66, 0x3e, 0xb8, 0xbd, 0x49, 0x18, 0x78, 0xbd, 0x6d, 0x90, 0xba, 0x3d,
- 0xc5, 0x56, 0xb3, 0xbe, 0x08, 0x08, 0x90, 0xbd, 0xb1, 0x11, 0xde, 0xbc,
- 0xb2, 0xda, 0x6f, 0xbe, 0x74, 0xd7, 0x57, 0xbc, 0xb2, 0x11, 0x3c, 0xbe,
- 0x51, 0xf2, 0x49, 0x3d, 0x76, 0x39, 0x72, 0x3e, 0x9a, 0x54, 0x6f, 0xbe,
- 0x09, 0x6b, 0x06, 0xbe, 0x12, 0xa7, 0xc6, 0xbe, 0x94, 0xf5, 0x80, 0xbe,
- 0xad, 0xfb, 0x63, 0xbe, 0x29, 0x13, 0x52, 0xbd, 0x3a, 0xa2, 0xad, 0xbe,
- 0x26, 0xba, 0x88, 0xbd, 0x7d, 0x1e, 0x83, 0xbd, 0x1c, 0x98, 0x66, 0x3d,
- 0xff, 0x97, 0xdf, 0x3d, 0xe5, 0x3c, 0x76, 0x3d, 0xc0, 0xb3, 0xea, 0xbd,
- 0x25, 0x9c, 0x83, 0xbe, 0x04, 0xcb, 0x45, 0x3b, 0x72, 0x77, 0x5a, 0x3e,
- 0x21, 0x6c, 0x13, 0xbe, 0x49, 0x67, 0x2b, 0xbb, 0xee, 0x48, 0xc6, 0x3c,
- 0x73, 0xc0, 0x21, 0x3e, 0xaf, 0x41, 0xc8, 0xbe, 0x6d, 0x94, 0x51, 0xbe,
- 0x2f, 0x07, 0xaf, 0xbd, 0x1c, 0x9a, 0x32, 0x3d, 0xe0, 0x43, 0xfd, 0xbb,
- 0xe9, 0x89, 0x9f, 0xbc, 0x14, 0x65, 0xac, 0x3d, 0xdc, 0x67, 0xfb, 0x3c,
- 0x18, 0x39, 0x00, 0xbe, 0x42, 0x7c, 0xed, 0x3c, 0x9d, 0xca, 0x17, 0xbe,
- 0x37, 0xfe, 0x93, 0x3d, 0x3e, 0x12, 0x7c, 0x3c, 0x62, 0x1d, 0x64, 0x3d,
- 0x55, 0x42, 0x0a, 0xbe, 0xeb, 0x58, 0x18, 0x3e, 0xb1, 0x1c, 0xf4, 0x3d,
- 0x8c, 0x74, 0xe6, 0x3c, 0xed, 0x2f, 0xb5, 0xbd, 0x2c, 0xd9, 0xd2, 0x3d,
- 0xbe, 0x6e, 0xea, 0xbd, 0xa5, 0x4a, 0xd7, 0xbd, 0xb2, 0xff, 0xb7, 0xbc,
- 0x5e, 0x44, 0x46, 0xbe, 0x23, 0xee, 0x72, 0x3d, 0x15, 0xb6, 0x7d, 0x3d,
- 0xec, 0x77, 0xb7, 0x3c, 0xbc, 0xeb, 0xc0, 0xbd, 0xc0, 0x61, 0x05, 0x3e,
- 0xd9, 0xbc, 0x17, 0xbe, 0x93, 0xbf, 0x1b, 0x3e, 0x74, 0x9d, 0xc3, 0xbc,
- 0x1b, 0x7d, 0xfb, 0x3d, 0x0c, 0x0c, 0x1c, 0x3d, 0xe8, 0xef, 0xf8, 0x3d,
- 0x12, 0xcf, 0x6c, 0xbc, 0x53, 0x0d, 0xfd, 0x3c, 0xe9, 0xb1, 0x5c, 0xbd,
- 0x9a, 0x52, 0xfc, 0x3c, 0x02, 0x39, 0x05, 0x3e, 0xba, 0x53, 0x14, 0xbd,
- 0xd5, 0x7d, 0xfd, 0xbd, 0xce, 0xbf, 0x13, 0xbe, 0x7b, 0xc1, 0x51, 0xbd,
- 0x6b, 0xb2, 0xbe, 0xbb, 0x99, 0x80, 0x32, 0x3b, 0x62, 0x85, 0xb6, 0x3d,
- 0x0d, 0x3d, 0xd6, 0xbd, 0x9e, 0x56, 0xa2, 0xbd, 0x5c, 0x8b, 0x7d, 0xbd,
- 0xb1, 0x3d, 0xaa, 0x3c, 0xbd, 0x79, 0x11, 0xbd, 0x49, 0x71, 0x93, 0x3c,
- 0xe5, 0x15, 0xd6, 0x3d, 0xed, 0xfd, 0xda, 0x3c, 0xad, 0x36, 0x91, 0xbd,
- 0x43, 0xe3, 0x7e, 0x3d, 0x8c, 0x0b, 0x77, 0x3d, 0x2e, 0xad, 0x9e, 0x3d,
- 0xb8, 0xc6, 0x0d, 0x3c, 0xba, 0xa9, 0x8b, 0xbd, 0xf8, 0x34, 0x24, 0xbd,
- 0x11, 0x5f, 0x17, 0x3e, 0xc1, 0x11, 0x49, 0x3d, 0x4e, 0x81, 0xae, 0xbd,
- 0x2f, 0xeb, 0x0d, 0xbe, 0x7a, 0x89, 0x84, 0xbd, 0x13, 0xef, 0x92, 0x3c,
- 0x45, 0xf9, 0x84, 0x3d, 0x3e, 0x59, 0x05, 0xbe, 0x9c, 0x77, 0xf8, 0xbd,
- 0xaf, 0xad, 0xa6, 0x3d, 0xb4, 0xb7, 0x0b, 0x3d, 0x0d, 0x07, 0x2a, 0x3e,
- 0x93, 0xa1, 0xd2, 0xbc, 0x45, 0xaa, 0x52, 0xbd, 0x7c, 0xc8, 0x54, 0x3c,
- 0x15, 0x56, 0x0d, 0x3e, 0x31, 0xd9, 0x04, 0xbe, 0xf8, 0x26, 0xb1, 0xbc,
- 0xa7, 0x36, 0x18, 0x3e, 0x49, 0xb8, 0x9d, 0xbd, 0x70, 0x06, 0x9f, 0x3d,
- 0x8b, 0x91, 0x92, 0xbd, 0x3c, 0xc4, 0x74, 0x3d, 0xb7, 0x82, 0xa8, 0x3d,
- 0xe6, 0x44, 0xa6, 0x3d, 0x58, 0xe4, 0x7e, 0x3d, 0xc3, 0x5c, 0x14, 0x3e,
- 0xc3, 0x38, 0x9a, 0x3d, 0xab, 0xa9, 0x6d, 0xbd, 0xf8, 0xc6, 0x76, 0xbd,
- 0x8c, 0xb6, 0xdd, 0xbd, 0x03, 0xed, 0x2a, 0x3d, 0xa3, 0xbc, 0xfa, 0x3c,
- 0x22, 0x86, 0x6b, 0x3d, 0xca, 0x1a, 0xaf, 0x3d, 0x46, 0xe1, 0x26, 0x3e,
- 0x6b, 0x47, 0x44, 0xbd, 0x4b, 0x49, 0xa5, 0xbd, 0x07, 0xad, 0x9a, 0x3c,
- 0x4e, 0x3e, 0x87, 0xbc, 0xbe, 0x5e, 0x45, 0xbc, 0xa2, 0x8b, 0x02, 0x3e,
- 0xb6, 0x80, 0x1b, 0x3c, 0x78, 0x35, 0xbf, 0xbd, 0x01, 0xc2, 0x12, 0x3e,
- 0x31, 0xb9, 0x02, 0xbe, 0x7a, 0x11, 0x1c, 0xbe, 0xb2, 0xb8, 0x00, 0x3e,
- 0xa4, 0xa3, 0x04, 0x3e, 0x94, 0xfe, 0x8c, 0x3d, 0xe6, 0xca, 0x21, 0x3e,
- 0xa8, 0x53, 0xcf, 0xbc, 0x14, 0xe2, 0xa8, 0x3c, 0xfa, 0x4f, 0x24, 0xbd,
- 0x5b, 0x54, 0x11, 0xbe, 0x5c, 0x7f, 0xb7, 0x3d, 0x0d, 0x0f, 0x15, 0x3d,
- 0x6a, 0x5f, 0xe0, 0xbd, 0x32, 0x51, 0x94, 0x3d, 0x7b, 0xee, 0xc3, 0x3d,
- 0x10, 0xca, 0xa1, 0xbd, 0x4c, 0xba, 0xa9, 0x3c, 0x9c, 0xbe, 0x67, 0xbd,
- 0xcf, 0xa4, 0xb1, 0x3d, 0x04, 0x36, 0xac, 0xbd, 0x36, 0x0f, 0x13, 0x3e,
- 0x1f, 0x9d, 0x06, 0xbe, 0x79, 0x41, 0x72, 0xbd, 0x05, 0xea, 0xde, 0x3d,
- 0x01, 0xe8, 0xc1, 0xbd, 0x93, 0x5d, 0x1a, 0xbe, 0x9a, 0xc8, 0xa1, 0xbd,
- 0x58, 0x9a, 0x05, 0xbe, 0x38, 0xd3, 0x08, 0xbe, 0x3d, 0x20, 0xdf, 0x3d,
- 0xe9, 0xb0, 0xb1, 0x3c, 0xb9, 0x8b, 0x07, 0xbe, 0x8f, 0xa3, 0x53, 0x3d,
- 0xd5, 0xe8, 0xa9, 0x3d, 0x35, 0x5f, 0x5d, 0xbd, 0x6e, 0xc0, 0xb4, 0xbd,
- 0xb2, 0x0b, 0xce, 0x3d, 0x8d, 0x7a, 0x21, 0xbd, 0xa5, 0x60, 0x94, 0x3d,
- 0x0f, 0x5c, 0x4b, 0xbd, 0xf9, 0x30, 0x1e, 0x3e, 0x14, 0x99, 0xa0, 0xbd,
- 0xc7, 0x37, 0xd7, 0x3d, 0x1d, 0x37, 0xbe, 0xbe, 0x6a, 0xb5, 0x73, 0xbe,
- 0x37, 0xd3, 0x84, 0x3e, 0x80, 0x49, 0xfc, 0xbe, 0x45, 0x72, 0xbf, 0x3c,
- 0xdf, 0x32, 0x62, 0xbd, 0x5a, 0xd3, 0x4b, 0x3a, 0xf5, 0xb5, 0xad, 0xbd,
- 0xa5, 0x46, 0x6a, 0xbe, 0x1e, 0xe4, 0x53, 0xbd, 0xf2, 0xc7, 0x3a, 0x3d,
- 0x7c, 0x97, 0xc5, 0x3d, 0xc2, 0xd2, 0xa4, 0xbd, 0x76, 0x70, 0x85, 0xbe,
- 0xcb, 0x51, 0x39, 0x3e, 0xf8, 0x69, 0x7c, 0xbe, 0xdb, 0x1f, 0xf6, 0x3c,
- 0xf4, 0x11, 0xe6, 0x3d, 0x49, 0x11, 0x0c, 0xbe, 0x52, 0xd5, 0xd1, 0xbd,
- 0xcf, 0xab, 0xc4, 0x3d, 0xf5, 0x51, 0x05, 0xbe, 0x0f, 0xe8, 0xce, 0xbd,
- 0xa9, 0x02, 0xca, 0xbe, 0xf7, 0x97, 0x20, 0xbe, 0x8c, 0xf8, 0xa8, 0xbe,
- 0x7d, 0x20, 0x5a, 0x3e, 0x1c, 0xdb, 0x0a, 0xbd, 0xc6, 0x84, 0xe5, 0xbc,
- 0xfc, 0x57, 0xfd, 0xbc, 0x03, 0x72, 0xfc, 0xbe, 0x17, 0x86, 0x23, 0xbe,
- 0x43, 0xf3, 0x3f, 0xbc, 0x27, 0x50, 0xd6, 0x3c, 0x0e, 0x08, 0x51, 0xbe,
- 0x59, 0xf8, 0xc4, 0x3d, 0xb4, 0xe8, 0xa5, 0xbd, 0xfd, 0x0e, 0x7b, 0x3e,
- 0x66, 0x91, 0x12, 0xbd, 0xbb, 0x06, 0x70, 0xbd, 0x5e, 0x64, 0xcc, 0x3b,
- 0xc2, 0x66, 0x06, 0x3c, 0xa6, 0x45, 0x14, 0xbe, 0x5e, 0x0d, 0x82, 0xbd,
- 0x97, 0xd8, 0xdb, 0x3d, 0x5a, 0xca, 0x11, 0x3d, 0x64, 0x11, 0x4c, 0xbd,
- 0x6c, 0xd9, 0xb3, 0x3e, 0xae, 0x5f, 0x52, 0xbe, 0x37, 0x5b, 0x26, 0xbd,
- 0x8f, 0xc3, 0x9e, 0xbe, 0x58, 0x6e, 0xa7, 0xbe, 0xda, 0xdb, 0xc0, 0xbd,
- 0x0e, 0xd5, 0xc9, 0x3c, 0x3c, 0xc3, 0x99, 0xbe, 0x14, 0x3f, 0xb4, 0x3d,
- 0x9b, 0x66, 0x21, 0xbe, 0xcf, 0xd2, 0x1c, 0xbe, 0xc0, 0x18, 0xfc, 0x3d,
- 0x75, 0xc6, 0xa9, 0x3b, 0x0e, 0xa8, 0x52, 0xbe, 0x75, 0x70, 0xaf, 0x3c,
- 0x05, 0x51, 0x92, 0x3c, 0x7b, 0xde, 0xf9, 0xbe, 0x82, 0xe9, 0xb6, 0x3d,
- 0x73, 0x5d, 0x41, 0xbe, 0xfb, 0x5a, 0x80, 0xbe, 0x40, 0xb8, 0x76, 0xbe,
- 0x46, 0xa6, 0xb0, 0xbd, 0x99, 0xa6, 0x04, 0xbe, 0x55, 0x19, 0xb0, 0xbe,
- 0x7a, 0x90, 0x9e, 0xbd, 0xc4, 0xb4, 0x20, 0xbd, 0x7c, 0x51, 0xa0, 0xbe,
- 0x81, 0x5a, 0x2b, 0x3d, 0x65, 0x6a, 0x3e, 0xbd, 0x93, 0x6f, 0xa5, 0xbe,
- 0x0c, 0x29, 0x50, 0xbc, 0x57, 0x82, 0x13, 0xbe, 0x33, 0x52, 0x73, 0x3d,
- 0x96, 0xd7, 0x97, 0xbc, 0x60, 0xb7, 0x67, 0xbe, 0x6e, 0x3f, 0xb1, 0xbc,
- 0x94, 0x16, 0x22, 0xbd, 0x58, 0x75, 0x34, 0xbd, 0x19, 0x6f, 0x17, 0xbe,
- 0x47, 0x8d, 0xbc, 0xbe, 0xf2, 0x90, 0x17, 0x3c, 0xbd, 0x95, 0x86, 0xbd,
- 0x3a, 0x9f, 0x24, 0x3e, 0x74, 0xf6, 0x09, 0xbb, 0x40, 0xb7, 0x10, 0xbe,
- 0x0d, 0x01, 0x85, 0xbd, 0x34, 0x08, 0x8c, 0x3c, 0x54, 0x2e, 0xdd, 0xbe,
- 0x4c, 0x91, 0x9f, 0xbe, 0x7c, 0x08, 0xad, 0xbd, 0xa4, 0xbb, 0xa5, 0xbd,
- 0x98, 0xb1, 0xbb, 0xbe, 0xb8, 0xbf, 0xf0, 0xbd, 0xd2, 0x7b, 0x5d, 0xbd,
- 0xfa, 0x35, 0x1a, 0xbd, 0x20, 0xf5, 0x17, 0x3e, 0xfb, 0x58, 0xeb, 0xbd,
- 0x37, 0x54, 0xb3, 0xbd, 0xb5, 0x01, 0x87, 0xbe, 0xeb, 0x09, 0xf1, 0x3d,
- 0x58, 0xce, 0x08, 0x3e, 0xee, 0x00, 0xf1, 0x3d, 0x61, 0x6a, 0x6b, 0x3e,
- 0x39, 0x5f, 0x3b, 0xbe, 0xfc, 0x21, 0xd4, 0xbc, 0x84, 0xba, 0xa2, 0xbe,
- 0xa3, 0xec, 0x17, 0xbe, 0x32, 0x54, 0x10, 0xbe, 0xa1, 0x44, 0x08, 0xbe,
- 0x8b, 0x4c, 0xb6, 0x3e, 0x78, 0x91, 0x96, 0xbd, 0x83, 0x0b, 0xca, 0xbd,
- 0x4f, 0xf9, 0x29, 0xbe, 0x46, 0x35, 0x26, 0x3e, 0x32, 0xfd, 0x63, 0x3e,
- 0xe1, 0x31, 0x8b, 0xbd, 0x79, 0x88, 0x0a, 0x3e, 0xe7, 0xa7, 0x8e, 0xbc,
- 0x73, 0x2c, 0x11, 0xbe, 0xaa, 0xf4, 0xe2, 0xbd, 0x9b, 0x68, 0x89, 0xbe,
- 0xb2, 0x67, 0x89, 0x3e, 0x69, 0x0c, 0x28, 0xbc, 0x88, 0x8f, 0xd9, 0x3d,
- 0xcd, 0xc6, 0x92, 0xbe, 0x39, 0x78, 0xae, 0x3d, 0xea, 0x54, 0x13, 0xbd,
- 0xc7, 0x68, 0x0a, 0xbe, 0x37, 0xf0, 0xa9, 0xbe, 0x67, 0x6b, 0x55, 0xbd,
- 0x9e, 0xb8, 0xc0, 0x3d, 0xc0, 0x42, 0x1f, 0x3c, 0x7f, 0xa2, 0xa9, 0xbe,
- 0x65, 0x9b, 0xa0, 0x3d, 0xfe, 0x8d, 0x08, 0x3d, 0x9d, 0x92, 0xbc, 0xbd,
- 0x65, 0xcb, 0x01, 0x3e, 0xd5, 0x6d, 0x59, 0xbd, 0x35, 0x7b, 0x85, 0xbe,
- 0xd1, 0x18, 0x9f, 0xbd, 0x30, 0x1b, 0x8c, 0xbe, 0x1a, 0x28, 0x0d, 0xbe,
- 0x64, 0x05, 0xad, 0xbe, 0xa2, 0x70, 0x3b, 0xbe, 0x31, 0x44, 0x51, 0xbe,
- 0x57, 0xc3, 0x7b, 0xbe, 0xa3, 0x7e, 0xf2, 0xbd, 0x77, 0x17, 0x1f, 0xbe,
- 0x7c, 0x03, 0x77, 0x3e, 0x99, 0x98, 0x91, 0xbe, 0xc5, 0xe7, 0xb2, 0xbe,
- 0x66, 0xb3, 0xd5, 0xbd, 0xc4, 0x02, 0x05, 0xbe, 0x5a, 0x20, 0x28, 0xbd,
- 0xa7, 0x61, 0xb9, 0xbc, 0x1b, 0xf8, 0x04, 0xbd, 0x34, 0xbb, 0xc9, 0xbd,
- 0x51, 0x0f, 0x97, 0x3d, 0x01, 0x4c, 0x23, 0xbd, 0xaa, 0x85, 0x54, 0xbe,
- 0xcb, 0xa5, 0xd9, 0xbd, 0x7e, 0x28, 0x1d, 0xbe, 0x5c, 0x7f, 0x0f, 0xbf,
- 0x38, 0x74, 0x47, 0xbd, 0xfd, 0x60, 0xca, 0x3c, 0x32, 0xbb, 0x85, 0x3e,
- 0x5b, 0xae, 0x57, 0xbe, 0x99, 0x02, 0xde, 0x3e, 0xb9, 0x18, 0xe8, 0xbc,
- 0xb7, 0xe4, 0x44, 0x3e, 0x4e, 0x86, 0xd8, 0xbd, 0x86, 0xa4, 0x8b, 0xbe,
- 0x89, 0x7a, 0x14, 0x3e, 0x13, 0xfe, 0x86, 0xbe, 0xb8, 0xf3, 0x7c, 0xbd,
- 0xa0, 0x24, 0x61, 0x3e, 0xba, 0x5b, 0x3d, 0x3e, 0xee, 0xbc, 0xe2, 0x3e,
- 0x22, 0x2d, 0x8d, 0xbd, 0xb0, 0x63, 0x80, 0xbe, 0xa5, 0xae, 0x0c, 0xbe,
- 0x82, 0xcf, 0xfe, 0xbd, 0x5b, 0xfc, 0x74, 0x3e, 0x23, 0x74, 0x3a, 0xbe,
- 0xdd, 0x81, 0xef, 0xbc, 0x83, 0x21, 0x33, 0xbd, 0xfe, 0x10, 0x99, 0x3c,
- 0xb6, 0x36, 0x53, 0x3e, 0x48, 0xfc, 0xd6, 0xbd, 0x32, 0xa1, 0x62, 0x3d,
- 0x37, 0x54, 0xcc, 0xbe, 0x43, 0x47, 0x95, 0x3e, 0x91, 0x93, 0xb5, 0x3d,
- 0xc6, 0x95, 0x1c, 0x3e, 0x77, 0x61, 0x83, 0x3d, 0x15, 0x15, 0x01, 0x3e,
- 0x7e, 0xad, 0xf4, 0x3e, 0x4a, 0xb7, 0x1c, 0xbc, 0xb8, 0xf9, 0xcc, 0xbd,
- 0x68, 0xbf, 0x31, 0x3e, 0x8f, 0xc7, 0x13, 0xbd, 0xd9, 0x30, 0xc3, 0xbe,
- 0xf9, 0xbc, 0x39, 0xbe, 0xa6, 0x2f, 0xf2, 0x3d, 0x15, 0xa7, 0xf7, 0x3d,
- 0xce, 0x42, 0xa2, 0xbe, 0xca, 0x08, 0x95, 0xbe, 0x6e, 0xd0, 0x1a, 0x3e,
- 0x28, 0xb2, 0x46, 0xbe, 0x82, 0xc7, 0xd6, 0x3d, 0x5b, 0xa9, 0xc5, 0x3d,
- 0x83, 0x1f, 0x72, 0xbb, 0x56, 0x6b, 0xbe, 0xbd, 0x4e, 0x0c, 0xc3, 0x3d,
- 0x28, 0xef, 0x4c, 0xbe, 0x58, 0xf1, 0x11, 0xbe, 0x8b, 0x9d, 0x0c, 0x3e,
- 0x56, 0x20, 0x9d, 0xbe, 0x7d, 0x77, 0x55, 0xbc, 0xe2, 0x55, 0x3a, 0x3d,
- 0x76, 0x86, 0x19, 0xbd, 0x7f, 0x9d, 0x4d, 0xbd, 0x49, 0x8a, 0x4f, 0xbe,
- 0x48, 0x83, 0x39, 0xbe, 0xd2, 0x08, 0x5d, 0x3d, 0xf7, 0x96, 0x46, 0xbe,
- 0x3a, 0x6c, 0xaa, 0x3d, 0x7c, 0x85, 0xac, 0x3d, 0x04, 0x80, 0x81, 0xbd,
- 0xa0, 0x25, 0x28, 0xbc, 0xfd, 0xab, 0x0a, 0x3d, 0x20, 0x9c, 0x07, 0x3e,
- 0xf4, 0x93, 0x6f, 0x3c, 0x0b, 0xf6, 0x60, 0xbe, 0xe6, 0x80, 0x91, 0xbe,
- 0xcd, 0x95, 0x0c, 0x3d, 0xa4, 0x68, 0xfb, 0x3e, 0xaa, 0xd2, 0x5f, 0x3e,
- 0xf3, 0x94, 0x19, 0x3e, 0x9d, 0x10, 0xca, 0x3d, 0x6e, 0xdc, 0xd8, 0xbe,
- 0xb5, 0xe8, 0x1f, 0xbe, 0x25, 0x55, 0x92, 0xbe, 0x0b, 0x12, 0x58, 0xbe,
- 0xa1, 0x8e, 0x2d, 0xbe, 0x59, 0x88, 0x5d, 0x3e, 0x1f, 0x4b, 0x48, 0x3a,
- 0x3c, 0x47, 0x5e, 0xbe, 0x7c, 0x8d, 0x05, 0xbf, 0x99, 0x45, 0xe6, 0xbd,
- 0x85, 0x67, 0x5f, 0x3e, 0xfa, 0x00, 0x13, 0x3c, 0xee, 0xf8, 0x2a, 0x3e,
- 0x8c, 0xed, 0x60, 0xbc, 0x69, 0x9f, 0xe5, 0x3d, 0xfd, 0xff, 0x16, 0x3d,
- 0xd6, 0xf0, 0xd1, 0x3c, 0x30, 0xd1, 0x8a, 0x3d, 0x44, 0xd5, 0x70, 0xbd,
- 0xf8, 0x47, 0x3d, 0x3e, 0x32, 0x5e, 0x50, 0x3e, 0xf3, 0x5d, 0xda, 0x3b,
- 0xf8, 0xdb, 0x70, 0xbe, 0x6d, 0x58, 0x33, 0xbe, 0x49, 0xd0, 0x70, 0x3e,
- 0x6a, 0x36, 0x60, 0xbd, 0x95, 0x68, 0x51, 0x3e, 0x4c, 0x9d, 0x57, 0x3e,
- 0xcc, 0x64, 0xad, 0xbd, 0x44, 0xfd, 0x4a, 0x3e, 0x7e, 0xe8, 0x80, 0xbe,
- 0x44, 0x98, 0x8d, 0xbe, 0xc5, 0x68, 0x99, 0xbc, 0x09, 0xc3, 0xa0, 0x3e,
- 0x30, 0x58, 0x1b, 0x3e, 0x9c, 0x02, 0x42, 0x3e, 0x2c, 0xd0, 0x25, 0xbe,
- 0x48, 0xd5, 0xf1, 0xbd, 0x67, 0xd8, 0x0c, 0x3c, 0x01, 0x08, 0xf0, 0x3c,
- 0xa5, 0xe0, 0xa3, 0x3d, 0xa2, 0xa1, 0xea, 0x3d, 0xec, 0x2b, 0x18, 0x3e,
- 0x7d, 0x99, 0xf1, 0xbd, 0xc2, 0xaa, 0x85, 0x3d, 0x12, 0x5e, 0xf7, 0xbc,
- 0x95, 0x2b, 0xc0, 0x3d, 0x44, 0x7e, 0x64, 0xbc, 0x32, 0xc3, 0x5a, 0x3e,
- 0xc1, 0xf2, 0x8f, 0x3d, 0xf4, 0xcd, 0x62, 0x3e, 0x78, 0x55, 0x10, 0x3c,
- 0x8e, 0x36, 0x02, 0xba, 0xb7, 0x63, 0x8e, 0xbe, 0xf3, 0xba, 0xe3, 0x3d,
- 0x52, 0x1b, 0xf0, 0xbd, 0x5f, 0x18, 0xce, 0x3d, 0x54, 0xf7, 0xb7, 0x3d,
- 0x72, 0x1f, 0x73, 0x3e, 0xa8, 0x17, 0x01, 0x3e, 0x10, 0xdc, 0x23, 0x3d,
- 0xd5, 0x8a, 0x41, 0x3d, 0x20, 0xf7, 0xd4, 0xbd, 0xfe, 0xed, 0x70, 0x3d,
- 0xf0, 0x94, 0x13, 0x3a, 0xce, 0x35, 0x84, 0x3b, 0x57, 0x42, 0x32, 0x3d,
- 0x06, 0x2d, 0x1e, 0x3e, 0x67, 0x84, 0x73, 0x3e, 0xfe, 0x76, 0x8d, 0xbd,
- 0xe6, 0x82, 0x5d, 0xbd, 0x42, 0xcf, 0x69, 0x3e, 0xf0, 0xaf, 0xa8, 0xbc,
- 0xdb, 0x7c, 0x4f, 0x3e, 0x11, 0x0d, 0xde, 0xbd, 0xa6, 0x8b, 0x64, 0x3e,
- 0x41, 0xf1, 0x22, 0xbe, 0xd6, 0xe0, 0xa3, 0xbd, 0x53, 0x65, 0x96, 0x3d,
- 0x35, 0xdc, 0x72, 0x3e, 0xf2, 0xa2, 0xe8, 0xbc, 0xc3, 0xa2, 0xac, 0xbb,
- 0xf2, 0x2b, 0x39, 0xbe, 0xbd, 0x5e, 0x78, 0xbd, 0xd5, 0xb3, 0x5a, 0x3e,
- 0x26, 0x2b, 0xa6, 0xbd, 0x96, 0x2d, 0x4d, 0x3b, 0x24, 0xf1, 0x04, 0x3e,
- 0xef, 0x49, 0x3d, 0xbe, 0xc7, 0x0a, 0x2d, 0x3d, 0x27, 0xdc, 0x6f, 0x3e,
- 0xca, 0xed, 0xa5, 0x3d, 0x10, 0xe3, 0x14, 0x3d, 0x7c, 0x6f, 0x2f, 0x3e,
- 0xe4, 0x93, 0x1b, 0xbe, 0x77, 0xe9, 0xc8, 0x3e, 0xec, 0xb3, 0xd3, 0x3d,
- 0x01, 0x63, 0x15, 0x3e, 0xe0, 0xc7, 0xb0, 0x3d, 0x64, 0xbc, 0xc8, 0x3c,
- 0xf8, 0x71, 0x30, 0x3d, 0x86, 0x46, 0xf4, 0x3d, 0xee, 0xd9, 0x83, 0xbe,
- 0x24, 0x3a, 0xed, 0x3d, 0xab, 0x4e, 0x2e, 0x3d, 0xa6, 0x68, 0xf4, 0xbd,
- 0x0c, 0xc7, 0xef, 0xbc, 0x97, 0x13, 0x31, 0xbd, 0xf2, 0x65, 0x72, 0x3e,
- 0x0c, 0x19, 0x96, 0x3d, 0xd1, 0x15, 0x71, 0xbd, 0xec, 0xb9, 0xc6, 0x3d,
- 0x8c, 0x9f, 0x91, 0xbd, 0xae, 0x4b, 0xdc, 0xbd, 0xdd, 0x4f, 0x78, 0x3e,
- 0x49, 0x13, 0x50, 0xbe, 0xbf, 0x07, 0x0e, 0x3e, 0x4f, 0x7b, 0x13, 0x3d,
- 0x21, 0x8c, 0x15, 0x3e, 0x51, 0x50, 0x84, 0xbd, 0x01, 0xbc, 0x9e, 0x3e,
- 0xcb, 0xd9, 0xb9, 0xbd, 0x00, 0x6c, 0x49, 0x3d, 0x96, 0xa3, 0xd0, 0xbd,
- 0x37, 0x27, 0xff, 0xbb, 0xbc, 0x8b, 0x08, 0xbd, 0x3f, 0x94, 0x7f, 0xbd,
- 0x8a, 0x2a, 0xd7, 0x3d, 0xae, 0xb4, 0xe7, 0x3c, 0x87, 0xbe, 0x8a, 0x3e,
- 0x30, 0x71, 0x06, 0xbe, 0xe0, 0xab, 0x78, 0x3d, 0xf3, 0x96, 0xdf, 0x3d,
- 0x2d, 0x1e, 0x14, 0x3e, 0x4d, 0xf5, 0x48, 0x3e, 0xc2, 0xb1, 0x83, 0xbd,
- 0x67, 0x50, 0xa5, 0xbd, 0x7e, 0xa4, 0xb2, 0x3d, 0x0f, 0x2a, 0x1d, 0x3e,
- 0xbd, 0xe8, 0xc0, 0xbd, 0xe1, 0xe0, 0x58, 0xbb, 0xf5, 0x7c, 0x0a, 0x3c,
- 0x82, 0x8a, 0xb2, 0x3c, 0x03, 0x59, 0xbc, 0x3c, 0x78, 0x5c, 0x79, 0xbd,
- 0x4f, 0xa2, 0xf3, 0x3d, 0xe1, 0x63, 0x0a, 0xbe, 0x7c, 0x0b, 0x2b, 0x3e,
- 0x30, 0xe4, 0x5a, 0x3e, 0xf4, 0xef, 0x04, 0xbf, 0xcf, 0x71, 0x92, 0xbe,
- 0x56, 0x19, 0xa1, 0xbd, 0xb6, 0x41, 0xdb, 0xbd, 0x71, 0xec, 0xaf, 0xbd,
- 0x75, 0x48, 0x3c, 0x3e, 0x8d, 0x5c, 0xd7, 0xbd, 0x7b, 0xeb, 0x50, 0x3e,
- 0x4e, 0x74, 0x36, 0xbe, 0x2d, 0x08, 0x00, 0xbe, 0x9c, 0x14, 0x51, 0xbe,
- 0x87, 0x8d, 0xf4, 0xbd, 0x38, 0xbe, 0x54, 0x3d, 0xad, 0xa2, 0xe8, 0xbd,
- 0xa1, 0x91, 0xfd, 0x3d, 0xb8, 0x60, 0xdb, 0xbe, 0xa5, 0xb3, 0x54, 0xbe,
- 0x5a, 0x66, 0xa2, 0xbd, 0x4d, 0x5e, 0x0e, 0x3c, 0x18, 0xdc, 0xbe, 0xbd,
- 0x95, 0x32, 0x2f, 0x3e, 0xb5, 0xd5, 0x4b, 0xbe, 0x3f, 0x4d, 0x22, 0x3e,
- 0x82, 0xd4, 0xca, 0x3a, 0x61, 0x08, 0x63, 0xbe, 0x0e, 0x65, 0x85, 0xbc,
- 0xd9, 0x8c, 0x91, 0xbd, 0xdc, 0x53, 0xb1, 0xbc, 0x29, 0xf7, 0x99, 0xbe,
- 0x23, 0x31, 0xc2, 0xbd, 0x56, 0x28, 0x2d, 0xbe, 0x95, 0x1a, 0x3a, 0xbe,
- 0x94, 0x2b, 0x8c, 0xbe, 0x03, 0x71, 0x43, 0xbd, 0xf9, 0x75, 0xe2, 0xbd,
- 0xb8, 0xae, 0xc0, 0xbd, 0x2f, 0x25, 0x43, 0x3e, 0xed, 0x85, 0x08, 0xbc,
- 0x64, 0x86, 0xe1, 0xbd, 0x88, 0x2f, 0x3c, 0xbe, 0x65, 0x0c, 0xa0, 0xbd,
- 0x38, 0xba, 0x0f, 0x3e, 0xbd, 0x8a, 0x14, 0xbe, 0x0f, 0xcc, 0x5e, 0xbe,
- 0x28, 0x37, 0x43, 0x3b, 0xf4, 0xd2, 0x7a, 0xbe, 0x4e, 0xb6, 0xbb, 0x3c,
- 0x7f, 0xae, 0x01, 0x3e, 0xfd, 0xf0, 0x83, 0xbe, 0xaa, 0x6f, 0x8c, 0xbe,
- 0xc1, 0xbb, 0x97, 0xbd, 0x93, 0xed, 0x6b, 0xbd, 0x4e, 0x3e, 0x0f, 0x3e,
- 0xcd, 0xf9, 0x28, 0xbd, 0x07, 0xdb, 0xbb, 0xbe, 0x3d, 0xaa, 0x46, 0x3e,
- 0xfc, 0x08, 0xe3, 0x3d, 0x76, 0x4b, 0x05, 0x3e, 0x2c, 0x86, 0x00, 0xbe,
- 0xc6, 0x55, 0x1f, 0xbe, 0x52, 0x3e, 0x0d, 0x3e, 0x39, 0x5c, 0xf9, 0xbd,
- 0xdf, 0x89, 0xcc, 0x3d, 0xbc, 0xa8, 0xd2, 0x3d, 0xe4, 0x03, 0xed, 0xbd,
- 0x82, 0xc3, 0x75, 0xbe, 0x74, 0xfc, 0x2f, 0x3c, 0x72, 0x9f, 0xba, 0xbe,
- 0x54, 0x7a, 0x8f, 0xbe, 0xd8, 0x7e, 0x12, 0xbe, 0xf5, 0xf9, 0x18, 0xbf,
- 0x2a, 0x90, 0x5d, 0x3d, 0x08, 0x6f, 0xc9, 0xbd, 0x70, 0x8d, 0x04, 0xbe,
- 0xea, 0x37, 0x5a, 0x3e, 0xaa, 0xaf, 0x55, 0x3d, 0x34, 0x4b, 0x04, 0xbd,
- 0xdc, 0x0e, 0x7a, 0xbe, 0x1a, 0xce, 0xef, 0xbd, 0x23, 0x19, 0x93, 0xbe,
- 0x32, 0x7a, 0xc8, 0xbe, 0x9d, 0xdc, 0x7f, 0xbe, 0x1c, 0x51, 0xb8, 0xbe,
- 0x01, 0xb8, 0x36, 0xbe, 0x82, 0xf0, 0xe7, 0x3d, 0x40, 0x0d, 0x6d, 0xbd,
- 0xf9, 0x3a, 0xf0, 0xbd, 0xb9, 0x52, 0xcb, 0xbc, 0x5b, 0x4c, 0x63, 0x3c,
- 0x03, 0x45, 0x9c, 0xbe, 0x1e, 0x2a, 0x88, 0xbd, 0xf5, 0xd4, 0x2a, 0x3d,
- 0x44, 0x91, 0x94, 0x3d, 0x96, 0x68, 0x76, 0xbe, 0xb9, 0x2a, 0x70, 0xbe,
- 0x5b, 0x1b, 0xba, 0xbd, 0xec, 0x7b, 0x33, 0xbe, 0x2d, 0x46, 0x8b, 0xbd,
- 0xe0, 0x9c, 0xac, 0xbe, 0x31, 0xcf, 0x7f, 0x3c, 0x1f, 0x63, 0x07, 0xbe,
- 0xcf, 0x3e, 0x08, 0xbd, 0xd7, 0x05, 0x9b, 0xbd, 0x60, 0x93, 0x24, 0xbe,
- 0xb3, 0xb6, 0xd5, 0xbd, 0x87, 0x6c, 0x0e, 0x3e, 0xc3, 0x52, 0x59, 0xbc,
- 0x0c, 0x5c, 0x87, 0x3e, 0xc2, 0x33, 0x0c, 0x3b, 0xe6, 0x4c, 0x51, 0xbc,
- 0xd6, 0xa5, 0xd5, 0xbd, 0x64, 0x27, 0x89, 0x3e, 0x86, 0xf3, 0xd2, 0x3d,
- 0xb9, 0xc9, 0x13, 0xbc, 0x9c, 0xa1, 0xfa, 0x3d, 0xe3, 0x8d, 0x04, 0xbf,
- 0xb5, 0x7f, 0x23, 0xbd, 0xa8, 0xe5, 0x87, 0xbe, 0x97, 0x18, 0xe9, 0xbe,
- 0xf2, 0xce, 0xc0, 0x3d, 0xdf, 0x4e, 0x41, 0xbd, 0xe2, 0x32, 0xdf, 0xbd,
- 0xb2, 0x4a, 0xf3, 0xbd, 0x81, 0x5e, 0x8c, 0xbd, 0xde, 0xbd, 0x81, 0xbc,
- 0x63, 0xca, 0xe5, 0xbe, 0x35, 0x8f, 0xe1, 0xbe, 0xf7, 0x67, 0xff, 0xbc,
- 0xcf, 0xe7, 0x28, 0x3c, 0x39, 0xdd, 0x6a, 0x3e, 0x5f, 0x67, 0xf4, 0x3d,
- 0x7d, 0xb6, 0x21, 0x3d, 0x7f, 0x46, 0x0d, 0xbe, 0x94, 0x90, 0x10, 0xbd,
- 0x77, 0xac, 0xba, 0x3c, 0x3b, 0x85, 0x43, 0xbe, 0x12, 0xbe, 0x05, 0xbe,
- 0xb3, 0xc9, 0x82, 0xbe, 0xc5, 0xe2, 0x7e, 0xbe, 0x88, 0x1d, 0x39, 0xbe,
- 0xc0, 0xcb, 0x1e, 0xbd, 0x5f, 0xb8, 0x62, 0xbe, 0x41, 0x63, 0xde, 0xbd,
- 0x18, 0x4d, 0x7a, 0xbe, 0xe9, 0x81, 0x85, 0x3e, 0x63, 0xa7, 0xb5, 0xbe,
- 0x30, 0x95, 0xab, 0xbe, 0x5a, 0x8f, 0x9d, 0xbe, 0x5b, 0x3a, 0x22, 0x3e,
- 0xee, 0x95, 0x4f, 0xbe, 0x92, 0x5a, 0x0b, 0x3e, 0xdf, 0x39, 0x38, 0x3e,
- 0x7b, 0x1d, 0x8d, 0xbe, 0xa7, 0x2e, 0x22, 0xbe, 0xb5, 0xb0, 0x58, 0x3e,
- 0x13, 0x35, 0x4c, 0xbe, 0x07, 0x15, 0xa0, 0xbe, 0x79, 0x40, 0xa5, 0xbe,
- 0xac, 0xbe, 0x40, 0x3e, 0x72, 0x26, 0x42, 0x3e, 0xf1, 0x2a, 0xb3, 0xbd,
- 0xde, 0x57, 0xa3, 0x3d, 0x7e, 0x6b, 0x76, 0x3d, 0xcf, 0xcd, 0x29, 0x3e,
- 0xf9, 0x97, 0x63, 0xbe, 0x7c, 0xc6, 0x11, 0x3e, 0xd0, 0x4b, 0x11, 0xbe,
- 0x9b, 0xad, 0x2a, 0xbc, 0xfb, 0x92, 0x3f, 0xbe, 0x9d, 0xce, 0x2e, 0x3c,
- 0x8a, 0x24, 0x83, 0x3a, 0x2a, 0xb6, 0xac, 0xbd, 0x6b, 0x69, 0xa4, 0x3d,
- 0x99, 0xd0, 0x78, 0x3e, 0x92, 0x80, 0x02, 0x3e, 0xed, 0x2f, 0xb1, 0xbd,
- 0xe7, 0x17, 0xd4, 0xbe, 0xee, 0x69, 0xb9, 0x3d, 0x3a, 0x8b, 0x2d, 0xbd,
- 0x92, 0x23, 0x8b, 0xbe, 0xa2, 0xa2, 0x02, 0xbe, 0x0c, 0x7e, 0xda, 0xbd,
- 0x50, 0x2c, 0x45, 0xbd, 0x7f, 0x39, 0x85, 0x3d, 0x46, 0x3e, 0x32, 0xbe,
- 0xc9, 0x9c, 0x30, 0xbe, 0x59, 0x12, 0x94, 0xbe, 0x11, 0xd8, 0x08, 0xbd,
- 0x42, 0x0a, 0x24, 0xbd, 0xb4, 0x4d, 0x18, 0xbc, 0xfa, 0x82, 0x19, 0xbe,
- 0x6a, 0xb6, 0x5c, 0xbd, 0xbf, 0x50, 0x5e, 0xbe, 0x9b, 0x43, 0xb9, 0xbe,
- 0x29, 0xae, 0xba, 0xbe, 0x9a, 0xc1, 0xd8, 0xbe, 0xbc, 0xf3, 0xc6, 0xbe,
- 0x86, 0xf0, 0x7d, 0x3e, 0x29, 0x46, 0x6b, 0x3d, 0x4a, 0x8c, 0xc2, 0xbd,
- 0x4c, 0xf0, 0xbc, 0x3c, 0xdc, 0x8d, 0xc9, 0xbc, 0x2e, 0x59, 0x30, 0x3e,
- 0x38, 0xd3, 0xba, 0x3d, 0x4c, 0x00, 0x9d, 0xbd, 0x7a, 0x91, 0x2a, 0xbe,
- 0x66, 0x82, 0xd0, 0xbc, 0x65, 0x16, 0xb6, 0xbe, 0x1e, 0xd4, 0xa0, 0xbe,
- 0x7e, 0xaa, 0x87, 0xbe, 0x07, 0x15, 0x94, 0xbd, 0xb6, 0x06, 0xa7, 0xbc,
- 0x9c, 0x95, 0x30, 0x3d, 0x07, 0xbe, 0xd3, 0x3d, 0x79, 0xf7, 0x22, 0xbd,
- 0xc1, 0x27, 0xbe, 0xbd, 0x09, 0xf6, 0x87, 0x3d, 0x79, 0xa1, 0x22, 0xbe,
- 0x58, 0x7f, 0x31, 0xbd, 0xad, 0x4b, 0xeb, 0xbd, 0xfb, 0x06, 0x3c, 0xbe,
- 0x42, 0x4f, 0xeb, 0xbd, 0x2a, 0x92, 0xa4, 0xbe, 0x52, 0xad, 0x42, 0xbe,
- 0x93, 0x22, 0xb4, 0xbd, 0x77, 0xa1, 0x59, 0x3e, 0x7e, 0xb0, 0xda, 0x3c,
- 0x82, 0x4a, 0x1d, 0xbc, 0x15, 0xa8, 0xf1, 0xbd, 0xba, 0x0b, 0x5c, 0x3e,
- 0x70, 0x98, 0xda, 0x3b, 0x6a, 0xe0, 0x0b, 0xbe, 0xc5, 0xe5, 0xa3, 0xbd,
- 0xb8, 0x5d, 0x0b, 0xbe, 0x3b, 0x6b, 0x45, 0xbd, 0x19, 0xb7, 0xde, 0x3d,
- 0xd3, 0xa1, 0x18, 0xbe, 0x1b, 0x51, 0xbc, 0xbd, 0x58, 0x9a, 0x50, 0x3d,
- 0xf8, 0x6d, 0x9b, 0xbe, 0x0e, 0x09, 0x1c, 0xbe, 0x92, 0xf8, 0x6f, 0xbe,
- 0xd6, 0x97, 0xd8, 0xbe, 0xb9, 0x18, 0xca, 0xbe, 0x2c, 0xa4, 0x5e, 0xbb,
- 0xa5, 0x77, 0xe9, 0xba, 0x1d, 0x17, 0x24, 0x3d, 0x82, 0x63, 0xc5, 0xbd,
- 0xa0, 0x86, 0x1d, 0xbf, 0x55, 0x59, 0x44, 0x3e, 0xf6, 0xed, 0x93, 0xbe,
- 0xcb, 0xf1, 0x53, 0xbe, 0xd4, 0x8b, 0xb8, 0x3d, 0x12, 0xce, 0x53, 0x3e,
- 0x6e, 0xbc, 0xc7, 0x3d, 0x1d, 0xa8, 0x6c, 0x3e, 0x22, 0x59, 0x4e, 0xbe,
- 0xcb, 0x0d, 0x4b, 0x3e, 0x47, 0xb1, 0xd6, 0xbc, 0x72, 0x0e, 0x5c, 0x3e,
- 0xfa, 0x16, 0xfc, 0xbd, 0x79, 0x42, 0xea, 0xbd, 0x5a, 0x47, 0x97, 0x3c,
- 0xbf, 0x37, 0x77, 0xbe, 0x2f, 0xb8, 0x06, 0xbe, 0xb1, 0x9d, 0x8c, 0x3e,
- 0x84, 0xee, 0x78, 0xbc, 0x56, 0x9b, 0x6e, 0xbe, 0xeb, 0x78, 0x1d, 0x3d,
- 0xb4, 0x3e, 0x36, 0xbb, 0x8e, 0xf7, 0x32, 0x3e, 0xcd, 0x76, 0x4c, 0x3e,
- 0x1f, 0xd7, 0x22, 0xbe, 0x0b, 0x1e, 0x80, 0xbd, 0xa6, 0x7d, 0x71, 0xbc,
- 0xc4, 0xae, 0x79, 0x3e, 0x51, 0x5b, 0xa5, 0xbd, 0xc0, 0x8b, 0x00, 0x3e,
- 0xde, 0x81, 0xac, 0xbd, 0x08, 0x99, 0x32, 0xbe, 0x48, 0xe8, 0x97, 0xbe,
- 0x9f, 0xbc, 0x50, 0xbd, 0xc0, 0x61, 0xe2, 0xbd, 0xf1, 0xa6, 0x68, 0xbe,
- 0x8d, 0x70, 0xde, 0xbd, 0x2e, 0x76, 0xd2, 0xbd, 0x74, 0x62, 0x86, 0x3e,
- 0x70, 0xc4, 0xda, 0x3c, 0xef, 0xb8, 0xeb, 0x3b, 0xbb, 0x2e, 0xbc, 0x3d,
- 0x7c, 0xc6, 0x00, 0xbf, 0xed, 0xd4, 0xbe, 0x3d, 0xc0, 0x51, 0x1b, 0x3e,
- 0x04, 0xe9, 0x92, 0xbc, 0xf3, 0x58, 0xe8, 0x3b, 0xe0, 0xc2, 0xb8, 0xbe,
- 0xc8, 0x19, 0xb8, 0x3d, 0x64, 0x76, 0x9b, 0xbe, 0x79, 0x20, 0x0b, 0xbd,
- 0xcd, 0x32, 0x28, 0x3e, 0x81, 0x54, 0xa5, 0xbd, 0xad, 0x44, 0xcf, 0x3d,
- 0x24, 0x36, 0xad, 0xbd, 0xe1, 0x47, 0xec, 0x3d, 0x2c, 0x72, 0x55, 0x3e,
- 0x87, 0x71, 0x90, 0x3d, 0x25, 0x11, 0x40, 0xbe, 0xf7, 0xf0, 0x37, 0x3e,
- 0xf3, 0x73, 0xea, 0xbd, 0xaf, 0x65, 0x4a, 0x3e, 0xdc, 0x45, 0x53, 0x3e,
- 0xfa, 0xf3, 0x0d, 0xbb, 0x64, 0xf0, 0x86, 0x3d, 0xef, 0xc7, 0x2b, 0x3d,
- 0x25, 0x8d, 0xd0, 0x3c, 0xa1, 0xad, 0x4e, 0x3e, 0xe2, 0x54, 0x53, 0x3e,
- 0x5f, 0xcf, 0x06, 0x3c, 0x59, 0x11, 0x0c, 0xbf, 0x35, 0x99, 0xa1, 0x3e,
- 0x87, 0x69, 0x61, 0xbe, 0xc2, 0x89, 0x6b, 0xbe, 0xb2, 0x6d, 0x09, 0x3e,
- 0x6a, 0x70, 0x42, 0xbe, 0x18, 0x53, 0x2f, 0x3e, 0x41, 0x70, 0x87, 0xbe,
- 0x26, 0xa8, 0xc5, 0xbe, 0x82, 0x70, 0x5a, 0x3d, 0x11, 0x48, 0x18, 0xbe,
- 0x5a, 0x5c, 0x5c, 0xbe, 0x88, 0xe4, 0xa0, 0x3c, 0x9b, 0xa4, 0xed, 0xbd,
- 0x1a, 0x65, 0xe5, 0x3d, 0xad, 0xcc, 0xb1, 0xbd, 0x76, 0x1d, 0x59, 0x3d,
- 0x30, 0xbb, 0x6a, 0xbd, 0xba, 0x19, 0x2e, 0xbe, 0xe3, 0x6b, 0x2e, 0xbd,
- 0xa2, 0x7a, 0x20, 0xbe, 0x2f, 0x57, 0x4b, 0xbe, 0x4b, 0xd9, 0xdb, 0x3c,
- 0x38, 0xcf, 0x4a, 0xbd, 0xf3, 0xfd, 0x1c, 0xbe, 0x15, 0xf6, 0xbe, 0xba,
- 0xc1, 0x67, 0x22, 0x3d, 0x31, 0xdf, 0x57, 0x3e, 0xf3, 0x71, 0x9a, 0x3e,
- 0xe4, 0x61, 0x5a, 0x3e, 0x44, 0x17, 0xda, 0xbd, 0x35, 0x78, 0x23, 0xbe,
- 0xb5, 0x6d, 0x1e, 0x3e, 0xc3, 0x88, 0x5b, 0xbd, 0xf1, 0xf7, 0x4e, 0xbd,
- 0xdf, 0x54, 0x28, 0xbd, 0x39, 0xcf, 0xbd, 0xbd, 0x2b, 0xb7, 0x18, 0x3e,
- 0x5d, 0x83, 0x19, 0xbc, 0x1e, 0xc5, 0x0f, 0x3e, 0xd8, 0x23, 0xc7, 0x3c,
- 0x85, 0xb9, 0x65, 0xbe, 0xca, 0x0c, 0x7a, 0x3e, 0x79, 0xe7, 0xbb, 0xbe,
- 0x3f, 0x42, 0xa6, 0xbe, 0x46, 0xb3, 0x5e, 0xbe, 0xe7, 0x8d, 0xdf, 0xbe,
- 0x3c, 0x57, 0x6a, 0xbe, 0x50, 0x1b, 0x91, 0xbd, 0x74, 0xcf, 0xd1, 0x3d,
- 0x25, 0xa7, 0xcf, 0xbd, 0xf1, 0xc6, 0xd1, 0xbc, 0x1e, 0x6b, 0xfe, 0xbd,
- 0xd3, 0x3e, 0x79, 0xbe, 0x5c, 0x21, 0x4d, 0x3e, 0x3b, 0xc8, 0xb4, 0x3e,
- 0xd6, 0x49, 0x39, 0x3e, 0x07, 0xea, 0x23, 0xbd, 0x45, 0x96, 0x92, 0x3e,
- 0xfd, 0x3b, 0x3b, 0x3d, 0x46, 0x99, 0xcc, 0xbd, 0x4e, 0x79, 0x99, 0x3d,
- 0x4c, 0x35, 0x0d, 0xbe, 0x86, 0x06, 0x15, 0xbe, 0x80, 0xc0, 0x64, 0x3e,
- 0xc2, 0x60, 0x12, 0x3c, 0xc9, 0x67, 0xa9, 0x3d, 0xd1, 0xaa, 0xe4, 0x3b,
- 0x42, 0xd3, 0xde, 0xbd, 0x98, 0xb9, 0x0c, 0xbe, 0xdd, 0x89, 0xdd, 0x3b,
- 0x70, 0x6b, 0x4c, 0xbd, 0x36, 0x21, 0x04, 0x3e, 0x9c, 0x90, 0x9d, 0x3d,
- 0xe7, 0x4a, 0x3a, 0x3e, 0xd2, 0xe2, 0x76, 0x3d, 0x42, 0x0c, 0x4f, 0xbe,
- 0x15, 0x71, 0x3b, 0x3d, 0x20, 0xcb, 0x64, 0xbe, 0x0b, 0xf6, 0x30, 0xbe,
- 0xf9, 0x70, 0x2a, 0xbd, 0x42, 0xb3, 0x1a, 0xbf, 0x8b, 0xea, 0x33, 0x3d,
- 0xff, 0xb0, 0x30, 0x3d, 0xf3, 0x31, 0x7a, 0xbc, 0x1e, 0xb9, 0x0f, 0xbd,
- 0xcf, 0x36, 0x03, 0xbe, 0x94, 0x35, 0xc4, 0xbc, 0x53, 0x23, 0x3a, 0xbc,
- 0x2d, 0xee, 0x9d, 0xbe, 0xf6, 0x53, 0x03, 0x3e, 0xb3, 0x5d, 0xc3, 0xbe,
- 0x09, 0xdc, 0x3f, 0xbd, 0xc6, 0x1b, 0x90, 0x3c, 0xda, 0x94, 0x91, 0xbd,
- 0x9d, 0xf6, 0xa5, 0xbd, 0xf7, 0xcd, 0x99, 0x3b, 0x20, 0xf1, 0xa8, 0x3d,
- 0x41, 0xf6, 0xbb, 0xbd, 0xcf, 0x95, 0x58, 0xbe, 0x60, 0x22, 0x38, 0x3c,
- 0x22, 0x4e, 0xc5, 0xbe, 0x46, 0xe2, 0x9b, 0x3c, 0xdd, 0x18, 0xd8, 0xbd,
- 0x7f, 0x57, 0x1c, 0xbd, 0x86, 0x52, 0x95, 0x3e, 0x6b, 0xb6, 0xfc, 0xbd,
- 0xe0, 0x83, 0xa6, 0xbe, 0x73, 0xad, 0x1c, 0xbf, 0xa1, 0x67, 0xf1, 0x3d,
- 0x2b, 0xca, 0x1b, 0x3d, 0x89, 0xef, 0x6a, 0xbd, 0x9a, 0x43, 0xac, 0x3c,
- 0x25, 0x6c, 0x2d, 0x3d, 0x7a, 0x99, 0x15, 0xbe, 0x20, 0x4b, 0x1e, 0xbe,
- 0xfe, 0xbb, 0x57, 0xbe, 0x30, 0xbd, 0x2d, 0xbe, 0x94, 0x12, 0x74, 0xbc,
- 0x1a, 0x37, 0xf0, 0xbd, 0xc2, 0xf0, 0x02, 0x3e, 0x65, 0x45, 0x76, 0xbd,
- 0x98, 0x31, 0xe4, 0x3d, 0xda, 0x7e, 0x5e, 0xbe, 0xcb, 0xa4, 0x70, 0x3d,
- 0xb0, 0x96, 0xab, 0x3d, 0x8d, 0x62, 0x35, 0x3e, 0x22, 0xda, 0x31, 0x3d,
- 0xa0, 0x97, 0x54, 0xbe, 0xea, 0xc8, 0x43, 0xbe, 0x39, 0xec, 0x93, 0x3d,
- 0xe6, 0xd5, 0x07, 0xbe, 0x33, 0xe1, 0xa4, 0xbe, 0x1f, 0x7d, 0x0c, 0xbe,
- 0x16, 0x83, 0xdf, 0xbd, 0x16, 0xf8, 0x9a, 0xbe, 0x4c, 0xc9, 0x25, 0xbe,
- 0x84, 0x7a, 0x8b, 0xbd, 0x58, 0x5b, 0xcd, 0x3d, 0x62, 0xbc, 0xeb, 0x3b,
- 0x50, 0xe5, 0xb2, 0xbe, 0x48, 0xfb, 0x89, 0x3d, 0xdd, 0x18, 0xf3, 0x3d,
- 0x19, 0x29, 0x18, 0x3d, 0x16, 0x10, 0x95, 0x3d, 0xf2, 0x74, 0x80, 0xbe,
- 0x7b, 0x05, 0x35, 0xbe, 0x78, 0x26, 0x8f, 0xbd, 0x67, 0xbc, 0x32, 0xbe,
- 0x26, 0x04, 0xbc, 0x3d, 0x08, 0x15, 0xd6, 0x3d, 0xb4, 0x97, 0x44, 0x3d,
- 0x82, 0xe9, 0x2c, 0x3c, 0x46, 0xb7, 0x3e, 0x3d, 0x6d, 0x9d, 0xef, 0xbd,
- 0xf1, 0x6c, 0x64, 0xbe, 0x47, 0x41, 0x79, 0xbe, 0xf6, 0xe8, 0x8d, 0xbd,
- 0x1f, 0xfb, 0xe7, 0xbe, 0x08, 0x71, 0xc8, 0xbe, 0xd9, 0xc9, 0xfc, 0xbd,
- 0x2f, 0x6b, 0x30, 0xbe, 0xc0, 0xd3, 0xa8, 0xbd, 0xb3, 0xc8, 0x0f, 0xbe,
- 0x35, 0x77, 0xe1, 0x3d, 0x0b, 0x16, 0x0f, 0xbd, 0x9a, 0xd4, 0x2c, 0xbd,
- 0x17, 0x35, 0xd8, 0x3d, 0x16, 0x92, 0xbe, 0xbd, 0x40, 0xef, 0x5c, 0x3e,
- 0xf3, 0x39, 0x2d, 0xbd, 0xe2, 0xbb, 0x58, 0xbe, 0x5e, 0x79, 0xb5, 0xbd,
- 0xb7, 0xe3, 0x00, 0xbe, 0xf3, 0x5f, 0x76, 0xbe, 0xe9, 0x84, 0x15, 0xbe,
- 0xc2, 0x02, 0xde, 0xbe, 0x7c, 0x3c, 0x84, 0x3d, 0x9a, 0x70, 0x63, 0x3c,
- 0x78, 0x84, 0xb7, 0x3c, 0x22, 0x3b, 0x76, 0xbe, 0xae, 0x6f, 0x1d, 0xbf,
- 0x9d, 0xc6, 0x80, 0xbe, 0x3f, 0x93, 0x90, 0x3e, 0x6e, 0x21, 0x43, 0xbe,
- 0xa8, 0x31, 0xac, 0xbd, 0x9b, 0x4d, 0x91, 0x3d, 0x89, 0xdb, 0xb3, 0xbd,
- 0x67, 0x55, 0x62, 0x3b, 0x30, 0x38, 0x9b, 0x3e, 0x54, 0xbc, 0xe3, 0xbb,
- 0x2c, 0xf3, 0x8f, 0xbd, 0x06, 0x9f, 0x96, 0x3c, 0x6c, 0x74, 0xf5, 0xbc,
- 0x6e, 0xc7, 0x16, 0xbe, 0x7f, 0x46, 0x39, 0x3c, 0x26, 0xbb, 0x18, 0xbd,
- 0x02, 0x87, 0x94, 0xbb, 0x30, 0x1a, 0x38, 0xbe, 0xd3, 0x32, 0x54, 0xbe,
- 0x64, 0x86, 0x8c, 0xbd, 0xa6, 0xd8, 0x3b, 0xbe, 0x58, 0x72, 0x8e, 0xbe,
- 0xde, 0xfa, 0x82, 0xbe, 0x02, 0xdf, 0x35, 0xbd, 0x46, 0xdd, 0x67, 0xbe,
- 0xf2, 0x09, 0x8b, 0xbe, 0xa6, 0xa8, 0x34, 0xbe, 0xfb, 0x4c, 0xba, 0xbe,
- 0x1f, 0x12, 0xc1, 0xbd, 0x67, 0x96, 0x03, 0x3e, 0x74, 0x80, 0x0f, 0xbe,
- 0x3c, 0xa6, 0xfc, 0xbd, 0x6c, 0x12, 0xd4, 0xbe, 0x3c, 0x7f, 0x43, 0xbd,
- 0xf5, 0x84, 0x29, 0x3e, 0xd4, 0x1b, 0x6a, 0xbc, 0xaa, 0xfe, 0x97, 0xbd,
- 0xb6, 0x5f, 0xa2, 0xbe, 0xed, 0x61, 0xc6, 0xbd, 0x9c, 0x35, 0x03, 0x3d,
- 0x87, 0x53, 0xdb, 0x3b, 0x28, 0xa2, 0xd2, 0xbd, 0x91, 0xcc, 0x47, 0xbe,
- 0x7a, 0x42, 0x64, 0x3e, 0x18, 0x2f, 0x86, 0x3b, 0x20, 0x54, 0x5b, 0xbd,
- 0xb8, 0xc3, 0x99, 0xbd, 0x18, 0xb3, 0xae, 0xbe, 0xaf, 0x21, 0xfc, 0xbd,
- 0x58, 0xed, 0xb7, 0xbe, 0x87, 0xcd, 0x88, 0xbc, 0x88, 0xaf, 0xc1, 0xbc,
- 0x46, 0xeb, 0x92, 0xbe, 0x45, 0x73, 0xab, 0xbd, 0xc7, 0x5e, 0x78, 0xbe,
- 0x1a, 0x62, 0x35, 0x3d, 0xdd, 0x08, 0xab, 0x3e, 0xaa, 0x6b, 0x80, 0xbe,
- 0xa6, 0xd0, 0x54, 0xbe, 0xa6, 0xd5, 0x1b, 0xbe, 0xc0, 0xaa, 0xa0, 0x3e,
- 0xc8, 0x09, 0x11, 0x3d, 0xaa, 0x0f, 0x43, 0x3d, 0x8c, 0xb7, 0x2c, 0xbe,
- 0x49, 0x98, 0xf9, 0x3d, 0x72, 0xcf, 0x2d, 0x3e, 0x3a, 0x03, 0x25, 0x3e,
- 0xf9, 0x7e, 0x4b, 0x3e, 0xc8, 0x4e, 0x47, 0xbe, 0x8e, 0x66, 0x86, 0xbe,
- 0xf0, 0xa4, 0x98, 0x3d, 0xfc, 0x74, 0x85, 0xbd, 0x4a, 0x30, 0x3c, 0xbd,
- 0x52, 0x92, 0x47, 0xbe, 0xd8, 0x6a, 0xd2, 0x3d, 0x61, 0x7d, 0xcd, 0xbd,
- 0x0a, 0x0c, 0x44, 0x3d, 0x8c, 0xd9, 0x2f, 0xbd, 0xf8, 0x4c, 0x72, 0xbd,
- 0xc5, 0x5f, 0x0b, 0xbe, 0x5a, 0x24, 0x34, 0xbe, 0xb4, 0xbf, 0x60, 0x3e,
- 0xaf, 0x34, 0xbc, 0x3c, 0x6a, 0xfb, 0xae, 0xbe, 0x47, 0x0a, 0x55, 0xbe,
- 0x75, 0x11, 0xda, 0xbc, 0x03, 0x22, 0x31, 0xbe, 0x4d, 0x7f, 0x16, 0x3e,
- 0xc5, 0x26, 0xcc, 0xbd, 0xb0, 0x1d, 0x19, 0xbd, 0x98, 0x5b, 0xde, 0x3c,
- 0x47, 0x7d, 0xa0, 0x3e, 0xd6, 0xf5, 0x11, 0xbe, 0xd2, 0x80, 0x6d, 0x3e,
- 0xea, 0x99, 0x53, 0x3d, 0x98, 0x07, 0xe8, 0x3d, 0x5c, 0x1a, 0x90, 0xbd,
- 0xa4, 0x7b, 0xf9, 0x3c, 0x59, 0xa3, 0x12, 0xbe, 0x13, 0xcf, 0x65, 0xbe,
- 0x19, 0xa5, 0x81, 0x3e, 0xb0, 0x1c, 0xfd, 0xbd, 0x76, 0x99, 0x5b, 0xbe,
- 0x38, 0x7a, 0xa7, 0x3c, 0xa8, 0xa4, 0x84, 0xbd, 0x20, 0x76, 0x93, 0xbd,
- 0x5c, 0x61, 0x32, 0xbe, 0xd0, 0x25, 0x37, 0xbe, 0xf1, 0xa8, 0x3a, 0x3c,
- 0xd6, 0xe4, 0x15, 0xbd, 0xfa, 0x3a, 0x86, 0x3e, 0x99, 0x91, 0xff, 0xbc,
- 0xf3, 0x2c, 0x2b, 0xbe, 0xed, 0xed, 0x4f, 0x3c, 0x85, 0xf2, 0x7a, 0xbe,
- 0xb7, 0x02, 0x1d, 0xbe, 0xc0, 0x79, 0xe1, 0xbd, 0xb4, 0x8b, 0xb4, 0xbd,
- 0xb6, 0xbc, 0x82, 0xbe, 0x24, 0x00, 0x1a, 0xbe, 0xc5, 0x7e, 0x00, 0x3d,
- 0x0c, 0x55, 0x08, 0x3d, 0x5d, 0x4e, 0x55, 0x3c, 0x49, 0x6c, 0xa5, 0xbe,
- 0x0d, 0x9c, 0x68, 0xbd, 0xc3, 0x13, 0x02, 0xbe, 0x52, 0xdd, 0x04, 0x3d,
- 0xec, 0x2b, 0x3b, 0x3b, 0x97, 0xf3, 0x99, 0xbd, 0xfe, 0x47, 0xb7, 0xbd,
- 0x98, 0x53, 0x87, 0xbe, 0x53, 0xa0, 0x6f, 0xbd, 0x20, 0x55, 0xbc, 0xbd,
- 0xfc, 0x38, 0x9b, 0xbe, 0xfa, 0x37, 0xb6, 0xbc, 0x2f, 0x89, 0x18, 0xbe,
- 0xf5, 0xd0, 0xd0, 0x3d, 0xe4, 0xbd, 0xfd, 0x3e, 0x01, 0xc2, 0x88, 0xbe,
- 0x5f, 0x45, 0x47, 0x3e, 0xbe, 0x8a, 0xb0, 0x3c, 0xd9, 0x45, 0xc6, 0x3e,
- 0x8f, 0x5c, 0xa8, 0x3d, 0xf3, 0x4f, 0x3c, 0xbe, 0xd8, 0x3d, 0x68, 0x3c,
- 0x3e, 0xd4, 0x82, 0x3e, 0x17, 0x83, 0x0c, 0xbd, 0x4e, 0xe4, 0xee, 0x3e,
- 0x2e, 0xf6, 0x40, 0x3e, 0x5b, 0x99, 0xde, 0xbd, 0x97, 0x89, 0xae, 0xbe,
- 0x1a, 0x43, 0xec, 0xbd, 0x46, 0xba, 0x4c, 0xbe, 0x0c, 0xf1, 0x49, 0x3d,
- 0xee, 0xaa, 0x2a, 0x3b, 0xa2, 0xcc, 0x12, 0xbe, 0x02, 0x76, 0x01, 0x3d,
- 0x75, 0x6b, 0xbc, 0x3c, 0xa2, 0xb5, 0x23, 0xbe, 0xfe, 0x60, 0xcc, 0x3d,
- 0xf4, 0x36, 0x3b, 0x3e, 0x8e, 0x74, 0x77, 0xbd, 0xfe, 0xd1, 0x9b, 0xbe,
- 0x8b, 0xd3, 0xac, 0xbd, 0xf9, 0x0a, 0x33, 0x3e, 0x50, 0xbd, 0x3b, 0x3d,
- 0xdf, 0x4b, 0xf9, 0x3b, 0x08, 0x1f, 0xf6, 0xbd, 0xf6, 0x51, 0x03, 0x3e,
- 0x90, 0x91, 0xfb, 0xbd, 0xad, 0x3f, 0x00, 0xbd, 0xfd, 0x2d, 0xc8, 0x3d,
- 0xa7, 0xe3, 0x2a, 0x3d, 0x74, 0xbb, 0xbc, 0x3d, 0x34, 0x6d, 0xac, 0xbd,
- 0xe6, 0x33, 0x2e, 0xbe, 0x17, 0x75, 0xc4, 0xbb, 0xd2, 0x5d, 0x45, 0xbe,
- 0xc3, 0xf4, 0x9e, 0x3d, 0xa5, 0x7f, 0xcb, 0x3d, 0x9e, 0x8b, 0x49, 0x3e,
- 0xd1, 0xe1, 0x0a, 0x3e, 0x2a, 0x81, 0xa3, 0xbd, 0xd4, 0xee, 0xce, 0x39,
- 0xcb, 0xaa, 0x80, 0xbe, 0x9a, 0xc2, 0xf9, 0x3d, 0x45, 0x13, 0x42, 0xbe,
- 0xc2, 0x8a, 0xfd, 0x3c, 0x4b, 0x19, 0xfe, 0xbd, 0x56, 0xcd, 0x5f, 0x3d,
- 0xb2, 0xb9, 0x21, 0x3e, 0xcf, 0x1b, 0x2c, 0x3e, 0x60, 0x2d, 0x6e, 0x3e,
- 0x2e, 0x26, 0x6b, 0x3e, 0xc9, 0x40, 0x33, 0x3e, 0x8f, 0x92, 0x7c, 0xbc,
- 0xa8, 0x6a, 0xe2, 0xbd, 0xcc, 0x00, 0xd9, 0xbd, 0xc8, 0x9b, 0x50, 0x3d,
- 0x33, 0xf2, 0xd2, 0xbe, 0x4b, 0x92, 0xf0, 0x3d, 0xb9, 0xc2, 0xfe, 0xbd,
- 0x7c, 0x11, 0x0a, 0xbe, 0xbd, 0xcb, 0x39, 0xbe, 0x1d, 0x8f, 0xc5, 0xbd,
- 0xeb, 0xed, 0x2d, 0xbe, 0x7b, 0xfc, 0x63, 0xbd, 0xe6, 0xf9, 0xa6, 0xbd,
- 0xe3, 0xc6, 0x88, 0xbe, 0xa9, 0xfe, 0x79, 0x3e, 0x13, 0x23, 0x28, 0xbd,
- 0xe5, 0x1e, 0xdd, 0xbd, 0x7b, 0xca, 0x45, 0xbe, 0xcb, 0xeb, 0xec, 0x3d,
- 0x82, 0xc7, 0x2d, 0xbd, 0x4d, 0xbe, 0xc3, 0xbd, 0x9d, 0x42, 0x34, 0xbd,
- 0x32, 0x37, 0x8c, 0x3e, 0xa2, 0xde, 0x8c, 0xbe, 0x62, 0x43, 0xd4, 0xbc,
- 0xa5, 0x9c, 0x0f, 0xbe, 0xf7, 0x65, 0xa9, 0x3d, 0xbe, 0xe1, 0x48, 0xbc,
- 0x02, 0x76, 0x8e, 0xbd, 0x53, 0x98, 0x14, 0xbd, 0xcf, 0x6b, 0x57, 0x3e,
- 0x85, 0x39, 0x62, 0xbd, 0x3a, 0x46, 0x46, 0xbe, 0x2e, 0x3d, 0x09, 0x3d,
- 0xd5, 0x5d, 0xfb, 0xbe, 0xe9, 0xeb, 0x55, 0xbd, 0x24, 0x23, 0xa7, 0x3d,
- 0x1b, 0x17, 0x5c, 0x3d, 0x14, 0x0b, 0x23, 0xbe, 0x81, 0x8b, 0x50, 0x3d,
- 0x61, 0x03, 0xaf, 0xbe, 0xdf, 0xd0, 0xf7, 0x3c, 0xaf, 0xdf, 0xc5, 0xbd,
- 0xcf, 0xde, 0xf2, 0x3d, 0x44, 0x97, 0x0f, 0xbe, 0x5b, 0xc8, 0x61, 0xbe,
- 0x76, 0xf5, 0x80, 0x3d, 0x9c, 0x2c, 0xa1, 0xbd, 0x41, 0x36, 0xc7, 0xbc,
- 0x20, 0xe8, 0x05, 0xbe, 0x4c, 0xef, 0x45, 0xbd, 0xf5, 0x94, 0xb1, 0x3d,
- 0xee, 0xb5, 0x7a, 0x3d, 0x8b, 0x8e, 0x71, 0x3d, 0x35, 0x58, 0xbf, 0xbc,
- 0x7d, 0x4b, 0x08, 0xbd, 0xf0, 0x0d, 0xbc, 0xbb, 0x9a, 0x6a, 0x63, 0x3d,
- 0x73, 0x19, 0x38, 0xbd, 0x8d, 0x95, 0x7c, 0xbe, 0x23, 0x51, 0x25, 0xbe,
- 0xb1, 0x5c, 0x36, 0xbe, 0x43, 0xd6, 0x04, 0x3c, 0x17, 0x8a, 0x93, 0xbd,
- 0x48, 0xce, 0x14, 0x3e, 0x47, 0xa5, 0xc4, 0xbd, 0x43, 0x37, 0x15, 0xbe,
- 0xee, 0xb3, 0x0c, 0x3e, 0x52, 0x70, 0x68, 0xbe, 0x59, 0xda, 0x60, 0x3c,
- 0x0c, 0xb5, 0x9a, 0x3d, 0x80, 0x5c, 0x4d, 0x3e, 0x77, 0x9e, 0x2e, 0x3d,
- 0xf4, 0x91, 0x69, 0xbe, 0x50, 0xa6, 0x57, 0x3d, 0x56, 0xe4, 0xa3, 0x3d,
- 0x18, 0x4a, 0x11, 0xbe, 0xd8, 0xf2, 0xb0, 0xbd, 0x58, 0x33, 0x5f, 0x3c,
- 0x8e, 0x42, 0x16, 0x3e, 0x11, 0xa9, 0xef, 0x3d, 0xca, 0x56, 0x11, 0xbd,
- 0x8a, 0x40, 0xcb, 0xbd, 0x0e, 0x65, 0xb1, 0xbd, 0x0b, 0x96, 0x8a, 0x3c,
- 0x1e, 0xda, 0x6c, 0x3c, 0xa3, 0x3b, 0xae, 0xbd, 0x6b, 0x6e, 0x08, 0x3e,
- 0xac, 0x5f, 0xf3, 0x3d, 0x47, 0x95, 0x0f, 0x3e, 0xdb, 0x1a, 0xbf, 0xbc,
- 0xe3, 0xd9, 0x38, 0xbd, 0x79, 0x8a, 0x47, 0x3e, 0x63, 0xdf, 0x36, 0x3e,
- 0xbe, 0x45, 0x09, 0x3e, 0xc1, 0xca, 0xd0, 0xbd, 0x7b, 0xb4, 0x83, 0xbe,
- 0x04, 0xc7, 0xc6, 0x3d, 0x5e, 0x4d, 0x6e, 0xbe, 0x71, 0x9c, 0x14, 0xbe,
- 0x92, 0x9f, 0x9a, 0xbe, 0xb6, 0x72, 0x65, 0x3e, 0xb9, 0x00, 0x94, 0xbd,
- 0x73, 0x73, 0x57, 0xbd, 0xd1, 0xcd, 0xb5, 0x3b, 0x1d, 0x9b, 0xa3, 0x3d,
- 0x09, 0x8b, 0x00, 0x3e, 0x29, 0x5b, 0x70, 0xbe, 0x92, 0xfb, 0xad, 0x3d,
- 0xbd, 0xe1, 0x9d, 0xbe, 0xf9, 0x7f, 0xa7, 0xbe, 0x1a, 0xa1, 0xb5, 0xbe,
- 0x50, 0xf6, 0x4c, 0xbe, 0x2b, 0x7b, 0x3e, 0xbe, 0x38, 0x7c, 0x1c, 0xbe,
- 0x8a, 0x58, 0x8d, 0xbd, 0x8a, 0x63, 0x6f, 0xbc, 0xf1, 0xef, 0x19, 0x3e,
- 0xac, 0x3b, 0x6e, 0x3d, 0xdb, 0xa5, 0xb6, 0x3c, 0x0b, 0xc5, 0x0d, 0x3d,
- 0x59, 0xca, 0x91, 0x3d, 0x95, 0xf7, 0xea, 0x3d, 0x7b, 0x99, 0x35, 0xbe,
- 0x2b, 0xc5, 0x31, 0xbe, 0xb5, 0xef, 0x7c, 0xbe, 0x13, 0x93, 0x86, 0x3d,
- 0x4f, 0x32, 0xc4, 0x3b, 0x58, 0xe1, 0x52, 0x3e, 0x12, 0x9d, 0xda, 0x3d,
- 0x4e, 0x5e, 0x92, 0xbd, 0xa6, 0x58, 0x9c, 0xbe, 0x99, 0x98, 0x95, 0xbd,
- 0x0b, 0x83, 0xa3, 0x3d, 0xae, 0xa2, 0x32, 0xbe, 0xab, 0x66, 0xdc, 0x3c,
- 0x38, 0x04, 0x44, 0x3d, 0x6d, 0x18, 0x4a, 0xbe, 0x30, 0xc1, 0x26, 0xbd,
- 0x1e, 0x05, 0xbc, 0xbe, 0xb0, 0x07, 0x03, 0xbe, 0x9d, 0x8a, 0x45, 0x3e,
- 0xd3, 0xdb, 0x43, 0xbd, 0xd9, 0xbc, 0x64, 0x3e, 0x18, 0x91, 0x8b, 0xbe,
- 0x86, 0xb5, 0x90, 0x3b, 0x73, 0x36, 0x1d, 0x3e, 0xf2, 0x53, 0x88, 0xbd,
- 0x52, 0x6f, 0xc0, 0x3d, 0xdc, 0xeb, 0x7c, 0xbe, 0xa1, 0xa1, 0x82, 0x3e,
- 0x1d, 0x35, 0x96, 0xbd, 0x87, 0x8d, 0xaf, 0xbd, 0x42, 0x30, 0x84, 0x3d,
- 0x61, 0x75, 0x27, 0xbe, 0x5d, 0x63, 0x45, 0xbe, 0xb5, 0x9a, 0x5b, 0xbe,
- 0x89, 0xf5, 0x02, 0xbe, 0xdf, 0x08, 0x4a, 0x3e, 0x86, 0x98, 0x27, 0xbe,
- 0x6c, 0xa5, 0x98, 0x3e, 0x9e, 0xff, 0x66, 0x3d, 0xd1, 0xc4, 0x10, 0x3e,
- 0x79, 0xcc, 0x54, 0x3d, 0xd0, 0x19, 0xe1, 0xbe, 0x37, 0xf5, 0xa2, 0xbe,
- 0x18, 0x75, 0x41, 0xbe, 0xf5, 0xf0, 0x73, 0x3c, 0x25, 0x67, 0xe6, 0xbc,
- 0xe1, 0x74, 0x53, 0xbe, 0x9b, 0x18, 0x8f, 0xbd, 0xb4, 0x0d, 0x2b, 0xbd,
- 0xf5, 0xe2, 0xcf, 0xbb, 0x3f, 0x27, 0x34, 0x3e, 0xfd, 0xb2, 0xb7, 0x3d,
- 0x25, 0x42, 0xf1, 0xbc, 0xcf, 0x8a, 0xde, 0x3c, 0x7f, 0x74, 0x4c, 0xbe,
- 0xd5, 0x19, 0x39, 0x3d, 0x44, 0xec, 0x85, 0xbe, 0xfd, 0xa1, 0x9b, 0xbd,
- 0xa8, 0x12, 0x2e, 0xbd, 0x12, 0x8a, 0xd4, 0x3d, 0x5c, 0xc0, 0x47, 0x3e,
- 0x44, 0x62, 0x93, 0xbd, 0x8a, 0xc4, 0x59, 0xb9, 0x74, 0xbe, 0x05, 0xbe,
- 0xe1, 0xa1, 0x0f, 0xbe, 0xdd, 0x52, 0x74, 0x3e, 0xe1, 0xc8, 0xc8, 0xbe,
- 0xf2, 0x34, 0x6e, 0x3b, 0xc1, 0xa5, 0x99, 0xbe, 0xd8, 0x43, 0x93, 0xbe,
- 0x14, 0x2b, 0x16, 0xbe, 0x66, 0xc9, 0x89, 0xbe, 0xc5, 0xca, 0x01, 0xbe,
- 0x2f, 0x36, 0xa8, 0xbd, 0x7f, 0x59, 0x14, 0x3e, 0x10, 0xab, 0x92, 0x3e,
- 0x24, 0x92, 0xff, 0xbb, 0xf4, 0x15, 0x91, 0x3c, 0xeb, 0xc8, 0xfd, 0x3b,
- 0x3a, 0x06, 0x5b, 0xbc, 0xae, 0xf9, 0x65, 0xbe, 0x2c, 0xd3, 0x04, 0xbe,
- 0xb4, 0xdb, 0xfe, 0x3c, 0x01, 0x78, 0x6f, 0xbd, 0xa2, 0xc7, 0x35, 0x3e,
- 0x51, 0x1d, 0x95, 0xbe, 0xe1, 0x5e, 0x5e, 0x3d, 0xb1, 0x7d, 0x84, 0xbe,
- 0xdb, 0xfc, 0x94, 0xbd, 0x10, 0x54, 0x91, 0x3d, 0x3f, 0x14, 0x01, 0xbc,
- 0x5b, 0x4b, 0x01, 0xbf, 0xaa, 0x09, 0x4c, 0xbe, 0xbd, 0x84, 0x9b, 0xbe,
- 0xf3, 0x84, 0x7c, 0x3d, 0xf2, 0x83, 0x5c, 0xbd, 0x9e, 0xbf, 0x80, 0x3d,
- 0x47, 0x9e, 0x40, 0xbe, 0x6b, 0x7e, 0x91, 0xbe, 0x80, 0xd3, 0x88, 0xbd,
- 0xca, 0xf3, 0x56, 0x3e, 0x15, 0x5a, 0x4e, 0x3e, 0xcf, 0x95, 0x83, 0xbe,
- 0x0a, 0xc5, 0x8d, 0xbd, 0xa6, 0x7c, 0x98, 0x3e, 0x62, 0x9b, 0xba, 0x3d,
- 0x71, 0xa7, 0x4a, 0xbe, 0x32, 0x81, 0xbf, 0xbc, 0xdd, 0x4c, 0x85, 0x3e,
- 0xb0, 0x5f, 0x8e, 0x3d, 0xb4, 0xa6, 0x90, 0xbe, 0x87, 0x17, 0x89, 0x3c,
- 0x8d, 0x1e, 0x6b, 0xbe, 0x1c, 0x07, 0xaa, 0x3c, 0x36, 0x14, 0xa5, 0xbd,
- 0x82, 0x55, 0x2c, 0xbd, 0x60, 0x0c, 0x01, 0xbd, 0x2f, 0x81, 0x8b, 0x3e,
- 0x9a, 0xf5, 0x76, 0xbd, 0x08, 0xf2, 0x5a, 0xbd, 0x6a, 0x5a, 0x39, 0x3e,
- 0x43, 0xa6, 0x89, 0xbc, 0x6e, 0xaf, 0x44, 0xbb, 0x33, 0x25, 0x8b, 0xbe,
- 0xfa, 0x3c, 0xf9, 0xbd, 0xe4, 0xec, 0x5f, 0xbc, 0xfb, 0xf0, 0x3b, 0xbe,
- 0x9e, 0x18, 0xfa, 0xbe, 0x28, 0xa2, 0xe0, 0xbc, 0x52, 0x1b, 0x83, 0x3e,
- 0x0e, 0x4b, 0x7d, 0x3e, 0x52, 0x02, 0x0a, 0x3d, 0x52, 0xf1, 0x81, 0xbe,
- 0xdd, 0x62, 0x13, 0xbe, 0x85, 0x31, 0xf1, 0xbd, 0xa2, 0x47, 0x56, 0xbd,
- 0xc5, 0x6a, 0x1a, 0xbf, 0xb2, 0x59, 0xea, 0xbe, 0x78, 0x65, 0x11, 0xbe,
- 0x1c, 0x99, 0x3c, 0x3e, 0x7d, 0xfb, 0x0c, 0xbc, 0x64, 0xc3, 0x11, 0xbe,
- 0x1c, 0x92, 0xe0, 0x3d, 0x1d, 0x52, 0x92, 0x3e, 0x2b, 0x25, 0x52, 0xbe,
- 0x12, 0x41, 0xf2, 0x3d, 0x12, 0x1e, 0x84, 0xbd, 0x50, 0x18, 0x5a, 0xbc,
- 0x8d, 0xdc, 0x25, 0x3e, 0x75, 0x60, 0xad, 0xbb, 0x24, 0xae, 0x4d, 0x3b,
- 0xf5, 0x45, 0x37, 0x3e, 0x0e, 0x64, 0x51, 0x3e, 0x42, 0x97, 0x9a, 0xbe,
- 0xd2, 0x4c, 0x13, 0x3e, 0xba, 0x66, 0x30, 0xbd, 0xf5, 0x42, 0x65, 0xbc,
- 0x86, 0xc0, 0xb5, 0x3c, 0x60, 0xb0, 0xa1, 0xbd, 0x5f, 0x12, 0xb6, 0x3d,
- 0xd0, 0x51, 0x7d, 0x3d, 0x4c, 0xd0, 0xcb, 0xbd, 0xcf, 0x47, 0xa9, 0xbe,
- 0x1b, 0x1f, 0x6c, 0xbe, 0x81, 0x9e, 0x50, 0xbe, 0x47, 0x67, 0x1b, 0x3e,
- 0x26, 0x2b, 0x1b, 0x3d, 0x95, 0x68, 0x13, 0xbe, 0x88, 0x7d, 0x13, 0x3e,
- 0x45, 0xaa, 0x70, 0xbe, 0x49, 0xf0, 0x9f, 0xbe, 0x3e, 0x26, 0x2c, 0xbe,
- 0x27, 0x48, 0x26, 0x3e, 0x6f, 0x7f, 0x87, 0x3c, 0x16, 0xd1, 0xb3, 0xbd,
- 0xb3, 0x7a, 0x77, 0x3d, 0xc0, 0x08, 0x30, 0xbe, 0x5d, 0x39, 0x6a, 0x3e,
- 0xfa, 0x75, 0x40, 0x3e, 0x43, 0x19, 0x8e, 0xbd, 0x0a, 0x8c, 0x1f, 0x3e,
- 0xff, 0xbc, 0xc4, 0x3d, 0x04, 0x71, 0x78, 0xbc, 0x1e, 0x3d, 0xb7, 0xbe,
- 0xa8, 0xbc, 0x18, 0xbe, 0xcc, 0x30, 0x31, 0xbe, 0x44, 0x55, 0xbc, 0x3d,
- 0x7b, 0x59, 0xc1, 0x3d, 0x51, 0x99, 0x40, 0xbd, 0xf8, 0x07, 0x3b, 0x3e,
- 0xa9, 0x58, 0x09, 0x3e, 0xa6, 0xfb, 0x6f, 0x3e, 0x01, 0x66, 0x75, 0x3e,
- 0x01, 0x29, 0x60, 0x3e, 0x5a, 0xe9, 0x6a, 0xbe, 0x32, 0x69, 0xd5, 0xbb,
- 0x51, 0xb4, 0x2e, 0xbd, 0xec, 0x31, 0x00, 0xbd, 0x36, 0x62, 0x19, 0x3d,
- 0xc6, 0x59, 0x4f, 0xbe, 0xbb, 0x23, 0x46, 0x3e, 0xec, 0x97, 0x84, 0xbe,
- 0xae, 0x0d, 0x85, 0x3d, 0x94, 0xc8, 0xca, 0x3d, 0x9f, 0x7f, 0x15, 0xbe,
- 0x71, 0x9d, 0x81, 0xbe, 0xfa, 0xbd, 0x3f, 0x3e, 0x21, 0x27, 0x93, 0xbe,
- 0xd5, 0x5f, 0xed, 0x3c, 0xe3, 0xcc, 0xb1, 0xbd, 0x73, 0x4f, 0x50, 0x3d,
- 0x00, 0xaf, 0xae, 0x3d, 0x78, 0x61, 0x33, 0x3d, 0x3f, 0xb1, 0xfa, 0x3c,
- 0x3d, 0xf9, 0x93, 0x3e, 0xec, 0xeb, 0x24, 0x3e, 0xd5, 0xba, 0x2d, 0xbe,
- 0xa0, 0x93, 0x5c, 0xbe, 0xb6, 0xfe, 0x4e, 0x3d, 0x1b, 0xdc, 0x4d, 0xbe,
- 0x5d, 0x3d, 0xbd, 0x3d, 0x9e, 0xf3, 0x47, 0x3e, 0x58, 0xe5, 0x52, 0xbe,
- 0xe1, 0x07, 0xa6, 0x3e, 0xa5, 0xc9, 0x2f, 0x3d, 0x1f, 0x61, 0xb6, 0x3d,
- 0x09, 0x53, 0x47, 0xbe, 0x1a, 0x24, 0xa1, 0xbd, 0x1e, 0x01, 0x88, 0xbd,
- 0x45, 0xcb, 0x26, 0xbc, 0xf5, 0x07, 0x2d, 0xbe, 0x62, 0x33, 0x85, 0xba,
- 0x3b, 0x58, 0x59, 0x3d, 0x87, 0x61, 0x80, 0x3d, 0x0e, 0xa3, 0xff, 0xbd,
- 0xe8, 0xe8, 0x90, 0x3c, 0x73, 0xf2, 0xd4, 0xbc, 0x51, 0xd8, 0x6d, 0xbe,
- 0x9f, 0xc1, 0xaa, 0xbe, 0x3c, 0x2e, 0x2d, 0xbe, 0x88, 0xdb, 0x1e, 0xbe,
- 0x4e, 0x12, 0x20, 0xbe, 0x07, 0xd1, 0x18, 0xbd, 0xdd, 0x8d, 0xf2, 0x3d,
- 0x69, 0x39, 0x8d, 0xbe, 0x50, 0xa9, 0x86, 0xbe, 0xec, 0x2c, 0x8a, 0xbb,
- 0x43, 0x7a, 0xb0, 0xbe, 0x38, 0x4a, 0x99, 0xbd, 0x43, 0x4d, 0xb5, 0xbd,
- 0x86, 0xb2, 0xae, 0x3e, 0x98, 0xfe, 0x0a, 0xbe, 0xf3, 0x1c, 0x91, 0xbd,
- 0x16, 0xd9, 0x57, 0xbd, 0x8c, 0x90, 0x38, 0xbd, 0x3e, 0x3e, 0x88, 0xbe,
- 0x1b, 0x41, 0xc8, 0xbe, 0x7a, 0x79, 0xf5, 0xbd, 0x42, 0xde, 0x51, 0xbd,
- 0x7f, 0xd9, 0x9f, 0xbd, 0xe7, 0x1d, 0x01, 0xbe, 0x2b, 0x3c, 0x34, 0xbe,
- 0x60, 0x71, 0x07, 0x3e, 0x43, 0x6c, 0x9d, 0x3d, 0x96, 0xbf, 0x8b, 0xbe,
- 0xeb, 0x66, 0xeb, 0xbe, 0x29, 0x56, 0xd4, 0x3d, 0xc8, 0x30, 0x3f, 0xbd,
- 0x33, 0x7f, 0x65, 0xba, 0x7c, 0x7f, 0xf9, 0x3c, 0x70, 0x0a, 0xbf, 0xbe,
- 0xd6, 0xe0, 0xb6, 0xbc, 0xb1, 0xdc, 0x98, 0xbc, 0xb2, 0x4a, 0x14, 0x3d,
- 0xbe, 0x8c, 0x50, 0xbe, 0x78, 0xbb, 0xcd, 0xbe, 0x8b, 0xf1, 0xb2, 0xbe,
- 0xe4, 0x4c, 0x3a, 0xbe, 0xc1, 0xa6, 0x1d, 0x3e, 0xaf, 0x36, 0xda, 0xbd,
- 0x3d, 0xb4, 0x49, 0xbe, 0xb0, 0xff, 0x80, 0x3e, 0x65, 0xbf, 0xfc, 0xbc,
- 0xa5, 0x52, 0x37, 0xbd, 0x69, 0x6b, 0x06, 0xbe, 0x35, 0x93, 0x18, 0x3c,
- 0x5a, 0x5b, 0x05, 0xbe, 0x9a, 0x15, 0x93, 0xbc, 0xee, 0x40, 0x98, 0xbe,
- 0xf0, 0xa9, 0x69, 0xbe, 0x7f, 0x11, 0x49, 0xbc, 0x66, 0x43, 0x8f, 0xbc,
- 0x09, 0x63, 0x18, 0xbd, 0x78, 0x9b, 0x88, 0x3d, 0x33, 0x85, 0xda, 0x3d,
- 0xd9, 0x4a, 0xf8, 0xbc, 0x14, 0xcd, 0x3e, 0xbe, 0x2a, 0x8b, 0xb4, 0x3c,
- 0xfc, 0xaa, 0x37, 0xbe, 0xbd, 0xdc, 0x83, 0xbc, 0xc0, 0xe3, 0x8d, 0xbe,
- 0x2c, 0xac, 0xd3, 0x3b, 0x8f, 0xad, 0x8a, 0xbe, 0x2f, 0x90, 0xdc, 0xbd,
- 0x53, 0x17, 0x7e, 0xbe, 0x46, 0x4a, 0x47, 0xbe, 0x00, 0x04, 0x12, 0x3c,
- 0xc6, 0xfb, 0x60, 0x3e, 0x07, 0x4d, 0x3f, 0xbe, 0x96, 0xf7, 0xd4, 0x3c,
- 0x05, 0xdc, 0xe7, 0xbe, 0xec, 0xc1, 0xdc, 0xbd, 0x31, 0x0c, 0xb0, 0xbd,
- 0xa5, 0x0e, 0x08, 0x3c, 0x72, 0xc2, 0x25, 0xbe, 0x80, 0xe0, 0xd4, 0xbe,
- 0xbc, 0xe5, 0x5b, 0x3d, 0x3f, 0x29, 0x36, 0x3e, 0x6f, 0xb3, 0xaf, 0x3d,
- 0x84, 0xda, 0x4d, 0x3d, 0x76, 0x5f, 0x14, 0xbd, 0x9b, 0x3a, 0xa5, 0x3d,
- 0xbc, 0x3f, 0x52, 0x3d, 0xf9, 0x75, 0x69, 0xbd, 0xc9, 0xc4, 0x18, 0xbe,
- 0xa4, 0x1e, 0x51, 0x3d, 0xbe, 0x90, 0xe0, 0xbd, 0x2b, 0x2b, 0x81, 0xbc,
- 0x24, 0xa0, 0x11, 0xbe, 0x08, 0xab, 0x36, 0x3e, 0xe3, 0xae, 0x9e, 0xbe,
- 0xa0, 0x65, 0xe8, 0xbc, 0x2c, 0x69, 0xf3, 0x3d, 0xb5, 0x0d, 0xe4, 0x3d,
- 0x5a, 0xdc, 0x5a, 0xbd, 0x39, 0x28, 0xc7, 0x3d, 0x12, 0xd9, 0xf6, 0xbd,
- 0x3d, 0xb1, 0x8e, 0xbe, 0x86, 0x90, 0x4d, 0x3e, 0xc3, 0xfe, 0xea, 0xbe,
- 0x82, 0x92, 0x8d, 0xbd, 0x93, 0x1a, 0x31, 0x3e, 0x30, 0x22, 0x2c, 0x3b,
- 0xb9, 0x24, 0x0c, 0xbd, 0x6c, 0xba, 0x82, 0xbe, 0x9a, 0xb5, 0x21, 0x3d,
- 0x1e, 0x61, 0x1f, 0xbe, 0x05, 0xfd, 0x56, 0xbc, 0x64, 0x83, 0xd6, 0x3d,
- 0x56, 0x89, 0x5b, 0xbc, 0xcf, 0x88, 0x82, 0xbe, 0x5a, 0xe4, 0x51, 0xbd,
- 0x72, 0x20, 0xce, 0x3c, 0x4b, 0xcf, 0x5c, 0xbb, 0x2f, 0x92, 0x65, 0xbe,
- 0x46, 0x1d, 0xf7, 0xbe, 0xe1, 0x35, 0xfb, 0xbd, 0x81, 0xcc, 0x13, 0x3d,
- 0xd9, 0xab, 0x2f, 0xbd, 0x8a, 0x81, 0x12, 0xbe, 0x95, 0xa4, 0x11, 0xbe,
- 0xe1, 0x54, 0x83, 0xbe, 0xbf, 0x61, 0x44, 0x3d, 0x55, 0x43, 0xfd, 0xbc,
- 0x63, 0xe2, 0x7c, 0xbe, 0xe2, 0xef, 0x4d, 0x3d, 0x6e, 0xac, 0x57, 0xbe,
- 0x42, 0x5f, 0x83, 0x3e, 0x16, 0xb1, 0x21, 0x3e, 0x45, 0x44, 0x67, 0x3e,
- 0x7a, 0xb5, 0xb3, 0xbd, 0x23, 0x97, 0x5e, 0xbd, 0x0d, 0xcf, 0x9a, 0x3e,
- 0x28, 0x52, 0xfb, 0xbd, 0x1c, 0x22, 0x7b, 0x3d, 0x2b, 0x1c, 0x8a, 0x3d,
- 0x5e, 0x6e, 0x84, 0xbe, 0x85, 0x0c, 0xc9, 0x3d, 0xa3, 0x9e, 0xb8, 0x3d,
- 0x89, 0x45, 0xc2, 0x3d, 0x51, 0xe3, 0x0d, 0x3e, 0x4d, 0x86, 0xc5, 0x3d,
- 0xb6, 0x97, 0x43, 0x3e, 0x94, 0x80, 0xce, 0xbb, 0xab, 0x58, 0x07, 0x3e,
- 0xe5, 0xf0, 0xf7, 0x3d, 0xa3, 0x2a, 0xff, 0xbd, 0xd7, 0x14, 0x70, 0xbd,
- 0x44, 0xc0, 0x14, 0xbd, 0x8e, 0x3e, 0xd5, 0x3d, 0x13, 0xfc, 0x21, 0x3c,
- 0x2c, 0xee, 0xdc, 0xbc, 0x9d, 0x3e, 0xa9, 0x3d, 0x3d, 0xf2, 0x8f, 0x3d,
- 0x48, 0x22, 0xb1, 0x3d, 0x6a, 0x22, 0x32, 0x3e, 0x03, 0x18, 0x82, 0xbb,
- 0x11, 0x3c, 0x54, 0xbd, 0x9b, 0xa3, 0xb9, 0x3d, 0x7a, 0xdc, 0x1a, 0x3d,
- 0x7d, 0xad, 0xac, 0xbd, 0xdf, 0x3d, 0xd4, 0xbd, 0xae, 0x71, 0x17, 0xba,
- 0xa6, 0xd9, 0x0f, 0xbe, 0xe9, 0xb1, 0xbf, 0x3d, 0xcf, 0xec, 0xb3, 0xbc,
- 0x76, 0xb6, 0x60, 0xbc, 0x5e, 0x36, 0x80, 0xbd, 0x46, 0x5a, 0xc0, 0x3c,
- 0x23, 0x18, 0x6e, 0xbc, 0x93, 0xca, 0x76, 0x3e, 0xc6, 0xe6, 0xe1, 0xbc,
- 0x09, 0x14, 0xe4, 0x3d, 0x66, 0xaa, 0x93, 0x3e, 0xc8, 0x3f, 0xcd, 0x3d,
- 0xbe, 0xae, 0xad, 0x3d, 0xce, 0x94, 0xe6, 0xbd, 0xf0, 0xee, 0xb6, 0xbc,
- 0xe6, 0xa7, 0x4e, 0x3d, 0xf2, 0x0f, 0x90, 0xbc, 0x8b, 0xb5, 0x10, 0xbd,
- 0x96, 0xb3, 0x57, 0x3d, 0xe7, 0xab, 0x3d, 0xbe, 0x92, 0xca, 0x0e, 0xbe,
- 0x9d, 0x5e, 0x5b, 0xbd, 0x54, 0xc0, 0x90, 0x3c, 0xc2, 0x0c, 0x1c, 0x3e,
- 0x14, 0xfe, 0x9d, 0x3c, 0xff, 0xd5, 0x82, 0x3d, 0xb4, 0xbd, 0x66, 0xbe,
- 0xac, 0x02, 0xc7, 0x3d, 0xae, 0x01, 0x4f, 0x3e, 0x49, 0x45, 0xd1, 0xbc,
- 0xa1, 0xca, 0xb7, 0xbe, 0x8f, 0xb9, 0x24, 0xbe, 0x99, 0xe1, 0x68, 0x3c,
- 0x91, 0x6f, 0x08, 0xbe, 0x69, 0x49, 0x83, 0xbe, 0x41, 0x9a, 0xd0, 0x3d,
- 0xbe, 0xd1, 0x4a, 0x3d, 0x5c, 0x81, 0x2b, 0x3d, 0x75, 0x40, 0x89, 0xbe,
- 0xd7, 0xec, 0x03, 0x3d, 0x76, 0x0f, 0xab, 0x3d, 0x50, 0xcb, 0xdf, 0x3c,
- 0x88, 0x5d, 0x19, 0x3d, 0x2c, 0x47, 0x93, 0x3d, 0x48, 0x24, 0x4e, 0xbc,
- 0xd6, 0xbb, 0x3c, 0xbc, 0x33, 0xe4, 0xdb, 0x3d, 0xd8, 0xfc, 0x8c, 0x3d,
- 0x28, 0xd2, 0x3d, 0xbd, 0x3a, 0x40, 0x7b, 0x3e, 0x0c, 0x2d, 0x41, 0x3e,
- 0xb2, 0xc3, 0x2c, 0x3e, 0x14, 0xd7, 0x58, 0xbc, 0xac, 0xce, 0x95, 0x3e,
- 0x4a, 0x7f, 0x3e, 0xbe, 0xed, 0x3f, 0x23, 0x3d, 0x57, 0xb5, 0xde, 0xbd,
- 0x5d, 0x2b, 0x03, 0x3e, 0x45, 0xad, 0x70, 0x3d, 0x7b, 0xeb, 0x8a, 0xbb,
- 0xe9, 0x6d, 0x3a, 0x3b, 0x0c, 0x55, 0x9b, 0x3d, 0x2e, 0x01, 0x5a, 0x3e,
- 0xdb, 0x85, 0x78, 0x3e, 0xc3, 0x04, 0x45, 0xbd, 0x05, 0xf1, 0xa5, 0x3d,
- 0x25, 0xeb, 0x59, 0xbe, 0x8b, 0x71, 0x2a, 0x3d, 0x5c, 0xc6, 0x0b, 0xbd,
- 0x06, 0x60, 0xa4, 0xbd, 0x20, 0x3a, 0xa5, 0x3e, 0x32, 0x9b, 0x76, 0xbd,
- 0xed, 0x35, 0x90, 0xbd, 0xd8, 0x63, 0x61, 0x3d, 0xef, 0xf4, 0x88, 0x3e,
- 0xa4, 0x2a, 0x13, 0xbd, 0xc9, 0xc8, 0xda, 0x3d, 0x3d, 0x2e, 0xf3, 0x3a,
- 0x2c, 0x86, 0x57, 0x3d, 0x3e, 0x94, 0x71, 0x3c, 0xa1, 0xe4, 0x1d, 0x3d,
- 0x74, 0x35, 0xc5, 0x3d, 0x47, 0x0a, 0x0b, 0xbe, 0x92, 0x29, 0x63, 0x3d,
- 0x85, 0x85, 0x5c, 0xbe, 0xd8, 0x99, 0x12, 0x3e, 0x0b, 0xa4, 0xac, 0xbd,
- 0x74, 0x6b, 0x17, 0x3e, 0x42, 0x37, 0x4f, 0x3e, 0xab, 0x00, 0x22, 0x3e,
- 0xa8, 0xff, 0x48, 0x3e, 0x38, 0x19, 0x1f, 0xbe, 0x83, 0xd8, 0x90, 0x3d,
- 0x3b, 0x87, 0x08, 0x3e, 0x63, 0xec, 0x72, 0xbe, 0x0f, 0x5b, 0x3b, 0xbd,
- 0xeb, 0x4b, 0x28, 0xbe, 0x83, 0xaf, 0x19, 0x3e, 0x77, 0xcc, 0x3c, 0xbe,
- 0xb9, 0x17, 0x85, 0xbe, 0x57, 0xce, 0x0b, 0xbe, 0x19, 0x2a, 0xa2, 0x3c,
- 0xc1, 0x09, 0xe6, 0x3d, 0xd4, 0xa6, 0x8c, 0x3e, 0x9a, 0x60, 0x59, 0xbe,
- 0x48, 0xd4, 0x75, 0xbe, 0x61, 0xfb, 0xe3, 0x3d, 0x47, 0x42, 0x6b, 0x3d,
- 0x45, 0xd2, 0x82, 0x3d, 0xe9, 0x55, 0xe6, 0x3d, 0x18, 0xd3, 0xe5, 0x3c,
- 0x5e, 0x7d, 0x35, 0xbe, 0xd2, 0xd5, 0x95, 0xbd, 0x73, 0x14, 0xd3, 0xbe,
- 0xdf, 0x6c, 0x59, 0xbc, 0xb9, 0x02, 0xc1, 0xbe, 0x8a, 0xe2, 0x59, 0x3e,
- 0xe0, 0xdb, 0x5d, 0xbe, 0xc3, 0xa0, 0x39, 0x3d, 0xb8, 0x9f, 0x6c, 0x3e,
- 0x5b, 0x98, 0x87, 0x3c, 0x22, 0xa8, 0xa3, 0xbe, 0x32, 0x0c, 0xad, 0xbe,
- 0xcf, 0xde, 0xe3, 0x3d, 0xc2, 0xbf, 0x95, 0xbd, 0x9e, 0x2a, 0x73, 0x3e,
- 0x0b, 0x53, 0x37, 0x3c, 0x37, 0xba, 0xbd, 0xbb, 0x2a, 0x30, 0x6f, 0xbd,
- 0x82, 0x0a, 0x6a, 0x3e, 0x82, 0x1c, 0xcd, 0x3e, 0xe9, 0x7b, 0x59, 0xbe,
- 0xe4, 0x6c, 0xd9, 0xbc, 0xa8, 0x88, 0x0f, 0x3d, 0xaf, 0xfc, 0x09, 0x3d,
- 0xcd, 0x00, 0x44, 0xbe, 0x7c, 0x53, 0x46, 0xbe, 0xe3, 0x6d, 0x3c, 0x3e,
- 0xe9, 0xf6, 0x96, 0xbe, 0xba, 0x85, 0x24, 0x3e, 0x85, 0x2d, 0x1e, 0x3d,
- 0x09, 0xb3, 0x67, 0xbe, 0xea, 0x1c, 0xc6, 0x3b, 0x10, 0x1c, 0x3f, 0xbd,
- 0xa4, 0x6a, 0x90, 0xbe, 0xbe, 0x1c, 0x1f, 0x3e, 0x1b, 0x56, 0x47, 0x3d,
- 0x8e, 0x09, 0xcc, 0xbd, 0x92, 0x90, 0x21, 0x3e, 0x46, 0x85, 0x4e, 0xbe,
- 0xb6, 0x16, 0x12, 0xbe, 0x7d, 0xdf, 0x38, 0xbe, 0x5c, 0x66, 0x80, 0xbe,
- 0xe3, 0x05, 0x39, 0x3d, 0x53, 0x07, 0x1c, 0x3e, 0xeb, 0xea, 0xb9, 0xbd,
- 0x83, 0xa0, 0x0b, 0x3e, 0x8d, 0xcc, 0x42, 0xbe, 0x11, 0xd5, 0x0d, 0xbe,
- 0x52, 0x81, 0xa7, 0x3c, 0x68, 0x39, 0x3c, 0x3e, 0x75, 0x86, 0xe4, 0xbd,
- 0x57, 0x80, 0x40, 0x3d, 0x48, 0xa5, 0x9f, 0xbe, 0x90, 0xe8, 0x1d, 0xbe,
- 0x2a, 0xf1, 0x33, 0xbc, 0x63, 0x22, 0xba, 0xbd, 0x5c, 0xe6, 0xf4, 0x3c,
- 0x4d, 0x9a, 0xbb, 0xbe, 0x02, 0x60, 0x97, 0x3d, 0x23, 0x6e, 0x3e, 0x3d,
- 0xee, 0xc8, 0x7a, 0xbe, 0xe7, 0xdf, 0x1e, 0xbd, 0x96, 0x85, 0x20, 0xbf,
- 0xbb, 0xd0, 0xc3, 0xbd, 0x1d, 0xe4, 0x1d, 0xbe, 0x6a, 0xcf, 0x83, 0x3e,
- 0x10, 0x13, 0x52, 0x3e, 0x58, 0xab, 0x15, 0xbd, 0xbb, 0x14, 0xcd, 0x3d,
- 0x68, 0x74, 0xb0, 0x3d, 0x8c, 0x2f, 0x91, 0x3d, 0x4d, 0xb3, 0xf5, 0x3d,
- 0x6e, 0x5c, 0x1f, 0x3e, 0x53, 0x4d, 0x16, 0xbc, 0xe4, 0x3b, 0x1a, 0x3d,
- 0x62, 0x8f, 0xca, 0xbd, 0xd1, 0xb3, 0xc5, 0xbd, 0x3a, 0x22, 0x08, 0xbd,
- 0x9d, 0x74, 0x30, 0xbe, 0x9c, 0xca, 0x0e, 0x3d, 0x08, 0xd2, 0x58, 0xbe,
- 0x44, 0xc3, 0x93, 0x3d, 0x3f, 0x12, 0x81, 0xbe, 0x3c, 0xed, 0x88, 0xbe,
- 0x9f, 0x95, 0x9c, 0xbe, 0xad, 0x9a, 0x5c, 0xbd, 0x82, 0x9e, 0x56, 0xbc,
- 0x74, 0x43, 0x07, 0x3e, 0x31, 0x92, 0x2a, 0xbe, 0xc9, 0xd1, 0x78, 0xbd,
- 0xef, 0x8a, 0x3d, 0x3e, 0x76, 0x7f, 0x6c, 0xbd, 0x18, 0x1c, 0x45, 0x3e,
- 0x84, 0x54, 0x9b, 0x3e, 0x28, 0xab, 0x93, 0xbe, 0x7a, 0x60, 0xa3, 0x3c,
- 0x9c, 0x71, 0x9b, 0x3e, 0xe3, 0x43, 0x81, 0xbe, 0xae, 0xfc, 0x4f, 0x3a,
- 0xfb, 0xbb, 0xc8, 0xbb, 0xfd, 0xfb, 0x8a, 0xbd, 0xd6, 0xf8, 0x63, 0x3e,
- 0x1e, 0xb9, 0xeb, 0x3d, 0x53, 0xa5, 0x07, 0xbe, 0xb8, 0x9f, 0x93, 0x3d,
- 0x1d, 0x45, 0xc9, 0x3d, 0x8a, 0xb9, 0x9f, 0xbd, 0x0f, 0xbf, 0x59, 0x3e,
- 0x94, 0x63, 0xb8, 0x3d, 0x33, 0x59, 0x0c, 0x3e, 0xc7, 0x98, 0x07, 0xbd,
- 0xf2, 0x2d, 0x4b, 0xbe, 0x39, 0xfd, 0xdf, 0x3e, 0x16, 0xd9, 0x0a, 0xbe,
- 0x29, 0x48, 0xc1, 0x3d, 0x29, 0xd9, 0x50, 0xbb, 0x9f, 0x9f, 0x09, 0xbe,
- 0x72, 0x88, 0xaf, 0x3d, 0x92, 0x4f, 0xd4, 0x3d, 0xaf, 0x21, 0xb3, 0xbd,
- 0x66, 0xe4, 0xe3, 0xbb, 0x7c, 0x07, 0x2e, 0x3e, 0x6d, 0x4d, 0xc9, 0x3e,
- 0x49, 0x63, 0x23, 0xbe, 0x64, 0x24, 0x3f, 0xbd, 0x28, 0x7c, 0xf9, 0x3d,
- 0xdc, 0x84, 0x64, 0x3d, 0x90, 0x0e, 0xa8, 0x39, 0xa5, 0xbf, 0x24, 0xbb,
- 0x28, 0xc0, 0x3e, 0xbd, 0x8c, 0x6e, 0xdd, 0xbd, 0x99, 0xe0, 0x51, 0xbe,
- 0xfd, 0x6f, 0x7c, 0xbc, 0x9e, 0x52, 0xa7, 0x3d, 0x32, 0x26, 0xab, 0xbd,
- 0xb9, 0xb2, 0xbe, 0xbd, 0xb0, 0xb7, 0x31, 0xbc, 0xa1, 0x53, 0x4e, 0xbd,
- 0x51, 0x88, 0xcf, 0xbd, 0xc8, 0x51, 0x96, 0xbd, 0x1d, 0xa4, 0x04, 0xbe,
- 0xde, 0x9e, 0x2f, 0x3e, 0x3a, 0x19, 0xb0, 0xbd, 0x97, 0xd9, 0x05, 0xbd,
- 0x68, 0x04, 0x4b, 0xbe, 0x93, 0x2a, 0x97, 0x3e, 0xad, 0xb2, 0xfc, 0xbc,
- 0x16, 0x4f, 0xb1, 0x3d, 0x88, 0xa7, 0xe8, 0xbd, 0x66, 0xd4, 0x24, 0xbe,
- 0xc6, 0xc0, 0xca, 0x3d, 0x20, 0x53, 0x11, 0x3d, 0x3e, 0x73, 0x6b, 0x3e,
- 0xf7, 0x4b, 0xe2, 0x3d, 0x42, 0x2f, 0x82, 0x3c, 0xfc, 0x7e, 0x3f, 0xbe,
- 0xc0, 0x0e, 0xeb, 0xbd, 0xaa, 0x3a, 0x34, 0x3e, 0x5c, 0xc2, 0x20, 0x3e,
- 0x2e, 0xf6, 0x11, 0xbe, 0x30, 0xc8, 0x48, 0x3a, 0x46, 0xf3, 0xe6, 0x3c,
- 0x98, 0x54, 0x80, 0xbd, 0xc9, 0x76, 0xd1, 0x3c, 0x80, 0xee, 0x14, 0x3d,
- 0xdf, 0x1b, 0x3f, 0xbd, 0x22, 0x0f, 0x09, 0x3e, 0x3f, 0x62, 0x8c, 0xbc,
- 0x87, 0xb6, 0xe4, 0xbd, 0x2e, 0x9e, 0xe4, 0x3e, 0x3f, 0x62, 0x35, 0x3d,
- 0x27, 0x36, 0x32, 0xbe, 0xf7, 0xe9, 0x3a, 0xbe, 0xe4, 0xb4, 0x30, 0xbe,
- 0xfc, 0x1b, 0x8f, 0x3e, 0x43, 0x49, 0x4f, 0x3e, 0xaf, 0x67, 0x49, 0xbc,
- 0xba, 0x26, 0xb5, 0xbd, 0x16, 0xaf, 0xcd, 0x3d, 0x69, 0x40, 0x86, 0x3d,
- 0xdc, 0x54, 0x06, 0xbd, 0x77, 0x62, 0x16, 0x3d, 0xb0, 0x41, 0x90, 0xbd,
- 0xda, 0x21, 0xd7, 0x3d, 0x41, 0x35, 0xd7, 0x3e, 0xbe, 0x2a, 0x92, 0x3d,
- 0x44, 0x2a, 0x72, 0x3e, 0x3a, 0x6e, 0xc4, 0x3c, 0x9c, 0x79, 0x52, 0xbe,
- 0xe6, 0xab, 0x65, 0x3d, 0xc8, 0x11, 0x91, 0x3d, 0xdf, 0x20, 0x5e, 0xbc,
- 0xfe, 0xdc, 0xaf, 0x3d, 0xdf, 0x58, 0x6e, 0x3c, 0x22, 0xc8, 0x8d, 0xbe,
- 0xad, 0x1e, 0x93, 0x3d, 0xb8, 0x63, 0xf3, 0x3d, 0x6a, 0xc4, 0x0b, 0xbe,
- 0x2f, 0xa2, 0x15, 0xbe, 0x75, 0xf2, 0x67, 0x3b, 0x9b, 0x71, 0x08, 0xbe,
- 0x45, 0xb6, 0x96, 0xbd, 0xc9, 0x15, 0xc9, 0x3e, 0xa1, 0xc4, 0x59, 0x3d,
- 0x8d, 0x49, 0xc3, 0xbd, 0xe4, 0xf5, 0x1d, 0xbc, 0x1a, 0x17, 0x2c, 0x3e,
- 0x29, 0xea, 0xcd, 0x3e, 0xf2, 0x38, 0x88, 0xbd, 0xb3, 0x49, 0xf2, 0x3d,
- 0x3b, 0x65, 0x1d, 0x3e, 0x72, 0xf2, 0xc3, 0x3d, 0x6a, 0x7b, 0x97, 0x3e,
- 0xb3, 0x59, 0x3d, 0x3d, 0xfd, 0xee, 0xfa, 0x3d, 0x74, 0x1b, 0x17, 0xbc,
- 0x8d, 0xbc, 0xe0, 0x3c, 0x2f, 0xaf, 0x02, 0xbd, 0x8d, 0x8f, 0xd8, 0xbd,
- 0x17, 0xae, 0x88, 0xbd, 0x4f, 0xf8, 0xe3, 0xbd, 0xc9, 0x0b, 0xec, 0xbc,
- 0x44, 0x99, 0x62, 0xbd, 0x02, 0xbb, 0x0e, 0xbe, 0xbe, 0xc8, 0x19, 0xbe,
- 0xb7, 0xe7, 0x2f, 0x3d, 0x51, 0x77, 0xa6, 0xbe, 0x98, 0x15, 0xcc, 0xbb,
- 0x66, 0xa4, 0x05, 0x3d, 0x8e, 0x4c, 0x88, 0x3e, 0x02, 0x1b, 0x24, 0xbe,
- 0x57, 0x76, 0x2b, 0x3d, 0x07, 0xa2, 0xf9, 0x3b, 0x5c, 0x2e, 0xe5, 0x3d,
- 0x55, 0x27, 0xef, 0x3d, 0x53, 0x28, 0x07, 0xbe, 0x9c, 0xab, 0xf0, 0xbd,
- 0x87, 0x21, 0xf0, 0xbd, 0xa0, 0xa0, 0xc5, 0xbd, 0x7d, 0x3d, 0x30, 0x3d,
- 0x9c, 0x16, 0xae, 0x3e, 0x2e, 0x67, 0x87, 0xbe, 0x7c, 0x2b, 0x01, 0xbe,
- 0xae, 0x67, 0xc0, 0xbd, 0x28, 0x49, 0x05, 0x3e, 0xf2, 0xdd, 0xd8, 0x3d,
- 0x8b, 0x5c, 0xc2, 0xbd, 0x1a, 0x1f, 0xbb, 0xbd, 0x16, 0x6c, 0x13, 0x3c,
- 0xf2, 0x36, 0x04, 0xbe, 0x80, 0xf4, 0x1d, 0xbe, 0x9a, 0x7d, 0x9b, 0x3d,
- 0xf4, 0x4f, 0x5b, 0xbd, 0x2b, 0x02, 0x83, 0xbe, 0x2d, 0xe7, 0xd5, 0xbd,
- 0x58, 0x9c, 0x02, 0xbe, 0xdb, 0xb3, 0x40, 0xbd, 0x4d, 0x42, 0xcc, 0xbd,
- 0x5e, 0x3b, 0xb9, 0xbe, 0x23, 0xd4, 0x2b, 0xbe, 0x38, 0x0c, 0x0a, 0xbe,
- 0x9f, 0x3f, 0x8d, 0xbd, 0x4c, 0x16, 0xeb, 0xbd, 0x21, 0x4f, 0x46, 0xbe,
- 0x0c, 0xca, 0x79, 0xbe, 0x9b, 0xdc, 0x5a, 0xbd, 0xe1, 0xcb, 0x7a, 0xbe,
- 0x2c, 0x28, 0xac, 0xbd, 0x66, 0x86, 0xb5, 0xbe, 0x3f, 0xd3, 0x4b, 0xbe,
- 0xac, 0x98, 0x24, 0x3b, 0x68, 0xd4, 0xe4, 0xbc, 0x0b, 0xd4, 0x45, 0xbe,
- 0x15, 0xb2, 0x9e, 0xbd, 0xcd, 0xdc, 0x96, 0xbe, 0x03, 0x44, 0x76, 0x3d,
- 0x7f, 0xc5, 0x5f, 0xbe, 0x90, 0xf7, 0x73, 0xbe, 0xff, 0x36, 0x77, 0xbd,
- 0x00, 0xe4, 0xb2, 0xbe, 0xaa, 0x8a, 0x21, 0xbe, 0x14, 0xcc, 0x4a, 0xbe,
- 0x99, 0x4c, 0x48, 0xbe, 0x20, 0xbd, 0x94, 0xbe, 0xfd, 0x28, 0x56, 0xbe,
- 0xe1, 0x44, 0x8a, 0xbd, 0xfb, 0x63, 0xbb, 0xbe, 0x4a, 0xc9, 0x93, 0xbd,
- 0x92, 0x15, 0x18, 0xbe, 0x42, 0x25, 0xde, 0xbe, 0x46, 0x7e, 0x4f, 0xbe,
- 0x86, 0x6c, 0x79, 0x3b, 0x90, 0x1b, 0xb5, 0xbe, 0x2d, 0x02, 0xa1, 0xbd,
- 0x94, 0x16, 0x9b, 0xbe, 0xe5, 0xbf, 0x0e, 0xbe, 0x7b, 0x05, 0x8e, 0xbd,
- 0xe6, 0x84, 0x4f, 0xbd, 0x6f, 0x9d, 0x4f, 0xbe, 0xf3, 0x1c, 0xbb, 0xbd,
- 0x84, 0x7b, 0x3d, 0xbd, 0x72, 0xac, 0x05, 0xbf, 0x74, 0xe8, 0x40, 0xbe,
- 0xcc, 0x39, 0x8e, 0xbc, 0xc1, 0x81, 0x5e, 0x3c, 0x38, 0x2a, 0x85, 0xbe,
- 0x6c, 0xa5, 0x94, 0xbe, 0xf9, 0x9d, 0x0e, 0xbe, 0x4d, 0x8d, 0x21, 0xbd,
- 0x7e, 0x30, 0x11, 0xbe, 0x1c, 0xce, 0x93, 0x3c, 0xda, 0x10, 0xbc, 0xbe,
- 0x3c, 0x82, 0x6e, 0xbe, 0x7e, 0x80, 0xd1, 0xbe, 0x1b, 0xee, 0x0c, 0xbe,
- 0xd2, 0x67, 0xe2, 0x3c, 0xc8, 0xb1, 0xe4, 0xbe, 0x59, 0x22, 0x40, 0xbe,
- 0x50, 0x0c, 0x50, 0xbe, 0x28, 0x0e, 0x92, 0xbc, 0xe3, 0x49, 0x03, 0x3e,
- 0x2a, 0x57, 0x99, 0x3d, 0x2e, 0x2c, 0x02, 0xbe, 0x7d, 0x4c, 0x5c, 0xbd,
- 0x18, 0xe7, 0x76, 0xbe, 0x61, 0x97, 0x00, 0xbe, 0xd6, 0x49, 0x8b, 0xbd,
- 0xae, 0xf4, 0x5e, 0xbc, 0x0d, 0x7f, 0x77, 0xbe, 0x7d, 0xf5, 0xd3, 0xbe,
- 0xde, 0xb1, 0x56, 0xbe, 0x6b, 0x3b, 0x9e, 0xbd, 0x72, 0x7e, 0x11, 0xbc,
- 0x0a, 0xc6, 0x1f, 0x3d, 0x0a, 0x4a, 0x9e, 0xbe, 0xd7, 0x5a, 0x31, 0xbe,
- 0xa5, 0x45, 0x6d, 0xbe, 0xa0, 0x40, 0x95, 0xbe, 0x7d, 0xf1, 0x21, 0x3e,
- 0x1d, 0x0b, 0x92, 0xbe, 0x28, 0x72, 0x7d, 0xbe, 0x0f, 0x65, 0x7e, 0xbe,
- 0xfa, 0xa0, 0xb4, 0xbe, 0x76, 0x29, 0x08, 0xbe, 0x0a, 0x9b, 0x09, 0xbe,
- 0x43, 0xd9, 0x92, 0xbe, 0x11, 0x88, 0x10, 0xba, 0x6a, 0x4f, 0x25, 0xbc,
- 0x6c, 0x2a, 0xab, 0xbd, 0xe5, 0x9c, 0xe0, 0xbd, 0xb5, 0x75, 0x71, 0x3d,
- 0x19, 0x2b, 0x30, 0xbd, 0x2d, 0x06, 0x97, 0xbd, 0xec, 0xa9, 0x02, 0xbf,
- 0xac, 0x97, 0x8b, 0xbd, 0xdf, 0x54, 0xb6, 0xbd, 0x1e, 0xa2, 0x7c, 0xbe,
- 0x79, 0x49, 0x9f, 0xbe, 0x04, 0xe8, 0x0b, 0xbe, 0x7f, 0x24, 0x5d, 0xbe,
- 0xbc, 0x35, 0xad, 0xbe, 0xe3, 0x1c, 0x3a, 0xbe, 0x4b, 0x9d, 0x08, 0xbe,
- 0x57, 0x40, 0xa6, 0xbe, 0x96, 0xc6, 0x5a, 0xbe, 0xac, 0xaa, 0x94, 0xbd,
- 0xb7, 0xc5, 0x4d, 0xbe, 0xb8, 0x28, 0x1f, 0x3d, 0x68, 0xbc, 0xc5, 0xbe,
- 0xcf, 0xe6, 0x11, 0xbe, 0x03, 0x6f, 0x31, 0xbe, 0x80, 0x33, 0x2b, 0xbd,
- 0xcd, 0x29, 0xe8, 0xbd, 0x10, 0x59, 0x95, 0xbd, 0x6d, 0xa3, 0x80, 0xbe,
- 0x85, 0x49, 0xda, 0xbd, 0x70, 0xe4, 0xdd, 0xbe, 0xec, 0x4a, 0xac, 0xbd,
- 0x97, 0x6a, 0x73, 0xbd, 0xd6, 0x3c, 0xb8, 0x3d, 0x78, 0xc0, 0xa6, 0xbe,
- 0x57, 0x02, 0xb6, 0x3d, 0x93, 0x4a, 0x17, 0x3e, 0x70, 0x3f, 0xe7, 0x3c,
- 0xf0, 0xe7, 0xb8, 0xbd, 0x24, 0x5f, 0x97, 0x3c, 0x45, 0xe7, 0x24, 0xbe,
- 0xe6, 0xa7, 0xe1, 0x3b, 0xaf, 0xb9, 0xae, 0xbc, 0x24, 0x74, 0x00, 0xbe,
- 0xee, 0x21, 0xae, 0xbe, 0xdc, 0x09, 0x0f, 0xbe, 0x0c, 0x4a, 0xa8, 0xbd,
- 0x12, 0x52, 0x0f, 0xbe, 0x22, 0xa2, 0x94, 0x3c, 0x21, 0x5e, 0x3d, 0xbe,
- 0xe0, 0x28, 0x1e, 0x3d, 0xdb, 0x55, 0x25, 0x3d, 0xda, 0x74, 0x62, 0xbe,
- 0x3c, 0x30, 0x3a, 0x3e, 0x80, 0x3c, 0x3f, 0xbe, 0x7b, 0x5f, 0xd9, 0xbd,
- 0x9f, 0x13, 0x07, 0xbe, 0xc1, 0xbf, 0x28, 0x3e, 0x78, 0x5d, 0x90, 0xbd,
- 0x35, 0xc2, 0x37, 0xbe, 0x0b, 0xf0, 0x91, 0xbd, 0x9f, 0xe2, 0x9f, 0xbe,
- 0x26, 0x74, 0x1f, 0xbe, 0x11, 0xc1, 0x2f, 0xbe, 0x05, 0x64, 0x57, 0xbe,
- 0x4f, 0x25, 0x2c, 0x3e, 0xcb, 0x23, 0x7f, 0xbd, 0xd3, 0xf6, 0xce, 0x3c,
- 0x27, 0xd7, 0xb0, 0xbd, 0x1b, 0xe1, 0x43, 0xbe, 0xde, 0x89, 0x02, 0x3e,
- 0xfa, 0x40, 0x5b, 0xbe, 0x05, 0x77, 0x98, 0xbe, 0x24, 0x73, 0x42, 0x3e,
- 0x12, 0xb3, 0x4c, 0x3e, 0x0a, 0x7a, 0xaf, 0xbe, 0xa2, 0xa2, 0x1f, 0xbe,
- 0xce, 0x32, 0xbe, 0x3e, 0x32, 0x7a, 0x29, 0x3e, 0xfb, 0x30, 0xda, 0x3d,
- 0xe2, 0xb0, 0x45, 0x3e, 0xda, 0x99, 0x09, 0x3d, 0xcb, 0x6f, 0x72, 0xbd,
- 0x4e, 0xf9, 0x5e, 0x3b, 0xc2, 0x31, 0x94, 0xbd, 0x79, 0xaf, 0xeb, 0xbd,
- 0x19, 0x7a, 0x9d, 0x3e, 0x9a, 0x0e, 0x9d, 0xbd, 0x4d, 0x73, 0x2c, 0x3e,
- 0x78, 0x8d, 0x4a, 0xbe, 0xb3, 0x49, 0xf3, 0xbe, 0x01, 0xd4, 0x8d, 0xbd,
- 0xbb, 0x5f, 0xf6, 0xbd, 0x41, 0x71, 0x39, 0xbe, 0x3b, 0x20, 0x6b, 0xbe,
- 0xa3, 0xd0, 0x62, 0xbe, 0xa0, 0x13, 0x4b, 0xbe, 0xbf, 0x63, 0x8c, 0x3d,
- 0x69, 0x9f, 0x95, 0xbe, 0xa0, 0x63, 0x5c, 0xbc, 0x1f, 0x77, 0x34, 0xbe,
- 0xfe, 0xd6, 0x14, 0x3d, 0xf0, 0x3d, 0x36, 0xbe, 0xa7, 0x26, 0x3a, 0xbe,
- 0x19, 0x73, 0x14, 0x3e, 0xdb, 0xd0, 0xdc, 0xbd, 0x60, 0x28, 0x0a, 0xbf,
- 0x40, 0xde, 0xad, 0xbe, 0x30, 0xbb, 0x93, 0xbd, 0x12, 0xf0, 0xd4, 0xbe,
- 0x2f, 0xe4, 0xc2, 0xbc, 0xef, 0xd6, 0x16, 0xbd, 0x12, 0xf2, 0xa4, 0xbe,
- 0xd0, 0xb7, 0x71, 0x3e, 0x39, 0x09, 0x71, 0x3c, 0x05, 0x91, 0x1d, 0x3b,
- 0x2e, 0x5a, 0x1c, 0xbe, 0x89, 0xc9, 0xfe, 0xbe, 0xd8, 0xc7, 0xde, 0x3e,
- 0x1b, 0xfb, 0xeb, 0xbe, 0x54, 0x06, 0x7d, 0x3e, 0x3a, 0x85, 0x66, 0x3d,
- 0x25, 0xde, 0x85, 0xbd, 0xc3, 0x75, 0x98, 0xbd, 0x5e, 0x31, 0x09, 0xbd,
- 0x5b, 0xb3, 0xa0, 0xbd, 0x79, 0xa8, 0x0f, 0x3d, 0x9f, 0x21, 0xa6, 0xbd,
- 0xb9, 0xf3, 0xaa, 0xbd, 0xc4, 0x1e, 0x7f, 0x3d, 0x08, 0xb9, 0x78, 0x3e,
- 0x05, 0x9f, 0xd4, 0xbd, 0x64, 0x9c, 0x61, 0x3e, 0x1a, 0x5d, 0x88, 0xbe,
- 0xf4, 0x04, 0x4a, 0x3e, 0x14, 0x29, 0xbb, 0x3d, 0xe5, 0x6c, 0x5f, 0xbe,
- 0x0f, 0x3a, 0xa8, 0x3e, 0xe1, 0xc2, 0xf5, 0xbd, 0x04, 0xbb, 0xb8, 0x3c,
- 0x54, 0x6d, 0x11, 0xbb, 0x04, 0x36, 0x3e, 0x3b, 0x72, 0x36, 0xc9, 0xbe,
- 0x3f, 0xeb, 0xc3, 0x3d, 0x3c, 0xd9, 0xfe, 0x3d, 0x0b, 0x4f, 0x74, 0x3d,
- 0xe0, 0x30, 0xa4, 0x3d, 0x99, 0x21, 0xa3, 0xbe, 0xf5, 0x50, 0x8f, 0xbe,
- 0x05, 0xd4, 0x92, 0xbd, 0x8e, 0x51, 0xb0, 0x3e, 0xa6, 0xb8, 0x3e, 0xbe,
- 0x23, 0x75, 0xbd, 0xbe, 0x05, 0x45, 0x4c, 0x3d, 0xa1, 0xa7, 0xee, 0x3a,
- 0x7f, 0xa8, 0xe5, 0x3d, 0x32, 0x3d, 0x86, 0x3b, 0x04, 0x3d, 0xa0, 0x3d,
- 0xe9, 0x95, 0x8a, 0xbe, 0xf0, 0x61, 0x80, 0x3d, 0xc4, 0xd7, 0xa0, 0x3e,
- 0xb4, 0x3a, 0x93, 0x3c, 0x39, 0xbb, 0x65, 0xbd, 0x58, 0x2e, 0x29, 0xbe,
- 0x7c, 0x3f, 0x0d, 0xbe, 0xec, 0xbd, 0xb6, 0xbd, 0x45, 0xf7, 0x86, 0x3c,
- 0x08, 0xfb, 0x34, 0xbe, 0xce, 0x59, 0x88, 0xbe, 0x5f, 0x8c, 0x67, 0x3d,
- 0x54, 0x94, 0x20, 0x3e, 0xa4, 0xcd, 0x5d, 0x3d, 0x0f, 0x09, 0x11, 0x3e,
- 0x29, 0x74, 0x76, 0xbe, 0x4b, 0x85, 0xc4, 0xbe, 0xc3, 0x75, 0xc2, 0x3c,
- 0x81, 0xfd, 0x3c, 0x3e, 0xb2, 0xd2, 0xab, 0xbd, 0xfe, 0xb0, 0x8b, 0xbd,
- 0x48, 0xd5, 0xd4, 0x3d, 0x89, 0xa3, 0x24, 0x3e, 0x64, 0x69, 0x99, 0xbe,
- 0x87, 0x66, 0x1b, 0xbe, 0xb0, 0x85, 0x1d, 0x3c, 0xcd, 0xea, 0x42, 0xbe,
- 0x1f, 0x2d, 0x1a, 0xbd, 0x3a, 0x7e, 0x95, 0xbd, 0x5c, 0xd3, 0x15, 0x3e,
- 0xf3, 0x5c, 0x04, 0xbe, 0x52, 0xba, 0x5e, 0xbe, 0x98, 0xd2, 0x8a, 0xbe,
- 0xd9, 0x61, 0x43, 0x3e, 0xd4, 0x92, 0xec, 0x3d, 0xbe, 0x73, 0x04, 0x3e,
- 0xc5, 0x21, 0xe1, 0x3d, 0x64, 0x8a, 0xa8, 0x3e, 0xb1, 0x96, 0xb0, 0xbb,
- 0xa4, 0x51, 0x0e, 0x3d, 0xde, 0x43, 0xa8, 0xbd, 0x5f, 0x8a, 0xa3, 0x3d,
- 0x7b, 0x6c, 0xc0, 0x3d, 0xa3, 0x64, 0x04, 0xbe, 0x8e, 0x66, 0x96, 0x3d,
- 0xcf, 0x47, 0x1d, 0xbe, 0x24, 0x2e, 0x0d, 0x3e, 0x5f, 0xc1, 0x1e, 0xbd,
- 0x83, 0x37, 0x15, 0x3e, 0x31, 0x63, 0xa7, 0xbc, 0x27, 0x02, 0xac, 0x3e,
- 0x5a, 0x03, 0x2f, 0x3b, 0x77, 0xb7, 0xb5, 0x3e, 0x5c, 0xbf, 0x37, 0x3e,
- 0x6e, 0xa3, 0x23, 0x3d, 0xac, 0x49, 0x32, 0xbc, 0x62, 0xf9, 0xf5, 0xbd,
- 0x57, 0xa4, 0xc4, 0x3d, 0xff, 0x6f, 0x0c, 0x3e, 0x63, 0x72, 0x57, 0xbc,
- 0x49, 0xd0, 0xb6, 0x3d, 0x5b, 0xfc, 0x93, 0x3e, 0xf3, 0x77, 0xeb, 0xbd,
- 0xf4, 0xb3, 0x38, 0x3e, 0x64, 0xc7, 0x11, 0x3e, 0xd0, 0x71, 0x95, 0x3e,
- 0xd8, 0xa2, 0x7a, 0xbc, 0xdf, 0xf5, 0x93, 0xbd, 0x28, 0x58, 0x3a, 0x3d,
- 0xd4, 0x49, 0xd9, 0x3d, 0x1a, 0x5b, 0x73, 0xbe, 0x5a, 0xe0, 0xef, 0x3d,
- 0x2a, 0xe5, 0x93, 0xbe, 0x47, 0x06, 0x59, 0xbc, 0x12, 0x80, 0x27, 0x3e,
- 0x8e, 0xd3, 0x93, 0xbd, 0xdd, 0x04, 0x0f, 0x3d, 0x4f, 0x2e, 0xd4, 0xbd,
- 0x18, 0x2e, 0xaf, 0x3d, 0x63, 0xaa, 0x4a, 0xbe, 0x2a, 0x35, 0x7a, 0x3e,
- 0x43, 0x1b, 0x03, 0x3e, 0xc1, 0x74, 0x32, 0xbc, 0x46, 0xab, 0x0f, 0xbd,
- 0xc2, 0xf5, 0xd8, 0x3d, 0x53, 0xb6, 0x46, 0x3d, 0x5d, 0x77, 0xcd, 0x3b,
- 0x4a, 0x3b, 0xc2, 0x3e, 0x72, 0x01, 0xb3, 0xbe, 0x74, 0x8b, 0x9b, 0xbd,
- 0x91, 0x1a, 0x05, 0x3e, 0xdc, 0xe5, 0x82, 0xba, 0x91, 0x1f, 0x33, 0xbe,
- 0xa2, 0xa1, 0x85, 0xbd, 0xec, 0x4e, 0x1f, 0xbd, 0xbb, 0x9f, 0x8a, 0xbe,
- 0xa5, 0x01, 0x2c, 0xbe, 0x3a, 0x09, 0x5f, 0xbd, 0x01, 0xb8, 0x2a, 0xbe,
- 0xd5, 0xda, 0x7c, 0x3d, 0x91, 0x1b, 0x58, 0xbd, 0xf2, 0x52, 0xa6, 0xbc,
- 0x6e, 0x1c, 0x08, 0xbe, 0xf3, 0x78, 0x3f, 0xbe, 0xb9, 0x30, 0x46, 0x3e,
- 0xff, 0xde, 0x10, 0xbd, 0x9b, 0x0d, 0xe5, 0xbd, 0x9a, 0x7d, 0xe9, 0x3d,
- 0x9a, 0x49, 0x99, 0x3a, 0x5a, 0x0f, 0x1a, 0x3e, 0xd6, 0xf6, 0x8b, 0x3d,
- 0x7c, 0xc8, 0x0c, 0xbb, 0x43, 0x94, 0x41, 0x3e, 0x73, 0x57, 0x27, 0x3d,
- 0x5a, 0x49, 0x7e, 0xbc, 0xc3, 0xf1, 0x13, 0xbe, 0x58, 0x6d, 0x86, 0x3e,
- 0x47, 0x71, 0x4f, 0xbe, 0x81, 0xda, 0x72, 0xbe, 0xe9, 0xac, 0x21, 0xbd,
- 0xd8, 0x55, 0x56, 0x3d, 0xb2, 0x1c, 0x55, 0x3e, 0xc9, 0x47, 0x28, 0xbe,
- 0x18, 0xe5, 0x54, 0xbe, 0x92, 0x3f, 0x62, 0xbe, 0xcd, 0xd7, 0x8a, 0x3c,
- 0xc8, 0x50, 0x4b, 0x3e, 0x4b, 0xf5, 0x62, 0x3d, 0x43, 0x01, 0x6e, 0xbe,
- 0xcf, 0x61, 0x8c, 0xbd, 0xb8, 0xd7, 0x15, 0x3e, 0xac, 0xec, 0x33, 0xbd,
- 0xcb, 0xf5, 0x50, 0x3e, 0x81, 0x1b, 0xc6, 0xbd, 0x82, 0x9a, 0x19, 0x3e,
- 0xa0, 0x46, 0x64, 0xbe, 0x25, 0xbb, 0x03, 0xbe, 0xba, 0xd0, 0x02, 0x3d,
- 0xef, 0x4d, 0xa0, 0x3e, 0x24, 0xa7, 0xb7, 0x3d, 0x56, 0x28, 0x20, 0xbd,
- 0x72, 0xc1, 0x80, 0xbd, 0x29, 0xa3, 0xd5, 0xbd, 0x35, 0x0a, 0x98, 0xbc,
- 0x72, 0x38, 0x9a, 0xbd, 0xe1, 0x8c, 0x2a, 0xbe, 0x95, 0xc4, 0x37, 0xbe,
- 0x47, 0xc6, 0x17, 0x3e, 0xcf, 0xd9, 0x5d, 0x3c, 0x3b, 0x3f, 0x16, 0x3e,
- 0x24, 0x02, 0xad, 0xbc, 0xf4, 0xcb, 0xd1, 0xbd, 0x5a, 0xd3, 0xc9, 0xbd,
- 0xac, 0x41, 0x1b, 0xbe, 0x48, 0x31, 0x0a, 0x3e, 0x70, 0x02, 0x0f, 0x3e,
- 0x01, 0x8f, 0x0f, 0xbe, 0x35, 0x6e, 0x56, 0x3c, 0x61, 0x72, 0x2c, 0xbe,
- 0x6e, 0xbe, 0xfa, 0xbd, 0x51, 0x57, 0x89, 0xbc, 0x7f, 0x70, 0xd4, 0x3d,
- 0x53, 0x36, 0xef, 0x3c, 0x5c, 0x4d, 0x76, 0xbd, 0xce, 0x2a, 0x42, 0x3e,
- 0xb1, 0xa9, 0xb6, 0xbd, 0x9d, 0x30, 0x11, 0xbe, 0x18, 0x54, 0x58, 0x3c,
- 0x60, 0x47, 0x1b, 0xbe, 0xa7, 0x22, 0x3a, 0xbe, 0x3f, 0xe8, 0x9d, 0xbe,
- 0x7b, 0x84, 0xd3, 0x3d, 0x07, 0x91, 0x01, 0xbe, 0xa0, 0x66, 0x02, 0xbe,
- 0x11, 0x3a, 0x24, 0xbe, 0xd6, 0x89, 0xd3, 0xbd, 0x8f, 0x73, 0x8b, 0xbd,
- 0x37, 0x03, 0xdd, 0x3d, 0x16, 0xa3, 0xed, 0x3c, 0x87, 0x6f, 0xa2, 0x3d,
- 0x03, 0x02, 0xc2, 0x3c, 0x2e, 0xdb, 0xe1, 0x3b, 0x57, 0x3f, 0xd3, 0x3d,
- 0xb9, 0x3e, 0xae, 0x3d, 0xad, 0x4e, 0xce, 0x3d, 0x16, 0x67, 0x7a, 0x3d,
- 0xda, 0xa6, 0x4a, 0x3e, 0x69, 0x61, 0x82, 0x3e, 0x89, 0xc3, 0x5b, 0x3d,
- 0x38, 0x33, 0x82, 0xbd, 0x59, 0x16, 0x24, 0x3d, 0x88, 0x01, 0xb2, 0x3c,
- 0xd7, 0x73, 0x0b, 0x3e, 0x77, 0xde, 0xc0, 0xbd, 0x72, 0x53, 0x7d, 0xbd,
- 0xff, 0xa6, 0xe4, 0xbd, 0x04, 0x98, 0x9c, 0xbd, 0x62, 0x50, 0x9d, 0x3d,
- 0x5b, 0xff, 0xc7, 0x3d, 0x49, 0xa1, 0x21, 0xbe, 0x46, 0xa1, 0xd8, 0xbe,
- 0x18, 0x14, 0x36, 0xbe, 0xae, 0xcf, 0x76, 0x3e, 0x27, 0x90, 0xf5, 0x3d,
- 0x45, 0x65, 0xdd, 0xbd, 0xa2, 0xa2, 0x26, 0xbe, 0xe4, 0xc1, 0xf7, 0xba,
- 0x60, 0x75, 0x0f, 0x3e, 0xfe, 0xaf, 0xac, 0xbe, 0xd9, 0x18, 0xdb, 0xbd,
- 0x0b, 0x18, 0xe3, 0xbd, 0xc4, 0x97, 0x98, 0xbe, 0xf5, 0x67, 0x68, 0xbe,
- 0x2d, 0x88, 0x3b, 0xbe, 0xbf, 0x26, 0x05, 0xbe, 0x81, 0xf8, 0x67, 0xbe,
- 0x0e, 0x0a, 0x02, 0x3e, 0x4c, 0x46, 0xba, 0x3b, 0x7e, 0x8e, 0xb4, 0xbe,
- 0x67, 0x28, 0x0f, 0x3d, 0x39, 0x2a, 0x69, 0xbd, 0xfc, 0xee, 0x01, 0xbe,
- 0xf1, 0x5c, 0x90, 0xbe, 0xd8, 0xd2, 0x48, 0xbe, 0xf8, 0xee, 0x9b, 0xbe,
- 0x00, 0xe8, 0x74, 0x3c, 0xf6, 0x98, 0x74, 0x3e, 0x81, 0x75, 0xff, 0x3c,
- 0x6a, 0xb6, 0xac, 0x3c, 0x4b, 0x85, 0x5d, 0xbc, 0xe2, 0xa8, 0xae, 0xbd,
- 0xb0, 0x31, 0xb0, 0xbd, 0xc0, 0xc8, 0x63, 0x3d, 0xf1, 0x46, 0x50, 0xbc,
- 0x14, 0x9f, 0x1b, 0xbe, 0xe4, 0x7b, 0xaa, 0x3d, 0xcc, 0xc4, 0x6e, 0xbc,
- 0x17, 0x33, 0xdc, 0x3d, 0x25, 0x8b, 0x09, 0xbe, 0x40, 0x13, 0xcc, 0xbe,
- 0x9b, 0xe1, 0xb5, 0x3d, 0xda, 0xce, 0x29, 0xbe, 0x66, 0x06, 0x8a, 0xbb,
- 0x4a, 0x52, 0x08, 0xbe, 0x29, 0x07, 0x7e, 0x3d, 0xbf, 0x20, 0x0a, 0x3e,
- 0x03, 0x3a, 0x47, 0x3c, 0x70, 0xea, 0x50, 0xbe, 0xb9, 0xe2, 0x84, 0x3d,
- 0x71, 0x87, 0x63, 0x3d, 0x44, 0xa4, 0x83, 0x3e, 0x1e, 0xc8, 0x44, 0xbe,
- 0x0e, 0x00, 0x05, 0xbd, 0x1c, 0x7f, 0x29, 0xbe, 0xbc, 0x64, 0xb3, 0xbd,
- 0x58, 0x81, 0x4c, 0xbe, 0xd8, 0x0b, 0xe3, 0x3c, 0x16, 0x9b, 0x1d, 0x3e,
- 0xd7, 0x17, 0x2c, 0xbe, 0xee, 0x1b, 0x88, 0xbe, 0x85, 0x01, 0xab, 0xbd,
- 0x41, 0xd0, 0x87, 0x3e, 0x5c, 0x74, 0x01, 0x3d, 0x0f, 0x1f, 0x2a, 0x3d,
- 0xbc, 0xef, 0x9f, 0x3d, 0x4e, 0x49, 0xdc, 0x3c, 0x83, 0xcc, 0x1f, 0xbc,
- 0xd4, 0x47, 0x0d, 0xbe, 0xb5, 0xf7, 0x8a, 0xbd, 0xc0, 0xb7, 0xc5, 0x3d,
- 0xfc, 0x32, 0x49, 0x3e, 0x4c, 0xae, 0x99, 0x3c, 0x25, 0x18, 0xfe, 0xbd,
- 0x97, 0xb1, 0x98, 0x3d, 0xc1, 0xb5, 0x8a, 0xbe, 0x01, 0x9c, 0x84, 0x3c,
- 0x65, 0xcd, 0xa4, 0xbd, 0xeb, 0x2a, 0x45, 0xbe, 0xf5, 0xf7, 0x0d, 0x3e,
- 0x2c, 0xc1, 0x7d, 0xbe, 0xf1, 0x18, 0xa5, 0xbe, 0x64, 0xc9, 0x50, 0x3d,
- 0x02, 0x9c, 0x27, 0xbe, 0x66, 0x3b, 0xcc, 0x3d, 0x74, 0x47, 0x64, 0xbe,
- 0x84, 0xe5, 0x9d, 0x3c, 0x74, 0xb6, 0x48, 0xbd, 0x9c, 0x84, 0x49, 0x3b,
- 0x72, 0xe3, 0x5b, 0xbd, 0x3c, 0x82, 0x0b, 0xbe, 0x21, 0x02, 0xaf, 0xbe,
- 0x54, 0xe2, 0xb3, 0xbc, 0xbe, 0xcf, 0x1c, 0xbe, 0x4c, 0x97, 0x84, 0xbe,
- 0xe3, 0xc7, 0xd8, 0x3d, 0x52, 0x15, 0x3a, 0xbe, 0x82, 0x33, 0x87, 0xbe,
- 0x6d, 0x6b, 0xae, 0xbe, 0xfc, 0xed, 0xdd, 0x3d, 0xd8, 0x70, 0x0e, 0x3e,
- 0xf9, 0x21, 0x4a, 0xbd, 0x77, 0xb4, 0xad, 0xbc, 0x3b, 0x1f, 0x86, 0x3e,
- 0x52, 0x99, 0x20, 0x3d, 0x98, 0x2c, 0x0b, 0xbe, 0x94, 0x25, 0xe3, 0xbd,
- 0xe8, 0x83, 0xa2, 0xbd, 0xae, 0xd5, 0x08, 0xbe, 0x17, 0x97, 0xd5, 0x3d,
- 0xb6, 0x57, 0x9f, 0xbd, 0x59, 0xc5, 0xc5, 0x3d, 0xae, 0x06, 0x80, 0xbe,
- 0x1d, 0x37, 0xe5, 0xbd, 0x14, 0x86, 0xfb, 0x3d, 0xff, 0x1d, 0x70, 0xbd,
- 0x30, 0x49, 0x57, 0x3e, 0xa1, 0xaf, 0x7b, 0xbd, 0x94, 0xed, 0x50, 0x3d,
- 0x34, 0x50, 0x85, 0xbe, 0xaf, 0x87, 0x61, 0x3d, 0xfe, 0x76, 0x18, 0xbe,
- 0xe7, 0xea, 0xa4, 0xbd, 0xef, 0x93, 0x8d, 0xbe, 0x49, 0xc6, 0x98, 0xbe,
- 0xf0, 0x20, 0x5d, 0xbd, 0x88, 0x11, 0xc8, 0xbd, 0x89, 0x2e, 0x01, 0xbe,
- 0xf9, 0x8c, 0x7d, 0xbd, 0x67, 0xaa, 0x0a, 0x3e, 0x20, 0xb6, 0xa5, 0x3d,
- 0x65, 0x29, 0x06, 0xbd, 0x97, 0xce, 0xf4, 0x3d, 0xda, 0xd2, 0x6e, 0xbe,
- 0x4e, 0x1e, 0x4e, 0x3d, 0x29, 0x21, 0xe4, 0x3d, 0xed, 0xc2, 0x64, 0x3d,
- 0x37, 0xb5, 0x3d, 0xbe, 0x24, 0xfa, 0xff, 0xbd, 0xd4, 0xda, 0xa6, 0xbd,
- 0x90, 0x05, 0xbb, 0xbd, 0x5f, 0xd8, 0xd3, 0xbd, 0x37, 0x69, 0x43, 0x3e,
- 0x4c, 0x70, 0x4a, 0xbe, 0x12, 0x22, 0x48, 0x3d, 0x14, 0x92, 0x1b, 0x3e,
- 0x45, 0x0c, 0x19, 0xbe, 0x1f, 0xb3, 0x2e, 0xbe, 0x15, 0x02, 0x8b, 0x3d,
- 0x4f, 0x4b, 0x89, 0x3e, 0x1d, 0xeb, 0x1a, 0xbe, 0xba, 0x8c, 0x0e, 0x3e,
- 0xd1, 0x48, 0x84, 0x3e, 0xda, 0x52, 0x56, 0xbe, 0x78, 0xbf, 0x59, 0x3d,
- 0x99, 0xee, 0x8f, 0x3d, 0xcf, 0x90, 0x1f, 0x3e, 0xd5, 0xe8, 0x26, 0x3d,
- 0x24, 0x6c, 0x17, 0xbd, 0xa5, 0xc4, 0xc5, 0xbc, 0xa5, 0x1a, 0x15, 0x3c,
- 0x41, 0x35, 0x0c, 0xbd, 0xe5, 0x4c, 0xb9, 0xbc, 0xd6, 0xd5, 0x5a, 0xbe,
- 0xc0, 0x2e, 0x23, 0xbf, 0xe6, 0x83, 0xba, 0xbd, 0xbd, 0xf1, 0x50, 0xbe,
- 0x9e, 0x2e, 0x80, 0xbe, 0xa2, 0x1e, 0xc6, 0x3d, 0x0d, 0x80, 0xf2, 0xbe,
- 0xaf, 0x70, 0x8c, 0xbe, 0x3a, 0x82, 0x68, 0xbe, 0xd0, 0xa9, 0xdc, 0x3d,
- 0xec, 0x76, 0x33, 0x3c, 0x77, 0xbf, 0xa0, 0xbd, 0xac, 0x82, 0xdd, 0xbe,
- 0xfd, 0x31, 0x87, 0x3e, 0x91, 0x76, 0x99, 0xbd, 0x48, 0xad, 0x99, 0xbd,
- 0x36, 0xf9, 0xbb, 0xbd, 0xd0, 0x3f, 0x63, 0x38, 0xa9, 0x91, 0xfa, 0x3d,
- 0x58, 0x39, 0x22, 0xbc, 0x59, 0x1a, 0xc0, 0xbd, 0x14, 0x74, 0x02, 0xbe,
- 0x7e, 0x50, 0xa4, 0xbc, 0x1b, 0xe7, 0x8b, 0xbe, 0x61, 0x7e, 0x19, 0xbe,
- 0x03, 0xd4, 0xfd, 0xbb, 0x4a, 0xde, 0xae, 0x3c, 0x4a, 0x81, 0x93, 0xbe,
- 0x2a, 0x2f, 0x64, 0x3e, 0x43, 0xb8, 0xad, 0x3d, 0x92, 0x30, 0xd7, 0xbe,
- 0x72, 0xa7, 0x35, 0xbe, 0xfe, 0x30, 0x15, 0xbe, 0x06, 0x40, 0x52, 0x3e,
- 0x4c, 0xc9, 0x15, 0xba, 0x2c, 0x38, 0xf6, 0x3d, 0xd6, 0x39, 0x35, 0xbe,
- 0xf5, 0xaa, 0x2c, 0x3e, 0x5d, 0xc5, 0xa8, 0xbe, 0xc5, 0x4e, 0xc8, 0xbb,
- 0x2b, 0xa4, 0xc8, 0xbe, 0x34, 0x41, 0x56, 0x3e, 0xaf, 0xab, 0xe7, 0xbe,
- 0x57, 0x9f, 0xfc, 0xbd, 0xa7, 0xeb, 0x11, 0x3d, 0xd8, 0xf8, 0x64, 0xbd,
- 0x08, 0xb5, 0x65, 0xbc, 0xe8, 0x12, 0xa5, 0x3c, 0x70, 0x7b, 0x03, 0x3c,
- 0x17, 0x9f, 0xd2, 0xbd, 0xb2, 0x74, 0x72, 0xbd, 0xea, 0xd1, 0xa4, 0xbd,
- 0x2c, 0x94, 0x00, 0x3e, 0x2f, 0xa4, 0x20, 0xbe, 0x52, 0xdf, 0x1a, 0x3d,
- 0xd1, 0xca, 0x6d, 0x3d, 0xdd, 0x42, 0x23, 0xbe, 0xa1, 0xca, 0x1a, 0x3e,
- 0x1f, 0xae, 0xcf, 0xbd, 0x53, 0x83, 0xce, 0xbd, 0xd4, 0xa3, 0x2a, 0x3d,
- 0x06, 0x53, 0x90, 0x3d, 0xe9, 0xcd, 0x0d, 0x3c, 0x7d, 0x8e, 0xea, 0xbb,
- 0xb2, 0x34, 0x9a, 0x3b, 0xb8, 0x75, 0xb3, 0x3d, 0x63, 0x8e, 0x2b, 0x3d,
- 0xa4, 0x45, 0xf4, 0xbd, 0x85, 0x41, 0xb3, 0xbd, 0xfe, 0xb7, 0x11, 0x3e,
- 0x88, 0x9c, 0x04, 0x3e, 0x62, 0x8f, 0x34, 0x3e, 0x26, 0x46, 0x06, 0xbe,
- 0x7e, 0x81, 0xaf, 0x3c, 0x51, 0x18, 0x8e, 0x3d, 0xec, 0x4a, 0x2e, 0x3d,
- 0xcc, 0x3a, 0xd3, 0x3d, 0xe1, 0xec, 0x2c, 0x3e, 0xc7, 0xf1, 0x05, 0xbd,
- 0xd1, 0x70, 0xbd, 0x3d, 0x71, 0xf6, 0xf8, 0x3d, 0x20, 0x08, 0x5f, 0x3d,
- 0x50, 0xee, 0x09, 0x3e, 0xf3, 0x43, 0x68, 0x3d, 0xfc, 0xc8, 0x3c, 0xbd,
- 0xfd, 0x04, 0x63, 0xbc, 0x43, 0xd0, 0xc4, 0x3d, 0xb7, 0x87, 0xc8, 0x3b,
- 0xe7, 0x18, 0x5c, 0x3e, 0x46, 0x67, 0xf2, 0x3d, 0xfd, 0xf9, 0x83, 0xbd,
- 0xc1, 0xa6, 0x6f, 0xbd, 0x2f, 0x8d, 0xba, 0xbd, 0xb9, 0x01, 0x48, 0xbd,
- 0x34, 0x24, 0x0b, 0xbe, 0x8f, 0x38, 0xa5, 0x3d, 0xb2, 0xd4, 0x9c, 0x3d,
- 0xda, 0x20, 0xea, 0xbd, 0xd2, 0x62, 0x25, 0xbe, 0x1d, 0x0f, 0x1a, 0xbe,
- 0xd2, 0x6f, 0x0d, 0x3d, 0x9a, 0xce, 0xa4, 0x3d, 0x62, 0xd6, 0x01, 0x3e,
- 0x72, 0x5a, 0x88, 0x3d, 0x72, 0x2a, 0xa1, 0xbb, 0xc6, 0x07, 0x95, 0x3d,
- 0x8a, 0x34, 0x45, 0xbd, 0x77, 0xf4, 0xa4, 0x3b, 0x4d, 0xdc, 0xca, 0xbc,
- 0x98, 0x4c, 0xf8, 0xbd, 0x01, 0xb0, 0x35, 0xbd, 0x4b, 0x88, 0x87, 0x3d,
- 0xbf, 0x49, 0x20, 0x3d, 0x13, 0x1b, 0x56, 0xbd, 0x4c, 0xbb, 0x5a, 0x3d,
- 0x1b, 0x40, 0xd6, 0xbc, 0x56, 0x28, 0x33, 0xbd, 0x79, 0x60, 0xc8, 0x3d,
- 0x01, 0x9d, 0x6a, 0x3d, 0xef, 0xef, 0x90, 0x3d, 0x14, 0x60, 0x55, 0xbd,
- 0x47, 0xf9, 0x73, 0xbd, 0x64, 0x3b, 0xe2, 0xbd, 0x66, 0xee, 0x15, 0xbe,
- 0xd7, 0xba, 0xcf, 0x3d, 0x6b, 0xcf, 0x25, 0x3e, 0x49, 0xa3, 0x5a, 0x3e,
- 0x2e, 0x8f, 0xc8, 0xbd, 0x32, 0x4a, 0xf9, 0xbd, 0x24, 0x1d, 0xe4, 0x3c,
- 0x80, 0x3c, 0x1a, 0xbe, 0xd7, 0xec, 0x99, 0x3d, 0x0c, 0xce, 0xf7, 0x3d,
- 0x06, 0x31, 0xf3, 0xbd, 0x00, 0x17, 0x12, 0x3e, 0xa5, 0x4f, 0x81, 0x3d,
- 0x1e, 0x20, 0x04, 0xbd, 0xad, 0xc3, 0x71, 0x3d, 0xd3, 0xe6, 0x88, 0x3b,
- 0x3a, 0xd8, 0x20, 0xbd, 0xf1, 0xf5, 0x10, 0xbe, 0x5c, 0x96, 0x9b, 0xbd,
- 0xdc, 0x00, 0xe7, 0x3d, 0x60, 0xff, 0xb1, 0x3d, 0x5f, 0xaa, 0x75, 0xbd,
- 0x8e, 0x57, 0x14, 0xbe, 0xf8, 0x90, 0x25, 0x3b, 0x1e, 0xb9, 0xad, 0x3c,
- 0xd1, 0x14, 0x8d, 0x3c, 0xf8, 0x27, 0x6b, 0xbc, 0xcd, 0xa2, 0x33, 0x3c,
- 0x63, 0x1f, 0x27, 0x3d, 0x12, 0x42, 0xc2, 0xbd, 0x2c, 0x76, 0x43, 0x3d,
- 0x96, 0xf7, 0x96, 0x3d, 0xdd, 0x01, 0xf7, 0xbc, 0x54, 0xb4, 0x35, 0x3b,
- 0x72, 0x0a, 0xed, 0x3d, 0x72, 0x77, 0x00, 0x3d, 0x03, 0x44, 0x09, 0xbe,
- 0x35, 0xde, 0x89, 0xbd, 0xf9, 0xcc, 0xd6, 0x3d, 0xdb, 0x54, 0xea, 0xbd,
- 0xaa, 0xb7, 0xcf, 0x3b, 0x72, 0xd8, 0x85, 0xbd, 0x62, 0xe8, 0x91, 0x3d,
- 0x19, 0xa1, 0xda, 0xbc, 0x37, 0x9c, 0x3d, 0x3d, 0xf7, 0x30, 0xe4, 0xbd,
- 0xed, 0xad, 0x8d, 0x3d, 0xd4, 0x6b, 0xae, 0x3d, 0x8b, 0x37, 0xd4, 0xbd,
- 0x0d, 0xea, 0xba, 0xbd, 0x0a, 0x2c, 0xf9, 0x3d, 0xdf, 0xce, 0xfa, 0xbd,
- 0x39, 0x76, 0x21, 0xbc, 0x33, 0xc8, 0xf1, 0xbd, 0x08, 0x49, 0x2a, 0xbc,
- 0x21, 0x34, 0xb4, 0xbb, 0xa0, 0x84, 0x86, 0xbe, 0xc1, 0x9e, 0xff, 0x3c,
- 0xc8, 0x60, 0x64, 0xbd, 0x7a, 0x1f, 0x07, 0xbf, 0xc6, 0x1c, 0xcf, 0xbb,
- 0xf9, 0x7d, 0x4b, 0xbe, 0x68, 0xbe, 0xdb, 0xbc, 0xa1, 0x7d, 0xc4, 0xbd,
- 0x5e, 0x21, 0x23, 0xbd, 0x19, 0xff, 0x80, 0xbe, 0x32, 0x75, 0x92, 0xbe,
- 0xf3, 0x4f, 0xe2, 0xbd, 0x6a, 0xd9, 0xb3, 0xbd, 0x3c, 0xc0, 0x7c, 0xbe,
- 0x0e, 0x4f, 0x1d, 0xbd, 0xc2, 0xce, 0x20, 0x3d, 0x69, 0xbd, 0xa3, 0xbd,
- 0xab, 0x19, 0x1d, 0x3e, 0xfe, 0xed, 0xcd, 0xbd, 0x9b, 0xea, 0xfa, 0xbe,
- 0x71, 0xd0, 0x7f, 0xbd, 0x83, 0xd1, 0x6c, 0xbe, 0xb7, 0xcd, 0x5a, 0x3e,
- 0x5b, 0x86, 0x21, 0x3e, 0x36, 0xc6, 0x98, 0x3c, 0x52, 0x04, 0xfa, 0x3d,
- 0x7d, 0xee, 0xdc, 0xbe, 0x5f, 0xa5, 0xda, 0xbd, 0xba, 0x57, 0x90, 0xbe,
- 0xa5, 0x4c, 0xc4, 0xbd, 0x71, 0xd0, 0x21, 0xbe, 0x85, 0x1b, 0x5e, 0x3d,
- 0x07, 0xb0, 0x79, 0x3e, 0x8a, 0x30, 0x7f, 0xbe, 0x86, 0xaf, 0xf4, 0xbc,
- 0x57, 0x31, 0x21, 0xbe, 0x4a, 0x22, 0xe8, 0x3d, 0x21, 0x94, 0xbf, 0xbe,
- 0x82, 0xf5, 0x1d, 0xbe, 0xcb, 0x42, 0xf8, 0xbd, 0xc0, 0xbd, 0xe2, 0xbd,
- 0x3c, 0x83, 0xee, 0x3c, 0xbd, 0xb7, 0x64, 0x3b, 0x94, 0x91, 0x08, 0xbe,
- 0x4f, 0x1d, 0x91, 0xbc, 0x03, 0xfc, 0xc5, 0xbd, 0x48, 0x56, 0xbe, 0x3b,
- 0x93, 0x0f, 0x2f, 0x3d, 0x02, 0x20, 0x5e, 0x3e, 0xf1, 0xae, 0x3d, 0x3e,
- 0xf3, 0x1f, 0x25, 0x3e, 0xe8, 0xdc, 0x8d, 0x3d, 0xb3, 0xc7, 0xcb, 0x3d,
- 0x6c, 0x05, 0x03, 0xbc, 0xbe, 0x45, 0x85, 0xbd, 0x88, 0xbd, 0xeb, 0xbd,
- 0xa7, 0x50, 0x89, 0xbe, 0x83, 0x60, 0x61, 0xbe, 0x96, 0x04, 0x55, 0xbe,
- 0x0b, 0xb7, 0x99, 0xbe, 0xd0, 0x61, 0x34, 0x3c, 0x32, 0xb3, 0x7a, 0xbe,
- 0xe7, 0x9b, 0xbb, 0xbd, 0xc4, 0xa5, 0x8c, 0x3d, 0xa8, 0xe3, 0x73, 0xbd,
- 0x5f, 0x99, 0x6b, 0xbe, 0x1a, 0x6b, 0x20, 0xbe, 0xc7, 0xf3, 0x0f, 0x3e,
- 0x1e, 0x55, 0x2b, 0xbe, 0xc4, 0x6b, 0x27, 0xba, 0x52, 0xa5, 0x19, 0x3e,
- 0x5d, 0x6a, 0x9a, 0xbe, 0x87, 0xd3, 0x8f, 0xbe, 0x8a, 0x31, 0x59, 0x3e,
- 0x90, 0xa8, 0xbc, 0xbe, 0xb4, 0xc9, 0x43, 0xbc, 0xaa, 0x9f, 0x55, 0xbc,
- 0xf2, 0x89, 0x4f, 0x3e, 0x56, 0xfc, 0x9a, 0x3e, 0xaf, 0x6b, 0x51, 0xbd,
- 0x4b, 0xa3, 0x34, 0x3e, 0x77, 0xbc, 0x71, 0xbe, 0x2d, 0x36, 0x28, 0xbe,
- 0x89, 0xc8, 0x85, 0xbd, 0x37, 0xb0, 0xed, 0xbe, 0x0b, 0xb1, 0x3d, 0xbe,
- 0xcf, 0xef, 0x5d, 0xbe, 0xa1, 0x32, 0x50, 0xbe, 0x34, 0xe7, 0x55, 0x3d,
- 0x52, 0x4a, 0x65, 0xbe, 0xb0, 0x76, 0x12, 0xbe, 0xde, 0x8c, 0x33, 0xbe,
- 0xdf, 0xa5, 0xc3, 0xbd, 0x7e, 0x34, 0x41, 0xbe, 0x63, 0x79, 0x60, 0x3e,
- 0x09, 0x82, 0x2e, 0xbe, 0xfe, 0x6b, 0x7b, 0x3a, 0x70, 0xeb, 0x5f, 0x3d,
- 0xd4, 0xac, 0x9a, 0xbe, 0xed, 0x2a, 0xc7, 0xbe, 0xfe, 0x3b, 0xcd, 0xba,
- 0x65, 0x2c, 0xa2, 0xbd, 0x15, 0x58, 0x15, 0x3d, 0xe3, 0xbb, 0xa8, 0xbe,
- 0x5a, 0xcd, 0x6b, 0xbd, 0x1c, 0x4b, 0xef, 0x3d, 0xf8, 0x0d, 0x3c, 0xbc,
- 0x63, 0x6b, 0xb8, 0xbe, 0x5c, 0xff, 0xf3, 0xbd, 0x73, 0x3e, 0x80, 0xbe,
- 0x3b, 0x0e, 0x86, 0xbe, 0xc7, 0xe9, 0x2c, 0x3e, 0x24, 0x36, 0x63, 0xbe,
- 0xb3, 0xb1, 0x3b, 0xbe, 0x79, 0x37, 0x97, 0x3e, 0xcb, 0x09, 0x1f, 0x3e,
- 0x6b, 0x15, 0xcb, 0x3d, 0x64, 0x39, 0x76, 0xbd, 0xe1, 0x77, 0x12, 0xbe,
- 0xbd, 0x02, 0x66, 0xbe, 0x68, 0x77, 0x9e, 0xbd, 0xfe, 0x78, 0x05, 0xbe,
- 0x77, 0xfd, 0x82, 0x3c, 0xaf, 0x7b, 0x80, 0xbe, 0x4d, 0xe2, 0x90, 0xbd,
- 0x7f, 0x15, 0xf5, 0xbe, 0x91, 0xae, 0xa3, 0xbe, 0xb3, 0x9a, 0x90, 0xbd,
- 0x36, 0x20, 0x2c, 0x3d, 0x06, 0x9f, 0x22, 0xbe, 0xf3, 0xdc, 0x6e, 0xbe,
- 0x59, 0x99, 0x5c, 0xbe, 0x63, 0xbd, 0x4c, 0x3e, 0x0c, 0x68, 0xa8, 0x3e,
- 0x41, 0x54, 0x4e, 0xbe, 0x81, 0x77, 0x6a, 0xbe, 0x79, 0x60, 0xb2, 0x3b,
- 0x14, 0x42, 0xd8, 0xbe, 0xbe, 0x7c, 0xa2, 0xbd, 0xad, 0x19, 0x5c, 0xbe,
- 0xe7, 0x8e, 0x06, 0xbe, 0xf0, 0xbd, 0x41, 0x3e, 0xe1, 0xbf, 0xb7, 0xbd,
- 0x17, 0xc3, 0x89, 0xbd, 0x86, 0x7f, 0x51, 0xbe, 0xe9, 0x62, 0xe9, 0xbe,
- 0x09, 0x5e, 0xa9, 0xbe, 0x47, 0xa6, 0x87, 0xbd, 0x3f, 0xaf, 0x8c, 0xbe,
- 0x97, 0x76, 0xdc, 0x3b, 0x41, 0xad, 0x3c, 0x3e, 0x98, 0xfb, 0xa3, 0xbd,
- 0x40, 0x4c, 0x3b, 0xbd, 0x9c, 0x2f, 0x0e, 0xbd, 0x12, 0xad, 0x43, 0x3e,
- 0x79, 0x42, 0xb0, 0xbe, 0xb2, 0x9f, 0xbb, 0x3e, 0x0d, 0x4e, 0x8f, 0xbe,
- 0xfe, 0x9d, 0x02, 0xbe, 0x8d, 0x8c, 0xea, 0x3b, 0xc4, 0xeb, 0xc3, 0xbd,
- 0x81, 0xae, 0x40, 0x3e, 0xe0, 0x7b, 0x27, 0x3e, 0xf1, 0x67, 0xbc, 0xbd,
- 0x06, 0x32, 0x42, 0xbd, 0x53, 0xbd, 0x80, 0x3e, 0xee, 0x49, 0x02, 0x3e,
- 0x69, 0xdb, 0x14, 0x3d, 0x4e, 0x69, 0x23, 0xbd, 0x7e, 0x5d, 0x6e, 0xbe,
- 0xd3, 0x57, 0x6e, 0x3e, 0x72, 0x15, 0xe9, 0xbd, 0xd8, 0xc8, 0xe0, 0xbd,
- 0x56, 0xec, 0xda, 0xbd, 0x55, 0x22, 0x0b, 0xbe, 0x67, 0xe8, 0x4e, 0xbd,
- 0x18, 0x30, 0x72, 0x3d, 0xa0, 0x95, 0x35, 0x3e, 0x5a, 0x6b, 0x01, 0xbe,
- 0x67, 0x79, 0x25, 0x3e, 0x77, 0x2a, 0x93, 0x3e, 0x1c, 0x3f, 0x67, 0xbd,
- 0x46, 0x1b, 0x7b, 0xbe, 0x76, 0x4a, 0x56, 0xbe, 0x88, 0xc7, 0x68, 0xbe,
- 0xda, 0x6b, 0x52, 0x3e, 0xef, 0xc0, 0x54, 0x3d, 0x23, 0x7c, 0x88, 0xbd,
- 0xff, 0x40, 0xae, 0xbd, 0xac, 0xef, 0x65, 0x3e, 0xd8, 0xc2, 0x93, 0xbd,
- 0x30, 0xd2, 0xae, 0x3d, 0x85, 0xe3, 0xad, 0xbd, 0x5f, 0xee, 0x68, 0x3e,
- 0x7c, 0x8d, 0x14, 0x3f, 0x1a, 0xb6, 0x9d, 0x3d, 0x93, 0x1d, 0xdd, 0xbc,
- 0x81, 0x8f, 0xa5, 0xbe, 0x37, 0x59, 0x5a, 0x3c, 0x97, 0x53, 0x86, 0x3e,
- 0x1f, 0xcd, 0xb2, 0x3d, 0xd8, 0x48, 0x9d, 0xbb, 0xc9, 0x0a, 0x5e, 0xbc,
- 0xb7, 0xec, 0xad, 0xbd, 0x9c, 0x01, 0xda, 0xbe, 0x51, 0xcf, 0x97, 0xbd,
- 0x6a, 0xdb, 0x12, 0x3e, 0xc1, 0x3f, 0x7d, 0x3c, 0xd7, 0x86, 0x78, 0x3c,
- 0xef, 0x83, 0x02, 0xbe, 0x66, 0x01, 0xa4, 0x3d, 0x38, 0xac, 0x9a, 0x3e,
- 0xc8, 0xd0, 0xa9, 0x3e, 0x82, 0xf6, 0x44, 0x3e, 0xac, 0x0b, 0xc4, 0xbe,
- 0x2d, 0xe7, 0x5b, 0x3d, 0xd9, 0x04, 0x18, 0x3d, 0xfe, 0x06, 0x69, 0x3d,
- 0x5c, 0x4a, 0x0f, 0x3e, 0xc9, 0x8e, 0xd8, 0xbd, 0x88, 0x3e, 0xe5, 0x3d,
- 0xa0, 0xb3, 0xb4, 0x3d, 0x0c, 0x8d, 0x5f, 0xbd, 0xc3, 0x9c, 0x40, 0x3e,
- 0x72, 0x7f, 0xfa, 0x3d, 0x2a, 0xe3, 0xd9, 0xbe, 0x3c, 0xe7, 0x4c, 0x3d,
- 0x15, 0x22, 0x2e, 0xbe, 0x0a, 0x85, 0x87, 0xbe, 0x3a, 0x64, 0x0a, 0xbe,
- 0xbe, 0xc4, 0x69, 0xbd, 0xe7, 0x13, 0x38, 0xbd, 0xc6, 0xdd, 0x6d, 0x3e,
- 0xc9, 0x71, 0xc5, 0x3d, 0x50, 0x13, 0x84, 0xbe, 0xdc, 0xe6, 0x91, 0xbe,
- 0x15, 0xe0, 0xd6, 0x3d, 0x3e, 0xe3, 0x30, 0xbe, 0x62, 0x1b, 0x6c, 0xbd,
- 0xeb, 0x80, 0x9c, 0xbe, 0xa7, 0x1e, 0xf4, 0xbd, 0x41, 0xf4, 0x1c, 0xbe,
- 0x37, 0x6a, 0x12, 0x3e, 0x52, 0x29, 0x7d, 0xbd, 0x6d, 0x53, 0x2e, 0xbe,
- 0xa9, 0x7b, 0xd0, 0x3d, 0x89, 0xcf, 0xba, 0xbe, 0xaf, 0x88, 0x41, 0x3e,
- 0x3d, 0xe3, 0xbb, 0xbe, 0xe4, 0x92, 0x9e, 0xbd, 0x41, 0xee, 0xbb, 0xbe,
- 0x77, 0x92, 0x73, 0xbc, 0x2f, 0xf8, 0x72, 0xbe, 0x14, 0xf9, 0x06, 0xbe,
- 0x18, 0x89, 0xc4, 0xbe, 0xad, 0x6c, 0xc6, 0xbd, 0xc1, 0x99, 0x76, 0xbd,
- 0xc2, 0x95, 0xe6, 0x3e, 0x8e, 0x25, 0x46, 0x3e, 0x18, 0x60, 0x99, 0xbd,
- 0xd4, 0x02, 0xd9, 0x3d, 0xbd, 0x8d, 0xe3, 0x3c, 0x6b, 0xd5, 0x9d, 0xbd,
- 0x6f, 0x01, 0x41, 0xbc, 0x74, 0x47, 0xec, 0xbc, 0xf2, 0xe9, 0x4e, 0xbd,
- 0xfe, 0x6b, 0x94, 0xbd, 0xce, 0x93, 0xa8, 0xbb, 0x01, 0x39, 0x50, 0x3d,
- 0x16, 0x10, 0x57, 0xbe, 0xf7, 0x22, 0x1f, 0x3e, 0x89, 0x25, 0x08, 0xbe,
- 0x4d, 0x62, 0xc4, 0xbd, 0xc3, 0x5a, 0xb1, 0xbd, 0x7d, 0xf2, 0x26, 0xbe,
- 0xec, 0x1d, 0x77, 0x3d, 0xa2, 0x8d, 0x1f, 0x3e, 0x0a, 0xb0, 0xeb, 0x3c,
- 0xee, 0x73, 0xe9, 0xbc, 0x82, 0xe8, 0x56, 0xbc, 0x84, 0x77, 0x0e, 0x3d,
- 0xb3, 0x2b, 0xcc, 0x3d, 0xbe, 0x30, 0x9e, 0xbd, 0xa7, 0x63, 0xb3, 0x3d,
- 0x3c, 0xd7, 0x5b, 0xbd, 0x0c, 0x62, 0x51, 0xbd, 0x8f, 0x35, 0x1b, 0x3d,
- 0x3b, 0x0c, 0x1e, 0xbd, 0x96, 0x10, 0x60, 0x3d, 0x7a, 0xd3, 0xc1, 0xbd,
- 0x75, 0xff, 0xd6, 0xbd, 0xc2, 0x44, 0x30, 0xbe, 0x7f, 0x8e, 0x6d, 0x3d,
- 0x5b, 0xd3, 0xb4, 0xbd, 0x77, 0x93, 0xc4, 0xbc, 0x69, 0xa3, 0x28, 0xbd,
- 0x71, 0xce, 0x75, 0xbc, 0x8e, 0x27, 0x0a, 0xbe, 0x39, 0x34, 0x02, 0x3d,
- 0xba, 0xa2, 0x96, 0x3d, 0x1b, 0x28, 0x4d, 0xbe, 0x1a, 0xae, 0x98, 0x3d,
- 0x40, 0x6d, 0xdc, 0xbd, 0x18, 0x61, 0x36, 0x3d, 0xc8, 0x6b, 0xce, 0x3d,
- 0x17, 0x2f, 0xb8, 0x3a, 0x80, 0x31, 0xfd, 0xbd, 0xf7, 0xc1, 0xf7, 0x3d,
- 0x21, 0x89, 0x1f, 0xbd, 0xed, 0x7b, 0x1b, 0xbe, 0x7a, 0x35, 0x42, 0x3c,
- 0x97, 0x42, 0xfc, 0xbd, 0x43, 0xab, 0x65, 0xbd, 0x48, 0x8f, 0xc0, 0x3d,
- 0x92, 0x3b, 0x21, 0x3e, 0x5b, 0x65, 0x08, 0x3e, 0x22, 0x23, 0x4c, 0x3d,
- 0xc1, 0x26, 0x0f, 0xbe, 0x57, 0xd5, 0x01, 0x3d, 0xce, 0x41, 0xf2, 0xbd,
- 0x38, 0xf9, 0xb7, 0x3d, 0x5e, 0x13, 0x7f, 0xbe, 0x8e, 0xd3, 0x93, 0x3d,
- 0x85, 0x00, 0x7f, 0xbc, 0x68, 0x88, 0x3d, 0xbe, 0x79, 0x57, 0xa7, 0xbd,
- 0x49, 0x95, 0x9b, 0x3d, 0x12, 0x29, 0xf7, 0x3c, 0x88, 0x38, 0x97, 0x3d,
- 0xc1, 0x2c, 0x61, 0x3d, 0xf7, 0x3d, 0xaf, 0x3c, 0x3a, 0xc7, 0x60, 0xbd,
- 0xdd, 0x1e, 0x92, 0x3d, 0x80, 0x75, 0xdf, 0xbc, 0x88, 0x29, 0xa6, 0x3d,
- 0x15, 0xff, 0x58, 0xbd, 0x56, 0xd7, 0x04, 0xbe, 0x3e, 0xf1, 0x2e, 0xbd,
- 0x97, 0x4f, 0x2a, 0x3d, 0x8c, 0x19, 0xdf, 0x3c, 0x0c, 0x2f, 0x20, 0x3d,
- 0x40, 0xa4, 0xd6, 0x3d, 0xad, 0x8e, 0x13, 0xbe, 0x83, 0xcb, 0xf7, 0x3c,
- 0xda, 0x37, 0x86, 0xbd, 0xcb, 0x55, 0x3f, 0xbd, 0x47, 0x08, 0x25, 0x3e,
- 0xce, 0xf5, 0x03, 0x3e, 0xe5, 0xbe, 0xf7, 0xbd, 0xc3, 0x3b, 0xbd, 0xbc,
- 0xc0, 0xd6, 0x87, 0xbc, 0xd8, 0xf1, 0x06, 0xbe, 0x24, 0xc7, 0xf7, 0xbd,
- 0x8b, 0x77, 0x80, 0xbd, 0x48, 0xcb, 0x49, 0xbb, 0x5f, 0x8e, 0xef, 0x3a,
- 0x22, 0x98, 0x01, 0xbe, 0xe5, 0x1d, 0x1a, 0x3d, 0x65, 0xf0, 0x07, 0xbd,
- 0x4e, 0x4e, 0x1a, 0x3d, 0x2a, 0x9d, 0xd1, 0x3d, 0x1b, 0x3c, 0xb1, 0xbd,
- 0xec, 0xab, 0x67, 0xba, 0xa2, 0xd0, 0x2a, 0xbe, 0x76, 0x85, 0x9d, 0x3d,
- 0xbe, 0xff, 0xcb, 0x3d, 0x2e, 0xd9, 0x34, 0xbe, 0xb6, 0x1b, 0xe0, 0xbc,
- 0x26, 0xc6, 0xe9, 0x3b, 0x1b, 0xaf, 0xb2, 0x3c, 0xa1, 0x73, 0xab, 0x3c,
- 0x07, 0x65, 0x88, 0x3d, 0xcc, 0xb7, 0x62, 0xbe, 0x81, 0x34, 0x02, 0x3d,
- 0x09, 0x07, 0xa5, 0xbd, 0x87, 0xa2, 0xf9, 0x3c, 0xe7, 0xb2, 0xa2, 0x3d,
- 0x2f, 0xc4, 0x2c, 0xbd, 0xcc, 0x5c, 0x35, 0x3e, 0x4d, 0xb0, 0xb2, 0xbd,
- 0x7b, 0xd6, 0xd9, 0xbd, 0x2e, 0x75, 0x12, 0x3e, 0x1b, 0x09, 0x24, 0x3e,
- 0xd9, 0x16, 0x38, 0x3b, 0xc0, 0xc1, 0x87, 0xbd, 0x6b, 0x92, 0x52, 0xbd,
- 0xc3, 0x00, 0xa3, 0x3d, 0x1a, 0xcc, 0xa7, 0x3d, 0xfe, 0xf2, 0x9a, 0x3d,
- 0xbf, 0x9d, 0x94, 0x3d, 0xa5, 0x52, 0x7d, 0x3d, 0xbc, 0x57, 0x08, 0x3c,
- 0x9b, 0xa7, 0xba, 0xbe, 0x27, 0xe0, 0x6a, 0xbd, 0x68, 0xb0, 0x51, 0x3d,
- 0x69, 0x12, 0x92, 0xbe, 0xe4, 0x8c, 0x5d, 0xbe, 0x17, 0x3c, 0xd4, 0x3d,
- 0x53, 0xe0, 0x18, 0xbe, 0xbc, 0x96, 0x0d, 0xbe, 0x6b, 0x12, 0xe3, 0xbd,
- 0xc2, 0x2f, 0xf2, 0x3d, 0xdc, 0xdb, 0x4a, 0xbe, 0x87, 0xda, 0xe2, 0xbd,
- 0x54, 0x04, 0x8a, 0x3d, 0x97, 0xa0, 0x70, 0xbe, 0x46, 0x37, 0xa2, 0xbe,
- 0x28, 0xa8, 0xbb, 0xbe, 0x3e, 0xfb, 0xad, 0x3b, 0xb1, 0x74, 0x69, 0xbe,
- 0xf1, 0xda, 0x0b, 0xbe, 0x8b, 0xcb, 0xf9, 0xbe, 0x78, 0x21, 0x62, 0xbd,
- 0xbf, 0x05, 0x17, 0xbe, 0xe7, 0xc8, 0x08, 0x3d, 0xe9, 0x3c, 0x9b, 0x3d,
- 0x7f, 0x1e, 0x5c, 0xbe, 0x4b, 0xc9, 0xcd, 0xbd, 0xdb, 0x6e, 0xf2, 0x3c,
- 0x3e, 0xc1, 0x80, 0xbe, 0x5e, 0x6d, 0xfc, 0xbd, 0x78, 0x11, 0x37, 0x3d,
- 0x57, 0xb7, 0x4d, 0xbd, 0x48, 0x9b, 0x7a, 0xbe, 0xa0, 0x9b, 0x84, 0xbd,
- 0xf9, 0xc8, 0x98, 0xbe, 0xf4, 0xab, 0x0a, 0xbd, 0x08, 0xc4, 0x3d, 0x3d,
- 0x4b, 0x6a, 0x7c, 0xbe, 0xc9, 0x5f, 0x7d, 0xbd, 0x24, 0xe4, 0x6b, 0xbd,
- 0x8c, 0x1e, 0x96, 0xbe, 0x47, 0x63, 0xc1, 0xbb, 0x92, 0x29, 0x94, 0xbe,
- 0xe8, 0x8a, 0x05, 0xbe, 0x28, 0xe5, 0x0c, 0xbe, 0x6d, 0x69, 0x3f, 0x3c,
- 0xef, 0xd3, 0xf2, 0xbc, 0x37, 0x32, 0x93, 0xbe, 0x4c, 0xda, 0x23, 0xbe,
- 0x23, 0xf1, 0x11, 0xbe, 0x7b, 0x7a, 0xdd, 0x3c, 0x9a, 0xe3, 0x58, 0xbe,
- 0x96, 0x3d, 0x45, 0xbd, 0xf9, 0x21, 0x0f, 0xbe, 0x54, 0x62, 0xdc, 0x3c,
- 0x15, 0x63, 0x8f, 0x3d, 0x36, 0x15, 0xd2, 0xbe, 0x81, 0x4f, 0x96, 0xbe,
- 0x57, 0xed, 0xe2, 0xbc, 0x69, 0xe7, 0xae, 0xbc, 0x81, 0x83, 0xae, 0xbe,
- 0x5e, 0x31, 0xfc, 0xbe, 0x92, 0xbe, 0x89, 0xbb, 0x2b, 0x1b, 0xa3, 0xbd,
- 0x5f, 0xe6, 0x19, 0xbe, 0x45, 0xae, 0x0e, 0x3d, 0x6f, 0x5d, 0x1c, 0xbe,
- 0x36, 0xfa, 0x82, 0xbe, 0x64, 0x14, 0xb6, 0x3d, 0x5c, 0xfd, 0x99, 0xbd,
- 0xee, 0x5c, 0x1e, 0xbe, 0x95, 0x47, 0xec, 0x3d, 0x5c, 0x8c, 0xbe, 0x3a,
- 0x20, 0xb5, 0x0f, 0x3d, 0x13, 0x6b, 0x09, 0xbe, 0xee, 0x1f, 0x2b, 0x3d,
- 0xcd, 0xcf, 0xdf, 0x3d, 0x27, 0xd9, 0xab, 0xbe, 0x11, 0x74, 0xb4, 0xbc,
- 0x68, 0x85, 0xab, 0xbd, 0x82, 0xc0, 0x45, 0xbe, 0x81, 0xea, 0x8c, 0xbd,
- 0xe7, 0xf7, 0x53, 0x3d, 0x89, 0x16, 0xef, 0xbd, 0x5e, 0x21, 0x87, 0x3d,
- 0xe9, 0xc0, 0x49, 0x3e, 0x56, 0x2e, 0x8f, 0xbe, 0xb7, 0x06, 0x23, 0xbe,
- 0x4c, 0x44, 0xd3, 0xbe, 0xf8, 0x82, 0xa2, 0xbb, 0xd2, 0xfe, 0x49, 0x3e,
- 0xb1, 0x15, 0x27, 0xbd, 0x66, 0x01, 0x4c, 0xbe, 0xea, 0xbb, 0x71, 0xbc,
- 0x64, 0xfa, 0x98, 0xbd, 0x8e, 0x74, 0x47, 0x3e, 0xf2, 0x7a, 0xaa, 0xbe,
- 0x1f, 0x21, 0x37, 0xbe, 0x59, 0x65, 0xad, 0xbe, 0xc4, 0x62, 0x85, 0xbe,
- 0x21, 0x94, 0x2b, 0xbd, 0x0c, 0xef, 0x8e, 0xbe, 0x83, 0xab, 0x25, 0xbe,
- 0x85, 0x4f, 0xc0, 0x3d, 0x69, 0x0d, 0x6d, 0x3d, 0x8e, 0x3b, 0xcd, 0x3d,
- 0xf6, 0x2c, 0xc8, 0x3b, 0xe4, 0x1e, 0xc4, 0xbe, 0xad, 0x39, 0xb5, 0xbe,
- 0x83, 0x67, 0xd2, 0xb9, 0x16, 0x34, 0xd8, 0xbd, 0x6c, 0x9b, 0x10, 0xbe,
- 0x1a, 0x2a, 0x83, 0x3b, 0xd4, 0xf4, 0xef, 0xbc, 0x49, 0x83, 0x84, 0xbe,
- 0x88, 0x78, 0xdd, 0xbe, 0x88, 0x66, 0x86, 0xbe, 0x9b, 0xb5, 0x29, 0x3e,
- 0x6f, 0xb1, 0x54, 0xbd, 0xf6, 0x95, 0x0a, 0xbe, 0x9f, 0xc9, 0x24, 0xbe,
- 0xef, 0x73, 0xdf, 0x3d, 0xa6, 0x1f, 0x44, 0xbe, 0x2e, 0x20, 0xc8, 0xbe,
- 0xc4, 0xa5, 0x39, 0xbe, 0x18, 0x9c, 0xa6, 0xbe, 0x4d, 0x32, 0x9b, 0x3c,
- 0x56, 0x6d, 0xab, 0x3d, 0x62, 0x83, 0xe6, 0x3d, 0xbb, 0x23, 0xa6, 0xbc,
- 0x3c, 0xf4, 0x52, 0xbe, 0x14, 0x03, 0x39, 0xbf, 0x5e, 0x38, 0x0e, 0xbe,
- 0x14, 0x9e, 0x32, 0xbc, 0x28, 0x97, 0x72, 0x3d, 0xfa, 0xcc, 0xe2, 0xbd,
- 0xa6, 0x5d, 0x38, 0xbe, 0x24, 0xc6, 0x6d, 0xbe, 0x38, 0x8c, 0xee, 0xbd,
- 0x9e, 0xf4, 0x1c, 0x3c, 0xa0, 0x2a, 0x26, 0x3c, 0x02, 0x4b, 0x77, 0xbd,
- 0x21, 0x63, 0x1c, 0x3e, 0x88, 0xd8, 0x20, 0x3e, 0x88, 0x3f, 0x7a, 0x3c,
- 0x6b, 0xd5, 0xa8, 0xbe, 0xe2, 0x78, 0x83, 0x3e, 0xaf, 0xe0, 0x65, 0x3e,
- 0x2e, 0x70, 0x49, 0x3d, 0x5a, 0x5e, 0x55, 0x3d, 0x01, 0x78, 0xac, 0xbc,
- 0x07, 0x11, 0xc6, 0x3d, 0xcb, 0x01, 0xd7, 0x3d, 0x77, 0x86, 0x46, 0x3d,
- 0x58, 0x3b, 0x54, 0xbe, 0xe0, 0xf3, 0xe3, 0xbc, 0xfe, 0xbf, 0x44, 0x3e,
- 0xf6, 0x32, 0x04, 0xbe, 0x13, 0x0b, 0x8a, 0x3d, 0x4d, 0xe0, 0xb9, 0xbd,
- 0xe4, 0x98, 0x3f, 0x3a, 0x94, 0x49, 0x6f, 0x3e, 0x4b, 0x29, 0x00, 0xbf,
- 0xba, 0x80, 0x26, 0xbe, 0x96, 0xd3, 0xc0, 0xbd, 0x37, 0x30, 0x89, 0xbe,
- 0x87, 0x4d, 0x45, 0xbe, 0xe4, 0x2b, 0xc0, 0xbe, 0x99, 0x59, 0xef, 0x3d,
- 0x78, 0x61, 0x0f, 0x3c, 0x11, 0xa9, 0x80, 0xbd, 0x2f, 0x98, 0x90, 0xbe,
- 0x2e, 0x61, 0x4a, 0xbe, 0xba, 0x91, 0xac, 0x3d, 0xbc, 0xae, 0x3a, 0x3d,
- 0x36, 0x1f, 0x02, 0xbe, 0x76, 0x12, 0x79, 0xbc, 0x7d, 0x90, 0xd8, 0x3d,
- 0xc9, 0x3b, 0xc3, 0x3d, 0xa0, 0xeb, 0x70, 0xbe, 0x12, 0xa4, 0x58, 0xbe,
- 0x76, 0x70, 0x6c, 0xbe, 0x29, 0xdf, 0x8b, 0x3d, 0xb1, 0x85, 0x1e, 0xbc,
- 0xa3, 0xdc, 0x5d, 0xbd, 0x98, 0x4a, 0xa2, 0xbe, 0xc3, 0x03, 0xbb, 0x3d,
- 0x32, 0x8a, 0x56, 0xbe, 0x66, 0x86, 0xa1, 0xbe, 0xeb, 0x00, 0xa3, 0x3d,
- 0xe9, 0x94, 0x13, 0x3c, 0x01, 0xe1, 0x21, 0xbd, 0x4e, 0xbc, 0x5a, 0x3e,
- 0x87, 0xa6, 0x05, 0x3e, 0x03, 0x2a, 0xa6, 0xbe, 0x29, 0xe2, 0x00, 0x3c,
- 0x70, 0x99, 0x5d, 0xbd, 0x6c, 0xa2, 0x32, 0x3c, 0x85, 0xf2, 0xb5, 0xbc,
- 0xeb, 0xd8, 0x6f, 0x3d, 0x01, 0xbe, 0x18, 0xbe, 0xfb, 0x0c, 0x9a, 0x3e,
- 0x2e, 0xcc, 0xa8, 0xbd, 0x6a, 0xe3, 0xa9, 0x3a, 0xc0, 0xe8, 0xed, 0xbe,
- 0xa0, 0x3b, 0x0f, 0xbe, 0xc0, 0xc9, 0x2c, 0xbe, 0x96, 0xa5, 0x84, 0xbe,
- 0xaf, 0x0b, 0x91, 0x3d, 0x89, 0x0a, 0x20, 0x3c, 0xdc, 0x2b, 0x10, 0xbf,
- 0xed, 0x02, 0x5e, 0xbe, 0xe8, 0xd0, 0x28, 0xbc, 0x4e, 0x4a, 0x80, 0xbd,
- 0x88, 0x13, 0xdd, 0xbd, 0x1d, 0xb3, 0x67, 0xbe, 0x5d, 0x85, 0x8d, 0xbc,
- 0xb8, 0xf2, 0x71, 0x3c, 0xba, 0x89, 0x9f, 0x3e, 0xec, 0xf4, 0xf6, 0xbd,
- 0xcf, 0x3e, 0xba, 0xbd, 0xb8, 0xda, 0xc7, 0x3d, 0xb4, 0x09, 0xc9, 0xbd,
- 0x95, 0xe2, 0xa9, 0xbe, 0x3f, 0x68, 0x9d, 0xbd, 0x49, 0xdd, 0x28, 0xbd,
- 0x29, 0x81, 0x18, 0x3d, 0x9e, 0x60, 0x4b, 0xbe, 0x57, 0x3f, 0xb3, 0xbe,
- 0xda, 0xa1, 0x20, 0xbe, 0xb9, 0x18, 0xdc, 0xbd, 0xb2, 0x45, 0xd0, 0xbd,
- 0x49, 0xb6, 0x87, 0xbd, 0x80, 0x3d, 0xae, 0xbc, 0xf3, 0xdc, 0xdd, 0xbd,
- 0xf8, 0x4a, 0x4a, 0xbe, 0xbb, 0xb1, 0x07, 0x3e, 0xc5, 0x17, 0xc6, 0xbe,
- 0x12, 0x40, 0xed, 0x3c, 0x8e, 0x56, 0x03, 0xbe, 0xad, 0x48, 0x35, 0xbe,
- 0x50, 0x34, 0x73, 0xbd, 0xcc, 0xeb, 0x59, 0x3e, 0x28, 0xb6, 0xe3, 0xbd,
- 0x53, 0xee, 0x72, 0x3d, 0x3d, 0xf9, 0x97, 0xbd, 0x57, 0x4f, 0xce, 0xbd,
- 0xea, 0x82, 0xf6, 0x3c, 0xce, 0x0c, 0x04, 0xbd, 0xb1, 0xf5, 0x21, 0xbe,
- 0xe7, 0x19, 0xaf, 0x3e, 0xe1, 0x74, 0xc7, 0xbd, 0x76, 0x99, 0x10, 0xbf,
- 0xc2, 0xe0, 0x05, 0xbd, 0xbf, 0xb3, 0x2b, 0xbd, 0x21, 0x66, 0x14, 0xbe,
- 0x41, 0xee, 0xaf, 0x3e, 0xec, 0x91, 0xe2, 0xbd, 0x27, 0x43, 0x71, 0x3e,
- 0xe3, 0x3a, 0x4e, 0xbe, 0xc6, 0xbb, 0x67, 0x3e, 0xe8, 0xd8, 0x11, 0x3e,
- 0x68, 0xfd, 0x30, 0xbe, 0xbb, 0x16, 0xa1, 0x3d, 0xad, 0x9a, 0x11, 0x3e,
- 0xf9, 0x03, 0xc3, 0x3e, 0xf5, 0x73, 0x18, 0xbd, 0xef, 0xab, 0x0a, 0xbb,
- 0x85, 0xc1, 0x99, 0x3e, 0x7d, 0x4f, 0xd1, 0xbc, 0xf7, 0x9f, 0xdf, 0x3d,
- 0x74, 0x02, 0x78, 0x3d, 0x3d, 0xad, 0xc1, 0xbd, 0xae, 0xc4, 0x97, 0xbc,
- 0x64, 0x52, 0x96, 0x3d, 0xa0, 0xb2, 0x60, 0xbd, 0x99, 0xc9, 0x01, 0xbf,
- 0xca, 0x4c, 0xbb, 0xbc, 0xa2, 0xe3, 0xe4, 0xbc, 0x7c, 0xdb, 0x02, 0xbe,
- 0xd4, 0x6b, 0x3d, 0xbe, 0x80, 0x33, 0x1f, 0x3e, 0x02, 0x9c, 0xa7, 0x3d,
- 0x64, 0xbe, 0x98, 0x3d, 0x7d, 0xfd, 0x66, 0x3d, 0xf2, 0xc0, 0x0d, 0xbe,
- 0xba, 0x41, 0x13, 0x3b, 0xb4, 0x6f, 0xec, 0x3d, 0x25, 0xa4, 0xcb, 0x3e,
- 0x48, 0x00, 0x1f, 0x3b, 0xe8, 0x0d, 0xf9, 0xbd, 0x21, 0x94, 0x2b, 0x3e,
- 0xdb, 0x0c, 0x82, 0x3e, 0xe0, 0xb1, 0x82, 0xbe, 0xe6, 0x49, 0x06, 0xbd,
- 0x69, 0x3a, 0x51, 0x3e, 0x6e, 0xf3, 0x81, 0xbe, 0x7c, 0xae, 0xdb, 0xbd,
- 0xa9, 0x0d, 0x94, 0xbd, 0x81, 0xff, 0x6f, 0xbd, 0xb9, 0x28, 0x3a, 0xbd,
- 0x74, 0x5e, 0xa1, 0xbe, 0x84, 0xd7, 0x95, 0x3d, 0xf0, 0xe7, 0x69, 0xbc,
- 0x68, 0x40, 0xf9, 0xbd, 0x05, 0x85, 0x22, 0xbe, 0x43, 0x45, 0x5b, 0x3e,
- 0x57, 0x3b, 0xe9, 0x3d, 0x38, 0x4f, 0x48, 0xbe, 0xfc, 0xbf, 0x51, 0x3c,
- 0x54, 0xc0, 0x3b, 0x3d, 0xa4, 0xa4, 0x28, 0xbe, 0x0a, 0xd8, 0x28, 0xbe,
- 0xa6, 0x34, 0x35, 0xbe, 0x41, 0x56, 0x37, 0x3e, 0xd3, 0x2e, 0x36, 0xbe,
- 0xe0, 0x8f, 0x96, 0x3e, 0xbd, 0x24, 0xd8, 0xbd, 0x11, 0x7c, 0x87, 0xbd,
- 0xe6, 0xb8, 0x2b, 0x3e, 0x41, 0x82, 0x53, 0xbe, 0xfc, 0x37, 0x0f, 0x3d,
- 0xde, 0x96, 0xa1, 0xbd, 0x40, 0xd1, 0xb6, 0x3c, 0xb5, 0xc1, 0x15, 0x3e,
- 0xab, 0x8a, 0x68, 0xbd, 0x03, 0x20, 0x06, 0x3e, 0x39, 0x1f, 0x5f, 0xbd,
- 0xa0, 0x8f, 0x13, 0xbb, 0x6e, 0x78, 0x0e, 0xbe, 0x09, 0x03, 0x22, 0x3c,
- 0x67, 0xc5, 0xaf, 0xbd, 0xc7, 0x72, 0xeb, 0x3b, 0x28, 0xc0, 0x5a, 0x3c,
- 0xab, 0x8b, 0x6b, 0xbd, 0x7e, 0x0f, 0xb4, 0xbd, 0xb1, 0x8a, 0x35, 0x3e,
- 0x34, 0x33, 0x74, 0xbe, 0x5a, 0x8e, 0x85, 0xbd, 0xbb, 0x92, 0x1e, 0xbf,
- 0x76, 0x91, 0x3b, 0x3e, 0x41, 0xc5, 0xc3, 0xbd, 0x58, 0x2a, 0xf9, 0x3d,
- 0x24, 0x6e, 0x80, 0x3d, 0xa4, 0x9b, 0x0b, 0x3e, 0x1c, 0x60, 0x6e, 0xbd,
- 0xf7, 0x66, 0x9e, 0xbe, 0x9e, 0x5f, 0x68, 0xbe, 0xfa, 0x98, 0x94, 0xbe,
- 0xba, 0x12, 0x9b, 0xbd, 0x2f, 0x25, 0x13, 0x3e, 0x1b, 0xd9, 0x45, 0x3e,
- 0xe5, 0x20, 0x86, 0xbd, 0x06, 0xc9, 0x52, 0xbc, 0x0d, 0xcf, 0x39, 0x3d,
- 0xa1, 0x65, 0xb3, 0xbd, 0xb7, 0xea, 0x6a, 0xbb, 0x72, 0xc5, 0x12, 0xbe,
- 0x87, 0x75, 0x16, 0xbe, 0x96, 0xfc, 0x15, 0xbe, 0xba, 0x82, 0xa0, 0xbc,
- 0x36, 0xde, 0xb0, 0x3c, 0x36, 0x71, 0x60, 0x3e, 0xaf, 0x99, 0x3d, 0xbd,
- 0xab, 0x98, 0x02, 0xbe, 0x8b, 0xef, 0x0f, 0xbe, 0x44, 0x24, 0xc1, 0x3d,
- 0x32, 0x04, 0x2d, 0xbe, 0xf4, 0xa8, 0x18, 0xbe, 0xb1, 0x16, 0x15, 0x3c,
- 0xcb, 0xfa, 0x92, 0xbd, 0x2a, 0xc8, 0xdb, 0xbd, 0x4c, 0x89, 0xa8, 0x3d,
- 0xc5, 0x7b, 0xa9, 0x3c, 0xa8, 0x55, 0xaa, 0xbd, 0xf6, 0x48, 0x3c, 0xbd,
- 0x42, 0x04, 0xb6, 0x3d, 0x38, 0xf6, 0x82, 0xbe, 0x06, 0xd6, 0x28, 0xbd,
- 0xc0, 0xe5, 0x97, 0xbe, 0xa9, 0x92, 0xa7, 0x3e, 0x67, 0xba, 0x39, 0xbd,
- 0x22, 0x07, 0x03, 0xbe, 0x39, 0xf0, 0xe7, 0x3d, 0xf6, 0xe0, 0x65, 0xbe,
- 0x23, 0xf6, 0x99, 0xbd, 0x60, 0x7f, 0xeb, 0x3c, 0x2f, 0xbc, 0x0d, 0x3e,
- 0x93, 0x34, 0xe4, 0x3d, 0x4b, 0x93, 0x23, 0x3e, 0x87, 0x6f, 0x1c, 0xbd,
- 0x37, 0x34, 0x40, 0xbd, 0xf9, 0x79, 0x2a, 0xbe, 0x57, 0x51, 0x41, 0xbe,
- 0xad, 0xb3, 0xb0, 0x3b, 0x73, 0x61, 0x33, 0x3d, 0x00, 0xfa, 0x95, 0xbd,
- 0xad, 0x62, 0x5e, 0xbd, 0x2e, 0xea, 0xaf, 0xbd, 0x87, 0x48, 0xec, 0xbd,
- 0x98, 0x24, 0x16, 0xbe, 0x1b, 0xd0, 0x80, 0x3d, 0xd2, 0xba, 0x8d, 0xbb,
- 0xc2, 0x1a, 0x61, 0xbe, 0xbe, 0xf7, 0x06, 0x3e, 0x00, 0x32, 0xe2, 0x3d,
- 0x7e, 0xac, 0xcc, 0xbc, 0x13, 0xc7, 0xaa, 0xbc, 0x53, 0xd1, 0xd6, 0x3d,
- 0x51, 0xd6, 0xa3, 0x3d, 0xee, 0x5c, 0xdd, 0xbd, 0x00, 0xd0, 0x58, 0x3c,
- 0xdb, 0x29, 0xf8, 0xbd, 0xf1, 0xc7, 0x0e, 0x3e, 0x81, 0xea, 0x7e, 0x3c,
- 0xb4, 0xfc, 0x0c, 0x3e, 0x4a, 0x91, 0x9c, 0x3c, 0xb0, 0xd3, 0xff, 0x3d,
- 0x76, 0x3f, 0x00, 0xbe, 0x87, 0xb2, 0xcb, 0x3d, 0x5a, 0x2a, 0x26, 0xbd,
- 0x74, 0x58, 0xe7, 0xbc, 0x72, 0x7e, 0xd5, 0xbd, 0x99, 0xe8, 0x78, 0xbd,
- 0xe7, 0x54, 0x38, 0x3c, 0x95, 0x0c, 0x1a, 0xbe, 0x8e, 0x8a, 0xbe, 0xbd,
- 0xbb, 0xd8, 0xb8, 0xbd, 0x64, 0x57, 0xab, 0xbd, 0x87, 0x4b, 0xd9, 0xbd,
- 0xdd, 0xe0, 0x40, 0x3d, 0xcb, 0x90, 0xcc, 0x3c, 0x07, 0x00, 0x04, 0x3e,
- 0xb5, 0x3b, 0x27, 0x3b, 0xfc, 0x07, 0xd2, 0xbd, 0x55, 0x2c, 0x0d, 0xbe,
- 0xcf, 0xc1, 0xab, 0x3d, 0x7e, 0xcd, 0x09, 0xbe, 0x30, 0x10, 0xd8, 0x3d,
- 0xac, 0xff, 0x1a, 0xbd, 0x5a, 0x90, 0x0e, 0xbe, 0x6c, 0xf9, 0x2b, 0x3d,
- 0x06, 0xfe, 0xd5, 0xbc, 0xd8, 0x15, 0xeb, 0xbc, 0x54, 0xbc, 0x06, 0x3e,
- 0xad, 0x70, 0xbe, 0x3d, 0xd1, 0xf7, 0xc5, 0xbd, 0xda, 0x4a, 0xab, 0xbd,
- 0x82, 0xa6, 0xac, 0xbd, 0x36, 0x20, 0xb0, 0x3b, 0x42, 0x91, 0xbd, 0x3d,
- 0x3a, 0xe5, 0x05, 0xbe, 0x37, 0x19, 0xaa, 0xbc, 0xc9, 0xa0, 0x4c, 0x3b,
- 0xcd, 0x44, 0xae, 0x3c, 0x71, 0xab, 0xa4, 0xbd, 0x1e, 0x97, 0xe5, 0xbd,
- 0x79, 0x31, 0x0a, 0xbe, 0x5a, 0x09, 0x21, 0x3d, 0xd3, 0x84, 0xdb, 0xbd,
- 0xc9, 0x5e, 0xa8, 0x3c, 0xe4, 0x25, 0xcf, 0x3d, 0x22, 0x4c, 0x08, 0xbd,
- 0x57, 0xa7, 0x84, 0x3d, 0x75, 0xfa, 0x58, 0x3e, 0x78, 0x04, 0x8d, 0x3c,
- 0x79, 0x95, 0xcc, 0xbc, 0x57, 0x08, 0x97, 0xbd, 0x66, 0x6f, 0x44, 0xbd,
- 0x5a, 0x5d, 0x35, 0xbc, 0x0c, 0x05, 0xcf, 0x3d, 0x44, 0xf6, 0xdf, 0x3d,
- 0x8d, 0x4b, 0x06, 0xbe, 0x4a, 0xef, 0xba, 0x3d, 0x46, 0x42, 0xcf, 0xbd,
- 0xc3, 0xa3, 0xa7, 0xbc, 0xfc, 0xf8, 0xef, 0xbd, 0xe6, 0xcc, 0x85, 0xbd,
- 0xd8, 0xd4, 0x53, 0xbd, 0x5a, 0x8c, 0xb1, 0x3b, 0x02, 0xdc, 0x03, 0x3c,
- 0xbe, 0x7b, 0x0c, 0x3d, 0x6a, 0xde, 0xec, 0xbd, 0x8b, 0x93, 0x07, 0x3e,
- 0xda, 0x02, 0x9b, 0x3b, 0xa4, 0x25, 0x90, 0xbd, 0xeb, 0x5f, 0x1c, 0x3d,
- 0xae, 0x58, 0x1c, 0xbd, 0xc0, 0x48, 0xf5, 0x3d, 0x62, 0xfa, 0x2f, 0xbc,
- 0x57, 0x8c, 0x2f, 0xbd, 0xb7, 0x34, 0x02, 0x3e, 0xca, 0x0d, 0x3d, 0x39,
- 0xb1, 0x76, 0x0f, 0x3e, 0xa7, 0x06, 0x0b, 0xbc, 0x8d, 0xc2, 0x37, 0x3d,
- 0xea, 0xb3, 0xeb, 0x3d, 0xfa, 0x1c, 0x89, 0xb8, 0xef, 0xd9, 0xd4, 0xbd,
- 0x68, 0x32, 0xef, 0x3c, 0x0e, 0x63, 0x72, 0x3d, 0x0b, 0xa4, 0x7e, 0x3d,
- 0x17, 0x65, 0x51, 0x3d, 0x4f, 0xaf, 0xae, 0x3d, 0x1c, 0x1f, 0xf2, 0xbb,
- 0xb5, 0xbb, 0x0c, 0xbe, 0xa8, 0x8f, 0x3d, 0x3e, 0x3f, 0x24, 0x2a, 0x3d,
- 0x96, 0x2e, 0x9e, 0x3e, 0x21, 0x82, 0xf5, 0x3c, 0xc5, 0xcb, 0x0c, 0xbe,
- 0xed, 0xda, 0x85, 0x3d, 0x35, 0xfb, 0xc7, 0xbd, 0x0c, 0x30, 0x7a, 0x3d,
- 0xe1, 0x69, 0x4b, 0x3e, 0xe3, 0x74, 0xb6, 0xbd, 0x2f, 0x98, 0x05, 0xbe,
- 0x1a, 0xe6, 0x2d, 0x3c, 0x95, 0x0a, 0x09, 0xbd, 0x28, 0x07, 0xb5, 0xbd,
- 0x3c, 0x03, 0x17, 0xbe, 0x91, 0xa1, 0xb6, 0x3d, 0xde, 0xd5, 0xc1, 0x3d,
- 0x78, 0x06, 0x09, 0xbe, 0xf6, 0x7d, 0x2a, 0x3e, 0x71, 0xaf, 0xa5, 0xbd,
- 0xa9, 0xe4, 0x27, 0xbe, 0x21, 0x1e, 0xf6, 0xbc, 0xbf, 0x79, 0x67, 0x3d,
- 0x32, 0xc9, 0xa8, 0x3d, 0x85, 0x17, 0x2a, 0xbe, 0xc8, 0xb9, 0x05, 0xbd,
- 0xe8, 0x8b, 0x33, 0xbd, 0x92, 0xfe, 0x4f, 0xbe, 0x3d, 0x1e, 0x8c, 0x3d,
- 0x7a, 0xe2, 0x55, 0xbe, 0xbd, 0x5a, 0xd9, 0xbd, 0xd8, 0xd3, 0x41, 0xbb,
- 0xe0, 0x3b, 0x76, 0xbe, 0xf0, 0xea, 0xcc, 0xbc, 0x4b, 0xfe, 0xa2, 0x3c,
- 0xe4, 0x8b, 0xf9, 0x3e, 0x1b, 0xae, 0xa3, 0xbd, 0x7f, 0xad, 0x94, 0xbe,
- 0xce, 0x70, 0x55, 0x3c, 0x00, 0xe1, 0xb5, 0x3c, 0xde, 0x39, 0xf9, 0xbc,
- 0x73, 0xdd, 0x59, 0xbe, 0x4d, 0x51, 0x15, 0x3d, 0xf7, 0x05, 0xa0, 0xbe,
- 0x3e, 0xb3, 0x10, 0xbe, 0xe0, 0x17, 0xf1, 0x3e, 0x4a, 0xfd, 0xbf, 0x3c,
- 0x02, 0x51, 0x09, 0xbd, 0xef, 0x08, 0x41, 0x3e, 0x3c, 0x7b, 0xb6, 0x3e,
- 0x71, 0x63, 0x8f, 0x3e, 0x8a, 0xf4, 0xcc, 0x3d, 0x83, 0x54, 0x17, 0xbe,
- 0x8f, 0x3a, 0x04, 0x3d, 0xe8, 0xbe, 0x55, 0x3e, 0x03, 0xde, 0xfd, 0xbd,
- 0xd9, 0x53, 0x77, 0xbe, 0x79, 0xe7, 0xc4, 0xbe, 0xc7, 0xe1, 0x46, 0x3d,
- 0xcb, 0x9f, 0xb4, 0x3e, 0x0c, 0x7d, 0x99, 0x3d, 0x5c, 0x04, 0x1e, 0xbe,
- 0xae, 0x29, 0x30, 0x3e, 0x88, 0x06, 0xeb, 0xbd, 0xdb, 0xd8, 0x81, 0xbe,
- 0x4f, 0x3f, 0xe8, 0xbc, 0x0e, 0x9b, 0x8d, 0xbe, 0x9a, 0xd6, 0x7e, 0x3e,
- 0x3d, 0x14, 0x1f, 0x3d, 0xb2, 0x70, 0x72, 0x3e, 0x7c, 0x83, 0x60, 0xbd,
- 0xe6, 0xaf, 0x65, 0xbe, 0x6c, 0x45, 0x9f, 0x3d, 0x6e, 0x2c, 0x24, 0x3e,
- 0x55, 0x95, 0xe1, 0xbd, 0x01, 0x62, 0x0c, 0x3d, 0x2d, 0xb1, 0x02, 0xbe,
- 0x26, 0x60, 0x76, 0x3c, 0xae, 0x40, 0x26, 0x3e, 0x6f, 0xcd, 0x86, 0x3e,
- 0x7a, 0x54, 0x36, 0x3d, 0x1f, 0x09, 0xc6, 0x3d, 0x4a, 0x74, 0x1c, 0xbe,
- 0x7b, 0x05, 0x9b, 0xbe, 0x4a, 0x3d, 0xce, 0xbe, 0x18, 0x93, 0x3d, 0xbc,
- 0xff, 0x0b, 0xf2, 0x3d, 0x5d, 0x2a, 0x77, 0x3d, 0x2f, 0x2b, 0x52, 0xbd,
- 0x9d, 0x3d, 0xaf, 0xbe, 0xc4, 0xea, 0xe8, 0x3d, 0x31, 0xbf, 0x36, 0x3e,
- 0x40, 0xff, 0x35, 0xbe, 0x5e, 0x0e, 0xac, 0x3e, 0x82, 0xfe, 0x12, 0xbd,
- 0xd9, 0x81, 0xa8, 0x3d, 0x29, 0xb2, 0xb8, 0xbb, 0x50, 0x77, 0x88, 0xbd,
- 0x17, 0xf5, 0x96, 0x3e, 0xf8, 0x36, 0xc8, 0x3d, 0xb0, 0x1f, 0xa0, 0x3d,
- 0x8e, 0x7a, 0xc7, 0xbd, 0x80, 0xbc, 0x06, 0xbd, 0xae, 0xdd, 0x72, 0xbe,
- 0x80, 0xfc, 0x48, 0x3e, 0xfb, 0x8c, 0xe7, 0xbd, 0x22, 0x8d, 0xa5, 0x3e,
- 0x6c, 0xea, 0x6b, 0xbe, 0x32, 0x3b, 0x0f, 0x3c, 0xd9, 0xa5, 0x0c, 0xbe,
- 0xdc, 0x04, 0x1a, 0xbe, 0x0b, 0x4b, 0x54, 0xbe, 0x1b, 0xed, 0xc2, 0xbe,
- 0x0b, 0x7c, 0x7a, 0xbe, 0xd0, 0x3a, 0x59, 0x3e, 0xdf, 0xdd, 0x73, 0xbc,
- 0xce, 0x0c, 0xd4, 0x3d, 0xdb, 0x39, 0xa1, 0xbe, 0x00, 0xd8, 0xc8, 0x3d,
- 0x30, 0x98, 0x5d, 0xbd, 0x8f, 0x05, 0xe9, 0xbc, 0xc6, 0x2a, 0x86, 0xbd,
- 0x5f, 0xff, 0x20, 0xbe, 0x79, 0x8d, 0xfc, 0x3d, 0x7a, 0xea, 0xe6, 0xbd,
- 0xb2, 0xc8, 0x2b, 0x3e, 0x49, 0x63, 0x54, 0x3e, 0xbf, 0xaf, 0x14, 0xbe,
- 0xcb, 0x62, 0x96, 0x3d, 0xa6, 0x07, 0xe4, 0x3c, 0xdd, 0xd2, 0xcb, 0x3d,
- 0x43, 0x2d, 0xc6, 0x3c, 0x09, 0x64, 0xa9, 0x3e, 0x43, 0xc4, 0xad, 0x3d,
- 0x7f, 0x20, 0x88, 0x3e, 0xf2, 0xcd, 0x33, 0xbd, 0x50, 0xd1, 0x9d, 0xbe,
- 0x13, 0x52, 0xa7, 0xbb, 0xd2, 0xaa, 0x8a, 0xbd, 0x46, 0xb4, 0x28, 0xbd,
- 0x83, 0x54, 0x0d, 0x3e, 0x2a, 0xfa, 0x31, 0x3f, 0xcd, 0x7c, 0x82, 0xbd,
- 0xfe, 0x91, 0xe6, 0xbe, 0x03, 0x24, 0xd9, 0x3e, 0xd0, 0xca, 0x78, 0xbe,
- 0x48, 0x9e, 0x6a, 0xbe, 0x97, 0x71, 0xa9, 0x3d, 0xfc, 0x11, 0x10, 0x3e,
- 0x80, 0xa6, 0x9c, 0x3e, 0xf1, 0x13, 0x09, 0x3e, 0x27, 0x98, 0xfa, 0x3d,
- 0x16, 0xca, 0x16, 0x3d, 0x31, 0xe6, 0x0e, 0xbf, 0x92, 0x99, 0x41, 0x3e,
- 0x15, 0xfa, 0xfa, 0x3d, 0xf8, 0xb7, 0xed, 0x3c, 0x79, 0x46, 0xc2, 0x3d,
- 0x19, 0xf9, 0xb8, 0xbd, 0xf8, 0xdb, 0xc2, 0xbe, 0xef, 0x2e, 0xb6, 0xbd,
- 0xd6, 0x9c, 0xe8, 0xbd, 0xd5, 0xd0, 0x2f, 0xbe, 0x4d, 0x81, 0x01, 0xbe,
- 0x17, 0x0d, 0x35, 0x3d, 0x2b, 0xd6, 0x79, 0x3e, 0x38, 0x34, 0x86, 0xbe,
- 0xf3, 0x08, 0xaa, 0x3d, 0x82, 0x76, 0x8c, 0xbd, 0x3e, 0xe0, 0xda, 0x3d,
- 0x28, 0xa8, 0x81, 0x3d, 0x0f, 0x5d, 0x93, 0x3d, 0x62, 0x14, 0x3f, 0xbd,
- 0x71, 0xbe, 0xdf, 0x3d, 0x86, 0xc0, 0xf0, 0xbc, 0xda, 0x52, 0xf2, 0xbd,
- 0x92, 0xce, 0x6d, 0xbe, 0xf9, 0x7b, 0x25, 0x3d, 0x43, 0x04, 0x28, 0xbb,
- 0xbc, 0x1b, 0xdd, 0xbd, 0xd2, 0x0f, 0x00, 0xbd, 0xe4, 0x87, 0x1f, 0x3e,
- 0x23, 0x5e, 0xe0, 0x3d, 0x95, 0x51, 0x77, 0xbd, 0xfc, 0x05, 0x84, 0x3e,
- 0x24, 0x90, 0x26, 0xbe, 0xc2, 0xc7, 0x10, 0x3d, 0x6a, 0xd1, 0x38, 0x3d,
- 0xa2, 0x99, 0x29, 0x3e, 0x53, 0x99, 0x6d, 0xbd, 0x85, 0xd5, 0x56, 0xbd,
- 0x57, 0x24, 0x63, 0x3d, 0x15, 0x4d, 0x80, 0xbe, 0xcb, 0x39, 0x4a, 0x3e,
- 0x90, 0x23, 0xb5, 0x3d, 0xaf, 0xc9, 0x31, 0xbe, 0xb0, 0x01, 0x25, 0xbe,
- 0xab, 0x48, 0x8a, 0xbc, 0x68, 0xe5, 0xc1, 0x3d, 0xab, 0x98, 0xf0, 0xbd,
- 0xd1, 0x03, 0x0f, 0x3f, 0x18, 0x83, 0x24, 0x3e, 0x29, 0xf6, 0x3a, 0xbe,
- 0xb7, 0xf7, 0xe9, 0x3c, 0x1a, 0x84, 0xdf, 0x3d, 0x9d, 0xc7, 0x26, 0x3e,
- 0x55, 0x0f, 0x6e, 0x3e, 0xc5, 0xfc, 0x78, 0xbe, 0xe9, 0xbc, 0x03, 0xbd,
- 0x03, 0x0d, 0x02, 0x3e, 0x60, 0x78, 0x87, 0x3d, 0xa0, 0x68, 0x44, 0xbd,
- 0x0d, 0x5c, 0xc5, 0xbd, 0x99, 0xc3, 0x41, 0x3d, 0x3b, 0x28, 0x6a, 0xbd,
- 0x6b, 0x50, 0x32, 0xbd, 0x54, 0xf9, 0x9e, 0xbd, 0xe2, 0xe8, 0xc9, 0xbd,
- 0x58, 0x53, 0x0d, 0x3e, 0x16, 0x8c, 0x8a, 0xbd, 0x56, 0x88, 0xa2, 0xbc,
- 0xd5, 0x37, 0xff, 0x3d, 0x61, 0x7c, 0x3f, 0x3d, 0xe2, 0x2c, 0xe0, 0x3d,
- 0x83, 0xcd, 0x29, 0x3d, 0xd2, 0x8a, 0x3e, 0xbe, 0x29, 0x03, 0x31, 0x3e,
- 0x93, 0xf7, 0x6a, 0x3c, 0xbc, 0x94, 0x76, 0x3c, 0x6d, 0x49, 0xe6, 0x3d,
- 0xbb, 0xa2, 0x9b, 0x3d, 0xdb, 0xd4, 0xc1, 0xbd, 0x21, 0xe6, 0x3a, 0x3e,
- 0xbe, 0xc7, 0x55, 0xbe, 0x49, 0x37, 0x2f, 0xbe, 0x14, 0xb7, 0x68, 0xbe,
- 0x78, 0x0d, 0x89, 0x3e, 0x31, 0xc8, 0xa3, 0x3e, 0x4f, 0xce, 0x5f, 0x3e,
- 0xdb, 0x4a, 0x1e, 0x3e, 0x10, 0x15, 0x02, 0x3e, 0x12, 0x5d, 0x5c, 0xbe,
- 0x22, 0xb1, 0x03, 0xbd, 0x40, 0x20, 0x1f, 0xbc, 0xa3, 0x8f, 0x26, 0x3e,
- 0x18, 0xa5, 0x29, 0x3e, 0xb0, 0x6c, 0xff, 0xbd, 0xd5, 0x46, 0x49, 0xbb,
- 0xac, 0xa4, 0x28, 0xbe, 0x84, 0x35, 0xed, 0x3d, 0xe9, 0x73, 0x39, 0xbe,
- 0x6e, 0x13, 0xf2, 0xbd, 0x52, 0x03, 0x9b, 0xbd, 0x5b, 0x45, 0x07, 0x3e,
- 0x93, 0x0f, 0x06, 0x3e, 0xe0, 0xcf, 0xd3, 0xbd, 0xdc, 0x13, 0x98, 0xbd,
- 0x5f, 0x88, 0xa6, 0xbe, 0x26, 0x54, 0x25, 0x3d, 0xe7, 0x17, 0xd6, 0x3e,
- 0x8b, 0x17, 0x99, 0xbc, 0xe9, 0x4f, 0x95, 0x3d, 0x72, 0x46, 0x63, 0x3d,
- 0x18, 0xa9, 0xd8, 0xbc, 0xfa, 0x86, 0x95, 0xbb, 0x70, 0x88, 0x96, 0x3c,
- 0x8d, 0xd6, 0xbc, 0xbd, 0x71, 0x92, 0x9d, 0xbe, 0x47, 0x8e, 0x8b, 0xbd,
- 0x12, 0xaf, 0x26, 0xbe, 0x15, 0x1c, 0xe1, 0x3c, 0x1c, 0x1e, 0xee, 0xbd,
- 0x62, 0x20, 0xb9, 0x3c, 0x0c, 0x6b, 0x36, 0x3e, 0xef, 0xdb, 0xfe, 0xbd,
- 0xe1, 0x8c, 0x05, 0x3c, 0x55, 0x89, 0x9a, 0xbd, 0xd4, 0x22, 0x4d, 0xbe,
- 0x8c, 0xf2, 0x93, 0x3d, 0x84, 0x65, 0xfd, 0x3d, 0xbc, 0xd8, 0xa4, 0x3c,
- 0xf5, 0xd5, 0xb3, 0xbd, 0x71, 0x96, 0x82, 0x3e, 0x86, 0x1e, 0x92, 0xbd,
- 0x3d, 0x5f, 0x7a, 0x3e, 0xd4, 0x3a, 0x49, 0xbe, 0xd0, 0x7f, 0x0a, 0xbe,
- 0x3f, 0xbd, 0x47, 0xbd, 0x71, 0xbf, 0x92, 0xbd, 0x76, 0xf1, 0x15, 0xbf,
- 0x40, 0xec, 0xc9, 0xbe, 0x85, 0x6e, 0xb6, 0x3d, 0xcb, 0x55, 0x2a, 0xbe,
- 0xaa, 0xf5, 0x33, 0xbd, 0x1a, 0xff, 0x52, 0x3d, 0x01, 0xc4, 0x80, 0xbe,
- 0x81, 0x16, 0x1e, 0xbe, 0x4f, 0x07, 0xc3, 0xbc, 0xca, 0x26, 0x1b, 0xbe,
- 0xa1, 0x35, 0x15, 0xbe, 0xbe, 0xa7, 0x9d, 0xbd, 0xd5, 0xf7, 0x43, 0xbe,
- 0x5c, 0x42, 0xcf, 0x3d, 0x21, 0x7c, 0xd3, 0x3b, 0x52, 0xc1, 0xda, 0xbd,
- 0xbd, 0x0a, 0xf4, 0xbe, 0xf8, 0x53, 0x82, 0xbe, 0x36, 0xf4, 0xb2, 0xbb,
- 0xd3, 0x08, 0xbe, 0xbd, 0xb7, 0x8c, 0xd1, 0x3d, 0x0c, 0x22, 0x40, 0xbe,
- 0x5f, 0x89, 0xce, 0xbe, 0x48, 0x9b, 0x3b, 0xbe, 0xd4, 0x85, 0xbc, 0x3e,
- 0x5a, 0xb6, 0x3c, 0x3e, 0x3f, 0x8d, 0x6e, 0xbe, 0xa3, 0x25, 0x82, 0xbd,
- 0x9a, 0x99, 0x5b, 0x3e, 0x37, 0x8d, 0x9c, 0xbd, 0x65, 0x55, 0x4f, 0x3e,
- 0x26, 0x4d, 0xdc, 0x3d, 0x78, 0x34, 0x13, 0x3b, 0x0c, 0xef, 0xb2, 0x3a,
- 0xc0, 0x52, 0x6b, 0x3e, 0xd2, 0xa7, 0x72, 0xbe, 0x6f, 0x1f, 0x64, 0x3d,
- 0x6d, 0x8d, 0x04, 0xbe, 0x39, 0xfd, 0x1f, 0x3e, 0xab, 0xca, 0x0e, 0xbf,
- 0x28, 0x65, 0xd4, 0x3e, 0xcf, 0x90, 0x83, 0xbe, 0xfc, 0xa4, 0x7e, 0x3c,
- 0x44, 0x3c, 0xf1, 0x3e, 0x92, 0x07, 0xb4, 0x3d, 0xb7, 0x9b, 0xa8, 0x3e,
- 0x8b, 0xdc, 0x8c, 0x3d, 0x1f, 0x95, 0xd4, 0x3c, 0x8a, 0x6c, 0x1e, 0xbc,
- 0xc6, 0x99, 0x50, 0xbe, 0xba, 0x4f, 0x8e, 0x3e, 0x80, 0x87, 0x60, 0x3d,
- 0x82, 0x6a, 0x3a, 0x3d, 0x9e, 0x30, 0x19, 0xbd, 0x23, 0x16, 0xf2, 0xbd,
- 0x3d, 0x4f, 0xa4, 0xbe, 0x74, 0xe6, 0x02, 0x3e, 0xce, 0xf3, 0x9b, 0xbe,
- 0xd1, 0x14, 0xd4, 0xbe, 0xd4, 0x39, 0xab, 0xbe, 0x23, 0x78, 0xb2, 0xbd,
- 0xa3, 0x19, 0x31, 0xbd, 0xba, 0x88, 0x03, 0xbe, 0x86, 0xfa, 0x43, 0xbd,
- 0x1e, 0x65, 0x7e, 0xbd, 0x96, 0x9d, 0x0d, 0x3e, 0x85, 0xb4, 0xab, 0x3d,
- 0xa5, 0xa3, 0xcb, 0x3d, 0xa9, 0x9f, 0x4f, 0x3e, 0xed, 0xc4, 0xe4, 0x3e,
- 0x98, 0x8e, 0xcc, 0x3d, 0xa5, 0xfc, 0x46, 0xbe, 0x22, 0xd5, 0x45, 0x3e,
- 0x3d, 0xb2, 0x95, 0x3d, 0x4b, 0x43, 0x6b, 0xbe, 0x4d, 0x13, 0x94, 0x3e,
- 0x4f, 0xdd, 0xa2, 0x3e, 0x74, 0xe1, 0x87, 0x3d, 0x30, 0x35, 0x61, 0xbe,
- 0x42, 0x30, 0xae, 0x3a, 0x85, 0x45, 0x0c, 0x3e, 0x0d, 0xd1, 0xc2, 0x3e,
- 0x24, 0x74, 0xeb, 0x3d, 0x25, 0x14, 0x14, 0xbd, 0xce, 0x89, 0x8d, 0xbe,
- 0xeb, 0x2c, 0xd3, 0xbc, 0x48, 0x14, 0x13, 0xbe, 0x0f, 0x6b, 0xba, 0x3d,
- 0x48, 0x15, 0x12, 0x3e, 0x98, 0x6d, 0xbc, 0x3d, 0xa8, 0x3c, 0x84, 0xbd,
- 0x3d, 0x75, 0x0b, 0x3e, 0xab, 0xc4, 0x9e, 0xbd, 0xcd, 0x8d, 0xa2, 0x3c,
- 0x96, 0xd0, 0x1a, 0x3d, 0x40, 0xbc, 0x40, 0xbd, 0x9a, 0x0e, 0x94, 0x3e,
- 0xcf, 0x52, 0xce, 0xbd, 0x06, 0x20, 0x85, 0xbe, 0x89, 0x1e, 0x9c, 0x3d,
- 0x0d, 0x26, 0x3d, 0xbe, 0xa0, 0xde, 0xf9, 0x3e, 0xde, 0x3c, 0xe5, 0xbd,
- 0x95, 0x29, 0x90, 0x3b, 0xd6, 0x10, 0xe1, 0xbd, 0x67, 0x48, 0xb9, 0xbe,
- 0x14, 0x56, 0xcb, 0x3d, 0x30, 0x33, 0xa0, 0x3e, 0xba, 0xb9, 0xcf, 0xbd,
- 0xdb, 0xb1, 0x0e, 0x3e, 0xfb, 0x65, 0x3d, 0xbe, 0xb7, 0xfa, 0x35, 0xbe,
- 0x4c, 0x40, 0x24, 0xbe, 0x6f, 0x42, 0x9d, 0x3e, 0xab, 0x7d, 0xe2, 0x3c,
- 0x0a, 0x6f, 0x24, 0xbe, 0x27, 0x81, 0xf3, 0x3e, 0xdd, 0xb5, 0x70, 0xbd,
- 0x58, 0xab, 0x98, 0xbe, 0x17, 0x77, 0xe9, 0x3e, 0xb5, 0xb1, 0xa6, 0x3e,
- 0xfa, 0x57, 0x40, 0xbe, 0x99, 0xad, 0x4c, 0xbe, 0xe1, 0xd8, 0x9c, 0x3e,
- 0x38, 0x06, 0x75, 0x3e, 0x23, 0xd8, 0xc8, 0x3e, 0x52, 0x6f, 0x07, 0xbd,
- 0x52, 0xa9, 0x01, 0xbe, 0x8f, 0x0e, 0x5f, 0xbb, 0xd9, 0x02, 0x5a, 0xbe,
- 0x1d, 0xfa, 0x2d, 0xbe, 0x2a, 0x48, 0x3d, 0xbe, 0x17, 0x56, 0x76, 0x3c,
- 0x7a, 0x10, 0x18, 0xbe, 0x93, 0x96, 0xb5, 0xbe, 0xca, 0x37, 0x2a, 0xbe,
- 0x98, 0x9e, 0x30, 0xbe, 0x87, 0x5a, 0x9b, 0xbe, 0xc7, 0xce, 0x7f, 0xbe,
- 0x39, 0x66, 0x4c, 0x3d, 0x72, 0x6c, 0x03, 0xbe, 0x62, 0x42, 0xa2, 0xbd,
- 0x54, 0xef, 0x31, 0x3c, 0x54, 0xeb, 0xa0, 0xbd, 0x7a, 0xb1, 0xa4, 0x3d,
- 0xf7, 0xe1, 0x4f, 0xbe, 0xaf, 0x41, 0x49, 0xbe, 0x80, 0x75, 0xed, 0x3c,
- 0xd8, 0x17, 0x85, 0xbb, 0xbc, 0x14, 0x34, 0x3d, 0xca, 0xd4, 0x47, 0xbc,
- 0x38, 0x91, 0xdf, 0xbd, 0xf4, 0x54, 0xb5, 0xbe, 0x29, 0xa1, 0x97, 0xbe,
- 0x4a, 0x51, 0x3b, 0xbe, 0x18, 0xa9, 0x29, 0xbe, 0x10, 0x26, 0x91, 0xbe,
- 0xbc, 0x0f, 0x61, 0xbe, 0x5b, 0xc4, 0x9c, 0xbd, 0x36, 0xca, 0x60, 0xbe,
- 0x4f, 0x41, 0x1c, 0x3d, 0x5f, 0x33, 0xe4, 0xbd, 0x77, 0xf7, 0x0e, 0x3e,
- 0xab, 0xbe, 0x6a, 0xbd, 0x47, 0x9c, 0x2b, 0xbd, 0x9a, 0x48, 0x93, 0xbe,
- 0x10, 0x74, 0x05, 0xbe, 0x59, 0xbf, 0x0d, 0x3e, 0xf0, 0x99, 0x24, 0xbe,
- 0xe7, 0x2f, 0x8c, 0xbd, 0x2f, 0x66, 0x5c, 0xbe, 0xeb, 0xe6, 0xe1, 0x3d,
- 0x10, 0x52, 0xb7, 0xbc, 0x41, 0x9b, 0x93, 0xbe, 0x2b, 0x54, 0x3f, 0x3b,
- 0x39, 0x04, 0x9c, 0x3d, 0x1e, 0x77, 0xbc, 0xbd, 0xc9, 0xa1, 0x0a, 0xbe,
- 0x44, 0xe3, 0xbc, 0xbd, 0x68, 0xa4, 0xdb, 0xbc, 0x1f, 0x9d, 0xf0, 0xbd,
- 0xe4, 0xf9, 0x28, 0xbe, 0x94, 0x5c, 0x8e, 0xbe, 0x4e, 0x08, 0xff, 0xbd,
- 0x89, 0x6b, 0x8f, 0xbd, 0x14, 0x61, 0xf2, 0xbd, 0x51, 0xbc, 0x8e, 0xbe,
- 0xf9, 0x91, 0xe2, 0xbd, 0xea, 0xb4, 0x13, 0xbe, 0x79, 0x5b, 0xcd, 0xbc,
- 0x3b, 0xdd, 0x50, 0xbd, 0xc8, 0xd8, 0x1a, 0xbe, 0xff, 0x86, 0x0b, 0xbd,
- 0xe6, 0x99, 0x4b, 0x3c, 0xb2, 0x7d, 0x20, 0x3e, 0xaa, 0x74, 0x44, 0xbe,
- 0xd3, 0xa4, 0x2b, 0xbd, 0xe1, 0x7e, 0x82, 0xbd, 0x56, 0xbe, 0xdb, 0x3b,
- 0xd6, 0x47, 0x27, 0xbe, 0xb1, 0x51, 0x43, 0xbe, 0x8b, 0x3c, 0xff, 0xbe,
- 0xf1, 0x6f, 0x3a, 0xbd, 0xb2, 0x15, 0xbb, 0xbd, 0x5b, 0xa6, 0x5b, 0xbe,
- 0x0e, 0xa1, 0x13, 0xbf, 0x85, 0xc2, 0xab, 0x3d, 0x39, 0x8e, 0xec, 0xbe,
- 0xaf, 0xb0, 0x3e, 0xbd, 0x8a, 0x6e, 0x69, 0xbe, 0xeb, 0xc6, 0x96, 0xbd,
- 0xe7, 0x6a, 0x8d, 0xbd, 0x78, 0x36, 0x89, 0xbe, 0x7a, 0x52, 0xe5, 0x3d,
- 0xf3, 0xc5, 0x77, 0xbe, 0x38, 0x16, 0xc4, 0xbd, 0x55, 0xc9, 0x32, 0x3c,
- 0xf1, 0x69, 0x28, 0xbe, 0xe0, 0xe5, 0x0a, 0xbe, 0xdf, 0xe9, 0x19, 0xbd,
- 0xfc, 0x86, 0xcb, 0x3d, 0x29, 0x95, 0x09, 0xbe, 0xb2, 0x9d, 0xd8, 0x3b,
- 0xa8, 0x7d, 0x9b, 0xbd, 0x1f, 0xca, 0xa2, 0x3d, 0xca, 0xdb, 0x12, 0x3b,
- 0xc8, 0x6a, 0xfd, 0x3c, 0xca, 0xfa, 0xbf, 0x3d, 0xfd, 0xf1, 0x39, 0xbe,
- 0x4c, 0x49, 0x7e, 0xbe, 0x1e, 0x1a, 0x30, 0xbd, 0x6d, 0x0d, 0xdf, 0xbc,
- 0x32, 0xd9, 0x8e, 0xbe, 0xc3, 0xe9, 0x0e, 0x3e, 0xf9, 0x84, 0x44, 0x3d,
- 0x44, 0x4b, 0x4d, 0xbe, 0x6c, 0x6f, 0x4b, 0xbe, 0x8e, 0x31, 0x72, 0x3c,
- 0x9f, 0x17, 0x90, 0xbc, 0x42, 0xe5, 0x2a, 0xbe, 0x2e, 0xcc, 0xad, 0xbd,
- 0xfe, 0x54, 0x05, 0x3d, 0xe2, 0xc6, 0xe7, 0xbd, 0xe3, 0xb7, 0x86, 0x3d,
- 0x82, 0xd5, 0x0e, 0xbe, 0x9a, 0xd0, 0xc4, 0xbd, 0x08, 0xdb, 0xcf, 0xbe,
- 0xd5, 0xa7, 0x80, 0xbe, 0x27, 0x20, 0x9c, 0x3c, 0x8a, 0x65, 0x54, 0xbe,
- 0xe7, 0xe1, 0x7a, 0xbc, 0x29, 0xeb, 0xb6, 0xbe, 0xdd, 0xa2, 0x99, 0x3c,
- 0x39, 0xc3, 0xd5, 0xbd, 0xd2, 0xc7, 0x8e, 0xbe, 0xc1, 0x99, 0x90, 0x3d,
- 0xef, 0xe0, 0x69, 0x3d, 0x45, 0x44, 0x35, 0x3d, 0x95, 0xcc, 0xe6, 0xbd,
- 0xd3, 0xe0, 0xa2, 0xbd, 0x33, 0x78, 0x23, 0xbe, 0x29, 0x7c, 0x0a, 0xbe,
- 0x99, 0xbd, 0xe6, 0x3c, 0x7c, 0xa3, 0x1e, 0x3e, 0xd4, 0x9a, 0x9d, 0xbc,
- 0xf2, 0xe9, 0x08, 0xbe, 0x39, 0xc2, 0xc7, 0x3d, 0x89, 0xc9, 0x70, 0xbe,
- 0x0a, 0x1f, 0x60, 0xbd, 0x93, 0x79, 0x92, 0x3e, 0x94, 0x30, 0x86, 0x3d,
- 0xd1, 0x23, 0xc8, 0x3c, 0x9f, 0xed, 0x02, 0x3c, 0xf7, 0x90, 0xbe, 0x3d,
- 0x2e, 0x43, 0xed, 0x3c, 0xa3, 0x19, 0x66, 0x3e, 0x80, 0xc8, 0xd9, 0xbd,
- 0xae, 0x1f, 0xcc, 0x3d, 0x21, 0xf7, 0x97, 0x3d, 0x03, 0x62, 0x95, 0x3e,
- 0x47, 0x01, 0xf1, 0xbd, 0xfb, 0xe1, 0xd2, 0xbd, 0xed, 0x09, 0x48, 0xbe,
- 0x11, 0x78, 0x3b, 0xbd, 0x7b, 0xc7, 0x76, 0xbe, 0xc8, 0x59, 0x34, 0xbe,
- 0x95, 0x94, 0x09, 0xbe, 0x66, 0xfd, 0x1e, 0xbe, 0x7f, 0x4c, 0x8e, 0xbe,
- 0x1e, 0x58, 0x42, 0xbe, 0x8d, 0xb6, 0x0e, 0x3e, 0x5e, 0xe4, 0xfd, 0x3d,
- 0x44, 0xdd, 0x7d, 0xbe, 0x7e, 0x21, 0x2f, 0xbd, 0xb2, 0xc1, 0x1c, 0xbe,
- 0xef, 0x8e, 0x98, 0x3e, 0x92, 0x64, 0x09, 0xbe, 0xd9, 0x1f, 0x63, 0xbe,
- 0x0b, 0x3d, 0x14, 0x3d, 0x6e, 0x24, 0x80, 0x3c, 0xc8, 0x9a, 0xaf, 0xbc,
- 0xe7, 0xef, 0x6e, 0x3e, 0xb5, 0xe2, 0x87, 0xbd, 0x16, 0xf9, 0x19, 0x3e,
- 0x60, 0xc1, 0xe6, 0xbc, 0xa5, 0xe0, 0x52, 0x3e, 0xe6, 0xfd, 0xf1, 0x3d,
- 0xfd, 0xb6, 0x44, 0xbe, 0x31, 0x80, 0x18, 0x3e, 0x25, 0x51, 0x2d, 0x3d,
- 0xbc, 0xda, 0x2e, 0xbd, 0xc5, 0xa7, 0xfa, 0x3d, 0xc9, 0x9c, 0x83, 0xbd,
- 0x74, 0x3f, 0x93, 0xbe, 0xea, 0x9f, 0x5d, 0xbd, 0x80, 0x58, 0x21, 0x3d,
- 0x95, 0xdd, 0x93, 0x3c, 0xa3, 0x55, 0x1f, 0x3e, 0xeb, 0x27, 0xb5, 0xbd,
- 0x5a, 0x69, 0x54, 0xba, 0x15, 0xa6, 0xe2, 0xbd, 0x10, 0x7f, 0x56, 0x3d,
- 0xdf, 0xeb, 0x32, 0x3d, 0x11, 0x0b, 0xb9, 0xbd, 0x34, 0x11, 0x0c, 0x3c,
- 0x2b, 0x25, 0xfe, 0xbd, 0x65, 0xa1, 0x95, 0x3d, 0x5c, 0x07, 0xfc, 0x3d,
- 0x04, 0x4b, 0xf6, 0xbd, 0x42, 0x84, 0x08, 0xbd, 0x3f, 0xcd, 0xb8, 0xbd,
- 0x76, 0x93, 0x4c, 0x3e, 0xe5, 0xa6, 0x22, 0xbe, 0xd5, 0xc0, 0x6a, 0x3d,
- 0xfd, 0xfd, 0xf5, 0xbd, 0x3d, 0xa3, 0x47, 0xbe, 0x97, 0xb9, 0x26, 0xbe,
- 0xd1, 0x1d, 0xe6, 0xbd, 0x63, 0xba, 0xd4, 0xbb, 0x5c, 0x28, 0x1d, 0x3e,
- 0xb4, 0xae, 0x9a, 0xbe, 0x74, 0x4f, 0x21, 0xbe, 0xaa, 0x2e, 0x3b, 0xbe,
- 0x6a, 0xa2, 0x9a, 0xbd, 0x82, 0x06, 0x8a, 0xbc, 0x3a, 0xfb, 0x6c, 0x3e,
- 0x05, 0xd0, 0x43, 0xbe, 0x64, 0x04, 0x25, 0xbd, 0xd5, 0x42, 0xa3, 0xbc,
- 0x45, 0xc1, 0x84, 0x3d, 0xbe, 0x9b, 0x4f, 0xbe, 0x80, 0x26, 0xa4, 0x3c,
- 0xb9, 0x00, 0x45, 0x3e, 0x68, 0x45, 0x78, 0x3c, 0x29, 0x4d, 0x16, 0xbd,
- 0xe5, 0xd2, 0x0f, 0xbe, 0x62, 0x68, 0xab, 0xbd, 0xb8, 0xc5, 0xbc, 0xbe,
- 0x9a, 0xa0, 0x63, 0xbd, 0x5e, 0x65, 0x5a, 0x3e, 0xa7, 0x0c, 0x8f, 0xbe,
- 0x9b, 0x65, 0x08, 0x3c, 0x99, 0xc9, 0xec, 0xbd, 0xbf, 0x8b, 0xf1, 0xbd,
- 0x77, 0x4d, 0x84, 0xbe, 0x76, 0x6a, 0xbe, 0xbe, 0x0c, 0x0d, 0xc3, 0xbc,
- 0x32, 0x35, 0x87, 0xbe, 0xf7, 0x9f, 0x4a, 0xbe, 0xf0, 0xd1, 0x99, 0x3d,
- 0xf1, 0x74, 0x98, 0x3d, 0x6c, 0xb0, 0xc8, 0x3d, 0x0d, 0x18, 0x5c, 0xbe,
- 0xd1, 0x40, 0x65, 0xbe, 0x0d, 0xe6, 0x02, 0x3d, 0x8d, 0x3b, 0x25, 0x3e,
- 0xbe, 0x40, 0xc2, 0x3d, 0x91, 0x04, 0xe8, 0xbb, 0x9a, 0x4b, 0x22, 0x3d,
- 0x65, 0x4e, 0x87, 0xbd, 0xad, 0xfa, 0x2b, 0x3e, 0xdc, 0xea, 0xa3, 0xbd,
- 0x7a, 0x68, 0x14, 0x3d, 0x5f, 0x3e, 0x14, 0xbe, 0xa2, 0x82, 0x24, 0x3d,
- 0x21, 0x7a, 0xc9, 0xbd, 0x06, 0x1b, 0xdd, 0x3c, 0x83, 0x3e, 0xbf, 0xbd,
- 0x7a, 0x0c, 0x1f, 0xbe, 0xcc, 0xd9, 0xc1, 0xbd, 0x9c, 0xc8, 0x46, 0xbd,
- 0x81, 0x5f, 0x91, 0x3b, 0xbd, 0x5f, 0x90, 0x3e, 0xba, 0x92, 0x7b, 0x3e,
- 0x49, 0xc3, 0xae, 0xbd, 0x93, 0xe2, 0x76, 0x3c, 0x21, 0x90, 0x0c, 0xbe,
- 0x7b, 0xf4, 0xa7, 0xbe, 0x54, 0x80, 0xb4, 0xbe, 0xdb, 0x66, 0x5a, 0xbe,
- 0xe1, 0xbe, 0x81, 0x3d, 0x94, 0x59, 0x94, 0x3c, 0xa3, 0x59, 0x48, 0xbe,
- 0xc4, 0x9e, 0x0b, 0xbe, 0xd8, 0xfe, 0x00, 0x3d, 0xce, 0x65, 0xc1, 0xbe,
- 0xe8, 0xad, 0x60, 0x3d, 0x8f, 0x35, 0x9f, 0xbe, 0x73, 0xbb, 0x10, 0xbd,
- 0x9b, 0x0e, 0xb8, 0xbe, 0xdc, 0x22, 0xda, 0xbb, 0xc9, 0x3e, 0xf2, 0xba,
- 0x66, 0xe7, 0x89, 0xbd, 0x8b, 0x5d, 0x8f, 0xbe, 0xe7, 0x2f, 0x12, 0xbe,
- 0x75, 0x4d, 0x8f, 0x3c, 0x75, 0xe4, 0xb8, 0xbd, 0xb5, 0xc1, 0x45, 0x3d,
- 0x4c, 0xc3, 0xa0, 0xbd, 0xfc, 0x67, 0x99, 0x3d, 0xd3, 0x2e, 0x29, 0x3d,
- 0x95, 0x02, 0x41, 0x3d, 0x7b, 0x1a, 0xb1, 0xbd, 0x27, 0x08, 0x8d, 0x3d,
- 0xf8, 0x7d, 0x3c, 0xbe, 0x48, 0x5e, 0x26, 0xbe, 0x84, 0xb5, 0xb3, 0xbb,
- 0x84, 0x48, 0x8d, 0xbe, 0xae, 0xcd, 0xcb, 0x3d, 0xf4, 0x00, 0x70, 0xbe,
- 0x99, 0x62, 0x53, 0xbd, 0x2e, 0xea, 0xa2, 0x3e, 0xc9, 0x47, 0x43, 0xbc,
- 0xcc, 0xeb, 0xf6, 0x3d, 0xa7, 0x20, 0x07, 0xbe, 0xf5, 0xdd, 0xb1, 0xbe,
- 0xb6, 0x2d, 0xdf, 0xbd, 0xab, 0x04, 0x05, 0x3e, 0xbb, 0xa3, 0x42, 0xbe,
- 0xf1, 0x6e, 0x94, 0xbd, 0x4d, 0xc3, 0x82, 0xbe, 0x40, 0xe1, 0x12, 0xbe,
- 0xeb, 0xbf, 0x00, 0xbe, 0x25, 0xfe, 0x4e, 0xbe, 0x38, 0x37, 0x0c, 0x3e,
- 0x33, 0x57, 0xb3, 0xbd, 0x20, 0xc1, 0xa7, 0x3d, 0x88, 0xaa, 0x87, 0xbe,
- 0x50, 0xf8, 0xb5, 0xbd, 0x8c, 0x1e, 0x2a, 0xbd, 0x91, 0xce, 0x1b, 0xbe,
- 0xfb, 0xd1, 0xb9, 0x3d, 0x4e, 0x91, 0x49, 0xbe, 0x3c, 0x2c, 0x47, 0xbe,
- 0x10, 0xcb, 0xa5, 0xbd, 0x6f, 0x7a, 0x92, 0xbe, 0x13, 0xcb, 0xbd, 0xbe,
- 0x86, 0xd2, 0x5a, 0xbe, 0xd3, 0xde, 0x7b, 0x3d, 0x01, 0x59, 0x57, 0x3c,
- 0x9a, 0xf8, 0x22, 0xbe, 0x5a, 0x70, 0x77, 0xbd, 0xfa, 0x30, 0xb2, 0xbe,
- 0xd7, 0x96, 0x30, 0x3c, 0x24, 0xa0, 0xc6, 0xbe, 0x52, 0x2a, 0x06, 0x3e,
- 0xd0, 0x18, 0xf5, 0x3d, 0xd7, 0xa7, 0x30, 0xbd, 0x0a, 0xf5, 0x6e, 0xbe,
- 0x5a, 0xb6, 0x10, 0xbe, 0xe7, 0xfd, 0x10, 0x3e, 0x72, 0x31, 0xb6, 0x3d,
- 0x53, 0xee, 0xd7, 0xbc, 0xed, 0x61, 0x0e, 0xbb, 0x65, 0x2a, 0x9d, 0xbe,
- 0x08, 0xb7, 0x92, 0x3d, 0x73, 0x0b, 0x66, 0x3c, 0x99, 0x46, 0x5d, 0xbe,
- 0x77, 0xc5, 0x1e, 0x3e, 0x5d, 0x6d, 0x36, 0xbd, 0x3e, 0x04, 0xf2, 0xbd,
- 0xf8, 0x60, 0x61, 0xbe, 0x5b, 0xa1, 0x4c, 0xbe, 0x0d, 0x32, 0x86, 0x3d,
- 0x33, 0x74, 0xa5, 0x3e, 0x46, 0x1e, 0x44, 0x3d, 0xc3, 0x30, 0x54, 0xbe,
- 0xb4, 0xb5, 0x50, 0xbd, 0x03, 0x0b, 0x26, 0xbe, 0x45, 0x62, 0xe1, 0xbd,
- 0x1f, 0x73, 0x25, 0xbe, 0xb1, 0xfd, 0x3f, 0xbe, 0x81, 0x50, 0xc4, 0xbd,
- 0xac, 0x34, 0xd3, 0xbb, 0x7d, 0x99, 0x43, 0x3c, 0xf6, 0x2e, 0xfb, 0x3c,
- 0x59, 0xfb, 0x8e, 0xbe, 0xb2, 0x2d, 0x51, 0xbe, 0xa0, 0x59, 0xac, 0x3c,
- 0xbc, 0x39, 0x2e, 0xbe, 0xbb, 0x84, 0x8e, 0xbe, 0x9e, 0xa6, 0x45, 0xbe,
- 0x21, 0x58, 0x51, 0xbc, 0x4e, 0x19, 0x30, 0x3c, 0xd2, 0xef, 0xee, 0xbd,
- 0x0e, 0x92, 0x5a, 0xbe, 0x37, 0x78, 0x95, 0xbe, 0x4a, 0x1c, 0x90, 0xbe,
- 0x25, 0xb2, 0x55, 0xbe, 0x4c, 0xfd, 0x95, 0xbe, 0x3a, 0x2c, 0x74, 0xbd,
- 0x93, 0xd8, 0xf2, 0xbd, 0x37, 0xc4, 0x04, 0xbd, 0x73, 0xfb, 0xaa, 0xbe,
- 0xc6, 0x7f, 0x46, 0xbe, 0x3c, 0xa7, 0xf9, 0xbd, 0x95, 0x3f, 0xce, 0x3c,
- 0xa9, 0xd1, 0x99, 0xbe, 0x43, 0xfb, 0x25, 0x3e, 0x99, 0xdf, 0x49, 0xbd,
- 0xa4, 0xf3, 0x15, 0xbe, 0xfc, 0x8b, 0xf0, 0xbd, 0x6e, 0x3f, 0xfb, 0xbd,
- 0x9c, 0xaf, 0x7c, 0x3d, 0xa0, 0xef, 0xa7, 0xbd, 0xd0, 0x01, 0xbd, 0x3d,
- 0x58, 0x6f, 0x7b, 0xbe, 0x1e, 0x6c, 0x94, 0xbe, 0x1d, 0xed, 0xbb, 0x3d,
- 0x39, 0x0e, 0xd9, 0x3d, 0x78, 0x70, 0xb2, 0xbe, 0xd8, 0x30, 0x0e, 0xbe,
- 0xe4, 0xb4, 0x92, 0xbe, 0xa8, 0x25, 0xb0, 0xbe, 0x32, 0x49, 0xb5, 0xbd,
- 0x0d, 0xea, 0x9b, 0xbe, 0x06, 0x15, 0x45, 0xbe, 0xd1, 0xb3, 0x8b, 0xbe,
- 0xc2, 0xda, 0x0d, 0xbe, 0x25, 0xfd, 0x67, 0xbe, 0x2c, 0x00, 0x0d, 0xbd,
- 0xe8, 0xfe, 0x32, 0xbe, 0x0f, 0xb9, 0x76, 0xbe, 0x15, 0x31, 0x23, 0x3e,
- 0xfe, 0xeb, 0x01, 0x3d, 0xfb, 0x23, 0x1e, 0x3e, 0x0e, 0x91, 0x7f, 0xbe,
- 0x50, 0xc9, 0xde, 0x3d, 0x16, 0x1f, 0x12, 0xbe, 0xf4, 0x1e, 0x39, 0xbe,
- 0xa3, 0x56, 0x59, 0xbe, 0x4f, 0x4c, 0x3d, 0xbe, 0x35, 0x95, 0x70, 0xbe,
- 0xec, 0x09, 0xd1, 0xbc, 0xd8, 0xec, 0x62, 0xbe, 0x7d, 0x3f, 0x10, 0x3e,
- 0xc8, 0x5b, 0x0b, 0x3a, 0x03, 0xb1, 0x31, 0x3d, 0x50, 0xae, 0x4f, 0xbe,
- 0x30, 0x82, 0xb0, 0xbe, 0xb1, 0xfe, 0xdd, 0xbe, 0xdc, 0x1a, 0xbb, 0xbe,
- 0xdd, 0x98, 0x01, 0xbe, 0x2f, 0xce, 0xcc, 0x3d, 0x1c, 0xe8, 0xb1, 0xbe,
- 0xbd, 0x7a, 0x1d, 0xbe, 0x8a, 0x46, 0x5f, 0xbd, 0x44, 0xe9, 0x5c, 0xbe,
- 0xba, 0xf7, 0x14, 0x3e, 0x5f, 0x7e, 0x36, 0x3c, 0x74, 0x9e, 0x86, 0xbd,
- 0x98, 0x71, 0x17, 0x3e, 0xb9, 0xed, 0x3c, 0xbe, 0x07, 0xd9, 0x37, 0xbe,
- 0x5b, 0xdc, 0xbc, 0xbd, 0xda, 0x1b, 0xce, 0x3d, 0xaa, 0xa6, 0x64, 0xbe,
- 0x1a, 0x6f, 0x43, 0xbe, 0xf7, 0x86, 0xe2, 0x3d, 0x0c, 0x3a, 0x94, 0xbd,
- 0x34, 0x5f, 0x4f, 0xbe, 0x28, 0x54, 0x19, 0x3e, 0xa4, 0x14, 0x89, 0xbe,
- 0x2b, 0x12, 0x51, 0x3d, 0xde, 0x9a, 0x0d, 0xbe, 0x8f, 0x6e, 0x78, 0xbe,
- 0x0b, 0x77, 0x6a, 0xbe, 0xe3, 0x86, 0x93, 0x3d, 0xc0, 0x18, 0xd8, 0xbd,
- 0xa8, 0x91, 0x65, 0xbb, 0x03, 0xc3, 0x2e, 0xbe, 0xed, 0x0a, 0xb4, 0x3d,
- 0x84, 0x45, 0xdc, 0xbe, 0x50, 0xc8, 0x7c, 0xbe, 0xc1, 0x4a, 0x9c, 0x3b,
- 0x96, 0xa0, 0xab, 0x3d, 0x58, 0x42, 0x0a, 0xbf, 0x90, 0x09, 0x74, 0xbd,
- 0x4a, 0x57, 0xcc, 0xbe, 0x8c, 0xc0, 0x3f, 0xbe, 0x34, 0x35, 0x3b, 0x3c,
- 0x97, 0x78, 0xd7, 0xbd, 0x55, 0x7b, 0x26, 0x3e, 0x34, 0xd5, 0x8d, 0x3d,
- 0xc2, 0x5d, 0x33, 0xbe, 0x2d, 0x34, 0x52, 0xbd, 0xa1, 0x63, 0x64, 0xbc,
- 0xc2, 0x17, 0x4f, 0x3d, 0xe5, 0x0a, 0x53, 0xbd, 0x71, 0xea, 0x7b, 0xbe,
- 0x14, 0x89, 0x2b, 0xbe, 0x6f, 0xb1, 0xd9, 0x3d, 0x50, 0x45, 0xe2, 0xbd,
- 0xde, 0x2a, 0x86, 0xbe, 0x4c, 0xcb, 0x19, 0xbd, 0x67, 0x19, 0x0e, 0xbf,
- 0x5b, 0xdb, 0x74, 0x3d, 0x04, 0xbc, 0x03, 0xbe, 0x5f, 0x5b, 0xb1, 0xbc,
- 0x3e, 0x83, 0x5e, 0x3c, 0x03, 0x4f, 0xc2, 0xbe, 0x71, 0x9a, 0x07, 0xbe,
- 0xc0, 0x57, 0x3f, 0x3a, 0xa6, 0x0d, 0x31, 0x3e, 0xeb, 0x29, 0x71, 0xbe,
- 0xa2, 0x75, 0x95, 0xbe, 0x24, 0x5f, 0xc3, 0xbd, 0x2c, 0xc7, 0x2e, 0xbe,
- 0x6c, 0x65, 0x2c, 0xbf, 0xea, 0x7e, 0x86, 0xbe, 0x75, 0x74, 0x2f, 0xbe,
- 0x66, 0xb8, 0x5f, 0xbe, 0x39, 0x54, 0x85, 0xbd, 0xde, 0x05, 0x83, 0xbe,
- 0xdb, 0x99, 0x0c, 0x3c, 0x81, 0x46, 0x99, 0x3e, 0xf3, 0x61, 0x52, 0x3d,
- 0x1b, 0x52, 0xf1, 0xbe, 0xfe, 0x95, 0xba, 0xbe, 0xad, 0x63, 0xcb, 0x3c,
- 0x4e, 0x38, 0x92, 0xbe, 0x65, 0x65, 0xf7, 0xbd, 0x64, 0x58, 0xf3, 0xbe,
- 0x62, 0x13, 0xbb, 0xbd, 0x61, 0xcc, 0xf5, 0xbd, 0x9a, 0x5d, 0x1b, 0x3e,
- 0x37, 0x04, 0x87, 0x3e, 0xae, 0x7b, 0x0b, 0xbd, 0xaa, 0x4d, 0xd3, 0xbe,
- 0xdd, 0x3c, 0x81, 0x3d, 0xd6, 0x3d, 0xb2, 0xbd, 0xd1, 0x1a, 0x72, 0xbe,
- 0xf2, 0xf9, 0x87, 0x3d, 0x9e, 0xe7, 0xfe, 0xbe, 0x12, 0x6b, 0x4c, 0xbd,
- 0x98, 0x11, 0x99, 0xbe, 0x46, 0xb0, 0x9d, 0x3d, 0x81, 0x42, 0x5d, 0x3d,
- 0xbc, 0x35, 0x94, 0xbd, 0x0e, 0x99, 0xbb, 0x3d, 0x76, 0xa8, 0x25, 0x3e,
- 0x3c, 0x4f, 0xc3, 0xbd, 0x34, 0xf0, 0xab, 0x3e, 0xea, 0x0d, 0xb6, 0x3e,
- 0x7a, 0xe2, 0xab, 0x3d, 0x93, 0x58, 0xc8, 0xbe, 0xac, 0x3e, 0x7b, 0xbe,
- 0x8d, 0x80, 0x63, 0xbe, 0xc5, 0xdf, 0x70, 0xbe, 0xe1, 0x19, 0xb2, 0x3d,
- 0x71, 0x85, 0x56, 0xbe, 0x7d, 0x95, 0x44, 0xbd, 0x3d, 0xe1, 0xae, 0xbd,
- 0x17, 0x7a, 0x98, 0xbd, 0x21, 0x80, 0xd3, 0x3c, 0x4e, 0x9b, 0xd9, 0xbd,
- 0xb9, 0x4e, 0x5b, 0x3e, 0x5c, 0x7f, 0x41, 0xbe, 0xbd, 0x7b, 0xe1, 0xbd,
- 0xd5, 0x61, 0x2c, 0xbd, 0x8d, 0x57, 0x90, 0xbd, 0x07, 0x17, 0x91, 0xbe,
- 0xb8, 0x67, 0x1f, 0x3e, 0x8f, 0xdf, 0xb4, 0xbd, 0x17, 0x82, 0x0b, 0x3d,
- 0x7a, 0x5d, 0xbe, 0xbd, 0x3e, 0x5b, 0x16, 0x3b, 0x1d, 0x83, 0xf8, 0xbd,
- 0x9a, 0x31, 0x20, 0xbe, 0x5b, 0xf3, 0xd8, 0x3e, 0x81, 0x9c, 0x82, 0xbc,
- 0x68, 0x8d, 0x5d, 0xbe, 0x2d, 0x0d, 0xb5, 0xbd, 0x6b, 0x41, 0x91, 0xbe,
- 0x10, 0x7b, 0xa2, 0x3c, 0x83, 0x0d, 0x9e, 0x3e, 0xab, 0x01, 0xc6, 0x3d,
- 0x54, 0x20, 0x32, 0x3d, 0x4c, 0x45, 0xa0, 0x3e, 0x86, 0x0f, 0xcf, 0x3c,
- 0xc9, 0x38, 0x8c, 0x3d, 0x13, 0x2c, 0x26, 0xbe, 0xd5, 0x61, 0xaa, 0xbd,
- 0x4b, 0xaf, 0xa9, 0xbd, 0x3e, 0xb0, 0x8f, 0x3d, 0xa3, 0x1e, 0x5f, 0xbe,
- 0x8e, 0xcd, 0xc7, 0x3d, 0xb8, 0xb4, 0xac, 0x3e, 0xad, 0x19, 0x99, 0x3d,
- 0x84, 0xf3, 0x66, 0xbc, 0xd8, 0xcb, 0x8f, 0x3e, 0x40, 0x44, 0xfa, 0x3b,
- 0x09, 0xf5, 0x26, 0xbd, 0x33, 0x73, 0x80, 0xbd, 0x41, 0x73, 0x5d, 0xbd,
- 0xa2, 0xf1, 0xa9, 0x3e, 0x14, 0xf6, 0x9a, 0xbd, 0x17, 0x75, 0xa7, 0xbc,
- 0x00, 0xe7, 0x07, 0x3c, 0x2a, 0x5c, 0x00, 0x3e, 0xca, 0x8a, 0xcb, 0x3d,
- 0x92, 0x09, 0x8e, 0xbd, 0x6e, 0x62, 0x81, 0x3c, 0xa5, 0x7f, 0x87, 0x3e,
- 0x1d, 0x0c, 0x51, 0xbe, 0xaf, 0xef, 0x4d, 0x3e, 0xa8, 0xa9, 0x96, 0x3e,
- 0x66, 0x4a, 0x58, 0xbe, 0xe3, 0xd0, 0x18, 0x3e, 0x46, 0x1a, 0xe1, 0x39,
- 0x0c, 0x91, 0xc3, 0xbd, 0x4d, 0xe2, 0x2b, 0x3c, 0xee, 0xdf, 0x87, 0xbc,
- 0x58, 0x61, 0x04, 0xbd, 0x34, 0x6e, 0x75, 0xbe, 0x5b, 0x44, 0xb4, 0xbd,
- 0x43, 0x4b, 0x36, 0x3d, 0x74, 0x89, 0x52, 0x3d, 0xe6, 0x0c, 0xf5, 0xbd,
- 0xee, 0xfe, 0x12, 0x3e, 0x3d, 0x02, 0x02, 0x3e, 0x15, 0x1d, 0x86, 0x3d,
- 0x84, 0xad, 0x7d, 0xbe, 0xb0, 0x03, 0x96, 0x3e, 0x66, 0x6e, 0x90, 0xbc,
- 0xde, 0xfa, 0xab, 0xbd, 0x5a, 0x5e, 0x26, 0xbe, 0xbe, 0x99, 0xf2, 0x3d,
- 0x7d, 0xa7, 0x5a, 0x3e, 0x0d, 0x88, 0x93, 0x3d, 0xfb, 0x45, 0x97, 0xbe,
- 0x58, 0xba, 0x01, 0x3e, 0x95, 0x66, 0x0a, 0x3e, 0x35, 0x91, 0x05, 0x3e,
- 0x5b, 0x4d, 0x7a, 0x3c, 0x13, 0xe0, 0x2b, 0xbe, 0x08, 0x58, 0x6f, 0x3e,
- 0x4e, 0x1e, 0x3d, 0xbe, 0xee, 0x4a, 0x23, 0xbe, 0xe6, 0x04, 0x92, 0xbd,
- 0xf8, 0xdb, 0x10, 0xbe, 0xfe, 0x83, 0xb4, 0xbd, 0x6e, 0xf2, 0x26, 0xbe,
- 0x8b, 0xd7, 0x3b, 0xbd, 0x0e, 0x4a, 0x2f, 0xbd, 0x1a, 0x34, 0xe6, 0x3d,
- 0x7e, 0x6a, 0x25, 0xbe, 0x41, 0x38, 0xa4, 0x3d, 0x99, 0xb5, 0x1d, 0x3c,
- 0x09, 0xff, 0x40, 0xbe, 0x3d, 0x8c, 0xa7, 0x3e, 0x95, 0x9d, 0x39, 0xbe,
- 0xdd, 0xf6, 0x25, 0x3e, 0x62, 0x14, 0x7f, 0xbe, 0xaf, 0x4c, 0xd1, 0xbd,
- 0xda, 0x3b, 0xae, 0x3e, 0xd9, 0x1e, 0x26, 0x3d, 0xf3, 0x07, 0x4d, 0x3d,
- 0x23, 0x29, 0x87, 0x3d, 0xa4, 0x9c, 0x8f, 0xbe, 0x97, 0x4a, 0xa7, 0x3e,
- 0x84, 0x11, 0x13, 0x3e, 0xa4, 0x48, 0xdc, 0x3d, 0x75, 0xa8, 0xbe, 0xbc,
- 0xab, 0x0c, 0xce, 0x3d, 0x5d, 0x4e, 0x8b, 0x3d, 0x95, 0x7d, 0x0e, 0x3e,
- 0x21, 0x87, 0xaf, 0xbe, 0xd6, 0x45, 0x96, 0xbe, 0x78, 0x56, 0x81, 0xbd,
- 0x74, 0xba, 0x44, 0x3e, 0xf0, 0x47, 0x2a, 0xbe, 0xd5, 0xde, 0xb1, 0xbd,
- 0x07, 0x80, 0x38, 0x3e, 0x51, 0xd9, 0x34, 0xbe, 0xf0, 0x3b, 0xf6, 0x3d,
- 0x66, 0xfe, 0x84, 0x3e, 0x97, 0x83, 0x3e, 0x3d, 0x87, 0x12, 0xfd, 0x3d,
- 0x0e, 0x87, 0x1a, 0xbd, 0x4c, 0x2d, 0x90, 0xbd, 0xaa, 0xb6, 0x5b, 0xbb,
- 0x7e, 0xa0, 0x7b, 0xbd, 0x19, 0xe3, 0xa5, 0xbd, 0x78, 0xb3, 0xca, 0x3c,
- 0x56, 0x18, 0x01, 0x3d, 0xff, 0x49, 0x12, 0x3e, 0x59, 0x55, 0xfd, 0x3d,
- 0xfb, 0xf8, 0x02, 0xbe, 0x6c, 0x27, 0x3f, 0x3c, 0xd3, 0x53, 0xdb, 0x3d,
- 0x5b, 0x7d, 0x8a, 0x3d, 0xe3, 0x2d, 0x93, 0xbd, 0x77, 0xf2, 0x6e, 0x3e,
- 0xf6, 0xdc, 0xab, 0xbe, 0xfd, 0xbc, 0xfa, 0x3d, 0x3f, 0xf1, 0xbe, 0x3c,
- 0x5b, 0x69, 0x24, 0xbe, 0xdb, 0x50, 0x94, 0xbd, 0x1b, 0x58, 0x13, 0xbe,
- 0x37, 0x70, 0x1c, 0x3e, 0x62, 0xe9, 0xde, 0x3c, 0x94, 0xd4, 0x12, 0x3d,
- 0xf4, 0xdd, 0xff, 0xbd, 0x72, 0xd1, 0x5e, 0xbd, 0x63, 0x45, 0x38, 0x3e,
- 0x85, 0x22, 0x23, 0x3e, 0xfc, 0xbe, 0xce, 0xbd, 0x08, 0xe0, 0xb4, 0x3d,
- 0xef, 0x53, 0x9d, 0x3d, 0x6a, 0x33, 0x59, 0x3e, 0xef, 0x6e, 0xbc, 0xbc,
- 0x63, 0x1d, 0x90, 0xbd, 0x4b, 0x33, 0xfb, 0x3e, 0xbf, 0xaa, 0xb7, 0x3d,
- 0xd5, 0x49, 0xd4, 0x3c, 0xbd, 0xa6, 0x6a, 0x3e, 0x93, 0x25, 0x2f, 0xbd,
- 0xb9, 0x76, 0xa9, 0x3d, 0x63, 0xca, 0xcd, 0xbb, 0xc1, 0xc9, 0x15, 0x3e,
- 0xce, 0x23, 0x4e, 0x3d, 0x41, 0x16, 0x4a, 0xbd, 0x9e, 0x63, 0x2d, 0xbd,
- 0x2a, 0x98, 0xbd, 0x3c, 0xc9, 0x62, 0xda, 0x3b, 0x45, 0x07, 0x37, 0x3e,
- 0x9b, 0x67, 0xee, 0x3d, 0x90, 0x1c, 0xb0, 0x3c, 0xee, 0x98, 0xd7, 0xbd,
- 0x0a, 0x45, 0x97, 0xbd, 0xa0, 0x58, 0x51, 0xbe, 0xb1, 0xad, 0x25, 0xbb,
- 0x90, 0x20, 0x17, 0xbe, 0x26, 0x59, 0x9e, 0x3a, 0x83, 0x87, 0x9a, 0x3d,
- 0xcf, 0xdb, 0x5b, 0xbd, 0xb9, 0xb9, 0x2a, 0xbe, 0x7d, 0x55, 0x00, 0xbe,
- 0xd9, 0x5e, 0x3e, 0xbe, 0x1c, 0x3a, 0xa8, 0xbd, 0xc0, 0x31, 0x91, 0x3d,
- 0x40, 0xbd, 0xf0, 0xbc, 0xfa, 0x16, 0x00, 0xbe, 0xf4, 0x31, 0x14, 0x3e,
- 0x41, 0xa2, 0x67, 0x3e, 0x18, 0x1c, 0x52, 0x3d, 0x06, 0xbe, 0xd8, 0x3d,
- 0xaf, 0xee, 0x1f, 0x3e, 0x63, 0x0e, 0xf7, 0x3a, 0xa4, 0xa4, 0x47, 0x3d,
- 0x2b, 0xbe, 0xe2, 0xbd, 0x94, 0xe2, 0x3f, 0xbd, 0x14, 0xa2, 0xa0, 0xbd,
- 0x37, 0x00, 0xbe, 0xbd, 0x84, 0x9a, 0x26, 0x3e, 0x2c, 0x5c, 0xa8, 0xbd,
- 0xaf, 0x19, 0x94, 0x3d, 0x52, 0xb4, 0x2a, 0xbe, 0x98, 0xfd, 0x0d, 0xbd,
- 0x3e, 0xc7, 0xcb, 0xbd, 0x2a, 0xca, 0xb1, 0x3d, 0xbc, 0x26, 0x0c, 0xbe,
- 0x76, 0x61, 0x98, 0xbd, 0x0f, 0xe1, 0xf2, 0x3c, 0x3c, 0x11, 0xa2, 0xbe,
- 0xbe, 0x8b, 0xd2, 0x3a, 0x1a, 0xce, 0x21, 0xbd, 0xc8, 0x54, 0x83, 0x3d,
- 0xc3, 0xf2, 0x02, 0xbe, 0x68, 0x50, 0xdd, 0xbd, 0x48, 0x13, 0x87, 0x3d,
- 0x52, 0x76, 0xb5, 0x3d, 0x5a, 0xad, 0xea, 0xbd, 0x5d, 0xb1, 0x82, 0x3d,
- 0xa5, 0xca, 0x72, 0xbd, 0xf4, 0x9c, 0x0b, 0xbe, 0x13, 0xac, 0xca, 0xbd,
- 0x68, 0xba, 0x1d, 0x3e, 0x19, 0x19, 0xe2, 0x3d, 0x9e, 0xfa, 0x49, 0xbd,
- 0x8f, 0x99, 0x00, 0x3e, 0xd4, 0xb2, 0x95, 0x3c, 0x75, 0x32, 0x95, 0xbc,
- 0x2b, 0x86, 0x14, 0x3e, 0x5b, 0x60, 0xe0, 0xbc, 0xb8, 0x15, 0x23, 0xbd,
- 0x0c, 0x14, 0x13, 0x3d, 0x86, 0xf4, 0x47, 0x3d, 0x36, 0x64, 0xec, 0x3c,
- 0x99, 0x4c, 0x03, 0xbe, 0xa8, 0x70, 0x2c, 0x3e, 0xa3, 0x47, 0x9a, 0x3d,
- 0x6f, 0xd5, 0x33, 0x3d, 0xb6, 0x2c, 0xd4, 0xbd, 0xfb, 0xd8, 0x63, 0x3c,
- 0xa6, 0x6a, 0x5f, 0xbd, 0xf8, 0x8a, 0x76, 0xbd, 0x7f, 0x35, 0xb8, 0xbd,
- 0x2b, 0xcd, 0x96, 0x3e, 0x95, 0xa8, 0x21, 0xbe, 0x5f, 0xa5, 0xd1, 0xbd,
- 0xbb, 0xa2, 0x07, 0x3e, 0x76, 0xb5, 0xc2, 0xbd, 0x73, 0xc5, 0x0a, 0x3e,
- 0x82, 0x85, 0x0e, 0x3e, 0xae, 0x33, 0x9e, 0x3d, 0x4a, 0x15, 0x92, 0xbd,
- 0x07, 0xbf, 0x1c, 0x3a, 0xf3, 0x3c, 0x0c, 0x3e, 0xb6, 0x04, 0xc5, 0xbd,
- 0x0e, 0x18, 0xb3, 0x3d, 0xd2, 0x82, 0x97, 0x3d, 0x18, 0xe4, 0x0f, 0x3e,
- 0x3d, 0x96, 0x3e, 0xbe, 0x6a, 0xf4, 0x29, 0x3d, 0x3e, 0xa8, 0x39, 0x3d,
- 0x0d, 0xd9, 0x08, 0xbe, 0xd3, 0x87, 0x15, 0x3d, 0xd3, 0x2c, 0xda, 0xbd,
- 0x3f, 0xac, 0xbb, 0x3d, 0x08, 0x2c, 0x95, 0xbd, 0x34, 0x12, 0x0a, 0x3e,
- 0x43, 0xbc, 0x88, 0xbd, 0x55, 0x95, 0x40, 0x3d, 0x85, 0x7a, 0x52, 0xba,
- 0x76, 0xea, 0x9c, 0xbc, 0x69, 0x4c, 0x1f, 0xbc, 0x1e, 0x5b, 0x01, 0x3e,
- 0x5e, 0x40, 0x07, 0xbe, 0xc8, 0xd6, 0x30, 0x3d, 0x0c, 0x88, 0xe4, 0xbb,
- 0x9e, 0x25, 0x8a, 0xbd, 0x8e, 0x36, 0xb9, 0x3d, 0xd2, 0x2e, 0x03, 0x3e,
- 0x7e, 0x23, 0x4c, 0xbd, 0xd0, 0xdc, 0xc6, 0xbd, 0xf8, 0xc4, 0x92, 0xbd,
- 0x6c, 0xcd, 0xa5, 0x3d, 0xc7, 0x70, 0x6b, 0xbd, 0xb9, 0x16, 0xa9, 0xbb,
- 0x2d, 0xed, 0xa6, 0x3b, 0x2b, 0x10, 0x9e, 0xbd, 0x6a, 0x5a, 0x00, 0x3e,
- 0xd2, 0x08, 0x54, 0xbd, 0x14, 0xac, 0x12, 0x3d, 0x73, 0x61, 0xd3, 0x3d,
- 0xed, 0xcb, 0xa9, 0xbd, 0x0c, 0xcf, 0xc9, 0xbd, 0x0e, 0xf5, 0xc1, 0x3d,
- 0xfc, 0xe0, 0x19, 0x3e, 0x5a, 0xa0, 0x17, 0xbd, 0xd0, 0x30, 0xf2, 0xbd,
- 0xc3, 0x64, 0xfb, 0x3d, 0xfd, 0xd5, 0xff, 0x3d, 0x47, 0x0f, 0xb5, 0x3c,
- 0xc4, 0x5d, 0xb5, 0x3d, 0xbd, 0xe3, 0x03, 0x3e, 0x10, 0x48, 0x36, 0x3d,
- 0xb9, 0x4d, 0x1f, 0x3c, 0x68, 0x57, 0xe8, 0xbc, 0x37, 0xeb, 0xf6, 0xbd,
- 0x65, 0xce, 0x1d, 0x3e, 0xee, 0xe9, 0x17, 0xbd, 0xf1, 0x89, 0xba, 0x3d,
- 0x56, 0x79, 0x81, 0xbd, 0xc2, 0xe2, 0x1c, 0xbe, 0x25, 0xf1, 0x0a, 0x3e,
- 0x54, 0x18, 0xb7, 0x3d, 0xe3, 0xee, 0xdf, 0x3d, 0xd6, 0x0b, 0xf7, 0xbd,
- 0xc5, 0x8c, 0x92, 0xbd, 0x80, 0xb8, 0x6e, 0xbd, 0x6a, 0x57, 0xca, 0x3d,
- 0xa3, 0xfc, 0x69, 0x3d, 0xfe, 0x35, 0x18, 0x3d, 0x9e, 0xf7, 0x74, 0x3c,
- 0x9e, 0x76, 0xd3, 0x3d, 0x24, 0x0d, 0xf1, 0x3d, 0xe3, 0x4d, 0x0c, 0xbe,
- 0x82, 0x36, 0xd0, 0xbc, 0xff, 0x2a, 0x11, 0xbe, 0x98, 0xb8, 0x74, 0xbc,
- 0x2a, 0x65, 0xff, 0xbd, 0xdc, 0xb8, 0xc5, 0x3d, 0xa5, 0xe3, 0xac, 0x3d,
- 0xee, 0x5f, 0xdc, 0xbd, 0x4b, 0x45, 0x7d, 0x3d, 0x09, 0xe0, 0x4a, 0xbb,
- 0x8c, 0x6b, 0xbc, 0x3d, 0xf5, 0x47, 0x29, 0x3d, 0xe8, 0x08, 0xa9, 0xbd,
- 0x1e, 0x51, 0x1a, 0x3e, 0x5b, 0xe6, 0xe8, 0x3d, 0x18, 0xba, 0xe1, 0xbd,
- 0x45, 0x06, 0xb3, 0xbd, 0x36, 0xa0, 0x82, 0x3d, 0x3c, 0xcc, 0x06, 0xbc,
- 0x20, 0x95, 0x85, 0xbd, 0x16, 0x78, 0x87, 0xbd, 0x37, 0xed, 0xa2, 0x3c,
- 0xd1, 0x82, 0xba, 0xbd, 0x58, 0x8d, 0xe6, 0x3c, 0xb6, 0x0c, 0xb1, 0xbd,
- 0x35, 0x0d, 0xe2, 0xbb, 0x6d, 0xb1, 0xb8, 0xbc, 0x10, 0xc0, 0x02, 0x3c,
- 0x17, 0xa9, 0x06, 0x3e, 0x9f, 0x53, 0x1b, 0x3e, 0xaf, 0x52, 0xd7, 0x3d,
- 0x17, 0x99, 0x11, 0x3e, 0xa2, 0x1b, 0xec, 0xbd, 0x5b, 0xc2, 0x2b, 0xbc,
- 0x0e, 0x1a, 0x2c, 0xbd, 0x4b, 0x28, 0xe1, 0x3d, 0xf5, 0x3b, 0xce, 0xbd,
- 0xdd, 0xa7, 0xd4, 0xbd, 0x9f, 0x16, 0xc8, 0x3d, 0xb7, 0xf0, 0x06, 0x3e,
- 0xb8, 0x15, 0x0b, 0xbd, 0xa1, 0x32, 0x31, 0x3b, 0x80, 0x06, 0x3f, 0x3d,
- 0x07, 0xe0, 0xc1, 0x3d, 0x4f, 0xfe, 0xa7, 0xbc, 0xaa, 0x1f, 0x77, 0x3c,
- 0xfc, 0x24, 0xc9, 0x3d, 0xc6, 0xbc, 0xfd, 0x3b, 0x75, 0xbd, 0xf1, 0x3c,
- 0x22, 0xb1, 0x21, 0xbe, 0x3d, 0x85, 0xc0, 0x3d, 0xdb, 0x8a, 0xb9, 0x3b,
- 0xdc, 0xce, 0x0e, 0xbc, 0x7a, 0x0d, 0x91, 0xbd, 0x04, 0x1e, 0x70, 0x3d,
- 0x66, 0xd5, 0x21, 0xbc, 0x3d, 0x53, 0x3e, 0xbd, 0x92, 0xe3, 0x2a, 0xbc,
- 0x2d, 0x15, 0x06, 0xbe, 0x53, 0x3d, 0x04, 0xbe, 0xd7, 0x0a, 0x8b, 0x3d,
- 0xaa, 0xbf, 0x78, 0x3d, 0x85, 0xca, 0x67, 0xbd, 0x17, 0xf0, 0x14, 0xbe,
- 0x30, 0x1d, 0x13, 0xbd, 0x2b, 0x8e, 0x7e, 0xbe, 0x0a, 0x4d, 0x8a, 0xbd,
- 0x2e, 0xf0, 0xb5, 0xbd, 0x8d, 0xd6, 0x0e, 0xbd, 0x67, 0x2a, 0xd6, 0xbc,
- 0x23, 0xeb, 0x74, 0xbb, 0xad, 0xd4, 0xa3, 0x3c, 0x2b, 0x94, 0xb5, 0xbd,
- 0x81, 0x17, 0xa9, 0xbd, 0x7b, 0x8a, 0x39, 0xbe, 0x44, 0x79, 0xbd, 0x3d,
- 0x46, 0x7b, 0xcc, 0x3d, 0xe4, 0xca, 0x82, 0xbe, 0x7c, 0x67, 0x8d, 0xbd,
- 0xb7, 0x1a, 0xc2, 0xbc, 0x91, 0x06, 0x7c, 0xbd, 0xb3, 0xcc, 0x45, 0xbd,
- 0x99, 0x2f, 0x97, 0x3d, 0xe8, 0x83, 0x00, 0xbe, 0xdb, 0x7a, 0x41, 0xbd,
- 0xff, 0xff, 0xf9, 0xbc, 0x42, 0x1d, 0x4f, 0x39, 0x38, 0xeb, 0x15, 0xbd,
- 0x34, 0x06, 0xcd, 0x3d, 0xde, 0x20, 0x84, 0xbe, 0xe8, 0xfd, 0xd3, 0xbd,
- 0xdc, 0x98, 0xfa, 0x3d, 0x40, 0x7e, 0x82, 0xbe, 0x9e, 0x3e, 0x59, 0x3d,
- 0x2a, 0x8c, 0xf9, 0xbb, 0xa3, 0x17, 0xd2, 0x3b, 0xba, 0xaf, 0xd4, 0xbd,
- 0x09, 0x90, 0x4e, 0xbd, 0xde, 0x4a, 0xf6, 0xbd, 0xb4, 0xba, 0x02, 0x3e,
- 0xa6, 0x99, 0xe6, 0x3c, 0x39, 0x25, 0x15, 0x3d, 0xd1, 0xbb, 0xec, 0x3c,
- 0x11, 0x07, 0xb4, 0xbd, 0x0a, 0x11, 0xbb, 0x3c, 0x1c, 0x83, 0xfb, 0xbd,
- 0x9e, 0x27, 0xa0, 0xbd, 0x64, 0x95, 0x34, 0x3d, 0xff, 0xc5, 0xbf, 0xbc,
- 0x2e, 0xa4, 0xda, 0xbd, 0x34, 0x56, 0x35, 0x3d, 0xe6, 0xec, 0x06, 0x3e,
- 0x90, 0x1e, 0xcf, 0x3d, 0xd7, 0xcf, 0xa4, 0x3d, 0x7c, 0x3b, 0x35, 0xbd,
- 0x03, 0x4f, 0xa1, 0x3d, 0xa8, 0xdf, 0x1f, 0x3e, 0x34, 0x22, 0x0c, 0xbc,
- 0x69, 0xc6, 0x80, 0x3d, 0x10, 0xfe, 0x2f, 0x3e, 0xf3, 0x91, 0x0d, 0x3e,
- 0xbd, 0x7b, 0xd9, 0xbd, 0xe4, 0x63, 0x4c, 0xbe, 0xec, 0x13, 0xce, 0x3d,
- 0x7d, 0x28, 0x2f, 0xbe, 0x0c, 0x99, 0x57, 0x3e, 0xda, 0x4b, 0xf0, 0x3d,
- 0xaa, 0x90, 0x60, 0xbd, 0x44, 0xc7, 0xbc, 0xbb, 0xa6, 0xb5, 0xb9, 0xba,
- 0x44, 0x24, 0x56, 0xbd, 0xbe, 0xee, 0x2f, 0xbe, 0x58, 0xa1, 0x99, 0xbd,
- 0xa0, 0x04, 0x80, 0x3d, 0xde, 0x1e, 0xa8, 0xbe, 0x13, 0x8f, 0x2e, 0xbe,
- 0xd3, 0x46, 0xca, 0x3d, 0x26, 0x50, 0xe1, 0x3b, 0x68, 0xbf, 0x4f, 0xbb,
- 0x19, 0x22, 0x2d, 0xbe, 0x82, 0x1d, 0x11, 0x3c, 0xb6, 0x75, 0xba, 0xbc,
- 0xa9, 0xd7, 0x33, 0xbc, 0x5e, 0x1f, 0xdc, 0x3b, 0xdd, 0x5a, 0x99, 0xbd,
- 0x31, 0x5a, 0x1e, 0x3c, 0x3d, 0xf2, 0x32, 0x3d, 0x08, 0xe8, 0x43, 0xbd,
- 0x29, 0x5f, 0xf0, 0x3d, 0x83, 0x05, 0x93, 0xbd, 0xc7, 0x68, 0xeb, 0xbc,
- 0x7d, 0xf7, 0xbe, 0xbd, 0x52, 0xed, 0x20, 0xbe, 0xb5, 0xdb, 0x38, 0x3e,
- 0xac, 0x64, 0x0e, 0x3e, 0xc7, 0xb2, 0xa2, 0xbe, 0x2b, 0x58, 0xf3, 0xbc,
- 0x05, 0xa7, 0x52, 0xbd, 0x66, 0x9d, 0x23, 0xbe, 0x89, 0xa7, 0xb7, 0xbd,
- 0x5d, 0x91, 0x96, 0xbd, 0xbc, 0x97, 0x2d, 0x3d, 0xa7, 0xd6, 0x06, 0xbe,
- 0xd6, 0xda, 0xe3, 0xbb, 0x5e, 0x20, 0x85, 0xbc, 0x7f, 0xc4, 0x13, 0xbe,
- 0x39, 0xc4, 0x8f, 0x3d, 0x67, 0x51, 0xa3, 0xbd, 0x56, 0x26, 0xfe, 0xbd,
- 0x61, 0x02, 0xec, 0xbc, 0x88, 0xd2, 0x12, 0x3e, 0x5b, 0xd4, 0x96, 0xbc,
- 0x27, 0xc7, 0x2f, 0x3c, 0xae, 0x42, 0xe8, 0xbd, 0x20, 0x79, 0xda, 0xbd,
- 0xc0, 0xd1, 0x86, 0x3d, 0x74, 0x89, 0x63, 0x3d, 0x53, 0x84, 0x6f, 0xbc,
- 0x0c, 0xcb, 0x12, 0xbe, 0xef, 0x08, 0x37, 0x3b, 0xfe, 0x77, 0x89, 0x3c,
- 0x00, 0xf0, 0x32, 0xbc, 0xee, 0xc4, 0xc0, 0x3d, 0x52, 0xbf, 0xd9, 0xbd,
- 0x84, 0x3a, 0x2a, 0xbe, 0xa4, 0x67, 0xe6, 0xbd, 0xd0, 0x79, 0xaa, 0xbd,
- 0xa3, 0x69, 0x12, 0xbe, 0x78, 0x92, 0x86, 0x3d, 0x16, 0xd7, 0x11, 0x3e,
- 0x3a, 0x45, 0x22, 0x3e, 0xfb, 0x3b, 0x4f, 0x3d, 0x49, 0x47, 0x11, 0xbe,
- 0x7d, 0x67, 0xd8, 0xbc, 0xe5, 0x05, 0x7e, 0x3d, 0x3d, 0x0e, 0x75, 0xbd,
- 0xc9, 0x06, 0x9a, 0xbd, 0xe7, 0xf8, 0x9c, 0xbc, 0xa9, 0x5c, 0x29, 0x3b,
- 0x9e, 0x5e, 0x23, 0x3e, 0xac, 0xb2, 0x9d, 0xbe, 0x28, 0x96, 0x87, 0x3d,
- 0x73, 0x84, 0x67, 0xbe, 0x9d, 0x66, 0x9e, 0xbd, 0x1d, 0xf1, 0xcc, 0xbe,
- 0x8f, 0x96, 0x44, 0x3d, 0x15, 0xbb, 0x07, 0xbe, 0xde, 0x49, 0x2d, 0xbd,
- 0xd3, 0xda, 0xb6, 0xbe, 0xb2, 0xfa, 0x93, 0x3e, 0x1f, 0x13, 0x34, 0xbe,
- 0x3c, 0x5e, 0x5c, 0x3e, 0x40, 0xa8, 0xa0, 0xbe, 0x34, 0x60, 0xfb, 0xbd,
- 0x55, 0x72, 0xf8, 0x3d, 0x83, 0xba, 0xc7, 0xbe, 0x56, 0xe4, 0x83, 0xbd,
- 0x24, 0xfd, 0xf2, 0xbc, 0xf7, 0x32, 0xf4, 0xbd, 0x98, 0x66, 0x7a, 0xbe,
- 0xaf, 0x6c, 0x60, 0x3e, 0xe6, 0xac, 0x3e, 0x3c, 0xa3, 0x2e, 0x73, 0xbe,
- 0x4e, 0x60, 0xe5, 0x3d, 0xbd, 0xbd, 0x84, 0x3d, 0xc8, 0x5a, 0x2c, 0xbe,
- 0x73, 0x36, 0x65, 0xbe, 0x8c, 0xbc, 0x8d, 0xbc, 0xf2, 0x82, 0x08, 0x3d,
- 0x66, 0x62, 0x86, 0xbe, 0x28, 0x34, 0xd2, 0xbe, 0xee, 0xc7, 0x9a, 0x3d,
- 0x9f, 0xa2, 0x2f, 0x3c, 0x78, 0x73, 0xa3, 0x3e, 0xdf, 0x66, 0xe7, 0xbd,
- 0xb1, 0xbb, 0x6f, 0xbe, 0x3a, 0xb5, 0x81, 0xbe, 0xd4, 0x8a, 0x64, 0xbe,
- 0x0c, 0xdb, 0x23, 0x3d, 0x00, 0x79, 0x8f, 0xbe, 0x71, 0x45, 0x22, 0xbe,
- 0x57, 0x58, 0x1b, 0x3e, 0xcb, 0x71, 0x6e, 0x3d, 0xcb, 0x31, 0xcf, 0xbd,
- 0x69, 0xe3, 0xf6, 0xbd, 0x4e, 0x99, 0x7a, 0x3e, 0x85, 0xcf, 0x5b, 0xbe,
- 0x3e, 0x60, 0x90, 0xbe, 0x9c, 0x74, 0x12, 0xbe, 0xb4, 0xef, 0x4c, 0x3d,
- 0x31, 0xf6, 0x16, 0xbe, 0xf3, 0x8d, 0x35, 0x3d, 0x58, 0x1f, 0x89, 0xbd,
- 0x29, 0x87, 0x8f, 0x3e, 0xeb, 0x44, 0xa8, 0xbe, 0x40, 0xa7, 0x20, 0xbe,
- 0x71, 0x02, 0x14, 0xbf, 0x17, 0x58, 0x9f, 0x3d, 0xa9, 0x2d, 0xe7, 0xbc,
- 0xbb, 0x8a, 0x65, 0xbe, 0x9e, 0x6c, 0x86, 0xbc, 0x63, 0x39, 0x51, 0xbb,
- 0x51, 0x83, 0xf1, 0xbd, 0x0b, 0xe2, 0x45, 0xbe, 0xfc, 0xd0, 0x31, 0x3e,
- 0xc1, 0x08, 0x11, 0xbd, 0xdf, 0xdc, 0x00, 0xbe, 0x6e, 0xfa, 0x2c, 0x3e,
- 0x85, 0x9a, 0x5f, 0x3e, 0xd7, 0x42, 0x35, 0x3e, 0x3c, 0x2d, 0x50, 0x3d,
- 0xf8, 0x15, 0x1f, 0xbe, 0xc5, 0x57, 0xa6, 0xbe, 0xf2, 0x9c, 0xad, 0xbe,
- 0xde, 0x9c, 0x0f, 0xbe, 0xb7, 0xb5, 0xbd, 0xbd, 0x4f, 0xc8, 0x98, 0x3c,
- 0xc1, 0x45, 0xf3, 0xbc, 0xe9, 0x59, 0x10, 0xbe, 0xd8, 0xd6, 0x3b, 0x3d,
- 0x47, 0x60, 0x06, 0xbe, 0x4a, 0x35, 0xe1, 0x3d, 0xa0, 0xd9, 0x83, 0x3d,
- 0x76, 0x9b, 0xc4, 0xbd, 0x12, 0xf6, 0x32, 0x3d, 0x16, 0x8e, 0xc4, 0x3b,
- 0x13, 0xa4, 0xd1, 0xbc, 0x58, 0xb8, 0x1d, 0xbd, 0x15, 0xfe, 0xeb, 0xbe,
- 0x5e, 0xbf, 0x19, 0xbe, 0xc8, 0xfe, 0x8d, 0xbd, 0x8c, 0x29, 0x2e, 0x3b,
- 0xcb, 0x99, 0xfb, 0xbd, 0x78, 0x84, 0x5e, 0xbe, 0x9d, 0x8c, 0xf4, 0xbd,
- 0xe8, 0x9d, 0x06, 0xbe, 0xba, 0xa9, 0x09, 0x3e, 0xed, 0x68, 0x75, 0xbe,
- 0x7a, 0x0e, 0x1e, 0xbf, 0x9d, 0x10, 0x83, 0x3e, 0xb5, 0x6f, 0xc4, 0xbd,
- 0xdc, 0x03, 0xa6, 0xbd, 0x31, 0xc4, 0x5e, 0x3e, 0xb3, 0xaf, 0x0e, 0x3e,
- 0x47, 0xfa, 0x80, 0xbe, 0x24, 0x3e, 0x0e, 0x3e, 0x39, 0xdb, 0x19, 0xbf,
- 0xf4, 0xd9, 0x8a, 0xbe, 0xe0, 0x0c, 0x0f, 0xbe, 0xda, 0xbc, 0x72, 0xbc,
- 0x72, 0x50, 0x9a, 0xbd, 0x1b, 0x1f, 0xa6, 0xbe, 0x04, 0xb4, 0x80, 0x3d,
- 0xdc, 0xda, 0x4e, 0x3d, 0xda, 0xb9, 0xde, 0xbd, 0x3c, 0x20, 0x9b, 0xbd,
- 0x24, 0x35, 0x2d, 0xbd, 0x41, 0xc8, 0x9e, 0x3e, 0x0c, 0x4e, 0xc7, 0xbe,
- 0x2f, 0xf7, 0x01, 0xbe, 0x6e, 0xf0, 0xa0, 0x3d, 0x62, 0xd1, 0x2f, 0xbd,
- 0xac, 0xa4, 0xfd, 0xbc, 0x4a, 0xf5, 0xbb, 0x3c, 0x37, 0xba, 0x01, 0xbc,
- 0x56, 0x28, 0x1d, 0xbe, 0x65, 0x7b, 0xe1, 0xbd, 0x3e, 0xe2, 0xa6, 0x3d,
- 0x0e, 0xba, 0xa3, 0x3d, 0x0c, 0x86, 0xb8, 0xbd, 0xea, 0x64, 0x10, 0xbd,
- 0xd5, 0x87, 0xbb, 0x3d, 0x25, 0xa9, 0x91, 0xba, 0x5e, 0x21, 0xf4, 0xbc,
- 0x38, 0x81, 0x4d, 0x3d, 0x6a, 0x10, 0x2e, 0x3c, 0x21, 0x2a, 0xdb, 0x3d,
- 0x91, 0x31, 0x31, 0x3e, 0xa7, 0x72, 0xd5, 0x3c, 0x51, 0x3a, 0xd3, 0x3d,
- 0x1e, 0xb4, 0xd9, 0xbc, 0x0f, 0xb4, 0x02, 0x3e, 0x25, 0x30, 0x6c, 0xba,
- 0x42, 0x71, 0x8a, 0x3e, 0xfb, 0x12, 0xfa, 0xbd, 0x70, 0x4c, 0x1a, 0x3e,
- 0xb3, 0x1d, 0x6c, 0xbc, 0xc0, 0x6e, 0xf2, 0xbd, 0xf9, 0xdf, 0x89, 0x3c,
- 0xf8, 0xb4, 0xb6, 0xbd, 0x05, 0x31, 0xa7, 0xbd, 0x38, 0x91, 0xce, 0xbd,
- 0xe9, 0x6d, 0x35, 0xbc, 0x8b, 0x43, 0x86, 0xbd, 0xed, 0x29, 0xf8, 0x3c,
- 0x58, 0x71, 0xeb, 0xbd, 0x10, 0xd1, 0x0e, 0x3c, 0x17, 0x50, 0x5a, 0xbd,
- 0x80, 0x32, 0xa0, 0x3d, 0xe5, 0xc6, 0x19, 0x3e, 0x47, 0x1e, 0xd3, 0xbc,
- 0x60, 0x16, 0xf2, 0xbc, 0xd0, 0x14, 0xdc, 0x3c, 0x06, 0xb4, 0x46, 0x3d,
- 0xaa, 0x43, 0xdb, 0xbd, 0x29, 0xc5, 0x0f, 0xbe, 0xc2, 0x58, 0xf4, 0x3c,
- 0x7b, 0x1a, 0x76, 0x3d, 0xe3, 0xee, 0xfe, 0xba, 0xdb, 0xff, 0x02, 0xbe,
- 0x8c, 0x65, 0x80, 0x3d, 0x2f, 0x23, 0xcf, 0xbd, 0x72, 0xe4, 0xac, 0xbc,
- 0xb5, 0x54, 0xc8, 0xbd, 0x71, 0xa0, 0xf2, 0xbd, 0xff, 0xe1, 0xe4, 0xbc,
- 0x52, 0x38, 0x10, 0x3e, 0xc8, 0x1f, 0x10, 0x3e, 0x6c, 0xed, 0x00, 0x3e,
- 0x70, 0x75, 0x0f, 0xbd, 0x2b, 0x80, 0xaf, 0xbd, 0x78, 0x24, 0x28, 0xbd,
- 0xfe, 0xd3, 0xe8, 0xbd, 0x4e, 0x9d, 0xfd, 0x3a, 0xfe, 0xb4, 0xb0, 0xbc,
- 0xab, 0xa9, 0x3f, 0x3a, 0x0b, 0x44, 0xe9, 0x3d, 0x1a, 0x85, 0xe0, 0xbd,
- 0x1a, 0x61, 0x94, 0xbc, 0x65, 0x86, 0xa2, 0x3d, 0x38, 0x17, 0xb3, 0x3d,
- 0x3f, 0xe2, 0xcd, 0x3b, 0x19, 0xca, 0xd5, 0xbd, 0xf2, 0xbc, 0x7e, 0x3e,
- 0x7b, 0xcf, 0xe7, 0xbd, 0x50, 0x36, 0xaa, 0x3d, 0xd9, 0x40, 0x94, 0xbc,
- 0xb5, 0xb8, 0xd3, 0x3d, 0xcc, 0x9a, 0x0e, 0x3e, 0x59, 0xc9, 0xc7, 0x3c,
- 0x1a, 0xbf, 0x0c, 0x3d, 0x8e, 0x1e, 0x2a, 0x3d, 0x9f, 0x2f, 0x82, 0xbe,
- 0x56, 0xd9, 0xa1, 0xbd, 0x8c, 0x2f, 0x1f, 0x3e, 0xd9, 0x98, 0x3e, 0xbd,
- 0x0e, 0x6b, 0xba, 0xba, 0xb6, 0x66, 0x1e, 0x3d, 0x12, 0xb9, 0x75, 0xbd,
- 0x1b, 0xc1, 0x8b, 0x3d, 0x0b, 0xc2, 0xa9, 0xbd, 0x79, 0x99, 0x0b, 0x3e,
- 0x0f, 0xb9, 0x2f, 0x3d, 0x93, 0xcf, 0x1e, 0x3e, 0xa9, 0xa7, 0x15, 0x3e,
- 0x3e, 0xa9, 0xd8, 0xbd, 0x52, 0x46, 0xf9, 0xbc, 0x6a, 0x3b, 0x57, 0x3d,
- 0xa5, 0xcd, 0x5b, 0x3d, 0x90, 0xe2, 0xd2, 0xbc, 0x46, 0x26, 0xab, 0x3d,
- 0x7e, 0x00, 0xc5, 0xbd, 0xf2, 0x1c, 0x13, 0x3e, 0xc1, 0x5a, 0x07, 0xbe,
- 0x42, 0x88, 0xea, 0xbd, 0x4c, 0xf5, 0xd3, 0xbd, 0x36, 0x03, 0x1e, 0xbd,
- 0xb8, 0x32, 0x14, 0x3e, 0x9e, 0xe9, 0x25, 0xbc, 0x20, 0xd8, 0x48, 0xbc,
- 0x16, 0x4c, 0x7b, 0x3d, 0xa4, 0xee, 0xda, 0x3d, 0x5b, 0x07, 0x85, 0x3d,
- 0xd7, 0x67, 0x49, 0x3d, 0x8e, 0xde, 0x85, 0x3d, 0x80, 0x64, 0xf0, 0x3c,
- 0xbf, 0xd0, 0xc3, 0xbc, 0x69, 0xa6, 0xfd, 0x3b, 0x42, 0xee, 0x0d, 0x3e,
- 0x95, 0xd7, 0xff, 0x3d, 0xa3, 0x1c, 0x83, 0x3b, 0xe5, 0x60, 0x6e, 0x3d,
- 0x72, 0xff, 0x47, 0xbc, 0x1d, 0xb3, 0x92, 0x3d, 0xca, 0xd5, 0xfa, 0x3d,
- 0x6e, 0x4a, 0x40, 0x3c, 0x0c, 0x05, 0xae, 0x3b, 0x7e, 0x93, 0x0e, 0xbe,
- 0x1b, 0xea, 0xf7, 0x3d, 0x79, 0x26, 0x0e, 0x3e, 0x49, 0xc2, 0x5c, 0xbd,
- 0xa8, 0x91, 0x1c, 0x3e, 0xfe, 0x07, 0x8d, 0xbc, 0x01, 0xc4, 0x24, 0xbe,
- 0x80, 0x56, 0x6a, 0xbc, 0x32, 0x65, 0x6e, 0xbe, 0x3d, 0xd8, 0x42, 0x3d,
- 0xcd, 0x23, 0x5b, 0xbb, 0xc5, 0x20, 0x1c, 0x3e, 0xc3, 0xec, 0x4c, 0xbd,
- 0x90, 0x32, 0xf4, 0x3b, 0xac, 0x22, 0x7c, 0xbe, 0xcd, 0x1f, 0xaa, 0x3d,
- 0xbc, 0xb6, 0xb6, 0xbd, 0xc3, 0xa9, 0xf7, 0x3d, 0x50, 0x3b, 0xa4, 0x3d,
- 0xa7, 0xb4, 0xc3, 0xbd, 0x0c, 0xe0, 0x96, 0x3c, 0xa7, 0xa8, 0x21, 0xbe,
- 0xd1, 0x9b, 0xa3, 0xbd, 0xab, 0x4a, 0x42, 0xbd, 0x8f, 0x7f, 0x55, 0x3e,
- 0x31, 0xbc, 0x06, 0xbe, 0xc8, 0x2d, 0xcb, 0x3d, 0x3f, 0x04, 0x4e, 0xbd,
- 0xba, 0x30, 0x92, 0x3b, 0x6d, 0x35, 0x08, 0xbe, 0x79, 0x47, 0x04, 0x3e,
- 0x54, 0xf2, 0x1e, 0x3d, 0xde, 0x42, 0x3b, 0x3c, 0xf8, 0xdc, 0xdd, 0x3b,
- 0x53, 0x34, 0xf4, 0x3d, 0xa4, 0x91, 0xb5, 0x3d, 0x66, 0x48, 0x21, 0xbe,
- 0xff, 0xfd, 0x37, 0xbe, 0xca, 0xe7, 0x5b, 0x3d, 0x7c, 0x27, 0x63, 0x3e,
- 0x0e, 0x3b, 0x69, 0xbe, 0x69, 0x28, 0xa9, 0xbd, 0x90, 0x51, 0x26, 0xbd,
- 0xfe, 0x6e, 0x3e, 0xbd, 0x55, 0xa9, 0xb1, 0x3d, 0x4e, 0xff, 0x1f, 0xbe,
- 0x67, 0xfe, 0x11, 0x3d, 0x07, 0xb8, 0x24, 0x3d, 0x6b, 0x0c, 0xc0, 0x3d,
- 0x39, 0x95, 0xc7, 0xbd, 0x75, 0xcb, 0xdf, 0xbd, 0x79, 0xc4, 0xe1, 0x3d,
- 0xc7, 0x41, 0xdf, 0x3c, 0x13, 0x9a, 0x0b, 0xbd, 0x5e, 0xce, 0x02, 0xbd,
- 0xca, 0xf7, 0x10, 0xbe, 0x14, 0x62, 0x33, 0x3d, 0xbc, 0x81, 0xca, 0xbd,
- 0x8e, 0xee, 0x6a, 0x3c, 0x1a, 0xde, 0xb9, 0xbd, 0x10, 0x38, 0x40, 0x3e,
- 0xb0, 0x33, 0x4f, 0xbe, 0x06, 0x8b, 0x8f, 0xbd, 0xd2, 0xec, 0x10, 0x3d,
- 0x37, 0xb6, 0x04, 0x3e, 0x59, 0xb7, 0xb0, 0x3d, 0x51, 0x7f, 0x26, 0x3e,
- 0x2b, 0x50, 0x1e, 0x3d, 0xc0, 0x33, 0xe5, 0xbd, 0xb0, 0xc4, 0x54, 0xbc,
- 0xb1, 0x44, 0x4f, 0x3e, 0x08, 0xa9, 0x73, 0x3d, 0x2f, 0x3c, 0xa8, 0xbd,
- 0x9c, 0xf0, 0x0e, 0xbd, 0x44, 0x7c, 0xe3, 0x3d, 0xd9, 0xae, 0x98, 0x3c,
- 0x14, 0x9c, 0x78, 0x3d, 0xbd, 0x10, 0x19, 0x3d, 0x6b, 0xb2, 0x28, 0xbd,
- 0x69, 0x9b, 0x83, 0x3e, 0xec, 0x77, 0x00, 0xbc, 0x00, 0x5a, 0xcf, 0x3d,
- 0x37, 0x04, 0x1b, 0x3b, 0xfb, 0xb4, 0x2f, 0xbd, 0xd2, 0xfc, 0x19, 0xbe,
- 0x3a, 0xff, 0x9e, 0x3c, 0x45, 0xa0, 0x41, 0xbd, 0x58, 0x37, 0x89, 0x3d,
- 0x23, 0x4d, 0x24, 0xbe, 0x1c, 0xbb, 0x5b, 0xbc, 0x76, 0x5f, 0x1e, 0x3e,
- 0xe0, 0xc6, 0x90, 0xbd, 0x66, 0xa1, 0x0a, 0x3d, 0xbb, 0x29, 0x87, 0x3c,
- 0x32, 0x9b, 0x9b, 0xbe, 0xa3, 0xf1, 0x26, 0xbc, 0x42, 0xf0, 0x68, 0x3d,
- 0x2b, 0xad, 0xe1, 0x3c, 0x28, 0x54, 0xb2, 0xbd, 0x25, 0xe8, 0x36, 0xbe,
- 0xfc, 0x89, 0xb8, 0x3d, 0xeb, 0x00, 0x71, 0xbd, 0x53, 0x3f, 0xd4, 0xbd,
- 0x2f, 0x21, 0x7f, 0xbd, 0x99, 0x98, 0x5b, 0x3d, 0xc8, 0x96, 0x10, 0x3e,
- 0x85, 0x36, 0xc1, 0x3d, 0x9e, 0x84, 0xf3, 0xbd, 0xed, 0xb2, 0x98, 0xbd,
- 0x18, 0x3b, 0x85, 0x3d, 0x4b, 0x7f, 0xfd, 0x3c, 0x2e, 0xc3, 0x9b, 0x3d,
- 0xef, 0x26, 0x94, 0x3d, 0xc7, 0xdd, 0xcb, 0x3d, 0xf4, 0x85, 0x6f, 0x3d,
- 0x0c, 0x4f, 0xaf, 0x3d, 0x87, 0x14, 0x76, 0x3d, 0xd7, 0x54, 0xa5, 0xbb,
- 0x95, 0xce, 0x05, 0x3e, 0x69, 0x33, 0x56, 0x3c, 0xc4, 0x2e, 0x46, 0xbb,
- 0x4e, 0x8d, 0xd7, 0xbd, 0x68, 0x50, 0x0a, 0x3e, 0x74, 0x45, 0x7f, 0xbe,
- 0x64, 0x9d, 0x0d, 0xbe, 0x23, 0x33, 0x52, 0x3d, 0x2d, 0xdf, 0xfe, 0xbd,
- 0x5d, 0x6e, 0xc9, 0x3d, 0x1e, 0x10, 0x0e, 0x3d, 0xfd, 0x05, 0xa8, 0xbd,
- 0x87, 0x62, 0xf9, 0x3d, 0xb2, 0xb8, 0x6c, 0x3e, 0x62, 0x21, 0x62, 0x3c,
- 0xc1, 0x01, 0x82, 0x3d, 0xbd, 0xc7, 0xa3, 0x3c, 0x3a, 0xef, 0x4c, 0xbe,
- 0xa2, 0xa2, 0xb3, 0x3d, 0x09, 0x34, 0xd3, 0xbd, 0x26, 0x06, 0x41, 0x3d,
- 0xf2, 0xe0, 0x08, 0x3e, 0xe1, 0x8d, 0x38, 0xbe, 0x2a, 0xde, 0x3d, 0x3d,
- 0x97, 0x15, 0x4e, 0x3d, 0xfb, 0xc9, 0xa1, 0xbc, 0xde, 0xea, 0xdd, 0x3d,
- 0x21, 0xeb, 0xa9, 0xbb, 0x4d, 0x7a, 0xd8, 0xbd, 0xb7, 0xef, 0xb1, 0x3d,
- 0x4a, 0x54, 0xc1, 0x3d, 0xcb, 0x69, 0x13, 0xbc, 0xaf, 0xd9, 0x29, 0xbd,
- 0x20, 0xcb, 0x13, 0x3e, 0xcd, 0xa8, 0xac, 0xbd, 0x8f, 0xb7, 0x89, 0xbd,
- 0xa3, 0x52, 0xee, 0xbd, 0xba, 0x15, 0x5a, 0xbb, 0xcc, 0x34, 0xd3, 0xbd,
- 0x07, 0x7d, 0x80, 0x3d, 0xae, 0x17, 0x99, 0x3c, 0x5e, 0xce, 0xff, 0xbd,
- 0x79, 0xd5, 0x0e, 0xbe, 0x84, 0x9c, 0x64, 0xbd, 0xd2, 0x7f, 0x18, 0x3e,
- 0x47, 0x53, 0x2e, 0xbd, 0x79, 0x55, 0xea, 0xbc, 0x6d, 0x75, 0x00, 0x3e,
- 0x6b, 0xb3, 0x25, 0xbd, 0x0a, 0x5a, 0x86, 0xbc, 0x82, 0xc2, 0x06, 0xbe,
- 0x69, 0x71, 0x4b, 0x3d, 0x89, 0x59, 0x5c, 0x3d, 0xbc, 0x00, 0x40, 0x3d,
- 0xdd, 0xdf, 0xdf, 0x3d, 0x74, 0xe9, 0x09, 0xbe, 0x0b, 0xe9, 0xa3, 0x3d,
- 0x17, 0x54, 0x22, 0xbe, 0x32, 0x6c, 0x24, 0xbe, 0x6f, 0x38, 0x86, 0xbd,
- 0xeb, 0xd8, 0x1d, 0x3e, 0xfa, 0xaf, 0xe2, 0xbd, 0x20, 0x6d, 0x7f, 0x3d,
- 0x93, 0x54, 0xd0, 0x3d, 0x38, 0xb0, 0xc5, 0xbd, 0xad, 0x97, 0x33, 0xbc,
- 0x92, 0x7a, 0xe7, 0xbd, 0x26, 0xb8, 0xcd, 0xbd, 0xd2, 0x99, 0x09, 0x3e,
- 0x46, 0x45, 0x63, 0x3d, 0xeb, 0xa5, 0x0e, 0x3d, 0x2e, 0x77, 0x10, 0xbe,
- 0xa1, 0x00, 0x28, 0xbc, 0x88, 0xbe, 0xcd, 0xbc, 0x89, 0xf8, 0x37, 0xbd,
- 0x7e, 0x56, 0x2d, 0x3d, 0xc3, 0x1a, 0xad, 0xbd, 0xb0, 0xa7, 0x16, 0x3c,
- 0xde, 0x24, 0x4a, 0xbd, 0x29, 0x24, 0x0d, 0xbe, 0xe0, 0x95, 0xde, 0x3d,
- 0x26, 0x57, 0xd3, 0x3a, 0xf1, 0x2c, 0x83, 0xbd, 0x90, 0x8d, 0xf9, 0x3d,
- 0xc5, 0x12, 0xd6, 0x3d, 0x13, 0x96, 0x85, 0x3d, 0x19, 0x3a, 0x62, 0x3d,
- 0x44, 0xcf, 0xe6, 0xbc, 0xc0, 0xda, 0x07, 0x3e, 0x1f, 0x9c, 0xdb, 0xbd,
- 0x3f, 0xf6, 0xf7, 0xbc, 0x89, 0xb2, 0x78, 0xbd, 0x9b, 0x77, 0xa6, 0xbd,
- 0x04, 0xcc, 0x48, 0x3e, 0xcf, 0xad, 0x1b, 0xbe, 0x78, 0xab, 0x5d, 0x3c,
- 0x4b, 0x98, 0x26, 0xbd, 0xc1, 0xf7, 0x8b, 0xbb, 0xb4, 0x7f, 0xb2, 0x3c,
- 0xa5, 0xff, 0x00, 0xbe, 0x6c, 0xa9, 0xdc, 0x3d, 0xf1, 0xba, 0x69, 0x3d,
- 0xef, 0xf1, 0x0a, 0x3e, 0xda, 0x35, 0x52, 0xbd, 0x62, 0x14, 0xc8, 0x3c,
- 0xa6, 0x2c, 0x78, 0xbd, 0x99, 0x70, 0x8b, 0xbc, 0x3e, 0x50, 0xf3, 0xbd,
- 0x2e, 0xe3, 0xd4, 0x3c, 0xef, 0xf6, 0xae, 0x3d, 0xef, 0x31, 0xa4, 0x3d,
- 0x32, 0x7d, 0x0f, 0xbe, 0xa0, 0x88, 0x93, 0x3d, 0xa1, 0x42, 0x15, 0xbe,
- 0x94, 0xc7, 0x03, 0x3e, 0xd9, 0x9d, 0x75, 0x3d, 0xcc, 0x1c, 0xcf, 0xbd,
- 0x05, 0x6e, 0x52, 0x3d, 0x0d, 0xec, 0xc5, 0x3d, 0x7f, 0x3c, 0x51, 0xbc,
- 0xda, 0xa4, 0x13, 0xbd, 0x8e, 0x7b, 0x80, 0x3d, 0x5f, 0x25, 0x8b, 0xbd,
- 0xd0, 0x78, 0x69, 0xb9, 0x79, 0x13, 0x13, 0xbe, 0xe7, 0xf2, 0xac, 0x3d,
- 0x3d, 0x6a, 0x83, 0xbd, 0x4b, 0x2d, 0xe2, 0x3d, 0x3d, 0x88, 0x88, 0x3d,
- 0x2a, 0xb1, 0xe0, 0xbc, 0x30, 0xe6, 0x2f, 0x3d, 0x85, 0xda, 0x85, 0xbd,
- 0xa4, 0x83, 0x44, 0x3d, 0x8b, 0x6e, 0x1d, 0x3e, 0xaf, 0xf5, 0x08, 0xbe,
- 0x19, 0x1d, 0x85, 0x3d, 0xb9, 0xaa, 0xa4, 0x3d, 0xed, 0xbd, 0x1c, 0xbe,
- 0x96, 0xb3, 0x18, 0xbe, 0x8f, 0x79, 0xce, 0x3c, 0x9d, 0xf0, 0x45, 0xbe,
- 0x45, 0x94, 0xd7, 0x3d, 0xe1, 0x96, 0x1a, 0x3e, 0x69, 0xce, 0xa6, 0xbd,
- 0xbc, 0xb2, 0x7d, 0xbd, 0x10, 0x28, 0xd1, 0xbc, 0x95, 0x46, 0x4b, 0x3d,
- 0x1b, 0x36, 0xc4, 0x3d, 0xe7, 0x0c, 0x63, 0xbd, 0x12, 0x48, 0x70, 0xbd,
- 0x62, 0xb8, 0xb5, 0xbe, 0x1b, 0x56, 0x13, 0xbe, 0xa2, 0xe6, 0x1d, 0x3e,
- 0x8a, 0xfb, 0x31, 0xbe, 0x49, 0xcb, 0xe4, 0xbd, 0x67, 0xea, 0x09, 0xbe,
- 0x3b, 0x06, 0xd1, 0x3c, 0xa7, 0x7d, 0xf7, 0x3c, 0x62, 0x12, 0x18, 0xbe,
- 0x06, 0xa7, 0x6a, 0x3d, 0x61, 0x42, 0xab, 0xbe, 0xf3, 0x81, 0x21, 0x3e,
- 0x77, 0x23, 0xa3, 0x3d, 0x9e, 0x76, 0xbd, 0xbc, 0xf2, 0xb7, 0xa4, 0xbd,
- 0xcc, 0x84, 0x5e, 0xbe, 0xe4, 0x6b, 0xd8, 0xbd, 0x67, 0x82, 0x6d, 0xbe,
- 0x13, 0xe1, 0x1d, 0xbd, 0xa7, 0x4e, 0xc7, 0xbb, 0xcf, 0x9a, 0xef, 0xbe,
- 0xf9, 0x9e, 0xd1, 0x3c, 0x1f, 0x6d, 0xbe, 0x3d, 0x0c, 0xae, 0x7f, 0xbe,
- 0x5f, 0x28, 0x4d, 0x3d, 0xb5, 0x1b, 0xcb, 0xbe, 0xef, 0xae, 0x3f, 0x3e,
- 0x61, 0x55, 0xf0, 0xbe, 0x8e, 0xc7, 0x95, 0x3c, 0x90, 0x1d, 0x3a, 0x3e,
- 0x60, 0x83, 0x32, 0xbd, 0xfe, 0x51, 0x12, 0xbe, 0x91, 0xb2, 0x0f, 0xbe,
- 0x2e, 0x65, 0xcd, 0xbe, 0x47, 0xb2, 0xb7, 0xbe, 0x7a, 0x0c, 0x49, 0xbe,
- 0xa1, 0x32, 0x72, 0xbd, 0x25, 0x33, 0x52, 0xbe, 0xe6, 0x7a, 0xd5, 0xbc,
- 0x76, 0x97, 0x5d, 0xbd, 0xcf, 0x0c, 0x7b, 0xbe, 0x18, 0x10, 0x2d, 0x3c,
- 0x57, 0xe4, 0xc9, 0x3d, 0x76, 0x5c, 0xe8, 0xbe, 0x6f, 0x35, 0x35, 0xbe,
- 0x2b, 0x82, 0x05, 0xbe, 0x47, 0x25, 0xfc, 0xbd, 0xd5, 0xfe, 0xa9, 0xbe,
- 0x0f, 0xf1, 0x09, 0xbe, 0xce, 0xec, 0x1a, 0xbe, 0x34, 0xd5, 0x55, 0xbd,
- 0xc3, 0xc9, 0x73, 0xbe, 0xf5, 0x04, 0x01, 0xbf, 0x3e, 0xa2, 0x97, 0xbe,
- 0x61, 0x04, 0x1c, 0x3e, 0x0b, 0x6b, 0x1e, 0xbe, 0xca, 0x7f, 0xc8, 0xbe,
- 0x8b, 0xc7, 0xe4, 0xbd, 0x7c, 0x2c, 0x92, 0xbd, 0x19, 0xed, 0x4d, 0x3d,
- 0x59, 0xd9, 0x8c, 0xbd, 0xa7, 0xb8, 0x4c, 0xbe, 0x47, 0x2d, 0xc2, 0xbd,
- 0xa2, 0xb3, 0x48, 0xbc, 0x8f, 0xc6, 0xc7, 0xbd, 0xad, 0x45, 0x3d, 0xbd,
- 0xa5, 0xec, 0xaa, 0xbd, 0x56, 0xe5, 0x21, 0xbe, 0x8c, 0xd1, 0x28, 0xbd,
- 0x70, 0x88, 0x1c, 0xbe, 0x1d, 0xd2, 0x89, 0xbe, 0x5c, 0xbb, 0x81, 0x3b,
- 0x86, 0x43, 0x14, 0xbe, 0x32, 0xb2, 0x68, 0xbd, 0x3c, 0x7b, 0x31, 0x3d,
- 0x24, 0xb7, 0x84, 0xbe, 0x62, 0x1a, 0x88, 0xbe, 0x58, 0x53, 0x44, 0xbd,
- 0xcb, 0x4b, 0x2a, 0x3e, 0x1e, 0x59, 0xa3, 0xbd, 0x4a, 0xbc, 0x36, 0xbe,
- 0xde, 0xce, 0x9e, 0xbc, 0x2a, 0x75, 0xcb, 0xbd, 0x08, 0x0f, 0x6f, 0xbe,
- 0xb7, 0x46, 0x0f, 0xbd, 0x45, 0xc1, 0x27, 0xbe, 0x47, 0x78, 0x80, 0xbe,
- 0xbe, 0x36, 0xf7, 0xbd, 0x3b, 0x89, 0x80, 0xbe, 0x30, 0x06, 0x0c, 0x3d,
- 0x85, 0x8a, 0x27, 0xbe, 0x04, 0x66, 0x37, 0xbe, 0x62, 0xef, 0x6c, 0xbe,
- 0x1d, 0x74, 0x37, 0xbe, 0x9b, 0x4b, 0x04, 0xbe, 0x8f, 0x09, 0x6c, 0xbe,
- 0x08, 0x1d, 0x91, 0x3c, 0x1d, 0x28, 0xc8, 0xbe, 0x66, 0xbc, 0xf3, 0x3d,
- 0xe5, 0xe0, 0xd3, 0xbd, 0x01, 0x4c, 0x12, 0xbe, 0x03, 0x4d, 0x8e, 0xbe,
- 0xa5, 0x15, 0x14, 0x3d, 0xf6, 0xc3, 0x69, 0xbe, 0x20, 0x48, 0x6b, 0xbe,
- 0x52, 0xde, 0x2b, 0xbd, 0xdc, 0xb4, 0x83, 0xbe, 0xa4, 0xf2, 0xd0, 0xbe,
- 0x16, 0x4d, 0x43, 0xbe, 0x5c, 0x6e, 0xf6, 0xbd, 0x03, 0xe2, 0xd4, 0xbd,
- 0x3b, 0x2f, 0x84, 0xbe, 0xba, 0xf2, 0xbc, 0x3c, 0xbb, 0x50, 0xa9, 0x3c,
- 0xe6, 0x16, 0x3c, 0xbe, 0x90, 0xa0, 0x11, 0xbf, 0x12, 0xf2, 0x0c, 0x3c,
- 0x9e, 0x64, 0xcd, 0xba, 0x20, 0x80, 0xb1, 0xbe, 0xd7, 0x82, 0x08, 0xbf,
- 0x6d, 0x4a, 0xb0, 0x3d, 0x34, 0x19, 0x81, 0xbe, 0xe8, 0x56, 0x51, 0xbe,
- 0x1f, 0xf8, 0x3e, 0xbe, 0xc5, 0x3f, 0x8a, 0xbd, 0x90, 0xeb, 0xb9, 0x3d,
- 0x4f, 0xd3, 0x45, 0x3e, 0x9e, 0x72, 0x96, 0xbd, 0xb7, 0x3f, 0x3d, 0xbd,
- 0xc1, 0x7a, 0xc4, 0xbe, 0xed, 0x5e, 0x92, 0x3c, 0xb0, 0x41, 0xf9, 0xbe,
- 0xdf, 0x58, 0x79, 0x3e, 0xbe, 0xa0, 0x2a, 0x3d, 0x72, 0xf1, 0xd3, 0x3d,
- 0x4f, 0xbb, 0x04, 0xbe, 0x0a, 0xea, 0xb7, 0xbd, 0x46, 0x86, 0xb0, 0x3e,
- 0x7f, 0x6e, 0x6e, 0xbe, 0xb0, 0x2c, 0x00, 0xbe, 0x47, 0x73, 0x4a, 0xbc,
- 0x8d, 0x72, 0x44, 0x3e, 0x1b, 0x94, 0xad, 0x3d, 0xa8, 0x55, 0xc7, 0x3d,
- 0xae, 0xb9, 0x57, 0x3e, 0xe2, 0x05, 0x01, 0x3e, 0x90, 0x80, 0x39, 0xbe,
- 0xff, 0x6b, 0xb2, 0xbd, 0xe6, 0x8c, 0x43, 0x3e, 0x03, 0x05, 0x86, 0x3e,
- 0x37, 0xd1, 0x04, 0xbe, 0xf3, 0x32, 0x9e, 0xbe, 0x95, 0x5a, 0x71, 0xbe,
- 0x0a, 0x86, 0x95, 0xbe, 0x86, 0xb4, 0x64, 0x3d, 0x76, 0xea, 0x2a, 0xbe,
- 0x27, 0xfe, 0x02, 0x3d, 0x9d, 0x4c, 0x0d, 0x3e, 0xe7, 0x47, 0x71, 0x3e,
- 0x52, 0xa1, 0xa1, 0xbd, 0x25, 0xaa, 0xb4, 0xbc, 0x4a, 0x64, 0x51, 0x3e,
- 0xd8, 0x43, 0xfa, 0xbd, 0xa0, 0xb4, 0x2b, 0xbd, 0x63, 0xaa, 0xaf, 0x3d,
- 0x1f, 0x52, 0xd5, 0xbc, 0x2a, 0x01, 0x11, 0xbe, 0x1a, 0x72, 0x91, 0x3e,
- 0x1a, 0x57, 0x64, 0x3e, 0x43, 0x1a, 0x15, 0x3e, 0xbf, 0x6c, 0x0e, 0xbd,
- 0xc3, 0x07, 0xc9, 0xbe, 0x36, 0x0b, 0xfb, 0x3d, 0x0e, 0xae, 0x72, 0xbe,
- 0xb0, 0xf3, 0x19, 0xbe, 0x05, 0x53, 0x7a, 0x3c, 0x94, 0xa4, 0x8a, 0xbd,
- 0x8e, 0xa3, 0xc1, 0x3d, 0x2c, 0x0a, 0x24, 0x3e, 0x92, 0x14, 0xbd, 0xbd,
- 0x41, 0x84, 0xd4, 0x3d, 0x05, 0x41, 0x77, 0xbd, 0x89, 0x45, 0x85, 0x3e,
- 0xe3, 0x73, 0x7d, 0x3e, 0xdc, 0x89, 0xcf, 0x3d, 0x68, 0x25, 0x4b, 0xbd,
- 0x59, 0x70, 0xfd, 0x3d, 0xf8, 0x5c, 0x5c, 0x3d, 0x35, 0x2f, 0x19, 0x3d,
- 0x27, 0x3a, 0x88, 0x38, 0x64, 0x29, 0x3b, 0x3e, 0x55, 0xdc, 0xbb, 0xbb,
- 0x3a, 0xb0, 0xba, 0x3d, 0x81, 0xa9, 0x84, 0x3e, 0x7c, 0xff, 0xed, 0xbc,
- 0x97, 0x3c, 0xe0, 0xbd, 0x9d, 0xf2, 0x7a, 0xbd, 0xf7, 0xd6, 0xa3, 0xbc,
- 0x03, 0x28, 0x06, 0x3c, 0xa5, 0x29, 0x77, 0xbd, 0x62, 0x6f, 0xa2, 0xbe,
- 0x3f, 0x4e, 0x74, 0xbe, 0x30, 0x87, 0xb6, 0x3e, 0x49, 0xe7, 0x15, 0x3e,
- 0x12, 0xe9, 0x4a, 0xbe, 0xa0, 0xb0, 0xe6, 0x3d, 0x98, 0xfd, 0x42, 0x3e,
- 0xf9, 0x1d, 0xf1, 0x3d, 0xf6, 0x46, 0x38, 0xbc, 0xef, 0x25, 0x8a, 0x3e,
- 0x2f, 0x15, 0x1d, 0x3e, 0x71, 0xc7, 0x98, 0xbd, 0xd5, 0x75, 0x8b, 0xbe,
- 0x21, 0xdd, 0xcb, 0xbd, 0x3e, 0xc9, 0x9d, 0xbd, 0x60, 0x3c, 0xa6, 0x3e,
- 0x03, 0x1b, 0x1d, 0x3e, 0x80, 0x4a, 0xb0, 0x3d, 0x76, 0x7a, 0xb8, 0xbd,
- 0xff, 0x8b, 0x8f, 0xbd, 0x39, 0xd9, 0xd7, 0xbc, 0x51, 0xf5, 0xb1, 0x3d,
- 0x50, 0x21, 0x3e, 0xbf, 0x72, 0x25, 0x6a, 0x3d, 0xac, 0xed, 0x08, 0xbe,
- 0xea, 0x62, 0x80, 0xbe, 0x3f, 0x38, 0x9e, 0xbc, 0xf0, 0x60, 0x86, 0xbe,
- 0x44, 0x32, 0x9c, 0xbd, 0x2c, 0x27, 0xb2, 0x3e, 0x17, 0x8d, 0xca, 0x3d,
- 0x98, 0x83, 0xea, 0xbd, 0x28, 0x8c, 0x03, 0xbe, 0x8f, 0x77, 0x24, 0xbe,
- 0xbf, 0x7c, 0x91, 0xbd, 0x89, 0xaf, 0x80, 0x3e, 0x07, 0x02, 0x10, 0xbe,
- 0x27, 0xcd, 0xab, 0xbd, 0x1f, 0x4b, 0x81, 0x3c, 0x4e, 0x74, 0xf0, 0x3d,
- 0x1e, 0xba, 0x1a, 0xbd, 0x48, 0x7c, 0x89, 0x3e, 0x59, 0xa6, 0x76, 0xbe,
- 0xc3, 0xc0, 0xd6, 0x3d, 0x56, 0xb9, 0x36, 0x3e, 0x7f, 0x3f, 0x0a, 0xbe,
- 0x3f, 0x44, 0x2d, 0xbe, 0x37, 0xc7, 0x4a, 0x3d, 0xf1, 0x4a, 0x48, 0x3e,
- 0x3f, 0x5c, 0xb3, 0xbc, 0x62, 0x26, 0x53, 0x3e, 0x10, 0x51, 0x1d, 0xbd,
- 0xd6, 0x1a, 0x80, 0xbe, 0xf9, 0xed, 0x8d, 0x3e, 0x36, 0x2d, 0xc0, 0xbc,
- 0x3d, 0x41, 0x1e, 0xbc, 0xea, 0x1d, 0x15, 0xbe, 0x85, 0xdc, 0x2b, 0x3e,
- 0x3d, 0xf2, 0xc5, 0x3e, 0x4d, 0x0e, 0x6d, 0x3e, 0x75, 0xca, 0xc0, 0x39,
- 0x23, 0x1d, 0xa9, 0xbe, 0x98, 0xfe, 0x83, 0xbe, 0x44, 0x98, 0x92, 0x3e,
- 0x6d, 0x4a, 0xe3, 0x3e, 0x96, 0x2e, 0x82, 0x3e, 0xe9, 0xa7, 0x56, 0xbe,
- 0xc8, 0x36, 0x24, 0x3e, 0x62, 0xaf, 0x97, 0xbe, 0x7d, 0xa5, 0xdd, 0xbc,
- 0x10, 0x82, 0x6f, 0xbe, 0xfe, 0x82, 0x52, 0xbd, 0xcf, 0x3c, 0x12, 0xbd,
- 0x91, 0x0e, 0xde, 0xbe, 0x75, 0x68, 0xb0, 0x3d, 0x72, 0x43, 0x75, 0xbd,
- 0xd4, 0x88, 0x9c, 0x3c, 0xf9, 0xd4, 0xaf, 0xbd, 0xba, 0x9b, 0x0b, 0x3d,
- 0xef, 0x6f, 0x38, 0x3d, 0xa4, 0x09, 0xce, 0x3e, 0xc6, 0x3a, 0x9f, 0x3d,
- 0xff, 0x28, 0x7d, 0xbd, 0xab, 0x52, 0xb8, 0xbe, 0x9b, 0x95, 0x5d, 0xbd,
- 0xfb, 0xda, 0x87, 0xbe, 0xf3, 0xdf, 0x3d, 0x3e, 0xd0, 0xb1, 0xff, 0x3e,
- 0x51, 0xba, 0xf4, 0xbe, 0xb0, 0xfb, 0x38, 0xbe, 0xa1, 0x74, 0xd6, 0x3d,
- 0x3e, 0xd8, 0x1b, 0xbd, 0x23, 0xa2, 0x11, 0xbc, 0x9e, 0x1a, 0x2f, 0xbd,
- 0x81, 0xc3, 0x55, 0xbe, 0x23, 0x59, 0x19, 0xbe, 0xff, 0xce, 0x8f, 0xbd,
- 0x25, 0x00, 0xe4, 0x3d, 0xac, 0x75, 0x3b, 0x3e, 0xc6, 0x69, 0x0f, 0xbe,
- 0x80, 0x16, 0xf3, 0xbd, 0x6c, 0xf7, 0xb0, 0xbb, 0xa7, 0x21, 0x9c, 0x3c,
- 0x35, 0xea, 0xfa, 0xbb, 0xfd, 0x78, 0x1a, 0xbe, 0x4b, 0xe3, 0x25, 0xbf,
- 0x04, 0xa4, 0x72, 0x3c, 0x3d, 0x6a, 0x02, 0xbe, 0xe7, 0xcb, 0x5c, 0xbe,
- 0xa4, 0x07, 0x6b, 0x3e, 0xa4, 0x09, 0x44, 0xbe, 0xba, 0x08, 0xd7, 0xbc,
- 0xe2, 0x29, 0x05, 0xbe, 0xef, 0x90, 0x60, 0xbe, 0xba, 0x1d, 0x88, 0xbe,
- 0xfa, 0xd5, 0x64, 0xbe, 0xcb, 0xaf, 0x8c, 0xbe, 0x1f, 0x54, 0x15, 0x3e,
- 0x54, 0xeb, 0x2f, 0x3a, 0x35, 0xc8, 0x56, 0x3d, 0x60, 0x9e, 0x0e, 0x3d,
- 0x24, 0x0e, 0x5f, 0xbe, 0x07, 0x85, 0x29, 0x3e, 0xf7, 0xab, 0x45, 0xbe,
- 0x2d, 0x0c, 0xb4, 0xbd, 0xde, 0x64, 0x1e, 0xbf, 0x99, 0xb7, 0x52, 0x3d,
- 0x20, 0x8a, 0x3d, 0xbe, 0x3a, 0x49, 0xa8, 0x3d, 0x78, 0xb2, 0x51, 0xbc,
- 0xf4, 0x4a, 0x60, 0xbe, 0xcc, 0x05, 0x0f, 0xbb, 0xc1, 0xff, 0x8f, 0x3d,
- 0xff, 0x3c, 0x98, 0x3d, 0x15, 0xe5, 0xdb, 0xbe, 0x23, 0xd8, 0x7a, 0xb8,
- 0xed, 0xd5, 0x5b, 0xbe, 0x22, 0xb2, 0x13, 0x3e, 0xa3, 0x5d, 0x07, 0xbe,
- 0x14, 0x4f, 0xc4, 0x3d, 0xd0, 0x0e, 0x31, 0xbe, 0x37, 0xf4, 0x1c, 0xbd,
- 0x48, 0xbd, 0x57, 0xbd, 0xb5, 0x2d, 0x10, 0xbe, 0x2b, 0xb0, 0x01, 0xbe,
- 0x94, 0x95, 0x87, 0xbd, 0x01, 0x93, 0x2b, 0x3e, 0xce, 0x62, 0x79, 0x3e,
- 0x68, 0xf1, 0x1d, 0x3e, 0xb6, 0xc1, 0x19, 0xbf, 0xf9, 0xca, 0x2f, 0x3e,
- 0x62, 0x5a, 0xb1, 0xbd, 0xd8, 0xc7, 0x9a, 0x3c, 0xc0, 0xb1, 0x96, 0x3d,
- 0xc4, 0xf5, 0x89, 0x3e, 0x0d, 0x20, 0x23, 0x3e, 0x54, 0x5e, 0x59, 0xbe,
- 0x0a, 0x1b, 0x96, 0xbd, 0xf0, 0x42, 0x97, 0x3d, 0x7b, 0x96, 0x02, 0xbe,
- 0x8c, 0x43, 0x43, 0x3d, 0xbb, 0x27, 0x06, 0x3c, 0x26, 0x68, 0x66, 0xbe,
- 0xeb, 0x9b, 0x25, 0xbe, 0x9e, 0xaa, 0x82, 0x3d, 0xb0, 0xfb, 0xf2, 0xbc,
- 0x1b, 0xf0, 0x18, 0xbf, 0xa3, 0x1f, 0xfb, 0x3d, 0xb2, 0x8b, 0x81, 0x3e,
- 0x20, 0x93, 0xce, 0x3d, 0xa8, 0x0d, 0x15, 0xbe, 0xc9, 0xe8, 0x1b, 0xbe,
- 0x52, 0xd1, 0x9b, 0x3d, 0x44, 0xeb, 0x34, 0x3e, 0xf1, 0x5c, 0x50, 0xbe,
- 0x28, 0x44, 0x40, 0x3e, 0xd2, 0x0e, 0x71, 0x3d, 0xf8, 0x88, 0x9a, 0x3d,
- 0x3e, 0x79, 0x2d, 0xbe, 0xcc, 0xfb, 0x08, 0xbd, 0xef, 0x52, 0xec, 0xbc,
- 0xa5, 0x66, 0xc9, 0xbe, 0xa2, 0x82, 0x9a, 0x3e, 0xce, 0x80, 0xe5, 0x3d,
- 0x6b, 0x35, 0x1b, 0xbe, 0x2f, 0xb0, 0x23, 0x3e, 0x3d, 0x71, 0xf4, 0xbe,
- 0x35, 0x62, 0xb8, 0xbb, 0xf2, 0x58, 0x9f, 0x3d, 0xa0, 0xb1, 0x2a, 0x3d,
- 0x5f, 0x52, 0x49, 0x3e, 0xef, 0x09, 0x9f, 0xbe, 0xc7, 0x6a, 0xda, 0xbd,
- 0x47, 0xe5, 0x09, 0xbe, 0xfc, 0x25, 0xda, 0xbe, 0x99, 0x64, 0x0a, 0xbd,
- 0xf9, 0x37, 0xba, 0x3d, 0x71, 0x1e, 0x4b, 0xbe, 0xa9, 0xf0, 0xad, 0xbe,
- 0xe4, 0xf6, 0x61, 0x3e, 0x5d, 0x99, 0xb9, 0xbe, 0x3c, 0x89, 0x0f, 0xbf,
- 0x6f, 0xcc, 0xd4, 0x3c, 0x23, 0x40, 0x82, 0x3e, 0x3d, 0xc7, 0xae, 0xbd,
- 0xd8, 0x5f, 0xb7, 0xbc, 0xfd, 0x5a, 0xf3, 0x3d, 0x3f, 0x93, 0x84, 0xbe,
- 0x39, 0x89, 0x41, 0xbd, 0x2c, 0x9e, 0x60, 0x3c, 0xaa, 0x7d, 0x82, 0xbc,
- 0x3b, 0xe4, 0x3b, 0xbe, 0x2a, 0x2d, 0x31, 0xbe, 0x93, 0xba, 0x57, 0x3e,
- 0xed, 0x28, 0x84, 0xbe, 0x03, 0x81, 0x31, 0x3d, 0xfd, 0x8d, 0x73, 0xbd,
- 0x76, 0xd4, 0xab, 0xbe, 0xc0, 0xf7, 0x94, 0xbe, 0xb4, 0xf5, 0x8a, 0xbe,
- 0x1e, 0x09, 0x89, 0xbe, 0x49, 0xa4, 0x27, 0xbd, 0x18, 0xbe, 0x90, 0xbe,
- 0xbc, 0x8c, 0x24, 0x3e, 0xc0, 0x6c, 0x99, 0xbe, 0xdb, 0xd0, 0xb6, 0xbe,
- 0xae, 0x06, 0xdc, 0xbb, 0xf5, 0x17, 0x13, 0xbb, 0x1a, 0x8c, 0x98, 0xbe,
- 0x3c, 0x52, 0x2d, 0x3e, 0x65, 0x7b, 0xb4, 0x3c, 0x9a, 0x1b, 0xff, 0xbd,
- 0x1f, 0x1e, 0x4d, 0x3e, 0xf7, 0xd3, 0x3e, 0x3e, 0x9f, 0xb1, 0x6a, 0xbd,
- 0x68, 0x3d, 0x9e, 0xbc, 0xd3, 0x41, 0x55, 0x3c, 0xc6, 0x70, 0xde, 0xbd,
- 0xbb, 0xe5, 0x9f, 0xbe, 0x90, 0x20, 0xb5, 0xbe, 0xd6, 0xfd, 0x46, 0xbe,
- 0x2c, 0x9a, 0x3f, 0x3e, 0xfe, 0x03, 0x10, 0xbe, 0xa2, 0x85, 0x25, 0xbd,
- 0x6a, 0x83, 0x97, 0xbe, 0xb5, 0x32, 0xf3, 0x3d, 0x52, 0x58, 0xcf, 0x3d,
- 0xd7, 0xe9, 0xe4, 0xbd, 0xc8, 0x85, 0x3b, 0x3e, 0xa7, 0x7e, 0x63, 0x3e,
- 0x45, 0x2d, 0x70, 0xbe, 0x9d, 0xde, 0x94, 0x3b, 0x90, 0x7c, 0x37, 0x3e,
- 0xf7, 0x32, 0xf1, 0xbd, 0x74, 0x4e, 0x27, 0x3e, 0x74, 0xac, 0xd6, 0x3d,
- 0x15, 0x18, 0x8f, 0xbc, 0x20, 0xfa, 0xd2, 0xbd, 0xa7, 0xca, 0x6c, 0xbe,
- 0x10, 0x0a, 0xe0, 0xbd, 0x92, 0x7e, 0x07, 0x3e, 0x76, 0xa6, 0x28, 0xbe,
- 0x4d, 0x01, 0x54, 0x3e, 0x9d, 0xf0, 0x6b, 0xbe, 0xf5, 0x19, 0xd0, 0xbd,
- 0xcd, 0xce, 0x9b, 0xbe, 0x06, 0x47, 0x26, 0xbe, 0xde, 0x02, 0x50, 0xbd,
- 0x56, 0x15, 0xcf, 0xbe, 0x68, 0x7b, 0xb2, 0xbc, 0xb7, 0xe5, 0xa6, 0x3d,
- 0xef, 0x80, 0xc9, 0x3d, 0x08, 0x2e, 0xf0, 0xbc, 0x13, 0x06, 0xbd, 0x3c,
- 0x8a, 0x53, 0x8d, 0xbd, 0x2f, 0x4a, 0x98, 0x3d, 0xb2, 0x16, 0xe1, 0xbe,
- 0x35, 0x27, 0x62, 0xbe, 0xbb, 0xb6, 0x84, 0x3e, 0xd0, 0x01, 0xf5, 0x3d,
- 0x03, 0x08, 0x39, 0xbe, 0x9b, 0x62, 0xf2, 0x3c, 0x64, 0x12, 0xc1, 0xbd,
- 0x4d, 0x7f, 0xd5, 0x3d, 0xe1, 0xaa, 0xef, 0x3c, 0x5f, 0xba, 0xd3, 0xbe,
- 0x7c, 0x53, 0x5b, 0x3d, 0x71, 0x35, 0x9d, 0xbd, 0x60, 0x20, 0x2f, 0x3c,
- 0x59, 0xd3, 0x7d, 0xbd, 0x8e, 0xb1, 0x5c, 0x3d, 0xa3, 0x23, 0xfe, 0xbd,
- 0xcf, 0xde, 0x52, 0xbe, 0xf5, 0x01, 0x9f, 0xbc, 0x8c, 0xf2, 0x2c, 0xbe,
- 0x2a, 0x31, 0xd5, 0xbd, 0xcf, 0x5c, 0x58, 0xbe, 0x4c, 0x94, 0xf6, 0xbd,
- 0x67, 0x55, 0x55, 0x3e, 0x24, 0x1f, 0x8a, 0x3d, 0x8b, 0x38, 0x96, 0x3e,
- 0x3a, 0x56, 0xeb, 0xbd, 0xcf, 0x6f, 0x7a, 0x3d, 0xf1, 0xb1, 0xa5, 0x3c,
- 0x8d, 0x80, 0xab, 0xbd, 0x2a, 0x5f, 0x28, 0x3d, 0xd4, 0x31, 0x9a, 0xbe,
- 0x30, 0xab, 0x09, 0xbe, 0x3e, 0x9f, 0x8e, 0xbd, 0xd8, 0x7b, 0x87, 0xbd,
- 0x2c, 0x6c, 0xbb, 0xbe, 0x96, 0x04, 0xa0, 0x3e, 0xf7, 0x75, 0x89, 0x3d,
- 0xd7, 0x7d, 0x97, 0x3e, 0xe9, 0xb3, 0x9d, 0x3e, 0x99, 0x48, 0x5c, 0x3e,
- 0xc0, 0x72, 0xba, 0xbe, 0xac, 0xc2, 0xd9, 0xbb, 0xe4, 0x2a, 0x3a, 0xbf,
- 0x05, 0xdb, 0x42, 0xbd, 0x8b, 0x3b, 0xb1, 0xbe, 0xa8, 0xb5, 0x43, 0xbe,
- 0x4a, 0x94, 0xfc, 0xbd, 0x7e, 0x7d, 0xc9, 0xbe, 0xd4, 0x64, 0x13, 0xbe,
- 0xc1, 0x84, 0xb5, 0xbe, 0xff, 0x26, 0x33, 0x3e, 0xd3, 0xcc, 0xe3, 0xbd,
- 0x62, 0x5f, 0x80, 0x3d, 0x2f, 0x28, 0x1e, 0xbe, 0x69, 0x73, 0x17, 0x3e,
- 0x2c, 0xc9, 0xef, 0x3d, 0x57, 0x45, 0x00, 0xbf, 0x5c, 0x39, 0xd3, 0x3d,
- 0xeb, 0x4a, 0x81, 0xbd, 0x64, 0xec, 0x9e, 0x3e, 0xa2, 0xca, 0x1c, 0xbe,
- 0xc1, 0x12, 0x12, 0xbe, 0xd2, 0x51, 0x53, 0xbd, 0x9d, 0xf4, 0x2d, 0x3e,
- 0x5d, 0x32, 0x75, 0xbe, 0x67, 0xe3, 0xbf, 0x3d, 0x47, 0x59, 0x39, 0x3e,
- 0xba, 0xa5, 0x62, 0xbe, 0x6b, 0x98, 0x1c, 0x3c, 0xc8, 0x99, 0x56, 0x3c,
- 0xd8, 0xae, 0xbb, 0x3d, 0xdf, 0x1f, 0x5e, 0xbe, 0x4f, 0x38, 0xf9, 0xbc,
- 0x3f, 0x73, 0xe0, 0xbc, 0x11, 0xe4, 0x85, 0x3e, 0x39, 0xe0, 0xba, 0x3d,
- 0x42, 0x07, 0xe3, 0x3c, 0x98, 0x03, 0xfe, 0xbd, 0xaa, 0x1a, 0x97, 0xbe,
- 0xc2, 0x23, 0x26, 0xbd, 0xe5, 0xe6, 0xa5, 0xbe, 0x23, 0xc2, 0x78, 0xbe,
- 0x03, 0xa1, 0x09, 0x3e, 0x17, 0x31, 0xee, 0x3d, 0xe9, 0x61, 0x55, 0xbe,
- 0x3c, 0x8f, 0xfc, 0x3d, 0x56, 0xac, 0x38, 0xbe, 0x3d, 0xed, 0x29, 0xbe,
- 0x7e, 0x8d, 0x53, 0xbe, 0xd0, 0xb7, 0x01, 0x3e, 0xaa, 0x06, 0x8b, 0x3e,
- 0xac, 0x37, 0xaa, 0xbd, 0xc0, 0xd6, 0x10, 0xbe, 0x2b, 0x8e, 0x23, 0xbe,
- 0x86, 0xaa, 0x77, 0x3e, 0x62, 0xa5, 0x70, 0xbc, 0xa5, 0xfa, 0xd1, 0x3d,
- 0x75, 0x21, 0xad, 0xbd, 0x29, 0x4e, 0x52, 0xbd, 0x3f, 0x80, 0x52, 0x3d,
- 0x52, 0x9a, 0xa5, 0xbc, 0x13, 0x01, 0xf9, 0x3d, 0xe4, 0xc8, 0x8a, 0x3e,
- 0x73, 0xa2, 0x9d, 0xbd, 0xc4, 0x9e, 0x6b, 0x3e, 0xba, 0x4d, 0xba, 0xbd,
- 0x0c, 0xd8, 0x8f, 0xbd, 0x4a, 0xcc, 0x65, 0x3e, 0x69, 0x3e, 0x48, 0xbe,
- 0x23, 0x20, 0xf7, 0x3c, 0xdd, 0x66, 0x9d, 0xbc, 0xfe, 0xc4, 0xac, 0x3d,
- 0x9a, 0x66, 0x25, 0x3d, 0x1c, 0x0f, 0x4b, 0xbd, 0xfc, 0x11, 0x65, 0x3e,
- 0xc7, 0xff, 0x28, 0xbd, 0x55, 0x7c, 0x74, 0x3e, 0x10, 0x51, 0xc0, 0xbe,
- 0xdf, 0x58, 0x08, 0xbb, 0x84, 0xa4, 0xda, 0x3e, 0xbd, 0x2a, 0x45, 0xbd,
- 0x06, 0x3d, 0xaf, 0x3e, 0xd4, 0xaa, 0x80, 0xbe, 0xb7, 0xbc, 0x11, 0xbe,
- 0xee, 0x54, 0x7c, 0x3d, 0x70, 0x2a, 0xe1, 0xbc, 0xee, 0xa1, 0x39, 0xbe,
- 0x2a, 0x5a, 0xc7, 0xbe, 0xe1, 0xf5, 0x46, 0x3d, 0xab, 0x13, 0x8f, 0xbe,
- 0xa7, 0x60, 0xa5, 0x3c, 0xcb, 0x6d, 0xce, 0x3d, 0x3f, 0x14, 0x2e, 0x3c,
- 0x2f, 0x1b, 0xed, 0xbc, 0x12, 0xc8, 0xc3, 0xbb, 0xe8, 0x63, 0xad, 0xbe,
- 0x52, 0x1a, 0x06, 0xbe, 0x74, 0x4f, 0x8a, 0xbe, 0x95, 0xa2, 0x0c, 0x3e,
- 0x9d, 0x11, 0xa0, 0x3d, 0x61, 0x72, 0xd8, 0x3d, 0xb0, 0x05, 0x8f, 0x3d,
- 0x13, 0xb7, 0x89, 0x3e, 0x56, 0xb2, 0x51, 0x3e, 0xa6, 0x70, 0x07, 0xbe,
- 0x19, 0x05, 0xa8, 0x3e, 0x01, 0xb7, 0x2c, 0xbd, 0x69, 0xe9, 0x53, 0x3e,
- 0x45, 0x66, 0xc6, 0xbd, 0x22, 0xa2, 0x8d, 0xbd, 0x80, 0x79, 0x71, 0x3d,
- 0x4e, 0xba, 0xe5, 0x3d, 0xab, 0x51, 0xda, 0x3d, 0xc6, 0x78, 0x0a, 0xbd,
- 0x32, 0x52, 0x1e, 0xbe, 0x7e, 0x09, 0x18, 0xbd, 0xb3, 0x87, 0xca, 0xbc,
- 0xbc, 0x68, 0x74, 0xbd, 0x1e, 0x9c, 0x47, 0x3d, 0x39, 0x02, 0x81, 0xbe,
- 0xbc, 0xf4, 0xed, 0xbd, 0xdf, 0xc9, 0xa2, 0xbe, 0xda, 0xdc, 0xb2, 0xbd,
- 0xbd, 0xe8, 0x0a, 0x3d, 0xa7, 0x48, 0xc9, 0x3c, 0xb1, 0xef, 0x51, 0x3e,
- 0xc0, 0x16, 0x87, 0x3e, 0xf5, 0x7b, 0x94, 0x3e, 0x58, 0xf2, 0x8c, 0x3e,
- 0xe8, 0xfa, 0x37, 0xbe, 0x65, 0x5c, 0x0a, 0x3d, 0x5f, 0x8e, 0x97, 0x3e,
- 0x97, 0x51, 0x65, 0x3e, 0x5f, 0x5c, 0x4f, 0x3e, 0x15, 0xa6, 0xd0, 0xbe,
- 0x79, 0x94, 0x82, 0xbe, 0xa2, 0x9e, 0xcb, 0x3b, 0xa6, 0x4e, 0x8b, 0xbe,
- 0xbb, 0xc7, 0xcc, 0xbd, 0xc3, 0x86, 0x94, 0x3b, 0xd9, 0xd0, 0x31, 0x3d,
- 0x8d, 0xb2, 0xde, 0xbd, 0x9a, 0x2d, 0xdc, 0x3b, 0x0e, 0x26, 0x7e, 0x3c,
- 0x75, 0xf6, 0x28, 0xbe, 0xea, 0xea, 0xd7, 0x3c, 0xda, 0xb3, 0x4b, 0xbc,
- 0xef, 0x4f, 0x85, 0xbe, 0xfe, 0xc3, 0xcf, 0xbd, 0xce, 0x2b, 0x57, 0xbe,
- 0x19, 0xe1, 0xd6, 0x3a, 0x2a, 0x86, 0xfc, 0x3c, 0x29, 0x14, 0x29, 0xbe,
- 0x7d, 0xf7, 0x95, 0xbd, 0x03, 0xa6, 0x1e, 0x3e, 0x83, 0xf3, 0x19, 0x3d,
- 0xda, 0xde, 0xa0, 0xbd, 0x6f, 0xff, 0x27, 0xbe, 0x44, 0x28, 0x6a, 0xbe,
- 0xac, 0x51, 0x09, 0xbe, 0x5d, 0x1b, 0x29, 0xbd, 0x84, 0x27, 0x4f, 0xbe,
- 0xde, 0xb6, 0x70, 0x3c, 0x80, 0x35, 0xb5, 0xbe, 0xf2, 0xfa, 0xc1, 0x3d,
- 0x37, 0x38, 0xac, 0xbe, 0xac, 0x68, 0x59, 0xbe, 0x68, 0xa7, 0x12, 0xbe,
- 0x90, 0xf9, 0x8a, 0x3d, 0x09, 0xc2, 0xce, 0x3c, 0xf1, 0x28, 0x3b, 0xbe,
- 0x6f, 0x52, 0x2e, 0x3e, 0x6a, 0x6a, 0xf0, 0x3d, 0x1c, 0x14, 0xb4, 0x3c,
- 0xaa, 0x82, 0x57, 0x3a, 0xa8, 0xe9, 0x84, 0x3e, 0x79, 0xe5, 0xc7, 0x3d,
- 0xda, 0x87, 0x38, 0x3e, 0xcb, 0x12, 0xaf, 0xbc, 0xe4, 0xfe, 0x0c, 0xbf,
- 0xdd, 0x5f, 0x41, 0x3e, 0xc6, 0x85, 0x70, 0x3e, 0xe0, 0xab, 0x97, 0x3c,
- 0x57, 0x21, 0x54, 0xbe, 0x54, 0x43, 0x48, 0xbe, 0xfa, 0x66, 0x13, 0xbd,
- 0x17, 0x28, 0xff, 0x3c, 0xdb, 0x82, 0x59, 0x3e, 0xf6, 0xc1, 0x03, 0x3e,
- 0xdb, 0x47, 0x88, 0xba, 0x6c, 0x04, 0x11, 0x3e, 0x90, 0xcb, 0x44, 0x3e,
- 0xdc, 0x3f, 0x74, 0x3d, 0xf8, 0x16, 0x69, 0xbe, 0x3b, 0x6c, 0xbb, 0x3c,
- 0x6f, 0x8e, 0x88, 0xbe, 0x1a, 0x55, 0x77, 0x3e, 0x18, 0xc3, 0x83, 0xbd,
- 0x72, 0x95, 0x05, 0xbe, 0x2e, 0x1b, 0x89, 0x3d, 0xba, 0x09, 0xe7, 0xbd,
- 0xba, 0xcd, 0x5d, 0x3e, 0xe6, 0xec, 0x32, 0x3e, 0xbb, 0x24, 0x2d, 0x3d,
- 0xbe, 0x32, 0x59, 0xbe, 0x74, 0xeb, 0x9a, 0xbe, 0xb3, 0xc1, 0xc0, 0xbd,
- 0xf2, 0xcc, 0x89, 0xbb, 0x1f, 0xa4, 0xa1, 0x3d, 0x2a, 0x09, 0xf6, 0x3d,
- 0xf6, 0x50, 0x57, 0xbe, 0x71, 0x0c, 0xe9, 0x3e, 0xac, 0xdf, 0xf2, 0x39,
- 0xef, 0xcf, 0xdd, 0x3d, 0xf4, 0x28, 0x0c, 0xbd, 0x5b, 0xa7, 0x22, 0x3e,
- 0x79, 0xa8, 0xac, 0xbe, 0xe1, 0x96, 0xaf, 0x3c, 0x4e, 0xe8, 0xad, 0x3d,
- 0x16, 0x87, 0x86, 0xbe, 0x88, 0x43, 0x2e, 0x3e, 0xb9, 0x8b, 0x8d, 0x3e,
- 0x4d, 0xb7, 0x6a, 0x3e, 0xc0, 0x97, 0x81, 0xbd, 0xef, 0x3c, 0xd7, 0x3c,
- 0xa6, 0x4f, 0x03, 0x3e, 0xf1, 0xd5, 0x2f, 0xbe, 0x01, 0x6c, 0xad, 0x3d,
- 0x15, 0xdf, 0x98, 0xbe, 0xf6, 0x5b, 0xf3, 0xbd, 0x99, 0x73, 0x5f, 0x3e,
- 0x63, 0xd0, 0xe2, 0xbd, 0xd3, 0xfe, 0xd7, 0x3d, 0xf1, 0xf8, 0x5b, 0x3c,
- 0x2a, 0xcd, 0x7c, 0x3e, 0xda, 0x8e, 0xa4, 0x3d, 0xaa, 0xf1, 0xff, 0xbd,
- 0xea, 0xab, 0x37, 0x3e, 0xc9, 0xeb, 0x35, 0xbe, 0x0b, 0xfa, 0x2a, 0x3e,
- 0x19, 0x32, 0xe2, 0x3c, 0x09, 0x56, 0x21, 0xbe, 0xa9, 0xe2, 0x71, 0x3e,
- 0xf4, 0xd9, 0x27, 0x3e, 0x27, 0x39, 0x22, 0x3e, 0xb5, 0xe2, 0xc8, 0xbe,
- 0x8e, 0xdb, 0xe9, 0xbd, 0xb7, 0x34, 0x72, 0x3e, 0x23, 0x74, 0x59, 0x3e,
- 0x21, 0x0c, 0xd3, 0x3d, 0x37, 0x14, 0xf1, 0xbc, 0x04, 0x43, 0x29, 0xbe,
- 0x84, 0x89, 0x06, 0xbd, 0x04, 0x1d, 0x06, 0x3e, 0x9d, 0x14, 0x06, 0xbc,
- 0x48, 0x02, 0xc0, 0x3d, 0xbf, 0x6e, 0xdc, 0xbd, 0xc5, 0xdf, 0xda, 0x3b,
- 0xca, 0xcf, 0xed, 0x3c, 0x9c, 0x9d, 0x83, 0x3e, 0xc5, 0x36, 0x88, 0x3e,
- 0x23, 0x83, 0x75, 0x3d, 0x7d, 0xe5, 0x39, 0x3e, 0x3d, 0xa0, 0x89, 0x3d,
- 0x1d, 0x3b, 0xdd, 0xbd, 0xe0, 0xa6, 0x8c, 0x3e, 0xae, 0x2f, 0x93, 0xbd,
- 0x66, 0xc0, 0xb0, 0x3d, 0x29, 0x95, 0x9e, 0xbd, 0xb5, 0x1b, 0x56, 0xbe,
- 0xc4, 0x2e, 0x03, 0x3d, 0x77, 0x77, 0xfc, 0x3d, 0x01, 0x23, 0x04, 0xbe,
- 0x03, 0xee, 0xb9, 0x3e, 0x11, 0xca, 0x5a, 0xbc, 0xc7, 0x22, 0xae, 0xbd,
- 0xe3, 0x9f, 0xbd, 0x3d, 0x8c, 0x70, 0x11, 0xbe, 0xef, 0x3f, 0x0d, 0x3e,
- 0x78, 0xfd, 0xed, 0x3c, 0x67, 0x3a, 0xc1, 0xbd, 0x6e, 0x1b, 0xf5, 0xbc,
- 0x49, 0x20, 0x0b, 0xbe, 0x05, 0x6d, 0xa3, 0x3d, 0x1e, 0x32, 0x80, 0x3d,
- 0x48, 0x44, 0x41, 0x3d, 0xc8, 0x5f, 0xb8, 0x3c, 0xe9, 0x3e, 0x6e, 0xbd,
- 0x35, 0x3a, 0x3d, 0x3c, 0x11, 0x32, 0x23, 0xbc, 0x03, 0x10, 0x94, 0x3d,
- 0xc1, 0x37, 0xfb, 0xbd, 0x70, 0xf6, 0x05, 0x3e, 0xe3, 0x0f, 0xde, 0x3d,
- 0x7e, 0x6f, 0x5e, 0xbd, 0x25, 0x95, 0x0d, 0xbe, 0xd6, 0x7b, 0x07, 0xbc,
- 0x84, 0x6c, 0xfe, 0x3d, 0xe7, 0x40, 0x69, 0x3c, 0x36, 0xb6, 0x67, 0x3d,
- 0x50, 0x0f, 0xb2, 0x3d, 0x10, 0x0e, 0x9c, 0xbc, 0x02, 0x3d, 0xd0, 0x3d,
- 0x5c, 0x85, 0xa1, 0xbd, 0xbc, 0x14, 0x1f, 0x3e, 0xbc, 0x49, 0x36, 0x3d,
- 0x7a, 0x9b, 0xc9, 0xbd, 0x5c, 0xe1, 0xe5, 0xbc, 0x44, 0xd8, 0x05, 0x3e,
- 0xa1, 0x7b, 0x02, 0x3e, 0xa9, 0x4c, 0x9d, 0xbd, 0xe6, 0x6d, 0x91, 0xbd,
- 0x50, 0x38, 0x27, 0x3e, 0x9c, 0xa3, 0x0a, 0xbd, 0x72, 0x6d, 0x9c, 0xbd,
- 0xb4, 0x6f, 0xf9, 0xbd, 0x32, 0x1e, 0x0d, 0x3d, 0x2f, 0xf0, 0x78, 0x3b,
- 0x28, 0x3f, 0x06, 0xbe, 0x1e, 0x8c, 0xa3, 0x3d, 0xa0, 0x59, 0x99, 0xbd,
- 0xbb, 0xd3, 0x19, 0x3e, 0x53, 0xe5, 0x91, 0x3d, 0xcb, 0x3a, 0x9b, 0x3d,
- 0x9f, 0x2b, 0xde, 0x3d, 0x02, 0x50, 0x04, 0xbe, 0x4e, 0xc7, 0xd8, 0x3b,
- 0x65, 0x3e, 0x14, 0x3e, 0x98, 0x08, 0x83, 0x3c, 0xc6, 0xfe, 0xf0, 0xbd,
- 0x53, 0xeb, 0x91, 0xbc, 0xe8, 0xd3, 0x29, 0xbe, 0x73, 0x3f, 0x07, 0x3d,
- 0x79, 0xed, 0x0a, 0xbe, 0x71, 0x53, 0x12, 0xbe, 0xdb, 0x8f, 0xc0, 0x3d,
- 0xd1, 0xc2, 0xfc, 0x3d, 0xb3, 0xca, 0x9f, 0xbe, 0xdc, 0x1e, 0xe5, 0xbd,
- 0x74, 0xb8, 0x01, 0xbe, 0x06, 0x58, 0xf5, 0x3d, 0x24, 0x25, 0xdb, 0x3d,
- 0xc4, 0x49, 0x48, 0x3d, 0xcf, 0x39, 0xfb, 0xbd, 0xcd, 0xf1, 0x05, 0xbd,
- 0xd5, 0xc9, 0x6d, 0x3b, 0xe4, 0x59, 0x0a, 0xbd, 0xbf, 0x59, 0x0b, 0xbc,
- 0x89, 0xe5, 0xf7, 0xbd, 0x1c, 0xf6, 0x2a, 0x3e, 0x19, 0x5d, 0xcf, 0xbb,
- 0x57, 0x36, 0x7b, 0x3d, 0x9e, 0x25, 0x8e, 0x3d, 0xc1, 0x38, 0x14, 0x3e,
- 0xf7, 0x25, 0x16, 0xbd, 0x9d, 0x6e, 0x37, 0xbd, 0xcf, 0x90, 0xd0, 0x3c,
- 0xa0, 0x08, 0x28, 0xbd, 0x02, 0x75, 0xe6, 0x3d, 0x0f, 0xe9, 0x9c, 0xbd,
- 0x13, 0x3b, 0xe8, 0xbd, 0xf6, 0x09, 0xfa, 0x3d, 0xa8, 0xbf, 0x60, 0x3d,
- 0x6c, 0x31, 0x9b, 0x3c, 0x42, 0x14, 0x2f, 0x3e, 0x2e, 0x3f, 0xfb, 0x3c,
- 0x75, 0xc6, 0x94, 0xbd, 0x27, 0xcc, 0x13, 0xbd, 0x05, 0x67, 0x2a, 0x3d,
- 0xb0, 0x05, 0x90, 0xbc, 0x16, 0x51, 0xed, 0xbc, 0x68, 0xdd, 0x69, 0x3e,
- 0x4b, 0xa5, 0x43, 0xbc, 0xc8, 0xed, 0x07, 0x3e, 0x60, 0x7e, 0xbf, 0x3b,
- 0x2e, 0x07, 0x0f, 0x3e, 0x88, 0x5b, 0x30, 0xbe, 0xc3, 0xaa, 0xda, 0x3d,
- 0xdb, 0xb0, 0x7e, 0x3d, 0xa3, 0x5f, 0x01, 0xbe, 0x62, 0x31, 0x1b, 0x3e,
- 0x63, 0x39, 0x0d, 0xbe, 0xa2, 0x61, 0xee, 0xbd, 0x80, 0xf6, 0xd4, 0xbd,
- 0xad, 0xec, 0x02, 0x3e, 0x19, 0x12, 0x2a, 0xbe, 0xb4, 0x97, 0xdb, 0x3c,
- 0xa2, 0x04, 0x5d, 0x3e, 0x38, 0x40, 0xb1, 0x3d, 0xf9, 0x5b, 0x2f, 0x3e,
- 0x2c, 0xf9, 0xa2, 0xbc, 0x00, 0x94, 0xc4, 0x3d, 0x86, 0x22, 0x58, 0xbc,
- 0x54, 0x59, 0x0d, 0x3d, 0xf8, 0x64, 0xec, 0x3c, 0x94, 0x24, 0xbc, 0xbc,
- 0x18, 0x70, 0x51, 0xbd, 0xfc, 0xa8, 0xc8, 0xbc, 0x6a, 0xc6, 0xf2, 0xbd,
- 0xe7, 0xbc, 0x10, 0x3d, 0x28, 0xcf, 0x34, 0x3e, 0x9f, 0x01, 0xb7, 0xbd,
- 0x2b, 0x31, 0xe6, 0x3c, 0xb6, 0x46, 0x71, 0xbc, 0x84, 0x02, 0xad, 0x3d,
- 0xe7, 0x08, 0x52, 0xbc, 0x6f, 0xbb, 0xb2, 0xbd, 0x72, 0x6a, 0x7b, 0xbd,
- 0x26, 0xe1, 0x14, 0xbe, 0x5a, 0x7e, 0x46, 0xbe, 0x30, 0xdd, 0xb9, 0x3c,
- 0xbe, 0x4c, 0x2b, 0xbd, 0xec, 0x3c, 0xf6, 0x3c, 0x4c, 0x2e, 0x0d, 0xbe,
- 0x2c, 0x88, 0x15, 0xbe, 0x92, 0xbf, 0x74, 0xbe, 0x67, 0xa2, 0x28, 0xbe,
- 0x71, 0xc1, 0x56, 0x3d, 0x71, 0x9b, 0xc1, 0xbd, 0x56, 0xdd, 0x9e, 0xbd,
- 0xfc, 0x0e, 0x88, 0xbd, 0x9e, 0x1a, 0xe9, 0xbe, 0x79, 0x06, 0x40, 0xbe,
- 0x3f, 0x3b, 0x9c, 0xbd, 0x6b, 0xed, 0xed, 0xbd, 0x4d, 0x5d, 0xa8, 0xbe,
- 0xe5, 0x26, 0xa2, 0xbc, 0x56, 0x9d, 0xd2, 0xbe, 0x3a, 0x11, 0xf8, 0xbd,
- 0xb1, 0x6e, 0x58, 0xbe, 0x6d, 0x30, 0xc5, 0xbc, 0xde, 0xb6, 0xa2, 0xbd,
- 0xfe, 0xb9, 0x8a, 0xbe, 0x7a, 0xa2, 0xc4, 0xbd, 0xc5, 0x0a, 0x57, 0xbe,
- 0xe2, 0xa1, 0x87, 0xbe, 0x97, 0xef, 0x93, 0xbe, 0x75, 0x27, 0x0c, 0xbd,
- 0x7c, 0xee, 0x3c, 0xbd, 0x44, 0x2b, 0x4a, 0xbe, 0x3e, 0x60, 0x7d, 0xbe,
- 0xda, 0x83, 0x26, 0xbe, 0x76, 0xaf, 0x77, 0xbd, 0xc8, 0xcc, 0xe6, 0xbd,
- 0x79, 0xf8, 0x13, 0xbe, 0x10, 0x26, 0x6e, 0xbe, 0x60, 0x0d, 0xc5, 0xbd,
- 0x60, 0xce, 0xbb, 0xbe, 0x89, 0xc0, 0x8b, 0x3d, 0x20, 0xde, 0x3e, 0xbe,
- 0x32, 0x2c, 0xee, 0xbe, 0xed, 0x62, 0x8a, 0x3a, 0xcb, 0x78, 0xb3, 0xbb,
- 0x2c, 0xc4, 0xcd, 0xbd, 0xce, 0x89, 0xe1, 0xbd, 0x54, 0x2d, 0x03, 0xbe,
- 0xd6, 0xcf, 0x66, 0xbd, 0x57, 0x57, 0x1c, 0xbf, 0x4b, 0xbc, 0xfb, 0xbd,
- 0x96, 0x96, 0x03, 0xbe, 0x70, 0xd0, 0x9b, 0xbe, 0xc2, 0x1f, 0xa4, 0xbd,
- 0x19, 0xc8, 0xe4, 0xbd, 0x02, 0x86, 0x8b, 0xbd, 0xa0, 0x77, 0xfa, 0xbd,
- 0x6a, 0x0f, 0x9f, 0xbe, 0xf1, 0x1f, 0xc5, 0xbd, 0xdf, 0xae, 0x47, 0xbe,
- 0x16, 0x89, 0x73, 0xbe, 0xad, 0xe2, 0x87, 0x3b, 0x64, 0x29, 0x22, 0xbe,
- 0x78, 0x94, 0xec, 0x3c, 0x5f, 0x60, 0x1e, 0xbe, 0xdd, 0x20, 0x62, 0xbe,
- 0xe4, 0x1d, 0x79, 0xbd, 0x3c, 0x08, 0xfb, 0xbe, 0x81, 0x11, 0x5e, 0xbd,
- 0xce, 0x49, 0xeb, 0xbc, 0xd6, 0x48, 0x28, 0x3d, 0x5c, 0xfa, 0xf5, 0x3b,
- 0x47, 0x7e, 0xaf, 0xbd, 0xc7, 0x0e, 0x91, 0xbd, 0x19, 0x76, 0xa0, 0xbe,
- 0xca, 0x39, 0x77, 0xbe, 0xb4, 0x7d, 0xb3, 0xbe, 0x80, 0x64, 0xc9, 0xbd,
- 0x99, 0x72, 0x36, 0xbe, 0x81, 0xf7, 0x1f, 0xbc, 0x08, 0x0f, 0x4f, 0xbb,
- 0xcd, 0x11, 0x7f, 0xbd, 0xed, 0xdd, 0x5f, 0xbd, 0xe8, 0x2a, 0x17, 0x3d,
- 0xd7, 0xe8, 0x80, 0xbd, 0xb1, 0x45, 0xfb, 0xbc, 0x21, 0xab, 0x39, 0xbe,
- 0x88, 0x2e, 0x7e, 0xbe, 0xa3, 0xf3, 0x02, 0xbe, 0x31, 0x29, 0x06, 0x3d,
- 0x3e, 0x54, 0x85, 0xbe, 0x73, 0x93, 0x71, 0xbe, 0x00, 0x58, 0x86, 0xbe,
- 0xec, 0x27, 0x2f, 0xbd, 0xe6, 0x54, 0x56, 0xbd, 0x6b, 0x5a, 0xd8, 0xbe,
- 0x9c, 0x27, 0xb9, 0xbd, 0x32, 0x5c, 0xd5, 0xbd, 0x8a, 0x09, 0x13, 0xbe,
- 0x09, 0x35, 0xcf, 0xbc, 0x71, 0xf1, 0x1f, 0xbe, 0x07, 0x3e, 0x09, 0xbf,
- 0x37, 0xf3, 0x6d, 0xbe, 0x40, 0x99, 0xab, 0x3b, 0xa7, 0x5e, 0x85, 0xbe,
- 0x71, 0x68, 0x15, 0xbd, 0x77, 0xd5, 0x11, 0xbe, 0x70, 0x93, 0x0b, 0xbe,
- 0xa2, 0x0a, 0xc8, 0x3c, 0x3c, 0x33, 0x1a, 0xbe, 0xc9, 0xa8, 0x1d, 0xbe,
- 0x90, 0xa3, 0xb3, 0xbe, 0x0c, 0x77, 0x0c, 0xbe, 0xae, 0x0b, 0x37, 0x3d,
- 0x5e, 0xcf, 0xa0, 0x3c, 0x62, 0x3b, 0x79, 0xbe, 0x3d, 0xe2, 0xcb, 0xbe,
- 0x95, 0xb6, 0x2b, 0xbd, 0xee, 0x9b, 0x4a, 0xbe, 0xee, 0x97, 0x10, 0xbd,
- 0x75, 0x12, 0x25, 0xbe, 0x72, 0x8a, 0x00, 0xbd, 0x76, 0x15, 0xa9, 0xbe,
- 0x23, 0xfa, 0x25, 0x3c, 0xdb, 0x99, 0x80, 0x3d, 0x63, 0xa2, 0x51, 0xbd,
- 0x03, 0xa4, 0xb4, 0xbc, 0x15, 0x17, 0x35, 0x3d, 0x6e, 0x6c, 0x26, 0xbe,
- 0x12, 0x08, 0x0c, 0xbe, 0x69, 0x5e, 0x19, 0xbf, 0x51, 0x0a, 0x81, 0xbe,
- 0xef, 0x9f, 0x7a, 0xbe, 0xe0, 0xac, 0xe0, 0xbd, 0xa9, 0x45, 0xad, 0xbc,
- 0x7a, 0x8e, 0x58, 0x3e, 0xff, 0x77, 0x63, 0x3d, 0x35, 0x9e, 0xf0, 0xbe,
- 0x92, 0xce, 0x9f, 0x3d, 0x0b, 0xae, 0xb4, 0xbd, 0x23, 0x59, 0x54, 0x3c,
- 0xc9, 0x03, 0x1b, 0xbf, 0x5b, 0xb6, 0xa1, 0xbe, 0x3a, 0xf4, 0x87, 0x3d,
- 0x24, 0x14, 0x01, 0xbe, 0x68, 0xb7, 0x17, 0xbc, 0x8b, 0x3b, 0x86, 0xbb,
- 0x92, 0x92, 0x5c, 0xbe, 0xdc, 0x86, 0x51, 0xbd, 0xa1, 0x35, 0x1c, 0xbe,
- 0xfa, 0x12, 0xa2, 0x3b, 0x71, 0xb4, 0xab, 0xbe, 0x74, 0xf0, 0x83, 0x3d,
- 0xe6, 0x4b, 0x82, 0xbc, 0xbd, 0x9e, 0x02, 0xbe, 0x26, 0x3d, 0x15, 0x3e,
- 0x0b, 0x7c, 0x3a, 0x3e, 0x10, 0x1e, 0xe4, 0xbd, 0xf2, 0x37, 0x07, 0xbf,
- 0x1f, 0x58, 0x5b, 0xbe, 0xc5, 0x52, 0xa1, 0x3d, 0x2a, 0xc2, 0xda, 0xbd,
- 0xa9, 0x7e, 0x02, 0x3e, 0xda, 0x66, 0x0f, 0x3d, 0x8d, 0x7b, 0x3f, 0xbe,
- 0x6b, 0xc0, 0x02, 0xbf, 0x45, 0xea, 0x52, 0xbe, 0xd3, 0xbd, 0x1d, 0xbe,
- 0x35, 0xd9, 0x16, 0xbf, 0xb4, 0x94, 0x13, 0xbd, 0xf2, 0xb1, 0x87, 0xbd,
- 0x72, 0x6f, 0x05, 0xbe, 0xdc, 0x07, 0x5d, 0xbe, 0x28, 0xf8, 0xdd, 0xbc,
- 0x3a, 0xf9, 0x2f, 0xbe, 0x18, 0x33, 0xcd, 0xbd, 0x13, 0xa4, 0x62, 0xbe,
- 0x70, 0xf4, 0xbd, 0xbd, 0x71, 0x68, 0xc6, 0xbd, 0x89, 0x16, 0x9f, 0xbc,
- 0x7f, 0x49, 0x8e, 0xbd, 0x84, 0x17, 0x04, 0x3e, 0xfe, 0x37, 0x62, 0xbd,
- 0x8e, 0xcf, 0x85, 0xbd, 0x92, 0x75, 0xdf, 0x3d, 0xd5, 0x92, 0x1d, 0xbe,
- 0x01, 0x05, 0x5d, 0xbe, 0x23, 0x18, 0x59, 0xbe, 0x0e, 0x46, 0xaf, 0xbe,
- 0x60, 0x68, 0x98, 0x3a, 0x36, 0x5a, 0xed, 0xbd, 0x7d, 0x6b, 0x2e, 0x3e,
- 0x2c, 0xc2, 0x42, 0xbe, 0xa5, 0x9b, 0xc6, 0xbe, 0xf9, 0xcf, 0x04, 0x3c,
- 0x45, 0xd6, 0x21, 0xbe, 0xf7, 0x90, 0xae, 0x3d, 0x01, 0xf0, 0xba, 0xbc,
- 0xbd, 0xf5, 0xe9, 0xbd, 0xcb, 0x7d, 0x45, 0x3d, 0x42, 0x96, 0x1f, 0xbe,
- 0xe6, 0x5c, 0x58, 0xbe, 0x87, 0xb9, 0x00, 0xbe, 0xea, 0x2c, 0xff, 0xbd,
- 0x0d, 0x42, 0x13, 0x3e, 0xd9, 0x0d, 0xdc, 0xbc, 0x17, 0x11, 0x08, 0xbf,
- 0x4a, 0x3a, 0xc6, 0xbe, 0x67, 0xd5, 0x7d, 0xbe, 0xfd, 0x82, 0x92, 0x3b,
- 0xa1, 0x7c, 0x38, 0xbf, 0xea, 0x9f, 0x9e, 0x3d, 0x3c, 0xe1, 0x71, 0xbe,
- 0xdf, 0x41, 0x8f, 0xbe, 0x00, 0x86, 0x9a, 0xbe, 0x18, 0x17, 0x60, 0xbe,
- 0xc8, 0xc9, 0x9e, 0xbd, 0xe3, 0x04, 0x41, 0xbe, 0x83, 0x46, 0xdf, 0xbd,
- 0xcd, 0x22, 0x4c, 0xbe, 0x98, 0x90, 0xa2, 0xbe, 0xec, 0xf1, 0xaa, 0xbd,
- 0xd8, 0xc0, 0x42, 0xbe, 0xfc, 0x0c, 0x1a, 0xbb, 0xde, 0xfe, 0x15, 0xbd,
- 0xb8, 0xb8, 0xcd, 0xbc, 0xe3, 0xe8, 0x40, 0xbe, 0x73, 0x2c, 0x1e, 0xbc,
- 0xd9, 0x63, 0x38, 0x3d, 0xfc, 0xd1, 0x17, 0xbe, 0x99, 0xd2, 0x26, 0xbf,
- 0x57, 0x63, 0x44, 0x3d, 0xe7, 0x7a, 0x0e, 0xbe, 0xcf, 0xd6, 0x3f, 0x3d,
- 0x50, 0x4f, 0xcd, 0x3d, 0xd2, 0xe6, 0xa0, 0xbe, 0xfe, 0x72, 0xb4, 0xbd,
- 0x28, 0xa1, 0x7a, 0xbe, 0x7d, 0x54, 0xc8, 0x3c, 0x6f, 0xf9, 0x96, 0xbb,
- 0xb5, 0x7e, 0x8f, 0xbe, 0xfa, 0xc9, 0xa1, 0x3c, 0x4f, 0x1f, 0x4f, 0xbe,
- 0x38, 0xf0, 0xda, 0xbe, 0xdf, 0x2d, 0xf0, 0x3c, 0x0a, 0xe3, 0x13, 0x3c,
- 0x6d, 0xc1, 0x45, 0x3d, 0x9c, 0x07, 0xc5, 0xbd, 0xf5, 0x59, 0xf0, 0xbb,
- 0x60, 0x1e, 0x76, 0x3c, 0xc0, 0x5c, 0x97, 0xbe, 0x7d, 0x8a, 0x24, 0xbd,
- 0xfb, 0x96, 0xe1, 0xbe, 0x90, 0x8e, 0xe6, 0xbe, 0xa3, 0xb0, 0x24, 0xbe,
- 0xdc, 0xd1, 0x3d, 0xbe, 0x05, 0x84, 0xb3, 0x3c, 0x54, 0x26, 0x37, 0xbd,
- 0xa7, 0xfb, 0x60, 0xbd, 0x16, 0x64, 0x02, 0xbd, 0x51, 0x6c, 0x87, 0xbd,
- 0x5b, 0x8a, 0xca, 0xba, 0x5c, 0xbc, 0x91, 0xbc, 0x67, 0x77, 0x67, 0xbe,
+ 0xeb, 0x2d, 0x3f, 0xbd, 0x91, 0x38, 0xf9, 0xbd, 0xb6, 0xa9, 0xd1, 0xbd,
+ 0x7a, 0xf2, 0x29, 0xbe, 0x20, 0x4b, 0x23, 0xbe, 0xba, 0xc4, 0x18, 0xbd,
+ 0xa7, 0xcf, 0x87, 0xbe, 0x0b, 0xbb, 0x2e, 0xbe, 0x13, 0x0a, 0x2f, 0xbd,
+ 0x3a, 0xfc, 0x6e, 0x3e, 0x22, 0xb6, 0x96, 0xbd, 0x87, 0x24, 0xd8, 0x3c,
+ 0x76, 0x5b, 0xfb, 0xbd, 0xbf, 0x7b, 0x03, 0x3e, 0xf2, 0x68, 0xcc, 0x3d,
+ 0x30, 0x66, 0x45, 0xbe, 0x69, 0x87, 0xf2, 0x3d, 0x4c, 0xed, 0x2f, 0x3d,
+ 0x45, 0x78, 0x2f, 0xbe, 0xf8, 0x32, 0x49, 0x3d, 0x92, 0x0f, 0x22, 0xbe,
+ 0xbc, 0x2f, 0x05, 0xbe, 0x72, 0xfa, 0xa3, 0x3c, 0xcb, 0x07, 0x10, 0x3d,
+ 0x6a, 0x94, 0xa2, 0x3d, 0x9b, 0xcf, 0x58, 0xbb, 0x01, 0x88, 0x87, 0xbd,
+ 0xb4, 0xe6, 0x08, 0x3d, 0xd0, 0x0f, 0x8d, 0x3a, 0x58, 0xcd, 0x1b, 0x3e,
+ 0x07, 0x0a, 0x00, 0x3e, 0xe0, 0xe3, 0x96, 0xbb, 0xd8, 0x1a, 0x01, 0xbe,
+ 0xe7, 0x4e, 0x60, 0x3d, 0x6b, 0xbf, 0x0c, 0x3d, 0xc0, 0xce, 0x41, 0x3d,
+ 0x43, 0x44, 0x8e, 0x3d, 0xb1, 0xdc, 0x24, 0x3e, 0xc7, 0x58, 0xdb, 0xbd,
+ 0x92, 0x15, 0x8d, 0xbd, 0x4f, 0x6e, 0x0e, 0xbe, 0x62, 0x01, 0xaf, 0xbd,
+ 0x76, 0xf1, 0xbc, 0xbd, 0x14, 0x7b, 0x3b, 0x3e, 0x04, 0xaa, 0x7f, 0xbe,
+ 0x75, 0x05, 0x46, 0xbe, 0xb1, 0x30, 0xcc, 0x3c, 0x5b, 0x55, 0x11, 0x3e,
+ 0xd0, 0x8f, 0xdc, 0x3d, 0x9a, 0x29, 0xe0, 0x3d, 0xb9, 0xe9, 0x06, 0x3e,
+ 0xe8, 0x68, 0x14, 0x3d, 0xf4, 0xd3, 0x5b, 0x3c, 0x5e, 0xfa, 0x00, 0xbe,
+ 0xad, 0xba, 0xab, 0xbd, 0x28, 0x64, 0x7c, 0xbd, 0x0c, 0x08, 0x55, 0x3c,
+ 0xd6, 0x5d, 0x66, 0xbe, 0xdf, 0x21, 0x19, 0xbe, 0x7b, 0x2b, 0x99, 0xbd,
+ 0x3a, 0xfc, 0x71, 0xbd, 0xe5, 0x1f, 0x4a, 0xbe, 0x2d, 0x03, 0xe4, 0xbd,
+ 0x61, 0x98, 0xc1, 0xbd, 0xf6, 0xda, 0x85, 0xbd, 0xfe, 0xa8, 0x0b, 0x3e,
+ 0x07, 0x78, 0x3d, 0x3e, 0x63, 0x93, 0xa6, 0x3d, 0xdf, 0x9f, 0x4a, 0xbd,
+ 0xe1, 0x05, 0xda, 0x3d, 0x19, 0xad, 0xc8, 0xbd, 0x69, 0x02, 0xa3, 0x3d,
+ 0x26, 0x5c, 0x91, 0x3a, 0x22, 0x4a, 0x93, 0x3d, 0x99, 0x35, 0x93, 0x3d,
+ 0xef, 0x78, 0x2c, 0xbe, 0x46, 0xbb, 0x2b, 0xbd, 0x29, 0x7e, 0x51, 0x3d,
+ 0xa8, 0xe0, 0x12, 0xbe, 0xca, 0x41, 0x9e, 0xbd, 0x55, 0x99, 0x7d, 0xbe,
+ 0x20, 0x05, 0x37, 0xbe, 0xdd, 0xf8, 0xa7, 0x3c, 0x6b, 0x69, 0xaf, 0xbc,
+ 0xd8, 0x57, 0x48, 0x3d, 0x4e, 0x58, 0x59, 0xbe, 0xad, 0x87, 0x06, 0xbd,
+ 0xa1, 0x7d, 0x37, 0xbc, 0x11, 0x43, 0x02, 0xbe, 0xa3, 0xfa, 0xd0, 0xbd,
+ 0x82, 0x68, 0x32, 0xbe, 0xd6, 0x3f, 0x05, 0xbe, 0xc8, 0xbb, 0x1b, 0xbe,
+ 0x5e, 0x78, 0xc4, 0xbb, 0x22, 0x92, 0x26, 0xbe, 0xea, 0xfa, 0x92, 0xbd,
+ 0x35, 0x3d, 0x39, 0x3d, 0x69, 0x3e, 0xc0, 0x3d, 0x04, 0xc2, 0x5a, 0xbe,
+ 0xcd, 0x86, 0xe6, 0x3d, 0x10, 0x45, 0x23, 0xbe, 0x68, 0x83, 0x2e, 0x3e,
+ 0xca, 0xf8, 0x3d, 0xbe, 0x67, 0xe2, 0x58, 0xbe, 0x1c, 0x95, 0x00, 0x3e,
+ 0x4d, 0x4d, 0x6b, 0xbe, 0x11, 0x2f, 0xd1, 0x3d, 0x29, 0xa2, 0xe8, 0xbd,
+ 0x76, 0xd8, 0xdf, 0x3c, 0x95, 0x11, 0x27, 0xbe, 0x5c, 0x22, 0x19, 0x3e,
+ 0xc4, 0xa6, 0x11, 0x3c, 0x7b, 0x21, 0x16, 0xbe, 0xb0, 0x5f, 0x46, 0xbe,
+ 0x70, 0x49, 0x4d, 0xbd, 0xa9, 0x85, 0x19, 0xbe, 0x6a, 0x25, 0x63, 0x3d,
+ 0x5d, 0x6e, 0x4e, 0x3e, 0xa6, 0xf1, 0x45, 0x3e, 0xf7, 0xfc, 0x5b, 0x3e,
+ 0xac, 0x1e, 0xb0, 0xbd, 0x74, 0xed, 0xd9, 0xbd, 0xd2, 0x76, 0x6e, 0xbe,
+ 0x27, 0x23, 0x91, 0x3a, 0x0a, 0x97, 0xeb, 0xbd, 0xb6, 0x69, 0xba, 0xbd,
+ 0x0e, 0xaa, 0x0a, 0x3d, 0x30, 0x51, 0xe7, 0x3d, 0xc3, 0x34, 0x20, 0x3d,
+ 0xa4, 0xfc, 0x6e, 0xbd, 0x92, 0x58, 0x25, 0x3e, 0x57, 0x8a, 0x20, 0x3d,
+ 0x57, 0x51, 0x82, 0x3d, 0xf5, 0xd4, 0x47, 0x3e, 0x79, 0x1b, 0x08, 0x3e,
+ 0x1a, 0x01, 0xe4, 0x3d, 0x78, 0xc2, 0x44, 0xbd, 0x87, 0xe5, 0x13, 0x3c,
+ 0x51, 0x2f, 0x70, 0xbd, 0xd0, 0xf0, 0xba, 0x3d, 0xda, 0x7a, 0x3c, 0x3e,
+ 0xf7, 0x38, 0x1f, 0x3d, 0xb2, 0x96, 0xfb, 0xbd, 0xc1, 0x1a, 0xa1, 0x3d,
+ 0x27, 0xa0, 0x85, 0x3d, 0x49, 0xbe, 0x13, 0x3e, 0x21, 0x9c, 0x86, 0x3e,
+ 0xee, 0x77, 0xa7, 0x3d, 0x53, 0x0c, 0x05, 0xbd, 0xea, 0x21, 0x30, 0x3e,
+ 0xbc, 0xae, 0x51, 0x3d, 0xd1, 0x46, 0x7e, 0x3d, 0x6e, 0x9a, 0x82, 0x3e,
+ 0x7f, 0x29, 0x60, 0x3e, 0xad, 0x68, 0x98, 0x3e, 0x5a, 0x1d, 0x50, 0x3d,
+ 0x00, 0x8d, 0x05, 0xbe, 0x49, 0xc0, 0xb1, 0xbd, 0x1d, 0x2e, 0x81, 0x3e,
+ 0x64, 0xe5, 0x8a, 0x3e, 0x05, 0x31, 0x86, 0x3e, 0xff, 0xc7, 0x30, 0xbe,
+ 0xc8, 0x70, 0x55, 0xbd, 0x90, 0x39, 0x1c, 0x3e, 0x52, 0xfc, 0xa4, 0x3d,
+ 0x7a, 0xdf, 0x0b, 0xbe, 0x50, 0x70, 0x4d, 0xbd, 0xbf, 0xcd, 0x09, 0xbe,
+ 0x50, 0x39, 0x0a, 0x3e, 0xfd, 0xbd, 0xf1, 0xbd, 0x3a, 0xb7, 0x1e, 0xbe,
+ 0xb7, 0x57, 0xf3, 0xbd, 0x38, 0x79, 0x54, 0x3e, 0xb0, 0xdd, 0x2f, 0xbd,
+ 0x9b, 0x4e, 0xda, 0x3d, 0xc7, 0x8e, 0x48, 0xbd, 0x50, 0x31, 0xe5, 0xbd,
+ 0xca, 0x84, 0xd3, 0xbe, 0x9a, 0x78, 0x8b, 0x3d, 0x27, 0xd4, 0xbe, 0x3b,
+ 0xb4, 0xc6, 0xfd, 0x3d, 0x17, 0xea, 0xbe, 0xbd, 0xd5, 0x91, 0x0b, 0x3e,
+ 0xcd, 0xc6, 0xf3, 0xbd, 0x28, 0x12, 0xa0, 0x3c, 0x37, 0x19, 0x4c, 0x3e,
+ 0xe0, 0x28, 0x77, 0xbe, 0xeb, 0x4e, 0xee, 0xbd, 0x86, 0x26, 0x08, 0xbd,
+ 0x52, 0x82, 0x8b, 0x3d, 0x77, 0x49, 0xa1, 0xbd, 0x2a, 0x52, 0x9a, 0xbe,
+ 0x4c, 0x5d, 0xb5, 0xbd, 0x5f, 0x40, 0x30, 0xbe, 0xe4, 0x21, 0x12, 0x3e,
+ 0x8c, 0x0f, 0x0e, 0x3d, 0x10, 0x55, 0x4a, 0x3d, 0x9d, 0x50, 0x82, 0x3d,
+ 0x11, 0x74, 0x2f, 0x3e, 0x3c, 0x73, 0xd3, 0xbc, 0xef, 0x6d, 0x2d, 0xbd,
+ 0x23, 0x5d, 0x3b, 0x3e, 0xeb, 0xc2, 0x14, 0xbe, 0x9a, 0x44, 0xa3, 0xbe,
+ 0xb0, 0xf6, 0xdd, 0xbd, 0xb4, 0x80, 0x1c, 0xbe, 0xd6, 0x1e, 0xf7, 0x3d,
+ 0xa4, 0xac, 0x6c, 0x3e, 0x91, 0xf3, 0x2c, 0xbe, 0x65, 0xd5, 0x04, 0x3e,
+ 0x3b, 0x49, 0x33, 0xbe, 0x8d, 0xfb, 0xc0, 0x3d, 0x30, 0x4a, 0x3c, 0xbd,
+ 0x4e, 0xd5, 0xb0, 0x3e, 0xb4, 0x32, 0xa1, 0xbe, 0x8e, 0xb1, 0xd3, 0x3d,
+ 0x62, 0x6d, 0x77, 0x3d, 0xad, 0x02, 0x74, 0xbd, 0x4d, 0x09, 0x80, 0x3e,
+ 0xb8, 0x66, 0x4e, 0xbd, 0x6e, 0xb4, 0xe0, 0x3a, 0x1e, 0x70, 0x18, 0xbe,
+ 0x58, 0x50, 0x3d, 0x3e, 0x29, 0xe5, 0x15, 0x3d, 0xd1, 0xbe, 0xf5, 0x3d,
+ 0x2a, 0xcb, 0xb6, 0xbd, 0x43, 0x62, 0x9b, 0x3d, 0x58, 0x6a, 0x27, 0x3e,
+ 0x1f, 0xc4, 0xf8, 0xbd, 0xfa, 0x72, 0xc0, 0x3d, 0xe3, 0xd9, 0xb8, 0xbe,
+ 0x46, 0x3d, 0xb7, 0xbc, 0xf5, 0x0a, 0x9d, 0x3d, 0x99, 0x18, 0x80, 0xbd,
+ 0x6d, 0x34, 0x2d, 0x3e, 0x95, 0xfc, 0x1e, 0xbe, 0x7b, 0x28, 0x7f, 0xbe,
+ 0xf4, 0x94, 0x22, 0xbd, 0x04, 0x6e, 0x40, 0x3e, 0x91, 0xb6, 0xed, 0xbd,
+ 0x74, 0x2e, 0x7d, 0x3c, 0x12, 0x09, 0xd3, 0x3d, 0x02, 0xa0, 0xc2, 0xbd,
+ 0xc9, 0x12, 0x30, 0x3e, 0x81, 0x85, 0x14, 0x3a, 0xc3, 0xb1, 0x86, 0xbd,
+ 0x64, 0x97, 0x01, 0xbe, 0x1c, 0x2b, 0x27, 0x3e, 0x5b, 0x3d, 0x8f, 0x3d,
+ 0x97, 0x6c, 0x41, 0xbe, 0x0e, 0xbf, 0x4d, 0xbe, 0x63, 0x91, 0x50, 0xbd,
+ 0x7c, 0xc0, 0xc6, 0xbc, 0x86, 0x58, 0x23, 0xbc, 0x27, 0x01, 0x15, 0xbe,
+ 0x1e, 0xd3, 0x84, 0x3d, 0x52, 0xba, 0xba, 0x3d, 0x1c, 0xb5, 0x88, 0xbd,
+ 0xe8, 0xf5, 0x34, 0xbe, 0x20, 0x21, 0x1b, 0x3d, 0x16, 0x03, 0x08, 0x3e,
+ 0xa0, 0x07, 0xf0, 0xbd, 0x41, 0xe2, 0x0f, 0xbe, 0x5c, 0x55, 0x24, 0x3d,
+ 0x40, 0x8d, 0xa1, 0x3d, 0xa7, 0xb3, 0xc6, 0xbd, 0xb7, 0x54, 0xf0, 0x3d,
+ 0x28, 0xbd, 0x68, 0x3d, 0x61, 0x14, 0xd6, 0x3c, 0xed, 0x2b, 0xac, 0xbd,
+ 0x2f, 0x86, 0x8b, 0xbb, 0x10, 0x60, 0x09, 0xbe, 0xa8, 0xaa, 0x3b, 0x3e,
+ 0x20, 0x8e, 0xc9, 0x3d, 0x98, 0xf4, 0x57, 0x3d, 0x7a, 0x58, 0x2a, 0xbe,
+ 0x41, 0x45, 0xca, 0x3c, 0x8d, 0xb1, 0x00, 0xbe, 0x60, 0x5e, 0x45, 0x3d,
+ 0xcf, 0xbf, 0x2a, 0xbe, 0xb7, 0xe0, 0xe5, 0x3d, 0x22, 0xda, 0x6c, 0x3d,
+ 0xee, 0x54, 0x80, 0xbb, 0xb7, 0xc5, 0xba, 0x3c, 0xef, 0x2b, 0xa6, 0xbd,
+ 0x0d, 0x55, 0x22, 0x3d, 0x3a, 0xbd, 0x84, 0xbd, 0x51, 0x52, 0x6d, 0xbd,
+ 0x4d, 0x59, 0x01, 0xbe, 0xad, 0x89, 0x41, 0x3b, 0xdd, 0x82, 0xe5, 0x3d,
+ 0x47, 0x43, 0x18, 0x3e, 0xc8, 0x9d, 0xe9, 0xbd, 0x69, 0x42, 0x8b, 0x3d,
+ 0xa1, 0x9b, 0x22, 0x3d, 0x1d, 0x85, 0xd9, 0x3e, 0x7c, 0x01, 0xf8, 0xbd,
+ 0x83, 0x70, 0x8d, 0xbe, 0x29, 0x28, 0x62, 0x3e, 0xaf, 0x0a, 0x6e, 0xbe,
+ 0x97, 0x8f, 0xb2, 0xbe, 0x43, 0xcb, 0x8e, 0xbd, 0xa2, 0x5b, 0x1c, 0xbe,
+ 0xb0, 0xb0, 0x76, 0x3e, 0x51, 0x2c, 0x0d, 0x3e, 0xd3, 0xd0, 0x3e, 0x3e,
+ 0xaf, 0x37, 0xa8, 0x3e, 0x13, 0xc6, 0x97, 0x3e, 0x3c, 0x8a, 0x69, 0x3e,
+ 0x5c, 0x10, 0xa0, 0xbe, 0xbf, 0xcf, 0x40, 0xbe, 0xf9, 0x49, 0xd1, 0x3d,
+ 0x46, 0x1b, 0x90, 0x3d, 0xbd, 0x7b, 0xc2, 0xbd, 0xe5, 0x42, 0x41, 0xbd,
+ 0x8b, 0xbc, 0xda, 0xbd, 0x33, 0x6c, 0x7c, 0xbe, 0x33, 0x97, 0x59, 0x3d,
+ 0xba, 0x86, 0x71, 0xbc, 0x9d, 0xa1, 0xda, 0x3c, 0x62, 0x0d, 0xc2, 0x3e,
+ 0xcd, 0xe1, 0x1b, 0x3e, 0x2a, 0x15, 0x8e, 0xbe, 0xef, 0x73, 0x8d, 0x3e,
+ 0x56, 0xe2, 0x87, 0x3e, 0xe2, 0x39, 0x65, 0xbe, 0x0d, 0xe0, 0x6b, 0x3e,
+ 0x99, 0x18, 0x08, 0x3e, 0x00, 0x19, 0x1f, 0x3e, 0xe9, 0xac, 0xbc, 0xbd,
+ 0xce, 0x9d, 0x58, 0x3d, 0x72, 0xa9, 0x57, 0xbd, 0x02, 0xfe, 0xb1, 0xbd,
+ 0x26, 0xd5, 0x8f, 0xbd, 0x37, 0x13, 0xd2, 0x3d, 0xac, 0x07, 0x63, 0xbd,
+ 0xdd, 0x26, 0x3e, 0x3d, 0x26, 0x81, 0x3a, 0xbe, 0x93, 0x15, 0xa0, 0xbe,
+ 0xc0, 0x4d, 0x93, 0x3d, 0x93, 0x68, 0xdf, 0xbd, 0xf6, 0xfd, 0x47, 0x3d,
+ 0x5c, 0xfc, 0x2c, 0xbe, 0x22, 0x32, 0xb3, 0x3d, 0x0f, 0x1b, 0xcc, 0xbd,
+ 0xbb, 0x2f, 0x22, 0x3e, 0xd8, 0xfb, 0x8d, 0xbd, 0xb1, 0x16, 0x04, 0xbe,
+ 0xeb, 0xde, 0x91, 0xbe, 0xed, 0xa4, 0xb7, 0xbe, 0x29, 0xa9, 0xca, 0xbc,
+ 0xa6, 0x75, 0xe2, 0xbc, 0x03, 0xd7, 0x76, 0xbe, 0x9f, 0x4a, 0xd4, 0x3d,
+ 0x38, 0x64, 0x4a, 0xbe, 0x84, 0xc9, 0x7d, 0x3c, 0xa0, 0x55, 0x47, 0xbd,
+ 0x4d, 0xb9, 0x29, 0x3d, 0xa7, 0x55, 0x13, 0x3e, 0x51, 0x0c, 0x12, 0x3e,
+ 0x5f, 0x6b, 0x3e, 0x3e, 0x98, 0x4c, 0x59, 0xbd, 0xac, 0x33, 0xae, 0xbd,
+ 0xc5, 0xc9, 0x24, 0xbe, 0x67, 0x7c, 0xe8, 0xbd, 0x35, 0xc0, 0x5f, 0x3c,
+ 0x78, 0x8c, 0xe6, 0x3d, 0xd3, 0x03, 0x22, 0x3e, 0x91, 0xec, 0x8b, 0xbe,
+ 0xf7, 0x0f, 0x05, 0xbe, 0x36, 0x94, 0xf2, 0x3d, 0x34, 0xb3, 0x77, 0xbd,
+ 0x88, 0xea, 0x01, 0xbe, 0x9e, 0xca, 0xd8, 0x3d, 0xe8, 0x38, 0xba, 0x3b,
+ 0xdd, 0xf9, 0x95, 0x3c, 0x31, 0x96, 0x8a, 0xbe, 0x2a, 0xd4, 0x29, 0xbd,
+ 0x65, 0x00, 0x53, 0x3d, 0x9e, 0x1f, 0x4b, 0xbd, 0xaf, 0xde, 0xe8, 0x3c,
+ 0x54, 0x41, 0x8c, 0xbe, 0x46, 0x00, 0x23, 0x3e, 0x1c, 0x1f, 0x98, 0xbd,
+ 0xe9, 0xf8, 0x17, 0x3d, 0x56, 0x93, 0xdc, 0x3d, 0xe2, 0xc0, 0x06, 0x3e,
+ 0x63, 0xa6, 0xf7, 0x3d, 0x66, 0x5c, 0x0d, 0x3e, 0xe4, 0x99, 0x32, 0x3e,
+ 0x98, 0x0d, 0x6e, 0xbe, 0x32, 0x1f, 0x30, 0xbb, 0x93, 0x74, 0xd7, 0x3d,
+ 0x9f, 0x03, 0x70, 0x3d, 0xe1, 0x07, 0x20, 0xbd, 0x0a, 0x9a, 0xfe, 0xbc,
+ 0x19, 0x86, 0xfc, 0xbc, 0xaa, 0xc1, 0xa8, 0xbd, 0xa2, 0x8f, 0xc8, 0xbd,
+ 0xb8, 0xca, 0xf9, 0x3d, 0x71, 0x94, 0x94, 0x3e, 0x76, 0x3a, 0x02, 0xbe,
+ 0x30, 0xd8, 0x16, 0xbe, 0x52, 0xec, 0x5a, 0x3c, 0xb0, 0x63, 0x46, 0xbd,
+ 0xba, 0x72, 0x44, 0x3c, 0x3c, 0xfc, 0xfa, 0x3d, 0x1c, 0xe6, 0x9f, 0x3d,
+ 0x32, 0x8f, 0x2c, 0xbe, 0x25, 0xc1, 0xdd, 0x3d, 0x0f, 0xd8, 0xd9, 0x3d,
+ 0x04, 0xfa, 0x09, 0xbe, 0x66, 0x6e, 0x1d, 0xbe, 0x2d, 0x87, 0x49, 0xbe,
+ 0x65, 0x15, 0xa1, 0xbd, 0x2a, 0x48, 0xda, 0x3c, 0x63, 0xd8, 0x86, 0x3d,
+ 0x4e, 0x9f, 0xd9, 0x3d, 0xa0, 0xc0, 0xd1, 0x3d, 0x48, 0xe6, 0x09, 0xbe,
+ 0x74, 0xa5, 0x73, 0x3d, 0x15, 0xa2, 0xbd, 0x3c, 0x75, 0x07, 0x0b, 0x3e,
+ 0x25, 0x1d, 0xb3, 0xbc, 0xc2, 0xf8, 0x86, 0x3e, 0x57, 0x10, 0xab, 0x3d,
+ 0x1f, 0x1f, 0x02, 0x3e, 0x7c, 0xe1, 0x20, 0x3e, 0x95, 0x96, 0xd2, 0xbd,
+ 0x7a, 0xd4, 0xa2, 0x3d, 0x4b, 0x06, 0x33, 0xbe, 0xc9, 0x30, 0xda, 0x3d,
+ 0x32, 0x6d, 0x4f, 0x3e, 0x01, 0x57, 0xcf, 0x3d, 0xd8, 0x5d, 0x90, 0x3d,
+ 0x77, 0x6a, 0x91, 0x3e, 0xa9, 0x76, 0x32, 0x3e, 0x87, 0xde, 0x0b, 0x3e,
+ 0x48, 0x39, 0xb1, 0xbd, 0xaa, 0x94, 0x6a, 0xbd, 0xbd, 0x0d, 0x47, 0x3e,
+ 0xcb, 0xe4, 0xf6, 0xbd, 0x83, 0x40, 0x13, 0x3e, 0xfd, 0x0a, 0x1e, 0xbe,
+ 0xa8, 0x8e, 0x18, 0x38, 0x19, 0x52, 0x70, 0x3e, 0xae, 0x8d, 0x4e, 0x3e,
+ 0x25, 0xe0, 0xe0, 0xbd, 0xee, 0xba, 0x5b, 0x3d, 0x5d, 0x86, 0x5b, 0x3c,
+ 0x0a, 0x89, 0x51, 0xbe, 0xea, 0xf7, 0x18, 0x3e, 0xe8, 0xf5, 0x61, 0x3d,
+ 0x8d, 0xde, 0x97, 0xbd, 0xca, 0x48, 0x1d, 0x3e, 0x5a, 0xa8, 0x67, 0x3b,
+ 0xc5, 0x6e, 0x19, 0xbc, 0x9c, 0x6c, 0x07, 0x3d, 0x9d, 0xc9, 0xbb, 0xbc,
+ 0xe9, 0x40, 0x09, 0xbd, 0xd1, 0xe7, 0xdd, 0xbc, 0xcb, 0x22, 0x2e, 0x3e,
+ 0xaa, 0xb1, 0x8d, 0xbd, 0x13, 0xd8, 0xe1, 0xbd, 0x77, 0xb8, 0xa5, 0x3c,
+ 0x0c, 0xe5, 0x38, 0x3e, 0xae, 0xf4, 0x5b, 0x3e, 0x97, 0x43, 0x3f, 0xbe,
+ 0xb6, 0xfb, 0x82, 0x3d, 0xf5, 0xe9, 0x3e, 0x3e, 0xa1, 0xf1, 0x08, 0xbe,
+ 0x80, 0x8b, 0x37, 0x3d, 0x8e, 0x19, 0xc0, 0x3d, 0x39, 0xbf, 0x4d, 0xbe,
+ 0x13, 0x79, 0x27, 0xbc, 0x87, 0xfc, 0x36, 0xbd, 0x15, 0xb4, 0x2c, 0xbe,
+ 0x6d, 0x00, 0x50, 0xbd, 0x36, 0xaa, 0x11, 0x3d, 0xe1, 0x45, 0x5e, 0x3e,
+ 0x8d, 0x7e, 0x84, 0x3d, 0x7f, 0x5b, 0x31, 0x3d, 0xa2, 0x5f, 0x28, 0xbe,
+ 0x7c, 0xbe, 0x37, 0xbe, 0xab, 0x06, 0xfa, 0xbd, 0x29, 0x86, 0x65, 0xbe,
+ 0xbf, 0xd6, 0xf9, 0xbc, 0x59, 0xdf, 0x2a, 0x3d, 0xd2, 0xe6, 0x0f, 0xbe,
+ 0x77, 0x74, 0x6e, 0x3e, 0x02, 0x1c, 0x3e, 0x3c, 0x98, 0x78, 0xed, 0x3d,
+ 0x04, 0x1b, 0x82, 0x3e, 0x05, 0x9f, 0x20, 0xbc, 0xa1, 0xc9, 0xf1, 0x3d,
+ 0xbf, 0x29, 0x8a, 0xbc, 0x95, 0x9e, 0xd0, 0x3c, 0x59, 0x77, 0xcb, 0xbd,
+ 0x0d, 0xc3, 0x2a, 0xbe, 0x2b, 0xe8, 0xd1, 0xbc, 0xf3, 0xfc, 0xf7, 0x3d,
+ 0x12, 0x7f, 0xc8, 0xbd, 0xd4, 0x29, 0x1f, 0xbe, 0xd7, 0x96, 0xfc, 0x3d,
+ 0x73, 0x13, 0x9d, 0xbe, 0x7a, 0x94, 0x05, 0xbd, 0xa3, 0xd6, 0xe9, 0xbc,
+ 0xe2, 0x79, 0x0f, 0x3e, 0x49, 0xa7, 0xf1, 0xbd, 0xd2, 0x83, 0x7c, 0xbc,
+ 0x19, 0xfd, 0x01, 0xbe, 0x94, 0x03, 0x4c, 0xbe, 0xa3, 0x20, 0x79, 0x3e,
+ 0xd8, 0xa8, 0x00, 0xbe, 0x2a, 0x11, 0xd7, 0x3d, 0x23, 0xdd, 0xf6, 0xbc,
+ 0xcb, 0xda, 0x92, 0x3a, 0x00, 0xf4, 0x2d, 0xbe, 0x5f, 0x7c, 0x68, 0xbe,
+ 0x35, 0x07, 0x64, 0x3e, 0x24, 0x3f, 0xef, 0xbd, 0x01, 0x06, 0x76, 0x3c,
+ 0x04, 0x74, 0x8d, 0x3e, 0x0a, 0xca, 0x75, 0x3c, 0x76, 0x97, 0x1d, 0xbe,
+ 0x70, 0x92, 0xf6, 0x3d, 0x4d, 0x54, 0xde, 0xbd, 0x97, 0x74, 0x95, 0xbd,
+ 0x8c, 0x4e, 0xed, 0x3d, 0x46, 0xee, 0x55, 0xbe, 0x57, 0x08, 0x13, 0x3e,
+ 0x8a, 0xbe, 0x14, 0xbe, 0xc5, 0xde, 0xd5, 0x3d, 0x3e, 0x26, 0x0e, 0xbd,
+ 0x5f, 0x27, 0x09, 0xbe, 0x5d, 0xa8, 0x70, 0xbd, 0x7a, 0x93, 0x59, 0x3d,
+ 0x01, 0x64, 0xc3, 0xbc, 0xcb, 0xb6, 0x3a, 0x3c, 0xaf, 0x2c, 0x63, 0xbc,
+ 0x2f, 0x2b, 0x0d, 0xbd, 0x11, 0x63, 0x2f, 0x3e, 0x35, 0x0b, 0x84, 0x3d,
+ 0x0b, 0xf1, 0x6e, 0xbd, 0x90, 0x77, 0xd3, 0xbc, 0x31, 0xf6, 0x0e, 0x3d,
+ 0x4c, 0x60, 0x09, 0xbd, 0x95, 0xc2, 0x2f, 0x3e, 0x90, 0x56, 0xb2, 0xbd,
+ 0x74, 0x9f, 0x4e, 0x3d, 0x9e, 0xe6, 0x43, 0x3e, 0xfe, 0xf5, 0x14, 0x3d,
+ 0x58, 0x88, 0xae, 0x3c, 0x46, 0xb4, 0x21, 0xbc, 0x2b, 0x65, 0xec, 0xbd,
+ 0xef, 0x00, 0x2a, 0xbe, 0xd4, 0x1b, 0x00, 0x3e, 0x00, 0x5a, 0x83, 0x3d,
+ 0x2d, 0xf3, 0xfe, 0xbc, 0x29, 0xf7, 0x13, 0xbe, 0x37, 0x8c, 0x15, 0xbd,
+ 0xbb, 0x71, 0xe6, 0xbd, 0xd3, 0xe3, 0xf8, 0x3d, 0x0f, 0xd6, 0xdf, 0x3d,
+ 0xd0, 0x8a, 0x2d, 0xbe, 0x87, 0xd5, 0x23, 0x3e, 0xdf, 0x8d, 0x2e, 0xbd,
+ 0xb1, 0x56, 0x65, 0x3e, 0x49, 0xab, 0x05, 0xbd, 0x77, 0xbf, 0x36, 0x3e,
+ 0xa5, 0xb0, 0x7a, 0x3d, 0x8f, 0x7f, 0x10, 0xbe, 0x6d, 0x70, 0x28, 0x3e,
+ 0xc3, 0xea, 0x8b, 0x3c, 0x91, 0x96, 0x8e, 0xbd, 0x72, 0x2d, 0x0f, 0x3e,
+ 0x02, 0x85, 0xaf, 0xbb, 0x84, 0xd9, 0x06, 0x3d, 0x55, 0xaa, 0x1e, 0xbe,
+ 0xb4, 0x05, 0x02, 0x3e, 0x47, 0x2b, 0x11, 0xbd, 0xc8, 0x9b, 0xd4, 0x3d,
+ 0xaf, 0xba, 0x62, 0xbe, 0x8d, 0xed, 0xab, 0x3e, 0xa2, 0x7f, 0x1f, 0xbe,
+ 0xe7, 0xd1, 0xac, 0x3d, 0xc4, 0x6a, 0x89, 0x3d, 0xeb, 0x63, 0xc8, 0x3d,
+ 0xea, 0x96, 0x78, 0xbd, 0x87, 0x56, 0xca, 0xbd, 0xea, 0x33, 0x36, 0x3e,
+ 0x11, 0x66, 0xb4, 0xbd, 0x9e, 0x7b, 0x18, 0x3e, 0x0d, 0xf6, 0xa0, 0x3d,
+ 0x1a, 0xd5, 0x16, 0x3e, 0xba, 0xfc, 0x3f, 0xbe, 0x45, 0x29, 0xc5, 0xbc,
+ 0x86, 0x5e, 0x28, 0x3e, 0xc2, 0x3f, 0xbe, 0xbd, 0x09, 0xd1, 0x3b, 0xbe,
+ 0x5f, 0x28, 0x24, 0xbe, 0xd9, 0x84, 0x09, 0xbe, 0x1c, 0x58, 0x73, 0xbd,
+ 0xd2, 0x3c, 0xd9, 0x3d, 0x52, 0x47, 0x35, 0x3e, 0xb9, 0xf6, 0xf8, 0xbd,
+ 0x3a, 0x66, 0x71, 0xbe, 0x2a, 0xb9, 0x58, 0x3e, 0xfb, 0x90, 0x55, 0x3c,
+ 0x0f, 0x64, 0xd8, 0x3d, 0x0b, 0x81, 0x16, 0x3e, 0xd9, 0x58, 0xec, 0x3d,
+ 0x4a, 0x1f, 0xbe, 0xbc, 0xab, 0xfc, 0xe1, 0xbd, 0xc0, 0xf9, 0x90, 0xbd,
+ 0x7d, 0xf9, 0x20, 0xbe, 0xc3, 0xfe, 0x39, 0xbc, 0x13, 0x90, 0xcd, 0x3d,
+ 0x58, 0xb4, 0xc3, 0xbe, 0xc4, 0xd1, 0xf9, 0xbd, 0x55, 0xd6, 0x96, 0xbd,
+ 0x70, 0x65, 0x80, 0xbd, 0xa7, 0x20, 0xa5, 0x3d, 0xd1, 0xbc, 0x02, 0xbe,
+ 0x41, 0xec, 0x2e, 0x3e, 0x55, 0x34, 0xc9, 0xbd, 0x6a, 0xe8, 0x95, 0xbe,
+ 0x1e, 0x5e, 0x73, 0x3e, 0xda, 0x44, 0x13, 0xbe, 0x7f, 0xc2, 0x62, 0x3e,
+ 0x75, 0x88, 0x75, 0xbe, 0xfe, 0x6e, 0x19, 0xbe, 0x34, 0xb8, 0xc6, 0xbd,
+ 0xd9, 0xb1, 0x0e, 0x3e, 0xf7, 0x52, 0x22, 0xbd, 0x45, 0x89, 0x39, 0x3e,
+ 0x70, 0x96, 0x2d, 0xbe, 0x0a, 0x71, 0x2b, 0x3e, 0xf5, 0x53, 0x20, 0xbe,
+ 0x99, 0x54, 0xc6, 0x3d, 0xa1, 0xf1, 0x93, 0x3d, 0xdd, 0x58, 0x57, 0x3e,
+ 0x59, 0xf2, 0x6d, 0xbd, 0x95, 0x30, 0x3b, 0x3e, 0xba, 0x91, 0x34, 0x3d,
+ 0x14, 0xe4, 0x17, 0xbd, 0x19, 0xe2, 0x17, 0xbc, 0x0b, 0xc8, 0x25, 0xbd,
+ 0xe2, 0xe6, 0xc8, 0x3c, 0x30, 0x5a, 0x62, 0x3d, 0xed, 0x81, 0x09, 0x3e,
+ 0xab, 0xcc, 0xf4, 0x3d, 0x64, 0x70, 0x41, 0xbd, 0xb7, 0x3f, 0x2d, 0x3e,
+ 0x51, 0x3c, 0x11, 0x3e, 0x0e, 0x85, 0xde, 0xbd, 0x77, 0xbf, 0x02, 0x3e,
+ 0x49, 0xe2, 0x83, 0xbd, 0xd0, 0x8f, 0x92, 0xbd, 0xd2, 0x54, 0xb4, 0xbc,
+ 0xfd, 0x65, 0x03, 0xbe, 0x7c, 0xb3, 0xf9, 0xbd, 0xf8, 0x89, 0xd7, 0xbd,
+ 0x7b, 0xa0, 0xa8, 0x3d, 0x82, 0xfc, 0x23, 0x3e, 0xb1, 0xd5, 0x01, 0x3d,
+ 0x20, 0x12, 0xdc, 0xbb, 0x9e, 0x2e, 0xf3, 0xbd, 0x88, 0xab, 0x26, 0xbe,
+ 0x4b, 0x90, 0x28, 0x3e, 0x48, 0x44, 0xe9, 0x3c, 0x40, 0x51, 0x0f, 0xbe,
+ 0x64, 0x4c, 0x2d, 0xbe, 0x25, 0x18, 0xdb, 0xbd, 0x76, 0x3f, 0x8a, 0xbd,
+ 0xad, 0x9e, 0x14, 0xbe, 0x4b, 0x92, 0x35, 0xbe, 0x64, 0xf4, 0xd5, 0xba,
+ 0x12, 0xa3, 0x8e, 0x3d, 0xab, 0x8d, 0xea, 0x3c, 0x23, 0x83, 0x2f, 0xbc,
+ 0x96, 0xa3, 0x2e, 0x3e, 0xf4, 0xd7, 0xab, 0xbc, 0x18, 0xb6, 0x2d, 0x3d,
+ 0xb4, 0xe2, 0xa8, 0x3c, 0xd6, 0xb6, 0xb6, 0xba, 0xdc, 0x44, 0x9d, 0xbc,
+ 0x7e, 0x33, 0xf3, 0x3d, 0xd0, 0x96, 0x3d, 0xbd, 0xed, 0x61, 0xab, 0xbd,
+ 0xc7, 0x32, 0x0f, 0x3d, 0xa5, 0xa5, 0xec, 0x3d, 0xa4, 0x72, 0x47, 0xbe,
+ 0xd1, 0xb1, 0xd9, 0xbd, 0x74, 0x74, 0x65, 0x3d, 0x7a, 0x2d, 0x30, 0x3e,
+ 0x1d, 0x23, 0x39, 0xbe, 0x4b, 0xc5, 0xc3, 0x3d, 0x6a, 0xba, 0xac, 0xbd,
+ 0x18, 0xe4, 0x4a, 0xbd, 0xfc, 0xe2, 0x1e, 0xbd, 0xd0, 0x76, 0x89, 0xbd,
+ 0x3b, 0x9f, 0x99, 0x3d, 0x0e, 0x92, 0x82, 0xbd, 0x17, 0x20, 0xfc, 0x3d,
+ 0x0c, 0xfb, 0x11, 0x3d, 0x39, 0x43, 0xe1, 0xbd, 0x60, 0x89, 0x21, 0xbe,
+ 0x76, 0x8f, 0x2a, 0xbe, 0x77, 0xca, 0x54, 0xbe, 0x16, 0x51, 0x48, 0xbe,
+ 0x50, 0xa2, 0xf2, 0x3c, 0x85, 0xd3, 0x74, 0x3d, 0x1a, 0x3a, 0xd2, 0xbd,
+ 0xbd, 0x60, 0x25, 0xbd, 0x91, 0x4e, 0x0f, 0x3e, 0x98, 0xc8, 0x32, 0xbe,
+ 0xa4, 0x16, 0x3a, 0x3d, 0xe8, 0xd1, 0x12, 0xbe, 0xa2, 0xc2, 0x17, 0xbc,
+ 0x15, 0x3b, 0x9a, 0x3c, 0x2b, 0xbe, 0x62, 0xbc, 0x58, 0xa2, 0x13, 0x3d,
+ 0x0a, 0x27, 0xe4, 0x3d, 0x3f, 0xd1, 0xa2, 0x3d, 0x7f, 0x62, 0x97, 0xbe,
+ 0x1d, 0x9d, 0xda, 0x3c, 0x64, 0x3d, 0x43, 0xbe, 0xd7, 0xaa, 0xb7, 0xbd,
+ 0xce, 0xc5, 0x44, 0xbe, 0x17, 0xad, 0xbb, 0xbd, 0x15, 0xc0, 0x9a, 0x3d,
+ 0x01, 0x52, 0x32, 0x3e, 0xe7, 0x43, 0x1c, 0xbd, 0xb1, 0x12, 0x71, 0x3c,
+ 0xaf, 0xf3, 0x8f, 0xbd, 0x57, 0xc9, 0xa2, 0xbd, 0x0b, 0x0e, 0x78, 0x3d,
+ 0x2c, 0xc6, 0x98, 0xbd, 0x5a, 0xc6, 0x23, 0x3e, 0x74, 0x89, 0x50, 0xbe,
+ 0x2e, 0xe3, 0x25, 0xbe, 0x48, 0x77, 0xc7, 0xbd, 0x3f, 0xcf, 0xdd, 0xbd,
+ 0xf0, 0x5c, 0x27, 0x3d, 0x49, 0x02, 0x17, 0xbe, 0x50, 0xb2, 0x48, 0xbe,
+ 0x04, 0x68, 0x4c, 0x3c, 0xdb, 0xe5, 0x0a, 0xbd, 0x82, 0xad, 0xbb, 0xbd,
+ 0x16, 0xb5, 0x69, 0x3d, 0xc1, 0x0c, 0x22, 0xbd, 0x86, 0x29, 0xce, 0x3d,
+ 0x86, 0xa9, 0x15, 0x3e, 0x1b, 0xa1, 0x9a, 0xbe, 0x4e, 0x9b, 0x90, 0x3d,
+ 0x87, 0xbd, 0x46, 0x3d, 0x1b, 0x88, 0x42, 0xbe, 0xf2, 0x81, 0x12, 0xbd,
+ 0x4f, 0x06, 0x88, 0xba, 0xba, 0x82, 0x82, 0xbc, 0x8d, 0xb6, 0x86, 0x3c,
+ 0x35, 0x30, 0x97, 0x3d, 0x63, 0xb0, 0xe7, 0x3b, 0x39, 0xa8, 0xbd, 0x3d,
+ 0x8b, 0xec, 0x98, 0xbd, 0x07, 0x19, 0xd2, 0x3d, 0xca, 0xc6, 0x56, 0x3c,
+ 0x1a, 0xb6, 0x9a, 0x3d, 0xaa, 0xcd, 0xaa, 0xbd, 0x1b, 0xbf, 0x32, 0xbe,
+ 0x1e, 0x79, 0x4a, 0x3e, 0xc7, 0x3c, 0x15, 0xbd, 0xdf, 0x7c, 0x99, 0xbe,
+ 0x6c, 0x41, 0x42, 0x3c, 0x27, 0x64, 0x5d, 0xbd, 0x01, 0x0c, 0x2f, 0x3e,
+ 0xc9, 0x20, 0x37, 0x3d, 0x07, 0x21, 0xba, 0x3d, 0xaf, 0x13, 0xb4, 0x3d,
+ 0xb0, 0xa8, 0x86, 0x3c, 0xe6, 0x9d, 0xff, 0xbc, 0xc9, 0xfb, 0xa1, 0xbc,
+ 0x82, 0x5c, 0xd8, 0xbc, 0x77, 0x2d, 0x55, 0x3d, 0x6d, 0xad, 0xc9, 0xbd,
+ 0xd7, 0x62, 0xb8, 0xbd, 0xc4, 0x04, 0x7a, 0xbd, 0x00, 0x1f, 0x49, 0xbe,
+ 0xf8, 0x48, 0x4a, 0x3b, 0xd2, 0xfa, 0xb2, 0x3c, 0xb1, 0xf4, 0xe7, 0x3c,
+ 0x45, 0xe3, 0xae, 0xbd, 0x45, 0xb1, 0x5d, 0xbe, 0x2e, 0x8f, 0x1c, 0xbe,
+ 0xe4, 0xf5, 0x08, 0xbd, 0xb2, 0xe4, 0x14, 0xbe, 0x94, 0x55, 0x9d, 0xbc,
+ 0x9c, 0x64, 0x44, 0xbe, 0xd3, 0x01, 0xcc, 0x3d, 0xbf, 0x63, 0x15, 0x3e,
+ 0x94, 0xfa, 0xd7, 0x3c, 0x26, 0x1e, 0x64, 0xbd, 0x3d, 0x6e, 0xf7, 0xbd,
+ 0xab, 0x21, 0x12, 0x3e, 0x7a, 0x78, 0xd4, 0xbc, 0xe7, 0x85, 0x8a, 0xbe,
+ 0xbe, 0xc4, 0x37, 0xbd, 0xfa, 0x75, 0xff, 0x3d, 0xed, 0x5d, 0x19, 0xbe,
+ 0x9b, 0xa6, 0xb1, 0xbd, 0x8b, 0xd2, 0x44, 0x3e, 0x6e, 0x9e, 0x29, 0x3d,
+ 0x86, 0x72, 0xad, 0xbd, 0xf6, 0xff, 0x1c, 0x3c, 0xa1, 0x40, 0xf3, 0xbd,
+ 0x25, 0x53, 0xc4, 0x3c, 0x96, 0x4d, 0x78, 0xbd, 0x98, 0xb5, 0x91, 0xbd,
+ 0xa2, 0x3f, 0x07, 0xbe, 0x7f, 0x12, 0x35, 0xbe, 0xca, 0x3e, 0x29, 0xbe,
+ 0xcb, 0xb8, 0x2b, 0xbd, 0x68, 0xed, 0x1d, 0x3e, 0x45, 0x2a, 0x82, 0xbe,
+ 0x78, 0x6c, 0x45, 0x3e, 0x67, 0xdb, 0xa6, 0xbc, 0xaf, 0x28, 0x0d, 0x3e,
+ 0xd7, 0xac, 0xf1, 0x3d, 0x6f, 0xbd, 0x5e, 0xbd, 0x4d, 0x60, 0x38, 0x3e,
+ 0xc5, 0x35, 0x08, 0xbe, 0x6e, 0x69, 0x8b, 0x3d, 0x70, 0x1f, 0x3f, 0x3e,
+ 0x68, 0x51, 0xa3, 0xbd, 0xd1, 0x09, 0x4f, 0x3d, 0xa9, 0x8b, 0x5a, 0x3e,
+ 0x33, 0x6b, 0xce, 0xbd, 0x92, 0x92, 0x0f, 0x3e, 0x31, 0xb4, 0x28, 0x3e,
+ 0x19, 0x1e, 0x25, 0xbe, 0x52, 0x4e, 0x2a, 0x3d, 0xc6, 0xb0, 0x01, 0xbe,
+ 0xae, 0x04, 0x1b, 0xbe, 0x85, 0xa1, 0x9d, 0xbd, 0xdd, 0xa1, 0x2e, 0xbe,
+ 0xa8, 0xcc, 0x60, 0xbd, 0xba, 0xf1, 0x9b, 0x3c, 0xe7, 0xf0, 0x19, 0x3e,
+ 0xd8, 0xa9, 0x41, 0x3d, 0x62, 0x70, 0xe3, 0xbc, 0x57, 0x2a, 0x93, 0x3c,
+ 0x2e, 0x75, 0x6e, 0xbc, 0xfe, 0x02, 0x1b, 0xbd, 0x7a, 0x3a, 0xf1, 0xbd,
+ 0xcb, 0xb9, 0x72, 0x3d, 0x76, 0x5d, 0x18, 0xbe, 0x93, 0xa8, 0xb0, 0xbd,
+ 0x62, 0x53, 0x87, 0xbc, 0x0c, 0x9c, 0xa2, 0xbd, 0x3c, 0x19, 0xfa, 0x3d,
+ 0x45, 0x52, 0x3f, 0x3d, 0x20, 0xa6, 0x81, 0xbe, 0x99, 0x45, 0xd7, 0xbd,
+ 0xdb, 0x40, 0x01, 0xbd, 0x53, 0xb9, 0x59, 0xbe, 0x5b, 0xc5, 0xb0, 0xbd,
+ 0x63, 0x96, 0x08, 0xbc, 0xa3, 0xb2, 0xd6, 0x3d, 0x97, 0xfd, 0x30, 0x3d,
+ 0xfb, 0xd3, 0x96, 0xbd, 0xdc, 0x2c, 0x54, 0x3e, 0x53, 0x9a, 0x97, 0x3d,
+ 0xbf, 0x1b, 0x12, 0x3e, 0x8b, 0x8a, 0x20, 0x3e, 0x16, 0x59, 0x8c, 0x3d,
+ 0xf3, 0x47, 0xc9, 0x3d, 0x63, 0x88, 0xee, 0xbd, 0x7a, 0xe5, 0x91, 0x3e,
+ 0x16, 0xaf, 0x83, 0xbe, 0xa2, 0x18, 0xa0, 0xbd, 0x88, 0x94, 0x35, 0xbe,
+ 0xfd, 0x88, 0x49, 0xbe, 0xab, 0xfe, 0xd4, 0xbb, 0x9a, 0x21, 0x86, 0xbe,
+ 0x94, 0x15, 0xb0, 0xbd, 0xe2, 0xbf, 0x12, 0x3e, 0xb3, 0x30, 0x21, 0x3c,
+ 0xb4, 0xdc, 0xa0, 0xbd, 0x22, 0x31, 0x76, 0xbc, 0xcd, 0xe8, 0x7a, 0x3e,
+ 0x7b, 0xed, 0x85, 0x3e, 0xae, 0xd3, 0x00, 0xbe, 0xc3, 0xfb, 0x29, 0xbe,
+ 0x69, 0xd8, 0x78, 0x3e, 0xf2, 0x4f, 0x8a, 0xbd, 0x94, 0x7c, 0x09, 0x3e,
+ 0x30, 0x3d, 0x26, 0x3d, 0x44, 0x7a, 0x22, 0xbe, 0xd1, 0x6a, 0x72, 0xbe,
+ 0x41, 0x04, 0xb1, 0x3d, 0x03, 0xa6, 0x0f, 0xbe, 0x48, 0xab, 0x4f, 0xbe,
+ 0x39, 0x6f, 0x8c, 0x3d, 0x26, 0xf6, 0x96, 0xbe, 0x52, 0x3b, 0x82, 0xbd,
+ 0x86, 0x48, 0x23, 0x3e, 0x7d, 0x08, 0xfb, 0x3e, 0x81, 0x26, 0x98, 0x3d,
+ 0x38, 0xc6, 0x4e, 0xbd, 0x74, 0x7d, 0xba, 0x3d, 0x32, 0xfd, 0xad, 0xbd,
+ 0xec, 0x1a, 0xb5, 0xbd, 0xe3, 0x3a, 0xa6, 0xbe, 0xbb, 0x97, 0xd1, 0x3d,
+ 0x0b, 0x7b, 0x8d, 0xbd, 0x55, 0x3c, 0xe0, 0xbc, 0xd9, 0x27, 0x0e, 0x3e,
+ 0x5f, 0xec, 0xa9, 0xbe, 0xdc, 0x20, 0x03, 0x3e, 0x2d, 0xb9, 0x88, 0xbd,
+ 0x9c, 0x7a, 0x07, 0xbf, 0xa1, 0x24, 0x89, 0x3c, 0xa2, 0x89, 0x67, 0x3e,
+ 0x93, 0x31, 0xc1, 0xbe, 0xf0, 0x75, 0xeb, 0x3d, 0x91, 0x7c, 0x89, 0xbc,
+ 0xd3, 0xbd, 0x6e, 0xbd, 0x9b, 0x7d, 0x18, 0x3e, 0x9a, 0x5e, 0x81, 0xbc,
+ 0x3e, 0x41, 0xfc, 0xbd, 0xe8, 0x76, 0x7b, 0x3e, 0xff, 0xf2, 0x5e, 0xbe,
+ 0x51, 0xfd, 0xe9, 0x3c, 0x13, 0x03, 0x98, 0xbd, 0xa5, 0x75, 0xf0, 0xbd,
+ 0x21, 0x2e, 0x29, 0xbe, 0x5c, 0x7d, 0xe9, 0xbd, 0xea, 0xa8, 0x1c, 0xbe,
+ 0xb7, 0x40, 0x2c, 0xbd, 0xe7, 0xcb, 0x0e, 0x3d, 0x5b, 0x73, 0xdd, 0xbd,
+ 0x30, 0x87, 0x35, 0xbe, 0xa0, 0x0e, 0x5b, 0xbe, 0x14, 0x38, 0xde, 0x3d,
+ 0xa6, 0xe1, 0x46, 0xbd, 0x15, 0x94, 0xa0, 0x3d, 0x7d, 0xe3, 0xca, 0xbd,
+ 0x1e, 0x52, 0x7c, 0xbd, 0xaf, 0x88, 0x1f, 0x3d, 0xc6, 0xed, 0x91, 0x3a,
+ 0xa5, 0xdd, 0xdc, 0xb9, 0x47, 0x08, 0xb4, 0xbd, 0x5d, 0xee, 0xaa, 0xbd,
+ 0xe5, 0x3d, 0x76, 0x3d, 0x5a, 0x47, 0xeb, 0x3d, 0xd9, 0x27, 0x34, 0x3d,
+ 0x81, 0x9b, 0xd0, 0xbd, 0xfb, 0x9e, 0xde, 0xbd, 0xb5, 0x60, 0x41, 0xbe,
+ 0x1a, 0xc2, 0xb6, 0x3d, 0x4e, 0x84, 0xd5, 0xbd, 0x5c, 0xea, 0x80, 0xbd,
+ 0xfd, 0x40, 0xb8, 0xbd, 0x54, 0xeb, 0xe6, 0xbc, 0x8c, 0x65, 0xef, 0x3d,
+ 0xd7, 0x30, 0x47, 0xbe, 0xbb, 0x0b, 0x12, 0xbe, 0x7b, 0x17, 0xdb, 0xbd,
+ 0xd5, 0x53, 0x17, 0x3e, 0x49, 0x99, 0x3f, 0x3d, 0x58, 0xc0, 0x1d, 0xbe,
+ 0x71, 0x16, 0x04, 0xbd, 0x59, 0x86, 0xeb, 0xbd, 0xe9, 0x53, 0x46, 0xbe,
+ 0x1c, 0x61, 0x35, 0xbd, 0x78, 0x33, 0xdc, 0xbc, 0xda, 0xda, 0xae, 0xbd,
+ 0x86, 0x3d, 0x53, 0xbe, 0x8e, 0xf6, 0xab, 0xbd, 0xec, 0x92, 0xec, 0x3d,
+ 0x5b, 0xd7, 0x45, 0xbe, 0xfa, 0xd6, 0xfb, 0x3d, 0xe6, 0xf3, 0x6c, 0x3c,
+ 0x55, 0x47, 0x2e, 0x3d, 0xe2, 0x21, 0x14, 0xbe, 0x9b, 0xc4, 0xc5, 0xbd,
+ 0x8a, 0x2d, 0xc8, 0xbb, 0x64, 0x28, 0x4f, 0x3e, 0x01, 0x3b, 0x3a, 0xbe,
+ 0x38, 0x50, 0x9d, 0xbc, 0xcb, 0x64, 0xfa, 0xbc, 0x88, 0x85, 0x49, 0xbe,
+ 0x23, 0x8a, 0x47, 0xbe, 0x5b, 0x8b, 0xb6, 0x3d, 0x82, 0x78, 0x42, 0xbd,
+ 0x4f, 0xa2, 0x26, 0x3e, 0x02, 0x6f, 0x11, 0x3c, 0x1d, 0x4f, 0x2a, 0xbd,
+ 0x00, 0xa8, 0xb3, 0xbd, 0x3d, 0xba, 0xb4, 0x3c, 0xfd, 0x45, 0xe0, 0x3d,
+ 0x8c, 0xce, 0xa6, 0xbd, 0x75, 0x89, 0x36, 0xbc, 0xfe, 0xb9, 0x03, 0x3d,
+ 0x24, 0xd9, 0xf3, 0x3d, 0xc7, 0x13, 0x23, 0xbe, 0x69, 0xa7, 0xf0, 0xbd,
+ 0xab, 0x09, 0xf6, 0x3d, 0x65, 0x72, 0xfd, 0xbd, 0x41, 0x0f, 0x21, 0x3e,
+ 0x5a, 0x0b, 0xde, 0x3d, 0x15, 0x02, 0xee, 0x3d, 0x87, 0x89, 0x54, 0xbc,
+ 0x2a, 0x48, 0x03, 0x3e, 0x96, 0xc3, 0xf3, 0x3d, 0xda, 0x6a, 0xbd, 0x3d,
+ 0xa5, 0x02, 0xd4, 0x3d, 0x3b, 0x1d, 0x56, 0xbd, 0xa6, 0xf5, 0x55, 0x3d,
+ 0x67, 0x7f, 0x36, 0xbe, 0x49, 0x82, 0x02, 0xbe, 0xa8, 0xb5, 0x37, 0xbe,
+ 0xe5, 0x93, 0x54, 0x3e, 0x8d, 0x4d, 0x63, 0xbd, 0x44, 0x31, 0x8f, 0xbe,
+ 0x4e, 0x90, 0x19, 0xbe, 0x70, 0xc2, 0x0e, 0x3e, 0x5e, 0x67, 0x5a, 0x3e,
+ 0xb0, 0x37, 0x72, 0xbe, 0xce, 0x5b, 0x46, 0x3e, 0xde, 0xec, 0x98, 0xbc,
+ 0x76, 0x02, 0x26, 0x3e, 0xfb, 0x6d, 0x4c, 0x3e, 0x9a, 0x4c, 0xb7, 0x3d,
+ 0x01, 0x67, 0x6a, 0xbc, 0x9d, 0x14, 0xed, 0xbd, 0xd4, 0xd7, 0x23, 0x3d,
+ 0x6c, 0x02, 0xf9, 0xbb, 0x9d, 0x6b, 0x95, 0x3c, 0x60, 0x61, 0x83, 0xbe,
+ 0xcc, 0x3b, 0xdc, 0x3d, 0x77, 0x8e, 0xa8, 0xbd, 0x59, 0xec, 0x20, 0x3e,
+ 0xef, 0x7f, 0xa7, 0xbd, 0x7d, 0xf7, 0x7d, 0x3d, 0xea, 0x3f, 0x45, 0xbd,
+ 0x62, 0xa5, 0x14, 0xbe, 0xac, 0x0c, 0x23, 0x3e, 0xbc, 0x7d, 0xe1, 0xbc,
+ 0x1a, 0x3d, 0xb1, 0x3d, 0xfd, 0x1c, 0x0c, 0x3e, 0x15, 0x6f, 0xfa, 0xbd,
+ 0x10, 0x13, 0x21, 0xbe, 0x2e, 0x2c, 0xeb, 0xbd, 0xbc, 0xca, 0x99, 0x3a,
+ 0x95, 0x3b, 0x45, 0x3d, 0xcd, 0xee, 0xf0, 0x3d, 0x11, 0xb6, 0x17, 0x3e,
+ 0x5e, 0xc9, 0x30, 0xbe, 0x22, 0xd9, 0xd9, 0xbd, 0xa1, 0x37, 0x68, 0xbe,
+ 0x52, 0xac, 0x82, 0xbd, 0x0f, 0xa3, 0xc2, 0xbd, 0x0a, 0x0c, 0x38, 0x3d,
+ 0x3b, 0xc9, 0x7d, 0xbe, 0x2e, 0xff, 0x23, 0xbe, 0xb3, 0xff, 0xd0, 0xbd,
+ 0x09, 0x3e, 0x11, 0x3e, 0x86, 0xdb, 0x2f, 0xbe, 0xb2, 0x1e, 0xdc, 0xbd,
+ 0x46, 0x07, 0xdf, 0x3d, 0xa0, 0x46, 0x3b, 0xbd, 0x7e, 0xc2, 0xf6, 0xbd,
+ 0x8f, 0x76, 0x09, 0x3c, 0xca, 0x65, 0xdf, 0xbc, 0x9c, 0x6e, 0xf4, 0x3d,
+ 0xf3, 0xf8, 0x9b, 0x3c, 0x3a, 0xb2, 0xc4, 0xbd, 0xd7, 0x58, 0x3d, 0xbe,
+ 0xd1, 0x77, 0x08, 0xbe, 0x3d, 0xa9, 0x91, 0xbd, 0xe6, 0x8d, 0x15, 0x3b,
+ 0xb4, 0x48, 0x53, 0x3e, 0x22, 0x09, 0x5d, 0xbe, 0x8d, 0x01, 0x67, 0x3d,
+ 0x8b, 0x05, 0xd3, 0x3d, 0x7e, 0xe8, 0xdd, 0x3d, 0xa2, 0xa7, 0xce, 0xbd,
+ 0x9e, 0x99, 0x6a, 0x3e, 0x76, 0xf3, 0x6e, 0xbd, 0xa6, 0xc7, 0x21, 0x3c,
+ 0x35, 0xa9, 0xee, 0xbc, 0x54, 0x1d, 0xa4, 0x3d, 0x9d, 0x01, 0x49, 0x3e,
+ 0x92, 0x2b, 0x00, 0xbe, 0x3e, 0x8d, 0xe4, 0x3d, 0x97, 0x48, 0x10, 0x3e,
+ 0x79, 0x9c, 0x18, 0x3e, 0x28, 0x0d, 0x34, 0xbe, 0x27, 0x85, 0xad, 0x3d,
+ 0xc9, 0xa0, 0xcc, 0x3d, 0xd1, 0x7e, 0x06, 0x3e, 0x4b, 0x23, 0x4b, 0xbd,
+ 0x69, 0x21, 0x26, 0x3e, 0x5d, 0xea, 0x0a, 0x3e, 0xe0, 0xe2, 0xf7, 0x3d,
+ 0x9e, 0x4b, 0x82, 0xbd, 0x29, 0xe9, 0xe9, 0x3d, 0xa2, 0x69, 0xf3, 0x3d,
+ 0x1e, 0xd6, 0x25, 0x3c, 0x55, 0x7b, 0x50, 0xbd, 0x0f, 0x18, 0xe3, 0xbd,
+ 0x01, 0x1d, 0xb5, 0x3d, 0xec, 0xf5, 0xdd, 0xbd, 0x81, 0xf0, 0x1d, 0x3d,
+ 0x8f, 0x14, 0x20, 0x3e, 0xfc, 0xfe, 0x14, 0xbe, 0x21, 0x98, 0xad, 0x3d,
+ 0xe4, 0x9e, 0x73, 0xbe, 0xdb, 0xf8, 0xa3, 0x3d, 0xd3, 0xb8, 0x93, 0xbe,
+ 0x28, 0x6c, 0x40, 0xbe, 0x89, 0x87, 0x63, 0x3e, 0x53, 0x40, 0xe1, 0xbd,
+ 0x6c, 0x52, 0x13, 0x3e, 0x32, 0x00, 0x2f, 0x3e, 0x7b, 0x3e, 0xd8, 0xbc,
+ 0x75, 0x18, 0xfe, 0x3c, 0x28, 0x30, 0xce, 0xbc, 0x96, 0xc5, 0x02, 0xbe,
+ 0xed, 0x60, 0x87, 0xbe, 0x8b, 0x41, 0x7a, 0xbd, 0xec, 0x80, 0x6c, 0x3e,
+ 0x66, 0xb1, 0x4a, 0xbd, 0x80, 0x00, 0xb0, 0xbe, 0xc6, 0x40, 0x14, 0xbd,
+ 0xca, 0x2c, 0xde, 0xbc, 0xbe, 0xe7, 0x81, 0xbd, 0x55, 0x4a, 0x17, 0x3e,
+ 0xcc, 0xb9, 0x74, 0xbe, 0xbb, 0xda, 0x80, 0xbd, 0x20, 0xca, 0xda, 0x3d,
+ 0x94, 0xb3, 0xba, 0x3b, 0x40, 0x23, 0xb4, 0xbd, 0xd4, 0xf5, 0x95, 0x3d,
+ 0x23, 0x98, 0x3a, 0x3d, 0xee, 0x6d, 0xca, 0xbe, 0xdf, 0xf3, 0x39, 0x3e,
+ 0x6d, 0x8c, 0x8d, 0xbc, 0x96, 0xbc, 0x28, 0xbd, 0xbb, 0x78, 0x00, 0x3e,
+ 0xff, 0x58, 0x0e, 0x3e, 0xc9, 0xab, 0xf1, 0x3d, 0x15, 0xd7, 0xa7, 0x3c,
+ 0xcd, 0xe0, 0x28, 0x3d, 0xdc, 0xc5, 0xf7, 0x3d, 0x74, 0xac, 0x65, 0x3e,
+ 0x99, 0x0e, 0x68, 0xbe, 0x8d, 0xfa, 0x27, 0xbe, 0x56, 0xa0, 0x1c, 0xbe,
+ 0x7d, 0xe1, 0x57, 0xbd, 0x0d, 0xe2, 0xac, 0x3d, 0x08, 0xe4, 0xda, 0xbd,
+ 0x88, 0xe4, 0xd3, 0xbd, 0xef, 0xbe, 0x10, 0xbc, 0x3a, 0x00, 0xb4, 0xbd,
+ 0x1b, 0x7e, 0x3e, 0x3e, 0x2a, 0xb3, 0x95, 0x3d, 0xee, 0x93, 0x58, 0x3d,
+ 0x8d, 0x42, 0x06, 0x3e, 0x96, 0xad, 0x1e, 0xbe, 0x3b, 0x9f, 0x2e, 0xbe,
+ 0x82, 0x2e, 0xb9, 0xbe, 0xa1, 0x04, 0x8d, 0xbe, 0x3d, 0x4f, 0x6e, 0x3e,
+ 0x00, 0x12, 0x05, 0xbd, 0x54, 0x71, 0x10, 0xbe, 0x58, 0x41, 0x00, 0xbe,
+ 0xd6, 0xf8, 0x2c, 0x3e, 0x69, 0xac, 0x2d, 0x3d, 0x0b, 0xff, 0x5c, 0xbe,
+ 0x01, 0x71, 0x66, 0x3e, 0xd9, 0x18, 0x98, 0xbe, 0x4a, 0xaa, 0x55, 0x3d,
+ 0x28, 0x41, 0x3b, 0x3e, 0x81, 0xe4, 0xa5, 0xbd, 0xeb, 0x73, 0x93, 0x3e,
+ 0x3a, 0x39, 0x75, 0xbd, 0xbe, 0xce, 0xa7, 0x3e, 0xf1, 0x98, 0x69, 0xbd,
+ 0xc6, 0x96, 0x65, 0xbe, 0x6b, 0x84, 0x9c, 0xbe, 0x4b, 0xa1, 0x13, 0x3d,
+ 0x58, 0x69, 0xe4, 0x3e, 0xa8, 0x85, 0xf7, 0x3e, 0xe8, 0xe0, 0x12, 0xbd,
+ 0x5a, 0xe4, 0x49, 0x3f, 0x8d, 0x06, 0x3e, 0xbe, 0x95, 0xc6, 0x71, 0x3d,
+ 0xad, 0xdb, 0x3f, 0x3d, 0x0d, 0xb8, 0x0d, 0x3e, 0xb0, 0x8e, 0xd2, 0x3e,
+ 0x7f, 0x0e, 0x23, 0xbe, 0x90, 0x77, 0x80, 0xbd, 0xb3, 0x77, 0x83, 0x3d,
+ 0xfa, 0xc0, 0xf9, 0xbd, 0xe5, 0x9b, 0xd5, 0x3e, 0x37, 0x8a, 0x0b, 0xbe,
+ 0x40, 0xf7, 0x5b, 0xbe, 0xc7, 0xec, 0xc3, 0x3d, 0xfa, 0x44, 0x05, 0xbc,
+ 0x00, 0x03, 0x56, 0xbe, 0x52, 0x56, 0x1d, 0xbe, 0xfb, 0xae, 0x62, 0x3e,
+ 0x31, 0x45, 0x80, 0xbc, 0x47, 0x12, 0x8a, 0x3c, 0x36, 0x0e, 0x53, 0x3e,
+ 0x08, 0x37, 0x0c, 0x3e, 0x7d, 0x83, 0x8c, 0xbe, 0x72, 0x3f, 0x57, 0xbe,
+ 0x6e, 0x6c, 0x6a, 0xbe, 0xfa, 0x8e, 0x84, 0x3e, 0x79, 0xc5, 0x4a, 0x3e,
+ 0x2e, 0xea, 0x8c, 0x3d, 0xc1, 0xae, 0x74, 0xbe, 0xe7, 0xf3, 0x22, 0x3e,
+ 0xa6, 0x87, 0x0c, 0x3e, 0xff, 0x41, 0x06, 0xbc, 0x04, 0x67, 0x36, 0xbe,
+ 0xbe, 0x3f, 0xc7, 0x3e, 0xa7, 0xa1, 0xab, 0x3e, 0xd1, 0x88, 0x98, 0xbd,
+ 0xf8, 0x16, 0xad, 0xbd, 0xc5, 0x04, 0x3c, 0xbe, 0x22, 0x90, 0x85, 0xbe,
+ 0x34, 0xe7, 0xf3, 0x3d, 0x94, 0x4f, 0x00, 0x3e, 0x28, 0xba, 0x96, 0x3e,
+ 0x63, 0xbc, 0x8e, 0xbe, 0xd9, 0x97, 0x83, 0xbe, 0x63, 0x35, 0xb2, 0x3d,
+ 0xfb, 0x1d, 0xc5, 0xbe, 0x76, 0xf8, 0x0f, 0x3e, 0x57, 0xf3, 0xdb, 0xbd,
+ 0x1f, 0xb7, 0x90, 0xbd, 0x0d, 0x50, 0x11, 0xbe, 0x65, 0x6d, 0x39, 0xbe,
+ 0x58, 0xed, 0xee, 0x3d, 0xf7, 0xe5, 0xa6, 0xbe, 0x8a, 0x2c, 0xbd, 0xba,
+ 0x7d, 0x85, 0x73, 0xbc, 0xf0, 0x02, 0xb4, 0xbd, 0x22, 0xed, 0x8d, 0xbe,
+ 0xdc, 0x83, 0x9d, 0xbe, 0x9a, 0xe0, 0x00, 0x3e, 0x50, 0xb2, 0x8a, 0x3b,
+ 0x17, 0x71, 0xbc, 0xbd, 0xb5, 0x87, 0x4b, 0xbe, 0xb7, 0x25, 0x2a, 0xbe,
+ 0x3a, 0x5a, 0x05, 0x3e, 0x9a, 0x08, 0x26, 0xbe, 0x20, 0x8f, 0x7b, 0x3e,
+ 0xfa, 0xb7, 0x25, 0x3d, 0x25, 0x3d, 0xf5, 0xbd, 0x01, 0x9c, 0xc0, 0xbc,
+ 0xa4, 0x02, 0x21, 0xbe, 0x5d, 0x70, 0x93, 0xbe, 0xb7, 0xca, 0xf7, 0xbd,
+ 0x89, 0x3c, 0x8c, 0x3e, 0xb7, 0x67, 0xcc, 0x3d, 0x1e, 0xec, 0x8c, 0xbe,
+ 0xde, 0x9c, 0xdc, 0xbc, 0xd0, 0x3e, 0x1d, 0x3e, 0x4c, 0x73, 0x33, 0x3e,
+ 0x11, 0xe0, 0xb3, 0x3e, 0x86, 0x23, 0xb9, 0x3d, 0xff, 0x82, 0x84, 0x3e,
+ 0x57, 0x44, 0x39, 0xbe, 0x81, 0xd4, 0xc6, 0x3d, 0x68, 0x43, 0xa3, 0xbd,
+ 0x6e, 0xa3, 0x61, 0x3d, 0x2e, 0x91, 0xf9, 0x3d, 0x46, 0xbb, 0xa2, 0x3d,
+ 0x4c, 0xd5, 0xe7, 0xbd, 0xf7, 0x4c, 0x1c, 0x3c, 0x33, 0x68, 0x2f, 0x3d,
+ 0x35, 0x9b, 0x80, 0x3d, 0x60, 0xb7, 0x3d, 0x3e, 0x88, 0x5c, 0xb4, 0xbc,
+ 0x3d, 0x19, 0xee, 0x3d, 0xfe, 0x6e, 0x1b, 0xbe, 0x2d, 0xcd, 0x2e, 0x3d,
+ 0xed, 0xb6, 0x58, 0xbd, 0x10, 0x27, 0x24, 0x3e, 0x14, 0xe9, 0x3c, 0x3d,
+ 0x09, 0x43, 0x72, 0x3d, 0xf4, 0x68, 0xa3, 0x3d, 0x07, 0x07, 0xa9, 0x3d,
+ 0x20, 0x19, 0x84, 0xbd, 0x15, 0x56, 0x92, 0xbc, 0x71, 0x09, 0x47, 0xbd,
+ 0x4d, 0x57, 0xf6, 0xbd, 0x8d, 0x5f, 0x63, 0xbd, 0xe2, 0x26, 0x92, 0x3d,
+ 0xd6, 0xcc, 0xe5, 0x3d, 0x8c, 0x3e, 0x1a, 0xbe, 0x30, 0xba, 0xb0, 0x3d,
+ 0xd8, 0xa4, 0x31, 0x3e, 0x17, 0xff, 0xdf, 0xbc, 0x6e, 0x0f, 0xa3, 0xbc,
+ 0x4a, 0xd9, 0x8d, 0x3d, 0xe3, 0x45, 0xd3, 0x3d, 0x8f, 0x67, 0xa7, 0xbd,
+ 0xa9, 0x04, 0x47, 0x3e, 0x41, 0xfe, 0x67, 0xbd, 0x7f, 0x76, 0x0d, 0xbe,
+ 0x58, 0xec, 0x11, 0xbe, 0x65, 0xaf, 0xe6, 0xbd, 0x29, 0xbb, 0xde, 0xbc,
+ 0x1a, 0xf1, 0x89, 0x3d, 0xe2, 0x2e, 0xa9, 0x3d, 0xf1, 0x6d, 0x84, 0xbd,
+ 0x32, 0xd6, 0xc5, 0x3d, 0x6c, 0xd7, 0xa0, 0x3d, 0xc3, 0xb3, 0x8f, 0xbd,
+ 0x3f, 0x36, 0x01, 0xbd, 0xf7, 0x20, 0x41, 0x3e, 0x08, 0xa5, 0xe8, 0x3d,
+ 0x90, 0x27, 0x24, 0x3d, 0xb0, 0xef, 0xf8, 0x3d, 0x43, 0x50, 0x3e, 0xbe,
+ 0x24, 0xb4, 0xe6, 0x3d, 0xd1, 0xc6, 0x9f, 0x3d, 0xed, 0x5e, 0x65, 0x3e,
+ 0x34, 0x94, 0xa3, 0xbb, 0x03, 0xde, 0xc9, 0xb8, 0x92, 0x30, 0xd5, 0xbd,
+ 0xfa, 0x41, 0x24, 0x3e, 0xd6, 0x35, 0x6a, 0x3c, 0xaf, 0xa1, 0x99, 0xbd,
+ 0x01, 0xe2, 0xb9, 0x3d, 0x48, 0x19, 0x8e, 0x3d, 0xc1, 0x49, 0x64, 0xbd,
+ 0xdd, 0x56, 0x12, 0x3e, 0x39, 0x8d, 0x5a, 0xbe, 0xbd, 0xd1, 0x49, 0x3d,
+ 0x8b, 0x37, 0x7e, 0x3c, 0x68, 0xc0, 0xf8, 0xbc, 0xc0, 0x05, 0x14, 0xbe,
+ 0xd5, 0x3a, 0x61, 0xbd, 0x1f, 0x8f, 0x8c, 0xbc, 0x24, 0x64, 0x68, 0x3d,
+ 0xc5, 0xc8, 0x91, 0xbd, 0xc7, 0xf9, 0xac, 0xbd, 0xd5, 0xdf, 0x06, 0xbd,
+ 0xfc, 0x4e, 0x94, 0x3e, 0x18, 0xea, 0xb3, 0x3c, 0xbc, 0x22, 0x16, 0x3e,
+ 0x59, 0xd5, 0xee, 0xbd, 0x57, 0xcc, 0xd2, 0x3d, 0xeb, 0x19, 0x09, 0xbe,
+ 0xf9, 0x88, 0x8a, 0xbc, 0x85, 0x62, 0x7f, 0xbe, 0xcb, 0x8e, 0x82, 0xbd,
+ 0x10, 0xe8, 0x86, 0xbd, 0x82, 0x99, 0x03, 0xbe, 0x40, 0xb5, 0x1a, 0x3d,
+ 0x29, 0x8a, 0x33, 0xbe, 0xa3, 0x84, 0x0e, 0x3e, 0x44, 0xd2, 0x02, 0xbe,
+ 0xbe, 0x48, 0x38, 0x3e, 0xc3, 0xc1, 0x19, 0xbc, 0x4b, 0xf5, 0xc4, 0xbd,
+ 0x30, 0x70, 0xe3, 0xbb, 0x3d, 0x43, 0xb6, 0x3b, 0xb7, 0x66, 0x95, 0xbd,
+ 0xbf, 0x2f, 0x0c, 0xbe, 0x72, 0x52, 0xe9, 0x3d, 0x9b, 0x18, 0x0e, 0x3e,
+ 0x77, 0xb0, 0x38, 0x3e, 0x00, 0x49, 0x70, 0x3d, 0x55, 0x1f, 0x82, 0xbd,
+ 0xfd, 0x0a, 0x18, 0xbe, 0x99, 0xba, 0xa6, 0x3d, 0xbf, 0x15, 0x50, 0x3d,
+ 0x49, 0x55, 0x36, 0x3e, 0xea, 0xa7, 0x36, 0xbd, 0xc7, 0x0b, 0x16, 0xbe,
+ 0x59, 0xff, 0x9c, 0xbc, 0xb1, 0xf3, 0x88, 0xbe, 0xd2, 0x00, 0xee, 0xbd,
+ 0x97, 0x15, 0x2c, 0x3d, 0x72, 0x12, 0x6a, 0xbe, 0x11, 0xc9, 0x9e, 0x3d,
+ 0x41, 0xc1, 0x30, 0xbc, 0x65, 0x16, 0x55, 0xba, 0x3d, 0x77, 0x0d, 0xbe,
+ 0xc6, 0xef, 0x6f, 0xbe, 0x60, 0x46, 0x60, 0xbe, 0xea, 0x28, 0xee, 0x3d,
+ 0x73, 0xf7, 0x8b, 0xbd, 0x9c, 0xe5, 0x26, 0xbe, 0x2c, 0x30, 0x6e, 0xbe,
+ 0x0b, 0xdd, 0xe2, 0x3d, 0x9a, 0xae, 0xf3, 0x3d, 0x7d, 0xca, 0x0f, 0x3e,
+ 0x54, 0x00, 0xad, 0x3d, 0x4d, 0x03, 0x43, 0xbe, 0x6a, 0x77, 0x21, 0x3e,
+ 0x92, 0x61, 0xc8, 0xbd, 0xbe, 0x48, 0x07, 0xbe, 0x20, 0xea, 0xf8, 0xbd,
+ 0x40, 0x75, 0x78, 0xbd, 0x35, 0xfa, 0x16, 0xbe, 0x49, 0x94, 0x46, 0x3e,
+ 0x81, 0xc6, 0x40, 0xbe, 0xe1, 0x4a, 0xb3, 0x3d, 0x3b, 0x1c, 0x04, 0x3e,
+ 0xa9, 0xcf, 0xc0, 0xba, 0x65, 0x37, 0xb6, 0x3d, 0x15, 0xa2, 0x8e, 0xbc,
+ 0x99, 0xcf, 0x88, 0xbd, 0x2d, 0x83, 0x26, 0xbd, 0x1a, 0x6a, 0x2f, 0x3e,
+ 0x49, 0x90, 0x69, 0x3d, 0xe4, 0xc8, 0x82, 0x3e, 0xd9, 0xab, 0x6c, 0x3c,
+ 0x22, 0x7a, 0x4a, 0x3d, 0xf2, 0x00, 0xc7, 0xbd, 0x7e, 0x75, 0x6d, 0xbe,
+ 0x66, 0x9f, 0xb0, 0x3c, 0x47, 0x4d, 0xcd, 0x3d, 0xbf, 0x5f, 0x8b, 0xbd,
+ 0x72, 0xa6, 0x91, 0xbd, 0x7a, 0x22, 0xc5, 0x3d, 0xf7, 0x6d, 0x76, 0xbc,
+ 0xba, 0x98, 0x18, 0x3e, 0xf1, 0x3a, 0xc3, 0xbc, 0x69, 0xdb, 0x5e, 0x3d,
+ 0xee, 0x24, 0x87, 0xbd, 0x77, 0xf1, 0x1a, 0xbd, 0x89, 0x57, 0xbc, 0x3d,
+ 0x02, 0x27, 0x71, 0xbe, 0x03, 0xc9, 0x00, 0x3e, 0x69, 0xa3, 0x08, 0xbe,
+ 0x0c, 0xd2, 0xe3, 0xbd, 0x87, 0x23, 0x37, 0xbe, 0xa6, 0xa9, 0x0a, 0x3d,
+ 0xed, 0xc5, 0xce, 0xbe, 0x16, 0x95, 0x11, 0xbe, 0xf6, 0xf6, 0xa7, 0xbd,
+ 0x06, 0xd1, 0xf8, 0xbd, 0x25, 0x3e, 0x33, 0x3e, 0x3f, 0x49, 0xc1, 0xbd,
+ 0xd3, 0x50, 0xe0, 0x3d, 0x33, 0x3a, 0x4c, 0xbe, 0x15, 0x8f, 0x85, 0xbc,
+ 0x85, 0xf9, 0x5c, 0x3c, 0x38, 0x31, 0xbc, 0x3d, 0x95, 0x33, 0x03, 0x3e,
+ 0x9c, 0x9c, 0x5a, 0xbc, 0x45, 0x52, 0x63, 0x3b, 0xc6, 0x2f, 0xe9, 0xbd,
+ 0x0e, 0x25, 0x3c, 0x3e, 0x98, 0x9f, 0x00, 0x3e, 0x47, 0xe7, 0x74, 0xbc,
+ 0x61, 0x2a, 0xf4, 0xbd, 0x82, 0x62, 0x0f, 0x3e, 0x52, 0x1f, 0xfd, 0x3d,
+ 0x8c, 0xbe, 0x83, 0x3d, 0xf2, 0x89, 0x86, 0xbe, 0x60, 0x52, 0x83, 0xbd,
+ 0x40, 0xec, 0x0d, 0xbe, 0x56, 0xe0, 0x57, 0xbe, 0xe0, 0xc9, 0x8f, 0xbd,
+ 0xfc, 0xa5, 0xfb, 0x3d, 0x65, 0xd6, 0x60, 0xbd, 0x12, 0xd0, 0x0e, 0x3e,
+ 0xf2, 0x7e, 0xb3, 0xbd, 0x04, 0x68, 0x74, 0xbd, 0x29, 0xd1, 0x22, 0xbd,
+ 0x2a, 0xec, 0x0f, 0xbe, 0xa7, 0xc5, 0x34, 0x3d, 0x42, 0x5f, 0x64, 0x3d,
+ 0x28, 0x65, 0xa6, 0xbd, 0x37, 0xbc, 0xa8, 0xbd, 0x4f, 0x4b, 0x33, 0x3d,
+ 0xe6, 0x67, 0x1f, 0xbd, 0x52, 0xca, 0xb2, 0xbd, 0x1a, 0xad, 0x16, 0xbe,
+ 0x6f, 0xbd, 0x8d, 0xbc, 0x8f, 0xa1, 0xf1, 0x3d, 0x77, 0xf2, 0x06, 0xbe,
+ 0xc4, 0xe6, 0x0e, 0xbe, 0xfb, 0xeb, 0x2c, 0xbe, 0xd6, 0xc0, 0x48, 0xbe,
+ 0x6a, 0xf4, 0xe7, 0x3c, 0xd1, 0x16, 0x1b, 0xbe, 0x39, 0xda, 0x39, 0xbd,
+ 0xd9, 0x34, 0x9e, 0xbd, 0x6e, 0xa2, 0x54, 0x3d, 0x98, 0xe0, 0x00, 0x3e,
+ 0x8d, 0x30, 0x2f, 0x3d, 0x25, 0xed, 0x2c, 0x3e, 0xf9, 0x4d, 0x1b, 0xbe,
+ 0x74, 0xc1, 0x1a, 0xbd, 0xf6, 0x94, 0x03, 0x3e, 0x89, 0x7f, 0x2e, 0xbe,
+ 0x75, 0x14, 0x11, 0xbe, 0xb4, 0x19, 0x09, 0xbe, 0x3a, 0xa4, 0xa3, 0xbe,
+ 0xae, 0x83, 0x84, 0x3d, 0x84, 0x2c, 0x13, 0xbe, 0xb1, 0xb4, 0x8f, 0xbd,
+ 0xd5, 0x0b, 0x19, 0x3e, 0x8c, 0x5d, 0x19, 0x3e, 0x01, 0xd7, 0x9a, 0xbd,
+ 0xc9, 0x06, 0x15, 0x3e, 0xbd, 0xf8, 0x6f, 0xbd, 0xae, 0x80, 0x41, 0xbe,
+ 0x45, 0x75, 0x9b, 0x3d, 0x2e, 0xfc, 0x9b, 0x3d, 0xd8, 0x9f, 0x70, 0x3c,
+ 0x1d, 0xba, 0x8c, 0xbd, 0xd7, 0x81, 0x34, 0x3c, 0x60, 0xe2, 0xa2, 0x3d,
+ 0xbe, 0x3e, 0x60, 0xbe, 0x42, 0x49, 0x30, 0x3e, 0x57, 0x5c, 0x02, 0x3e,
+ 0x31, 0x10, 0x3e, 0xbd, 0xb2, 0xec, 0xc9, 0xbd, 0x7b, 0x40, 0x32, 0x3d,
+ 0xf6, 0x45, 0x14, 0xbe, 0xce, 0x98, 0xc0, 0x3d, 0x21, 0x33, 0xca, 0x3d,
+ 0x7d, 0xee, 0xb3, 0x3c, 0x71, 0x66, 0x7e, 0x3d, 0x30, 0xb5, 0x0e, 0xbe,
+ 0x6f, 0xe7, 0x12, 0xbe, 0xb5, 0x16, 0x0d, 0x3e, 0xa6, 0xa6, 0x61, 0xbd,
+ 0x05, 0xb0, 0xdc, 0xbc, 0x6d, 0x7b, 0xc3, 0x3d, 0x02, 0x12, 0xf5, 0x3d,
+ 0x9d, 0x1e, 0x2d, 0x3e, 0xfa, 0x4c, 0xbb, 0xbc, 0xa5, 0xdf, 0x2a, 0xbe,
+ 0xcf, 0xbf, 0x61, 0xbd, 0xf7, 0xc7, 0x47, 0xbe, 0x9e, 0xec, 0x20, 0xbe,
+ 0x2d, 0x72, 0x6f, 0xbe, 0xac, 0x66, 0x9e, 0xbd, 0xdf, 0x54, 0x2a, 0x3e,
+ 0xc9, 0x1b, 0x3c, 0xbe, 0x4e, 0x1d, 0x43, 0xbe, 0xbe, 0x5d, 0xd0, 0xbd,
+ 0x99, 0x1c, 0xf4, 0x3c, 0x24, 0x0c, 0xbc, 0x3d, 0xc3, 0x7c, 0x0a, 0xbe,
+ 0x4d, 0x5c, 0x39, 0xbe, 0xba, 0x16, 0xd1, 0xbd, 0x8d, 0xff, 0xbc, 0x3c,
+ 0x66, 0xab, 0x04, 0xbd, 0x09, 0xb2, 0x27, 0x3e, 0x53, 0x77, 0x10, 0x3a,
+ 0xcd, 0x1c, 0x26, 0xbe, 0x3b, 0xc9, 0x7d, 0xbe, 0x7c, 0xcb, 0x1c, 0xbd,
+ 0x46, 0xa6, 0xb4, 0x3d, 0xda, 0xe5, 0x23, 0xbe, 0x7f, 0x62, 0x08, 0xbe,
+ 0x4c, 0xd0, 0xe8, 0x3c, 0xfa, 0x4a, 0xaf, 0xb9, 0x99, 0x5f, 0x82, 0xbd,
+ 0x66, 0x67, 0xa5, 0x3d, 0xb7, 0xe3, 0x1d, 0x3e, 0x0a, 0xfe, 0xac, 0xbc,
+ 0xc0, 0x0a, 0xe4, 0x3d, 0xd9, 0x97, 0xdf, 0xbd, 0xa7, 0x75, 0xe3, 0x3a,
+ 0x46, 0x2c, 0x3e, 0xbe, 0xd9, 0x09, 0x07, 0x3e, 0xf6, 0x4f, 0xbb, 0xbc,
+ 0x8a, 0xcb, 0xf9, 0xbd, 0xda, 0x7f, 0x7f, 0x3d, 0x2d, 0xb3, 0x06, 0x3e,
+ 0xb0, 0xe3, 0xce, 0x3d, 0x8b, 0xcf, 0xeb, 0xbd, 0x62, 0x7a, 0x23, 0xbe,
+ 0x8f, 0x16, 0x2e, 0xbe, 0xfc, 0x64, 0x05, 0xbe, 0x6a, 0xf5, 0xaf, 0xbd,
+ 0xe6, 0x8c, 0x68, 0xbe, 0x5d, 0x72, 0x15, 0xbe, 0x04, 0x29, 0x19, 0xbd,
+ 0xaa, 0x86, 0x32, 0x3e, 0xed, 0xa5, 0x0e, 0xbc, 0x5d, 0x17, 0x14, 0x3d,
+ 0x18, 0xa3, 0xe8, 0xbd, 0x3e, 0xf2, 0x21, 0x3e, 0xd9, 0xbb, 0xe0, 0x3d,
+ 0xe4, 0xe4, 0xdf, 0xbd, 0xbd, 0x93, 0x42, 0x3e, 0xe6, 0x65, 0x39, 0xbe,
+ 0xf6, 0x14, 0x10, 0xbe, 0x1d, 0xee, 0x01, 0x3e, 0x21, 0x30, 0x52, 0xbe,
+ 0x00, 0xf7, 0x4c, 0x3d, 0x1c, 0x0a, 0x09, 0xbe, 0xec, 0x71, 0x19, 0xbe,
+ 0x3a, 0xf0, 0x42, 0xbe, 0xec, 0x10, 0xc2, 0x3d, 0xc4, 0x62, 0x29, 0x3e,
+ 0x6d, 0x44, 0x52, 0xbe, 0x88, 0x66, 0x4d, 0x3d, 0x25, 0xc0, 0x08, 0xbe,
+ 0x25, 0x82, 0x25, 0x3c, 0x93, 0x39, 0x29, 0x3c, 0xef, 0x72, 0xb3, 0xbd,
+ 0xb4, 0x41, 0xd3, 0x3d, 0x3d, 0x4d, 0xd3, 0xbd, 0x71, 0x21, 0x7b, 0xbb,
+ 0x3e, 0x4e, 0x93, 0xbd, 0x2a, 0xac, 0x55, 0xbe, 0xe5, 0x60, 0xf7, 0x3d,
+ 0x6e, 0x62, 0x21, 0x3c, 0xc1, 0xb0, 0x8d, 0xbc, 0x14, 0x61, 0x81, 0xbd,
+ 0xbf, 0x8d, 0xf3, 0xbc, 0x3a, 0xf0, 0x49, 0xbe, 0x08, 0x92, 0xc7, 0x3c,
+ 0x6b, 0x87, 0x86, 0xbd, 0x24, 0x64, 0x0f, 0xbe, 0xb1, 0x63, 0x4a, 0xbe,
+ 0x89, 0x1a, 0x8e, 0xbd, 0x69, 0x23, 0x19, 0x3e, 0x9e, 0x95, 0x6e, 0xbe,
+ 0xca, 0x63, 0x1a, 0x3d, 0x25, 0xf8, 0x71, 0xbe, 0x77, 0x8d, 0x85, 0x3d,
+ 0xf9, 0xb5, 0x16, 0x3e, 0x54, 0xeb, 0xfa, 0x3b, 0xde, 0x2a, 0xa4, 0xba,
+ 0xba, 0xd5, 0xaf, 0x3d, 0xad, 0xc2, 0x5b, 0xbd, 0xf9, 0x94, 0x3b, 0x3e,
+ 0x47, 0xd1, 0x35, 0xbd, 0x59, 0x07, 0x15, 0x3d, 0x60, 0xeb, 0xe2, 0xbd,
+ 0x73, 0xee, 0x41, 0xbd, 0x98, 0x53, 0x2b, 0xbe, 0x2a, 0xf7, 0xae, 0xbe,
+ 0x01, 0x2e, 0xf3, 0xbd, 0x1d, 0xc0, 0xba, 0x3d, 0xd8, 0xfe, 0x53, 0xbc,
+ 0xc2, 0x2f, 0x9d, 0xbd, 0xa1, 0x9a, 0xdf, 0x3c, 0xf9, 0x0d, 0xc0, 0xbd,
+ 0xaf, 0x2b, 0x25, 0xbe, 0x9c, 0x38, 0x4c, 0x3e, 0x2d, 0x4a, 0xac, 0xbd,
+ 0x85, 0xb9, 0xd4, 0xbd, 0x29, 0x00, 0xa3, 0x3d, 0xe5, 0x24, 0x61, 0x3e,
+ 0x4b, 0x9a, 0x88, 0xbe, 0x1e, 0x19, 0x5c, 0x3e, 0xdb, 0xf4, 0x66, 0x3c,
+ 0xee, 0xd9, 0x3b, 0x3e, 0x80, 0x9d, 0x24, 0xbd, 0x06, 0x7a, 0x18, 0xbd,
+ 0x08, 0xe1, 0x8b, 0x3e, 0xc2, 0xd1, 0xd9, 0x3d, 0xc7, 0xa2, 0x94, 0xbd,
+ 0x34, 0x3d, 0xa6, 0x3a, 0xb0, 0xc6, 0x22, 0xbe, 0xeb, 0xc9, 0x55, 0xbe,
+ 0xc2, 0x59, 0xf5, 0xbd, 0xbb, 0x75, 0x03, 0x3e, 0x6e, 0xd0, 0xa4, 0x3a,
+ 0xff, 0xe7, 0x8d, 0xbd, 0xf5, 0x67, 0x0f, 0xbe, 0xdc, 0xba, 0x3f, 0x3d,
+ 0x4c, 0x57, 0x72, 0xbc, 0x3a, 0xad, 0x8f, 0x3d, 0x09, 0xb0, 0x09, 0xbe,
+ 0x4e, 0xd4, 0x9c, 0xbd, 0xfe, 0x32, 0xad, 0x3b, 0x16, 0xea, 0x63, 0xbd,
+ 0xa3, 0x2c, 0x44, 0xbe, 0xc6, 0x7d, 0x9e, 0x3d, 0xf5, 0x01, 0x9c, 0xbe,
+ 0x49, 0x14, 0x1c, 0xbd, 0x04, 0x83, 0x1e, 0x3e, 0x09, 0x2b, 0x01, 0xbe,
+ 0x12, 0x9d, 0x46, 0x3e, 0x54, 0xf4, 0x0a, 0x3e, 0xc9, 0x78, 0x74, 0xbe,
+ 0x88, 0x20, 0x86, 0x3d, 0x0f, 0x76, 0x3f, 0x3c, 0x05, 0x9b, 0xc9, 0x3d,
+ 0xd2, 0x14, 0x41, 0x3e, 0x9a, 0x01, 0x06, 0xbe, 0xb1, 0x58, 0xa7, 0xbc,
+ 0xf6, 0xf7, 0x99, 0x3d, 0x30, 0x8a, 0x19, 0x3d, 0xc8, 0xf7, 0x93, 0xbd,
+ 0x8c, 0xbd, 0x05, 0x3e, 0xe6, 0x52, 0xfd, 0x3d, 0x5f, 0x6b, 0x2a, 0x3d,
+ 0x0e, 0xa5, 0x00, 0x3e, 0xb9, 0x52, 0x52, 0x3c, 0x48, 0xf0, 0xe6, 0x3d,
+ 0xbe, 0xca, 0xb3, 0xbd, 0xb1, 0xc4, 0xbd, 0x3d, 0xcb, 0x31, 0x04, 0xbd,
+ 0x1c, 0x34, 0x07, 0x3d, 0x8f, 0x41, 0xdb, 0xbc, 0xec, 0x0d, 0x1c, 0xbd,
+ 0xc7, 0x2f, 0x06, 0x3e, 0x36, 0x90, 0x1d, 0x3e, 0xcf, 0xdb, 0x4c, 0x3c,
+ 0xf8, 0xb0, 0x1b, 0x3e, 0xa4, 0x21, 0x3b, 0xbe, 0xc6, 0x14, 0xbc, 0xbd,
+ 0xef, 0xb3, 0x88, 0xbc, 0x53, 0xfa, 0xbb, 0xbd, 0x2d, 0x55, 0x12, 0xbe,
+ 0xe7, 0x2c, 0x57, 0x3d, 0xce, 0x5a, 0x20, 0x3e, 0xfc, 0x97, 0x6c, 0xbd,
+ 0x27, 0x93, 0x1c, 0xbe, 0x43, 0x4a, 0x43, 0x3e, 0xea, 0x11, 0xab, 0x3e,
+ 0x82, 0x4f, 0x4d, 0xbd, 0xd6, 0x21, 0x18, 0xbe, 0x06, 0x2e, 0x42, 0x3d,
+ 0x2a, 0x57, 0xcd, 0x3c, 0x10, 0x39, 0x5f, 0xbe, 0x56, 0x94, 0x98, 0xbd,
+ 0x63, 0x55, 0x13, 0x3e, 0x59, 0x63, 0xdc, 0xbd, 0xcb, 0xad, 0x80, 0x3d,
+ 0xb6, 0x1a, 0xae, 0x3a, 0xf9, 0xc5, 0x12, 0x3e, 0xc2, 0xc2, 0x40, 0xbd,
+ 0xd8, 0xe2, 0x00, 0xbd, 0xe1, 0x54, 0xa3, 0xbd, 0x3c, 0xde, 0x2a, 0x3e,
+ 0x9d, 0x9e, 0xb3, 0x3d, 0x3e, 0xa4, 0x31, 0x3e, 0xb5, 0x39, 0xbd, 0x3a,
+ 0x9d, 0x18, 0x38, 0x3e, 0x98, 0x94, 0x31, 0x3d, 0x16, 0x03, 0x37, 0xbe,
+ 0xb1, 0xf8, 0x29, 0x3e, 0xcd, 0x40, 0xa4, 0xbd, 0x75, 0x8f, 0x82, 0xbd,
+ 0x88, 0x77, 0x98, 0x3d, 0x5b, 0x3a, 0x0d, 0x3e, 0xe8, 0xaa, 0x59, 0x3d,
+ 0xed, 0xa0, 0x02, 0x3e, 0x51, 0xf2, 0xd3, 0x3d, 0xb0, 0x1d, 0x2b, 0x3d,
+ 0xc0, 0xe5, 0xfa, 0x3d, 0x67, 0x04, 0x64, 0xbd, 0xf8, 0x3c, 0x1a, 0xbe,
+ 0xa9, 0x41, 0x80, 0xbd, 0x1a, 0xd1, 0x83, 0x3c, 0xb2, 0x51, 0x53, 0xbc,
+ 0x6d, 0x59, 0x07, 0xbe, 0xa9, 0xdc, 0xf1, 0xbc, 0xc0, 0x41, 0x8f, 0xbd,
+ 0x11, 0x37, 0xd9, 0x3d, 0x5e, 0xf2, 0x89, 0xbc, 0xbd, 0x9f, 0x76, 0x3e,
+ 0xb6, 0xc6, 0xf3, 0xbd, 0x6b, 0x1d, 0x35, 0xbe, 0xf1, 0x42, 0x08, 0xbe,
+ 0xe7, 0xea, 0x94, 0xbd, 0xc1, 0xed, 0xe7, 0x3d, 0xe8, 0x69, 0x30, 0x3e,
+ 0x15, 0x02, 0x0a, 0xbe, 0x2d, 0xb8, 0xea, 0xbb, 0x91, 0x45, 0x8a, 0x3e,
+ 0x08, 0x66, 0x77, 0xbd, 0x3f, 0xdf, 0xec, 0x3d, 0x6f, 0xcc, 0x77, 0x3e,
+ 0x80, 0xe6, 0x87, 0x3d, 0x93, 0x20, 0x2d, 0xbe, 0x80, 0xc4, 0x58, 0x3e,
+ 0x95, 0x9e, 0xd1, 0xbd, 0x31, 0x86, 0xa3, 0x3d, 0x15, 0xc6, 0xbe, 0x3d,
+ 0x24, 0xf5, 0x2a, 0x3c, 0xeb, 0x88, 0xdd, 0xbd, 0x44, 0x35, 0x4d, 0xbe,
+ 0x66, 0xac, 0xf8, 0x3d, 0x30, 0x6c, 0x51, 0xbd, 0xf3, 0x1d, 0x42, 0xbe,
+ 0xd6, 0xbe, 0x48, 0xbe, 0x3f, 0x00, 0x7c, 0xbe, 0xac, 0x63, 0xcc, 0xbd,
+ 0xd3, 0x25, 0x11, 0x3e, 0x93, 0xd5, 0x9c, 0x3c, 0x90, 0x61, 0x03, 0x3c,
+ 0x04, 0xbc, 0x2a, 0x3e, 0xab, 0xde, 0x18, 0xbe, 0x66, 0xe1, 0x62, 0xbd,
+ 0xf6, 0x7a, 0x6b, 0xbe, 0xbc, 0xc3, 0xe5, 0xbc, 0xb0, 0x02, 0x53, 0x3d,
+ 0x10, 0x4b, 0x21, 0xbe, 0xd3, 0x35, 0x66, 0x3c, 0xc3, 0x79, 0x8c, 0xbe,
+ 0xa4, 0xca, 0x8c, 0xbd, 0xeb, 0xec, 0xae, 0xbd, 0x56, 0xa7, 0x4f, 0x3e,
+ 0x59, 0xfc, 0xa9, 0x3d, 0x03, 0x6d, 0x3a, 0xbd, 0x43, 0x3f, 0x62, 0xbd,
+ 0x00, 0xa8, 0x0f, 0xbe, 0xec, 0x20, 0x53, 0x3d, 0xbb, 0x45, 0xec, 0x3c,
+ 0x0e, 0x2e, 0x38, 0xbd, 0xdd, 0xe8, 0x2b, 0xbe, 0x8b, 0x35, 0xe9, 0xbd,
+ 0xbd, 0x82, 0x58, 0xbe, 0x04, 0x7f, 0x5a, 0xbd, 0xc7, 0x15, 0xe1, 0xbd,
+ 0x35, 0x39, 0x15, 0x3d, 0x70, 0xf4, 0x0a, 0x3e, 0xe3, 0x60, 0x22, 0x3e,
+ 0x92, 0xde, 0x3f, 0x3e, 0xfa, 0x3f, 0xda, 0x3b, 0x18, 0xee, 0x8c, 0x3b,
+ 0x96, 0xcd, 0x64, 0x3c, 0xe0, 0x0b, 0x08, 0xbe, 0xc4, 0x1b, 0x26, 0xbe,
+ 0x19, 0xcb, 0xb0, 0xbd, 0xe3, 0x92, 0x1f, 0x3e, 0xf7, 0x04, 0x95, 0x3d,
+ 0x15, 0xa3, 0x26, 0x3d, 0x71, 0xa8, 0xd4, 0xbc, 0x4f, 0xec, 0xd9, 0x3d,
+ 0x23, 0xa5, 0x2f, 0x3e, 0x8d, 0x1d, 0xbe, 0x3d, 0xbd, 0x99, 0x37, 0xbe,
+ 0x23, 0xed, 0x07, 0xbe, 0xc8, 0x0d, 0x17, 0x3e, 0x24, 0x92, 0x4d, 0x3d,
+ 0xc8, 0x36, 0x0c, 0xbd, 0xf3, 0xed, 0x67, 0xbe, 0xb8, 0xf6, 0xba, 0x3d,
+ 0x5c, 0x5b, 0x44, 0x3b, 0x33, 0xce, 0x35, 0x3e, 0xb7, 0x0b, 0x07, 0xbe,
+ 0xaa, 0xe4, 0x26, 0xbe, 0x48, 0xb3, 0x75, 0x3c, 0x30, 0x15, 0x2d, 0x3d,
+ 0x61, 0x9d, 0x1b, 0xbe, 0x17, 0x58, 0x57, 0xbe, 0x97, 0x74, 0x25, 0xbd,
+ 0xc2, 0x97, 0x9b, 0x3c, 0xd5, 0xb7, 0x08, 0x3e, 0xe6, 0xea, 0xa3, 0xbc,
+ 0x3f, 0x95, 0xdb, 0x3d, 0x16, 0x24, 0x33, 0xbe, 0x65, 0xa3, 0x1f, 0xbc,
+ 0xb4, 0x0f, 0x4a, 0x3e, 0x5f, 0x14, 0x6e, 0x3c, 0x7e, 0x1e, 0x5c, 0x3d,
+ 0x4b, 0x41, 0xea, 0x3d, 0x36, 0xd4, 0xa2, 0x3d, 0x5d, 0xf6, 0xcb, 0xbc,
+ 0xb6, 0x3c, 0xcc, 0x3d, 0x9e, 0xf0, 0x2b, 0xbe, 0xad, 0x37, 0x59, 0x3d,
+ 0xae, 0x61, 0x34, 0xbe, 0xfc, 0x14, 0x07, 0x3e, 0xc8, 0x5f, 0x8c, 0xbc,
+ 0x47, 0xed, 0xdc, 0xbd, 0xf4, 0x82, 0xbb, 0x3d, 0x43, 0xfc, 0x00, 0xbe,
+ 0x3c, 0xfc, 0xca, 0x3c, 0xba, 0xe1, 0x33, 0x3e, 0x42, 0xe6, 0x06, 0xbe,
+ 0x63, 0xe1, 0x10, 0xbe, 0xfe, 0x93, 0x19, 0xbe, 0x2d, 0x37, 0x9f, 0xbc,
+ 0xf9, 0x21, 0x9b, 0xbc, 0xc9, 0x53, 0x94, 0xbc, 0xa6, 0x2d, 0x07, 0xbe,
+ 0xf0, 0xbb, 0x13, 0xbe, 0xd5, 0xa2, 0x1e, 0xbd, 0x29, 0x35, 0x2d, 0xbe,
+ 0xeb, 0x8e, 0xb3, 0xbd, 0x3c, 0xd9, 0x4c, 0x3d, 0xe9, 0xd0, 0x32, 0x3d,
+ 0x14, 0x31, 0x2a, 0x3d, 0x78, 0x80, 0x60, 0xbc, 0xa9, 0xb2, 0x2a, 0x3e,
+ 0xa4, 0x63, 0x7c, 0xbd, 0x38, 0x11, 0x1b, 0xbe, 0x2b, 0xa1, 0x04, 0x3e,
+ 0xc8, 0x1d, 0xc4, 0xbd, 0x87, 0x6e, 0x2b, 0xbe, 0x7d, 0xab, 0x52, 0x3e,
+ 0xda, 0xcc, 0x54, 0xbe, 0xf2, 0xa1, 0x87, 0xbe, 0xc0, 0x3a, 0x15, 0xbe,
+ 0x64, 0x91, 0x1d, 0x3e, 0x7d, 0x07, 0x79, 0x3c, 0xf9, 0x72, 0x1b, 0xbd,
+ 0xae, 0xeb, 0xf3, 0x3c, 0x5b, 0xba, 0x17, 0xbd, 0xc7, 0x5f, 0x60, 0x3d,
+ 0xa1, 0xa5, 0x94, 0xbd, 0x28, 0x58, 0xf9, 0xbd, 0xbc, 0x72, 0x07, 0xbe,
+ 0xbb, 0x88, 0x0b, 0xbe, 0xfe, 0x78, 0x2b, 0x3c, 0x85, 0x24, 0x2e, 0xbe,
+ 0x95, 0x8a, 0x15, 0xbe, 0x86, 0x28, 0x51, 0xbe, 0xc7, 0x96, 0x0d, 0x3e,
+ 0x50, 0xcc, 0x29, 0xbe, 0x39, 0xb6, 0x7c, 0x3d, 0x64, 0x3f, 0xd9, 0x3c,
+ 0x4d, 0xb4, 0x33, 0x3e, 0x1a, 0x59, 0x1c, 0xbd, 0x7b, 0x85, 0x1b, 0xbe,
+ 0xc8, 0xba, 0xc9, 0xbd, 0x46, 0x19, 0xa5, 0x3d, 0x6a, 0x1a, 0x29, 0x3c,
+ 0x33, 0x47, 0x30, 0x3e, 0xcd, 0x23, 0x18, 0xbe, 0xa8, 0x57, 0x02, 0x3e,
+ 0x70, 0x8b, 0x4b, 0xbe, 0xc1, 0x8e, 0x2e, 0xbe, 0x4a, 0xbf, 0xcd, 0x3d,
+ 0x67, 0xd0, 0x89, 0xbd, 0x91, 0x2a, 0xb1, 0xbc, 0xb2, 0xbe, 0x5b, 0xbb,
+ 0xd6, 0xde, 0xae, 0xbd, 0x33, 0x57, 0x49, 0xbe, 0x26, 0x46, 0xff, 0xbd,
+ 0x41, 0x31, 0x21, 0xbf, 0xed, 0x28, 0x81, 0xbd, 0x53, 0x4a, 0x33, 0x3e,
+ 0xab, 0x26, 0xab, 0xbe, 0x14, 0x2e, 0x64, 0x3e, 0x5b, 0xd1, 0xa7, 0x3e,
+ 0x54, 0x97, 0xce, 0xbd, 0x45, 0xb7, 0x6b, 0x3d, 0x05, 0x46, 0x4f, 0x3e,
+ 0x5f, 0x23, 0x4b, 0xbf, 0xd0, 0xc3, 0x60, 0x3e, 0xb7, 0x9d, 0xb2, 0x3d,
+ 0x44, 0x14, 0xd8, 0xbc, 0xbf, 0xd2, 0x8d, 0x3d, 0xe8, 0x74, 0x61, 0xbe,
+ 0xf6, 0x77, 0x94, 0x3e, 0x3d, 0xb3, 0x05, 0x3e, 0x78, 0xa6, 0x58, 0xbd,
+ 0xc4, 0xa1, 0x29, 0xbc, 0x46, 0x08, 0xe6, 0xbd, 0x7e, 0xae, 0x44, 0x3e,
+ 0xe3, 0x3c, 0x31, 0xbe, 0xfa, 0x73, 0xb6, 0x3d, 0xee, 0x88, 0xdd, 0xbd,
+ 0x0e, 0x4e, 0x5b, 0x3e, 0x04, 0xe1, 0xde, 0x3c, 0xd0, 0x6c, 0x8c, 0xbe,
+ 0xe3, 0x79, 0x0f, 0x3e, 0x18, 0x0c, 0x0d, 0x3e, 0xdc, 0xd9, 0xb0, 0x3b,
+ 0xbe, 0xd5, 0xa8, 0x3e, 0xa6, 0x4a, 0x0e, 0x3e, 0x4b, 0x14, 0x9a, 0xbc,
+ 0x9f, 0xb0, 0x46, 0x3e, 0x44, 0x8c, 0xb7, 0x3e, 0xbf, 0xdf, 0xff, 0xbc,
+ 0x4c, 0x40, 0x52, 0x3d, 0xd8, 0x27, 0xec, 0x3d, 0x5b, 0xcc, 0x55, 0xbd,
+ 0xba, 0x04, 0xfa, 0xbc, 0xed, 0xc1, 0x16, 0x3e, 0xaf, 0x90, 0x31, 0x3e,
+ 0x83, 0x22, 0x73, 0x3e, 0x7b, 0x86, 0x4f, 0x3e, 0x41, 0x3a, 0x2d, 0x3d,
+ 0xd3, 0xed, 0x93, 0x3e, 0xe2, 0x4b, 0x8f, 0x3e, 0x1c, 0x92, 0xf4, 0xbc,
+ 0xec, 0xaf, 0x11, 0x3e, 0x25, 0x98, 0x50, 0xbd, 0x8e, 0xa6, 0xc6, 0xbe,
+ 0xf2, 0x05, 0xf0, 0x3d, 0xc5, 0x66, 0xb9, 0x3e, 0xdd, 0xb9, 0xf7, 0x3d,
+ 0xbf, 0xa1, 0xd0, 0x3c, 0x77, 0x29, 0x9e, 0xbe, 0x27, 0x56, 0xd5, 0xbd,
+ 0x87, 0x6a, 0x61, 0x3d, 0x82, 0x6f, 0xb1, 0x3e, 0x1e, 0x5f, 0x08, 0xbd,
+ 0x95, 0x88, 0xa4, 0x3c, 0xa5, 0xd1, 0x9c, 0x3d, 0x9f, 0xed, 0x18, 0xbe,
+ 0x72, 0x61, 0xa1, 0xbd, 0x70, 0x96, 0xc8, 0x3c, 0x05, 0x35, 0xb6, 0xbc,
+ 0xc3, 0x5f, 0x21, 0xbe, 0x35, 0x2a, 0x35, 0x3e, 0xeb, 0x9f, 0x50, 0xbe,
+ 0x24, 0x8c, 0x3b, 0xbd, 0xe4, 0x67, 0x1b, 0x3e, 0x80, 0xe9, 0x16, 0x3e,
+ 0x97, 0xa9, 0x2b, 0x3e, 0xd0, 0xca, 0x76, 0x3c, 0x86, 0xa7, 0x7f, 0xbe,
+ 0x9d, 0xc4, 0xc4, 0x3d, 0x81, 0xae, 0xf9, 0x3c, 0x7b, 0x46, 0xb2, 0xbd,
+ 0x93, 0x3d, 0xf6, 0x3b, 0x55, 0xd6, 0x72, 0xbe, 0xe1, 0x33, 0xa5, 0x3d,
+ 0xe9, 0x5f, 0x47, 0xbc, 0x86, 0xde, 0x03, 0xbd, 0x72, 0xe2, 0x51, 0x3e,
+ 0xd6, 0x47, 0x04, 0xbe, 0xe6, 0x01, 0x16, 0x3d, 0x29, 0x4a, 0xc9, 0xbd,
+ 0x1b, 0x89, 0x90, 0x3d, 0x78, 0x47, 0xd6, 0xbd, 0xbe, 0xe4, 0x02, 0xbb,
+ 0x8e, 0xad, 0xf5, 0x3d, 0x81, 0x4e, 0x10, 0x3e, 0x94, 0xe9, 0x52, 0xbe,
+ 0xb4, 0x66, 0xbd, 0xbd, 0xde, 0x52, 0xa3, 0xbc, 0x6e, 0xd8, 0x14, 0xbd,
+ 0xf2, 0x7c, 0x8d, 0xbe, 0xfa, 0xfd, 0xb6, 0xbd, 0xb5, 0x66, 0xc0, 0x3d,
+ 0x05, 0x59, 0xb8, 0x3d, 0xbc, 0xcf, 0x1b, 0x3e, 0x81, 0x59, 0x8a, 0x3d,
+ 0x34, 0x04, 0xc5, 0x3c, 0x79, 0xc6, 0x97, 0x3d, 0x01, 0x4a, 0x62, 0xbd,
+ 0x2a, 0x44, 0xed, 0xbd, 0x5a, 0x2b, 0xbd, 0x3c, 0x24, 0x8b, 0xa9, 0xbb,
+ 0x31, 0x74, 0x06, 0xbe, 0xe6, 0x06, 0x63, 0x3e, 0x49, 0xb8, 0xaa, 0xbd,
+ 0x18, 0xc9, 0xd3, 0x3d, 0xad, 0x6b, 0xba, 0x3d, 0x5d, 0x30, 0x57, 0xbd,
+ 0x83, 0x14, 0x43, 0xbc, 0x8a, 0x08, 0xae, 0xbd, 0x93, 0x60, 0x18, 0xbe,
+ 0x87, 0x1d, 0xcc, 0xbe, 0xec, 0xec, 0x92, 0xbe, 0xcc, 0xd2, 0x09, 0x3c,
+ 0x04, 0xcf, 0x30, 0x3e, 0x13, 0x0c, 0x36, 0xbd, 0x55, 0xfd, 0x3a, 0x3e,
+ 0x75, 0x20, 0x64, 0xbd, 0xf9, 0x41, 0x08, 0x3e, 0x2f, 0x51, 0xe3, 0x3d,
+ 0xf8, 0xbb, 0x82, 0xbe, 0xf5, 0xff, 0x3e, 0xbd, 0x85, 0x2d, 0xbc, 0xbd,
+ 0x50, 0xec, 0xd5, 0x3d, 0xba, 0x02, 0xff, 0x3c, 0x16, 0x26, 0x59, 0xbe,
+ 0xe4, 0x12, 0xbb, 0xbc, 0x8b, 0xc2, 0xc3, 0xbd, 0xb5, 0x0d, 0x74, 0xbd,
+ 0x4c, 0x70, 0xfc, 0xbd, 0xaa, 0x13, 0xf8, 0xbc, 0xef, 0x83, 0x83, 0x3c,
+ 0x75, 0xc9, 0x3e, 0x3e, 0xc1, 0xa3, 0x6f, 0xbd, 0x8c, 0x7b, 0x9a, 0x3d,
+ 0xff, 0xe3, 0xec, 0xbd, 0xf5, 0x37, 0x44, 0xbe, 0x2e, 0xe2, 0x88, 0x3c,
+ 0xe2, 0xd7, 0xee, 0xbd, 0xe6, 0x3b, 0x2b, 0x3e, 0x8d, 0xb6, 0xa8, 0x3d,
+ 0xc0, 0x3d, 0x06, 0xbe, 0x37, 0x79, 0x9e, 0x3d, 0xcf, 0x44, 0x19, 0x3e,
+ 0x87, 0x15, 0x7c, 0xbd, 0x25, 0xff, 0x00, 0x3d, 0x20, 0xde, 0x99, 0x3d,
+ 0x2e, 0xb9, 0x0e, 0x3d, 0x59, 0xe4, 0x45, 0x3e, 0x26, 0x17, 0xb8, 0xbd,
+ 0xdc, 0xe4, 0xdd, 0xbd, 0xd1, 0x69, 0x16, 0xbd, 0x52, 0xfa, 0x6a, 0x3e,
+ 0xbd, 0x1f, 0x62, 0xbe, 0x9e, 0xbb, 0x7a, 0x3e, 0xd5, 0x20, 0xb5, 0x3d,
+ 0x40, 0xe9, 0x33, 0xbe, 0xbd, 0x12, 0xe9, 0x3d, 0xbc, 0x7d, 0x18, 0xbe,
+ 0x86, 0x32, 0xc8, 0x3d, 0x33, 0xed, 0x4e, 0xbe, 0xb6, 0x33, 0xea, 0xbd,
+ 0xe3, 0xca, 0x19, 0x3d, 0x1a, 0x74, 0x5a, 0x3e, 0x30, 0x90, 0xba, 0xbc,
+ 0x07, 0xf6, 0xb5, 0xbd, 0x20, 0x9d, 0x05, 0x3e, 0x44, 0xb1, 0xea, 0xbd,
+ 0x41, 0xe4, 0x29, 0xba, 0x5c, 0x26, 0x31, 0x3c, 0x00, 0xfa, 0x12, 0xbe,
+ 0x28, 0xfc, 0xfd, 0x3d, 0xbc, 0xb5, 0x73, 0x3d, 0xe7, 0xa1, 0xc2, 0xbd,
+ 0x16, 0x97, 0x18, 0x3e, 0x3e, 0x91, 0xab, 0x3d, 0x5d, 0xfe, 0x86, 0x3c,
+ 0xf8, 0xde, 0x37, 0x3e, 0xd3, 0xe3, 0x2e, 0xbe, 0x47, 0xef, 0x53, 0xbd,
+ 0xe4, 0xf2, 0x67, 0x3d, 0xf1, 0x7b, 0xd4, 0x3d, 0xd6, 0x91, 0x14, 0x3e,
+ 0x3c, 0x3f, 0x42, 0xbe, 0x0b, 0xc3, 0x8f, 0xbc, 0x1e, 0x15, 0x9f, 0x3e,
+ 0x11, 0x12, 0xa0, 0x3d, 0xad, 0x7b, 0x64, 0xbd, 0xca, 0x35, 0xd2, 0xbe,
+ 0x07, 0x30, 0x2e, 0x3e, 0xb4, 0xe3, 0x2e, 0xbe, 0x99, 0xf2, 0xe7, 0xbd,
+ 0x8f, 0x7a, 0x46, 0xbe, 0x4f, 0x55, 0x30, 0x3e, 0xe7, 0x87, 0x8f, 0xbd,
+ 0xf0, 0xf6, 0x77, 0xbe, 0x11, 0xf5, 0x3d, 0x3e, 0x36, 0x4d, 0x10, 0xbe,
+ 0x11, 0x98, 0xa6, 0x3c, 0xa8, 0x5f, 0x0c, 0xbc, 0x5c, 0x55, 0x94, 0x3d,
+ 0x64, 0x1b, 0xd9, 0xbd, 0xa1, 0x69, 0x9e, 0x3d, 0x57, 0x4a, 0xed, 0xbd,
+ 0x33, 0x2e, 0x86, 0xbe, 0x02, 0x76, 0xb3, 0x3b, 0xcf, 0x83, 0x15, 0xbe,
+ 0x66, 0xaa, 0x1f, 0xbe, 0xfe, 0x65, 0x11, 0x3e, 0x7c, 0xe8, 0x08, 0x3e,
+ 0xb5, 0x2a, 0x04, 0xbe, 0x31, 0x88, 0xbe, 0xbd, 0x8b, 0x71, 0x43, 0x3e,
+ 0x4f, 0x35, 0x1e, 0x3d, 0x77, 0xd9, 0x40, 0x3d, 0xc2, 0x3d, 0x14, 0x3e,
+ 0x26, 0x0f, 0x06, 0x3e, 0xca, 0x69, 0x0e, 0x3e, 0xfd, 0x6f, 0xf3, 0x3d,
+ 0x8a, 0xae, 0xa8, 0xbd, 0xdd, 0x5d, 0x17, 0x3e, 0xcf, 0x82, 0xa1, 0xbd,
+ 0x36, 0xf8, 0x49, 0xbe, 0x36, 0x00, 0xb5, 0xbd, 0xa1, 0x62, 0x7e, 0xbd,
+ 0x62, 0x1e, 0x15, 0xbc, 0x5e, 0xbd, 0x52, 0xbc, 0x7c, 0x4e, 0xa8, 0xbd,
+ 0x17, 0x67, 0x80, 0x3d, 0x65, 0xe9, 0xbc, 0x3c, 0xb8, 0xe7, 0xb6, 0xbd,
+ 0x3c, 0x97, 0x5c, 0x3e, 0x99, 0x1c, 0x4a, 0xbc, 0x2e, 0xa9, 0x16, 0x3e,
+ 0xe5, 0x28, 0x08, 0xbe, 0xa6, 0x39, 0xce, 0x3d, 0x7f, 0x3e, 0xd4, 0xbd,
+ 0x86, 0x6f, 0xaa, 0x3d, 0xfa, 0xb2, 0x82, 0xbe, 0x31, 0x88, 0x86, 0xbd,
+ 0x7a, 0x01, 0x59, 0x3e, 0x8a, 0x18, 0xfa, 0x3c, 0xde, 0x09, 0x4e, 0xbe,
+ 0xe9, 0x68, 0x0e, 0x3e, 0xc2, 0x06, 0x0e, 0x3e, 0xa1, 0xd5, 0x9b, 0xbd,
+ 0xfd, 0x82, 0x85, 0x3d, 0x8d, 0xdc, 0xff, 0xbd, 0x68, 0xba, 0x34, 0xbe,
+ 0x34, 0x53, 0x1c, 0xbe, 0x91, 0x16, 0xb5, 0x3d, 0xb8, 0x81, 0x6c, 0x3e,
+ 0x34, 0x9a, 0x24, 0xbc, 0x93, 0x5b, 0xac, 0xbd, 0xd9, 0xca, 0x00, 0xbe,
+ 0x8d, 0x31, 0x96, 0xbd, 0x7b, 0x5f, 0xcf, 0x3c, 0xaf, 0x29, 0x70, 0xbd,
+ 0xff, 0xa7, 0x3b, 0x3e, 0x32, 0xd0, 0x58, 0x3d, 0x21, 0xc7, 0x3e, 0x3e,
+ 0xd4, 0x4b, 0xd8, 0x3d, 0x85, 0x18, 0x46, 0xbe, 0x82, 0x11, 0xf0, 0xbd,
+ 0x42, 0xef, 0x2a, 0x3e, 0x70, 0xf0, 0xdf, 0x3d, 0xe2, 0x89, 0x35, 0x3e,
+ 0x82, 0x7a, 0xfe, 0xbd, 0xe5, 0xba, 0xc9, 0x3d, 0x08, 0xcc, 0x14, 0x3b,
+ 0x0d, 0x4b, 0x8f, 0xbd, 0x65, 0x4e, 0xa5, 0x3d, 0x53, 0x66, 0x7d, 0xbd,
+ 0x57, 0x89, 0x0b, 0x3e, 0x57, 0x75, 0xe3, 0x3d, 0xed, 0x0d, 0x8f, 0x3c,
+ 0x57, 0x38, 0x00, 0xbe, 0x71, 0x7d, 0x3f, 0x3e, 0x20, 0xdf, 0x04, 0xbe,
+ 0x69, 0x20, 0x6b, 0xbd, 0x37, 0x55, 0xfc, 0x3c, 0xd8, 0xe7, 0x00, 0x3e,
+ 0x37, 0xb6, 0x91, 0xbe, 0xf9, 0x54, 0xd3, 0x3c, 0x73, 0x1a, 0x14, 0xbe,
+ 0x29, 0xf7, 0x5b, 0x3d, 0xd7, 0xd7, 0x9f, 0xbd, 0x00, 0x88, 0x13, 0xbe,
+ 0x5f, 0x91, 0xf7, 0x39, 0x1d, 0xef, 0x35, 0x3e, 0xf6, 0xb2, 0x37, 0xbe,
+ 0x95, 0x1e, 0x27, 0xbe, 0xde, 0x1e, 0x08, 0x3c, 0x5a, 0xd2, 0xba, 0xbd,
+ 0x74, 0xfe, 0x1b, 0xbe, 0x99, 0x43, 0xfe, 0xbd, 0x02, 0x98, 0x84, 0xbd,
+ 0x47, 0xcd, 0x16, 0xbe, 0xba, 0xc1, 0xdb, 0x3d, 0xe1, 0x6a, 0xcc, 0xbd,
+ 0x33, 0xe7, 0x23, 0x3e, 0xa3, 0x9a, 0x21, 0x3e, 0xab, 0x99, 0x55, 0xbe,
+ 0x50, 0xe1, 0x69, 0xbe, 0xd6, 0xbe, 0x08, 0xbe, 0x50, 0x01, 0xae, 0xbd,
+ 0x0f, 0x03, 0x67, 0xbe, 0x95, 0x61, 0x3c, 0xbe, 0x2d, 0x2e, 0x6d, 0x3d,
+ 0xca, 0xc6, 0x7c, 0xbd, 0x9a, 0xd0, 0x83, 0xbd, 0x20, 0xb0, 0x30, 0xbe,
+ 0xd0, 0x84, 0xa0, 0x3c, 0x4e, 0x3b, 0xfe, 0xbd, 0xd8, 0xe4, 0x0e, 0xbd,
+ 0x35, 0xc0, 0x3d, 0xbe, 0x09, 0x7e, 0x29, 0xbd, 0x23, 0x18, 0x01, 0x3e,
+ 0xb2, 0x2c, 0x2c, 0xbd, 0x78, 0xe5, 0x24, 0xbd, 0xb0, 0x5e, 0x4b, 0xbe,
+ 0xe4, 0x3b, 0xf1, 0x3d, 0x25, 0xe6, 0x22, 0xbe, 0xcc, 0xb5, 0xce, 0x3d,
+ 0x6e, 0xb5, 0xa0, 0x3d, 0x6d, 0x10, 0x31, 0xbe, 0xbf, 0xb4, 0xcd, 0xbd,
+ 0x2f, 0x4e, 0x09, 0xbd, 0x0a, 0xee, 0x58, 0x3d, 0x4d, 0x0a, 0x15, 0xbd,
+ 0xd2, 0xee, 0x37, 0xbe, 0xfd, 0x5f, 0x10, 0xbe, 0xae, 0x46, 0xf7, 0x3d,
+ 0x48, 0xda, 0xef, 0xbd, 0x78, 0x3a, 0x80, 0xbd, 0xc7, 0xbc, 0x9d, 0x3d,
+ 0x03, 0x88, 0x1e, 0xbe, 0x41, 0xa0, 0x53, 0xbe, 0xdd, 0x1a, 0xae, 0xbc,
+ 0x45, 0xb1, 0x0a, 0x3e, 0xdb, 0xf3, 0x95, 0x3d, 0xcf, 0x13, 0xa8, 0xbe,
+ 0xa9, 0xc3, 0x56, 0xbd, 0x4c, 0xf4, 0x44, 0xbe, 0x2f, 0x87, 0xb2, 0x3d,
+ 0x6d, 0xed, 0x13, 0x3e, 0x7f, 0x49, 0x88, 0xbd, 0xf3, 0x57, 0xae, 0xbe,
+ 0xf6, 0x6d, 0xb0, 0x3d, 0x58, 0x17, 0x95, 0xbd, 0xb2, 0x89, 0xa2, 0x3d,
+ 0x07, 0x10, 0x85, 0x3d, 0x01, 0x8d, 0x0b, 0xbd, 0x25, 0x53, 0x28, 0x3c,
+ 0x35, 0xfd, 0xfd, 0xbd, 0xdc, 0x87, 0x88, 0xbe, 0xc9, 0x18, 0x83, 0x3e,
+ 0x83, 0xdd, 0x10, 0x3e, 0x65, 0x2a, 0xd0, 0x3c, 0xa1, 0xd1, 0x1c, 0x3d,
+ 0x0c, 0xcc, 0x97, 0x3e, 0x61, 0x5c, 0x4b, 0x3e, 0x19, 0x45, 0x85, 0xbe,
+ 0x71, 0xd5, 0x82, 0xbe, 0x32, 0x2a, 0x82, 0x3e, 0x4f, 0x9b, 0x38, 0x3e,
+ 0xed, 0xce, 0x2a, 0xbe, 0x28, 0xe1, 0x41, 0x3c, 0x21, 0xec, 0x9d, 0xbe,
+ 0x11, 0x1f, 0x83, 0xbd, 0x3f, 0x26, 0x7e, 0x3e, 0x36, 0xef, 0xce, 0x3d,
+ 0x4a, 0x89, 0x6a, 0x3c, 0x61, 0xa9, 0x3f, 0x3d, 0xa9, 0xe7, 0x22, 0xbe,
+ 0x12, 0xf2, 0xed, 0xbd, 0x7c, 0xc9, 0x47, 0x3e, 0x63, 0x3e, 0x81, 0x3e,
+ 0x1c, 0xe3, 0x8b, 0xbd, 0x58, 0x3c, 0x95, 0x3e, 0x08, 0x6e, 0x88, 0xbd,
+ 0x64, 0x59, 0xa9, 0x3e, 0xef, 0xef, 0x3a, 0xbe, 0x21, 0xc4, 0x0d, 0xbd,
+ 0xd0, 0xdd, 0xaa, 0x3d, 0x21, 0x4b, 0x28, 0xbd, 0x01, 0x6d, 0x82, 0x3e,
+ 0xc8, 0x90, 0xaa, 0xbd, 0xbe, 0xbe, 0x7f, 0x3e, 0x33, 0x40, 0x07, 0x3c,
+ 0xae, 0xa3, 0x8d, 0xbe, 0xba, 0x49, 0x83, 0xbd, 0x19, 0x30, 0xd9, 0x3d,
+ 0xbd, 0xa0, 0x36, 0xbe, 0x5f, 0xa7, 0xe6, 0xbc, 0x1f, 0x34, 0xbd, 0xbe,
+ 0xe5, 0xba, 0xdc, 0xbd, 0x61, 0xf3, 0x3e, 0xbd, 0x1c, 0xe3, 0x3a, 0x3d,
+ 0x34, 0x0d, 0x84, 0xbe, 0x3b, 0xfa, 0x12, 0xbe, 0xcd, 0x2b, 0x1f, 0xbd,
+ 0x85, 0xe7, 0x21, 0xbe, 0xf2, 0x4b, 0x65, 0x3c, 0x0c, 0xaf, 0xd9, 0xbd,
+ 0xfc, 0x53, 0x85, 0x3d, 0xf4, 0x3b, 0xf3, 0xbd, 0x44, 0xdc, 0x54, 0xbe,
+ 0xd5, 0xa6, 0x34, 0xbd, 0xc7, 0x1d, 0x7c, 0x3e, 0x21, 0xff, 0xa7, 0xbe,
+ 0x73, 0x02, 0x95, 0xbd, 0xa8, 0x16, 0xff, 0xbc, 0x99, 0x56, 0x21, 0xbd,
+ 0x66, 0xc1, 0x54, 0x3c, 0xee, 0xdb, 0x8e, 0xbd, 0x0c, 0x3f, 0xaf, 0xbd,
+ 0xe9, 0xad, 0x38, 0xbe, 0x7d, 0xc0, 0xdb, 0x3d, 0x1e, 0x03, 0xde, 0xbd,
+ 0x41, 0x33, 0x06, 0x3e, 0xda, 0x72, 0xb3, 0x3c, 0xb3, 0xac, 0xd0, 0xbd,
+ 0x84, 0x3f, 0xd6, 0x3c, 0xdb, 0x6c, 0x3a, 0x3e, 0x2b, 0x1a, 0x91, 0xbd,
+ 0x59, 0x6d, 0xe2, 0x3b, 0x02, 0x97, 0x4a, 0x3e, 0x1f, 0xdd, 0x38, 0x3e,
+ 0x62, 0xfa, 0x17, 0xbd, 0x62, 0x62, 0x6d, 0x3c, 0xf2, 0xad, 0x24, 0x3e,
+ 0x43, 0x16, 0x75, 0x3e, 0x61, 0x7d, 0x87, 0xbe, 0x32, 0x76, 0xae, 0xbd,
+ 0x77, 0x8d, 0x8e, 0xbd, 0xc3, 0xa5, 0x2f, 0xbd, 0xe8, 0x5e, 0xb5, 0x3d,
+ 0x5f, 0x4f, 0x0d, 0x3e, 0xa9, 0x7b, 0x42, 0x3d, 0x59, 0x34, 0x7e, 0xbe,
+ 0xb0, 0xed, 0x35, 0xbe, 0x62, 0x91, 0x3d, 0x3e, 0x14, 0x25, 0x2c, 0xbc,
+ 0x07, 0xf4, 0xd5, 0xbd, 0x5f, 0xc3, 0x44, 0x3e, 0x16, 0xa1, 0x49, 0xbe,
+ 0x8e, 0x8c, 0x5d, 0xbe, 0x17, 0x83, 0xd2, 0x3d, 0xa1, 0x5c, 0x5e, 0x3c,
+ 0x3a, 0xf8, 0xfc, 0xbd, 0x1d, 0x90, 0x49, 0xbe, 0x40, 0xa8, 0x18, 0xbd,
+ 0xbb, 0x35, 0xde, 0x3e, 0x96, 0x38, 0x8d, 0xbc, 0xb7, 0x88, 0xf1, 0x3d,
+ 0x2c, 0x1a, 0x76, 0x3e, 0x7e, 0x04, 0x2b, 0x3e, 0x93, 0xad, 0xcc, 0xbd,
+ 0x45, 0x88, 0x90, 0xbc, 0x48, 0xd7, 0x8c, 0xbc, 0x21, 0xf6, 0xcb, 0x3c,
+ 0xd0, 0x29, 0x5d, 0x3d, 0x97, 0x2c, 0x62, 0xbe, 0x9c, 0xc1, 0x50, 0x3e,
+ 0xe4, 0x3e, 0x46, 0x3e, 0x2f, 0x1f, 0x9d, 0xbd, 0x0c, 0xe0, 0xeb, 0xbd,
+ 0x00, 0x1b, 0x74, 0xbd, 0x4e, 0x30, 0x49, 0x3e, 0xfd, 0x94, 0x0a, 0x3e,
+ 0x1d, 0x1b, 0x24, 0xbc, 0x36, 0x50, 0xc8, 0x3d, 0x5f, 0xe4, 0x42, 0xbd,
+ 0x41, 0x92, 0x80, 0xbd, 0x44, 0x23, 0x43, 0xbe, 0x2d, 0xd9, 0xcf, 0x3d,
+ 0x4f, 0xe8, 0x2e, 0xbe, 0xa9, 0x32, 0x8a, 0xbe, 0x84, 0x91, 0x5b, 0x3e,
+ 0x83, 0xbe, 0x44, 0xbd, 0x88, 0xa4, 0x5b, 0x3c, 0x98, 0x9e, 0x37, 0x3e,
+ 0x06, 0x50, 0xa5, 0xbd, 0x56, 0x84, 0xa8, 0x3d, 0x3e, 0x74, 0x4e, 0xbd,
+ 0xef, 0x8c, 0x1f, 0x3e, 0x2a, 0xde, 0x31, 0xbe, 0xd0, 0x90, 0xe2, 0xbd,
+ 0x06, 0x4e, 0xad, 0x3d, 0x9f, 0x15, 0x29, 0xbe, 0x51, 0xcc, 0x37, 0xbe,
+ 0x6d, 0x5f, 0x78, 0xbd, 0xb7, 0xfd, 0xe0, 0xbd, 0x80, 0x74, 0x8a, 0xbd,
+ 0xcd, 0x1d, 0x17, 0xbe, 0xee, 0x8c, 0x14, 0x3e, 0x0a, 0x74, 0x1b, 0x3d,
+ 0x2b, 0x94, 0xb2, 0xbc, 0xeb, 0x1a, 0x1f, 0x3d, 0x72, 0x26, 0x34, 0x3d,
+ 0x16, 0xbb, 0x91, 0xbd, 0x9a, 0xca, 0x44, 0x3e, 0x82, 0xb6, 0x4d, 0x3d,
+ 0x12, 0xc4, 0x48, 0xbe, 0x5c, 0xec, 0x3e, 0xbe, 0x30, 0x81, 0x14, 0xbe,
+ 0xa0, 0xff, 0x0a, 0xbc, 0xc3, 0x08, 0x38, 0x3e, 0x2a, 0x74, 0x04, 0x3e,
+ 0x43, 0x48, 0x04, 0x3a, 0x14, 0x34, 0xc7, 0x3d, 0x61, 0xc0, 0x38, 0xbe,
+ 0xad, 0x1e, 0x14, 0x3e, 0xa4, 0xd0, 0x8a, 0x3d, 0xb9, 0xa0, 0x80, 0xbe,
+ 0x45, 0xc4, 0x0a, 0xbe, 0xc1, 0xb7, 0x4c, 0x3e, 0x54, 0xd7, 0xec, 0x3d,
+ 0x4a, 0x6c, 0x45, 0x3e, 0x9c, 0xb6, 0x04, 0x3e, 0xff, 0xbc, 0x41, 0x3e,
+ 0x39, 0xca, 0xa9, 0xbd, 0x5d, 0xf1, 0x0b, 0xbd, 0x86, 0x4a, 0x85, 0x3d,
+ 0x08, 0xe7, 0xd5, 0x3b, 0xfc, 0x2d, 0xd8, 0xbd, 0x47, 0xa6, 0xc9, 0xbd,
+ 0x11, 0x91, 0x91, 0x3d, 0x63, 0xa7, 0x80, 0xbd, 0x46, 0xae, 0x33, 0x3e,
+ 0x23, 0x4d, 0x84, 0x3d, 0xa6, 0x3d, 0x20, 0x3d, 0x7c, 0x3b, 0x67, 0x3e,
+ 0xe6, 0xb7, 0x44, 0xbe, 0xcb, 0x7c, 0x87, 0x3d, 0x77, 0xdc, 0x8a, 0x3d,
+ 0x67, 0x36, 0x84, 0x3d, 0x60, 0x36, 0xc8, 0x3b, 0x64, 0x9f, 0xb7, 0xbd,
+ 0x04, 0xd7, 0x82, 0xbd, 0x80, 0xd4, 0x07, 0x3e, 0x68, 0xc6, 0xd6, 0xbd,
+ 0x3e, 0x94, 0x9e, 0x3c, 0xb2, 0xa5, 0x26, 0x3e, 0xe2, 0x36, 0x25, 0x3d,
+ 0xe0, 0x7f, 0x4a, 0xbe, 0x12, 0xbf, 0xd2, 0xbe, 0x33, 0x80, 0xd0, 0xbd,
+ 0x7e, 0x78, 0x37, 0xbe, 0x5d, 0x02, 0x2d, 0xbe, 0xa9, 0x9e, 0xbb, 0xbe,
+ 0xf7, 0xcc, 0xd3, 0x3d, 0x13, 0xd1, 0x11, 0x3d, 0x30, 0xde, 0x39, 0x3d,
+ 0x7c, 0x8f, 0x9c, 0x3e, 0x4b, 0x60, 0x2d, 0xbe, 0x7b, 0x57, 0x21, 0xbe,
+ 0x1a, 0x8c, 0xd2, 0xbc, 0x14, 0xf1, 0xda, 0xbc, 0x1e, 0x1c, 0xc4, 0xbc,
+ 0xdb, 0x9a, 0x33, 0xbd, 0xaa, 0xba, 0xc3, 0xbd, 0x97, 0xf1, 0x6f, 0xbc,
+ 0x0d, 0x31, 0x4b, 0xbe, 0x36, 0xd1, 0xfa, 0x3d, 0x0e, 0x84, 0x11, 0xbd,
+ 0x39, 0x57, 0xa0, 0xbc, 0xf6, 0x73, 0x40, 0xbd, 0xb6, 0xdb, 0x87, 0xbd,
+ 0x86, 0xad, 0x34, 0xbe, 0x01, 0x2b, 0x42, 0xbe, 0xcb, 0x5f, 0x2d, 0xbe,
+ 0xfd, 0xf7, 0xb4, 0xbd, 0xcb, 0x52, 0xbd, 0xbd, 0x25, 0xae, 0x74, 0xbe,
+ 0xe7, 0x77, 0x89, 0xbe, 0xb1, 0xf6, 0x23, 0xbe, 0x6e, 0x6d, 0xb5, 0xbd,
+ 0x55, 0x97, 0xc7, 0x3d, 0xfe, 0xa6, 0x01, 0x3e, 0x26, 0xe5, 0xf3, 0xbb,
+ 0xff, 0xa5, 0x6f, 0xbe, 0xce, 0xf9, 0xb9, 0xbe, 0xf0, 0xb6, 0x10, 0x3e,
+ 0x7d, 0x95, 0x54, 0x3d, 0xcd, 0x96, 0x6a, 0xbd, 0x4a, 0xef, 0x04, 0x3d,
+ 0x13, 0x20, 0x5c, 0x3c, 0x8a, 0x71, 0x29, 0x3e, 0x4e, 0x75, 0x0e, 0xbe,
+ 0xbd, 0x25, 0x92, 0xbd, 0x98, 0xb7, 0xae, 0xbd, 0x59, 0xcf, 0x00, 0x3e,
+ 0xfe, 0xef, 0xe6, 0x3c, 0x67, 0xee, 0xff, 0xbc, 0xcd, 0x75, 0xbe, 0x3d,
+ 0xc5, 0xac, 0x9d, 0xbd, 0x42, 0x84, 0xf0, 0xbc, 0x1b, 0x9c, 0xf9, 0x3d,
+ 0x02, 0x28, 0x87, 0x3d, 0x24, 0x68, 0x19, 0x3e, 0x61, 0x28, 0x33, 0xbe,
+ 0xb1, 0x67, 0x22, 0x3d, 0xeb, 0xa2, 0x0d, 0x3d, 0x73, 0x2f, 0x6b, 0xbd,
+ 0x5d, 0x10, 0x96, 0x3c, 0x22, 0x69, 0x9b, 0x3b, 0x7b, 0x75, 0x9b, 0x3d,
+ 0xfc, 0x48, 0x0e, 0x3d, 0xee, 0x0d, 0xd6, 0x3e, 0xfe, 0x51, 0xc3, 0xbd,
+ 0x88, 0xdd, 0x33, 0x3d, 0xda, 0xa2, 0x88, 0x3c, 0x85, 0x2d, 0xb9, 0x3a,
+ 0xfe, 0xdd, 0x30, 0xbd, 0x1f, 0x04, 0x8f, 0x3d, 0x2f, 0x42, 0x22, 0x3e,
+ 0xb8, 0xab, 0x50, 0xbc, 0x3b, 0x04, 0x2c, 0xbe, 0xa3, 0x71, 0xaa, 0xbc,
+ 0x80, 0x6a, 0x1a, 0xbe, 0x47, 0x72, 0xf5, 0x3d, 0x28, 0x0e, 0xdc, 0xbd,
+ 0x60, 0x65, 0x44, 0xbc, 0x4b, 0x3a, 0x43, 0x3e, 0xa6, 0x14, 0x33, 0x3e,
+ 0x63, 0x50, 0x73, 0x3d, 0xca, 0xd3, 0x1d, 0x3e, 0x06, 0x6c, 0xbd, 0x3d,
+ 0x58, 0xba, 0x78, 0x3e, 0x03, 0x76, 0x1e, 0x3e, 0xc0, 0x29, 0x11, 0xbe,
+ 0xfe, 0x51, 0x1e, 0x3e, 0x68, 0x70, 0xe5, 0xbd, 0x50, 0x82, 0x37, 0x3d,
+ 0xe0, 0xd0, 0xa7, 0xbd, 0x3c, 0x1d, 0xe5, 0x3b, 0x3c, 0x44, 0xd7, 0x3d,
+ 0x6e, 0x32, 0xb0, 0xbd, 0xd5, 0x4a, 0x3d, 0xbe, 0x5a, 0xb6, 0x15, 0x3e,
+ 0x2f, 0xd4, 0x3e, 0xbd, 0xe0, 0xfe, 0x0d, 0x3d, 0x87, 0x97, 0x69, 0xbd,
+ 0x90, 0x2d, 0x46, 0x3d, 0xe3, 0xd5, 0xfb, 0xbd, 0xfc, 0xcc, 0xde, 0xbd,
+ 0xa4, 0x04, 0x86, 0x3a, 0x5e, 0x77, 0xb8, 0xbd, 0xef, 0x85, 0xa8, 0xbd,
+ 0x7f, 0x96, 0x8f, 0xbd, 0x68, 0xe5, 0x48, 0xbc, 0x35, 0x3e, 0xc0, 0xbd,
+ 0xd6, 0x89, 0x2f, 0xba, 0x97, 0xe6, 0x0b, 0xbd, 0xe1, 0xdc, 0xf2, 0xbd,
+ 0x22, 0x73, 0xbf, 0xbc, 0x75, 0x34, 0xe4, 0x3d, 0x65, 0x88, 0x3f, 0x3d,
+ 0x41, 0x7d, 0xb3, 0x3d, 0xa4, 0x4f, 0x9f, 0x3d, 0x8d, 0x3d, 0x88, 0xbd,
+ 0x79, 0xd8, 0x01, 0xbe, 0x10, 0xd5, 0x11, 0xbe, 0x1d, 0x00, 0x30, 0xbd,
+ 0xa6, 0xbd, 0x28, 0x3e, 0x08, 0x3a, 0x1b, 0x3e, 0x9a, 0xeb, 0x07, 0xbd,
+ 0xcc, 0x2b, 0x13, 0x3d, 0xa8, 0x50, 0xa5, 0x3c, 0xb0, 0x4f, 0xe6, 0xbd,
+ 0xd4, 0xff, 0x2b, 0xbe, 0xd2, 0x8f, 0x99, 0x3d, 0x33, 0x8e, 0xaa, 0xbb,
+ 0x4a, 0xf5, 0x1f, 0xbe, 0xc4, 0x2c, 0x41, 0xbe, 0x2c, 0x78, 0x83, 0x3d,
+ 0x7d, 0xec, 0x15, 0x3e, 0x5d, 0x7d, 0xb6, 0x3c, 0xd3, 0xaa, 0x0a, 0x3e,
+ 0x4f, 0xbe, 0x07, 0xbe, 0xc3, 0x80, 0xa5, 0x3d, 0x74, 0x55, 0x81, 0x3d,
+ 0x66, 0x92, 0xbd, 0x3d, 0x6e, 0x56, 0xca, 0xbd, 0x4e, 0xa1, 0x98, 0xbd,
+ 0xd1, 0xc6, 0x23, 0x3e, 0x8b, 0xd3, 0xef, 0xbd, 0xcc, 0xf9, 0x22, 0xbe,
+ 0xdd, 0xdd, 0x2b, 0xbe, 0x2f, 0x01, 0x44, 0xbe, 0x9d, 0x8b, 0x2d, 0x3e,
+ 0xad, 0x97, 0xa0, 0x3d, 0x05, 0x39, 0xfa, 0xbd, 0x80, 0x2e, 0x7f, 0xbc,
+ 0x0d, 0xce, 0x23, 0xbe, 0x05, 0x23, 0x13, 0x3e, 0x14, 0xe9, 0x0c, 0x3e,
+ 0xfc, 0x51, 0x95, 0x3d, 0x3a, 0x94, 0xe2, 0xbc, 0x58, 0xa6, 0xfb, 0xbd,
+ 0x24, 0x6c, 0xd7, 0xbd, 0x0d, 0xb3, 0x1b, 0xbd, 0x69, 0xe9, 0x31, 0xbe,
+ 0xcd, 0x49, 0x2a, 0xbe, 0x18, 0xd8, 0x03, 0x3e, 0x1f, 0xf3, 0x0e, 0x3e,
+ 0x5c, 0x1f, 0xe7, 0x3d, 0x0a, 0x70, 0xf0, 0xbd, 0x30, 0x70, 0xb2, 0xbd,
+ 0xd7, 0xee, 0x3d, 0xbe, 0x4f, 0x99, 0x40, 0xbd, 0x06, 0xfb, 0x04, 0xbe,
+ 0x35, 0x0d, 0x39, 0xbd, 0x67, 0x2e, 0x48, 0xbc, 0x5f, 0xba, 0x33, 0x3e,
+ 0x4f, 0x3a, 0xf6, 0xbd, 0x17, 0xcb, 0x8c, 0x3d, 0x7b, 0x36, 0x0a, 0x3e,
+ 0x0b, 0xdb, 0x8f, 0xbc, 0x47, 0x0b, 0x25, 0xbe, 0xe1, 0x05, 0x5c, 0x3d,
+ 0x46, 0x26, 0xc2, 0xbd, 0xed, 0xe9, 0xd8, 0x3d, 0x3d, 0x4c, 0x03, 0xbd,
+ 0xa4, 0xf3, 0x27, 0x3e, 0x3e, 0xf7, 0xfa, 0x3d, 0xaf, 0x5d, 0xf7, 0xbd,
+ 0x54, 0x33, 0x6a, 0x3d, 0x7d, 0x11, 0xc2, 0xbd, 0x07, 0x86, 0x29, 0xbd,
+ 0xa8, 0xd6, 0xa3, 0x3d, 0x8e, 0x1a, 0xa1, 0x3d, 0x2b, 0x07, 0xe6, 0x3d,
+ 0x9c, 0x39, 0x28, 0xbe, 0xbb, 0x3f, 0x27, 0xbd, 0xa1, 0xf8, 0x2c, 0x3b,
+ 0x86, 0x5f, 0x83, 0x3e, 0x3b, 0x11, 0x88, 0x3c, 0x27, 0x44, 0x9d, 0x3d,
+ 0x29, 0xe2, 0x08, 0xbe, 0x43, 0xbe, 0xf9, 0x3d, 0x1d, 0xc3, 0xff, 0x3d,
+ 0x5e, 0xe0, 0x8d, 0x3d, 0xdd, 0x93, 0x04, 0x3d, 0xa8, 0xf9, 0x4c, 0x3e,
+ 0x84, 0x98, 0x03, 0xbe, 0x07, 0x5e, 0x3c, 0xbd, 0x65, 0x04, 0xf8, 0x3d,
+ 0xa4, 0x6a, 0x04, 0xbe, 0x6e, 0x28, 0x4b, 0xbc, 0x4d, 0x97, 0xfd, 0xbc,
+ 0x11, 0xfc, 0xa8, 0x3d, 0x26, 0x86, 0x29, 0x3e, 0x94, 0xe0, 0x38, 0xbe,
+ 0xd0, 0xf9, 0x2a, 0xbc, 0xe8, 0x90, 0xf6, 0xbd, 0x81, 0xa3, 0x1e, 0xbe,
+ 0x55, 0x68, 0x5f, 0x3d, 0x31, 0xfa, 0x9a, 0x3d, 0xac, 0x55, 0xe2, 0xbd,
+ 0x0b, 0x67, 0x58, 0x3c, 0x18, 0x0f, 0xaa, 0xbe, 0x8c, 0xb5, 0x6e, 0xbb,
+ 0x65, 0x8f, 0x1a, 0x3e, 0x72, 0xf7, 0x3c, 0x3d, 0x4f, 0x6d, 0xa5, 0xbe,
+ 0x66, 0x7d, 0x7b, 0x3d, 0x2d, 0x3a, 0x8c, 0x3e, 0x04, 0x2f, 0x4d, 0x3d,
+ 0x17, 0x10, 0x2a, 0xbd, 0xb6, 0xc6, 0xcf, 0x3d, 0xb3, 0xcc, 0xd4, 0xbd,
+ 0x89, 0xe3, 0x33, 0xbe, 0xe7, 0x5b, 0xe1, 0x3d, 0xaa, 0x29, 0x41, 0xbe,
+ 0x3f, 0x45, 0xf5, 0xbc, 0x2e, 0x77, 0xe8, 0x3d, 0xb0, 0xa1, 0xd2, 0x3d,
+ 0xd6, 0x92, 0x1d, 0xbd, 0xee, 0xc2, 0x4e, 0xbc, 0xab, 0x45, 0x9d, 0x3d,
+ 0xf2, 0x0a, 0xda, 0x3c, 0x28, 0xa4, 0xa2, 0x3d, 0x5d, 0xad, 0x89, 0x3e,
+ 0x85, 0xa1, 0xed, 0xbd, 0x35, 0x08, 0xaa, 0x3d, 0x50, 0xf9, 0xb9, 0x3d,
+ 0x7a, 0xd6, 0x36, 0xbd, 0x09, 0xc4, 0xe6, 0x3c, 0xc5, 0x17, 0x0c, 0x3e,
+ 0xea, 0x19, 0xf5, 0xbd, 0x19, 0x02, 0x53, 0x3e, 0x3d, 0x6a, 0x08, 0xbf,
+ 0x51, 0xd8, 0x05, 0x3e, 0x93, 0xe3, 0x67, 0x3c, 0x1f, 0x12, 0x3c, 0x3e,
+ 0x51, 0x34, 0xa5, 0xbd, 0x85, 0x0f, 0x9b, 0xbb, 0x5d, 0xb1, 0x90, 0x3e,
+ 0x17, 0xf9, 0x03, 0xbe, 0x4d, 0x46, 0xc8, 0x3c, 0x83, 0x31, 0x13, 0x3e,
+ 0x78, 0xeb, 0x38, 0x3e, 0xc7, 0x5a, 0x8f, 0xbc, 0xaf, 0xd9, 0xd3, 0x3c,
+ 0xa9, 0x49, 0x20, 0x3e, 0xc4, 0x53, 0x45, 0xbe, 0xbb, 0x1d, 0x7e, 0x3d,
+ 0x6b, 0xc3, 0x84, 0x3d, 0x59, 0x69, 0xea, 0x3c, 0x6d, 0xc2, 0x95, 0x3d,
+ 0x58, 0xbb, 0x0c, 0x3e, 0x3b, 0xf5, 0xc9, 0x3c, 0x58, 0x29, 0x4f, 0x3e,
+ 0x67, 0xc6, 0xa2, 0xbd, 0xf5, 0xe1, 0x9b, 0x3d, 0x59, 0x57, 0x35, 0xbe,
+ 0x7e, 0xcb, 0xc8, 0xbe, 0xff, 0xa3, 0x24, 0xbe, 0x69, 0x60, 0x3b, 0xbe,
+ 0x8e, 0x6d, 0xa1, 0x3d, 0x02, 0x9e, 0x97, 0x3d, 0xfa, 0x13, 0x3f, 0x3e,
+ 0x9f, 0x7f, 0x48, 0x3d, 0x1d, 0xbe, 0x7e, 0xbc, 0xa7, 0x76, 0xce, 0xbd,
+ 0x72, 0x4d, 0xe3, 0x3c, 0x3f, 0x54, 0x3d, 0xbd, 0x9e, 0x55, 0xdb, 0x3b,
+ 0xdc, 0xb4, 0xe8, 0x3c, 0x9c, 0x02, 0x1c, 0xbd, 0xf0, 0xd1, 0xbf, 0xbd,
+ 0xb2, 0xb4, 0x10, 0x3e, 0x0a, 0x2e, 0x9b, 0xbc, 0x87, 0x9d, 0xbd, 0xbd,
+ 0x51, 0xd5, 0x89, 0xbe, 0x84, 0x26, 0x16, 0xbe, 0xd6, 0x15, 0x14, 0xbe,
+ 0xeb, 0x8d, 0xce, 0x3c, 0x6a, 0xe9, 0xbb, 0x3c, 0x28, 0xfc, 0x34, 0xbd,
+ 0x59, 0x8a, 0xeb, 0x3d, 0xdb, 0xbb, 0x50, 0xbe, 0xc7, 0x1b, 0xd3, 0x3d,
+ 0x46, 0xf2, 0x1d, 0xbe, 0x47, 0x73, 0x84, 0x3c, 0xc2, 0xd0, 0x3a, 0xbe,
+ 0x22, 0xf8, 0xe3, 0x3b, 0x01, 0xa7, 0x17, 0x3e, 0xa2, 0xa2, 0x0f, 0xbe,
+ 0xfd, 0x4f, 0x80, 0xbd, 0xaa, 0x42, 0x0e, 0xbe, 0x51, 0xcd, 0x2b, 0xbe,
+ 0x26, 0x4c, 0x03, 0xbe, 0xcf, 0xa1, 0xf0, 0xbc, 0x07, 0xa4, 0x8c, 0x3d,
+ 0x45, 0xbd, 0x38, 0xbd, 0xe6, 0x68, 0xc4, 0xbc, 0xf5, 0xb3, 0x25, 0xbc,
+ 0xe7, 0xf4, 0xae, 0x3d, 0xb5, 0xc5, 0xee, 0x3c, 0xf4, 0x7e, 0xbc, 0xbd,
+ 0x4f, 0x9d, 0x73, 0xbe, 0x42, 0x23, 0x95, 0xbd, 0x68, 0x42, 0x3e, 0xbe,
+ 0x1d, 0xfc, 0x2c, 0xbe, 0xa8, 0x14, 0x95, 0x3d, 0x87, 0x30, 0xf2, 0xbd,
+ 0x8d, 0xb7, 0x77, 0xbd, 0xcb, 0xec, 0x32, 0xbe, 0xe8, 0xbd, 0x39, 0xbe,
+ 0x3e, 0x6c, 0x2a, 0x3d, 0xac, 0x6a, 0xd8, 0x3d, 0x9c, 0x28, 0xf2, 0x3d,
+ 0x8e, 0xb7, 0x0b, 0xbd, 0x3e, 0x35, 0x2a, 0xbc, 0x9b, 0x46, 0xac, 0x3c,
+ 0x4e, 0xe1, 0x51, 0x3e, 0x3e, 0x08, 0x39, 0xbe, 0x2f, 0xde, 0x36, 0x3e,
+ 0x2d, 0x6b, 0x16, 0xbd, 0x6c, 0x8c, 0xe2, 0xbc, 0x97, 0xe9, 0xfb, 0x3d,
+ 0xf2, 0xa4, 0xbc, 0x3d, 0x4e, 0x5e, 0x22, 0x3b, 0x3e, 0xb7, 0xbf, 0xbd,
+ 0x38, 0x72, 0xfd, 0xbb, 0x96, 0x19, 0xe4, 0x3d, 0xd3, 0x7f, 0x56, 0xbd,
+ 0xa0, 0x91, 0x82, 0x3d, 0x8b, 0xf8, 0x25, 0xbe, 0x38, 0xcc, 0x38, 0x3e,
+ 0xa9, 0xe2, 0x15, 0x3d, 0x4b, 0x22, 0x04, 0x3e, 0x4a, 0x82, 0xaa, 0x3e,
+ 0xce, 0x51, 0xcc, 0xbd, 0x1f, 0x9d, 0xa0, 0xbd, 0xbc, 0xb2, 0xa8, 0xbd,
+ 0xbb, 0x52, 0x8b, 0x3e, 0xdd, 0x90, 0xc7, 0x3e, 0xe5, 0x96, 0x46, 0x3d,
+ 0x45, 0xdb, 0x82, 0x3d, 0x1e, 0xba, 0x43, 0x3e, 0x6a, 0xec, 0xc3, 0xbd,
+ 0x2b, 0x76, 0xd4, 0x3d, 0x95, 0x10, 0xff, 0xbc, 0xa3, 0xd5, 0x74, 0x3c,
+ 0xc0, 0x92, 0xce, 0xbe, 0xfb, 0x37, 0xa1, 0x3e, 0xac, 0x6c, 0xd6, 0xbd,
+ 0x13, 0x88, 0xe8, 0xbe, 0xe6, 0x5e, 0x41, 0xbe, 0x7f, 0x90, 0x22, 0xbe,
+ 0xa1, 0x19, 0x02, 0x3e, 0xee, 0xb1, 0x0f, 0x3e, 0xba, 0x97, 0x81, 0x3e,
+ 0x77, 0xe9, 0x3f, 0xbe, 0x42, 0xd8, 0x9c, 0x3e, 0x9d, 0x1a, 0xf4, 0x3d,
+ 0x18, 0xaf, 0x06, 0xbb, 0xa0, 0xce, 0x0f, 0x3e, 0x7e, 0x64, 0x08, 0xbe,
+ 0x08, 0x2e, 0x1b, 0xbe, 0x8b, 0x9c, 0x7c, 0x3e, 0x2a, 0x14, 0xa7, 0x3d,
+ 0x1e, 0xda, 0xf9, 0xbd, 0x7b, 0x5e, 0x2f, 0xbd, 0x26, 0xbf, 0x2f, 0x3e,
+ 0x11, 0x27, 0x0d, 0x3b, 0x2b, 0x45, 0xdd, 0x3b, 0x9d, 0x52, 0xc1, 0x3d,
+ 0xf1, 0x63, 0x9b, 0x3c, 0x62, 0x3d, 0x2f, 0xbe, 0xfb, 0x09, 0xd8, 0x3d,
+ 0x16, 0x9d, 0x02, 0xbe, 0x28, 0xf7, 0xd7, 0x3c, 0x84, 0x86, 0x70, 0x3d,
+ 0x4b, 0x4f, 0x44, 0xbc, 0xa8, 0xa8, 0x2a, 0x3b, 0x53, 0x17, 0x05, 0xbe,
+ 0xa0, 0x25, 0xbd, 0x3d, 0x18, 0x5b, 0x20, 0xbd, 0xef, 0x06, 0xbc, 0x3d,
+ 0xfc, 0xdc, 0x41, 0xbd, 0x3e, 0x76, 0xdb, 0x3d, 0xb1, 0x15, 0x0a, 0x3d,
+ 0x09, 0x98, 0x2d, 0xbd, 0x9a, 0xdd, 0xb3, 0xbe, 0xe8, 0x4d, 0x9b, 0xbe,
+ 0xc3, 0x48, 0x9a, 0xbd, 0x80, 0x43, 0x8d, 0xbe, 0x7c, 0x56, 0x67, 0xbd,
+ 0xfc, 0x6e, 0x84, 0xbe, 0x6d, 0x56, 0x6c, 0xbd, 0x49, 0xcc, 0xe2, 0xbe,
+ 0xac, 0xaa, 0x4a, 0xbd, 0x61, 0x55, 0xdd, 0xbd, 0xae, 0x7e, 0xc0, 0xbb,
+ 0x11, 0x6a, 0x8a, 0x3d, 0x64, 0xfd, 0xb2, 0xbc, 0x70, 0x4a, 0xd1, 0xbd,
+ 0x73, 0x18, 0x1d, 0xbe, 0x6f, 0xf1, 0x88, 0x3d, 0xfe, 0x6d, 0x23, 0xbe,
+ 0xec, 0x32, 0x8a, 0x3d, 0x6a, 0x5b, 0x89, 0xbd, 0x8a, 0x13, 0x40, 0xba,
+ 0x8c, 0x75, 0x18, 0xbe, 0xd7, 0xd4, 0xdb, 0x3d, 0xac, 0x16, 0x93, 0xbe,
+ 0x1d, 0x0a, 0xc1, 0x3d, 0x74, 0x60, 0x23, 0xbe, 0x49, 0xb6, 0x79, 0x3d,
+ 0xdb, 0x56, 0xae, 0x3c, 0xad, 0x7f, 0x15, 0x3e, 0x1f, 0x54, 0x69, 0x3e,
+ 0xd5, 0x20, 0xd1, 0xbd, 0x41, 0xba, 0x70, 0x3d, 0x8a, 0xc8, 0xe2, 0xbd,
+ 0xe7, 0x54, 0x2c, 0x3e, 0xc5, 0x69, 0xe9, 0x3d, 0x6a, 0x4d, 0x07, 0xbd,
+ 0x69, 0x44, 0x8b, 0xbe, 0x81, 0xf4, 0xa4, 0x3a, 0x49, 0x36, 0x0c, 0x3d,
+ 0xad, 0x36, 0xb8, 0xbd, 0xa1, 0xc9, 0xe4, 0xbd, 0x6c, 0x7b, 0x99, 0xbd,
+ 0x49, 0x4b, 0x06, 0x3e, 0xfa, 0xd1, 0xce, 0xbd, 0x0c, 0x3d, 0x24, 0xbe,
+ 0xd6, 0x69, 0x82, 0xbe, 0xf6, 0xb6, 0xc2, 0xbd, 0xeb, 0xde, 0x3f, 0xbd,
+ 0x92, 0xf1, 0xfd, 0x3d, 0xa0, 0xe1, 0x3e, 0xbe, 0x3f, 0x14, 0x4b, 0xbd,
+ 0x8f, 0x8f, 0x90, 0xbd, 0x82, 0xbd, 0x6f, 0x3c, 0xa8, 0x56, 0x1c, 0x3e,
+ 0xb3, 0x80, 0x75, 0xbd, 0x19, 0x6b, 0x13, 0xbe, 0x76, 0x97, 0xe9, 0x3d,
+ 0x6a, 0xa0, 0x81, 0x3e, 0x40, 0xd9, 0x84, 0x3d, 0x3d, 0x8a, 0x4b, 0xbd,
+ 0x4d, 0x38, 0x1c, 0x3e, 0xb3, 0x7b, 0xe1, 0x3c, 0xb2, 0x70, 0x91, 0xbe,
+ 0x97, 0x22, 0x41, 0x3d, 0x0c, 0x29, 0x8f, 0xbc, 0x1a, 0x7b, 0x0a, 0x3d,
+ 0x45, 0x9c, 0x96, 0xbd, 0xf9, 0x23, 0x76, 0x3c, 0x10, 0xa3, 0x71, 0xbd,
+ 0x01, 0x48, 0x07, 0x3e, 0x77, 0xb9, 0x1a, 0x3e, 0xe5, 0xb5, 0xe8, 0x3d,
+ 0xf8, 0x35, 0x4b, 0xbe, 0x37, 0xf3, 0x3e, 0x3d, 0x5b, 0x6e, 0xb6, 0xbc,
+ 0x5e, 0xb1, 0x8b, 0x3d, 0xb7, 0x2b, 0x81, 0xbe, 0x76, 0x15, 0x07, 0x3e,
+ 0x80, 0xee, 0x79, 0xbd, 0x94, 0x7f, 0xc3, 0xbd, 0x5c, 0x00, 0x29, 0x3e,
+ 0x66, 0x21, 0x26, 0x3e, 0xee, 0xc2, 0x45, 0x3e, 0x0f, 0x9c, 0xbb, 0xbd,
+ 0x27, 0x46, 0x2d, 0xbe, 0xfe, 0xcf, 0xa6, 0x3d, 0x4b, 0xf9, 0x75, 0xbd,
+ 0x45, 0x55, 0x53, 0x3e, 0x6b, 0x3d, 0x67, 0xbd, 0xac, 0xf8, 0xcf, 0xbc,
+ 0x01, 0xac, 0x3a, 0xbe, 0x0e, 0x9f, 0xc7, 0xbd, 0x9c, 0x47, 0xa2, 0x3c,
+ 0xc8, 0x52, 0xf0, 0x3b, 0x15, 0xa6, 0x41, 0xbd, 0x68, 0x78, 0x7f, 0x3d,
+ 0x41, 0x27, 0xa8, 0x3d, 0x6c, 0x93, 0x10, 0xbe, 0x7b, 0x55, 0x3d, 0x3e,
+ 0xb0, 0x4a, 0x9c, 0xbe, 0x70, 0x42, 0xcb, 0x3d, 0xb2, 0x91, 0xbf, 0x3c,
+ 0x0b, 0xf4, 0x59, 0xbd, 0xb6, 0xc2, 0x93, 0x3a, 0x54, 0x21, 0x39, 0xbd,
+ 0x6e, 0x4d, 0xe6, 0x3d, 0x87, 0x8c, 0xfa, 0xbd, 0x6e, 0x66, 0xa3, 0xbc,
+ 0xe3, 0xa3, 0x91, 0x3c, 0x74, 0x25, 0x08, 0x3e, 0x47, 0x1a, 0x88, 0xbd,
+ 0x67, 0x48, 0x81, 0xbd, 0xbb, 0xb4, 0x2e, 0x3c, 0xf1, 0x37, 0xa8, 0x3d,
+ 0x99, 0xff, 0x64, 0xbc, 0x9a, 0x10, 0xf1, 0xbc, 0xa4, 0x7f, 0x87, 0x3c,
+ 0xb1, 0xc3, 0xf9, 0xbd, 0x84, 0x58, 0x0c, 0xbe, 0x89, 0xe2, 0xa8, 0x3d,
+ 0x60, 0x23, 0xb8, 0xbb, 0x97, 0xea, 0xea, 0xbd, 0xd1, 0x74, 0x26, 0xbe,
+ 0x51, 0x35, 0xcd, 0xbd, 0x46, 0x8c, 0xf3, 0xbd, 0x2b, 0x65, 0x20, 0x3e,
+ 0xf3, 0xb3, 0xf5, 0xbc, 0x38, 0xa9, 0x14, 0xbe, 0x1d, 0x5c, 0xa8, 0x3d,
+ 0x21, 0xbe, 0x13, 0xbc, 0x83, 0x63, 0xec, 0xbc, 0xaa, 0x46, 0xd9, 0x3c,
+ 0x49, 0xd0, 0x71, 0xbd, 0xce, 0xd2, 0x0b, 0xbd, 0x01, 0x89, 0x45, 0xbd,
+ 0x46, 0x6c, 0x4a, 0xbb, 0x17, 0xc4, 0xfa, 0x3d, 0xc7, 0xaa, 0xdc, 0x3d,
+ 0x36, 0x66, 0xe8, 0x3d, 0x3d, 0xb2, 0x26, 0xbe, 0xa2, 0x9e, 0xe3, 0x3d,
+ 0x70, 0xf0, 0x42, 0xbd, 0xfb, 0x93, 0xfa, 0x3d, 0x1e, 0xa9, 0x39, 0xbd,
+ 0x19, 0xb3, 0xbd, 0x3d, 0xb5, 0x43, 0x0a, 0x3e, 0x77, 0x78, 0x23, 0xbe,
+ 0x07, 0x5e, 0x18, 0xbd, 0x61, 0x7b, 0x39, 0xbe, 0x7b, 0xf8, 0xdc, 0x3d,
+ 0x28, 0xfa, 0x8e, 0xbd, 0x2c, 0xdd, 0x5b, 0x3d, 0x2e, 0x71, 0xef, 0x3d,
+ 0x56, 0x45, 0x3f, 0xbe, 0x9e, 0x93, 0xb9, 0xbd, 0x45, 0x07, 0xbb, 0x3d,
+ 0xbf, 0xb5, 0x19, 0x3d, 0xc6, 0x2b, 0x2a, 0x3e, 0xd7, 0xf4, 0xc7, 0xbc,
+ 0x12, 0xdf, 0xf2, 0xbd, 0xfc, 0xb7, 0xe7, 0x3c, 0xfc, 0x6d, 0x09, 0x3b,
+ 0x6c, 0xeb, 0x00, 0xbe, 0x86, 0xcc, 0x24, 0xbe, 0xdd, 0xf0, 0x0d, 0x3e,
+ 0x6a, 0x34, 0xbf, 0x3d, 0x68, 0x15, 0x80, 0xbe, 0x05, 0x6c, 0xdf, 0x3d,
+ 0xf6, 0x68, 0x72, 0x3d, 0x86, 0xbf, 0xf7, 0xbd, 0xa5, 0x9f, 0x7e, 0x3d,
+ 0x71, 0xc4, 0xaa, 0xbd, 0x88, 0x34, 0xa5, 0x3d, 0xf2, 0xf5, 0xda, 0x3d,
+ 0xf8, 0x67, 0xd3, 0xbd, 0x41, 0xa6, 0x4f, 0xbe, 0xdb, 0xd5, 0x01, 0x3d,
+ 0xee, 0xb6, 0x6f, 0x3e, 0xf9, 0x50, 0x66, 0x3e, 0x47, 0x12, 0x39, 0x3d,
+ 0x23, 0x98, 0xdf, 0xbd, 0x0a, 0x75, 0xec, 0xbd, 0x12, 0x35, 0x41, 0x3d,
+ 0x43, 0x31, 0x54, 0x3d, 0xc9, 0xd3, 0x57, 0x3d, 0xa1, 0x9e, 0xf2, 0xbd,
+ 0x81, 0xb0, 0x8f, 0x3d, 0x09, 0x1e, 0x2c, 0x3d, 0xc1, 0x83, 0x80, 0x3d,
+ 0xfb, 0x21, 0x99, 0x3c, 0x0b, 0xab, 0x5f, 0x3e, 0x83, 0x31, 0x70, 0x3e,
+ 0x42, 0xc5, 0x59, 0x3e, 0xc3, 0x1c, 0xea, 0x3c, 0x2a, 0xf0, 0x2f, 0x3e,
+ 0x6d, 0x4c, 0x04, 0x3d, 0x37, 0x7e, 0x50, 0x3c, 0x84, 0xcd, 0xe2, 0xbd,
+ 0x3e, 0x14, 0x3b, 0x3c, 0x68, 0x30, 0x13, 0x3e, 0x2a, 0x71, 0x84, 0xbb,
+ 0x9f, 0xd5, 0x07, 0x3d, 0x95, 0x3e, 0x03, 0x3e, 0x93, 0x94, 0x05, 0x3e,
+ 0x8c, 0xad, 0x2c, 0x3e, 0x6a, 0x0d, 0x27, 0x3e, 0x2c, 0x6c, 0x26, 0x3d,
+ 0x12, 0x52, 0x94, 0xbd, 0x1c, 0x65, 0x6a, 0x3e, 0x69, 0x09, 0x6c, 0x3c,
+ 0x45, 0xfb, 0x9b, 0x3c, 0x28, 0x4c, 0x76, 0xbe, 0xa9, 0x56, 0x9a, 0x3c,
+ 0xe8, 0x5c, 0xa9, 0x3d, 0x86, 0xf1, 0xa4, 0xbd, 0x2e, 0x8f, 0xb9, 0x3d,
+ 0x7c, 0xc7, 0x10, 0xbe, 0x81, 0x4e, 0xc1, 0xbd, 0x66, 0x20, 0x13, 0x3c,
+ 0xb5, 0x4c, 0x40, 0xbd, 0xea, 0xb1, 0x8b, 0x3d, 0x05, 0x44, 0xcb, 0x3d,
+ 0x75, 0xbb, 0xb1, 0x3c, 0x97, 0x5c, 0x28, 0xbe, 0x84, 0xf1, 0xb4, 0x3d,
+ 0x25, 0xe7, 0x9a, 0x3e, 0x26, 0xcb, 0x80, 0xbe, 0x53, 0x9b, 0xae, 0xbb,
+ 0x90, 0x35, 0x10, 0x3e, 0xa5, 0xf4, 0x12, 0x3e, 0x53, 0x51, 0x9b, 0x3c,
+ 0x38, 0xa4, 0x6b, 0x3d, 0x8b, 0xe4, 0xcf, 0x3d, 0xa3, 0xed, 0xcd, 0x3d,
+ 0x28, 0x82, 0x3a, 0xbe, 0x26, 0x0a, 0x96, 0xb9, 0x6c, 0x77, 0x11, 0x3e,
+ 0x44, 0xc8, 0x31, 0x3d, 0xc6, 0x8a, 0x8a, 0xbd, 0x3e, 0x8e, 0x0d, 0x3d,
+ 0xc3, 0x78, 0x2e, 0xbe, 0x03, 0x12, 0xee, 0x3d, 0xe7, 0xbb, 0x05, 0x3e,
+ 0x4f, 0x35, 0x53, 0xbe, 0x73, 0x73, 0x6b, 0x3d, 0xdf, 0xd3, 0x1f, 0xbe,
+ 0x1f, 0x7e, 0x23, 0x3d, 0x2a, 0xbd, 0x20, 0xbe, 0xf3, 0x49, 0x9e, 0x3c,
+ 0xdd, 0xb8, 0x42, 0xbe, 0x43, 0x2c, 0x55, 0x3d, 0x4d, 0x8b, 0x85, 0xbb,
+ 0x5d, 0x8f, 0x02, 0xbe, 0x81, 0xd1, 0xbf, 0xbd, 0x29, 0x50, 0x22, 0x3d,
+ 0xfa, 0x58, 0x8d, 0x3d, 0x0a, 0x54, 0x06, 0xbe, 0x25, 0xfd, 0x21, 0xbe,
+ 0xe2, 0x71, 0x99, 0xbd, 0xde, 0x85, 0xe4, 0x3c, 0x65, 0x74, 0xe5, 0x3d,
+ 0xf6, 0x61, 0x07, 0xbe, 0x7b, 0x9f, 0x0e, 0xbe, 0x5c, 0x63, 0xae, 0x3b,
+ 0xe8, 0x59, 0xc4, 0xbd, 0xf5, 0x9a, 0xa0, 0xbb, 0xf1, 0x4d, 0x0a, 0xbe,
+ 0x38, 0x82, 0xd6, 0x3c, 0x13, 0x6e, 0x8e, 0xba, 0x30, 0xb7, 0x92, 0xb9,
+ 0xcb, 0x80, 0x50, 0x3d, 0x8d, 0xd7, 0x3a, 0xbe, 0x65, 0xe4, 0x27, 0xbe,
+ 0xf6, 0x9b, 0x58, 0xbc, 0x87, 0xa5, 0x46, 0xbe, 0xe0, 0x35, 0x05, 0x3e,
+ 0xa2, 0xf5, 0x86, 0xbe, 0x32, 0x3b, 0x19, 0x3e, 0xc3, 0x9c, 0xdc, 0xbd,
+ 0x57, 0xc2, 0xfa, 0xbd, 0xb7, 0x61, 0x22, 0x3e, 0xb2, 0x95, 0x10, 0x3e,
+ 0x37, 0x2f, 0x15, 0x3e, 0x23, 0x2d, 0x9b, 0x3c, 0x2d, 0x0c, 0xb9, 0x3d,
+ 0xaf, 0x03, 0xcc, 0xbd, 0x18, 0x11, 0xa5, 0x3c, 0x20, 0x30, 0xc9, 0x3d,
+ 0x9b, 0xa4, 0xdb, 0xbd, 0x32, 0xc9, 0x8b, 0xbd, 0x2e, 0x97, 0x63, 0xbe,
+ 0xe2, 0xd9, 0x0c, 0xbe, 0xff, 0x67, 0x9a, 0xbd, 0x4b, 0x67, 0x52, 0x3e,
+ 0x0c, 0x1c, 0xd7, 0x3d, 0xff, 0xa1, 0x7a, 0xbe, 0x9f, 0x62, 0x2a, 0xbe,
+ 0x44, 0xbc, 0x84, 0xbe, 0xcb, 0x64, 0x73, 0xbd, 0x6e, 0x21, 0x08, 0xbd,
+ 0x6f, 0x31, 0xae, 0x3d, 0x0c, 0x2c, 0xcb, 0x3d, 0xee, 0x9d, 0x10, 0xbd,
+ 0xc0, 0xee, 0xaa, 0x3d, 0x97, 0x57, 0x8a, 0xbc, 0xd8, 0xe4, 0x57, 0xbd,
+ 0xe3, 0xbc, 0xc4, 0xbd, 0xbb, 0x78, 0x0c, 0x3e, 0x92, 0x77, 0x8d, 0x3d,
+ 0x50, 0xb1, 0xf7, 0xbd, 0xdb, 0xa7, 0x86, 0xbe, 0x9e, 0x1a, 0x64, 0xba,
+ 0x5c, 0x69, 0xdd, 0x3c, 0xcf, 0x9b, 0x93, 0xbc, 0xdd, 0x6d, 0xd2, 0x3d,
+ 0x59, 0x4a, 0xca, 0xbd, 0xad, 0x8d, 0x12, 0xbe, 0x4e, 0x63, 0xe3, 0x3d,
+ 0x62, 0xfe, 0x63, 0x3e, 0x0d, 0xcb, 0x19, 0x3e, 0x7d, 0x5a, 0x0c, 0xbe,
+ 0x9c, 0xcd, 0x43, 0xbe, 0x9a, 0xf9, 0x2b, 0x3e, 0x49, 0x2b, 0xd2, 0x3d,
+ 0xda, 0xf6, 0x6b, 0x3d, 0xb2, 0xa4, 0x0e, 0x3e, 0x99, 0x06, 0x09, 0xbe,
+ 0x94, 0x20, 0x01, 0xbe, 0x33, 0xf3, 0x25, 0x3e, 0xfd, 0x5a, 0x15, 0x3e,
+ 0x3e, 0xeb, 0x46, 0xbe, 0x1a, 0x07, 0x04, 0x3d, 0x68, 0xa1, 0xba, 0xbc,
+ 0x07, 0x96, 0xb0, 0x3d, 0xa7, 0xa7, 0x8b, 0x3c, 0x03, 0x6b, 0xcd, 0x3d,
+ 0xc5, 0x95, 0x33, 0xbe, 0xc9, 0xdf, 0x28, 0x3e, 0x47, 0xd5, 0x87, 0xbd,
+ 0x0e, 0xa9, 0x54, 0x3d, 0x89, 0xe8, 0xd8, 0x3d, 0xa8, 0xad, 0x40, 0xbe,
+ 0xbd, 0x30, 0x67, 0x3e, 0x5c, 0xab, 0x54, 0xbd, 0xb5, 0x41, 0x62, 0x3e,
+ 0xa1, 0xcd, 0xe3, 0x3d, 0x58, 0x19, 0x62, 0xbc, 0xa7, 0x4f, 0xac, 0x3d,
+ 0x4e, 0xd8, 0xe1, 0x3d, 0x32, 0x63, 0xe8, 0xbd, 0x5f, 0x2a, 0x96, 0x3d,
+ 0xba, 0x69, 0x82, 0x3e, 0xf6, 0x2e, 0xc1, 0xbe, 0xf2, 0x4c, 0x80, 0xbe,
+ 0xa2, 0x1d, 0x10, 0x3e, 0x4f, 0x0d, 0x69, 0xbc, 0x00, 0x05, 0x4d, 0x3e,
+ 0xe4, 0x34, 0x94, 0x3e, 0x65, 0x53, 0xfa, 0x3c, 0x1c, 0xac, 0x4d, 0x3e,
+ 0x41, 0x67, 0x23, 0xbe, 0xb2, 0x36, 0xb9, 0xbc, 0x3c, 0x40, 0xfa, 0xbe,
+ 0x1c, 0x7c, 0xd7, 0x3d, 0x7f, 0x22, 0xea, 0x3d, 0x00, 0xd5, 0x58, 0xbc,
+ 0xc8, 0x8f, 0x82, 0x3d, 0xa8, 0x49, 0x03, 0xbc, 0x41, 0x0e, 0x3a, 0x3e,
+ 0xcb, 0xea, 0x37, 0x3e, 0xc2, 0xb2, 0x9c, 0x3d, 0x0e, 0xc2, 0x00, 0x3e,
+ 0xa0, 0xe5, 0xb5, 0xbc, 0x23, 0x48, 0x4f, 0xbd, 0x29, 0x4b, 0x24, 0x3a,
+ 0xa7, 0x1a, 0xc1, 0x3d, 0xb6, 0xae, 0x46, 0xbd, 0xf4, 0x66, 0xfe, 0x3d,
+ 0xf4, 0xd3, 0x05, 0x3e, 0xe4, 0xd0, 0xc6, 0xbc, 0xd1, 0x11, 0x69, 0xbe,
+ 0xe8, 0xaa, 0xd3, 0x3d, 0x6f, 0x13, 0x3e, 0xbd, 0xce, 0xe8, 0x35, 0x3e,
+ 0x15, 0x25, 0x76, 0x3b, 0xb8, 0x42, 0x02, 0xbd, 0x42, 0x30, 0xd0, 0x3e,
+ 0xd8, 0x1d, 0xa5, 0x3e, 0x18, 0x7a, 0xba, 0xbd, 0x99, 0x9c, 0x0d, 0x3e,
+ 0x31, 0x61, 0xd8, 0x3e, 0x7e, 0x78, 0xe3, 0x3d, 0x9a, 0x61, 0xc2, 0xbd,
+ 0xfe, 0xd2, 0xd1, 0x3d, 0x84, 0x55, 0xd2, 0xbd, 0xdc, 0x68, 0x92, 0x3e,
+ 0x84, 0xde, 0x22, 0x3d, 0xac, 0x1c, 0x9e, 0x3d, 0x02, 0x48, 0x36, 0x3e,
+ 0x12, 0x10, 0xb5, 0xbd, 0x17, 0x6a, 0x89, 0x3d, 0x15, 0x66, 0xa3, 0x3e,
+ 0x93, 0xe4, 0xaa, 0xbd, 0x4d, 0x81, 0xa2, 0xbc, 0x62, 0x8d, 0x1b, 0xbe,
+ 0x4b, 0x53, 0xf9, 0x3d, 0x7a, 0x31, 0x66, 0x3c, 0x04, 0x39, 0x2a, 0x3e,
+ 0x66, 0x30, 0x52, 0x3e, 0x74, 0xc9, 0x81, 0xbe, 0x7d, 0xfc, 0xf0, 0x3c,
+ 0xdb, 0x70, 0x57, 0xbe, 0x0e, 0xe6, 0x4c, 0xbe, 0xde, 0xf5, 0x19, 0xbe,
+ 0x95, 0x49, 0x2d, 0x3d, 0xbf, 0x74, 0xc0, 0xbd, 0x8f, 0x79, 0xb1, 0xbd,
+ 0xeb, 0x77, 0x9c, 0x3d, 0xbb, 0x5f, 0x02, 0x3d, 0xda, 0x31, 0x2f, 0x3d,
+ 0x68, 0xc1, 0x55, 0xbe, 0xc4, 0x05, 0xc1, 0x3d, 0x0b, 0x92, 0x8e, 0x3d,
+ 0xc0, 0x2c, 0x65, 0x3d, 0x99, 0x4a, 0x9a, 0xbd, 0x9e, 0x03, 0x31, 0x3a,
+ 0xbe, 0x4b, 0x80, 0x3c, 0x9b, 0xe7, 0x0e, 0xbe, 0x52, 0x02, 0x2e, 0xbe,
+ 0x93, 0x8b, 0x94, 0xbe, 0x27, 0xac, 0x3f, 0x3d, 0xa5, 0x58, 0x94, 0x3d,
+ 0x01, 0x77, 0x55, 0xbd, 0x24, 0x0f, 0x95, 0xba, 0x96, 0x4d, 0x10, 0xbe,
+ 0xbb, 0x31, 0xa6, 0xbd, 0x86, 0x1e, 0x23, 0xbe, 0xa1, 0xc9, 0xc8, 0x3d,
+ 0xbe, 0x2d, 0x07, 0x3e, 0x4f, 0x7f, 0xa1, 0xbc, 0x34, 0x11, 0x68, 0xbd,
+ 0x16, 0x7c, 0xf9, 0x3d, 0x19, 0xa0, 0x77, 0x3d, 0xa2, 0xf6, 0xb6, 0xbc,
+ 0x7d, 0x6a, 0xa4, 0x3d, 0xba, 0xb7, 0x53, 0xbc, 0xd4, 0x1a, 0xa9, 0x3d,
+ 0x5d, 0x02, 0x86, 0xbd, 0xd6, 0xbf, 0xbc, 0x3d, 0x55, 0xb0, 0x6c, 0xbe,
+ 0x47, 0x30, 0x50, 0xbd, 0xf5, 0x59, 0xb9, 0xbd, 0xa5, 0x89, 0x66, 0x3d,
+ 0xde, 0x48, 0xc0, 0xbe, 0x1d, 0xce, 0xcb, 0xbd, 0x86, 0x31, 0x11, 0xbe,
+ 0xda, 0x26, 0x73, 0xbe, 0xa5, 0xe1, 0x1e, 0xbe, 0x6f, 0x66, 0xf3, 0x3d,
+ 0xce, 0x37, 0xd1, 0xbc, 0x01, 0xac, 0x5b, 0x3d, 0x2a, 0x22, 0x91, 0xbd,
+ 0xdf, 0xbc, 0x6a, 0xbe, 0x86, 0xd8, 0x08, 0x3e, 0xa6, 0xe4, 0x20, 0x3e,
+ 0x38, 0xd5, 0x40, 0x3e, 0x8a, 0xe2, 0x2f, 0xbe, 0xf6, 0x97, 0x37, 0xbe,
+ 0x28, 0x31, 0x0b, 0x3e, 0xd5, 0xeb, 0x29, 0xbe, 0xda, 0x7f, 0x03, 0x3e,
+ 0x61, 0x60, 0x97, 0x3d, 0x63, 0x9e, 0x96, 0x3d, 0xb1, 0x72, 0xd7, 0x3c,
+ 0x01, 0x65, 0x03, 0x3e, 0xba, 0x08, 0xfc, 0xbc, 0x6a, 0x7b, 0x84, 0x3e,
+ 0xd6, 0xcf, 0x06, 0x3e, 0x8c, 0xb9, 0x20, 0xbe, 0xcd, 0x10, 0x67, 0x3a,
+ 0x79, 0xd3, 0x11, 0xbe, 0x70, 0xd5, 0x39, 0xbd, 0x17, 0xf7, 0x93, 0xbc,
+ 0x1b, 0x2c, 0x5e, 0xbc, 0xa5, 0x6e, 0xbf, 0xbd, 0x0c, 0x3a, 0xe3, 0x3b,
+ 0xed, 0x6b, 0x9d, 0xbd, 0x4a, 0x09, 0x55, 0x3b, 0xb6, 0xfb, 0x39, 0xbe,
+ 0xc9, 0x12, 0x8d, 0xbc, 0x87, 0x5b, 0xcc, 0xbd, 0x78, 0x8e, 0xd6, 0x3d,
+ 0xf6, 0x10, 0x14, 0xbe, 0xad, 0x12, 0xa6, 0x3c, 0xae, 0x42, 0x4e, 0x3e,
+ 0xa9, 0xef, 0x91, 0x3d, 0x7e, 0x53, 0x9f, 0x3d, 0xfe, 0xfe, 0xe0, 0xbd,
+ 0xa2, 0x76, 0x0f, 0xbe, 0xcb, 0xec, 0x7e, 0xbd, 0x04, 0x85, 0xbc, 0xbd,
+ 0x5d, 0xc3, 0xa2, 0xbc, 0xef, 0x3d, 0x22, 0xbe, 0x29, 0x93, 0x9b, 0x3d,
+ 0xfc, 0x77, 0x58, 0xbe, 0xc2, 0xa5, 0x61, 0xbd, 0xad, 0x13, 0x43, 0xbd,
+ 0x8b, 0x51, 0xb8, 0xbd, 0x4b, 0xbd, 0x06, 0xbd, 0x43, 0xd0, 0x26, 0xbe,
+ 0x7a, 0x1f, 0x17, 0x3c, 0xc7, 0xa6, 0xc9, 0x3c, 0xa2, 0xc0, 0x39, 0xbd,
+ 0xb9, 0x0b, 0x38, 0x3e, 0x77, 0x1a, 0x47, 0xbd, 0x61, 0xdc, 0x05, 0x3c,
+ 0x9c, 0x9c, 0x1d, 0x3d, 0x1e, 0x69, 0x5e, 0xbd, 0x57, 0x18, 0x23, 0xbe,
+ 0x40, 0xac, 0x19, 0xbe, 0xf4, 0x70, 0x79, 0x3e, 0xa0, 0x0e, 0xf3, 0xbd,
+ 0x95, 0x9a, 0xd5, 0x3d, 0xa4, 0x50, 0xb5, 0x3d, 0xb1, 0xac, 0x6c, 0x3d,
+ 0xed, 0xe3, 0x3e, 0x3b, 0x32, 0x46, 0xb5, 0xbd, 0xdf, 0x47, 0x26, 0xbe,
+ 0x24, 0x4f, 0xa0, 0xbd, 0x5e, 0x65, 0x7f, 0x3d, 0x65, 0xfd, 0x56, 0x3d,
+ 0x8d, 0x5f, 0x75, 0xbe, 0xce, 0x1e, 0x48, 0x3e, 0xae, 0x7e, 0x8f, 0x3d,
+ 0xf2, 0x81, 0x19, 0x3e, 0xd5, 0x0a, 0x9a, 0x3e, 0x4b, 0xe5, 0xb8, 0x3c,
+ 0xea, 0x87, 0x17, 0xbd, 0xf7, 0x1a, 0x14, 0xbe, 0x14, 0x32, 0x82, 0xbd,
+ 0xd1, 0x95, 0x2f, 0x3e, 0xcd, 0x9f, 0xec, 0xbd, 0x46, 0xed, 0xd8, 0xbd,
+ 0x0f, 0xbe, 0xed, 0x3d, 0x32, 0xf6, 0x72, 0x3d, 0x69, 0xb6, 0x1d, 0x3e,
+ 0x9e, 0xbf, 0x8c, 0x3e, 0x43, 0xd9, 0x44, 0xbe, 0xdc, 0xdb, 0x24, 0xbe,
+ 0xd8, 0xeb, 0xdc, 0xbd, 0x39, 0xeb, 0xcf, 0x3d, 0x71, 0x37, 0x2d, 0xbe,
+ 0x9e, 0x6c, 0x16, 0x3d, 0xac, 0x0b, 0x2c, 0xbe, 0x78, 0x72, 0x14, 0xbe,
+ 0x44, 0x18, 0x17, 0x3e, 0x39, 0xa8, 0x5e, 0xbe, 0xb0, 0x8e, 0x3e, 0x3d,
+ 0xf6, 0xc7, 0xe2, 0xbb, 0xc8, 0x12, 0xc3, 0xbd, 0x21, 0xfe, 0xf5, 0x3d,
+ 0xb9, 0x62, 0x01, 0xbe, 0x70, 0x2d, 0x63, 0xbd, 0x7f, 0xdd, 0xef, 0xbd,
+ 0x91, 0x8e, 0xe4, 0x3d, 0x2d, 0xab, 0x94, 0xbd, 0x76, 0x10, 0xfe, 0xbd,
+ 0x41, 0x00, 0x10, 0xbe, 0x46, 0x53, 0xec, 0x3d, 0x28, 0x69, 0x6b, 0xbe,
+ 0x36, 0x64, 0xc2, 0x3d, 0xb5, 0x65, 0x5a, 0xbe, 0x0f, 0x8f, 0x5f, 0x3e,
+ 0xfd, 0xd6, 0x10, 0x3e, 0xa8, 0xda, 0xd4, 0x3d, 0xaa, 0x9d, 0x49, 0x3e,
+ 0xed, 0x23, 0x72, 0x3d, 0xfe, 0x70, 0xcf, 0xbd, 0x5a, 0x72, 0x0f, 0x3d,
+ 0x22, 0x2d, 0xed, 0x3d, 0xcd, 0x1d, 0x30, 0x3e, 0x32, 0xb4, 0x87, 0xbe,
+ 0x36, 0x58, 0x2b, 0xbd, 0x56, 0x6c, 0x5f, 0xbd, 0xf5, 0x14, 0xdd, 0x3c,
+ 0xbf, 0x20, 0xfe, 0xbc, 0x8f, 0x2f, 0x2c, 0xbe, 0x99, 0x98, 0xe3, 0x3c,
+ 0xe5, 0xca, 0x16, 0xbe, 0x12, 0xda, 0xf5, 0x3d, 0xe9, 0x07, 0xb4, 0x3d,
+ 0x93, 0x2a, 0x31, 0x3e, 0x68, 0xdd, 0x1e, 0x3e, 0xb5, 0x53, 0xb3, 0xbd,
+ 0xf3, 0xa1, 0xae, 0xbd, 0x9c, 0x1b, 0xfd, 0x3d, 0x78, 0xb1, 0x08, 0xbe,
+ 0x76, 0x9a, 0x42, 0xbe, 0x19, 0xf7, 0x31, 0xbe, 0x75, 0x41, 0x40, 0x3e,
+ 0x0f, 0xbd, 0xcf, 0x3d, 0xf0, 0x1d, 0xb3, 0x3c, 0xe1, 0x18, 0xec, 0xbd,
+ 0xa4, 0xc1, 0x35, 0xbe, 0x6a, 0xb5, 0x80, 0xbd, 0xa4, 0xc2, 0x39, 0xbd,
+ 0xc5, 0x7c, 0x7c, 0x3d, 0xf5, 0x7e, 0x18, 0xbe, 0x83, 0xbf, 0x22, 0x3c,
+ 0xdb, 0xb3, 0xec, 0x3d, 0x08, 0x47, 0x67, 0xbc, 0x8b, 0x88, 0x0c, 0xbe,
+ 0xbc, 0x3a, 0xbe, 0xbd, 0x25, 0x77, 0x4b, 0xbe, 0x9d, 0x24, 0xb3, 0xbd,
+ 0x6e, 0x3f, 0x21, 0x3d, 0x32, 0x18, 0x5b, 0xbe, 0xb2, 0x3c, 0x1f, 0x3e,
+ 0x4a, 0x7f, 0x05, 0xbd, 0xb8, 0xd2, 0x14, 0xbe, 0x0b, 0xa2, 0x8b, 0xbd,
+ 0x66, 0xd5, 0x3c, 0x3e, 0xc1, 0xff, 0x0a, 0xbe, 0xcd, 0x4e, 0xd6, 0xbd,
+ 0x8b, 0x94, 0xf8, 0xbd, 0x8f, 0x1a, 0xa3, 0xbd, 0x7d, 0x86, 0xe2, 0xbc,
+ 0xbc, 0x3a, 0x38, 0xbe, 0xed, 0x0c, 0x99, 0x3d, 0x7d, 0xdc, 0x7d, 0x3d,
+ 0x30, 0x07, 0xa5, 0x3c, 0x1b, 0x51, 0xd7, 0x3d, 0x82, 0x20, 0x9f, 0xbd,
+ 0x8e, 0x2a, 0xa9, 0x3d, 0xc7, 0x5b, 0x15, 0x3e, 0x24, 0xfb, 0x93, 0xbd,
+ 0xc7, 0x11, 0x2d, 0x3e, 0x85, 0x6b, 0x96, 0xbb, 0x7e, 0xfc, 0x88, 0xbe,
+ 0x8d, 0x45, 0xef, 0x3d, 0x81, 0x94, 0x07, 0x3e, 0xef, 0x34, 0xe0, 0xbd,
+ 0x5a, 0x35, 0x16, 0xbd, 0xd5, 0x38, 0xfb, 0x3d, 0x4f, 0x17, 0x27, 0x3e,
+ 0xd0, 0xba, 0x9e, 0xbd, 0xaa, 0xb8, 0x27, 0x3e, 0xa7, 0x82, 0x01, 0x3e,
+ 0x28, 0xa7, 0x52, 0x3e, 0x38, 0x44, 0xe7, 0xbc, 0x42, 0xd5, 0xd9, 0xbd,
+ 0xb1, 0x6f, 0x17, 0x3e, 0x1e, 0xf2, 0x18, 0xbe, 0xf7, 0x89, 0x6a, 0xbe,
+ 0xcb, 0x06, 0x39, 0x3e, 0x6c, 0x7c, 0x21, 0xbd, 0x74, 0x71, 0xad, 0xbe,
+ 0xf0, 0xaa, 0x03, 0x3d, 0x3c, 0xa4, 0xde, 0x3c, 0xe1, 0x67, 0x24, 0xbc,
+ 0x44, 0x4d, 0xa7, 0xbd, 0x09, 0x19, 0x55, 0xbe, 0x2c, 0x4a, 0xe1, 0xbd,
+ 0x09, 0xb9, 0xc4, 0x3c, 0x8d, 0xb9, 0x39, 0xbe, 0x8d, 0x85, 0x65, 0x3d,
+ 0xaf, 0x14, 0xd2, 0x3b, 0xfc, 0xf3, 0x28, 0x3e, 0x9d, 0x9f, 0x52, 0x3c,
+ 0xc8, 0x80, 0xce, 0xba, 0xce, 0x0d, 0x1e, 0x3e, 0x0a, 0xbb, 0x1d, 0xbd,
+ 0x85, 0xa8, 0x09, 0xbe, 0xe0, 0x72, 0x24, 0xbe, 0xb8, 0xc0, 0x90, 0x3d,
+ 0x30, 0x67, 0x34, 0xbe, 0x22, 0xa7, 0x86, 0xbe, 0x86, 0xe4, 0x24, 0xbe,
+ 0x6c, 0xae, 0x2a, 0xbe, 0xdb, 0xf6, 0xa7, 0x3d, 0x59, 0xf6, 0xee, 0x3d,
+ 0xc1, 0xc5, 0xda, 0xbc, 0x44, 0xc8, 0xc5, 0xbc, 0xb8, 0x07, 0xf1, 0xbc,
+ 0x21, 0xcb, 0xc2, 0x3d, 0xaf, 0x7e, 0xa9, 0xbd, 0x4a, 0xfc, 0x8d, 0x3d,
+ 0xfd, 0x32, 0xd0, 0xbd, 0x90, 0x14, 0x5b, 0x3d, 0xd5, 0x81, 0xaf, 0x3d,
+ 0x61, 0x4a, 0x22, 0xbd, 0x56, 0xb7, 0x56, 0xbe, 0x78, 0xe9, 0x26, 0xbe,
+ 0x8f, 0x09, 0xc5, 0x3d, 0xae, 0x3c, 0x25, 0x3d, 0x22, 0x8a, 0xb1, 0x3d,
+ 0x0c, 0xf5, 0x36, 0x3e, 0x4d, 0x1d, 0x4f, 0xbe, 0x35, 0x0f, 0xc2, 0xbd,
+ 0xe8, 0x14, 0x4d, 0xbe, 0xf1, 0x6d, 0x64, 0x3c, 0x79, 0xac, 0x4e, 0x3d,
+ 0x71, 0x80, 0xbf, 0xbc, 0x68, 0xb4, 0xc0, 0x3c, 0xbd, 0x19, 0x00, 0xbf,
+ 0x96, 0xf4, 0xf8, 0xbd, 0x8e, 0x78, 0x5c, 0xbe, 0x55, 0xa3, 0x32, 0xbe,
+ 0x99, 0xbb, 0x8b, 0xbe, 0x75, 0x46, 0x14, 0x3e, 0xf7, 0xf5, 0x96, 0xbe,
+ 0x1f, 0x9a, 0x53, 0x3e, 0xb8, 0x99, 0x85, 0xbe, 0xf9, 0x5d, 0xe0, 0x3d,
+ 0x50, 0x1a, 0xb1, 0x3d, 0xd7, 0x3d, 0x2a, 0x3e, 0xf2, 0x5f, 0xa6, 0xbc,
+ 0x15, 0x42, 0x3b, 0x3b, 0x0a, 0x78, 0xfb, 0xbd, 0x56, 0xfb, 0xc5, 0x3d,
+ 0x97, 0xc5, 0x5f, 0x3e, 0xdf, 0xd5, 0x8c, 0x3e, 0xc9, 0x26, 0x88, 0x3d,
+ 0x1e, 0x65, 0x11, 0x3e, 0xae, 0x39, 0x0e, 0xbc, 0x17, 0x61, 0x0d, 0x3e,
+ 0xad, 0x53, 0x9d, 0xbd, 0xcd, 0x6b, 0xe3, 0xbd, 0x08, 0x96, 0x1c, 0x3e,
+ 0x97, 0x63, 0x08, 0x3e, 0xd0, 0xc5, 0x8a, 0x3b, 0xd3, 0xe1, 0x33, 0x3e,
+ 0xe4, 0x3c, 0xb3, 0x3d, 0x10, 0xed, 0x3e, 0xbd, 0x4a, 0xd6, 0xcc, 0x3b,
+ 0xde, 0x73, 0x4b, 0x3b, 0xb5, 0x80, 0x12, 0xbe, 0x63, 0x78, 0x3d, 0x3e,
+ 0x60, 0x51, 0x3a, 0xbe, 0x92, 0xd1, 0xe4, 0x3d, 0xb8, 0x82, 0x38, 0xbd,
+ 0xd8, 0x24, 0x51, 0xbc, 0xe1, 0x81, 0x3b, 0xbe, 0x8f, 0x3d, 0x36, 0x3d,
+ 0x2c, 0x83, 0x5e, 0xbd, 0xe2, 0xc9, 0x2a, 0xbe, 0xb3, 0x1c, 0x55, 0x3e,
+ 0xf0, 0x52, 0xae, 0x3d, 0x1f, 0x29, 0xc4, 0xbd, 0xd3, 0x0c, 0x04, 0x3d,
+ 0xab, 0xf1, 0x67, 0x3e, 0x76, 0xf0, 0xfe, 0x3b, 0x84, 0x60, 0x3c, 0x3e,
+ 0xca, 0xa2, 0x09, 0x3e, 0x15, 0x89, 0x90, 0xbc, 0xcc, 0xbf, 0x19, 0xbe,
+ 0xf2, 0xb8, 0xd4, 0x3e, 0xbf, 0x6a, 0x16, 0x3e, 0x22, 0xe1, 0x0c, 0x3e,
+ 0xcd, 0xab, 0x4d, 0xbe, 0xf2, 0x24, 0x4e, 0xbd, 0xdd, 0x18, 0x04, 0x3e,
+ 0xf3, 0xd7, 0x55, 0x3d, 0x4c, 0xed, 0x8d, 0xbe, 0x74, 0xef, 0x34, 0x3e,
+ 0xc9, 0x5d, 0x75, 0xbd, 0xf2, 0xdd, 0x08, 0x3e, 0xef, 0xff, 0x0d, 0x3e,
+ 0xac, 0xeb, 0x9e, 0xbb, 0xc3, 0xbc, 0x47, 0x3e, 0x0b, 0x86, 0x44, 0x3e,
+ 0x39, 0xc0, 0x7e, 0x3e, 0x95, 0x59, 0x03, 0xbe, 0xcc, 0xfc, 0x19, 0xbe,
+ 0x80, 0x6a, 0x8f, 0x3d, 0xdf, 0x41, 0x33, 0x3d, 0xb5, 0x52, 0x6b, 0xbe,
+ 0x44, 0xff, 0xe6, 0xbd, 0x83, 0x0a, 0xf8, 0xbc, 0x85, 0xcb, 0xf5, 0x3d,
+ 0x58, 0x57, 0x17, 0x3c, 0xf4, 0x4c, 0xaf, 0x3d, 0x65, 0xcc, 0xaa, 0x3d,
+ 0xce, 0x20, 0x05, 0xbd, 0x3d, 0x57, 0xcf, 0x3d, 0x65, 0x0c, 0xb3, 0x3d,
+ 0x7a, 0xfc, 0x67, 0x3c, 0x9b, 0x89, 0x1e, 0x3e, 0xf5, 0xa5, 0xd2, 0x3d,
+ 0x7d, 0x4b, 0xc3, 0xbd, 0x11, 0x4c, 0x31, 0xbe, 0xad, 0x84, 0x4f, 0xbd,
+ 0xb2, 0x6f, 0xf7, 0x3d, 0x11, 0x62, 0x48, 0x3e, 0xd1, 0x33, 0xcb, 0xbd,
+ 0xde, 0xf4, 0xfa, 0x3b, 0x27, 0xfd, 0x1c, 0xb9, 0x78, 0xf5, 0xc5, 0x3d,
+ 0xb4, 0xcc, 0x07, 0xbd, 0xa4, 0x6d, 0x28, 0x3b, 0x5e, 0xe6, 0x17, 0xbe,
+ 0xef, 0xd1, 0xa8, 0xbd, 0xfa, 0xb0, 0x13, 0x3e, 0x27, 0xaf, 0xab, 0x3d,
+ 0x6d, 0x9b, 0x61, 0xbd, 0xa0, 0x18, 0x1a, 0x3e, 0xf7, 0x50, 0x88, 0xbd,
+ 0x1f, 0x77, 0x02, 0x3e, 0x36, 0x67, 0x39, 0xbe, 0x5f, 0xd2, 0x78, 0xbd,
+ 0x5e, 0x33, 0x20, 0xbd, 0xc1, 0x2a, 0x35, 0x3e, 0x85, 0x83, 0x0e, 0xbe,
+ 0xb1, 0xcc, 0xab, 0x3c, 0x23, 0x86, 0x23, 0x3e, 0xd4, 0xaa, 0x57, 0x3e,
+ 0xca, 0xc1, 0x73, 0xbe, 0x73, 0xca, 0x2d, 0x3e, 0xb7, 0x1b, 0xb3, 0x3d,
+ 0xac, 0x34, 0x1c, 0x3c, 0x2f, 0xba, 0xe2, 0xbd, 0x8e, 0x0d, 0x29, 0x3e,
+ 0x5a, 0x83, 0x5e, 0x3c, 0xd5, 0x88, 0x3b, 0xbe, 0x9c, 0x87, 0x95, 0xbd,
+ 0x00, 0x7b, 0x04, 0xbe, 0x63, 0x63, 0xac, 0xbd, 0x9c, 0xb0, 0xd6, 0xbd,
+ 0xa8, 0xb1, 0x10, 0x3e, 0x2b, 0xef, 0x30, 0x3d, 0xd7, 0x21, 0xc2, 0xbc,
+ 0x9d, 0x74, 0x7d, 0x3d, 0xff, 0xa9, 0x04, 0xbe, 0xfd, 0x3d, 0x31, 0xbe,
+ 0xef, 0x4a, 0xad, 0xbd, 0x7b, 0xb9, 0x9b, 0xbd, 0x36, 0xb0, 0xdd, 0xbd,
+ 0x9f, 0xd9, 0x1a, 0xbe, 0xff, 0x54, 0x17, 0x3d, 0x94, 0x5e, 0x22, 0x3e,
+ 0x01, 0x61, 0x19, 0xbe, 0xdc, 0x44, 0xf3, 0x3d, 0xa8, 0xfe, 0x00, 0xbf,
+ 0xa1, 0xf3, 0x16, 0xbe, 0xf9, 0x56, 0x3b, 0x3d, 0x0b, 0x13, 0x00, 0xbe,
+ 0x92, 0x5f, 0x8c, 0x3a, 0xc8, 0xbb, 0x23, 0xbe, 0xa2, 0x55, 0xd1, 0x3d,
+ 0x68, 0x17, 0x0a, 0x3e, 0x52, 0x7b, 0x6f, 0xbd, 0x7d, 0x3c, 0x65, 0x3d,
+ 0x5c, 0x0e, 0xf9, 0x3d, 0xde, 0x38, 0x5d, 0xbd, 0x65, 0x2e, 0x16, 0xbe,
+ 0x2c, 0x51, 0x08, 0x3d, 0x56, 0x2e, 0xa1, 0xbd, 0xf2, 0xcc, 0x01, 0x3c,
+ 0xc3, 0xcf, 0x1c, 0x3e, 0x85, 0x7c, 0x27, 0x3e, 0x42, 0x17, 0x9d, 0xbd,
+ 0x61, 0x1a, 0x95, 0xbc, 0x68, 0x3f, 0xea, 0x3c, 0x4f, 0x3d, 0xce, 0x3d,
+ 0x03, 0x2f, 0xc8, 0x3d, 0x80, 0x3f, 0x6f, 0xbd, 0x69, 0x54, 0x36, 0xbe,
+ 0xec, 0xe3, 0x0c, 0xbe, 0x56, 0x14, 0x3e, 0x3d, 0xa8, 0xe4, 0xa0, 0xbc,
+ 0x90, 0xe2, 0x77, 0x3d, 0x81, 0xad, 0xa8, 0xbd, 0x22, 0x17, 0x2e, 0xbe,
+ 0x38, 0xad, 0x27, 0xbd, 0xc0, 0x05, 0xc8, 0x3e, 0xa7, 0x10, 0x4c, 0x3d,
+ 0x8f, 0xef, 0x2f, 0x3c, 0xc3, 0xf6, 0x48, 0x3e, 0x49, 0x40, 0x34, 0xbe,
+ 0xfc, 0x18, 0x59, 0x3e, 0x17, 0xb7, 0xdf, 0x3d, 0x71, 0x75, 0x13, 0xbe,
+ 0x45, 0x03, 0xb5, 0x3c, 0xb2, 0xaa, 0x35, 0xbd, 0x13, 0x36, 0x83, 0x3d,
+ 0xdd, 0x20, 0x04, 0xbd, 0x47, 0x0f, 0x5f, 0x3d, 0x5c, 0xf2, 0x04, 0x3e,
+ 0x8a, 0x0d, 0xe3, 0x3d, 0x7a, 0x28, 0x10, 0xbe, 0x86, 0x14, 0x9c, 0xbd,
+ 0x97, 0x6c, 0x98, 0x3d, 0xbf, 0x80, 0xf1, 0xbd, 0x72, 0x38, 0x8c, 0x3c,
+ 0xa7, 0x83, 0xd2, 0xbd, 0xf3, 0xa5, 0xf4, 0x3d, 0x84, 0x82, 0x14, 0xbe,
+ 0x0c, 0x20, 0x2d, 0x3e, 0x16, 0x83, 0xc8, 0x3d, 0x3e, 0x92, 0x74, 0x3c,
+ 0x78, 0x6d, 0x45, 0xbd, 0x24, 0x14, 0x05, 0xbe, 0x01, 0xaf, 0x15, 0xbd,
+ 0x61, 0x6d, 0xf8, 0xbd, 0xbf, 0x60, 0xf4, 0x3d, 0x62, 0xde, 0xce, 0xbd,
+ 0x54, 0xb2, 0x17, 0x3d, 0x44, 0x9b, 0xf7, 0xbd, 0x06, 0x3a, 0xde, 0x3d,
+ 0x7b, 0x9b, 0x6e, 0x3d, 0xdd, 0xf3, 0xe8, 0xbc, 0xa2, 0x3a, 0xa3, 0xbd,
+ 0x94, 0x25, 0x61, 0xbe, 0x35, 0x51, 0x04, 0x3d, 0xe2, 0xa4, 0x45, 0xbe,
+ 0x61, 0xdf, 0x2a, 0xbd, 0xf2, 0xd3, 0x4c, 0x3d, 0x69, 0x09, 0x05, 0x3e,
+ 0xb8, 0x32, 0x9f, 0xbd, 0xc4, 0xdb, 0xe3, 0x3c, 0x50, 0xe7, 0x73, 0x3d,
+ 0x68, 0x5c, 0xbc, 0xbd, 0x79, 0x19, 0x16, 0x3e, 0x04, 0x44, 0xb1, 0x3d,
+ 0xbc, 0x21, 0x1d, 0x3c, 0xa2, 0xae, 0x45, 0xbe, 0xee, 0x22, 0xc2, 0xbd,
+ 0xff, 0x22, 0x87, 0xbd, 0x90, 0x4b, 0x04, 0xbe, 0x60, 0x1d, 0x3c, 0xbe,
+ 0x90, 0x95, 0x10, 0x3e, 0x2e, 0xe7, 0xb9, 0x3d, 0xed, 0x54, 0x33, 0xbe,
+ 0xd1, 0x7a, 0x06, 0xbd, 0xb7, 0x21, 0x54, 0xbe, 0x83, 0xc3, 0x43, 0x3d,
+ 0xb4, 0x76, 0xaf, 0xbc, 0x90, 0x40, 0x7e, 0x3d, 0x56, 0xd3, 0x1e, 0xbe,
+ 0x8e, 0x15, 0x3a, 0xbe, 0xf7, 0x43, 0x04, 0x3b, 0x91, 0x0e, 0x96, 0xbe,
+ 0x30, 0x90, 0x29, 0xbd, 0x48, 0x78, 0xbd, 0xbc, 0x3f, 0xa1, 0x6a, 0x3d,
+ 0xb3, 0x13, 0x0e, 0xbd, 0x3f, 0xa5, 0x86, 0x3d, 0x2b, 0xb4, 0xe0, 0x3d,
+ 0xa6, 0xdc, 0x9d, 0x3e, 0x8e, 0x10, 0xbf, 0xbd, 0xe5, 0x94, 0x9b, 0xbd,
+ 0x3a, 0xf3, 0xeb, 0xbd, 0xf0, 0x2b, 0xf3, 0x3d, 0x63, 0xbb, 0x70, 0x3d,
+ 0xd0, 0x79, 0x0b, 0xbe, 0x39, 0xa0, 0xb4, 0x3d, 0x1f, 0x07, 0x24, 0x3d,
+ 0x11, 0x86, 0xfc, 0xbd, 0xc2, 0x15, 0x94, 0x3d, 0xee, 0x56, 0x32, 0x3e,
+ 0xe6, 0xa6, 0x2a, 0x3d, 0x2c, 0xc0, 0x42, 0x3e, 0x34, 0x62, 0x1c, 0x3e,
+ 0xc1, 0xe7, 0x12, 0xbe, 0x6e, 0xad, 0x22, 0xbe, 0xec, 0x64, 0x8a, 0x3d,
+ 0xf0, 0x54, 0x9d, 0xbd, 0xfa, 0xd3, 0x7e, 0x3e, 0xde, 0xc5, 0x44, 0x3c,
+ 0x53, 0xdb, 0xde, 0x3c, 0x48, 0x4a, 0x0f, 0xbe, 0xac, 0xc5, 0xb4, 0xbe,
+ 0x48, 0xfe, 0x2e, 0xbd, 0x43, 0x36, 0x03, 0xbe, 0x87, 0xff, 0xde, 0xbc,
+ 0xea, 0x5a, 0x85, 0x3d, 0xfb, 0x0d, 0xd4, 0xbd, 0xda, 0xd6, 0xd6, 0x3d,
+ 0x14, 0x24, 0x6a, 0x3d, 0x73, 0xa7, 0xb3, 0xbd, 0x2c, 0x0b, 0x4c, 0x3d,
+ 0xe6, 0x8f, 0x6c, 0x3d, 0xe1, 0x03, 0xbb, 0x3d, 0xba, 0xfb, 0xcc, 0xbd,
+ 0x2e, 0xe1, 0x1e, 0x3a, 0x66, 0x83, 0x65, 0xbe, 0x0a, 0xb3, 0xc5, 0x3d,
+ 0xc9, 0x7a, 0x1c, 0x3e, 0x9d, 0x4d, 0xdb, 0xbb, 0x31, 0x1d, 0x7d, 0xbc,
+ 0x57, 0x51, 0x21, 0xbe, 0xef, 0xcd, 0xb1, 0xbc, 0x3a, 0xef, 0xe8, 0x3d,
+ 0x85, 0xf1, 0x75, 0x3c, 0x71, 0x11, 0x1d, 0x3e, 0xa5, 0x68, 0x88, 0x3c,
+ 0xca, 0xb9, 0x6f, 0x3d, 0x75, 0x20, 0x79, 0x3d, 0x14, 0x47, 0xc6, 0xbd,
+ 0x78, 0x68, 0x1e, 0xbe, 0x8d, 0x44, 0x80, 0x3d, 0x38, 0xfa, 0xd8, 0x3d,
+ 0x50, 0x60, 0x99, 0xb9, 0x51, 0x62, 0x7e, 0x3d, 0x76, 0x3e, 0xb4, 0x3d,
+ 0xbf, 0x40, 0x1d, 0xbe, 0xd0, 0xf7, 0x9f, 0x3c, 0xbc, 0x1f, 0x38, 0x3d,
+ 0x57, 0xbc, 0x19, 0x3e, 0x95, 0x40, 0x85, 0x3c, 0xf0, 0x5e, 0x56, 0xbb,
+ 0x6f, 0x06, 0x0b, 0xbd, 0xc8, 0x76, 0xc8, 0x3d, 0xae, 0x4f, 0xfa, 0xbc,
+ 0x9a, 0xa3, 0xc0, 0x3b, 0xfa, 0x4f, 0xa2, 0x3d, 0x1c, 0x34, 0x54, 0xbd,
+ 0x08, 0x8c, 0x1f, 0x3e, 0x62, 0x9f, 0xad, 0x3d, 0xee, 0x30, 0xb5, 0x3d,
+ 0xeb, 0x76, 0x65, 0x3d, 0x57, 0x27, 0x06, 0xbe, 0x3c, 0x1e, 0xdc, 0xbc,
+ 0xea, 0xae, 0xb4, 0x3d, 0xf3, 0xc5, 0x06, 0x3e, 0xcd, 0xe8, 0x2f, 0xbe,
+ 0x6d, 0xd5, 0x89, 0xbd, 0x58, 0x11, 0x0e, 0x3d, 0x95, 0xe3, 0xed, 0x3d,
+ 0x33, 0xbc, 0xfa, 0x3e, 0x98, 0x99, 0x46, 0xbd, 0x79, 0xef, 0xfe, 0xbd,
+ 0x94, 0xef, 0x00, 0xbd, 0x1b, 0x6a, 0x54, 0xbc, 0x06, 0x9b, 0x8e, 0x3d,
+ 0x4a, 0x0d, 0xeb, 0xbc, 0xa8, 0x3b, 0x13, 0xbe, 0xa5, 0x24, 0x49, 0x3e,
+ 0xd9, 0xea, 0x90, 0x3d, 0x16, 0x99, 0xbd, 0xbd, 0xf4, 0xfb, 0x22, 0x3e,
+ 0x51, 0x6b, 0x00, 0x3e, 0xc3, 0x65, 0x98, 0x3c, 0x40, 0xe8, 0x3e, 0xbe,
+ 0x99, 0xaf, 0x0f, 0xbe, 0x83, 0x69, 0xbf, 0xbd, 0x0f, 0x73, 0x3f, 0xbe,
+ 0x13, 0x7a, 0x42, 0x3d, 0xa5, 0x2a, 0x13, 0xbd, 0xfa, 0x36, 0xfc, 0x3b,
+ 0xb5, 0x92, 0x54, 0xbe, 0x8a, 0x5a, 0x3a, 0x3e, 0xe5, 0x59, 0xb1, 0x3c,
+ 0x99, 0xc7, 0xa6, 0xbd, 0xa5, 0xb8, 0x24, 0xbe, 0xd2, 0xe0, 0xf8, 0x3d,
+ 0x2f, 0x07, 0x6f, 0xbd, 0xdb, 0xdd, 0xf4, 0xbd, 0xff, 0xdc, 0xf5, 0xbd,
+ 0x7a, 0x5d, 0xe2, 0x3c, 0x26, 0x0b, 0x19, 0xbd, 0x2b, 0x8d, 0x1d, 0xbd,
+ 0x13, 0x82, 0x7b, 0x3d, 0x41, 0x26, 0xd6, 0xbd, 0x09, 0x6b, 0x6b, 0x3e,
+ 0xe3, 0xba, 0x6c, 0x3d, 0x3b, 0x90, 0x97, 0xbb, 0x3b, 0x77, 0x92, 0xbd,
+ 0x91, 0xef, 0x12, 0xbd, 0x50, 0x04, 0x8e, 0xbc, 0x12, 0xb3, 0xc7, 0x3d,
+ 0x49, 0xc6, 0xd7, 0x3d, 0xa8, 0x29, 0xd9, 0x3c, 0x5e, 0xc2, 0x16, 0x3d,
+ 0xec, 0xd8, 0x21, 0x3e, 0x9a, 0xde, 0x0b, 0xbe, 0xb3, 0xfc, 0x46, 0x3e,
+ 0xcc, 0xa5, 0x21, 0xbb, 0x02, 0xc3, 0x2f, 0x3d, 0xe3, 0x9b, 0x5a, 0xbe,
+ 0x61, 0xa1, 0x9a, 0x3d, 0x25, 0x6f, 0x08, 0x3e, 0xc7, 0x54, 0xba, 0x3d,
+ 0x7c, 0x15, 0x83, 0xbd, 0x6f, 0x34, 0x25, 0xbe, 0xc4, 0xfc, 0x82, 0xbd,
+ 0x0e, 0x42, 0x06, 0xbe, 0x74, 0x29, 0xd6, 0xbb, 0x2c, 0xc4, 0x0d, 0xbd,
+ 0x1b, 0x08, 0xb3, 0xbd, 0x4d, 0x1f, 0xeb, 0xbd, 0x06, 0x12, 0xff, 0x3d,
+ 0xa3, 0x4f, 0x84, 0xbd, 0xc4, 0xf5, 0xa9, 0xbd, 0x38, 0xa7, 0x18, 0x3e,
+ 0xc9, 0x3f, 0xdf, 0xbb, 0xc5, 0xb9, 0xa5, 0xbd, 0xa9, 0xd4, 0xd6, 0x3d,
+ 0xb7, 0xb8, 0x10, 0xbe, 0x20, 0x10, 0x65, 0xbd, 0x4c, 0x6d, 0x50, 0x3d,
+ 0xe1, 0x6f, 0x1b, 0xbc, 0x19, 0x02, 0x58, 0xbd, 0x7e, 0x26, 0x62, 0x3e,
+ 0x84, 0x5f, 0x30, 0x3e, 0xbb, 0x2c, 0x60, 0xbd, 0x7f, 0xb2, 0x94, 0xbd,
+ 0x3d, 0xec, 0xc0, 0x3c, 0x6a, 0xea, 0x2b, 0x3d, 0x79, 0xe5, 0x1e, 0xbe,
+ 0x49, 0x66, 0xd7, 0xbd, 0x63, 0x3a, 0xf2, 0xbe, 0xba, 0xd5, 0xf8, 0x3d,
+ 0xba, 0x69, 0x2f, 0x3d, 0x21, 0xcf, 0x0d, 0xbd, 0x80, 0xcd, 0xd1, 0xbd,
+ 0x31, 0x0f, 0x29, 0x3e, 0x64, 0x0a, 0x5b, 0xbe, 0x27, 0x1d, 0x09, 0xbd,
+ 0x84, 0x25, 0xab, 0x3d, 0xe2, 0x66, 0x32, 0xbe, 0x87, 0x89, 0xcf, 0xbd,
+ 0x04, 0xd5, 0xac, 0xbd, 0xbb, 0x19, 0x30, 0xbe, 0xf9, 0xb4, 0xb0, 0x3d,
+ 0x78, 0x27, 0xef, 0xbc, 0x10, 0xb0, 0xe5, 0xba, 0xa3, 0x7e, 0x18, 0x3e,
+ 0x0d, 0xcb, 0xe6, 0x3d, 0x9b, 0x22, 0x2c, 0xbe, 0x17, 0xf4, 0xd1, 0xbd,
+ 0xbb, 0x8b, 0x74, 0x3d, 0x6c, 0x6c, 0x9e, 0x3e, 0x04, 0xe5, 0x80, 0xbd,
+ 0x99, 0xe7, 0xc7, 0x3d, 0xea, 0xe7, 0x99, 0xbd, 0x7c, 0x07, 0xf5, 0x3b,
+ 0xa4, 0x33, 0x48, 0xbe, 0xb9, 0xf8, 0x2d, 0xbd, 0x3a, 0xaf, 0xa8, 0x3d,
+ 0xa0, 0xe0, 0x15, 0xbd, 0x89, 0x21, 0x4e, 0xbd, 0xe5, 0x5a, 0x3f, 0x3e,
+ 0xff, 0xd0, 0x1b, 0x3e, 0xed, 0x84, 0xa9, 0xbe, 0xb9, 0xdf, 0x00, 0xbe,
+ 0x00, 0x6e, 0x72, 0x3d, 0xff, 0x9e, 0xfc, 0x3e, 0x24, 0xa5, 0x27, 0x3e,
+ 0x19, 0xc8, 0xd4, 0x3d, 0x66, 0xf6, 0x24, 0xbe, 0x05, 0xad, 0x4d, 0x3e,
+ 0xa6, 0xb6, 0xfc, 0x3d, 0x37, 0xbf, 0x9e, 0xbd, 0x2c, 0x7d, 0x24, 0x3e,
+ 0x27, 0xed, 0x4f, 0xbe, 0x67, 0x70, 0x2a, 0x3e, 0xb4, 0x1c, 0xc8, 0xba,
+ 0x6d, 0x10, 0xbf, 0x3d, 0x07, 0xf2, 0x6d, 0xbd, 0xb0, 0x83, 0x94, 0x3e,
+ 0x01, 0x4d, 0xb6, 0xbc, 0xe2, 0x69, 0xd1, 0x3d, 0x8a, 0x12, 0xa0, 0xbe,
+ 0xa2, 0x49, 0x4f, 0x3e, 0xfb, 0xdc, 0x6d, 0xbc, 0x0f, 0x61, 0x81, 0x3d,
+ 0xb6, 0x34, 0xaa, 0xbd, 0xb8, 0x71, 0x21, 0x3e, 0x75, 0x18, 0x87, 0x3e,
+ 0xfc, 0xa5, 0x9b, 0xbd, 0x34, 0xe8, 0xac, 0x3c, 0x3c, 0xd0, 0x90, 0xbb,
+ 0xe3, 0x3e, 0x35, 0xbe, 0x41, 0x3f, 0x76, 0xbc, 0x82, 0xb2, 0x12, 0x3e,
+ 0x88, 0xc9, 0x1d, 0xbe, 0xdc, 0x1a, 0x3e, 0xbd, 0x6b, 0x76, 0x52, 0x3d,
+ 0x2f, 0xf5, 0x2b, 0xbe, 0x9d, 0x40, 0x08, 0x3e, 0x89, 0x13, 0x95, 0x3c,
+ 0xeb, 0x0f, 0x1e, 0xbe, 0x28, 0x50, 0x15, 0x3e, 0x20, 0x56, 0x9e, 0x3c,
+ 0xf3, 0x09, 0x45, 0x3c, 0x9a, 0x4b, 0x20, 0x3e, 0xc4, 0x03, 0xa9, 0x3d,
+ 0x00, 0x64, 0x15, 0x3d, 0x3d, 0x99, 0x94, 0x3d, 0x91, 0xd7, 0xaa, 0x3d,
+ 0xdf, 0xee, 0x73, 0x3e, 0x98, 0x8d, 0x06, 0x3e, 0x1a, 0x09, 0x22, 0x3e,
+ 0x36, 0x48, 0x34, 0x3e, 0xa5, 0x10, 0x44, 0x3e, 0x80, 0xbb, 0x3b, 0xbd,
+ 0xa7, 0x54, 0x1f, 0xbe, 0x05, 0xbb, 0xf9, 0xbc, 0x33, 0xb4, 0xfc, 0x3d,
+ 0xf2, 0x50, 0x2c, 0xbe, 0xf2, 0xd4, 0xb2, 0x3d, 0x83, 0x5d, 0x68, 0x3c,
+ 0x11, 0x45, 0xcc, 0x3d, 0xd2, 0x9a, 0xf2, 0x3d, 0x3e, 0x58, 0x0a, 0x3e,
+ 0xfd, 0x80, 0x4a, 0xbc, 0x21, 0xe5, 0x89, 0xbe, 0x9c, 0x8a, 0xa9, 0x3d,
+ 0xc3, 0xa5, 0x1e, 0x3c, 0xaf, 0xb0, 0x88, 0xbc, 0xa6, 0x8d, 0x58, 0xbc,
+ 0xce, 0xc6, 0x84, 0xbc, 0x2a, 0x77, 0xd3, 0x3d, 0x75, 0xf0, 0x1e, 0xbd,
+ 0x57, 0x98, 0x20, 0x3e, 0xfa, 0x71, 0xcb, 0xbc, 0x77, 0x88, 0x46, 0xbe,
+ 0x1d, 0xde, 0x74, 0xbd, 0x3f, 0xee, 0x09, 0x3e, 0x2b, 0xd1, 0xe1, 0x3d,
+ 0xae, 0x35, 0xa8, 0x3d, 0xe4, 0xcf, 0x98, 0x3b, 0x37, 0x42, 0xc1, 0xbc,
+ 0xc6, 0xc5, 0x9e, 0x3d, 0xaa, 0xf9, 0x82, 0x3c, 0x24, 0xb9, 0x91, 0x3c,
+ 0x1d, 0xe7, 0x04, 0xbe, 0xae, 0x63, 0xaa, 0xbd, 0x6a, 0x66, 0x54, 0xbe,
+ 0x96, 0xda, 0x10, 0x3e, 0xa0, 0x9e, 0x43, 0xbd, 0x5f, 0xe0, 0x3c, 0xbe,
+ 0x46, 0x3c, 0x9d, 0xbd, 0x16, 0xe7, 0xd9, 0x3c, 0x68, 0x60, 0xbf, 0x3d,
+ 0x35, 0x61, 0x14, 0xbd, 0x76, 0xe2, 0x8b, 0x3c, 0x60, 0x60, 0x58, 0xbe,
+ 0x19, 0x17, 0x4b, 0xbe, 0x46, 0x2b, 0x4a, 0x3d, 0x3d, 0x15, 0x92, 0x3d,
+ 0x1d, 0xa9, 0xb9, 0x3d, 0x5a, 0xdb, 0x6a, 0x3d, 0x6e, 0xe6, 0x92, 0x3d,
+ 0x57, 0x69, 0x7e, 0x3c, 0xcd, 0xf6, 0x43, 0xbe, 0x1e, 0x85, 0x11, 0x3e,
+ 0xff, 0xf3, 0x14, 0xbd, 0x7a, 0xba, 0x97, 0x3c, 0x61, 0xcd, 0xcc, 0x3d,
+ 0x3a, 0xa2, 0xb5, 0xbd, 0x0e, 0x52, 0x16, 0xbd, 0x19, 0x65, 0x15, 0x3e,
+ 0xd1, 0xd3, 0xbe, 0xbc, 0xf1, 0xdd, 0x8b, 0xbd, 0x4b, 0x19, 0x79, 0x3d,
+ 0x37, 0x5a, 0xf1, 0x3d, 0x19, 0x8c, 0x1d, 0x3e, 0x8e, 0x7f, 0x88, 0x3d,
+ 0x28, 0xe8, 0xdb, 0x3d, 0x0b, 0x57, 0xc1, 0x3d, 0x2c, 0x00, 0x32, 0x3c,
+ 0xfe, 0x07, 0xd4, 0x3c, 0x64, 0xa8, 0xc9, 0x3d, 0xa3, 0xf5, 0x1a, 0x3e,
+ 0x5b, 0x6d, 0xab, 0xbe, 0x99, 0x9b, 0xca, 0x3c, 0x09, 0x0b, 0x95, 0xbd,
+ 0x4d, 0x96, 0x77, 0xbd, 0xfc, 0x24, 0xd7, 0x3d, 0xa0, 0x0c, 0x16, 0xbe,
+ 0xea, 0x12, 0xb2, 0xbd, 0xd5, 0x27, 0x8e, 0x3d, 0x95, 0x41, 0x16, 0x3d,
+ 0xcc, 0x8f, 0x0c, 0x3e, 0xb4, 0x4b, 0x47, 0x3e, 0x9f, 0x6f, 0x4a, 0xbc,
+ 0x85, 0x54, 0x0a, 0xbe, 0x05, 0xb8, 0x13, 0xbe, 0x96, 0x6d, 0xd4, 0xbd,
+ 0xa9, 0x2b, 0x5c, 0xbe, 0x80, 0x5c, 0xf5, 0xbd, 0x77, 0x30, 0x6f, 0xbd,
+ 0x8d, 0xb9, 0xd1, 0x3c, 0x0e, 0x2f, 0x40, 0x3d, 0x7f, 0x8b, 0x6a, 0x3d,
+ 0x97, 0x0d, 0x3a, 0xbe, 0x42, 0xd8, 0xa5, 0xbe, 0x88, 0x81, 0x28, 0xbe,
+ 0x6d, 0xe2, 0x2e, 0x3e, 0x08, 0x1e, 0x03, 0x3e, 0x43, 0x64, 0x5e, 0x3d,
+ 0x93, 0xbe, 0x55, 0x3d, 0x86, 0xe0, 0xaa, 0x3d, 0xca, 0x8b, 0x17, 0xbd,
+ 0x80, 0x7d, 0xd2, 0xbd, 0x12, 0x1e, 0x40, 0xbd, 0x8a, 0x0c, 0x34, 0x3e,
+ 0xdd, 0x2a, 0x09, 0xbe, 0x4e, 0xd8, 0xdf, 0xbd, 0x5a, 0x70, 0x0c, 0x3e,
+ 0xdc, 0x41, 0x25, 0xbe, 0x8f, 0xd9, 0xce, 0xbd, 0xbe, 0x19, 0xca, 0xbc,
+ 0xc1, 0x61, 0xa8, 0xbe, 0x26, 0x31, 0xad, 0xbd, 0xd6, 0xfb, 0x0c, 0x3e,
+ 0x50, 0xf2, 0x91, 0xbd, 0x39, 0x17, 0x4d, 0xbd, 0x46, 0x8d, 0xb3, 0xbd,
+ 0x55, 0x7b, 0x56, 0xbd, 0x1e, 0xca, 0xee, 0xbd, 0xbd, 0x5b, 0x06, 0x3e,
+ 0x34, 0xaf, 0x0f, 0xbe, 0x0e, 0xcc, 0x77, 0xbc, 0x80, 0x43, 0x05, 0x3e,
+ 0x80, 0x42, 0x53, 0xbd, 0x9f, 0x8d, 0x3b, 0x3e, 0xb5, 0x41, 0xe1, 0xbc,
+ 0x0d, 0x39, 0x7e, 0xbd, 0x0e, 0xc3, 0x1e, 0xbe, 0x2b, 0x26, 0xcd, 0x3d,
+ 0x99, 0x9e, 0x4d, 0x3e, 0xa5, 0xae, 0xe0, 0x3d, 0x0a, 0x60, 0x45, 0x3d,
+ 0xc7, 0xb8, 0x52, 0xbd, 0xa7, 0x8f, 0x85, 0x3d, 0xc5, 0xc3, 0x37, 0x3c,
+ 0x68, 0x40, 0x8b, 0x3a, 0xee, 0x67, 0xad, 0x3d, 0x69, 0x28, 0x57, 0x3d,
+ 0xb0, 0x00, 0xce, 0x3d, 0x29, 0x8e, 0x01, 0x3e, 0x26, 0xa3, 0x83, 0xbb,
+ 0x05, 0x61, 0xd9, 0xbd, 0x4d, 0x3d, 0xb8, 0x3d, 0xfe, 0x4c, 0x06, 0x3e,
+ 0xd8, 0x0d, 0x87, 0x3c, 0xfe, 0x03, 0x09, 0x3e, 0xa7, 0xe2, 0x91, 0xbe,
+ 0x8a, 0x5c, 0x24, 0x3e, 0xfb, 0x05, 0xaf, 0xbd, 0x3b, 0x5a, 0x10, 0xbe,
+ 0x63, 0x45, 0x10, 0xbd, 0x11, 0x34, 0x88, 0xbe, 0xd0, 0x4b, 0x13, 0xbd,
+ 0x69, 0xa5, 0x1e, 0xbd, 0x6c, 0xe1, 0x21, 0x3e, 0x07, 0x0e, 0xd7, 0x3d,
+ 0xde, 0x91, 0xd9, 0xbd, 0xb1, 0x19, 0xbf, 0x3d, 0xb4, 0x94, 0x52, 0x3d,
+ 0xb5, 0xcc, 0x91, 0xbc, 0xa6, 0xff, 0x88, 0xbd, 0x8a, 0x22, 0xce, 0x3d,
+ 0x1c, 0x7f, 0xbf, 0xbd, 0x6b, 0x69, 0x0d, 0xbe, 0x22, 0x65, 0xd0, 0xbd,
+ 0x48, 0xf2, 0x49, 0xbd, 0xe8, 0xe3, 0x9a, 0xbd, 0x84, 0x47, 0x39, 0x3e,
+ 0xcb, 0xce, 0x59, 0xbe, 0x44, 0x42, 0xd7, 0xbc, 0xc0, 0xe5, 0xc8, 0xbc,
+ 0x94, 0xc6, 0xf5, 0xbd, 0x16, 0x1a, 0x35, 0xbe, 0x24, 0x61, 0xf2, 0x3d,
+ 0x15, 0x8d, 0x00, 0xbd, 0x97, 0xa5, 0xfa, 0xbd, 0xaf, 0x88, 0x3f, 0x3d,
+ 0x76, 0x43, 0xfb, 0x3d, 0x93, 0x93, 0x3f, 0x3e, 0x32, 0x12, 0x92, 0xbd,
+ 0x49, 0x72, 0x1c, 0xbe, 0xb9, 0x07, 0x61, 0xbe, 0x9f, 0xe9, 0x2f, 0xbe,
+ 0x37, 0xa8, 0x8b, 0x3d, 0xc9, 0xa3, 0x5b, 0x3d, 0x01, 0x6d, 0xe7, 0x3d,
+ 0xa3, 0x32, 0x10, 0xbc, 0x3f, 0x3b, 0x09, 0xbe, 0xf7, 0x47, 0x8b, 0x3d,
+ 0x18, 0xb0, 0x2b, 0x3d, 0x63, 0x93, 0x2f, 0x3e, 0x8a, 0x50, 0x75, 0xbd,
+ 0x9e, 0xb1, 0x82, 0xbd, 0x3c, 0xfc, 0x56, 0x3b, 0x09, 0xe9, 0x63, 0xbc,
+ 0x80, 0x12, 0xe2, 0xbd, 0xa3, 0x51, 0x49, 0x3e, 0x1e, 0x0d, 0x84, 0x3d,
+ 0xfc, 0xc5, 0x64, 0xbc, 0xe4, 0xfc, 0xd1, 0xbd, 0x56, 0x40, 0xe1, 0x3c,
+ 0x7a, 0x91, 0xe9, 0x3d, 0x19, 0x0d, 0x2b, 0x3e, 0x85, 0xf3, 0x20, 0x3e,
+ 0x6a, 0x4c, 0xb9, 0xbc, 0x4d, 0x6c, 0xde, 0xbd, 0xf0, 0x26, 0x0a, 0x3e,
+ 0xdc, 0x20, 0x95, 0x3d, 0x98, 0x72, 0x6e, 0xbc, 0x48, 0x5c, 0x15, 0x3e,
+ 0x9c, 0xf4, 0x36, 0xbe, 0xf5, 0xcf, 0xeb, 0xbd, 0x72, 0x25, 0x37, 0x3d,
+ 0x0e, 0xc7, 0x66, 0x3d, 0x0a, 0xd5, 0x38, 0x3c, 0x09, 0x12, 0x28, 0xbe,
+ 0xb5, 0xc8, 0x2d, 0x3e, 0x95, 0x07, 0x2f, 0xbe, 0xfc, 0x41, 0xb3, 0xbd,
+ 0x3e, 0x36, 0xfb, 0x3c, 0xb5, 0x6c, 0x50, 0x3d, 0xdd, 0x0f, 0xfb, 0x3d,
+ 0xa9, 0x2b, 0xaf, 0xbd, 0x88, 0x80, 0x0d, 0x3e, 0x49, 0x98, 0x3d, 0xbd,
+ 0x28, 0x1f, 0xbe, 0x3d, 0x80, 0xe8, 0x75, 0x3d, 0xb3, 0x40, 0x98, 0x3d,
+ 0x2b, 0x49, 0xb6, 0x3d, 0x18, 0x64, 0xac, 0xbe, 0xb9, 0x9b, 0x31, 0xbe,
+ 0x41, 0x99, 0x5c, 0x3d, 0xcb, 0xe7, 0x9c, 0xbc, 0xd0, 0x8b, 0x06, 0xbe,
+ 0x7a, 0xba, 0x66, 0xbe, 0x9c, 0x48, 0xb2, 0x3d, 0x11, 0x77, 0x0a, 0x3c,
+ 0x61, 0x9c, 0xab, 0x3d, 0x5e, 0xb7, 0x03, 0x3e, 0x37, 0xdb, 0x1b, 0x3e,
+ 0xaa, 0x10, 0xe0, 0x3c, 0x3b, 0x6d, 0x77, 0xbd, 0x9f, 0x49, 0x0a, 0xbe,
+ 0x97, 0x5f, 0x19, 0x3e, 0x31, 0x57, 0x0b, 0x3e, 0x6d, 0xaf, 0x19, 0xbe,
+ 0xd7, 0x12, 0xb0, 0xbd, 0x50, 0x04, 0x70, 0xbd, 0x42, 0xfd, 0x2a, 0xbe,
+ 0x83, 0xec, 0x32, 0xbe, 0xec, 0x74, 0x4b, 0xbd, 0x43, 0xc4, 0xfe, 0xbd,
+ 0x74, 0x6d, 0xe9, 0x3d, 0xae, 0x69, 0xc8, 0x3d, 0x22, 0x9f, 0xb5, 0xbd,
+ 0xec, 0xb7, 0xa0, 0x3d, 0x4d, 0x75, 0x07, 0xbe, 0x8f, 0x28, 0x0c, 0xbe,
+ 0xd0, 0x39, 0x78, 0xbe, 0xa5, 0x45, 0xe0, 0x3d, 0xfa, 0x70, 0x41, 0xbe,
+ 0x40, 0x4c, 0x47, 0xbd, 0x05, 0xb2, 0x1a, 0xbb, 0x6e, 0x97, 0x90, 0xbd,
+ 0x63, 0xcf, 0x2f, 0xbe, 0x4d, 0x15, 0xb7, 0x3d, 0xd6, 0x0b, 0x0e, 0xbe,
+ 0x7b, 0xbc, 0x01, 0x3e, 0x6d, 0x72, 0xac, 0xbd, 0x92, 0xc5, 0xc7, 0xbc,
+ 0x76, 0x20, 0x1e, 0xbc, 0xc1, 0x80, 0x90, 0xbe, 0x46, 0x66, 0xbe, 0x3d,
+ 0xd3, 0xf2, 0x0c, 0x3e, 0xd9, 0xf5, 0x2a, 0xbe, 0xbf, 0x90, 0x63, 0xbd,
+ 0xd1, 0x0c, 0xad, 0x3d, 0x92, 0x3b, 0xc6, 0xbd, 0x13, 0x25, 0x07, 0x3e,
+ 0xab, 0x64, 0x0f, 0x3e, 0xd5, 0x1c, 0x22, 0xbe, 0x7f, 0x6a, 0x2d, 0x3e,
+ 0xc8, 0xbb, 0xbd, 0xbc, 0xa5, 0xb1, 0xe8, 0x3d, 0x4c, 0x79, 0x1b, 0x3e,
+ 0xde, 0x3f, 0x28, 0xbe, 0xa8, 0xfa, 0x9f, 0x3c, 0x07, 0x0f, 0x19, 0xbe,
+ 0x35, 0x04, 0x1f, 0xbe, 0x5a, 0x05, 0xf0, 0x3d, 0xab, 0xab, 0xc6, 0xbe,
+ 0x77, 0x05, 0x66, 0x3d, 0x9d, 0xb8, 0x67, 0xbe, 0xc4, 0xf8, 0x08, 0xbe,
+ 0xaa, 0x06, 0x57, 0xbd, 0xac, 0xba, 0x4b, 0xbe, 0x2d, 0x79, 0x25, 0x3e,
+ 0x95, 0x63, 0x25, 0xbd, 0xc0, 0x5d, 0x17, 0xbe, 0xa0, 0x80, 0x9c, 0x3d,
+ 0xbc, 0x27, 0x92, 0x3d, 0x12, 0xb1, 0x80, 0xbc, 0x3b, 0x10, 0x2a, 0xbe,
+ 0x51, 0xdc, 0xc2, 0x3d, 0x3e, 0xee, 0xe4, 0xbb, 0xbc, 0x97, 0x72, 0x3c,
+ 0x2e, 0x15, 0xe1, 0x3d, 0x9e, 0xb2, 0xf5, 0xbd, 0x9d, 0xf4, 0xb9, 0xbd,
+ 0xc6, 0x03, 0x28, 0xbe, 0x1c, 0x89, 0xcf, 0xbe, 0xfe, 0xe8, 0xc2, 0x3b,
+ 0xe0, 0x60, 0x52, 0x3d, 0x6f, 0x8d, 0xad, 0xbd, 0x32, 0xfd, 0xec, 0xbd,
+ 0xcc, 0x0b, 0x4e, 0x3e, 0x2f, 0x2b, 0x81, 0xbd, 0xe7, 0x73, 0x94, 0xbd,
+ 0x98, 0xf9, 0x88, 0x3d, 0x36, 0x59, 0xc7, 0xbd, 0x5c, 0x97, 0xfd, 0xbd,
+ 0xc0, 0x0e, 0xb0, 0xbd, 0xc6, 0xd5, 0x62, 0x3d, 0xd0, 0x59, 0x0f, 0x3e,
+ 0xba, 0xc3, 0x40, 0xbe, 0xa5, 0xf3, 0xc1, 0xbd, 0x5e, 0x16, 0x0f, 0xbe,
+ 0x16, 0x8b, 0x0a, 0xbc, 0xbc, 0x81, 0xd9, 0xbd, 0x78, 0x8b, 0xb5, 0xbc,
+ 0x5b, 0x27, 0xd2, 0xbe, 0x0f, 0x55, 0x03, 0x3e, 0x82, 0x28, 0x86, 0x3d,
+ 0x00, 0x31, 0xc4, 0xbe, 0x0a, 0xf0, 0x45, 0x3e, 0x9c, 0xc8, 0x02, 0x3e,
+ 0x09, 0xc1, 0x46, 0x3e, 0x43, 0xec, 0x56, 0x3e, 0x20, 0x9a, 0x72, 0xbe,
+ 0x58, 0x8c, 0x04, 0x3e, 0x86, 0xf5, 0x46, 0xbc, 0x4a, 0x62, 0x26, 0x3e,
+ 0x45, 0xa8, 0x12, 0x3e, 0xba, 0x25, 0xdb, 0xbd, 0x03, 0xa0, 0x7a, 0x3e,
+ 0x4e, 0xfa, 0xee, 0x3d, 0x68, 0xb5, 0x5e, 0xbe, 0x46, 0x2b, 0x95, 0x3e,
+ 0x78, 0xf0, 0x87, 0xbd, 0xb5, 0xf6, 0x62, 0xbe, 0x63, 0x37, 0x5e, 0x3e,
+ 0xd9, 0x0d, 0x2e, 0xbe, 0xb0, 0x97, 0x84, 0x3e, 0x78, 0x7a, 0x84, 0x3c,
+ 0x62, 0xde, 0x7e, 0xbc, 0xbd, 0x22, 0x85, 0xbe, 0x38, 0x64, 0xa1, 0xbc,
+ 0xa3, 0xce, 0x51, 0x3e, 0x66, 0xb5, 0x28, 0xbe, 0x88, 0x01, 0x29, 0x3c,
+ 0x06, 0x1d, 0x78, 0x3d, 0xe3, 0x3e, 0xa3, 0x3d, 0x0c, 0xb6, 0x88, 0xbe,
+ 0x99, 0xf5, 0xbb, 0xbd, 0x11, 0xae, 0x97, 0x3e, 0xbf, 0xa7, 0x80, 0xbe,
+ 0xac, 0xaa, 0x10, 0xbb, 0xd6, 0x79, 0x56, 0xbb, 0x43, 0xc0, 0x4d, 0x3e,
+ 0x10, 0x39, 0x92, 0xbe, 0x64, 0xea, 0x58, 0x3e, 0x65, 0xc7, 0x22, 0xbd,
+ 0xb6, 0x17, 0xf1, 0x3d, 0x4d, 0xb1, 0x55, 0x3e, 0xdd, 0xa4, 0x05, 0xbe,
+ 0xea, 0xa5, 0x1d, 0xbe, 0x2b, 0xff, 0x05, 0x3d, 0x6a, 0x98, 0x36, 0x3d,
+ 0x6d, 0xf4, 0x2e, 0xbe, 0x30, 0x6b, 0x4d, 0x3c, 0x34, 0xa6, 0x37, 0x3b,
+ 0x52, 0x67, 0xa8, 0x3e, 0x46, 0x51, 0x21, 0xbe, 0x5d, 0xb4, 0x57, 0xbe,
+ 0xbd, 0x09, 0x45, 0x3e, 0x92, 0x74, 0x7e, 0xbe, 0xa8, 0x29, 0x57, 0xbe,
+ 0x24, 0x11, 0x8f, 0x3e, 0xba, 0xd0, 0xae, 0x3d, 0xd9, 0x26, 0x38, 0xbd,
+ 0x89, 0x63, 0x1e, 0xbe, 0x5e, 0xa7, 0x53, 0xbe, 0x40, 0xe2, 0x94, 0x3d,
+ 0x25, 0x28, 0x49, 0xbe, 0xe2, 0xb9, 0xe5, 0xbd, 0x82, 0xc3, 0xa1, 0xbd,
+ 0x8e, 0x63, 0x31, 0x3e, 0x58, 0xf9, 0x2e, 0x3c, 0xcf, 0xdd, 0x42, 0x3e,
+ 0x63, 0x98, 0xf4, 0xbd, 0x75, 0xe5, 0x1b, 0xbe, 0x18, 0x55, 0x4f, 0x3e,
+ 0x53, 0xea, 0x52, 0x3c, 0x7d, 0xb4, 0xd0, 0x3d, 0x71, 0x51, 0xb2, 0x3d,
+ 0x19, 0xfe, 0x00, 0x3c, 0xe5, 0xa4, 0x09, 0x3e, 0x88, 0xa6, 0xf1, 0x3d,
+ 0xb9, 0x86, 0x05, 0x3e, 0xc8, 0x84, 0xaa, 0xbe, 0x98, 0x5e, 0x82, 0xbd,
+ 0xfd, 0xff, 0x41, 0xbe, 0x6d, 0xc7, 0xcb, 0xbd, 0xda, 0x1b, 0x80, 0xbc,
+ 0x40, 0x97, 0x2d, 0x3e, 0xa6, 0x35, 0xcd, 0xbd, 0x62, 0x44, 0xb7, 0xbd,
+ 0xd7, 0x66, 0x6c, 0xbd, 0xbb, 0x78, 0xa7, 0x3d, 0xd8, 0x9f, 0x04, 0xbe,
+ 0xc8, 0xc1, 0xa4, 0xbe, 0x65, 0xd2, 0xee, 0xbc, 0xc7, 0xa7, 0x17, 0x3e,
+ 0x42, 0x17, 0x5e, 0x3e, 0x69, 0xf0, 0x9a, 0x3e, 0x3d, 0x3d, 0x4b, 0xbe,
+ 0x4c, 0x35, 0x75, 0x3e, 0xb8, 0x96, 0xf6, 0xbd, 0x83, 0x3b, 0x18, 0xbe,
+ 0x72, 0x59, 0x01, 0xbe, 0x45, 0xc3, 0x5e, 0x3e, 0x3a, 0x43, 0x8f, 0xbd,
+ 0x1e, 0x27, 0xd5, 0xbc, 0xe2, 0x48, 0x36, 0x3e, 0xa4, 0x01, 0x7c, 0xbc,
+ 0xeb, 0xf1, 0x75, 0xbd, 0xc7, 0xcb, 0x4b, 0xbc, 0xf5, 0x03, 0xa1, 0xbb,
+ 0xb4, 0x6f, 0xb7, 0x3d, 0x99, 0x18, 0xa0, 0x3d, 0xc9, 0x2a, 0xef, 0xbd,
+ 0x0a, 0xe4, 0x03, 0xbe, 0x35, 0x92, 0x43, 0x3e, 0xa3, 0x26, 0x44, 0x3e,
+ 0x74, 0xe2, 0x9a, 0xbd, 0x79, 0x73, 0x3e, 0xbe, 0x93, 0x77, 0x4d, 0xbe,
+ 0x24, 0xc8, 0x72, 0xbd, 0xc9, 0x60, 0x01, 0xbe, 0x10, 0xe3, 0x62, 0xbd,
+ 0xeb, 0xd1, 0xc7, 0x3d, 0x0f, 0xe2, 0x76, 0xbd, 0x66, 0x81, 0x1c, 0x3e,
+ 0xe1, 0x6f, 0x94, 0xbd, 0xb5, 0x8b, 0x24, 0xbe, 0x05, 0x2a, 0xa7, 0xbd,
+ 0xa8, 0x15, 0x41, 0xbd, 0x04, 0xa8, 0x2f, 0x3d, 0xf1, 0xc5, 0x90, 0x3e,
+ 0x26, 0xcc, 0x1d, 0x3e, 0xe8, 0x0d, 0x6e, 0x3e, 0xdf, 0x7e, 0x94, 0xbe,
+ 0x73, 0xce, 0xef, 0x3d, 0xa7, 0x04, 0x2d, 0x3e, 0xee, 0x42, 0xf7, 0x3a,
+ 0xe5, 0xbc, 0xd0, 0x3c, 0xdd, 0x9d, 0x02, 0xbf, 0x08, 0x53, 0x85, 0xbd,
+ 0xae, 0x58, 0xaa, 0xbd, 0xde, 0x7c, 0xf4, 0x3d, 0x22, 0x0c, 0x82, 0x3e,
+ 0xbd, 0x5d, 0x98, 0x3d, 0x53, 0x5d, 0x95, 0x3d, 0xc6, 0xe1, 0xb9, 0xbd,
+ 0x39, 0x11, 0x87, 0x3d, 0xaa, 0x43, 0x7c, 0x3d, 0x97, 0x8b, 0x6f, 0xbe,
+ 0x5d, 0xd5, 0x42, 0xbc, 0x92, 0x1d, 0xf3, 0x3d, 0xbd, 0xa9, 0xbd, 0xbb,
+ 0xd0, 0x71, 0xed, 0xbd, 0x0f, 0x95, 0x6f, 0xbe, 0x44, 0x6f, 0x1f, 0x3e,
+ 0xce, 0xc9, 0x13, 0xbc, 0x11, 0x13, 0xaf, 0x3e, 0x8d, 0x17, 0x1b, 0xbd,
+ 0x59, 0x82, 0x0e, 0x3d, 0x52, 0x4f, 0x35, 0x3e, 0xee, 0xf6, 0x8a, 0xbe,
+ 0x00, 0x9c, 0xa0, 0x3d, 0x10, 0x50, 0xbd, 0xbd, 0x39, 0xf0, 0xfd, 0xbc,
+ 0x03, 0x18, 0xe9, 0xbd, 0xfc, 0xbc, 0xb7, 0xbd, 0x9e, 0x5b, 0x2a, 0x3e,
+ 0xed, 0xf8, 0xa7, 0xbd, 0xb1, 0x14, 0x05, 0x3d, 0xd7, 0x7f, 0xac, 0x3b,
+ 0x7f, 0x50, 0x2a, 0x3e, 0xb0, 0xa8, 0x9b, 0xbd, 0x19, 0x14, 0x36, 0x3e,
+ 0xbe, 0xa3, 0x06, 0x3e, 0xff, 0x4a, 0x89, 0xbd, 0xd6, 0x20, 0x09, 0xbe,
+ 0xd1, 0x53, 0x16, 0x3c, 0x89, 0x25, 0x54, 0x3d, 0x9d, 0x2e, 0xa1, 0x3e,
+ 0x9a, 0x23, 0x54, 0xbe, 0x3b, 0x4f, 0xf6, 0x3d, 0xbe, 0xb8, 0x61, 0x3e,
+ 0xa3, 0xb4, 0x37, 0xbe, 0x20, 0x12, 0x1a, 0x3e, 0x43, 0x68, 0xdc, 0xbd,
+ 0xf2, 0xe3, 0x17, 0xbe, 0xf2, 0x32, 0xb7, 0x3d, 0x4f, 0x00, 0x95, 0x3d,
+ 0xc6, 0xcb, 0x66, 0xbe, 0x5f, 0x09, 0xf5, 0x3d, 0xec, 0x24, 0xb5, 0x3c,
+ 0x9d, 0x49, 0xd1, 0xbd, 0x01, 0x87, 0x05, 0xbe, 0xa5, 0xcc, 0x1f, 0xbe,
+ 0x5e, 0x5f, 0x04, 0x3e, 0x52, 0x87, 0x05, 0x3e, 0x7a, 0x07, 0x00, 0x3e,
+ 0xfc, 0x8f, 0xe5, 0x3d, 0xbe, 0x39, 0x87, 0x3c, 0x56, 0x99, 0xb6, 0xbd,
+ 0xda, 0x76, 0x33, 0xbe, 0xe4, 0x19, 0x7b, 0xbc, 0xec, 0x0a, 0x9d, 0xbd,
+ 0x3f, 0x51, 0x33, 0xbd, 0x5d, 0x2e, 0x0d, 0xbe, 0x1b, 0x00, 0x45, 0xbe,
+ 0xd8, 0xde, 0x09, 0x3e, 0xc1, 0x6d, 0xcc, 0x3c, 0xc1, 0x4c, 0x2d, 0x3e,
+ 0x1f, 0xc9, 0xa9, 0xbd, 0x6b, 0x07, 0xeb, 0xbd, 0x8f, 0x63, 0x38, 0x3e,
+ 0x6d, 0x22, 0x82, 0x3d, 0x9c, 0x12, 0x27, 0x3e, 0x87, 0x73, 0xbf, 0x3d,
+ 0x87, 0xcc, 0x7b, 0xbc, 0xc8, 0x1d, 0x0a, 0x3e, 0x24, 0x29, 0x2c, 0x3d,
+ 0xc8, 0x4f, 0xca, 0x3c, 0x5b, 0x0b, 0x0b, 0xbe, 0xc7, 0xef, 0xe7, 0x3d,
+ 0xde, 0x0a, 0x93, 0xbd, 0xd9, 0x50, 0xb0, 0x3d, 0xa5, 0xa3, 0xca, 0x3b,
+ 0x8f, 0xb5, 0x18, 0x3c, 0x25, 0x1d, 0x67, 0x3d, 0x2a, 0xc7, 0xb5, 0xbd,
+ 0xf6, 0x1a, 0x9b, 0xbb, 0xc8, 0x91, 0xba, 0xbc, 0xf7, 0xcb, 0x81, 0xbd,
+ 0xaf, 0x4a, 0xa4, 0xbc, 0xc5, 0x3a, 0x9f, 0x3d, 0x6f, 0x07, 0xc5, 0xbd,
+ 0x28, 0xd5, 0xfd, 0x3c, 0x8c, 0x4c, 0x27, 0x3e, 0x1e, 0x9c, 0x40, 0x3e,
+ 0x0e, 0x7e, 0x67, 0xbe, 0xb6, 0x6e, 0x0c, 0x3e, 0xaa, 0xa6, 0x9e, 0xbe,
+ 0x42, 0x15, 0xf2, 0xbd, 0xc7, 0x54, 0xc9, 0xbc, 0x34, 0x0e, 0x36, 0x3e,
+ 0x3b, 0x58, 0x22, 0xbe, 0xa5, 0xf8, 0x12, 0x3e, 0x95, 0x2c, 0xb8, 0x3d,
+ 0xa5, 0x1f, 0x08, 0xbe, 0x50, 0xd5, 0x5e, 0xbe, 0x4d, 0x4a, 0xeb, 0xbd,
+ 0x12, 0x01, 0x95, 0x3d, 0x12, 0x75, 0x40, 0x3e, 0xe0, 0xf5, 0x16, 0x3d,
+ 0x30, 0x05, 0x30, 0xbd, 0x75, 0xb9, 0x1f, 0x3e, 0x40, 0x54, 0x03, 0x3e,
+ 0x89, 0x44, 0x01, 0x3e, 0xc6, 0xd9, 0x96, 0xbe, 0xd6, 0x73, 0x5c, 0xbe,
+ 0xbb, 0xae, 0x5c, 0xbe, 0xd9, 0x21, 0x0a, 0xbe, 0x67, 0x54, 0xd0, 0xbb,
+ 0xe9, 0xaa, 0x3a, 0x3e, 0xfd, 0x04, 0x77, 0xbe, 0x02, 0x26, 0x46, 0xbe,
+ 0x7e, 0x70, 0x84, 0x3b, 0xe7, 0x54, 0x2f, 0xbd, 0x4d, 0xec, 0xaa, 0x39,
+ 0xec, 0x36, 0x17, 0x3e, 0xe4, 0x97, 0xe4, 0x3d, 0x57, 0x01, 0xcf, 0xbc,
+ 0x82, 0xb5, 0x2e, 0xbe, 0x82, 0x68, 0x87, 0x3d, 0xe1, 0x25, 0x93, 0xbe,
+ 0x52, 0xd3, 0x26, 0x3e, 0x95, 0xab, 0x5b, 0xbd, 0xb9, 0x2f, 0xac, 0xbd,
+ 0xf8, 0xed, 0x09, 0x3e, 0x85, 0x2c, 0xf2, 0xbd, 0x1e, 0x81, 0xb0, 0xbd,
+ 0x6d, 0x1c, 0x0f, 0xbd, 0x4d, 0x45, 0x8e, 0xbd, 0x1a, 0x35, 0xc8, 0x3c,
+ 0x2b, 0x7c, 0xf9, 0xbd, 0x46, 0x0b, 0x34, 0x3c, 0x06, 0x55, 0xd4, 0x3d,
+ 0x29, 0x24, 0xf3, 0xbd, 0xa7, 0x5a, 0x3d, 0x3e, 0x35, 0x5d, 0xaf, 0xbc,
+ 0xcd, 0x79, 0x45, 0xbe, 0x7b, 0x4e, 0x83, 0xbe, 0x8e, 0xe0, 0x6f, 0x3c,
+ 0xea, 0xe5, 0xe8, 0xbd, 0x89, 0x65, 0x24, 0xbd, 0x13, 0x71, 0x1f, 0x3d,
+ 0x19, 0x70, 0xe6, 0x3d, 0x6d, 0x89, 0xeb, 0xbd, 0x80, 0xb8, 0x20, 0xbe,
+ 0xea, 0xac, 0x7b, 0x3e, 0xbe, 0x3b, 0xe9, 0xbc, 0xbd, 0xf5, 0x2c, 0x3d,
+ 0x2b, 0x63, 0x03, 0xbe, 0xab, 0x5c, 0x08, 0xbd, 0xf2, 0x8e, 0x5b, 0x3d,
+ 0x41, 0x84, 0x4d, 0xbe, 0xab, 0x89, 0xc8, 0xbd, 0x1f, 0xaf, 0xd5, 0xbd,
+ 0xb2, 0xb1, 0x4e, 0xbe, 0x7e, 0x0f, 0x52, 0x3e, 0x93, 0x39, 0x39, 0xbe,
+ 0x6b, 0x49, 0x21, 0x3e, 0x3f, 0x93, 0xc7, 0x3c, 0x23, 0x9f, 0x20, 0x3e,
+ 0xa7, 0x58, 0x0d, 0xbe, 0x05, 0xa3, 0x88, 0x3d, 0x8f, 0xaf, 0x95, 0xbd,
+ 0x4c, 0xf3, 0x1f, 0xbe, 0xd2, 0xce, 0x3c, 0xbe, 0x59, 0x20, 0xf2, 0xbd,
+ 0x2a, 0xf3, 0x28, 0x3d, 0xb2, 0xe7, 0xc0, 0xbd, 0xd3, 0x6e, 0x02, 0xbc,
+ 0x08, 0x9f, 0xee, 0xbd, 0xee, 0x10, 0x28, 0x3d, 0x3b, 0x56, 0x11, 0xbe,
+ 0x55, 0x87, 0x45, 0xbe, 0x14, 0x24, 0xcc, 0x3b, 0xb0, 0x22, 0xa2, 0xbd,
+ 0xb5, 0xba, 0xbf, 0x3c, 0x20, 0xc4, 0x2c, 0xbe, 0x96, 0xd5, 0xe0, 0xbd,
+ 0x2b, 0x64, 0xaf, 0xbd, 0x91, 0x6f, 0x98, 0xbe, 0x59, 0x1d, 0x86, 0xbd,
+ 0x1d, 0x76, 0x98, 0x3d, 0x06, 0xe3, 0x6e, 0xbe, 0x3c, 0x0d, 0x98, 0xbc,
+ 0x6a, 0x7d, 0xf1, 0x3c, 0x91, 0x0b, 0x80, 0xb8, 0xf5, 0x88, 0xf8, 0xbd,
+ 0x83, 0x85, 0xbe, 0x3d, 0x64, 0x3c, 0x61, 0x3d, 0x29, 0x09, 0x42, 0xbe,
+ 0x5d, 0xea, 0xb1, 0x3d, 0x42, 0x2d, 0xb8, 0xbc, 0x06, 0xa3, 0x26, 0xbe,
+ 0xfc, 0x54, 0xa0, 0xbb, 0xc8, 0x40, 0xfb, 0xbd, 0x8a, 0x96, 0x3f, 0xbe,
+ 0x44, 0xc3, 0x03, 0x3d, 0xca, 0xed, 0x4c, 0xbe, 0x13, 0xfe, 0x85, 0xbe,
+ 0x95, 0x1d, 0xc4, 0xbd, 0x8c, 0x87, 0x8c, 0xbb, 0xec, 0x05, 0x0c, 0xbe,
+ 0x25, 0x73, 0x7c, 0x3d, 0xf7, 0xd5, 0x9c, 0xbe, 0x87, 0x9e, 0x7a, 0xbe,
+ 0x15, 0x4a, 0x48, 0x3e, 0x4d, 0x96, 0xe8, 0xbd, 0xdb, 0x83, 0xae, 0x3c,
+ 0xe9, 0xbd, 0x7d, 0x3d, 0x92, 0x31, 0x36, 0x3e, 0x4e, 0x49, 0x80, 0x3d,
+ 0x1e, 0x50, 0x17, 0x3c, 0x60, 0x8c, 0x43, 0xbe, 0x0f, 0xdf, 0x3b, 0x3e,
+ 0x20, 0xbb, 0x62, 0x3e, 0xf9, 0xde, 0x0d, 0x3e, 0xad, 0xeb, 0x1c, 0x3d,
+ 0x3f, 0x6f, 0x28, 0xbd, 0xd1, 0xc6, 0x59, 0xbe, 0xc6, 0x13, 0xb5, 0x3d,
+ 0xe4, 0x3a, 0xe6, 0xbd, 0xd6, 0x79, 0x1a, 0x3d, 0x6d, 0xfc, 0xb6, 0xbe,
+ 0xef, 0x08, 0x1b, 0x3e, 0x6a, 0x24, 0x48, 0x3d, 0x48, 0x90, 0xdd, 0xbd,
+ 0x6e, 0xdb, 0x9e, 0x39, 0xf4, 0xd6, 0xf0, 0x3d, 0x4f, 0x3d, 0xac, 0x3d,
+ 0xc4, 0x4a, 0xe7, 0xbd, 0xb3, 0x27, 0xdb, 0x3c, 0xad, 0x6a, 0xf6, 0x3d,
+ 0x3c, 0x20, 0x3a, 0x3e, 0x25, 0x37, 0x13, 0x3c, 0x89, 0x31, 0x10, 0x3e,
+ 0x98, 0x0e, 0xa9, 0x3d, 0x0c, 0x69, 0xda, 0xbd, 0x21, 0x52, 0x79, 0xba,
+ 0xb8, 0xa2, 0x0d, 0xbc, 0xb9, 0x35, 0x44, 0xbe, 0x25, 0x56, 0xa8, 0x3d,
+ 0x90, 0xc2, 0x34, 0xbe, 0x4e, 0x76, 0x81, 0xbd, 0x46, 0x6c, 0x52, 0x3e,
+ 0x26, 0x27, 0xca, 0xbc, 0xb4, 0x52, 0x53, 0x3e, 0x67, 0x8d, 0x35, 0xbc,
+ 0xdd, 0xd5, 0x62, 0xbe, 0x55, 0x69, 0xaa, 0x3d, 0x04, 0x0f, 0x3c, 0x3d,
+ 0x22, 0xaf, 0x0b, 0xbe, 0x0a, 0x19, 0x7a, 0xbc, 0x13, 0x3c, 0xd0, 0x3d,
+ 0x6b, 0xe6, 0x1e, 0x3e, 0x70, 0xbd, 0x04, 0x3e, 0xef, 0x9a, 0x82, 0x3e,
+ 0x90, 0x74, 0xb0, 0x3d, 0xce, 0x80, 0x37, 0x3e, 0x4d, 0x52, 0x2e, 0x3d,
+ 0xea, 0xcb, 0xb9, 0x3c, 0xb0, 0x05, 0x0a, 0xbe, 0xde, 0xca, 0x18, 0x3e,
+ 0x5b, 0x91, 0x21, 0xbe, 0x54, 0xe3, 0x29, 0x3d, 0x1c, 0x4f, 0x17, 0xbe,
+ 0xdf, 0x5e, 0xab, 0x3d, 0x36, 0xec, 0x30, 0x3e, 0x3a, 0x06, 0x0e, 0x3e,
+ 0x2e, 0xef, 0x0d, 0x3e, 0x43, 0x37, 0x37, 0xbe, 0x30, 0xe5, 0x2f, 0xbe,
+ 0x70, 0xfc, 0x81, 0x3d, 0xe3, 0x57, 0xce, 0x3d, 0x1f, 0x05, 0x8a, 0x3d,
+ 0x88, 0x7a, 0xc5, 0x3d, 0x37, 0x36, 0x05, 0xbe, 0xc8, 0x83, 0x20, 0x3e,
+ 0xae, 0x3a, 0x72, 0xbe, 0x8f, 0x38, 0xd8, 0xbc, 0x50, 0x57, 0x2b, 0xbe,
+ 0xd5, 0x67, 0x6f, 0xbd, 0xa5, 0xc9, 0xf7, 0xbd, 0x2e, 0x52, 0x3b, 0xbe,
+ 0x10, 0xe0, 0xda, 0x3d, 0x4c, 0x8f, 0xda, 0xbd, 0xe0, 0x92, 0x38, 0xbb,
+ 0x42, 0xc2, 0x9b, 0xbc, 0x53, 0xea, 0xc5, 0x3a, 0x4f, 0x2f, 0x5b, 0x3c,
+ 0xaa, 0xc8, 0xf2, 0xbb, 0x98, 0xb4, 0x31, 0xbb, 0x5a, 0x5d, 0x22, 0xbe,
+ 0xc8, 0x0a, 0x99, 0xbb, 0x49, 0x08, 0x26, 0xbe, 0x85, 0x68, 0xcd, 0x3d,
+ 0xb9, 0x64, 0x51, 0x3d, 0x37, 0x11, 0xc6, 0x3d, 0x7a, 0x25, 0xa8, 0x3c,
+ 0x0b, 0xd7, 0x0d, 0x3e, 0xb3, 0xff, 0xd6, 0x3d, 0x11, 0x58, 0x0e, 0xbe,
+ 0xd5, 0xc1, 0xf6, 0x3d, 0x04, 0x7a, 0x0f, 0x3e, 0x54, 0xc0, 0xaa, 0xbd,
+ 0x93, 0x0f, 0x88, 0x3d, 0x6d, 0x47, 0x58, 0xbe, 0x2f, 0xbb, 0x11, 0xbd,
+ 0x9b, 0xf0, 0x0c, 0x3e, 0xca, 0x27, 0xdd, 0xbd, 0x69, 0xb7, 0x9d, 0x3d,
+ 0x40, 0x80, 0xf3, 0x3d, 0xc3, 0x9d, 0xb3, 0xbd, 0xf9, 0xea, 0x30, 0xbe,
+ 0x19, 0x31, 0x97, 0x3c, 0xda, 0x5f, 0x1f, 0xbe, 0x77, 0xed, 0x76, 0xbd,
+ 0x10, 0xc6, 0x84, 0x3d, 0xc5, 0x83, 0x3c, 0x3d, 0x93, 0xb6, 0x25, 0xbe,
+ 0xc5, 0x6c, 0x74, 0x3d, 0xfa, 0xe9, 0x28, 0x3e, 0xaf, 0xbc, 0x4a, 0x3e,
+ 0x30, 0x33, 0x37, 0xbc, 0x59, 0x07, 0x13, 0xbe, 0x22, 0x97, 0x45, 0xbe,
+ 0x08, 0xba, 0x16, 0xbd, 0x45, 0x6d, 0xed, 0xbd, 0x8b, 0xd9, 0x01, 0x3e,
+ 0xd2, 0xba, 0xa5, 0x3d, 0x35, 0xb0, 0x8a, 0x3d, 0xf9, 0x89, 0x23, 0x3e,
+ 0x8f, 0xe1, 0x72, 0xbd, 0xb8, 0xe1, 0x30, 0x3d, 0x67, 0x7e, 0x3c, 0x3e,
+ 0x56, 0xfc, 0x97, 0x3d, 0xb8, 0xe7, 0xb4, 0x3d, 0x8d, 0xe3, 0xec, 0x3d,
+ 0xbe, 0x13, 0x3f, 0xbe, 0xca, 0xdb, 0x59, 0xbd, 0xde, 0xaa, 0x79, 0x3d,
+ 0x42, 0x6f, 0xe1, 0xbc, 0x08, 0xc1, 0xa2, 0x3d, 0x04, 0x5d, 0xe1, 0xbd,
+ 0xfe, 0x14, 0x9e, 0xbd, 0xe1, 0x72, 0x3d, 0x3d, 0xcd, 0x6a, 0xfc, 0x3a,
+ 0xbd, 0x38, 0xf5, 0xbd, 0x1b, 0x73, 0xb2, 0xbd, 0xe4, 0x88, 0x2a, 0xbe,
+ 0x19, 0x9e, 0x75, 0xbe, 0x79, 0x3e, 0x24, 0xbe, 0xde, 0x6f, 0x00, 0xbe,
+ 0xa1, 0x6f, 0x53, 0x3e, 0x8b, 0x33, 0xa0, 0x3d, 0xf4, 0xf7, 0xb6, 0x3d,
+ 0x89, 0xf7, 0x0c, 0xbe, 0xa5, 0x5e, 0xf7, 0xbd, 0x21, 0x8e, 0x20, 0x3e,
+ 0x65, 0xdf, 0xed, 0x3d, 0xd1, 0xc5, 0x48, 0x3d, 0x46, 0x49, 0xfc, 0xbd,
+ 0xba, 0x16, 0x58, 0xbe, 0x9f, 0xfc, 0x1c, 0xbe, 0x9d, 0x58, 0x01, 0xbe,
+ 0x30, 0x76, 0x39, 0xbe, 0x3f, 0x6c, 0xe8, 0x3d, 0xc8, 0x56, 0xb8, 0xbd,
+ 0xbf, 0x1b, 0x57, 0xbe, 0x23, 0x2a, 0x67, 0x3d, 0xe4, 0x8d, 0x44, 0xbe,
+ 0x69, 0x65, 0x0e, 0x3d, 0xf6, 0xde, 0xf3, 0xbc, 0x67, 0xa7, 0x5f, 0xbd,
+ 0x92, 0xf5, 0xe6, 0xbd, 0xa9, 0x62, 0x30, 0x3d, 0x11, 0xee, 0x6b, 0x3e,
+ 0x5f, 0x6f, 0xe8, 0x3c, 0x70, 0x68, 0xbe, 0x3d, 0x9d, 0xcf, 0x0b, 0x3e,
+ 0xeb, 0x21, 0x28, 0x3d, 0xa9, 0x44, 0x12, 0x3e, 0x45, 0xce, 0x65, 0xbe,
+ 0x3d, 0xd1, 0x80, 0xbe, 0x59, 0xe7, 0x88, 0xbd, 0x82, 0x84, 0xab, 0x3c,
+ 0xc8, 0x6a, 0x76, 0x3d, 0x07, 0x49, 0x16, 0xbe, 0x38, 0x62, 0xe9, 0x3d,
+ 0x0b, 0xe4, 0x1b, 0xbe, 0xc2, 0x1a, 0xb7, 0xbd, 0xa5, 0xbc, 0x06, 0x3d,
+ 0x77, 0x52, 0x87, 0xbe, 0xf6, 0xbf, 0x77, 0xbd, 0x95, 0xcd, 0xe6, 0x3d,
+ 0xa2, 0x6f, 0x43, 0x3e, 0x3f, 0x8f, 0x24, 0x3e, 0x24, 0x4e, 0x3a, 0xbd,
+ 0x22, 0x71, 0x03, 0x3d, 0x26, 0x0f, 0xc9, 0x3d, 0x57, 0x88, 0x5b, 0xbc,
+ 0x39, 0x94, 0x7f, 0xbc, 0x79, 0xaf, 0x28, 0xbe, 0xf5, 0x08, 0x3b, 0x3e,
+ 0x61, 0xd1, 0xfb, 0x3d, 0x20, 0x10, 0x4a, 0x3e, 0x2e, 0x46, 0x1f, 0x3e,
+ 0x55, 0xfa, 0x8e, 0xbd, 0x72, 0x35, 0xb5, 0x3d, 0x49, 0x73, 0x63, 0x3e,
+ 0x6d, 0x97, 0x50, 0xbd, 0x69, 0xeb, 0x4a, 0x3e, 0x32, 0xc7, 0x8f, 0x3d,
+ 0x29, 0xdc, 0x06, 0x3e, 0xba, 0xd1, 0x69, 0xbd, 0xe3, 0x1a, 0xb5, 0x3d,
+ 0x5b, 0x55, 0xee, 0xbe, 0x9c, 0xa3, 0x8f, 0xbd, 0xf5, 0xb8, 0x59, 0x3e,
+ 0xa7, 0x94, 0x5b, 0x3e, 0xac, 0xd4, 0x36, 0x3e, 0x33, 0x2d, 0x60, 0xbd,
+ 0x8e, 0x0c, 0xda, 0x3d, 0x1a, 0xe1, 0x28, 0x3e, 0xc2, 0x3d, 0xfc, 0x3c,
+ 0x15, 0xb4, 0xc8, 0x3d, 0x3d, 0x5f, 0x5e, 0xbd, 0x14, 0xf0, 0xa6, 0x3c,
+ 0x6e, 0x1f, 0x13, 0x3e, 0x2a, 0x0e, 0x78, 0x3e, 0x16, 0xf3, 0x1d, 0xbe,
+ 0x2f, 0x42, 0x13, 0x3e, 0xd1, 0x23, 0x98, 0x3d, 0x32, 0x59, 0x28, 0x3d,
+ 0x50, 0x7e, 0x41, 0xbe, 0xca, 0xdb, 0x52, 0xbe, 0x5f, 0x75, 0xb2, 0xbd,
+ 0x98, 0x8c, 0x84, 0x3d, 0xa7, 0xda, 0x59, 0x3d, 0x4b, 0x49, 0x7f, 0xbe,
+ 0x40, 0xb4, 0x08, 0x3e, 0x27, 0xb2, 0xaf, 0x3e, 0xaf, 0x7f, 0x07, 0x3e,
+ 0xea, 0x19, 0x14, 0x3e, 0xfd, 0x3d, 0x32, 0x3e, 0x72, 0x6c, 0xc0, 0x3d,
+ 0x4e, 0x10, 0xc4, 0xbd, 0x34, 0xf2, 0x66, 0x3e, 0x9a, 0x2a, 0xa3, 0xbc,
+ 0x7a, 0x8d, 0x1f, 0x3d, 0xac, 0xb3, 0x8e, 0x3e, 0x4a, 0x66, 0xe7, 0x3d,
+ 0xec, 0x7e, 0x0b, 0xbe, 0x29, 0xee, 0x1c, 0x3e, 0x45, 0xf5, 0x5c, 0x3e,
+ 0x45, 0x0c, 0x9d, 0xbe, 0x6b, 0x08, 0xe5, 0xbc, 0xff, 0xee, 0x99, 0x3e,
+ 0xce, 0xaa, 0x73, 0xbe, 0x3b, 0x7a, 0xec, 0xbb, 0xa1, 0xdb, 0x13, 0xbe,
+ 0x7c, 0x76, 0xbb, 0x3d, 0x69, 0xb7, 0x17, 0x3e, 0x21, 0x0e, 0xda, 0x3d,
+ 0x3c, 0x69, 0xe7, 0xbd, 0xc6, 0xab, 0x23, 0xbe, 0x2c, 0xfd, 0xfd, 0x3d,
+ 0xb6, 0xcc, 0x74, 0xbe, 0xe9, 0xa1, 0x45, 0xbe, 0x81, 0xda, 0x97, 0xbb,
+ 0x65, 0x91, 0x69, 0x3d, 0xa8, 0x63, 0xf7, 0xbd, 0xf6, 0xe3, 0xb3, 0x3d,
+ 0xf6, 0xe9, 0x0e, 0x3e, 0xf5, 0x5b, 0x77, 0xbc, 0xf9, 0x87, 0x41, 0x3e,
+ 0x4e, 0x28, 0x1d, 0x3e, 0xa4, 0x4c, 0x02, 0x3e, 0x0a, 0xd3, 0x37, 0xbe,
+ 0x57, 0xf8, 0x09, 0x3e, 0xf6, 0x2b, 0x81, 0xbd, 0x20, 0x43, 0x0a, 0x3e,
+ 0xbd, 0xee, 0x36, 0xbe, 0xac, 0x7a, 0x08, 0x3d, 0xa7, 0xdf, 0xa3, 0x3e,
+ 0x15, 0xcb, 0xef, 0xbd, 0x1f, 0xbc, 0x3f, 0xbd, 0x3a, 0x6c, 0x62, 0x3e,
+ 0x41, 0xd1, 0x17, 0xbe, 0xc5, 0x84, 0x2e, 0x3e, 0x6d, 0x1d, 0x59, 0xbd,
+ 0x8d, 0x1a, 0x15, 0x3d, 0xd4, 0xbc, 0xb1, 0x3c, 0xcd, 0x41, 0x6b, 0x3d,
+ 0x3d, 0x93, 0x89, 0xbd, 0x54, 0xc5, 0x4d, 0xbc, 0x94, 0xcf, 0x42, 0xbe,
+ 0x12, 0x98, 0x3d, 0xbe, 0xc5, 0x0b, 0xb9, 0xbd, 0xff, 0xd2, 0x88, 0xbe,
+ 0x93, 0x71, 0xf1, 0x3d, 0x80, 0xae, 0x02, 0xbe, 0x21, 0x62, 0xce, 0xbd,
+ 0xa4, 0x21, 0x1c, 0xbe, 0xac, 0x9c, 0x10, 0xbe, 0x8e, 0xcb, 0x7b, 0xbd,
+ 0x69, 0x0b, 0x94, 0x3c, 0xce, 0x36, 0xa5, 0xbd, 0x4b, 0xbc, 0x93, 0x3d,
+ 0xca, 0x49, 0x1a, 0x3e, 0xa3, 0x21, 0xbf, 0x3c, 0xbb, 0xcb, 0xb5, 0xbd,
+ 0xee, 0xea, 0xee, 0xbd, 0x26, 0xe3, 0xea, 0x3d, 0x55, 0x88, 0x07, 0xbd,
+ 0x4a, 0x2e, 0x2e, 0xbe, 0x4b, 0x56, 0x20, 0x3e, 0xbd, 0xf6, 0x96, 0xbd,
+ 0x77, 0xf8, 0x8d, 0x3c, 0x53, 0x74, 0x29, 0xbe, 0x9a, 0xec, 0x13, 0xbe,
+ 0x68, 0xb0, 0x8c, 0x3d, 0xe2, 0x73, 0xf7, 0x3d, 0x09, 0x1f, 0xdc, 0xbd,
+ 0x41, 0x89, 0x9e, 0xbd, 0x1e, 0xe0, 0x02, 0x3e, 0x06, 0x60, 0xf9, 0x3d,
+ 0x5b, 0x15, 0x00, 0xbe, 0xa1, 0x94, 0xdf, 0xbc, 0x97, 0xa7, 0x98, 0xba,
+ 0x45, 0xb8, 0x2a, 0x3e, 0xac, 0x93, 0xc2, 0x3d, 0x1c, 0x5d, 0x31, 0xbe,
+ 0xec, 0xd5, 0x1d, 0x3e, 0x3d, 0x93, 0x02, 0x3e, 0xfd, 0x7a, 0xa0, 0x3d,
+ 0x9f, 0x8d, 0xe8, 0x3d, 0x12, 0xcb, 0xb2, 0x3e, 0x7c, 0x7d, 0x8f, 0x3d,
+ 0x31, 0x28, 0x42, 0xbd, 0x72, 0xf9, 0xbf, 0x3c, 0xbc, 0x2b, 0x39, 0x3d,
+ 0x5a, 0x3b, 0x19, 0x3e, 0x44, 0xf7, 0x23, 0x3e, 0x01, 0xf0, 0x72, 0xbd,
+ 0xe5, 0x9e, 0x7b, 0xbd, 0xe7, 0x8e, 0xa8, 0xbd, 0x37, 0x12, 0x00, 0xbe,
+ 0x7a, 0x25, 0x83, 0xbd, 0x17, 0xe2, 0x82, 0xbc, 0x05, 0x93, 0x80, 0xbd,
+ 0x26, 0x07, 0x95, 0xbd, 0x8b, 0xbd, 0xf9, 0xbb, 0x10, 0xe8, 0xd1, 0x3d,
+ 0xc0, 0x02, 0x0c, 0x3e, 0x15, 0x18, 0x45, 0x3e, 0x39, 0xe8, 0x18, 0xbe,
+ 0x83, 0xc3, 0x2f, 0xbc, 0xee, 0x01, 0x27, 0x3e, 0x2c, 0xb9, 0xcd, 0x3c,
+ 0xd4, 0x07, 0x84, 0x3d, 0x76, 0x6c, 0xc3, 0xbd, 0xb2, 0xa3, 0xcc, 0x3c,
+ 0x3b, 0x96, 0x05, 0x3e, 0x6c, 0x13, 0x3f, 0x3e, 0xeb, 0x7b, 0xd0, 0xbc,
+ 0xcb, 0xd3, 0x0f, 0xbd, 0x70, 0xc9, 0x97, 0xbd, 0xb2, 0x09, 0x9d, 0xbd,
+ 0xd9, 0xd8, 0xaa, 0xbb, 0xc5, 0x1f, 0x50, 0x3d, 0xc7, 0x1a, 0x8e, 0x3c,
+ 0xb6, 0xdb, 0xa2, 0x3d, 0x60, 0x94, 0xb4, 0xbe, 0xd8, 0xd8, 0x6d, 0x3e,
+ 0xfe, 0x15, 0x73, 0x3e, 0x6e, 0x19, 0x77, 0xbe, 0x09, 0xb8, 0x68, 0x3c,
+ 0xcf, 0xc2, 0x44, 0xbe, 0x5f, 0x37, 0x65, 0xbe, 0x1f, 0x7d, 0x86, 0x3d,
+ 0xb6, 0xee, 0xca, 0x3d, 0x1c, 0x47, 0x9d, 0x3c, 0x38, 0x00, 0xd1, 0x3d,
+ 0x8c, 0x1d, 0xc8, 0xbc, 0x58, 0xf5, 0xd7, 0xbd, 0xfe, 0xdf, 0x67, 0xbe,
+ 0xb3, 0x2f, 0x5e, 0x3e, 0xe5, 0x6c, 0x79, 0x3b, 0x02, 0x94, 0xdd, 0xba,
+ 0xe3, 0xb2, 0x19, 0x3e, 0x19, 0x43, 0x59, 0xbe, 0xa6, 0xae, 0x66, 0xbe,
+ 0xa2, 0x03, 0x48, 0x3e, 0x0b, 0x91, 0x6e, 0x3d, 0x2c, 0xe1, 0x44, 0x3d,
+ 0x48, 0x37, 0x18, 0x3e, 0x4d, 0x0c, 0x5a, 0xbb, 0xc0, 0xa3, 0x0c, 0x3e,
+ 0x0a, 0x0a, 0x04, 0xbd, 0x83, 0x92, 0x01, 0xbe, 0x51, 0xea, 0x0e, 0x3d,
+ 0x0b, 0x7e, 0x10, 0x3e, 0x6d, 0xe4, 0x5c, 0x3e, 0x09, 0xb0, 0x5e, 0x3d,
+ 0x81, 0x06, 0xd1, 0xbd, 0xdb, 0xda, 0x20, 0xbe, 0xdf, 0xcf, 0x8d, 0x3e,
+ 0x09, 0x1b, 0x30, 0x3e, 0x43, 0xaf, 0x8f, 0xbd, 0x0b, 0x88, 0x25, 0x3d,
+ 0x26, 0x31, 0x52, 0x3d, 0xc9, 0x68, 0x97, 0xbc, 0xd6, 0x2d, 0xaa, 0x3d,
+ 0xf2, 0x7d, 0xa1, 0x3d, 0x0d, 0x19, 0x16, 0x3e, 0xe8, 0xfd, 0xb4, 0xbd,
+ 0x36, 0xd4, 0xd3, 0x3d, 0xf1, 0x5f, 0xa5, 0x3d, 0xc4, 0x83, 0x9f, 0x3c,
+ 0x46, 0x18, 0x07, 0xbd, 0x11, 0x78, 0x08, 0xbe, 0x7b, 0x0c, 0x41, 0xbe,
+ 0xd1, 0x5d, 0x46, 0xbd, 0x8d, 0x87, 0x98, 0xbb, 0x0b, 0xa1, 0xa3, 0x3c,
+ 0xbe, 0x5d, 0x22, 0x3c, 0x34, 0xf3, 0xa4, 0xbc, 0xe1, 0x6c, 0x6f, 0xbd,
+ 0xa6, 0x59, 0x5e, 0xbe, 0x48, 0xcb, 0x3a, 0xbe, 0x0c, 0xc9, 0x09, 0xbe,
+ 0x1d, 0xa4, 0x8e, 0xbd, 0x9b, 0x13, 0x86, 0xbd, 0xb1, 0x18, 0x30, 0x3d,
+ 0x49, 0xb9, 0xa4, 0x3c, 0x32, 0x38, 0xb5, 0x3d, 0xe8, 0x0c, 0x92, 0x3d,
+ 0x1d, 0x4a, 0x0a, 0xbe, 0xb2, 0x1b, 0xfc, 0x3d, 0xbf, 0x40, 0x26, 0x3c,
+ 0xfc, 0xc4, 0x71, 0xbe, 0xf0, 0x29, 0x3e, 0xbe, 0xa5, 0x2f, 0x2a, 0x3d,
+ 0x12, 0xe1, 0x89, 0xbd, 0x1e, 0xdb, 0x06, 0x3e, 0xfd, 0x15, 0x13, 0xbd,
+ 0xf8, 0x77, 0x1e, 0xbd, 0x8f, 0xb0, 0x21, 0xbe, 0x8a, 0xef, 0x40, 0xbc,
+ 0x04, 0x1a, 0x51, 0xbd, 0x84, 0xa6, 0x05, 0xbe, 0xe3, 0xa4, 0xf3, 0xbd,
+ 0x41, 0x8f, 0x86, 0xbd, 0xee, 0xaf, 0x97, 0x3d, 0xfa, 0x2b, 0x57, 0xbe,
+ 0x4e, 0x43, 0x0d, 0xbd, 0xee, 0x99, 0x68, 0xbd, 0xff, 0x55, 0x13, 0x3e,
+ 0xb6, 0x26, 0xca, 0x3c, 0xe0, 0xa1, 0x89, 0x3d, 0x53, 0x47, 0xba, 0x3c,
+ 0x59, 0x9c, 0xd6, 0xbd, 0xbe, 0x8c, 0x35, 0xbe, 0x34, 0x42, 0x3a, 0xbe,
+ 0x5e, 0xbf, 0x45, 0x3c, 0x07, 0x7f, 0x8b, 0xbc, 0xae, 0x88, 0x69, 0xbd,
+ 0xf9, 0x5a, 0x3d, 0xbe, 0x72, 0x05, 0x02, 0xbe, 0x5c, 0x68, 0x54, 0x3c,
+ 0x55, 0x97, 0x09, 0x3e, 0xb1, 0x0a, 0x95, 0xbd, 0xc1, 0x18, 0x0e, 0x3e,
+ 0x29, 0x12, 0xff, 0x3d, 0x4c, 0x05, 0xd8, 0xbd, 0x7d, 0x0b, 0x07, 0x3e,
+ 0x22, 0x44, 0x1e, 0xbe, 0xb1, 0x74, 0x5d, 0x3e, 0xfb, 0xa6, 0x9f, 0x3d,
+ 0x43, 0x61, 0x38, 0xbe, 0xb6, 0x0e, 0x77, 0xbd, 0x50, 0x7e, 0x94, 0xbe,
+ 0x8f, 0x6f, 0xdd, 0xbd, 0xb2, 0x43, 0x14, 0xbe, 0x7e, 0x33, 0x44, 0x3e,
+ 0xda, 0x23, 0x3f, 0xbd, 0x34, 0x54, 0x88, 0xbb, 0xcc, 0x10, 0x02, 0xbe,
+ 0x89, 0x02, 0x3d, 0x3d, 0xdf, 0x56, 0x00, 0xbe, 0xf0, 0xfc, 0xd5, 0x3d,
+ 0x66, 0xc7, 0xc8, 0x3d, 0x2a, 0x00, 0xda, 0x3d, 0xf3, 0x75, 0x0b, 0x3e,
+ 0x43, 0x41, 0x9d, 0x3e, 0xf8, 0x6f, 0x73, 0xbc, 0x40, 0x6f, 0xa4, 0xbd,
+ 0xae, 0xb4, 0x25, 0x3e, 0x84, 0x23, 0x66, 0x3e, 0xf0, 0x57, 0x17, 0xbe,
+ 0x7d, 0xd3, 0x9e, 0x3d, 0x3f, 0x32, 0x8c, 0xbe, 0xa1, 0x34, 0x2b, 0x3d,
+ 0x5e, 0xb4, 0xee, 0xbd, 0x9c, 0x42, 0x8e, 0xbd, 0xef, 0x51, 0x03, 0x3e,
+ 0xfc, 0xee, 0x76, 0xbd, 0x4f, 0x52, 0xf9, 0x3d, 0xa2, 0xca, 0x1a, 0xbd,
+ 0x6c, 0x19, 0xaf, 0x3d, 0xe2, 0xfc, 0x81, 0xbe, 0xf2, 0x6c, 0x02, 0x3e,
+ 0xe0, 0x57, 0x20, 0xbe, 0x20, 0x8c, 0xe6, 0xbd, 0xd3, 0x94, 0x5b, 0x3e,
+ 0x8a, 0xd5, 0x89, 0x3e, 0xce, 0x04, 0x0d, 0xbe, 0x4c, 0x99, 0x15, 0x3e,
+ 0xa9, 0xb3, 0x30, 0x3e, 0x66, 0x2a, 0x05, 0xbe, 0x78, 0x87, 0x18, 0xbd,
+ 0x00, 0x28, 0x0f, 0x3e, 0xe3, 0xf4, 0xa1, 0xbd, 0x2f, 0x6a, 0x72, 0x3d,
+ 0xc1, 0x42, 0x2e, 0x3e, 0xf7, 0xd1, 0xbc, 0xbd, 0x86, 0x2c, 0x22, 0xbe,
+ 0x89, 0x8a, 0x83, 0x3e, 0xa1, 0x59, 0x65, 0x3e, 0x08, 0xf5, 0xd0, 0xbd,
+ 0xf5, 0x2e, 0xeb, 0xbc, 0x32, 0x06, 0x2d, 0xbd, 0x1a, 0x39, 0x3a, 0x3e,
+ 0x74, 0xf4, 0x44, 0xbc, 0x59, 0x28, 0x5e, 0x3e, 0xee, 0x72, 0xce, 0x3d,
+ 0x0b, 0xaf, 0x30, 0xbe, 0xfe, 0x7c, 0x31, 0x3d, 0x53, 0x01, 0x19, 0x3e,
+ 0x42, 0x7c, 0xb3, 0xbe, 0xb5, 0xda, 0x11, 0x3d, 0x5b, 0x30, 0x73, 0x3d,
+ 0x7e, 0x31, 0x7f, 0xbe, 0x14, 0x56, 0xbb, 0x3d, 0xee, 0x57, 0xcc, 0xbd,
+ 0x43, 0x34, 0x87, 0x3e, 0xb2, 0x81, 0x1c, 0xbd, 0x47, 0xd0, 0x18, 0xbe,
+ 0x1a, 0x02, 0x21, 0x3e, 0xd1, 0x39, 0x85, 0x3b, 0x28, 0x0d, 0x9e, 0xbe,
+ 0x23, 0xfa, 0x65, 0x3e, 0x65, 0x77, 0x30, 0xbe, 0xcd, 0x1b, 0x82, 0x3c,
+ 0x26, 0xe5, 0x71, 0x3c, 0xb8, 0x5e, 0xb6, 0x3b, 0xe3, 0x0a, 0xb7, 0x3e,
+ 0x55, 0x41, 0x1c, 0x3e, 0x98, 0x15, 0xf2, 0x3d, 0xe2, 0xe3, 0x36, 0xbe,
+ 0x60, 0x1a, 0x49, 0xbe, 0xe2, 0xf7, 0x65, 0xbe, 0xe8, 0xd6, 0x1a, 0x3f,
+ 0xba, 0x17, 0x30, 0x3d, 0x0c, 0x5c, 0x43, 0xbe, 0x51, 0x09, 0x72, 0xbd,
+ 0x33, 0x09, 0x37, 0xbe, 0xd9, 0xd5, 0x32, 0x3e, 0xd5, 0xd9, 0x94, 0xbd,
+ 0xbe, 0x6e, 0x84, 0xbe, 0x50, 0x36, 0x1e, 0x3e, 0x61, 0x35, 0xc5, 0xbc,
+ 0x01, 0x50, 0x9e, 0x3e, 0x6d, 0xe7, 0x9d, 0xbc, 0x52, 0x58, 0xe5, 0xbc,
+ 0xef, 0x6a, 0x44, 0xbc, 0xef, 0xa9, 0x0b, 0xbe, 0x52, 0xcd, 0x0c, 0x3e,
+ 0x10, 0x9c, 0xfe, 0x3d, 0x82, 0x0c, 0x82, 0x3e, 0xd0, 0x6b, 0xb4, 0xbd,
+ 0x61, 0x0a, 0x25, 0xbe, 0x41, 0x8e, 0x6d, 0x3d, 0x3f, 0x2e, 0x48, 0x3e,
+ 0x8c, 0xbb, 0x00, 0xbe, 0xbf, 0xfc, 0x27, 0xbe, 0xea, 0xd6, 0x19, 0xbd,
+ 0xfe, 0xef, 0x68, 0x3e, 0xc4, 0xa2, 0x29, 0x3e, 0x50, 0x1e, 0x51, 0xbc,
+ 0xf5, 0x5a, 0x35, 0x3e, 0x91, 0x4f, 0x81, 0xbe, 0x3f, 0xf9, 0x5e, 0xbe,
+ 0xbe, 0xbc, 0xd7, 0xbd, 0xae, 0xfe, 0x62, 0x3e, 0xf7, 0xcb, 0xfd, 0x3d,
+ 0x14, 0x40, 0x2d, 0xbe, 0x1c, 0xcc, 0xc2, 0xbd, 0x36, 0xac, 0xc5, 0x3d,
+ 0xfd, 0xac, 0x20, 0xbd, 0xd5, 0xf5, 0x4f, 0xbd, 0xd0, 0xe8, 0x5a, 0xbd,
+ 0x91, 0x6b, 0x2c, 0x3d, 0xef, 0xc8, 0x1a, 0xbe, 0x0b, 0x3c, 0x51, 0xbd,
+ 0x81, 0xb2, 0x2b, 0xbe, 0xd1, 0x0f, 0x18, 0x3e, 0xeb, 0x52, 0xef, 0xbd,
+ 0x98, 0x91, 0x0e, 0x3e, 0x6f, 0x8d, 0x3c, 0xbe, 0x4b, 0xa8, 0xf9, 0xbd,
+ 0x9c, 0x8d, 0xeb, 0x3d, 0x43, 0x86, 0x45, 0xbe, 0xa1, 0xb2, 0xa5, 0x3d,
+ 0x1f, 0xc1, 0x2f, 0x3e, 0xb4, 0x63, 0x0e, 0xbe, 0xa4, 0xe6, 0xbf, 0x3d,
+ 0xd9, 0x3a, 0x4c, 0xbd, 0x57, 0x3f, 0x3b, 0xbd, 0x0a, 0x62, 0x28, 0x3d,
+ 0x30, 0xf2, 0x11, 0xbe, 0x37, 0x46, 0x6a, 0xbb, 0x15, 0x74, 0x02, 0xbd,
+ 0x5f, 0x8c, 0x12, 0x3d, 0x7c, 0x5c, 0xe3, 0x3d, 0x74, 0xdc, 0x94, 0x3d,
+ 0xa3, 0xe9, 0x35, 0xbe, 0xd4, 0x31, 0xcf, 0xbb, 0x3b, 0xc4, 0x8f, 0x3c,
+ 0x4a, 0x15, 0x33, 0xbd, 0x89, 0x68, 0xc5, 0x3d, 0xdb, 0x2d, 0x03, 0x3e,
+ 0x6a, 0x68, 0xc2, 0x3d, 0x7a, 0x4c, 0x84, 0x3d, 0x6a, 0xd2, 0x41, 0xbe,
+ 0x95, 0x69, 0xe0, 0x3d, 0x46, 0x2a, 0x33, 0x3e, 0x67, 0x92, 0x2b, 0xbe,
+ 0x14, 0xce, 0xb5, 0xbd, 0x7d, 0x55, 0x32, 0x3b, 0xa6, 0xde, 0xfa, 0xbd,
+ 0x38, 0xb2, 0x09, 0x3d, 0xb4, 0x83, 0x3a, 0x3e, 0xe9, 0x4a, 0xa8, 0x3c,
+ 0x41, 0x16, 0x6c, 0x3d, 0x0a, 0x99, 0x02, 0xbe, 0xfd, 0x2f, 0x17, 0x3d,
+ 0x64, 0xb8, 0x64, 0xbe, 0x5b, 0x67, 0x29, 0xbe, 0x26, 0xc1, 0xba, 0xbc,
+ 0xef, 0x59, 0x3a, 0x3d, 0xb6, 0xe0, 0x18, 0xbe, 0x9b, 0xdb, 0xc4, 0xbd,
+ 0xc9, 0x9d, 0x3b, 0x3e, 0xaf, 0xac, 0x45, 0x3e, 0x32, 0xc6, 0xec, 0xbd,
+ 0x23, 0xfd, 0x01, 0xbe, 0x5e, 0x60, 0x0c, 0xbe, 0x09, 0xe5, 0xc8, 0xbd,
+ 0xe6, 0x7a, 0xeb, 0xbd, 0x47, 0x0f, 0x32, 0xbd, 0x53, 0x85, 0xce, 0x3c,
+ 0x9b, 0xa2, 0x6c, 0x3e, 0x5b, 0x7f, 0x67, 0x3e, 0x9a, 0x1f, 0xfb, 0x3d,
+ 0x6b, 0x77, 0x28, 0x3e, 0x35, 0x50, 0x81, 0x3c, 0x02, 0xb4, 0x6c, 0xbd,
+ 0x4f, 0x3c, 0x5a, 0x3e, 0xf0, 0x33, 0x47, 0x3d, 0x47, 0x6e, 0x2d, 0x3e,
+ 0x0c, 0x62, 0x39, 0x3e, 0x41, 0xda, 0x1d, 0xbe, 0xa3, 0x39, 0x3b, 0xbe,
+ 0x88, 0x07, 0x4b, 0xbd, 0x2a, 0x92, 0x20, 0xbe, 0x81, 0xf3, 0x1c, 0x3e,
+ 0x88, 0x50, 0x14, 0xbe, 0xbd, 0x68, 0xad, 0x3d, 0xf9, 0x3d, 0x57, 0x3d,
+ 0x34, 0xdc, 0x25, 0xbe, 0x18, 0x54, 0x12, 0xbf, 0x5d, 0x1c, 0x3d, 0xbd,
+ 0x47, 0x44, 0x9c, 0x3d, 0x8e, 0xf5, 0xbe, 0xbd, 0x2f, 0x4c, 0xdb, 0x3d,
+ 0x6a, 0x2b, 0x03, 0xbe, 0x62, 0x1d, 0xae, 0x3d, 0x27, 0x19, 0xd6, 0x3d,
+ 0x6c, 0xce, 0x87, 0x3c, 0xed, 0x44, 0x07, 0xbe, 0xfa, 0x12, 0x11, 0x3e,
+ 0x43, 0xcb, 0x4d, 0xbe, 0x40, 0xf9, 0xcb, 0xbe, 0xb3, 0x59, 0x9f, 0x3b,
+ 0x91, 0x05, 0xa1, 0x3d, 0x45, 0x48, 0xfd, 0xbd, 0x69, 0xba, 0x6f, 0xbc,
+ 0xc5, 0x33, 0x16, 0xbe, 0x14, 0x22, 0x41, 0xbe, 0x73, 0x9c, 0x0b, 0xbe,
+ 0x8c, 0x76, 0xcb, 0x3d, 0x4b, 0x8a, 0x85, 0x3d, 0x85, 0x42, 0x3f, 0xbe,
+ 0x85, 0xc0, 0x8b, 0x3e, 0xb2, 0x9f, 0xb2, 0x3d, 0x8c, 0xf8, 0xb4, 0x3d,
+ 0xc0, 0x07, 0x0e, 0xbe, 0x71, 0x86, 0x55, 0xbe, 0xde, 0x9e, 0x2d, 0x3e,
+ 0x44, 0x7f, 0xf8, 0xbd, 0x72, 0x7d, 0x94, 0xbe, 0xc9, 0xae, 0xcd, 0x3c,
+ 0x5d, 0x62, 0x8c, 0xbe, 0x8c, 0x7f, 0xdc, 0x3e, 0xe7, 0x2b, 0xed, 0xbb,
+ 0x83, 0x70, 0x4a, 0x3d, 0x48, 0x8e, 0xa5, 0x3c, 0xd6, 0x59, 0x87, 0x3d,
+ 0xfe, 0x37, 0x31, 0x3d, 0xb1, 0x7d, 0x53, 0xbd, 0x72, 0x11, 0xd7, 0x3d,
+ 0xd9, 0x4c, 0x81, 0xbe, 0x2a, 0xb3, 0xff, 0xbd, 0x16, 0x4e, 0xca, 0xbd,
+ 0xda, 0x1d, 0x68, 0x3e, 0x6c, 0x33, 0xd0, 0xbe, 0x02, 0xa9, 0x05, 0xbd,
+ 0x45, 0x38, 0x9f, 0xbd, 0xab, 0xd8, 0x81, 0xbd, 0x6a, 0x93, 0x59, 0x3e,
+ 0x88, 0x5b, 0x88, 0xbe, 0x7e, 0x76, 0xa8, 0x3d, 0x7d, 0xda, 0x47, 0x3e,
+ 0x98, 0xae, 0x41, 0x3e, 0xa0, 0x3a, 0x03, 0xbe, 0x0f, 0xe7, 0x56, 0xbe,
+ 0xb4, 0xbf, 0x0e, 0x3e, 0x2a, 0x3d, 0x4e, 0xbc, 0xda, 0x25, 0x90, 0xbe,
+ 0xbc, 0x83, 0x47, 0xbb, 0xa5, 0xf8, 0x63, 0x3e, 0x10, 0x15, 0x83, 0x3d,
+ 0xa9, 0x7a, 0x19, 0xbe, 0xc6, 0x9b, 0x0e, 0xbe, 0xba, 0xe8, 0xeb, 0xbd,
+ 0xac, 0xe3, 0xbe, 0xbc, 0x98, 0x3d, 0xbc, 0x3d, 0x9e, 0xa4, 0x2e, 0xbd,
+ 0x95, 0xad, 0xfe, 0x3d, 0xef, 0x92, 0xdb, 0xbc, 0x12, 0x93, 0xb8, 0x3d,
+ 0x7b, 0x36, 0x86, 0xbd, 0x37, 0x26, 0xa4, 0x3d, 0x46, 0xf3, 0x45, 0xbd,
+ 0xcb, 0x57, 0x51, 0x3d, 0x9d, 0x7f, 0x21, 0xbe, 0x03, 0x7b, 0x76, 0x3e,
+ 0x21, 0xdc, 0xeb, 0xbc, 0x29, 0xbf, 0x08, 0x3e, 0xc2, 0x9b, 0x1b, 0x3e,
+ 0xf7, 0x73, 0x8c, 0x3d, 0xc1, 0x03, 0xb4, 0x3d, 0x81, 0x6a, 0x12, 0xbd,
+ 0xc8, 0x55, 0xed, 0x3d, 0x2b, 0x90, 0x8d, 0xbe, 0x6d, 0xc4, 0x9c, 0x3d,
+ 0x6c, 0x9c, 0x05, 0x3e, 0x3b, 0x55, 0x15, 0xbd, 0x21, 0x66, 0xe5, 0x3d,
+ 0x9f, 0x30, 0x12, 0xbe, 0x04, 0x56, 0x77, 0xbe, 0x3b, 0x9b, 0x00, 0xbe,
+ 0x1a, 0xc7, 0x54, 0x3d, 0x64, 0xb9, 0x6e, 0xbe, 0x3d, 0xe4, 0x89, 0xbd,
+ 0xd4, 0xd7, 0xfc, 0xbc, 0x8e, 0xa2, 0x38, 0xbe, 0x22, 0x79, 0x15, 0x3e,
+ 0x36, 0x9c, 0x93, 0xbd, 0x0d, 0xb2, 0x45, 0x3e, 0xdb, 0x02, 0x83, 0xbe,
+ 0x73, 0xb5, 0x29, 0x3e, 0xd8, 0xf4, 0x29, 0xbe, 0xe0, 0x7d, 0x25, 0xbe,
+ 0x4a, 0x5b, 0x22, 0xbe, 0xb5, 0x2d, 0xc4, 0xbd, 0xb9, 0x4a, 0x3d, 0xbd,
+ 0xdf, 0x90, 0x1b, 0x3e, 0xb1, 0xe3, 0x03, 0x3d, 0x91, 0x4f, 0x75, 0x3d,
+ 0x96, 0xb2, 0x46, 0x3d, 0x8a, 0x44, 0x51, 0xbe, 0x6a, 0xd0, 0x07, 0xbc,
+ 0xf4, 0x1f, 0x44, 0x3e, 0xc2, 0x86, 0x46, 0xbd, 0xa5, 0x1f, 0xf8, 0x3c,
+ 0x58, 0x9c, 0xe4, 0x3d, 0x82, 0x1e, 0xa4, 0xbd, 0x93, 0x8b, 0x06, 0xbe,
+ 0x2d, 0x63, 0x56, 0xbe, 0x53, 0x5b, 0x14, 0xbe, 0x04, 0x65, 0x3b, 0x3e,
+ 0x99, 0xbb, 0xef, 0x3c, 0x38, 0x26, 0x2b, 0x3e, 0x6c, 0x0f, 0xef, 0x3c,
+ 0x0f, 0xf6, 0xec, 0xbd, 0x0e, 0x6d, 0x55, 0xbd, 0xbc, 0xed, 0x03, 0xbe,
+ 0xd7, 0x81, 0x1b, 0xbe, 0x16, 0x21, 0x2e, 0x3e, 0x44, 0xba, 0x4d, 0xbe,
+ 0x30, 0xbf, 0x36, 0x3e, 0x9a, 0x5c, 0x98, 0xbd, 0x55, 0x0a, 0x45, 0xbe,
+ 0x3d, 0xcc, 0xc9, 0x3d, 0x8b, 0x7e, 0x17, 0x3e, 0x84, 0x3e, 0xcf, 0xbd,
+ 0x55, 0x06, 0xfa, 0xbd, 0xaa, 0xff, 0x25, 0xbe, 0xd9, 0x25, 0xff, 0x3c,
+ 0x26, 0xcb, 0x08, 0x3e, 0x2e, 0xb9, 0x31, 0xbd, 0x6f, 0x39, 0x95, 0x3d,
+ 0x12, 0xc5, 0x27, 0x3e, 0x7f, 0x70, 0x20, 0xbc, 0xc3, 0x29, 0xd3, 0x3d,
+ 0x0f, 0x10, 0x5e, 0xbd, 0xa9, 0xb2, 0x93, 0x3c, 0x95, 0x3d, 0x84, 0xbd,
+ 0xa7, 0xf5, 0x8b, 0xbd, 0x2e, 0x11, 0x7e, 0x3e, 0x72, 0x64, 0x81, 0x3e,
+ 0xea, 0x26, 0x71, 0xbe, 0x91, 0x2e, 0xe1, 0xbc, 0x52, 0xd6, 0x33, 0xbe,
+ 0x59, 0x1c, 0xde, 0xbd, 0x0d, 0xd9, 0x08, 0x3f, 0x54, 0x3e, 0xb6, 0xbc,
+ 0xdc, 0x80, 0x6f, 0x3e, 0x01, 0x4e, 0x9d, 0x3e, 0x4f, 0xd3, 0x08, 0x3f,
+ 0xc4, 0x05, 0x9d, 0x3c, 0x82, 0xeb, 0x80, 0x3e, 0x82, 0xf8, 0x92, 0x3d,
+ 0xca, 0x4b, 0x67, 0xbe, 0x8c, 0x8f, 0x25, 0xbe, 0x3a, 0xa2, 0x85, 0x3d,
+ 0x0d, 0x44, 0xdc, 0x3d, 0x54, 0x58, 0x58, 0xbd, 0xac, 0xdf, 0x35, 0x3e,
+ 0x7d, 0x32, 0x63, 0xbe, 0x08, 0x41, 0x8d, 0xbb, 0xc1, 0x10, 0x6a, 0x3e,
+ 0x39, 0x5f, 0x21, 0x3e, 0xac, 0xd8, 0x2b, 0xbe, 0x4e, 0x33, 0xd4, 0x3e,
+ 0x45, 0xe5, 0x29, 0xbe, 0x7a, 0x3b, 0xb1, 0xbe, 0xd1, 0x26, 0x14, 0x3e,
+ 0xc7, 0x5e, 0x2e, 0x3d, 0x93, 0xf5, 0xcf, 0xbe, 0x16, 0xfe, 0xd6, 0x3d,
+ 0x0d, 0xf1, 0x0b, 0xbe, 0x45, 0xf7, 0xda, 0x3c, 0x1e, 0x7f, 0x38, 0xbe,
+ 0x5e, 0x08, 0xe2, 0xbe, 0x7f, 0xe7, 0xa8, 0xbe, 0x36, 0x7d, 0x89, 0xbd,
+ 0xe6, 0x3f, 0x8a, 0xbe, 0xe0, 0x10, 0xdb, 0xbe, 0xdf, 0x8f, 0xec, 0x3e,
+ 0xb0, 0xc9, 0xcc, 0x3d, 0x35, 0x90, 0xdf, 0xbd, 0xc7, 0x0f, 0x52, 0xbe,
+ 0xd8, 0x5c, 0x1f, 0xbd, 0x92, 0xd8, 0xdc, 0x3b, 0xe8, 0x69, 0xc1, 0x3e,
+ 0xb0, 0x6b, 0x46, 0xbc, 0x62, 0x76, 0x36, 0x3e, 0x24, 0xec, 0x64, 0xbc,
+ 0x03, 0x04, 0xda, 0x3d, 0xcb, 0x6c, 0x90, 0xbc, 0x68, 0xbf, 0x2d, 0xbe,
+ 0xfa, 0x82, 0xe1, 0xbe, 0x77, 0x26, 0x28, 0xbe, 0x45, 0x87, 0xec, 0x3d,
+ 0xbb, 0x66, 0x4c, 0x3d, 0x37, 0xc5, 0xb3, 0xbe, 0x74, 0xa6, 0xa3, 0x3d,
+ 0x28, 0x2b, 0x80, 0x3c, 0x9b, 0xe1, 0x32, 0x3e, 0x15, 0x66, 0x0c, 0x3e,
+ 0x88, 0x31, 0x8c, 0xbd, 0x63, 0x98, 0x27, 0xbe, 0x15, 0xb8, 0xbd, 0x3d,
+ 0xa6, 0x37, 0x92, 0xbd, 0xe5, 0xd6, 0x19, 0xbd, 0x17, 0xc1, 0x32, 0x3d,
+ 0xab, 0xef, 0xf9, 0xbd, 0x84, 0x4e, 0x1f, 0xbe, 0x20, 0x35, 0x65, 0x3d,
+ 0x40, 0x5f, 0x9c, 0x3d, 0x37, 0xfa, 0x16, 0xbd, 0x1a, 0xe3, 0x10, 0x3e,
+ 0x59, 0x6e, 0x2d, 0xbe, 0xe9, 0x55, 0x9e, 0xbd, 0xa9, 0x96, 0x35, 0x3e,
+ 0xf7, 0x26, 0x29, 0x3e, 0x0c, 0xf1, 0x01, 0x3d, 0x8c, 0xc5, 0xe3, 0x3d,
+ 0xed, 0x95, 0x14, 0xbe, 0x00, 0x16, 0x3c, 0x3b, 0x55, 0x81, 0x3a, 0x3e,
+ 0xb6, 0x6d, 0x8c, 0x3d, 0xf7, 0xd9, 0xf4, 0xbd, 0x02, 0xff, 0xe5, 0x3d,
+ 0x9c, 0x5a, 0xac, 0xbd, 0xe6, 0x2f, 0x6d, 0x3e, 0x43, 0x2a, 0x07, 0x3e,
+ 0x86, 0xee, 0xd6, 0xbd, 0x7f, 0x20, 0xa2, 0xbc, 0xa1, 0xe9, 0x4b, 0x3e,
+ 0x30, 0xe1, 0x96, 0xbd, 0xe0, 0xea, 0xcc, 0x3c, 0x57, 0xb0, 0xd7, 0x3d,
+ 0x89, 0x8e, 0xd2, 0x3c, 0x8a, 0x63, 0x89, 0xbd, 0xf3, 0x5b, 0x23, 0x3e,
+ 0x02, 0x09, 0x93, 0x3d, 0x9a, 0x83, 0xc1, 0xbc, 0xad, 0xcb, 0x4a, 0xbd,
+ 0xf5, 0x84, 0x05, 0x3d, 0x7b, 0xd0, 0xb4, 0x3d, 0x50, 0x06, 0x46, 0xbd,
+ 0x12, 0x7c, 0x24, 0x3e, 0xce, 0xe0, 0x8a, 0xbd, 0xa9, 0x24, 0xee, 0x3d,
+ 0x65, 0xbe, 0x94, 0xbc, 0x7d, 0x56, 0x07, 0x3e, 0xb9, 0x56, 0xf2, 0xbd,
+ 0x9e, 0x8b, 0xd3, 0x3d, 0xd4, 0x56, 0x6f, 0x3d, 0xbf, 0xb4, 0xb6, 0x3c,
+ 0xde, 0xf5, 0x96, 0x3d, 0x9f, 0x59, 0xb2, 0xbd, 0x2c, 0xa6, 0x39, 0xbe,
+ 0x85, 0xc1, 0x3f, 0xbe, 0xdc, 0x79, 0xc1, 0xbc, 0x70, 0x4f, 0x28, 0x3e,
+ 0xa6, 0x97, 0x0c, 0x3e, 0x93, 0xd7, 0xbd, 0xbd, 0x2c, 0x86, 0xdb, 0x3d,
+ 0x31, 0x12, 0x7c, 0x3d, 0x85, 0x83, 0x15, 0xbd, 0xa4, 0x2e, 0x7a, 0xbe,
+ 0x5e, 0x64, 0xcd, 0x3d, 0x4c, 0xf3, 0x4d, 0x3d, 0x1a, 0x4f, 0x29, 0xbe,
+ 0xd2, 0x02, 0x38, 0x3d, 0x89, 0xec, 0xf5, 0x3d, 0x13, 0xc0, 0x02, 0xbe,
+ 0x53, 0xab, 0x55, 0xbe, 0xd0, 0x9d, 0x00, 0x3e, 0x04, 0x43, 0xd3, 0xbd,
+ 0xf3, 0xfa, 0x91, 0x3d, 0x7b, 0xca, 0x54, 0x3d, 0x26, 0x5b, 0xe6, 0xbd,
+ 0x93, 0xed, 0x8c, 0xbd, 0xf0, 0x0f, 0x2a, 0xbe, 0xec, 0x97, 0x79, 0x3d,
+ 0x4c, 0x7c, 0x01, 0xbc, 0x6f, 0x11, 0x20, 0xbe, 0xc8, 0x29, 0x3e, 0x3e,
+ 0x0d, 0x05, 0x2d, 0xbe, 0xd0, 0x75, 0x26, 0x3e, 0x55, 0x14, 0x9e, 0xbc,
+ 0x77, 0x9f, 0x11, 0xbe, 0x7a, 0x7c, 0x0d, 0x3d, 0xb8, 0xcc, 0x82, 0x3c,
+ 0x40, 0x0b, 0x99, 0x3d, 0xe6, 0x81, 0x05, 0xbe, 0xa9, 0x5e, 0x0f, 0xbe,
+ 0xdc, 0xd9, 0x89, 0x3d, 0xe0, 0x49, 0x32, 0x3e, 0x3c, 0xa7, 0x5d, 0x3d,
+ 0xbe, 0x67, 0x12, 0xbe, 0x04, 0x32, 0xfc, 0x3d, 0x94, 0x4a, 0x17, 0x3e,
+ 0xce, 0x91, 0x99, 0x3d, 0xce, 0x38, 0x48, 0xbd, 0xd4, 0x38, 0x52, 0x3c,
+ 0x0b, 0x26, 0xd8, 0xbd, 0x87, 0x9b, 0xac, 0x3d, 0x9b, 0x65, 0x35, 0x3d,
+ 0xad, 0x39, 0x20, 0x3e, 0x9f, 0x65, 0x43, 0xbe, 0xd5, 0x4f, 0x89, 0xbd,
+ 0x31, 0x15, 0x28, 0x3e, 0xb9, 0x69, 0x27, 0x3e, 0xff, 0xf0, 0xf8, 0x3d,
+ 0xe4, 0x60, 0x7b, 0x3e, 0xab, 0x4d, 0xc5, 0x3c, 0x24, 0xfc, 0x11, 0x3e,
+ 0x9c, 0x2b, 0xc1, 0x3d, 0x62, 0xa6, 0x14, 0x3e, 0x08, 0x5f, 0x11, 0xbd,
+ 0x0f, 0x18, 0x07, 0xbe, 0xf6, 0x15, 0x23, 0xbe, 0x4f, 0x5d, 0x16, 0x3c,
+ 0x3c, 0x92, 0x4a, 0xbe, 0xbf, 0x96, 0x4c, 0x3e, 0xaa, 0x8b, 0xdd, 0xbd,
+ 0x07, 0x67, 0x25, 0xbe, 0x75, 0xa8, 0xc9, 0x3d, 0xe8, 0xb5, 0xf8, 0x3d,
+ 0xde, 0xba, 0xa6, 0x3d, 0x48, 0x60, 0x37, 0x3c, 0x19, 0x71, 0x64, 0x3d,
+ 0xec, 0xec, 0x13, 0x3d, 0x7e, 0x54, 0xcd, 0xbd, 0x17, 0xd3, 0x47, 0x3c,
+ 0xde, 0xaa, 0x00, 0xbe, 0x89, 0x4e, 0x6c, 0xbd, 0xe1, 0x46, 0x0b, 0xbe,
+ 0xd4, 0x23, 0x6d, 0xbd, 0x62, 0x0a, 0x06, 0xbe, 0x98, 0x51, 0x4c, 0xbe,
+ 0x8e, 0x8d, 0xdc, 0xbd, 0xc7, 0x0d, 0x85, 0xbe, 0xc9, 0x23, 0xa8, 0xbd,
+ 0x81, 0x68, 0x6d, 0xbe, 0x36, 0x04, 0x5e, 0xbe, 0x5a, 0x18, 0x6c, 0xbd,
+ 0x53, 0xfe, 0x74, 0xbd, 0x9a, 0x25, 0x33, 0xbe, 0x4c, 0xe8, 0x1c, 0x3e,
+ 0x6b, 0x99, 0xb9, 0x3d, 0x74, 0x47, 0x97, 0xbb, 0xbf, 0x19, 0xac, 0x3d,
+ 0x3f, 0x29, 0x10, 0x3e, 0x9c, 0xec, 0x00, 0xbe, 0x68, 0xf8, 0x33, 0xbe,
+ 0xf2, 0x92, 0x39, 0xbe, 0x57, 0x87, 0x6d, 0x3e, 0xad, 0x96, 0xc9, 0x3d,
+ 0x91, 0x3c, 0x66, 0x3d, 0x9e, 0x41, 0xf3, 0xbd, 0xdb, 0xbe, 0x05, 0xbd,
+ 0x56, 0x13, 0xb2, 0xbd, 0xca, 0x51, 0x58, 0x3d, 0xfc, 0xf9, 0xc4, 0xbd,
+ 0xc4, 0x13, 0xf9, 0x3d, 0xd2, 0x7e, 0x5a, 0x3d, 0x90, 0x54, 0xc1, 0x3c,
+ 0x87, 0xa4, 0xf4, 0xbd, 0xab, 0x9e, 0x00, 0xbe, 0x99, 0xa7, 0x41, 0xbe,
+ 0xad, 0xf7, 0x03, 0xbe, 0x2f, 0x63, 0x12, 0xbe, 0xeb, 0xb9, 0x25, 0x3e,
+ 0x1c, 0xd5, 0x86, 0xb9, 0x02, 0xb6, 0x41, 0x3e, 0x89, 0x9c, 0xa5, 0xbd,
+ 0x77, 0x75, 0x82, 0xbe, 0x6b, 0x67, 0x54, 0xbe, 0x52, 0x30, 0x5c, 0x3d,
+ 0xba, 0x56, 0x18, 0xbe, 0xec, 0xde, 0xa5, 0xbe, 0xac, 0x21, 0x41, 0x3d,
+ 0xbb, 0x90, 0x2a, 0xbe, 0x9c, 0x3b, 0x61, 0x3d, 0xb4, 0x9a, 0x3d, 0x3e,
+ 0x32, 0xa6, 0x2d, 0xbe, 0xd9, 0xc1, 0x69, 0x3e, 0x9a, 0xe4, 0x6d, 0xbd,
+ 0x34, 0xa9, 0xc1, 0xbc, 0x6d, 0x48, 0x47, 0xbe, 0x40, 0xc7, 0xc2, 0x3d,
+ 0xd3, 0x80, 0x4a, 0xbe, 0xeb, 0xe3, 0xc6, 0xbc, 0x51, 0x4e, 0x89, 0x3e,
+ 0x82, 0xcd, 0x79, 0x3d, 0xb8, 0x0a, 0x89, 0xbe, 0x0f, 0xe9, 0xc3, 0x3e,
+ 0x1e, 0x71, 0xf9, 0xbc, 0x98, 0x64, 0x52, 0xbb, 0x11, 0xd6, 0xbf, 0xbd,
+ 0x7e, 0x8f, 0xa3, 0x3d, 0x77, 0x05, 0xbd, 0x3e, 0x97, 0xc0, 0x10, 0x3e,
+ 0xc4, 0x7c, 0x7b, 0x3d, 0x0d, 0xf5, 0xa2, 0xbe, 0x2e, 0x17, 0x10, 0xbe,
+ 0xfd, 0x32, 0xa1, 0x3d, 0xec, 0x27, 0xca, 0xbd, 0xd2, 0x8e, 0xd4, 0xbd,
+ 0x04, 0x8f, 0x3f, 0xbd, 0x00, 0xba, 0x3a, 0xbe, 0xc2, 0xbe, 0xf7, 0xbc,
+ 0x45, 0xf4, 0xa3, 0xbd, 0xed, 0xac, 0xb5, 0x3d, 0xe5, 0x16, 0x7c, 0xbb,
+ 0xaa, 0xee, 0xbb, 0x3e, 0xbe, 0x1f, 0x53, 0x3e, 0x02, 0xfd, 0xa0, 0x3d,
+ 0x55, 0x76, 0xb5, 0xbe, 0x72, 0x86, 0x82, 0x3d, 0x08, 0x17, 0xe5, 0x3d,
+ 0x95, 0x63, 0x2a, 0x3e, 0x57, 0x4d, 0x37, 0x3e, 0x0e, 0x72, 0x6b, 0xbd,
+ 0x6e, 0xca, 0x43, 0x3e, 0xc8, 0x61, 0x42, 0xbe, 0x3e, 0xd5, 0xad, 0x3d,
+ 0x47, 0xa2, 0x2f, 0xbd, 0x5b, 0x4a, 0xb2, 0x3e, 0x36, 0xc5, 0x6c, 0x3d,
+ 0x6e, 0x8d, 0x83, 0x3e, 0xe5, 0x6b, 0xe7, 0xbd, 0x70, 0x77, 0x9b, 0x3c,
+ 0x04, 0xd7, 0x1f, 0x3e, 0xfc, 0x0a, 0x0c, 0xbe, 0xb1, 0x5c, 0x81, 0x3d,
+ 0x36, 0x0f, 0x46, 0x3e, 0x35, 0x8e, 0x70, 0x3e, 0xad, 0x92, 0x01, 0xbe,
+ 0xfa, 0x28, 0x46, 0x3d, 0x61, 0x76, 0x87, 0x3d, 0x48, 0x8b, 0x0f, 0xbe,
+ 0xba, 0xc1, 0x84, 0x3d, 0xe0, 0x00, 0x01, 0xbe, 0x9a, 0x49, 0x02, 0xbe,
+ 0xf5, 0x30, 0x1f, 0x3e, 0x05, 0x00, 0x96, 0xbc, 0xe3, 0x17, 0xac, 0xbd,
+ 0xe3, 0xd2, 0x03, 0x3e, 0x04, 0x11, 0x1b, 0x3e, 0xda, 0xac, 0x53, 0xbd,
+ 0xaf, 0x87, 0x53, 0x3d, 0x2d, 0xdd, 0xe7, 0x3d, 0xc2, 0xbc, 0x2a, 0x3e,
+ 0xc7, 0x04, 0x34, 0xbe, 0xa7, 0x9a, 0xee, 0xbc, 0xb4, 0xe7, 0xfa, 0x3c,
+ 0xdf, 0x0b, 0x0e, 0xbe, 0x44, 0x3f, 0x67, 0xbd, 0xac, 0x53, 0x0d, 0x3e,
+ 0x91, 0xef, 0x7c, 0xbe, 0x2c, 0xce, 0x19, 0xbe, 0xf5, 0xc5, 0x69, 0x3d,
+ 0x17, 0xa9, 0x14, 0xbe, 0x8a, 0xf4, 0xa9, 0xbe, 0x9f, 0xe3, 0xc0, 0x3d,
+ 0xe4, 0x5d, 0xe7, 0x3d, 0x31, 0x14, 0x28, 0x3e, 0x06, 0x87, 0x85, 0xbd,
+ 0x4f, 0x63, 0xf2, 0x3d, 0x1d, 0xdc, 0xb2, 0xbd, 0xdf, 0x45, 0x6c, 0x3e,
+ 0xaa, 0x9e, 0x3a, 0xbe, 0x7b, 0x51, 0x4b, 0x3d, 0x58, 0x27, 0x13, 0xbe,
+ 0x96, 0xd2, 0x18, 0xbe, 0x06, 0xb6, 0x36, 0xbe, 0x20, 0xec, 0x80, 0xbd,
+ 0xed, 0x5f, 0x9b, 0x3b, 0x11, 0x9b, 0xc4, 0xbd, 0x7d, 0x0b, 0xed, 0xbd,
+ 0x88, 0xfa, 0x83, 0xbd, 0xd0, 0xa9, 0x1c, 0x3e, 0xee, 0xf6, 0x05, 0xbe,
+ 0x06, 0xde, 0x01, 0x3e, 0xd6, 0xf9, 0x2f, 0xbe, 0xc5, 0xe8, 0x05, 0xbe,
+ 0xe3, 0x94, 0xff, 0x3d, 0x79, 0x72, 0x71, 0x3d, 0x4b, 0x37, 0xa7, 0xbd,
+ 0x53, 0x82, 0xb5, 0x3e, 0x4d, 0x3a, 0x7a, 0xbd, 0xa9, 0xca, 0x3b, 0x3e,
+ 0xeb, 0xf1, 0x0c, 0xbe, 0xbe, 0x0d, 0xe6, 0x3d, 0x02, 0xf3, 0x03, 0xbc,
+ 0x57, 0x57, 0xd9, 0xbd, 0x7c, 0x24, 0x20, 0x3d, 0xed, 0x41, 0x93, 0xbd,
+ 0x14, 0x24, 0xf8, 0xbd, 0x88, 0x57, 0xd1, 0x3d, 0xb5, 0xa8, 0xc3, 0xbd,
+ 0x43, 0x62, 0xe2, 0xbd, 0xc1, 0x30, 0xae, 0x3d, 0x3f, 0xcc, 0xed, 0xbc,
+ 0xc6, 0x12, 0xdb, 0x3d, 0xe1, 0x39, 0xc2, 0x3d, 0x43, 0xab, 0xf2, 0xbd,
+ 0xff, 0xec, 0x06, 0x3e, 0x34, 0x64, 0x05, 0xbe, 0x51, 0x4e, 0xc6, 0x3c,
+ 0x35, 0xfb, 0x86, 0x3d, 0xba, 0x3b, 0x03, 0xbe, 0x70, 0x99, 0xca, 0x3c,
+ 0x78, 0x43, 0x9f, 0x3d, 0x03, 0x31, 0xf1, 0xbd, 0x4e, 0x94, 0x58, 0xbe,
+ 0xe2, 0x5b, 0x0c, 0xbe, 0x39, 0xba, 0xa8, 0xbc, 0xc3, 0x11, 0x45, 0xbe,
+ 0xb8, 0x47, 0x60, 0xbe, 0x79, 0xdc, 0x01, 0xbe, 0x49, 0x9f, 0xbb, 0x3d,
+ 0xb8, 0x8f, 0xdc, 0x3d, 0x2e, 0x0b, 0xe9, 0x3d, 0xcd, 0x67, 0xd1, 0xbd,
+ 0x8d, 0xd4, 0x8a, 0xbc, 0xa1, 0x02, 0x67, 0xbd, 0xdf, 0x32, 0x5b, 0xbd,
+ 0x8a, 0x8e, 0xd4, 0xbd, 0x93, 0x83, 0x6b, 0xbe, 0x67, 0xe1, 0x11, 0xbe,
+ 0x0b, 0x7a, 0x06, 0xbe, 0x50, 0x9a, 0x22, 0x3e, 0x79, 0xca, 0xe3, 0x3c,
+ 0xb5, 0xe3, 0x16, 0x3e, 0x70, 0x06, 0xe6, 0xbd, 0x6f, 0x73, 0x8e, 0xbd,
+ 0x3a, 0x08, 0x9e, 0x3d, 0x47, 0xd8, 0x4b, 0xbc, 0x26, 0xf0, 0xc9, 0xbd,
+ 0xab, 0x9a, 0x4c, 0xbe, 0x24, 0x61, 0xe9, 0x3c, 0xeb, 0x34, 0x1d, 0x3d,
+ 0xed, 0xeb, 0x20, 0xbe, 0x40, 0x2f, 0xc5, 0x3d, 0x17, 0x13, 0x62, 0xbe,
+ 0x92, 0x39, 0x14, 0xbe, 0x07, 0x0d, 0x58, 0xbd, 0x2f, 0x21, 0x04, 0xbe,
+ 0xd0, 0x12, 0xf4, 0x3d, 0xad, 0x64, 0x01, 0x3c, 0xee, 0xd2, 0xbf, 0x3d,
+ 0xfe, 0xfb, 0x79, 0x3d, 0xd9, 0xca, 0x07, 0x3e, 0x55, 0x31, 0x14, 0xbe,
+ 0xdc, 0x97, 0x15, 0x3d, 0x8f, 0x32, 0x15, 0x3e, 0xd3, 0xc0, 0x99, 0x3d,
+ 0x4b, 0x8e, 0xfa, 0xbc, 0xbc, 0x6c, 0x82, 0xbd, 0x19, 0xf9, 0x72, 0xbc,
+ 0xbf, 0xa3, 0x3d, 0x3e, 0xbe, 0x52, 0x35, 0x3e, 0xc9, 0xb9, 0xee, 0xbc,
+ 0x44, 0x79, 0xf8, 0xbd, 0xe7, 0xe2, 0x8a, 0x3c, 0x4e, 0x91, 0xb9, 0x3d,
+ 0x87, 0x95, 0x36, 0x3e, 0x30, 0x43, 0x12, 0xbd, 0xc0, 0xa8, 0xbf, 0xbb,
+ 0x98, 0x70, 0xfe, 0xbd, 0xae, 0x11, 0x2d, 0x3d, 0x64, 0xb1, 0x1d, 0xbe,
+ 0x11, 0xc9, 0x2c, 0x3e, 0x10, 0x52, 0x0c, 0x3d, 0x9b, 0xf5, 0x0e, 0xbe,
+ 0x81, 0x37, 0x15, 0x3e, 0x7b, 0x8a, 0x33, 0xbd, 0x14, 0xfa, 0xb3, 0xbd,
+ 0x35, 0x6d, 0xa8, 0xbb, 0xd0, 0x17, 0x62, 0xbc, 0xa3, 0x51, 0x48, 0xbd,
+ 0x32, 0x4c, 0xae, 0x3d, 0x82, 0x3d, 0x36, 0x3b, 0x64, 0x50, 0x61, 0xbd,
+ 0xa0, 0x23, 0x2e, 0xbe, 0xab, 0x87, 0x15, 0xbe, 0x0a, 0x95, 0xd7, 0x3d,
+ 0xb4, 0xde, 0x04, 0x3d, 0xd5, 0x90, 0x49, 0x3d, 0xa6, 0xef, 0xa7, 0xbd,
+ 0x58, 0x92, 0xf3, 0xbc, 0xfc, 0xa7, 0x62, 0x3d, 0xcd, 0xed, 0x05, 0x3e,
+ 0x09, 0x6d, 0x2c, 0xbe, 0xa4, 0xa9, 0x8d, 0xbd, 0x11, 0x6a, 0x23, 0xbe,
+ 0x72, 0x75, 0xc7, 0x3d, 0xfd, 0x7e, 0x0e, 0xbe, 0x4a, 0x06, 0xc0, 0xbd,
+ 0x46, 0xbe, 0x06, 0x3e, 0xac, 0x30, 0x14, 0x3d, 0x6a, 0x4c, 0xb3, 0xbb,
+ 0x90, 0x27, 0x21, 0xbe, 0x3c, 0xc4, 0x17, 0xbe, 0x96, 0x6d, 0xab, 0xbd,
+ 0xb7, 0x7e, 0xca, 0x3c, 0xb8, 0x38, 0xbd, 0xbd, 0x29, 0x9d, 0x25, 0x3e,
+ 0xa4, 0x1d, 0x19, 0x3e, 0x80, 0x29, 0x20, 0x3e, 0xab, 0xbe, 0x3c, 0xbd,
+ 0x7d, 0xd5, 0x3a, 0x3e, 0x33, 0x0e, 0x00, 0x3e, 0xdf, 0xab, 0x44, 0x3e,
+ 0x14, 0x38, 0x17, 0xbe, 0xf5, 0xea, 0x3b, 0x3e, 0x32, 0xc2, 0x99, 0xbd,
+ 0xe3, 0x01, 0x98, 0x3d, 0x98, 0xb8, 0x3c, 0xbe, 0x24, 0x91, 0x85, 0xbd,
+ 0xee, 0xec, 0xce, 0x3d, 0xd7, 0x77, 0xe8, 0x3d, 0xcd, 0x06, 0x7f, 0xbe,
+ 0x26, 0x7e, 0xdc, 0x3d, 0x95, 0xb8, 0x5a, 0xbd, 0x72, 0xaf, 0xfd, 0xbd,
+ 0xec, 0xec, 0x47, 0xba, 0x08, 0xf6, 0xbc, 0x3c, 0x03, 0xec, 0x99, 0x3c,
+ 0xdc, 0xb6, 0x4f, 0x3e, 0xf2, 0x84, 0x5a, 0x3e, 0x40, 0xf7, 0xca, 0x3b,
+ 0xe3, 0x44, 0xa6, 0x3b, 0xa2, 0x51, 0x87, 0x3e, 0xd2, 0x10, 0xd3, 0x3e,
+ 0x40, 0xdf, 0xa5, 0x3d, 0xbd, 0x03, 0xa7, 0xbd, 0x98, 0x8d, 0x7d, 0xbd,
+ 0x42, 0xc6, 0x97, 0xbd, 0xee, 0x96, 0x51, 0xbd, 0x3c, 0x1d, 0xb1, 0xbe,
+ 0x2f, 0x07, 0x5a, 0xbe, 0x63, 0x4f, 0xe7, 0x3d, 0xad, 0xc4, 0x88, 0xbd,
+ 0x0f, 0x02, 0x91, 0x3d, 0x18, 0xf7, 0x06, 0x3e, 0x02, 0xd5, 0x06, 0xbe,
+ 0x24, 0x39, 0xb4, 0xbd, 0x2a, 0xef, 0x3f, 0xbe, 0x3c, 0xb6, 0x8c, 0x3e,
+ 0xae, 0x81, 0x10, 0x3e, 0xa0, 0x7d, 0x41, 0x3e, 0x7d, 0x6e, 0x0d, 0xbd,
+ 0xe4, 0x74, 0x94, 0x3d, 0x54, 0xfa, 0x06, 0xbd, 0x71, 0xde, 0x4b, 0xbd,
+ 0xf6, 0xc3, 0x12, 0xbe, 0x54, 0xd6, 0x18, 0x3d, 0x81, 0xef, 0x27, 0x3e,
+ 0x1d, 0x30, 0x58, 0x3e, 0x3f, 0x9f, 0x09, 0xbe, 0x51, 0xca, 0x10, 0xbd,
+ 0x63, 0x37, 0x00, 0x3c, 0xa6, 0x4c, 0x8d, 0x3d, 0x2a, 0x48, 0x9e, 0xbd,
+ 0xce, 0xe9, 0x02, 0x3d, 0x81, 0x3d, 0x99, 0xbe, 0x71, 0x74, 0x9f, 0x3c,
+ 0x10, 0x38, 0x4e, 0x3d, 0x61, 0x2a, 0x03, 0xbb, 0x22, 0xe4, 0xa9, 0x3e,
+ 0xf1, 0x3a, 0x63, 0x3d, 0xad, 0xa5, 0x95, 0x3e, 0x34, 0xda, 0x1b, 0x3e,
+ 0x9a, 0xc0, 0xa6, 0xbd, 0x4a, 0x30, 0xeb, 0xbd, 0x16, 0xa8, 0xb2, 0xbd,
+ 0xad, 0x7e, 0xa5, 0x3c, 0x3a, 0xa3, 0x18, 0xbe, 0xb9, 0xf1, 0x31, 0x3e,
+ 0x9c, 0x95, 0x72, 0x3d, 0x3a, 0xc6, 0x05, 0x3e, 0x12, 0x65, 0x7f, 0x3d,
+ 0x25, 0x21, 0x1e, 0x3e, 0x8e, 0xe8, 0xed, 0xbc, 0xcb, 0x98, 0x08, 0xbe,
+ 0xf0, 0xdb, 0xa8, 0x3d, 0x10, 0xe3, 0xfe, 0x3d, 0x35, 0x25, 0xb0, 0x3c,
+ 0xc9, 0x14, 0xe5, 0x3d, 0x2d, 0x4d, 0x2c, 0xbe, 0x36, 0xb1, 0x25, 0x3e,
+ 0xf1, 0x2f, 0x32, 0xbe, 0x3a, 0xef, 0x15, 0xbd, 0x2d, 0x29, 0xbc, 0xbd,
+ 0x99, 0x77, 0x3c, 0xbd, 0xcb, 0x95, 0x7d, 0x3d, 0x94, 0x90, 0x83, 0xbd,
+ 0x21, 0xdb, 0xb9, 0x3d, 0x3d, 0xa8, 0x57, 0x3e, 0x8d, 0xf2, 0xa4, 0x3c,
+ 0xfc, 0x1b, 0xcf, 0x3d, 0x84, 0xeb, 0x76, 0xbe, 0x37, 0xf8, 0xad, 0x3d,
+ 0x3e, 0xf4, 0x9d, 0x3d, 0xe4, 0xf9, 0x28, 0x3e, 0x84, 0x9b, 0xde, 0xbb,
+ 0x5f, 0x29, 0x67, 0x3c, 0x98, 0x2a, 0x13, 0x3e, 0x75, 0x09, 0x98, 0x3d,
+ 0x19, 0x91, 0xec, 0xbc, 0xa3, 0xd0, 0xf0, 0xbd, 0xf1, 0x7c, 0x1e, 0x3e,
+ 0x2e, 0x9d, 0x95, 0x3d, 0xf6, 0x79, 0x08, 0x3e, 0x61, 0x89, 0x07, 0xbe,
+ 0x75, 0x42, 0x3e, 0x3d, 0x7a, 0xae, 0x1d, 0xbd, 0xd3, 0xfe, 0xa2, 0xbd,
+ 0x9e, 0x60, 0x20, 0x3e, 0xaa, 0x7f, 0xa3, 0x3d, 0xbe, 0x23, 0x1d, 0xbe,
+ 0x76, 0xc7, 0x59, 0x3e, 0xaf, 0x8e, 0x5e, 0x3d, 0xf3, 0x13, 0x42, 0x3e,
+ 0x34, 0xa1, 0x56, 0x3d, 0x70, 0x3d, 0x18, 0x3e, 0xda, 0xc5, 0x1c, 0x3e,
+ 0xfc, 0xce, 0x31, 0xbe, 0x41, 0xc0, 0x6d, 0x3e, 0xd8, 0xf9, 0x4c, 0x3d,
+ 0x58, 0xf9, 0xc8, 0xbc, 0xce, 0xa4, 0x8f, 0xbd, 0x6c, 0x8a, 0xfb, 0x3d,
+ 0xc3, 0xa6, 0xa8, 0x3d, 0xee, 0x39, 0xb1, 0x3c, 0xd0, 0x4e, 0x1e, 0x3e,
+ 0x6e, 0xc0, 0xe1, 0xbd, 0xd2, 0x5d, 0x04, 0xbe, 0xe5, 0x68, 0x00, 0x3e,
+ 0x85, 0xaa, 0xa7, 0xbd, 0xd7, 0xa9, 0xd4, 0xbc, 0x99, 0xa2, 0xf5, 0xbb,
+ 0x1b, 0x1e, 0x4d, 0xbc, 0x64, 0x66, 0x27, 0x3e, 0xcc, 0x23, 0x9a, 0xbd,
+ 0x1c, 0x6e, 0x1a, 0x3d, 0x32, 0x52, 0x35, 0x3e, 0xd1, 0xdb, 0x6a, 0x3b,
+ 0x37, 0xc8, 0xb7, 0x3d, 0x4c, 0xc4, 0xc8, 0xbd, 0x75, 0x4e, 0x36, 0x3e,
+ 0x7b, 0xf0, 0x1e, 0xbd, 0x80, 0xde, 0x3c, 0x3e, 0xf9, 0xff, 0xf8, 0x3d,
+ 0x36, 0x37, 0xca, 0xbd, 0x8b, 0x84, 0xfc, 0xbd, 0xfe, 0x50, 0x0b, 0xbd,
+ 0x64, 0x5f, 0x30, 0xbe, 0x3f, 0xa6, 0x76, 0xbd, 0xfa, 0x4d, 0xed, 0x3c,
+ 0x5c, 0x4e, 0x94, 0x3c, 0x86, 0x8c, 0xc1, 0xbc, 0x5f, 0xbc, 0x9f, 0x3d,
+ 0xc9, 0x9c, 0x52, 0x3d, 0x33, 0x10, 0x28, 0x3e, 0xa3, 0xac, 0x30, 0x3c,
+ 0x48, 0xc5, 0x92, 0x3e, 0x3d, 0x08, 0xa8, 0xbd, 0x10, 0x1d, 0x48, 0xbd,
+ 0x9e, 0x59, 0xa0, 0xbd, 0xc3, 0x5e, 0x0f, 0xbe, 0x5d, 0x4c, 0x8a, 0xbe,
+ 0xf2, 0xff, 0xa7, 0x3d, 0x93, 0xd2, 0xcc, 0x3d, 0x21, 0x69, 0xc2, 0xbd,
+ 0x17, 0x6c, 0x16, 0xbe, 0x12, 0x92, 0x86, 0xbd, 0x9a, 0xdf, 0x26, 0xbe,
+ 0x5f, 0xfc, 0x28, 0x3d, 0x75, 0x23, 0xb6, 0x3d, 0x44, 0xe9, 0x9f, 0x3d,
+ 0xbb, 0x17, 0x4c, 0xbe, 0xf9, 0xf7, 0xa1, 0xbd, 0xa5, 0xe4, 0x8f, 0x3d,
+ 0x61, 0x0e, 0x8b, 0x3d, 0x75, 0x82, 0xef, 0xbd, 0x9c, 0x35, 0x01, 0x3e,
+ 0x44, 0xe9, 0xd9, 0x3c, 0x34, 0x0e, 0xda, 0x3d, 0x35, 0x42, 0x66, 0xbe,
+ 0x0c, 0x4e, 0x38, 0xbd, 0xbb, 0xb3, 0x57, 0xbd, 0xba, 0x95, 0x7a, 0xbd,
+ 0x59, 0x15, 0x2b, 0xbd, 0x09, 0xeb, 0xd3, 0x3d, 0xf9, 0xea, 0xea, 0xbe,
+ 0x7c, 0xa3, 0x17, 0xbd, 0x13, 0xde, 0x54, 0xbe, 0x46, 0x3c, 0x98, 0xbe,
+ 0xe9, 0xcd, 0x84, 0xbe, 0xfb, 0x0f, 0x08, 0xbc, 0x6f, 0x44, 0x61, 0xbc,
+ 0x5e, 0x7c, 0x0c, 0x3c, 0x7c, 0xeb, 0x11, 0x3d, 0x22, 0x76, 0x30, 0xbe,
+ 0xa5, 0x48, 0x85, 0x3d, 0x8d, 0x93, 0x38, 0x3e, 0x5b, 0x45, 0x83, 0xbe,
+ 0xb5, 0x9e, 0x13, 0x3d, 0x13, 0x39, 0xdd, 0xbc, 0x2e, 0x59, 0x31, 0x3e,
+ 0xec, 0xfa, 0x4a, 0x3d, 0x12, 0x55, 0x0c, 0x3e, 0xff, 0x01, 0x1a, 0x3d,
+ 0x3a, 0x7b, 0xc4, 0xbd, 0xa2, 0xfb, 0x99, 0xbd, 0x6d, 0xa2, 0xe8, 0x3d,
+ 0x4e, 0x03, 0xba, 0x3d, 0xac, 0xba, 0x10, 0x3e, 0xda, 0xc4, 0x96, 0x3e,
+ 0x62, 0x26, 0xc8, 0x3c, 0x54, 0xa7, 0x95, 0xbc, 0xc7, 0x21, 0x32, 0xbe,
+ 0x87, 0x1a, 0xfd, 0xbb, 0xf5, 0xbf, 0xa5, 0xbd, 0xdb, 0x28, 0x71, 0x3e,
+ 0x22, 0xa3, 0xea, 0xbd, 0xde, 0xa7, 0xb6, 0x3b, 0xc6, 0x2f, 0x62, 0xbd,
+ 0xfe, 0xe3, 0x63, 0xbe, 0x00, 0xd5, 0x33, 0x3e, 0x92, 0xa5, 0x5c, 0x3e,
+ 0x26, 0x50, 0x0c, 0x3e, 0xee, 0xc2, 0xae, 0xbd, 0x6a, 0x19, 0x22, 0xbe,
+ 0xfc, 0x62, 0x2c, 0x3e, 0x16, 0xcc, 0xfa, 0x3d, 0x8c, 0x79, 0x4c, 0xbd,
+ 0xec, 0xc8, 0x34, 0x3e, 0x89, 0x80, 0xb9, 0x3d, 0x2e, 0x26, 0xb3, 0x3d,
+ 0x8f, 0xf7, 0x44, 0x3c, 0xfb, 0x5e, 0xf7, 0xbc, 0x9c, 0xb0, 0xab, 0x3e,
+ 0x60, 0x0b, 0x17, 0xbc, 0xf3, 0xb9, 0x97, 0x3d, 0x3a, 0xe4, 0x24, 0x3d,
+ 0xbf, 0xcb, 0x1c, 0xbe, 0xeb, 0x62, 0x43, 0x3d, 0xa0, 0x91, 0x73, 0xbe,
+ 0xa1, 0x48, 0x9c, 0xbd, 0x54, 0xfd, 0x9f, 0xbd, 0xc4, 0x4b, 0xc4, 0xbd,
+ 0x40, 0xc8, 0xb5, 0x3c, 0x17, 0x1b, 0xa2, 0x3d, 0xd6, 0x8c, 0xb9, 0xbe,
+ 0x7d, 0x94, 0xe1, 0xbc, 0x9b, 0x6c, 0xb6, 0xbe, 0x48, 0x3d, 0xcb, 0x3d,
+ 0x60, 0xe1, 0xf9, 0x3c, 0xa5, 0xe0, 0x75, 0x3d, 0x2f, 0x6b, 0x0b, 0x3e,
+ 0x57, 0xb9, 0xc3, 0x3e, 0xef, 0x9a, 0x61, 0xbb, 0xd2, 0xf0, 0x1c, 0xbd,
+ 0x34, 0x92, 0x09, 0x3c, 0x8d, 0x35, 0xc6, 0xbc, 0x85, 0x1d, 0x0c, 0x3e,
+ 0x04, 0x08, 0x21, 0x3e, 0xa2, 0xa0, 0x34, 0x3e, 0xbe, 0xa7, 0x3a, 0xbe,
+ 0x7f, 0x5e, 0x52, 0xbd, 0x6a, 0x6a, 0x83, 0xbe, 0x81, 0xc3, 0xc3, 0x3d,
+ 0xcc, 0x71, 0x00, 0x3d, 0x2e, 0x7f, 0x9c, 0x3e, 0x3b, 0x41, 0x4d, 0x3d,
+ 0xb7, 0x8c, 0x00, 0x3e, 0xf2, 0xe6, 0x91, 0xbd, 0x20, 0xb1, 0xa3, 0xbd,
+ 0x41, 0x92, 0x71, 0xbe, 0x7c, 0xc6, 0x49, 0xbe, 0x18, 0xdf, 0x4f, 0xbe,
+ 0x78, 0x31, 0x21, 0x3e, 0x5f, 0xe3, 0xc6, 0xbd, 0xe0, 0xd4, 0x17, 0x3d,
+ 0xb8, 0x7d, 0xb0, 0x3e, 0xc7, 0x51, 0x95, 0xbe, 0x70, 0xe3, 0x9f, 0x3d,
+ 0x68, 0xfe, 0xdf, 0xbd, 0x0c, 0xe2, 0x1e, 0x3d, 0x87, 0x5a, 0x7e, 0x3d,
+ 0x4d, 0x5b, 0x46, 0xbd, 0x0f, 0x6a, 0xe4, 0xbd, 0x30, 0x27, 0xaf, 0x3d,
+ 0xab, 0x00, 0x86, 0xbc, 0xc3, 0x5d, 0xee, 0xbd, 0x5b, 0x67, 0xd3, 0x3c,
+ 0xcd, 0x85, 0x1d, 0xbe, 0x8f, 0x81, 0x24, 0xbe, 0xa8, 0x5f, 0x89, 0x3d,
+ 0x5c, 0xbc, 0x91, 0x3e, 0xe5, 0xb5, 0x8f, 0x3e, 0x18, 0x1b, 0x25, 0x3e,
+ 0x43, 0x0c, 0x2d, 0x3e, 0x49, 0x6c, 0xae, 0xbe, 0x7c, 0x44, 0x9e, 0xbe,
+ 0x71, 0x51, 0xef, 0xbe, 0xa4, 0x8c, 0x32, 0x3e, 0xa2, 0x44, 0x09, 0xbe,
+ 0xa4, 0x5f, 0x94, 0x3d, 0x0c, 0x80, 0xbd, 0x3d, 0xb1, 0x9a, 0x15, 0xbe,
+ 0x9b, 0x04, 0x9a, 0x3d, 0x10, 0x7c, 0x89, 0xbe, 0x3c, 0x66, 0x0e, 0x3e,
+ 0xfd, 0x49, 0x65, 0xbe, 0x43, 0x4f, 0xdc, 0xbc, 0xd4, 0xa8, 0xd5, 0x3d,
+ 0xfe, 0x29, 0xfa, 0x3d, 0x46, 0xc4, 0xc2, 0x3c, 0xb6, 0x31, 0x4d, 0xbe,
+ 0x03, 0xfe, 0x6b, 0xbe, 0xc8, 0x08, 0xbb, 0x3d, 0x61, 0x8d, 0x2b, 0xbe,
+ 0x23, 0xed, 0x49, 0xbb, 0x03, 0x24, 0xd6, 0x3a, 0xfa, 0x11, 0x7f, 0xbe,
+ 0xe4, 0x6b, 0x11, 0x3d, 0x05, 0x06, 0xb0, 0xbd, 0x80, 0xa6, 0x33, 0x3d,
+ 0x9c, 0xf1, 0x02, 0x3e, 0x50, 0xaf, 0x1c, 0x3e, 0x0b, 0xd7, 0x08, 0x3d,
+ 0x0a, 0x3e, 0x9b, 0xbc, 0xf7, 0x80, 0x73, 0x3e, 0x59, 0x4e, 0x17, 0x3e,
+ 0x02, 0xa6, 0x52, 0x3d, 0x10, 0x11, 0x37, 0x3e, 0xec, 0xd6, 0x0e, 0x3d,
+ 0x05, 0x32, 0xc4, 0xbd, 0xd5, 0xfa, 0x5c, 0xbd, 0x30, 0x09, 0xea, 0xbd,
+ 0x8f, 0x08, 0xc7, 0x3d, 0x95, 0x30, 0x76, 0xbe, 0x67, 0x00, 0x4c, 0x3d,
+ 0xee, 0x07, 0xbc, 0xbe, 0x60, 0x22, 0x48, 0x3e, 0x1d, 0x5b, 0x39, 0x3e,
+ 0x12, 0xea, 0x3d, 0xbe, 0x0b, 0x7f, 0x90, 0xbe, 0xd9, 0xed, 0x41, 0x3e,
+ 0xac, 0xe0, 0x03, 0x3e, 0x76, 0x54, 0xb2, 0xbd, 0x44, 0x67, 0x59, 0x3c,
+ 0x2a, 0x2c, 0xd0, 0x3d, 0x33, 0x9e, 0x2d, 0x3e, 0xae, 0x7d, 0x9b, 0x3c,
+ 0x40, 0xd3, 0x23, 0xbe, 0x95, 0x34, 0x3f, 0x3e, 0x22, 0x3c, 0x8d, 0xbd,
+ 0xb7, 0x58, 0x13, 0xbe, 0x07, 0x93, 0x90, 0x3e, 0xf3, 0x5d, 0x03, 0x3e,
+ 0x5a, 0xdb, 0xca, 0x3c, 0x7e, 0x83, 0x1e, 0xbe, 0x77, 0x83, 0x37, 0x3d,
+ 0xcb, 0x9e, 0xb2, 0x3d, 0x85, 0x38, 0x6d, 0xbe, 0x76, 0x31, 0x99, 0x3d,
+ 0x8e, 0x99, 0xec, 0x3c, 0xea, 0x0a, 0xef, 0xbd, 0x79, 0xd2, 0x51, 0xbc,
+ 0x93, 0x48, 0x56, 0x3d, 0x4f, 0xd8, 0x60, 0xbe, 0x59, 0x5b, 0xff, 0x3d,
+ 0x28, 0xa1, 0x0b, 0x3e, 0x7f, 0x2f, 0x2f, 0xbe, 0x9e, 0x74, 0x8b, 0xbe,
+ 0x68, 0xf4, 0x40, 0xbd, 0x8f, 0xc8, 0x5c, 0x3d, 0x73, 0x8e, 0x3d, 0x3e,
+ 0xe9, 0x9f, 0x0a, 0x3e, 0xd2, 0xe1, 0xa1, 0xbd, 0xf5, 0xd6, 0xb1, 0x3c,
+ 0x01, 0x3c, 0x32, 0xbe, 0x12, 0xdb, 0xde, 0xbd, 0xa3, 0x27, 0xed, 0xbd,
+ 0x2d, 0x9c, 0x8f, 0x3d, 0x6e, 0x09, 0x2a, 0xbe, 0x6f, 0x73, 0x64, 0xbc,
+ 0xe1, 0x40, 0x44, 0xbe, 0xe4, 0xf7, 0xf7, 0x3d, 0x49, 0x18, 0x7d, 0xbe,
+ 0x78, 0x62, 0xba, 0xbb, 0x48, 0x2d, 0xbc, 0x3d, 0x46, 0x5e, 0xb2, 0xbe,
+ 0x9b, 0x3f, 0xe8, 0xbd, 0x39, 0x8d, 0x07, 0x3e, 0xa0, 0x2e, 0x63, 0x3d,
+ 0x2e, 0xb5, 0x6c, 0xbc, 0x75, 0xc2, 0x13, 0xbe, 0x11, 0x23, 0x05, 0xbe,
+ 0xd1, 0xed, 0xa1, 0x3d, 0xa6, 0x40, 0x8a, 0xbd, 0x68, 0xdc, 0xdf, 0x3d,
+ 0x73, 0x4b, 0x2d, 0x3d, 0xb9, 0x5b, 0xe2, 0xbd, 0x90, 0x32, 0x8e, 0x3c,
+ 0x1f, 0xf1, 0x41, 0xbd, 0x69, 0xbf, 0x3c, 0x3d, 0xdc, 0x25, 0x56, 0xbe,
+ 0x31, 0xff, 0x9b, 0xbd, 0x75, 0xe8, 0x08, 0x3e, 0x4c, 0xbe, 0xa9, 0xbd,
+ 0x68, 0xac, 0x58, 0xbe, 0xbf, 0xc7, 0x52, 0xbd, 0xdc, 0x58, 0xce, 0x3d,
+ 0x22, 0x57, 0x6a, 0x3d, 0x61, 0x9d, 0x28, 0xbe, 0xd9, 0x7a, 0xc3, 0x3d,
+ 0x85, 0x8b, 0x23, 0xbd, 0x38, 0x99, 0xea, 0xbc, 0x50, 0xf9, 0xee, 0xbd,
+ 0x0f, 0x5b, 0x23, 0x3e, 0xa1, 0x29, 0x28, 0xbe, 0x2a, 0xaf, 0x13, 0x39,
+ 0x91, 0x47, 0xee, 0x3d, 0x2f, 0x19, 0x9e, 0x3d, 0x3e, 0xdc, 0xc6, 0x3d,
+ 0x90, 0x52, 0x36, 0x3e, 0x69, 0xf1, 0xa5, 0xbd, 0xa8, 0xd1, 0x5a, 0x3e,
+ 0xd6, 0x5b, 0x2a, 0xbe, 0x73, 0x8d, 0x51, 0x3e, 0x50, 0x8b, 0xa8, 0xbe,
+ 0x16, 0x67, 0x86, 0xbd, 0xbe, 0x0e, 0xb2, 0xbe, 0x3a, 0x4f, 0x77, 0x3d,
+ 0xf0, 0xb5, 0x79, 0x3b, 0x9f, 0x85, 0x4f, 0x3e, 0x63, 0xca, 0xeb, 0xbd,
+ 0xa8, 0xae, 0x51, 0x3d, 0xe0, 0xf4, 0x8e, 0xbe, 0x56, 0x5b, 0x9a, 0x3d,
+ 0x71, 0x89, 0x06, 0xbe, 0x95, 0x68, 0xb5, 0xbd, 0xef, 0x1d, 0x8b, 0xbe,
+ 0x51, 0xc7, 0x13, 0x3e, 0x85, 0x38, 0x19, 0xbe, 0x36, 0x00, 0x54, 0x3e,
+ 0x9f, 0x9c, 0xe5, 0xbb, 0x5a, 0x64, 0xf4, 0x3d, 0x21, 0x48, 0x27, 0xbe,
+ 0xd5, 0xd3, 0xbe, 0xbe, 0xb1, 0x40, 0x3d, 0xbd, 0x6d, 0x1a, 0x1e, 0x3e,
+ 0x6c, 0xa1, 0xe4, 0x3d, 0x22, 0x22, 0x0e, 0x3d, 0x23, 0x7d, 0x8f, 0x3e,
+ 0x67, 0xae, 0x41, 0xbd, 0x93, 0xd2, 0x26, 0x3e, 0x9b, 0x3e, 0xb3, 0x3d,
+ 0x72, 0xfa, 0xa0, 0x3e, 0x47, 0x76, 0xba, 0xbc, 0xb1, 0xc9, 0x42, 0xbe,
+ 0x26, 0xc0, 0x11, 0xbe, 0x6e, 0x91, 0xa3, 0x3e, 0x06, 0x5e, 0x52, 0xbd,
+ 0x98, 0xf1, 0x63, 0xbe, 0xee, 0xde, 0x46, 0x3e, 0x1b, 0x60, 0xbe, 0xbd,
+ 0xbd, 0xff, 0xe0, 0x3d, 0x37, 0xe2, 0xf0, 0xbd, 0x63, 0x57, 0x3a, 0x3d,
+ 0x83, 0x35, 0x1d, 0xbd, 0x89, 0xf7, 0x9b, 0x3d, 0x9f, 0x35, 0xec, 0xbe,
+ 0x26, 0x9c, 0xfb, 0xbc, 0x5e, 0xc2, 0xc5, 0x3e, 0x50, 0x21, 0x58, 0xbe,
+ 0x17, 0x11, 0xa0, 0xbc, 0xa2, 0x1b, 0x0b, 0x3e, 0xc3, 0x4e, 0x0c, 0x3e,
+ 0x2c, 0x5f, 0x7b, 0xbe, 0x99, 0xb0, 0xef, 0xbd, 0xc2, 0x1b, 0xcb, 0xbc,
+ 0xba, 0xff, 0x03, 0xbe, 0x34, 0xe3, 0xd8, 0x3d, 0x2b, 0x65, 0x69, 0x3d,
+ 0x09, 0x1a, 0x3e, 0x3d, 0xbf, 0x7b, 0x1c, 0x3e, 0xfa, 0x7e, 0xd5, 0xbd,
+ 0x75, 0x88, 0x0b, 0x3e, 0x9a, 0x85, 0x25, 0xbe, 0xe1, 0x04, 0x98, 0xbd,
+ 0xb7, 0xee, 0x89, 0xbc, 0xb0, 0x2f, 0x52, 0x3e, 0x00, 0x76, 0x1c, 0xbd,
+ 0x7d, 0x20, 0xc2, 0xbd, 0x29, 0xd2, 0x1c, 0x3e, 0x01, 0xcb, 0x85, 0xbb,
+ 0xc3, 0x89, 0xec, 0x3c, 0xc7, 0x1a, 0x5d, 0xbe, 0xea, 0xb5, 0x3c, 0x3c,
+ 0x04, 0x67, 0xb3, 0xbc, 0xb1, 0x0c, 0xba, 0xbd, 0xf0, 0xf9, 0x17, 0xbe,
+ 0xad, 0x45, 0x3a, 0xbd, 0xfe, 0x10, 0xb9, 0x3c, 0xc8, 0x38, 0x69, 0xbe,
+ 0x57, 0x19, 0x0f, 0x3e, 0xc2, 0x29, 0xcd, 0x3d, 0x03, 0x45, 0x1a, 0x3d,
+ 0x24, 0xb6, 0x2a, 0xbe, 0x8f, 0x98, 0x01, 0xbe, 0xc3, 0x53, 0xca, 0xbd,
+ 0x65, 0x33, 0x5a, 0xbe, 0x8b, 0xb1, 0x29, 0x3e, 0x6b, 0x33, 0xd5, 0x3c,
+ 0x75, 0xd1, 0x78, 0xbc, 0x26, 0xbf, 0x06, 0x3e, 0x0d, 0x1a, 0x79, 0xbd,
+ 0x95, 0x3a, 0x04, 0xbe, 0x53, 0xea, 0x23, 0x3e, 0x40, 0xea, 0xf4, 0xbd,
+ 0xfb, 0xb2, 0x17, 0x3e, 0xb4, 0xc4, 0xa4, 0x3d, 0x1c, 0xe3, 0x87, 0x3d,
+ 0xb8, 0xf5, 0xaf, 0x3d, 0x18, 0xc2, 0xc7, 0xbd, 0x64, 0x95, 0x1b, 0xbe,
+ 0x82, 0x38, 0x06, 0xbc, 0x6e, 0xc3, 0xbb, 0x3d, 0x2a, 0x85, 0x4c, 0xbe,
+ 0x35, 0x69, 0x7c, 0x3c, 0x07, 0xd3, 0x8d, 0xbe, 0x15, 0x9d, 0x45, 0xbb,
+ 0xf5, 0xb4, 0x03, 0xbe, 0xe4, 0xe0, 0xdf, 0x3d, 0x82, 0xa9, 0x95, 0x3d,
+ 0x92, 0xb1, 0x22, 0x3e, 0x27, 0x2a, 0x36, 0x3e, 0xdf, 0x72, 0x30, 0xbe,
+ 0x4d, 0x95, 0xb6, 0x3d, 0xcf, 0xc4, 0x3d, 0x3c, 0x23, 0x3e, 0xcb, 0x3d,
+ 0x4d, 0xdb, 0x0f, 0xbd, 0x06, 0x02, 0xf2, 0x3c, 0x3d, 0xfd, 0xe1, 0x3d,
+ 0x5a, 0xd6, 0x41, 0xbe, 0xa2, 0x08, 0xee, 0xbc, 0x3b, 0xa8, 0x3a, 0xbe,
+ 0xd8, 0xe8, 0x3c, 0xbe, 0x2b, 0xb6, 0xa3, 0xbd, 0x88, 0x57, 0xf4, 0xbd,
+ 0x13, 0x77, 0x31, 0xbe, 0xdc, 0xfa, 0xe1, 0x3d, 0x32, 0x39, 0x34, 0x3e,
+ 0xc7, 0x38, 0xd7, 0xbd, 0xd0, 0x1a, 0xb3, 0xbd, 0x7b, 0x8d, 0x38, 0xbd,
+ 0xcb, 0x32, 0x9b, 0xbe, 0x47, 0xa9, 0x4d, 0x3d, 0x78, 0x93, 0x5f, 0xbe,
+ 0xfb, 0xb5, 0x25, 0xbe, 0x82, 0x00, 0xb2, 0xbd, 0xa0, 0x48, 0x2f, 0x3e,
+ 0x03, 0xf1, 0x84, 0x3d, 0x49, 0x86, 0xd0, 0x3d, 0xea, 0x67, 0x6d, 0xbd,
+ 0x64, 0xfc, 0x3b, 0x3e, 0x62, 0x2f, 0xf5, 0x3d, 0x2b, 0x8d, 0x5d, 0xbc,
+ 0xb5, 0x29, 0x22, 0x3e, 0x89, 0xee, 0xd5, 0x3d, 0xec, 0xaa, 0xcc, 0x3d,
+ 0x45, 0x7c, 0x90, 0x3d, 0x13, 0x0a, 0x0e, 0x3e, 0xda, 0xf2, 0xeb, 0x3d,
+ 0x50, 0xe5, 0x0f, 0xbe, 0x30, 0x0c, 0x18, 0xbd, 0x98, 0xac, 0x3a, 0xbe,
+ 0x44, 0x2d, 0xc2, 0xbc, 0x30, 0x0e, 0xc4, 0x3d, 0xb6, 0x2d, 0x8d, 0xbc,
+ 0xf9, 0x76, 0xe3, 0x3d, 0x32, 0xca, 0x52, 0xbe, 0xab, 0x00, 0xfc, 0x3d,
+ 0xfd, 0x6e, 0x03, 0xbe, 0xc5, 0x77, 0x14, 0x3e, 0xb3, 0xab, 0x80, 0xbd,
+ 0xd2, 0x94, 0x89, 0xbd, 0xc4, 0xef, 0xa5, 0xbd, 0x60, 0x57, 0x27, 0x3e,
+ 0x8d, 0xfa, 0x14, 0xbe, 0x6e, 0x3e, 0x89, 0xbd, 0xb2, 0xba, 0x14, 0xbe,
+ 0xf3, 0x44, 0xdc, 0x3d, 0x5c, 0x9f, 0x96, 0xbd, 0x9c, 0x01, 0x16, 0xbe,
+ 0xda, 0x36, 0x0b, 0xbe, 0x6c, 0x54, 0x5a, 0x3d, 0xdb, 0x19, 0xad, 0x3d,
+ 0xf0, 0x9a, 0x05, 0x3b, 0xd2, 0x0f, 0xfa, 0xbd, 0x48, 0x21, 0xea, 0xbc,
+ 0x77, 0x3d, 0x1e, 0x3d, 0xfe, 0x1b, 0x2a, 0xbd, 0xf4, 0xfb, 0x47, 0xbd,
+ 0xa5, 0x1a, 0xdb, 0x3d, 0xdc, 0x26, 0x0e, 0x3e, 0x57, 0xf4, 0x99, 0x3d,
+ 0x3a, 0xa7, 0x92, 0x3d, 0x50, 0x98, 0x75, 0xbd, 0xa8, 0xee, 0x11, 0x3e,
+ 0xd8, 0x66, 0x31, 0xbd, 0xb5, 0xa3, 0xef, 0x3d, 0x4e, 0x3b, 0xc1, 0xbd,
+ 0x63, 0xcf, 0xda, 0x3d, 0x43, 0x76, 0x16, 0xbe, 0x89, 0x63, 0x96, 0xbc,
+ 0xc8, 0x01, 0xe4, 0xbd, 0xdd, 0x62, 0x6e, 0xbd, 0xec, 0xd0, 0x96, 0x3e,
+ 0x15, 0xcb, 0x07, 0x3e, 0x21, 0x41, 0xba, 0x3d, 0xdb, 0xd1, 0x14, 0x3e,
+ 0x0f, 0xd5, 0x52, 0x3d, 0xe8, 0x1c, 0x13, 0x3e, 0xa9, 0xa1, 0x57, 0x3d,
+ 0x1b, 0x89, 0xa0, 0xbc, 0x99, 0x65, 0x05, 0xbe, 0xf1, 0xd8, 0x1c, 0xbe,
+ 0x18, 0xe4, 0xa1, 0x3d, 0x87, 0xb3, 0xdf, 0x3d, 0x12, 0xa5, 0xef, 0xbd,
+ 0x81, 0x5d, 0x28, 0xbe, 0x2f, 0xaf, 0x48, 0xbb, 0x7b, 0xc1, 0x31, 0x3e,
+ 0x28, 0x02, 0x97, 0x3a, 0xa9, 0xda, 0xa1, 0xbd, 0x77, 0xed, 0x09, 0x3e,
+ 0xca, 0x55, 0xe1, 0x3d, 0x87, 0x21, 0x2b, 0x3e, 0x84, 0x5f, 0x10, 0x3e,
+ 0x9a, 0xf6, 0xa4, 0x3d, 0xe9, 0xdc, 0xbb, 0xbd, 0x5c, 0xc3, 0x2f, 0x3e,
+ 0x49, 0x73, 0x13, 0xbe, 0xbc, 0xf9, 0x8e, 0x3d, 0xf0, 0x0d, 0xb5, 0xbc,
+ 0x68, 0x9a, 0xb5, 0xbd, 0x29, 0x4b, 0x32, 0x3d, 0x79, 0xc4, 0x98, 0xbe,
+ 0x18, 0x44, 0x1a, 0x3e, 0x08, 0xb3, 0x3a, 0x3c, 0x9a, 0x20, 0xb7, 0xbd,
+ 0x2b, 0xa9, 0x04, 0xbd, 0xb2, 0xe8, 0xe2, 0x3d, 0x83, 0x87, 0xec, 0x3d,
+ 0xab, 0xb4, 0x5f, 0x3e, 0x84, 0x13, 0xb1, 0xbd, 0x78, 0x81, 0x85, 0xbe,
+ 0xeb, 0x24, 0xb8, 0xbd, 0x5e, 0x1f, 0x62, 0xbd, 0x5c, 0x93, 0x58, 0xbc,
+ 0xe4, 0xaf, 0xd3, 0xbd, 0x00, 0x43, 0x89, 0x3c, 0xb0, 0xf9, 0x87, 0xbd,
+ 0x4d, 0x86, 0xa7, 0x3d, 0x8c, 0xd1, 0x22, 0xbe, 0x57, 0x14, 0x3e, 0xbe,
+ 0x89, 0x0c, 0xdc, 0x3d, 0xcf, 0x26, 0xbc, 0x3b, 0xac, 0x1f, 0x21, 0xbe,
+ 0xed, 0xe7, 0xc6, 0xbd, 0x34, 0xf7, 0xe2, 0xbd, 0xe2, 0x08, 0xbc, 0x3c,
+ 0xf5, 0xd2, 0x80, 0x3d, 0x33, 0x38, 0x83, 0xbe, 0xe3, 0x15, 0x84, 0xbd,
+ 0xfe, 0xa6, 0xb3, 0x3d, 0xdd, 0x53, 0x11, 0xbe, 0x62, 0x87, 0xad, 0xbd,
+ 0x9e, 0xd5, 0x1c, 0x3e, 0x0c, 0x84, 0x02, 0xbe, 0x43, 0x06, 0x97, 0x3d,
+ 0x3d, 0x8d, 0x2e, 0xbe, 0x5c, 0x08, 0xd0, 0x3d, 0x93, 0x3d, 0x8c, 0xbd,
+ 0xf1, 0xcf, 0x1f, 0x3e, 0xd3, 0x31, 0x32, 0xbd, 0x1d, 0x3f, 0xfd, 0x3d,
+ 0xc1, 0x74, 0x66, 0xbe, 0x60, 0x14, 0x78, 0x3c, 0x18, 0x1f, 0x08, 0x3e,
+ 0x35, 0xbe, 0xb7, 0xbe, 0xb6, 0x2e, 0x0d, 0x3e, 0x7b, 0x1c, 0xc5, 0x3d,
+ 0xfa, 0x4a, 0x3b, 0xbc, 0x0c, 0xeb, 0x54, 0xbd, 0x2b, 0x5c, 0xee, 0xbc,
+ 0xa6, 0xa7, 0xab, 0xbd, 0x14, 0x67, 0x3d, 0xbc, 0x9d, 0xa0, 0x40, 0xbe,
+ 0xc2, 0x38, 0x32, 0xbd, 0xc1, 0x1b, 0x95, 0xbe, 0xe0, 0xec, 0x0c, 0x3e,
+ 0x12, 0xb7, 0x86, 0x3d, 0x96, 0x41, 0x25, 0xbe, 0x7a, 0x53, 0xb5, 0xbd,
+ 0x5d, 0x9f, 0xcd, 0xbd, 0x81, 0xe8, 0xac, 0xbd, 0xa3, 0xe2, 0x07, 0x3a,
+ 0x00, 0x06, 0xc4, 0xbd, 0x2d, 0xbc, 0xac, 0xbd, 0x52, 0xcf, 0x8a, 0x3d,
+ 0x0f, 0xc1, 0x66, 0xbe, 0xb2, 0x82, 0x95, 0x3b,
}};
const int32_t dnn_logits_bias_part_0_shape[1] = {1};
const union {
uint8_t bytes[4];
float values[1];
} dnn_logits_bias_part_0 = {{
- 0x8a,
- 0x71,
- 0x85,
- 0xbd,
+ 0xb5,
+ 0x4e,
+ 0x31,
+ 0xbe,
}};
-const int32_t dnn_logits_kernel_part_0_shape[2] = {132, 1};
+const int32_t dnn_logits_kernel_part_0_shape[2] = {59, 1};
const union {
- uint8_t bytes[528];
- float values[132];
+ uint8_t bytes[236];
+ float values[59];
} dnn_logits_kernel_part_0 = {{
- 0x59, 0xd7, 0x9e, 0x3d, 0xc4, 0x5c, 0xc0, 0x3a, 0x33, 0x3d, 0x2c, 0x3e,
- 0xed, 0xdf, 0x3a, 0x3d, 0x24, 0x4a, 0x0b, 0xbe, 0xfb, 0x87, 0x79, 0xbd,
- 0x2f, 0x47, 0xdc, 0xbb, 0x19, 0x42, 0xe8, 0xbd, 0x8f, 0x9e, 0x10, 0x3d,
- 0xf4, 0x56, 0x23, 0xbd, 0x0f, 0x37, 0xd4, 0x3c, 0x4c, 0x54, 0x12, 0xbd,
- 0x37, 0xfc, 0xbe, 0x3c, 0xc1, 0xc2, 0x87, 0xbb, 0xc6, 0xc5, 0xeb, 0xbb,
- 0x93, 0x73, 0x54, 0xbe, 0x29, 0xbf, 0x75, 0x3c, 0xa7, 0x55, 0x40, 0xbe,
- 0xd6, 0xea, 0x9f, 0x3c, 0x75, 0xd8, 0x5d, 0x3d, 0xb3, 0xde, 0xa1, 0x3d,
- 0x0f, 0x7b, 0x1d, 0x3d, 0x88, 0x28, 0x8a, 0x3d, 0xc9, 0x0d, 0xa2, 0x3d,
- 0x44, 0xff, 0x01, 0xbe, 0x9a, 0x5f, 0x1e, 0xbe, 0x48, 0xd2, 0xa3, 0x3d,
- 0x7f, 0xec, 0xb4, 0x3d, 0xa3, 0xbb, 0xc9, 0xbc, 0x4b, 0x82, 0x85, 0x3d,
- 0x68, 0xcd, 0xd4, 0x3d, 0x8c, 0x28, 0x3c, 0xbd, 0xcc, 0x7e, 0x12, 0xbd,
- 0x8b, 0x24, 0x13, 0x3e, 0x6c, 0x5a, 0x01, 0x3e, 0x50, 0x6d, 0x08, 0x3d,
- 0x6d, 0xb7, 0xa1, 0x3d, 0xff, 0xd0, 0x4c, 0xbd, 0xd6, 0x20, 0xa1, 0xbc,
- 0xf3, 0x04, 0x0a, 0x3b, 0xaf, 0x7c, 0xf0, 0xbc, 0xfe, 0x6c, 0x06, 0xbe,
- 0xdc, 0xa7, 0x6e, 0x3d, 0xf2, 0xc6, 0xcb, 0x3d, 0x1d, 0xbd, 0x7e, 0xbb,
- 0x13, 0x18, 0xe3, 0x3c, 0x59, 0x9a, 0xdc, 0xbb, 0x6c, 0x49, 0x56, 0xbe,
- 0xc3, 0x2a, 0x3b, 0x3b, 0x33, 0xfa, 0xaf, 0xbd, 0x34, 0x29, 0x4e, 0xbb,
- 0xdc, 0x95, 0x0d, 0x3d, 0x3e, 0x15, 0x3b, 0xbe, 0x88, 0xa3, 0x9c, 0x3d,
- 0xd9, 0xaa, 0xe0, 0x3c, 0x7e, 0x30, 0x7f, 0x3d, 0xcd, 0x68, 0x84, 0x3d,
- 0x82, 0x67, 0x84, 0x3b, 0x76, 0x8c, 0xd0, 0x3d, 0x0d, 0x9d, 0x89, 0xbd,
- 0x12, 0x18, 0x7b, 0xbd, 0x60, 0x58, 0x3f, 0xbd, 0xc2, 0x50, 0x42, 0xbc,
- 0xfd, 0xb4, 0xb0, 0xbc, 0xb1, 0xf3, 0xc1, 0xbc, 0x5b, 0xf0, 0x83, 0xbd,
- 0x8e, 0x01, 0xff, 0x3c, 0xec, 0x2b, 0x2e, 0xbe, 0xda, 0xbe, 0x1f, 0xbd,
- 0x34, 0xec, 0xc8, 0xbd, 0x27, 0xa7, 0x97, 0xbd, 0x23, 0xf2, 0x47, 0x3d,
- 0x7b, 0xe0, 0x89, 0xbd, 0x5d, 0x91, 0x49, 0xb9, 0x76, 0xa3, 0x06, 0x3e,
- 0xa5, 0xa5, 0x96, 0x3d, 0x26, 0x50, 0x34, 0xbe, 0xc0, 0x61, 0xee, 0x3d,
- 0xe4, 0x52, 0x52, 0x3d, 0x2e, 0xe6, 0x7e, 0xbc, 0xc3, 0xf6, 0x1d, 0xbe,
- 0xb5, 0x37, 0xa7, 0x3c, 0x90, 0x10, 0x17, 0x3d, 0xde, 0xac, 0x1c, 0x3d,
- 0x86, 0xc0, 0x30, 0x3d, 0x36, 0x7b, 0x83, 0xbd, 0x71, 0xdd, 0x3e, 0x3b,
- 0x37, 0x7e, 0x3f, 0xbd, 0xc6, 0x2f, 0x36, 0x3b, 0x32, 0xa6, 0x5a, 0x3d,
- 0x40, 0x8c, 0x3c, 0xbe, 0x88, 0xd5, 0xe1, 0x3c, 0x45, 0x60, 0x45, 0xbd,
- 0xae, 0xb4, 0x38, 0x3c, 0xa9, 0xb4, 0x5a, 0x3d, 0x9c, 0x33, 0x25, 0xbe,
- 0x54, 0x01, 0x9b, 0x3c, 0x5d, 0x10, 0x51, 0xbd, 0xc7, 0x22, 0x29, 0x3e,
- 0x83, 0xc7, 0x5a, 0xbc, 0x32, 0x96, 0xcd, 0xba, 0xc0, 0xc3, 0x03, 0x3c,
- 0xa0, 0x4c, 0xbe, 0xbd, 0xb8, 0xb9, 0x2d, 0x3d, 0x9d, 0x83, 0xe2, 0x3d,
- 0x91, 0x4a, 0x5a, 0x3b, 0xa2, 0x79, 0x98, 0xbc, 0x76, 0x61, 0x3f, 0xbd,
- 0x7d, 0xd3, 0x8e, 0x3c, 0xde, 0x8d, 0x02, 0x3e, 0x54, 0x2a, 0xc4, 0xbc,
- 0x08, 0x8b, 0x58, 0x3e, 0x84, 0x2a, 0x2c, 0xbd, 0x11, 0x3c, 0x17, 0xbd,
- 0x27, 0x80, 0x84, 0xbd, 0x4d, 0xd8, 0xee, 0x3d, 0x5c, 0x69, 0x20, 0xbd,
- 0x98, 0x61, 0x11, 0xbe, 0x0e, 0xde, 0x7b, 0x3d, 0xf6, 0xfb, 0x5c, 0xbe,
- 0xfd, 0x84, 0x3a, 0x3c, 0xbc, 0xb7, 0x08, 0x3d, 0xb7, 0x3d, 0xd7, 0xbd,
- 0x66, 0x0f, 0x15, 0xbd, 0xdd, 0x97, 0x3c, 0x3d, 0x3e, 0x12, 0x1c, 0x3c,
- 0xd8, 0x23, 0x62, 0x3c, 0x90, 0xe6, 0x2b, 0x3d, 0x2a, 0x1c, 0x47, 0x3b,
- 0x2d, 0xc6, 0x0b, 0x3e, 0x3a, 0x5f, 0x41, 0xbe, 0x01, 0x00, 0x03, 0xbd,
+ 0xd1, 0xee, 0x70, 0x3f, 0xf8, 0x86, 0x36, 0xbd, 0xb8, 0x30, 0x72, 0x3e,
+ 0x65, 0x2c, 0xfd, 0xbc, 0x40, 0x28, 0x8f, 0x3d, 0x4e, 0x10, 0xfd, 0x3d,
+ 0x6b, 0x77, 0xc6, 0xbe, 0xcb, 0xc1, 0x3c, 0x3e, 0x9d, 0xb6, 0x17, 0xbe,
+ 0xab, 0x7d, 0xc0, 0x3e, 0x1d, 0x1e, 0x91, 0xbe, 0x47, 0x43, 0xbe, 0xbd,
+ 0x9f, 0x10, 0xbd, 0xbe, 0x27, 0xfe, 0x8f, 0xbe, 0xf0, 0xc0, 0x39, 0x3e,
+ 0x01, 0x20, 0xbd, 0x3d, 0xa0, 0xb2, 0xef, 0xbc, 0xd4, 0x44, 0x1c, 0x3e,
+ 0x41, 0xd3, 0x90, 0xbe, 0x6f, 0x2c, 0x08, 0x3e, 0x42, 0xe4, 0xaa, 0x3d,
+ 0x30, 0x3a, 0xf1, 0x3b, 0x74, 0x68, 0xa9, 0x3e, 0x45, 0x2b, 0x9a, 0x3d,
+ 0x25, 0x54, 0xa2, 0xbd, 0x03, 0x70, 0x82, 0xbe, 0xf2, 0x1c, 0xa0, 0x3e,
+ 0x67, 0xd5, 0xb1, 0x3d, 0x41, 0x28, 0x2b, 0xbe, 0x3b, 0xb2, 0xc9, 0xbd,
+ 0x18, 0xa2, 0xba, 0x3d, 0xf4, 0x6b, 0x8e, 0xbe, 0xc5, 0xce, 0xd1, 0xbd,
+ 0x4a, 0x0b, 0x01, 0xbf, 0xfe, 0x86, 0x8f, 0x3e, 0x81, 0x73, 0x09, 0xbe,
+ 0xcb, 0x2b, 0xab, 0x3e, 0xe4, 0x0b, 0x9c, 0x3e, 0x9a, 0xb6, 0x92, 0x3e,
+ 0x8c, 0x61, 0x9f, 0xbe, 0x66, 0x8a, 0x8c, 0xbe, 0xd7, 0x0f, 0x5a, 0xbe,
+ 0xac, 0x62, 0x61, 0x3d, 0x6e, 0xa3, 0xf9, 0x3d, 0x79, 0x54, 0x92, 0xbe,
+ 0x71, 0x7e, 0x73, 0x3e, 0x1e, 0x21, 0x95, 0xbe, 0xdf, 0x4f, 0x6a, 0x3d,
+ 0x8a, 0xc1, 0x2e, 0xbc, 0xc6, 0x8f, 0x84, 0x3e, 0x11, 0xfe, 0x95, 0x3e,
+ 0x3a, 0x2f, 0x2b, 0x3e, 0x62, 0x2d, 0x60, 0xbe, 0x7f, 0xaa, 0x87, 0x3e,
+ 0x07, 0x6b, 0x7d, 0x3e, 0x33, 0xa6, 0x02, 0xbe, 0x46, 0xd9, 0xfa, 0xbc,
+ 0xe3, 0xb9, 0x00, 0x3f, 0x97, 0x75, 0x7a, 0x3e,
}};
} // anonymous namespace
@@ -17859,7 +15930,6 @@ const union {
int32_t input_from_feature_columns_input_layer_concat_concat0Shape[2] = {1,
193};
int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2] = {1, 1};
-
namespace internal_onedevice {
void Inference(
const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,193 */
@@ -17885,7 +15955,7 @@ void Inference(
fixed->alloc0);
fixed->shape0[0] = 1;
- fixed->shape0[1] = 102;
+ fixed->shape0[1] = 117;
// dnn/hiddenlayer_0/Relu
Relu<float>(2, // rank
@@ -17899,7 +15969,7 @@ void Inference(
dnn_hiddenlayer_1_bias_part_0.values, fixed->alloc1);
fixed->shape0[0] = 1;
- fixed->shape0[1] = 123;
+ fixed->shape0[1] = 115;
// dnn/hiddenlayer_1/Relu
Relu<float>(2, // rank
@@ -17913,7 +15983,7 @@ void Inference(
dnn_hiddenlayer_2_bias_part_0.values, fixed->alloc0);
fixed->shape0[0] = 1;
- fixed->shape0[1] = 132;
+ fixed->shape0[1] = 59;
// dnn/hiddenlayer_2/Relu
Relu<float>(2, // rank
diff --git a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h
index 6ec265662e0..8f6d1a6e7c4 100644
--- a/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h
+++ b/chromium/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h
@@ -9,8 +9,8 @@
namespace ui {
namespace internal_onedevice {
struct alignas(16) FixedAllocations {
- float alloc0[132];
- float alloc1[123];
+ float alloc0[117];
+ float alloc1[115];
int32_t shape0[2];
};
diff --git a/chromium/ui/events/ozone/layout/BUILD.gn b/chromium/ui/events/ozone/layout/BUILD.gn
index e3b623dae07..905e742aaa5 100644
--- a/chromium/ui/events/ozone/layout/BUILD.gn
+++ b/chromium/ui/events/ozone/layout/BUILD.gn
@@ -61,6 +61,7 @@ source_set("unittests") {
"keyboard_layout_engine_unittest.cc",
"xkb/xkb_keyboard_layout_engine_unittest.cc",
]
+ configs += [ ":xkbcommon" ]
}
deps = [
diff --git a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
index 3d41e2b2fb0..fa06e4ce6d0 100644
--- a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
+++ b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
@@ -852,6 +852,30 @@ void XkbKeyboardLayoutEngine::SetKeymap(xkb_keymap* keymap) {
num_lock_mask = flag;
}
}
+
+ // Reconstruct keysym map.
+ xkb_keysym_map_.clear();
+ const xkb_keycode_t min_key = xkb_keymap_min_keycode(keymap);
+ const xkb_keycode_t max_key = xkb_keymap_max_keycode(keymap);
+ for (xkb_keycode_t keycode = min_key; keycode <= max_key; ++keycode) {
+ const xkb_layout_index_t num_layouts =
+ xkb_keymap_num_layouts_for_key(keymap, keycode);
+ for (xkb_layout_index_t layout = 0; layout < num_layouts; ++layout) {
+ const xkb_level_index_t num_levels =
+ xkb_keymap_num_levels_for_key(keymap, keycode, layout);
+ for (xkb_level_index_t level = 0; level < num_levels; ++level) {
+ const xkb_keysym_t* keysyms;
+ int num_syms = xkb_keymap_key_get_syms_by_level(keymap, keycode, layout,
+ level, &keysyms);
+ for (int i = 0; i < num_syms; ++i) {
+ // Ignore if there already an entry for the current keysym.
+ // Iterating keycode from min to max, so the minimum value wins.
+ xkb_keysym_map_.emplace(keysyms[i], keycode);
+ }
+ }
+ }
+ }
+
layout_index_ = 0;
#if defined(OS_CHROMEOS)
// Update num lock mask.
@@ -893,6 +917,15 @@ int XkbKeyboardLayoutEngine::UpdateModifiers(uint32_t depressed,
return ui_flags;
}
+DomCode XkbKeyboardLayoutEngine::GetDomCodeByKeysym(uint32_t keysym) const {
+ auto iter = xkb_keysym_map_.find(keysym);
+ if (iter == xkb_keysym_map_.end()) {
+ VLOG(1) << "No Keycode found for the keysym: " << keysym;
+ return DomCode::NONE;
+ }
+ return KeycodeConverter::NativeKeycodeToDomCode(iter->second);
+}
+
bool XkbKeyboardLayoutEngine::XkbLookup(xkb_keycode_t xkb_keycode,
xkb_mod_mask_t xkb_flags,
xkb_keysym_t* xkb_keysym,
diff --git a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h
index ba916730919..25e2e35d07d 100644
--- a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h
+++ b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h
@@ -13,6 +13,7 @@
#include <vector>
#include "base/component_export.h"
+#include "base/containers/flat_map.h"
#include "base/memory/free_deleter.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
@@ -53,6 +54,8 @@ class COMPONENT_EXPORT(EVENTS_OZONE_LAYOUT) XkbKeyboardLayoutEngine
uint32_t locked,
uint32_t group);
+ DomCode GetDomCodeByKeysym(uint32_t keysym) const;
+
static void ParseLayoutName(const std::string& layout_name,
std::string* layout_id,
std::string* layout_variant);
@@ -66,6 +69,12 @@ class COMPONENT_EXPORT(EVENTS_OZONE_LAYOUT) XkbKeyboardLayoutEngine
};
std::vector<XkbFlagMapEntry> xkb_flag_map_;
+ // Table from xkb_keysym to xkb_keycode on the current keymap.
+ // Note that there could be multiple keycodes mapped to the same
+ // keysym. In the case, the first one (smallest keycode) will be
+ // kept.
+ base::flat_map<uint32_t, uint32_t> xkb_keysym_map_;
+
#if defined(OS_CHROMEOS)
// Flag mask for num lock, which is always considered enabled in ChromeOS.
xkb_mod_mask_t num_lock_mod_mask_ = 0;
diff --git a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
index 38445b1e7de..1d034ef053a 100644
--- a/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
+++ b/chromium/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine_unittest.cc
@@ -906,4 +906,42 @@ TEST_F(XkbLayoutEngineVkTest, XkbRuleNamesForLayoutName) {
}
}
+TEST_F(XkbLayoutEngineVkTest, GetDomCodeByKeysym) {
+ // Set up US keyboard layout.
+ {
+ std::unique_ptr<xkb_context, ui::XkbContextDeleter> xkb_context(
+ xkb_context_new(XKB_CONTEXT_NO_FLAGS));
+ xkb_rule_names names = {
+ .rules = nullptr,
+ .model = "pc101",
+ .layout = "us",
+ .variant = "",
+ .options = "",
+ };
+ std::unique_ptr<xkb_keymap, ui::XkbKeymapDeleter> xkb_keymap(
+ xkb_keymap_new_from_names(xkb_context.get(), &names,
+ XKB_KEYMAP_COMPILE_NO_FLAGS));
+ std::unique_ptr<char, base::FreeDeleter> layout(
+ xkb_keymap_get_as_string(xkb_keymap.get(), XKB_KEYMAP_FORMAT_TEXT_V1));
+ layout_engine_->SetCurrentLayoutFromBuffer(layout.get(),
+ std::strlen(layout.get()));
+ }
+
+ constexpr struct {
+ uint32_t keysym;
+ DomCode dom_code;
+ } kTestCases[] = {
+ {65307, ui::DomCode::ESCAPE}, {65288, ui::DomCode::BACKSPACE},
+ {65293, ui::DomCode::ENTER}, {65289, ui::DomCode::TAB},
+ {65056, ui::DomCode::TAB}, // SHIFT+TAB.
+ {65289, ui::DomCode::TAB}, // CTRL+TAB.
+ };
+
+ for (const auto& test_case : kTestCases) {
+ SCOPED_TRACE(test_case.keysym);
+ EXPECT_EQ(test_case.dom_code,
+ layout_engine_->GetDomCodeByKeysym(test_case.keysym));
+ }
+}
+
} // namespace ui
diff --git a/chromium/ui/events/platform/x11/BUILD.gn b/chromium/ui/events/platform/x11/BUILD.gn
index 7fcea67f705..559a1fbe7db 100644
--- a/chromium/ui/events/platform/x11/BUILD.gn
+++ b/chromium/ui/events/platform/x11/BUILD.gn
@@ -2,8 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
assert(use_x11 || ozone_platform_x11)
diff --git a/chromium/ui/events/platform/x11/x11_event_source.cc b/chromium/ui/events/platform/x11/x11_event_source.cc
index ae9b1d5174e..e23b03b8c9d 100644
--- a/chromium/ui/events/platform/x11/x11_event_source.cc
+++ b/chromium/ui/events/platform/x11/x11_event_source.cc
@@ -24,7 +24,6 @@
#include "ui/events/x/x11_window_event_manager.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/extension_manager.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xkb.h"
#include "ui/gfx/x/xproto.h"
@@ -53,12 +52,6 @@ void InitializeXkb(x11::Connection* connection) {
auto& xkb = connection->xkb();
- xkb.UseExtension({x11::Xkb::major_version, x11::Xkb::minor_version})
- .OnResponse(base::BindOnce([](x11::Xkb::UseExtensionResponse response) {
- if (!response || !response->supported)
- DVLOG(1) << "Xkb extension not available.";
- }));
-
// Ask the server not to send KeyRelease event when the user holds down a key.
// crbug.com/138092
xkb
@@ -77,7 +70,7 @@ void InitializeXkb(x11::Connection* connection) {
}));
constexpr auto kXkbAllMapPartMask = static_cast<x11::Xkb::MapPart>(0xff);
- xkb.SelectEvents({
+ xkb.SelectEvents(x11::Xkb::SelectEventsRequest{
.deviceSpec = static_cast<x11::Xkb::DeviceSpec>(x11::Xkb::Id::UseCoreKbd),
.affectWhich = x11::Xkb::EventType::NewKeyboardNotify,
.selectAll = x11::Xkb::EventType::NewKeyboardNotify,
@@ -168,7 +161,7 @@ x11::Time X11EventSource::GetCurrentServerTime() {
if (!dummy_initialized_) {
// Create a new Window and Atom that will be used for the property change.
dummy_window_ = connection_->GenerateId<x11::Window>();
- connection_->CreateWindow({
+ connection_->CreateWindow(x11::CreateWindowRequest{
.wid = dummy_window_,
.parent = connection_->default_root(),
.width = 1,
@@ -191,7 +184,7 @@ x11::Time X11EventSource::GetCurrentServerTime() {
// Make a no-op property change on |dummy_window_|.
std::vector<uint8_t> data{0};
- connection_->ChangeProperty({
+ connection_->ChangeProperty(x11::ChangePropertyRequest{
.window = static_cast<x11::Window>(dummy_window_),
.property = dummy_atom_,
.type = x11::Atom::STRING,
@@ -221,8 +214,9 @@ x11::Time X11EventSource::GetCurrentServerTime() {
};
auto& events = connection_->events();
- events.erase(std::remove_if(events.begin(), events.end(), pred),
- events.end());
+ auto it = std::find_if(events.begin(), events.end(), pred);
+ if (it != events.end())
+ *it = x11::Event();
return time;
}
diff --git a/chromium/ui/events/platform/x11/x11_event_source.h b/chromium/ui/events/platform/x11/x11_event_source.h
index 0e428776c52..b9fc9a0794f 100644
--- a/chromium/ui/events/platform/x11/x11_event_source.h
+++ b/chromium/ui/events/platform/x11/x11_event_source.h
@@ -16,8 +16,8 @@
#include "base/optional.h"
#include "ui/events/events_export.h"
#include "ui/events/platform/platform_event_source.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11_types.h"
namespace gfx {
class Point;
diff --git a/chromium/ui/events/platform/x11/x11_event_watcher_fdwatch.cc b/chromium/ui/events/platform/x11/x11_event_watcher_fdwatch.cc
index b41eba69ba7..99fcfe2a0b9 100644
--- a/chromium/ui/events/platform/x11/x11_event_watcher_fdwatch.cc
+++ b/chromium/ui/events/platform/x11/x11_event_watcher_fdwatch.cc
@@ -5,7 +5,6 @@
#include "ui/events/platform/x11/x11_event_watcher_fdwatch.h"
#include "base/task/current_thread.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
diff --git a/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc b/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc
index 04dd0f10efd..f523555ba14 100644
--- a/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc
+++ b/chromium/ui/events/platform/x11/x11_event_watcher_glib.cc
@@ -6,7 +6,6 @@
#include <glib.h>
-#include "ui/gfx/x/x11.h"
namespace ui {
diff --git a/chromium/ui/events/platform/x11/x11_hotplug_event_handler.cc b/chromium/ui/events/platform/x11/x11_hotplug_event_handler.cc
index 30a5bb7f46c..6a4da33776a 100644
--- a/chromium/ui/events/platform/x11/x11_hotplug_event_handler.cc
+++ b/chromium/ui/events/platform/x11/x11_hotplug_event_handler.cc
@@ -30,10 +30,9 @@
#include "ui/events/devices/device_util_linux.h"
#include "ui/events/devices/input_device.h"
#include "ui/events/devices/touchscreen_device.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/extension_manager.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_types.h"
namespace ui {
diff --git a/chromium/ui/events/x/OWNERS b/chromium/ui/events/x/OWNERS
index 2f2cf8fe42d..280ba478dca 100644
--- a/chromium/ui/events/x/OWNERS
+++ b/chromium/ui/events/x/OWNERS
@@ -1,3 +1 @@
thomasanderson@chromium.org
-
-# COMPONENT: UI>Input
diff --git a/chromium/ui/events/x/events_x_utils.cc b/chromium/ui/events/x/events_x_utils.cc
index 856dfb221e7..e9a4f6f0596 100644
--- a/chromium/ui/events/x/events_x_utils.cc
+++ b/chromium/ui/events/x/events_x_utils.cc
@@ -25,7 +25,6 @@
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/x/extension_manager.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xproto.h"
diff --git a/chromium/ui/events/x/events_x_utils.h b/chromium/ui/events/x/events_x_utils.h
index 4dbca2f3270..2a6e48d0b8e 100644
--- a/chromium/ui/events/x/events_x_utils.h
+++ b/chromium/ui/events/x/events_x_utils.h
@@ -17,7 +17,6 @@
#include "ui/events/x/events_x_export.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xinput.h"
namespace ui {
diff --git a/chromium/ui/events/x/keyboard_hook_x11.h b/chromium/ui/events/x/keyboard_hook_x11.h
index df28fad5831..b46384b20c3 100644
--- a/chromium/ui/events/x/keyboard_hook_x11.h
+++ b/chromium/ui/events/x/keyboard_hook_x11.h
@@ -11,8 +11,7 @@
#include "base/threading/thread_checker.h"
#include "ui/events/keyboard_hook_base.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/connection.h"
namespace ui {
diff --git a/chromium/ui/events/x/x11_event_translation.cc b/chromium/ui/events/x/x11_event_translation.cc
index 9d5926824fc..0858b17540b 100644
--- a/chromium/ui/events/x/x11_event_translation.cc
+++ b/chromium/ui/events/x/x11_event_translation.cc
@@ -17,7 +17,6 @@
#include "ui/events/types/event_type.h"
#include "ui/events/x/events_x_utils.h"
#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto.h"
#if defined(USE_OZONE)
diff --git a/chromium/ui/events/x/x11_event_translation.h b/chromium/ui/events/x/x11_event_translation.h
index 13f425607eb..a9d68c88261 100644
--- a/chromium/ui/events/x/x11_event_translation.h
+++ b/chromium/ui/events/x/x11_event_translation.h
@@ -11,7 +11,6 @@
#include "ui/events/event.h"
#include "ui/events/events_export.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
diff --git a/chromium/ui/events/x/x11_window_event_manager.cc b/chromium/ui/events/x/x11_window_event_manager.cc
index 182fdd808fc..c4ee322a963 100644
--- a/chromium/ui/events/x/x11_window_event_manager.cc
+++ b/chromium/ui/events/x/x11_window_event_manager.cc
@@ -7,7 +7,6 @@
#include <stddef.h>
#include "base/memory/singleton.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
@@ -20,9 +19,9 @@ void SetEventMask(x11::Window window, x11::EventMask new_mask) {
// change_attributes request may give a BadWindow error. In this case, just
// ignore the error.
connection
- ->ChangeWindowAttributes(
- {.window = window,
- .event_mask = static_cast<x11::EventMask>(new_mask)})
+ ->ChangeWindowAttributes(x11::ChangeWindowAttributesRequest{
+ .window = window,
+ .event_mask = static_cast<x11::EventMask>(new_mask)})
.IgnoreError();
}
diff --git a/chromium/ui/events/x/x11_window_event_manager.h b/chromium/ui/events/x/x11_window_event_manager.h
index d61e6648cf8..62cf8882b87 100644
--- a/chromium/ui/events/x/x11_window_event_manager.h
+++ b/chromium/ui/events/x/x11_window_event_manager.h
@@ -11,7 +11,7 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "ui/events/x/events_x_export.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/connection.h"
namespace base {
template <typename T>
diff --git a/chromium/ui/file_manager/BUILD.gn b/chromium/ui/file_manager/BUILD.gn
index 211d18c0236..fb6ec9b6785 100644
--- a/chromium/ui/file_manager/BUILD.gn
+++ b/chromium/ui/file_manager/BUILD.gn
@@ -2,8 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//chrome/common/features.gni")
import("//third_party/closure_compiler/compile_js.gni")
import("//tools/grit/grit_rule.gni")
+import("//tools/grit/preprocess_grit.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
grit("resources") {
source = "file_manager_resources.grd"
@@ -17,12 +20,9 @@ grit("resources") {
}
component("file_manager") {
- sources = [
- "file_manager_export.h",
- "file_manager_resource_util.cc",
- "file_manager_resource_util.h",
- ]
+ sources = [ "file_manager_export.h" ]
public_deps = [
+ ":file_manager_gen_resources",
":resources",
"//base",
]
@@ -60,13 +60,88 @@ group("unit_test_data") {
"base/js:js_test_gen_html",
"file_manager/background/js:js_test_gen_html",
"file_manager/common/js:js_test_gen_html",
+ "file_manager/common/js:js_test_gen_html_modules",
"file_manager/foreground/elements:js_test_gen_html",
"file_manager/foreground/js:js_test_gen_html",
"file_manager/foreground/js/metadata:js_test_gen_html",
+ "file_manager/foreground/js/metadata:js_test_gen_html_modules",
"file_manager/foreground/js/ui:js_test_gen_html",
"gallery/js:js_test_gen_html",
"gallery/js/image_editor:js_test_gen_html",
"image_loader:js_test_gen_html",
+ "image_loader:js_test_gen_html_modules",
"video_player/js:js_test_gen_html",
]
}
+
+preprocess_folder = "$target_gen_dir/preprocessed"
+
+# Inline images and move files to the preprocessed folder to combine all
+# resources in the same folder to be able to generate the JS bundle.
+# This is for files direct from the src/: input_folder="./".
+preprocess_grit("preprocess_static") {
+ in_folder = "./"
+ out_folder = preprocess_folder
+
+ in_files = [ "audio_player/js/main.m.js" ]
+
+ deps = [ "//ui/file_manager/audio_player/js:main.m" ]
+}
+
+# This is for files that are generated in "gen/": input_folder=target_gen_dir.
+preprocess_grit("preprocess_generated") {
+ in_folder = target_gen_dir
+ out_folder = preprocess_folder
+
+ in_files = [
+ "base/js/app_util.m.js",
+ "base/js/volume_manager_types.m.js",
+ "base/js/mediasession_types.m.js",
+ ]
+
+ deps = [ "//ui/file_manager/base/js:modulize" ]
+}
+
+grd_prefix = "file_manager_gen"
+generated_grd = "$target_gen_dir/${grd_prefix}_resources.grd"
+
+generate_grd("build_grd") {
+ out_grd = generated_grd
+
+ input_files_base_dir =
+ rebase_path("$target_gen_dir/preprocessed", root_gen_dir)
+ input_files = [ "../audio_player/js/main.m.rollup.js" ]
+
+ resource_path_rewrites =
+ [ "../audio_player/js/main.m.rollup.js|audio_player/js/main.m.js" ]
+
+ deps = [ "//ui/file_manager/audio_player/js:build" ]
+}
+
+# Resources for the JS modules.
+grit("file_manager_gen_resources") {
+ grit_flags = [
+ "-E",
+ "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
+ "-E",
+ "root_src_dir=" + rebase_path(root_gen_dir, root_build_dir),
+ ]
+
+ defines = chrome_grit_defines
+
+ # These arguments are needed since the grd is generated at build time.
+ enable_input_discovery_for_gn_analyze = false
+ defines +=
+ [ "SHARED_INTERMEDIATE_DIR=" + rebase_path(root_gen_dir, root_build_dir) ]
+
+ source = generated_grd
+ deps = [ ":build_grd" ]
+
+ outputs = [
+ "grit/file_manager_gen_resources.h",
+ "grit/file_manager_gen_resources_map.cc",
+ "grit/file_manager_gen_resources_map.h",
+ "file_manager_gen_resources.pak",
+ ]
+ output_dir = "$root_gen_dir/ui/file_manager"
+}
diff --git a/chromium/ui/file_manager/audio_player/elements/BUILD.gn b/chromium/ui/file_manager/audio_player/elements/BUILD.gn
index cc51218fe21..a23e22779a2 100644
--- a/chromium/ui/file_manager/audio_player/elements/BUILD.gn
+++ b/chromium/ui/file_manager/audio_player/elements/BUILD.gn
@@ -3,11 +3,18 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/polymer.gni")
-js_type_check("closure_compile") {
+group("closure_compile") {
+ deps = [
+ ":closure_compile_internal",
+ ":closure_compile_jsmodules",
+ ]
+}
+
+js_type_check("closure_compile_internal") {
deps = [
":audio_player",
- ":closure_compile_externs",
":control_panel",
":repeat_button",
":track_info_panel",
@@ -15,11 +22,6 @@ js_type_check("closure_compile") {
]
}
-js_library("closure_compile_externs") {
- sources = []
- externs_list = []
-}
-
js_library("audio_player") {
deps = [
":control_panel",
@@ -28,6 +30,32 @@ js_library("audio_player") {
]
}
+polymer_modulizer("audio_player") {
+ js_file = "audio_player.js"
+ html_file = "audio_player.html"
+ html_type = "dom-module"
+ preserve_url_scheme = true
+
+ auto_imports = [
+ "ui/file_manager/audio_player/elements/control_panel.html|AriaLabels",
+ "ui/file_manager/audio_player/elements/track_list.html|TrackInfo",
+ "third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-control-state.html|IronControlState",
+ ]
+}
+
+js_library("audio_player.m") {
+ sources = [
+ "$root_gen_dir/ui/file_manager/audio_player/elements/audio_player.m.js",
+ ]
+ deps = [
+ ":control_panel.m",
+ ":track_info_panel.m",
+ ":track_list.m",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
+ extra_deps = [ ":audio_player_module" ]
+}
+
js_library("control_panel") {
deps = [
":repeat_button",
@@ -36,6 +64,30 @@ js_library("control_panel") {
]
}
+polymer_modulizer("control_panel") {
+ js_file = "control_panel.js"
+ html_file = "control_panel.html"
+ html_type = "dom-module"
+ preserve_url_scheme = true
+
+ auto_imports = [ "ui/webui/resources/html/assert.html|assert" ]
+}
+
+js_library("control_panel.m") {
+ sources = [
+ "$root_gen_dir/ui/file_manager/audio_player/elements/control_panel.m.js",
+ ]
+ deps = [
+ ":repeat_button.m",
+ "//third_party/polymer/v3_0/components-chromium/font-roboto:roboto",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_slider:cr_slider.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/file_manager/file_manager/foreground/elements:files_icon_button.m",
+ ]
+ extra_deps = [ ":control_panel_module" ]
+}
+
js_library("repeat_button") {
deps = [
"//third_party/polymer/v1_0/components-chromium/iron-behaviors:iron-button-state-extracted",
@@ -46,5 +98,84 @@ js_library("repeat_button") {
js_library("track_info_panel") {
}
+polymer_modulizer("track_info_panel") {
+ js_file = "track_info_panel.js"
+ html_file = "track_info_panel.html"
+ html_type = "dom-module"
+ preserve_url_scheme = true
+}
+
+js_library("track_info_panel.m") {
+ sources = [
+ "$root_gen_dir/ui/file_manager/audio_player/elements/track_info_panel.m.js",
+ ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/font-roboto:roboto",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
+ ]
+ extra_deps = [ ":track_info_panel_module" ]
+}
+
js_library("track_list") {
}
+
+polymer_modulizer("track_list") {
+ js_file = "track_list.js"
+ html_file = "track_list.html"
+ html_type = "dom-module"
+ preserve_url_scheme = true
+}
+
+js_library("track_list.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/audio_player/elements/track_list.m.js" ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/font-roboto:roboto",
+ "//third_party/polymer/v3_0/components-chromium/paper-ripple:paper-ripple",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
+ extra_deps = [ ":track_list_module" ]
+}
+
+polymer_modulizer("repeat_button") {
+ js_file = "repeat_button.js"
+ html_file = "repeat_button.html"
+ html_type = "dom-module"
+ preserve_url_scheme = true
+
+ namespace_rewrites = [
+ "Polymer.IronButtonState|IronButtonState",
+ "Polymer.IronControlState|IronControlState",
+ ]
+
+ auto_imports = [
+ "third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-button-state.html|IronButtonState",
+ "third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-control-state.html|IronControlState",
+ ]
+}
+
+js_library("repeat_button.m") {
+ sources = [
+ "$root_gen_dir/ui/file_manager/audio_player/elements/repeat_button.m.js",
+ ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/iron-behaviors:iron-button-state",
+ "//third_party/polymer/v3_0/components-chromium/iron-behaviors:iron-control-state",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/file_manager/file_manager/foreground/elements:files_toggle_ripple.m",
+ ]
+ extra_deps = [ ":repeat_button_module" ]
+}
+
+js_type_check("closure_compile_jsmodules") {
+ is_polymer3 = true
+ closure_flags = default_closure_args + [ "browser_resolver_prefix_replacements=\"chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/=../../ui/file_manager/file_manager/\"" ]
+ deps = [
+ ":audio_player.m",
+ ":control_panel.m",
+ ":repeat_button.m",
+ ":track_info_panel.m",
+ ":track_list.m",
+ ]
+}
diff --git a/chromium/ui/file_manager/audio_player/js/BUILD.gn b/chromium/ui/file_manager/audio_player/js/BUILD.gn
index d9e0a9165df..2f9e191896e 100644
--- a/chromium/ui/file_manager/audio_player/js/BUILD.gn
+++ b/chromium/ui/file_manager/audio_player/js/BUILD.gn
@@ -2,9 +2,19 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//chrome/browser/resources/optimize_webui.gni")
import("//third_party/closure_compiler/compile_js.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
-js_type_check("closure_compile") {
+group("closure_compile") {
+ testonly = true
+ deps = [
+ ":closure_compile_jsmodules",
+ ":closure_compile_legacy",
+ ]
+}
+
+js_type_check("closure_compile_legacy") {
deps = [
":audio_player",
":background",
@@ -14,6 +24,15 @@ js_type_check("closure_compile") {
]
}
+js_type_check("closure_compile_jsmodules") {
+ uses_js_modules = true
+ deps = [
+ ":background.m",
+ ":error_util.m",
+ ":main.m",
+ ]
+}
+
js_library("closure_compile_externs") {
sources = []
externs_list = [
@@ -46,11 +65,79 @@ js_library("background") {
]
}
+js_library("background.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/audio_player/js/background.m.js" ]
+ deps = [
+ "//ui/file_manager/file_manager/background/js:app_window_wrapper.m",
+ "//ui/file_manager/file_manager/background/js:background_base.m",
+ "//ui/file_manager/file_manager/common/js:file_type.m",
+ "//ui/file_manager/file_manager/common/js:util.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("error_util") {
}
+js_library("error_util.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/audio_player/js/error_util.m.js" ]
+ extra_deps = [ ":modulize" ]
+}
+
js_library("metadata_worker") {
deps = [
"//ui/file_manager/file_manager/foreground/js/metadata:metadata_dispatcher",
]
}
+
+js_library("test_util") {
+}
+
+js_library("test_util.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/audio_player/js/test_util.m.js" ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("main.m") {
+ deps = [
+ "//ui/file_manager/base/js:app_util.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ ]
+}
+
+js_library("main_background.m") {
+ deps = [
+ ":background.m",
+ ":error_util.m",
+ "//ui/file_manager/file_manager/background/js:test_util_base.m",
+ ]
+}
+
+js_modulizer("modulize") {
+ input_files = [
+ "background.js",
+ "error_util.js",
+ "test_util.js",
+ ]
+}
+
+preprocess_folder =
+ rebase_path("$target_gen_dir/../../preprocessed/audio_player/js",
+ root_build_dir)
+
+optimize_webui("build") {
+ host = "audio_player"
+
+ input = preprocess_folder
+ js_module_in_files = [ "main.m.js" ]
+
+ js_out_files = [ "main.m.rollup.js" ]
+
+ deps = [
+ ":main.m",
+ "//ui/file_manager:preprocess_generated",
+ "//ui/file_manager:preprocess_static",
+ "//ui/webui/resources:preprocess",
+ ]
+}
diff --git a/chromium/ui/file_manager/base/gn/js_test_gen_html.gni b/chromium/ui/file_manager/base/gn/js_test_gen_html.gni
index cfc27c046cf..bd07dfba102 100644
--- a/chromium/ui/file_manager/base/gn/js_test_gen_html.gni
+++ b/chromium/ui/file_manager/base/gn/js_test_gen_html.gni
@@ -27,6 +27,12 @@ import("//third_party/closure_compiler/js_unit_tests.gni")
# generates HTMLImport instead of <script>. Only the main element is
# imported.
#
+# js_module:
+# Boolean indicating that it's a JS module so the HTML file will only
+# contain <script type="module" src="..._unittest.m.js"> and traditional
+# <script>s for mocks.
+#
+#
# Non-Polymer example:
# js_test_gen_html("folder_tests") {
# deps = [
@@ -70,6 +76,7 @@ template("js_test_gen_html") {
"deps",
"mocks",
"html_import",
+ "js_module",
])
testonly = true
sources = []
@@ -94,6 +101,10 @@ template("js_test_gen_html") {
args += [ "--html_import" ]
}
+ if (defined(js_module) && js_module) {
+ args += [ "--js_module" ]
+ }
+
if (defined(mocks)) {
args += [ "--mocks" ] + rebase_path(mocks, root_build_dir)
data = mocks
@@ -104,6 +115,9 @@ template("js_test_gen_html") {
type_check_target_name = target_name + "_" + dep + "_type_check_auto"
type_check_deps += [ ":$type_check_target_name" ]
js_type_check(type_check_target_name) {
+ if (defined(invoker.js_module) && invoker.js_module) {
+ uses_js_modules = true
+ }
testonly = true
forward_variables_from(invoker, [ "closure_flags" ])
deps = [ dep ]
diff --git a/chromium/ui/file_manager/base/js/BUILD.gn b/chromium/ui/file_manager/base/js/BUILD.gn
index 07c4ba1203d..a059200b9f6 100644
--- a/chromium/ui/file_manager/base/js/BUILD.gn
+++ b/chromium/ui/file_manager/base/js/BUILD.gn
@@ -5,15 +5,28 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/webui/resources/js/cr.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
visibility = [ "//ui/file_manager/*" ]
group("closure_compile") {
testonly = true
deps = [
+ ":closure_compile_jsmodules",
":closure_compile_module",
":js_test_gen_html_type_check_auto",
":test_support_type_check",
+ ":test_support_type_check_jsmodules",
+ ]
+}
+
+js_type_check("closure_compile_jsmodules") {
+ uses_js_modules = true
+ deps = [
+ ":app_util.m",
+ ":filtered_volume_manager.m",
+ ":volume_manager_types.m",
]
}
@@ -33,10 +46,27 @@ js_type_check("test_support_type_check") {
]
}
+js_type_check("test_support_type_check_jsmodules") {
+ uses_js_modules = true
+ testonly = true
+ deps = [
+ ":mock_chrome.m",
+ ":test_error_reporting.m",
+ ]
+}
+
js_library("app_util") {
externs_list = [ "//ui/file_manager/externs/app_window_common.js" ]
}
+js_library("app_util.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/base/js/app_util.m.js" ]
+ deps = [ "//ui/file_manager/externs:file_manager_private" ]
+ externs_list = [ "//ui/file_manager/externs/app_window_common.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("error_counter") {
}
@@ -54,10 +84,37 @@ js_library("filtered_volume_manager") {
[ "//ui/file_manager/externs/background/volume_manager_factory.js" ]
}
+js_library("filtered_volume_manager.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/base/js/filtered_volume_manager.m.js" ]
+ deps = [
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:entry_location.m",
+ "//ui/file_manager/externs:files_app_entry_interfaces.m",
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/file_manager/externs:volume_info_list.m",
+ "//ui/file_manager/externs:volume_manager.m",
+ "//ui/file_manager/file_manager/common/js:files_app_entry_types.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:cr.m",
+ "//ui/webui/resources/js/cr:event_target.m",
+ "//ui/webui/resources/js/cr/ui:array_data_model.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("mock_chrome") {
testonly = true
}
+js_library("mock_chrome.m") {
+ testonly = true
+ sources = [ "$root_gen_dir/ui/file_manager/base/js/mock_chrome.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("test_error_reporting") {
testonly = true
deps = [
@@ -67,6 +124,14 @@ js_library("test_error_reporting") {
]
}
+js_library("test_error_reporting.m") {
+ testonly = true
+ sources =
+ [ "$root_gen_dir/ui/file_manager/base/js/test_error_reporting.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("volume_manager_types") {
deps = [
"//ui/file_manager/externs:file_manager_private",
@@ -74,16 +139,52 @@ js_library("volume_manager_types") {
]
}
-js_unittest("volume_manager_types_unittest") {
+js_unittest("volume_manager_types_unittest.m") {
+ deps = [ ":volume_manager_types.m" ]
+}
+
+js_library("volume_manager_types.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/base/js/volume_manager_types.m.js" ]
+
deps = [
- ":volume_manager_types",
- "//ui/webui/resources/js:webui_resource_test",
+ "//ui/file_manager/externs:file_manager_private",
+ "//ui/webui/resources/js:assert.m",
]
+
+ extra_deps = [ ":modulize" ]
}
js_test_gen_html("js_test_gen_html") {
- deps = [ ":volume_manager_types_unittest" ]
+ deps = [ ":volume_manager_types_unittest.m" ]
+ js_module = true
+
+ closure_flags =
+ strict_error_checking_closure_args + [
+ "js_module_root=./gen/ui/file_manager/base/js",
+ "js_module_root=../../ui/file_manager/base/js",
+ "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ ]
}
js_library("mediasession_types") {
}
+
+js_library("mediasession_types.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/base/js/mediasession_types.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_modulizer("modulize") {
+ input_files = [
+ "app_util.js",
+ "filtered_volume_manager.js",
+ "mediasession_types.js",
+ "mock_chrome.js",
+ "test_error_reporting.js",
+ "volume_manager_types.js",
+ ]
+
+ namespace_rewrites = cr_namespace_rewrites
+}
diff --git a/chromium/ui/file_manager/externs/BUILD.gn b/chromium/ui/file_manager/externs/BUILD.gn
index 0c8dc8f639c..209cd367ddd 100644
--- a/chromium/ui/file_manager/externs/BUILD.gn
+++ b/chromium/ui/file_manager/externs/BUILD.gn
@@ -3,6 +3,7 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
js_library("file_manager_private") {
sources = []
@@ -17,6 +18,34 @@ js_library("file_manager_private") {
]
}
+js_library("entry_location.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/externs/entry_location.m.js" ]
+
+ deps = [
+ ":volume_info.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("files_app_entry_interfaces.m") {
+ sources = [
+ "$root_gen_dir/ui/file_manager/externs/files_app_entry_interfaces.m.js",
+ ]
+
+ deps = [ "//ui/file_manager/base/js:volume_manager_types.m" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("metadata_worker_window.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/externs/metadata_worker_window.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("volume_manager") {
sources = []
@@ -24,6 +53,51 @@ js_library("volume_manager") {
# depend on volume_manager_types.js as well, but that's not an extern.
externs_list = [
"entry_location.js",
+ "files_app_entry_interfaces.js",
+ "volume_info.js",
+ "volume_info_list.js",
+ "volume_manager.js",
+ ]
+}
+
+js_library("volume_manager.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/externs/volume_manager.m.js" ]
+
+ deps = [
+ ":entry_location.m",
+ ":files_app_entry_interfaces.m",
+ ":volume_info.m",
+ ":volume_info_list.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("volume_info.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/externs/volume_info.m.js" ]
+
+ deps = [
+ ":files_app_entry_interfaces.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("volume_info_list.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/externs/volume_info_list.m.js" ]
+
+ deps = [ ":volume_info.m" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_modulizer("modulize") {
+ input_files = [
+ "entry_location.js",
+ "files_app_entry_interfaces.js",
+ "metadata_worker_window.js",
"volume_info.js",
"volume_info_list.js",
"volume_manager.js",
diff --git a/chromium/ui/file_manager/file_manager/background/js/BUILD.gn b/chromium/ui/file_manager/file_manager/background/js/BUILD.gn
index ca79955ec83..80bb182d621 100644
--- a/chromium/ui/file_manager/file_manager/background/js/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/background/js/BUILD.gn
@@ -5,6 +5,8 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/webui/resources/js/cr.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
# TODO(tapted): This folder should be restricted to file_manager, but related
# apps currently depend on background_base, which depends on
@@ -22,8 +24,10 @@ related_apps = [
group("closure_compile") {
testonly = true
deps = [
+ ":closure_compile_jsmodules",
":closure_compile_module",
":js_test_gen_html_type_check_auto",
+ ":test_support_modules_type_check",
":test_support_type_check",
]
}
@@ -65,6 +69,28 @@ js_type_check("closure_compile_module") {
]
}
+js_type_check("closure_compile_jsmodules") {
+ uses_js_modules = true
+ deps = [
+ ":app_window_wrapper.m",
+ ":app_windows.m",
+ ":background_base.m",
+ ":entry_location_impl.m",
+ ":test_util_base.m",
+ ":volume_info_impl.m",
+ ":volume_info_list_impl.m",
+ ":volume_manager_factory.m",
+ ":volume_manager_impl.m",
+ ":volume_manager_util.m",
+ ]
+}
+
+js_type_check("test_support_modules_type_check") {
+ testonly = true
+ uses_js_modules = true
+ deps = [ ":mock_volume_manager.m" ]
+}
+
js_type_check("test_support_type_check") {
testonly = true
deps = [
@@ -112,9 +138,30 @@ js_library("app_window_wrapper") {
]
}
+js_library("app_window_wrapper.m") {
+ visibility += related_apps
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/app_window_wrapper.m.js" ]
+ deps = [
+ ":app_windows.m",
+ "//ui/file_manager/base/js:app_util.m",
+ "//ui/file_manager/file_manager/common/js:async_util.m",
+ "//ui/webui/resources/js:assert.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("app_windows") {
}
+js_library("app_windows.m") {
+ sources = [
+ "$root_gen_dir/ui/file_manager/file_manager/background/js/app_windows.m.js",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("background") {
deps = [
":app_windows",
@@ -131,6 +178,7 @@ js_library("background") {
":media_import_handler",
":mount_metrics",
":progress_center",
+ ":trash",
"//ui/file_manager/base/js:volume_manager_types",
"//ui/file_manager/file_manager/common/js:files_app_entry_types",
"//ui/file_manager/file_manager/common/js:metrics",
@@ -149,6 +197,19 @@ js_library("background_base") {
]
}
+js_library("background_base.m") {
+ visibility += related_apps
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/background_base.m.js" ]
+ deps = [
+ ":volume_manager_factory.m",
+ "//ui/file_manager/file_manager/common/js:util.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:load_time_data.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("crostini") {
deps = [
"//ui/file_manager/base/js:volume_manager_types",
@@ -253,6 +314,18 @@ js_library("entry_location_impl") {
externs_list = [ "//ui/file_manager/externs/entry_location.js" ]
}
+js_library("entry_location_impl.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/entry_location_impl.m.js" ]
+ deps = [
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:entry_location.m",
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/file_manager/file_manager/common/js:util.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("file_operation_handler") {
deps = [
":file_operation_manager",
@@ -282,6 +355,7 @@ js_library("mock_file_operation_manager") {
js_library("file_operation_manager") {
deps = [
":file_operation_util",
+ ":trash",
":volume_manager_factory",
"//ui/webui/resources/js:cr",
"//ui/webui/resources/js/cr:event_target",
@@ -427,12 +501,37 @@ js_library("mock_volume_manager") {
]
}
+js_library("mock_volume_manager.m") {
+ visibility += related_apps
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/mock_volume_manager.m.js" ]
+ deps = [
+ ":entry_location_impl.m",
+ ":volume_info_impl.m",
+ ":volume_info_list_impl.m",
+ ":volume_manager_factory.m",
+ ":volume_manager_impl.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:entry_location.m",
+ "//ui/file_manager/externs:files_app_entry_interfaces.m",
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/file_manager/externs:volume_info_list.m",
+ "//ui/file_manager/externs:volume_manager.m",
+ "//ui/file_manager/file_manager/common/js:mock_entry.m",
+ "//ui/file_manager/file_manager/common/js:util.m",
+ "//ui/webui/resources/js:assert.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("mock_progress_center") {
testonly = true
deps = [
":progress_center",
"//ui/webui/resources/js/cr:event_target",
]
+ visibility +=
+ [ "//ui/file_manager/file_manager/foreground/js:file_tasks_unittest" ]
}
js_library("progress_center") {
@@ -448,36 +547,6 @@ js_library("progress_center") {
]
}
-js_library("task_queue") {
- deps = [ "//ui/file_manager/file_manager/common/js:importer_common" ]
- externs_list = [ "//ui/file_manager/externs/background/task_queue.js" ]
-}
-
-js_unittest("task_queue_unittest") {
- deps = [
- ":task_queue",
- "//ui/file_manager/base/js:test_error_reporting",
- "//ui/file_manager/base/js:volume_manager_types",
- "//ui/file_manager/file_manager/common/js:importer_common",
- "//ui/file_manager/file_manager/common/js:progress_center_common",
- "//ui/webui/resources/js:assert",
- "//ui/webui/resources/js:cr",
- "//ui/webui/resources/js/cr:event_target",
- ]
- externs_list = [ "//ui/file_manager/externs/background/task_queue.js" ]
-}
-
-js_library("test_util_base") {
-}
-
-js_library("test_import_history") {
- testonly = true
- deps = [
- ":import_history",
- "//ui/webui/resources/js:webui_resource_test",
- ]
-}
-
js_library("runtime_loaded_test_util") {
# TODO(tapted): Move this target to //ui/file_manager/base. It is used in the
# background page of all |related_apps|, but loaded at runtime by
@@ -524,6 +593,73 @@ js_library("volume_info_impl") {
externs_list = [ "//ui/file_manager/externs/volume_info.js" ]
}
+js_library("volume_info_impl.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/volume_info_impl.m.js" ]
+ deps = [
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:files_app_entry_interfaces.m",
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/file_manager/file_manager/common/js:files_app_entry_types.m",
+ "//ui/file_manager/file_manager/common/js:util.m",
+ "//ui/webui/resources/js:assert.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("task_queue") {
+ deps = [ "//ui/file_manager/file_manager/common/js:importer_common" ]
+ externs_list = [ "//ui/file_manager/externs/background/task_queue.js" ]
+}
+
+js_unittest("task_queue_unittest") {
+ deps = [
+ ":task_queue",
+ "//ui/file_manager/base/js:test_error_reporting",
+ "//ui/file_manager/base/js:volume_manager_types",
+ "//ui/file_manager/file_manager/common/js:importer_common",
+ "//ui/file_manager/file_manager/common/js:progress_center_common",
+ "//ui/webui/resources/js:assert",
+ "//ui/webui/resources/js:cr",
+ "//ui/webui/resources/js/cr:event_target",
+ ]
+ externs_list = [ "//ui/file_manager/externs/background/task_queue.js" ]
+}
+
+js_library("test_util_base") {
+}
+
+js_library("test_util_base.m") {
+ visibility += related_apps
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/test_util_base.m.js" ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("test_import_history") {
+ testonly = true
+ deps = [
+ ":import_history",
+ "//ui/webui/resources/js:webui_resource_test",
+ ]
+}
+
+js_library("trash") {
+ deps = [
+ ":file_operation_util",
+ "//ui/file_manager/base/js:volume_manager_types",
+ "//ui/file_manager/externs:volume_manager",
+ ]
+}
+
+js_unittest("trash_unittest") {
+ deps = [
+ ":mock_volume_manager",
+ ":trash",
+ "//ui/file_manager/file_manager/common/js:mock_entry",
+ "//ui/webui/resources/js:webui_resource_test",
+ ]
+}
+
js_library("volume_info_list_impl") {
deps = [
".:volume_info_impl",
@@ -535,6 +671,17 @@ js_library("volume_info_list_impl") {
externs_list = [ "//ui/file_manager/externs/volume_info_list.js" ]
}
+js_library("volume_info_list_impl.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/volume_info_list_impl.m.js" ]
+ deps = [
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/file_manager/externs:volume_info_list.m",
+ "//ui/webui/resources/js/cr/ui:array_data_model.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("mount_metrics") {
deps = [ "//ui/file_manager/file_manager/common/js:metrics" ]
}
@@ -558,10 +705,39 @@ js_library("volume_manager_impl") {
externs_list = [ "//ui/file_manager/externs/volume_manager.js" ]
}
+js_library("volume_manager_impl.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/volume_manager_impl.m.js" ]
+ deps = [
+ ":entry_location_impl.m",
+ ":volume_info_list_impl.m",
+ ":volume_manager_util.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/file_manager/externs:volume_manager.m",
+ "//ui/file_manager/file_manager/common/js:async_util.m",
+ "//ui/file_manager/file_manager/common/js:util.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:cr.m",
+ "//ui/webui/resources/js/cr:event_target.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("volume_manager_factory") {
deps = [ ":volume_manager_impl" ]
}
+js_library("volume_manager_factory.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/volume_manager_factory.m.js" ]
+ deps = [
+ ":volume_manager_impl.m",
+ "//ui/file_manager/externs:volume_manager.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_unittest("volume_manager_unittest") {
deps = [
":volume_manager_factory",
@@ -580,6 +756,18 @@ js_library("volume_manager_util") {
]
}
+js_library("volume_manager_util.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/background/js/volume_manager_util.m.js" ]
+ deps = [
+ ":volume_info_impl.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/file_manager/file_manager/common/js:util.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_test_gen_html("js_test_gen_html") {
deps = [
":crostini_unittest",
@@ -594,6 +782,25 @@ js_test_gen_html("js_test_gen_html") {
":metadata_proxy_unittest",
":mount_metrics_unittest",
":task_queue_unittest",
+ ":trash_unittest",
":volume_manager_unittest",
]
}
+
+js_modulizer("modulize") {
+ input_files = [
+ "app_windows.js",
+ "app_window_wrapper.js",
+ "background_base.js",
+ "entry_location_impl.js",
+ "mock_volume_manager.js",
+ "test_util_base.js",
+ "volume_info_impl.js",
+ "volume_info_list_impl.js",
+ "volume_manager_factory.js",
+ "volume_manager_impl.js",
+ "volume_manager_util.js",
+ ]
+
+ namespace_rewrites = cr_namespace_rewrites
+}
diff --git a/chromium/ui/file_manager/file_manager/common/js/BUILD.gn b/chromium/ui/file_manager/file_manager/common/js/BUILD.gn
index 3ad516d74e6..25c4c6e75ff 100644
--- a/chromium/ui/file_manager/file_manager/common/js/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/common/js/BUILD.gn
@@ -5,6 +5,8 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/webui/resources/js/cr.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
# TODO(tapted): This entire folder should move to //ui/file_manager/base.
visibility = [ "//ui/file_manager/*" ]
@@ -12,7 +14,9 @@ visibility = [ "//ui/file_manager/*" ]
group("closure_compile") {
testonly = true
deps = [
+ ":closure_compile_jsmodules",
":closure_compile_module",
+ ":js_test_gen_html_modules_type_check_auto",
":js_test_gen_html_type_check_auto",
":test_support_type_check",
]
@@ -34,6 +38,20 @@ js_type_check("closure_compile_module") {
]
}
+js_type_check("closure_compile_jsmodules") {
+ uses_js_modules = true
+ deps = [
+ ":async_util.m",
+ ":file_type.m",
+ ":files_app_entry_types.m",
+ ":lru_cache.m",
+ ":metrics.m",
+ ":metrics_base.m",
+ ":mock_entry.m",
+ ":util.m",
+ ]
+}
+
js_type_check("test_support_type_check") {
testonly = true
deps = [
@@ -45,20 +63,42 @@ js_type_check("test_support_type_check") {
js_library("async_util") {
}
+js_library("async_util.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/file_manager/common/js/async_util.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("files_app_entry_types") {
deps = [ "//ui/file_manager/externs:file_manager_private" ]
- externs_list = [ "//ui/file_manager/externs/volume_info.js" ]
+ externs_list = [
+ "//ui/file_manager/externs/files_app_entry_interfaces.js",
+ "//ui/file_manager/externs/volume_info.js",
+ ]
}
-js_unittest("files_app_entry_types_unittest") {
+js_unittest("files_app_entry_types_unittest.m") {
deps = [
- ":files_app_entry_types",
- ":mock_entry",
- "//ui/file_manager/base/js:test_error_reporting",
- "//ui/file_manager/base/js:volume_manager_types",
+ ":files_app_entry_types.m",
+ ":mock_entry.m",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/base/js:test_error_reporting.m",
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/webui/resources/js:assert.m",
]
}
+js_library("files_app_entry_types.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/common/js/files_app_entry_types.m.js" ]
+ deps = [
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:volume_info.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("file_type") {
deps = [
":files_app_entry_types",
@@ -66,11 +106,25 @@ js_library("file_type") {
]
}
-js_unittest("file_type_unittest") {
+js_library("file_type.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/file_manager/common/js/file_type.m.js" ]
deps = [
- ":file_type",
- ":mock_entry",
- "//ui/file_manager/base/js:test_error_reporting",
+ ":files_app_entry_types.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:files_app_entry_interfaces.m",
+ "//ui/webui/resources/js:assert.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_unittest("file_type_unittest.m") {
+ deps = [
+ ":file_type.m",
+ ":mock_entry.m",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/base/js:volume_manager_types.m",
]
}
@@ -112,10 +166,17 @@ js_unittest("importer_common_unittest") {
js_library("lru_cache") {
}
-js_unittest("lru_cache_unittest") {
+js_library("lru_cache.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/file_manager/common/js/lru_cache.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_unittest("lru_cache_unittest.m") {
deps = [
- ":lru_cache",
- "//ui/webui/resources/js:webui_resource_test",
+ ":lru_cache.m",
+ "//chrome/test/data/webui:chai_assert",
]
}
@@ -129,10 +190,29 @@ js_library("metrics") {
]
}
+js_library("metrics.m") {
+ visibility = []
+ visibility = [ "//ui/file_manager/file_manager/*" ]
+ sources =
+ [ "$root_gen_dir/ui/file_manager/file_manager/common/js/metrics.m.js" ]
+ deps = [ ":metrics_base.m" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("metrics_base") {
externs_list = [ "$externs_path/metrics_private.js" ]
}
+js_library("metrics_base.m") {
+ sources = [
+ "$root_gen_dir/ui/file_manager/file_manager/common/js/metrics_base.m.js",
+ ]
+ externs_list = [ "$externs_path/metrics_private.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("mock_entry") {
deps = [
":util",
@@ -140,6 +220,14 @@ js_library("mock_entry") {
]
}
+js_library("mock_entry.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/file_manager/common/js/mock_entry.m.js" ]
+ deps = [ ":util.m" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("progress_center_common") {
}
@@ -177,22 +265,76 @@ js_library("util") {
]
}
-js_unittest("util_unittest") {
+js_library("util.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/common/js/util.m.js" ]
+
deps = [
- ":files_app_entry_types",
- ":mock_entry",
- ":unittest_util",
- ":util",
- "//ui/file_manager/file_manager/background/js:mock_volume_manager",
+ ":files_app_entry_types.m",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/externs:entry_location.m",
+ "//ui/file_manager/externs:file_manager_private",
+ "//ui/file_manager/externs:files_app_entry_interfaces.m",
+ "//ui/file_manager/externs:volume_info.m",
+ "//ui/file_manager/externs:volume_manager.m",
+ "//ui/file_manager/file_manager/common/js:files_app_entry_types.m",
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js:load_time_data.m",
+ "//ui/webui/resources/js:util.m",
+ "//ui/webui/resources/js/cr:ui.m",
+ ]
+
+ externs_list = [
+ "//ui/file_manager/externs/platform.js",
+ "//ui/file_manager/externs/app_window_common.js",
]
+
+ extra_deps = [ ":modulize" ]
}
-js_test_gen_html("js_test_gen_html") {
+js_unittest("util_unittest.m") {
+ deps = [
+ ":files_app_entry_types.m",
+ ":mock_entry.m",
+ ":util.m",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/base/js:volume_manager_types.m",
+ "//ui/file_manager/file_manager/background/js:mock_volume_manager.m",
+ ]
+}
+
+js_test_gen_html("js_test_gen_html_modules") {
+ js_module = true
deps = [
- ":file_type_unittest",
- ":files_app_entry_types_unittest",
- ":importer_common_unittest",
- ":lru_cache_unittest",
- ":util_unittest",
+ ":file_type_unittest.m",
+ ":files_app_entry_types_unittest.m",
+ ":lru_cache_unittest.m",
+ ":util_unittest.m",
]
+
+ closure_flags =
+ strict_error_checking_closure_args + [
+ "js_module_root=./gen/ui",
+ "js_module_root=../../ui",
+ "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ "hide_warnings_for=third_party/",
+ ]
+}
+
+js_test_gen_html("js_test_gen_html") {
+ deps = [ ":importer_common_unittest" ]
+}
+
+js_modulizer("modulize") {
+ input_files = [
+ "async_util.js",
+ "file_type.js",
+ "files_app_entry_types.js",
+ "lru_cache.js",
+ "metrics.js",
+ "metrics_base.js",
+ "mock_entry.js",
+ "util.js",
+ ]
+
+ namespace_rewrites = cr_namespace_rewrites
}
diff --git a/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn
index 600cedb4c15..bdd5bef84af 100644
--- a/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/elements/BUILD.gn
@@ -5,6 +5,7 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//tools/polymer/polymer.gni")
visibility = [ "//ui/file_manager/file_manager/foreground/*" ]
@@ -12,12 +13,13 @@ group("closure_compile") {
testonly = true
visibility += [ "//ui/file_manager:closure_compile" ]
deps = [
- ":closure_compile_module",
+ ":closure_compile_internal",
+ ":closure_compile_jsmodules",
":js_test_gen_html_type_check_auto",
]
}
-js_type_check("closure_compile_module") {
+js_type_check("closure_compile_internal") {
deps = [
":files_format_dialog",
":files_icon_button",
@@ -40,6 +42,15 @@ js_type_check("closure_compile_module") {
]
}
+js_type_check("closure_compile_jsmodules") {
+ is_polymer3 = true
+ deps = [
+ ":files_icon_button.m",
+ ":files_toggle_ripple.m",
+ ":files_ripple.m",
+ ]
+}
+
js_library("files_format_dialog") {
deps = [
"//ui/file_manager/file_manager/common/js:util",
@@ -57,6 +68,37 @@ js_library("files_icon_button") {
]
}
+polymer_modulizer("files_icon_button") {
+ js_file = "files_icon_button.js"
+ html_file = "files_icon_button.html"
+ html_type = "dom-module"
+ preserve_url_scheme = true
+
+ namespace_rewrites = [
+ "Polymer.IronButtonState|IronButtonState",
+ "Polymer.IronControlState|IronControlState",
+ ]
+
+ auto_imports = [
+ "third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-button-state.html|IronButtonState",
+ "third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-control-state.html|IronControlState",
+ ]
+}
+
+js_library("files_icon_button.m") {
+ visibility += [ "//ui/file_manager/audio_player/*" ]
+ sources = [
+ "$root_gen_dir/ui/file_manager/file_manager/foreground/elements/files_icon_button.m.js",
+ ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/iron-behaviors:iron-button-state",
+ "//third_party/polymer/v3_0/components-chromium/iron-behaviors:iron-control-state",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ":files_toggle_ripple.m",
+ ]
+ extra_deps = [ ":files_icon_button_module" ]
+}
+
js_library("files_message") {
deps = [
"//ui/webui/resources/cr_elements/cr_button:cr_button",
@@ -110,6 +152,26 @@ js_library("files_ripple") {
deps = [ "//ui/webui/resources/js:assert" ]
}
+polymer_modulizer("files_ripple") {
+ js_file = "files_ripple.js"
+ html_file = "files_ripple.html"
+ html_type = "dom-module"
+ preserve_url_scheme = true
+
+ auto_imports = [ "ui/webui/resources/html/assert.html|assert,assertInstanceof" ]
+}
+
+js_library("files_ripple.m") {
+ sources = [
+ "$root_gen_dir/ui/file_manager/file_manager/foreground/elements/files_ripple.m.js",
+ ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:assert.m",
+ ]
+ extra_deps = [ ":files_ripple_module" ]
+}
+
js_library("files_safe_media") {
}
@@ -133,6 +195,24 @@ js_library("files_toggle_ripple") {
visibility += [ "//ui/file_manager/gallery/*" ]
}
+polymer_modulizer("files_toggle_ripple") {
+ js_file = "files_toggle_ripple.js"
+ html_file = "files_toggle_ripple.html"
+ html_type = "dom-module"
+ preserve_url_scheme = true
+}
+
+js_library("files_toggle_ripple.m") {
+ visibility += [ "//ui/file_manager/audio_player/*" ]
+ sources = [
+ "$root_gen_dir/ui/file_manager/file_manager/foreground/elements/files_toggle_ripple.m.js",
+ ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ ]
+ extra_deps = [ ":files_toggle_ripple_module" ]
+}
+
# TODO(tapted): Move this to //ui/file_manager/base.
js_library("files_tooltip") {
visibility += [ "//ui/file_manager/gallery/*" ]
diff --git a/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn
index 98e88d58552..14880668adc 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/BUILD.gn
@@ -412,8 +412,11 @@ js_library("file_manager_commands") {
"//ui/webui/resources/cr_elements/cr_input:cr_input",
]
externs_list = [
+ "//ui/file_manager/externs/background/file_operation_manager.js",
"//ui/file_manager/externs/background/progress_center.js",
"//ui/file_manager/externs/command_handler_deps.js",
+ "//ui/file_manager/externs/file_operation_progress_event.js",
+ "//ui/file_manager/externs/file_operation_util.js",
]
}
@@ -462,6 +465,7 @@ js_unittest("file_tasks_unittest") {
"//ui/file_manager/base/js:mock_chrome",
"//ui/file_manager/base/js:test_error_reporting",
"//ui/file_manager/file_manager/background/js:mock_crostini",
+ "//ui/file_manager/file_manager/background/js:mock_progress_center",
"//ui/file_manager/file_manager/common/js:mock_entry",
]
}
diff --git a/chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
index 6cd128cce09..6d32dd0f1c0 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
@@ -5,6 +5,7 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
# TODO(tapted): This entire folder should move to //ui/file_manager/base.
visibility = [ "//ui/file_manager/*" ]
@@ -12,11 +13,33 @@ visibility = [ "//ui/file_manager/*" ]
group("closure_compile") {
testonly = true
deps = [
+ ":closure_compile_jsmodules",
":closure_compile_module",
+ ":js_test_gen_html_modules_type_check_auto",
":js_test_gen_html_type_check_auto",
]
}
+js_type_check("closure_compile_jsmodules") {
+ uses_js_modules = true
+ deps = [
+ ":byte_reader.m",
+ ":exif_constants.m",
+ ":external_metadata_provider.m",
+ ":file_system_metadata_provider.m",
+ ":function_parallel.m",
+ ":function_sequence.m",
+ ":image_orientation.m",
+ ":image_parsers.m",
+ ":metadata_cache_item.m",
+ ":metadata_item.m",
+ ":metadata_parser.m",
+ ":metadata_provider.m",
+ ":metadata_request.m",
+ ":mpeg_parser.m",
+ ]
+}
+
js_type_check("closure_compile_module") {
deps = [
":byte_reader",
@@ -47,6 +70,12 @@ js_type_check("closure_compile_module") {
js_library("byte_reader") {
}
+js_library("byte_reader.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/byte_reader.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("content_metadata_provider") {
deps = [
":metadata_provider",
@@ -66,6 +95,12 @@ js_unittest("content_metadata_provider_unittest") {
js_library("exif_constants") {
}
+js_library("exif_constants.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/exif_constants.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("exif_parser") {
deps = [
":exif_constants",
@@ -89,11 +124,26 @@ js_library("external_metadata_provider") {
]
}
-js_unittest("external_metadata_provider_unittest") {
+js_library("external_metadata_provider.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/external_metadata_provider.m.js" ]
deps = [
- ":external_metadata_provider",
- "//ui/file_manager/base/js:mock_chrome",
- "//ui/file_manager/base/js:test_error_reporting",
+ ":metadata_item.m",
+ ":metadata_provider.m",
+ ":metadata_request.m",
+ "//ui/file_manager/externs:file_manager_private",
+ "//ui/webui/resources/js:assert.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_unittest("external_metadata_provider_unittest.m") {
+ deps = [
+ ":external_metadata_provider.m",
+ ":metadata_request.m",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/base/js:mock_chrome.m",
+ "//ui/file_manager/base/js:test_error_reporting.m",
]
}
@@ -101,10 +151,22 @@ js_library("file_system_metadata_provider") {
deps = [ ":metadata_provider" ]
}
-js_unittest("file_system_metadata_provider_unittest") {
+js_library("file_system_metadata_provider.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/file_system_metadata_provider.m.js" ]
deps = [
- ":file_system_metadata_provider",
- "//ui/file_manager/base/js:test_error_reporting",
+ ":metadata_item.m",
+ ":metadata_provider.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_unittest("file_system_metadata_provider_unittest.m") {
+ deps = [
+ ":file_system_metadata_provider.m",
+ ":metadata_request.m",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/base/js:test_error_reporting.m",
]
}
@@ -112,10 +174,24 @@ js_library("function_parallel") {
deps = [ ":metadata_parser" ]
}
+js_library("function_parallel.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/function_parallel.m.js" ]
+ deps = [ ":metadata_parser.m" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("function_sequence") {
deps = [ ":metadata_parser" ]
}
+js_library("function_sequence.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/function_sequence.m.js" ]
+ deps = [ ":metadata_parser.m" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("id3_parser") {
deps = [
":byte_reader",
@@ -128,10 +204,16 @@ js_library("id3_parser") {
js_library("image_orientation") {
}
-js_unittest("image_orientation_unittest") {
+js_library("image_orientation.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/image_orientation.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_unittest("image_orientation_unittest.m") {
deps = [
- ":image_orientation",
- "//ui/webui/resources/js:webui_resource_test",
+ ":image_orientation.m",
+ "//chrome/test/data/webui:chai_assert",
]
}
@@ -140,6 +222,17 @@ js_library("image_parsers") {
externs_list = [ "//ui/file_manager/externs/metadata_worker_window.js" ]
}
+js_library("image_parsers.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/image_parsers.m.js" ]
+ deps = [
+ ":byte_reader.m",
+ ":metadata_parser.m",
+ "//ui/file_manager/externs:metadata_worker_window.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("metadata_cache_item") {
deps = [
":metadata_item",
@@ -147,10 +240,21 @@ js_library("metadata_cache_item") {
]
}
-js_unittest("metadata_cache_item_unittest") {
+js_library("metadata_cache_item.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/metadata_cache_item.m.js" ]
deps = [
- ":metadata_cache_item",
- "//ui/webui/resources/js:webui_resource_test",
+ ":metadata_item.m",
+ "//ui/webui/resources/js:assert.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_unittest("metadata_cache_item_unittest.m") {
+ deps = [
+ ":metadata_cache_item.m",
+ ":metadata_item.m",
+ "//chrome/test/data/webui:chai_assert",
]
}
@@ -187,6 +291,12 @@ js_library("metadata_dispatcher") {
js_library("metadata_item") {
}
+js_library("metadata_item.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("metadata_model") {
deps = [
":content_metadata_provider",
@@ -212,6 +322,16 @@ js_library("metadata_parser") {
deps = [ ":byte_reader" ]
}
+js_library("metadata_parser.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/metadata_parser.m.js" ]
+ deps = [
+ ":byte_reader.m",
+ "//ui/file_manager/externs:metadata_worker_window.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("metadata_provider") {
deps = [
":metadata_item",
@@ -220,9 +340,26 @@ js_library("metadata_provider") {
]
}
+js_library("metadata_provider.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/metadata_provider.m.js" ]
+ deps = [
+ ":metadata_item.m",
+ ":metadata_request.m",
+ "//ui/webui/resources/js:assert.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("metadata_request") {
}
+js_library("metadata_request.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/metadata_request.m.js" ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("mock_metadata") {
deps = [ ":metadata_model" ]
}
@@ -231,6 +368,17 @@ js_library("mpeg_parser") {
deps = [ ":metadata_parser" ]
}
+js_library("mpeg_parser.m") {
+ sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/mpeg_parser.m.js" ]
+ deps = [
+ ":byte_reader.m",
+ ":metadata_parser.m",
+ "//ui/file_manager/externs:metadata_worker_window.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("multi_metadata_provider") {
deps = [
":content_metadata_provider",
@@ -260,14 +408,26 @@ js_unittest("thumbnail_model_unittest") {
]
}
+js_test_gen_html("js_test_gen_html_modules") {
+ deps = [
+ ":external_metadata_provider_unittest.m",
+ ":file_system_metadata_provider_unittest.m",
+ ":image_orientation_unittest.m",
+ ":metadata_cache_item_unittest.m",
+ ]
+ js_module = true
+
+ closure_flags = strict_error_checking_closure_args + [
+ "js_module_root=./gen/ui/file_manager/file_manager/foreground/js/metadata",
+ "js_module_root=../../ui/file_manager/file_manager/foreground/js/metadata",
+ "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ ]
+}
+
js_test_gen_html("js_test_gen_html") {
deps = [
":content_metadata_provider_unittest",
":exif_parser_unittest",
- ":external_metadata_provider_unittest",
- ":file_system_metadata_provider_unittest",
- ":image_orientation_unittest",
- ":metadata_cache_item_unittest",
":metadata_cache_set_unittest",
":metadata_model_unittest",
":multi_metadata_provider_unittest",
@@ -275,3 +435,22 @@ js_test_gen_html("js_test_gen_html") {
]
mocks = [ "metadata_dispatcher_mock_deps.js" ]
}
+
+js_modulizer("modulize") {
+ input_files = [
+ "byte_reader.js",
+ "exif_constants.js",
+ "external_metadata_provider.js",
+ "file_system_metadata_provider.js",
+ "function_parallel.js",
+ "function_sequence.js",
+ "image_parsers.js",
+ "metadata_cache_item.js",
+ "metadata_item.js",
+ "metadata_parser.js",
+ "metadata_request.js",
+ "image_orientation.js",
+ "metadata_provider.js",
+ "mpeg_parser.js",
+ ]
+}
diff --git a/chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn b/chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
index d983cab92d1..78ac8375f9e 100644
--- a/chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
@@ -285,6 +285,7 @@ js_library("file_manager_ui") {
":search_box",
":suggest_apps_dialog",
"//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/foreground/elements:files_format_dialog",
"//ui/file_manager/file_manager/foreground/elements:files_message",
"//ui/file_manager/file_manager/foreground/elements:files_password_dialog",
"//ui/file_manager/file_manager/foreground/elements:files_spinner",
@@ -420,6 +421,7 @@ js_library("list_container") {
":file_grid",
":file_table",
"//ui/file_manager/file_manager/common/js:util",
+ "//ui/file_manager/file_manager/foreground/js:dialog_type",
"//ui/webui/resources/js/cr/ui:list_item",
]
}
diff --git a/chromium/ui/file_manager/file_manager/test/BUILD.gn b/chromium/ui/file_manager/file_manager/test/BUILD.gn
index 7f65381103e..2a77eecf911 100644
--- a/chromium/ui/file_manager/file_manager/test/BUILD.gn
+++ b/chromium/ui/file_manager/file_manager/test/BUILD.gn
@@ -27,6 +27,7 @@ action("create_test_main") {
"menu.js",
"progress_center.js",
]
+ deps = [ "//ui/resources:webui_resources_grd" ]
args = [ "--output=" + rebase_path(output, root_build_dir) ]
outputs = [ output ]
}
diff --git a/chromium/ui/file_manager/image_loader/BUILD.gn b/chromium/ui/file_manager/image_loader/BUILD.gn
index f3696408f70..2ed6c6df646 100644
--- a/chromium/ui/file_manager/image_loader/BUILD.gn
+++ b/chromium/ui/file_manager/image_loader/BUILD.gn
@@ -5,6 +5,15 @@
import("//third_party/closure_compiler/compile_js.gni")
import("//third_party/closure_compiler/js_unit_tests.gni")
import("//ui/file_manager/base/gn/js_test_gen_html.gni")
+import("//ui/webui/resources/tools/js_modulizer.gni")
+
+js_type_check("closure_compile_jsmodules") {
+ uses_js_modules = true
+ deps = [
+ ":image_loader_client.m",
+ ":load_image_request.m",
+ ]
+}
js_type_check("closure_compile_module") {
closure_flags = default_closure_args + [ "jscomp_error=strictCheckTypes" ]
@@ -67,6 +76,17 @@ js_library("load_image_request") {
]
}
+js_library("load_image_request.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/image_loader/load_image_request.m.js" ]
+ deps = [
+ "//ui/file_manager/file_manager/foreground/js/metadata:image_orientation.m",
+ "//ui/webui/resources/js:assert.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
js_library("image_loader_client") {
deps = [
":load_image_request",
@@ -79,10 +99,28 @@ js_library("image_loader_client") {
]
}
-js_unittest("image_loader_client_unittest") {
+js_library("image_loader_client.m") {
+ sources =
+ [ "$root_gen_dir/ui/file_manager/image_loader/image_loader_client.m.js" ]
deps = [
- ":image_loader_client",
- "//ui/file_manager/base/js:test_error_reporting",
+ ":load_image_request.m",
+ "//ui/file_manager/file_manager/common/js:lru_cache.m",
+ ]
+ externs_list = [
+ "$externs_path/chrome.js",
+ "$externs_path/chrome_extensions.js",
+ "$externs_path/metrics_private.js",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_unittest("image_loader_client_unittest.m") {
+ deps = [
+ ":image_loader_client.m",
+ ":load_image_request.m",
+ "//chrome/test/data/webui:chai_assert",
+ "//ui/file_manager/base/js:test_error_reporting.m",
]
}
@@ -115,11 +153,22 @@ js_unittest("scheduler_unittest") {
]
}
+js_test_gen_html("js_test_gen_html_modules") {
+ deps = [ ":image_loader_client_unittest.m" ]
+ js_module = true
+
+ closure_flags =
+ strict_error_checking_closure_args + [
+ "js_module_root=./gen/ui",
+ "js_module_root=../../ui",
+ "browser_resolver_prefix_replacements=\"chrome://test/=./\"",
+ ]
+}
+
js_test_gen_html("js_test_gen_html") {
closure_flags = default_closure_args + [ "jscomp_error=strictCheckTypes" ]
deps = [
":cache_unittest",
- ":image_loader_client_unittest",
":image_loader_unittest",
":scheduler_unittest",
]
@@ -128,7 +177,16 @@ js_test_gen_html("js_test_gen_html") {
group("closure_compile") {
testonly = true
deps = [
+ ":closure_compile_jsmodules",
":closure_compile_module",
+ ":js_test_gen_html_modules_type_check_auto",
":js_test_gen_html_type_check_auto",
]
}
+
+js_modulizer("modulize") {
+ input_files = [
+ "image_loader_client.js",
+ "load_image_request.js",
+ ]
+}
diff --git a/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn b/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn
index bad7ab9a689..2c5e1da744d 100644
--- a/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn
+++ b/chromium/ui/file_manager/integration_tests/file_manager/BUILD.gn
@@ -46,6 +46,7 @@ js_type_check("closure_compile") {
":tasks",
":toolbar",
":transfer",
+ ":trash",
":traverse",
":zip_files",
]
@@ -255,6 +256,11 @@ js_library("transfer") {
deps = []
}
+js_library("trash") {
+ testonly = true
+ deps = []
+}
+
js_library("traverse") {
testonly = true
deps = []
diff --git a/chromium/ui/file_manager/video_player/js/BUILD.gn b/chromium/ui/file_manager/video_player/js/BUILD.gn
index 51da0c25c67..166f658b8ff 100644
--- a/chromium/ui/file_manager/video_player/js/BUILD.gn
+++ b/chromium/ui/file_manager/video_player/js/BUILD.gn
@@ -67,7 +67,6 @@ js_library("video_player") {
"//ui/file_manager/base/js:filtered_volume_manager",
"//ui/file_manager/file_manager/common/js:metrics_base",
"//ui/file_manager/file_manager/common/js:util",
- "//ui/webui/resources/js:i18n_template_no_process",
"//ui/webui/resources/js/cr/ui:menu",
"//ui/webui/resources/js/cr/ui:menu_item",
]
diff --git a/chromium/ui/gfx/BUILD.gn b/chromium/ui/gfx/BUILD.gn
index 3a076e1cf13..052789a9577 100644
--- a/chromium/ui/gfx/BUILD.gn
+++ b/chromium/ui/gfx/BUILD.gn
@@ -39,6 +39,8 @@ component("color_utils") {
component("geometry_skia") {
sources = [
"geometry_skia_export.h",
+ "mask_filter_info.cc",
+ "mask_filter_info.h",
"rrect_f.cc",
"rrect_f.h",
"rrect_f_builder.cc",
@@ -85,6 +87,8 @@ component("gfx") {
"font_util.h",
"gdi_util.cc",
"gdi_util.h",
+ "gpu_extra_info.cc",
+ "gpu_extra_info.h",
"half_float.cc",
"half_float.h",
"icon_util.cc",
@@ -137,6 +141,8 @@ component("gfx") {
]
if (is_android) {
sources += [
+ "android/android_surface_control_compat.cc",
+ "android/android_surface_control_compat.h",
"android/java_bitmap.cc",
"android/java_bitmap.h",
"android/view_configuration.cc",
@@ -533,6 +539,8 @@ source_set("memory_buffer_sources") {
"gpu_fence.h",
"gpu_fence_handle.cc",
"gpu_fence_handle.h",
+ "hdr_metadata.cc",
+ "hdr_metadata.h",
"native_pixmap.h",
"overlay_transform.h",
"surface_origin.h",
diff --git a/chromium/ui/gfx/DIR_METADATA b/chromium/ui/gfx/DIR_METADATA
new file mode 100644
index 00000000000..66182190879
--- /dev/null
+++ b/chromium/ui/gfx/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>GFX"
+}
+team_email: "graphics-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/gfx/OWNERS b/chromium/ui/gfx/OWNERS
index 1dbd16ec113..e34675cbcb8 100644
--- a/chromium/ui/gfx/OWNERS
+++ b/chromium/ui/gfx/OWNERS
@@ -60,6 +60,3 @@ per-file *vector_icon*=estade@chromium.org
# If you're doing structural changes get a review from one of the OWNERS.
per-file BUILD.gn=*
-
-# COMPONENT: UI>GFX
-# TEAM: graphics-dev@chromium.org
diff --git a/chromium/ui/gfx/android/OWNERS b/chromium/ui/gfx/android/OWNERS
index 8e64bbe7ab4..15a182a6c7b 100644
--- a/chromium/ui/gfx/android/OWNERS
+++ b/chromium/ui/gfx/android/OWNERS
@@ -1,3 +1 @@
skyostil@chromium.org
-
-# COMPONENT: UI>GFX
diff --git a/chromium/ui/gl/android/android_surface_control_compat.cc b/chromium/ui/gfx/android/android_surface_control_compat.cc
index 26aebb5dc8f..c22ee52a33f 100644
--- a/chromium/ui/gl/android/android_surface_control_compat.cc
+++ b/chromium/ui/gfx/android/android_surface_control_compat.cc
@@ -2,10 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/gl/android/android_surface_control_compat.h"
+#include "ui/gfx/android/android_surface_control_compat.h"
-#include <dlfcn.h>
#include <android/data_space.h>
+#include <dlfcn.h>
#include "base/android/build_info.h"
#include "base/atomic_sequence_num.h"
@@ -100,7 +100,7 @@ using pASurfaceTransactionStats_getPreviousReleaseFenceFd =
int (*)(ASurfaceTransactionStats* stats, ASurfaceControl* surface_control);
}
-namespace gl {
+namespace gfx {
namespace {
base::AtomicSequenceNumber g_next_transaction_id;
@@ -288,8 +288,8 @@ void OnTransactionCompletedOnAnyThread(void* context,
ASurfaceTransactionStats* stats) {
auto* ack_ctx = static_cast<TransactionAckCtx*>(context);
auto transaction_stats = ToTransactionStats(stats);
- TRACE_EVENT_ASYNC_END0("gpu,benchmark", "SurfaceControlTransaction",
- ack_ctx->id);
+ TRACE_EVENT_NESTABLE_ASYNC_END0("gpu,benchmark", "SurfaceControlTransaction",
+ ack_ctx->id);
if (ack_ctx->task_runner) {
ack_ctx->task_runner->PostTask(
@@ -482,8 +482,9 @@ void SurfaceControl::Transaction::SetOnCompleteCb(
}
void SurfaceControl::Transaction::Apply() {
- TRACE_EVENT_ASYNC_BEGIN0("gpu,benchmark", "SurfaceControlTransaction", id_);
+ TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("gpu,benchmark",
+ "SurfaceControlTransaction", id_);
SurfaceControlMethods::Get().ASurfaceTransaction_applyFn(transaction_);
}
-} // namespace gl
+} // namespace gfx
diff --git a/chromium/ui/gl/android/android_surface_control_compat.h b/chromium/ui/gfx/android/android_surface_control_compat.h
index 2ee53e69f28..e6d3dcb592c 100644
--- a/chromium/ui/gl/android/android_surface_control_compat.h
+++ b/chromium/ui/gfx/android/android_surface_control_compat.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_GL_ANDROID_ANDROID_SURFACE_CONTROL_COMPAT_H_
-#define UI_GL_ANDROID_ANDROID_SURFACE_CONTROL_COMPAT_H_
+#ifndef UI_GFX_ANDROID_ANDROID_SURFACE_CONTROL_COMPAT_H_
+#define UI_GFX_ANDROID_ANDROID_SURFACE_CONTROL_COMPAT_H_
#include <memory>
@@ -14,8 +14,8 @@
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/gfx_export.h"
#include "ui/gfx/overlay_transform.h"
-#include "ui/gl/gl_export.h"
extern "C" {
typedef struct ASurfaceControl ASurfaceControl;
@@ -24,11 +24,8 @@ typedef struct ASurfaceTransaction ASurfaceTransaction;
namespace gfx {
class ColorSpace;
-} // namespace gfx
-
-namespace gl {
-class GL_EXPORT SurfaceControl {
+class GFX_EXPORT SurfaceControl {
public:
// Check if the platform is capable of supporting the low-level SurfaceControl
// API. See also gpu/config/gpu_util's GetAndroidSurfaceControlFeatureStatus
@@ -50,7 +47,7 @@ class GL_EXPORT SurfaceControl {
// Returns true if tagging a surface with a frame rate value is supported.
static bool SupportsSetFrameRate();
- class GL_EXPORT Surface : public base::RefCounted<Surface> {
+ class GFX_EXPORT Surface : public base::RefCounted<Surface> {
public:
Surface();
Surface(const Surface& parent, const char* name);
@@ -67,7 +64,7 @@ class GL_EXPORT SurfaceControl {
DISALLOW_COPY_AND_ASSIGN(Surface);
};
- struct GL_EXPORT SurfaceStats {
+ struct GFX_EXPORT SurfaceStats {
SurfaceStats();
~SurfaceStats();
@@ -81,7 +78,7 @@ class GL_EXPORT SurfaceControl {
base::ScopedFD fence;
};
- struct GL_EXPORT TransactionStats {
+ struct GFX_EXPORT TransactionStats {
public:
TransactionStats();
~TransactionStats();
@@ -99,7 +96,7 @@ class GL_EXPORT SurfaceControl {
DISALLOW_COPY_AND_ASSIGN(TransactionStats);
};
- class GL_EXPORT Transaction {
+ class GFX_EXPORT Transaction {
public:
Transaction();
~Transaction();
@@ -140,6 +137,6 @@ class GL_EXPORT SurfaceControl {
DISALLOW_COPY_AND_ASSIGN(Transaction);
};
};
-} // namespace gl
+} // namespace gfx
-#endif // UI_GL_ANDROID_ANDROID_SURFACE_CONTROL_COMPAT_H_
+#endif // UI_GFX_ANDROID_ANDROID_SURFACE_CONTROL_COMPAT_H_
diff --git a/chromium/ui/gfx/android/java_bitmap.cc b/chromium/ui/gfx/android/java_bitmap.cc
index db7efd1fe69..3cfad9cd1b5 100644
--- a/chromium/ui/gfx/android/java_bitmap.cc
+++ b/chromium/ui/gfx/android/java_bitmap.cc
@@ -20,6 +20,63 @@ using base::android::ScopedJavaLocalRef;
using base::android::JavaRef;
namespace gfx {
+namespace {
+
+int SkColorTypeToBitmapFormat(SkColorType color_type) {
+ switch (color_type) {
+ case kN32_SkColorType:
+ return BITMAP_FORMAT_ARGB_8888;
+ case kRGB_565_SkColorType:
+ return BITMAP_FORMAT_RGB_565;
+ default:
+ // A bad format can cause out-of-bounds issues when copying pixels into or
+ // out of the java bitmap's pixel buffer.
+ CHECK_NE(color_type, color_type);
+ }
+ return BITMAP_FORMAT_NO_CONFIG;
+}
+
+SkColorType BitmapFormatToSkColorType(BitmapFormat bitmap_format) {
+ switch (bitmap_format) {
+ case BITMAP_FORMAT_ALPHA_8:
+ return kAlpha_8_SkColorType;
+ case BITMAP_FORMAT_ARGB_4444:
+ return kARGB_4444_SkColorType;
+ case BITMAP_FORMAT_ARGB_8888:
+ return kN32_SkColorType;
+ case BITMAP_FORMAT_RGB_565:
+ return kRGB_565_SkColorType;
+ case BITMAP_FORMAT_NO_CONFIG:
+ default:
+ CHECK_NE(bitmap_format, bitmap_format);
+ return kUnknown_SkColorType;
+ }
+}
+
+// Wraps a Java bitmap as an SkPixmap. Since the pixmap references the
+// underlying pixel data in the Java bitmap directly, it is only valid as long
+// as |bitmap| is.
+SkPixmap WrapJavaBitmapAsPixmap(const JavaBitmap& bitmap) {
+ auto color_type = BitmapFormatToSkColorType(bitmap.format());
+ auto image_info =
+ SkImageInfo::Make(bitmap.size().width(), bitmap.size().height(),
+ color_type, kPremul_SkAlphaType);
+ return SkPixmap(image_info, bitmap.pixels(), bitmap.bytes_per_row());
+}
+
+} // namespace
+
+#define ASSERT_ENUM_EQ(a, b) \
+ static_assert(static_cast<int>(a) == static_cast<int>(b), "")
+
+// BitmapFormat has the same values as AndroidBitmapFormat, for simplicitly, so
+// that SkColorTypeToBitmapFormat() and the JavaBitmap::format() have the same
+// values.
+ASSERT_ENUM_EQ(BITMAP_FORMAT_NO_CONFIG, ANDROID_BITMAP_FORMAT_NONE);
+ASSERT_ENUM_EQ(BITMAP_FORMAT_ALPHA_8, ANDROID_BITMAP_FORMAT_A_8);
+ASSERT_ENUM_EQ(BITMAP_FORMAT_ARGB_4444, ANDROID_BITMAP_FORMAT_RGBA_4444);
+ASSERT_ENUM_EQ(BITMAP_FORMAT_ARGB_8888, ANDROID_BITMAP_FORMAT_RGBA_8888);
+ASSERT_ENUM_EQ(BITMAP_FORMAT_RGB_565, ANDROID_BITMAP_FORMAT_RGB_565);
JavaBitmap::JavaBitmap(const JavaRef<jobject>& bitmap)
: bitmap_(bitmap), pixels_(NULL) {
@@ -32,8 +89,8 @@ JavaBitmap::JavaBitmap(const JavaRef<jobject>& bitmap)
err = AndroidBitmap_getInfo(AttachCurrentThread(), bitmap_.obj(), &info);
DCHECK(!err);
size_ = gfx::Size(info.width, info.height);
- format_ = info.format;
- stride_ = info.stride;
+ format_ = static_cast<BitmapFormat>(info.format);
+ bytes_per_row_ = info.stride;
byte_count_ = Java_BitmapHelper_getByteCount(AttachCurrentThread(), bitmap_);
}
@@ -42,115 +99,50 @@ JavaBitmap::~JavaBitmap() {
DCHECK(!err);
}
-static int SkColorTypeToBitmapFormat(SkColorType color_type) {
- switch (color_type) {
- case kAlpha_8_SkColorType:
- return BITMAP_FORMAT_ALPHA_8;
- case kARGB_4444_SkColorType:
- return BITMAP_FORMAT_ARGB_4444;
- case kN32_SkColorType:
- return BITMAP_FORMAT_ARGB_8888;
- case kRGB_565_SkColorType:
- return BITMAP_FORMAT_RGB_565;
- case kUnknown_SkColorType:
- default:
- NOTREACHED();
- return BITMAP_FORMAT_NO_CONFIG;
- }
-}
+ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(const SkBitmap& skbitmap,
+ OomBehavior reaction) {
+ DCHECK(!skbitmap.isNull());
+ DCHECK_GT(skbitmap.width(), 0);
+ DCHECK_GT(skbitmap.height(), 0);
-ScopedJavaLocalRef<jobject> CreateJavaBitmap(int width,
- int height,
- SkColorType color_type,
- OomBehavior reaction) {
- DCHECK_GT(width, 0);
- DCHECK_GT(height, 0);
- int java_bitmap_config = SkColorTypeToBitmapFormat(color_type);
- return Java_BitmapHelper_createBitmap(
- AttachCurrentThread(), width, height, java_bitmap_config,
- reaction == OomBehavior::kReturnNullOnOom);
-}
+ int java_bitmap_format = SkColorTypeToBitmapFormat(skbitmap.colorType());
-ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(const SkBitmap* skbitmap,
- OomBehavior reaction) {
- DCHECK(skbitmap);
- DCHECK(!skbitmap->isNull());
- SkColorType color_type = skbitmap->colorType();
- DCHECK((color_type == kRGB_565_SkColorType) ||
- (color_type == kN32_SkColorType));
- ScopedJavaLocalRef<jobject> jbitmap = CreateJavaBitmap(
- skbitmap->width(), skbitmap->height(), color_type, reaction);
+ ScopedJavaLocalRef<jobject> jbitmap = Java_BitmapHelper_createBitmap(
+ AttachCurrentThread(), skbitmap.width(), skbitmap.height(),
+ java_bitmap_format, reaction == OomBehavior::kReturnNullOnOom);
if (!jbitmap) {
DCHECK_EQ(OomBehavior::kReturnNullOnOom, reaction);
return jbitmap;
}
- JavaBitmap dst_lock(jbitmap);
- void* src_pixels = skbitmap->getPixels();
- void* dst_pixels = dst_lock.pixels();
- CHECK_GE(base::checked_cast<size_t>(dst_lock.byte_count()),
- skbitmap->computeByteSize());
- memcpy(dst_pixels, src_pixels, skbitmap->computeByteSize());
+ JavaBitmap dst_lock(jbitmap);
+ SkPixmap dst = WrapJavaBitmapAsPixmap(dst_lock);
+ skbitmap.readPixels(dst);
return jbitmap;
}
SkBitmap CreateSkBitmapFromJavaBitmap(const JavaBitmap& jbitmap) {
DCHECK(!jbitmap.size().IsEmpty());
- DCHECK_GT(jbitmap.stride(), 0U);
+ DCHECK_GT(jbitmap.bytes_per_row(), 0U);
DCHECK(jbitmap.pixels());
- gfx::Size src_size = jbitmap.size();
-
- SkBitmap skbitmap;
- SkImageInfo image_info;
- switch (jbitmap.format()) {
- case ANDROID_BITMAP_FORMAT_RGBA_8888:
- image_info =
- SkImageInfo::MakeN32Premul(src_size.width(), src_size.height());
- break;
- case ANDROID_BITMAP_FORMAT_A_8:
- image_info =
- SkImageInfo::SkImageInfo::MakeA8(src_size.width(), src_size.height());
- break;
- default:
- CHECK(false) << "Invalid Java bitmap format: " << jbitmap.format();
- break;
- }
-
// Ensure 4 byte stride alignment since the texture upload code in the
// compositor relies on this.
- const size_t min_row_bytes = image_info.minRowBytes();
- DCHECK_GE(jbitmap.stride(), min_row_bytes);
-
+ SkPixmap src = WrapJavaBitmapAsPixmap(jbitmap);
+ const size_t min_row_bytes = src.info().minRowBytes();
const size_t row_bytes = base::bits::Align(min_row_bytes, 4u);
- skbitmap.allocPixels(image_info, row_bytes);
-
- const char* src_pixels = static_cast<const char*>(jbitmap.pixels());
- char* dst_pixels = static_cast<char*>(skbitmap.getPixels());
- for (int i = 0; i < src_size.height(); ++i) {
- memcpy(dst_pixels, src_pixels, min_row_bytes);
- src_pixels += jbitmap.stride();
- dst_pixels += row_bytes;
- }
+
+ SkBitmap skbitmap;
+ skbitmap.allocPixels(src.info(), row_bytes);
+ skbitmap.writePixels(src);
return skbitmap;
}
SkColorType ConvertToSkiaColorType(const JavaRef<jobject>& bitmap_config) {
- int jbitmap_config = Java_BitmapHelper_getBitmapFormatForConfig(
- AttachCurrentThread(), bitmap_config);
- switch (jbitmap_config) {
- case BITMAP_FORMAT_ALPHA_8:
- return kAlpha_8_SkColorType;
- case BITMAP_FORMAT_ARGB_4444:
- return kARGB_4444_SkColorType;
- case BITMAP_FORMAT_ARGB_8888:
- return kN32_SkColorType;
- case BITMAP_FORMAT_RGB_565:
- return kRGB_565_SkColorType;
- case BITMAP_FORMAT_NO_CONFIG:
- default:
- return kUnknown_SkColorType;
- }
+ BitmapFormat jbitmap_format =
+ static_cast<BitmapFormat>(Java_BitmapHelper_getBitmapFormatForConfig(
+ AttachCurrentThread(), bitmap_config));
+ return BitmapFormatToSkColorType(jbitmap_format);
}
} // namespace gfx
diff --git a/chromium/ui/gfx/android/java_bitmap.h b/chromium/ui/gfx/android/java_bitmap.h
index 9e36dfc223e..dc4db2758e6 100644
--- a/chromium/ui/gfx/android/java_bitmap.h
+++ b/chromium/ui/gfx/android/java_bitmap.h
@@ -18,12 +18,14 @@ namespace gfx {
// A Java counterpart will be generated for this enum.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui.gfx
+// The order and values here match AndroidBitmapFormat, as verified
+// by static_asserts in java_bitmap.cc.
enum BitmapFormat {
- BITMAP_FORMAT_NO_CONFIG,
- BITMAP_FORMAT_ALPHA_8,
- BITMAP_FORMAT_ARGB_4444,
- BITMAP_FORMAT_ARGB_8888,
- BITMAP_FORMAT_RGB_565,
+ BITMAP_FORMAT_NO_CONFIG = 0,
+ BITMAP_FORMAT_ARGB_8888 = 1,
+ BITMAP_FORMAT_RGB_565 = 4,
+ BITMAP_FORMAT_ARGB_4444 = 7,
+ BITMAP_FORMAT_ALPHA_8 = 8,
};
// This class wraps a JNI AndroidBitmap object to make it easier to use. It
@@ -37,17 +39,16 @@ class GFX_EXPORT JavaBitmap {
inline void* pixels() { return pixels_; }
inline const void* pixels() const { return pixels_; }
inline const gfx::Size& size() const { return size_; }
- // Formats are in android/bitmap.h; e.g. ANDROID_BITMAP_FORMAT_RGBA_8888
- inline int format() const { return format_; }
- inline uint32_t stride() const { return stride_; }
+ inline BitmapFormat format() const { return format_; }
+ inline uint32_t bytes_per_row() const { return bytes_per_row_; }
inline int byte_count() const { return byte_count_; }
private:
base::android::ScopedJavaGlobalRef<jobject> bitmap_;
void* pixels_;
gfx::Size size_;
- int format_;
- uint32_t stride_;
+ BitmapFormat format_;
+ uint32_t bytes_per_row_;
int byte_count_;
DISALLOW_COPY_AND_ASSIGN(JavaBitmap);
@@ -58,19 +59,11 @@ enum class OomBehavior {
kReturnNullOnOom,
};
-// Allocates a Java-backed bitmap (android.graphics.Bitmap) with the given
-// (non-empty!) size and color type.
-GFX_EXPORT base::android::ScopedJavaLocalRef<jobject> CreateJavaBitmap(
- int width,
- int height,
- SkColorType color_type,
- OomBehavior reaction = OomBehavior::kCrashOnOom);
-
// Converts |skbitmap| to a Java-backed bitmap (android.graphics.Bitmap).
// Note: |skbitmap| is assumed to be non-null, non-empty and one of RGBA_8888 or
// RGB_565 formats.
GFX_EXPORT base::android::ScopedJavaLocalRef<jobject> ConvertToJavaBitmap(
- const SkBitmap* skbitmap,
+ const SkBitmap& skbitmap,
OomBehavior reaction = OomBehavior::kCrashOnOom);
// Converts |bitmap| to an SkBitmap of the same size and format.
diff --git a/chromium/ui/gfx/animation/BUILD.gn b/chromium/ui/gfx/animation/BUILD.gn
index b0184a6af5e..34625ed2fdb 100644
--- a/chromium/ui/gfx/animation/BUILD.gn
+++ b/chromium/ui/gfx/animation/BUILD.gn
@@ -44,7 +44,7 @@ component("animation") {
sources += [ "animation_win.cc" ]
}
- if (is_desktop_linux) {
+ if (is_linux) {
sources += [
"animation_linux.cc",
"animation_settings_provider_linux.cc",
diff --git a/chromium/ui/gfx/animation/DIR_METADATA b/chromium/ui/gfx/animation/DIR_METADATA
new file mode 100644
index 00000000000..087c8bfc9a5
--- /dev/null
+++ b/chromium/ui/gfx/animation/DIR_METADATA
@@ -0,0 +1,12 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "Internals>Compositing>Animation"
+}
+team_email: "threaded-rendering-dev@chromium.org" \ No newline at end of file
diff --git a/chromium/ui/gfx/animation/OWNERS b/chromium/ui/gfx/animation/OWNERS
index 03d2109d3f1..a56274ecf42 100644
--- a/chromium/ui/gfx/animation/OWNERS
+++ b/chromium/ui/gfx/animation/OWNERS
@@ -1,5 +1,2 @@
flackr@chromium.org
vollick@chromium.org
-
-# TEAM: threaded-rendering-dev@chromium.org
-# COMPONENT: Internals>Compositing>Animation
diff --git a/chromium/ui/gfx/animation/animation_runner_unittest.cc b/chromium/ui/gfx/animation/animation_runner_unittest.cc
index 85038aaf6c6..174fe72dde8 100644
--- a/chromium/ui/gfx/animation/animation_runner_unittest.cc
+++ b/chromium/ui/gfx/animation/animation_runner_unittest.cc
@@ -4,7 +4,7 @@
#include "ui/gfx/animation/animation_runner.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/ui/gfx/animation/tween.cc b/chromium/ui/gfx/animation/tween.cc
index 2ab0834f943..b5a65906318 100644
--- a/chromium/ui/gfx/animation/tween.cc
+++ b/chromium/ui/gfx/animation/tween.cc
@@ -42,6 +42,9 @@ double Tween::CalculateValue(Tween::Type type, double state) {
case EASE_IN_OUT_2:
return gfx::CubicBezier(0.33, 0, 0.67, 1).Solve(state);
+ case EASE_OUT_3:
+ return gfx::CubicBezier(0.6, 0, 0, 1).Solve(state);
+
case LINEAR:
return state;
diff --git a/chromium/ui/gfx/animation/tween.h b/chromium/ui/gfx/animation/tween.h
index c623b8e7f79..9d5c82137fe 100644
--- a/chromium/ui/gfx/animation/tween.h
+++ b/chromium/ui/gfx/animation/tween.h
@@ -22,18 +22,19 @@ namespace gfx {
class ANIMATION_EXPORT Tween {
public:
enum Type {
- LINEAR, // Linear.
- EASE_OUT, // Fast in, slow out (default).
- EASE_OUT_2, // Variant of EASE_OUT that ends slower than EASE_OUT.
- EASE_IN, // Slow in, fast out.
- EASE_IN_2, // Variant of EASE_IN that starts out slower than
- // EASE_IN.
- EASE_IN_OUT, // Slow in and out, fast in the middle.
- EASE_IN_OUT_2, // Variant of EASE_IN_OUT that starts and ends slower
- // than EASE_IN_OUT.
- SMOOTH_IN_OUT, // Smooth, consistent speeds in and out (sine wave).
- FAST_OUT_SLOW_IN, // Variant of EASE_IN_OUT which should be used in most
- // cases.
+ LINEAR, // Linear.
+ EASE_OUT, // Fast in, slow out (default).
+ EASE_OUT_2, // Variant of EASE_OUT that ends slower than EASE_OUT.
+ EASE_OUT_3, // Variant of EASE_OUT that ends slower than EASE_OUT_2.
+ EASE_IN, // Slow in, fast out.
+ EASE_IN_2, // Variant of EASE_IN that starts out slower than
+ // EASE_IN.
+ EASE_IN_OUT, // Slow in and out, fast in the middle.
+ EASE_IN_OUT_2, // Variant of EASE_IN_OUT that starts and ends slower
+ // than EASE_IN_OUT.
+ SMOOTH_IN_OUT, // Smooth, consistent speeds in and out (sine wave).
+ FAST_OUT_SLOW_IN, // Variant of EASE_IN_OUT which should be used in most
+ // cases.
FAST_OUT_SLOW_IN_2, // Variant of FAST_OUT_SLOW_IN that starts out quicker.
LINEAR_OUT_SLOW_IN, // Variant of EASE_OUT which should be used for
// fading in from 0% or motion when entering a scene.
diff --git a/chromium/ui/gfx/buffer_types.h b/chromium/ui/gfx/buffer_types.h
index d1102cf5bd6..32ffc612abb 100644
--- a/chromium/ui/gfx/buffer_types.h
+++ b/chromium/ui/gfx/buffer_types.h
@@ -36,6 +36,8 @@ enum class BufferFormat {
// by the CPU. SCANOUT implies GPU_READ_WRITE.
// *_VDA_WRITE is for cases where a video decode accellerator writes into
// the buffers.
+// PROTECTED_* are for HW protected buffers that cannot be read by the CPU and
+// can only be read in protected GPU contexts or scanned out to overlays.
// TODO(reveman): Add GPU_READ_WRITE for use-cases where SCANOUT is not
// required.
@@ -47,7 +49,9 @@ enum class BufferUsage {
CAMERA_AND_CPU_READ_WRITE,
SCANOUT_CPU_READ_WRITE,
SCANOUT_VDA_WRITE,
+ PROTECTED_SCANOUT_VDA_WRITE,
GPU_READ_CPU_READ_WRITE,
+ SCANOUT_VEA_CPU_READ,
SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE,
LAST = SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE
diff --git a/chromium/ui/gfx/buffer_usage_util.cc b/chromium/ui/gfx/buffer_usage_util.cc
index 7512bfb56f3..20e17d98639 100644
--- a/chromium/ui/gfx/buffer_usage_util.cc
+++ b/chromium/ui/gfx/buffer_usage_util.cc
@@ -20,8 +20,12 @@ const char* BufferUsageToString(BufferUsage usage) {
return "SCANOUT_CPU_READ_WRITE";
case BufferUsage::SCANOUT_VDA_WRITE:
return "SCANOUT_VDA_WRITE";
+ case BufferUsage::PROTECTED_SCANOUT_VDA_WRITE:
+ return "PROTECTED_SCANOUT_VDA_WRITE";
case BufferUsage::GPU_READ_CPU_READ_WRITE:
return "GPU_READ_CPU_READ_WRITE";
+ case BufferUsage::SCANOUT_VEA_CPU_READ:
+ return "SCANOUT_VEA_CPU_READ";
case BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE:
return "SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE";
}
diff --git a/chromium/ui/gfx/codec/OWNERS b/chromium/ui/gfx/codec/OWNERS
index 3bcf86b9355..254c0ece0be 100644
--- a/chromium/ui/gfx/codec/OWNERS
+++ b/chromium/ui/gfx/codec/OWNERS
@@ -1,4 +1,2 @@
dcheng@chromium.org
scroggo@google.com
-
-# COMPONENT: UI>GFX
diff --git a/chromium/ui/gfx/codec/jpeg_codec_unittest.cc b/chromium/ui/gfx/codec/jpeg_codec_unittest.cc
index 0e892f6af0c..54c57a1b723 100644
--- a/chromium/ui/gfx/codec/jpeg_codec_unittest.cc
+++ b/chromium/ui/gfx/codec/jpeg_codec_unittest.cc
@@ -10,7 +10,7 @@
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/task/thread_pool.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/codec/jpeg_codec.h"
diff --git a/chromium/ui/gfx/color_space.cc b/chromium/ui/gfx/color_space.cc
index f6eb5f8fa25..24b0b0313a2 100644
--- a/chromium/ui/gfx/color_space.cc
+++ b/chromium/ui/gfx/color_space.cc
@@ -60,6 +60,20 @@ skcms_TransferFunction GetPQSkTransferFunction(float sdr_white_level) {
return fn;
}
+skcms_TransferFunction GetHLGSkTransferFunction(float sdr_white_level) {
+ // Note that SkColorSpace doesn't have the notion of an unspecified SDR white
+ // level.
+ if (sdr_white_level == 0.f)
+ sdr_white_level = ColorSpace::kDefaultSDRWhiteLevel;
+
+ // The reference white level for HLG is 100 nits. We want to setup the
+ // returned transfer function such that output values are scaled by the white
+ // level; Skia uses the |f| transfer function parameter for this.
+ skcms_TransferFunction fn = SkNamedTransferFn::kHLG;
+ fn.f = ColorSpace::kDefaultSDRWhiteLevel / sdr_white_level - 1;
+ return fn;
+}
+
float GetSDRWhiteLevelFromPQSkTransferFunction(
const skcms_TransferFunction& fn) {
DCHECK_EQ(fn.g, SkNamedTransferFn::kPQ.g);
@@ -69,6 +83,33 @@ float GetSDRWhiteLevelFromPQSkTransferFunction(
return sdr_white_level_a;
}
+float GetSDRWhiteLevelFromHLGSkTransferFunction(
+ const skcms_TransferFunction& fn) {
+ DCHECK_EQ(fn.g, SkNamedTransferFn::kHLG.g);
+ if (fn.f == 0)
+ return ColorSpace::kDefaultSDRWhiteLevel;
+ return 1.0f / ((fn.f + 1) / ColorSpace::kDefaultSDRWhiteLevel);
+}
+
+bool PrimaryIdContainsSRGB(ColorSpace::PrimaryID id) {
+ DCHECK(id != ColorSpace::PrimaryID::INVALID &&
+ id != ColorSpace::PrimaryID::CUSTOM);
+
+ switch (id) {
+ case ColorSpace::PrimaryID::BT709:
+ case ColorSpace::PrimaryID::BT2020:
+ case ColorSpace::PrimaryID::SMPTEST428_1:
+ case ColorSpace::PrimaryID::SMPTEST431_2:
+ case ColorSpace::PrimaryID::SMPTEST432_1:
+ case ColorSpace::PrimaryID::XYZ_D50:
+ case ColorSpace::PrimaryID::ADOBE_RGB:
+ case ColorSpace::PrimaryID::WIDE_GAMUT_COLOR_SPIN:
+ return true;
+ default:
+ return false;
+ }
+}
+
} // namespace
// static
@@ -103,6 +144,7 @@ ColorSpace::ColorSpace(const SkColorSpace& sk_color_space)
SetCustomTransferFunction(fn);
} else if (skcms_TransferFunction_isHLGish(&fn)) {
transfer_ = TransferID::ARIB_STD_B67;
+ transfer_params_[0] = GetSDRWhiteLevelFromHLGSkTransferFunction(fn);
} else if (skcms_TransferFunction_isPQish(&fn)) {
transfer_ = TransferID::SMPTEST2084;
transfer_params_[0] = GetSDRWhiteLevelFromPQSkTransferFunction(fn);
@@ -259,6 +301,7 @@ size_t ColorSpace::TransferParamCount(TransferID transfer) {
case TransferID::PIECEWISE_HDR:
return 2;
case TransferID::SMPTEST2084:
+ case TransferID::ARIB_STD_B67:
return 1;
default:
return 0;
@@ -451,9 +494,16 @@ std::string ColorSpace::ToString() const {
PRINT_ENUM_CASE(TransferID, BT2020_10)
PRINT_ENUM_CASE(TransferID, BT2020_12)
PRINT_ENUM_CASE(TransferID, SMPTEST428_1)
- PRINT_ENUM_CASE(TransferID, ARIB_STD_B67)
PRINT_ENUM_CASE(TransferID, IEC61966_2_1_HDR)
PRINT_ENUM_CASE(TransferID, LINEAR_HDR)
+ case TransferID::ARIB_STD_B67:
+ ss << "HLG (SDR white point ";
+ if (transfer_params_[0] == 0.f)
+ ss << "default " << kDefaultSDRWhiteLevel;
+ else
+ ss << transfer_params_[0];
+ ss << " nits)";
+ break;
case TransferID::SMPTEST2084:
ss << "PQ (SDR white point ";
if (transfer_params_[0] == 0.f)
@@ -561,6 +611,7 @@ bool ColorSpace::IsSuitableForBlending() const {
// PQ is not an acceptable space to do blending in -- blending 0 and 1
// evenly will get a result of sRGB 0.259 (instead of 0.5).
return false;
+ case TransferID::ARIB_STD_B67:
case TransferID::LINEAR_HDR:
// If the color space is nearly-linear, then it is not suitable for
// blending -- blending 0 and 1 evenly will get a result of sRGB 0.735
@@ -595,7 +646,8 @@ ColorSpace ColorSpace::GetWithMatrixAndRange(MatrixID matrix,
ColorSpace ColorSpace::GetWithSDRWhiteLevel(float sdr_white_level) const {
ColorSpace result = *this;
- if (transfer_ == TransferID::SMPTEST2084) {
+ if (transfer_ == TransferID::SMPTEST2084 ||
+ transfer_ == TransferID::ARIB_STD_B67) {
result.transfer_params_[0] = sdr_white_level;
} else if (transfer_ == TransferID::LINEAR_HDR) {
result.transfer_ = TransferID::CUSTOM_HDR;
@@ -639,7 +691,7 @@ sk_sp<SkColorSpace> ColorSpace::ToSkColorSpace() const {
transfer_fn = SkNamedTransferFn::kLinear;
break;
case TransferID::ARIB_STD_B67:
- transfer_fn = SkNamedTransferFn::kHLG;
+ transfer_fn = GetHLGSkTransferFunction(transfer_params_[0]);
break;
case TransferID::SMPTEST2084:
transfer_fn = GetPQSkTransferFunction(transfer_params_[0]);
@@ -702,6 +754,39 @@ bool ColorSpace::HasExtendedSkTransferFn() const {
transfer_ == TransferID::IEC61966_2_1_HDR;
}
+bool ColorSpace::Contains(const ColorSpace& other) const {
+ if (primaries_ == PrimaryID::INVALID ||
+ other.primaries_ == PrimaryID::INVALID)
+ return false;
+
+ // Contains() is commonly used to check if a color space contains sRGB. The
+ // computation can be bypassed for known primary IDs.
+ if (primaries_ != PrimaryID::CUSTOM && other.primaries_ == PrimaryID::BT709)
+ return PrimaryIdContainsSRGB(primaries_);
+
+ // |matrix| is the primary transform matrix from |other| to this color space.
+ skcms_Matrix3x3 other_to_xyz;
+ skcms_Matrix3x3 this_to_xyz;
+ skcms_Matrix3x3 xyz_to_this;
+ other.GetPrimaryMatrix(&other_to_xyz);
+ GetPrimaryMatrix(&this_to_xyz);
+ skcms_Matrix3x3_invert(&this_to_xyz, &xyz_to_this);
+ skcms_Matrix3x3 matrix = skcms_Matrix3x3_concat(&xyz_to_this, &other_to_xyz);
+
+ // Return true iff each primary is in the range [0, 1] after transforming.
+ // Transforming a primary vector by |matrix| always results in a column of
+ // |matrix|. So the multiplication can be skipped, and we can just check if
+ // each value in the matrix is in the range [0, 1].
+ constexpr float epsilon = 0.001f;
+ for (int r = 0; r < 3; r++) {
+ for (int c = 0; c < 3; c++) {
+ if (matrix.vals[r][c] < -epsilon || matrix.vals[r][c] > 1 + epsilon)
+ return false;
+ }
+ }
+ return true;
+}
+
// static
void ColorSpace::GetPrimaryMatrix(PrimaryID primary_id,
skcms_Matrix3x3* to_XYZD50) {
@@ -981,9 +1066,11 @@ bool ColorSpace::GetInverseTransferFunction(skcms_TransferFunction* fn) const {
return true;
}
-bool ColorSpace::GetPQSDRWhiteLevel(float* sdr_white_level) const {
- if (transfer_ != TransferID::SMPTEST2084)
+bool ColorSpace::GetSDRWhiteLevel(float* sdr_white_level) const {
+ if (transfer_ != TransferID::SMPTEST2084 &&
+ transfer_ != TransferID::ARIB_STD_B67) {
return false;
+ }
if (transfer_params_[0] == 0.0f)
*sdr_white_level = kDefaultSDRWhiteLevel;
else
diff --git a/chromium/ui/gfx/color_space.h b/chromium/ui/gfx/color_space.h
index 08cf2adcee7..ebaa674060b 100644
--- a/chromium/ui/gfx/color_space.h
+++ b/chromium/ui/gfx/color_space.h
@@ -318,10 +318,10 @@ class COLOR_SPACE_EXPORT ColorSpace {
bool GetTransferFunction(skcms_TransferFunction* fn) const;
bool GetInverseTransferFunction(skcms_TransferFunction* fn) const;
- // Returns the SDR white level specified for the PQ transfer function. If
- // no value was specified, then use kDefaultSDRWhiteLevel. If the transfer
+ // Returns the SDR white level specified for the PQ or HLG transfer functions.
+ // If no value was specified, then use kDefaultSDRWhiteLevel. If the transfer
// function is not PQ then return false.
- bool GetPQSDRWhiteLevel(float* sdr_white_level) const;
+ bool GetSDRWhiteLevel(float* sdr_white_level) const;
// Returns the parameters for a PIECEWISE_HDR transfer function. See
// CreatePiecewiseHDR for parameter meanings.
@@ -378,6 +378,9 @@ class COLOR_SPACE_EXPORT ColorSpace {
// skcms_TransferFunction which is extended to all real values.
bool HasExtendedSkTransferFn() const;
+ // Returns true if each color in |other| can be expressed in this color space.
+ bool Contains(const ColorSpace& other) const;
+
private:
// The default bit depth assumed by GetRangeAdjustMatrix().
static constexpr int kDefaultBitDepth = 8;
diff --git a/chromium/ui/gfx/color_space_unittest.cc b/chromium/ui/gfx/color_space_unittest.cc
index 57a995c4bf4..c09ad1fedda 100644
--- a/chromium/ui/gfx/color_space_unittest.cc
+++ b/chromium/ui/gfx/color_space_unittest.cc
@@ -253,7 +253,7 @@ TEST(ColorSpace, PQToSkColorSpace) {
color_space = ColorSpace::CreateHDR10(50.f);
roundtrip_color_space = ColorSpace(*color_space.ToSkColorSpace());
EXPECT_TRUE(
- roundtrip_color_space.GetPQSDRWhiteLevel(&roundtrip_sdr_white_level));
+ roundtrip_color_space.GetSDRWhiteLevel(&roundtrip_sdr_white_level));
EXPECT_NEAR(50.f, roundtrip_sdr_white_level, kEpsilon);
EXPECT_EQ(ColorSpace::TransferID::SMPTEST2084,
roundtrip_color_space.GetTransferID());
@@ -264,7 +264,35 @@ TEST(ColorSpace, PQToSkColorSpace) {
color_space = ColorSpace::CreateHDR10();
roundtrip_color_space = ColorSpace(*color_space.ToSkColorSpace());
EXPECT_TRUE(
- roundtrip_color_space.GetPQSDRWhiteLevel(&roundtrip_sdr_white_level));
+ roundtrip_color_space.GetSDRWhiteLevel(&roundtrip_sdr_white_level));
+ EXPECT_NEAR(ColorSpace::kDefaultSDRWhiteLevel, roundtrip_sdr_white_level,
+ kEpsilon);
+}
+
+TEST(ColorSpace, HLGToSkColorSpace) {
+ ColorSpace color_space;
+ ColorSpace roundtrip_color_space;
+ float roundtrip_sdr_white_level;
+
+ // We expect that when a white point is specified, the conversion from
+ // ColorSpace -> SkColorSpace -> ColorSpace be the identity. Because of
+ // rounding error, this will not quite be the case.
+ constexpr float kSDRWhiteLevel = 50.0f;
+ color_space = ColorSpace::CreateHLG().GetWithSDRWhiteLevel(kSDRWhiteLevel);
+ roundtrip_color_space = ColorSpace(*color_space.ToSkColorSpace());
+ EXPECT_TRUE(
+ roundtrip_color_space.GetSDRWhiteLevel(&roundtrip_sdr_white_level));
+ EXPECT_FLOAT_EQ(kSDRWhiteLevel, roundtrip_sdr_white_level);
+ EXPECT_EQ(ColorSpace::TransferID::ARIB_STD_B67,
+ roundtrip_color_space.GetTransferID());
+
+ // When no white level is specified, we should get an SkColorSpace that
+ // specifies the default white level. Of note is that in the roundtrip, the
+ // value of kDefaultSDRWhiteLevel gets baked in.
+ color_space = ColorSpace::CreateHLG();
+ roundtrip_color_space = ColorSpace(*color_space.ToSkColorSpace());
+ EXPECT_TRUE(
+ roundtrip_color_space.GetSDRWhiteLevel(&roundtrip_sdr_white_level));
EXPECT_NEAR(ColorSpace::kDefaultSDRWhiteLevel, roundtrip_sdr_white_level,
kEpsilon);
}
@@ -317,23 +345,23 @@ TEST(ColorSpace, PQWhiteLevel) {
ColorSpace color_space = ColorSpace::CreateHDR10(kCustomWhiteLevel);
EXPECT_EQ(color_space.GetTransferID(), ColorSpace::TransferID::SMPTEST2084);
float sdr_white_level;
- EXPECT_TRUE(color_space.GetPQSDRWhiteLevel(&sdr_white_level));
+ EXPECT_TRUE(color_space.GetSDRWhiteLevel(&sdr_white_level));
EXPECT_EQ(sdr_white_level, kCustomWhiteLevel);
color_space = ColorSpace::CreateHDR10();
EXPECT_EQ(color_space.GetTransferID(), ColorSpace::TransferID::SMPTEST2084);
- EXPECT_TRUE(color_space.GetPQSDRWhiteLevel(&sdr_white_level));
+ EXPECT_TRUE(color_space.GetSDRWhiteLevel(&sdr_white_level));
EXPECT_EQ(sdr_white_level, ColorSpace::kDefaultSDRWhiteLevel);
color_space = color_space.GetWithSDRWhiteLevel(kCustomWhiteLevel);
EXPECT_EQ(color_space.GetTransferID(), ColorSpace::TransferID::SMPTEST2084);
- EXPECT_TRUE(color_space.GetPQSDRWhiteLevel(&sdr_white_level));
+ EXPECT_TRUE(color_space.GetSDRWhiteLevel(&sdr_white_level));
EXPECT_EQ(sdr_white_level, kCustomWhiteLevel);
constexpr float kCustomWhiteLevel2 = kCustomWhiteLevel * 2;
color_space = color_space.GetWithSDRWhiteLevel(kCustomWhiteLevel2);
EXPECT_EQ(color_space.GetTransferID(), ColorSpace::TransferID::SMPTEST2084);
- EXPECT_TRUE(color_space.GetPQSDRWhiteLevel(&sdr_white_level));
+ EXPECT_TRUE(color_space.GetSDRWhiteLevel(&sdr_white_level));
EXPECT_EQ(sdr_white_level, kCustomWhiteLevel2);
}
@@ -362,5 +390,38 @@ TEST(ColorSpace, LinearHDRWhiteLevel) {
std::make_tuple(1.f, kCustomSlope, 0.f, 0.f, 0.f, 0.f, 0.f));
}
+TEST(ColorSpace, ExpectationsMatchSRGB) {
+ ColorSpace::PrimaryID primary_ids[] = {
+ ColorSpace::PrimaryID::BT709,
+ ColorSpace::PrimaryID::BT470M,
+ ColorSpace::PrimaryID::BT470BG,
+ ColorSpace::PrimaryID::SMPTE170M,
+ ColorSpace::PrimaryID::SMPTE240M,
+ ColorSpace::PrimaryID::FILM,
+ ColorSpace::PrimaryID::BT2020,
+ ColorSpace::PrimaryID::SMPTEST428_1,
+ ColorSpace::PrimaryID::SMPTEST431_2,
+ ColorSpace::PrimaryID::SMPTEST432_1,
+ ColorSpace::PrimaryID::XYZ_D50,
+ ColorSpace::PrimaryID::ADOBE_RGB,
+ ColorSpace::PrimaryID::APPLE_GENERIC_RGB,
+ ColorSpace::PrimaryID::WIDE_GAMUT_COLOR_SPIN,
+ };
+
+ // Create a custom color space with the sRGB primary matrix.
+ ColorSpace srgb = ColorSpace::CreateSRGB();
+ skcms_Matrix3x3 to_XYZD50;
+ srgb.GetPrimaryMatrix(&to_XYZD50);
+ ColorSpace custom_srgb =
+ ColorSpace::CreateCustom(to_XYZD50, ColorSpace::TransferID::IEC61966_2_1);
+
+ for (auto id : primary_ids) {
+ ColorSpace color_space(id, ColorSpace::TransferID::IEC61966_2_1);
+ // The precomputed results for Contains(sRGB) should match the calculation
+ // performed on a custom color space with sRGB primaries.
+ EXPECT_EQ(color_space.Contains(srgb), color_space.Contains(custom_srgb));
+ }
+}
+
} // namespace
} // namespace gfx
diff --git a/chromium/ui/gfx/color_space_win.cc b/chromium/ui/gfx/color_space_win.cc
index 5d316af51d3..69e5b46778f 100644
--- a/chromium/ui/gfx/color_space_win.cc
+++ b/chromium/ui/gfx/color_space_win.cc
@@ -189,6 +189,10 @@ DXGI_COLOR_SPACE_TYPE ColorSpaceWin::GetDXGIColorSpace(
return DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020;
// Could also be:
// DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020
+ } else if (color_space.GetTransferID() ==
+ gfx::ColorSpace::TransferID::ARIB_STD_B67) {
+ // Note: This may not always work. See https://crbug.com/1144260#c6.
+ return DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020;
} else {
// For YUV, we default to LIMITED
if (color_space.GetRangeID() == gfx::ColorSpace::RangeID::FULL) {
diff --git a/chromium/ui/gfx/color_transform.cc b/chromium/ui/gfx/color_transform.cc
index 981d2f8386b..cac5747727e 100644
--- a/chromium/ui/gfx/color_transform.cc
+++ b/chromium/ui/gfx/color_transform.cc
@@ -89,17 +89,6 @@ float FromLinear(ColorSpace::TransferID id, float v) {
return a * pow(v, 0.45f) - (a - 1.0f);
}
- // Spec: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf
- case ColorSpace::TransferID::ARIB_STD_B67: {
- const float a = 0.17883277f;
- const float b = 0.28466892f;
- const float c = 0.55991073f;
- v = max(0.0f, v);
- if (v <= 1)
- return 0.5f * sqrt(v);
- return a * log(v - b) + c;
- }
-
default:
// Handled by skcms_TransferFunction.
break;
@@ -146,17 +135,6 @@ float ToLinear(ColorSpace::TransferID id, float v) {
return pow((v + a - 1.0f) / a, 1.0f / 0.45f);
}
- // Spec: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf
- case ColorSpace::TransferID::ARIB_STD_B67: {
- v = max(0.0f, v);
- const float a = 0.17883277f;
- const float b = 0.28466892f;
- const float c = 0.55991073f;
- if (v <= 0.5f)
- return (v * 2.0f) * (v * 2.0f);
- return exp((v - c) / a) + b;
- }
-
default:
// Handled by skcms_TransferFunction.
break;
@@ -595,6 +573,45 @@ class ColorTransformSkTransferFn : public ColorTransformPerChannelTransferFn {
skcms_TransferFunction fn_;
};
+class ColorTransformHLGFromLinear : public ColorTransformPerChannelTransferFn {
+ public:
+ explicit ColorTransformHLGFromLinear(float sdr_white_level)
+ : ColorTransformPerChannelTransferFn(false),
+ sdr_scale_factor_(sdr_white_level /
+ gfx::ColorSpace::kDefaultSDRWhiteLevel) {}
+
+ // ColorTransformPerChannelTransferFn implementation:
+ float Evaluate(float v) const override {
+ v *= sdr_scale_factor_;
+
+ // Spec: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf
+ constexpr float a = 0.17883277f;
+ constexpr float b = 0.28466892f;
+ constexpr float c = 0.55991073f;
+ v = max(0.0f, v);
+ if (v <= 1)
+ return 0.5f * sqrt(v);
+ return a * log(v - b) + c;
+ }
+
+ void AppendTransferShaderSource(std::stringstream* src,
+ bool is_glsl) const override {
+ std::string scalar_type = is_glsl ? "float" : "half";
+ *src << " v = v * " << sdr_scale_factor_ << ";\n"
+ << " v = max(0.0, v);\n"
+ << " " << scalar_type << " a = 0.17883277;\n"
+ << " " << scalar_type << " b = 0.28466892;\n"
+ << " " << scalar_type << " c = 0.55991073;\n"
+ << " if (v <= 1.0)\n"
+ " v = 0.5 * sqrt(v);\n"
+ " else\n"
+ " v = a * log(v - b) + c;\n";
+ }
+
+ private:
+ const float sdr_scale_factor_;
+};
+
class ColorTransformPQFromLinear : public ColorTransformPerChannelTransferFn {
public:
explicit ColorTransformPQFromLinear(float sdr_white_level)
@@ -633,6 +650,47 @@ class ColorTransformPQFromLinear : public ColorTransformPerChannelTransferFn {
const float sdr_white_level_;
};
+class ColorTransformHLGToLinear : public ColorTransformPerChannelTransferFn {
+ public:
+ explicit ColorTransformHLGToLinear(float sdr_white_level)
+ : ColorTransformPerChannelTransferFn(false),
+ sdr_scale_factor_(gfx::ColorSpace::kDefaultSDRWhiteLevel /
+ sdr_white_level) {}
+
+ // ColorTransformPerChannelTransferFn implementation:
+ float Evaluate(float v) const override {
+ // Spec: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf
+ v = max(0.0f, v);
+ constexpr float a = 0.17883277f;
+ constexpr float b = 0.28466892f;
+ constexpr float c = 0.55991073f;
+ if (v <= 0.5f)
+ v = v * v * 4.0f;
+ else
+ v = exp((v - c) / a) + b;
+ return v * sdr_scale_factor_;
+ }
+
+ void AppendTransferShaderSource(std::stringstream* src,
+ bool is_glsl) const override {
+ std::string scalar_type = is_glsl ? "float" : "half";
+
+ *src << " v = max(0.0, v);\n"
+ << " " << scalar_type << " a = 0.17883277;\n"
+ << " " << scalar_type << " b = 0.28466892;\n"
+ << " " << scalar_type << " c = 0.55991073;\n"
+ << " if (v <= 0.5)\n"
+ " v = v * v * 4.0;\n"
+ " else\n"
+ " v = exp((v - c) / a) + b;\n"
+ " v = v * "
+ << sdr_scale_factor_ << ";\n";
+ }
+
+ private:
+ const float sdr_scale_factor_;
+};
+
class ColorTransformPQToLinear : public ColorTransformPerChannelTransferFn {
public:
explicit ColorTransformPQToLinear(float sdr_white_level)
@@ -728,16 +786,6 @@ class ColorTransformFromLinear : public ColorTransformPerChannelTransferFn {
" else\n"
" v = a * pow(v, 0.45) - (a - 1.0);\n";
return;
- case ColorSpace::TransferID::ARIB_STD_B67:
- *src << " " << scalar_type << " a = 0.17883277;\n"
- << " " << scalar_type << " b = 0.28466892;\n"
- << " " << scalar_type << " c = 0.55991073;\n"
- << " v = max(0.0, v);\n"
- " if (v <= 1.0)\n"
- " v = 0.5 * sqrt(v);\n"
- " else\n"
- " v = a * log(v - b) + c;\n";
- return;
default:
break;
}
@@ -808,16 +856,6 @@ class ColorTransformToLinear : public ColorTransformPerChannelTransferFn {
" else\n"
" v = pow((v + a - 1.0) / a, 1.0 / 0.45);\n";
return;
- case ColorSpace::TransferID::ARIB_STD_B67:
- *src << " v = max(0.0, v);\n"
- << " " << scalar_type << " a = 0.17883277;\n"
- << " " << scalar_type << " b = 0.28466892;\n"
- << " " << scalar_type << " c = 0.55991073;\n"
- << " if (v <= 0.5)\n"
- " v = (v * 2.0) * (v * 2.0);\n"
- " else\n"
- " v = exp((v - c) / a) + b;\n";
- return;
default:
break;
}
@@ -921,9 +959,14 @@ void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
if (src.GetTransferFunction(&src_to_linear_fn)) {
steps_.push_back(std::make_unique<ColorTransformSkTransferFn>(
src_to_linear_fn, src.HasExtendedSkTransferFn()));
+ } else if (src.GetTransferID() == ColorSpace::TransferID::ARIB_STD_B67) {
+ float sdr_white_level = 0.f;
+ src.GetSDRWhiteLevel(&sdr_white_level);
+ steps_.push_back(
+ std::make_unique<ColorTransformHLGToLinear>(sdr_white_level));
} else if (src.GetTransferID() == ColorSpace::TransferID::SMPTEST2084) {
float sdr_white_level = 0.f;
- src.GetPQSDRWhiteLevel(&sdr_white_level);
+ src.GetSDRWhiteLevel(&sdr_white_level);
steps_.push_back(
std::make_unique<ColorTransformPQToLinear>(sdr_white_level));
} else if (src.GetTransferID() == ColorSpace::TransferID::PIECEWISE_HDR) {
@@ -956,9 +999,14 @@ void ColorTransformInternal::AppendColorSpaceToColorSpaceTransform(
if (dst.GetInverseTransferFunction(&dst_from_linear_fn)) {
steps_.push_back(std::make_unique<ColorTransformSkTransferFn>(
dst_from_linear_fn, dst.HasExtendedSkTransferFn()));
+ } else if (dst.GetTransferID() == ColorSpace::TransferID::ARIB_STD_B67) {
+ float sdr_white_level = 0.f;
+ dst.GetSDRWhiteLevel(&sdr_white_level);
+ steps_.push_back(
+ std::make_unique<ColorTransformHLGFromLinear>(sdr_white_level));
} else if (dst.GetTransferID() == ColorSpace::TransferID::SMPTEST2084) {
float sdr_white_level = 0.f;
- dst.GetPQSDRWhiteLevel(&sdr_white_level);
+ dst.GetSDRWhiteLevel(&sdr_white_level);
steps_.push_back(
std::make_unique<ColorTransformPQFromLinear>(sdr_white_level));
} else if (dst.GetTransferID() == ColorSpace::TransferID::PIECEWISE_HDR) {
diff --git a/chromium/ui/gfx/color_transform_unittest.cc b/chromium/ui/gfx/color_transform_unittest.cc
index b2801a54fe3..ff7835458ae 100644
--- a/chromium/ui/gfx/color_transform_unittest.cc
+++ b/chromium/ui/gfx/color_transform_unittest.cc
@@ -722,7 +722,7 @@ TEST(ColorSpaceTest, PQSDRWhiteLevel) {
ColorSpace hdr10 =
i < 3 ? ColorSpace::CreateHDR10(nits[i]) : ColorSpace::CreateHDR10();
float white_level = 0;
- EXPECT_TRUE(hdr10.GetPQSDRWhiteLevel(&white_level));
+ EXPECT_TRUE(hdr10.GetSDRWhiteLevel(&white_level));
if (i < 3)
EXPECT_EQ(white_level, nits[i]);
else
@@ -772,6 +772,74 @@ TEST(ColorSpaceTest, PQSDRWhiteLevel) {
}
}
+TEST(ColorSpaceTest, HLGSDRWhiteLevel) {
+ // These values are (1.0f * nits[i] / kDefaultSDRWhiteLevel) converted to
+ // LINEAR_HDR via the HLG transfer function.
+ constexpr float hlg_encoded_nits[] = {
+ 0.447214f, // 0.5 * sqrt(1.0 * 80 / 100)
+ 0.5f, // 0.5 * sqrt(1.0 * 100 / 100)
+ 0.65641f, // 0.17883277 * ln(1.0 * 200 / 100 - 0.28466892) + 0.55991073
+ };
+ constexpr float nits[] = {80.f, 100.f, 200.f};
+
+ for (size_t i = 0; i < 4; ++i) {
+ // We'll set the SDR white level to the values in |nits| and also the
+ // default.
+ ColorSpace hlg = i < 3
+ ? ColorSpace::CreateHLG().GetWithSDRWhiteLevel(nits[i])
+ : ColorSpace::CreateHLG();
+ float white_level = 0;
+ EXPECT_TRUE(hlg.GetSDRWhiteLevel(&white_level));
+ if (i < 3)
+ EXPECT_EQ(white_level, nits[i]);
+ else
+ EXPECT_EQ(white_level, ColorSpace::kDefaultSDRWhiteLevel);
+
+ // Transform to the same color space, but with the LINEAR_HDR transfer
+ // function.
+ ColorSpace target(ColorSpace::PrimaryID::BT2020,
+ ColorSpace::TransferID::LINEAR_HDR,
+ ColorSpace::MatrixID::RGB, ColorSpace::RangeID::FULL);
+ std::unique_ptr<ColorTransform> xform(ColorTransform::NewColorTransform(
+ hlg, target, ColorTransform::Intent::INTENT_ABSOLUTE));
+
+ // Do the transform to the values in |hlg_encoded_nits|.
+ ColorTransform::TriStim val(hlg_encoded_nits[0], hlg_encoded_nits[1],
+ hlg_encoded_nits[2]);
+ xform->Transform(&val, 1);
+
+ // Each |hlg_encoded_nits| value should map back to 1.0f after conversion
+ // via a ColorSpace with the right SDR white level.
+ switch (i) {
+ case 0:
+ EXPECT_NEAR(val.x(), 1.f, kMathEpsilon);
+ break;
+ case 1:
+ EXPECT_NEAR(val.y(), 1.f, kMathEpsilon);
+ break;
+ case 2:
+ EXPECT_NEAR(val.z(), 1.f, kMathEpsilon);
+ break;
+ case 3:
+ // Check that the default white level is 100 nits.
+ EXPECT_NEAR(val.y(), 1.f, kMathEpsilon);
+ break;
+ }
+
+ // The nit ratios should be preserved by the transform.
+ EXPECT_NEAR(val.y() / val.x(), nits[1] / nits[0], kMathEpsilon);
+ EXPECT_NEAR(val.z() / val.x(), nits[2] / nits[0], kMathEpsilon);
+
+ // Test the inverse transform.
+ std::unique_ptr<ColorTransform> xform_inv(ColorTransform::NewColorTransform(
+ target, hlg, ColorTransform::Intent::INTENT_ABSOLUTE));
+ xform_inv->Transform(&val, 1);
+ EXPECT_NEAR(val.x(), hlg_encoded_nits[0], kMathEpsilon);
+ EXPECT_NEAR(val.y(), hlg_encoded_nits[1], kMathEpsilon);
+ EXPECT_NEAR(val.z(), hlg_encoded_nits[2], kMathEpsilon);
+ }
+}
+
TEST(ColorSpaceTest, PiecewiseHDR) {
// The sRGB function evaluated at a couple of test points.
const float srgb_x0 = 0.01;
diff --git a/chromium/ui/gfx/display_color_spaces.h b/chromium/ui/gfx/display_color_spaces.h
index f2711c22957..0df06e17965 100644
--- a/chromium/ui/gfx/display_color_spaces.h
+++ b/chromium/ui/gfx/display_color_spaces.h
@@ -24,6 +24,9 @@ class DisplayColorSpacesDataView;
// The values are set so std::max() can be used to find the widest.
enum class ContentColorUsage : uint8_t {
+ // These values are histogrammed over time; do not change their ordinal
+ // values. When deleting a color usage replace it with a dummy value; when
+ // adding a color usage, do so at the bottom (and update kMaxValue).
kSRGB = 0,
kWideColorGamut = 1,
kHDR = 2,
@@ -35,6 +38,8 @@ enum class ContentColorUsage : uint8_t {
// opposed to in ui/display because it is used directly by components/viz.
class COLOR_SPACE_EXPORT DisplayColorSpaces {
public:
+ static constexpr size_t kConfigCount = 6;
+
// Initialize as sRGB-only.
DisplayColorSpaces();
@@ -108,7 +113,6 @@ class COLOR_SPACE_EXPORT DisplayColorSpaces {
friend struct mojo::StructTraits<gfx::mojom::DisplayColorSpacesDataView,
gfx::DisplayColorSpaces>;
- static constexpr size_t kConfigCount = 6;
gfx::ColorSpace color_spaces_[kConfigCount];
gfx::BufferFormat buffer_formats_[kConfigCount];
float sdr_white_level_ = ColorSpace::kDefaultSDRWhiteLevel;
diff --git a/chromium/ui/gfx/font_fallback_mac.mm b/chromium/ui/gfx/font_fallback_mac.mm
index d3664d356de..2dedccc7069 100644
--- a/chromium/ui/gfx/font_fallback_mac.mm
+++ b/chromium/ui/gfx/font_fallback_mac.mm
@@ -23,12 +23,10 @@ namespace gfx {
namespace {
bool TextSequenceHasEmoji(base::StringPiece16 text) {
- base::i18n::UTF16CharIterator iter(text.data(), text.length());
- while (!iter.end()) {
+ for (base::i18n::UTF16CharIterator iter(text); !iter.end(); iter.Advance()) {
const UChar32 codepoint = iter.get();
if (u_hasBinaryProperty(codepoint, UCHAR_EMOJI))
return true;
- iter.Advance();
}
return false;
}
diff --git a/chromium/ui/gfx/font_fallback_win.cc b/chromium/ui/gfx/font_fallback_win.cc
index 9b00c71251d..d94a4fce1d7 100644
--- a/chromium/ui/gfx/font_fallback_win.cc
+++ b/chromium/ui/gfx/font_fallback_win.cc
@@ -72,7 +72,6 @@ void AppendFont(const std::string& name, int size, std::vector<Font>* fonts) {
void QueryLinkedFontsFromRegistry(const Font& font,
std::map<std::string, std::string>* font_map,
std::vector<Font>* linked_fonts) {
- std::string logging_str;
const wchar_t* kSystemLink =
L"Software\\Microsoft\\Windows NT\\CurrentVersion\\FontLink\\SystemLink";
@@ -87,18 +86,12 @@ void QueryLinkedFontsFromRegistry(const Font& font,
return;
}
- base::StringAppendF(&logging_str, "Original font: %s\n",
- font.GetFontName().c_str());
-
std::string filename;
std::string font_name;
for (size_t i = 0; i < values.size(); ++i) {
internal::ParseFontLinkEntry(
base::WideToUTF8(values[i]), &filename, &font_name);
- base::StringAppendF(&logging_str, "fallback: '%s' '%s'\n",
- font_name.c_str(), filename.c_str());
-
// If the font name is present, add that directly, otherwise add the
// font names corresponding to the filename.
if (!font_name.empty()) {
@@ -112,13 +105,6 @@ void QueryLinkedFontsFromRegistry(const Font& font,
}
key.Close();
-
- for (const auto& resolved_font : *linked_fonts) {
- base::StringAppendF(&logging_str, "resolved: '%s'\n",
- resolved_font.GetFontName().c_str());
- }
-
- TRACE_EVENT1("fonts", "QueryLinkedFontsFromRegistry", "results", logging_str);
}
// CachedFontLinkSettings is a singleton cache of the Windows font settings
@@ -163,9 +149,6 @@ const std::vector<Font>* CachedFontLinkSettings::GetLinkedFonts(
if (it != cached_linked_fonts_.end())
return &it->second;
- TRACE_EVENT1("fonts", "CachedFontLinkSettings::GetLinkedFonts", "font_name",
- font_name);
-
SCOPED_UMA_HISTOGRAM_LONG_TIMER(
"FontFallback.GetLinkedFonts.CacheMissTiming");
std::vector<Font>* linked_fonts = &cached_linked_fonts_[font_name];
diff --git a/chromium/ui/gfx/font_render_params.cc b/chromium/ui/gfx/font_render_params.cc
index 3a03ffcc9f6..31799c8674f 100644
--- a/chromium/ui/gfx/font_render_params.cc
+++ b/chromium/ui/gfx/font_render_params.cc
@@ -9,38 +9,23 @@
namespace gfx {
// static
-SkFontLCDConfig::LCDOrder FontRenderParams::SubpixelRenderingToSkiaLCDOrder(
+SkPixelGeometry FontRenderParams::SubpixelRenderingToSkiaPixelGeometry(
FontRenderParams::SubpixelRendering subpixel_rendering) {
switch (subpixel_rendering) {
case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE:
+ return kRGB_H_SkPixelGeometry; // why not kUnknown_SkPixelGeometry ??
case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB:
+ return kRGB_H_SkPixelGeometry;
case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB:
- return SkFontLCDConfig::kRGB_LCDOrder;
+ return kRGB_V_SkPixelGeometry;
case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR:
+ return kBGR_H_SkPixelGeometry;
case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR:
- return SkFontLCDConfig::kBGR_LCDOrder;
+ return kBGR_V_SkPixelGeometry;
}
NOTREACHED();
- return SkFontLCDConfig::kRGB_LCDOrder;
-}
-
-// static
-SkFontLCDConfig::LCDOrientation
-FontRenderParams::SubpixelRenderingToSkiaLCDOrientation(
- FontRenderParams::SubpixelRendering subpixel_rendering) {
- switch (subpixel_rendering) {
- case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE:
- case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB:
- case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR:
- return SkFontLCDConfig::kHorizontal_LCDOrientation;
- case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB:
- case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR:
- return SkFontLCDConfig::kVertical_LCDOrientation;
- }
-
- NOTREACHED();
- return SkFontLCDConfig::kHorizontal_LCDOrientation;
+ return kRGB_H_SkPixelGeometry;
}
FontRenderParamsQuery::FontRenderParamsQuery()
diff --git a/chromium/ui/gfx/font_render_params.h b/chromium/ui/gfx/font_render_params.h
index 504331333b4..96508f213f4 100644
--- a/chromium/ui/gfx/font_render_params.h
+++ b/chromium/ui/gfx/font_render_params.h
@@ -10,7 +10,7 @@
#include "build/build_config.h"
#include "device/vr/buildflags/buildflags.h"
-#include "third_party/skia/include/core/SkFontLCDConfig.h"
+#include "third_party/skia/include/core/SkSurfaceProps.h"
#include "ui/gfx/font.h"
#include "ui/gfx/gfx_export.h"
@@ -71,9 +71,7 @@ struct GFX_EXPORT FontRenderParams {
// subpixel order.
SubpixelRendering subpixel_rendering = SUBPIXEL_RENDERING_NONE;
- static SkFontLCDConfig::LCDOrder SubpixelRenderingToSkiaLCDOrder(
- SubpixelRendering subpixel_rendering);
- static SkFontLCDConfig::LCDOrientation SubpixelRenderingToSkiaLCDOrientation(
+ static SkPixelGeometry SubpixelRenderingToSkiaPixelGeometry(
SubpixelRendering subpixel_rendering);
};
diff --git a/chromium/ui/gfx/font_render_params_win.cc b/chromium/ui/gfx/font_render_params_win.cc
index f953ab91818..de518076226 100644
--- a/chromium/ui/gfx/font_render_params_win.cc
+++ b/chromium/ui/gfx/font_render_params_win.cc
@@ -7,7 +7,7 @@
#include <memory>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/singleton.h"
diff --git a/chromium/ui/gfx/geometry/quaternion.cc b/chromium/ui/gfx/geometry/quaternion.cc
index a9d553e3cdf..6b21f7f8870 100644
--- a/chromium/ui/gfx/geometry/quaternion.cc
+++ b/chromium/ui/gfx/geometry/quaternion.cc
@@ -57,24 +57,51 @@ Quaternion::Quaternion(const Vector3dF& from, const Vector3dF& to) {
*this = this->Normalized();
}
-// Taken from http://www.w3.org/TR/css3-transforms/.
-Quaternion Quaternion::Slerp(const Quaternion& q, double t) const {
- double dot = x_ * q.x_ + y_ * q.y_ + z_ * q.z_ + w_ * q.w_;
+Quaternion Quaternion::FromAxisAngle(double x,
+ double y,
+ double z,
+ double angle) {
+ double length = std::sqrt(x * x + y * y + z * z);
+ if (std::abs(length) < kEpsilon)
+ return Quaternion(0, 0, 0, 1);
+
+ double scale = std::sin(0.5 * angle) / length;
+ return Quaternion(scale * x, scale * y, scale * z, std::cos(0.5 * angle));
+}
- dot = base::ClampToRange(dot, -1.0, 1.0);
+// Adapted from https://www.euclideanspace.com/maths/algebra/realNormedAlgebra/
+// quaternions/slerp/index.htm
+Quaternion Quaternion::Slerp(const Quaternion& to, double t) const {
+ Quaternion from = *this;
+
+ double cos_half_angle =
+ from.x_ * to.x_ + from.y_ * to.y_ + from.z_ * to.z_ + from.w_ * to.w_;
+ if (cos_half_angle < 0) {
+ // Since the half angle is > 90 degrees, the full rotation angle would
+ // exceed 180 degrees. The quaternions (x, y, z, w) and (-x, -y, -z, -w)
+ // represent the same rotation. Flipping the orientation of either
+ // quaternion ensures that the half angle is less than 90 and that we are
+ // taking the shortest path.
+ from = from.flip();
+ cos_half_angle = -cos_half_angle;
+ }
+
+ // Ensure that acos is well behaved at the boundary.
+ if (cos_half_angle > 1)
+ cos_half_angle = 1;
- // Quaternions are facing the same direction.
- if (std::abs(dot - 1.0) < kEpsilon || std::abs(dot + 1.0) < kEpsilon)
+ double sin_half_angle = std::sqrt(1.0 - cos_half_angle * cos_half_angle);
+ if (sin_half_angle < kEpsilon) {
+ // Quaternions share common axis and angle.
return *this;
+ }
- double denom = std::sqrt(1.0 - dot * dot);
- double theta = std::acos(dot);
- double w = std::sin(t * theta) * (1.0 / denom);
+ double half_angle = std::acos(cos_half_angle);
- double s1 = std::cos(t * theta) - dot * w;
- double s2 = w;
+ double scaleA = std::sin((1 - t) * half_angle) / sin_half_angle;
+ double scaleB = std::sin(t * half_angle) / sin_half_angle;
- return (s1 * *this) + (s2 * q);
+ return (scaleA * from) + (scaleB * to);
}
Quaternion Quaternion::Lerp(const Quaternion& q, double t) const {
diff --git a/chromium/ui/gfx/geometry/quaternion.h b/chromium/ui/gfx/geometry/quaternion.h
index 2558f271063..d7789568145 100644
--- a/chromium/ui/gfx/geometry/quaternion.h
+++ b/chromium/ui/gfx/geometry/quaternion.h
@@ -23,6 +23,8 @@ class GEOMETRY_EXPORT Quaternion {
// Constructs a quaternion representing a rotation between |from| and |to|.
Quaternion(const Vector3dF& from, const Vector3dF& to);
+ static Quaternion FromAxisAngle(double x, double y, double z, double angle);
+
constexpr double x() const { return x_; }
void set_x(double x) { x_ = x; }
@@ -48,6 +50,8 @@ class GEOMETRY_EXPORT Quaternion {
Quaternion inverse() const { return {-x_, -y_, -z_, w_}; }
+ Quaternion flip() const { return {-x_, -y_, -z_, -w_}; }
+
// Blends with the given quaternion, |q|, via spherical linear interpolation.
// Values of |t| in the range [0, 1] will interpolate between |this| and |q|,
// and values outside that range will extrapolate beyond in either direction.
diff --git a/chromium/ui/gfx/geometry/quaternion_unittest.cc b/chromium/ui/gfx/geometry/quaternion_unittest.cc
index 05bc39ff8bc..1e43d2aaeb2 100644
--- a/chromium/ui/gfx/geometry/quaternion_unittest.cc
+++ b/chromium/ui/gfx/geometry/quaternion_unittest.cc
@@ -16,6 +16,14 @@ namespace {
const double kEpsilon = 1e-7;
+#define EXPECT_QUATERNION(expected, actual) \
+ do { \
+ EXPECT_NEAR(expected.x(), actual.x(), kEpsilon); \
+ EXPECT_NEAR(expected.y(), actual.y(), kEpsilon); \
+ EXPECT_NEAR(expected.z(), actual.z(), kEpsilon); \
+ EXPECT_NEAR(expected.w(), actual.w(), kEpsilon); \
+ } while (false)
+
void CompareQuaternions(const Quaternion& a, const Quaternion& b) {
EXPECT_FLOAT_EQ(a.x(), b.x());
EXPECT_FLOAT_EQ(a.y(), b.y());
@@ -140,10 +148,7 @@ TEST(QuatTest, Slerp) {
double radians = (1.0 - t) * start_radians + t * stop_radians;
Quaternion expected(axis, radians);
Quaternion interpolated = start.Slerp(stop, t);
- EXPECT_NEAR(expected.x(), interpolated.x(), kEpsilon);
- EXPECT_NEAR(expected.y(), interpolated.y(), kEpsilon);
- EXPECT_NEAR(expected.z(), interpolated.z(), kEpsilon);
- EXPECT_NEAR(expected.w(), interpolated.w(), kEpsilon);
+ EXPECT_QUATERNION(expected, interpolated);
}
}
@@ -159,10 +164,53 @@ TEST(QuatTest, SlerpOppositeAngles) {
Quaternion expected(axis, 0);
Quaternion interpolated = start.Slerp(stop, 0.5f);
- EXPECT_NEAR(expected.x(), interpolated.x(), kEpsilon);
- EXPECT_NEAR(expected.y(), interpolated.y(), kEpsilon);
- EXPECT_NEAR(expected.z(), interpolated.z(), kEpsilon);
- EXPECT_NEAR(expected.w(), interpolated.w(), kEpsilon);
+ EXPECT_QUATERNION(expected, interpolated);
+}
+
+TEST(QuatTest, SlerpRotateXRotateY) {
+ Quaternion start(Vector3dF(1, 0, 0), base::kPiDouble / 2);
+ Quaternion stop(Vector3dF(0, 1, 0), base::kPiDouble / 2);
+ Quaternion interpolated = start.Slerp(stop, 0.5f);
+
+ double expected_angle = std::acos(1.0 / 3.0);
+ double xy = std::sin(0.5 * expected_angle) / std::sqrt(2);
+ Quaternion expected(xy, xy, 0, std::cos(0.5 * expected_angle));
+ EXPECT_QUATERNION(expected, interpolated);
+}
+
+TEST(QuatTest, Slerp360) {
+ Quaternion start(0, 0, 0, -1); // 360 degree rotation.
+ Quaternion stop(Vector3dF(0, 0, 1), base::kPiDouble / 2);
+ Quaternion interpolated = start.Slerp(stop, 0.5f);
+ double expected_half_angle = base::kPiDouble / 8;
+ Quaternion expected(0, 0, std::sin(expected_half_angle),
+ std::cos(expected_half_angle));
+ EXPECT_QUATERNION(expected, interpolated);
+}
+
+TEST(QuatTest, SlerpEquivalentQuaternions) {
+ Quaternion start(Vector3dF(1, 0, 0), base::kPiDouble / 3);
+ Quaternion stop = start.flip();
+ Quaternion interpolated = start.Slerp(stop, 0.5f);
+ EXPECT_QUATERNION(start, interpolated);
+}
+
+TEST(QuatTest, SlerpQuaternionWithInverse) {
+ Quaternion start(Vector3dF(1, 0, 0), base::kPiDouble / 3);
+ Quaternion stop = start.inverse();
+ Quaternion interpolated = start.Slerp(stop, 0.5f);
+ Quaternion expected(0, 0, 0, 1);
+ EXPECT_QUATERNION(expected, interpolated);
+}
+
+TEST(QuatTest, SlerpObtuseAngle) {
+ Quaternion start(Vector3dF(1, 1, 0), base::kPiDouble / 2);
+ Quaternion stop(Vector3dF(0, 1, -1), 3 * base::kPiDouble / 2);
+ Quaternion interpolated = start.Slerp(stop, 0.5f);
+ double expected_half_angle = -std::atan(0.5);
+ double xz = std::sin(expected_half_angle) / std::sqrt(2);
+ Quaternion expected(xz, 0, xz, -std::cos(expected_half_angle));
+ EXPECT_QUATERNION(expected, interpolated);
}
} // namespace gfx
diff --git a/chromium/ui/gfx/gpu_extra_info.cc b/chromium/ui/gfx/gpu_extra_info.cc
new file mode 100644
index 00000000000..90747bf4477
--- /dev/null
+++ b/chromium/ui/gfx/gpu_extra_info.cc
@@ -0,0 +1,23 @@
+// Copyright (c) 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/gpu_extra_info.h"
+
+namespace gfx {
+
+ANGLEFeature::ANGLEFeature() = default;
+ANGLEFeature::ANGLEFeature(const ANGLEFeature& other) = default;
+ANGLEFeature::ANGLEFeature(ANGLEFeature&& other) = default;
+ANGLEFeature::~ANGLEFeature() = default;
+ANGLEFeature& ANGLEFeature::operator=(const ANGLEFeature& other) = default;
+ANGLEFeature& ANGLEFeature::operator=(ANGLEFeature&& other) = default;
+
+GpuExtraInfo::GpuExtraInfo() = default;
+GpuExtraInfo::GpuExtraInfo(const GpuExtraInfo&) = default;
+GpuExtraInfo::GpuExtraInfo(GpuExtraInfo&&) = default;
+GpuExtraInfo::~GpuExtraInfo() = default;
+GpuExtraInfo& GpuExtraInfo::operator=(const GpuExtraInfo&) = default;
+GpuExtraInfo& GpuExtraInfo::operator=(GpuExtraInfo&&) = default;
+
+} // namespace gfx
diff --git a/chromium/ui/gfx/gpu_extra_info.h b/chromium/ui/gfx/gpu_extra_info.h
new file mode 100644
index 00000000000..90fe896677d
--- /dev/null
+++ b/chromium/ui/gfx/gpu_extra_info.h
@@ -0,0 +1,71 @@
+// Copyright (c) 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_GPU_EXTRA_INFO_H_
+#define UI_GFX_GPU_EXTRA_INFO_H_
+
+#include <string>
+#include <vector>
+
+#include "ui/gfx/buffer_types.h"
+#include "ui/gfx/gfx_export.h"
+
+#if defined(USE_OZONE) || defined(USE_X11)
+typedef unsigned long VisualID;
+#endif
+
+namespace gfx {
+
+// Specification of a feature that can be enabled/disable in ANGLE
+struct GFX_EXPORT ANGLEFeature {
+ ANGLEFeature();
+ ANGLEFeature(const ANGLEFeature& other);
+ ANGLEFeature(ANGLEFeature&& other);
+ ~ANGLEFeature();
+ ANGLEFeature& operator=(const ANGLEFeature& other);
+ ANGLEFeature& operator=(ANGLEFeature&& other);
+
+ // Name of the feature in camel_case.
+ std::string name;
+
+ // Name of the category that the feature belongs to.
+ std::string category;
+
+ // One sentence description of the feature, why it's available.
+ std::string description;
+
+ // Full link to cr/angle bug if applicable.
+ std::string bug;
+
+ // Status, can be "enabled" or "disabled".
+ std::string status;
+
+ // Condition, contains the condition that set 'status'.
+ std::string condition;
+};
+using ANGLEFeatures = std::vector<ANGLEFeature>;
+
+struct GFX_EXPORT GpuExtraInfo {
+ GpuExtraInfo();
+ GpuExtraInfo(const GpuExtraInfo&);
+ GpuExtraInfo(GpuExtraInfo&&);
+ ~GpuExtraInfo();
+ GpuExtraInfo& operator=(const GpuExtraInfo&);
+ GpuExtraInfo& operator=(GpuExtraInfo&&);
+
+ // List of the currently available ANGLE features. May be empty if not
+ // applicable.
+ ANGLEFeatures angle_features;
+
+#if defined(USE_OZONE) || defined(USE_X11)
+ VisualID system_visual = 0;
+ VisualID rgba_visual = 0;
+
+ std::vector<gfx::BufferUsageAndFormat> gpu_memory_buffer_support_x11;
+#endif
+};
+
+} // namespace gfx
+
+#endif // UI_GFX_GPU_EXTRA_INFO_H_
diff --git a/chromium/ui/gfx/gpu_fence.cc b/chromium/ui/gfx/gpu_fence.cc
index 9fc65f3a506..032fd8a0514 100644
--- a/chromium/ui/gfx/gpu_fence.cc
+++ b/chromium/ui/gfx/gpu_fence.cc
@@ -19,6 +19,10 @@ GpuFence::GpuFence(GpuFenceHandle fence_handle)
GpuFence::~GpuFence() = default;
+GpuFence::GpuFence(GpuFence&& other) = default;
+
+GpuFence& GpuFence::operator=(GpuFence&& other) = default;
+
const GpuFenceHandle& GpuFence::GetGpuFenceHandle() const {
return fence_handle_;
}
diff --git a/chromium/ui/gfx/gpu_fence.h b/chromium/ui/gfx/gpu_fence.h
index 968cf168be5..7401b48d91c 100644
--- a/chromium/ui/gfx/gpu_fence.h
+++ b/chromium/ui/gfx/gpu_fence.h
@@ -25,6 +25,8 @@ class GFX_EXPORT GpuFence {
// Constructor takes ownership of the source handle's resources.
explicit GpuFence(GpuFenceHandle handle);
GpuFence() = delete;
+ GpuFence(GpuFence&& other);
+ GpuFence& operator=(GpuFence&& other);
~GpuFence();
// Returns a const reference to the underlying GpuFenceHandle
diff --git a/chromium/ui/gfx/gpu_fence_handle.cc b/chromium/ui/gfx/gpu_fence_handle.cc
index 485782ac9b8..c8d719bf004 100644
--- a/chromium/ui/gfx/gpu_fence_handle.cc
+++ b/chromium/ui/gfx/gpu_fence_handle.cc
@@ -4,6 +4,7 @@
#include "ui/gfx/gpu_fence_handle.h"
+#include "base/debug/alias.h"
#include "base/notreached.h"
#if defined(OS_POSIX)
@@ -12,6 +13,15 @@
#include "base/posix/eintr_wrapper.h"
#endif
+#if defined(OS_FUCHSIA)
+#include "base/fuchsia/fuchsia_logging.h"
+#endif
+
+#if defined(OS_WIN)
+#include <windows.h>
+#include "base/process/process_handle.h"
+#endif
+
namespace gfx {
GpuFenceHandle::GpuFenceHandle() = default;
@@ -25,6 +35,10 @@ GpuFenceHandle::~GpuFenceHandle() = default;
bool GpuFenceHandle::is_null() const {
#if defined(OS_POSIX)
return !owned_fd.is_valid();
+#elif defined(OS_FUCHSIA)
+ return !owned_event.is_valid();
+#elif defined(OS_WIN)
+ return !owned_handle.IsValid();
#else
return true;
#endif
@@ -37,6 +51,25 @@ GpuFenceHandle GpuFenceHandle::Clone() const {
if (duped_handle < 0)
return GpuFenceHandle();
handle.owned_fd = base::ScopedFD(duped_handle);
+#elif defined(OS_FUCHSIA)
+ zx_status_t status =
+ owned_event.duplicate(ZX_RIGHT_SAME_RIGHTS, &handle.owned_event);
+ if (status != ZX_OK) {
+ ZX_DLOG(ERROR, status) << "zx_handle_duplicate";
+ return GpuFenceHandle();
+ }
+#elif defined(OS_WIN)
+ const base::ProcessHandle process = ::GetCurrentProcess();
+ HANDLE duplicated_handle = INVALID_HANDLE_VALUE;
+ const BOOL result =
+ ::DuplicateHandle(process, owned_handle.Get(), process,
+ &duplicated_handle, 0, FALSE, DUPLICATE_SAME_ACCESS);
+ if (!result) {
+ const DWORD last_error = ::GetLastError();
+ base::debug::Alias(&last_error);
+ CHECK(false);
+ }
+ handle.owned_handle.Set(duplicated_handle);
#else
NOTREACHED();
#endif
diff --git a/chromium/ui/gfx/gpu_fence_handle.h b/chromium/ui/gfx/gpu_fence_handle.h
index 091ead03c9e..3e4abef74f7 100644
--- a/chromium/ui/gfx/gpu_fence_handle.h
+++ b/chromium/ui/gfx/gpu_fence_handle.h
@@ -9,10 +9,18 @@
#include "build/build_config.h"
#include "ui/gfx/gfx_export.h"
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
+#if defined(OS_POSIX)
#include "base/files/scoped_file.h"
#endif
+#if defined(OS_FUCHSIA)
+#include <lib/zx/event.h>
+#endif
+
+#if defined(OS_WIN)
+#include "base/win/scoped_handle.h"
+#endif
+
namespace gfx {
struct GFX_EXPORT GpuFenceHandle {
@@ -31,11 +39,13 @@ struct GFX_EXPORT GpuFenceHandle {
// |handle| itself.
GpuFenceHandle Clone() const;
- // owned_fd is defined here for both OS_FUCHSIA and OS_POSIX but all
- // of the handling for owned_fd is only for POSIX. Consider adjusting the
- // defines in the future.
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
+ // TODO(crbug.com/1142962): Make this a class instead of struct.
+#if defined(OS_POSIX)
base::ScopedFD owned_fd;
+#elif defined(OS_FUCHSIA)
+ zx::event owned_event;
+#elif defined(OS_WIN)
+ base::win::ScopedHandle owned_handle;
#endif
};
diff --git a/chromium/ui/gfx/gpu_memory_buffer.cc b/chromium/ui/gfx/gpu_memory_buffer.cc
index b4e63ecf035..5d37183d17e 100644
--- a/chromium/ui/gfx/gpu_memory_buffer.cc
+++ b/chromium/ui/gfx/gpu_memory_buffer.cc
@@ -37,7 +37,7 @@ GpuMemoryBufferHandle GpuMemoryBufferHandle::Clone() const {
#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_FUCHSIA)
handle.native_pixmap_handle = CloneHandleForIPC(native_pixmap_handle);
#elif defined(OS_MAC)
- handle.mach_port = mach_port;
+ handle.io_surface = io_surface;
#elif defined(OS_WIN)
NOTIMPLEMENTED();
#elif defined(OS_ANDROID)
diff --git a/chromium/ui/gfx/gpu_memory_buffer.h b/chromium/ui/gfx/gpu_memory_buffer.h
index 259e1426123..7a33fcbfaa6 100644
--- a/chromium/ui/gfx/gpu_memory_buffer.h
+++ b/chromium/ui/gfx/gpu_memory_buffer.h
@@ -72,7 +72,7 @@ struct GFX_EXPORT GpuMemoryBufferHandle {
#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_FUCHSIA)
NativePixmapHandle native_pixmap_handle;
#elif defined(OS_MAC)
- ScopedRefCountedIOSurfaceMachPort mach_port;
+ gfx::ScopedIOSurface io_surface;
#elif defined(OS_WIN)
base::win::ScopedHandle dxgi_handle;
#elif defined(OS_ANDROID)
diff --git a/chromium/ui/gl/hdr_metadata.cc b/chromium/ui/gfx/hdr_metadata.cc
index 05e0f7aa531..d545475fe1b 100644
--- a/chromium/ui/gl/hdr_metadata.cc
+++ b/chromium/ui/gfx/hdr_metadata.cc
@@ -2,9 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/gl/hdr_metadata.h"
+#include "ui/gfx/hdr_metadata.h"
-namespace gl {
+namespace gfx {
MasteringMetadata::MasteringMetadata() = default;
MasteringMetadata::MasteringMetadata(const MasteringMetadata& rhs) = default;
@@ -12,4 +12,4 @@ MasteringMetadata::MasteringMetadata(const MasteringMetadata& rhs) = default;
HDRMetadata::HDRMetadata() = default;
HDRMetadata::HDRMetadata(const HDRMetadata& rhs) = default;
-} // namespace gl
+} // namespace gfx
diff --git a/chromium/ui/gl/hdr_metadata.h b/chromium/ui/gfx/hdr_metadata.h
index d80952058b6..dfb55a9b3f4 100644
--- a/chromium/ui/gl/hdr_metadata.h
+++ b/chromium/ui/gfx/hdr_metadata.h
@@ -2,17 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_GL_HDR_METADATA_H_
-#define UI_GL_HDR_METADATA_H_
+#ifndef UI_GFX_HDR_METADATA_H_
+#define UI_GFX_HDR_METADATA_H_
#include "ui/gfx/geometry/point_f.h"
-#include "ui/gl/gl_export.h"
+#include "ui/gfx/gfx_export.h"
-namespace gl {
+namespace gfx {
// SMPTE ST 2086 mastering metadata.
-struct GL_EXPORT MasteringMetadata {
- using Chromaticity = gfx::PointF;
+struct GFX_EXPORT MasteringMetadata {
+ using Chromaticity = PointF;
Chromaticity primary_r;
Chromaticity primary_g;
Chromaticity primary_b;
@@ -32,7 +32,7 @@ struct GL_EXPORT MasteringMetadata {
};
// HDR metadata common for HDR10 and WebM/VP9-based HDR formats.
-struct GL_EXPORT HDRMetadata {
+struct GFX_EXPORT HDRMetadata {
MasteringMetadata mastering_metadata;
// Max content light level (CLL), i.e. maximum brightness level present in the
// stream), in nits.
@@ -67,6 +67,6 @@ enum class HdrMetadataType {
kSmpteSt2094_40,
};
-} // namespace gl
+} // namespace gfx
-#endif // UI_GL_HDR_METADATA_H_
+#endif // UI_GFX_HDR_METADATA_H_
diff --git a/chromium/ui/gfx/icon_util.cc b/chromium/ui/gfx/icon_util.cc
index 70bbff64078..504d2093f1f 100644
--- a/chromium/ui/gfx/icon_util.cc
+++ b/chromium/ui/gfx/icon_util.cc
@@ -116,13 +116,9 @@ bool ConvertImageFamilyToBitmaps(
DCHECK_LE(image.Height(), IconUtil::kLargeIconSize);
SkBitmap bitmap = image.AsBitmap();
-
- // Only 32 bit ARGB bitmaps are supported. We also make sure the bitmap has
- // been properly initialized.
- if ((bitmap.colorType() != kN32_SkColorType) ||
- (bitmap.getPixels() == NULL)) {
+ CHECK_EQ(bitmap.colorType(), kN32_SkColorType);
+ if (bitmap.isNull())
return false;
- }
// Special case: Icons exactly 256x256 are stored in PNG format.
if (image.Width() == IconUtil::kLargeIconSize &&
diff --git a/chromium/ui/gfx/icon_util_unittest.cc b/chromium/ui/gfx/icon_util_unittest.cc
index 4e856eb8292..0130a4560ab 100644
--- a/chromium/ui/gfx/icon_util_unittest.cc
+++ b/chromium/ui/gfx/icon_util_unittest.cc
@@ -201,52 +201,23 @@ TEST_F(IconUtilTest, TestBitmapToIconInvalidParameters) {
// The following test case makes sure IconUtil::CreateIconFileFromImageFamily
// fails gracefully when called with invalid input parameters.
TEST_F(IconUtilTest, TestCreateIconFileInvalidParameters) {
- std::unique_ptr<SkBitmap> bitmap;
gfx::ImageFamily image_family;
base::FilePath valid_icon_filename =
temp_directory_.GetPath().AppendASCII(kTempIconFilename);
base::FilePath invalid_icon_filename =
temp_directory_.GetPath().AppendASCII("<>?.ico");
- // Wrong bitmap format.
- bitmap = std::make_unique<SkBitmap>();
- ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL));
- // Must allocate pixels or else ImageSkia will ignore the bitmap and just
- // return an empty image.
- bitmap->allocPixels(SkImageInfo::MakeA8(kSmallIconWidth, kSmallIconHeight));
- memset(bitmap->getPixels(), 0, bitmap->width() * bitmap->height());
- image_family.Add(gfx::Image::CreateFrom1xBitmap(*bitmap));
- EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family,
- valid_icon_filename));
- EXPECT_FALSE(base::PathExists(valid_icon_filename));
-
- // Invalid bitmap size.
- image_family.clear();
- bitmap = std::make_unique<SkBitmap>();
- ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL));
- bitmap->allocPixels(SkImageInfo::MakeN32Premul(0, 0));
- image_family.Add(gfx::Image::CreateFrom1xBitmap(*bitmap));
- EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family,
- valid_icon_filename));
- EXPECT_FALSE(base::PathExists(valid_icon_filename));
-
- // Bitmap with no allocated pixels.
- image_family.clear();
- bitmap = std::make_unique<SkBitmap>();
- ASSERT_NE(bitmap.get(), static_cast<SkBitmap*>(NULL));
- bitmap->setInfo(SkImageInfo::MakeN32Premul(kSmallIconWidth,
- kSmallIconHeight));
- image_family.Add(gfx::Image::CreateFrom1xBitmap(*bitmap));
+ // Null bitmap.
+ SkBitmap bitmap;
+ image_family.Add(gfx::Image::CreateFrom1xBitmap(bitmap));
EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family,
valid_icon_filename));
EXPECT_FALSE(base::PathExists(valid_icon_filename));
// Invalid file name.
image_family.clear();
- bitmap->allocPixels();
- // Setting the pixels to black.
- memset(bitmap->getPixels(), 0, bitmap->width() * bitmap->height() * 4);
- image_family.Add(gfx::Image::CreateFrom1xBitmap(*bitmap));
+ bitmap.allocN32Pixels(1, 1);
+ image_family.Add(gfx::Image::CreateFrom1xBitmap(bitmap));
EXPECT_FALSE(IconUtil::CreateIconFileFromImageFamily(image_family,
invalid_icon_filename));
EXPECT_FALSE(base::PathExists(invalid_icon_filename));
@@ -443,7 +414,7 @@ TEST_F(IconUtilTest, TestTransparentIcon) {
bitmap.allocN32Pixels(size, size, false);
EXPECT_EQ(bitmap.alphaType(), kPremul_SkAlphaType);
{
- SkCanvas canvas(bitmap);
+ SkCanvas canvas(bitmap, SkSurfaceProps{});
canvas.drawColor(SK_ColorWHITE);
SkPaint paint;
paint.setColor(semi_transparent_red);
diff --git a/chromium/ui/gfx/image/OWNERS b/chromium/ui/gfx/image/OWNERS
index 8e89a42a8c1..23dbb5a958f 100644
--- a/chromium/ui/gfx/image/OWNERS
+++ b/chromium/ui/gfx/image/OWNERS
@@ -2,5 +2,3 @@ rsesek@chromium.org
# ImageSkia related classes except for _mac/_ios stuff
per-file image_skia*=oshima@chromium.org
-
-# COMPONENT: UI>GFX
diff --git a/chromium/ui/gfx/image/image_family_unittest.cc b/chromium/ui/gfx/image/image_family_unittest.cc
index e3973d037ac..4bd2dc6f52c 100644
--- a/chromium/ui/gfx/image/image_family_unittest.cc
+++ b/chromium/ui/gfx/image/image_family_unittest.cc
@@ -221,15 +221,6 @@ TEST_F(ImageFamilyTest, CreateExact) {
// Wider than widest image.
EXPECT_IMAGE_SIZE(image_family_.CreateExact(255, 51), 255, 51);
-
- // CreateExact on an image family with a non-N32 color bitmap results in an
- // empty image.
- gfx::ImageFamily a8_family;
- SkBitmap a8_bitmap;
- SkImageInfo a8_info = SkImageInfo::MakeA8(64, 64);
- a8_bitmap.allocPixels(a8_info);
- a8_family.Add(gfx::Image::CreateFrom1xBitmap(a8_bitmap));
- EXPECT_TRUE(a8_family.CreateExact(32, 32).IsEmpty());
}
// Test adding and looking up images with 0 width and height.
diff --git a/chromium/ui/gfx/image/image_skia_rep_default.cc b/chromium/ui/gfx/image/image_skia_rep_default.cc
index 8819dd4e13a..a8cbaf36e78 100644
--- a/chromium/ui/gfx/image/image_skia_rep_default.cc
+++ b/chromium/ui/gfx/image/image_skia_rep_default.cc
@@ -9,6 +9,7 @@
#include "cc/paint/display_item_list.h"
#include "cc/paint/record_paint_canvas.h"
#include "cc/paint/skia_paint_canvas.h"
+#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/gfx/color_palette.h"
@@ -32,6 +33,10 @@ ImageSkiaRep::ImageSkiaRep(const SkBitmap& src, float scale)
pixel_size_(gfx::Size(src.width(), src.height())),
bitmap_(src),
scale_(scale) {
+ // If the bitmap has been initialized then it must be in N32 format.
+ if (!(bitmap_.isNull() && bitmap_.colorType() == kUnknown_SkColorType &&
+ bitmap_.alphaType() == kUnknown_SkAlphaType))
+ CHECK_EQ(bitmap_.colorType(), kN32_SkColorType);
bitmap_.setImmutable();
paint_image_ = cc::PaintImage::CreateFromBitmap(src);
}
@@ -98,7 +103,7 @@ const SkBitmap& ImageSkiaRep::GetBitmap() const {
// as it forces a rasterization on the UI thread.
bitmap_.allocN32Pixels(pixel_width(), pixel_height());
bitmap_.eraseColor(SK_ColorTRANSPARENT);
- SkCanvas canvas(bitmap_);
+ SkCanvas canvas(bitmap_, skia::LegacyDisplayGlobals::GetSkSurfaceProps());
paint_record_->Playback(&canvas);
bitmap_.setImmutable();
}
diff --git a/chromium/ui/gfx/image/image_unittest.cc b/chromium/ui/gfx/image/image_unittest.cc
index 40354aea1a9..2f4f27693ce 100644
--- a/chromium/ui/gfx/image/image_unittest.cc
+++ b/chromium/ui/gfx/image/image_unittest.cc
@@ -437,7 +437,7 @@ TEST_F(ImageTest, SkBitmapConversionPreservesOrientation) {
bitmap.eraseARGB(255, 0, 255, 0);
// Paint the upper half of the image in red (lower half is in green).
- SkCanvas canvas(bitmap);
+ SkCanvas canvas(bitmap, SkSurfaceProps{});
SkPaint red;
red.setColor(SK_ColorRED);
canvas.drawRect(SkRect::MakeWH(width, height / 2), red);
@@ -478,7 +478,7 @@ TEST_F(ImageTest, SkBitmapConversionPreservesTransparency) {
bitmap.eraseARGB(0, 0, 255, 0);
// Paint the upper half of the image in red (lower half is transparent).
- SkCanvas canvas(bitmap);
+ SkCanvas canvas(bitmap, SkSurfaceProps{});
SkPaint red;
red.setColor(SK_ColorRED);
canvas.drawRect(SkRect::MakeWH(width, height / 2), red);
diff --git a/chromium/ui/gfx/ipc/BUILD.gn b/chromium/ui/gfx/ipc/BUILD.gn
index 170b9fc42dd..9767b92961f 100644
--- a/chromium/ui/gfx/ipc/BUILD.gn
+++ b/chromium/ui/gfx/ipc/BUILD.gn
@@ -22,4 +22,9 @@ component("ipc") {
"//ui/gfx/ipc/geometry",
"//ui/gfx/range",
]
+
+ frameworks = [
+ "CoreFoundation.framework",
+ "IOSurface.framework",
+ ]
}
diff --git a/chromium/ui/gfx/ipc/gfx_param_traits.cc b/chromium/ui/gfx/ipc/gfx_param_traits.cc
index b9ca505d213..0c4600d7e95 100644
--- a/chromium/ui/gfx/ipc/gfx_param_traits.cc
+++ b/chromium/ui/gfx/ipc/gfx_param_traits.cc
@@ -63,6 +63,39 @@ void ParamTraits<gfx::ScopedRefCountedIOSurfaceMachPort>::Log(
l->append("IOSurface Mach send right: ");
LogParam(p.get(), l);
}
+
+void ParamTraits<gfx::ScopedIOSurface>::Write(base::Pickle* m,
+ const param_type p) {
+ gfx::ScopedRefCountedIOSurfaceMachPort io_surface_mach_port(
+ IOSurfaceCreateMachPort(p.get()));
+ MachPortMac mach_port_mac(io_surface_mach_port.get());
+ ParamTraits<MachPortMac>::Write(m, mach_port_mac);
+}
+
+bool ParamTraits<gfx::ScopedIOSurface>::Read(const base::Pickle* m,
+ base::PickleIterator* iter,
+ param_type* r) {
+ MachPortMac mach_port_mac;
+ if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac))
+ return false;
+ gfx::ScopedRefCountedIOSurfaceMachPort io_surface_mach_port(
+ mach_port_mac.get_mach_port());
+ if (io_surface_mach_port)
+ r->reset(IOSurfaceLookupFromMachPort(io_surface_mach_port.get()));
+ else
+ r->reset();
+ return true;
+}
+
+void ParamTraits<gfx::ScopedIOSurface>::Log(const param_type& p,
+ std::string* l) {
+ l->append("IOSurface(");
+ if (p) {
+ uint32_t io_surface_id = IOSurfaceGetID(p.get());
+ LogParam(io_surface_id, l);
+ }
+ l->append(")");
+}
#endif // defined(OS_MAC)
void ParamTraits<gfx::SelectionBound>::Write(base::Pickle* m,
diff --git a/chromium/ui/gfx/ipc/gfx_param_traits.h b/chromium/ui/gfx/ipc/gfx_param_traits.h
index 2f91eb5d92c..e9ae63a2d0c 100644
--- a/chromium/ui/gfx/ipc/gfx_param_traits.h
+++ b/chromium/ui/gfx/ipc/gfx_param_traits.h
@@ -48,6 +48,16 @@ struct GFX_IPC_EXPORT ParamTraits<gfx::ScopedRefCountedIOSurfaceMachPort> {
param_type* r);
static void Log(const param_type& p, std::string* l);
};
+
+template <>
+struct GFX_IPC_EXPORT ParamTraits<gfx::ScopedIOSurface> {
+ typedef gfx::ScopedIOSurface param_type;
+ static void Write(base::Pickle* m, const param_type p);
+ static bool Read(const base::Pickle* m,
+ base::PickleIterator* iter,
+ param_type* r);
+ static void Log(const param_type& p, std::string* l);
+};
#endif // defined(OS_MAC)
template <>
diff --git a/chromium/ui/gfx/ipc/gfx_param_traits_macros.h b/chromium/ui/gfx/ipc/gfx_param_traits_macros.h
index bf257c74e75..d8ce305d91c 100644
--- a/chromium/ui/gfx/ipc/gfx_param_traits_macros.h
+++ b/chromium/ui/gfx/ipc/gfx_param_traits_macros.h
@@ -51,7 +51,7 @@ IPC_STRUCT_TRAITS_BEGIN(gfx::GpuMemoryBufferHandle)
#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_FUCHSIA)
IPC_STRUCT_TRAITS_MEMBER(native_pixmap_handle)
#elif defined(OS_APPLE)
- IPC_STRUCT_TRAITS_MEMBER(mach_port)
+ IPC_STRUCT_TRAITS_MEMBER(io_surface)
#elif defined(OS_WIN)
IPC_STRUCT_TRAITS_MEMBER(dxgi_handle)
#elif defined(OS_ANDROID)
@@ -109,6 +109,9 @@ IPC_STRUCT_TRAITS_BEGIN(gfx::GpuFenceHandle)
#if defined(OS_POSIX)
IPC_STRUCT_TRAITS_MEMBER(owned_fd)
#endif
+#if defined(OS_WIN)
+ IPC_STRUCT_TRAITS_MEMBER(owned_handle)
+#endif
IPC_STRUCT_TRAITS_END()
#undef IPC_MESSAGE_EXPORT
diff --git a/chromium/ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h b/chromium/ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h
index 4f1605b8554..ada9951da5b 100644
--- a/chromium/ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h
+++ b/chromium/ui/gfx/ipc/skia/gfx_skia_param_traits_macros.h
@@ -13,8 +13,8 @@
#undef IPC_MESSAGE_EXPORT
#define IPC_MESSAGE_EXPORT GFX_SKIA_IPC_EXPORT
-IPC_ENUM_TRAITS_VALIDATE(SkColorType, kLastEnum_SkColorType)
-IPC_ENUM_TRAITS_VALIDATE(SkAlphaType, kLastEnum_SkAlphaType)
+IPC_ENUM_TRAITS_MAX_VALUE(SkColorType, kLastEnum_SkColorType)
+IPC_ENUM_TRAITS_MAX_VALUE(SkAlphaType, kLastEnum_SkAlphaType)
#undef IPC_MESSAGE_EXPORT
#define IPC_MESSAGE_EXPORT
diff --git a/chromium/ui/gfx/linux/BUILD.gn b/chromium/ui/gfx/linux/BUILD.gn
index 3574e02b14d..3d02d93c375 100644
--- a/chromium/ui/gfx/linux/BUILD.gn
+++ b/chromium/ui/gfx/linux/BUILD.gn
@@ -2,10 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
-assert(use_x11 || ozone_platform_drm || ozone_platform_wayland)
+assert(use_x11 || ozone_platform_drm || ozone_platform_wayland ||
+ ozone_platform_x11)
source_set("drm") {
sources = [
@@ -45,7 +46,7 @@ source_set("gbm") {
]
}
-if (use_x11) {
+if (use_x11 || ozone_platform_x11) {
component("gpu_memory_buffer_support_x11") {
sources = [
"gpu_memory_buffer_support_x11.cc",
diff --git a/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc b/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc
index e570add75d5..8c94f8be779 100644
--- a/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc
+++ b/chromium/ui/gfx/linux/client_native_pixmap_dmabuf.cc
@@ -159,7 +159,8 @@ bool ClientNativePixmapDmaBuf::IsConfigurationSupported(
format == gfx::BufferFormat::BGRA_8888 ||
format == gfx::BufferFormat::RGBX_8888 ||
format == gfx::BufferFormat::RGBA_8888;
- case gfx::BufferUsage::SCANOUT_VDA_WRITE:
+ case gfx::BufferUsage::SCANOUT_VDA_WRITE: // fallthrough
+ case gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE:
return false;
case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
@@ -191,6 +192,7 @@ bool ClientNativePixmapDmaBuf::IsConfigurationSupported(
case gfx::BufferUsage::CAMERA_AND_CPU_READ_WRITE:
// R_8 is used as the underlying pixel format for BLOB buffers.
return format == gfx::BufferFormat::R_8;
+ case gfx::BufferUsage::SCANOUT_VEA_CPU_READ:
case gfx::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE:
return format == gfx::BufferFormat::YVU_420 ||
format == gfx::BufferFormat::YUV_420_BIPLANAR;
diff --git a/chromium/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc b/chromium/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
index d8d6e587a84..1607888d56a 100644
--- a/chromium/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
+++ b/chromium/ui/gfx/linux/client_native_pixmap_factory_dmabuf.cc
@@ -59,12 +59,14 @@ class ClientNativePixmapFactoryDmabuf : public ClientNativePixmapFactory {
case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
case gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE:
case gfx::BufferUsage::CAMERA_AND_CPU_READ_WRITE:
+ case gfx::BufferUsage::SCANOUT_VEA_CPU_READ:
case gfx::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE:
return ClientNativePixmapDmaBuf::ImportFromDmabuf(std::move(handle),
size, format);
case gfx::BufferUsage::GPU_READ:
case gfx::BufferUsage::SCANOUT:
case gfx::BufferUsage::SCANOUT_VDA_WRITE:
+ case gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE:
return base::WrapUnique(new ClientNativePixmapOpaque);
}
NOTREACHED();
diff --git a/chromium/ui/gfx/linux/gbm_defines.h b/chromium/ui/gfx/linux/gbm_defines.h
index 7069dffc3db..8f893785c20 100644
--- a/chromium/ui/gfx/linux/gbm_defines.h
+++ b/chromium/ui/gfx/linux/gbm_defines.h
@@ -19,6 +19,7 @@
#define GBM_BO_USE_CAMERA_WRITE 0
#define GBM_BO_USE_HW_VIDEO_DECODER 0
#define GBM_BO_USE_HW_VIDEO_ENCODER 0
+#define GBM_BO_USE_PROTECTED 0
#endif
#endif // UI_GFX_LINUX_GBM_DEFINES_H_
diff --git a/chromium/ui/gfx/linux/gbm_util.cc b/chromium/ui/gfx/linux/gbm_util.cc
index c516c13fafa..b945ef444ea 100644
--- a/chromium/ui/gfx/linux/gbm_util.cc
+++ b/chromium/ui/gfx/linux/gbm_util.cc
@@ -25,8 +25,14 @@ uint32_t BufferUsageToGbmFlags(gfx::BufferUsage usage) {
case gfx::BufferUsage::SCANOUT_VDA_WRITE:
return GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING |
GBM_BO_USE_HW_VIDEO_DECODER;
+ case gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE:
+ return GBM_BO_USE_SCANOUT | GBM_BO_USE_PROTECTED |
+ GBM_BO_USE_HW_VIDEO_DECODER;
case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
return GBM_BO_USE_LINEAR | GBM_BO_USE_TEXTURING;
+ case gfx::BufferUsage::SCANOUT_VEA_CPU_READ:
+ return GBM_BO_USE_LINEAR | GBM_BO_USE_SCANOUT | GBM_BO_USE_TEXTURING |
+ GBM_BO_USE_HW_VIDEO_ENCODER;
case gfx::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE:
return GBM_BO_USE_LINEAR | GBM_BO_USE_CAMERA_WRITE | GBM_BO_USE_SCANOUT |
GBM_BO_USE_TEXTURING | GBM_BO_USE_HW_VIDEO_ENCODER;
diff --git a/chromium/ui/gfx/linux/gbm_wrapper.cc b/chromium/ui/gfx/linux/gbm_wrapper.cc
index 71f9ffc4128..9beeb30eed9 100644
--- a/chromium/ui/gfx/linux/gbm_wrapper.cc
+++ b/chromium/ui/gfx/linux/gbm_wrapper.cc
@@ -10,6 +10,7 @@
#include "base/logging.h"
#include "base/posix/eintr_wrapper.h"
+#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/linux/drm_util_linux.h"
@@ -222,8 +223,9 @@ class Buffer final : public ui::GbmBuffer {
return nullptr;
SkImageInfo info =
SkImageInfo::MakeN32Premul(size_.width(), size_.height());
- return SkSurface::MakeRasterDirectReleaseProc(info, addr, stride,
- &Buffer::UnmapGbmBo, this);
+ SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps();
+ return SkSurface::MakeRasterDirectReleaseProc(
+ info, addr, stride, &Buffer::UnmapGbmBo, this, &props);
}
private:
diff --git a/chromium/ui/gfx/linux/gpu_memory_buffer_support_x11.cc b/chromium/ui/gfx/linux/gpu_memory_buffer_support_x11.cc
index 38a438a4c17..28e5d27ee24 100644
--- a/chromium/ui/gfx/linux/gpu_memory_buffer_support_x11.cc
+++ b/chromium/ui/gfx/linux/gpu_memory_buffer_support_x11.cc
@@ -22,8 +22,6 @@
#include "ui/gfx/linux/gbm_wrapper.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/dri3.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
namespace ui {
diff --git a/chromium/ui/gfx/linux/native_pixmap_dmabuf.cc b/chromium/ui/gfx/linux/native_pixmap_dmabuf.cc
index f19a959eebf..dd419febf28 100644
--- a/chromium/ui/gfx/linux/native_pixmap_dmabuf.cc
+++ b/chromium/ui/gfx/linux/native_pixmap_dmabuf.cc
@@ -75,7 +75,8 @@ bool NativePixmapDmaBuf::ScheduleOverlayPlane(
const gfx::Rect& display_bounds,
const gfx::RectF& crop_rect,
bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) {
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) {
return false;
}
diff --git a/chromium/ui/gfx/linux/native_pixmap_dmabuf.h b/chromium/ui/gfx/linux/native_pixmap_dmabuf.h
index ca55c9c0724..e4eafe89bd6 100644
--- a/chromium/ui/gfx/linux/native_pixmap_dmabuf.h
+++ b/chromium/ui/gfx/linux/native_pixmap_dmabuf.h
@@ -44,7 +44,8 @@ class GFX_EXPORT NativePixmapDmaBuf : public gfx::NativePixmap {
const gfx::Rect& display_bounds,
const gfx::RectF& crop_rect,
bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) override;
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) override;
gfx::NativePixmapHandle ExportHandle() override;
protected:
diff --git a/chromium/ui/gfx/mac/io_surface.cc b/chromium/ui/gfx/mac/io_surface.cc
index ec83bd814a0..5728c068262 100644
--- a/chromium/ui/gfx/mac/io_surface.cc
+++ b/chromium/ui/gfx/mac/io_surface.cc
@@ -10,6 +10,7 @@
#include <stdint.h>
#include "base/command_line.h"
+#include "base/feature_list.h"
#include "base/logging.h"
#include "base/mac/mac_util.h"
#include "base/mac/mach_logging.h"
@@ -17,12 +18,16 @@
#include "base/stl_util.h"
#include "base/trace_event/trace_event.h"
#include "ui/gfx/buffer_format_util.h"
+#include "ui/gfx/color_space.h"
#include "ui/gfx/icc_profile.h"
namespace gfx {
namespace {
+const base::Feature kIOSurfaceUseNamedSRGBForREC709{
+ "IOSurfaceUseNamedSRGBForREC709", base::FEATURE_ENABLED_BY_DEFAULT};
+
void AddIntegerValue(CFMutableDictionaryRef dictionary,
const CFStringRef key,
int32_t value) {
@@ -133,7 +138,9 @@ bool IOSurfaceSetColorSpace(IOSurfaceRef io_surface,
// Prefer using named spaces.
CFStringRef color_space_name = nullptr;
if (__builtin_available(macos 10.12, *)) {
- if (color_space == ColorSpace::CreateSRGB()) {
+ if (color_space == ColorSpace::CreateSRGB() ||
+ (base::FeatureList::IsEnabled(kIOSurfaceUseNamedSRGBForREC709) &&
+ color_space == ColorSpace::CreateREC709())) {
color_space_name = kCGColorSpaceSRGB;
} else if (color_space == ColorSpace::CreateDisplayP3D65()) {
color_space_name = kCGColorSpaceDisplayP3;
@@ -191,6 +198,7 @@ bool IOSurfaceSetColorSpace(IOSurfaceRef io_surface,
base::ScopedCFTypeRef<CFDataRef> cf_data_icc_profile(CFDataCreate(
nullptr, reinterpret_cast<const UInt8*>(icc_profile_data.data()),
icc_profile_data.size()));
+
IOSurfaceSetValue(io_surface, CFSTR("IOSurfaceColorSpace"),
cf_data_icc_profile);
return true;
diff --git a/chromium/ui/gfx/mac/io_surface.h b/chromium/ui/gfx/mac/io_surface.h
index 72b2fbd8cbe..88c6a5dba21 100644
--- a/chromium/ui/gfx/mac/io_surface.h
+++ b/chromium/ui/gfx/mac/io_surface.h
@@ -62,6 +62,9 @@ using ScopedRefCountedIOSurfaceMachPort =
using ScopedInUseIOSurface =
base::ScopedTypeRef<IOSurfaceRef, internal::ScopedInUseIOSurfaceTraits>;
+// A scoper for holding a reference to an IOSurface.
+using ScopedIOSurface = base::ScopedCFTypeRef<IOSurfaceRef>;
+
// Return true if there exists a value for IOSurfaceColorSpace or
// IOSurfaceICCProfile that will make CoreAnimation render using |color_space|.
GFX_EXPORT bool IOSurfaceCanSetColorSpace(const gfx::ColorSpace& color_space);
diff --git a/chromium/ui/gfx/mask_filter_info.cc b/chromium/ui/gfx/mask_filter_info.cc
new file mode 100644
index 00000000000..06ca28fdf15
--- /dev/null
+++ b/chromium/ui/gfx/mask_filter_info.cc
@@ -0,0 +1,23 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/mask_filter_info.h"
+
+#include <sstream>
+
+#include "ui/gfx/transform.h"
+
+namespace gfx {
+
+bool MaskFilterInfo::Transform(const gfx::Transform& transform) {
+ return rounded_corner_bounds_.IsEmpty()
+ ? false
+ : transform.TransformRRectF(&rounded_corner_bounds_);
+}
+
+std::string MaskFilterInfo::ToString() const {
+ return "MaskFilterInfo{" + rounded_corner_bounds_.ToString() + "}";
+}
+
+} // namespace gfx
diff --git a/chromium/ui/gfx/mask_filter_info.h b/chromium/ui/gfx/mask_filter_info.h
new file mode 100644
index 00000000000..8ce56fc6c22
--- /dev/null
+++ b/chromium/ui/gfx/mask_filter_info.h
@@ -0,0 +1,64 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_MASK_FILTER_INFO_H_
+#define UI_GFX_MASK_FILTER_INFO_H_
+
+#include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/geometry_skia_export.h"
+#include "ui/gfx/rrect_f.h"
+
+namespace gfx {
+
+class Transform;
+
+// This class defines a mask filter to be applied to the given rect.
+class GEOMETRY_SKIA_EXPORT MaskFilterInfo {
+ public:
+ MaskFilterInfo() = default;
+ explicit MaskFilterInfo(const RRectF& rrect)
+ : rounded_corner_bounds_(rrect) {}
+ MaskFilterInfo(const RectF& bounds, const RoundedCornersF& radii)
+ : rounded_corner_bounds_(bounds, radii) {}
+ MaskFilterInfo(const MaskFilterInfo& copy) = default;
+ ~MaskFilterInfo() = default;
+
+ // The bounds the filter will be applied to.
+ RectF bounds() const { return rounded_corner_bounds_.rect(); }
+
+ // Defines the rounded corner bounds to clip.
+ const RRectF& rounded_corner_bounds() const { return rounded_corner_bounds_; }
+
+ // True if this contains a rounded corner mask.
+ bool HasRoundedCorners() const {
+ return rounded_corner_bounds_.GetType() != RRectF::Type::kEmpty &&
+ rounded_corner_bounds_.GetType() != RRectF::Type::kRect;
+ }
+
+ // True if this contains no effective mask information.
+ bool IsEmpty() const { return rounded_corner_bounds_.IsEmpty(); }
+
+ // Transform the mask information. Returns false if the transform
+ // cannot be applied.
+ bool Transform(const gfx::Transform& transform);
+
+ std::string ToString() const;
+
+ private:
+ // The rounded corner bounds. This also defines the bounds that the mask
+ // filter will be applied to.
+ RRectF rounded_corner_bounds_;
+};
+
+inline bool operator==(const MaskFilterInfo& lhs, const MaskFilterInfo& rhs) {
+ return lhs.rounded_corner_bounds() == rhs.rounded_corner_bounds();
+}
+
+inline bool operator!=(const MaskFilterInfo& lhs, const MaskFilterInfo& rhs) {
+ return !(lhs == rhs);
+}
+
+} // namespace gfx
+
+#endif // UI_GFX_MASK_FILTER_INFO_H_
diff --git a/chromium/ui/gfx/mojom/BUILD.gn b/chromium/ui/gfx/mojom/BUILD.gn
index 5faeacec59f..91d290a8af8 100644
--- a/chromium/ui/gfx/mojom/BUILD.gn
+++ b/chromium/ui/gfx/mojom/BUILD.gn
@@ -13,7 +13,10 @@ mojom("mojom") {
"color_space.mojom",
"display_color_spaces.mojom",
"font_render_params.mojom",
+ "gpu_extra_info.mojom",
"gpu_fence_handle.mojom",
+ "hdr_metadata.mojom",
+ "mask_filter_info.mojom",
"overlay_transform.mojom",
"presentation_feedback.mojom",
"rrect_f.mojom",
@@ -29,6 +32,11 @@ mojom("mojom") {
"//ui/gfx/geometry/mojom",
]
+ enabled_features = []
+ if (use_x11 || use_ozone) {
+ enabled_features += [ "enable_x11_params" ]
+ }
+
shared_cpp_typemaps = [
{
types = [
@@ -77,6 +85,20 @@ mojom("mojom") {
{
types = [
{
+ mojom = "gfx.mojom.GpuExtraInfo"
+ cpp = "::gfx::GpuExtraInfo"
+ },
+ {
+ mojom = "gfx.mojom.ANGLEFeature"
+ cpp = "::gfx::ANGLEFeature"
+ },
+ ]
+ traits_headers = [ "gpu_extra_info_mojom_traits.h" ]
+ traits_public_deps = [ ":shared_mojom_traits" ]
+ },
+ {
+ types = [
+ {
mojom = "gfx.mojom.GpuFenceHandle"
cpp = "::gfx::GpuFenceHandle"
move_only = true
@@ -165,6 +187,21 @@ mojom("mojom") {
{
types = [
{
+ mojom = "gfx.mojom.MasteringMetadata"
+ cpp = "::gfx::MasteringMetadata"
+ },
+ {
+ mojom = "gfx.mojom.HDRMetadata"
+ cpp = "::gfx::HDRMetadata"
+ },
+ ]
+ traits_headers = [ "hdr_metadata_mojom_traits.h" ]
+ traits_sources = [ "hdr_metadata_mojom_traits.cc" ]
+ traits_public_deps = [ "//ui/gfx" ]
+ },
+ {
+ types = [
+ {
mojom = "gfx.mojom.Hinting"
cpp = "::gfx::FontRenderParams::Hinting"
},
@@ -206,6 +243,17 @@ mojom("mojom") {
traits_headers = [ "swap_result_mojom_traits.h" ]
traits_public_deps = [ "//ui/gfx" ]
},
+ {
+ types = [
+ {
+ mojom = "gfx.mojom.MaskFilterInfo"
+ cpp = "::gfx::MaskFilterInfo"
+ },
+ ]
+ traits_sources = [ "mask_filter_info_mojom_traits.cc" ]
+ traits_headers = [ "mask_filter_info_mojom_traits.h" ]
+ traits_public_deps = [ "//ui/gfx" ]
+ },
]
cpp_typemaps += shared_cpp_typemaps
@@ -280,6 +328,8 @@ component("shared_mojom_traits") {
sources = [
"buffer_types_mojom_traits.cc",
"buffer_types_mojom_traits.h",
+ "gpu_extra_info_mojom_traits.cc",
+ "gpu_extra_info_mojom_traits.h",
"gpu_fence_handle_mojom_traits.cc",
"gpu_fence_handle_mojom_traits.h",
]
@@ -288,4 +338,8 @@ component("shared_mojom_traits") {
":native_handle_types",
"//ui/gfx",
]
+ frameworks = [
+ "CoreFoundation.framework",
+ "IOSurface.framework",
+ ]
}
diff --git a/chromium/ui/gfx/mojom/buffer_types.mojom b/chromium/ui/gfx/mojom/buffer_types.mojom
index 95ad12939f7..5d38cdba515 100644
--- a/chromium/ui/gfx/mojom/buffer_types.mojom
+++ b/chromium/ui/gfx/mojom/buffer_types.mojom
@@ -33,7 +33,9 @@ enum BufferUsage {
CAMERA_AND_CPU_READ_WRITE,
SCANOUT_CPU_READ_WRITE,
SCANOUT_VDA_WRITE,
+ PROTECTED_SCANOUT_VDA_WRITE,
GPU_READ_CPU_READ_WRITE,
+ SCANOUT_VEA_CPU_READ,
SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE,
};
diff --git a/chromium/ui/gfx/mojom/buffer_types_mojom_traits.cc b/chromium/ui/gfx/mojom/buffer_types_mojom_traits.cc
index 007297ee205..532c4a9edfb 100644
--- a/chromium/ui/gfx/mojom/buffer_types_mojom_traits.cc
+++ b/chromium/ui/gfx/mojom/buffer_types_mojom_traits.cc
@@ -39,14 +39,17 @@ gfx::mojom::GpuMemoryBufferPlatformHandlePtr StructTraits<
#else
break;
#endif
- case gfx::IO_SURFACE_BUFFER:
+ case gfx::IO_SURFACE_BUFFER: {
#if defined(OS_MAC)
+ gfx::ScopedRefCountedIOSurfaceMachPort io_surface_mach_port(
+ IOSurfaceCreateMachPort(handle.io_surface.get()));
return gfx::mojom::GpuMemoryBufferPlatformHandle::NewMachPort(
mojo::PlatformHandle(
- base::mac::RetainMachSendRight(handle.mach_port.get())));
+ base::mac::RetainMachSendRight(io_surface_mach_port.get())));
#else
break;
#endif
+ }
case gfx::DXGI_SHARED_HANDLE:
#if defined(OS_WIN)
DCHECK(handle.dxgi_handle.IsValid());
@@ -121,8 +124,14 @@ bool StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView,
out->type = gfx::IO_SURFACE_BUFFER;
if (!platform_handle->get_mach_port().is_mach_send())
return false;
- out->mach_port.reset(
+ gfx::ScopedRefCountedIOSurfaceMachPort io_surface_mach_port(
platform_handle->get_mach_port().ReleaseMachSendRight());
+ if (io_surface_mach_port) {
+ out->io_surface.reset(
+ IOSurfaceLookupFromMachPort(io_surface_mach_port.get()));
+ } else {
+ out->io_surface.reset();
+ }
return true;
}
#elif defined(OS_WIN)
diff --git a/chromium/ui/gfx/mojom/buffer_types_mojom_traits.h b/chromium/ui/gfx/mojom/buffer_types_mojom_traits.h
index 6d309d03e0e..da8ac0b4ce9 100644
--- a/chromium/ui/gfx/mojom/buffer_types_mojom_traits.h
+++ b/chromium/ui/gfx/mojom/buffer_types_mojom_traits.h
@@ -129,8 +129,12 @@ struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
return gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE;
case gfx::BufferUsage::SCANOUT_VDA_WRITE:
return gfx::mojom::BufferUsage::SCANOUT_VDA_WRITE;
+ case gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE:
+ return gfx::mojom::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE;
case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
return gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE;
+ case gfx::BufferUsage::SCANOUT_VEA_CPU_READ:
+ return gfx::mojom::BufferUsage::SCANOUT_VEA_CPU_READ;
case gfx::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE:
return gfx::mojom::BufferUsage::
SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE;
@@ -159,9 +163,15 @@ struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
case gfx::mojom::BufferUsage::SCANOUT_VDA_WRITE:
*out = gfx::BufferUsage::SCANOUT_VDA_WRITE;
return true;
+ case gfx::mojom::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE:
+ *out = gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE;
+ return true;
case gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE:
*out = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
return true;
+ case gfx::mojom::BufferUsage::SCANOUT_VEA_CPU_READ:
+ *out = gfx::BufferUsage::SCANOUT_VEA_CPU_READ;
+ return true;
case gfx::mojom::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE:
*out = gfx::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE;
return true;
diff --git a/chromium/ui/gfx/mojom/gpu_extra_info.mojom b/chromium/ui/gfx/mojom/gpu_extra_info.mojom
new file mode 100644
index 00000000000..705cc6839fc
--- /dev/null
+++ b/chromium/ui/gfx/mojom/gpu_extra_info.mojom
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ui/gfx/gpu_extra_info.h
+module gfx.mojom;
+
+import "ui/gfx/mojom/buffer_types.mojom";
+
+// gfx::ANGLEFeature
+struct ANGLEFeature {
+ string name;
+ string category;
+ string description;
+ string bug;
+ string status;
+ string condition;
+};
+
+// gfx:GpuExtraInfo
+struct GpuExtraInfo {
+ // List of features queried from ANGLE
+ array<ANGLEFeature> angle_features;
+
+ [EnableIf=enable_x11_params]
+ uint64 system_visual;
+ [EnableIf=enable_x11_params]
+ uint64 rgba_visual;
+ [EnableIf=enable_x11_params]
+ array<gfx.mojom.BufferUsageAndFormat> gpu_memory_buffer_support_x11;
+};
diff --git a/chromium/ui/gfx/mojom/gpu_extra_info_mojom_traits.cc b/chromium/ui/gfx/mojom/gpu_extra_info_mojom_traits.cc
new file mode 100644
index 00000000000..daa461e542e
--- /dev/null
+++ b/chromium/ui/gfx/mojom/gpu_extra_info_mojom_traits.cc
@@ -0,0 +1,36 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/mojom/gpu_extra_info_mojom_traits.h"
+
+#include "build/build_config.h"
+#include "ui/gfx/mojom/buffer_types_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<gfx::mojom::ANGLEFeatureDataView, gfx::ANGLEFeature>::Read(
+ gfx::mojom::ANGLEFeatureDataView data,
+ gfx::ANGLEFeature* out) {
+ return data.ReadName(&out->name) && data.ReadCategory(&out->category) &&
+ data.ReadDescription(&out->description) && data.ReadBug(&out->bug) &&
+ data.ReadStatus(&out->status) && data.ReadCondition(&out->condition);
+}
+
+// static
+bool StructTraits<gfx::mojom::GpuExtraInfoDataView, gfx::GpuExtraInfo>::Read(
+ gfx::mojom::GpuExtraInfoDataView data,
+ gfx::GpuExtraInfo* out) {
+ if (!data.ReadAngleFeatures(&out->angle_features))
+ return false;
+#if defined(USE_OZONE) || defined(USE_X11)
+ out->system_visual = data.system_visual();
+ out->rgba_visual = data.rgba_visual();
+ if (!data.ReadGpuMemoryBufferSupportX11(&out->gpu_memory_buffer_support_x11))
+ return false;
+#endif
+ return true;
+}
+
+} // namespace mojo
diff --git a/chromium/ui/gfx/mojom/gpu_extra_info_mojom_traits.h b/chromium/ui/gfx/mojom/gpu_extra_info_mojom_traits.h
new file mode 100644
index 00000000000..0f3a94c1262
--- /dev/null
+++ b/chromium/ui/gfx/mojom/gpu_extra_info_mojom_traits.h
@@ -0,0 +1,75 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_MOJOM_GPU_EXTRA_INFO_MOJOM_TRAITS_H_
+#define UI_GFX_MOJOM_GPU_EXTRA_INFO_MOJOM_TRAITS_H_
+
+#include "base/component_export.h"
+#include "ui/gfx/gpu_extra_info.h"
+#include "ui/gfx/mojom/buffer_types_mojom_traits.h"
+#include "ui/gfx/mojom/gpu_extra_info.mojom-shared.h"
+
+namespace mojo {
+
+template <>
+struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
+ StructTraits<gfx::mojom::ANGLEFeatureDataView, gfx::ANGLEFeature> {
+ static bool Read(gfx::mojom::ANGLEFeatureDataView data,
+ gfx::ANGLEFeature* out);
+
+ static const std::string& name(const gfx::ANGLEFeature& input) {
+ return input.name;
+ }
+
+ static const std::string& category(const gfx::ANGLEFeature& input) {
+ return input.category;
+ }
+
+ static const std::string& description(const gfx::ANGLEFeature& input) {
+ return input.description;
+ }
+
+ static const std::string& bug(const gfx::ANGLEFeature& input) {
+ return input.bug;
+ }
+
+ static const std::string& status(const gfx::ANGLEFeature& input) {
+ return input.status;
+ }
+
+ static const std::string& condition(const gfx::ANGLEFeature& input) {
+ return input.condition;
+ }
+};
+
+template <>
+struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
+ StructTraits<gfx::mojom::GpuExtraInfoDataView, gfx::GpuExtraInfo> {
+ static bool Read(gfx::mojom::GpuExtraInfoDataView data,
+ gfx::GpuExtraInfo* out);
+
+ static const std::vector<gfx::ANGLEFeature>& angle_features(
+ const gfx::GpuExtraInfo& input) {
+ return input.angle_features;
+ }
+
+#if defined(USE_OZONE) || defined(USE_X11)
+ static uint64_t system_visual(const gfx::GpuExtraInfo& input) {
+ return input.system_visual;
+ }
+
+ static uint64_t rgba_visual(const gfx::GpuExtraInfo& input) {
+ return input.rgba_visual;
+ }
+
+ static const std::vector<gfx::BufferUsageAndFormat>&
+ gpu_memory_buffer_support_x11(const gfx::GpuExtraInfo& input) {
+ return input.gpu_memory_buffer_support_x11;
+ }
+#endif
+};
+
+} // namespace mojo
+
+#endif // UI_GFX_MOJOM_GPU_EXTRA_INFO_MOJOM_TRAITS_H_
diff --git a/chromium/ui/gfx/mojom/gpu_fence_handle.mojom b/chromium/ui/gfx/mojom/gpu_fence_handle.mojom
index 9a7906c3ee3..18c88148441 100644
--- a/chromium/ui/gfx/mojom/gpu_fence_handle.mojom
+++ b/chromium/ui/gfx/mojom/gpu_fence_handle.mojom
@@ -6,5 +6,9 @@ module gfx.mojom;
// See ui/gfx/ipc/gpu_fence_handle.h
struct GpuFenceHandle {
- handle<platform>? native_fd;
+ [EnableIf=is_posix]
+ handle<platform> native_fd;
+
+ [EnableIf=is_win]
+ handle<platform> native_handle;
};
diff --git a/chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.cc b/chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.cc
index 99538f9664a..02289ca55f9 100644
--- a/chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.cc
+++ b/chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.cc
@@ -9,23 +9,30 @@
namespace mojo {
+#if defined(OS_POSIX)
mojo::PlatformHandle
StructTraits<gfx::mojom::GpuFenceHandleDataView,
gfx::GpuFenceHandle>::native_fd(gfx::GpuFenceHandle& handle) {
-#if defined(OS_POSIX)
return mojo::PlatformHandle(std::move(handle.owned_fd));
-#else
- return mojo::PlatformHandle();
-#endif
}
+#elif defined(OS_WIN)
+mojo::PlatformHandle
+StructTraits<gfx::mojom::GpuFenceHandleDataView,
+ gfx::GpuFenceHandle>::native_handle(gfx::GpuFenceHandle& handle) {
+ return mojo::PlatformHandle(std::move(handle.owned_handle));
+}
+#endif
bool StructTraits<gfx::mojom::GpuFenceHandleDataView, gfx::GpuFenceHandle>::
Read(gfx::mojom::GpuFenceHandleDataView data, gfx::GpuFenceHandle* out) {
#if defined(OS_POSIX)
- out->owned_fd = data.TakeNativeFd().TakeFD();
- return true;
+ out->owned_fd = data.TakeNativeFd().TakeFD();
+ return true;
+#elif defined(OS_WIN)
+ out->owned_handle = data.TakeNativeHandle().TakeHandle();
+ return true;
#else
- return false;
+ return false;
#endif
}
@@ -33,6 +40,8 @@ void StructTraits<gfx::mojom::GpuFenceHandleDataView,
gfx::GpuFenceHandle>::SetToNull(gfx::GpuFenceHandle* handle) {
#if defined(OS_POSIX)
handle->owned_fd.reset();
+#elif defined(OS_WIN)
+ handle->owned_handle.Close();
#endif
}
diff --git a/chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.h b/chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.h
index a3585b17551..74c04d42148 100644
--- a/chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.h
+++ b/chromium/ui/gfx/mojom/gpu_fence_handle_mojom_traits.h
@@ -6,6 +6,7 @@
#define UI_GFX_MOJOM_GPU_FENCE_HANDLE_MOJOM_TRAITS_H_
#include "base/component_export.h"
+#include "build/build_config.h"
#include "ui/gfx/gpu_fence_handle.h"
#include "ui/gfx/mojom/gpu_fence_handle.mojom-shared.h"
@@ -14,7 +15,11 @@ namespace mojo {
template <>
struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
StructTraits<gfx::mojom::GpuFenceHandleDataView, gfx::GpuFenceHandle> {
+#if defined(OS_POSIX)
static mojo::PlatformHandle native_fd(gfx::GpuFenceHandle& handle);
+#elif defined(OS_WIN)
+ static mojo::PlatformHandle native_handle(gfx::GpuFenceHandle& handle);
+#endif
static bool Read(gfx::mojom::GpuFenceHandleDataView data,
gfx::GpuFenceHandle* handle);
static void SetToNull(gfx::GpuFenceHandle* handle);
diff --git a/chromium/ui/gl/mojom/hdr_metadata.mojom b/chromium/ui/gfx/mojom/hdr_metadata.mojom
index a889aba54bf..24dd81c7b32 100644
--- a/chromium/ui/gl/mojom/hdr_metadata.mojom
+++ b/chromium/ui/gfx/mojom/hdr_metadata.mojom
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-module gl.mojom;
+module gfx.mojom;
import "ui/gfx/geometry/mojom/geometry.mojom";
-// This defines a mojo transport format for gl::HDRMetadata.
+// This defines a mojo transport format for gfx::HDRMetadata.
// See ui/gl/hdr_metadata.h for description.
struct MasteringMetadata {
gfx.mojom.PointF primary_r;
@@ -21,4 +21,4 @@ struct HDRMetadata {
MasteringMetadata mastering_metadata;
uint32 max_content_light_level;
uint32 max_frame_average_light_level;
- }; \ No newline at end of file
+ };
diff --git a/chromium/ui/gl/mojom/hdr_metadata_mojom_traits.cc b/chromium/ui/gfx/mojom/hdr_metadata_mojom_traits.cc
index 4a1358a75ea..eba1e960d2e 100644
--- a/chromium/ui/gl/mojom/hdr_metadata_mojom_traits.cc
+++ b/chromium/ui/gfx/mojom/hdr_metadata_mojom_traits.cc
@@ -2,13 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/gl/mojom/hdr_metadata_mojom_traits.h"
+#include "ui/gfx/mojom/hdr_metadata_mojom_traits.h"
namespace mojo {
-bool StructTraits<gl::mojom::MasteringMetadataDataView, gl::MasteringMetadata>::
- Read(gl::mojom::MasteringMetadataDataView data,
- gl::MasteringMetadata* output) {
+bool StructTraits<
+ gfx::mojom::MasteringMetadataDataView,
+ gfx::MasteringMetadata>::Read(gfx::mojom::MasteringMetadataDataView data,
+ gfx::MasteringMetadata* output) {
output->luminance_max = data.luminance_max();
output->luminance_min = data.luminance_min();
if (!data.ReadPrimaryR(&output->primary_r))
@@ -22,9 +23,9 @@ bool StructTraits<gl::mojom::MasteringMetadataDataView, gl::MasteringMetadata>::
return true;
}
-bool StructTraits<gl::mojom::HDRMetadataDataView, gl::HDRMetadata>::Read(
- gl::mojom::HDRMetadataDataView data,
- gl::HDRMetadata* output) {
+bool StructTraits<gfx::mojom::HDRMetadataDataView, gfx::HDRMetadata>::Read(
+ gfx::mojom::HDRMetadataDataView data,
+ gfx::HDRMetadata* output) {
output->max_content_light_level = data.max_content_light_level();
output->max_frame_average_light_level = data.max_frame_average_light_level();
if (!data.ReadMasteringMetadata(&output->mastering_metadata))
diff --git a/chromium/ui/gfx/mojom/hdr_metadata_mojom_traits.h b/chromium/ui/gfx/mojom/hdr_metadata_mojom_traits.h
new file mode 100644
index 00000000000..d8c9037923e
--- /dev/null
+++ b/chromium/ui/gfx/mojom/hdr_metadata_mojom_traits.h
@@ -0,0 +1,58 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_MOJOM_HDR_METADATA_MOJOM_TRAITS_H_
+#define UI_GFX_MOJOM_HDR_METADATA_MOJOM_TRAITS_H_
+
+#include "ui/gfx/hdr_metadata.h"
+#include "ui/gfx/mojom/hdr_metadata.mojom.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<gfx::mojom::MasteringMetadataDataView,
+ gfx::MasteringMetadata> {
+ static const gfx::PointF& primary_r(const gfx::MasteringMetadata& input) {
+ return input.primary_r;
+ }
+ static const gfx::PointF& primary_g(const gfx::MasteringMetadata& input) {
+ return input.primary_g;
+ }
+ static const gfx::PointF& primary_b(const gfx::MasteringMetadata& input) {
+ return input.primary_b;
+ }
+ static const gfx::PointF& white_point(const gfx::MasteringMetadata& input) {
+ return input.white_point;
+ }
+ static float luminance_max(const gfx::MasteringMetadata& input) {
+ return input.luminance_max;
+ }
+ static float luminance_min(const gfx::MasteringMetadata& input) {
+ return input.luminance_min;
+ }
+
+ static bool Read(gfx::mojom::MasteringMetadataDataView data,
+ gfx::MasteringMetadata* output);
+};
+
+template <>
+struct StructTraits<gfx::mojom::HDRMetadataDataView, gfx::HDRMetadata> {
+ static unsigned max_content_light_level(const gfx::HDRMetadata& input) {
+ return input.max_content_light_level;
+ }
+ static unsigned max_frame_average_light_level(const gfx::HDRMetadata& input) {
+ return input.max_frame_average_light_level;
+ }
+ static const gfx::MasteringMetadata& mastering_metadata(
+ const gfx::HDRMetadata& input) {
+ return input.mastering_metadata;
+ }
+
+ static bool Read(gfx::mojom::HDRMetadataDataView data,
+ gfx::HDRMetadata* output);
+};
+
+} // namespace mojo
+
+#endif // UI_GFX_MOJOM_HDR_METADATA_MOJOM_TRAITS_H_
diff --git a/chromium/ui/gfx/mojom/mask_filter_info.mojom b/chromium/ui/gfx/mojom/mask_filter_info.mojom
new file mode 100644
index 00000000000..7e3b9ea0d25
--- /dev/null
+++ b/chromium/ui/gfx/mojom/mask_filter_info.mojom
@@ -0,0 +1,12 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module gfx.mojom;
+
+import "ui/gfx/mojom/rrect_f.mojom";
+
+// See ui/gfx/mask_filter_info.h.
+struct MaskFilterInfo {
+ gfx.mojom.RRectF rounded_corner_bounds;
+};
diff --git a/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc b/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc
new file mode 100644
index 00000000000..683762ae549
--- /dev/null
+++ b/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.cc
@@ -0,0 +1,19 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/mojom/mask_filter_info_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<gfx::mojom::MaskFilterInfoDataView, gfx::MaskFilterInfo>::
+ Read(gfx::mojom::MaskFilterInfoDataView data, gfx::MaskFilterInfo* out) {
+ gfx::RRectF bounds;
+ if (!data.ReadRoundedCornerBounds(&bounds))
+ return false;
+ *out = gfx::MaskFilterInfo(bounds);
+ return true;
+}
+
+} // namespace mojo
diff --git a/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h b/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h
new file mode 100644
index 00000000000..0cc30b34570
--- /dev/null
+++ b/chromium/ui/gfx/mojom/mask_filter_info_mojom_traits.h
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_MOJOM_MASK_FILTER_INFO_MOJOM_TRAITS_H_
+#define UI_GFX_MOJOM_MASK_FILTER_INFO_MOJOM_TRAITS_H_
+
+#include "ui/gfx/mask_filter_info.h"
+#include "ui/gfx/mojom/mask_filter_info.mojom-shared.h"
+#include "ui/gfx/mojom/rrect_f_mojom_traits.h"
+
+namespace mojo {
+template <>
+struct StructTraits<gfx::mojom::MaskFilterInfoDataView, gfx::MaskFilterInfo> {
+ static const gfx::RRectF& rounded_corner_bounds(
+ const gfx::MaskFilterInfo& info) {
+ return info.rounded_corner_bounds();
+ }
+
+ static bool Read(gfx::mojom::MaskFilterInfoDataView data,
+ gfx::MaskFilterInfo* out);
+};
+
+} // namespace mojo
+#endif // UI_GFX_MOJOM_LINEAR_GRADIENT_MOJOM_TRAITS_H_
diff --git a/chromium/ui/gfx/native_pixmap.h b/chromium/ui/gfx/native_pixmap.h
index 8fd75d915e6..8a0dc0f939a 100644
--- a/chromium/ui/gfx/native_pixmap.h
+++ b/chromium/ui/gfx/native_pixmap.h
@@ -59,8 +59,11 @@ class NativePixmap : public base::RefCountedThreadSafe<NativePixmap> {
// range of [0,1].
// |enable_blend| specifies if the plane should be alpha blended, with premul
// apha, when scanned out.
- // |gpu_fence| specifies a gpu fence to wait on before the pixmap is ready
- // to be displayed.
+ // |acquire_fences| specifies gpu fences to wait on before the pixmap is ready
+ // to be displayed. These fence are fired when the gpu has finished writing to
+ // the pixmap.
+ // |release_fences| specifies gpu fences that are signalled when the pixmap
+ // has been displayed and is ready for reuse.
virtual bool ScheduleOverlayPlane(
gfx::AcceleratedWidget widget,
int plane_z_order,
@@ -68,7 +71,8 @@ class NativePixmap : public base::RefCountedThreadSafe<NativePixmap> {
const gfx::Rect& display_bounds,
const gfx::RectF& crop_rect,
bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) = 0;
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) = 0;
// Export the buffer for sharing across processes.
// Any file descriptors in the exported handle are owned by the caller.
diff --git a/chromium/ui/gfx/range/OWNERS b/chromium/ui/gfx/range/OWNERS
index c93ccf46e0a..14fce2ae686 100644
--- a/chromium/ui/gfx/range/OWNERS
+++ b/chromium/ui/gfx/range/OWNERS
@@ -1,3 +1 @@
rsesek@chromium.org
-
-# COMPONENT: UI>GFX
diff --git a/chromium/ui/gfx/render_text.cc b/chromium/ui/gfx/render_text.cc
index af1d3fa49ca..bae9421235d 100644
--- a/chromium/ui/gfx/render_text.cc
+++ b/chromium/ui/gfx/render_text.cc
@@ -1483,7 +1483,7 @@ void RenderText::EnsureLayoutTextUpdated() const {
// Iterates through graphemes from |text_| and rewrite its codepoints to
// |layout_text_|.
- base::i18n::UTF16CharIterator text_iter(&text_);
+ base::i18n::UTF16CharIterator text_iter(text_);
internal::StyleIterator styles = GetTextStyleIterator();
bool text_truncated = false;
while (!text_iter.end() && !text_truncated) {
@@ -1968,7 +1968,8 @@ void RenderText::MergeIntersectingRects(std::vector<Rect>& rects) {
size_t merge_candidate = 0;
for (size_t i = 1; i < rects.size(); i++) {
- if (rects[i].Intersects(rects[merge_candidate])) {
+ if (rects[i].Intersects(rects[merge_candidate]) ||
+ rects[i].SharesEdgeWith(rects[merge_candidate])) {
DCHECK_EQ(rects[i].y(), rects[merge_candidate].y());
DCHECK_EQ(rects[i].height(), rects[merge_candidate].height());
rects[merge_candidate].Union(rects[i]);
@@ -2143,23 +2144,51 @@ base::string16 RenderText::ElideEmail(const base::string16& email,
// spec allows for @ symbols in the username under some special requirements,
// but not in the domain part, so splitting at the last @ symbol is safe.
const size_t split_index = email.find_last_of('@');
- DCHECK_NE(split_index, base::string16::npos);
+ if (split_index == base::string16::npos)
+ return Elide(email, 0, available_width, ELIDE_TAIL);
+
base::string16 username = email.substr(0, split_index);
base::string16 domain = email.substr(split_index + 1);
- DCHECK(!username.empty());
- DCHECK(!domain.empty());
+
+ // TODO(http://crbug.com/1085014): Fix eliding of text with styles.
+ DCHECK(IsHomogeneous())
+ << "ElideEmail(...) doesn't work with non homogeneous styles.";
+ auto render_text = CreateInstanceOfSameStyle(base::string16());
+ auto get_string_width = [&](const base::string16& text) {
+ render_text->SetText(text);
+ return render_text->GetStringSizeF().width();
+ };
// Subtract the @ symbol from the available width as it is mandatory.
const base::string16 kAtSignUTF16 = base::ASCIIToUTF16("@");
- available_width -= GetStringWidthF(kAtSignUTF16, font_list());
+ float at_width = get_string_width(kAtSignUTF16);
+ if (available_width < at_width)
+ return Elide(kEllipsisUTF16, 0, available_width, ELIDE_TAIL);
+ const float remaining_width = available_width - at_width;
+
+ // Handle corner cases where one of username or domain is empty.
+ if (username.empty() && domain.empty()) {
+ return Elide(email, 0, available_width, ELIDE_TAIL);
+ } else if (username.empty()) {
+ domain = Elide(domain, 0, remaining_width, ELIDE_MIDDLE);
+ if (domain.empty() || domain == kEllipsisUTF16)
+ return Elide(kEllipsisUTF16, 0, available_width, ELIDE_TAIL);
+ return kAtSignUTF16 + domain;
+ } else if (domain.empty()) {
+ username = Elide(username, 0, remaining_width, ELIDE_TAIL);
+ if (username.empty() || username == kEllipsisUTF16)
+ return Elide(kEllipsisUTF16, 0, available_width, ELIDE_TAIL);
+ return username + kAtSignUTF16;
+ }
// Check whether eliding the domain is necessary: if eliding the username
// is sufficient, the domain will not be elided.
- const float full_username_width = GetStringWidthF(username, font_list());
- const float available_domain_width = available_width -
+ const float full_username_width = get_string_width(username);
+ const float available_domain_width =
+ remaining_width -
std::min(full_username_width,
- GetStringWidthF(username.substr(0, 1) + kEllipsisUTF16, font_list()));
- if (GetStringWidthF(domain, font_list()) > available_domain_width) {
+ get_string_width(username.substr(0, 1) + kEllipsisUTF16));
+ if (get_string_width(domain) > available_domain_width) {
// Elide the domain so that it only takes half of the available width.
// Should the username not need all the width available in its half, the
// domain will occupy the leftover width.
@@ -2168,20 +2197,22 @@ base::string16 RenderText::ElideEmail(const base::string16& email,
// |desired_domain_width| must be <= |available_domain_width| at all cost.
const float desired_domain_width =
std::min<float>(available_domain_width,
- std::max<float>(available_width - full_username_width,
- available_width / 2));
+ std::max<float>(remaining_width - full_username_width,
+ remaining_width / 2));
domain = Elide(domain, 0, desired_domain_width, ELIDE_MIDDLE);
// Failing to elide the domain such that at least one character remains
// (other than the ellipsis itself) remains: return a single ellipsis.
- if (domain.length() <= 1U)
- return base::string16(kEllipsisUTF16);
+ if (domain.empty() || domain == kEllipsisUTF16)
+ return Elide(kEllipsisUTF16, 0, available_width, ELIDE_TAIL);
}
// Fit the username in the remaining width (at this point the elided username
// is guaranteed to fit with at least one character remaining given all the
// precautions taken earlier).
- available_width -= GetStringWidthF(domain, font_list());
- username = Elide(username, 0, available_width, ELIDE_TAIL);
+ const float domain_width = get_string_width(domain);
+ const float available_username_width = remaining_width - domain_width;
+ username = Elide(username, 0, available_username_width, ELIDE_TAIL);
+
return username + kAtSignUTF16 + domain;
}
diff --git a/chromium/ui/gfx/render_text.h b/chromium/ui/gfx/render_text.h
index be9c3457df7..29c589ee9fe 100644
--- a/chromium/ui/gfx/render_text.h
+++ b/chromium/ui/gfx/render_text.h
@@ -569,8 +569,8 @@ class GFX_EXPORT RenderText {
// guaranteed not to be smaller. These bounds could be visually discontinuous
// if the substring is split by a LTR/RTL level change. These bounds are in
// local coordinates, but may be outside the visible region if the text is
- // longer than the textfield. Subsequent text, cursor, or bounds changes may
- // invalidate returned values.
+ // larger than the available space. Subsequent text, cursor, or bounds changes
+ // may invalidate returned values.
virtual std::vector<Rect> GetSubstringBounds(const Range& range) = 0;
// Gets the horizontal span (relative to the left of the text, not the view)
diff --git a/chromium/ui/gfx/render_text_api_fuzzer.cc b/chromium/ui/gfx/render_text_api_fuzzer.cc
index fc642e160bf..821cd5c2a12 100644
--- a/chromium/ui/gfx/render_text_api_fuzzer.cc
+++ b/chromium/ui/gfx/render_text_api_fuzzer.cc
@@ -17,6 +17,10 @@
#include "ui/gfx/canvas.h"
#include "ui/gfx/render_text.h"
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+#include "base/test/test_discardable_memory_allocator.h"
+#endif
+
namespace {
#if defined(OS_WIN)
@@ -33,11 +37,19 @@ struct Environment {
TestTimeouts::Initialize(),
base::test::TaskEnvironment::MainThreadType::UI)) {
logging::SetMinLogLevel(logging::LOG_FATAL);
-
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+ // Some platforms require discardable memory to use bitmap fonts.
+ base::DiscardableMemoryAllocator::SetInstance(
+ &discardable_memory_allocator);
+#endif
CHECK(base::i18n::InitializeICU());
gfx::FontList::SetDefaultFontDescription(kFontDescription);
}
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+ base::TestDiscardableMemoryAllocator discardable_memory_allocator;
+#endif
+
base::AtExitManager at_exit_manager;
base::test::TaskEnvironment task_environment;
};
@@ -73,7 +85,10 @@ enum class RenderTextAPI {
kIsGraphemeBoundary,
kIndexOfAdjacentGrapheme,
kSetObscuredGlyphSpacing,
- kMaxValue = kSetObscuredGlyphSpacing
+ kSetDisplayRect,
+ kGetSubstringBounds,
+ kGetCursorSpan,
+ kMaxValue = kGetCursorSpan
};
gfx::DirectionalityMode ConsumeDirectionalityMode(FuzzedDataProvider* fdp) {
@@ -333,6 +348,21 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
render_text->SetObscuredGlyphSpacing(
fdp.ConsumeIntegralInRange<size_t>(0, 10));
break;
+ case RenderTextAPI::kSetDisplayRect:
+ render_text->SetDisplayRect(
+ gfx::Rect(fdp.ConsumeIntegralInRange<int>(-30, 30),
+ fdp.ConsumeIntegralInRange<int>(-30, 30),
+ fdp.ConsumeIntegralInRange<int>(0, 200),
+ fdp.ConsumeIntegralInRange<int>(0, 30)));
+ break;
+ case RenderTextAPI::kGetSubstringBounds:
+ render_text->GetSubstringBounds(
+ ConsumeRange(&fdp, render_text->text().length()));
+ break;
+ case RenderTextAPI::kGetCursorSpan:
+ render_text->GetCursorSpan(
+ ConsumeRange(&fdp, render_text->text().length()));
+ break;
}
}
diff --git a/chromium/ui/gfx/render_text_harfbuzz.cc b/chromium/ui/gfx/render_text_harfbuzz.cc
index 02c97762835..2f92818f7cb 100644
--- a/chromium/ui/gfx/render_text_harfbuzz.cc
+++ b/chromium/ui/gfx/render_text_harfbuzz.cc
@@ -191,8 +191,7 @@ GraphemeProperties RetrieveGraphemeProperties(const base::StringPiece16& text,
bool retrieve_block) {
GraphemeProperties properties;
bool first_char = true;
- base::i18n::UTF16CharIterator iter(text.data(), text.length());
- while (!iter.end()) {
+ for (base::i18n::UTF16CharIterator iter(text); !iter.end(); iter.Advance()) {
const UChar32 codepoint = iter.get();
if (first_char) {
@@ -209,8 +208,6 @@ GraphemeProperties RetrieveGraphemeProperties(const base::StringPiece16& text,
properties.has_pictographic = true;
if (IsEmojiRelatedCodepoint(codepoint))
properties.has_emoji = true;
-
- iter.Advance();
}
return properties;
@@ -311,7 +308,8 @@ size_t ScriptInterval(const base::string16& text,
UScriptCode scripts[kMaxScripts] = { USCRIPT_INVALID_CODE };
- base::i18n::UTF16CharIterator char_iterator(text.c_str() + start, length);
+ base::i18n::UTF16CharIterator char_iterator(
+ base::StringPiece16(text.c_str() + start, length));
size_t scripts_size = GetScriptExtensions(char_iterator.get(), scripts);
*script = scripts[0];
@@ -1421,11 +1419,11 @@ SizeF RenderTextHarfBuzz::GetLineSizeF(const SelectionModel& caret) {
std::vector<Rect> RenderTextHarfBuzz::GetSubstringBounds(const Range& range) {
EnsureLayout();
DCHECK(!update_display_run_list_);
- DCHECK(Range(0, text().length()).Contains(range));
+ DCHECK(range.IsBoundedBy(Range(0, text().length())));
const Range grapheme_range = ExpandRangeToGraphemeBoundary(range);
const Range display_range(TextIndexToDisplayIndex(grapheme_range.start()),
TextIndexToDisplayIndex(grapheme_range.end()));
- DCHECK(Range(0, GetDisplayText().length()).Contains(display_range));
+ DCHECK(IsValidDisplayRange(display_range));
std::vector<Rect> rects;
if (display_range.is_empty())
@@ -1499,6 +1497,7 @@ RangeF RenderTextHarfBuzz::GetCursorSpan(const Range& text_range) {
Range display_range(TextIndexToDisplayIndex(valid_range.start()),
TextIndexToDisplayIndex(next_grapheme_start));
+ DCHECK(IsValidDisplayRange(display_range));
// Although highly likely, there's no guarantee that a single text run is used
// for the entire cursor span. For example, Unicode Variation Selectors are
@@ -1954,8 +1953,8 @@ void RenderTextHarfBuzz::ItemizeTextToRuns(
for (const auto& iter : *out_commonized_run_map) {
const internal::TextRunHarfBuzz::FontParams& font_params = iter.first;
for (const auto* run : iter.second) {
- base::i18n::UTF16CharIterator text_iter(
- text.c_str() + run->range.start(), run->range.length());
+ base::i18n::UTF16CharIterator text_iter(base::StringPiece16(
+ text.c_str() + run->range.start(), run->range.length()));
const UChar32 first_char = text_iter.get();
const UBlockCode first_block = ublock_getCode(first_char);
const char* script_name = uscript_getShortName(font_params.script);
@@ -2238,6 +2237,28 @@ const internal::TextRunList* RenderTextHarfBuzz::GetRunList() const {
return const_cast<RenderTextHarfBuzz*>(this)->GetRunList();
}
+bool RenderTextHarfBuzz::IsValidDisplayRange(Range display_range) {
+ // The |display_text_| is an elided version of |layout_text_|. Removing
+ // codepoints from the text may break the conversion for codepoint offsets
+ // between text to display_text offset. For elding behaviors that truncate
+ // codepoint at the end, the conversion will work just fine. But for eliding
+ // behavior that truncate at the beginning of middle of the text, the offsets
+ // are completely wrong and should not be used.
+ // TODO(http://crbug.com/1085014): Fix eliding for the broken cases.
+ switch (elide_behavior()) {
+ case NO_ELIDE:
+ case FADE_TAIL:
+ return display_range.IsBoundedBy(Range(0, GetDisplayText().length()));
+ case TRUNCATE:
+ case ELIDE_TAIL:
+ return display_range.IsBoundedBy(Range(0, GetLayoutText().length()));
+ case ELIDE_HEAD:
+ case ELIDE_MIDDLE:
+ case ELIDE_EMAIL:
+ return !text_elided();
+ }
+}
+
bool RenderTextHarfBuzz::GetDecoratedTextForRange(
const Range& range,
DecoratedText* decorated_text) {
diff --git a/chromium/ui/gfx/render_text_harfbuzz.h b/chromium/ui/gfx/render_text_harfbuzz.h
index b0676fa76f1..f134c9fa655 100644
--- a/chromium/ui/gfx/render_text_harfbuzz.h
+++ b/chromium/ui/gfx/render_text_harfbuzz.h
@@ -286,6 +286,10 @@ class GFX_EXPORT RenderTextHarfBuzz : public RenderText {
// Makes sure that text runs for layout text are shaped.
void EnsureLayoutRunList();
+ // Returns whether the display range is still a valid range after the eliding
+ // pass.
+ bool IsValidDisplayRange(Range display_range);
+
// RenderText:
internal::TextRunList* GetRunList() override;
const internal::TextRunList* GetRunList() const override;
diff --git a/chromium/ui/gfx/render_text_unittest.cc b/chromium/ui/gfx/render_text_unittest.cc
index 9801a0830b7..d5e8883811c 100644
--- a/chromium/ui/gfx/render_text_unittest.cc
+++ b/chromium/ui/gfx/render_text_unittest.cc
@@ -21,7 +21,6 @@
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "build/build_config.h"
#include "cc/paint/paint_record.h"
@@ -1492,8 +1491,8 @@ TEST_P(RenderTextTestWithTextIndexConversionCase, TextIndexConversion) {
U16_SET_CP_START(text.c_str(), 0, reveal_index);
// Validate that codepoints still match.
- base::i18n::UTF16CharIterator iter(&render_text->text());
- while (!iter.end()) {
+ for (base::i18n::UTF16CharIterator iter(render_text->text()); !iter.end();
+ iter.Advance()) {
size_t text_index = iter.array_pos();
size_t display_index = test_api()->TextIndexToDisplayIndex(text_index);
EXPECT_EQ(text_index, test_api()->DisplayIndexToTextIndex(display_index));
@@ -1503,8 +1502,6 @@ TEST_P(RenderTextTestWithTextIndexConversionCase, TextIndexConversion) {
} else {
EXPECT_EQ(display_text[display_index], text[text_index]);
}
-
- iter.Advance();
}
}
@@ -1894,19 +1891,26 @@ INSTANTIATE_TEST_SUITE_P(ItemizeTextToRunsEmoji,
::testing::ValuesIn(kEmojiRunListCases),
RenderTextTestWithRunListCase::ParamInfoToString);
+struct ElideTextTestOptions {
+ const ElideBehavior elide_behavior;
+};
+
struct ElideTextCase {
const char* test_name;
const wchar_t* text;
const wchar_t* display_text;
+ int available_width_as_glyph_count = -1;
};
+using ElideTextCaseParam = std::tuple<ElideTextTestOptions, ElideTextCase>;
+
class RenderTextTestWithElideTextCase
: public RenderTextTest,
- public ::testing::WithParamInterface<ElideTextCase> {
+ public ::testing::WithParamInterface<ElideTextCaseParam> {
public:
static std::string ParamInfoToString(
- ::testing::TestParamInfo<ElideTextCase> param_info) {
- return param_info.param.test_name;
+ ::testing::TestParamInfo<ElideTextCaseParam> param_info) {
+ return std::get<1>(param_info.param).test_name;
}
};
@@ -1915,7 +1919,8 @@ TEST_P(RenderTextTestWithElideTextCase, ElideText) {
constexpr int kGlyphWidth = 10;
SetGlyphWidth(kGlyphWidth);
- ElideTextCase param = GetParam();
+ const ElideTextTestOptions options = std::get<0>(GetParam());
+ const ElideTextCase param = std::get<1>(GetParam());
const base::string16 text = WideToUTF16(param.text);
const base::string16 display_text = WideToUTF16(param.display_text);
@@ -1926,10 +1931,20 @@ TEST_P(RenderTextTestWithElideTextCase, ElideText) {
// Set the text and the eliding behavior.
render_text->SetText(text);
- render_text->SetDisplayRect(
- Rect(0, 0, expected_width + kGlyphWidth / 2, 100));
- render_text->SetElideBehavior(ELIDE_TAIL);
+ render_text->SetElideBehavior(options.elide_behavior);
render_text->SetWhitespaceElision(false);
+
+ // Set the display width to trigger the eliding.
+ if (param.available_width_as_glyph_count >= 0) {
+ render_text->SetDisplayRect(Rect(
+ 0, 0,
+ param.available_width_as_glyph_count * kGlyphWidth + kGlyphWidth / 2,
+ 100));
+ } else {
+ render_text->SetDisplayRect(
+ Rect(0, 0, expected_width + kGlyphWidth / 2, 100));
+ }
+
const int elided_width = render_text->GetContentWidth();
EXPECT_EQ(text, render_text->text());
@@ -1937,6 +1952,50 @@ TEST_P(RenderTextTestWithElideTextCase, ElideText) {
EXPECT_EQ(elided_width, expected_width);
}
+const ElideTextCase kElideHeadTextCases[] = {
+ {"empty", L"", L""},
+ {"letter_m_tail0", L"M", L""},
+ {"letter_m_tail1", L"M", L"M"},
+ {"no_eliding", L"012ab", L"012ab"},
+ {"ltr_3", L"abc", L"abc"},
+ {"ltr_2", L"abc", L"\u2026c"},
+ {"ltr_1", L"abc", L"\u2026"},
+ {"ltr_0", L"abc", L""},
+ {"rtl_3", L"\u05d0\u05d1\u05d2", L"\u05d0\u05d1\u05d2"},
+ {"rtl_2", L"\u05d0\u05d1\u05d2", L"\u2026\u05d2"},
+ {"rtl_1", L"\u05d0\u05d1\u05d2", L"\u2026"},
+ {"rtl_0", L"\u05d0\u05d1\u05d2", L""},
+ {"ltr_rtl_5", L"abc\u05d0\u05d1\u05d2", L"\u2026c\u05d0\u05d1\u05d2"},
+ {"ltr_rtl_4", L"abc\u05d0\u05d1\u05d2", L"\u2026\u05d0\u05d1\u05d2"},
+ {"ltr_rtl_3", L"abc\u05d0\u05d1\u05d2", L"\u2026\u05d1\u05d2"},
+ {"rtl_ltr_5", L"\u05d0\u05d1\u05d2abc", L"\u2026\u05d2abc"},
+ {"rtl_ltr_4", L"\u05d0\u05d1\u05d2abc", L"\u2026abc"},
+ {"rtl_ltr_3", L"\u05d0\u05d1\u05d2abc", L"\u2026bc"},
+ {"bidi_1", L"a\u05d1b\u05d1c012", L"\u2026b\u05d1c012"},
+ {"bidi_2", L"a\u05d1b\u05d1c012", L"\u2026\u05d1c012"},
+ {"bidi_3", L"a\u05d1b\u05d1c012", L"\u2026c012"},
+ // Test surrogate pairs. No surrogate pair should be partially elided.
+ {"surrogate1", L"abc\U0001D11E\U0001D122x", L"\u2026\U0001D11E\U0001D122x"},
+ {"surrogate2", L"abc\U0001D11E\U0001D122x", L"\u2026\U0001D122x"},
+ {"surrogate3", L"abc\U0001D11E\U0001D122x", L"\u2026x"},
+ // Test combining character sequences. U+0915 U+093F forms a compound
+ // glyph, as does U+0915 U+0942. No combining sequence should be partially
+ // elided.
+ {"combining1", L"0123\u0915\u093f\u0915\u0942456",
+ L"\u2026\u0915\u0942456"},
+ {"combining2", L"0123\u0915\u093f\u0915\u0942456", L"\u2026456"},
+ // 𝄞 (U+1D11E, MUSICAL SYMBOL G CLEF) should be fully elided.
+ {"emoji1", L"012\U0001D11Ex", L"\u2026\U0001D11Ex"},
+ {"emoji2", L"012\U0001D11Ex", L"\u2026x"},
+};
+
+INSTANTIATE_TEST_SUITE_P(
+ ElideHead,
+ RenderTextTestWithElideTextCase,
+ testing::Combine(testing::Values(ElideTextTestOptions{ELIDE_HEAD}),
+ testing::ValuesIn(kElideHeadTextCases)),
+ RenderTextTestWithElideTextCase::ParamInfoToString);
+
const ElideTextCase kElideTailTextCases[] = {
{"empty", L"", L""},
{"letter_m_tail0", L"M", L""},
@@ -1985,10 +2044,108 @@ const ElideTextCase kElideTailTextCases[] = {
{"emoji", L"012\U0001D11Ex", L"012\u2026"},
};
-INSTANTIATE_TEST_SUITE_P(ElideTail,
- RenderTextTestWithElideTextCase,
- ::testing::ValuesIn(kElideTailTextCases),
- RenderTextTestWithElideTextCase::ParamInfoToString);
+INSTANTIATE_TEST_SUITE_P(
+ ElideTail,
+ RenderTextTestWithElideTextCase,
+ testing::Combine(testing::Values(ElideTextTestOptions{ELIDE_TAIL}),
+ testing::ValuesIn(kElideTailTextCases)),
+ RenderTextTestWithElideTextCase::ParamInfoToString);
+
+const ElideTextCase kElideTruncateTextCases[] = {
+ {"empty", L"", L""},
+ {"letter_m_tail0", L"M", L""},
+ {"letter_m_tail1", L"M", L"M"},
+ {"no_eliding", L"012ab", L"012ab"},
+ {"ltr_3", L"abc", L"abc"},
+ {"ltr_2", L"abc", L"ab"},
+ {"ltr_1", L"abc", L"a"},
+ {"ltr_0", L"abc", L""},
+ {"rtl_3", L"\u05d0\u05d1\u05d2", L"\u05d0\u05d1\u05d2"},
+ {"rtl_2", L"\u05d0\u05d1\u05d2", L"\u05d0\u05d1"},
+ {"rtl_1", L"\u05d0\u05d1\u05d2", L"\u05d0"},
+ {"rtl_0", L"\u05d0\u05d1\u05d2", L""},
+ {"ltr_rtl_5", L"abc\u05d0\u05d1\u05d2", L"abc\u05d0\u05d1"},
+ {"ltr_rtl_4", L"abc\u05d0\u05d1\u05d2", L"abc\u05d0"},
+ {"ltr_rtl_3", L"abc\u05d0\u05d1\u05d2", L"abc"},
+ {"ltr_rtl_2", L"abc\u05d0\u05d1\u05d2", L"ab"},
+ {"rtl_ltr_5", L"\u05d0\u05d1\u05d2abc", L"\u05d0\u05d1\u05d2ab"},
+ {"rtl_ltr_4", L"\u05d0\u05d1\u05d2abc", L"\u05d0\u05d1\u05d2a"},
+ {"rtl_ltr_3", L"\u05d0\u05d1\u05d2abc", L"\u05d0\u05d1\u05d2"},
+ {"rtl_ltr_2", L"\u05d0\u05d1\u05d2abc", L"\u05d0\u05d1"},
+ {"bidi_1", L"012a\u05d1b\u05d1c", L"012a\u05d1b\u05d1"},
+ {"bidi_2", L"012a\u05d1b\u05d1c", L"012a\u05d1b"},
+ {"bidi_3", L"012a\u05d1b\u05d1c", L"012a\u05d1"},
+ {"bidi_4", L"012a\u05d1b\u05d1c", L"012a\u05d1"},
+ // Test surrogate pairs. The first pair 𝄞 'MUSICAL SYMBOL G CLEF' U+1D11E
+ // should be kept, and the second pair 𝄢 'MUSICAL SYMBOL F CLEF' U+1D122
+ // should be removed. No surrogate pair should be partially elided.
+ {"surrogate1", L"0123\U0001D11E\U0001D122x", L"0123\U0001D11E\U0001D122"},
+ {"surrogate2", L"0123\U0001D11E\U0001D122x", L"0123\U0001D11E"},
+ {"surrogate3", L"0123\U0001D11E\U0001D122x", L"0123"},
+ // Test combining character sequences. U+0915 U+093F forms a compound
+ // glyph, as does U+0915 U+0942. The first should be kept; the second
+ // removed. No combining sequence should be partially elided.
+ {"combining", L"0123\u0915\u093f\u0915\u0942456", L"0123\u0915\u093f"},
+ // 𝄞 (U+1D11E, MUSICAL SYMBOL G CLEF) should be fully elided.
+ {"emoji1", L"012\U0001D11Ex", L"012\U0001D11E"},
+ {"emoji2", L"012\U0001D11Ex", L"012"},
+};
+
+INSTANTIATE_TEST_SUITE_P(
+ ElideTruncate,
+ RenderTextTestWithElideTextCase,
+ testing::Combine(testing::Values(ElideTextTestOptions{TRUNCATE}),
+ testing::ValuesIn(kElideTruncateTextCases)),
+ RenderTextTestWithElideTextCase::ParamInfoToString);
+
+const ElideTextCase kElideEmailTextCases[] = {
+ // Invalid email text.
+ {"empty", L"", L""},
+ {"invalid_char1", L"x", L""},
+ {"invalid_char3", L"xyz", L"x\u2026"},
+ {"invalid_amp", L"@", L""},
+ {"invalid_no_prefix0", L"@y", L""},
+ {"invalid_no_prefix1", L"@y", L"\u2026"},
+ {"invalid_no_prefix2", L"@xyz", L"@x\u2026"},
+ {"invalid_no_suffix0", L"x@", L""},
+ {"invalid_no_suffix1", L"x@", L"\u2026"},
+ {"invalid_no_suffix2", L"xyz@", L"x\u2026@"},
+
+ {"at1", L"@", L"@"},
+ {"at2", L"@@", L"\u2026", 1},
+ {"at3", L"@@@", L"\u2026", 2},
+ {"at4", L"@@@@", L"@\u2026@", 3},
+
+ {"small1", L"a@b", L"\u2026", 1},
+ {"small2", L"a@b", L"\u2026", 2},
+ {"small3", L"a@b", L"a@b", 3},
+ {"small_username3", L"xyz@b", L"\u2026", 3},
+ {"small_username4", L"xyz@b", L"x\u2026@b", 4},
+ {"small_username5", L"xyz@b", L"xyz@b", 5},
+ {"small_domain3", L"a@xyz", L"\u2026", 3},
+ {"small_domain4", L"a@xyz", L"a@x\u2026", 4},
+ {"small_domain5", L"a@xyz", L"a@xyz", 5},
+
+ // Valid email.
+ {"email_small", L"a@b.com", L"\u2026"},
+ {"email_nobody3", L"nobody@gmail.com", L"\u2026", 3},
+ {"email_nobody4", L"nobody@gmail.com", L"\u2026", 4},
+ {"email_nobody5", L"nobody@gmail.com", L"n\u2026@g\u2026", 5},
+ {"email_nobody6", L"nobody@gmail.com", L"no\u2026@g\u2026", 6},
+ {"email_nobody7", L"nobody@gmail.com", L"no\u2026@g\u2026m", 7},
+ {"email_nobody8", L"nobody@gmail.com", L"nob\u2026@g\u2026m", 8},
+ {"email_nobody9", L"nobody@gmail.com", L"nob\u2026@gm\u2026m", 9},
+ {"email_nobody10", L"nobody@gmail.com", L"nobo\x2026@gm\u2026m", 10},
+ {"email_root", L"root@localhost", L"r\u2026@l\u2026", 5},
+ {"email_myself", L"myself@127.0.0.1", L"my\u2026@1\u2026", 6},
+};
+
+INSTANTIATE_TEST_SUITE_P(
+ ElideEmail,
+ RenderTextTestWithElideTextCase,
+ testing::Combine(testing::Values(ElideTextTestOptions{ELIDE_EMAIL}),
+ testing::ValuesIn(kElideEmailTextCases)),
+ RenderTextTestWithElideTextCase::ParamInfoToString);
TEST_F(RenderTextTest, ElidedText_NoTrimWhitespace) {
// This test requires glyphs to be the same width.
@@ -7519,6 +7676,36 @@ TEST_F(RenderTextTest, LineEndSelections) {
}
}
+TEST_F(RenderTextTest, GetSubstringBounds) {
+ const float kGlyphWidth = 5;
+ SetGlyphWidth(kGlyphWidth);
+ RenderText* render_text = GetRenderText();
+ render_text->SetText(UTF8ToUTF16("abc"));
+ render_text->SetCursorEnabled(false);
+ render_text->SetElideBehavior(NO_ELIDE);
+
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(0, 1)).width(), kGlyphWidth);
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(1, 2)).width(), kGlyphWidth);
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(1, 3)).width(), 2 * kGlyphWidth);
+
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(0, 0)).width(), 0);
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(3, 3)).width(), 0);
+
+ // Apply eliding so display text has 2 visible character.
+ render_text->SetDisplayRect(Rect(0, 0, 2 * kGlyphWidth, 100));
+ render_text->SetElideBehavior(TRUNCATE);
+
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(0, 1)).width(), kGlyphWidth);
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(1, 2)).width(), kGlyphWidth);
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(1, 3)).width(), kGlyphWidth);
+ // Check a fully elided range.
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(2, 3)).width(), 0);
+
+ // Empty ranges result in empty rect.
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(0, 0)).width(), 0);
+ EXPECT_EQ(GetSubstringBoundsUnion(Range(3, 3)).width(), 0);
+}
+
// Tests that GetSubstringBounds rounds outward when glyphs have floating-point
// widths.
TEST_F(RenderTextTest, GetSubstringBoundsFloatingPoint) {
@@ -7653,6 +7840,17 @@ TEST_F(RenderTextTest, MergeIntersectingRects) {
test::RenderTextTestApi::MergeIntersectingRects(test_rects);
ASSERT_EQ(1u, test_rects.size());
EXPECT_EQ(Rect(0, 0, 17, 10), test_rects[0]);
+
+ // The first 3 rects are adjacent horizontally. The 4th rect is adjacent to
+ // the 3rd rect vertically, but is not merged. The last rect is adjacent to
+ // the 4th rect.
+ test_rects = std::vector<Rect>{Rect(0, 0, 10, 10), Rect(10, 0, 10, 10),
+ Rect(20, 0, 10, 10), Rect(20, 10, 10, 10),
+ Rect(30, 10, 10, 10)};
+ test::RenderTextTestApi::MergeIntersectingRects(test_rects);
+ ASSERT_EQ(2u, test_rects.size());
+ EXPECT_EQ(Rect(0, 0, 30, 10), test_rects[0]);
+ EXPECT_EQ(Rect(20, 10, 20, 10), test_rects[1]);
}
// Ensures that text is centered vertically and consistently when either the
diff --git a/chromium/ui/gfx/skbitmap_operations.cc b/chromium/ui/gfx/skbitmap_operations.cc
index 891fda76f73..0a3fc8bf20a 100644
--- a/chromium/ui/gfx/skbitmap_operations.cc
+++ b/chromium/ui/gfx/skbitmap_operations.cc
@@ -677,7 +677,7 @@ SkBitmap SkBitmapOperations::CreateColorMask(const SkBitmap& bitmap,
color_mask.allocN32Pixels(bitmap.width(), bitmap.height());
color_mask.eraseARGB(0, 0, 0, 0);
- SkCanvas canvas(color_mask);
+ SkCanvas canvas(color_mask, SkSurfaceProps{});
SkPaint paint;
paint.setColorFilter(SkColorFilters::Blend(c, SkBlendMode::kSrcIn));
@@ -701,7 +701,7 @@ SkBitmap SkBitmapOperations::CreateDropShadow(
bitmap.height() + shadow_margin.height());
image_with_shadow.eraseARGB(0, 0, 0, 0);
- SkCanvas canvas(image_with_shadow);
+ SkCanvas canvas(image_with_shadow, SkSurfaceProps{});
canvas.translate(SkIntToScalar(shadow_margin.left()),
SkIntToScalar(shadow_margin.top()));
@@ -751,7 +751,7 @@ SkBitmap SkBitmapOperations::Rotate(const SkBitmap& source,
break;
}
- SkCanvas canvas(result);
+ SkCanvas canvas(result, SkSurfaceProps{});
canvas.clear(SkColorSetARGB(0, 0, 0, 0));
canvas.translate(SkFloatToScalar(result.width() * 0.5f),
diff --git a/chromium/ui/gfx/skbitmap_operations_unittest.cc b/chromium/ui/gfx/skbitmap_operations_unittest.cc
index 632550974b2..a0be6ed9cbf 100644
--- a/chromium/ui/gfx/skbitmap_operations_unittest.cc
+++ b/chromium/ui/gfx/skbitmap_operations_unittest.cc
@@ -525,7 +525,7 @@ TEST(SkBitmapOperationsTest, RotateImage) {
// GGGYYY
src.allocN32Pixels(src_w, src_h);
- SkCanvas canvas(src);
+ SkCanvas canvas(src, SkSurfaceProps{});
src.eraseARGB(0, 0, 0, 0);
// This region is a semi-transparent red to test non-opaque pixels.
diff --git a/chromium/ui/gfx/sys_color_change_listener.cc b/chromium/ui/gfx/sys_color_change_listener.cc
index 54e78f7e25f..72dae9fbed4 100644
--- a/chromium/ui/gfx/sys_color_change_listener.cc
+++ b/chromium/ui/gfx/sys_color_change_listener.cc
@@ -9,7 +9,7 @@
#include <memory>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/memory/singleton.h"
#include "base/observer_list.h"
#include "ui/gfx/win/singleton_hwnd_observer.h"
diff --git a/chromium/ui/gfx/system_fonts_win.h b/chromium/ui/gfx/system_fonts_win.h
index a76431fbb04..acf63cdc799 100644
--- a/chromium/ui/gfx/system_fonts_win.h
+++ b/chromium/ui/gfx/system_fonts_win.h
@@ -13,7 +13,7 @@ namespace win {
// Represents an optional override of system font and scale.
struct FontAdjustment {
- base::string16 font_family_override;
+ std::wstring font_family_override;
double font_scale = 1.0;
};
diff --git a/chromium/ui/gfx/text_elider.cc b/chromium/ui/gfx/text_elider.cc
index 7d5574b4c47..2a80e470579 100644
--- a/chromium/ui/gfx/text_elider.cc
+++ b/chromium/ui/gfx/text_elider.cc
@@ -173,9 +173,10 @@ base::string16 ElideFilename(const base::FilePath& filename,
const FontList& font_list,
float available_pixel_width) {
#if defined(OS_WIN)
- base::string16 filename_utf16 = filename.value();
- base::string16 extension = filename.Extension();
- base::string16 rootname = filename.BaseName().RemoveExtension().value();
+ base::string16 filename_utf16 = WideToUTF16(filename.value());
+ base::string16 extension = WideToUTF16(filename.Extension());
+ base::string16 rootname =
+ WideToUTF16(filename.BaseName().RemoveExtension().value());
#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
base::string16 filename_utf16 = WideToUTF16(base::SysNativeMBToWide(
filename.value()));
@@ -441,10 +442,10 @@ void RectangleString::AddWord(const base::string16& word) {
Append(word);
} else {
// Word is so big that it must be fragmented.
- int array_start = 0;
+ size_t array_start = 0;
int char_start = 0;
- base::i18n::UTF16CharIterator chars(&word);
- while (!chars.end()) {
+ base::i18n::UTF16CharIterator chars(word);
+ for (; !chars.end(); chars.Advance()) {
// When boundary is hit, add as much as will fit on this line.
if (current_col_ + (chars.char_offset() - char_start) >= max_cols_) {
Append(word.substr(array_start, chars.array_pos() - array_start));
@@ -452,7 +453,6 @@ void RectangleString::AddWord(const base::string16& word) {
array_start = chars.array_pos();
char_start = chars.char_offset();
}
- chars.Advance();
}
// Add the last remaining fragment, if any.
if (array_start != chars.array_pos())
diff --git a/chromium/ui/gfx/text_utils.cc b/chromium/ui/gfx/text_utils.cc
index dba839e87eb..ab52cf4fdf3 100644
--- a/chromium/ui/gfx/text_utils.cc
+++ b/chromium/ui/gfx/text_utils.cc
@@ -48,7 +48,7 @@ base::string16 RemoveAcceleratorChar(const base::string16& s,
bool escaped = false;
ptrdiff_t last_char_pos = -1;
int last_char_span = 0;
- UTF16CharIterator chars(&s);
+ UTF16CharIterator chars(s);
base::string16 accelerator_removed;
accelerator_removed.reserve(s.size());
@@ -82,7 +82,7 @@ base::string16 RemoveAcceleratorChar(const base::string16& s,
size_t FindValidBoundaryBefore(const base::string16& text,
size_t index,
bool trim_whitespace) {
- UTF16CharIterator it = UTF16CharIterator::LowerBound(&text, index);
+ UTF16CharIterator it = UTF16CharIterator::LowerBound(text, index);
// First, move left until we're positioned on a code point that is not a
// combining mark.
@@ -101,7 +101,7 @@ size_t FindValidBoundaryBefore(const base::string16& text,
size_t FindValidBoundaryAfter(const base::string16& text,
size_t index,
bool trim_whitespace) {
- UTF16CharIterator it = UTF16CharIterator::UpperBound(&text, index);
+ UTF16CharIterator it = UTF16CharIterator::UpperBound(text, index);
// First, move right until we're positioned on a code point that is not a
// combining mark.
diff --git a/chromium/ui/gfx/transform_util.cc b/chromium/ui/gfx/transform_util.cc
index 17886ee1027..97ddcbf3213 100644
--- a/chromium/ui/gfx/transform_util.cc
+++ b/chromium/ui/gfx/transform_util.cc
@@ -596,4 +596,41 @@ std::string DecomposedTransform::ToString() const {
quaternion.w());
}
+Transform OrthoProjectionMatrix(float left,
+ float right,
+ float bottom,
+ float top) {
+ // Use the standard formula to map the clipping frustum to the cube from
+ // [-1, -1, -1] to [1, 1, 1].
+ float delta_x = right - left;
+ float delta_y = top - bottom;
+ Transform proj;
+ if (!delta_x || !delta_y)
+ return proj;
+ proj.matrix().set(0, 0, 2.0f / delta_x);
+ proj.matrix().set(0, 3, -(right + left) / delta_x);
+ proj.matrix().set(1, 1, 2.0f / delta_y);
+ proj.matrix().set(1, 3, -(top + bottom) / delta_y);
+
+ // Z component of vertices is always set to zero as we don't use the depth
+ // buffer while drawing.
+ proj.matrix().set(2, 2, 0);
+
+ return proj;
+}
+
+Transform WindowMatrix(int x, int y, int width, int height) {
+ Transform canvas;
+
+ // Map to window position and scale up to pixel coordinates.
+ canvas.Translate3d(x, y, 0);
+ canvas.Scale3d(width, height, 0);
+
+ // Map from ([-1, -1] to [1, 1]) -> ([0, 0] to [1, 1])
+ canvas.Translate3d(0.5, 0.5, 0.5);
+ canvas.Scale3d(0.5, 0.5, 0.5);
+
+ return canvas;
+}
+
} // namespace gfx
diff --git a/chromium/ui/gfx/transform_util.h b/chromium/ui/gfx/transform_util.h
index 8b0f489a80f..59d91b7398d 100644
--- a/chromium/ui/gfx/transform_util.h
+++ b/chromium/ui/gfx/transform_util.h
@@ -72,6 +72,18 @@ GEOMETRY_SKIA_EXPORT Transform TransformAboutPivot(const Point& pivot,
GEOMETRY_SKIA_EXPORT Transform TransformBetweenRects(const RectF& src,
const RectF& dst);
+// Generates projection matrix and returns it as a Transform.
+GEOMETRY_SKIA_EXPORT Transform OrthoProjectionMatrix(float left,
+ float right,
+ float bottom,
+ float top);
+
+// Generates window matrix and returns it as a Transform.
+GEOMETRY_SKIA_EXPORT Transform WindowMatrix(int x,
+ int y,
+ int width,
+ int height);
+
} // namespace gfx
#endif // UI_GFX_TRANSFORM_UTIL_H_
diff --git a/chromium/ui/gfx/win/direct_write.cc b/chromium/ui/gfx/win/direct_write.cc
index 4f531c9f362..4ddff6f42dd 100644
--- a/chromium/ui/gfx/win/direct_write.cc
+++ b/chromium/ui/gfx/win/direct_write.cc
@@ -6,9 +6,10 @@
#include <wrl/client.h>
+#include <string>
+
#include "base/debug/alias.h"
#include "base/metrics/histogram_functions.h"
-#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "base/trace_event/trace_event.h"
#include "base/win/windows_version.h"
@@ -110,7 +111,7 @@ IDWriteFactory* GetDirectWriteFactory() {
base::Optional<std::string> RetrieveLocalizedString(
IDWriteLocalizedStrings* names,
const std::string& locale) {
- base::string16 locale_wide = base::UTF8ToUTF16(locale);
+ std::wstring locale_wide = base::UTF8ToWide(locale);
// If locale is empty, index 0 will be used. Otherwise, the locale name must
// be found and must exist.
@@ -129,7 +130,7 @@ base::Optional<std::string> RetrieveLocalizedString(
// The output buffer length needs to be one larger to receive the NUL
// character.
- base::string16 buffer;
+ std::wstring buffer;
buffer.resize(length + 1);
if (FAILED(names->GetString(index, &buffer[0], buffer.size())))
return base::nullopt;
@@ -137,7 +138,7 @@ base::Optional<std::string> RetrieveLocalizedString(
// Shrink the string to fit the actual length.
buffer.resize(length);
- return base::UTF16ToUTF8(buffer);
+ return base::WideToUTF8(buffer);
}
base::Optional<std::string> RetrieveLocalizedFontName(
@@ -153,7 +154,7 @@ base::Optional<std::string> RetrieveLocalizedFontName(
UINT32 index = 0;
BOOL exists;
- base::string16 font_name_wide = base::UTF8ToUTF16(font_name);
+ std::wstring font_name_wide = base::UTF8ToWide(font_name);
if (FAILED(font_collection->FindFamilyName(font_name_wide.c_str(), &index,
&exists)) ||
!exists) {
diff --git a/chromium/ui/gfx/win/hwnd_util.cc b/chromium/ui/gfx/win/hwnd_util.cc
index 9730ad7cfa1..d5586a9fae0 100644
--- a/chromium/ui/gfx/win/hwnd_util.cc
+++ b/chromium/ui/gfx/win/hwnd_util.cc
@@ -83,7 +83,7 @@ NOINLINE void CrashOther(DWORD last_error) {
} // namespace
-base::string16 GetClassName(HWND window) {
+std::wstring GetClassName(HWND window) {
// GetClassNameW will return a truncated result (properly null terminated) if
// the given buffer is not large enough. So, it is not possible to determine
// that we got the entire class name if the result is exactly equal to the
diff --git a/chromium/ui/gfx/win/hwnd_util.h b/chromium/ui/gfx/win/hwnd_util.h
index 18b386208a0..d4d8eafc014 100644
--- a/chromium/ui/gfx/win/hwnd_util.h
+++ b/chromium/ui/gfx/win/hwnd_util.h
@@ -7,15 +7,16 @@
#include <windows.h>
-#include "base/strings/string16.h"
+#include <string>
+
#include "ui/gfx/gfx_export.h"
namespace gfx {
class Size;
// A version of the GetClassNameW API that returns the class name in an
-// base::string16. An empty result indicates a failure to get the class name.
-GFX_EXPORT base::string16 GetClassName(HWND hwnd);
+// std::wstring. An empty result indicates a failure to get the class name.
+GFX_EXPORT std::wstring GetClassName(HWND hwnd);
// Useful for subclassing a HWND. Returns the previous window procedure.
GFX_EXPORT WNDPROC SetWindowProc(HWND hwnd, WNDPROC wndproc);
diff --git a/chromium/ui/gfx/win/text_analysis_source.cc b/chromium/ui/gfx/win/text_analysis_source.cc
index 567f54538d8..13fef96bab4 100644
--- a/chromium/ui/gfx/win/text_analysis_source.cc
+++ b/chromium/ui/gfx/win/text_analysis_source.cc
@@ -11,8 +11,8 @@ namespace win {
HRESULT TextAnalysisSource::Create(
IDWriteTextAnalysisSource** text_analysis_out,
- const base::string16& text,
- const base::string16& locale_name,
+ const std::wstring& text,
+ const std::wstring& locale_name,
IDWriteNumberSubstitution* number_substitution,
DWRITE_READING_DIRECTION reading_direction) {
return Microsoft::WRL::MakeAndInitialize<gfx::win::TextAnalysisSource>(
@@ -79,8 +79,8 @@ HRESULT TextAnalysisSource::GetTextBeforePosition(UINT32 text_position,
}
HRESULT TextAnalysisSource::RuntimeClassInitialize(
- const base::string16& text,
- const base::string16& locale_name,
+ const std::wstring& text,
+ const std::wstring& locale_name,
IDWriteNumberSubstitution* number_substitution,
DWRITE_READING_DIRECTION reading_direction) {
DCHECK(number_substitution);
diff --git a/chromium/ui/gfx/win/text_analysis_source.h b/chromium/ui/gfx/win/text_analysis_source.h
index dd45d4d19e3..4d3723fc79a 100644
--- a/chromium/ui/gfx/win/text_analysis_source.h
+++ b/chromium/ui/gfx/win/text_analysis_source.h
@@ -8,8 +8,9 @@
#include <dwrite.h>
#include <wrl.h>
+#include <string>
+
#include "base/macros.h"
-#include "base/strings/string16.h"
#include "ui/gfx/gfx_export.h"
namespace gfx {
@@ -26,8 +27,8 @@ class TextAnalysisSource
// Factory method to avoid exporting the class and all it derives from.
static GFX_EXPORT HRESULT
Create(IDWriteTextAnalysisSource** text_analysis_out,
- const base::string16& text,
- const base::string16& locale_name,
+ const std::wstring& text,
+ const std::wstring& locale_name,
IDWriteNumberSubstitution* number_substitution,
DWRITE_READING_DIRECTION reading_direction);
@@ -53,8 +54,8 @@ class TextAnalysisSource
UINT32* text_length) override;
HRESULT STDMETHODCALLTYPE
- RuntimeClassInitialize(const base::string16& text,
- const base::string16& locale_name,
+ RuntimeClassInitialize(const std::wstring& text,
+ const std::wstring& locale_name,
IDWriteNumberSubstitution* number_substitution,
DWRITE_READING_DIRECTION reading_direction);
@@ -62,8 +63,8 @@ class TextAnalysisSource
~TextAnalysisSource() override;
private:
- base::string16 text_;
- base::string16 locale_name_;
+ std::wstring text_;
+ std::wstring locale_name_;
Microsoft::WRL::ComPtr<IDWriteNumberSubstitution> number_substitution_;
DWRITE_READING_DIRECTION reading_direction_;
diff --git a/chromium/ui/gfx/win/window_impl.cc b/chromium/ui/gfx/win/window_impl.cc
index 9c4de6c604d..183e91a3520 100644
--- a/chromium/ui/gfx/win/window_impl.cc
+++ b/chromium/ui/gfx/win/window_impl.cc
@@ -66,7 +66,7 @@ class ClassRegistrar {
// Represents a registered window class.
struct RegisteredClass {
RegisteredClass(const ClassInfo& info,
- const base::string16& name,
+ const std::wstring& name,
ATOM atom,
HINSTANCE instance);
@@ -74,7 +74,7 @@ class ClassRegistrar {
ClassInfo info;
// The name given to the window class
- base::string16 name;
+ std::wstring name;
// The atom identifying the window class.
ATOM atom;
@@ -126,8 +126,8 @@ ATOM ClassRegistrar::RetrieveClassAtom(const ClassInfo& class_info) {
}
// No class found, need to register one.
- base::string16 name = base::string16(WindowImpl::kBaseClassName) +
- base::NumberToString16(registered_count_++);
+ std::wstring name = std::wstring(WindowImpl::kBaseClassName) +
+ base::NumberToWString(registered_count_++);
WNDCLASSEX window_class;
base::win::InitializeWindowClass(
@@ -155,13 +155,10 @@ ATOM ClassRegistrar::RetrieveClassAtom(const ClassInfo& class_info) {
}
ClassRegistrar::RegisteredClass::RegisteredClass(const ClassInfo& info,
- const base::string16& name,
+ const std::wstring& name,
ATOM atom,
HMODULE instance)
- : info(info),
- name(name),
- atom(atom),
- instance(instance) {}
+ : info(info), name(name), atom(atom), instance(instance) {}
ClassRegistrar::ClassRegistrar() : registered_count_(0) {}
@@ -248,7 +245,7 @@ void WindowImpl::Init(HWND parent, const Rect& bounds) {
CHECK(false);
}
if (!destroyed)
- destroyed_ = NULL;
+ destroyed_ = nullptr;
CheckWindowCreated(hwnd_, create_window_error);
diff --git a/chromium/ui/gfx/x/BUILD.gn b/chromium/ui/gfx/x/BUILD.gn
index 6b87f8e0c12..96f72a4369a 100644
--- a/chromium/ui/gfx/x/BUILD.gn
+++ b/chromium/ui/gfx/x/BUILD.gn
@@ -2,8 +2,9 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
+import("//tools/generate_library_loader/generate_library_loader.gni")
assert(use_x11 || ozone_platform_x11)
@@ -20,6 +21,22 @@ config("x11_private_config") {
defines = [ "IS_X11_IMPL" ]
}
+generate_library_loader("xlib_loader") {
+ name = "XlibLoader"
+ output_h = "xlib_loader.h"
+ output_cc = "xlib_loader.cc"
+ header = "\"ui/gfx/x/xlib.h\""
+
+ functions = [
+ "XInitThreads",
+ "XOpenDisplay",
+ "XCloseDisplay",
+ "XFlush",
+ "XSynchronize",
+ "XSetErrorHandler",
+ ]
+}
+
action("gen_xprotos") {
visibility = [ ":xprotos" ]
script = "gen_xproto.py"
@@ -59,6 +76,7 @@ action("gen_xprotos") {
sources = []
outputs = [
"$target_gen_dir/read_event.cc",
+ "$target_gen_dir/read_error.cc",
"$target_gen_dir/extension_manager.h",
"$target_gen_dir/extension_manager.cc",
]
@@ -80,30 +98,35 @@ action("gen_xprotos") {
component("xprotos") {
deps = [
":gen_xprotos",
+ ":xlib_loader",
"//base",
"//base:i18n",
"//ui/events/platform",
]
public_deps = [ "//ui/gfx/x/keysyms" ]
sources = get_target_outputs(":gen_xprotos") + [
- "xproto_internal.h",
- "xproto_internal.cc",
- "xproto_types.h",
- "xproto_types.cc",
- "xproto_util.h",
- "xproto_util.cc",
"connection.h",
"connection.cc",
"event.h",
"event.cc",
+ "error.h",
+ "error.cc",
+ "keyboard_state.h",
+ "keyboard_state.cc",
+ "scoped_ignore_errors.h",
+ "scoped_ignore_errors.cc",
"x11_switches.cc",
"x11_switches.h",
- "x11.h",
+ "xlib_support.h",
+ "xlib_support.cc",
+ "xproto_internal.h",
+ "xproto_internal.cc",
+ "xproto_types.h",
+ "xproto_types.cc",
+ "xproto_util.h",
]
- configs += [
- ":x11_private_config",
- "//build/config/linux:x11",
- ]
+ configs += [ ":x11_private_config" ]
+ libs = [ "xcb" ]
}
component("x") {
@@ -113,18 +136,12 @@ component("x") {
"../gfx_export.h",
"x11_atom_cache.cc",
"x11_atom_cache.h",
- "x11_error_tracker.cc",
- "x11_error_tracker.h",
"x11_path.cc",
"x11_path.h",
- "x11_types.cc",
- "x11_types.h",
]
defines = [ "GFX_IMPLEMENTATION" ]
- public_configs = [ "//build/config/linux:x11" ]
-
deps = [
"//base",
"//skia",
diff --git a/chromium/ui/gfx/x/DEPS b/chromium/ui/gfx/x/DEPS
index a444e969cbd..eccf1f06866 100644
--- a/chromium/ui/gfx/x/DEPS
+++ b/chromium/ui/gfx/x/DEPS
@@ -1,3 +1,6 @@
include_rules = [
"+ui/events/platform/platform_event_source.h",
+ "+third_party/libx11",
+ "+third_party/libxcb-keysyms",
+ "+third_party/x11proto",
]
diff --git a/chromium/ui/gfx/x/OWNERS b/chromium/ui/gfx/x/OWNERS
index 079174d24bc..c5442ff2356 100644
--- a/chromium/ui/gfx/x/OWNERS
+++ b/chromium/ui/gfx/x/OWNERS
@@ -2,5 +2,3 @@ thomasanderson@chromium.org
# Adding new atoms is allowed without OWNERS review.
per-file x11_atom_cache.cc=*
-
-# COMPONENT: UI>GFX
diff --git a/chromium/ui/gfx/x/connection.cc b/chromium/ui/gfx/x/connection.cc
index cea4895e776..d6350747a89 100644
--- a/chromium/ui/gfx/x/connection.cc
+++ b/chromium/ui/gfx/x/connection.cc
@@ -11,55 +11,25 @@
#include "base/auto_reset.h"
#include "base/command_line.h"
-#include "base/i18n/case_conversion.h"
+#include "base/memory/ptr_util.h"
#include "base/memory/scoped_refptr.h"
#include "base/no_destructor.h"
#include "base/strings/string16.h"
#include "base/threading/thread_local.h"
#include "ui/gfx/x/bigreq.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/keysyms/keysyms.h"
+#include "ui/gfx/x/keyboard_state.h"
#include "ui/gfx/x/randr.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_switches.h"
#include "ui/gfx/x/xkb.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_internal.h"
#include "ui/gfx/x/xproto_types.h"
-extern "C" {
-typedef struct {
- int type;
- unsigned long serial;
- Bool send_event;
- Display* display;
- Window window;
- Window root;
- Window subwindow;
- Time time;
- int x, y;
- int x_root, y_root;
- unsigned int state;
- unsigned int keycode;
- Bool same_screen;
-} XKeyEvent;
-
-// This is temporarily required to fix XKB key event processing (bugs 1125886,
-// 1136265, 1136248, 1136206). It should be removed and replaced with an
-// XProto equivalent.
-int XLookupString(XKeyEvent* event_struct,
- char* buffer_return,
- int bytes_buffer,
- ::KeySym* keysym_return,
- void* status_in_out);
-}
-
namespace x11 {
namespace {
-constexpr KeySym kNoSymbol = static_cast<KeySym>(0);
-
// On the wire, sequence IDs are 16 bits. In xcb, they're usually extended to
// 32 and sometimes 64 bits. In Xlib, they're extended to unsigned long, which
// may be 32 or 64 bits depending on the platform. This function is intended to
@@ -81,161 +51,45 @@ auto CompareSequenceIds(T t, U u) {
return static_cast<SignedType>(t0 - u0);
}
-XDisplay* OpenNewXDisplay(const std::string& address) {
- if (!XInitThreads())
- return nullptr;
- std::string display_str =
- address.empty()
- ? base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
- switches::kX11Display)
- : address;
- return XOpenDisplay(display_str.empty() ? nullptr : display_str.c_str());
-}
-
-// Ported from XConvertCase:
-// https://gitlab.freedesktop.org/xorg/lib/libx11/-/blob/2b7598221d87049d03e9a95fcb541c37c8728184/src/KeyBind.c#L645
-void ConvertCaseImpl(uint32_t sym, uint32_t* lower, uint32_t* upper) {
- // Unicode keysym
- if ((sym & 0xff000000) == 0x01000000) {
- base::string16 string({sym & 0x00ffffff});
- auto lower_string = base::i18n::ToLower(string);
- auto upper_string = base::i18n::ToUpper(string);
- *lower = lower_string[0] | 0x01000000;
- *upper = upper_string[0] | 0x01000000;
- return;
- }
-
- *lower = sym;
- *upper = sym;
-
- switch (sym >> 8) {
- // Latin 1
- case 0:
- if ((sym >= XK_A) && (sym <= XK_Z))
- *lower += (XK_a - XK_A);
- else if ((sym >= XK_a) && (sym <= XK_z))
- *upper -= (XK_a - XK_A);
- else if ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis))
- *lower += (XK_agrave - XK_Agrave);
- else if ((sym >= XK_agrave) && (sym <= XK_odiaeresis))
- *upper -= (XK_agrave - XK_Agrave);
- else if ((sym >= XK_Ooblique) && (sym <= XK_Thorn))
- *lower += (XK_oslash - XK_Ooblique);
- else if ((sym >= XK_oslash) && (sym <= XK_thorn))
- *upper -= (XK_oslash - XK_Ooblique);
- break;
- // Latin 2
- case 1:
- if (sym == XK_Aogonek)
- *lower = XK_aogonek;
- else if (sym >= XK_Lstroke && sym <= XK_Sacute)
- *lower += (XK_lstroke - XK_Lstroke);
- else if (sym >= XK_Scaron && sym <= XK_Zacute)
- *lower += (XK_scaron - XK_Scaron);
- else if (sym >= XK_Zcaron && sym <= XK_Zabovedot)
- *lower += (XK_zcaron - XK_Zcaron);
- else if (sym == XK_aogonek)
- *upper = XK_Aogonek;
- else if (sym >= XK_lstroke && sym <= XK_sacute)
- *upper -= (XK_lstroke - XK_Lstroke);
- else if (sym >= XK_scaron && sym <= XK_zacute)
- *upper -= (XK_scaron - XK_Scaron);
- else if (sym >= XK_zcaron && sym <= XK_zabovedot)
- *upper -= (XK_zcaron - XK_Zcaron);
- else if (sym >= XK_Racute && sym <= XK_Tcedilla)
- *lower += (XK_racute - XK_Racute);
- else if (sym >= XK_racute && sym <= XK_tcedilla)
- *upper -= (XK_racute - XK_Racute);
- break;
- // Latin 3
- case 2:
- if (sym >= XK_Hstroke && sym <= XK_Hcircumflex)
- *lower += (XK_hstroke - XK_Hstroke);
- else if (sym >= XK_Gbreve && sym <= XK_Jcircumflex)
- *lower += (XK_gbreve - XK_Gbreve);
- else if (sym >= XK_hstroke && sym <= XK_hcircumflex)
- *upper -= (XK_hstroke - XK_Hstroke);
- else if (sym >= XK_gbreve && sym <= XK_jcircumflex)
- *upper -= (XK_gbreve - XK_Gbreve);
- else if (sym >= XK_Cabovedot && sym <= XK_Scircumflex)
- *lower += (XK_cabovedot - XK_Cabovedot);
- else if (sym >= XK_cabovedot && sym <= XK_scircumflex)
- *upper -= (XK_cabovedot - XK_Cabovedot);
- break;
- // Latin 4
- case 3:
- if (sym >= XK_Rcedilla && sym <= XK_Tslash)
- *lower += (XK_rcedilla - XK_Rcedilla);
- else if (sym >= XK_rcedilla && sym <= XK_tslash)
- *upper -= (XK_rcedilla - XK_Rcedilla);
- else if (sym == XK_ENG)
- *lower = XK_eng;
- else if (sym == XK_eng)
- *upper = XK_ENG;
- else if (sym >= XK_Amacron && sym <= XK_Umacron)
- *lower += (XK_amacron - XK_Amacron);
- else if (sym >= XK_amacron && sym <= XK_umacron)
- *upper -= (XK_amacron - XK_Amacron);
- break;
- // Cyrillic
- case 6:
- if (sym >= XK_Serbian_DJE && sym <= XK_Serbian_DZE)
- *lower -= (XK_Serbian_DJE - XK_Serbian_dje);
- else if (sym >= XK_Serbian_dje && sym <= XK_Serbian_dze)
- *upper += (XK_Serbian_DJE - XK_Serbian_dje);
- else if (sym >= XK_Cyrillic_YU && sym <= XK_Cyrillic_HARDSIGN)
- *lower -= (XK_Cyrillic_YU - XK_Cyrillic_yu);
- else if (sym >= XK_Cyrillic_yu && sym <= XK_Cyrillic_hardsign)
- *upper += (XK_Cyrillic_YU - XK_Cyrillic_yu);
- break;
- // Greek
- case 7:
- if (sym >= XK_Greek_ALPHAaccent && sym <= XK_Greek_OMEGAaccent)
- *lower += (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
- else if (sym >= XK_Greek_alphaaccent && sym <= XK_Greek_omegaaccent &&
- sym != XK_Greek_iotaaccentdieresis &&
- sym != XK_Greek_upsilonaccentdieresis)
- *upper -= (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
- else if (sym >= XK_Greek_ALPHA && sym <= XK_Greek_OMEGA)
- *lower += (XK_Greek_alpha - XK_Greek_ALPHA);
- else if (sym >= XK_Greek_alpha && sym <= XK_Greek_omega &&
- sym != XK_Greek_finalsmallsigma)
- *upper -= (XK_Greek_alpha - XK_Greek_ALPHA);
- break;
- // Latin 9
- case 0x13:
- if (sym == XK_OE)
- *lower = XK_oe;
- else if (sym == XK_oe)
- *upper = XK_OE;
- else if (sym == XK_Ydiaeresis)
- *lower = XK_ydiaeresis;
- break;
- }
+base::ThreadLocalOwnedPointer<Connection>& GetConnectionTLS() {
+ static base::NoDestructor<base::ThreadLocalOwnedPointer<Connection>> tls;
+ return *tls;
}
-void ConvertCase(KeySym sym, KeySym* lower, KeySym* upper) {
- uint32_t lower32;
- uint32_t upper32;
- ConvertCaseImpl(static_cast<uint32_t>(sym), &lower32, &upper32);
- *lower = static_cast<KeySym>(lower32);
- *upper = static_cast<KeySym>(upper32);
+void DefaultErrorHandler(const x11::Error* error, const char* request_name) {
+ LOG(WARNING) << "X error received. Request: x11::" << request_name
+ << "Request, Error: " << error->ToString();
}
-bool IsXKeypadKey(KeySym keysym) {
- auto key = static_cast<uint32_t>(keysym);
- return key >= XK_KP_Space && key <= XK_KP_Equal;
+void DefaultIOErrorHandler() {
+ LOG(ERROR) << "X connection error received.";
}
-bool IsPrivateXKeypadKey(KeySym keysym) {
- auto key = static_cast<uint32_t>(keysym);
- return key >= 0x11000000 && key <= 0x1100FFFF;
-}
+class UnknownError : public Error {
+ public:
+ explicit UnknownError(FutureBase::RawError error_bytes)
+ : error_bytes_(error_bytes) {}
-base::ThreadLocalOwnedPointer<Connection>& GetConnectionTLS() {
- static base::NoDestructor<base::ThreadLocalOwnedPointer<Connection>> tls;
- return *tls;
-}
+ ~UnknownError() override = default;
+
+ std::string ToString() const override {
+ std::stringstream ss;
+ ss << "x11::UnknownError{";
+ // Errors are always a fixed 32 bytes.
+ for (size_t i = 0; i < 32; i++) {
+ char buf[3];
+ sprintf(buf, "%02x", error_bytes_->data()[i]);
+ ss << "0x" << buf;
+ if (i != 31)
+ ss << ", ";
+ }
+ ss << "}";
+ return ss.str();
+ }
+
+ private:
+ FutureBase::RawError error_bytes_;
+};
} // namespace
@@ -260,16 +114,18 @@ void Connection::Set(std::unique_ptr<x11::Connection> connection) {
Connection::Connection(const std::string& address)
: XProto(this),
- display_(OpenNewXDisplay(address)),
- display_string_(address) {
- char* host = nullptr;
- int display = 0;
- xcb_parse_display(address.c_str(), &host, &display, &default_screen_id_);
- if (host)
- free(host);
- if (display_) {
- XSetEventQueueOwner(display_, XCBOwnsEventQueue);
-
+ display_string_(
+ address.empty()
+ ? base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kX11Display)
+ : address),
+ error_handler_(base::BindRepeating(DefaultErrorHandler)),
+ io_error_handler_(base::BindOnce(DefaultIOErrorHandler)) {
+ connection_ =
+ xcb_connect(display_string_.empty() ? nullptr : display_string_.c_str(),
+ &default_screen_id_);
+ DCHECK(connection_);
+ if (Ready()) {
auto buf = ReadBuffer(base::MakeRefCounted<UnretainedRefCountedMemory>(
xcb_get_setup(XcbConnection())));
setup_ = Read<Setup>(&buf);
@@ -286,7 +142,17 @@ Connection::Connection(const std::string& address)
}
ExtensionManager::Init(this);
- if (auto response = bigreq().Enable({}).Sync())
+ auto enable_bigreq = bigreq().Enable({});
+ // Xlib enables XKB on display creation, so we do that here to maintain
+ // compatibility.
+ xkb()
+ .UseExtension({x11::Xkb::major_version, x11::Xkb::minor_version})
+ .OnResponse(base::BindOnce([](x11::Xkb::UseExtensionResponse response) {
+ if (!response || !response->supported)
+ DVLOG(1) << "Xkb extension not available.";
+ }));
+ Flush();
+ if (auto response = enable_bigreq.Sync())
extended_max_request_length_ = response->maximum_request_length;
const Format* formats[256];
@@ -300,21 +166,30 @@ Connection::Connection(const std::string& address)
default_screen_visuals_[visual.visual_id] = VisualInfo{format, &visual};
}
- ResetKeyboardState();
+ keyboard_state_ = CreateKeyboardState(this);
+
+ InitErrorParsers();
}
Connection::~Connection() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
platform_event_source.reset();
- if (display_)
- XCloseDisplay(display_);
+ xcb_disconnect(connection_);
}
xcb_connection_t* Connection::XcbConnection() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (!display())
- return nullptr;
- return XGetXCBConnection(display());
+ if (io_error_handler_ && xcb_connection_has_error(connection_))
+ std::move(io_error_handler_).Run();
+ return connection_;
+}
+
+XlibDisplayWrapper Connection::GetXlibDisplay(XlibDisplayType type) {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ if (!xlib_display_)
+ xlib_display_ = base::WrapUnique(new XlibDisplay(display_string_));
+ return XlibDisplayWrapper(xlib_display_->display_, type);
}
Connection::Request::Request(unsigned int sequence,
@@ -322,14 +197,39 @@ Connection::Request::Request(unsigned int sequence,
: sequence(sequence), callback(std::move(callback)) {}
Connection::Request::Request(Request&& other)
- : sequence(other.sequence), callback(std::move(other.callback)) {}
+ : sequence(other.sequence),
+ callback(std::move(other.callback)),
+ have_response(other.have_response),
+ reply(std::move(other.reply)),
+ error(std::move(other.error)) {}
Connection::Request::~Request() = default;
-bool Connection::HasNextResponse() const {
- return !requests_.empty() &&
- CompareSequenceIds(XLastKnownRequestProcessed(display_),
- requests_.front().sequence) >= 0;
+bool Connection::HasNextResponse() {
+ if (requests_.empty())
+ return false;
+ auto& request = requests_.front();
+ if (request.have_response)
+ return true;
+
+ void* reply = nullptr;
+ xcb_generic_error_t* error = nullptr;
+ request.have_response =
+ xcb_poll_for_reply(XcbConnection(), request.sequence, &reply, &error);
+ if (reply)
+ request.reply = base::MakeRefCounted<MallocedRefCountedMemory>(reply);
+ if (error)
+ request.error = base::MakeRefCounted<MallocedRefCountedMemory>(error);
+ return request.have_response;
+}
+
+bool Connection::HasNextEvent() {
+ while (!events_.empty()) {
+ if (events_.front().Initialized())
+ return true;
+ events_.pop_front();
+ }
+ return false;
}
int Connection::GetFd() {
@@ -342,6 +242,19 @@ const std::string& Connection::DisplayString() const {
return display_string_;
}
+std::string Connection::GetConnectionHostname() const {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ char* host = nullptr;
+ int display_id = 0;
+ int screen = 0;
+ if (xcb_parse_display(display_string_.c_str(), &host, &display_id, &screen)) {
+ std::string name = host;
+ free(host);
+ return name;
+ }
+ return std::string();
+}
+
int Connection::DefaultScreenId() const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// This is not part of the setup data as the server has no concept of a
@@ -352,13 +265,12 @@ int Connection::DefaultScreenId() const {
bool Connection::Ready() const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- return display_ && !xcb_connection_has_error(XGetXCBConnection(display_));
+ return !xcb_connection_has_error(connection_);
}
void Connection::Flush() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (display_)
- XFlush(display_);
+ xcb_flush(connection_);
}
void Connection::Sync() {
@@ -373,7 +285,6 @@ void Connection::Sync() {
void Connection::SynchronizeForTest(bool synchronous) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- XSynchronize(display(), synchronous);
synchronous_ = synchronous;
if (synchronous_)
Sync();
@@ -389,7 +300,7 @@ void Connection::ReadResponses() {
Event Connection::WaitForNextEvent() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (!events_.empty()) {
+ if (HasNextEvent()) {
Event event = std::move(events_.front());
events_.pop_front();
return event;
@@ -401,9 +312,9 @@ Event Connection::WaitForNextEvent() {
return Event();
}
-bool Connection::HasPendingResponses() const {
+bool Connection::HasPendingResponses() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- return !events_.empty() || HasNextResponse();
+ return HasNextEvent() || HasNextResponse();
}
const Connection::VisualInfo* Connection::GetVisualInfoFromId(
@@ -415,34 +326,15 @@ const Connection::VisualInfo* Connection::GetVisualInfoFromId(
return nullptr;
}
-KeyCode Connection::KeysymToKeycode(KeySym keysym) {
+KeyCode Connection::KeysymToKeycode(uint32_t keysym) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- uint8_t min_keycode = static_cast<uint8_t>(setup_.min_keycode);
- uint8_t max_keycode = static_cast<uint8_t>(setup_.max_keycode);
- uint8_t count = max_keycode - min_keycode + 1;
- DCHECK_EQ(count * keyboard_mapping_.keysyms_per_keycode,
- static_cast<int>(keyboard_mapping_.keysyms.size()));
- for (size_t i = 0; i < keyboard_mapping_.keysyms.size(); i++) {
- if (keyboard_mapping_.keysyms[i] == keysym) {
- return static_cast<KeyCode>(min_keycode +
- i / keyboard_mapping_.keysyms_per_keycode);
- }
- }
- return {};
+ return keyboard_state_->KeysymToKeycode(keysym);
}
-KeySym Connection::KeycodeToKeysym(uint32_t keycode, unsigned int modifiers) {
+uint32_t Connection::KeycodeToKeysym(KeyCode keycode,
+ uint32_t modifiers) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
- XKeyEvent key_event{
- .type = KeyEvent::Press,
- .display = display_,
- .state = modifiers,
- .keycode = keycode,
- };
- ::KeySym keysym;
- XLookupString(&key_event, nullptr, 0, &keysym, nullptr);
- return static_cast<x11::KeySym>(keysym);
+ return keyboard_state_->KeycodeToKeysym(keycode, modifiers);
}
std::unique_ptr<Connection> Connection::Clone() const {
@@ -457,25 +349,18 @@ void Connection::DetachFromSequence() {
void Connection::Dispatch(Delegate* delegate) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- DCHECK(display_);
auto process_next_response = [&] {
- xcb_connection_t* connection = XGetXCBConnection(display_);
- auto request = std::move(requests_.front());
- requests_.pop();
-
- void* raw_reply = nullptr;
- xcb_generic_error_t* raw_error = nullptr;
- xcb_poll_for_reply(connection, request.sequence, &raw_reply, &raw_error);
+ DCHECK(!requests_.empty());
+ DCHECK(requests_.front().have_response);
- scoped_refptr<MallocedRefCountedMemory> reply;
- if (raw_reply)
- reply = base::MakeRefCounted<MallocedRefCountedMemory>(raw_reply);
- std::move(request.callback).Run(reply, FutureBase::RawError{raw_error});
+ Request request = std::move(requests_.front());
+ requests_.pop();
+ std::move(request.callback).Run(request.reply, request.error);
};
auto process_next_event = [&] {
- DCHECK(!events_.empty());
+ DCHECK(HasNextEvent());
Event event = std::move(events_.front());
events_.pop_front();
@@ -488,7 +373,7 @@ void Connection::Dispatch(Delegate* delegate) {
Flush();
ReadResponses();
- if (HasNextResponse() && !events_.empty()) {
+ if (HasNextResponse() && HasNextEvent()) {
if (!events_.front().sequence_valid()) {
process_next_event();
continue;
@@ -506,7 +391,7 @@ void Connection::Dispatch(Delegate* delegate) {
process_next_event();
} else if (HasNextResponse()) {
process_next_response();
- } else if (!events_.empty()) {
+ } else if (HasNextEvent()) {
process_next_event();
} else {
break;
@@ -514,6 +399,18 @@ void Connection::Dispatch(Delegate* delegate) {
}
}
+Connection::ErrorHandler Connection::SetErrorHandler(ErrorHandler new_handler) {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+ return std::exchange(error_handler_, new_handler);
+}
+
+void Connection::SetIOErrorHandler(IOErrorHandler new_handler) {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+ io_error_handler_ = std::move(new_handler);
+}
+
void Connection::InitRootDepthAndVisual() {
for (auto& depth : default_screen_->allowed_depths) {
for (auto& visual : depth.visuals) {
@@ -543,13 +440,13 @@ void Connection::PreDispatchEvent(const Event& event) {
setup_.min_keycode = mapping->first_keycode;
setup_.max_keycode = static_cast<x11::KeyCode>(
static_cast<int>(mapping->first_keycode) + mapping->count - 1);
- ResetKeyboardState();
+ keyboard_state_->UpdateMapping();
}
}
if (auto* notify = event.As<x11::Xkb::NewKeyboardNotifyEvent>()) {
setup_.min_keycode = notify->minKeyCode;
setup_.max_keycode = notify->maxKeyCode;
- ResetKeyboardState();
+ keyboard_state_->UpdateMapping();
}
// This is adapted from XRRUpdateConfiguration.
@@ -587,141 +484,23 @@ int Connection::ScreenIndexFromRootWindow(Window root) const {
return -1;
}
-void Connection::ResetKeyboardState() {
- uint8_t min_keycode = static_cast<uint8_t>(setup_.min_keycode);
- uint8_t max_keycode = static_cast<uint8_t>(setup_.max_keycode);
- uint8_t count = max_keycode - min_keycode + 1;
- auto keyboard_future = GetKeyboardMapping({setup_.min_keycode, count});
- auto modifier_future = GetModifierMapping({});
- Flush();
- if (auto reply = keyboard_future.Sync())
- keyboard_mapping_ = std::move(*reply.reply);
- if (auto reply = modifier_future.Sync())
- modifier_mapping_ = std::move(*reply.reply);
-
- for (uint8_t i = 0; i < modifier_mapping_.keycodes_per_modifier; i++) {
- // Lock modifiers are in the second row of the matrix
- size_t index = 2 * modifier_mapping_.keycodes_per_modifier + i;
- for (uint8_t j = 0; j < keyboard_mapping_.keysyms_per_keycode; j++) {
- auto sym = static_cast<uint32_t>(
- KeyCodetoKeySym(modifier_mapping_.keycodes[index], j));
- if (sym == XK_Caps_Lock || sym == XK_ISO_Lock) {
- lock_meaning_ = XK_Caps_Lock;
- break;
- }
- if (sym == XK_Shift_Lock)
- lock_meaning_ = XK_Shift_Lock;
- }
- }
-
- // Mod<n> is at row (n + 2) of the matrix. This iterates from Mod1 to Mod5.
- for (int mod = 3; mod < 8; mod++) {
- for (size_t i = 0; i < modifier_mapping_.keycodes_per_modifier; i++) {
- size_t index = mod * modifier_mapping_.keycodes_per_modifier + i;
- for (uint8_t j = 0; j < keyboard_mapping_.keysyms_per_keycode; j++) {
- auto sym = static_cast<uint32_t>(
- KeyCodetoKeySym(modifier_mapping_.keycodes[index], j));
- if (sym == XK_Mode_switch)
- mode_switch_ |= 1 << mod;
- if (sym == XK_Num_Lock)
- num_lock_ |= 1 << mod;
- }
- }
- }
+std::unique_ptr<Error> Connection::ParseError(
+ FutureBase::RawError error_bytes) {
+ if (!error_bytes)
+ return nullptr;
+ struct ErrorHeader {
+ uint8_t response_type;
+ uint8_t error_code;
+ uint16_t sequence;
+ };
+ auto error_code = error_bytes->front_as<ErrorHeader>()->error_code;
+ if (auto parser = error_parsers_[error_code])
+ return parser(error_bytes);
+ return std::make_unique<UnknownError>(error_bytes);
}
-// Ported from xcb_key_symbols_get_keysym
-// https://gitlab.freedesktop.org/xorg/lib/libxcb-keysyms/-/blob/691515491a4a3c119adc6c769c29de264b3f3806/keysyms/keysyms.c#L189
-KeySym Connection::KeyCodetoKeySym(KeyCode keycode, int column) const {
- uint8_t key = static_cast<uint8_t>(keycode);
- uint8_t n_keysyms = keyboard_mapping_.keysyms_per_keycode;
-
- uint8_t min_key = static_cast<uint8_t>(setup_.min_keycode);
- uint8_t max_key = static_cast<uint8_t>(setup_.max_keycode);
- if (column < 0 || (column >= n_keysyms && column > 3) || key < min_key ||
- key > max_key) {
- return kNoSymbol;
- }
-
- const auto* syms = &keyboard_mapping_.keysyms[(key - min_key) * n_keysyms];
- if (column < 4) {
- if (column > 1) {
- while ((n_keysyms > 2) && (syms[n_keysyms - 1] == kNoSymbol))
- n_keysyms--;
- if (n_keysyms < 3)
- column -= 2;
- }
- if ((n_keysyms <= (column | 1)) || (syms[column | 1] == kNoSymbol)) {
- KeySym lsym, usym;
- ConvertCase(syms[column & ~1], &lsym, &usym);
- if (!(column & 1))
- return lsym;
- if (usym == lsym)
- return kNoSymbol;
- return usym;
- }
- }
- return syms[column];
-}
-
-// Ported from _XTranslateKey:
-// https://gitlab.freedesktop.org/xorg/lib/libx11/-/blob/2b7598221d87049d03e9a95fcb541c37c8728184/src/KeyBind.c#L761
-KeySym Connection::TranslateKey(uint32_t key, unsigned int modifiers) const {
- constexpr auto kShiftMask = static_cast<unsigned int>(x11::ModMask::Shift);
- constexpr auto kLockMask = static_cast<unsigned int>(x11::ModMask::Lock);
-
- uint8_t min_key = static_cast<uint8_t>(setup_.min_keycode);
- uint8_t max_key = static_cast<uint8_t>(setup_.max_keycode);
- if (key < min_key || key > max_key)
- return kNoSymbol;
-
- uint8_t n_keysyms = keyboard_mapping_.keysyms_per_keycode;
- if (!n_keysyms)
- return {};
- const auto* syms = &keyboard_mapping_.keysyms[(key - min_key) * n_keysyms];
- while ((n_keysyms > 2) && (syms[n_keysyms - 1] == kNoSymbol))
- n_keysyms--;
- if ((n_keysyms > 2) && (modifiers & mode_switch_)) {
- syms += 2;
- n_keysyms -= 2;
- }
-
- if ((modifiers & num_lock_) &&
- (n_keysyms > 1 &&
- (IsXKeypadKey(syms[1]) || IsPrivateXKeypadKey(syms[1])))) {
- if ((modifiers & kShiftMask) ||
- ((modifiers & kLockMask) && (lock_meaning_ == XK_Shift_Lock))) {
- return syms[0];
- }
- return syms[1];
- }
-
- KeySym lower;
- KeySym upper;
- if (!(modifiers & kShiftMask) &&
- (!(modifiers & kLockMask) ||
- (static_cast<x11::KeySym>(lock_meaning_) == kNoSymbol))) {
- if ((n_keysyms == 1) || (syms[1] == kNoSymbol)) {
- ConvertCase(syms[0], &lower, &upper);
- return lower;
- }
- return syms[0];
- }
-
- if (!(modifiers & kLockMask) || (lock_meaning_ != XK_Caps_Lock)) {
- if ((n_keysyms == 1) || ((upper = syms[1]) == kNoSymbol))
- ConvertCase(syms[0], &lower, &upper);
- return upper;
- }
-
- KeySym sym;
- if ((n_keysyms == 1) || ((sym = syms[1]) == kNoSymbol))
- sym = syms[0];
- ConvertCase(sym, &lower, &upper);
- if (!(modifiers & kShiftMask) && (sym != syms[0]) &&
- ((sym != upper) || (lower == upper)))
- ConvertCase(syms[0], &lower, &upper);
- return upper;
+uint32_t Connection::GenerateIdImpl() {
+ return xcb_generate_id(connection_);
}
} // namespace x11
diff --git a/chromium/ui/gfx/x/connection.h b/chromium/ui/gfx/x/connection.h
index 1e0fa6c2300..6b16ae22dc2 100644
--- a/chromium/ui/gfx/x/connection.h
+++ b/chromium/ui/gfx/x/connection.h
@@ -5,22 +5,30 @@
#ifndef UI_GFX_X_CONNECTION_H_
#define UI_GFX_X_CONNECTION_H_
-#include <list>
#include <queue>
#include "base/component_export.h"
+#include "base/containers/circular_deque.h"
#include "base/sequence_checker.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/x/event.h"
#include "ui/gfx/x/extension_manager.h"
+#include "ui/gfx/x/xlib_support.h"
#include "ui/gfx/x/xproto.h"
+typedef struct xcb_connection_t xcb_connection_t;
+
namespace x11 {
+class KeyboardState;
+
// Represents a socket to the X11 server.
class COMPONENT_EXPORT(X11) Connection : public XProto,
public ExtensionManager {
public:
+ using ErrorHandler = base::RepeatingCallback<void(const Error*, const char*)>;
+ using IOErrorHandler = base::OnceClosure;
+
class Delegate {
public:
virtual bool ShouldContinueStream() const = 0;
@@ -47,12 +55,16 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
Connection(const Connection&) = delete;
Connection(Connection&&) = delete;
- XDisplay* display() const {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- return display_;
- }
xcb_connection_t* XcbConnection();
+ // Obtain an Xlib display that's connected to the same server as |this|. This
+ // is meant to be used only for compatibility with components like GLX,
+ // Vulkan, and VAAPI. The underlying socket is not shared, so synchronization
+ // with |this| may be necessary. The |type| parameter can be used to achieve
+ // synchronization. The returned wrapper should not be saved.
+ XlibDisplayWrapper GetXlibDisplay(
+ XlibDisplayType type = XlibDisplayType::kNormal);
+
uint32_t extended_max_request_length() const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return extended_max_request_length_;
@@ -85,12 +97,14 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
const std::string& DisplayString() const;
+ std::string GetConnectionHostname() const;
+
int DefaultScreenId() const;
template <typename T>
T GenerateId() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- return static_cast<T>(xcb_generate_id(XcbConnection()));
+ return static_cast<T>(GenerateIdImpl());
}
// Is the connection up and error-free?
@@ -113,21 +127,28 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
Event WaitForNextEvent();
// Are there any events, errors, or replies already buffered?
- bool HasPendingResponses() const;
+ bool HasPendingResponses();
// Dispatch any buffered events, errors, or replies.
void Dispatch(Delegate* delegate);
+ // Returns the old error handler.
+ ErrorHandler SetErrorHandler(ErrorHandler new_handler);
+
+ void SetIOErrorHandler(IOErrorHandler new_handler);
+
// Returns the visual data for |id|, or nullptr if the visual with that ID
// doesn't exist or only exists on a non-default screen.
const VisualInfo* GetVisualInfoFromId(VisualId id) const;
- KeyCode KeysymToKeycode(KeySym keysym);
+ KeyCode KeysymToKeycode(uint32_t keysym) const;
- KeySym KeycodeToKeysym(uint32_t keycode, unsigned int modifiers);
+ uint32_t KeycodeToKeysym(KeyCode keycode, uint32_t modifiers) const;
- // Access the event buffer. Clients can add, delete, or modify events.
- std::list<Event>& events() {
+ // Access the event buffer. Clients may modify the queue, including
+ // "deleting" events by setting events[i] = x11::Event(), which will
+ // guarantee all calls to x11::Event::As() will return nullptr.
+ base::circular_deque<Event>& events() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return events_;
}
@@ -153,25 +174,32 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
const unsigned int sequence;
FutureBase::ResponseCallback callback;
+ bool have_response = false;
+ FutureBase::RawReply reply;
+ FutureBase::RawError error;
};
void InitRootDepthAndVisual();
void AddRequest(unsigned int sequence, FutureBase::ResponseCallback callback);
- bool HasNextResponse() const;
+ bool HasNextResponse();
+
+ bool HasNextEvent();
void PreDispatchEvent(const Event& event);
int ScreenIndexFromRootWindow(x11::Window root) const;
- void ResetKeyboardState();
+ // This function is implemented in the generated read_error.cc.
+ void InitErrorParsers();
- KeySym KeyCodetoKeySym(KeyCode keycode, int column) const;
+ std::unique_ptr<Error> ParseError(FutureBase::RawError error_bytes);
- KeySym TranslateKey(uint32_t keycode, unsigned int modifiers) const;
+ uint32_t GenerateIdImpl();
- XDisplay* const display_;
+ xcb_connection_t* connection_ = nullptr;
+ std::unique_ptr<XlibDisplay> xlib_display_;
bool synchronous_ = false;
bool syncing_ = false;
@@ -187,17 +215,19 @@ class COMPONENT_EXPORT(X11) Connection : public XProto,
std::unordered_map<VisualId, VisualInfo> default_screen_visuals_;
- // Keyboard state.
- GetKeyboardMappingReply keyboard_mapping_;
- GetModifierMappingReply modifier_mapping_;
- uint16_t lock_meaning_ = 0;
- uint8_t mode_switch_ = 0;
- uint8_t num_lock_ = 0;
+ std::unique_ptr<KeyboardState> keyboard_state_;
- std::list<Event> events_;
+ base::circular_deque<Event> events_;
std::queue<Request> requests_;
+ using ErrorParser =
+ std::unique_ptr<Error> (*)(FutureBase::RawError error_bytes);
+ std::array<ErrorParser, 256> error_parsers_{};
+
+ ErrorHandler error_handler_;
+ IOErrorHandler io_error_handler_;
+
SEQUENCE_CHECKER(sequence_checker_);
};
diff --git a/chromium/ui/gfx/x/connection_unittest.cc b/chromium/ui/gfx/x/connection_unittest.cc
index 42e581c69cc..4f140e05aea 100644
--- a/chromium/ui/gfx/x/connection_unittest.cc
+++ b/chromium/ui/gfx/x/connection_unittest.cc
@@ -37,13 +37,13 @@ Window CreateWindow(Connection* connection) {
TEST(X11ConnectionTest, Basic) {
Connection connection;
ASSERT_TRUE(connection.XcbConnection());
- EXPECT_FALSE(xcb_connection_has_error(connection.XcbConnection()));
+ EXPECT_TRUE(connection.Ready());
}
TEST(X11ConnectionTest, Request) {
Connection connection;
ASSERT_TRUE(connection.XcbConnection());
- EXPECT_FALSE(xcb_connection_has_error(connection.XcbConnection()));
+ EXPECT_TRUE(connection.Ready());
Window window = CreateWindow(&connection);
@@ -63,7 +63,7 @@ TEST(X11ConnectionTest, Request) {
TEST(X11ConnectionTest, Event) {
Connection connection;
ASSERT_TRUE(connection.XcbConnection());
- EXPECT_FALSE(xcb_connection_has_error(connection.XcbConnection()));
+ EXPECT_TRUE(connection.Ready());
Window window = CreateWindow(&connection);
@@ -95,15 +95,17 @@ TEST(X11ConnectionTest, Event) {
TEST(X11ConnectionTest, Error) {
Connection connection;
ASSERT_TRUE(connection.XcbConnection());
- EXPECT_FALSE(xcb_connection_has_error(connection.XcbConnection()));
+ EXPECT_TRUE(connection.Ready());
Window invalid_window = connection.GenerateId<Window>();
auto geometry = connection.GetGeometry({invalid_window}).Sync();
ASSERT_FALSE(geometry);
- xcb_generic_error_t* error = geometry.error.get();
- EXPECT_EQ(error->error_code, XCB_DRAWABLE);
- EXPECT_EQ(error->resource_id, static_cast<uint32_t>(invalid_window));
+ auto* error = geometry.error.get();
+ ASSERT_TRUE(error);
+ // TODO(thomasanderson): Implement As<> for errors, similar to events.
+ auto* drawable_error = reinterpret_cast<x11::DrawableError*>(error);
+ EXPECT_EQ(drawable_error->bad_value, static_cast<uint32_t>(invalid_window));
}
} // namespace x11
diff --git a/chromium/ui/gfx/x/error.cc b/chromium/ui/gfx/x/error.cc
new file mode 100644
index 00000000000..f33de1a474a
--- /dev/null
+++ b/chromium/ui/gfx/x/error.cc
@@ -0,0 +1,13 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/x/error.h"
+
+namespace x11 {
+
+Error::Error() = default;
+
+Error::~Error() = default;
+
+} // namespace x11
diff --git a/chromium/ui/gfx/x/error.h b/chromium/ui/gfx/x/error.h
new file mode 100644
index 00000000000..a9de90bfab5
--- /dev/null
+++ b/chromium/ui/gfx/x/error.h
@@ -0,0 +1,26 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_X_ERROR_H_
+#define UI_GFX_X_ERROR_H_
+
+#include <string>
+
+#include "base/component_export.h"
+
+namespace x11 {
+
+// This class is a generic interface for X11 errors. Currently the only
+// functionality is printing the error as a human-readable string.
+class COMPONENT_EXPORT(X11) Error {
+ public:
+ Error();
+ virtual ~Error();
+
+ virtual std::string ToString() const = 0;
+};
+
+} // namespace x11
+
+#endif // UI_GFX_X_ERROR_H_
diff --git a/chromium/ui/gfx/x/event.cc b/chromium/ui/gfx/x/event.cc
index 41cd3649702..3d0637ca39b 100644
--- a/chromium/ui/gfx/x/event.cc
+++ b/chromium/ui/gfx/x/event.cc
@@ -19,19 +19,6 @@ namespace x11 {
Event::Event() = default;
-Event::Event(xcb_generic_event_t* xcb_event,
- x11::Connection* connection,
- bool sequence_valid)
- : Event(base::MakeRefCounted<x11::UnretainedRefCountedMemory>(xcb_event),
- connection,
- sequence_valid) {
- // Make sure the event is a fixed-size (32 bytes) event, otherwise
- // UnretainedRefCountedMemory may be unsafe to use if the event contains
- // variable-sized data.
- DCHECK_NE(xcb_event->response_type & ~x11::kSendEventMask,
- x11::GeGenericEvent::opcode);
-}
-
Event::Event(scoped_refptr<base::RefCountedMemory> event_bytes,
x11::Connection* connection,
bool sequence_valid) {
diff --git a/chromium/ui/gfx/x/event.h b/chromium/ui/gfx/x/event.h
index 7e3d41dc7ce..c13e94228b6 100644
--- a/chromium/ui/gfx/x/event.h
+++ b/chromium/ui/gfx/x/event.h
@@ -38,9 +38,7 @@ class COMPONENT_EXPORT(X11) Event {
}
Event();
- Event(xcb_generic_event_t* xcb_event,
- Connection* connection,
- bool sequence_valid = true);
+
// |event_bytes| is modified and will not be valid after this call.
// A copy is necessary if the original data is still needed.
Event(scoped_refptr<base::RefCountedMemory> event_bytes,
@@ -76,6 +74,8 @@ class COMPONENT_EXPORT(X11) Event {
*window_ = window;
}
+ bool Initialized() const { return deleter_; }
+
private:
friend void ReadEvent(Event* event,
Connection* connection,
diff --git a/chromium/ui/gfx/x/gen_xproto.py b/chromium/ui/gfx/x/gen_xproto.py
index 391779422fc..94df052aa4f 100644
--- a/chromium/ui/gfx/x/gen_xproto.py
+++ b/chromium/ui/gfx/x/gen_xproto.py
@@ -919,6 +919,14 @@ class GenXproto(FileWriter):
self.write('x11::Window* GetWindow() { return %s; }' % ret)
self.write()
+ def declare_error(self, error, name):
+ name = adjust_type_name(name[-1] + 'Error')
+ with Indent(self, 'struct %s : public x11::Error {' % name, '};'):
+ self.declare_fields(error.fields)
+ self.write()
+ self.write('std::string ToString() const override;')
+ self.write()
+
def declare_container(self, struct, struct_name):
name = struct_name[-1] + self.type_suffix(struct)
with Indent(self, 'struct %s {' % adjust_type_name(name), '};'):
@@ -1025,8 +1033,9 @@ class GenXproto(FileWriter):
self.write('Align(&buf, 4);')
self.write()
reply_has_fds = reply and any(field.isfd for field in reply.fields)
- self.write('return x11::SendRequest<%s>(connection_, &buf, %s);' %
- (reply_name, 'true' if reply_has_fds else 'false'))
+ self.write(
+ 'return x11::SendRequest<%s>(connection_, &buf, %s, "%s");' %
+ (reply_name, 'true' if reply_has_fds else 'false', prefix))
self.write()
if not reply:
@@ -1066,6 +1075,29 @@ class GenXproto(FileWriter):
self.write('DCHECK_LE(buf.offset, 32ul);')
self.write()
+ def define_error(self, error, name):
+ self.namespace = ['x11']
+ name = self.qualtype(error, name)
+ with Indent(self, 'std::string %s::ToString() const {' % name, '}'):
+ self.write('std::stringstream ss_;')
+ self.write('ss_ << "x11::%s{";' % name)
+ fields = [field for field in error.fields if field.visible]
+ for i, field in enumerate(fields):
+ terminator = '' if i == len(fields) - 1 else ' << ", "'
+ self.write('ss_ << ".%s = " << static_cast<uint64_t>(%s)%s;' %
+ (field.field_name, field.field_name, terminator))
+ self.write('ss_ << "}";')
+ self.write('return ss_.str();')
+ self.write()
+ self.write('template <>')
+ self.write('void ReadError<%s>(' % name)
+ with Indent(self, ' %s* error_, ReadBuffer* buffer) {' % name, '}'):
+ self.write('auto& buf = *buffer;')
+ self.write()
+ self.is_read = True
+ self.copy_container(error, '(*error_)')
+ self.write('DCHECK_LE(buf.offset, 32ul);')
+
def define_type(self, item, name):
if name in READ_SPECIAL:
self.read_special_container(item, name)
@@ -1075,6 +1107,8 @@ class GenXproto(FileWriter):
self.define_request(item)
elif item.is_event:
self.define_event(item, name)
+ elif isinstance(item, self.xcbgen.xtypes.Error):
+ self.define_error(item, name)
def declare_type(self, item, name):
if item.is_union:
@@ -1083,6 +1117,8 @@ class GenXproto(FileWriter):
self.declare_request(item)
elif item.is_event:
self.declare_event(item, name)
+ elif isinstance(item, self.xcbgen.xtypes.Error):
+ self.declare_error(item, name)
elif item.is_container:
self.declare_container(item, name)
elif isinstance(item, self.xcbgen.xtypes.Enum):
@@ -1314,6 +1350,7 @@ class GenXproto(FileWriter):
self.write('#include "base/memory/scoped_refptr.h"')
self.write('#include "base/optional.h"')
self.write('#include "base/files/scoped_file.h"')
+ self.write('#include "ui/gfx/x/error.h"')
self.write('#include "ui/gfx/x/xproto_types.h"')
imports = set(self.module.direct_imports)
if self.module.namespace.is_ext:
@@ -1493,6 +1530,8 @@ class GenExtensionManager(FileWriter):
self.write(
'auto %s_future = conn->QueryExtension({"%s"});' %
(extension.proto, extension.module.namespace.ext_xname))
+ # Flush so all requests are sent before waiting on any replies.
+ self.write('conn->Flush();')
self.write()
for extension in self.extensions:
name = extension.proto
@@ -1578,6 +1617,8 @@ class GenReadEvent(FileWriter):
self.file = open(os.path.join(self.gen_dir, 'read_event.cc'), 'w')
self.write('#include "ui/gfx/x/event.h"')
self.write()
+ self.write('#include <xcb/xcb.h>')
+ self.write()
self.write('#include "ui/gfx/x/connection.h"')
for genproto in self.genprotos:
self.write('#include "ui/gfx/x/%s.h"' % genproto.proto)
@@ -1601,6 +1642,90 @@ class GenReadEvent(FileWriter):
self.write('} // namespace x11')
+class GenReadError(FileWriter):
+ def __init__(self, gen_dir, genprotos, xcbgen):
+ FileWriter.__init__(self)
+
+ self.gen_dir = gen_dir
+ self.genprotos = genprotos
+ self.xcbgen = xcbgen
+
+ def get_errors_for_proto(self, proto):
+ errors = {}
+ for _, item in proto.module.all:
+ if isinstance(item, self.xcbgen.xtypes.Error):
+ for name in item.opcodes:
+ id = int(item.opcodes[name])
+ if id < 0:
+ continue
+ name = [adjust_type_name(part) for part in name[1:]]
+ typename = '::'.join(name) + 'Error'
+ errors[id] = typename
+ return errors
+
+ def gen_errors_for_proto(self, errors, proto):
+ if proto.module.namespace.is_ext:
+ cond = 'if (%s().present()) {' % proto.proto
+ first_error = '%s().first_error()' % proto.proto
+ else:
+ cond = '{'
+ first_error = '0'
+ with Indent(self, cond, '}'):
+ self.write('uint8_t first_error = %s;' % first_error)
+ for id, name in sorted(errors.items()):
+ with Indent(self, '{', '}'):
+ self.write('auto error_code = first_error + %d;' % id)
+ self.write('auto parse = MakeError<%s>;' % name)
+ self.write('add_parser(error_code, first_error, parse);')
+ self.write()
+
+ def gen_init_error_parsers(self):
+ self.write('uint8_t first_errors[256];')
+ self.write('memset(first_errors, 0, sizeof(first_errors));')
+ self.write()
+ args = 'uint8_t error_code, uint8_t first_error, ErrorParser parser'
+ with Indent(self, 'auto add_parser = [&](%s) {' % args, '};'):
+ cond = ('!error_parsers_[error_code] || ' +
+ 'first_error > first_errors[error_code]')
+ with Indent(self, 'if (%s) {' % cond, '}'):
+ self.write('first_errors[error_code] = error_code;')
+ self.write('error_parsers_[error_code] = parser;')
+ self.write()
+ for proto in self.genprotos:
+ errors = self.get_errors_for_proto(proto)
+ if errors:
+ self.gen_errors_for_proto(errors, proto)
+
+ def gen_source(self):
+ self.file = open(os.path.join(self.gen_dir, 'read_error.cc'), 'w')
+ self.write('#include "ui/gfx/x/connection.h"')
+ self.write('#include "ui/gfx/x/error.h"')
+ self.write('#include "ui/gfx/x/xproto_internal.h"')
+ self.write()
+ for genproto in self.genprotos:
+ self.write('#include "ui/gfx/x/%s.h"' % genproto.proto)
+ self.write()
+ self.write('namespace x11 {')
+ self.write()
+ self.write('namespace {')
+ self.write()
+ self.write('template <typename T>')
+ sig = 'std::unique_ptr<Error> MakeError(FutureBase::RawError error_)'
+ with Indent(self, '%s {' % sig, '}'):
+ self.write('ReadBuffer buf(error_);')
+ self.write('auto error = std::make_unique<T>();')
+ self.write('ReadError(error.get(), &buf);')
+ self.write('return error;')
+ self.write()
+ self.write('} // namespace')
+ self.write()
+ with Indent(self, 'void Connection::InitErrorParsers() {', '}'):
+ self.gen_init_error_parsers()
+
+ self.write()
+ self.write('} // namespace x11')
+
+
def main():
parser = argparse.ArgumentParser()
parser.add_argument('xcbproto_dir', type=str)
@@ -1639,8 +1764,9 @@ def main():
gen_extension_manager.gen_header()
gen_extension_manager.gen_source()
- gen_read_event = GenReadEvent(args.gen_dir, genprotos)
- gen_read_event.gen_source()
+ GenReadEvent(args.gen_dir, genprotos).gen_source()
+
+ GenReadError(args.gen_dir, genprotos, xcbgen).gen_source()
return 0
diff --git a/chromium/ui/gfx/x/keyboard_state.cc b/chromium/ui/gfx/x/keyboard_state.cc
new file mode 100644
index 00000000000..3ca1e8084bc
--- /dev/null
+++ b/chromium/ui/gfx/x/keyboard_state.cc
@@ -0,0 +1,136 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/x/keyboard_state.h"
+
+#include "base/i18n/case_conversion.h"
+#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/keysyms/keysyms.h"
+#include "ui/gfx/x/xkb.h"
+#include "ui/gfx/x/xproto.h"
+
+namespace x11 {
+
+namespace {
+
+constexpr KeySym kNoSymbol = static_cast<KeySym>(0);
+
+void ConvertCaseImpl(uint32_t sym, uint32_t* lower, uint32_t* upper);
+
+void ConvertCase(KeySym sym, KeySym* lower, KeySym* upper) {
+ uint32_t lower32;
+ uint32_t upper32;
+ ConvertCaseImpl(static_cast<uint32_t>(sym), &lower32, &upper32);
+ *lower = static_cast<KeySym>(lower32);
+ *upper = static_cast<KeySym>(upper32);
+}
+
+bool IsPublicOrPrivateKeypadKey(KeySym keysym) {
+ auto key = static_cast<uint32_t>(keysym);
+ return (key >= XK_KP_Space && key <= XK_KP_Equal) ||
+ (key >= 0x11000000 && key <= 0x1100FFFF);
+}
+
+int GetXkbGroupFromState(int state) {
+ return (state >> 13) & 0x3;
+}
+
+#include "third_party/libx11/src/KeyBind.c"
+#include "third_party/libx11/src/xkb/XKBBind.c"
+#include "third_party/libxcb-keysyms/keysyms/keysyms.c"
+
+} // namespace
+
+KeyboardState::KeyboardState() = default;
+
+KeyboardState::~KeyboardState() = default;
+
+// Non-XKB (core protocol) implementation of KeysymToKeycode and
+// KeycodeToKeysym.
+class CoreKeyboardState : public KeyboardState {
+ public:
+ explicit CoreKeyboardState(Connection* connection) : connection_(connection) {
+ UpdateMapping();
+ }
+
+ ~CoreKeyboardState() override = default;
+
+ KeyCode KeysymToKeycode(uint32_t keysym) const override {
+ auto min_keycode = static_cast<uint8_t>(connection_->setup().min_keycode);
+ auto max_keycode = static_cast<uint8_t>(connection_->setup().max_keycode);
+ int count = max_keycode - min_keycode + 1;
+ DCHECK_EQ(count * keyboard_mapping_.keysyms_per_keycode,
+ static_cast<int>(keyboard_mapping_.keysyms.size()));
+ for (size_t i = 0; i < keyboard_mapping_.keysyms.size(); i++) {
+ auto keycode = min_keycode + i / keyboard_mapping_.keysyms_per_keycode;
+ if (keyboard_mapping_.keysyms[i] == static_cast<x11::KeySym>(keysym))
+ return static_cast<KeyCode>(keycode);
+ }
+ return {};
+ }
+
+ uint32_t KeycodeToKeysym(KeyCode keycode, uint32_t modifiers) const override {
+ auto sym = static_cast<uint32_t>(KeycodeToKeysymCoreImpl(
+ keycode, modifiers, connection_, keyboard_mapping_, lock_meaning_,
+ mode_switch_, num_lock_));
+ return sym == XK_VoidSymbol ? 0 : sym;
+ }
+
+ private:
+ void UpdateMapping() override {
+ UpdateMappingImpl(connection_, &keyboard_mapping_, &lock_meaning_,
+ &mode_switch_, &num_lock_);
+ }
+
+ x11::Connection* const connection_;
+ GetKeyboardMappingReply keyboard_mapping_;
+ uint16_t lock_meaning_ = 0;
+ uint8_t mode_switch_ = 0;
+ uint8_t num_lock_ = 0;
+};
+
+// XKB implementation of KeysymToKeycode and KeycodeToKeysym.
+class XkbKeyboardState : public KeyboardState {
+ public:
+ explicit XkbKeyboardState(Connection* connection) : connection_(connection) {
+ UpdateMapping();
+ }
+
+ ~XkbKeyboardState() override = default;
+
+ KeyCode KeysymToKeycode(uint32_t keysym) const override {
+ int first_keycode = static_cast<int>(map_.firstKeySym);
+ for (int keycode = 0; keycode < map_.nKeySyms; keycode++) {
+ for (auto sym : map_.syms_rtrn->at(keycode).syms) {
+ if (static_cast<uint32_t>(sym) == keysym)
+ return static_cast<KeyCode>(keycode + first_keycode);
+ }
+ }
+ return {};
+ }
+
+ uint32_t KeycodeToKeysym(KeyCode key, uint32_t modifiers) const override {
+ return KeycodeToKeysymXkbImpl(key, modifiers, map_);
+ }
+
+ private:
+ void UpdateMapping() override {
+ auto future = connection_->xkb().GetMap(
+ {static_cast<Xkb::DeviceSpec>(Xkb::Id::UseCoreKbd),
+ Xkb::MapPart::KeyTypes | Xkb::MapPart::KeySyms});
+ if (auto response = future.Sync())
+ map_ = std::move(*response.reply);
+ }
+
+ x11::Connection* const connection_;
+ Xkb::GetMapReply map_;
+};
+
+std::unique_ptr<KeyboardState> CreateKeyboardState(Connection* connection) {
+ if (connection->xkb().present())
+ return std::make_unique<XkbKeyboardState>(connection);
+ return std::make_unique<CoreKeyboardState>(connection);
+}
+
+} // namespace x11
diff --git a/chromium/ui/gfx/x/keyboard_state.h b/chromium/ui/gfx/x/keyboard_state.h
new file mode 100644
index 00000000000..d28fe595f39
--- /dev/null
+++ b/chromium/ui/gfx/x/keyboard_state.h
@@ -0,0 +1,37 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_X_KEYBOARD_STATE_H_
+#define UI_GFX_X_KEYBOARD_STATE_H_
+
+#include <memory>
+
+#include "ui/gfx/x/xproto.h"
+
+namespace x11 {
+
+class Connection;
+
+// This is an interface used by Connection to manage conversion between keycodes
+// (8 bit values) and keysyms (32 bit values).
+class KeyboardState {
+ public:
+ KeyboardState();
+ virtual ~KeyboardState();
+
+ virtual KeyCode KeysymToKeycode(uint32_t keysym) const = 0;
+ virtual uint32_t KeycodeToKeysym(KeyCode keycode,
+ uint32_t modifiers) const = 0;
+
+ private:
+ friend class Connection;
+
+ virtual void UpdateMapping() = 0;
+};
+
+std::unique_ptr<KeyboardState> CreateKeyboardState(Connection* connection);
+
+} // namespace x11
+
+#endif // UI_GFX_X_KEYBOARD_STATE_H_
diff --git a/chromium/ui/gfx/x/keysyms/keysyms.h b/chromium/ui/gfx/x/keysyms/keysyms.h
index 4d5fbcbcedb..c43ca1a4072 100644
--- a/chromium/ui/gfx/x/keysyms/keysyms.h
+++ b/chromium/ui/gfx/x/keysyms/keysyms.h
@@ -7,1155 +7,6 @@
#include <cstdint>
-static constexpr uint32_t XK_space = 0x20;
-static constexpr uint32_t XK_exclam = 0x21;
-static constexpr uint32_t XK_quotedbl = 0x22;
-static constexpr uint32_t XK_numbersign = 0x23;
-static constexpr uint32_t XK_dollar = 0x24;
-static constexpr uint32_t XK_percent = 0x25;
-static constexpr uint32_t XK_ampersand = 0x26;
-static constexpr uint32_t XK_quoteright = 0x27;
-static constexpr uint32_t XK_parenleft = 0x28;
-static constexpr uint32_t XK_parenright = 0x29;
-static constexpr uint32_t XK_asterisk = 0x2A;
-static constexpr uint32_t XK_plus = 0x2B;
-static constexpr uint32_t XK_comma = 0x2C;
-static constexpr uint32_t XK_minus = 0x2D;
-static constexpr uint32_t XK_period = 0x2E;
-static constexpr uint32_t XK_slash = 0x2F;
-static constexpr uint32_t XK_0 = 0x30;
-static constexpr uint32_t XK_1 = 0x31;
-static constexpr uint32_t XK_2 = 0x32;
-static constexpr uint32_t XK_3 = 0x33;
-static constexpr uint32_t XK_4 = 0x34;
-static constexpr uint32_t XK_5 = 0x35;
-static constexpr uint32_t XK_6 = 0x36;
-static constexpr uint32_t XK_7 = 0x37;
-static constexpr uint32_t XK_8 = 0x38;
-static constexpr uint32_t XK_9 = 0x39;
-static constexpr uint32_t XK_colon = 0x3A;
-static constexpr uint32_t XK_semicolon = 0x3B;
-static constexpr uint32_t XK_less = 0x3C;
-static constexpr uint32_t XK_equal = 0x3D;
-static constexpr uint32_t XK_greater = 0x3E;
-static constexpr uint32_t XK_question = 0x3F;
-static constexpr uint32_t XK_at = 0x40;
-static constexpr uint32_t XK_A = 0x41;
-static constexpr uint32_t XK_Z = 0x5A;
-static constexpr uint32_t XK_bracketleft = 0x5B;
-static constexpr uint32_t XK_backslash = 0x5C;
-static constexpr uint32_t XK_bracketright = 0x5D;
-static constexpr uint32_t XK_asciicircum = 0x5E;
-static constexpr uint32_t XK_underscore = 0x5F;
-static constexpr uint32_t XK_quoteleft = 0x60;
-static constexpr uint32_t XK_a = 0x61;
-static constexpr uint32_t XK_z = 0x7A;
-static constexpr uint32_t XK_braceleft = 0x7B;
-static constexpr uint32_t XK_bar = 0x7C;
-static constexpr uint32_t XK_braceright = 0x7D;
-static constexpr uint32_t XK_asciitilde = 0x7E;
-static constexpr uint32_t XK_exclamdown = 0xA1;
-static constexpr uint32_t XK_brokenbar = 0xA6;
-static constexpr uint32_t XK_guillemotleft = 0xAB;
-static constexpr uint32_t XK_degree = 0xB0;
-static constexpr uint32_t XK_periodcentered = 0xB7;
-static constexpr uint32_t XK_guillemotright = 0xBB;
-static constexpr uint32_t XK_questiondown = 0xBF;
-static constexpr uint32_t XK_Agrave = 0xC0;
-static constexpr uint32_t XK_Odiaeresis = 0xD6;
-static constexpr uint32_t XK_multiply = 0xD7;
-static constexpr uint32_t XK_Ooblique = 0xD8;
-static constexpr uint32_t XK_Ugrave = 0xD9;
-static constexpr uint32_t XK_Thorn = 0xDE;
-static constexpr uint32_t XK_agrave = 0xE0;
-static constexpr uint32_t XK_odiaeresis = 0xF6;
-static constexpr uint32_t XK_oslash = 0xF8;
-static constexpr uint32_t XK_ugrave = 0xF9;
-static constexpr uint32_t XK_thorn = 0xFE;
-static constexpr uint32_t XK_ydiaeresis = 0xFF;
-static constexpr uint32_t XK_Aogonek = 0x1A1;
-static constexpr uint32_t XK_breve = 0x1A2;
-static constexpr uint32_t XK_Lstroke = 0x1A3;
-static constexpr uint32_t XK_Lcaron = 0x1A5;
-static constexpr uint32_t XK_Sacute = 0x1A6;
-static constexpr uint32_t XK_Scaron = 0x1A9;
-static constexpr uint32_t XK_Scedilla = 0x1AA;
-static constexpr uint32_t XK_Tcaron = 0x1AB;
-static constexpr uint32_t XK_Zacute = 0x1AC;
-static constexpr uint32_t XK_Zcaron = 0x1AE;
-static constexpr uint32_t XK_Zabovedot = 0x1AF;
-static constexpr uint32_t XK_aogonek = 0x1B1;
-static constexpr uint32_t XK_ogonek = 0x1B2;
-static constexpr uint32_t XK_lstroke = 0x1B3;
-static constexpr uint32_t XK_lcaron = 0x1B5;
-static constexpr uint32_t XK_sacute = 0x1B6;
-static constexpr uint32_t XK_caron = 0x1B7;
-static constexpr uint32_t XK_scaron = 0x1B9;
-static constexpr uint32_t XK_scedilla = 0x1BA;
-static constexpr uint32_t XK_tcaron = 0x1BB;
-static constexpr uint32_t XK_zacute = 0x1BC;
-static constexpr uint32_t XK_doubleacute = 0x1BD;
-static constexpr uint32_t XK_zcaron = 0x1BE;
-static constexpr uint32_t XK_zabovedot = 0x1BF;
-static constexpr uint32_t XK_Racute = 0x1C0;
-static constexpr uint32_t XK_Abreve = 0x1C3;
-static constexpr uint32_t XK_Lacute = 0x1C5;
-static constexpr uint32_t XK_Cacute = 0x1C6;
-static constexpr uint32_t XK_Ccaron = 0x1C8;
-static constexpr uint32_t XK_Eogonek = 0x1CA;
-static constexpr uint32_t XK_Ecaron = 0x1CC;
-static constexpr uint32_t XK_Dcaron = 0x1CF;
-static constexpr uint32_t XK_Dstroke = 0x1D0;
-static constexpr uint32_t XK_Nacute = 0x1D1;
-static constexpr uint32_t XK_Ncaron = 0x1D2;
-static constexpr uint32_t XK_Odoubleacute = 0x1D5;
-static constexpr uint32_t XK_Rcaron = 0x1D8;
-static constexpr uint32_t XK_Uring = 0x1D9;
-static constexpr uint32_t XK_Udoubleacute = 0x1DB;
-static constexpr uint32_t XK_Tcedilla = 0x1DE;
-static constexpr uint32_t XK_racute = 0x1E0;
-static constexpr uint32_t XK_abreve = 0x1E3;
-static constexpr uint32_t XK_lacute = 0x1E5;
-static constexpr uint32_t XK_cacute = 0x1E6;
-static constexpr uint32_t XK_ccaron = 0x1E8;
-static constexpr uint32_t XK_eogonek = 0x1EA;
-static constexpr uint32_t XK_ecaron = 0x1EC;
-static constexpr uint32_t XK_dcaron = 0x1EF;
-static constexpr uint32_t XK_dstroke = 0x1F0;
-static constexpr uint32_t XK_nacute = 0x1F1;
-static constexpr uint32_t XK_ncaron = 0x1F2;
-static constexpr uint32_t XK_odoubleacute = 0x1F5;
-static constexpr uint32_t XK_rcaron = 0x1F8;
-static constexpr uint32_t XK_uring = 0x1F9;
-static constexpr uint32_t XK_udoubleacute = 0x1FB;
-static constexpr uint32_t XK_tcedilla = 0x1FE;
-static constexpr uint32_t XK_abovedot = 0x1FF;
-static constexpr uint32_t XK_Hstroke = 0x2A1;
-static constexpr uint32_t XK_Hcircumflex = 0x2A6;
-static constexpr uint32_t XK_Iabovedot = 0x2A9;
-static constexpr uint32_t XK_Gbreve = 0x2AB;
-static constexpr uint32_t XK_Jcircumflex = 0x2AC;
-static constexpr uint32_t XK_hstroke = 0x2B1;
-static constexpr uint32_t XK_hcircumflex = 0x2B6;
-static constexpr uint32_t XK_idotless = 0x2B9;
-static constexpr uint32_t XK_gbreve = 0x2BB;
-static constexpr uint32_t XK_jcircumflex = 0x2BC;
-static constexpr uint32_t XK_Cabovedot = 0x2C5;
-static constexpr uint32_t XK_Ccircumflex = 0x2C6;
-static constexpr uint32_t XK_Gabovedot = 0x2D5;
-static constexpr uint32_t XK_Gcircumflex = 0x2D8;
-static constexpr uint32_t XK_Ubreve = 0x2DD;
-static constexpr uint32_t XK_Scircumflex = 0x2DE;
-static constexpr uint32_t XK_cabovedot = 0x2E5;
-static constexpr uint32_t XK_ccircumflex = 0x2E6;
-static constexpr uint32_t XK_gabovedot = 0x2F5;
-static constexpr uint32_t XK_gcircumflex = 0x2F8;
-static constexpr uint32_t XK_ubreve = 0x2FD;
-static constexpr uint32_t XK_scircumflex = 0x2FE;
-static constexpr uint32_t XK_kra = 0x3A2;
-static constexpr uint32_t XK_Rcedilla = 0x3A3;
-static constexpr uint32_t XK_Itilde = 0x3A5;
-static constexpr uint32_t XK_Lcedilla = 0x3A6;
-static constexpr uint32_t XK_Emacron = 0x3AA;
-static constexpr uint32_t XK_Gcedilla = 0x3AB;
-static constexpr uint32_t XK_Tslash = 0x3AC;
-static constexpr uint32_t XK_rcedilla = 0x3B3;
-static constexpr uint32_t XK_itilde = 0x3B5;
-static constexpr uint32_t XK_lcedilla = 0x3B6;
-static constexpr uint32_t XK_emacron = 0x3BA;
-static constexpr uint32_t XK_gcedilla = 0x3BB;
-static constexpr uint32_t XK_tslash = 0x3BC;
-static constexpr uint32_t XK_ENG = 0x3BD;
-static constexpr uint32_t XK_eng = 0x3BF;
-static constexpr uint32_t XK_Amacron = 0x3C0;
-static constexpr uint32_t XK_Iogonek = 0x3C7;
-static constexpr uint32_t XK_Eabovedot = 0x3CC;
-static constexpr uint32_t XK_Imacron = 0x3CF;
-static constexpr uint32_t XK_Ncedilla = 0x3D1;
-static constexpr uint32_t XK_Omacron = 0x3D2;
-static constexpr uint32_t XK_Kcedilla = 0x3D3;
-static constexpr uint32_t XK_Uogonek = 0x3D9;
-static constexpr uint32_t XK_Utilde = 0x3DD;
-static constexpr uint32_t XK_Umacron = 0x3DE;
-static constexpr uint32_t XK_amacron = 0x3E0;
-static constexpr uint32_t XK_iogonek = 0x3E7;
-static constexpr uint32_t XK_eabovedot = 0x3EC;
-static constexpr uint32_t XK_imacron = 0x3EF;
-static constexpr uint32_t XK_ncedilla = 0x3F1;
-static constexpr uint32_t XK_omacron = 0x3F2;
-static constexpr uint32_t XK_kcedilla = 0x3F3;
-static constexpr uint32_t XK_uogonek = 0x3F9;
-static constexpr uint32_t XK_utilde = 0x3FD;
-static constexpr uint32_t XK_umacron = 0x3FE;
-static constexpr uint32_t XK_overline = 0x47E;
-static constexpr uint32_t XK_kana_fullstop = 0x4A1;
-static constexpr uint32_t XK_kana_openingbracket = 0x4A2;
-static constexpr uint32_t XK_kana_closingbracket = 0x4A3;
-static constexpr uint32_t XK_kana_comma = 0x4A4;
-static constexpr uint32_t XK_kana_conjunctive = 0x4A5;
-static constexpr uint32_t XK_kana_WO = 0x4A6;
-static constexpr uint32_t XK_kana_a = 0x4A7;
-static constexpr uint32_t XK_kana_i = 0x4A8;
-static constexpr uint32_t XK_kana_u = 0x4A9;
-static constexpr uint32_t XK_kana_e = 0x4AA;
-static constexpr uint32_t XK_kana_o = 0x4AB;
-static constexpr uint32_t XK_kana_ya = 0x4AC;
-static constexpr uint32_t XK_kana_yu = 0x4AD;
-static constexpr uint32_t XK_kana_yo = 0x4AE;
-static constexpr uint32_t XK_kana_tsu = 0x4AF;
-static constexpr uint32_t XK_prolongedsound = 0x4B0;
-static constexpr uint32_t XK_kana_A = 0x4B1;
-static constexpr uint32_t XK_kana_I = 0x4B2;
-static constexpr uint32_t XK_kana_U = 0x4B3;
-static constexpr uint32_t XK_kana_E = 0x4B4;
-static constexpr uint32_t XK_kana_O = 0x4B5;
-static constexpr uint32_t XK_kana_KA = 0x4B6;
-static constexpr uint32_t XK_kana_KI = 0x4B7;
-static constexpr uint32_t XK_kana_KU = 0x4B8;
-static constexpr uint32_t XK_kana_KE = 0x4B9;
-static constexpr uint32_t XK_kana_KO = 0x4BA;
-static constexpr uint32_t XK_kana_SA = 0x4BB;
-static constexpr uint32_t XK_kana_SHI = 0x4BC;
-static constexpr uint32_t XK_kana_SU = 0x4BD;
-static constexpr uint32_t XK_kana_SE = 0x4BE;
-static constexpr uint32_t XK_kana_SO = 0x4BF;
-static constexpr uint32_t XK_kana_TA = 0x4C0;
-static constexpr uint32_t XK_kana_CHI = 0x4C1;
-static constexpr uint32_t XK_kana_TSU = 0x4C2;
-static constexpr uint32_t XK_kana_TE = 0x4C3;
-static constexpr uint32_t XK_kana_TO = 0x4C4;
-static constexpr uint32_t XK_kana_NA = 0x4C5;
-static constexpr uint32_t XK_kana_NI = 0x4C6;
-static constexpr uint32_t XK_kana_NU = 0x4C7;
-static constexpr uint32_t XK_kana_NE = 0x4C8;
-static constexpr uint32_t XK_kana_NO = 0x4C9;
-static constexpr uint32_t XK_kana_HA = 0x4CA;
-static constexpr uint32_t XK_kana_HI = 0x4CB;
-static constexpr uint32_t XK_kana_FU = 0x4CC;
-static constexpr uint32_t XK_kana_HE = 0x4CD;
-static constexpr uint32_t XK_kana_HO = 0x4CE;
-static constexpr uint32_t XK_kana_MA = 0x4CF;
-static constexpr uint32_t XK_kana_MI = 0x4D0;
-static constexpr uint32_t XK_kana_MU = 0x4D1;
-static constexpr uint32_t XK_kana_ME = 0x4D2;
-static constexpr uint32_t XK_kana_MO = 0x4D3;
-static constexpr uint32_t XK_kana_YA = 0x4D4;
-static constexpr uint32_t XK_kana_YU = 0x4D5;
-static constexpr uint32_t XK_kana_YO = 0x4D6;
-static constexpr uint32_t XK_kana_RA = 0x4D7;
-static constexpr uint32_t XK_kana_RI = 0x4D8;
-static constexpr uint32_t XK_kana_RU = 0x4D9;
-static constexpr uint32_t XK_kana_RE = 0x4DA;
-static constexpr uint32_t XK_kana_RO = 0x4DB;
-static constexpr uint32_t XK_kana_WA = 0x4DC;
-static constexpr uint32_t XK_kana_N = 0x4DD;
-static constexpr uint32_t XK_voicedsound = 0x4DE;
-static constexpr uint32_t XK_semivoicedsound = 0x4DF;
-static constexpr uint32_t XK_Arabic_comma = 0x5AC;
-static constexpr uint32_t XK_Arabic_semicolon = 0x5BB;
-static constexpr uint32_t XK_Arabic_question_mark = 0x5BF;
-static constexpr uint32_t XK_Arabic_hamza = 0x5C1;
-static constexpr uint32_t XK_Arabic_maddaonalef = 0x5C2;
-static constexpr uint32_t XK_Arabic_hamzaonalef = 0x5C3;
-static constexpr uint32_t XK_Arabic_hamzaonwaw = 0x5C4;
-static constexpr uint32_t XK_Arabic_hamzaunderalef = 0x5C5;
-static constexpr uint32_t XK_Arabic_hamzaonyeh = 0x5C6;
-static constexpr uint32_t XK_Arabic_alef = 0x5C7;
-static constexpr uint32_t XK_Arabic_beh = 0x5C8;
-static constexpr uint32_t XK_Arabic_tehmarbuta = 0x5C9;
-static constexpr uint32_t XK_Arabic_teh = 0x5CA;
-static constexpr uint32_t XK_Arabic_theh = 0x5CB;
-static constexpr uint32_t XK_Arabic_jeem = 0x5CC;
-static constexpr uint32_t XK_Arabic_hah = 0x5CD;
-static constexpr uint32_t XK_Arabic_khah = 0x5CE;
-static constexpr uint32_t XK_Arabic_dal = 0x5CF;
-static constexpr uint32_t XK_Arabic_thal = 0x5D0;
-static constexpr uint32_t XK_Arabic_ra = 0x5D1;
-static constexpr uint32_t XK_Arabic_zain = 0x5D2;
-static constexpr uint32_t XK_Arabic_seen = 0x5D3;
-static constexpr uint32_t XK_Arabic_sheen = 0x5D4;
-static constexpr uint32_t XK_Arabic_sad = 0x5D5;
-static constexpr uint32_t XK_Arabic_dad = 0x5D6;
-static constexpr uint32_t XK_Arabic_tah = 0x5D7;
-static constexpr uint32_t XK_Arabic_zah = 0x5D8;
-static constexpr uint32_t XK_Arabic_ain = 0x5D9;
-static constexpr uint32_t XK_Arabic_ghain = 0x5DA;
-static constexpr uint32_t XK_Arabic_tatweel = 0x5E0;
-static constexpr uint32_t XK_Arabic_feh = 0x5E1;
-static constexpr uint32_t XK_Arabic_qaf = 0x5E2;
-static constexpr uint32_t XK_Arabic_kaf = 0x5E3;
-static constexpr uint32_t XK_Arabic_lam = 0x5E4;
-static constexpr uint32_t XK_Arabic_meem = 0x5E5;
-static constexpr uint32_t XK_Arabic_noon = 0x5E6;
-static constexpr uint32_t XK_Arabic_ha = 0x5E7;
-static constexpr uint32_t XK_Arabic_waw = 0x5E8;
-static constexpr uint32_t XK_Arabic_alefmaksura = 0x5E9;
-static constexpr uint32_t XK_Arabic_yeh = 0x5EA;
-static constexpr uint32_t XK_Arabic_fathatan = 0x5EB;
-static constexpr uint32_t XK_Arabic_dammatan = 0x5EC;
-static constexpr uint32_t XK_Arabic_kasratan = 0x5ED;
-static constexpr uint32_t XK_Arabic_fatha = 0x5EE;
-static constexpr uint32_t XK_Arabic_damma = 0x5EF;
-static constexpr uint32_t XK_Arabic_kasra = 0x5F0;
-static constexpr uint32_t XK_Arabic_shadda = 0x5F1;
-static constexpr uint32_t XK_Arabic_sukun = 0x5F2;
-static constexpr uint32_t XK_Serbian_dje = 0x6A1;
-static constexpr uint32_t XK_Macedonia_gje = 0x6A2;
-static constexpr uint32_t XK_Cyrillic_io = 0x6A3;
-static constexpr uint32_t XK_Ukrainian_ie = 0x6A4;
-static constexpr uint32_t XK_Macedonia_dse = 0x6A5;
-static constexpr uint32_t XK_Ukrainian_i = 0x6A6;
-static constexpr uint32_t XK_Ukrainian_yi = 0x6A7;
-static constexpr uint32_t XK_Cyrillic_je = 0x6A8;
-static constexpr uint32_t XK_Cyrillic_lje = 0x6A9;
-static constexpr uint32_t XK_Cyrillic_nje = 0x6AA;
-static constexpr uint32_t XK_Serbian_tshe = 0x6AB;
-static constexpr uint32_t XK_Macedonia_kje = 0x6AC;
-static constexpr uint32_t XK_Ukrainian_ghe_with_upturn = 0x6AD;
-static constexpr uint32_t XK_Byelorussian_shortu = 0x6AE;
-static constexpr uint32_t XK_Cyrillic_dzhe = 0x6AF;
-static constexpr uint32_t XK_Serbian_dze = 0x6AF;
-static constexpr uint32_t XK_numerosign = 0x6B0;
-static constexpr uint32_t XK_Serbian_DJE = 0x6B1;
-static constexpr uint32_t XK_Macedonia_GJE = 0x6B2;
-static constexpr uint32_t XK_Cyrillic_IO = 0x6B3;
-static constexpr uint32_t XK_Ukrainian_IE = 0x6B4;
-static constexpr uint32_t XK_Macedonia_DSE = 0x6B5;
-static constexpr uint32_t XK_Ukrainian_I = 0x6B6;
-static constexpr uint32_t XK_Ukrainian_YI = 0x6B7;
-static constexpr uint32_t XK_Cyrillic_JE = 0x6B8;
-static constexpr uint32_t XK_Cyrillic_LJE = 0x6B9;
-static constexpr uint32_t XK_Cyrillic_NJE = 0x6BA;
-static constexpr uint32_t XK_Serbian_TSHE = 0x6BB;
-static constexpr uint32_t XK_Macedonia_KJE = 0x6BC;
-static constexpr uint32_t XK_Ukrainian_GHE_WITH_UPTURN = 0x6BD;
-static constexpr uint32_t XK_Byelorussian_SHORTU = 0x6BE;
-static constexpr uint32_t XK_Cyrillic_DZHE = 0x6BF;
-static constexpr uint32_t XK_Serbian_DZE = 0x6BF;
-static constexpr uint32_t XK_Cyrillic_yu = 0x6C0;
-static constexpr uint32_t XK_Cyrillic_a = 0x6C1;
-static constexpr uint32_t XK_Cyrillic_be = 0x6C2;
-static constexpr uint32_t XK_Cyrillic_tse = 0x6C3;
-static constexpr uint32_t XK_Cyrillic_de = 0x6C4;
-static constexpr uint32_t XK_Cyrillic_ie = 0x6C5;
-static constexpr uint32_t XK_Cyrillic_ef = 0x6C6;
-static constexpr uint32_t XK_Cyrillic_ghe = 0x6C7;
-static constexpr uint32_t XK_Cyrillic_ha = 0x6C8;
-static constexpr uint32_t XK_Cyrillic_i = 0x6C9;
-static constexpr uint32_t XK_Cyrillic_shorti = 0x6CA;
-static constexpr uint32_t XK_Cyrillic_ka = 0x6CB;
-static constexpr uint32_t XK_Cyrillic_el = 0x6CC;
-static constexpr uint32_t XK_Cyrillic_em = 0x6CD;
-static constexpr uint32_t XK_Cyrillic_en = 0x6CE;
-static constexpr uint32_t XK_Cyrillic_o = 0x6CF;
-static constexpr uint32_t XK_Cyrillic_pe = 0x6D0;
-static constexpr uint32_t XK_Cyrillic_ya = 0x6D1;
-static constexpr uint32_t XK_Cyrillic_er = 0x6D2;
-static constexpr uint32_t XK_Cyrillic_es = 0x6D3;
-static constexpr uint32_t XK_Cyrillic_te = 0x6D4;
-static constexpr uint32_t XK_Cyrillic_u = 0x6D5;
-static constexpr uint32_t XK_Cyrillic_zhe = 0x6D6;
-static constexpr uint32_t XK_Cyrillic_ve = 0x6D7;
-static constexpr uint32_t XK_Cyrillic_softsign = 0x6D8;
-static constexpr uint32_t XK_Cyrillic_yeru = 0x6D9;
-static constexpr uint32_t XK_Cyrillic_ze = 0x6DA;
-static constexpr uint32_t XK_Cyrillic_sha = 0x6DB;
-static constexpr uint32_t XK_Cyrillic_e = 0x6DC;
-static constexpr uint32_t XK_Cyrillic_shcha = 0x6DD;
-static constexpr uint32_t XK_Cyrillic_che = 0x6DE;
-static constexpr uint32_t XK_Cyrillic_hardsign = 0x6DF;
-static constexpr uint32_t XK_Cyrillic_YU = 0x6E0;
-static constexpr uint32_t XK_Cyrillic_A = 0x6E1;
-static constexpr uint32_t XK_Cyrillic_BE = 0x6E2;
-static constexpr uint32_t XK_Cyrillic_TSE = 0x6E3;
-static constexpr uint32_t XK_Cyrillic_DE = 0x6E4;
-static constexpr uint32_t XK_Cyrillic_IE = 0x6E5;
-static constexpr uint32_t XK_Cyrillic_EF = 0x6E6;
-static constexpr uint32_t XK_Cyrillic_GHE = 0x6E7;
-static constexpr uint32_t XK_Cyrillic_HA = 0x6E8;
-static constexpr uint32_t XK_Cyrillic_I = 0x6E9;
-static constexpr uint32_t XK_Cyrillic_SHORTI = 0x6EA;
-static constexpr uint32_t XK_Cyrillic_KA = 0x6EB;
-static constexpr uint32_t XK_Cyrillic_EL = 0x6EC;
-static constexpr uint32_t XK_Cyrillic_EM = 0x6ED;
-static constexpr uint32_t XK_Cyrillic_EN = 0x6EE;
-static constexpr uint32_t XK_Cyrillic_O = 0x6EF;
-static constexpr uint32_t XK_Cyrillic_PE = 0x6F0;
-static constexpr uint32_t XK_Cyrillic_YA = 0x6F1;
-static constexpr uint32_t XK_Cyrillic_ER = 0x6F2;
-static constexpr uint32_t XK_Cyrillic_ES = 0x6F3;
-static constexpr uint32_t XK_Cyrillic_TE = 0x6F4;
-static constexpr uint32_t XK_Cyrillic_U = 0x6F5;
-static constexpr uint32_t XK_Cyrillic_ZHE = 0x6F6;
-static constexpr uint32_t XK_Cyrillic_VE = 0x6F7;
-static constexpr uint32_t XK_Cyrillic_SOFTSIGN = 0x6F8;
-static constexpr uint32_t XK_Cyrillic_YERU = 0x6F9;
-static constexpr uint32_t XK_Cyrillic_ZE = 0x6FA;
-static constexpr uint32_t XK_Cyrillic_SHA = 0x6FB;
-static constexpr uint32_t XK_Cyrillic_E = 0x6FC;
-static constexpr uint32_t XK_Cyrillic_SHCHA = 0x6FD;
-static constexpr uint32_t XK_Cyrillic_CHE = 0x6FE;
-static constexpr uint32_t XK_Cyrillic_HARDSIGN = 0x6FF;
-static constexpr uint32_t XK_Greek_ALPHAaccent = 0x7A1;
-static constexpr uint32_t XK_Greek_EPSILONaccent = 0x7A2;
-static constexpr uint32_t XK_Greek_ETAaccent = 0x7A3;
-static constexpr uint32_t XK_Greek_IOTAaccent = 0x7A4;
-static constexpr uint32_t XK_Greek_IOTAdiaeresis = 0x7A5;
-static constexpr uint32_t XK_Greek_IOTAdieresis = 0x7A5;
-static constexpr uint32_t XK_Greek_OMICRONaccent = 0x7A7;
-static constexpr uint32_t XK_Greek_UPSILONaccent = 0x7A8;
-static constexpr uint32_t XK_Greek_UPSILONdieresis = 0x7A9;
-static constexpr uint32_t XK_Greek_OMEGAaccent = 0x7AB;
-static constexpr uint32_t XK_Greek_accentdieresis = 0x7AE;
-static constexpr uint32_t XK_Greek_horizbar = 0x7AF;
-static constexpr uint32_t XK_Greek_alphaaccent = 0x7B1;
-static constexpr uint32_t XK_Greek_epsilonaccent = 0x7B2;
-static constexpr uint32_t XK_Greek_etaaccent = 0x7B3;
-static constexpr uint32_t XK_Greek_iotaaccent = 0x7B4;
-static constexpr uint32_t XK_Greek_iotadieresis = 0x7B5;
-static constexpr uint32_t XK_Greek_iotaaccentdieresis = 0x7B6;
-static constexpr uint32_t XK_Greek_omicronaccent = 0x7B7;
-static constexpr uint32_t XK_Greek_upsilonaccent = 0x7B8;
-static constexpr uint32_t XK_Greek_upsilondieresis = 0x7B9;
-static constexpr uint32_t XK_Greek_upsilonaccentdieresis = 0x7BA;
-static constexpr uint32_t XK_Greek_omegaaccent = 0x7BB;
-static constexpr uint32_t XK_Greek_ALPHA = 0x7C1;
-static constexpr uint32_t XK_Greek_BETA = 0x7C2;
-static constexpr uint32_t XK_Greek_GAMMA = 0x7C3;
-static constexpr uint32_t XK_Greek_DELTA = 0x7C4;
-static constexpr uint32_t XK_Greek_EPSILON = 0x7C5;
-static constexpr uint32_t XK_Greek_ZETA = 0x7C6;
-static constexpr uint32_t XK_Greek_ETA = 0x7C7;
-static constexpr uint32_t XK_Greek_THETA = 0x7C8;
-static constexpr uint32_t XK_Greek_IOTA = 0x7C9;
-static constexpr uint32_t XK_Greek_KAPPA = 0x7CA;
-static constexpr uint32_t XK_Greek_LAMBDA = 0x7CB;
-static constexpr uint32_t XK_Greek_LAMDA = 0x7CB;
-static constexpr uint32_t XK_Greek_MU = 0x7CC;
-static constexpr uint32_t XK_Greek_NU = 0x7CD;
-static constexpr uint32_t XK_Greek_XI = 0x7CE;
-static constexpr uint32_t XK_Greek_OMICRON = 0x7CF;
-static constexpr uint32_t XK_Greek_PI = 0x7D0;
-static constexpr uint32_t XK_Greek_RHO = 0x7D1;
-static constexpr uint32_t XK_Greek_SIGMA = 0x7D2;
-static constexpr uint32_t XK_Greek_TAU = 0x7D4;
-static constexpr uint32_t XK_Greek_UPSILON = 0x7D5;
-static constexpr uint32_t XK_Greek_PHI = 0x7D6;
-static constexpr uint32_t XK_Greek_CHI = 0x7D7;
-static constexpr uint32_t XK_Greek_PSI = 0x7D8;
-static constexpr uint32_t XK_Greek_OMEGA = 0x7D9;
-static constexpr uint32_t XK_Greek_alpha = 0x7E1;
-static constexpr uint32_t XK_Greek_beta = 0x7E2;
-static constexpr uint32_t XK_Greek_gamma = 0x7E3;
-static constexpr uint32_t XK_Greek_delta = 0x7E4;
-static constexpr uint32_t XK_Greek_epsilon = 0x7E5;
-static constexpr uint32_t XK_Greek_zeta = 0x7E6;
-static constexpr uint32_t XK_Greek_eta = 0x7E7;
-static constexpr uint32_t XK_Greek_theta = 0x7E8;
-static constexpr uint32_t XK_Greek_iota = 0x7E9;
-static constexpr uint32_t XK_Greek_kappa = 0x7EA;
-static constexpr uint32_t XK_Greek_lambda = 0x7EB;
-static constexpr uint32_t XK_Greek_lamda = 0x7EB;
-static constexpr uint32_t XK_Greek_mu = 0x7EC;
-static constexpr uint32_t XK_Greek_nu = 0x7ED;
-static constexpr uint32_t XK_Greek_xi = 0x7EE;
-static constexpr uint32_t XK_Greek_omicron = 0x7EF;
-static constexpr uint32_t XK_Greek_pi = 0x7F0;
-static constexpr uint32_t XK_Greek_rho = 0x7F1;
-static constexpr uint32_t XK_Greek_sigma = 0x7F2;
-static constexpr uint32_t XK_Greek_finalsmallsigma = 0x7F3;
-static constexpr uint32_t XK_Greek_tau = 0x7F4;
-static constexpr uint32_t XK_Greek_upsilon = 0x7F5;
-static constexpr uint32_t XK_Greek_phi = 0x7F6;
-static constexpr uint32_t XK_Greek_chi = 0x7F7;
-static constexpr uint32_t XK_Greek_psi = 0x7F8;
-static constexpr uint32_t XK_Greek_omega = 0x7F9;
-static constexpr uint32_t XK_leftradical = 0x8A1;
-static constexpr uint32_t XK_topleftradical = 0x8A2;
-static constexpr uint32_t XK_horizconnector = 0x8A3;
-static constexpr uint32_t XK_topintegral = 0x8A4;
-static constexpr uint32_t XK_botintegral = 0x8A5;
-static constexpr uint32_t XK_vertconnector = 0x8A6;
-static constexpr uint32_t XK_topleftsqbracket = 0x8A7;
-static constexpr uint32_t XK_botleftsqbracket = 0x8A8;
-static constexpr uint32_t XK_toprightsqbracket = 0x8A9;
-static constexpr uint32_t XK_botrightsqbracket = 0x8AA;
-static constexpr uint32_t XK_topleftparens = 0x8AB;
-static constexpr uint32_t XK_botleftparens = 0x8AC;
-static constexpr uint32_t XK_toprightparens = 0x8AD;
-static constexpr uint32_t XK_botrightparens = 0x8AE;
-static constexpr uint32_t XK_leftmiddlecurlybrace = 0x8AF;
-static constexpr uint32_t XK_rightmiddlecurlybrace = 0x8B0;
-static constexpr uint32_t XK_lessthanequal = 0x8BC;
-static constexpr uint32_t XK_notequal = 0x8BD;
-static constexpr uint32_t XK_greaterthanequal = 0x8BE;
-static constexpr uint32_t XK_integral = 0x8BF;
-static constexpr uint32_t XK_therefore = 0x8C0;
-static constexpr uint32_t XK_variation = 0x8C1;
-static constexpr uint32_t XK_infinity = 0x8C2;
-static constexpr uint32_t XK_nabla = 0x8C5;
-static constexpr uint32_t XK_approximate = 0x8C8;
-static constexpr uint32_t XK_similarequal = 0x8C9;
-static constexpr uint32_t XK_ifonlyif = 0x8CD;
-static constexpr uint32_t XK_implies = 0x8CE;
-static constexpr uint32_t XK_identical = 0x8CF;
-static constexpr uint32_t XK_radical = 0x8D6;
-static constexpr uint32_t XK_includedin = 0x8DA;
-static constexpr uint32_t XK_includes = 0x8DB;
-static constexpr uint32_t XK_intersection = 0x8DC;
-static constexpr uint32_t XK_union = 0x8DD;
-static constexpr uint32_t XK_logicaland = 0x8DE;
-static constexpr uint32_t XK_logicalor = 0x8DF;
-static constexpr uint32_t XK_partialderivative = 0x8EF;
-static constexpr uint32_t XK_function = 0x8F6;
-static constexpr uint32_t XK_leftarrow = 0x8FB;
-static constexpr uint32_t XK_uparrow = 0x8FC;
-static constexpr uint32_t XK_rightarrow = 0x8FD;
-static constexpr uint32_t XK_downarrow = 0x8FE;
-static constexpr uint32_t XK_soliddiamond = 0x9E0;
-static constexpr uint32_t XK_checkerboard = 0x9E1;
-static constexpr uint32_t XK_ht = 0x9E2;
-static constexpr uint32_t XK_ff = 0x9E3;
-static constexpr uint32_t XK_cr = 0x9E4;
-static constexpr uint32_t XK_lf = 0x9E5;
-static constexpr uint32_t XK_nl = 0x9E8;
-static constexpr uint32_t XK_vt = 0x9E9;
-static constexpr uint32_t XK_lowrightcorner = 0x9EA;
-static constexpr uint32_t XK_uprightcorner = 0x9EB;
-static constexpr uint32_t XK_upleftcorner = 0x9EC;
-static constexpr uint32_t XK_lowleftcorner = 0x9ED;
-static constexpr uint32_t XK_crossinglines = 0x9EE;
-static constexpr uint32_t XK_horizlinescan1 = 0x9EF;
-static constexpr uint32_t XK_horizlinescan3 = 0x9F0;
-static constexpr uint32_t XK_horizlinescan5 = 0x9F1;
-static constexpr uint32_t XK_horizlinescan7 = 0x9F2;
-static constexpr uint32_t XK_horizlinescan9 = 0x9F3;
-static constexpr uint32_t XK_leftt = 0x9F4;
-static constexpr uint32_t XK_rightt = 0x9F5;
-static constexpr uint32_t XK_bott = 0x9F6;
-static constexpr uint32_t XK_topt = 0x9F7;
-static constexpr uint32_t XK_vertbar = 0x9F8;
-static constexpr uint32_t XK_emspace = 0xAA1;
-static constexpr uint32_t XK_enspace = 0xAA2;
-static constexpr uint32_t XK_em3space = 0xAA3;
-static constexpr uint32_t XK_em4space = 0xAA4;
-static constexpr uint32_t XK_digitspace = 0xAA5;
-static constexpr uint32_t XK_punctspace = 0xAA6;
-static constexpr uint32_t XK_thinspace = 0xAA7;
-static constexpr uint32_t XK_hairspace = 0xAA8;
-static constexpr uint32_t XK_emdash = 0xAA9;
-static constexpr uint32_t XK_endash = 0xAAA;
-static constexpr uint32_t XK_signifblank = 0xAAC;
-static constexpr uint32_t XK_ellipsis = 0xAAE;
-static constexpr uint32_t XK_doubbaselinedot = 0xAAF;
-static constexpr uint32_t XK_onethird = 0xAB0;
-static constexpr uint32_t XK_twothirds = 0xAB1;
-static constexpr uint32_t XK_onefifth = 0xAB2;
-static constexpr uint32_t XK_twofifths = 0xAB3;
-static constexpr uint32_t XK_threefifths = 0xAB4;
-static constexpr uint32_t XK_fourfifths = 0xAB5;
-static constexpr uint32_t XK_onesixth = 0xAB6;
-static constexpr uint32_t XK_fivesixths = 0xAB7;
-static constexpr uint32_t XK_careof = 0xAB8;
-static constexpr uint32_t XK_figdash = 0xABB;
-static constexpr uint32_t XK_leftanglebracket = 0xABC;
-static constexpr uint32_t XK_decimalpoint = 0xABD;
-static constexpr uint32_t XK_rightanglebracket = 0xABE;
-static constexpr uint32_t XK_oneeighth = 0xAC3;
-static constexpr uint32_t XK_threeeighths = 0xAC4;
-static constexpr uint32_t XK_fiveeighths = 0xAC5;
-static constexpr uint32_t XK_seveneighths = 0xAC6;
-static constexpr uint32_t XK_trademark = 0xAC9;
-static constexpr uint32_t XK_signaturemark = 0xACA;
-static constexpr uint32_t XK_leftopentriangle = 0xACC;
-static constexpr uint32_t XK_rightopentriangle = 0xACD;
-static constexpr uint32_t XK_emopencircle = 0xACE;
-static constexpr uint32_t XK_emopenrectangle = 0xACF;
-static constexpr uint32_t XK_leftsinglequotemark = 0xAD0;
-static constexpr uint32_t XK_rightsinglequotemark = 0xAD1;
-static constexpr uint32_t XK_leftdoublequotemark = 0xAD2;
-static constexpr uint32_t XK_rightdoublequotemark = 0xAD3;
-static constexpr uint32_t XK_prescription = 0xAD4;
-static constexpr uint32_t XK_minutes = 0xAD6;
-static constexpr uint32_t XK_seconds = 0xAD7;
-static constexpr uint32_t XK_latincross = 0xAD9;
-static constexpr uint32_t XK_filledrectbullet = 0xADB;
-static constexpr uint32_t XK_filledlefttribullet = 0xADC;
-static constexpr uint32_t XK_filledrighttribullet = 0xADD;
-static constexpr uint32_t XK_emfilledcircle = 0xADE;
-static constexpr uint32_t XK_emfilledrect = 0xADF;
-static constexpr uint32_t XK_enopencircbullet = 0xAE0;
-static constexpr uint32_t XK_enopensquarebullet = 0xAE1;
-static constexpr uint32_t XK_openrectbullet = 0xAE2;
-static constexpr uint32_t XK_opentribulletup = 0xAE3;
-static constexpr uint32_t XK_opentribulletdown = 0xAE4;
-static constexpr uint32_t XK_openstar = 0xAE5;
-static constexpr uint32_t XK_enfilledcircbullet = 0xAE6;
-static constexpr uint32_t XK_enfilledsqbullet = 0xAE7;
-static constexpr uint32_t XK_filledtribulletup = 0xAE8;
-static constexpr uint32_t XK_filledtribulletdown = 0xAE9;
-static constexpr uint32_t XK_leftpointer = 0xAEA;
-static constexpr uint32_t XK_rightpointer = 0xAEB;
-static constexpr uint32_t XK_club = 0xAEC;
-static constexpr uint32_t XK_diamond = 0xAED;
-static constexpr uint32_t XK_heart = 0xAEE;
-static constexpr uint32_t XK_maltesecross = 0xAF0;
-static constexpr uint32_t XK_dagger = 0xAF1;
-static constexpr uint32_t XK_doubledagger = 0xAF2;
-static constexpr uint32_t XK_checkmark = 0xAF3;
-static constexpr uint32_t XK_ballotcross = 0xAF4;
-static constexpr uint32_t XK_musicalsharp = 0xAF5;
-static constexpr uint32_t XK_musicalflat = 0xAF6;
-static constexpr uint32_t XK_malesymbol = 0xAF7;
-static constexpr uint32_t XK_femalesymbol = 0xAF8;
-static constexpr uint32_t XK_telephone = 0xAF9;
-static constexpr uint32_t XK_telephonerecorder = 0xAFA;
-static constexpr uint32_t XK_phonographcopyright = 0xAFB;
-static constexpr uint32_t XK_caret = 0xAFC;
-static constexpr uint32_t XK_singlelowquotemark = 0xAFD;
-static constexpr uint32_t XK_doublelowquotemark = 0xAFE;
-static constexpr uint32_t XK_leftcaret = 0xBA3;
-static constexpr uint32_t XK_rightcaret = 0xBA6;
-static constexpr uint32_t XK_downcaret = 0xBA8;
-static constexpr uint32_t XK_upcaret = 0xBA9;
-static constexpr uint32_t XK_overbar = 0xBC0;
-static constexpr uint32_t XK_downtack = 0xBC2;
-static constexpr uint32_t XK_upshoe = 0xBC3;
-static constexpr uint32_t XK_downstile = 0xBC4;
-static constexpr uint32_t XK_underbar = 0xBC6;
-static constexpr uint32_t XK_jot = 0xBCA;
-static constexpr uint32_t XK_quad = 0xBCC;
-static constexpr uint32_t XK_uptack = 0xBCE;
-static constexpr uint32_t XK_circle = 0xBCF;
-static constexpr uint32_t XK_upstile = 0xBD3;
-static constexpr uint32_t XK_downshoe = 0xBD6;
-static constexpr uint32_t XK_rightshoe = 0xBD8;
-static constexpr uint32_t XK_leftshoe = 0xBDA;
-static constexpr uint32_t XK_lefttack = 0xBDC;
-static constexpr uint32_t XK_righttack = 0xBFC;
-static constexpr uint32_t XK_hebrew_doublelowline = 0xCDF;
-static constexpr uint32_t XK_hebrew_aleph = 0xCE0;
-static constexpr uint32_t XK_hebrew_bet = 0xCE1;
-static constexpr uint32_t XK_hebrew_gimel = 0xCE2;
-static constexpr uint32_t XK_hebrew_dalet = 0xCE3;
-static constexpr uint32_t XK_hebrew_he = 0xCE4;
-static constexpr uint32_t XK_hebrew_waw = 0xCE5;
-static constexpr uint32_t XK_hebrew_zain = 0xCE6;
-static constexpr uint32_t XK_hebrew_chet = 0xCE7;
-static constexpr uint32_t XK_hebrew_tet = 0xCE8;
-static constexpr uint32_t XK_hebrew_yod = 0xCE9;
-static constexpr uint32_t XK_hebrew_finalkaph = 0xCEA;
-static constexpr uint32_t XK_hebrew_kaph = 0xCEB;
-static constexpr uint32_t XK_hebrew_lamed = 0xCEC;
-static constexpr uint32_t XK_hebrew_finalmem = 0xCED;
-static constexpr uint32_t XK_hebrew_mem = 0xCEE;
-static constexpr uint32_t XK_hebrew_finalnun = 0xCEF;
-static constexpr uint32_t XK_hebrew_nun = 0xCF0;
-static constexpr uint32_t XK_hebrew_samech = 0xCF1;
-static constexpr uint32_t XK_hebrew_ayin = 0xCF2;
-static constexpr uint32_t XK_hebrew_finalpe = 0xCF3;
-static constexpr uint32_t XK_hebrew_pe = 0xCF4;
-static constexpr uint32_t XK_hebrew_finalzade = 0xCF5;
-static constexpr uint32_t XK_hebrew_zade = 0xCF6;
-static constexpr uint32_t XK_hebrew_qoph = 0xCF7;
-static constexpr uint32_t XK_hebrew_resh = 0xCF8;
-static constexpr uint32_t XK_hebrew_shin = 0xCF9;
-static constexpr uint32_t XK_hebrew_taw = 0xCFA;
-static constexpr uint32_t XK_Thai_kokai = 0xDA1;
-static constexpr uint32_t XK_Thai_khokhai = 0xDA2;
-static constexpr uint32_t XK_Thai_khokhuat = 0xDA3;
-static constexpr uint32_t XK_Thai_khokhwai = 0xDA4;
-static constexpr uint32_t XK_Thai_khokhon = 0xDA5;
-static constexpr uint32_t XK_Thai_khorakhang = 0xDA6;
-static constexpr uint32_t XK_Thai_ngongu = 0xDA7;
-static constexpr uint32_t XK_Thai_chochan = 0xDA8;
-static constexpr uint32_t XK_Thai_choching = 0xDA9;
-static constexpr uint32_t XK_Thai_chochang = 0xDAA;
-static constexpr uint32_t XK_Thai_soso = 0xDAB;
-static constexpr uint32_t XK_Thai_chochoe = 0xDAC;
-static constexpr uint32_t XK_Thai_yoying = 0xDAD;
-static constexpr uint32_t XK_Thai_dochada = 0xDAE;
-static constexpr uint32_t XK_Thai_topatak = 0xDAF;
-static constexpr uint32_t XK_Thai_thothan = 0xDB0;
-static constexpr uint32_t XK_Thai_thonangmontho = 0xDB1;
-static constexpr uint32_t XK_Thai_thophuthao = 0xDB2;
-static constexpr uint32_t XK_Thai_nonen = 0xDB3;
-static constexpr uint32_t XK_Thai_dodek = 0xDB4;
-static constexpr uint32_t XK_Thai_totao = 0xDB5;
-static constexpr uint32_t XK_Thai_thothung = 0xDB6;
-static constexpr uint32_t XK_Thai_thothahan = 0xDB7;
-static constexpr uint32_t XK_Thai_thothong = 0xDB8;
-static constexpr uint32_t XK_Thai_nonu = 0xDB9;
-static constexpr uint32_t XK_Thai_bobaimai = 0xDBA;
-static constexpr uint32_t XK_Thai_popla = 0xDBB;
-static constexpr uint32_t XK_Thai_phophung = 0xDBC;
-static constexpr uint32_t XK_Thai_fofa = 0xDBD;
-static constexpr uint32_t XK_Thai_phophan = 0xDBE;
-static constexpr uint32_t XK_Thai_fofan = 0xDBF;
-static constexpr uint32_t XK_Thai_phosamphao = 0xDC0;
-static constexpr uint32_t XK_Thai_moma = 0xDC1;
-static constexpr uint32_t XK_Thai_yoyak = 0xDC2;
-static constexpr uint32_t XK_Thai_rorua = 0xDC3;
-static constexpr uint32_t XK_Thai_ru = 0xDC4;
-static constexpr uint32_t XK_Thai_loling = 0xDC5;
-static constexpr uint32_t XK_Thai_lu = 0xDC6;
-static constexpr uint32_t XK_Thai_wowaen = 0xDC7;
-static constexpr uint32_t XK_Thai_sosala = 0xDC8;
-static constexpr uint32_t XK_Thai_sorusi = 0xDC9;
-static constexpr uint32_t XK_Thai_sosua = 0xDCA;
-static constexpr uint32_t XK_Thai_hohip = 0xDCB;
-static constexpr uint32_t XK_Thai_lochula = 0xDCC;
-static constexpr uint32_t XK_Thai_oang = 0xDCD;
-static constexpr uint32_t XK_Thai_honokhuk = 0xDCE;
-static constexpr uint32_t XK_Thai_paiyannoi = 0xDCF;
-static constexpr uint32_t XK_Thai_saraa = 0xDD0;
-static constexpr uint32_t XK_Thai_maihanakat = 0xDD1;
-static constexpr uint32_t XK_Thai_saraaa = 0xDD2;
-static constexpr uint32_t XK_Thai_saraam = 0xDD3;
-static constexpr uint32_t XK_Thai_sarai = 0xDD4;
-static constexpr uint32_t XK_Thai_saraii = 0xDD5;
-static constexpr uint32_t XK_Thai_saraue = 0xDD6;
-static constexpr uint32_t XK_Thai_sarauee = 0xDD7;
-static constexpr uint32_t XK_Thai_sarau = 0xDD8;
-static constexpr uint32_t XK_Thai_sarauu = 0xDD9;
-static constexpr uint32_t XK_Thai_phinthu = 0xDDA;
-static constexpr uint32_t XK_Thai_baht = 0xDDF;
-static constexpr uint32_t XK_Thai_sarae = 0xDE0;
-static constexpr uint32_t XK_Thai_saraae = 0xDE1;
-static constexpr uint32_t XK_Thai_sarao = 0xDE2;
-static constexpr uint32_t XK_Thai_saraaimaimuan = 0xDE3;
-static constexpr uint32_t XK_Thai_saraaimaimalai = 0xDE4;
-static constexpr uint32_t XK_Thai_lakkhangyao = 0xDE5;
-static constexpr uint32_t XK_Thai_maiyamok = 0xDE6;
-static constexpr uint32_t XK_Thai_maitaikhu = 0xDE7;
-static constexpr uint32_t XK_Thai_maiek = 0xDE8;
-static constexpr uint32_t XK_Thai_maitho = 0xDE9;
-static constexpr uint32_t XK_Thai_maitri = 0xDEA;
-static constexpr uint32_t XK_Thai_maichattawa = 0xDEB;
-static constexpr uint32_t XK_Thai_thanthakhat = 0xDEC;
-static constexpr uint32_t XK_Thai_nikhahit = 0xDED;
-static constexpr uint32_t XK_Thai_leksun = 0xDF0;
-static constexpr uint32_t XK_Thai_leknung = 0xDF1;
-static constexpr uint32_t XK_Thai_leksong = 0xDF2;
-static constexpr uint32_t XK_Thai_leksam = 0xDF3;
-static constexpr uint32_t XK_Thai_leksi = 0xDF4;
-static constexpr uint32_t XK_Thai_lekha = 0xDF5;
-static constexpr uint32_t XK_Thai_lekhok = 0xDF6;
-static constexpr uint32_t XK_Thai_lekchet = 0xDF7;
-static constexpr uint32_t XK_Thai_lekpaet = 0xDF8;
-static constexpr uint32_t XK_Thai_lekkao = 0xDF9;
-static constexpr uint32_t XK_Hangul_Kiyeog = 0xEA1;
-static constexpr uint32_t XK_Hangul_SsangKiyeog = 0xEA2;
-static constexpr uint32_t XK_Hangul_KiyeogSios = 0xEA3;
-static constexpr uint32_t XK_Hangul_Nieun = 0xEA4;
-static constexpr uint32_t XK_Hangul_NieunJieuj = 0xEA5;
-static constexpr uint32_t XK_Hangul_NieunHieuh = 0xEA6;
-static constexpr uint32_t XK_Hangul_Dikeud = 0xEA7;
-static constexpr uint32_t XK_Hangul_SsangDikeud = 0xEA8;
-static constexpr uint32_t XK_Hangul_Rieul = 0xEA9;
-static constexpr uint32_t XK_Hangul_RieulKiyeog = 0xEAA;
-static constexpr uint32_t XK_Hangul_RieulMieum = 0xEAB;
-static constexpr uint32_t XK_Hangul_RieulPieub = 0xEAC;
-static constexpr uint32_t XK_Hangul_RieulSios = 0xEAD;
-static constexpr uint32_t XK_Hangul_RieulTieut = 0xEAE;
-static constexpr uint32_t XK_Hangul_RieulPhieuf = 0xEAF;
-static constexpr uint32_t XK_Hangul_RieulHieuh = 0xEB0;
-static constexpr uint32_t XK_Hangul_Mieum = 0xEB1;
-static constexpr uint32_t XK_Hangul_Pieub = 0xEB2;
-static constexpr uint32_t XK_Hangul_SsangPieub = 0xEB3;
-static constexpr uint32_t XK_Hangul_PieubSios = 0xEB4;
-static constexpr uint32_t XK_Hangul_Sios = 0xEB5;
-static constexpr uint32_t XK_Hangul_SsangSios = 0xEB6;
-static constexpr uint32_t XK_Hangul_Ieung = 0xEB7;
-static constexpr uint32_t XK_Hangul_Jieuj = 0xEB8;
-static constexpr uint32_t XK_Hangul_SsangJieuj = 0xEB9;
-static constexpr uint32_t XK_Hangul_Cieuc = 0xEBA;
-static constexpr uint32_t XK_Hangul_Khieuq = 0xEBB;
-static constexpr uint32_t XK_Hangul_Tieut = 0xEBC;
-static constexpr uint32_t XK_Hangul_Phieuf = 0xEBD;
-static constexpr uint32_t XK_Hangul_Hieuh = 0xEBE;
-static constexpr uint32_t XK_Hangul_A = 0xEBF;
-static constexpr uint32_t XK_Hangul_AE = 0xEC0;
-static constexpr uint32_t XK_Hangul_YA = 0xEC1;
-static constexpr uint32_t XK_Hangul_YAE = 0xEC2;
-static constexpr uint32_t XK_Hangul_EO = 0xEC3;
-static constexpr uint32_t XK_Hangul_E = 0xEC4;
-static constexpr uint32_t XK_Hangul_YEO = 0xEC5;
-static constexpr uint32_t XK_Hangul_YE = 0xEC6;
-static constexpr uint32_t XK_Hangul_O = 0xEC7;
-static constexpr uint32_t XK_Hangul_WA = 0xEC8;
-static constexpr uint32_t XK_Hangul_WAE = 0xEC9;
-static constexpr uint32_t XK_Hangul_OE = 0xECA;
-static constexpr uint32_t XK_Hangul_YO = 0xECB;
-static constexpr uint32_t XK_Hangul_U = 0xECC;
-static constexpr uint32_t XK_Hangul_WEO = 0xECD;
-static constexpr uint32_t XK_Hangul_WE = 0xECE;
-static constexpr uint32_t XK_Hangul_WI = 0xECF;
-static constexpr uint32_t XK_Hangul_YU = 0xED0;
-static constexpr uint32_t XK_Hangul_EU = 0xED1;
-static constexpr uint32_t XK_Hangul_YI = 0xED2;
-static constexpr uint32_t XK_Hangul_I = 0xED3;
-static constexpr uint32_t XK_Hangul_J_Kiyeog = 0xED4;
-static constexpr uint32_t XK_Hangul_J_SsangKiyeog = 0xED5;
-static constexpr uint32_t XK_Hangul_J_KiyeogSios = 0xED6;
-static constexpr uint32_t XK_Hangul_J_Nieun = 0xED7;
-static constexpr uint32_t XK_Hangul_J_NieunJieuj = 0xED8;
-static constexpr uint32_t XK_Hangul_J_NieunHieuh = 0xED9;
-static constexpr uint32_t XK_Hangul_J_Dikeud = 0xEDA;
-static constexpr uint32_t XK_Hangul_J_Rieul = 0xEDB;
-static constexpr uint32_t XK_Hangul_J_RieulKiyeog = 0xEDC;
-static constexpr uint32_t XK_Hangul_J_RieulMieum = 0xEDD;
-static constexpr uint32_t XK_Hangul_J_RieulPieub = 0xEDE;
-static constexpr uint32_t XK_Hangul_J_RieulSios = 0xEDF;
-static constexpr uint32_t XK_Hangul_J_RieulTieut = 0xEE0;
-static constexpr uint32_t XK_Hangul_J_RieulPhieuf = 0xEE1;
-static constexpr uint32_t XK_Hangul_J_RieulHieuh = 0xEE2;
-static constexpr uint32_t XK_Hangul_J_Mieum = 0xEE3;
-static constexpr uint32_t XK_Hangul_J_Pieub = 0xEE4;
-static constexpr uint32_t XK_Hangul_J_PieubSios = 0xEE5;
-static constexpr uint32_t XK_Hangul_J_Sios = 0xEE6;
-static constexpr uint32_t XK_Hangul_J_SsangSios = 0xEE7;
-static constexpr uint32_t XK_Hangul_J_Ieung = 0xEE8;
-static constexpr uint32_t XK_Hangul_J_Jieuj = 0xEE9;
-static constexpr uint32_t XK_Hangul_J_Cieuc = 0xEEA;
-static constexpr uint32_t XK_Hangul_J_Khieuq = 0xEEB;
-static constexpr uint32_t XK_Hangul_J_Tieut = 0xEEC;
-static constexpr uint32_t XK_Hangul_J_Phieuf = 0xEED;
-static constexpr uint32_t XK_Hangul_J_Hieuh = 0xEEE;
-static constexpr uint32_t XK_Hangul_RieulYeorinHieuh = 0xEEF;
-static constexpr uint32_t XK_Hangul_SunkyeongeumMieum = 0xEF0;
-static constexpr uint32_t XK_Hangul_SunkyeongeumPieub = 0xEF1;
-static constexpr uint32_t XK_Hangul_PanSios = 0xEF2;
-static constexpr uint32_t XK_Hangul_KkogjiDalrinIeung = 0xEF3;
-static constexpr uint32_t XK_Hangul_SunkyeongeumPhieuf = 0xEF4;
-static constexpr uint32_t XK_Hangul_YeorinHieuh = 0xEF5;
-static constexpr uint32_t XK_Hangul_AraeA = 0xEF6;
-static constexpr uint32_t XK_Hangul_AraeAE = 0xEF7;
-static constexpr uint32_t XK_Hangul_J_PanSios = 0xEF8;
-static constexpr uint32_t XK_Hangul_J_KkogjiDalrinIeung = 0xEF9;
-static constexpr uint32_t XK_Hangul_J_YeorinHieuh = 0xEFA;
-static constexpr uint32_t XK_Korean_Won = 0xEFF;
-static constexpr uint32_t XK_OE = 0x13BC;
-static constexpr uint32_t XK_oe = 0x13BD;
-static constexpr uint32_t XK_Ydiaeresis = 0x13BE;
-static constexpr uint32_t XK_EuroSign = 0x20AC;
-static constexpr uint32_t XK_3270_Duplicate = 0xFD01;
-static constexpr uint32_t XK_3270_FieldMark = 0xFD02;
-static constexpr uint32_t XK_3270_Right2 = 0xFD03;
-static constexpr uint32_t XK_3270_Left2 = 0xFD04;
-static constexpr uint32_t XK_3270_BackTab = 0xFD05;
-static constexpr uint32_t XK_3270_EraseEOF = 0xFD06;
-static constexpr uint32_t XK_3270_EraseInput = 0xFD07;
-static constexpr uint32_t XK_3270_Reset = 0xFD08;
-static constexpr uint32_t XK_3270_Quit = 0xFD09;
-static constexpr uint32_t XK_3270_PA1 = 0xFD0A;
-static constexpr uint32_t XK_3270_PA2 = 0xFD0B;
-static constexpr uint32_t XK_3270_PA3 = 0xFD0C;
-static constexpr uint32_t XK_3270_Test = 0xFD0D;
-static constexpr uint32_t XK_3270_Attn = 0xFD0E;
-static constexpr uint32_t XK_3270_CursorBlink = 0xFD0F;
-static constexpr uint32_t XK_3270_AltCursor = 0xFD10;
-static constexpr uint32_t XK_3270_KeyClick = 0xFD11;
-static constexpr uint32_t XK_3270_Jump = 0xFD12;
-static constexpr uint32_t XK_3270_Ident = 0xFD13;
-static constexpr uint32_t XK_3270_Rule = 0xFD14;
-static constexpr uint32_t XK_3270_Copy = 0xFD15;
-static constexpr uint32_t XK_3270_Play = 0xFD16;
-static constexpr uint32_t XK_3270_Setup = 0xFD17;
-static constexpr uint32_t XK_3270_Record = 0xFD18;
-static constexpr uint32_t XK_3270_ChangeScreen = 0xFD19;
-static constexpr uint32_t XK_3270_DeleteWord = 0xFD1A;
-static constexpr uint32_t XK_3270_ExSelect = 0xFD1B;
-static constexpr uint32_t XK_3270_CursorSelect = 0xFD1C;
-static constexpr uint32_t XK_3270_PrintScreen = 0xFD1D;
-static constexpr uint32_t XK_3270_Enter = 0xFD1E;
-static constexpr uint32_t XK_ISO_Lock = 0xFE01;
-static constexpr uint32_t XK_ISO_Level3_Shift = 0xFE03;
-static constexpr uint32_t XK_ISO_Level3_Latch = 0xFE04;
-static constexpr uint32_t XK_ISO_Next_Group = 0xFE08;
-static constexpr uint32_t XK_ISO_Next_Group_Lock = 0xFE09;
-static constexpr uint32_t XK_ISO_Prev_Group = 0xFE0A;
-static constexpr uint32_t XK_ISO_Prev_Group_Lock = 0xFE0B;
-static constexpr uint32_t XK_ISO_First_Group = 0xFE0C;
-static constexpr uint32_t XK_ISO_First_Group_Lock = 0xFE0D;
-static constexpr uint32_t XK_ISO_Last_Group = 0xFE0E;
-static constexpr uint32_t XK_ISO_Last_Group_Lock = 0xFE0F;
-static constexpr uint32_t XK_ISO_Level5_Shift = 0xFE11;
-static constexpr uint32_t XK_ISO_Level5_Lock = 0xFE13;
-static constexpr uint32_t XK_ISO_Left_Tab = 0xFE20;
-static constexpr uint32_t XK_ISO_Enter = 0xFE34;
-static constexpr uint32_t XK_dead_grave = 0xFE50;
-static constexpr uint32_t XK_dead_acute = 0xFE51;
-static constexpr uint32_t XK_dead_circumflex = 0xFE52;
-static constexpr uint32_t XK_dead_tilde = 0xFE53;
-static constexpr uint32_t XK_dead_macron = 0xFE54;
-static constexpr uint32_t XK_dead_breve = 0xFE55;
-static constexpr uint32_t XK_dead_abovedot = 0xFE56;
-static constexpr uint32_t XK_dead_diaeresis = 0xFE57;
-static constexpr uint32_t XK_dead_abovering = 0xFE58;
-static constexpr uint32_t XK_dead_doubleacute = 0xFE59;
-static constexpr uint32_t XK_dead_caron = 0xFE5A;
-static constexpr uint32_t XK_dead_cedilla = 0xFE5B;
-static constexpr uint32_t XK_dead_ogonek = 0xFE5C;
-static constexpr uint32_t XK_dead_iota = 0xFE5D;
-static constexpr uint32_t XK_dead_voiced_sound = 0xFE5E;
-static constexpr uint32_t XK_dead_semivoiced_sound = 0xFE5F;
-static constexpr uint32_t XK_dead_belowdot = 0xFE60;
-static constexpr uint32_t XK_dead_hook = 0xFE61;
-static constexpr uint32_t XK_dead_horn = 0xFE62;
-static constexpr uint32_t XK_dead_stroke = 0xFE63;
-static constexpr uint32_t XK_dead_abovecomma = 0xFE64;
-static constexpr uint32_t XK_dead_abovereversedcomma = 0xFE65;
-static constexpr uint32_t XK_dead_doublegrave = 0xFE66;
-static constexpr uint32_t XK_dead_belowring = 0xFE67;
-static constexpr uint32_t XK_dead_belowmacron = 0xFE68;
-static constexpr uint32_t XK_dead_belowcircumflex = 0xFE69;
-static constexpr uint32_t XK_dead_belowtilde = 0xFE6A;
-static constexpr uint32_t XK_dead_belowbreve = 0xFE6B;
-static constexpr uint32_t XK_dead_belowdiaeresis = 0xFE6C;
-static constexpr uint32_t XK_dead_invertedbreve = 0xFE6D;
-static constexpr uint32_t XK_dead_belowcomma = 0xFE6E;
-static constexpr uint32_t XK_dead_currency = 0xFE6F;
-static constexpr uint32_t XK_dead_greek = 0xFE8C;
-static constexpr uint32_t XK_Next_Virtual_Screen = 0xFED2;
-static constexpr uint32_t XK_BackSpace = 0xFF08;
-static constexpr uint32_t XK_Tab = 0xFF09;
-static constexpr uint32_t XK_Linefeed = 0xFF0A;
-static constexpr uint32_t XK_Clear = 0xFF0B;
-static constexpr uint32_t XK_Return = 0xFF0D;
-static constexpr uint32_t XK_Pause = 0xFF13;
-static constexpr uint32_t XK_Scroll_Lock = 0xFF14;
-static constexpr uint32_t XK_Sys_Req = 0xFF15;
-static constexpr uint32_t XK_Escape = 0xFF1B;
-static constexpr uint32_t XK_Multi_key = 0xFF20;
-static constexpr uint32_t XK_Kanji = 0xFF21;
-static constexpr uint32_t XK_Muhenkan = 0xFF22;
-static constexpr uint32_t XK_Henkan = 0xFF23;
-static constexpr uint32_t XK_Henkan_Mode = 0xFF23;
-static constexpr uint32_t XK_Romaji = 0xFF24;
-static constexpr uint32_t XK_Hiragana = 0xFF25;
-static constexpr uint32_t XK_Katakana = 0xFF26;
-static constexpr uint32_t XK_Hiragana_Katakana = 0xFF27;
-static constexpr uint32_t XK_Zenkaku = 0xFF28;
-static constexpr uint32_t XK_Hankaku = 0xFF29;
-static constexpr uint32_t XK_Zenkaku_Hankaku = 0xFF2A;
-static constexpr uint32_t XK_Kana_Lock = 0xFF2D;
-static constexpr uint32_t XK_Kana_Shift = 0xFF2E;
-static constexpr uint32_t XK_Eisu_Shift = 0xFF2F;
-static constexpr uint32_t XK_Eisu_toggle = 0xFF30;
-static constexpr uint32_t XK_Hangul = 0xFF31;
-static constexpr uint32_t XK_Hangul_Start = 0xFF32;
-static constexpr uint32_t XK_Hangul_End = 0xFF33;
-static constexpr uint32_t XK_Hangul_Hanja = 0xFF34;
-static constexpr uint32_t XK_Hangul_Jamo = 0xFF35;
-static constexpr uint32_t XK_Hangul_Romaja = 0xFF36;
-static constexpr uint32_t XK_Codeinput = 0xFF37;
-static constexpr uint32_t XK_Hangul_Jeonja = 0xFF38;
-static constexpr uint32_t XK_Hangul_Banja = 0xFF39;
-static constexpr uint32_t XK_Hangul_PreHanja = 0xFF3A;
-static constexpr uint32_t XK_Hangul_PostHanja = 0xFF3B;
-static constexpr uint32_t XK_SingleCandidate = 0xFF3C;
-static constexpr uint32_t XK_MultipleCandidate = 0xFF3D;
-static constexpr uint32_t XK_PreviousCandidate = 0xFF3E;
-static constexpr uint32_t XK_Hangul_Special = 0xFF3F;
-static constexpr uint32_t XK_Home = 0xFF50;
-static constexpr uint32_t XK_Left = 0xFF51;
-static constexpr uint32_t XK_Up = 0xFF52;
-static constexpr uint32_t XK_Right = 0xFF53;
-static constexpr uint32_t XK_Down = 0xFF54;
-static constexpr uint32_t XK_Page_Up = 0xFF55;
-static constexpr uint32_t XK_Prior = 0xFF55;
-static constexpr uint32_t XK_Next = 0xFF56;
-static constexpr uint32_t XK_Page_Down = 0xFF56;
-static constexpr uint32_t XK_End = 0xFF57;
-static constexpr uint32_t XK_Select = 0xFF60;
-static constexpr uint32_t XK_Print = 0xFF61;
-static constexpr uint32_t XK_Execute = 0xFF62;
-static constexpr uint32_t XK_Insert = 0xFF63;
-static constexpr uint32_t XK_Undo = 0xFF65;
-static constexpr uint32_t XK_Redo = 0xFF66;
-static constexpr uint32_t XK_Menu = 0xFF67;
-static constexpr uint32_t XK_Find = 0xFF68;
-static constexpr uint32_t XK_Cancel = 0xFF69;
-static constexpr uint32_t XK_Help = 0xFF6A;
-static constexpr uint32_t XK_Break = 0xFF6B;
-static constexpr uint32_t XK_Mode_switch = 0xFF7E;
-static constexpr uint32_t XK_Num_Lock = 0xFF7F;
-static constexpr uint32_t XK_KP_Space = 0xFF80;
-static constexpr uint32_t XK_KP_Tab = 0xFF89;
-static constexpr uint32_t XK_KP_Enter = 0xFF8D;
-static constexpr uint32_t XK_KP_F1 = 0xFF91;
-static constexpr uint32_t XK_KP_F2 = 0xFF92;
-static constexpr uint32_t XK_KP_F3 = 0xFF93;
-static constexpr uint32_t XK_KP_F4 = 0xFF94;
-static constexpr uint32_t XK_KP_Home = 0xFF95;
-static constexpr uint32_t XK_KP_Left = 0xFF96;
-static constexpr uint32_t XK_KP_Up = 0xFF97;
-static constexpr uint32_t XK_KP_Right = 0xFF98;
-static constexpr uint32_t XK_KP_Down = 0xFF99;
-static constexpr uint32_t XK_KP_Page_Up = 0xFF9A;
-static constexpr uint32_t XK_KP_Prior = 0xFF9A;
-static constexpr uint32_t XK_KP_Next = 0xFF9B;
-static constexpr uint32_t XK_KP_Page_Down = 0xFF9B;
-static constexpr uint32_t XK_KP_End = 0xFF9C;
-static constexpr uint32_t XK_KP_Begin = 0xFF9D;
-static constexpr uint32_t XK_KP_Insert = 0xFF9E;
-static constexpr uint32_t XK_KP_Delete = 0xFF9F;
-static constexpr uint32_t XK_KP_Multiply = 0xFFAA;
-static constexpr uint32_t XK_KP_Add = 0xFFAB;
-static constexpr uint32_t XK_KP_Separator = 0xFFAC;
-static constexpr uint32_t XK_KP_Subtract = 0xFFAD;
-static constexpr uint32_t XK_KP_Decimal = 0xFFAE;
-static constexpr uint32_t XK_KP_Divide = 0xFFAF;
-static constexpr uint32_t XK_KP_0 = 0xFFB0;
-static constexpr uint32_t XK_KP_1 = 0xFFB1;
-static constexpr uint32_t XK_KP_2 = 0xFFB2;
-static constexpr uint32_t XK_KP_3 = 0xFFB3;
-static constexpr uint32_t XK_KP_4 = 0xFFB4;
-static constexpr uint32_t XK_KP_5 = 0xFFB5;
-static constexpr uint32_t XK_KP_6 = 0xFFB6;
-static constexpr uint32_t XK_KP_7 = 0xFFB7;
-static constexpr uint32_t XK_KP_8 = 0xFFB8;
-static constexpr uint32_t XK_KP_9 = 0xFFB9;
-static constexpr uint32_t XK_KP_Equal = 0xFFBD;
-static constexpr uint32_t XK_F1 = 0xFFBE;
-static constexpr uint32_t XK_F2 = 0xFFBF;
-static constexpr uint32_t XK_F3 = 0xFFC0;
-static constexpr uint32_t XK_F4 = 0xFFC1;
-static constexpr uint32_t XK_F5 = 0xFFC2;
-static constexpr uint32_t XK_F6 = 0xFFC3;
-static constexpr uint32_t XK_F7 = 0xFFC4;
-static constexpr uint32_t XK_F8 = 0xFFC5;
-static constexpr uint32_t XK_F9 = 0xFFC6;
-static constexpr uint32_t XK_F10 = 0xFFC7;
-static constexpr uint32_t XK_F11 = 0xFFC8;
-static constexpr uint32_t XK_F12 = 0xFFC9;
-static constexpr uint32_t XK_F13 = 0xFFCA;
-static constexpr uint32_t XK_F14 = 0xFFCB;
-static constexpr uint32_t XK_F15 = 0xFFCC;
-static constexpr uint32_t XK_F16 = 0xFFCD;
-static constexpr uint32_t XK_F17 = 0xFFCE;
-static constexpr uint32_t XK_F18 = 0xFFCF;
-static constexpr uint32_t XK_F19 = 0xFFD0;
-static constexpr uint32_t XK_F20 = 0xFFD1;
-static constexpr uint32_t XK_F21 = 0xFFD2;
-static constexpr uint32_t XK_F22 = 0xFFD3;
-static constexpr uint32_t XK_F23 = 0xFFD4;
-static constexpr uint32_t XK_F24 = 0xFFD5;
-static constexpr uint32_t XK_F25 = 0xFFD6;
-static constexpr uint32_t XK_F26 = 0xFFD7;
-static constexpr uint32_t XK_F27 = 0xFFD8;
-static constexpr uint32_t XK_F28 = 0xFFD9;
-static constexpr uint32_t XK_F29 = 0xFFDA;
-static constexpr uint32_t XK_F30 = 0xFFDB;
-static constexpr uint32_t XK_F31 = 0xFFDC;
-static constexpr uint32_t XK_F32 = 0xFFDD;
-static constexpr uint32_t XK_F33 = 0xFFDE;
-static constexpr uint32_t XK_F34 = 0xFFDF;
-static constexpr uint32_t XK_F35 = 0xFFE0;
-static constexpr uint32_t XK_Shift_L = 0xFFE1;
-static constexpr uint32_t XK_Shift_R = 0xFFE2;
-static constexpr uint32_t XK_Control_L = 0xFFE3;
-static constexpr uint32_t XK_Control_R = 0xFFE4;
-static constexpr uint32_t XK_Caps_Lock = 0xFFE5;
-static constexpr uint32_t XK_Shift_Lock = 0xFFE6;
-static constexpr uint32_t XK_Meta_L = 0xFFE7;
-static constexpr uint32_t XK_Meta_R = 0xFFE8;
-static constexpr uint32_t XK_Alt_L = 0xFFE9;
-static constexpr uint32_t XK_Alt_R = 0xFFEA;
-static constexpr uint32_t XK_Super_L = 0xFFEB;
-static constexpr uint32_t XK_Super_R = 0xFFEC;
-static constexpr uint32_t XK_Hyper_L = 0xFFED;
-static constexpr uint32_t XK_Hyper_R = 0xFFEE;
-static constexpr uint32_t XK_Delete = 0xFFFF;
-static constexpr uint32_t XK_VoidSymbol = 0xFFFFFF;
-static constexpr uint32_t SunXK_Props = 0x1005FF70;
-static constexpr uint32_t SunXK_Copy = 0x1005FF72;
-static constexpr uint32_t SunXK_Open = 0x1005FF73;
-static constexpr uint32_t SunXK_Paste = 0x1005FF74;
-static constexpr uint32_t SunXK_Cut = 0x1005FF75;
-static constexpr uint32_t XF86XK_ClearGrab = 0x1008FE21;
-static constexpr uint32_t XF86XK_Next_VMode = 0x1008FE22;
-static constexpr uint32_t XF86XK_MonBrightnessUp = 0x1008FF02;
-static constexpr uint32_t XF86XK_MonBrightnessDown = 0x1008FF03;
-static constexpr uint32_t XF86XK_KbdBrightnessUp = 0x1008FF05;
-static constexpr uint32_t XF86XK_KbdBrightnessDown = 0x1008FF06;
-static constexpr uint32_t XF86XK_Standby = 0x1008FF10;
-static constexpr uint32_t XF86XK_AudioLowerVolume = 0x1008FF11;
-static constexpr uint32_t XF86XK_AudioMute = 0x1008FF12;
-static constexpr uint32_t XF86XK_AudioRaiseVolume = 0x1008FF13;
-static constexpr uint32_t XF86XK_AudioPlay = 0x1008FF14;
-static constexpr uint32_t XF86XK_AudioStop = 0x1008FF15;
-static constexpr uint32_t XF86XK_AudioPrev = 0x1008FF16;
-static constexpr uint32_t XF86XK_AudioNext = 0x1008FF17;
-static constexpr uint32_t XF86XK_HomePage = 0x1008FF18;
-static constexpr uint32_t XF86XK_Mail = 0x1008FF19;
-static constexpr uint32_t XF86XK_Search = 0x1008FF1B;
-static constexpr uint32_t XF86XK_AudioRecord = 0x1008FF1C;
-static constexpr uint32_t XF86XK_Calculator = 0x1008FF1D;
-static constexpr uint32_t XF86XK_Calendar = 0x1008FF20;
-static constexpr uint32_t XF86XK_Back = 0x1008FF26;
-static constexpr uint32_t XF86XK_Forward = 0x1008FF27;
-static constexpr uint32_t XF86XK_Stop = 0x1008FF28;
-static constexpr uint32_t XF86XK_Refresh = 0x1008FF29;
-static constexpr uint32_t XF86XK_PowerOff = 0x1008FF2A;
-static constexpr uint32_t XF86XK_WakeUp = 0x1008FF2B;
-static constexpr uint32_t XF86XK_Eject = 0x1008FF2C;
-static constexpr uint32_t XF86XK_ScreenSaver = 0x1008FF2D;
-static constexpr uint32_t XF86XK_WWW = 0x1008FF2E;
-static constexpr uint32_t XF86XK_Sleep = 0x1008FF2F;
-static constexpr uint32_t XF86XK_Favorites = 0x1008FF30;
-static constexpr uint32_t XF86XK_AudioPause = 0x1008FF31;
-static constexpr uint32_t XF86XK_AudioMedia = 0x1008FF32;
-static constexpr uint32_t XF86XK_MyComputer = 0x1008FF33;
-static constexpr uint32_t XF86XK_OpenURL = 0x1008FF38;
-static constexpr uint32_t XF86XK_AudioRewind = 0x1008FF3E;
-static constexpr uint32_t XF86XK_BackForward = 0x1008FF3F;
-static constexpr uint32_t XF86XK_Launch5 = 0x1008FF45;
-static constexpr uint32_t XF86XK_Launch6 = 0x1008FF46;
-static constexpr uint32_t XF86XK_Launch7 = 0x1008FF47;
-static constexpr uint32_t XF86XK_Launch8 = 0x1008FF48;
-static constexpr uint32_t XF86XK_Launch9 = 0x1008FF49;
-static constexpr uint32_t XF86XK_LaunchA = 0x1008FF4A;
-static constexpr uint32_t XF86XK_LaunchB = 0x1008FF4B;
-static constexpr uint32_t XF86XK_CD = 0x1008FF53;
-static constexpr uint32_t XF86XK_Clear = 0x1008FF55;
-static constexpr uint32_t XF86XK_Close = 0x1008FF56;
-static constexpr uint32_t XF86XK_Copy = 0x1008FF57;
-static constexpr uint32_t XF86XK_Cut = 0x1008FF58;
-static constexpr uint32_t XF86XK_Display = 0x1008FF59;
-static constexpr uint32_t XF86XK_Excel = 0x1008FF5C;
-static constexpr uint32_t XF86XK_Explorer = 0x1008FF5D;
-static constexpr uint32_t XF86XK_LogOff = 0x1008FF61;
-static constexpr uint32_t XF86XK_MenuKB = 0x1008FF65;
-static constexpr uint32_t XF86XK_MenuPB = 0x1008FF66;
-static constexpr uint32_t XF86XK_New = 0x1008FF68;
-static constexpr uint32_t XF86XK_News = 0x1008FF69;
-static constexpr uint32_t XF86XK_OfficeHome = 0x1008FF6A;
-static constexpr uint32_t XF86XK_Open = 0x1008FF6B;
-static constexpr uint32_t XF86XK_Paste = 0x1008FF6D;
-static constexpr uint32_t XF86XK_Reply = 0x1008FF72;
-static constexpr uint32_t XF86XK_Reload = 0x1008FF73;
-static constexpr uint32_t XF86XK_Save = 0x1008FF77;
-static constexpr uint32_t XF86XK_ScrollUp = 0x1008FF78;
-static constexpr uint32_t XF86XK_ScrollDown = 0x1008FF79;
-static constexpr uint32_t XF86XK_Send = 0x1008FF7B;
-static constexpr uint32_t XF86XK_Spell = 0x1008FF7C;
-static constexpr uint32_t XF86XK_SplitScreen = 0x1008FF7D;
-static constexpr uint32_t XF86XK_Tools = 0x1008FF81;
-static constexpr uint32_t XF86XK_Video = 0x1008FF87;
-static constexpr uint32_t XF86XK_Word = 0x1008FF89;
-static constexpr uint32_t XF86XK_ZoomIn = 0x1008FF8B;
-static constexpr uint32_t XF86XK_ZoomOut = 0x1008FF8C;
-static constexpr uint32_t XF86XK_WebCam = 0x1008FF8F;
-static constexpr uint32_t XF86XK_MailForward = 0x1008FF90;
-static constexpr uint32_t XF86XK_Music = 0x1008FF92;
-static constexpr uint32_t XF86XK_WLAN = 0x1008FF95;
-static constexpr uint32_t XF86XK_AudioForward = 0x1008FF97;
-static constexpr uint32_t XF86XK_AudioRandomPlay = 0x1008FF99;
-static constexpr uint32_t XF86XK_Subtitle = 0x1008FF9A;
-static constexpr uint32_t XF86XK_Select = 0x1008FFA0;
-static constexpr uint32_t XF86XK_Suspend = 0x1008FFA7;
-static constexpr uint32_t XF86XK_Hibernate = 0x1008FFA8;
+#include "third_party/x11proto/keysymdef.h"
#endif // UI_GFX_X_KEYSYMS_KEYSYMS_H_
diff --git a/chromium/ui/gfx/x/scoped_ignore_errors.cc b/chromium/ui/gfx/x/scoped_ignore_errors.cc
new file mode 100644
index 00000000000..0d9e6dff0af
--- /dev/null
+++ b/chromium/ui/gfx/x/scoped_ignore_errors.cc
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/x/scoped_ignore_errors.h"
+
+namespace x11 {
+
+namespace {
+
+void IgnoreErrors(const x11::Error* error, const char* request_name) {}
+
+} // namespace
+
+ScopedIgnoreErrors::ScopedIgnoreErrors(Connection* connection)
+ : connection_(connection) {
+ old_error_handler_ =
+ connection_->SetErrorHandler(base::BindRepeating(IgnoreErrors));
+}
+
+ScopedIgnoreErrors::~ScopedIgnoreErrors() {
+ connection_->SetErrorHandler(old_error_handler_);
+}
+
+} // namespace x11
diff --git a/chromium/ui/gfx/x/scoped_ignore_errors.h b/chromium/ui/gfx/x/scoped_ignore_errors.h
new file mode 100644
index 00000000000..baa48b5fd5a
--- /dev/null
+++ b/chromium/ui/gfx/x/scoped_ignore_errors.h
@@ -0,0 +1,26 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_X_SCOPED_IGNORE_ERRORS_H_
+#define UI_GFX_X_SCOPED_IGNORE_ERRORS_H_
+
+#include "base/component_export.h"
+#include "ui/gfx/x/connection.h"
+
+namespace x11 {
+
+// Sets a no-op error handler for a connection while this class is alive.
+class COMPONENT_EXPORT(X11) ScopedIgnoreErrors {
+ public:
+ explicit ScopedIgnoreErrors(Connection* connection);
+ ~ScopedIgnoreErrors();
+
+ private:
+ Connection* const connection_;
+ Connection::ErrorHandler old_error_handler_;
+};
+
+} // namespace x11
+
+#endif // UI_GFX_X_SCOPED_IGNORE_ERRORS_H_
diff --git a/chromium/ui/gfx/x/x11.h b/chromium/ui/gfx/x/x11.h
deleted file mode 100644
index a19c26e01bb..00000000000
--- a/chromium/ui/gfx/x/x11.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This header file replaces <X11/Xlib.h>. https://crbug.com/1066670 is
-// tracking removing usage of Xlib altogether. Do not add more Xlib
-// declarations here. The intention is to incrementally remove declarations
-// until there is nothing left, at which point this file will be removed.
-
-#ifndef UI_GFX_X_X11_H_
-#define UI_GFX_X_X11_H_
-
-#include "ui/gfx/x/connection.h"
-
-// Temporarily declare Xlib symbols we require. Do not add more Xlib
-// declarations here and do not include anything from <X11/*>.
-
-extern "C" {
-
-using Status = int;
-using Bool = int;
-using XID = unsigned long;
-using KeySym = XID;
-using KeyCode = unsigned char;
-using Window = XID;
-using Pixmap = XID;
-using Font = XID;
-using VisualID = unsigned long;
-using XPointer = char*;
-using Colormap = XID;
-using Cursor = XID;
-using Atom = unsigned long;
-using Time = unsigned long;
-using GC = struct _XGC*;
-using Display = struct _XDisplay;
-using xcb_connection_t = struct xcb_connection_t;
-
-enum XEventQueueOwner { XlibOwnsEventQueue = 0, XCBOwnsEventQueue };
-
-using XErrorEvent = struct _XErrorEvent {
- int type;
- Display* display;
- XID resourceid;
- unsigned long serial;
- unsigned char error_code;
- unsigned char request_code;
- unsigned char minor_code;
-};
-
-using XErrorHandler = int (*)(Display*, XErrorEvent*);
-using XIOErrorHandler = int (*)(Display*);
-
-Status XInitThreads(void);
-Display* XOpenDisplay(const char*);
-int XCloseDisplay(Display*);
-int XFlush(Display*);
-xcb_connection_t* XGetXCBConnection(Display* dpy);
-void XSetEventQueueOwner(Display* dpy, enum XEventQueueOwner owner);
-unsigned long XLastKnownRequestProcessed(Display*);
-int (*XSynchronize(Display*, Bool))(Display*);
-int XGetErrorDatabaseText(Display*,
- const char*,
- const char*,
- const char*,
- char*,
- int);
-int XGetErrorText(Display*, int, char*, int);
-XErrorHandler XSetErrorHandler(XErrorHandler);
-XIOErrorHandler XSetIOErrorHandler(XIOErrorHandler);
-int XStoreName(Display*, Window, const char*);
-}
-
-#endif // UI_GFX_X_X11_H_
diff --git a/chromium/ui/gfx/x/x11_atom_cache.cc b/chromium/ui/gfx/x/x11_atom_cache.cc
index cf727cd23cf..767bf21124b 100644
--- a/chromium/ui/gfx/x/x11_atom_cache.cc
+++ b/chromium/ui/gfx/x/x11_atom_cache.cc
@@ -257,7 +257,10 @@ X11AtomCache::X11AtomCache() : connection_(x11::Connection::Get()) {
std::vector<x11::Future<x11::InternAtomReply>> requests;
requests.reserve(kCacheCount);
for (const char* name : kAtomsToCache)
- requests.push_back(connection_->InternAtom({.name = name}));
+ requests.push_back(
+ connection_->InternAtom(x11::InternAtomRequest{.name = name}));
+ // Flush so all requests are sent before waiting on any replies.
+ connection_->Flush();
for (size_t i = 0; i < kCacheCount; ++i) {
if (auto response = requests[i].Sync())
cached_atoms_[kAtomsToCache[i]] = static_cast<x11::Atom>(response->atom);
@@ -272,7 +275,9 @@ x11::Atom X11AtomCache::GetAtom(const std::string& name) const {
return it->second;
x11::Atom atom = x11::Atom::None;
- if (auto response = connection_->InternAtom({.name = name}).Sync()) {
+ if (auto response =
+ connection_->InternAtom(x11::InternAtomRequest{.name = name})
+ .Sync()) {
atom = static_cast<x11::Atom>(response->atom);
cached_atoms_.emplace(name, atom);
} else {
diff --git a/chromium/ui/gfx/x/x11_atom_cache.h b/chromium/ui/gfx/x/x11_atom_cache.h
index 53fb799875f..03b8f4a50df 100644
--- a/chromium/ui/gfx/x/x11_atom_cache.h
+++ b/chromium/ui/gfx/x/x11_atom_cache.h
@@ -10,7 +10,7 @@
#include "base/macros.h"
#include "ui/gfx/gfx_export.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/xproto.h"
namespace base {
template <typename T>
diff --git a/chromium/ui/gfx/x/x11_error_tracker.cc b/chromium/ui/gfx/x/x11_error_tracker.cc
deleted file mode 100644
index 5859a5e4b39..00000000000
--- a/chromium/ui/gfx/x/x11_error_tracker.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/gfx/x/x11_error_tracker.h"
-
-#include "base/check.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
-
-namespace {
-
-unsigned char g_x11_error_code = 0;
-
-int X11ErrorHandler(Display* display, XErrorEvent* error) {
- g_x11_error_code = error->error_code;
- return 0;
-}
-
-} // namespace
-
-namespace gfx {
-
-X11ErrorTracker::X11ErrorTracker() {
- x11::Connection::Get()->Sync();
- old_handler_ = reinterpret_cast<void*>(XSetErrorHandler(X11ErrorHandler));
- g_x11_error_code = 0;
-}
-
-X11ErrorTracker::~X11ErrorTracker() {
- XSetErrorHandler(reinterpret_cast<XErrorHandler>(old_handler_));
-}
-
-bool X11ErrorTracker::FoundNewError() {
- x11::Connection::Get()->Sync();
- unsigned char error = g_x11_error_code;
- g_x11_error_code = 0;
- return error != 0;
-}
-
-} // namespace gfx
diff --git a/chromium/ui/gfx/x/x11_error_tracker.h b/chromium/ui/gfx/x/x11_error_tracker.h
deleted file mode 100644
index df06befc87f..00000000000
--- a/chromium/ui/gfx/x/x11_error_tracker.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_X_X11_ERROR_TRACKER_H_
-#define UI_GFX_X_X11_ERROR_TRACKER_H_
-
-#include "base/macros.h"
-#include "ui/gfx/gfx_export.h"
-
-namespace gfx {
-
-// X11ErrorTracker catches X11 errors in a non-fatal way. It does so by
-// temporarily changing the X11 error handler. The old error handler is
-// restored when the tracker is destroyed.
-class GFX_EXPORT X11ErrorTracker {
- public:
- X11ErrorTracker();
- ~X11ErrorTracker();
-
- // Returns whether an X11 error happened since this function was last called
- // (or since the creation of the tracker). This is potentially expensive,
- // since this causes a sync with the X server.
- bool FoundNewError();
-
- private:
- // The real type of |old_handler_| is XErrorHandler, or "int
- // (*handler)(Display *, XErrorEvent *)". However, XErrorEvent cannot be
- // forward declared, so void* is necessary here.
- void* old_handler_ = nullptr;
-
- DISALLOW_COPY_AND_ASSIGN(X11ErrorTracker);
-};
-
-} // namespace gfx
-
-#endif // UI_GFX_X_X11_ERROR_TRACKER_H_
diff --git a/chromium/ui/gfx/x/x11_path.cc b/chromium/ui/gfx/x/x11_path.cc
index 987d58345c2..823b8b617aa 100644
--- a/chromium/ui/gfx/x/x11_path.cc
+++ b/chromium/ui/gfx/x/x11_path.cc
@@ -8,7 +8,6 @@
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkRegion.h"
-#include "ui/gfx/x/x11.h"
namespace gfx {
diff --git a/chromium/ui/gfx/x/x11_types.cc b/chromium/ui/gfx/x/x11_types.cc
deleted file mode 100644
index 3e09d3e6a55..00000000000
--- a/chromium/ui/gfx/x/x11_types.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/gfx/x/x11_types.h"
-
-#include <string.h>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_switches.h"
-
-namespace gfx {
-
-XDisplay* GetXDisplay() {
- return x11::Connection::Get()->display();
-}
-
-} // namespace gfx
diff --git a/chromium/ui/gfx/x/x11_types.h b/chromium/ui/gfx/x/x11_types.h
deleted file mode 100644
index 4b6b9ec0043..00000000000
--- a/chromium/ui/gfx/x/x11_types.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_X_X11_UTIL_H_
-#define UI_GFX_X_X11_UTIL_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "ui/gfx/gfx_export.h"
-#include "ui/gfx/x/connection.h"
-
-typedef unsigned long XID;
-typedef unsigned long VisualID;
-typedef union _XEvent XEvent;
-typedef struct _XImage XImage;
-typedef struct _XGC* GC;
-typedef struct _XDisplay XDisplay;
-typedef struct _XRegion XRegion;
-typedef struct __GLXFBConfigRec* GLXFBConfig;
-typedef XID GLXWindow;
-typedef XID GLXDrawable;
-
-extern "C" {
-int XFree(void*);
-}
-
-namespace gfx {
-
-template <class T, class R, R (*F)(T*)>
-struct XObjectDeleter {
- inline void operator()(void* ptr) const { F(static_cast<T*>(ptr)); }
-};
-
-template <class T, class D = XObjectDeleter<void, int, XFree>>
-using XScopedPtr = std::unique_ptr<T, D>;
-
-// Get the XDisplay singleton. Prefer x11::Connection::Get() instead.
-GFX_EXPORT XDisplay* GetXDisplay();
-
-} // namespace gfx
-
-#endif // UI_GFX_X_X11_UTIL_H_
diff --git a/chromium/ui/gfx/x/xlib.h b/chromium/ui/gfx/x/xlib.h
new file mode 100644
index 00000000000..68f4d3ec00e
--- /dev/null
+++ b/chromium/ui/gfx/x/xlib.h
@@ -0,0 +1,17 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_X_XLIB_H_
+#define UI_GFX_X_XLIB_H_
+
+extern "C" {
+int XInitThreads(void);
+struct _XDisplay* XOpenDisplay(const char*);
+int XCloseDisplay(struct _XDisplay*);
+int XFlush(struct _XDisplay*);
+int XSynchronize(struct _XDisplay*, int);
+int XSetErrorHandler(int (*)(void*, void*));
+}
+
+#endif // UI_GFX_X_XLIB_H_
diff --git a/chromium/ui/gfx/x/xlib_support.cc b/chromium/ui/gfx/x/xlib_support.cc
new file mode 100644
index 00000000000..fe7846d0e9f
--- /dev/null
+++ b/chromium/ui/gfx/x/xlib_support.cc
@@ -0,0 +1,101 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/x/xlib_support.h"
+
+#include "base/check.h"
+#include "base/compiler_specific.h"
+#include "base/logging.h"
+#include "base/no_destructor.h"
+#include "library_loaders/xlib_loader.h"
+
+namespace x11 {
+
+namespace {
+
+int XlibErrorHandler(void*, void*) {
+ DVLOG(1) << "Xlib error received";
+ return 0;
+}
+
+XlibLoader* GetXlibLoader() {
+ static base::NoDestructor<XlibLoader> xlib_loader;
+ return xlib_loader.get();
+}
+
+} // namespace
+
+DISABLE_CFI_ICALL
+void InitXlib() {
+ auto* xlib_loader = GetXlibLoader();
+ if (xlib_loader->loaded())
+ return;
+
+ CHECK(xlib_loader->Load("libX11.so.6"));
+
+ CHECK(xlib_loader->XInitThreads());
+
+ // The default Xlib error handler calls exit(1), which we don't want. This
+ // shouldn't happen in the browser process since only XProto requests are
+ // made, but in the GPU process, GLX can make Xlib requests, so setting an
+ // error handler is necessary. Importantly, there's also an IO error handler,
+ // and Xlib always calls exit(1) with no way to change this behavior.
+ SetXlibErrorHandler();
+}
+
+DISABLE_CFI_ICALL
+void SetXlibErrorHandler() {
+ GetXlibLoader()->XSetErrorHandler(XlibErrorHandler);
+}
+
+DISABLE_CFI_ICALL
+XlibDisplay::XlibDisplay(const std::string& address) {
+ InitXlib();
+
+ display_ = GetXlibLoader()->XOpenDisplay(address.empty() ? nullptr
+ : address.c_str());
+}
+
+DISABLE_CFI_ICALL
+XlibDisplay::~XlibDisplay() {
+ if (display_)
+ GetXlibLoader()->XCloseDisplay(display_);
+}
+
+DISABLE_CFI_ICALL
+XlibDisplayWrapper::XlibDisplayWrapper(struct _XDisplay* display,
+ XlibDisplayType type)
+ : display_(display), type_(type) {
+ if (!display_)
+ return;
+ if (type == XlibDisplayType::kSyncing)
+ GetXlibLoader()->XSynchronize(display_, true);
+}
+
+DISABLE_CFI_ICALL
+XlibDisplayWrapper::~XlibDisplayWrapper() {
+ if (!display_)
+ return;
+ if (type_ == XlibDisplayType::kFlushing)
+ GetXlibLoader()->XFlush(display_);
+ else if (type_ == XlibDisplayType::kSyncing)
+ GetXlibLoader()->XSynchronize(display_, false);
+}
+
+XlibDisplayWrapper::XlibDisplayWrapper(XlibDisplayWrapper&& other) {
+ display_ = other.display_;
+ type_ = other.type_;
+ other.display_ = nullptr;
+ other.type_ = XlibDisplayType::kNormal;
+}
+
+XlibDisplayWrapper& XlibDisplayWrapper::operator=(XlibDisplayWrapper&& other) {
+ display_ = other.display_;
+ type_ = other.type_;
+ other.display_ = nullptr;
+ other.type_ = XlibDisplayType::kNormal;
+ return *this;
+}
+
+} // namespace x11
diff --git a/chromium/ui/gfx/x/xlib_support.h b/chromium/ui/gfx/x/xlib_support.h
new file mode 100644
index 00000000000..37ea34afcbd
--- /dev/null
+++ b/chromium/ui/gfx/x/xlib_support.h
@@ -0,0 +1,73 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_X_XLIB_SUPPORT_H_
+#define UI_GFX_X_XLIB_SUPPORT_H_
+
+#include <string>
+
+#include "base/component_export.h"
+
+struct _XDisplay;
+
+namespace x11 {
+
+// Specifies the behavior of XlibDisplayWrapper.
+enum class XlibDisplayType {
+ // No action taken on wrapper construction or destruction.
+ kNormal,
+
+ // Flushes the connection on destruction.
+ kFlushing,
+
+ // Synchronizes all requests while the wrapper is alive.
+ kSyncing,
+};
+
+// Loads Xlib, initializes threads, and sets a default error handler.
+COMPONENT_EXPORT(X11) void InitXlib();
+
+// Sets an async error handler which only logs an error message.
+COMPONENT_EXPORT(X11) void SetXlibErrorHandler();
+
+// A scoped Xlib display.
+class COMPONENT_EXPORT(X11) XlibDisplay {
+ public:
+ ~XlibDisplay();
+
+ private:
+ friend class Connection;
+ friend class XlibDisplayWrapper;
+
+ explicit XlibDisplay(const std::string& address);
+
+ struct _XDisplay* display_ = nullptr;
+};
+
+// A temporary wrapper around an unowned Xlib display that adds behavior
+// on construction and destruction (see XlibDisplayType).
+class COMPONENT_EXPORT(X11) XlibDisplayWrapper {
+ public:
+ ~XlibDisplayWrapper();
+
+ struct _XDisplay* display() {
+ return display_;
+ }
+ operator struct _XDisplay *() { return display_; }
+
+ XlibDisplayWrapper(XlibDisplayWrapper&& other);
+ XlibDisplayWrapper& operator=(XlibDisplayWrapper&& other);
+
+ private:
+ XlibDisplayWrapper(struct _XDisplay* display, XlibDisplayType type);
+
+ friend class Connection;
+
+ struct _XDisplay* display_;
+ XlibDisplayType type_;
+};
+
+} // namespace x11
+
+#endif // UI_GFX_X_XLIB_SUPPORT_H_
diff --git a/chromium/ui/gfx/x/xproto_internal.cc b/chromium/ui/gfx/x/xproto_internal.cc
index 83b8156a1dc..8a23cfc6da7 100644
--- a/chromium/ui/gfx/x/xproto_internal.cc
+++ b/chromium/ui/gfx/x/xproto_internal.cc
@@ -8,7 +8,6 @@
#include <xcb/xcb.h>
#include <xcb/xcbext.h>
-#include "ui/gfx/x/x11.h"
namespace x11 {
diff --git a/chromium/ui/gfx/x/xproto_internal.h b/chromium/ui/gfx/x/xproto_internal.h
index 61b930108ee..6ba0604db48 100644
--- a/chromium/ui/gfx/x/xproto_internal.h
+++ b/chromium/ui/gfx/x/xproto_internal.h
@@ -37,6 +37,9 @@ struct EnumBase<T, typename std::enable_if_t<std::is_enum<T>::value>> {
template <typename T>
using EnumBaseType = typename EnumBase<T>::type;
+template <typename T>
+void ReadError(T* error, ReadBuffer* buf);
+
// Calls free() on the underlying data when the count drops to 0.
class COMPONENT_EXPORT(X11) MallocedRefCountedMemory
: public base::RefCountedMemory {
@@ -137,10 +140,12 @@ base::Optional<unsigned int> SendRequestImpl(x11::Connection* connection,
template <typename Reply>
Future<Reply> SendRequest(x11::Connection* connection,
WriteBuffer* buf,
- bool reply_has_fds) {
+ bool reply_has_fds,
+ const char* request_name) {
auto sequence = SendRequestImpl(connection, buf, std::is_void<Reply>::value,
reply_has_fds);
- return {sequence ? connection : nullptr, sequence};
+ return {sequence ? connection : nullptr, sequence,
+ sequence ? request_name : nullptr};
}
// Helper function for xcbproto popcount. Given an integral type, returns the
diff --git a/chromium/ui/gfx/x/xproto_types.cc b/chromium/ui/gfx/x/xproto_types.cc
index 839d5466f52..af509848f09 100644
--- a/chromium/ui/gfx/x/xproto_types.cc
+++ b/chromium/ui/gfx/x/xproto_types.cc
@@ -7,9 +7,9 @@
#include <xcb/xcbext.h>
#include "base/memory/scoped_refptr.h"
+#include "base/trace_event/trace_event.h"
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/xproto_internal.h"
-#include "ui/gfx/x/xproto_util.h"
namespace x11 {
@@ -80,8 +80,11 @@ void WriteBuffer::AppendCurrentBuffer() {
}
FutureBase::FutureBase(Connection* connection,
- base::Optional<unsigned int> sequence)
- : connection_(connection), sequence_(sequence) {}
+ base::Optional<unsigned int> sequence,
+ const char* request_name)
+ : connection_(connection),
+ sequence_(sequence),
+ request_name_(request_name) {}
// If a user-defined response-handler is not installed before this object goes
// out of scope, a default response handler will be installed. The default
@@ -91,45 +94,58 @@ FutureBase::~FutureBase() {
return;
OnResponseImpl(base::BindOnce(
- [](Connection* connection, RawReply reply, RawError error) {
- if (!error)
+ [](Connection* connection, const char* request_name,
+ Connection::ErrorHandler error_handler, RawReply raw_reply,
+ RawError raw_error) {
+ if (!raw_error)
return;
- x11::LogErrorEventDescription(error->full_sequence, error->error_code,
- error->major_code, error->minor_code);
+ auto error = connection->ParseError(raw_error);
+ error_handler.Run(error.get(), request_name);
},
- connection_));
+ connection_, request_name_, connection_->error_handler_));
}
FutureBase::FutureBase(FutureBase&& future)
- : connection_(future.connection_), sequence_(future.sequence_) {
- future.connection_ = nullptr;
- future.sequence_ = base::nullopt;
+ : connection_(future.connection_),
+ sequence_(future.sequence_),
+ request_name_(future.request_name_) {
+ future.Reset();
}
FutureBase& FutureBase::operator=(FutureBase&& future) {
connection_ = future.connection_;
sequence_ = future.sequence_;
- future.connection_ = nullptr;
- future.sequence_ = base::nullopt;
+ request_name_ = future.request_name_;
+ future.Reset();
return *this;
}
-void FutureBase::SyncImpl(Error** raw_error,
- scoped_refptr<base::RefCountedMemory>* raw_reply) {
+void FutureBase::SyncImpl(RawError* raw_error, RawReply* raw_reply) {
if (!sequence_)
return;
- auto* reply = reinterpret_cast<uint8_t*>(
- xcb_wait_for_reply(connection_->XcbConnection(), *sequence_, raw_error));
+ xcb_generic_error_t* error = nullptr;
+ void* reply = nullptr;
+ if (!xcb_poll_for_reply(connection_->XcbConnection(), *sequence_, &reply,
+ &error)) {
+ TRACE_EVENT1("ui", "xcb_wait_for_reply", "request", request_name_);
+ reply =
+ xcb_wait_for_reply(connection_->XcbConnection(), *sequence_, &error);
+ }
if (reply)
*raw_reply = base::MakeRefCounted<MallocedRefCountedMemory>(reply);
+ if (error)
+ *raw_error = base::MakeRefCounted<MallocedRefCountedMemory>(error);
sequence_ = base::nullopt;
}
-void FutureBase::SyncImpl(Error** raw_error) {
+void FutureBase::SyncImpl(RawError* raw_error) {
if (!sequence_)
return;
- *raw_error = xcb_request_check(connection_->XcbConnection(), {*sequence_});
+ if (xcb_generic_error_t* error =
+ xcb_request_check(connection_->XcbConnection(), {*sequence_})) {
+ *raw_error = base::MakeRefCounted<MallocedRefCountedMemory>(error);
+ }
sequence_ = base::nullopt;
}
@@ -140,4 +156,18 @@ void FutureBase::OnResponseImpl(ResponseCallback callback) {
sequence_ = base::nullopt;
}
+// static
+std::unique_ptr<Error> FutureBase::ParseErrorImpl(x11::Connection* connection,
+ RawError raw_error) {
+ if (!raw_error)
+ return nullptr;
+ return connection->ParseError(raw_error);
+}
+
+void FutureBase::Reset() {
+ connection_ = nullptr;
+ sequence_ = base::nullopt;
+ request_name_ = nullptr;
+}
+
} // namespace x11
diff --git a/chromium/ui/gfx/x/xproto_types.h b/chromium/ui/gfx/x/xproto_types.h
index 37799e76dfd..e38c83f561d 100644
--- a/chromium/ui/gfx/x/xproto_types.h
+++ b/chromium/ui/gfx/x/xproto_types.h
@@ -5,8 +5,6 @@
#ifndef UI_GFX_X_XPROTO_TYPES_H_
#define UI_GFX_X_XPROTO_TYPES_H_
-#include <xcb/xcb.h>
-
#include <cstdint>
#include <memory>
@@ -18,8 +16,7 @@
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "base/optional.h"
-
-typedef struct _XDisplay XDisplay;
+#include "ui/gfx/x/error.h"
namespace x11 {
@@ -100,8 +97,6 @@ std::unique_ptr<Reply> ReadReply(ReadBuffer* buffer);
} // namespace detail
-using Error = xcb_generic_error_t;
-
template <class Reply>
class Future;
@@ -121,31 +116,29 @@ struct Response {
Reply* operator->() { return reply.get(); }
std::unique_ptr<Reply> reply;
- std::unique_ptr<Error, base::FreeDeleter> error;
+ std::unique_ptr<Error> error;
private:
friend class Future<Reply>;
- Response(std::unique_ptr<Reply> reply,
- std::unique_ptr<Error, base::FreeDeleter> error)
+ Response(std::unique_ptr<Reply> reply, std::unique_ptr<Error> error)
: reply(std::move(reply)), error(std::move(error)) {}
};
template <>
struct Response<void> {
- std::unique_ptr<Error, base::FreeDeleter> error;
+ std::unique_ptr<Error> error;
private:
friend class Future<void>;
- explicit Response(std::unique_ptr<Error, base::FreeDeleter> error)
- : error(std::move(error)) {}
+ explicit Response(std::unique_ptr<Error> error) : error(std::move(error)) {}
};
class COMPONENT_EXPORT(X11) FutureBase {
public:
using RawReply = scoped_refptr<base::RefCountedMemory>;
- using RawError = std::unique_ptr<xcb_generic_error_t, base::FreeDeleter>;
+ using RawError = scoped_refptr<base::RefCountedMemory>;
using ResponseCallback =
base::OnceCallback<void(RawReply reply, RawError error)>;
@@ -153,21 +146,30 @@ class COMPONENT_EXPORT(X11) FutureBase {
FutureBase& operator=(const FutureBase&) = delete;
protected:
- FutureBase(Connection* connection, base::Optional<unsigned int> sequence);
+ FutureBase(Connection* connection,
+ base::Optional<unsigned int> sequence,
+ const char* request_name);
~FutureBase();
FutureBase(FutureBase&& future);
FutureBase& operator=(FutureBase&& future);
- void SyncImpl(Error** raw_error,
- scoped_refptr<base::RefCountedMemory>* raw_reply);
- void SyncImpl(Error** raw_error);
+ void SyncImpl(RawError* raw_error, RawReply* raw_reply);
+ void SyncImpl(RawError* raw_error);
void OnResponseImpl(ResponseCallback callback);
+ x11::Connection* connection() { return connection_; }
+
+ static std::unique_ptr<Error> ParseErrorImpl(x11::Connection* connection,
+ RawError raw_error);
+
private:
- Connection* connection_;
+ void Reset();
+
+ Connection* connection_ = nullptr;
base::Optional<unsigned int> sequence_;
+ const char* request_name_ = nullptr;
};
// An x11::Future wraps an asynchronous response from the X11 server. The
@@ -178,12 +180,12 @@ class Future : public FutureBase {
public:
using Callback = base::OnceCallback<void(Response<Reply> response)>;
- Future() : FutureBase(nullptr, base::nullopt) {}
+ Future() : FutureBase(nullptr, base::nullopt, nullptr) {}
// Blocks until we receive the response from the server. Returns the response.
Response<Reply> Sync() {
- Error* raw_error = nullptr;
- scoped_refptr<base::RefCountedMemory> raw_reply;
+ RawError raw_error;
+ RawReply raw_reply;
SyncImpl(&raw_error, &raw_reply);
std::unique_ptr<Reply> reply;
@@ -192,9 +194,7 @@ class Future : public FutureBase {
reply = detail::ReadReply<Reply>(&buf);
}
- std::unique_ptr<Error, base::FreeDeleter> error;
- if (raw_error)
- error.reset(raw_error);
+ std::unique_ptr<Error> error = ParseErrorImpl(connection(), raw_error);
return {std::move(reply), std::move(error)};
}
@@ -205,13 +205,17 @@ class Future : public FutureBase {
// real Reply object before feeding the result to |callback|. This means
// |callback| must be bound as the first argument of the intermediate
// function.
- auto wrapper = [](Callback callback, RawReply raw_reply, RawError error) {
- ReadBuffer buf(raw_reply);
- std::unique_ptr<Reply> reply =
- raw_reply ? detail::ReadReply<Reply>(&buf) : nullptr;
+ auto wrapper = [](x11::Connection* connection, Callback callback,
+ RawReply raw_reply, RawError raw_error) {
+ std::unique_ptr<Reply> reply;
+ if (raw_reply) {
+ ReadBuffer buf(raw_reply);
+ reply = detail::ReadReply<Reply>(&buf);
+ }
+ std::unique_ptr<Error> error = ParseErrorImpl(connection, raw_error);
std::move(callback).Run({std::move(reply), std::move(error)});
};
- OnResponseImpl(base::BindOnce(wrapper, std::move(callback)));
+ OnResponseImpl(base::BindOnce(wrapper, connection(), std::move(callback)));
}
void IgnoreError() {
@@ -220,24 +224,21 @@ class Future : public FutureBase {
private:
template <typename R>
- friend Future<R> SendRequest(Connection*, WriteBuffer*, bool);
+ friend Future<R> SendRequest(Connection*, WriteBuffer*, bool, const char*);
- Future(Connection* connection, base::Optional<unsigned int> sequence)
- : FutureBase(connection, sequence) {}
+ Future(Connection* connection,
+ base::Optional<unsigned int> sequence,
+ const char* request_name)
+ : FutureBase(connection, sequence, request_name) {}
};
// Sync() specialization for requests that don't generate replies. The returned
// response will only contain an error if there was one.
template <>
inline Response<void> Future<void>::Sync() {
- Error* raw_error = nullptr;
+ RawError raw_error;
SyncImpl(&raw_error);
-
- std::unique_ptr<Error, base::FreeDeleter> error;
- if (raw_error)
- error.reset(raw_error);
-
- return Response<void>{std::move(error)};
+ return Response<void>{ParseErrorImpl(connection(), raw_error)};
}
// OnResponse() specialization for requests that don't generate replies. The
@@ -246,11 +247,12 @@ template <>
inline void Future<void>::OnResponse(Callback callback) {
// See Future<Reply>::OnResponse() for an explanation of why
// this wrapper is necessary.
- auto wrapper = [](Callback callback, RawReply reply, RawError error) {
+ auto wrapper = [](x11::Connection* connection, Callback callback,
+ RawReply reply, RawError error) {
DCHECK(!reply);
- std::move(callback).Run(Response<void>{std::move(error)});
+ std::move(callback).Run(Response<void>{ParseErrorImpl(connection, error)});
};
- OnResponseImpl(base::BindOnce(wrapper, std::move(callback)));
+ OnResponseImpl(base::BindOnce(wrapper, connection(), std::move(callback)));
}
template <>
diff --git a/chromium/ui/gfx/x/xproto_util.cc b/chromium/ui/gfx/x/xproto_util.cc
deleted file mode 100644
index 119fd902a46..00000000000
--- a/chromium/ui/gfx/x/xproto_util.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/gfx/x/xproto_util.h"
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/xproto.h"
-
-namespace x11 {
-
-void LogErrorEventDescription(unsigned long serial,
- uint8_t error_code,
- uint8_t request_code,
- uint8_t minor_code) {
- // This function may make some expensive round trips (XListExtensions,
- // XQueryExtension), but the only effect this function has is LOG(WARNING),
- // so early-return if the log would never be sent anyway.
- if (!LOG_IS_ON(WARNING))
- return;
-
- char error_str[256];
- char request_str[256];
-
- x11::Connection* conn = x11::Connection::Get();
- auto* dpy = conn->display();
- XGetErrorText(dpy, error_code, error_str, sizeof(error_str));
-
- strncpy(request_str, "Unknown", sizeof(request_str));
- if (request_code < 128) {
- std::string num = base::NumberToString(request_code);
- XGetErrorDatabaseText(dpy, "XRequest", num.c_str(), "Unknown", request_str,
- sizeof(request_str));
- } else {
- if (auto response = conn->ListExtensions({}).Sync()) {
- for (const auto& str : response->names) {
- const char* name = str.name.c_str();
- auto query = conn->QueryExtension({name}).Sync();
- if (query && request_code == query->major_opcode) {
- std::string msg = base::StringPrintf("%s.%d", name, minor_code);
- XGetErrorDatabaseText(dpy, "XRequest", msg.c_str(), "Unknown",
- request_str, sizeof(request_str));
- break;
- }
- }
- }
- }
-
- LOG(WARNING) << "X error received: "
- << "serial " << serial << ", "
- << "error_code " << static_cast<int>(error_code) << " ("
- << error_str << "), "
- << "request_code " << static_cast<int>(request_code) << ", "
- << "minor_code " << static_cast<int>(minor_code) << " ("
- << request_str << ")";
-}
-
-} // namespace x11
diff --git a/chromium/ui/gfx/x/xproto_util.h b/chromium/ui/gfx/x/xproto_util.h
index 3a2486eb573..1b3b00578db 100644
--- a/chromium/ui/gfx/x/xproto_util.h
+++ b/chromium/ui/gfx/x/xproto_util.h
@@ -33,12 +33,6 @@ x11::Future<void> SendEvent(
return connection->SendEvent(send_event);
}
-COMPONENT_EXPORT(X11)
-void LogErrorEventDescription(unsigned long serial,
- uint8_t error_code,
- uint8_t request_code,
- uint8_t minor_code);
-
} // namespace x11
#endif // UI_GFX_X_XPROTO_UTIL_H_
diff --git a/chromium/ui/gl/BUILD.gn b/chromium/ui/gl/BUILD.gn
index dae7f9dbd2c..a3bc53748ce 100644
--- a/chromium/ui/gl/BUILD.gn
+++ b/chromium/ui/gl/BUILD.gn
@@ -6,10 +6,10 @@ import("//build/buildflag_header.gni")
import("//build/config/chrome_build.gni")
import("//build/config/chromecast_build.gni")
import("//build/config/linux/pkg_config.gni")
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")
import("//ui/gl/features.gni")
-import("//ui/ozone/ozone.gni")
declare_args() {
# Whether service side logging (actual calls into the GL driver) is enabled
@@ -126,8 +126,6 @@ component("gl") {
"gpu_switching_manager.h",
"gpu_timing.cc",
"gpu_timing.h",
- "hdr_metadata.cc",
- "hdr_metadata.h",
"progress_reporter.h",
"scoped_binders.cc",
"scoped_binders.h",
@@ -143,8 +141,6 @@ component("gl") {
if (is_android) {
sources += [
- "android/android_surface_control_compat.cc",
- "android/android_surface_control_compat.h",
"android/scoped_java_surface.cc",
"android/scoped_java_surface.h",
"android/surface_texture.cc",
@@ -246,6 +242,10 @@ component("gl") {
]
}
+ if (use_ozone) {
+ deps += [ "//ui/ozone:buildflags" ]
+ }
+
if (use_x11 || ozone_platform_x11) {
sources += [
"gl_image_egl_pixmap.cc",
@@ -262,6 +262,7 @@ component("gl") {
"//ui/base:features",
"//ui/base/x",
"//ui/events/platform/x11:x11",
+ "//ui/gfx/linux:gpu_memory_buffer_support_x11",
]
assert(use_egl)
@@ -307,6 +308,8 @@ component("gl") {
"direct_composition_surface_win.h",
"gl_angle_util_win.cc",
"gl_angle_util_win.h",
+ "gl_fence_win.cc",
+ "gl_fence_win.h",
"gl_image_d3d.cc",
"gl_image_d3d.h",
"gl_image_dxgi.cc",
@@ -565,6 +568,7 @@ test("gl_unittests") {
if (is_win) {
sources += [
"direct_composition_surface_win_unittest.cc",
+ "gl_fence_win_unittest.cc",
"gl_image_d3d_unittest.cc",
"gl_image_dxgi_unittest.cc",
"hdr_metadata_helper_win_unittest.cc",
@@ -575,7 +579,7 @@ test("gl_unittests") {
sources += [ "gl_image_ahardwarebuffer_unittest.cc" ]
}
- if (is_desktop_linux) {
+ if (is_linux) {
sources += [ "gl_image_native_pixmap_unittest.cc" ]
}
diff --git a/chromium/ui/gl/DEPS b/chromium/ui/gl/DEPS
index 83c5cf4e472..2f1f2450dd0 100644
--- a/chromium/ui/gl/DEPS
+++ b/chromium/ui/gl/DEPS
@@ -6,6 +6,7 @@ include_rules = [
"+ui/events",
"+ui/base/x",
"+ui/gfx",
+ "+ui/ozone/buildflags.h",
]
specific_include_rules = {
@@ -21,6 +22,9 @@ specific_include_rules = {
"+third_party/angle/include/EGL/egl.h",
"+third_party/angle/include/EGL/eglext.h",
],
+ "gl_fence_win_unittest.cc": [
+ "+media/base/win/d3d11_mocks.h",
+ ],
"gl_surface_egl_unittest.cc": [
"+ui/platform_window",
],
diff --git a/chromium/ui/gl/android/scoped_java_surface.cc b/chromium/ui/gl/android/scoped_java_surface.cc
index b9dda95db22..74534d7952b 100644
--- a/chromium/ui/gl/android/scoped_java_surface.cc
+++ b/chromium/ui/gl/android/scoped_java_surface.cc
@@ -68,11 +68,9 @@ bool ScopedJavaSurface::IsValid() const {
}
// static
-ScopedJavaSurface ScopedJavaSurface::AcquireExternalSurface(jobject surface) {
- JNIEnv* env = base::android::AttachCurrentThread();
- ScopedJavaLocalRef<jobject> surface_ref;
- surface_ref.Reset(env, surface);
- ScopedJavaSurface scoped_surface(surface_ref);
+ScopedJavaSurface ScopedJavaSurface::AcquireExternalSurface(
+ const base::android::JavaRef<jobject>& surface) {
+ ScopedJavaSurface scoped_surface(surface);
scoped_surface.auto_release_ = false;
scoped_surface.is_protected_ = true;
return scoped_surface;
diff --git a/chromium/ui/gl/android/scoped_java_surface.h b/chromium/ui/gl/android/scoped_java_surface.h
index fa8d48141e8..b2d49700e6b 100644
--- a/chromium/ui/gl/android/scoped_java_surface.h
+++ b/chromium/ui/gl/android/scoped_java_surface.h
@@ -36,7 +36,8 @@ class GL_EXPORT ScopedJavaSurface {
// Creates a ScopedJavaSurface that is owned externally, i.e.,
// someone else is responsible to call Surface.release().
- static ScopedJavaSurface AcquireExternalSurface(jobject surface);
+ static ScopedJavaSurface AcquireExternalSurface(
+ const base::android::JavaRef<jobject>& surface);
~ScopedJavaSurface();
diff --git a/chromium/ui/gl/dc_layer_tree.cc b/chromium/ui/gl/dc_layer_tree.cc
index fb742857922..139613b65d1 100644
--- a/chromium/ui/gl/dc_layer_tree.cc
+++ b/chromium/ui/gl/dc_layer_tree.cc
@@ -20,11 +20,9 @@ bool SizeContains(const gfx::Size& a, const gfx::Size& b) {
} // namespace
DCLayerTree::DCLayerTree(bool disable_nv12_dynamic_textures,
- bool disable_larger_than_screen_overlays,
bool disable_vp_scaling,
bool reset_vp_when_colorspace_changes)
: disable_nv12_dynamic_textures_(disable_nv12_dynamic_textures),
- disable_larger_than_screen_overlays_(disable_larger_than_screen_overlays),
disable_vp_scaling_(disable_vp_scaling),
reset_vp_when_colorspace_changes_(reset_vp_when_colorspace_changes) {}
@@ -34,6 +32,8 @@ bool DCLayerTree::Initialize(
HWND window,
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device,
Microsoft::WRL::ComPtr<IDCompositionDevice2> dcomp_device) {
+ DCHECK(window);
+ window_ = window;
DCHECK(d3d11_device);
d3d11_device_ = std::move(d3d11_device);
DCHECK(dcomp_device);
@@ -44,7 +44,7 @@ bool DCLayerTree::Initialize(
DCHECK(desktop_device);
HRESULT hr =
- desktop_device->CreateTargetForHwnd(window, TRUE, &dcomp_target_);
+ desktop_device->CreateTargetForHwnd(window_, TRUE, &dcomp_target_);
if (FAILED(hr)) {
DLOG(ERROR) << "CreateTargetForHwnd failed with error 0x" << std::hex << hr;
return false;
@@ -69,7 +69,9 @@ bool DCLayerTree::InitializeVideoProcessor(
const gfx::Size& input_size,
const gfx::Size& output_size,
const gfx::ColorSpace& input_color_space,
- const gfx::ColorSpace& output_color_space) {
+ const gfx::ColorSpace& output_color_space,
+ Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain,
+ bool is_yuv_swapchain) {
if (!video_device_) {
// This can fail if the D3D device is "Microsoft Basic Display Adapter".
if (FAILED(d3d11_device_.As(&video_device_))) {
@@ -88,10 +90,15 @@ bool DCLayerTree::InitializeVideoProcessor(
}
bool colorspace_changed = !(input_color_space == video_input_color_space_ &&
- output_color_space == video_output_color_space_);
+ output_color_space == video_output_color_space_ &&
+ is_yuv_video_output_ == is_yuv_swapchain);
if (video_processor_ && SizeContains(video_input_size_, input_size) &&
SizeContains(video_output_size_, output_size) &&
!(colorspace_changed && reset_vp_when_colorspace_changes_)) {
+ if (colorspace_changed) {
+ SetColorSpaceForVideoProcessor(input_color_space, output_color_space,
+ std::move(swap_chain), is_yuv_swapchain);
+ }
return true;
}
TRACE_EVENT2("gpu", "DCLayerTree::InitializeVideoProcessor", "input_size",
@@ -137,34 +144,22 @@ bool DCLayerTree::InitializeVideoProcessor(
DirectCompositionSurfaceWin::DisableOverlays();
return false;
}
- // Color spaces should be updated later through
- // SetColorspaceForVideoProcessor() for the new VP.
- video_input_color_space_ = gfx::ColorSpace();
- video_output_color_space_ = gfx::ColorSpace();
-
// Auto stream processing (the default) can hurt power consumption.
video_context_->VideoProcessorSetStreamAutoProcessingMode(
video_processor_.Get(), 0, FALSE);
+ SetColorSpaceForVideoProcessor(input_color_space, output_color_space,
+ std::move(swap_chain), is_yuv_swapchain);
return true;
}
-void DCLayerTree::SetColorspaceForVideoProcessor(
+void DCLayerTree::SetColorSpaceForVideoProcessor(
const gfx::ColorSpace& input_color_space,
const gfx::ColorSpace& output_color_space,
- Microsoft::WRL::ComPtr<IDXGISwapChain1> swapchain,
+ Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain,
bool is_yuv_swapchain) {
- // Reset colorspace of video processor in two circumstances:
- // 1. Input/output colorspaces change.
- // 2. Swapchain changes.
- // Others just return.
- if ((input_color_space == video_input_color_space_) &&
- (output_color_space == video_output_color_space_) &&
- swapchain == last_swapchain_setting_colorspace_)
- return;
-
Microsoft::WRL::ComPtr<IDXGISwapChain3> swap_chain3;
Microsoft::WRL::ComPtr<ID3D11VideoContext1> context1;
- if (SUCCEEDED(swapchain.As(&swap_chain3)) &&
+ if (SUCCEEDED(swap_chain.As(&swap_chain3)) &&
SUCCEEDED(video_context_.As(&context1))) {
DCHECK(swap_chain3);
DCHECK(context1);
@@ -175,13 +170,12 @@ void DCLayerTree::SetColorspaceForVideoProcessor(
// Set output color space.
DXGI_COLOR_SPACE_TYPE output_dxgi_color_space =
gfx::ColorSpaceWin::GetDXGIColorSpace(output_color_space,
- is_yuv_swapchain /* force_yuv */);
+ /*force_yuv=*/is_yuv_swapchain);
if (SUCCEEDED(swap_chain3->SetColorSpace1(output_dxgi_color_space))) {
context1->VideoProcessorSetOutputColorSpace1(video_processor_.Get(),
output_dxgi_color_space);
}
- last_swapchain_setting_colorspace_ = swapchain;
} else {
// This can't handle as many different types of color spaces, so use it
// only if ID3D11VideoContext1 isn't available.
@@ -196,6 +190,7 @@ void DCLayerTree::SetColorspaceForVideoProcessor(
}
video_input_color_space_ = input_color_space;
video_output_color_space_ = output_color_space;
+ is_yuv_video_output_ = is_yuv_swapchain;
}
Microsoft::WRL::ComPtr<IDXGISwapChain1>
@@ -205,6 +200,16 @@ DCLayerTree::GetLayerSwapChainForTesting(size_t index) const {
return nullptr;
}
+void DCLayerTree::GetSwapChainVisualInfoForTesting(size_t index,
+ gfx::Transform* transform,
+ gfx::Point* offset,
+ gfx::Rect* clip_rect) const {
+ if (index < video_swap_chains_.size()) {
+ video_swap_chains_[index]->GetSwapChainVisualInfoForTesting( // IN-TEST
+ transform, offset, clip_rect);
+ }
+}
+
bool DCLayerTree::CommitAndClearPendingOverlays(
DirectCompositionChildSurfaceWin* root_surface) {
TRACE_EVENT1("gpu", "DCLayerTree::CommitAndClearPendingOverlays",
@@ -255,7 +260,7 @@ bool DCLayerTree::CommitAndClearPendingOverlays(
new_video_swap_chains.emplace_back(std::move(video_swap_chains_[i]));
} else {
new_video_swap_chains.emplace_back(std::make_unique<SwapChainPresenter>(
- this, d3d11_device_, dcomp_device_));
+ this, window_, d3d11_device_, dcomp_device_));
if (frame_rate_ > 0)
new_video_swap_chains.back()->SetFrameRate(frame_rate_);
}
diff --git a/chromium/ui/gl/dc_layer_tree.h b/chromium/ui/gl/dc_layer_tree.h
index a2604438949..90109a3efbb 100644
--- a/chromium/ui/gl/dc_layer_tree.h
+++ b/chromium/ui/gl/dc_layer_tree.h
@@ -29,7 +29,6 @@ class SwapChainPresenter;
class DCLayerTree {
public:
DCLayerTree(bool disable_nv12_dynamic_textures,
- bool disable_larger_than_screen_overlays,
bool disable_vp_scaling,
bool reset_vp_when_colorspace_changes);
~DCLayerTree();
@@ -51,15 +50,12 @@ class DCLayerTree {
// at least given input and output size. The video processor is shared across
// layers so the same one can be reused if it's large enough. Returns true on
// success.
- bool InitializeVideoProcessor(const gfx::Size& input_size,
- const gfx::Size& output_size,
- const gfx::ColorSpace& input_color_space,
- const gfx::ColorSpace& output_color_space);
-
- void SetColorspaceForVideoProcessor(
+ bool InitializeVideoProcessor(
+ const gfx::Size& input_size,
+ const gfx::Size& output_size,
const gfx::ColorSpace& input_color_space,
const gfx::ColorSpace& output_color_space,
- Microsoft::WRL::ComPtr<IDXGISwapChain1> swapchain,
+ Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain,
bool is_yuv_swapchain);
void SetNeedsRebuildVisualTree() { needs_rebuild_visual_tree_ = true; }
@@ -68,10 +64,6 @@ class DCLayerTree {
return disable_nv12_dynamic_textures_;
}
- bool disable_larger_than_screen_overlays() const {
- return disable_larger_than_screen_overlays_;
- }
-
bool disable_vp_scaling() const { return disable_vp_scaling_; }
const Microsoft::WRL::ComPtr<ID3D11VideoDevice>& video_device() const {
@@ -94,18 +86,31 @@ class DCLayerTree {
Microsoft::WRL::ComPtr<IDXGISwapChain1> GetLayerSwapChainForTesting(
size_t index) const;
+ void GetSwapChainVisualInfoForTesting(size_t index,
+ gfx::Transform* transform,
+ gfx::Point* offset,
+ gfx::Rect* clip_rect) const;
+
void SetFrameRate(float frame_rate);
const std::unique_ptr<HDRMetadataHelperWin>& GetHDRMetadataHelper() {
return hdr_metadata_helper_;
}
+ HWND window() const { return window_; }
+
private:
+ void SetColorSpaceForVideoProcessor(
+ const gfx::ColorSpace& input_color_space,
+ const gfx::ColorSpace& output_color_space,
+ Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain,
+ bool is_yuv_swapchain);
+
const bool disable_nv12_dynamic_textures_;
- const bool disable_larger_than_screen_overlays_;
const bool disable_vp_scaling_;
const bool reset_vp_when_colorspace_changes_;
+ HWND window_;
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_;
Microsoft::WRL::ComPtr<IDCompositionDevice2> dcomp_device_;
Microsoft::WRL::ComPtr<IDCompositionTarget> dcomp_target_;
@@ -125,9 +130,7 @@ class DCLayerTree {
// Current video processor input and output colorspace.
gfx::ColorSpace video_input_color_space_;
gfx::ColorSpace video_output_color_space_;
-
- // Cache the last swapchain that has been set output colorspace.
- Microsoft::WRL::ComPtr<IDXGISwapChain1> last_swapchain_setting_colorspace_;
+ bool is_yuv_video_output_ = false;
// Set to true if a direct composition visual tree needs rebuild.
bool needs_rebuild_visual_tree_ = false;
diff --git a/chromium/ui/gl/dc_renderer_layer_params.h b/chromium/ui/gl/dc_renderer_layer_params.h
index 63217293a0d..0016bb971f4 100644
--- a/chromium/ui/gl/dc_renderer_layer_params.h
+++ b/chromium/ui/gl/dc_renderer_layer_params.h
@@ -12,10 +12,10 @@
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/hdr_metadata.h"
#include "ui/gfx/transform.h"
#include "ui/gfx/video_types.h"
#include "ui/gl/gl_export.h"
-#include "ui/gl/hdr_metadata.h"
namespace gl {
class GLImage;
@@ -56,7 +56,7 @@ struct GL_EXPORT DCRendererLayerParams {
gfx::ProtectedVideoType protected_video_type =
gfx::ProtectedVideoType::kClear;
- gl::HDRMetadata hdr_metadata;
+ gfx::HDRMetadata hdr_metadata;
};
} // namespace ui
diff --git a/chromium/ui/gl/direct_composition_child_surface_win.cc b/chromium/ui/gl/direct_composition_child_surface_win.cc
index 02c31a4b9c8..e53dea9f034 100644
--- a/chromium/ui/gl/direct_composition_child_surface_win.cc
+++ b/chromium/ui/gl/direct_composition_child_surface_win.cc
@@ -7,6 +7,8 @@
#include <d3d11_1.h>
#include <dcomptypes.h>
+#include "base/debug/alias.h"
+#include "base/debug/dump_without_crashing.h"
#include "base/macros.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
@@ -133,11 +135,12 @@ bool DirectCompositionChildSurfaceWin::ReleaseDrawTexture(bool will_discard) {
if (dcomp_surface_.Get() == g_current_surface)
g_current_surface = nullptr;
+ HRESULT hr, device_removed_reason;
if (draw_texture_) {
draw_texture_.Reset();
if (dcomp_surface_) {
TRACE_EVENT0("gpu", "DirectCompositionChildSurfaceWin::EndDraw");
- HRESULT hr = dcomp_surface_->EndDraw();
+ hr = dcomp_surface_->EndDraw();
if (FAILED(hr)) {
DLOG(ERROR) << "EndDraw failed with error " << std::hex << hr;
return false;
@@ -153,7 +156,6 @@ bool DirectCompositionChildSurfaceWin::ReleaseDrawTexture(bool will_discard) {
TRACE_EVENT2("gpu", "DirectCompositionChildSurfaceWin::PresentSwapChain",
"interval", interval, "dirty_rect",
force_full_damage_ ? "full_damage" : swap_rect_.ToString());
- HRESULT hr;
if (force_full_damage_) {
hr = swap_chain_->Present(interval, flags);
} else {
@@ -199,8 +201,14 @@ bool DirectCompositionChildSurfaceWin::ReleaseDrawTexture(bool will_discard) {
base::WaitableEvent::ResetPolicy::AUTOMATIC,
base::WaitableEvent::InitialState::NOT_SIGNALED);
hr = dxgi_device2->EnqueueSetEvent(event.handle());
- DCHECK(SUCCEEDED(hr));
- event.Wait();
+ if (SUCCEEDED(hr)) {
+ event.Wait();
+ } else {
+ device_removed_reason = d3d11_device_->GetDeviceRemovedReason();
+ base::debug::Alias(&hr);
+ base::debug::Alias(&device_removed_reason);
+ base::debug::DumpWithoutCrashing();
+ }
}
}
}
@@ -375,7 +383,7 @@ bool DirectCompositionChildSurfaceWin::SetDrawRectangle(
desc.Format = dxgi_format;
desc.Stereo = FALSE;
desc.SampleDesc.Count = 1;
- desc.BufferCount = 2;
+ desc.BufferCount = gl::DirectCompositionRootSurfaceBufferCount();
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.Scaling = DXGI_SCALING_STRETCH;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
@@ -504,11 +512,12 @@ bool DirectCompositionChildSurfaceWin::Resize(
// ResizeBuffers can't change alpha blending mode.
if (swap_chain_ && resize_only) {
+ UINT buffer_count = gl::DirectCompositionRootSurfaceBufferCount();
DXGI_FORMAT format = gfx::ColorSpaceWin::GetDXGIFormat(color_space_);
UINT flags = DirectCompositionSurfaceWin::AllowTearing()
? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING
: 0;
- HRESULT hr = swap_chain_->ResizeBuffers(2 /* BufferCount */, size.width(),
+ HRESULT hr = swap_chain_->ResizeBuffers(buffer_count, size.width(),
size.height(), format, flags);
UMA_HISTOGRAM_BOOLEAN("GPU.DirectComposition.SwapChainResizeResult",
SUCCEEDED(hr));
diff --git a/chromium/ui/gl/direct_composition_surface_win.cc b/chromium/ui/gl/direct_composition_surface_win.cc
index f361032ea3d..2d6e985dda7 100644
--- a/chromium/ui/gl/direct_composition_surface_win.cc
+++ b/chromium/ui/gl/direct_composition_surface_win.cc
@@ -82,8 +82,11 @@ bool CheckOverlayColorSpaceSupport(
DXGI_OVERLAY_COLOR_SPACE_SUPPORT_FLAG_PRESENT);
}
-// Used for workaround limiting overlay size to monitor size.
-gfx::Size g_overlay_monitor_size;
+// Used for adjusting overlay size to monitor size.
+gfx::Size g_primary_monitor_size;
+
+// The number of all visible display monitors on a desktop.
+int g_num_of_monitors = 0;
DirectCompositionSurfaceWin::OverlayHDRInfoUpdateCallback
g_overlay_hdr_gpu_info_callback;
@@ -127,8 +130,7 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
UINT* nv12_overlay_support_flags,
UINT* yuy2_overlay_support_flags,
UINT* bgra8_overlay_support_flags,
- UINT* rgb10a2_overlay_support_flags,
- gfx::Size* overlay_monitor_size) {
+ UINT* rgb10a2_overlay_support_flags) {
// Initialization
*supports_overlays = false;
*overlay_format_used = DXGI_FORMAT_NV12;
@@ -137,7 +139,6 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
*yuy2_overlay_support_flags = 0;
*bgra8_overlay_support_flags = 0;
*rgb10a2_overlay_support_flags = 0;
- *overlay_monitor_size = gfx::Size();
// Check for DirectComposition support first to prevent likely crashes.
if (!DirectCompositionSurfaceWin::IsDirectCompositionSupported())
@@ -195,9 +196,7 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
output3->CheckOverlaySupport(DXGI_FORMAT_R10G10B10A2_UNORM,
d3d11_device.Get(),
rgb10a2_overlay_support_flags);
- if (FlagsSupportsOverlays(*nv12_overlay_support_flags) &&
- base::FeatureList::IsEnabled(
- features::kDirectCompositionPreferNV12Overlays)) {
+ if (FlagsSupportsOverlays(*nv12_overlay_support_flags)) {
// NV12 format is preferred if it's supported.
// Per Intel's request, use NV12 only when
@@ -229,13 +228,6 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
*bgra8_overlay_support_flags = *yuy2_overlay_support_flags;
}
- if (*supports_overlays) {
- DXGI_OUTPUT_DESC monitor_desc = {};
- if (SUCCEEDED(output3->GetDesc(&monitor_desc))) {
- *overlay_monitor_size =
- gfx::Rect(monitor_desc.DesktopCoordinates).size();
- }
- }
// RGB10A2 overlay is used for displaying HDR content. In Intel's
// platform, RGB10A2 overlay is enabled only when
// DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 is supported.
@@ -274,10 +266,6 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
// Software overlays always use NV12 because it's slightly more efficient and
// YUY2 was only used because Skylake doesn't support NV12 hardware overlays.
*overlay_format_used = DXGI_FORMAT_NV12;
-
- // This is only needed for https://crbug.com/720059 which is Intel only -- it
- // doesn't affect software overlays.
- *overlay_monitor_size = gfx::Size();
}
void UpdateOverlaySupport() {
@@ -292,13 +280,11 @@ void UpdateOverlaySupport() {
UINT yuy2_overlay_support_flags = 0;
UINT bgra8_overlay_support_flags = 0;
UINT rgb10a2_overlay_support_flags = 0;
- gfx::Size overlay_monitor_size = gfx::Size();
GetGpuDriverOverlayInfo(
&supports_overlays, &overlay_format_used, &overlay_format_used_hdr,
&nv12_overlay_support_flags, &yuy2_overlay_support_flags,
- &bgra8_overlay_support_flags, &rgb10a2_overlay_support_flags,
- &overlay_monitor_size);
+ &bgra8_overlay_support_flags, &rgb10a2_overlay_support_flags);
if (g_force_nv12_overlay_support) {
supports_overlays = true;
@@ -306,6 +292,23 @@ void UpdateOverlaySupport() {
overlay_format_used = DXGI_FORMAT_NV12;
}
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kDirectCompositionVideoSwapChainFormat)) {
+ std::string override_format =
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kDirectCompositionVideoSwapChainFormat);
+ if (override_format == kSwapChainFormatNV12) {
+ overlay_format_used = DXGI_FORMAT_NV12;
+ } else if (override_format == kSwapChainFormatYUY2) {
+ overlay_format_used = DXGI_FORMAT_YUY2;
+ } else if (override_format == kSwapChainFormatBGRA) {
+ overlay_format_used = DXGI_FORMAT_B8G8R8A8_UNORM;
+ } else {
+ DLOG(ERROR) << "Invalid value for switch "
+ << switches::kDirectCompositionVideoSwapChainFormat;
+ }
+ }
+
if (supports_overlays != SupportsOverlays() ||
overlay_format_used != g_overlay_format_used) {
// Record the new histograms
@@ -324,13 +327,25 @@ void UpdateOverlaySupport() {
bgra8_overlay_support_flags, rgb10a2_overlay_support_flags);
g_overlay_format_used = overlay_format_used;
g_overlay_format_used_hdr = overlay_format_used_hdr;
- g_overlay_monitor_size = overlay_monitor_size;
}
void RunOverlayHdrGpuInfoUpdateCallback() {
if (g_overlay_hdr_gpu_info_callback)
g_overlay_hdr_gpu_info_callback.Run();
}
+
+void UpdateMonitorInfo() {
+ g_num_of_monitors = GetSystemMetrics(SM_CMONITORS);
+
+ MONITORINFO monitor_info;
+ monitor_info.cbSize = sizeof(monitor_info);
+ if (GetMonitorInfo(MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY),
+ &monitor_info)) {
+ g_primary_monitor_size = gfx::Rect(monitor_info.rcMonitor).size();
+ } else {
+ g_primary_monitor_size = gfx::Size();
+ }
+}
} // namespace
DirectCompositionSurfaceWin::DirectCompositionSurfaceWin(
@@ -346,7 +361,6 @@ DirectCompositionSurfaceWin::DirectCompositionSurfaceWin(
settings.force_root_surface_full_damage)),
layer_tree_(std::make_unique<DCLayerTree>(
settings.disable_nv12_dynamic_textures,
- settings.disable_larger_than_screen_overlays,
settings.disable_vp_scaling,
settings.reset_vp_when_colorspace_changes)) {
ui::GpuSwitchingManager::GetInstance()->AddObserver(this);
@@ -368,12 +382,12 @@ bool DirectCompositionSurfaceWin::IsDirectCompositionSupported() {
if (gl::GetGLImplementation() != gl::kGLImplementationEGLANGLE)
return false;
- // Blacklist direct composition if MCTU.dll or MCTUX.dll are injected. These
+ // Blocklist direct composition if MCTU.dll or MCTUX.dll are injected. These
// are user mode drivers for display adapters from Magic Control Technology
// Corporation.
if (GetModuleHandle(TEXT("MCTU.dll")) ||
GetModuleHandle(TEXT("MCTUX.dll"))) {
- DLOG(ERROR) << "Blacklisted due to third party modules";
+ DLOG(ERROR) << "Blocklisted due to third party modules";
return false;
}
@@ -431,9 +445,7 @@ bool DirectCompositionSurfaceWin::AreOverlaysSupported() {
// static
bool DirectCompositionSurfaceWin::IsDecodeSwapChainSupported() {
- if (!g_decode_swap_chain_disabled &&
- base::FeatureList::IsEnabled(
- features::kDirectCompositionUseNV12DecodeSwapChain)) {
+ if (!g_decode_swap_chain_disabled) {
UpdateOverlaySupport();
return GetOverlayFormatUsedForSDR() == DXGI_FORMAT_NV12;
}
@@ -464,9 +476,13 @@ bool DirectCompositionSurfaceWin::AreScaledOverlaysSupported() {
(SupportsOverlays() &&
base::FeatureList::IsEnabled(
features::kDirectCompositionSoftwareOverlays));
+ } else if (g_overlay_format_used == DXGI_FORMAT_YUY2) {
+ return !!(g_yuy2_overlay_support_flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING);
+ } else {
+ DCHECK_EQ(g_overlay_format_used, DXGI_FORMAT_B8G8R8A8_UNORM);
+ // Assume scaling is supported for BGRA overlays.
+ return true;
}
- DCHECK_EQ(DXGI_FORMAT_YUY2, g_overlay_format_used);
- return !!(g_yuy2_overlay_support_flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING);
}
// static
@@ -495,8 +511,13 @@ UINT DirectCompositionSurfaceWin::GetOverlaySupportFlags(DXGI_FORMAT format) {
}
// static
-gfx::Size DirectCompositionSurfaceWin::GetOverlayMonitorSize() {
- return g_overlay_monitor_size;
+gfx::Size DirectCompositionSurfaceWin::GetPrimaryMonitorSize() {
+ return g_primary_monitor_size;
+}
+
+// static
+int DirectCompositionSurfaceWin::GetNumOfMonitors() {
+ return g_num_of_monitors;
}
// static
@@ -523,7 +544,8 @@ void DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(
// static
void DirectCompositionSurfaceWin::SetOverlayFormatUsedForTesting(
DXGI_FORMAT format) {
- DCHECK(format == DXGI_FORMAT_NV12 || format == DXGI_FORMAT_YUY2);
+ DCHECK(format == DXGI_FORMAT_NV12 || format == DXGI_FORMAT_YUY2 ||
+ format == DXGI_FORMAT_B8G8R8A8_UNORM);
UpdateOverlaySupport();
g_overlay_format_used = format;
DCHECK_EQ(format, GetOverlayFormatUsedForSDR());
@@ -581,8 +603,6 @@ bool DirectCompositionSurfaceWin::IsHDRSupported() {
continue;
}
- base::UmaHistogramSparse("GPU.Output.ColorSpace", desc.ColorSpace);
-
if (desc.ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020) {
hdr_monitor_found = true;
}
@@ -682,6 +702,7 @@ bool DirectCompositionSurfaceWin::Initialize(GLSurfaceFormat format) {
if (!root_surface_->Initialize(GLSurfaceFormat()))
return false;
+ UpdateMonitorInfo();
return true;
}
@@ -824,15 +845,21 @@ void DirectCompositionSurfaceWin::OnGpuSwitched(
void DirectCompositionSurfaceWin::OnDisplayAdded() {
InvalidateOverlayCaps();
UpdateOverlaySupport();
+ UpdateMonitorInfo();
RunOverlayHdrGpuInfoUpdateCallback();
}
void DirectCompositionSurfaceWin::OnDisplayRemoved() {
InvalidateOverlayCaps();
UpdateOverlaySupport();
+ UpdateMonitorInfo();
RunOverlayHdrGpuInfoUpdateCallback();
}
+void DirectCompositionSurfaceWin::OnDisplayMetricsChanged() {
+ UpdateMonitorInfo();
+}
+
scoped_refptr<base::TaskRunner>
DirectCompositionSurfaceWin::GetWindowTaskRunnerForTesting() {
return child_window_.GetTaskRunnerForTesting();
@@ -853,4 +880,20 @@ DirectCompositionSurfaceWin::GetRootSurfaceForTesting() const {
return root_surface_;
}
+void DirectCompositionSurfaceWin::GetSwapChainVisualInfoForTesting(
+ size_t index,
+ gfx::Transform* transform,
+ gfx::Point* offset,
+ gfx::Rect* clip_rect) const {
+ layer_tree_->GetSwapChainVisualInfoForTesting( // IN-TEST
+ index, transform, offset, clip_rect);
+}
+
+void DirectCompositionSurfaceWin::SetMonitorInfoForTesting(
+ int num_of_monitors,
+ gfx::Size monitor_size) {
+ g_num_of_monitors = num_of_monitors;
+ g_primary_monitor_size = monitor_size;
+}
+
} // namespace gl
diff --git a/chromium/ui/gl/direct_composition_surface_win.h b/chromium/ui/gl/direct_composition_surface_win.h
index 7b7c162e63a..a86764207a2 100644
--- a/chromium/ui/gl/direct_composition_surface_win.h
+++ b/chromium/ui/gl/direct_composition_surface_win.h
@@ -12,6 +12,7 @@
#include "base/callback.h"
#include "base/time/time.h"
+#include "ui/gfx/transform.h"
#include "ui/gl/child_window_win.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_surface_egl.h"
@@ -31,7 +32,6 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
struct Settings {
bool disable_nv12_dynamic_textures = false;
- bool disable_larger_than_screen_overlays = false;
bool disable_vp_scaling = false;
size_t max_pending_frames = 2;
bool use_angle_texture_offset = false;
@@ -73,7 +73,10 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
static DXGI_FORMAT GetOverlayFormatUsedForSDR();
// Returns monitor size.
- static gfx::Size GetOverlayMonitorSize();
+ static gfx::Size GetPrimaryMonitorSize();
+
+ // Get the current number of all visible display monitors on the desktop.
+ static int GetNumOfMonitors();
// Returns overlay support flags for the given format.
// Caller should check for DXGI_OVERLAY_SUPPORT_FLAG_DIRECT and
@@ -145,6 +148,7 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) override;
void OnDisplayAdded() override;
void OnDisplayRemoved() override;
+ void OnDisplayMetricsChanged() override;
HWND window() const { return window_; }
@@ -159,6 +163,13 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
scoped_refptr<DirectCompositionChildSurfaceWin> GetRootSurfaceForTesting()
const;
+ void GetSwapChainVisualInfoForTesting(size_t index,
+ gfx::Transform* transform,
+ gfx::Point* offset,
+ gfx::Rect* clip_rect) const;
+
+ void SetMonitorInfoForTesting(int num_of_monitors, gfx::Size monitor_size);
+
protected:
~DirectCompositionSurfaceWin() override;
diff --git a/chromium/ui/gl/direct_composition_surface_win_unittest.cc b/chromium/ui/gl/direct_composition_surface_win_unittest.cc
index 619b71d9204..df97d0b1f5a 100644
--- a/chromium/ui/gl/direct_composition_surface_win_unittest.cc
+++ b/chromium/ui/gl/direct_composition_surface_win_unittest.cc
@@ -7,11 +7,12 @@
#include <wrl/client.h>
#include <wrl/implements.h>
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/weak_ptr.h"
#include "base/run_loop.h"
#include "base/synchronization/waitable_event.h"
+#include "base/test/scoped_feature_list.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/win/scoped_gdi_object.h"
#include "base/win/scoped_hdc.h"
@@ -20,6 +21,7 @@
#include "ui/base/win/hidden_window.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/gdi_util.h"
+#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/transform.h"
#include "ui/gl/dc_renderer_layer_params.h"
#include "ui/gl/direct_composition_child_surface_win.h"
@@ -28,6 +30,7 @@
#include "ui/gl/gl_image_d3d.h"
#include "ui/gl/gl_image_dxgi.h"
#include "ui/gl/gl_image_ref_counted_memory.h"
+#include "ui/gl/gl_switches.h"
#include "ui/gl/gl_version_info.h"
#include "ui/gl/init/gl_factory.h"
#include "ui/platform_window/platform_window_delegate.h"
@@ -1049,6 +1052,7 @@ TEST_F(DirectCompositionPixelTest, ResizeVideoLayer) {
ASSERT_TRUE(image_dxgi->InitializeHandle(base::win::ScopedHandle(handle), 0,
gfx::BufferFormat::RGBA_8888));
+ // (1) Test if swap chain is overridden to content rect size (50, 50).
{
ui::DCRendererLayerParams params;
params.images[0] = image_dxgi;
@@ -1070,6 +1074,7 @@ TEST_F(DirectCompositionPixelTest, ResizeVideoLayer) {
EXPECT_EQ(desc.Width, 50u);
EXPECT_EQ(desc.Height, 50u);
+ // (2) Test if swap chain is overridden to content rect size (30, 30).
{
ui::DCRendererLayerParams params;
params.images[0] = image_dxgi;
@@ -1085,6 +1090,74 @@ TEST_F(DirectCompositionPixelTest, ResizeVideoLayer) {
EXPECT_TRUE(SUCCEEDED(swap_chain->GetDesc1(&desc)));
EXPECT_EQ(desc.Width, 30u);
EXPECT_EQ(desc.Height, 30u);
+
+ // (3) Test if swap chain is adjusted to fit the monitor when overlay scaling
+ // is not supported and video on-screen size is slightly smaller than the
+ // monitor. Clipping is on.
+ DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(false);
+ gfx::Size monitor_size = window_size;
+ surface_->SetMonitorInfoForTesting(1, window_size);
+ gfx::Rect on_screen_rect =
+ gfx::Rect(0, 0, monitor_size.width() - 2, monitor_size.height() - 2);
+ {
+ ui::DCRendererLayerParams params;
+ params.images[0] = image_dxgi;
+
+ params.content_rect = gfx::Rect(50, 50);
+ params.quad_rect = on_screen_rect;
+ params.clip_rect = on_screen_rect;
+ params.is_clipped = true;
+ surface_->ScheduleDCLayer(params);
+
+ EXPECT_EQ(gfx::SwapResult::SWAP_ACK,
+ surface_->SwapBuffers(base::DoNothing()));
+ }
+
+ // Swap chain is set to monitor size.
+ swap_chain = surface_->GetLayerSwapChainForTesting(0);
+ EXPECT_TRUE(SUCCEEDED(swap_chain->GetDesc1(&desc)));
+ EXPECT_EQ(static_cast<unsigned int>(monitor_size.width()), desc.Width);
+ EXPECT_EQ(static_cast<unsigned int>(monitor_size.height()), desc.Height);
+
+ gfx::Transform transform;
+ gfx::Point offset;
+ gfx::Rect clip_rect;
+ surface_->GetSwapChainVisualInfoForTesting(0, &transform, &offset,
+ &clip_rect);
+ EXPECT_TRUE(transform.IsIdentity());
+ EXPECT_EQ(gfx::Rect(monitor_size), clip_rect);
+
+ // (4) Test if the final on-screen size is adjusted to fit the monitor when
+ // overlay scaling is supported and video on-screen size is slightly bigger
+ // than the monitor. Clipping is off.
+ DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ on_screen_rect =
+ gfx::Rect(0, 0, monitor_size.width() + 2, monitor_size.height() + 2);
+ {
+ ui::DCRendererLayerParams params;
+ params.images[0] = image_dxgi;
+
+ params.content_rect = gfx::Rect(50, 50);
+ params.quad_rect = on_screen_rect;
+ surface_->ScheduleDCLayer(params);
+
+ EXPECT_EQ(gfx::SwapResult::SWAP_ACK,
+ surface_->SwapBuffers(base::DoNothing()));
+ }
+
+ // Swap chain is set to content rect size.
+ swap_chain = surface_->GetLayerSwapChainForTesting(0);
+ EXPECT_TRUE(SUCCEEDED(swap_chain->GetDesc1(&desc)));
+ EXPECT_EQ(50u, desc.Width);
+ EXPECT_EQ(50u, desc.Height);
+
+ // Make sure the new transform matrix is adjusted, so it transforms the swap
+ // chain to |new_on_screen_rect| which fits the monitor.
+ surface_->GetSwapChainVisualInfoForTesting(0, &transform, &offset,
+ &clip_rect);
+ gfx::RectF new_on_screen_rect = gfx::RectF(50, 50);
+ transform.TransformRect(&new_on_screen_rect);
+ EXPECT_EQ(gfx::Rect(monitor_size), gfx::ToEnclosingRect(new_on_screen_rect));
}
TEST_F(DirectCompositionPixelTest, SwapChainImage) {
@@ -1329,5 +1402,93 @@ TEST_F(DirectCompositionPixelTest, RootSurfaceDrawOffset) {
}
}
+void RunBufferCountTest(scoped_refptr<DirectCompositionSurfaceWin> surface,
+ UINT buffer_count,
+ bool for_video) {
+ if (!surface)
+ return;
+
+ if (for_video) {
+ DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(true);
+ EXPECT_TRUE(surface->SetEnableDCLayers(true));
+ } else {
+ EXPECT_TRUE(surface->SetEnableDCLayers(false));
+ }
+
+ constexpr gfx::Size window_size(100, 100);
+ EXPECT_TRUE(surface->Resize(window_size, 1.0, gfx::ColorSpace(), true));
+ EXPECT_TRUE(surface->SetDrawRectangle(gfx::Rect(window_size)));
+
+ glClearColor(0.0, 0.0, 0.0, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ constexpr gfx::Size texture_size(50, 50);
+ if (for_video) {
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
+ QueryD3D11DeviceObjectFromANGLE();
+ ASSERT_TRUE(d3d11_device);
+
+ Microsoft::WRL::ComPtr<ID3D11Texture2D> texture =
+ CreateNV12Texture(d3d11_device, texture_size, /*shared=*/false);
+ // The format doesn't matter, since we aren't binding.
+ scoped_refptr<GLImageDXGI> image_dxgi(
+ new GLImageDXGI(texture_size, nullptr));
+ image_dxgi->SetTexture(texture, /*level=*/0);
+
+ ui::DCRendererLayerParams params;
+ params.images[0] = image_dxgi;
+ params.content_rect = gfx::Rect(texture_size);
+ params.quad_rect = gfx::Rect(window_size);
+ EXPECT_TRUE(surface->ScheduleDCLayer(params));
+ }
+
+ EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface->SwapBuffers(base::DoNothing()));
+
+ const gfx::Size expected_size = for_video ? texture_size : window_size;
+ auto swap_chain = for_video ? surface->GetLayerSwapChainForTesting(0)
+ : surface->GetBackbufferSwapChainForTesting();
+ ASSERT_TRUE(swap_chain);
+
+ DXGI_SWAP_CHAIN_DESC1 desc;
+ EXPECT_TRUE(SUCCEEDED(swap_chain->GetDesc1(&desc)));
+ EXPECT_EQ(desc.Width, static_cast<UINT>(expected_size.width()));
+ EXPECT_EQ(desc.Height, static_cast<UINT>(expected_size.height()));
+ EXPECT_EQ(desc.BufferCount, buffer_count);
+}
+
+TEST_F(DirectCompositionSurfaceTest, RootSwapChainBufferCount) {
+ RunBufferCountTest(surface_, /*buffer_count=*/2u, /*for_video=*/false);
+}
+
+TEST_F(DirectCompositionSurfaceTest, VideoSwapChainBufferCount) {
+ RunBufferCountTest(surface_, /*buffer_count=*/2u, /*for_video=*/true);
+}
+
+class DirectCompositionTripleBufferingTest
+ : public DirectCompositionSurfaceTest {
+ public:
+ DirectCompositionTripleBufferingTest() = default;
+ ~DirectCompositionTripleBufferingTest() override = default;
+
+ protected:
+ void SetUp() override {
+ feature_list_.InitWithFeatures({features::kDCompTripleBufferRootSwapChain,
+ features::kDCompTripleBufferVideoSwapChain},
+ {});
+ DirectCompositionSurfaceTest::SetUp();
+ }
+
+ private:
+ base::test::ScopedFeatureList feature_list_;
+};
+
+TEST_F(DirectCompositionTripleBufferingTest, MainSwapChainBufferCount) {
+ RunBufferCountTest(surface_, /*buffer_count=*/3u, /*for_video=*/false);
+}
+
+TEST_F(DirectCompositionTripleBufferingTest, VideoSwapChainBufferCount) {
+ RunBufferCountTest(surface_, /*buffer_count=*/3u, /*for_video=*/true);
+}
+
} // namespace
} // namespace gl
diff --git a/chromium/ui/gl/features.gni b/chromium/ui/gl/features.gni
index 8dbbe74fe58..6d4973d40bb 100644
--- a/chromium/ui/gl/features.gni
+++ b/chromium/ui/gl/features.gni
@@ -9,7 +9,8 @@ declare_args() {
# Should EGL support be compiled?
# Can be overriden to test during bring up of EGL support on other platforms.
- use_egl = is_win || is_android || is_linux || is_chromeos || is_fuchsia || is_mac
+ use_egl =
+ is_win || is_android || is_linux || is_chromeos || is_fuchsia || is_mac
# Should Dawn support be compiled to back the WebGPU implementation?
# Also controls linking Dawn depedencies in such as SPIRV-Tools/SPIRV-Cross.
@@ -21,8 +22,8 @@ declare_args() {
}
declare_args() {
- enable_swiftshader = (is_win || is_linux || is_chromeos || (is_mac && use_egl) ||
- is_chromeos || is_fuchsia) &&
+ enable_swiftshader = (is_win || is_linux || is_chromeos ||
+ (is_mac && use_egl) || is_chromeos || is_fuchsia) &&
(target_cpu == "x86" || target_cpu == "x64" ||
target_cpu == "arm" || target_cpu == "arm64" ||
target_cpu == "mipsel" || target_cpu == "mips64el")
diff --git a/chromium/ui/gl/generate_bindings.py b/chromium/ui/gl/generate_bindings.py
index bfec8b6418e..a6f5b1d757b 100755
--- a/chromium/ui/gl/generate_bindings.py
+++ b/chromium/ui/gl/generate_bindings.py
@@ -1209,7 +1209,9 @@ GL_FUNCTIONS = [
'GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length,'
'GLint* values', },
{ 'return_type': 'void',
- 'names': ['glGetTexLevelParameterfv'],
+ 'versions': [{ 'name': 'glGetTexLevelParameterfv' },
+ {'name': 'glGetTexLevelParameterfvANGLE',
+ 'extensions': ['GL_ANGLE_get_tex_level_parameter']}],
'arguments': 'GLenum target, GLint level, GLenum pname, GLfloat* params', },
{ 'return_type': 'void',
'versions': [{'name': 'glGetTexLevelParameterfvRobustANGLE',
@@ -1218,7 +1220,9 @@ GL_FUNCTIONS = [
'GLenum target, GLint level, GLenum pname, GLsizei bufSize, '
'GLsizei* length, GLfloat* params', },
{ 'return_type': 'void',
- 'names': ['glGetTexLevelParameteriv'],
+ 'versions': [{ 'name': 'glGetTexLevelParameteriv' },
+ {'name': 'glGetTexLevelParameterivANGLE',
+ 'extensions': ['GL_ANGLE_get_tex_level_parameter']}],
'arguments': 'GLenum target, GLint level, GLenum pname, GLint* params', },
{ 'return_type': 'void',
'versions': [{'name': 'glGetTexLevelParameterivRobustANGLE',
@@ -2918,6 +2922,7 @@ FUNCTION_SETS = [
'GLES2/gl2chromium.h',
'GLES2/gl2extchromium.h'
], [
+ "GL_ANGLE_robust_resource_initialization",
"GL_ARB_texture_swizzle",
"GL_EXT_texture_swizzle",
"GL_EXT_texture_format_BGRA8888",
diff --git a/chromium/ui/gl/gl_bindings.cc b/chromium/ui/gl/gl_bindings.cc
index a68568fae62..a506154487d 100644
--- a/chromium/ui/gl/gl_bindings.cc
+++ b/chromium/ui/gl/gl_bindings.cc
@@ -11,7 +11,8 @@
#include "ui/gl/gl_bindings.h"
#if defined(USE_GLX)
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/glx.h"
#endif
#if defined(USE_EGL)
@@ -61,7 +62,8 @@ std::string DriverEGL::GetClientExtensions() {
std::string DriverGLX::GetPlatformExtensions() {
auto* connection = x11::Connection::Get();
const int screen = connection ? connection->DefaultScreenId() : 0;
- const char* str = glXQueryExtensionsString(connection->display(), screen);
+ const char* str =
+ glXQueryExtensionsString(connection->GetXlibDisplay(), screen);
return str ? std::string(str) : "";
}
#endif
diff --git a/chromium/ui/gl/gl_bindings.h b/chromium/ui/gl/gl_bindings.h
index 55c59e33331..6381082e6a8 100644
--- a/chromium/ui/gl/gl_bindings.h
+++ b/chromium/ui/gl/gl_bindings.h
@@ -37,7 +37,14 @@
#elif defined(OS_APPLE)
#include <OpenGL/OpenGL.h>
#elif defined(USE_GLX)
+using Display = struct _XDisplay;
+using Bool = int;
+using Status = int;
using XID = unsigned long;
+using Colormap = XID;
+using Font = XID;
+using Pixmap = XID;
+using Window = XID;
using GLXPixmap = XID;
using GLXWindow = XID;
using GLXDrawable = XID;
@@ -47,7 +54,6 @@ using GLXContext = struct __GLXcontextRec*;
using GLXFBConfig = struct __GLXFBConfigRec*;
struct XVisualInfo;
-#include "ui/gfx/x/x11.h"
#include <GL/glxext.h>
#include <GL/glxtokens.h>
@@ -127,6 +133,7 @@ struct XVisualInfo;
// GL_ANGLE_robust_resource_initialization
#define GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x93AB
+#define GL_RESOURCE_INITIALIZED_ANGLE 0x969F
// GL_ANGLE_request_extension
#define GL_REQUESTABLE_EXTENSIONS_ANGLE 0x93A8
diff --git a/chromium/ui/gl/gl_bindings_autogen_gl.cc b/chromium/ui/gl/gl_bindings_autogen_gl.cc
index a9c9d7a3e84..4fe60eec01e 100644
--- a/chromium/ui/gl/gl_bindings_autogen_gl.cc
+++ b/chromium/ui/gl/gl_bindings_autogen_gl.cc
@@ -287,6 +287,8 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
gfx::HasExtension(extensions, "GL_ANGLE_framebuffer_blit");
ext.b_GL_ANGLE_framebuffer_multisample =
gfx::HasExtension(extensions, "GL_ANGLE_framebuffer_multisample");
+ ext.b_GL_ANGLE_get_tex_level_parameter =
+ gfx::HasExtension(extensions, "GL_ANGLE_get_tex_level_parameter");
ext.b_GL_ANGLE_instanced_arrays =
gfx::HasExtension(extensions, "GL_ANGLE_instanced_arrays");
ext.b_GL_ANGLE_memory_object_flags =
@@ -299,6 +301,8 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
gfx::HasExtension(extensions, "GL_ANGLE_request_extension");
ext.b_GL_ANGLE_robust_client_memory =
gfx::HasExtension(extensions, "GL_ANGLE_robust_client_memory");
+ ext.b_GL_ANGLE_robust_resource_initialization =
+ gfx::HasExtension(extensions, "GL_ANGLE_robust_resource_initialization");
ext.b_GL_ANGLE_semaphore_fuchsia =
gfx::HasExtension(extensions, "GL_ANGLE_semaphore_fuchsia");
ext.b_GL_ANGLE_texture_external_update =
@@ -1785,6 +1789,10 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
fn.glGetTexLevelParameterfvFn =
reinterpret_cast<glGetTexLevelParameterfvProc>(
GetGLProcAddress("glGetTexLevelParameterfv"));
+ } else if (ext.b_GL_ANGLE_get_tex_level_parameter) {
+ fn.glGetTexLevelParameterfvFn =
+ reinterpret_cast<glGetTexLevelParameterfvProc>(
+ GetGLProcAddress("glGetTexLevelParameterfvANGLE"));
}
if (ext.b_GL_ANGLE_robust_client_memory) {
@@ -1797,6 +1805,10 @@ void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
fn.glGetTexLevelParameterivFn =
reinterpret_cast<glGetTexLevelParameterivProc>(
GetGLProcAddress("glGetTexLevelParameteriv"));
+ } else if (ext.b_GL_ANGLE_get_tex_level_parameter) {
+ fn.glGetTexLevelParameterivFn =
+ reinterpret_cast<glGetTexLevelParameterivProc>(
+ GetGLProcAddress("glGetTexLevelParameterivANGLE"));
}
if (ext.b_GL_ANGLE_robust_client_memory) {
diff --git a/chromium/ui/gl/gl_bindings_autogen_gl.h b/chromium/ui/gl/gl_bindings_autogen_gl.h
index e28fa48646d..cf41327ad5a 100644
--- a/chromium/ui/gl/gl_bindings_autogen_gl.h
+++ b/chromium/ui/gl/gl_bindings_autogen_gl.h
@@ -1955,12 +1955,14 @@ struct ExtensionsGL {
bool b_GL_ANGLE_base_vertex_base_instance;
bool b_GL_ANGLE_framebuffer_blit;
bool b_GL_ANGLE_framebuffer_multisample;
+ bool b_GL_ANGLE_get_tex_level_parameter;
bool b_GL_ANGLE_instanced_arrays;
bool b_GL_ANGLE_memory_object_flags;
bool b_GL_ANGLE_memory_object_fuchsia;
bool b_GL_ANGLE_multi_draw;
bool b_GL_ANGLE_request_extension;
bool b_GL_ANGLE_robust_client_memory;
+ bool b_GL_ANGLE_robust_resource_initialization;
bool b_GL_ANGLE_semaphore_fuchsia;
bool b_GL_ANGLE_texture_external_update;
bool b_GL_ANGLE_translated_shader_source;
diff --git a/chromium/ui/gl/gl_bindings_autogen_mock.cc b/chromium/ui/gl/gl_bindings_autogen_mock.cc
index 27ce4e6cc9c..49952b4702b 100644
--- a/chromium/ui/gl/gl_bindings_autogen_mock.cc
+++ b/chromium/ui/gl/gl_bindings_autogen_mock.cc
@@ -2705,6 +2705,15 @@ MockGLInterface::Mock_glGetTexLevelParameterfv(GLenum target,
}
void GL_BINDING_CALL
+MockGLInterface::Mock_glGetTexLevelParameterfvANGLE(GLenum target,
+ GLint level,
+ GLenum pname,
+ GLfloat* params) {
+ MakeGlMockFunctionUnique("glGetTexLevelParameterfvANGLE");
+ interface_->GetTexLevelParameterfv(target, level, pname, params);
+}
+
+void GL_BINDING_CALL
MockGLInterface::Mock_glGetTexLevelParameterfvRobustANGLE(GLenum target,
GLint level,
GLenum pname,
@@ -2726,6 +2735,15 @@ MockGLInterface::Mock_glGetTexLevelParameteriv(GLenum target,
}
void GL_BINDING_CALL
+MockGLInterface::Mock_glGetTexLevelParameterivANGLE(GLenum target,
+ GLint level,
+ GLenum pname,
+ GLint* params) {
+ MakeGlMockFunctionUnique("glGetTexLevelParameterivANGLE");
+ interface_->GetTexLevelParameteriv(target, level, pname, params);
+}
+
+void GL_BINDING_CALL
MockGLInterface::Mock_glGetTexLevelParameterivRobustANGLE(GLenum target,
GLint level,
GLenum pname,
@@ -6132,12 +6150,18 @@ MockGLInterface::GetGLProcAddress(const char* name) {
if (strcmp(name, "glGetTexLevelParameterfv") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_glGetTexLevelParameterfv);
+ if (strcmp(name, "glGetTexLevelParameterfvANGLE") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(
+ Mock_glGetTexLevelParameterfvANGLE);
if (strcmp(name, "glGetTexLevelParameterfvRobustANGLE") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_glGetTexLevelParameterfvRobustANGLE);
if (strcmp(name, "glGetTexLevelParameteriv") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_glGetTexLevelParameteriv);
+ if (strcmp(name, "glGetTexLevelParameterivANGLE") == 0)
+ return reinterpret_cast<GLFunctionPointerType>(
+ Mock_glGetTexLevelParameterivANGLE);
if (strcmp(name, "glGetTexLevelParameterivRobustANGLE") == 0)
return reinterpret_cast<GLFunctionPointerType>(
Mock_glGetTexLevelParameterivRobustANGLE);
diff --git a/chromium/ui/gl/gl_bindings_autogen_mock.h b/chromium/ui/gl/gl_bindings_autogen_mock.h
index 39f9c8eb61e..b53ea5adfa2 100644
--- a/chromium/ui/gl/gl_bindings_autogen_mock.h
+++ b/chromium/ui/gl/gl_bindings_autogen_mock.h
@@ -1159,6 +1159,10 @@ static void GL_BINDING_CALL Mock_glGetTexLevelParameterfv(GLenum target,
GLint level,
GLenum pname,
GLfloat* params);
+static void GL_BINDING_CALL Mock_glGetTexLevelParameterfvANGLE(GLenum target,
+ GLint level,
+ GLenum pname,
+ GLfloat* params);
static void GL_BINDING_CALL
Mock_glGetTexLevelParameterfvRobustANGLE(GLenum target,
GLint level,
@@ -1170,6 +1174,10 @@ static void GL_BINDING_CALL Mock_glGetTexLevelParameteriv(GLenum target,
GLint level,
GLenum pname,
GLint* params);
+static void GL_BINDING_CALL Mock_glGetTexLevelParameterivANGLE(GLenum target,
+ GLint level,
+ GLenum pname,
+ GLint* params);
static void GL_BINDING_CALL
Mock_glGetTexLevelParameterivRobustANGLE(GLenum target,
GLint level,
diff --git a/chromium/ui/gl/gl_context_cgl.cc b/chromium/ui/gl/gl_context_cgl.cc
index 917e0c13ce0..1f6cf325232 100644
--- a/chromium/ui/gl/gl_context_cgl.cc
+++ b/chromium/ui/gl/gl_context_cgl.cc
@@ -51,12 +51,8 @@ static CGLPixelFormatObj GetPixelFormat() {
g_support_renderer_switching = false;
}
if (GetGLImplementation() == kGLImplementationDesktopGLCoreProfile) {
- // These constants don't exist in the 10.6 SDK against which
- // Chromium currently compiles.
- const int kOpenGLProfile = 99;
- const int kOpenGL3_2Core = 0x3200;
- attribs.push_back(static_cast<CGLPixelFormatAttribute>(kOpenGLProfile));
- attribs.push_back(static_cast<CGLPixelFormatAttribute>(kOpenGL3_2Core));
+ attribs.push_back(kCGLPFAOpenGLProfile);
+ attribs.push_back((CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core);
}
attribs.push_back((CGLPixelFormatAttribute) 0);
diff --git a/chromium/ui/gl/gl_context_glx.cc b/chromium/ui/gl/gl_context_glx.cc
index f3ea4f7ec5d..a588ff60a45 100644
--- a/chromium/ui/gl/gl_context_glx.cc
+++ b/chromium/ui/gl/gl_context_glx.cc
@@ -11,7 +11,6 @@
#include "base/numerics/safe_conversions.h"
#include "base/trace_event/trace_event.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gl/GL/glextchromium.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_implementation.h"
@@ -26,10 +25,6 @@ namespace gl {
namespace {
-static int IgnoreX11Errors(Display*, XErrorEvent*) {
- return 0;
-}
-
using GLVersion = std::pair<int, int>;
GLXContext CreateContextAttribs(x11::Connection* connection,
@@ -64,16 +59,9 @@ GLXContext CreateContextAttribs(x11::Connection* connection,
attribs.push_back(0);
- // When creating a context with glXCreateContextAttribsARB, a variety of X11
- // errors can be generated. To prevent these errors from crashing our process,
- // we simply ignore them and only look if the GLXContext was created.
- // Sync to ensure any errors generated are processed.
-
- connection->Sync();
- auto old_error_handler = XSetErrorHandler(IgnoreX11Errors);
- GLXContext context = glXCreateContextAttribsARB(connection->display(), config,
- share, true, attribs.data());
- XSetErrorHandler(old_error_handler);
+ GLXContext context = glXCreateContextAttribsARB(
+ connection->GetXlibDisplay(x11::XlibDisplayType::kSyncing), config, share,
+ true, attribs.data());
return context;
}
@@ -92,7 +80,7 @@ GLXContext CreateHighestVersionContext(x11::Connection* connection,
// asking for OpenGL ES contexts.
std::string client_vendor =
- glXGetClientString(connection->display(), GLX_VENDOR);
+ glXGetClientString(connection->GetXlibDisplay(), GLX_VENDOR);
bool is_mesa = client_vendor.find("Mesa") != std::string::npos;
struct ContextCreationInfo {
@@ -163,10 +151,6 @@ GLXContext CreateHighestVersionContext(x11::Connection* connection,
GLContextGLX::GLContextGLX(GLShareGroup* share_group)
: GLContextReal(share_group) {}
-XDisplay* GLContextGLX::display() {
- return connection_->display();
-}
-
bool GLContextGLX::Initialize(GLSurface* compatible_surface,
const GLContextAttribs& attribs) {
// webgl_compatibility_context and disabling bind_generates_resource are not
@@ -192,7 +176,8 @@ bool GLContextGLX::Initialize(GLSurface* compatible_surface,
} else {
DVLOG(1) << "GLX_ARB_create_context not supported.";
context_ = glXCreateNewContext(
- display(), static_cast<GLXFBConfig>(compatible_surface->GetConfig()),
+ connection_->GetXlibDisplay(x11::XlibDisplayType::kSyncing),
+ static_cast<GLXFBConfig>(compatible_surface->GetConfig()),
GLX_RGBA_TYPE, share_handle, true);
if (!context_) {
LOG(ERROR) << "Failed to create GL context with glXCreateNewContext.";
@@ -206,7 +191,8 @@ bool GLContextGLX::Initialize(GLSurface* compatible_surface,
DVLOG(1) << (compatible_surface->IsOffscreen() ? "Offscreen" : "Onscreen")
<< " context was "
- << (glXIsDirect(display(), static_cast<GLXContext>(context_))
+ << (glXIsDirect(connection_->GetXlibDisplay(),
+ static_cast<GLXContext>(context_))
? "direct"
: "indirect")
<< ".";
@@ -216,7 +202,9 @@ bool GLContextGLX::Initialize(GLSurface* compatible_surface,
void GLContextGLX::Destroy() {
if (context_) {
- glXDestroyContext(display(), static_cast<GLXContext>(context_));
+ glXDestroyContext(
+ connection_->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ static_cast<GLXContext>(context_));
context_ = nullptr;
}
}
@@ -229,7 +217,8 @@ bool GLContextGLX::MakeCurrentImpl(GLSurface* surface) {
ScopedReleaseCurrent release_current;
TRACE_EVENT0("gpu", "GLContextGLX::MakeCurrent");
if (!glXMakeContextCurrent(
- display(), reinterpret_cast<GLXDrawable>(surface->GetHandle()),
+ connection_->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ reinterpret_cast<GLXDrawable>(surface->GetHandle()),
reinterpret_cast<GLXDrawable>(surface->GetHandle()),
static_cast<GLXContext>(context_))) {
LOG(ERROR) << "Couldn't make context current with X drawable.";
@@ -256,8 +245,11 @@ void GLContextGLX::ReleaseCurrent(GLSurface* surface) {
return;
SetCurrent(nullptr);
- if (!glXMakeContextCurrent(display(), 0, 0, 0))
+ if (!glXMakeContextCurrent(
+ connection_->GetXlibDisplay(x11::XlibDisplayType::kFlushing), 0, 0,
+ nullptr)) {
LOG(ERROR) << "glXMakeCurrent failed in ReleaseCurrent";
+ }
}
bool GLContextGLX::IsCurrent(GLSurface* surface) {
diff --git a/chromium/ui/gl/gl_context_glx.h b/chromium/ui/gl/gl_context_glx.h
index 184eb593932..b8925ae2fb5 100644
--- a/chromium/ui/gl/gl_context_glx.h
+++ b/chromium/ui/gl/gl_context_glx.h
@@ -9,8 +9,7 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_export.h"
@@ -23,8 +22,6 @@ class GL_EXPORT GLContextGLX : public GLContextReal {
public:
explicit GLContextGLX(GLShareGroup* share_group);
- XDisplay* display();
-
// Implement GLContext.
bool Initialize(GLSurface* compatible_surface,
const GLContextAttribs& attribs) override;
diff --git a/chromium/ui/gl/gl_context_glx_unittest.cc b/chromium/ui/gl/gl_context_glx_unittest.cc
index 2b230ea0fc3..c3bb1bb4ec9 100644
--- a/chromium/ui/gl/gl_context_glx_unittest.cc
+++ b/chromium/ui/gl/gl_context_glx_unittest.cc
@@ -7,9 +7,6 @@
#include "base/memory/scoped_refptr.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_error_tracker.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_surface_glx_x11.h"
@@ -31,8 +28,6 @@ TEST(GLContextGLXTest, MAYBE_DoNotDestroyOnFailedMakeCurrent) {
auto* connection = x11::Connection::Get();
ASSERT_TRUE(connection && connection->Ready());
- gfx::X11ErrorTracker error_tracker;
-
auto xwindow = connection->GenerateId<x11::Window>();
connection->CreateWindow({
.wid = xwindow,
@@ -65,7 +60,7 @@ TEST(GLContextGLXTest, MAYBE_DoNotDestroyOnFailedMakeCurrent) {
// Since this window is override-redirect, syncing is sufficient
// to ensure the window is destroyed and unmapped.
connection->Sync();
- ASSERT_FALSE(error_tracker.FoundNewError());
+ ASSERT_TRUE(connection->Ready());
if (context->MakeCurrent(surface.get())) {
// With some drivers, MakeCurrent() does not fail for an already-destroyed
diff --git a/chromium/ui/gl/gl_fence.cc b/chromium/ui/gl/gl_fence.cc
index cecdbd1bbc0..12f725ef8a6 100644
--- a/chromium/ui/gl/gl_fence.cc
+++ b/chromium/ui/gl/gl_fence.cc
@@ -24,6 +24,10 @@
#include "ui/gl/gl_surface_egl.h"
#endif
+#if defined(OS_WIN)
+#include "ui/gl/gl_fence_win.h"
+#endif
+
namespace gl {
GLFence::GLFence() {
@@ -95,6 +99,8 @@ void GLFence::Invalidate() {
bool GLFence::IsGpuFenceSupported() {
#if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC)
return gl::GLSurfaceEGL::IsAndroidNativeFenceSyncSupported();
+#elif defined(OS_WIN)
+ return gl::GLFenceWin::IsSupported();
#else
return false;
#endif
@@ -106,6 +112,8 @@ std::unique_ptr<GLFence> GLFence::CreateFromGpuFence(
DCHECK(IsGpuFenceSupported());
#if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC)
return GLFenceAndroidNativeFenceSync::CreateFromGpuFence(gpu_fence);
+#elif defined(OS_WIN)
+ return GLFenceWin::CreateFromGpuFence(gpu_fence);
#else
NOTREACHED();
return nullptr;
@@ -117,9 +125,12 @@ std::unique_ptr<GLFence> GLFence::CreateForGpuFence() {
DCHECK(IsGpuFenceSupported());
#if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC)
return GLFenceAndroidNativeFenceSync::CreateForGpuFence();
-#endif
+#elif defined(OS_WIN)
+ return GLFenceWin::CreateForGpuFence();
+#else
NOTREACHED();
return nullptr;
+#endif
}
std::unique_ptr<gfx::GpuFence> GLFence::GetGpuFence() {
diff --git a/chromium/ui/gl/gl_fence_egl.cc b/chromium/ui/gl/gl_fence_egl.cc
index 27bd78033ce..eb32bf1d254 100644
--- a/chromium/ui/gl/gl_fence_egl.cc
+++ b/chromium/ui/gl/gl_fence_egl.cc
@@ -10,17 +10,6 @@
namespace gl {
-namespace {
-
-bool g_ignore_egl_sync_failures = false;
-
-} // namespace
-
-// static
-void GLFenceEGL::SetIgnoreFailures() {
- g_ignore_egl_sync_failures = true;
-}
-
GLFenceEGL::GLFenceEGL() = default;
// static
@@ -66,7 +55,7 @@ bool GLFenceEGL::HasCompleted() {
void GLFenceEGL::ClientWait() {
EGLint result = ClientWaitWithTimeoutNanos(EGL_FOREVER_KHR);
- DCHECK(g_ignore_egl_sync_failures || EGL_TIMEOUT_EXPIRED_KHR != result);
+ DCHECK_NE(EGL_TIMEOUT_EXPIRED_KHR, result);
}
EGLint GLFenceEGL::ClientWaitWithTimeoutNanos(EGLTimeKHR timeout) {
@@ -75,7 +64,7 @@ EGLint GLFenceEGL::ClientWaitWithTimeoutNanos(EGLTimeKHR timeout) {
if (result == EGL_FALSE) {
LOG(ERROR) << "Failed to wait for EGLSync. error:"
<< ui::GetLastEGLErrorString();
- CHECK(g_ignore_egl_sync_failures);
+ CHECK(false);
}
return result;
}
@@ -89,7 +78,7 @@ void GLFenceEGL::ServerWait() {
if (eglWaitSyncKHR(display_, sync_, flags) == EGL_FALSE) {
LOG(ERROR) << "Failed to wait for EGLSync. error:"
<< ui::GetLastEGLErrorString();
- CHECK(g_ignore_egl_sync_failures);
+ CHECK(false);
}
}
diff --git a/chromium/ui/gl/gl_fence_egl.h b/chromium/ui/gl/gl_fence_egl.h
index 946469aeec9..b9a429dc206 100644
--- a/chromium/ui/gl/gl_fence_egl.h
+++ b/chromium/ui/gl/gl_fence_egl.h
@@ -14,8 +14,6 @@ namespace gl {
class GL_EXPORT GLFenceEGL : public GLFence {
public:
- static void SetIgnoreFailures();
-
~GLFenceEGL() override;
// Factory method using default initialization.
diff --git a/chromium/ui/gl/gl_fence_win.cc b/chromium/ui/gl/gl_fence_win.cc
new file mode 100644
index 00000000000..1c5af4bda52
--- /dev/null
+++ b/chromium/ui/gl/gl_fence_win.cc
@@ -0,0 +1,175 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gl/gl_fence_win.h"
+
+#include "base/logging.h"
+#include "base/notreached.h"
+#include "ui/gl/gl_angle_util_win.h"
+
+#include <d3d11_4.h>
+
+namespace gl {
+
+bool GLFenceWin::IsSupported() {
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
+ gl::QueryD3D11DeviceObjectFromANGLE();
+ if (!d3d11_device)
+ return false;
+
+ // Support for ID3D11Device5 implies support for ID3D11DeviceContext4.
+ // No point in letting you create fences if you can't signal or wait on them.
+ Microsoft::WRL::ComPtr<ID3D11Device5> d3d11_device5;
+ HRESULT hr = d3d11_device.As(&d3d11_device5);
+ if (FAILED(hr)) {
+ return false;
+ }
+
+ return true;
+}
+
+std::unique_ptr<GLFenceWin> GLFenceWin::CreateForGpuFence() {
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
+ gl::QueryD3D11DeviceObjectFromANGLE();
+ if (!d3d11_device) {
+ DLOG(ERROR) << "Unable to retrieve ID3D11Device from ANGLE";
+ return nullptr;
+ }
+
+ return CreateForGpuFence(d3d11_device.Get());
+}
+
+std::unique_ptr<GLFenceWin> GLFenceWin::CreateForGpuFence(
+ ID3D11Device* d3d11_device) {
+ Microsoft::WRL::ComPtr<ID3D11Device5> d3d11_device5;
+ HRESULT hr = d3d11_device->QueryInterface(IID_PPV_ARGS(&d3d11_device5));
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to retrieve ID3D11Device5 interface "
+ << logging::SystemErrorCodeToString(hr);
+ return nullptr;
+ }
+
+ Microsoft::WRL::ComPtr<ID3D11Fence> d3d11_fence;
+ hr = d3d11_device5->CreateFence(0, D3D11_FENCE_FLAG_SHARED,
+ IID_PPV_ARGS(&d3d11_fence));
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to create ID3D11Fence "
+ << logging::SystemErrorCodeToString(hr);
+ return nullptr;
+ }
+
+ HANDLE shared_handle;
+ hr = d3d11_fence->CreateSharedHandle(
+ nullptr, DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE, nullptr,
+ &shared_handle);
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to create shared handle for DXGIResource "
+ << logging::SystemErrorCodeToString(hr);
+ return nullptr;
+ }
+
+ // Put the shared handle into an RAII object as quickly as possible to
+ // ensure we do not leak it.
+ base::win::ScopedHandle scoped_handle(shared_handle);
+
+ Microsoft::WRL::ComPtr<ID3D11DeviceContext> d3d11_device_context;
+ d3d11_device5->GetImmediateContext(&d3d11_device_context);
+
+ Microsoft::WRL::ComPtr<ID3D11DeviceContext4> d3d11_device_context4;
+ hr = d3d11_device_context.As(&d3d11_device_context4);
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to retrieve ID3D11DeviceContext4 interface "
+ << logging::SystemErrorCodeToString(hr);
+ return nullptr;
+ }
+
+ hr = d3d11_device_context4->Signal(d3d11_fence.Get(), 1);
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to Signal D3D11 fence "
+ << logging::SystemErrorCodeToString(hr);
+ return nullptr;
+ }
+
+ gfx::GpuFenceHandle gpu_fence_handle;
+ gpu_fence_handle.owned_handle = std::move(scoped_handle);
+ return std::make_unique<GLFenceWin>(std::move(d3d11_fence),
+ std::move(gpu_fence_handle));
+}
+
+std::unique_ptr<GLFenceWin> GLFenceWin::CreateFromGpuFence(
+ const gfx::GpuFence& gpu_fence) {
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
+ gl::QueryD3D11DeviceObjectFromANGLE();
+ return CreateFromGpuFence(d3d11_device.Get(), gpu_fence);
+}
+
+std::unique_ptr<GLFenceWin> GLFenceWin::CreateFromGpuFence(
+ ID3D11Device* d3d11_device,
+ const gfx::GpuFence& gpu_fence) {
+ Microsoft::WRL::ComPtr<ID3D11Device5> d3d11_device5;
+ HRESULT hr = d3d11_device->QueryInterface(IID_PPV_ARGS(&d3d11_device5));
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to retrieve ID3D11Device5 interface "
+ << logging::SystemErrorCodeToString(hr);
+ return nullptr;
+ }
+
+ gfx::GpuFenceHandle gpu_fence_handle = gpu_fence.GetGpuFenceHandle().Clone();
+ Microsoft::WRL::ComPtr<ID3D11Fence> d3d11_fence;
+ hr = d3d11_device5->OpenSharedFence(gpu_fence_handle.owned_handle.Get(),
+ IID_PPV_ARGS(&d3d11_fence));
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to open a shared fence "
+ << logging::SystemErrorCodeToString(hr);
+ return nullptr;
+ }
+
+ return std::make_unique<GLFenceWin>(std::move(d3d11_fence),
+ std::move(gpu_fence_handle));
+}
+
+GLFenceWin::GLFenceWin(Microsoft::WRL::ComPtr<ID3D11Fence> d3d11_fence,
+ gfx::GpuFenceHandle gpu_fence_handle)
+ : d3d11_fence_(std::move(d3d11_fence)),
+ gpu_fence_handle_(std::move(gpu_fence_handle)) {}
+
+GLFenceWin::~GLFenceWin() = default;
+
+bool GLFenceWin::HasCompleted() {
+ NOTREACHED();
+ return false;
+}
+
+void GLFenceWin::ClientWait() {
+ NOTREACHED();
+}
+
+void GLFenceWin::ServerWait() {
+ Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device;
+ d3d11_fence_->GetDevice(&d3d11_device);
+
+ Microsoft::WRL::ComPtr<ID3D11DeviceContext> d3d11_device_context;
+ d3d11_device->GetImmediateContext(&d3d11_device_context);
+
+ Microsoft::WRL::ComPtr<ID3D11DeviceContext4> d3d11_device_context4;
+ HRESULT hr = d3d11_device_context.As(&d3d11_device_context4);
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to retrieve ID3D11DeviceContext4 interface "
+ << logging::SystemErrorCodeToString(hr);
+ return;
+ }
+
+ hr = d3d11_device_context4->Wait(d3d11_fence_.Get(), 1);
+ if (FAILED(hr)) {
+ DLOG(ERROR) << "Unable to Wait on D3D11 fence "
+ << logging::SystemErrorCodeToString(hr);
+ return;
+ }
+}
+
+std::unique_ptr<gfx::GpuFence> GLFenceWin::GetGpuFence() {
+ return std::make_unique<gfx::GpuFence>(gpu_fence_handle_.Clone());
+}
+
+} // namespace gl
diff --git a/chromium/ui/gl/gl_fence_win.h b/chromium/ui/gl/gl_fence_win.h
new file mode 100644
index 00000000000..10f51137133
--- /dev/null
+++ b/chromium/ui/gl/gl_fence_win.h
@@ -0,0 +1,42 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GL_GL_FENCE_WIN_H_
+#define UI_GL_GL_FENCE_WIN_H_
+
+#include "ui/gl/gl_fence.h"
+
+#include <d3d11_3.h>
+#include <wrl/client.h>
+
+namespace gl {
+
+class GL_EXPORT GLFenceWin : public GLFence {
+ public:
+ static std::unique_ptr<GLFenceWin> CreateForGpuFence();
+ static std::unique_ptr<GLFenceWin> CreateForGpuFence(ID3D11Device*);
+ static std::unique_ptr<GLFenceWin> CreateFromGpuFence(
+ const gfx::GpuFence& gpu_fence);
+ static std::unique_ptr<GLFenceWin> CreateFromGpuFence(
+ ID3D11Device*,
+ const gfx::GpuFence& gpu_fence);
+ static bool IsSupported();
+
+ GLFenceWin(Microsoft::WRL::ComPtr<ID3D11Fence> d3d11_fence,
+ gfx::GpuFenceHandle gpu_fence_handle);
+ ~GLFenceWin() override;
+
+ bool HasCompleted() override;
+ void ClientWait() override;
+ void ServerWait() override;
+ std::unique_ptr<gfx::GpuFence> GetGpuFence() override;
+
+ private:
+ Microsoft::WRL::ComPtr<ID3D11Fence> d3d11_fence_;
+ gfx::GpuFenceHandle gpu_fence_handle_;
+};
+
+} // namespace gl
+
+#endif
diff --git a/chromium/ui/gl/gl_fence_win_unittest.cc b/chromium/ui/gl/gl_fence_win_unittest.cc
new file mode 100644
index 00000000000..0a080640741
--- /dev/null
+++ b/chromium/ui/gl/gl_fence_win_unittest.cc
@@ -0,0 +1,125 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <d3d11_3.h>
+
+#include "media/base/win/d3d11_mocks.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gl/gl_fence_win.h"
+
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::InSequence;
+using ::testing::Return;
+using ::testing::SetArgPointee;
+
+namespace gl {
+
+class GLFenceWinTest : public ::testing::Test {
+ public:
+ void SetUp() override {
+ // By default, the D3D11 device, context and fence object will allow
+ // successful calls to QueryInterface, GetImmediateContext and GetDevice,
+ // and return objects of the latest interfaces. Tests may override this
+ // behavior to simulate interfaces which are not available.
+ ON_CALL(d3d11_device_, QueryInterface(IID_ID3D11Device5, _))
+ .WillByDefault(media::SetComPointeeAndReturnOk<1>(&d3d11_device_));
+ ON_CALL(d3d11_device_, GetImmediateContext(_))
+ .WillByDefault(media::SetComPointee<0>(&d3d11_device_context_));
+
+ ON_CALL(d3d11_device_context_, QueryInterface(IID_ID3D11DeviceContext4, _))
+ .WillByDefault(
+ media::SetComPointeeAndReturnOk<1>(&d3d11_device_context_));
+
+ ON_CALL(d3d11_fence_, GetDevice(_))
+ .WillByDefault(media::SetComPointee<0>(&d3d11_device_));
+ }
+
+ protected:
+ media::D3D11DeviceMock d3d11_device_;
+ media::D3D11DeviceContextMock d3d11_device_context_;
+ media::D3D11FenceMock d3d11_fence_;
+};
+
+// Ensure graceful failure when ID3D11Device5 is not available.
+TEST_F(GLFenceWinTest, CreateForGpuFenceNoDevice5) {
+ EXPECT_CALL(d3d11_device_, QueryInterface(IID_ID3D11Device5, _))
+ .WillOnce(Return(E_NOINTERFACE));
+
+ std::unique_ptr<GLFenceWin> gl_fence_win =
+ GLFenceWin::CreateForGpuFence(&d3d11_device_);
+ EXPECT_EQ(gl_fence_win.get(), nullptr);
+}
+
+TEST_F(GLFenceWinTest, CreateForGpuFence) {
+ // Ensure created fences are made with the D3D11_FENCE_FLAG_SHARED flag so
+ // they can be used across processes.
+ EXPECT_CALL(d3d11_device_,
+ CreateFence(0, D3D11_FENCE_FLAG_SHARED, IID_ID3D11Fence, _))
+ .WillOnce(media::SetComPointeeAndReturnOk<3>(&d3d11_fence_));
+
+ // GLFenceWin internally uses base::win::ScopedHandle, which calls global
+ // functions like CloseHandle to do its job. To avoid mocking ScopedHandle,
+ // have D3D11FenceMock use a real, closeable event.
+ const HANDLE mock_handle = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
+
+ // Ensure the share handle is created with the correct read+write flags
+ // to be shared across processes.
+ EXPECT_CALL(d3d11_fence_, CreateSharedHandle(nullptr,
+ DXGI_SHARED_RESOURCE_READ |
+ DXGI_SHARED_RESOURCE_WRITE,
+ nullptr, _))
+ .WillOnce(DoAll(SetArgPointee<3>(mock_handle), Return(S_OK)));
+
+ // Ensure we signal the fence with 1 to match the wait in ServerWait.
+ EXPECT_CALL(d3d11_device_context_, Signal(&d3d11_fence_, 1))
+ .WillOnce(Return(S_OK));
+
+ std::unique_ptr<GLFenceWin> gl_fence_win =
+ GLFenceWin::CreateForGpuFence(&d3d11_device_);
+ EXPECT_NE(gl_fence_win.get(), nullptr);
+
+ std::unique_ptr<gfx::GpuFence> gpu_fence = gl_fence_win->GetGpuFence();
+ EXPECT_NE(gpu_fence, nullptr);
+ EXPECT_FALSE(gpu_fence->GetGpuFenceHandle().is_null());
+}
+
+TEST_F(GLFenceWinTest, CreateFromGpuFence) {
+ // GLFenceWin internally uses base::win::ScopedHandle, which calls global
+ // functions like CloseHandle to do its job. To avoid mocking ScopedHandle,
+ // have gfx::GpuFenceHandle use a real, closeable event.
+ const HANDLE mock_handle = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
+
+ gfx::GpuFenceHandle gpu_fence_handle;
+ EXPECT_TRUE(gpu_fence_handle.is_null());
+ gpu_fence_handle.owned_handle.Set(mock_handle);
+ EXPECT_FALSE(gpu_fence_handle.is_null());
+
+ gfx::GpuFence gpu_fence(std::move(gpu_fence_handle));
+ EXPECT_TRUE(gpu_fence_handle.is_null());
+
+ const gfx::GpuFenceHandle& fence_handle_ref = gpu_fence.GetGpuFenceHandle();
+ EXPECT_EQ(fence_handle_ref.owned_handle.Get(), mock_handle);
+ EXPECT_FALSE(fence_handle_ref.is_null());
+
+ // Ensure that CreateFromGpuFence opens the shared handle.
+ EXPECT_CALL(d3d11_device_, OpenSharedFence(_, IID_ID3D11Fence, _))
+ .WillOnce(media::SetComPointeeAndReturnOk<2>(&d3d11_fence_));
+
+ std::unique_ptr<GLFenceWin> gl_fence_win =
+ GLFenceWin::CreateFromGpuFence(&d3d11_device_, gpu_fence);
+ EXPECT_NE(gl_fence_win.get(), nullptr);
+
+ std::unique_ptr<gfx::GpuFence> gpu_fence_out = gl_fence_win->GetGpuFence();
+ EXPECT_NE(gpu_fence_out, nullptr);
+ EXPECT_FALSE(gpu_fence_out->GetGpuFenceHandle().is_null());
+
+ // Verify that Wait is called with 1 to match the Signal in CreateForGpuFence.
+ EXPECT_CALL(d3d11_device_context_, Wait(&d3d11_fence_, 1))
+ .WillOnce(Return(S_OK));
+
+ gl_fence_win->ServerWait();
+}
+
+} // namespace gl
diff --git a/chromium/ui/gl/gl_glx_api_implementation.cc b/chromium/ui/gl/gl_glx_api_implementation.cc
index 636dab27781..4881a3e2c2d 100644
--- a/chromium/ui/gl/gl_glx_api_implementation.cc
+++ b/chromium/ui/gl/gl_glx_api_implementation.cc
@@ -103,7 +103,7 @@ void TraceGLXApi::SetDisabledExtensions(
bool GetGLWindowSystemBindingInfoGLX(const GLVersionInfo& gl_info,
GLWindowSystemBindingInfo* info) {
auto* connection = x11::Connection::Get();
- auto* display = connection->display();
+ auto* display = connection->GetXlibDisplay().display();
const int screen = connection->DefaultScreenId();
const char* vendor = glXQueryServerString(display, screen, GLX_VENDOR);
const char* version = glXQueryServerString(display, screen, GLX_VERSION);
diff --git a/chromium/ui/gl/gl_image_egl_pixmap.cc b/chromium/ui/gl/gl_image_egl_pixmap.cc
index 9c638c390f9..e226c76f570 100644
--- a/chromium/ui/gl/gl_image_egl_pixmap.cc
+++ b/chromium/ui/gl/gl_image_egl_pixmap.cc
@@ -9,7 +9,6 @@
#include "base/logging.h"
#include "build/build_config.h"
#include "ui/base/ui_base_features.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gl/buffer_format_utils.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_surface_glx.h"
@@ -20,9 +19,8 @@ namespace gl {
inline EGLDisplay FromXDisplay() {
#if defined(USE_X11)
if (!features::IsUsingOzonePlatform()) {
- if (auto* x_display = gfx::GetXDisplay()) {
+ if (auto* x_display = x11::Connection::Get()->GetXlibDisplay().display())
return eglGetDisplay(reinterpret_cast<EGLNativeDisplayType>(x_display));
- }
}
#endif
return EGL_NO_DISPLAY;
@@ -40,7 +38,7 @@ GLImageEGLPixmap::~GLImageEGLPixmap() {
eglDestroySurface(display_, surface_);
}
-bool GLImageEGLPixmap::Initialize(XID pixmap) {
+bool GLImageEGLPixmap::Initialize(x11::Pixmap pixmap) {
if (eglInitialize(display_, nullptr, nullptr) != EGL_TRUE)
return false;
@@ -72,7 +70,8 @@ bool GLImageEGLPixmap::Initialize(XID pixmap) {
std::vector<EGLint> attrs = {EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TARGET, EGL_TEXTURE_2D, EGL_NONE};
- surface_ = eglCreatePixmapSurface(display_, config, pixmap, attrs.data());
+ surface_ = eglCreatePixmapSurface(
+ display_, config, static_cast<::Pixmap>(pixmap), attrs.data());
return surface_ != EGL_NO_SURFACE;
}
diff --git a/chromium/ui/gl/gl_image_egl_pixmap.h b/chromium/ui/gl/gl_image_egl_pixmap.h
index caf37a5519f..24205d65b26 100644
--- a/chromium/ui/gl/gl_image_egl_pixmap.h
+++ b/chromium/ui/gl/gl_image_egl_pixmap.h
@@ -9,7 +9,7 @@
#include "base/macros.h"
#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/glx.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_image.h"
@@ -22,7 +22,7 @@ class GL_EXPORT GLImageEGLPixmap : public GLImage {
public:
GLImageEGLPixmap(const gfx::Size& size, gfx::BufferFormat format);
- bool Initialize(XID pixmap);
+ bool Initialize(x11::Pixmap pixmap);
// Overridden from GLImage:
gfx::Size GetSize() override;
diff --git a/chromium/ui/gl/gl_image_glx.cc b/chromium/ui/gl/gl_image_glx.cc
index 47e7d9ef61a..01f95ed0445 100644
--- a/chromium/ui/gl/gl_image_glx.cc
+++ b/chromium/ui/gl/gl_image_glx.cc
@@ -2,15 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <dlfcn.h>
+
#include <memory>
#include "base/logging.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gl/buffer_format_utils.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_image_glx.h"
#include "ui/gl/gl_surface_glx.h"
#include "ui/gl/gl_visual_picker_glx.h"
+#include "ui/gl/glx_util.h"
namespace gl {
namespace {
@@ -35,26 +37,27 @@ GLImageGLX::GLImageGLX(const gfx::Size& size, gfx::BufferFormat format)
: glx_pixmap_(0), size_(size), format_(format) {}
GLImageGLX::~GLImageGLX() {
- if (glx_pixmap_)
- glXDestroyGLXPixmap(gfx::GetXDisplay(), glx_pixmap_);
+ if (glx_pixmap_) {
+ glXDestroyGLXPixmap(
+ x11::Connection::Get()->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ glx_pixmap_);
+ }
}
-bool GLImageGLX::Initialize(XID pixmap) {
+bool GLImageGLX::Initialize(x11::Pixmap pixmap) {
auto fbconfig_id =
GLVisualPickerGLX::GetInstance()->GetFbConfigForFormat(format_);
auto* connection = x11::Connection::Get();
- int attrs[] = {GLX_FBCONFIG_ID, static_cast<uint32_t>(fbconfig_id), 0};
- int nitems;
- gfx::XScopedPtr<GLXFBConfig> configs(glXChooseFBConfig(
- connection->display(), connection->DefaultScreenId(), attrs, &nitems));
- if (!nitems)
+ GLXFBConfig config = GetGlxFbConfigForXProtoFbConfig(connection, fbconfig_id);
+ if (!config)
return false;
int pixmap_attribs[] = {GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
GLX_TEXTURE_FORMAT_EXT, TextureFormat(format_), 0};
- glx_pixmap_ =
- glXCreatePixmap(gfx::GetXDisplay(), *configs, pixmap, pixmap_attribs);
+ glx_pixmap_ = glXCreatePixmap(
+ x11::Connection::Get()->GetXlibDisplay(x11::XlibDisplayType::kSyncing),
+ config, static_cast<::Pixmap>(pixmap), pixmap_attribs);
if (!glx_pixmap_) {
DVLOG(0) << "glXCreatePixmap failed.";
return false;
@@ -87,8 +90,9 @@ bool GLImageGLX::BindTexImage(unsigned target) {
if (target != GL_TEXTURE_2D)
return false;
- glXBindTexImageEXT(gfx::GetXDisplay(), glx_pixmap_, GLX_FRONT_LEFT_EXT,
- nullptr);
+ glXBindTexImageEXT(
+ x11::Connection::Get()->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ glx_pixmap_, GLX_FRONT_LEFT_EXT, nullptr);
return true;
}
@@ -96,7 +100,9 @@ void GLImageGLX::ReleaseTexImage(unsigned target) {
DCHECK_NE(0u, glx_pixmap_);
DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), target);
- glXReleaseTexImageEXT(gfx::GetXDisplay(), glx_pixmap_, GLX_FRONT_LEFT_EXT);
+ glXReleaseTexImageEXT(
+ x11::Connection::Get()->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ glx_pixmap_, GLX_FRONT_LEFT_EXT);
}
bool GLImageGLX::CopyTexImage(unsigned target) {
diff --git a/chromium/ui/gl/gl_image_glx.h b/chromium/ui/gl/gl_image_glx.h
index ecb8586764a..f97b7861894 100644
--- a/chromium/ui/gl/gl_image_glx.h
+++ b/chromium/ui/gl/gl_image_glx.h
@@ -9,7 +9,7 @@
#include "base/macros.h"
#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/glx.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_image.h"
@@ -19,7 +19,7 @@ class GL_EXPORT GLImageGLX : public GLImage {
public:
GLImageGLX(const gfx::Size& size, gfx::BufferFormat format);
- bool Initialize(XID pixmap);
+ bool Initialize(x11::Pixmap pixmap);
// Overridden from GLImage:
gfx::Size GetSize() override;
@@ -50,7 +50,7 @@ class GL_EXPORT GLImageGLX : public GLImage {
gfx::BufferFormat format() const { return format_; }
private:
- XID glx_pixmap_;
+ uint32_t glx_pixmap_;
const gfx::Size size_;
gfx::BufferFormat format_;
diff --git a/chromium/ui/gl/gl_image_glx_native_pixmap.cc b/chromium/ui/gl/gl_image_glx_native_pixmap.cc
index f4889caa587..1250ab0eee0 100644
--- a/chromium/ui/gl/gl_image_glx_native_pixmap.cc
+++ b/chromium/ui/gl/gl_image_glx_native_pixmap.cc
@@ -7,8 +7,8 @@
#include "base/posix/eintr_wrapper.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/linux/native_pixmap_dmabuf.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/dri3.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto_types.h"
#include "ui/gl/buffer_format_utils.h"
#include "ui/gl/gl_bindings.h"
@@ -48,12 +48,13 @@ int Bpp(gfx::BufferFormat format) {
}
}
-XID XPixmapFromNativePixmap(const gfx::NativePixmapDmaBuf& native_pixmap,
- int depth,
- int bpp) {
+x11::Pixmap XPixmapFromNativePixmap(
+ const gfx::NativePixmapDmaBuf& native_pixmap,
+ int depth,
+ int bpp) {
auto fd = HANDLE_EINTR(dup(native_pixmap.GetDmaBufFd(0)));
if (fd < 0)
- return 0;
+ return x11::Pixmap::None;
base::ScopedFD scoped_fd(fd);
auto* connection = x11::Connection::Get();
@@ -64,7 +65,7 @@ XID XPixmapFromNativePixmap(const gfx::NativePixmapDmaBuf& native_pixmap,
native_pixmap.GetBufferSize().height(),
native_pixmap.GetDmaBufPitch(0), depth,
bpp, std::move(scoped_fd)});
- return static_cast<uint32_t>(pixmap_id);
+ return pixmap_id;
}
} // namespace
diff --git a/chromium/ui/gl/gl_image_native_pixmap.cc b/chromium/ui/gl/gl_image_native_pixmap.cc
index 91e0293cdc7..bf785d00993 100644
--- a/chromium/ui/gl/gl_image_native_pixmap.cc
+++ b/chromium/ui/gl/gl_image_native_pixmap.cc
@@ -327,9 +327,12 @@ bool GLImageNativePixmap::ScheduleOverlayPlane(
bool enable_blend,
std::unique_ptr<gfx::GpuFence> gpu_fence) {
DCHECK(pixmap_);
+ std::vector<gfx::GpuFence> acquire_fences;
+ if (gpu_fence)
+ acquire_fences.push_back(std::move(*gpu_fence));
return pixmap_->ScheduleOverlayPlane(widget, z_order, transform, bounds_rect,
crop_rect, enable_blend,
- std::move(gpu_fence));
+ std::move(acquire_fences), {});
}
void GLImageNativePixmap::Flush() {
diff --git a/chromium/ui/gl/gl_surface_egl.cc b/chromium/ui/gl/gl_surface_egl.cc
index f038559fc47..054b4b4e9c1 100644
--- a/chromium/ui/gl/gl_surface_egl.cc
+++ b/chromium/ui/gl/gl_surface_egl.cc
@@ -810,7 +810,7 @@ void GetEGLInitDisplays(bool supports_angle_d3d,
// If no display has been explicitly requested and the DefaultANGLEOpenGL
// experiment is enabled, try creating OpenGL displays first.
// TODO(oetuaho@nvidia.com): Only enable this path on specific GPUs with a
- // blacklist entry. http://crbug.com/693090
+ // blocklist entry. http://crbug.com/693090
if (supports_angle_opengl && use_angle_default &&
base::FeatureList::IsEnabled(features::kDefaultANGLEOpenGL)) {
AddInitDisplay(init_displays, ANGLE_OPENGL);
diff --git a/chromium/ui/gl/gl_surface_egl_surface_control.cc b/chromium/ui/gl/gl_surface_egl_surface_control.cc
index 6ba5d241ce8..b0e7c0ff001 100644
--- a/chromium/ui/gl/gl_surface_egl_surface_control.cc
+++ b/chromium/ui/gl/gl_surface_egl_surface_control.cc
@@ -64,7 +64,8 @@ GLSurfaceEGLSurfaceControl::GLSurfaceEGLSurfaceControl(
ANativeWindow_getWidth(window),
ANativeWindow_getHeight(window)),
root_surface_(
- new SurfaceControl::Surface(window, root_surface_name_.c_str())),
+ new gfx::SurfaceControl::Surface(window, root_surface_name_.c_str())),
+ transaction_ack_timeout_manager_(task_runner),
gpu_task_runner_(std::move(task_runner)) {}
GLSurfaceEGLSurfaceControl::~GLSurfaceEGLSurfaceControl() {
@@ -244,7 +245,7 @@ void GLSurfaceEGLSurfaceControl::CommitPendingTransaction(
current_frame_resources_.swap(pending_frame_resources_);
pending_frame_resources_.clear();
- SurfaceControl::Transaction::OnCompleteCb callback = base::BindOnce(
+ gfx::SurfaceControl::Transaction::OnCompleteCb callback = base::BindOnce(
&GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread,
weak_factory_.GetWeakPtr(), std::move(completion_callback),
std::move(present_callback), std::move(resources_to_release),
@@ -259,6 +260,7 @@ void GLSurfaceEGLSurfaceControl::CommitPendingTransaction(
} else {
transaction_ack_pending_ = true;
pending_transaction_->Apply();
+ transaction_ack_timeout_manager_.ScheduleHangDetection();
}
pending_transaction_.reset();
@@ -287,7 +289,7 @@ bool GLSurfaceEGLSurfaceControl::ScheduleOverlayPlane(
}
const auto& image_color_space = GetNearestSupportedImageColorSpace(image);
- if (!SurfaceControl::SupportsColorSpace(image_color_space)) {
+ if (!gfx::SurfaceControl::SupportsColorSpace(image_color_space)) {
LOG(ERROR) << "Not supported color space used with overlay : "
<< image_color_space.ToString();
}
@@ -428,13 +430,14 @@ void GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread(
PresentationCallback presentation_callback,
ResourceRefs released_resources,
base::Optional<PrimaryPlaneFences> primary_plane_fences,
- SurfaceControl::TransactionStats transaction_stats) {
+ gfx::SurfaceControl::TransactionStats transaction_stats) {
TRACE_EVENT0("gpu",
"GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread");
DCHECK(gpu_task_runner_->BelongsToCurrentThread());
DCHECK(transaction_ack_pending_);
+ transaction_ack_timeout_manager_.OnTransactionAck();
transaction_ack_pending_ = false;
const bool has_context = context_->MakeCurrent(this);
@@ -485,6 +488,7 @@ void GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread(
transaction_ack_pending_ = true;
pending_transaction_queue_.front().Apply();
pending_transaction_queue_.pop();
+ transaction_ack_timeout_manager_.ScheduleHangDetection();
}
}
@@ -586,9 +590,9 @@ GLSurfaceEGLSurfaceControl::GetNearestSupportedImageColorSpace(
}
GLSurfaceEGLSurfaceControl::SurfaceState::SurfaceState(
- const SurfaceControl::Surface& parent,
+ const gfx::SurfaceControl::Surface& parent,
const std::string& name)
- : surface(new SurfaceControl::Surface(parent, name.c_str())) {}
+ : surface(new gfx::SurfaceControl::Surface(parent, name.c_str())) {}
GLSurfaceEGLSurfaceControl::SurfaceState::SurfaceState() = default;
GLSurfaceEGLSurfaceControl::SurfaceState::SurfaceState(SurfaceState&& other) =
@@ -625,4 +629,60 @@ GLSurfaceEGLSurfaceControl::PrimaryPlaneFences&
GLSurfaceEGLSurfaceControl::PrimaryPlaneFences::operator=(
PrimaryPlaneFences&& other) = default;
+GLSurfaceEGLSurfaceControl::TransactionAckTimeoutManager::
+ TransactionAckTimeoutManager(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+ : gpu_task_runner_(std::move(task_runner)) {}
+GLSurfaceEGLSurfaceControl::TransactionAckTimeoutManager::
+ ~TransactionAckTimeoutManager() = default;
+
+void GLSurfaceEGLSurfaceControl::TransactionAckTimeoutManager::
+ ScheduleHangDetection() {
+ DCHECK(gpu_task_runner_->BelongsToCurrentThread());
+
+ ++current_transaction_id_;
+ if (!hang_detection_cb_.IsCancelled())
+ return;
+
+ constexpr int kIdleDelaySeconds = 5;
+ hang_detection_cb_.Reset(
+ base::BindOnce(&GLSurfaceEGLSurfaceControl::TransactionAckTimeoutManager::
+ OnTransactionTimeout,
+ base::Unretained(this), current_transaction_id_));
+ gpu_task_runner_->PostDelayedTask(
+ FROM_HERE, hang_detection_cb_.callback(),
+ base::TimeDelta::FromSeconds(kIdleDelaySeconds));
+}
+
+void GLSurfaceEGLSurfaceControl::TransactionAckTimeoutManager::
+ OnTransactionAck() {
+ // Since only one transaction is in flight at a time, an ack is for the latest
+ // transaction.
+ last_acked_transaction_id_ = current_transaction_id_;
+}
+
+void GLSurfaceEGLSurfaceControl::TransactionAckTimeoutManager::
+ OnTransactionTimeout(TransactionId transaction_id) {
+ hang_detection_cb_.Cancel();
+
+ // If the last transaction was already acked, we do not need to schedule
+ // any checks until a new transaction comes.
+ if (current_transaction_id_ == last_acked_transaction_id_)
+ return;
+
+ // If more transactions have happened since the last task, schedule another
+ // hang detection check.
+ if (transaction_id < current_transaction_id_) {
+ // Decrement the |current_transaction_id_| since ScheduleHangDetection()
+ // will increment it again.
+ --current_transaction_id_;
+ ScheduleHangDetection();
+ return;
+ }
+
+ LOG(ERROR) << "Transaction id " << transaction_id
+ << " haven't received any ack from past 5 second which indicates "
+ "it hanged";
+}
+
} // namespace gl
diff --git a/chromium/ui/gl/gl_surface_egl_surface_control.h b/chromium/ui/gl/gl_surface_egl_surface_control.h
index e93058da5ae..57e634189b0 100644
--- a/chromium/ui/gl/gl_surface_egl_surface_control.h
+++ b/chromium/ui/gl/gl_surface_egl_surface_control.h
@@ -13,7 +13,7 @@
#include "base/containers/flat_map.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
-#include "ui/gl/android/android_surface_control_compat.h"
+#include "ui/gfx/android/android_surface_control_compat.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_surface_egl.h"
@@ -90,7 +90,7 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
struct SurfaceState {
SurfaceState();
- SurfaceState(const SurfaceControl::Surface& parent,
+ SurfaceState(const gfx::SurfaceControl::Surface& parent,
const std::string& name);
~SurfaceState();
@@ -112,7 +112,7 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
// Indicates whether the |surface| will be visible or hidden.
bool visibility = true;
- scoped_refptr<SurfaceControl::Surface> surface;
+ scoped_refptr<gfx::SurfaceControl::Surface> surface;
};
struct ResourceRef {
@@ -122,7 +122,7 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
ResourceRef(ResourceRef&& other);
ResourceRef& operator=(ResourceRef&& other);
- scoped_refptr<SurfaceControl::Surface> surface;
+ scoped_refptr<gfx::SurfaceControl::Surface> surface;
std::unique_ptr<base::android::ScopedHardwareBufferFenceSync> scoped_buffer;
};
using ResourceRefs = base::flat_map<ASurfaceControl*, ResourceRef>;
@@ -153,6 +153,27 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
base::ScopedFD ready_fence;
};
+ using TransactionId = uint64_t;
+ class TransactionAckTimeoutManager {
+ public:
+ TransactionAckTimeoutManager(
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+ ~TransactionAckTimeoutManager();
+
+ void ScheduleHangDetection();
+ void OnTransactionAck();
+
+ private:
+ void OnTransactionTimeout(TransactionId transaction_id);
+
+ scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_;
+ TransactionId current_transaction_id_ = 0;
+ TransactionId last_acked_transaction_id_ = 0;
+ base::CancelableOnceClosure hang_detection_cb_;
+
+ DISALLOW_COPY_AND_ASSIGN(TransactionAckTimeoutManager);
+ };
+
void CommitPendingTransaction(const gfx::Rect& damage_rect,
SwapCompletionCallback completion_callback,
PresentationCallback callback);
@@ -164,7 +185,7 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
PresentationCallback presentation_callback,
ResourceRefs released_resources,
base::Optional<PrimaryPlaneFences> primary_plane_fences,
- SurfaceControl::TransactionStats transaction_stats);
+ gfx::SurfaceControl::TransactionStats transaction_stats);
void CheckPendingPresentationCallbacks();
@@ -179,7 +200,7 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
gfx::Rect window_rect_;
// Holds the surface state changes made since the last call to SwapBuffers.
- base::Optional<SurfaceControl::Transaction> pending_transaction_;
+ base::Optional<gfx::SurfaceControl::Transaction> pending_transaction_;
size_t pending_surfaces_count_ = 0u;
// Resources in the pending frame, for which updates are being
// collected in |pending_transaction_|. These are resources for which the
@@ -192,7 +213,7 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
base::Optional<PrimaryPlaneFences> primary_plane_fences_;
// Transactions waiting to be applied once the previous transaction is acked.
- std::queue<SurfaceControl::Transaction> pending_transaction_queue_;
+ std::queue<gfx::SurfaceControl::Transaction> pending_transaction_queue_;
// PresentationCallbacks for transactions which have been acked but their
// present fence has not fired yet.
@@ -209,7 +230,7 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
// The root surface tied to the ANativeWindow that places the content of this
// GLSurface in the java view tree.
- scoped_refptr<SurfaceControl::Surface> root_surface_;
+ scoped_refptr<gfx::SurfaceControl::Surface> root_surface_;
// The last context made current with this surface.
scoped_refptr<GLContext> context_;
@@ -228,6 +249,8 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL {
// Set if a swap failed and the surface is no longer usable.
bool surface_lost_ = false;
+ TransactionAckTimeoutManager transaction_ack_timeout_manager_;
+
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_;
base::WeakPtrFactory<GLSurfaceEGLSurfaceControl> weak_factory_{this};
};
diff --git a/chromium/ui/gl/gl_surface_egl_x11.cc b/chromium/ui/gl/gl_surface_egl_x11.cc
index 9a90d99effc..ae4e6850003 100644
--- a/chromium/ui/gl/gl_surface_egl_x11.cc
+++ b/chromium/ui/gl/gl_surface_egl_x11.cc
@@ -8,7 +8,6 @@
#include "ui/base/x/x11_display_util.h"
#include "ui/base/x/x11_util.h"
#include "ui/gfx/x/randr.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_util.h"
#include "ui/gl/egl_util.h"
@@ -54,14 +53,19 @@ bool NativeViewGLSurfaceEGLX11::Initialize(GLSurfaceFormat format) {
if (!NativeViewGLSurfaceEGL::Initialize(format))
return false;
+ auto* connection = x11::Connection::Get();
// Query all child windows and store them. ANGLE creates a child window when
- // eglCreateWidnowSurface is called on X11 and expose events from this window
- // need to be received by this class.
- if (auto reply = x11::Connection::Get()
- ->QueryTree({static_cast<x11::Window>(window_)})
- .Sync()) {
+ // eglCreateWindowSurface is called on X11 and expose events from this window
+ // need to be received by this class. Since ANGLE is using a separate
+ // connection, we have to select expose events on our own connection.
+ if (auto reply =
+ connection->QueryTree({static_cast<x11::Window>(window_)}).Sync()) {
children_ = std::move(reply->children);
}
+ for (auto child : children_) {
+ connection->ChangeWindowAttributes(
+ {.window = child, .event_mask = x11::EventMask::Exposure});
+ }
if (ui::X11EventSource::HasInstance()) {
dispatcher_set_ = true;
diff --git a/chromium/ui/gl/gl_surface_egl_x11_gles2.cc b/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
index f7c54e57b39..0d02906a3fd 100644
--- a/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
+++ b/chromium/ui/gl/gl_surface_egl_x11_gles2.cc
@@ -5,7 +5,6 @@
#include "ui/gl/gl_surface_egl_x11_gles2.h"
#include "ui/base/x/x11_util.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_util.h"
#include "ui/gl/egl_util.h"
@@ -35,7 +34,7 @@ bool NativeViewGLSurfaceEGLX11GLES2::InitializeNativeWindow() {
// correctly ordered with GL, so that we don't have invalid transient states.
// See https://crbug.com/326995.
set_window(connection->GenerateId<x11::Window>());
- connection->CreateWindow({
+ connection->CreateWindow(x11::CreateWindowRequest{
.wid = window(),
.parent = parent_window_,
.width = size_.width(),
diff --git a/chromium/ui/gl/gl_surface_glx.cc b/chromium/ui/gl/gl_surface_glx.cc
index 60ae07732e5..db774dc237c 100644
--- a/chromium/ui/gl/gl_surface_glx.cc
+++ b/chromium/ui/gl/gl_surface_glx.cc
@@ -26,14 +26,6 @@
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/dri2.h"
-#include "ui/gfx/x/glx.h"
-#include "ui/gfx/x/present.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
-#include "ui/gfx/x/xf86vidmode.h"
-#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_util.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
@@ -70,16 +62,19 @@ x11::ColorMap g_colormap{};
bool CreateDummyWindow(x11::Connection* conn) {
DCHECK(conn);
- auto* display = conn->display();
auto parent_window = conn->default_root();
auto window = conn->GenerateId<x11::Window>();
- conn->CreateWindow({
+ auto create_window = conn->CreateWindow(x11::CreateWindowRequest{
.wid = window,
.parent = parent_window,
.width = 1,
.height = 1,
.c_class = x11::WindowClass::InputOutput,
});
+ if (create_window.Sync().error) {
+ LOG(ERROR) << "Failed to create window";
+ return false;
+ }
GLXFBConfig config = GetFbConfigForWindow(conn, window);
if (!config) {
LOG(ERROR) << "Failed to get GLXConfig";
@@ -87,22 +82,23 @@ bool CreateDummyWindow(x11::Connection* conn) {
return false;
}
- GLXWindow glx_window =
- glXCreateWindow(display, config, static_cast<uint32_t>(window), nullptr);
+ GLXWindow glx_window = glXCreateWindow(
+ conn->GetXlibDisplay(), config, static_cast<uint32_t>(window), nullptr);
if (!glx_window) {
LOG(ERROR) << "glXCreateWindow failed";
conn->DestroyWindow({window});
return false;
}
- glXDestroyWindow(display, glx_window);
+ glXDestroyWindow(conn->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ glx_window);
conn->DestroyWindow({window});
return true;
}
class OMLSyncControlVSyncProvider : public SyncControlVSyncProvider {
public:
- explicit OMLSyncControlVSyncProvider(x11::Window window)
- : SyncControlVSyncProvider(), window_(window) {}
+ explicit OMLSyncControlVSyncProvider(GLXWindow glx_window)
+ : SyncControlVSyncProvider(), glx_window_(glx_window) {}
~OMLSyncControlVSyncProvider() override = default;
@@ -110,85 +106,30 @@ class OMLSyncControlVSyncProvider : public SyncControlVSyncProvider {
bool GetSyncValues(int64_t* system_time,
int64_t* media_stream_counter,
int64_t* swap_buffer_counter) override {
- auto* connection = x11::Connection::Get();
-
- // First try to get the counter values using the DRI2 extension.
- if (auto reply = connection->dri2().GetMSC({window_}).Sync()) {
- auto merge_counter = [](uint32_t hi, uint32_t lo) {
- return (static_cast<uint64_t>(hi) << 32) | lo;
- };
- *system_time = merge_counter(reply->ust_hi, reply->ust_lo);
- *media_stream_counter = merge_counter(reply->msc_hi, reply->msc_lo);
- *swap_buffer_counter = merge_counter(reply->sbc_hi, reply->sbc_lo);
- return true;
- }
-
- // Next try the present extension.
- auto& present = connection->present();
- // Check if the present extension is available.
- if (!present.present())
- return false;
-
- // Issue a NotifyMSC request and listen for the resulting event which will
- // contain the counter values.
- auto context = connection->GenerateId<x11::Present::Event>();
- present.SelectInput(
- {context, window_, x11::Present::EventMask::CompleteNotify});
- connection->present().NotifyMSC({window_});
- present.SelectInput({context, window_, x11::Present::EventMask::NoEvent});
- connection->Sync();
- connection->ReadResponses();
- for (const auto& event : connection->events()) {
- auto* complete = event.As<x11::Present::CompleteNotifyEvent>();
- if (complete && complete->kind == x11::Present::CompleteKind::NotifyMSC &&
- complete->window == window_ && complete->serial == 0) {
- *system_time = complete->ust;
- *media_stream_counter = complete->msc;
- *swap_buffer_counter = 0;
- return true;
- }
- }
-
- return false;
+ return glXGetSyncValuesOML(x11::Connection::Get()->GetXlibDisplay(),
+ glx_window_, system_time, media_stream_counter,
+ swap_buffer_counter);
}
bool GetMscRate(int32_t* numerator, int32_t* denominator) override {
if (!g_glx_get_msc_rate_oml_supported)
return false;
- auto* connection = x11::Connection::Get();
- connection->xf86vidmode().SetClientVersion(
- {x11::XF86VidMode::major_version, x11::XF86VidMode::minor_version});
- auto reply = connection->xf86vidmode()
- .GetModeLine({connection->DefaultScreenId()})
- .Sync();
- if (!reply) {
- // Once GetModeLine has been found to fail, don't try again,
+ if (!glXGetMscRateOML(x11::Connection::Get()->GetXlibDisplay(), glx_window_,
+ numerator, denominator)) {
+ // Once glXGetMscRateOML has been found to fail, don't try again,
// since each failing call may spew an error message.
g_glx_get_msc_rate_oml_supported = false;
return false;
}
- *numerator = static_cast<uint32_t>(reply->dotclock) * 1000;
- *denominator = static_cast<uint32_t>(reply->vtotal) * reply->htotal;
-
- // These adjustments are from mesa's __glxGetMscRate().
- if (static_cast<bool>(reply->flags &
- x11::XF86VidMode::ModeFlag::Interlace)) {
- *numerator *= 2;
- }
- if (static_cast<bool>(reply->flags &
- x11::XF86VidMode::ModeFlag::Composite_Sync)) {
- *denominator *= 2;
- }
-
return true;
}
bool IsHWClock() const override { return true; }
private:
- x11::Window window_;
+ GLXWindow glx_window_;
DISALLOW_COPY_AND_ASSIGN(OMLSyncControlVSyncProvider);
};
@@ -227,8 +168,9 @@ class SGIVideoSyncThread : public base::Thread,
void MaybeCreateGLXContext(GLXFBConfig config) {
DCHECK(task_runner()->BelongsToCurrentThread());
if (!context_) {
- context_ = glXCreateNewContext(GetConnection()->display(), config,
- GLX_RGBA_TYPE, nullptr, true);
+ context_ = glXCreateNewContext(
+ GetConnection()->GetXlibDisplay(x11::XlibDisplayType::kSyncing),
+ config, GLX_RGBA_TYPE, nullptr, true);
}
LOG_IF(ERROR, !context_) << "video_sync: glXCreateNewContext failed";
}
@@ -237,7 +179,13 @@ class SGIVideoSyncThread : public base::Thread,
void CleanUp() override {
DCHECK(task_runner()->BelongsToCurrentThread());
if (context_)
- glXDestroyContext(GetConnection()->display(), context_);
+ glXDestroyContext(
+ GetConnection()->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ context_);
+ // Release the connection from this thread's sequence so that a new
+ // SGIVideoSyncThread can reuse the connection. The connection must be
+ // reused since it can only be created before sandbox initialization.
+ GetConnection()->DetachFromSequence();
}
GLXContext GetGLXContext() {
@@ -290,8 +238,11 @@ class SGIVideoSyncProviderThreadShim {
~SGIVideoSyncProviderThreadShim() {
auto* connection = vsync_thread_->GetConnection();
- if (glx_window_)
- glXDestroyWindow(connection->display(), glx_window_);
+ if (glx_window_) {
+ glXDestroyWindow(
+ connection->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ glx_window_);
+ }
if (window_ != x11::Window::None)
connection->DestroyWindow({window_});
@@ -306,7 +257,7 @@ class SGIVideoSyncProviderThreadShim {
DCHECK(connection);
auto window = connection->GenerateId<x11::Window>();
- auto req = connection->CreateWindow({
+ auto req = connection->CreateWindow(x11::CreateWindowRequest{
.wid = window,
.parent = static_cast<x11::Window>(parent_window_),
.width = 1,
@@ -325,8 +276,9 @@ class SGIVideoSyncProviderThreadShim {
return;
}
- glx_window_ = glXCreateWindow(connection->display(), config,
- static_cast<uint32_t>(window_), nullptr);
+ glx_window_ = glXCreateWindow(
+ connection->GetXlibDisplay(x11::XlibDisplayType::kSyncing), config,
+ static_cast<uint32_t>(window_), nullptr);
if (!glx_window_) {
LOG(ERROR) << "video_sync: glXCreateWindow failed";
return;
@@ -344,9 +296,10 @@ class SGIVideoSyncProviderThreadShim {
base::TimeDelta interval = ui::GetPrimaryDisplayRefreshIntervalFromXrandr();
- glXMakeContextCurrent(vsync_thread_->GetConnection()->display(),
- glx_window_, glx_window_,
- vsync_thread_->GetGLXContext());
+ auto* connection = vsync_thread_->GetConnection();
+ glXMakeContextCurrent(
+ connection->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ glx_window_, glx_window_, vsync_thread_->GetGLXContext());
unsigned int retrace_count = 0;
if (glXWaitVideoSyncSGI(1, 0, &retrace_count) != 0)
@@ -355,8 +308,9 @@ class SGIVideoSyncProviderThreadShim {
base::TimeTicks now = base::TimeTicks::Now();
TRACE_EVENT_INSTANT0("gpu", "vblank", TRACE_EVENT_SCOPE_THREAD);
- glXMakeContextCurrent(vsync_thread_->GetConnection()->display(), 0, 0,
- nullptr);
+ glXMakeContextCurrent(
+ connection->GetXlibDisplay(x11::XlibDisplayType::kFlushing), 0, 0,
+ nullptr);
task_runner_->PostTask(FROM_HERE,
base::BindOnce(std::move(callback), now, interval));
@@ -464,13 +418,14 @@ bool GLSurfaceGLX::InitializeOneOff() {
// http://crbug.com/245466
setenv("force_s3tc_enable", "true", 1);
- if (!gfx::GetXDisplay()) {
- LOG(ERROR) << "XOpenDisplay failed.";
+ if (!x11::Connection::Get()->Ready()) {
+ LOG(ERROR) << "Could not open X11 connection.";
return false;
}
int major = 0, minor = 0;
- if (!glXQueryVersion(gfx::GetXDisplay(), &major, &minor)) {
+ if (!glXQueryVersion(x11::Connection::Get()->GetXlibDisplay(), &major,
+ &minor)) {
LOG(ERROR) << "glxQueryVersion failed";
return false;
}
@@ -562,7 +517,7 @@ std::string GLSurfaceGLX::QueryGLXExtensions() {
auto* connection = x11::Connection::Get();
const int screen = connection ? connection->DefaultScreenId() : 0;
const char* extensions =
- glXQueryExtensionsString(connection->display(), screen);
+ glXQueryExtensionsString(connection->GetXlibDisplay(), screen);
if (extensions)
return std::string(extensions);
return "";
@@ -628,7 +583,7 @@ bool GLSurfaceGLX::IsOMLSyncControlSupported() {
}
void* GLSurfaceGLX::GetDisplay() {
- return gfx::GetXDisplay();
+ return x11::Connection::Get()->GetXlibDisplay();
}
GLSurfaceGLX::~GLSurfaceGLX() = default;
@@ -636,7 +591,7 @@ GLSurfaceGLX::~GLSurfaceGLX() = default;
NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX(gfx::AcceleratedWidget window)
: parent_window_(window),
window_(x11::Window::None),
- glx_window_(0),
+ glx_window_(),
config_(nullptr),
has_swapped_buffers_(false) {}
@@ -692,16 +647,17 @@ bool NativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
LOG(ERROR) << "Failed to get GLXConfig";
return false;
}
- glx_window_ = glXCreateWindow(gfx::GetXDisplay(), config_,
- static_cast<uint32_t>(window_), nullptr);
- if (!glx_window_) {
+ glx_window_ = static_cast<x11::Glx::Window>(
+ glXCreateWindow(conn->GetXlibDisplay(x11::XlibDisplayType::kSyncing),
+ config_, static_cast<uint32_t>(window_), nullptr));
+ if (!GetDrawableHandle()) {
LOG(ERROR) << "glXCreateWindow failed";
return false;
}
if (g_glx_oml_sync_control_supported) {
vsync_provider_ = std::make_unique<OMLSyncControlVSyncProvider>(
- static_cast<x11::Window>(window_));
+ static_cast<GLXWindow>(glx_window_));
presentation_helper_ =
std::make_unique<GLSurfacePresentationHelper>(vsync_provider_.get());
} else if (g_glx_sgi_video_sync_supported) {
@@ -730,9 +686,11 @@ bool NativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
void NativeViewGLSurfaceGLX::Destroy() {
presentation_helper_ = nullptr;
vsync_provider_ = nullptr;
- if (glx_window_) {
- glXDestroyWindow(gfx::GetXDisplay(), glx_window_);
- glx_window_ = 0;
+ if (GetDrawableHandle()) {
+ glXDestroyWindow(
+ x11::Connection::Get()->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ GetDrawableHandle());
+ glx_window_ = {};
}
if (window_ != x11::Window::None) {
UnregisterEvents();
@@ -766,7 +724,8 @@ gfx::SwapResult NativeViewGLSurfaceGLX::SwapBuffers(
presentation_helper_.get(), std::move(callback));
auto* connection = x11::Connection::Get();
- glXSwapBuffers(connection->display(), GetDrawableHandle());
+ glXSwapBuffers(connection->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ GetDrawableHandle());
// We need to restore the background pixel that we set to WhitePixel on
// views::DesktopWindowTreeHostX11::InitX11Window back to None for the
@@ -815,8 +774,9 @@ gfx::SwapResult NativeViewGLSurfaceGLX::PostSubBuffer(
GLSurfacePresentationHelper::ScopedSwapBuffers scoped_swap_buffers(
presentation_helper_.get(), std::move(callback));
- glXCopySubBufferMESA(gfx::GetXDisplay(), GetDrawableHandle(), x, y, width,
- height);
+ glXCopySubBufferMESA(
+ x11::Connection::Get()->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ GetDrawableHandle(), x, y, width, height);
return scoped_swap_buffers.result();
}
@@ -833,7 +793,9 @@ void NativeViewGLSurfaceGLX::SetVSyncEnabled(bool enabled) {
DCHECK(GLContext::GetCurrent() && GLContext::GetCurrent()->IsCurrent(this));
int interval = enabled ? 1 : 0;
if (GLSurfaceGLX::IsEXTSwapControlSupported()) {
- glXSwapIntervalEXT(gfx::GetXDisplay(), glx_window_, interval);
+ glXSwapIntervalEXT(
+ x11::Connection::Get()->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ GetDrawableHandle(), interval);
} else if (GLSurfaceGLX::IsMESASwapControlSupported()) {
glXSwapIntervalMESA(interval);
} else if (interval == 0) {
@@ -859,16 +821,13 @@ bool NativeViewGLSurfaceGLX::CanHandleEvent(x11::Event* x11_event) {
return expose && expose->window == static_cast<x11::Window>(window_);
}
-GLXDrawable NativeViewGLSurfaceGLX::GetDrawableHandle() const {
- return glx_window_;
+uint32_t NativeViewGLSurfaceGLX::GetDrawableHandle() const {
+ return static_cast<uint32_t>(glx_window_);
}
UnmappedNativeViewGLSurfaceGLX::UnmappedNativeViewGLSurfaceGLX(
const gfx::Size& size)
- : size_(size),
- config_(nullptr),
- window_(x11::Window::None),
- glx_window_(0) {
+ : size_(size), config_(nullptr), window_(x11::Window::None), glx_window_() {
// Ensure that we don't create a window with zero size.
if (size_.GetArea() == 0)
size_.SetSize(1, 1);
@@ -881,7 +840,7 @@ bool UnmappedNativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
auto* conn = x11::Connection::Get();
window_ = conn->GenerateId<x11::Window>();
- conn->CreateWindow({
+ conn->CreateWindow(x11::CreateWindowRequest{
.depth = g_depth,
.wid = window_,
.parent = parent_window,
@@ -898,9 +857,10 @@ bool UnmappedNativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
LOG(ERROR) << "Failed to get GLXConfig";
return false;
}
- glx_window_ = glXCreateWindow(gfx::GetXDisplay(), config_,
- static_cast<uint32_t>(window_), nullptr);
- if (!glx_window_) {
+ glx_window_ = static_cast<x11::Glx::Window>(
+ glXCreateWindow(conn->GetXlibDisplay(x11::XlibDisplayType::kSyncing),
+ config_, static_cast<uint32_t>(window_), nullptr));
+ if (glx_window_ == x11::Glx::Window{}) {
LOG(ERROR) << "glXCreateWindow failed";
return false;
}
@@ -909,9 +869,11 @@ bool UnmappedNativeViewGLSurfaceGLX::Initialize(GLSurfaceFormat format) {
void UnmappedNativeViewGLSurfaceGLX::Destroy() {
config_ = nullptr;
- if (glx_window_) {
- glXDestroyWindow(gfx::GetXDisplay(), glx_window_);
- glx_window_ = 0;
+ if (glx_window_ != x11::Glx::Window{}) {
+ glXDestroyWindow(
+ x11::Connection::Get()->GetXlibDisplay(x11::XlibDisplayType::kFlushing),
+ static_cast<uint32_t>(glx_window_));
+ glx_window_ = {};
}
if (window_ != x11::Window::None) {
x11::Connection::Get()->DestroyWindow({window_});
diff --git a/chromium/ui/gl/gl_surface_glx.h b/chromium/ui/gl/gl_surface_glx.h
index ab612cd87ae..aa88c30297c 100644
--- a/chromium/ui/gl/gl_surface_glx.h
+++ b/chromium/ui/gl/gl_surface_glx.h
@@ -15,10 +15,12 @@
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/glx.h"
#include "ui/gl/gl_export.h"
#include "ui/gl/gl_surface.h"
+using GLXFBConfig = struct __GLXFBConfigRec*;
+
namespace gfx {
class VSyncProvider;
}
@@ -113,7 +115,7 @@ class GL_EXPORT NativeViewGLSurfaceGLX : public GLSurfaceGLX {
private:
// The handle for the drawable to make current or swap.
- GLXDrawable GetDrawableHandle() const;
+ uint32_t GetDrawableHandle() const;
// Window passed in at creation. Always valid.
gfx::AcceleratedWidget parent_window_;
@@ -122,7 +124,7 @@ class GL_EXPORT NativeViewGLSurfaceGLX : public GLSurfaceGLX {
x11::Window window_;
// GLXDrawable for the window.
- GLXWindow glx_window_;
+ x11::Glx::Window glx_window_;
GLXFBConfig config_;
gfx::Size size_;
@@ -161,7 +163,7 @@ class GL_EXPORT UnmappedNativeViewGLSurfaceGLX : public GLSurfaceGLX {
x11::Window window_;
// GLXDrawable for the window.
- GLXWindow glx_window_;
+ x11::Glx::Window glx_window_;
DISALLOW_COPY_AND_ASSIGN(UnmappedNativeViewGLSurfaceGLX);
};
diff --git a/chromium/ui/gl/gl_surface_glx_x11.cc b/chromium/ui/gl/gl_surface_glx_x11.cc
index c2755a91213..858987aa494 100644
--- a/chromium/ui/gl/gl_surface_glx_x11.cc
+++ b/chromium/ui/gl/gl_surface_glx_x11.cc
@@ -4,8 +4,6 @@
#include "ui/gl/gl_surface_glx_x11.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
using ui::X11EventSource;
@@ -22,8 +20,10 @@ void GLSurfaceGLXX11::RegisterEvents() {
// Can be null in tests, when we don't care about Exposes.
if (X11EventSource::HasInstance()) {
x11::Connection::Get()->ChangeWindowAttributes(
- {.window = static_cast<x11::Window>(window()),
- .event_mask = x11::EventMask::Exposure});
+ x11::ChangeWindowAttributesRequest{
+ .window = static_cast<x11::Window>(window()),
+ .event_mask = x11::EventMask::Exposure});
+
X11EventSource::GetInstance()->AddXEventDispatcher(this);
}
}
diff --git a/chromium/ui/gl/gl_switches.cc b/chromium/ui/gl/gl_switches.cc
index 38151868794..034352f8f12 100644
--- a/chromium/ui/gl/gl_switches.cc
+++ b/chromium/ui/gl/gl_switches.cc
@@ -42,6 +42,11 @@ const char kANGLEImplementationMetalNULLName[] = "metal-null";
const char kCmdDecoderValidatingName[] = "validating";
const char kCmdDecoderPassthroughName[] = "passthrough";
+// Swap chain formats for direct composition SDR video overlays.
+const char kSwapChainFormatNV12[] = "nv12";
+const char kSwapChainFormatYUY2[] = "yuy2";
+const char kSwapChainFormatBGRA[] = "bgra";
+
} // namespace gl
namespace switches {
@@ -152,6 +157,11 @@ const char kUseAdapterLuid[] = "use-adapter-luid";
const char kDirectCompositionForceFullDamageForTesting[] =
"direct-composition-force-full-damage-for-testing";
+// Used for overriding the swap chain format for direct composition SDR video
+// overlays.
+const char kDirectCompositionVideoSwapChainFormat[] =
+ "direct-composition-video-swap-chain-format";
+
// This is the list of switches passed from this file that are passed from the
// GpuProcessHost to the GPU Process. Add your switch to this list if you need
// to read it in the GPU process, else don't add it.
@@ -173,6 +183,7 @@ const char* const kGLSwitchesCopiedFromGpuProcessHost[] = {
kEnableDirectCompositionVideoOverlays,
kDisableDirectCompositionVideoOverlays,
kDirectCompositionForceFullDamageForTesting,
+ kDirectCompositionVideoSwapChainFormat,
};
const int kGLSwitchesCopiedFromGpuProcessHostNumSwitches =
base::size(kGLSwitchesCopiedFromGpuProcessHost);
@@ -181,6 +192,14 @@ const int kGLSwitchesCopiedFromGpuProcessHostNumSwitches =
namespace features {
+// Use BufferCount of 3 for the direct composition root swap chain.
+const base::Feature kDCompTripleBufferRootSwapChain{
+ "DCompTripleBufferRootSwapChain", base::FEATURE_DISABLED_BY_DEFAULT};
+
+// Use BufferCount of 3 for direct composition video swap chains.
+const base::Feature kDCompTripleBufferVideoSwapChain{
+ "DCompTripleBufferVideoSwapChain", base::FEATURE_DISABLED_BY_DEFAULT};
+
// Forces Chrome's main backbuffer to full damage if the actual damage
// is large enough and allows DWM to consider the main backbuffer as an
// an overlay candidate.
@@ -192,26 +211,11 @@ const base::Feature kDirectCompositionLowLatencyPresentation{
"DirectCompositionLowLatencyPresentation",
base::FEATURE_DISABLED_BY_DEFAULT};
-// Overrides preferred overlay format to NV12 instead of YUY2.
-const base::Feature kDirectCompositionPreferNV12Overlays{
- "DirectCompositionPreferNV12Overlays", base::FEATURE_ENABLED_BY_DEFAULT};
-
// Allow overlay swapchain to present on all GPUs even if they only support
// software overlays.
const base::Feature kDirectCompositionSoftwareOverlays{
"DirectCompositionSoftwareOverlays", base::FEATURE_DISABLED_BY_DEFAULT};
-// Allow putting a video swapchain underneath the main swapchain, so overlays
-// can be used even if there are controls on top of the video. It can be
-// enabled only when overlay is supported.
-const base::Feature kDirectCompositionUnderlays{
- "DirectCompositionUnderlays", base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Use decode swap chain created from compatible video decoder buffers.
-const base::Feature kDirectCompositionUseNV12DecodeSwapChain{
- "DirectCompositionUseNV12DecodeSwapChain",
- base::FEATURE_ENABLED_BY_DEFAULT};
-
// Default to using ANGLE's OpenGL backend
const base::Feature kDefaultANGLEOpenGL{"DefaultANGLEOpenGL",
base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chromium/ui/gl/gl_switches.h b/chromium/ui/gl/gl_switches.h
index a20d356e89d..1daab9da0f8 100644
--- a/chromium/ui/gl/gl_switches.h
+++ b/chromium/ui/gl/gl_switches.h
@@ -45,6 +45,10 @@ GL_EXPORT extern const char kANGLEImplementationMetalNULLName[];
GL_EXPORT extern const char kCmdDecoderValidatingName[];
GL_EXPORT extern const char kCmdDecoderPassthroughName[];
+GL_EXPORT extern const char kSwapChainFormatNV12[];
+GL_EXPORT extern const char kSwapChainFormatYUY2[];
+GL_EXPORT extern const char kSwapChainFormatBGRA[];
+
} // namespace gl
namespace switches {
@@ -74,6 +78,7 @@ GL_EXPORT extern const char kDisableDirectCompositionVideoOverlays[];
GL_EXPORT extern const char kUseAdapterLuid[];
GL_EXPORT extern const char kDirectCompositionForceFullDamageForTesting[];
+GL_EXPORT extern const char kDirectCompositionVideoSwapChainFormat[];
// These flags are used by the test harness code, not passed in by users.
GL_EXPORT extern const char kDisableGLDrawingForTests[];
@@ -85,18 +90,15 @@ GL_EXPORT extern const int kGLSwitchesCopiedFromGpuProcessHostNumSwitches;
} // namespace switches
namespace features {
+GL_EXPORT extern const base::Feature kDCompTripleBufferRootSwapChain;
+GL_EXPORT extern const base::Feature kDCompTripleBufferVideoSwapChain;
GL_EXPORT extern const base::Feature kDirectCompositionForceFullDamage;
GL_EXPORT extern const base::Feature kDirectCompositionGpuVSync;
GL_EXPORT extern const base::Feature kDirectCompositionLowLatencyPresentation;
-GL_EXPORT extern const base::Feature kDirectCompositionPreferNV12Overlays;
-GL_EXPORT extern const base::Feature kDirectCompositionPresentationFeedback;
GL_EXPORT extern const base::Feature kDirectCompositionSoftwareOverlays;
-GL_EXPORT extern const base::Feature kDirectCompositionUnderlays;
-GL_EXPORT extern const base::Feature kDirectCompositionUseNV12DecodeSwapChain;
GL_EXPORT extern const base::Feature kDefaultANGLEOpenGL;
GL_EXPORT extern const base::Feature kDefaultANGLEMetal;
-extern const base::Feature kTrackCurrentShaders;
-
+GL_EXPORT extern const base::Feature kTrackCurrentShaders;
} // namespace features
#endif // UI_GL_GL_SWITCHES_H_
diff --git a/chromium/ui/gl/gl_utils.cc b/chromium/ui/gl/gl_utils.cc
index d1f1125ff2d..41e79b44b59 100644
--- a/chromium/ui/gl/gl_utils.cc
+++ b/chromium/ui/gl/gl_utils.cc
@@ -26,6 +26,12 @@
#include "ui/gl/direct_composition_surface_win.h"
#endif
+#if defined(USE_X11) || defined(USE_OZONE_PLATFORM_X11)
+#include "ui/gfx/linux/gpu_memory_buffer_support_x11.h" // nogncheck
+#include "ui/gl/gl_implementation.h" // nogncheck
+#include "ui/gl/gl_visual_picker_glx.h" // nogncheck
+#endif
+
namespace gl {
// Used by chrome://gpucrash and gpu_benchmarking_extension's
@@ -118,6 +124,12 @@ UINT GetOverlaySupportFlags(DXGI_FORMAT format) {
return gl::DirectCompositionSurfaceWin::GetOverlaySupportFlags(format);
}
+unsigned int DirectCompositionRootSurfaceBufferCount() {
+ return base::FeatureList::IsEnabled(features::kDCompTripleBufferRootSwapChain)
+ ? 3u
+ : 2u;
+}
+
bool ShouldForceDirectCompositionRootSurfaceFullDamage() {
static bool should_force = []() {
const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
@@ -140,4 +152,40 @@ bool ShouldForceDirectCompositionRootSurfaceFullDamage() {
return should_force;
}
#endif // OS_WIN
+
+#if defined(USE_X11) || defined(USE_OZONE_PLATFORM_X11)
+void CollectX11GpuExtraInfo(bool enable_native_gpu_memory_buffers,
+ gfx::GpuExtraInfo& info) {
+ // TODO(https://crbug.com/1031269): Enable by default.
+ if (enable_native_gpu_memory_buffers) {
+ info.gpu_memory_buffer_support_x11 =
+ ui::GpuMemoryBufferSupportX11::GetInstance()->supported_configs();
+ }
+
+ if (GetGLImplementation() == kGLImplementationDesktopGL) {
+ // Create the GLVisualPickerGLX singleton now while the GbmSupportX11
+ // singleton is busy being created on another thread.
+ GLVisualPickerGLX* visual_picker = GLVisualPickerGLX::GetInstance();
+
+ info.system_visual = static_cast<uint32_t>(visual_picker->system_visual());
+ info.rgba_visual = static_cast<uint32_t>(visual_picker->rgba_visual());
+
+ // With GLX, only BGR(A) buffer formats are supported. EGL does not have
+ // this restriction.
+ info.gpu_memory_buffer_support_x11.erase(
+ std::remove_if(info.gpu_memory_buffer_support_x11.begin(),
+ info.gpu_memory_buffer_support_x11.end(),
+ [&](gfx::BufferUsageAndFormat usage_and_format) {
+ return visual_picker->GetFbConfigForFormat(
+ usage_and_format.format) ==
+ x11::Glx::FbConfig{};
+ }),
+ info.gpu_memory_buffer_support_x11.end());
+ } else if (GetGLImplementation() == kGLImplementationEGLANGLE) {
+ // ANGLE does not yet support EGL_EXT_image_dma_buf_import[_modifiers].
+ info.gpu_memory_buffer_support_x11.clear();
+ }
+}
+#endif // defined(USE_X11) || BUILDFLAG(OZONE_PLATFORM_X11)
+
} // namespace gl
diff --git a/chromium/ui/gl/gl_utils.h b/chromium/ui/gl/gl_utils.h
index 26fe7bd2840..0ac70a4a19c 100644
--- a/chromium/ui/gl/gl_utils.h
+++ b/chromium/ui/gl/gl_utils.h
@@ -11,6 +11,13 @@
#include "build/build_config.h"
#include "ui/gl/gl_export.h"
+#if defined(USE_OZONE)
+#include "ui/ozone/buildflags.h"
+#if BUILDFLAG(OZONE_PLATFORM_X11)
+#define USE_OZONE_PLATFORM_X11
+#endif
+#endif
+
#if defined(OS_WIN)
#include <dxgi1_6.h>
#endif
@@ -19,6 +26,10 @@
#include "base/files/scoped_file.h"
#endif
+#if defined(USE_X11) || defined(USE_OZONE_PLATFORM_X11)
+#include "ui/gfx/gpu_extra_info.h" // nogncheck
+#endif
+
namespace gl {
GL_EXPORT void Crash();
GL_EXPORT void Hang();
@@ -40,11 +51,22 @@ GL_EXPORT unsigned int FrameRateToPresentDuration(float frame_rate);
GL_EXPORT UINT GetOverlaySupportFlags(DXGI_FORMAT format);
+// BufferCount for the root surface swap chain.
+GL_EXPORT unsigned int DirectCompositionRootSurfaceBufferCount();
+
// Whether to use full damage when direct compostion root surface presents.
// This function is thread safe.
GL_EXPORT bool ShouldForceDirectCompositionRootSurfaceFullDamage();
#endif
+#if defined(USE_X11) || defined(USE_OZONE_PLATFORM_X11)
+// Collects the GPU extra info on X11 platforms.
+// |enable_native_gpu_memory_buffers| should be taken from GpuPreferences.
+// TODO(crbug/1096425) remove this once Ozone is default on Linux.
+GL_EXPORT void CollectX11GpuExtraInfo(bool enable_native_gpu_memory_buffer,
+ gfx::GpuExtraInfo& info);
+#endif
+
} // namespace gl
#endif // UI_GL_GL_UTILS_H_
diff --git a/chromium/ui/gl/gl_visual_picker_glx.cc b/chromium/ui/gl/gl_visual_picker_glx.cc
index 76833b767be..f7ce65aebfa 100644
--- a/chromium/ui/gl/gl_visual_picker_glx.cc
+++ b/chromium/ui/gl/gl_visual_picker_glx.cc
@@ -12,7 +12,6 @@
#include "base/memory/singleton.h"
#include "base/stl_util.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_surface_glx.h"
diff --git a/chromium/ui/gl/glx_util.cc b/chromium/ui/gl/glx_util.cc
index 1987522fe8d..397e807a28f 100644
--- a/chromium/ui/gl/glx_util.cc
+++ b/chromium/ui/gl/glx_util.cc
@@ -9,7 +9,6 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "ui/gfx/x/glx.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gl/gl_bindings.h"
namespace gl {
@@ -74,14 +73,19 @@ void XlibFree(void* data) {
GLXFBConfig GetFbConfigForWindow(x11::Connection* connection,
x11::Window window) {
- auto xproto_config = GetConfigForWindow(connection, window);
+ return GetGlxFbConfigForXProtoFbConfig(
+ connection, GetConfigForWindow(connection, window));
+}
+
+GLXFBConfig GetGlxFbConfigForXProtoFbConfig(x11::Connection* connection,
+ x11::Glx::FbConfig xproto_config) {
if (xproto_config == x11::Glx::FbConfig{})
return nullptr;
int attrib_list[] = {GLX_FBCONFIG_ID, static_cast<int>(xproto_config), 0};
int nitems = 0;
GLXFBConfig* glx_configs =
- glXChooseFBConfig(connection->display(), connection->DefaultScreenId(),
- attrib_list, &nitems);
+ glXChooseFBConfig(connection->GetXlibDisplay(),
+ connection->DefaultScreenId(), attrib_list, &nitems);
DCHECK_EQ(nitems, 1);
DCHECK(glx_configs);
GLXFBConfig glx_config = glx_configs[0];
diff --git a/chromium/ui/gl/glx_util.h b/chromium/ui/gl/glx_util.h
index 35cba4337df..92f39c0bbac 100644
--- a/chromium/ui/gl/glx_util.h
+++ b/chromium/ui/gl/glx_util.h
@@ -5,14 +5,21 @@
#ifndef UI_GL_GLX_UTIL_H_
#define UI_GL_GLX_UTIL_H_
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/connection.h"
+#include "ui/gfx/x/glx.h"
#include "ui/gl/gl_export.h"
+using GLXFBConfig = struct __GLXFBConfigRec*;
+
namespace gl {
GL_EXPORT GLXFBConfig GetFbConfigForWindow(x11::Connection* connection,
x11::Window window);
-}
+GL_EXPORT GLXFBConfig
+GetGlxFbConfigForXProtoFbConfig(x11::Connection* connection,
+ x11::Glx::FbConfig xproto_config);
+
+} // namespace gl
#endif // UI_GL_GLX_UTIL_H_
diff --git a/chromium/ui/gl/gpu_switching_manager.cc b/chromium/ui/gl/gpu_switching_manager.cc
index 7f9953b09db..b9faa3a02dc 100644
--- a/chromium/ui/gl/gpu_switching_manager.cc
+++ b/chromium/ui/gl/gpu_switching_manager.cc
@@ -39,4 +39,9 @@ void GpuSwitchingManager::NotifyDisplayRemoved() {
observer.OnDisplayRemoved();
}
+void GpuSwitchingManager::NotifyDisplayMetricsChanged() {
+ for (GpuSwitchingObserver& observer : observer_list_)
+ observer.OnDisplayMetricsChanged();
+}
+
} // namespace ui
diff --git a/chromium/ui/gl/gpu_switching_manager.h b/chromium/ui/gl/gpu_switching_manager.h
index 74ee9d8e7b3..a82d4d4cee9 100644
--- a/chromium/ui/gl/gpu_switching_manager.h
+++ b/chromium/ui/gl/gpu_switching_manager.h
@@ -25,7 +25,7 @@ class GL_EXPORT GpuSwitchingManager {
// Called when a GPU switch is noticed by the system. In the browser process
// this is occurs as a result of a system observer. In the GPU process, this
// occurs as a result of an IPC from the browser. The system observer is kept
- // in the browser process only so that any workarounds or blacklisting can
+ // in the browser process only so that any workarounds or blocklisting can
// be applied there.
//
// The GpuPreference argument is a heuristic indicating whether the
@@ -40,6 +40,10 @@ class GL_EXPORT GpuSwitchingManager {
// Called when a monitor is unplugged. Only Windows is supported for now.
void NotifyDisplayRemoved();
+ // Called when the display metrics changed. Only Windows is supported for
+ // now.
+ void NotifyDisplayMetricsChanged();
+
private:
friend struct base::DefaultSingletonTraits<GpuSwitchingManager>;
diff --git a/chromium/ui/gl/gpu_switching_observer.h b/chromium/ui/gl/gpu_switching_observer.h
index a7064d1248e..6c921883d4d 100644
--- a/chromium/ui/gl/gpu_switching_observer.h
+++ b/chromium/ui/gl/gpu_switching_observer.h
@@ -20,6 +20,9 @@ class GL_EXPORT GpuSwitchingObserver {
// Called for any observer when a monitor is unplugged.
virtual void OnDisplayRemoved() {}
+
+ // Called for any observer when the display metrics changed.
+ virtual void OnDisplayMetricsChanged() {}
};
} // namespace ui
diff --git a/chromium/ui/gl/hdr_metadata_helper_win.cc b/chromium/ui/gl/hdr_metadata_helper_win.cc
index d5de4cead67..14e16e9560f 100644
--- a/chromium/ui/gl/hdr_metadata_helper_win.cc
+++ b/chromium/ui/gl/hdr_metadata_helper_win.cc
@@ -105,7 +105,7 @@ void HDRMetadataHelperWin::CacheDisplayMetadata(
// static
DXGI_HDR_METADATA_HDR10 HDRMetadataHelperWin::HDRMetadataToDXGI(
- const HDRMetadata& hdr_metadata) {
+ const gfx::HDRMetadata& hdr_metadata) {
DXGI_HDR_METADATA_HDR10 metadata{};
auto& primary_r = hdr_metadata.mastering_metadata.primary_r;
diff --git a/chromium/ui/gl/hdr_metadata_helper_win.h b/chromium/ui/gl/hdr_metadata_helper_win.h
index 16e0bb1d9b6..4ae73be2e1a 100644
--- a/chromium/ui/gl/hdr_metadata_helper_win.h
+++ b/chromium/ui/gl/hdr_metadata_helper_win.h
@@ -15,8 +15,8 @@
#include "base/macros.h"
#include "base/optional.h"
+#include "ui/gfx/hdr_metadata.h"
#include "ui/gl/gl_export.h"
-#include "ui/gl/hdr_metadata.h"
namespace gl {
@@ -35,7 +35,7 @@ class GL_EXPORT HDRMetadataHelperWin {
// Convert |hdr_metadata| to DXGI's metadata format.
static DXGI_HDR_METADATA_HDR10 HDRMetadataToDXGI(
- const HDRMetadata& hdr_metadata);
+ const gfx::HDRMetadata& hdr_metadata);
private:
void CacheDisplayMetadata(
diff --git a/chromium/ui/gl/init/create_gr_gl_interface.cc b/chromium/ui/gl/init/create_gr_gl_interface.cc
index a41f3661886..f46b73dacee 100644
--- a/chromium/ui/gl/init/create_gr_gl_interface.cc
+++ b/chromium/ui/gl/init/create_gr_gl_interface.cc
@@ -203,7 +203,7 @@ const GLubyte* GetStringHook(const char* gl_version_string,
}
}
-const char* kBlacklistExtensions[] = {
+const char* kBlocklistExtensions[] = {
"GL_APPLE_framebuffer_multisample",
"GL_ARB_ES3_1_compatibility",
"GL_ARB_draw_indirect",
@@ -237,7 +237,7 @@ sk_sp<GrGLInterface> CreateGrGLInterface(
// Depending on the advertised version and extensions, skia checks for
// existence of entrypoints. However some of those we don't yet handle in
// gl_bindings, so we need to fake the version to the maximum fully supported
- // by the bindings (GL 4.1 or ES 3.0), and blacklist extensions that skia
+ // by the bindings (GL 4.1 or ES 3.0), and blocklist extensions that skia
// handles but bindings don't.
// TODO(piman): add bindings for missing entrypoints.
GrGLFunction<GrGLGetStringFn> get_string;
@@ -274,7 +274,7 @@ sk_sp<GrGLInterface> CreateGrGLInterface(
LOG(ERROR) << "Failed to initialize extensions";
return nullptr;
}
- for (const char* extension : kBlacklistExtensions)
+ for (const char* extension : kBlocklistExtensions)
extensions.remove(extension);
GrGLInterface* interface = new GrGLInterface();
diff --git a/chromium/ui/gl/init/gl_initializer_linux_x11.cc b/chromium/ui/gl/init/gl_initializer_linux_x11.cc
index 0c57d500c0d..a5c030d5f3d 100644
--- a/chromium/ui/gl/init/gl_initializer_linux_x11.cc
+++ b/chromium/ui/gl/init/gl_initializer_linux_x11.cc
@@ -10,8 +10,7 @@
#include "base/threading/thread_restrictions.h"
#include "build/build_config.h"
#include "ui/gfx/switches.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gl/buildflags.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_egl_api_implementation.h"
@@ -155,8 +154,9 @@ bool InitializeGLOneOffPlatformX11() {
case kGLImplementationEGLANGLE:
// Set utility class that helps to initialize egl platform.
gl::GLDisplayEglUtil::SetInstance(gl::GLDisplayEglUtilX11::GetInstance());
- if (!GLSurfaceEGL::InitializeOneOff(EGLDisplayPlatform(
- reinterpret_cast<EGLNativeDisplayType>(gfx::GetXDisplay())))) {
+ if (!GLSurfaceEGL::InitializeOneOff(
+ EGLDisplayPlatform(reinterpret_cast<EGLNativeDisplayType>(
+ x11::Connection::Get()->GetXlibDisplay().display())))) {
LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed.";
return false;
}
diff --git a/chromium/ui/gl/mojom/BUILD.gn b/chromium/ui/gl/mojom/BUILD.gn
index a65d0cb83da..f224062ee9a 100644
--- a/chromium/ui/gl/mojom/BUILD.gn
+++ b/chromium/ui/gl/mojom/BUILD.gn
@@ -7,14 +7,8 @@ import("//mojo/public/tools/bindings/mojom.gni")
mojom("mojom") {
generate_java = true
- sources = [
- "gpu_preference.mojom",
- "hdr_metadata.mojom",
- ]
- public_deps = [
- "//mojo/public/mojom/base",
- "//ui/gfx/geometry/mojom",
- ]
+ sources = [ "gpu_preference.mojom" ]
+ public_deps = [ "//mojo/public/mojom/base" ]
cpp_typemaps = [
{
types = [
@@ -26,21 +20,6 @@ mojom("mojom") {
traits_headers = [ "gpu_preference_mojom_traits.h" ]
traits_public_deps = [ "//ui/gl" ]
},
- {
- types = [
- {
- mojom = "gl.mojom.MasteringMetadata"
- cpp = "::gl::MasteringMetadata"
- },
- {
- mojom = "gl.mojom.HDRMetadata"
- cpp = "::gl::HDRMetadata"
- },
- ]
- traits_headers = [ "hdr_metadata_mojom_traits.h" ]
- traits_sources = [ "hdr_metadata_mojom_traits.cc" ]
- traits_public_deps = [ "//ui/gl" ]
- },
]
}
diff --git a/chromium/ui/gl/mojom/hdr_metadata_mojom_traits.h b/chromium/ui/gl/mojom/hdr_metadata_mojom_traits.h
deleted file mode 100644
index fd2aae53b7c..00000000000
--- a/chromium/ui/gl/mojom/hdr_metadata_mojom_traits.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GL_MOJOM_HDR_METADATA_MOJOM_TRAITS_H_
-#define UI_GL_MOJOM_HDR_METADATA_MOJOM_TRAITS_H_
-
-#include "ui/gl/hdr_metadata.h"
-#include "ui/gl/mojom/hdr_metadata.mojom.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<gl::mojom::MasteringMetadataDataView,
- gl::MasteringMetadata> {
- static const gfx::PointF& primary_r(const gl::MasteringMetadata& input) {
- return input.primary_r;
- }
- static const gfx::PointF& primary_g(const gl::MasteringMetadata& input) {
- return input.primary_g;
- }
- static const gfx::PointF& primary_b(const gl::MasteringMetadata& input) {
- return input.primary_b;
- }
- static const gfx::PointF& white_point(const gl::MasteringMetadata& input) {
- return input.white_point;
- }
- static float luminance_max(const gl::MasteringMetadata& input) {
- return input.luminance_max;
- }
- static float luminance_min(const gl::MasteringMetadata& input) {
- return input.luminance_min;
- }
-
- static bool Read(gl::mojom::MasteringMetadataDataView data,
- gl::MasteringMetadata* output);
-};
-
-template <>
-struct StructTraits<gl::mojom::HDRMetadataDataView, gl::HDRMetadata> {
- static unsigned max_content_light_level(const gl::HDRMetadata& input) {
- return input.max_content_light_level;
- }
- static unsigned max_frame_average_light_level(const gl::HDRMetadata& input) {
- return input.max_frame_average_light_level;
- }
- static const gl::MasteringMetadata& mastering_metadata(
- const gl::HDRMetadata& input) {
- return input.mastering_metadata;
- }
-
- static bool Read(gl::mojom::HDRMetadataDataView data,
- gl::HDRMetadata* output);
-};
-
-} // namespace mojo
-
-#endif // UI_GL_MOJOM_HDR_METADATA_MOJOM_TRAITS_H_
diff --git a/chromium/ui/gl/swap_chain_presenter.cc b/chromium/ui/gl/swap_chain_presenter.cc
index 8881dfc94e6..0b4c1156a3f 100644
--- a/chromium/ui/gl/swap_chain_presenter.cc
+++ b/chromium/ui/gl/swap_chain_presenter.cc
@@ -7,6 +7,8 @@
#include <d3d11_1.h>
#include <d3d11_4.h>
+#include "base/debug/alias.h"
+#include "base/debug/dump_without_crashing.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
@@ -144,6 +146,28 @@ bool IsYUVSwapChainFormat(DXGI_FORMAT format) {
return true;
return false;
}
+
+UINT BufferCount() {
+ return base::FeatureList::IsEnabled(
+ features::kDCompTripleBufferVideoSwapChain)
+ ? 3u
+ : 2u;
+}
+
+// Transform is correct for scaling up |quad_rect| to on screen bounds, but
+// doesn't include scaling transform from |swap_chain_size| to |quad_rect|.
+// Since |swap_chain_size| could be equal to on screen bounds, and therefore
+// possibly larger than |quad_rect|, this scaling could be downscaling, but
+// only to the extent that it would cancel upscaling already in the transform.
+void UpdateSwapChainTransform(const gfx::Size& quad_size,
+ const gfx::Size& swap_chain_size,
+ gfx::Transform* transform) {
+ float swap_chain_scale_x = quad_size.width() * 1.0f / swap_chain_size.width();
+ float swap_chain_scale_y =
+ quad_size.height() * 1.0f / swap_chain_size.height();
+ transform->Scale(swap_chain_scale_x, swap_chain_scale_y);
+}
+
} // namespace
SwapChainPresenter::PresentationHistory::PresentationHistory() = default;
@@ -178,9 +202,11 @@ int SwapChainPresenter::PresentationHistory::composed_count() const {
SwapChainPresenter::SwapChainPresenter(
DCLayerTree* layer_tree,
+ HWND window,
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device,
Microsoft::WRL::ComPtr<IDCompositionDevice2> dcomp_device)
: layer_tree_(layer_tree),
+ window_(window),
d3d11_device_(d3d11_device),
dcomp_device_(dcomp_device),
is_on_battery_power_(true) {
@@ -210,14 +236,6 @@ DXGI_FORMAT SwapChainPresenter::GetSwapChainFormat(
if (content_is_hdr)
return DXGI_FORMAT_R10G10B10A2_UNORM;
- // For software protected video, BGRA swap chain is preferred if hardware
- // overlay is not supported for better power efficiency.
- // Currently, software protected video is the only case that overlay swap
- // chain is used when hardware overlay is not supported.
- if (protected_video_type == gfx::ProtectedVideoType::kSoftwareProtected &&
- !DirectCompositionSurfaceWin::AreOverlaysSupported())
- return DXGI_FORMAT_B8G8R8A8_UNORM;
-
if (failed_to_create_yuv_swapchain_)
return DXGI_FORMAT_B8G8R8A8_UNORM;
@@ -351,17 +369,117 @@ Microsoft::WRL::ComPtr<ID3D11Texture2D> SwapChainPresenter::UploadVideoImages(
return copy_texture_;
}
+gfx::Size SwapChainPresenter::GetMonitorSize() {
+ if (DirectCompositionSurfaceWin::GetNumOfMonitors() == 1) {
+ // Only one monitor. Return the size of this monitor.
+ return DirectCompositionSurfaceWin::GetPrimaryMonitorSize();
+ } else {
+ gfx::Size monitor_size;
+ // Get the monitor on which the overlay is displayed.
+ MONITORINFO monitor_info;
+ monitor_info.cbSize = sizeof(monitor_info);
+ if (GetMonitorInfo(MonitorFromWindow(window_, MONITOR_DEFAULTTONEAREST),
+ &monitor_info)) {
+ monitor_size = gfx::Rect(monitor_info.rcMonitor).size();
+ }
+
+ return monitor_size;
+ }
+}
+
+void SwapChainPresenter::AdjustSwapChainToFullScreenSizeIfNeeded(
+ const ui::DCRendererLayerParams& params,
+ const gfx::Rect& overlay_onscreen_rect,
+ gfx::Size* swap_chain_size,
+ gfx::Transform* transform,
+ gfx::Rect* clip_rect) {
+ gfx::Rect onscreen_rect = overlay_onscreen_rect;
+ if (params.is_clipped)
+ onscreen_rect.Intersect(*clip_rect);
+
+ // Because of the rounding when converting between pixels and DIPs, a
+ // fullscreen video can become slightly larger than the monitor - e.g. on
+ // a 3000x2000 monitor with a scale factor of 1.75 a 1920x1079 video can
+ // become 3002x1689.
+ // Swapchains that are bigger than the monitor won't be put into overlays,
+ // which will hurt power usage a lot. On those systems, the scaling can be
+ // adjusted very slightly so that it's less than the monitor size. This
+ // should be close to imperceptible. http://crbug.com/668278
+ constexpr int kFullScreenMargin = 5;
+
+ // The overlay must be positioned at (0, 0) in fullscreen mode.
+ if (std::abs(onscreen_rect.x()) >= kFullScreenMargin ||
+ std::abs(onscreen_rect.y()) >= kFullScreenMargin) {
+ // Not fullscreen mode.
+ return;
+ }
+
+ gfx::Size monitor_size = GetMonitorSize();
+ if (monitor_size.IsEmpty())
+ return;
+
+ // Check whether the on-screen overlay is near the full screen size.
+ // If yes, adjust the overlay size so it can fit the screen. This allows the
+ // application of fullscreen optimizations like dynamic backlighting or
+ // dynamic refresh rates (24hz/48hz). Note: The DWM optimizations works for
+ // both hardware and software overlays.
+ // If no, do nothing.
+ if (std::abs(onscreen_rect.width() - monitor_size.width()) >=
+ kFullScreenMargin ||
+ std::abs(onscreen_rect.height() - monitor_size.height()) >=
+ kFullScreenMargin) {
+ // Not fullscreen mode.
+ return;
+ }
+
+ // Adjust the clip rect.
+ if (params.is_clipped) {
+ *clip_rect = gfx::Rect(monitor_size);
+ }
+
+ // Adjust the swap chain size.
+ // The swap chain is either the size of onscreen_rect or min(onscreen_rect,
+ // content_rect). It might not need to update if it has the content size.
+ if (std::abs(swap_chain_size->width() - monitor_size.width()) <
+ kFullScreenMargin &&
+ std::abs(swap_chain_size->height() - monitor_size.height()) <
+ kFullScreenMargin) {
+ *swap_chain_size = monitor_size;
+ }
+
+ // Adjust the transform matrix.
+ auto& transform_matrix = transform->matrix();
+ float dx = -onscreen_rect.x();
+ float dy = -onscreen_rect.y();
+ transform_matrix.postTranslate(dx, dy, 0);
+
+ float scale_x = monitor_size.width() * 1.0f / swap_chain_size->width();
+ float scale_y = monitor_size.height() * 1.0f / swap_chain_size->height();
+ transform_matrix.setScale(scale_x, scale_y, 1);
+
+#if DCHECK_IS_ON()
+ // The new transform matrix should transform the swap chain to the monitor
+ // rect.
+ gfx::Rect new_swap_chain_rect = gfx::Rect(*swap_chain_size);
+ new_swap_chain_rect.set_origin(params.quad_rect.origin());
+ gfx::RectF new_onscreen_rect(new_swap_chain_rect);
+ transform->TransformRect(&new_onscreen_rect);
+ DCHECK_EQ(gfx::ToEnclosingRect(new_onscreen_rect), gfx::Rect(monitor_size));
+#endif
+}
+
gfx::Size SwapChainPresenter::CalculateSwapChainSize(
- const ui::DCRendererLayerParams& params) {
+ const ui::DCRendererLayerParams& params,
+ gfx::Transform* transform,
+ gfx::Rect* clip_rect) {
// Swap chain size is the minimum of the on-screen size and the source size so
// the video processor can do the minimal amount of work and the overlay has
// to read the minimal amount of data. DWM is also less likely to promote a
// surface to an overlay if it's much larger than its area on-screen.
gfx::Size swap_chain_size = params.content_rect.size();
- gfx::Size overlay_onscreen_size = swap_chain_size;
gfx::RectF bounds(params.quad_rect);
params.transform.TransformRect(&bounds);
- overlay_onscreen_size = gfx::ToEnclosingRect(bounds).size();
+ gfx::Rect overlay_onscreen_rect = gfx::ToEnclosingRect(bounds);
// If transform isn't a scale or translation then swap chain can't be promoted
// to an overlay so avoid blitting to a large surface unnecessarily. Also,
@@ -370,7 +488,7 @@ gfx::Size SwapChainPresenter::CalculateSwapChainSize(
// the transform to counteract.
// TODO(sunnyps): Support 90/180/270 deg rotations using video context.
if (params.transform.IsScaleOrTranslation()) {
- swap_chain_size = overlay_onscreen_size;
+ swap_chain_size = overlay_onscreen_rect.size();
}
if (DirectCompositionSurfaceWin::AreScaledOverlaysSupported() &&
!ShouldUseVideoProcessorScaling()) {
@@ -380,34 +498,6 @@ gfx::Size SwapChainPresenter::CalculateSwapChainSize(
swap_chain_size.SetToMin(params.content_rect.size());
}
- gfx::Size overlay_monitor_size =
- DirectCompositionSurfaceWin::GetOverlayMonitorSize();
- if (layer_tree_->disable_larger_than_screen_overlays() &&
- !overlay_monitor_size.IsEmpty()) {
- // Because of the rounding when converting between pixels and DIPs, a
- // fullscreen video can become slightly larger than the monitor - e.g. on
- // a 3000x2000 monitor with a scale factor of 1.75 a 1920x1079 video can
- // become 3002x1689.
- // On older Intel drivers, swapchains that are bigger than the monitor
- // won't be put into overlays, which will hurt power usage a lot. On those
- // systems, the scaling can be adjusted very slightly so that it's less
- // than the monitor size. This should be close to imperceptible.
- // TODO(jbauman): Remove when http://crbug.com/668278 is fixed.
- const int kOversizeMargin = 3;
-
- if ((swap_chain_size.width() > overlay_monitor_size.width()) &&
- (swap_chain_size.width() <=
- overlay_monitor_size.width() + kOversizeMargin)) {
- swap_chain_size.set_width(overlay_monitor_size.width());
- }
-
- if ((swap_chain_size.height() > overlay_monitor_size.height()) &&
- (swap_chain_size.height() <=
- overlay_monitor_size.height() + kOversizeMargin)) {
- swap_chain_size.set_height(overlay_monitor_size.height());
- }
- }
-
// 4:2:2 subsampled formats like YUY2 must have an even width, and 4:2:0
// subsampled formats like NV12 must have an even width and height.
if (swap_chain_size.width() % 2 == 1)
@@ -415,11 +505,25 @@ gfx::Size SwapChainPresenter::CalculateSwapChainSize(
if (swap_chain_size.height() % 2 == 1)
swap_chain_size.set_height(swap_chain_size.height() + 1);
+ // Adjust the transform matrix.
+ UpdateSwapChainTransform(params.quad_rect.size(), swap_chain_size, transform);
+
+ // In order to get the fullscreen DWM optimizations, the overlay onscreen rect
+ // must fit the monitor when in fullscreen mode. Adjust |swap_chain_size|,
+ // |transform| and |clip_rect| so |overlay_onscreen_rect| is the same as the
+ // monitor rect.
+ if (transform->IsScaleOrTranslation()) {
+ AdjustSwapChainToFullScreenSizeIfNeeded(
+ params, overlay_onscreen_rect, &swap_chain_size, transform, clip_rect);
+ }
+
return swap_chain_size;
}
void SwapChainPresenter::UpdateVisuals(const ui::DCRendererLayerParams& params,
- const gfx::Size& swap_chain_size) {
+ const gfx::Size& swap_chain_size,
+ const gfx::Transform& transform,
+ const gfx::Rect& clip_rect) {
if (!content_visual_) {
DCHECK(!clip_visual_);
dcomp_device_->CreateVisual(&clip_visual_);
@@ -433,18 +537,6 @@ void SwapChainPresenter::UpdateVisuals(const ui::DCRendererLayerParams& params,
// Visual offset is applied before transform so it behaves similar to how the
// compositor uses transform to map quad rect in layer space to target space.
gfx::Point offset = params.quad_rect.origin();
- gfx::Transform transform = params.transform;
-
- // Transform is correct for scaling up |quad_rect| to on screen bounds, but
- // doesn't include scaling transform from |swap_chain_size| to |quad_rect|.
- // Since |swap_chain_size| could be equal to on screen bounds, and therefore
- // possibly larger than |quad_rect|, this scaling could be downscaling, but
- // only to the extent that it would cancel upscaling already in the transform.
- float swap_chain_scale_x =
- params.quad_rect.width() * 1.0f / swap_chain_size.width();
- float swap_chain_scale_y =
- params.quad_rect.height() * 1.0f / swap_chain_size.height();
- transform.Scale(swap_chain_scale_x, swap_chain_scale_y);
if (visual_info_.offset != offset || visual_info_.transform != transform) {
visual_info_.offset = offset;
@@ -467,9 +559,9 @@ void SwapChainPresenter::UpdateVisuals(const ui::DCRendererLayerParams& params,
}
if (visual_info_.is_clipped != params.is_clipped ||
- visual_info_.clip_rect != params.clip_rect) {
+ visual_info_.clip_rect != clip_rect) {
visual_info_.is_clipped = params.is_clipped;
- visual_info_.clip_rect = params.clip_rect;
+ visual_info_.clip_rect = clip_rect;
layer_tree_->SetNeedsRebuildVisualTree();
// DirectComposition clips happen in the pre-transform visual space, while
// cc/ clips happen post-transform. So the clip needs to go on a separate
@@ -478,10 +570,10 @@ void SwapChainPresenter::UpdateVisuals(const ui::DCRendererLayerParams& params,
Microsoft::WRL::ComPtr<IDCompositionRectangleClip> clip;
dcomp_device_->CreateRectangleClip(&clip);
DCHECK(clip);
- clip->SetLeft(params.clip_rect.x());
- clip->SetRight(params.clip_rect.right());
- clip->SetBottom(params.clip_rect.bottom());
- clip->SetTop(params.clip_rect.y());
+ clip->SetLeft(clip_rect.x());
+ clip->SetRight(clip_rect.right());
+ clip->SetBottom(clip_rect.bottom());
+ clip->SetTop(clip_rect.y());
clip_visual_->SetClip(clip.Get());
} else {
clip_visual_->SetClip(nullptr);
@@ -498,10 +590,6 @@ bool SwapChainPresenter::TryPresentToDecodeSwapChain(
GLImageDXGI* nv12_image,
const gfx::Rect& content_rect,
const gfx::Size& swap_chain_size) {
- if (!base::FeatureList::IsEnabled(
- features::kDirectCompositionUseNV12DecodeSwapChain))
- return false;
-
if (ShouldUseVideoProcessorScaling())
return false;
@@ -749,8 +837,17 @@ bool SwapChainPresenter::PresentToSwapChain(
if (swap_chain_image)
image_type = "swap chain";
- gfx::Size swap_chain_size = swap_chain_image ? swap_chain_image->GetSize()
- : CalculateSwapChainSize(params);
+ gfx::Transform transform = params.transform;
+ gfx::Rect clip_rect = params.clip_rect;
+ gfx::Size swap_chain_size;
+ if (swap_chain_image) {
+ swap_chain_size = swap_chain_image->GetSize();
+ // |transform| now scales from |swap_chain_size| to on screen bounds.
+ UpdateSwapChainTransform(params.quad_rect.size(), swap_chain_size,
+ &transform);
+ } else {
+ swap_chain_size = CalculateSwapChainSize(params, &transform, &clip_rect);
+ }
TRACE_EVENT2("gpu", "SwapChainPresenter::PresentToSwapChain", "image_type",
image_type, "swap_chain_size", swap_chain_size.ToString());
@@ -768,7 +865,7 @@ bool SwapChainPresenter::PresentToSwapChain(
return true;
}
- UpdateVisuals(params, swap_chain_size);
+ UpdateVisuals(params, swap_chain_size, transform, clip_rect);
// Swap chain image already has a swap chain that's presented by the client
// e.g. for webgl/canvas low-latency/desynchronized mode.
@@ -788,10 +885,7 @@ bool SwapChainPresenter::PresentToSwapChain(
}
bool swap_chain_resized = swap_chain_size_ != swap_chain_size;
- // Give it another chance to try YUV again when the size changes.
- if (swap_chain_resized) {
- presentation_history_.Clear();
- }
+
DXGI_FORMAT swap_chain_format =
GetSwapChainFormat(params.protected_video_type, content_is_hdr);
bool swap_chain_format_changed = swap_chain_format != swap_chain_format_;
@@ -802,8 +896,7 @@ bool SwapChainPresenter::PresentToSwapChain(
if (!swap_chain_ || swap_chain_resized || swap_chain_format_changed ||
toggle_protected_video) {
if (!ReallocateSwapChain(swap_chain_size, swap_chain_format,
- params.protected_video_type, params.z_order,
- content_is_hdr)) {
+ params.protected_video_type)) {
ReleaseSwapChainResources();
return false;
}
@@ -856,10 +949,11 @@ bool SwapChainPresenter::PresentToSwapChain(
return false;
}
+ HRESULT hr, device_removed_reason;
if (first_present_) {
first_present_ = false;
UINT flags = DXGI_PRESENT_USE_DURATION;
- HRESULT hr = swap_chain_->Present(0, flags);
+ hr = swap_chain_->Present(0, flags);
// Ignore DXGI_STATUS_OCCLUDED since that's not an error but only indicates
// that the window is occluded and we can stop rendering.
if (FAILED(hr) && hr != DXGI_STATUS_OCCLUDED) {
@@ -893,8 +987,14 @@ bool SwapChainPresenter::PresentToSwapChain(
base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
base::WaitableEvent::InitialState::NOT_SIGNALED);
hr = dxgi_device2->EnqueueSetEvent(event.handle());
- DCHECK(SUCCEEDED(hr));
- event.Wait();
+ if (SUCCEEDED(hr)) {
+ event.Wait();
+ } else {
+ device_removed_reason = d3d11_device_->GetDeviceRemovedReason();
+ base::debug::Alias(&hr);
+ base::debug::Alias(&device_removed_reason);
+ base::debug::DumpWithoutCrashing();
+ }
}
const bool use_swap_chain_tearing =
DirectCompositionSurfaceWin::AllowTearing();
@@ -903,7 +1003,7 @@ bool SwapChainPresenter::PresentToSwapChain(
UINT interval = use_swap_chain_tearing ? 0 : 1;
// Ignore DXGI_STATUS_OCCLUDED since that's not an error but only indicates
// that the window is occluded and we can stop rendering.
- HRESULT hr = swap_chain_->Present(interval, flags);
+ hr = swap_chain_->Present(interval, flags);
if (FAILED(hr) && hr != DXGI_STATUS_OCCLUDED) {
DLOG(ERROR) << "Present failed with error 0x" << std::hex << hr;
return false;
@@ -983,6 +1083,9 @@ bool SwapChainPresenter::VideoProcessorBlt(
content_rect.ToString(), "swap_chain_size",
swap_chain_size_.ToString());
+ // TODO(sunnyps): Ensure output color space for YUV swap chains is Rec709 or
+ // Rec601 so that the conversion from gfx::ColorSpace to DXGI_COLOR_SPACE
+ // doesn't need a |force_yuv| parameter (and the associated plumbing).
gfx::ColorSpace output_color_space = IsYUVSwapChainFormat(swap_chain_format_)
? src_color_space
: gfx::ColorSpace::CreateSRGB();
@@ -993,14 +1096,12 @@ bool SwapChainPresenter::VideoProcessorBlt(
if (content_is_hdr)
output_color_space = gfx::ColorSpace::CreateHDR10();
- if (!layer_tree_->InitializeVideoProcessor(content_rect.size(),
- swap_chain_size_, src_color_space,
- output_color_space)) {
+ if (!layer_tree_->InitializeVideoProcessor(
+ content_rect.size(), swap_chain_size_, src_color_space,
+ output_color_space, swap_chain_,
+ IsYUVSwapChainFormat(swap_chain_format_))) {
return false;
}
- layer_tree_->SetColorspaceForVideoProcessor(
- src_color_space, output_color_space, swap_chain_,
- IsYUVSwapChainFormat(swap_chain_format_));
Microsoft::WRL::ComPtr<ID3D11VideoContext> video_context =
layer_tree_->video_context();
@@ -1116,9 +1217,7 @@ void SwapChainPresenter::ReleaseSwapChainResources() {
bool SwapChainPresenter::ReallocateSwapChain(
const gfx::Size& swap_chain_size,
DXGI_FORMAT swap_chain_format,
- gfx::ProtectedVideoType protected_video_type,
- bool z_order,
- bool content_is_hdr) {
+ gfx::ProtectedVideoType protected_video_type) {
bool use_yuv_swap_chain = IsYUVSwapChainFormat(swap_chain_format);
TRACE_EVENT2("gpu", "SwapChainPresenter::ReallocateSwapChain", "size",
@@ -1163,7 +1262,7 @@ bool SwapChainPresenter::ReallocateSwapChain(
desc.Format = swap_chain_format;
desc.Stereo = FALSE;
desc.SampleDesc.Count = 1;
- desc.BufferCount = 2;
+ desc.BufferCount = BufferCount();
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.Scaling = DXGI_SCALING_STRETCH;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
diff --git a/chromium/ui/gl/swap_chain_presenter.h b/chromium/ui/gl/swap_chain_presenter.h
index 1d4af8d5357..6ecd03e9ae1 100644
--- a/chromium/ui/gl/swap_chain_presenter.h
+++ b/chromium/ui/gl/swap_chain_presenter.h
@@ -27,6 +27,7 @@ class GLImageMemory;
class SwapChainPresenter : public base::PowerObserver {
public:
SwapChainPresenter(DCLayerTree* layer_tree,
+ HWND window,
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device,
Microsoft::WRL::ComPtr<IDCompositionDevice2> dcomp_device);
~SwapChainPresenter() override;
@@ -44,6 +45,14 @@ class SwapChainPresenter : public base::PowerObserver {
void SetFrameRate(float frame_rate);
+ void GetSwapChainVisualInfoForTesting(gfx::Transform* transform,
+ gfx::Point* offset,
+ gfx::Rect* clip_rect) const {
+ *transform = visual_info_.transform;
+ *offset = visual_info_.offset;
+ *clip_rect = visual_info_.clip_rect;
+ }
+
private:
// Mapped to DirectCompositonVideoPresentationMode UMA enum. Do not remove or
// remap existing entries!
@@ -103,9 +112,7 @@ class SwapChainPresenter : public base::PowerObserver {
// |protected_video_type|. Returns true on success.
bool ReallocateSwapChain(const gfx::Size& swap_chain_size,
DXGI_FORMAT swap_chain_format,
- gfx::ProtectedVideoType protected_video_type,
- bool z_order,
- bool content_is_hdr);
+ gfx::ProtectedVideoType protected_video_type);
// Returns DXGI format that swap chain uses.
// This changes over time based on stats recorded in |presentation_history|.
@@ -127,12 +134,28 @@ class SwapChainPresenter : public base::PowerObserver {
bool content_is_hdr,
base::Optional<DXGI_HDR_METADATA_HDR10> stream_hdr_metadata);
+ gfx::Size GetMonitorSize();
+
+ // If the swap chain size is very close to the screen size but not exactly the
+ // same, the swap chain should be adjusted to fit the screen size in order to
+ // get the fullscreen DWM optimizations.
+ void AdjustSwapChainToFullScreenSizeIfNeeded(
+ const ui::DCRendererLayerParams& params,
+ const gfx::Rect& overlay_onscreen_rect,
+ gfx::Size* swap_chain_size,
+ gfx::Transform* transform,
+ gfx::Rect* clip_rect);
+
// Returns optimal swap chain size for given layer.
- gfx::Size CalculateSwapChainSize(const ui::DCRendererLayerParams& params);
+ gfx::Size CalculateSwapChainSize(const ui::DCRendererLayerParams& params,
+ gfx::Transform* transform,
+ gfx::Rect* clip_rect);
// Update direct composition visuals for layer with given swap chain size.
void UpdateVisuals(const ui::DCRendererLayerParams& params,
- const gfx::Size& swap_chain_size);
+ const gfx::Size& swap_chain_size,
+ const gfx::Transform& transform,
+ const gfx::Rect& clip_rect);
// Try presenting to a decode swap chain based on various conditions such as
// global state (e.g. finch, NV12 support), texture flags, and transform.
@@ -171,6 +194,8 @@ class SwapChainPresenter : public base::PowerObserver {
// Layer tree instance that owns this swap chain presenter.
DCLayerTree* layer_tree_ = nullptr;
+ const HWND window_;
+
// Current size of swap chain.
gfx::Size swap_chain_size_;
diff --git a/chromium/ui/gl/yuv_to_rgb_converter.cc b/chromium/ui/gl/yuv_to_rgb_converter.cc
index 3047bf5fc5c..514290e282c 100644
--- a/chromium/ui/gl/yuv_to_rgb_converter.cc
+++ b/chromium/ui/gl/yuv_to_rgb_converter.cc
@@ -189,6 +189,12 @@ YUVToRGBConverter::YUVToRGBConverter(const GLVersionInfo& gl_version_info,
if (has_vertex_array_objects) {
glGenVertexArraysOES(1, &vertex_array_object_);
}
+
+ has_get_tex_level_parameter_ =
+ !gl_version_info.is_es || gl_version_info.IsAtLeastGLES(3, 1) ||
+ g_current_gl_driver->ext.b_GL_ANGLE_get_tex_level_parameter;
+ has_robust_resource_init_ =
+ g_current_gl_driver->ext.b_GL_ANGLE_robust_resource_initialization;
}
YUVToRGBConverter::~YUVToRGBConverter() {
@@ -234,8 +240,37 @@ void YUVToRGBConverter::CopyYUV420ToRGB(unsigned target,
// Allocate the rgb texture.
glActiveTexture(old_active_texture);
glBindTexture(target, rgb_texture);
- glTexImage2D(target, 0, GL_RGB, size.width(), size.height(), 0, GL_RGB,
- rgb_texture_type, nullptr);
+
+ bool needs_texture_init = true;
+ if (has_get_tex_level_parameter_) {
+ GLint current_internal_format = 0;
+ glGetTexLevelParameteriv(target, 0, GL_TEXTURE_INTERNAL_FORMAT,
+ &current_internal_format);
+
+ GLint current_type = 0;
+ glGetTexLevelParameteriv(target, 0, GL_TEXTURE_RED_TYPE, &current_type);
+
+ GLint current_width = 0;
+ glGetTexLevelParameteriv(target, 0, GL_TEXTURE_WIDTH, &current_width);
+
+ GLint current_height = 0;
+ glGetTexLevelParameteriv(target, 0, GL_TEXTURE_HEIGHT, &current_height);
+
+ if (current_internal_format == GL_RGB &&
+ static_cast<unsigned>(current_type) == rgb_texture_type &&
+ current_width == size.width() && current_height == size.height()) {
+ needs_texture_init = false;
+ }
+ }
+ if (needs_texture_init) {
+ glTexImage2D(target, 0, GL_RGB, size.width(), size.height(), 0, GL_RGB,
+ rgb_texture_type, nullptr);
+ if (has_robust_resource_init_) {
+ // We're about to overwrite the whole texture with a draw, notify the
+ // driver that it doesn't need to perform robust resource init.
+ glTexParameteri(target, GL_RESOURCE_INITIALIZED_ANGLE, GL_TRUE);
+ }
+ }
// Set up and issue the draw call.
glActiveTexture(GL_TEXTURE0);
diff --git a/chromium/ui/gl/yuv_to_rgb_converter.h b/chromium/ui/gl/yuv_to_rgb_converter.h
index 2477a059283..28d47d44407 100644
--- a/chromium/ui/gl/yuv_to_rgb_converter.h
+++ b/chromium/ui/gl/yuv_to_rgb_converter.h
@@ -42,6 +42,8 @@ class YUVToRGBConverter {
unsigned uv_texture_ = 0;
unsigned vertex_array_object_ = 0;
unsigned source_texture_target_ = 0;
+ bool has_get_tex_level_parameter_ = false;
+ bool has_robust_resource_init_ = false;
};
} // namespace gl
diff --git a/chromium/ui/gtk/BUILD.gn b/chromium/ui/gtk/BUILD.gn
index 3759400373b..e1106392113 100644
--- a/chromium/ui/gtk/BUILD.gn
+++ b/chromium/ui/gtk/BUILD.gn
@@ -6,9 +6,9 @@ assert(is_linux || is_chromeos, "This file should only be referenced on Linux")
import("//build/config/features.gni")
import("//build/config/linux/gtk/gtk.gni")
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//printing/buildflags/buildflags.gni")
-import("//ui/ozone/ozone.gni")
component("gtk_ui_delegate") {
public = [ "gtk_ui_delegate.h" ]
@@ -97,11 +97,6 @@ component("gtk") {
public_deps = [ ":gtk_ui_delegate" ]
- if (use_x11 || ozone_platform_x11) {
- # select_file_dialog_impl_kde.cc still refers to XID
- deps += [ "//ui/gfx/x" ]
- }
-
# TODO: This should be removed.
if (use_ozone) {
deps += [ "//ui/ozone" ]
diff --git a/chromium/ui/gtk/gtk_ui.cc b/chromium/ui/gtk/gtk_ui.cc
index 9905c4f0b35..63f4dbc4518 100644
--- a/chromium/ui/gtk/gtk_ui.cc
+++ b/chromium/ui/gtk/gtk_ui.cc
@@ -520,7 +520,7 @@ base::TimeDelta GtkUi::GetCursorBlinkInterval() const {
// Dividing GTK's cursor blink cycle time (in milliseconds) by this value
// yields an appropriate value for
- // blink::mojom::RendererPreferences::caret_blink_interval.
+ // blink::RendererPreferences::caret_blink_interval.
static const double kGtkCursorBlinkCycleFactor = 2000.0;
gint cursor_blink_time = kGtkDefaultCursorBlinkTime;
diff --git a/chromium/ui/gtk/native_theme_gtk.cc b/chromium/ui/gtk/native_theme_gtk.cc
index a77c5718649..977f166904f 100644
--- a/chromium/ui/gtk/native_theme_gtk.cc
+++ b/chromium/ui/gtk/native_theme_gtk.cc
@@ -81,7 +81,7 @@ base::Optional<SkColor> SkColorFromColorId(
case ui::NativeTheme::kColorId_NotificationDefaultBackground:
return GetBgColor("");
case ui::NativeTheme::kColorId_DialogForeground:
- case ui::NativeTheme::kColorId_BubbleForeground:
+ case ui::NativeTheme::kColorId_AvatarIconIncognito:
return GetFgColor("GtkLabel");
case ui::NativeTheme::kColorId_BubbleFooterBackground:
return GetBgColor("#statusbar");
@@ -119,6 +119,7 @@ base::Optional<SkColor> SkColorFromColorId(
return GetFgColor("GtkMenu#menu GtkMenuItem#menuitem:hover GtkLabel");
case ui::NativeTheme::kColorId_DisabledMenuItemForegroundColor:
return GetFgColor("GtkMenu#menu GtkMenuItem#menuitem:disabled GtkLabel");
+ case ui::NativeTheme::kColorId_AvatarIconGuest:
case ui::NativeTheme::kColorId_MenuItemMinorTextColor:
if (GtkCheckVersion(3, 20)) {
return GetFgColor("GtkMenu#menu GtkMenuItem#menuitem #accelerator");
@@ -126,6 +127,7 @@ base::Optional<SkColor> SkColorFromColorId(
return GetFgColor(
"GtkMenu#menu GtkMenuItem#menuitem GtkLabel.accelerator");
case ui::NativeTheme::kColorId_MenuSeparatorColor:
+ case ui::NativeTheme::kColorId_AvatarHeaderArt:
if (GtkCheckVersion(3, 20)) {
return GetSeparatorColor(
"GtkMenu#menu GtkSeparator#separator.horizontal");
diff --git a/chromium/ui/gtk/select_file_dialog_impl_kde.cc b/chromium/ui/gtk/select_file_dialog_impl_kde.cc
index 5b5a139af0c..31f880ef527 100644
--- a/chromium/ui/gtk/select_file_dialog_impl_kde.cc
+++ b/chromium/ui/gtk/select_file_dialog_impl_kde.cc
@@ -7,7 +7,7 @@
#include <set>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "base/macros.h"
@@ -25,7 +25,6 @@
#include "base/version.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/l10n/l10n_util.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gtk/select_file_dialog_impl.h"
#include "ui/strings/grit/ui_strings.h"
diff --git a/chromium/ui/gtk/x/BUILD.gn b/chromium/ui/gtk/x/BUILD.gn
index f773ee3ced9..6046a39c7a1 100644
--- a/chromium/ui/gtk/x/BUILD.gn
+++ b/chromium/ui/gtk/x/BUILD.gn
@@ -2,8 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
assert(use_x11 || ozone_platform_x11)
diff --git a/chromium/ui/gtk/x/gtk_event_loop_x11.cc b/chromium/ui/gtk/x/gtk_event_loop_x11.cc
index b4ba3eb52bb..1fcd117d71b 100644
--- a/chromium/ui/gtk/x/gtk_event_loop_x11.cc
+++ b/chromium/ui/gtk/x/gtk_event_loop_x11.cc
@@ -13,10 +13,9 @@
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
extern "C" {
-Window gdk_x11_window_get_xid(GdkWindow* window);
+unsigned long gdk_x11_window_get_xid(GdkWindow* window);
}
namespace ui {
diff --git a/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc b/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc
index 88c6e46c14c..7aa7e78d010 100644
--- a/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc
+++ b/chromium/ui/gtk/x/gtk_ui_delegate_x11.cc
@@ -10,6 +10,7 @@
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/x/xlib_support.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gtk/x/gtk_event_loop_x11.h"
#include "ui/platform_window/x11/x11_window.h"
@@ -17,12 +18,12 @@
extern "C" {
GdkWindow* gdk_x11_window_foreign_new_for_display(GdkDisplay* display,
- Window window);
+ unsigned long window);
GdkWindow* gdk_x11_window_lookup_for_display(GdkDisplay* display,
- Window window);
+ unsigned long window);
-Window gdk_x11_window_get_xid(GdkWindow* window);
+unsigned long gdk_x11_window_get_xid(GdkWindow* window);
}
namespace ui {
@@ -31,6 +32,7 @@ GtkUiDelegateX11::GtkUiDelegateX11(x11::Connection* connection)
: connection_(connection) {
DCHECK(connection_);
gdk_set_allowed_backends("x11");
+ x11::InitXlib();
}
GtkUiDelegateX11::~GtkUiDelegateX11() = default;
@@ -38,6 +40,11 @@ GtkUiDelegateX11::~GtkUiDelegateX11() = default;
void GtkUiDelegateX11::OnInitialized() {
// Ensure the singleton instance of GtkEventLoopX11 is created and started.
GtkEventLoopX11::EnsureInstance();
+
+ // GTK sets an Xlib error handler that exits the process on any async errors.
+ // We don't want this behavior, so reset the error handler to something that
+ // just logs the error.
+ x11::SetXlibErrorHandler();
}
GdkKeymap* GtkUiDelegateX11::GetGdkKeymap() {
diff --git a/chromium/ui/login/account_picker/chromeos_user_pod_row.js b/chromium/ui/login/account_picker/chromeos_user_pod_row.js
index fa262d692c2..37c281c2f26 100644
--- a/chromium/ui/login/account_picker/chromeos_user_pod_row.js
+++ b/chromium/ui/login/account_picker/chromeos_user_pod_row.js
@@ -2517,7 +2517,7 @@ cr.define('login', function() {
UserPod.prototype.update.call(this);
this.querySelector('.info').textContent =
loadTimeData.getStringF('publicAccountInfoFormat',
- this.user_.enterpriseDisplayDomain);
+ this.user_.enterpriseDomainManager);
if (this.querySelector('.full-name'))
this.querySelector('.full-name').textContent = this.user_.displayName;
},
diff --git a/chromium/ui/login/account_picker/user_pod_row.js b/chromium/ui/login/account_picker/user_pod_row.js
index 1b8ff0e158f..e79739d5dda 100644
--- a/chromium/ui/login/account_picker/user_pod_row.js
+++ b/chromium/ui/login/account_picker/user_pod_row.js
@@ -2167,7 +2167,7 @@ cr.define('login', function() {
this.user_.displayName;
this.querySelector('.info').textContent =
loadTimeData.getStringF('publicAccountInfoFormat',
- this.user_.enterpriseDisplayDomain);
+ this.user_.enterpriseDomainManager);
},
/** @override */
diff --git a/chromium/ui/login/display_manager.js b/chromium/ui/login/display_manager.js
index 9b0d5c7038f..547eee52eb5 100644
--- a/chromium/ui/login/display_manager.js
+++ b/chromium/ui/login/display_manager.js
@@ -50,9 +50,6 @@
/** @const */ var ACCELERATOR_KIOSK_ENABLE = 'kiosk_enable';
/** @const */ var ACCELERATOR_VERSION = 'version';
/** @const */ var ACCELERATOR_RESET = 'reset';
-/** @const */ var ACCELERATOR_DEVICE_REQUISITION = 'device_requisition';
-/** @const */ var ACCELERATOR_DEVICE_REQUISITION_REMORA =
- 'device_requisition_remora';
/** @const */ var ACCELERATOR_APP_LAUNCH_BAILOUT = 'app_launch_bailout';
/** @const */ var ACCELERATOR_APP_LAUNCH_NETWORK_CONFIG =
'app_launch_network_config';
@@ -102,7 +99,6 @@ cr.define('cr.ui.login', function() {
SCREEN_ARC_TERMS_OF_SERVICE,
SCREEN_CONFIRM_PASSWORD,
SCREEN_UPDATE_REQUIRED,
- SCREEN_FATAL_ERROR,
SCREEN_SYNC_CONSENT,
SCREEN_APP_DOWNLOADING,
SCREEN_DISCOVER,
@@ -403,13 +399,6 @@ cr.define('cr.ui.login', function() {
RESET_AVAILABLE_SCREEN_GROUP.indexOf(currentStepId) != -1) {
chrome.send('toggleResetScreen');
}
- } else if (name == ACCELERATOR_DEVICE_REQUISITION) {
- if (this.isOobeUI())
- this.showDeviceRequisitionPrompt_();
- } else if (name == ACCELERATOR_DEVICE_REQUISITION_REMORA) {
- if (this.isOobeUI() && !attributes.changeRequisitonProhibited)
- this.showDeviceRequisitionRemoraPrompt_(
- 'deviceRequisitionRemoraPromptText', 'remora');
} else if (name == ACCELERATOR_APP_LAUNCH_BAILOUT) {
if (currentStepId == SCREEN_APP_LAUNCH_SPLASH)
chrome.send('cancelAppLaunch');
@@ -768,34 +757,6 @@ cr.define('cr.ui.login', function() {
},
/**
- * Shows the device requisition prompt.
- */
- showDeviceRequisitionPrompt_: function() {
- if (!this.deviceRequisitionDialog_) {
- this.deviceRequisitionDialog_ =
- new cr.ui.dialogs.PromptDialog(document.body);
- this.deviceRequisitionDialog_.setOkLabel(
- loadTimeData.getString('deviceRequisitionPromptOk'));
- this.deviceRequisitionDialog_.setCancelLabel(
- loadTimeData.getString('deviceRequisitionPromptCancel'));
- }
- this.deviceRequisitionDialog_.show(
- loadTimeData.getString('deviceRequisitionPromptText'),
- this.deviceRequisition_,
- this.onConfirmDeviceRequisitionPrompt_.bind(this));
- },
-
- /**
- * Confirmation handle for the device requisition prompt.
- * @param {string} value The value entered by the user.
- * @private
- */
- onConfirmDeviceRequisitionPrompt_: function(value) {
- this.deviceRequisition_ = value;
- chrome.send('setDeviceRequisition', [value == '' ? 'none' : value]);
- },
-
- /**
* Called when window size changed. Notifies current screen about
* change.
* @private
@@ -808,38 +769,6 @@ cr.define('cr.ui.login', function() {
}
},
- /*
- * Updates the device requisition string shown in the requisition
- * prompt.
- * @param {string} requisition The device requisition.
- */
- updateDeviceRequisition: function(requisition) {
- this.deviceRequisition_ = requisition;
- },
-
- /**
- * Shows the special remora/shark device requisition prompt.
- * @private
- */
- showDeviceRequisitionRemoraPrompt_: function(promptText, requisition) {
- if (!this.deviceRequisitionRemoraDialog_) {
- this.deviceRequisitionRemoraDialog_ =
- new cr.ui.dialogs.ConfirmDialog(document.body);
- this.deviceRequisitionRemoraDialog_.setOkLabel(
- loadTimeData.getString('deviceRequisitionRemoraPromptOk'));
- this.deviceRequisitionRemoraDialog_.setCancelLabel(
- loadTimeData.getString('deviceRequisitionRemoraPromptCancel'));
- }
- this.deviceRequisitionRemoraDialog_.show(
- loadTimeData.getString(promptText),
- function() { // onShow
- chrome.send('setDeviceRequisition', [requisition]);
- },
- function() { // onCancel
- chrome.send('setDeviceRequisition', ['none']);
- });
- },
-
/**
* Returns true if Oobe UI is shown.
*/
diff --git a/chromium/ui/login/display_manager_types.js b/chromium/ui/login/display_manager_types.js
index 0d60aef4790..24dd83f5a09 100644
--- a/chromium/ui/login/display_manager_types.js
+++ b/chromium/ui/login/display_manager_types.js
@@ -12,7 +12,6 @@
* resetAllowed: (boolean|undefined),
* startEnrollmentAllowed: (boolean|undefined),
* toggleKioskAllowed: (boolean|undefined),
- * changeRequisitonProhibited: (boolean|undefined),
* }}
*/
var DisplayManagerScreenAttributes = {};
@@ -36,12 +35,6 @@ DisplayManagerScreenAttributes.startEnrollmentAllowed;
DisplayManagerScreenAttributes.toggleKioskAllowed;
/**
- * True if "enroll hangouts meet" accelerator is prohibited.
- * @type {boolean|undefined}
- */
-DisplayManagerScreenAttributes.changeRequisitonProhibited;
-
-/**
* Possible types of UI.
* @enum {string}
*/
diff --git a/chromium/ui/message_center/BUILD.gn b/chromium/ui/message_center/BUILD.gn
index 22c653940df..dcc2ee5c555 100644
--- a/chromium/ui/message_center/BUILD.gn
+++ b/chromium/ui/message_center/BUILD.gn
@@ -8,7 +8,7 @@ import("//components/vector_icons/vector_icons.gni")
import("//testing/test.gni")
import("//ui/base/ui_features.gni")
-aggregate_vector_icons2("message_center_vector_icons") {
+aggregate_vector_icons("message_center_vector_icons") {
icon_directory = "vector_icons"
sources = [
diff --git a/chromium/ui/message_center/fake_message_center.h b/chromium/ui/message_center/fake_message_center.h
index b1ada6bb349..dcff4734b95 100644
--- a/chromium/ui/message_center/fake_message_center.h
+++ b/chromium/ui/message_center/fake_message_center.h
@@ -79,13 +79,12 @@ class FakeMessageCenter : public MessageCenter {
protected:
void DisableTimersForTest() override;
- const base::ObserverList<MessageCenterObserver>::Unchecked& observer_list()
- const {
+ const base::ObserverList<MessageCenterObserver>& observer_list() const {
return observers_;
}
private:
- base::ObserverList<MessageCenterObserver>::Unchecked observers_;
+ base::ObserverList<MessageCenterObserver> observers_;
NotificationList notifications_;
NotificationList::Notifications visible_notifications_;
std::vector<NotificationBlocker*> blockers_;
diff --git a/chromium/ui/message_center/message_center_impl.cc b/chromium/ui/message_center/message_center_impl.cc
index f10104f4a3e..fa2dc56bdea 100644
--- a/chromium/ui/message_center/message_center_impl.cc
+++ b/chromium/ui/message_center/message_center_impl.cc
@@ -293,9 +293,13 @@ void MessageCenterImpl::RemoveAllNotifications(bool by_user, RemoveType type) {
ids.insert(notification->id());
scoped_refptr<NotificationDelegate> delegate = notification->delegate();
+
+ // Remove notification before calling the Close method in case it calls
+ // RemoveNotification reentrantly.
+ notification_list_->RemoveNotification(notification->id());
+
if (delegate.get())
delegate->Close(by_user);
- notification_list_->RemoveNotification(notification->id());
}
if (!ids.empty()) {
diff --git a/chromium/ui/message_center/message_center_impl.h b/chromium/ui/message_center/message_center_impl.h
index c1e55266b84..1a0efc9b9e6 100644
--- a/chromium/ui/message_center/message_center_impl.h
+++ b/chromium/ui/message_center/message_center_impl.h
@@ -111,7 +111,7 @@ class MessageCenterImpl : public MessageCenter,
std::unique_ptr<NotificationList> notification_list_;
NotificationList::Notifications visible_notifications_;
- base::ObserverList<MessageCenterObserver>::Unchecked observer_list_;
+ base::ObserverList<MessageCenterObserver> observer_list_;
std::unique_ptr<PopupTimersController> popup_timers_controller_;
std::unique_ptr<base::OneShotTimer> quiet_mode_timer_;
std::vector<NotificationBlocker*> blockers_;
diff --git a/chromium/ui/message_center/message_center_impl_unittest.cc b/chromium/ui/message_center/message_center_impl_unittest.cc
index a4baca9c3f0..16523bb345b 100644
--- a/chromium/ui/message_center/message_center_impl_unittest.cc
+++ b/chromium/ui/message_center/message_center_impl_unittest.cc
@@ -208,6 +208,13 @@ class MessageCenterImplTest : public testing::Test {
NOTIFICATION_TYPE_SIMPLE);
}
+ std::unique_ptr<Notification> CreateSimpleNotificationWithDelegate(
+ const std::string& id,
+ scoped_refptr<NotificationDelegate> delegate) {
+ return CreateNotificationWithNotifierIdAndDelegate(
+ id, kDefaultAppId, NOTIFICATION_TYPE_SIMPLE, delegate);
+ }
+
std::unique_ptr<Notification> CreateNotification(const std::string& id,
NotificationType type) {
return CreateNotificationWithNotifierId(id, kDefaultAppId, type);
@@ -217,6 +224,15 @@ class MessageCenterImplTest : public testing::Test {
const std::string& id,
const std::string& notifier_id,
NotificationType type) {
+ return CreateNotificationWithNotifierIdAndDelegate(
+ id, notifier_id, type, base::MakeRefCounted<TestDelegate>());
+ }
+
+ std::unique_ptr<Notification> CreateNotificationWithNotifierIdAndDelegate(
+ const std::string& id,
+ const std::string& notifier_id,
+ NotificationType type,
+ scoped_refptr<NotificationDelegate> delegate) {
RichNotificationData optional_fields;
optional_fields.buttons.emplace_back(UTF8ToUTF16("foo"));
optional_fields.buttons.emplace_back(UTF8ToUTF16("foo"));
@@ -224,7 +240,7 @@ class MessageCenterImplTest : public testing::Test {
type, id, UTF8ToUTF16("title"), UTF8ToUTF16(id),
gfx::Image() /* icon */, base::string16() /* display_source */, GURL(),
NotifierId(NotifierType::APPLICATION, notifier_id), optional_fields,
- base::MakeRefCounted<TestDelegate>());
+ delegate);
}
TestDelegate* GetDelegate(const std::string& id) const {
@@ -998,15 +1014,11 @@ TEST_F(MessageCenterImplTest, RemoveNonVisibleNotification) {
}
TEST_F(MessageCenterImplTest, RemoveInCloseHandler) {
- std::string id("id1");
+ const std::string id("id1");
// Create a notification that calls RemoveNotification() on close.
- auto notification = std::make_unique<Notification>(
- NOTIFICATION_TYPE_SIMPLE, id, UTF8ToUTF16("title"), UTF8ToUTF16(id),
- gfx::Image() /* icon */, base::string16() /* display_source */, GURL(),
- NotifierId(NotifierType::APPLICATION, kDefaultAppId),
- RichNotificationData(),
- base::MakeRefCounted<DeleteOnCloseDelegate>(message_center(), id));
+ auto notification = CreateSimpleNotificationWithDelegate(
+ id, base::MakeRefCounted<DeleteOnCloseDelegate>(message_center(), id));
message_center()->AddNotification(std::move(notification));
EXPECT_TRUE(message_center()->FindVisibleNotificationById(id));
@@ -1015,6 +1027,29 @@ TEST_F(MessageCenterImplTest, RemoveInCloseHandler) {
EXPECT_FALSE(message_center()->FindVisibleNotificationById(id));
}
+// Regression test for https://crbug.com/1135709
+TEST_F(MessageCenterImplTest, RemoveInCloseHandlerCloseAll) {
+ const std::string id1("id1");
+ const std::string id2("id2");
+
+ // Create two notifications that call RemoveNotification() on close.
+ auto notification1 = CreateSimpleNotificationWithDelegate(
+ id1, base::MakeRefCounted<DeleteOnCloseDelegate>(message_center(), id1));
+ auto notification2 = CreateSimpleNotificationWithDelegate(
+ id2, base::MakeRefCounted<DeleteOnCloseDelegate>(message_center(), id2));
+ message_center()->AddNotification(std::move(notification1));
+ message_center()->AddNotification(std::move(notification2));
+ EXPECT_TRUE(message_center()->FindVisibleNotificationById(id1));
+ EXPECT_TRUE(message_center()->FindVisibleNotificationById(id2));
+
+ // Then remove all notifications which calls RemoveNotification() reentrantly.
+ message_center()->RemoveAllNotifications(
+ true /* by_user */,
+ message_center::MessageCenter::RemoveType::NON_PINNED);
+ EXPECT_FALSE(message_center()->FindVisibleNotificationById(id1));
+ EXPECT_FALSE(message_center()->FindVisibleNotificationById(id2));
+}
+
TEST_F(MessageCenterImplTest, FindNotificationsByAppId) {
message_center()->SetHasMessageCenterView(true);
diff --git a/chromium/ui/message_center/message_center_observer.h b/chromium/ui/message_center/message_center_observer.h
index 3e31960c977..f8d249af35f 100644
--- a/chromium/ui/message_center/message_center_observer.h
+++ b/chromium/ui/message_center/message_center_observer.h
@@ -7,6 +7,7 @@
#include <string>
+#include "base/observer_list_types.h"
#include "base/optional.h"
#include "base/strings/string16.h"
#include "ui/message_center/message_center_export.h"
@@ -18,10 +19,9 @@ class NotificationBlocker;
// An observer class for the change of notifications in the MessageCenter.
// WARNING: It is not safe to modify the message center from within these
// callbacks.
-class MESSAGE_CENTER_EXPORT MessageCenterObserver {
+class MESSAGE_CENTER_EXPORT MessageCenterObserver
+ : public base::CheckedObserver {
public:
- virtual ~MessageCenterObserver() {}
-
// Called when the notification associated with |notification_id| is added
// to the notification_list.
virtual void OnNotificationAdded(const std::string& notification_id) {}
diff --git a/chromium/ui/message_center/notification_blocker.h b/chromium/ui/message_center/notification_blocker.h
index decbbdd33b4..f61b6cdfad9 100644
--- a/chromium/ui/message_center/notification_blocker.h
+++ b/chromium/ui/message_center/notification_blocker.h
@@ -6,6 +6,7 @@
#define UI_MESSAGE_CENTER_NOTIFICATION_BLOCKER_H_
#include "base/observer_list.h"
+#include "base/observer_list_types.h"
#include "ui/message_center/message_center_export.h"
#include "ui/message_center/public/cpp/notification.h"
@@ -17,7 +18,7 @@ class MessageCenter;
// single state such as screen lock or fullscreen.
class MESSAGE_CENTER_EXPORT NotificationBlocker {
public:
- class Observer {
+ class Observer : public base::CheckedObserver {
public:
virtual void OnBlockingStateChanged(NotificationBlocker* blocker) = 0;
};
@@ -48,7 +49,7 @@ class MESSAGE_CENTER_EXPORT NotificationBlocker {
void NotifyBlockingStateChanged();
private:
- base::ObserverList<Observer>::Unchecked observers_;
+ base::ObserverList<Observer> observers_;
MessageCenter* message_center_; // weak
};
diff --git a/chromium/ui/message_center/public/cpp/notification.cc b/chromium/ui/message_center/public/cpp/notification.cc
index f9c1e4f373f..a32ee610534 100644
--- a/chromium/ui/message_center/public/cpp/notification.cc
+++ b/chromium/ui/message_center/public/cpp/notification.cc
@@ -145,10 +145,20 @@ gfx::Image Notification::GenerateMaskedSmallIcon(int dip_size,
// If |vector_small_image| is not available, fallback to raster based
// masking and resizing.
gfx::ImageSkia image = small_image().AsImageSkia();
- gfx::ImageSkia masked = gfx::ImageSkiaOperations::CreateMaskedImage(
- CreateSolidColorImage(image.width(), image.height(), color), image);
+
+#if defined(OS_CHROMEOS)
+ bool create_masked_image =
+ !optional_fields_.ignore_accent_color_for_small_image;
+#else
+ bool create_masked_image = false;
+#endif // defined(OS_CHROMEOS)
+
+ if (create_masked_image) {
+ image = gfx::ImageSkiaOperations::CreateMaskedImage(
+ CreateSolidColorImage(image.width(), image.height(), color), image);
+ }
gfx::ImageSkia resized = gfx::ImageSkiaOperations::CreateResizedImage(
- masked, skia::ImageOperations::ResizeMethod::RESIZE_BEST,
+ image, skia::ImageOperations::ResizeMethod::RESIZE_BEST,
gfx::Size(dip_size, dip_size));
return gfx::Image(resized);
}
diff --git a/chromium/ui/message_center/public/cpp/notification.h b/chromium/ui/message_center/public/cpp/notification.h
index 03817627f7f..94d0c2a9ec4 100644
--- a/chromium/ui/message_center/public/cpp/notification.h
+++ b/chromium/ui/message_center/public/cpp/notification.h
@@ -106,6 +106,12 @@ class MESSAGE_CENTER_PUBLIC_EXPORT RichNotificationData {
// notification. Optional.
gfx::Image small_image;
+#if defined(OS_CHROMEOS)
+ // If true, we simply use the raw |small_image| icon, ignoring accent color
+ // styling. For example, this is used with raw icons received from Android.
+ bool ignore_accent_color_for_small_image = false;
+#endif // defined(OS_CHROMEOS)
+
// Vector version of |small_image|.
// Used by Notification::GenerateMaskedSmallIcon.
// If not available, |small_image| will be used by the method. Optional.
diff --git a/chromium/ui/message_center/public/cpp/notifier_id.h b/chromium/ui/message_center/public/cpp/notifier_id.h
index eae94adc415..97415490393 100644
--- a/chromium/ui/message_center/public/cpp/notifier_id.h
+++ b/chromium/ui/message_center/public/cpp/notifier_id.h
@@ -26,7 +26,8 @@ enum class NotifierType : int {
WEB_PAGE = 2,
SYSTEM_COMPONENT = 3,
CROSTINI_APPLICATION = 4,
- kMaxValue = CROSTINI_APPLICATION,
+ PHONE_HUB = 5,
+ kMaxValue = PHONE_HUB,
};
// A struct that identifies the source of notifications. For example, a web page
diff --git a/chromium/ui/message_center/views/message_view.cc b/chromium/ui/message_center/views/message_view.cc
index 4a0e6ba9090..4de15aad4e8 100644
--- a/chromium/ui/message_center/views/message_view.cc
+++ b/chromium/ui/message_center/views/message_view.cc
@@ -359,10 +359,16 @@ void MessageView::OnSlideOut() {
for (auto& observer : observers_)
observer.OnPreSlideOut(notification_id_);
- MessageCenter::Get()->RemoveNotification(notification_id_,
- true /* by_user */);
+ // Copy the |notification_id| here as calling OnSlideOut() might destroy
+ // |this| but we still want to call RemoveNotification(). Note that the
+ // iteration over |observers_| is still safe and will simply stop.
+ std::string notification_id_copy = notification_id_;
+
for (auto& observer : observers_)
observer.OnSlideOut(notification_id_);
+
+ MessageCenter::Get()->RemoveNotification(notification_id_copy,
+ true /* by_user */);
}
void MessageView::OnWillChangeFocus(views::View* before, views::View* now) {}
diff --git a/chromium/ui/message_center/views/message_view.h b/chromium/ui/message_center/views/message_view.h
index 4cd34fce012..d7ea50425cc 100644
--- a/chromium/ui/message_center/views/message_view.h
+++ b/chromium/ui/message_center/views/message_view.h
@@ -9,6 +9,7 @@
#include "base/macros.h"
#include "base/observer_list.h"
+#include "base/observer_list_types.h"
#include "base/strings/string16.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColor.h"
@@ -52,10 +53,8 @@ class MESSAGE_CENTER_EXPORT MessageView
public:
static const char kViewClassName[];
- class Observer {
+ class Observer : public base::CheckedObserver {
public:
- virtual ~Observer() = default;
-
virtual void OnSlideStarted(const std::string& notification_id) {}
virtual void OnSlideChanged(const std::string& notification_id) {}
virtual void OnPreSlideOut(const std::string& notification_id) {}
@@ -185,7 +184,7 @@ class MESSAGE_CENTER_EXPORT MessageView
views::ScrollView* scroller() { return scroller_; }
- base::ObserverList<Observer>::Unchecked* observers() { return &observers_; }
+ base::ObserverList<Observer>* observers() { return &observers_; }
bool is_nested() const { return is_nested_; }
@@ -225,7 +224,7 @@ class MESSAGE_CENTER_EXPORT MessageView
bool setting_mode_ = false;
views::SlideOutController slide_out_controller_;
- base::ObserverList<Observer>::Unchecked observers_;
+ base::ObserverList<Observer> observers_;
// True if |this| is embedded in another view. Equivalent to |!top_level| in
// MessageViewFactory parlance.
diff --git a/chromium/ui/message_center/views/notification_control_buttons_view.cc b/chromium/ui/message_center/views/notification_control_buttons_view.cc
index f7f4ec4cb56..f58d075a55d 100644
--- a/chromium/ui/message_center/views/notification_control_buttons_view.cc
+++ b/chromium/ui/message_center/views/notification_control_buttons_view.cc
@@ -44,7 +44,9 @@ NotificationControlButtonsView::~NotificationControlButtonsView() = default;
void NotificationControlButtonsView::ShowCloseButton(bool show) {
if (show && !close_button_) {
- close_button_ = AddChildView(std::make_unique<PaddedButton>(this));
+ close_button_ = AddChildView(std::make_unique<PaddedButton>(
+ base::BindRepeating(&MessageView::OnCloseButtonPressed,
+ base::Unretained(message_view_))));
close_button_->SetImage(views::Button::STATE_NORMAL,
gfx::CreateVectorIcon(kNotificationCloseButtonIcon,
DetermineButtonIconColor()));
@@ -67,7 +69,10 @@ void NotificationControlButtonsView::ShowSettingsButton(bool show) {
// Add the button next right to the snooze button.
const int position = snooze_button_ ? 1 : 0;
settings_button_ =
- AddChildViewAt(std::make_unique<PaddedButton>(this), position);
+ AddChildViewAt(std::make_unique<PaddedButton>(base::BindRepeating(
+ &MessageView::OnSettingsButtonPressed,
+ base::Unretained(message_view_))),
+ position);
settings_button_->SetImage(
views::Button::STATE_NORMAL,
gfx::CreateVectorIcon(kNotificationSettingsButtonIcon,
@@ -89,7 +94,11 @@ void NotificationControlButtonsView::ShowSettingsButton(bool show) {
void NotificationControlButtonsView::ShowSnoozeButton(bool show) {
if (show && !snooze_button_) {
// Snooze button should appear as the first child.
- snooze_button_ = AddChildViewAt(std::make_unique<PaddedButton>(this), 0);
+ snooze_button_ =
+ AddChildViewAt(std::make_unique<PaddedButton>(base::BindRepeating(
+ &MessageView::OnSnoozeButtonPressed,
+ base::Unretained(message_view_))),
+ 0);
snooze_button_->SetImage(
views::Button::STATE_NORMAL,
gfx::CreateVectorIcon(kNotificationSnoozeButtonIcon,
@@ -148,17 +157,6 @@ void NotificationControlButtonsView::OnThemeChanged() {
}
#endif
-void NotificationControlButtonsView::ButtonPressed(views::Button* sender,
- const ui::Event& event) {
- if (close_button_ && sender == close_button_) {
- message_view_->OnCloseButtonPressed();
- } else if (settings_button_ && sender == settings_button_) {
- message_view_->OnSettingsButtonPressed(event);
- } else if (snooze_button_ && sender == snooze_button_) {
- message_view_->OnSnoozeButtonPressed(event);
- }
-}
-
void NotificationControlButtonsView::UpdateButtonIconColors() {
SkColor icon_color = DetermineButtonIconColor();
if (close_button_) {
diff --git a/chromium/ui/message_center/views/notification_control_buttons_view.h b/chromium/ui/message_center/views/notification_control_buttons_view.h
index e100d6c32fa..035b632058d 100644
--- a/chromium/ui/message_center/views/notification_control_buttons_view.h
+++ b/chromium/ui/message_center/views/notification_control_buttons_view.h
@@ -10,24 +10,14 @@
#include "third_party/skia/include/core/SkColor.h"
#include "ui/message_center/message_center_export.h"
#include "ui/message_center/views/padded_button.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/view.h"
-namespace ui {
-class Event;
-}
-
-namespace views {
-class Button;
-}
-
namespace message_center {
class MessageView;
class MESSAGE_CENTER_EXPORT NotificationControlButtonsView
- : public views::View,
- public views::ButtonListener {
+ : public views::View {
public:
// String to be returned by GetClassName() method.
static const char kViewClassName[];
@@ -66,9 +56,6 @@ class MESSAGE_CENTER_EXPORT NotificationControlButtonsView
void OnThemeChanged() override;
#endif
- // views::ButtonListener
- void ButtonPressed(views::Button* sender, const ui::Event& event) override;
-
private:
// Updates the button icon colors to the value of DetermineButtonIconColor().
void UpdateButtonIconColors();
diff --git a/chromium/ui/message_center/views/notification_header_view.cc b/chromium/ui/message_center/views/notification_header_view.cc
index bc23f1cc310..12a88815cf6 100644
--- a/chromium/ui/message_center/views/notification_header_view.cc
+++ b/chromium/ui/message_center/views/notification_header_view.cc
@@ -18,6 +18,7 @@
#include "ui/gfx/paint_vector_icon.h"
#include "ui/message_center/public/cpp/message_center_constants.h"
#include "ui/message_center/vector_icons.h"
+#include "ui/message_center/views/notification_view_md.h"
#include "ui/message_center/views/relative_time_formatter.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/border.h"
@@ -155,8 +156,8 @@ gfx::Insets CalculateTopPadding(int font_list_height) {
} // namespace
-NotificationHeaderView::NotificationHeaderView(views::ButtonListener* listener)
- : views::Button(listener) {
+NotificationHeaderView::NotificationHeaderView(PressedCallback callback)
+ : views::Button(std::move(callback)) {
const views::FlexSpecification kAppNameFlex =
views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
views::MaximumFlexSizeRule::kPreferred)
@@ -200,6 +201,7 @@ NotificationHeaderView::NotificationHeaderView(views::ButtonListener* listener)
// Explicitly disable multiline to support proper text elision for URLs.
app_name_view_->SetMultiLine(false);
app_name_view_->SetProperty(views::kFlexBehaviorKey, kAppNameFlex);
+ app_name_view_->SetID(NotificationViewMD::kAppNameView);
AddChildView(app_name_view_);
// Detail views which will be hidden in settings mode.
@@ -219,6 +221,7 @@ NotificationHeaderView::NotificationHeaderView(views::ButtonListener* listener)
// Summary text view
summary_text_view_ = create_label();
summary_text_view_->SetVisible(false);
+ summary_text_view_->SetID(NotificationViewMD::kSummaryTextView);
detail_views_->AddChildView(summary_text_view_);
// Timestamp divider
@@ -249,6 +252,9 @@ NotificationHeaderView::NotificationHeaderView(views::ButtonListener* listener)
AddChildView(spacer);
SetPreferredSize(gfx::Size(kNotificationWidth, kHeaderHeight));
+
+ // Not focusable by default, only for accessibility.
+ SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
}
NotificationHeaderView::~NotificationHeaderView() = default;
diff --git a/chromium/ui/message_center/views/notification_header_view.h b/chromium/ui/message_center/views/notification_header_view.h
index bc391f180d3..eb2bf9dc257 100644
--- a/chromium/ui/message_center/views/notification_header_view.h
+++ b/chromium/ui/message_center/views/notification_header_view.h
@@ -22,7 +22,7 @@ namespace message_center {
class MESSAGE_CENTER_EXPORT NotificationHeaderView : public views::Button {
public:
- explicit NotificationHeaderView(views::ButtonListener* listener);
+ explicit NotificationHeaderView(PressedCallback callback);
~NotificationHeaderView() override;
void SetAppIcon(const gfx::ImageSkia& img);
void SetAppName(const base::string16& name);
diff --git a/chromium/ui/message_center/views/notification_header_view_unittest.cc b/chromium/ui/message_center/views/notification_header_view_unittest.cc
index 6f124adc6ee..936dbb95c71 100644
--- a/chromium/ui/message_center/views/notification_header_view_unittest.cc
+++ b/chromium/ui/message_center/views/notification_header_view_unittest.cc
@@ -19,6 +19,7 @@
#include "ui/views/controls/image_view.h"
#include "ui/views/controls/label.h"
#include "ui/views/test/views_test_base.h"
+#include "ui/views/view.h"
namespace message_center {
@@ -41,7 +42,8 @@ class NotificationHeaderViewTest : public views::ViewsTestBase {
views::View* container =
widget_.SetContentsView(std::make_unique<views::View>());
- notification_header_view_ = new NotificationHeaderView(nullptr);
+ notification_header_view_ =
+ new NotificationHeaderView(views::Button::PressedCallback());
container->AddChildView(notification_header_view_);
widget_.Show();
@@ -205,4 +207,10 @@ TEST_F(NotificationHeaderViewTest, ColorContrastEnforcement) {
EXPECT_TRUE(MatchesAppIconColor(expected_color));
EXPECT_TRUE(MatchesExpandIconColor(expected_color));
}
+
+TEST_F(NotificationHeaderViewTest, DefaultFocusBehavior) {
+ EXPECT_EQ(views::View::FocusBehavior::ACCESSIBLE_ONLY,
+ notification_header_view_->GetFocusBehavior());
+}
+
} // namespace message_center
diff --git a/chromium/ui/message_center/views/notification_view_md.cc b/chromium/ui/message_center/views/notification_view_md.cc
index 045fdc9f654..feb4a125add 100644
--- a/chromium/ui/message_center/views/notification_view_md.cc
+++ b/chromium/ui/message_center/views/notification_view_md.cc
@@ -55,6 +55,7 @@
#include "ui/views/focus/focus_manager.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/fill_layout.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/native_cursor.h"
#include "ui/views/style/typography.h"
#include "ui/views/widget/widget.h"
@@ -112,29 +113,15 @@ const int kMinPixelsPerTitleCharacterMD = 4;
constexpr size_t kMessageCharacterLimitMD =
kNotificationWidth * kMessageExpandedLineLimit / 3;
-// The default is 12, so this normally come out to 13.
-constexpr int kTextFontSizeDelta = 1;
-
// In progress notification, if both the title and the message are long, the
// message would be prioritized and the title would be elided.
// However, it is not preferable that we completely omit the title, so
// the ratio of the message width is limited to this value.
constexpr double kProgressNotificationMessageRatio = 0.7;
-// Line height of title and message views.
-constexpr int kLineHeightMD = 17;
-
// This key/property allows tagging the textfield with its index.
DEFINE_UI_CLASS_PROPERTY_KEY(int, kTextfieldIndexKey, 0U)
-// FontList for the texts except for the header.
-gfx::FontList GetTextFontList() {
- gfx::Font default_font;
- gfx::Font font = default_font.Derive(kTextFontSizeDelta, gfx::Font::NORMAL,
- gfx::Font::Weight::NORMAL);
- return gfx::FontList(font);
-}
-
class ClickActivator : public ui::EventHandler {
public:
explicit ClickActivator(NotificationViewMD* owner) : owner_(owner) {}
@@ -161,20 +148,16 @@ std::unique_ptr<views::View> CreateItemView(const NotificationItem& item) {
view->SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kHorizontal, gfx::Insets(), 0));
- const gfx::FontList font_list = GetTextFontList();
-
- auto* title = new views::Label(item.title);
- title->SetFontList(font_list);
+ auto* title = view->AddChildView(std::make_unique<views::Label>(
+ item.title, views::style::CONTEXT_DIALOG_BODY_TEXT));
title->SetCollapseWhenHidden(true);
title->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- view->AddChildView(title);
- views::Label* message = view->AddChildView(std::make_unique<views::Label>(
+ auto* message = view->AddChildView(std::make_unique<views::Label>(
l10n_util::GetStringFUTF16(
IDS_MESSAGE_CENTER_LIST_NOTIFICATION_MESSAGE_WITH_DIVIDER,
item.message),
- views::style::CONTEXT_LABEL, views::style::STYLE_DISABLED));
- message->SetFontList(font_list);
+ views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_SECONDARY));
message->SetCollapseWhenHidden(true);
message->SetHorizontalAlignment(gfx::ALIGN_LEFT);
return view;
@@ -183,7 +166,7 @@ std::unique_ptr<views::View> CreateItemView(const NotificationItem& item) {
std::unique_ptr<ui::Event> ConvertToBoundedLocatedEvent(const ui::Event& event,
views::View* target) {
// In case the animation is triggered from keyboard operation.
- if (!event.IsLocatedEvent())
+ if (!event.IsLocatedEvent() || !event.target())
return nullptr;
// Convert the point of |event| from the coordinate system of its target to
@@ -210,17 +193,13 @@ const char* CompactTitleMessageView::GetClassName() const {
}
CompactTitleMessageView::CompactTitleMessageView() {
- const gfx::FontList& font_list = GetTextFontList();
-
- title_ = new views::Label();
- title_->SetFontList(font_list);
+ title_ = AddChildView(std::make_unique<views::Label>(
+ base::string16(), views::style::CONTEXT_DIALOG_BODY_TEXT));
title_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- AddChildView(title_);
message_ = AddChildView(std::make_unique<views::Label>(
- base::string16(), views::style::CONTEXT_LABEL,
- views::style::STYLE_DISABLED));
- message_->SetFontList(font_list);
+ base::string16(), views::style::CONTEXT_DIALOG_BODY_TEXT,
+ views::style::STYLE_SECONDARY));
message_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
}
@@ -326,10 +305,11 @@ gfx::Size LargeImageView::GetResizedImageSize() {
// NotificationMDTextButton ////////////////////////////////////////////////
NotificationMdTextButton::NotificationMdTextButton(
- views::ButtonListener* listener,
+ PressedCallback callback,
const base::string16& label,
const base::Optional<base::string16>& placeholder)
- : views::MdTextButton(listener, label), placeholder_(placeholder) {
+ : views::MdTextButton(std::move(callback), label),
+ placeholder_(placeholder) {
SetMinSize(kActionButtonMinSize);
views::InstallRectHighlightPathGenerator(this);
SetTextSubpixelRenderingEnabled(false);
@@ -366,7 +346,13 @@ NotificationInputContainerMD::NotificationInputContainerMD(
: delegate_(delegate),
ink_drop_container_(new views::InkDropContainerView()),
textfield_(new views::Textfield()),
- button_(new views::ImageButton(this)) {
+ button_(new views::ImageButton(base::BindRepeating(
+ [](NotificationInputContainerMD* container) {
+ container->delegate_->OnNotificationInputSubmit(
+ container->textfield_->GetProperty(kTextfieldIndexKey),
+ container->textfield_->GetText());
+ },
+ base::Unretained(this)))) {
auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kHorizontal, gfx::Insets(), 0));
@@ -463,14 +449,6 @@ void NotificationInputContainerMD::OnAfterUserAction(views::Textfield* sender) {
SetButtonImage();
}
-void NotificationInputContainerMD::ButtonPressed(views::Button* sender,
- const ui::Event& event) {
- if (sender == button_) {
- delegate_->OnNotificationInputSubmit(
- textfield_->GetProperty(kTextfieldIndexKey), textfield_->GetText());
- }
-}
-
void NotificationInputContainerMD::SetButtonImage() {
auto placeholder_icon_color_id =
textfield_->GetText().empty()
@@ -489,7 +467,7 @@ class InlineSettingsRadioButton : public views::RadioButton {
public:
explicit InlineSettingsRadioButton(const base::string16& label_text)
: views::RadioButton(label_text, 1 /* group */) {
- label()->SetFontList(GetTextFontList());
+ label()->SetTextContext(views::style::CONTEXT_DIALOG_BODY_TEXT);
label()->SetSubpixelRenderingEnabled(false);
}
@@ -597,9 +575,11 @@ NotificationViewMD::NotificationViewMD(const Notification& notification)
AddChildView(ink_drop_container_);
// |header_row_| contains app_icon, app_name, control buttons, etc...
- header_row_ = new NotificationHeaderView(this);
+ header_row_ = new NotificationHeaderView(base::BindRepeating(
+ &NotificationViewMD::HeaderRowPressed, base::Unretained(this)));
header_row_->SetPreferredSize(header_row_->GetPreferredSize() -
gfx::Size(GetInsets().width(), 0));
+ header_row_->SetID(kHeaderRow);
control_buttons_view_ = header_row_->AddChildView(
std::make_unique<NotificationControlButtonsView>(this));
AddChildView(header_row_);
@@ -638,11 +618,13 @@ NotificationViewMD::NotificationViewMD(const Notification& notification)
views::BoxLayout::Orientation::kHorizontal, kActionsRowPadding,
kActionsRowHorizontalSpacing));
action_buttons_row_->SetVisible(false);
+ action_buttons_row_->SetID(kActionButtonsRow);
actions_row_->AddChildView(action_buttons_row_);
// |inline_reply_| is a container for an inline textfield.
inline_reply_ = new NotificationInputContainerMD(this);
inline_reply_->SetVisible(false);
+ inline_reply_->SetID(kInlineReply);
actions_row_->AddChildView(inline_reply_);
CreateOrUpdateViews(notification);
@@ -812,59 +794,6 @@ void NotificationViewMD::UpdateControlButtonsVisibilityWithNotification(
UpdateControlButtonsVisibility();
}
-void NotificationViewMD::ButtonPressed(views::Button* sender,
- const ui::Event& event) {
- // Tapping anywhere on |header_row_| can expand the notification, though only
- // |expand_button| can be focused by TAB.
- if (sender == header_row_) {
- if (IsExpandable() && content_row_->GetVisible()) {
- SetManuallyExpandedOrCollapsed(true);
- auto weak_ptr = weak_ptr_factory_.GetWeakPtr();
- ToggleExpanded();
- // Check |this| is valid before continuing, because ToggleExpanded() might
- // cause |this| to be deleted.
- if (!weak_ptr)
- return;
- Layout();
- SchedulePaint();
- }
- return;
- }
-
- // See if the button pressed was an action button.
- for (size_t i = 0; i < action_buttons_.size(); ++i) {
- if (sender != action_buttons_[i])
- continue;
-
- const base::Optional<base::string16>& placeholder =
- action_buttons_[i]->placeholder();
- if (placeholder) {
- inline_reply_->textfield()->SetProperty(kTextfieldIndexKey,
- static_cast<int>(i));
- inline_reply_->textfield()->SetPlaceholderText(
- placeholder->empty()
- ? l10n_util::GetStringUTF16(
- IDS_MESSAGE_CENTER_NOTIFICATION_INLINE_REPLY_PLACEHOLDER)
- : *placeholder);
- inline_reply_->AnimateBackground(event);
- inline_reply_->SetVisible(true);
- action_buttons_row_->SetVisible(false);
- // RequestFocus() should be called after SetVisible().
- inline_reply_->textfield()->RequestFocus();
- Layout();
- SchedulePaint();
- } else {
- MessageCenter::Get()->ClickOnNotificationButton(notification_id(), i);
- }
- return;
- }
-
- if (sender == settings_done_button_) {
- ToggleInlineSettings(event);
- return;
- }
-}
-
void NotificationViewMD::OnNotificationInputSubmit(size_t index,
const base::string16& text) {
MessageCenter::Get()->ClickOnNotificationButtonWithReply(notification_id(),
@@ -912,12 +841,9 @@ void NotificationViewMD::CreateOrUpdateTitleView(
base::string16 title = gfx::TruncateString(
notification.title(), title_character_limit, gfx::WORD_BREAK);
if (!title_view_) {
- const gfx::FontList& font_list = GetTextFontList();
-
- title_view_ = new views::Label(title);
- title_view_->SetFontList(font_list);
+ title_view_ =
+ new views::Label(title, views::style::CONTEXT_DIALOG_BODY_TEXT);
title_view_->SetHorizontalAlignment(gfx::ALIGN_TO_HEAD);
- title_view_->SetLineHeight(kLineHeightMD);
// TODO(knollr): multiline should not be required, but we need to set the
// width of |title_view_| (because of crbug.com/682266), which only works in
// multiline mode.
@@ -946,15 +872,12 @@ void NotificationViewMD::CreateOrUpdateMessageView(
notification.message(), kMessageCharacterLimitMD, gfx::WORD_BREAK);
if (!message_view_) {
- const gfx::FontList& font_list = GetTextFontList();
-
message_view_ = left_content_->AddChildViewAt(
- std::make_unique<views::Label>(text, views::style::CONTEXT_LABEL,
- views::style::STYLE_DISABLED),
+ std::make_unique<views::Label>(text,
+ views::style::CONTEXT_DIALOG_BODY_TEXT,
+ views::style::STYLE_SECONDARY),
left_content_count_);
- message_view_->SetFontList(font_list);
message_view_->SetHorizontalAlignment(gfx::ALIGN_TO_HEAD);
- message_view_->SetLineHeight(kLineHeightMD);
message_view_->SetMultiLine(true);
message_view_->SetMaxLines(kMaxLinesForMessageView);
message_view_->SetAllowCharacterBreak(true);
@@ -1028,13 +951,11 @@ void NotificationViewMD::CreateOrUpdateProgressStatusView(
}
if (!status_view_) {
- const gfx::FontList& font_list = GetTextFontList();
status_view_ = left_content_->AddChildViewAt(
std::make_unique<views::Label>(base::string16(),
- views::style::CONTEXT_LABEL,
- views::style::STYLE_DISABLED),
+ views::style::CONTEXT_DIALOG_BODY_TEXT,
+ views::style::STYLE_SECONDARY),
left_content_count_);
- status_view_->SetFontList(font_list);
status_view_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
status_view_->SetBorder(views::CreateEmptyBorder(kStatusTextPadding));
}
@@ -1172,8 +1093,10 @@ void NotificationViewMD::CreateOrUpdateActionButtonViews(
base::string16 label = base::i18n::ToUpper(button_info.title);
if (new_buttons) {
action_buttons_.push_back(action_buttons_row_->AddChildView(
- std::make_unique<NotificationMdTextButton>(this, label,
- button_info.placeholder)));
+ std::make_unique<NotificationMdTextButton>(
+ base::BindRepeating(&NotificationViewMD::ActionButtonPressed,
+ base::Unretained(this), i),
+ label, button_info.placeholder)));
// TODO(pkasting): BoxLayout should invalidate automatically when a child
// is added, at which point we can remove this call.
action_buttons_row_->InvalidateLayout();
@@ -1234,6 +1157,9 @@ void NotificationViewMD::CreateOrUpdateInlineSettingsViews(
IDS_MESSAGE_CENTER_BLOCK_ALL_NOTIFICATIONS;
break;
case NotifierType::CROSTINI_APPLICATION:
+ FALLTHROUGH;
+ // PhoneHub notifications do not have inline settings.
+ case NotifierType::PHONE_HUB:
NOTREACHED();
break;
}
@@ -1253,7 +1179,9 @@ void NotificationViewMD::CreateOrUpdateInlineSettingsViews(
settings_row_->SetVisible(false);
settings_done_button_ = new NotificationMdTextButton(
- this, l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_SETTINGS_DONE),
+ base::BindRepeating(&NotificationViewMD::ToggleInlineSettings,
+ base::Unretained(this)),
+ l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_SETTINGS_DONE),
base::nullopt);
auto* settings_button_row = new views::View;
@@ -1268,6 +1196,47 @@ void NotificationViewMD::CreateOrUpdateInlineSettingsViews(
AddChildViewAt(settings_row_, GetIndexOf(actions_row_));
}
+void NotificationViewMD::HeaderRowPressed() {
+ if (!IsExpandable() || !content_row_->GetVisible())
+ return;
+
+ // Tapping anywhere on |header_row_| can expand the notification, though only
+ // |expand_button| can be focused by TAB.
+ SetManuallyExpandedOrCollapsed(true);
+ auto weak_ptr = weak_ptr_factory_.GetWeakPtr();
+ ToggleExpanded();
+ // Check |this| is valid before continuing, because ToggleExpanded() might
+ // cause |this| to be deleted.
+ if (!weak_ptr)
+ return;
+ Layout();
+ SchedulePaint();
+}
+
+void NotificationViewMD::ActionButtonPressed(size_t index,
+ const ui::Event& event) {
+ const base::Optional<base::string16>& placeholder =
+ action_buttons_[index]->placeholder();
+ if (placeholder) {
+ inline_reply_->textfield()->SetProperty(kTextfieldIndexKey, int{index});
+ inline_reply_->textfield()->SetPlaceholderText(
+ placeholder->empty()
+ ? l10n_util::GetStringUTF16(
+ IDS_MESSAGE_CENTER_NOTIFICATION_INLINE_REPLY_PLACEHOLDER)
+ : *placeholder);
+ inline_reply_->AnimateBackground(event);
+ inline_reply_->SetVisible(true);
+ action_buttons_row_->SetVisible(false);
+ // RequestFocus() should be called after SetVisible().
+ inline_reply_->textfield()->RequestFocus();
+ Layout();
+ SchedulePaint();
+ } else {
+ MessageCenter::Get()->ClickOnNotificationButton(notification_id(),
+ int{index});
+ }
+}
+
bool NotificationViewMD::IsExpandable() {
// Inline settings can not be expanded.
if (GetMode() == Mode::SETTING)
diff --git a/chromium/ui/message_center/views/notification_view_md.h b/chromium/ui/message_center/views/notification_view_md.h
index 78485487d7c..f9131770f9f 100644
--- a/chromium/ui/message_center/views/notification_view_md.h
+++ b/chromium/ui/message_center/views/notification_view_md.h
@@ -16,7 +16,6 @@
#include "ui/message_center/message_center_export.h"
#include "ui/message_center/views/message_view.h"
#include "ui/views/animation/ink_drop_observer.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/md_text_button.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/metadata/metadata_header_macros.h"
@@ -41,7 +40,7 @@ class MESSAGE_CENTER_EXPORT NotificationMdTextButton
public:
METADATA_HEADER(NotificationMdTextButton);
- NotificationMdTextButton(views::ButtonListener* listener,
+ NotificationMdTextButton(PressedCallback callback,
const base::string16& label,
const base::Optional<base::string16>& placeholder);
~NotificationMdTextButton() override;
@@ -118,7 +117,6 @@ class NotificationInputDelegate {
};
class NotificationInputContainerMD : public views::InkDropHostView,
- public views::ButtonListener,
public views::TextfieldController {
public:
explicit NotificationInputContainerMD(NotificationInputDelegate* delegate);
@@ -139,9 +137,6 @@ class NotificationInputContainerMD : public views::InkDropHostView,
const ui::KeyEvent& key_event) override;
void OnAfterUserAction(views::Textfield* sender) override;
- // Overridden from views::ButtonListener:
- void ButtonPressed(views::Button* sender, const ui::Event& event) override;
-
views::Textfield* textfield() const { return textfield_; }
views::ImageButton* button() const { return button_; }
@@ -165,9 +160,19 @@ class NotificationInputContainerMD : public views::InkDropHostView,
class MESSAGE_CENTER_EXPORT NotificationViewMD
: public MessageView,
public views::InkDropObserver,
- public NotificationInputDelegate,
- public views::ButtonListener {
+ public NotificationInputDelegate {
public:
+ // This defines an enumeration of IDs that can uniquely identify a view within
+ // the scope of NotificationViewMD.
+ enum ViewId {
+ // We start from 1 because 0 is the default view ID.
+ kHeaderRow = 1,
+ kAppNameView,
+ kSummaryTextView,
+ kActionButtonsRow,
+ kInlineReply,
+ };
+
explicit NotificationViewMD(const Notification& notification);
~NotificationViewMD() override;
@@ -191,7 +196,6 @@ class MESSAGE_CENTER_EXPORT NotificationViewMD
std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override;
SkColor GetInkDropBaseColor() const override;
void UpdateWithNotification(const Notification& notification) override;
- void ButtonPressed(views::Button* sender, const ui::Event& event) override;
void UpdateCornerRadius(int top_radius, int bottom_radius) override;
NotificationControlButtonsView* GetControlButtonsView() const override;
bool IsExpanded() const override;
@@ -266,6 +270,9 @@ class MESSAGE_CENTER_EXPORT NotificationViewMD
void CreateOrUpdateActionButtonViews(const Notification& notification);
void CreateOrUpdateInlineSettingsViews(const Notification& notification);
+ void HeaderRowPressed();
+ void ActionButtonPressed(size_t index, const ui::Event& event);
+
bool IsExpandable();
void ToggleExpanded();
void UpdateViewForExpandedState(bool expanded);
diff --git a/chromium/ui/message_center/views/notification_view_md_unittest.cc b/chromium/ui/message_center/views/notification_view_md_unittest.cc
index 0ab9ed9206a..80afef5aa91 100644
--- a/chromium/ui/message_center/views/notification_view_md_unittest.cc
+++ b/chromium/ui/message_center/views/notification_view_md_unittest.cc
@@ -32,6 +32,7 @@
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/button/radio_button.h"
#include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/test/button_test_api.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/test/widget_test.h"
#include "ui/views/widget/widget_utils.h"
@@ -1366,8 +1367,8 @@ TEST_F(NotificationViewMDTest, TestDeleteOnToggleExpanded) {
// The view can be deleted by PreferredSizeChanged(). https://crbug.com/918933
set_delete_on_preferred_size_changed(true);
- notification_view()->ButtonPressed(notification_view()->header_row_,
- DummyEvent());
+ views::test::ButtonTestApi(notification_view()->header_row_)
+ .NotifyClick(DummyEvent());
}
TEST_F(NotificationViewMDTest, TestDeleteOnDisableNotification) {
@@ -1381,8 +1382,8 @@ TEST_F(NotificationViewMDTest, TestDeleteOnDisableNotification) {
// After DisableNotification() is called, |notification_view| can be deleted.
// https://crbug.com/924922
set_delete_on_notification_removed(true);
- notification_view()->ButtonPressed(notification_view()->settings_done_button_,
- DummyEvent());
+ views::test::ButtonTestApi(notification_view()->settings_done_button_)
+ .NotifyClick(DummyEvent());
}
TEST_F(NotificationViewMDTest, TestLongTitleAndMessage) {
diff --git a/chromium/ui/message_center/views/padded_button.cc b/chromium/ui/message_center/views/padded_button.cc
index 9df85d14ee1..24409c24745 100644
--- a/chromium/ui/message_center/views/padded_button.cc
+++ b/chromium/ui/message_center/views/padded_button.cc
@@ -18,9 +18,8 @@
namespace message_center {
-PaddedButton::PaddedButton(views::ButtonListener* listener)
- : views::ImageButton(listener) {
- SetFocusForPlatform();
+PaddedButton::PaddedButton(PressedCallback callback)
+ : views::ImageButton(std::move(callback)) {
SetBorder(views::CreateEmptyBorder(gfx::Insets(kControlButtonBorderSize)));
SetAnimateOnStateChange(false);
diff --git a/chromium/ui/message_center/views/padded_button.h b/chromium/ui/message_center/views/padded_button.h
index 31bd6bc3b0d..1fa0806d115 100644
--- a/chromium/ui/message_center/views/padded_button.h
+++ b/chromium/ui/message_center/views/padded_button.h
@@ -23,7 +23,7 @@ namespace message_center {
// area (<http://crbug.com/168856>).
class MESSAGE_CENTER_EXPORT PaddedButton : public views::ImageButton {
public:
- PaddedButton(views::ButtonListener* listener);
+ explicit PaddedButton(PressedCallback callback);
~PaddedButton() override = default;
// views::ImageButton:
diff --git a/chromium/ui/native_theme/BUILD.gn b/chromium/ui/native_theme/BUILD.gn
index 28ff81b31a1..2f5cc7d7cde 100644
--- a/chromium/ui/native_theme/BUILD.gn
+++ b/chromium/ui/native_theme/BUILD.gn
@@ -59,6 +59,7 @@ component("native_theme") {
deps = [
"//base",
"//base/third_party/dynamic_annotations",
+ "//build:chromeos_buildflags",
"//cc/paint",
"//ui/base",
"//ui/color",
@@ -133,7 +134,7 @@ test("native_theme_unittests") {
}
if (is_mac) {
- sources += [ "native_theme_mac_unittest.cc" ]
+ sources += [ "native_theme_mac_unittest.mm" ]
}
if (is_win) {
diff --git a/chromium/ui/native_theme/common_theme.cc b/chromium/ui/native_theme/common_theme.cc
index 35301a2fd7f..5d675682b77 100644
--- a/chromium/ui/native_theme/common_theme.cc
+++ b/chromium/ui/native_theme/common_theme.cc
@@ -72,12 +72,15 @@ base::Optional<SkColor> GetDarkSchemeColor(NativeTheme::ColorId color_id) {
case NativeTheme::kColorId_BubbleBackground:
case NativeTheme::kColorId_NotificationDefaultBackground:
return color_utils::AlphaBlend(SK_ColorWHITE, gfx::kGoogleGrey900, 0.04f);
+ case NativeTheme::kColorId_AvatarIconGuest:
case NativeTheme::kColorId_DialogForeground:
return gfx::kGoogleGrey500;
- case NativeTheme::kColorId_BubbleForeground:
- return gfx::kGoogleGrey200;
case NativeTheme::kColorId_BubbleFooterBackground:
return SkColorSetRGB(0x32, 0x36, 0x39);
+ case NativeTheme::kColorId_AvatarHeaderArt:
+ return gfx::kGoogleGrey800;
+ case NativeTheme::kColorId_AvatarIconIncognito:
+ return gfx::kGoogleGrey200;
// FocusableBorder
case NativeTheme::kColorId_FocusedBorderColor:
@@ -249,10 +252,13 @@ SkColor GetDefaultColor(NativeTheme::ColorId color_id,
case NativeTheme::kColorId_BubbleBackground:
case NativeTheme::kColorId_NotificationDefaultBackground:
return SK_ColorWHITE;
+ case NativeTheme::kColorId_AvatarHeaderArt:
+ return gfx::kGoogleGrey300;
+ case NativeTheme::kColorId_AvatarIconIncognito:
+ return kPrimaryTextColor;
+ case NativeTheme::kColorId_AvatarIconGuest:
case NativeTheme::kColorId_DialogForeground:
return gfx::kGoogleGrey700;
- case NativeTheme::kColorId_BubbleForeground:
- return kPrimaryTextColor;
case NativeTheme::kColorId_BubbleFooterBackground:
return gfx::kGoogleGrey050;
diff --git a/chromium/ui/native_theme/native_theme.cc b/chromium/ui/native_theme/native_theme.cc
index 7a9ae490f6e..32b264749c2 100644
--- a/chromium/ui/native_theme/native_theme.cc
+++ b/chromium/ui/native_theme/native_theme.cc
@@ -36,6 +36,9 @@ NativeThemeColorIdToColorIdMap() {
{NTCID::kColorId_AlertSeverityHigh, kColorAlertHighSeverity},
{NTCID::kColorId_AlertSeverityLow, kColorAlertLowSeverity},
{NTCID::kColorId_AlertSeverityMedium, kColorAlertMediumSeverity},
+ {NTCID::kColorId_AvatarHeaderArt, kColorAvatarHeaderArt},
+ {NTCID::kColorId_AvatarIconGuest, kColorAvatarIconGuest},
+ {NTCID::kColorId_AvatarIconIncognito, kColorAvatarIconIncognito},
{NTCID::kColorId_BubbleBackground, kColorBubbleBackground},
{NTCID::kColorId_BubbleFooterBackground,
kColorBubbleFooterBackground},
@@ -230,7 +233,8 @@ void NativeTheme::NotifyObservers() {
NativeTheme::NativeTheme(bool should_use_dark_colors)
: should_use_dark_colors_(should_use_dark_colors || IsForcedDarkMode()),
is_high_contrast_(IsForcedHighContrast()),
- preferred_color_scheme_(CalculatePreferredColorScheme()) {
+ preferred_color_scheme_(CalculatePreferredColorScheme()),
+ preferred_contrast_(CalculatePreferredContrast()) {
#if !defined(OS_ANDROID)
// TODO(http://crbug.com/1057754): Merge this into the ColorProviderManager.
static base::OnceClosure color_provider_manager_init = base::BindOnce([]() {
@@ -273,6 +277,10 @@ NativeTheme::PreferredColorScheme NativeTheme::GetPreferredColorScheme() const {
return preferred_color_scheme_;
}
+NativeTheme::PreferredContrast NativeTheme::GetPreferredContrast() const {
+ return preferred_contrast_;
+}
+
bool NativeTheme::IsForcedDarkMode() const {
static bool kIsForcedDarkMode =
base::CommandLine::ForCurrentProcess()->HasSwitch(
@@ -293,6 +301,11 @@ NativeTheme::PreferredColorScheme NativeTheme::CalculatePreferredColorScheme()
: NativeTheme::PreferredColorScheme::kLight;
}
+NativeTheme::PreferredContrast NativeTheme::CalculatePreferredContrast() const {
+ return IsForcedHighContrast() ? PreferredContrast::kMore
+ : PreferredContrast::kNoPreference;
+}
+
base::Optional<CaptionStyle> NativeTheme::GetSystemCaptionStyle() const {
return CaptionStyle::FromSystemSettings();
}
@@ -356,6 +369,7 @@ void NativeTheme::ColorSchemeNativeThemeObserver::OnNativeThemeUpdated(
bool is_high_contrast = observed_theme->UsesHighContrastColors();
PreferredColorScheme preferred_color_scheme =
observed_theme->GetPreferredColorScheme();
+ PreferredContrast preferred_contrast = observed_theme->GetPreferredContrast();
bool notify_observers = false;
if (theme_to_update_->ShouldUseDarkColors() != should_use_dark_colors) {
@@ -370,6 +384,10 @@ void NativeTheme::ColorSchemeNativeThemeObserver::OnNativeThemeUpdated(
theme_to_update_->set_preferred_color_scheme(preferred_color_scheme);
notify_observers = true;
}
+ if (theme_to_update_->GetPreferredContrast() != preferred_contrast) {
+ theme_to_update_->set_preferred_contrast(preferred_contrast);
+ notify_observers = true;
+ }
const auto& system_colors = observed_theme->GetSystemColors();
if (theme_to_update_->HasDifferentSystemColors(system_colors)) {
diff --git a/chromium/ui/native_theme/native_theme.h b/chromium/ui/native_theme/native_theme.h
index e2ca7dd1983..726f588a682 100644
--- a/chromium/ui/native_theme/native_theme.h
+++ b/chromium/ui/native_theme/native_theme.h
@@ -107,12 +107,20 @@ class NATIVE_THEME_EXPORT NativeTheme {
// OS-level preferred color scheme. (Ex. high contrast or dark mode color
// preference.)
- enum PreferredColorScheme {
- kDark,
- kLight,
+ enum class PreferredColorScheme {
+ kDark = 0,
+ kLight = 1,
kMaxValue = kLight,
};
+ // OS-level preferred contrast. (Ex. high contrast or increased contrast.)
+ enum class PreferredContrast {
+ kNoPreference = 0,
+ kMore = 1,
+ kLess = 2,
+ kMaxValue = kLess,
+ };
+
// IMPORTANT!
// This enum is reporting in metrics. Do not reorder; add additional values at
// the end.
@@ -435,6 +443,9 @@ class NATIVE_THEME_EXPORT NativeTheme {
// is calculated.
virtual PreferredColorScheme GetPreferredColorScheme() const;
+ // Returns the OS-level user preferred contrast.
+ virtual PreferredContrast GetPreferredContrast() const;
+
// Returns the system's caption style.
virtual base::Optional<CaptionStyle> GetSystemCaptionStyle() const;
@@ -457,11 +468,14 @@ class NATIVE_THEME_EXPORT NativeTheme {
void set_preferred_color_scheme(PreferredColorScheme preferred_color_scheme) {
preferred_color_scheme_ = preferred_color_scheme;
}
+ void set_preferred_contrast(PreferredContrast preferred_contrast) {
+ preferred_contrast_ = preferred_contrast;
+ }
void set_system_colors(const std::map<SystemThemeColor, SkColor>& colors);
- // Updates the state of dark mode, high contrast, preferred color scheme,
- // and the map of system colors. Returns true if NativeTheme was updated
- // as a result, or false if the state of NativeTheme was untouched.
+ // Updates the state of dark mode, high contrast, and the map of system
+ // colors. Returns true if NativeTheme was updated as a result, or false if
+ // the state of NativeTheme was untouched.
bool UpdateSystemColorInfo(
bool is_dark_mode,
bool is_high_contrast,
@@ -495,6 +509,9 @@ class NATIVE_THEME_EXPORT NativeTheme {
// calculation will follow the default behavior.
virtual PreferredColorScheme CalculatePreferredColorScheme() const;
+ // Calculates and returns the current user preferred contrast.
+ virtual PreferredContrast CalculatePreferredContrast() const;
+
// A function to be called by native theme instances that need to set state
// or listeners with the webinstance in order to provide correct native
// platform behaviors.
@@ -503,7 +520,7 @@ class NATIVE_THEME_EXPORT NativeTheme {
// Allows one native theme to observe changes in another. For example, the
// web native theme for Windows observes the corresponding ui native theme in
// order to receive changes regarding the state of dark mode, high contrast,
- // and preferred color scheme.
+ // preferred color scheme and preferred contrast.
class NATIVE_THEME_EXPORT ColorSchemeNativeThemeObserver
: public NativeThemeObserver {
public:
@@ -529,6 +546,7 @@ class NATIVE_THEME_EXPORT NativeTheme {
bool should_use_dark_colors_ = false;
bool is_high_contrast_ = false;
PreferredColorScheme preferred_color_scheme_ = PreferredColorScheme::kLight;
+ PreferredContrast preferred_contrast_ = PreferredContrast::kNoPreference;
DISALLOW_COPY_AND_ASSIGN(NativeTheme);
};
diff --git a/chromium/ui/native_theme/native_theme_aura.cc b/chromium/ui/native_theme/native_theme_aura.cc
index eb68579e8cf..fb2297a4021 100644
--- a/chromium/ui/native_theme/native_theme_aura.cc
+++ b/chromium/ui/native_theme/native_theme_aura.cc
@@ -11,6 +11,7 @@
#include "base/notreached.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
#include "cc/paint/paint_canvas.h"
#include "cc/paint/paint_flags.h"
#include "third_party/skia/include/core/SkPath.h"
@@ -75,7 +76,7 @@ NativeThemeAura::NativeThemeAura(bool use_overlay_scrollbars,
: NativeThemeBase(should_only_use_dark_colors),
use_overlay_scrollbars_(use_overlay_scrollbars) {
// We don't draw scrollbar buttons.
-#if defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
set_scrollbar_button_length(0);
#endif
@@ -351,7 +352,10 @@ void NativeThemeAura::PaintScrollbarCorner(cc::PaintCanvas* canvas,
// Overlay Scrollbar should never paint a scrollbar corner.
DCHECK(!use_overlay_scrollbars_);
cc::PaintFlags flags;
- flags.setColor(SkColorSetRGB(0xDC, 0xDC, 0xDC));
+ SkColor bg_color = color_scheme == ui::NativeTheme::ColorScheme::kDark
+ ? SkColorSetRGB(0x12, 0x12, 0x12)
+ : SkColorSetRGB(0xDC, 0xDC, 0xDC);
+ flags.setColor(bg_color);
canvas->drawIRect(RectToSkIRect(rect), flags);
}
diff --git a/chromium/ui/native_theme/native_theme_base.cc b/chromium/ui/native_theme/native_theme_base.cc
index 3047394c87c..dc879e3b41f 100644
--- a/chromium/ui/native_theme/native_theme_base.cc
+++ b/chromium/ui/native_theme/native_theme_base.cc
@@ -891,7 +891,7 @@ void NativeThemeBase::PaintButton(cc::PaintCanvas* canvas,
// If the button is too small, fallback to drawing a single, solid color.
if (rect.width() < 5 || rect.height() < 5) {
- flags.setColor(ControlsFillColorForState(state, color_scheme));
+ flags.setColor(ButtonFillColorForState(state, color_scheme));
canvas->drawRect(skrect, flags);
return;
}
@@ -901,14 +901,14 @@ void NativeThemeBase::PaintButton(cc::PaintCanvas* canvas,
// Paint the background (is not visible behind the rounded corners).
skrect.inset(kBorderWidth / 2, kBorderWidth / 2);
PaintLightenLayer(canvas, skrect, state, border_radius, color_scheme);
- flags.setColor(ControlsFillColorForState(state, color_scheme));
+ flags.setColor(ButtonFillColorForState(state, color_scheme));
canvas->drawRoundRect(skrect, border_radius, border_radius, flags);
// Paint the border: 1px solid.
if (button.has_border) {
flags.setStyle(cc::PaintFlags::kStroke_Style);
flags.setStrokeWidth(kBorderWidth);
- flags.setColor(ControlsBorderColorForState(state, color_scheme));
+ flags.setColor(ButtonBorderColorForState(state, color_scheme));
canvas->drawRoundRect(skrect, border_radius, border_radius, flags);
}
return;
@@ -1542,6 +1542,22 @@ SkColor NativeThemeBase::ControlsBorderColorForState(
return GetControlColor(color_id, color_scheme);
}
+SkColor NativeThemeBase::ButtonBorderColorForState(
+ State state,
+ ColorScheme color_scheme) const {
+ ControlColorId color_id;
+ if (state == kHovered) {
+ color_id = kButtonHoveredBorder;
+ } else if (state == kPressed) {
+ color_id = kButtonPressedBorder;
+ } else if (state == kDisabled) {
+ color_id = kButtonDisabledBorder;
+ } else {
+ color_id = kButtonBorder;
+ }
+ return GetControlColor(color_id, color_scheme);
+}
+
SkColor NativeThemeBase::ControlsFillColorForState(
State state,
ColorScheme color_scheme) const {
@@ -1558,6 +1574,22 @@ SkColor NativeThemeBase::ControlsFillColorForState(
return GetControlColor(color_id, color_scheme);
}
+SkColor NativeThemeBase::ButtonFillColorForState(
+ State state,
+ ColorScheme color_scheme) const {
+ ControlColorId color_id;
+ if (state == kHovered) {
+ color_id = kButtonHoveredFill;
+ } else if (state == kPressed) {
+ color_id = kButtonPressedFill;
+ } else if (state == kDisabled) {
+ color_id = kButtonDisabledFill;
+ } else {
+ color_id = kButtonFill;
+ }
+ return GetControlColor(color_id, color_scheme);
+}
+
SkColor NativeThemeBase::ControlsBackgroundColorForState(
State state,
ColorScheme color_scheme) const {
@@ -1582,12 +1614,16 @@ SkColor NativeThemeBase::GetControlColor(ControlColorId color_id,
switch (color_id) {
case kBorder:
+ case kButtonBorder:
return SkColorSetRGB(0x76, 0x76, 0x76);
case kHoveredBorder:
+ case kButtonHoveredBorder:
return SkColorSetRGB(0x4F, 0x4F, 0x4F);
case kPressedBorder:
+ case kButtonPressedBorder:
return SkColorSetRGB(0x8D, 0x8D, 0x8D);
case kDisabledBorder:
+ case kButtonDisabledBorder:
return SkColorSetARGB(0x4D, 0x76, 0x76, 0x76);
case kAccent:
return SkColorSetRGB(0x00, 0x75, 0xFF);
@@ -1602,12 +1638,16 @@ SkColor NativeThemeBase::GetControlColor(ControlColorId color_id,
case kDisabledBackground:
return SkColorSetA(SK_ColorWHITE, 0x99);
case kFill:
+ case kButtonFill:
return SkColorSetRGB(0xEF, 0xEF, 0xEF);
case kHoveredFill:
+ case kButtonHoveredFill:
return SkColorSetRGB(0xE5, 0xE5, 0xE5);
case kPressedFill:
+ case kButtonPressedFill:
return SkColorSetRGB(0xF5, 0xF5, 0xF5);
case kDisabledFill:
+ case kButtonDisabledFill:
return SkColorSetARGB(0x4D, 0xEF, 0xEF, 0xEF);
case kLightenLayer:
return SkColorSetARGB(0x33, 0xA9, 0xA9, 0xA9);
@@ -1661,6 +1701,9 @@ SkColor NativeThemeBase::GetDarkModeControlColor(
return SkColorSetRGB(0x63, 0xAD, 0xE5);
case kFill:
return SkColorSetRGB(0x3B, 0x3B, 0x3B);
+ case kButtonBorder:
+ case kButtonFill:
+ return SkColorSetRGB(0x6B, 0x6B, 0x6B);
case kLightenLayer:
case kAutoCompleteBackground:
case kBackground:
@@ -1685,9 +1728,17 @@ SkColor NativeThemeBase::GetDarkModeControlColor(
return SkColorSetRGB(0x62, 0x62, 0x62);
case kHoveredFill:
return SkColorSetRGB(0x3B, 0x3B, 0x3B);
+ case kButtonHoveredBorder:
+ case kButtonHoveredFill:
+ return SkColorSetRGB(0x7B, 0x7B, 0x7B);
case kPressedFill:
return SkColorSetRGB(0x3B, 0x3B, 0x3B);
+ case kButtonPressedBorder:
+ case kButtonPressedFill:
+ return SkColorSetRGB(0x61, 0x61, 0x61);
case kDisabledFill:
+ case kButtonDisabledBorder:
+ case kButtonDisabledFill:
return SkColorSetRGB(0x36, 0x36, 0x36);
case kScrollbarArrowBackground:
return SkColorSetRGB(0x42, 0x42, 0x42);
@@ -1720,10 +1771,14 @@ SkColor NativeThemeBase::GetHighContrastControlColor(
case kDisabledBorder:
case kDisabledAccent:
case kDisabledSlider:
+ case kButtonDisabledBorder:
return system_colors_[SystemThemeColor::kGrayText];
case kBorder:
case kHoveredBorder:
case kPressedBorder:
+ case kButtonBorder:
+ case kButtonHoveredBorder:
+ case kButtonPressedBorder:
return system_colors_[SystemThemeColor::kButtonText];
case kAccent:
case kHoveredAccent:
@@ -1743,6 +1798,10 @@ SkColor NativeThemeBase::GetHighContrastControlColor(
case kHoveredFill:
case kPressedFill:
case kDisabledFill:
+ case kButtonFill:
+ case kButtonHoveredFill:
+ case kButtonPressedFill:
+ case kButtonDisabledFill:
case kAutoCompleteBackground:
case kLightenLayer:
case kScrollbarArrowBackground:
@@ -1762,10 +1821,14 @@ SkColor NativeThemeBase::GetHighContrastControlColor(
case kDisabledBorder:
case kDisabledAccent:
case kDisabledSlider:
+ case kButtonDisabledBorder:
return SK_ColorGREEN;
case kBorder:
case kHoveredBorder:
case kPressedBorder:
+ case kButtonBorder:
+ case kButtonHoveredBorder:
+ case kButtonPressedBorder:
case kScrollbarThumbInactive:
case kScrollbarArrowBackground:
case kScrollbarTrack:
@@ -1784,6 +1847,10 @@ SkColor NativeThemeBase::GetHighContrastControlColor(
case kHoveredFill:
case kPressedFill:
case kDisabledFill:
+ case kButtonFill:
+ case kButtonHoveredFill:
+ case kButtonPressedFill:
+ case kButtonDisabledFill:
case kAutoCompleteBackground:
case kLightenLayer:
case kScrollbarThumb:
diff --git a/chromium/ui/native_theme/native_theme_base.h b/chromium/ui/native_theme/native_theme_base.h
index ea2989929e4..c4e206b76e6 100644
--- a/chromium/ui/native_theme/native_theme_base.h
+++ b/chromium/ui/native_theme/native_theme_base.h
@@ -76,7 +76,15 @@ class NATIVE_THEME_EXPORT NativeThemeBase : public NativeTheme {
kScrollbarThumb,
kScrollbarThumbHovered,
kScrollbarThumbPressed,
- kScrollbarThumbInactive
+ kScrollbarThumbInactive,
+ kButtonBorder,
+ kButtonDisabledBorder,
+ kButtonHoveredBorder,
+ kButtonPressedBorder,
+ kButtonFill,
+ kButtonDisabledFill,
+ kButtonHoveredFill,
+ kButtonPressedFill
};
using NativeTheme::NativeTheme;
@@ -260,6 +268,9 @@ class NATIVE_THEME_EXPORT NativeThemeBase : public NativeTheme {
const SkScalar border_radius,
ColorScheme color_scheme) const;
+ SkColor ButtonBorderColorForState(State state,
+ ColorScheme color_scheme) const;
+ SkColor ButtonFillColorForState(State state, ColorScheme color_scheme) const;
SkColor ControlsAccentColorForState(State state,
ColorScheme color_scheme) const;
SkColor ControlsBorderColorForState(State state,
diff --git a/chromium/ui/native_theme/native_theme_color_id.h b/chromium/ui/native_theme/native_theme_color_id.h
index dde0f977c67..52ac7e6b292 100644
--- a/chromium/ui/native_theme/native_theme_color_id.h
+++ b/chromium/ui/native_theme/native_theme_color_id.h
@@ -14,8 +14,11 @@
OP(kColorId_DialogBackground), \
OP(kColorId_DialogForeground), \
OP(kColorId_BubbleBackground), \
- OP(kColorId_BubbleForeground), \
OP(kColorId_BubbleFooterBackground), \
+ /* Avatar and Header Asset */ \
+ OP(kColorId_AvatarHeaderArt), \
+ OP(kColorId_AvatarIconGuest), \
+ OP(kColorId_AvatarIconIncognito), \
/* FocusableBorder */ \
OP(kColorId_FocusedBorderColor), \
OP(kColorId_UnfocusedBorderColor), \
diff --git a/chromium/ui/native_theme/native_theme_features.cc b/chromium/ui/native_theme/native_theme_features.cc
index 8457e0fef09..09575183833 100644
--- a/chromium/ui/native_theme/native_theme_features.cc
+++ b/chromium/ui/native_theme/native_theme_features.cc
@@ -5,10 +5,12 @@
#include "ui/native_theme/native_theme_features.h"
#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
namespace features {
-#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_FUCHSIA)
+#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_FUCHSIA) || \
+ BUILDFLAG(IS_LACROS)
constexpr base::FeatureState kOverlayScrollbarFeatureState =
base::FEATURE_ENABLED_BY_DEFAULT;
#else
@@ -26,11 +28,6 @@ const base::Feature kOverlayScrollbar{"OverlayScrollbar",
const base::Feature kOverlayScrollbarFlashAfterAnyScrollUpdate{
"OverlayScrollbarFlashAfterAnyScrollUpdate", kOverlayScrollbarFeatureState};
-// Experiment: Enables will flash scorllbar when user move mouse enter a
-// scrollable area.
-const base::Feature kOverlayScrollbarFlashWhenMouseEnter{
- "OverlayScrollbarFlashWhenMouseEnter", base::FEATURE_DISABLED_BY_DEFAULT};
-
} // namespace features
namespace ui {
@@ -44,9 +41,4 @@ bool OverlayScrollbarFlashAfterAnyScrollUpdate() {
features::kOverlayScrollbarFlashAfterAnyScrollUpdate);
}
-bool OverlayScrollbarFlashWhenMouseEnter() {
- return base::FeatureList::IsEnabled(
- features::kOverlayScrollbarFlashWhenMouseEnter);
-}
-
} // namespace ui
diff --git a/chromium/ui/native_theme/native_theme_features.h b/chromium/ui/native_theme/native_theme_features.h
index e6cbdec5944..218dfd6f7d2 100644
--- a/chromium/ui/native_theme/native_theme_features.h
+++ b/chromium/ui/native_theme/native_theme_features.h
@@ -15,8 +15,6 @@ namespace features {
NATIVE_THEME_EXPORT extern const base::Feature kOverlayScrollbar;
NATIVE_THEME_EXPORT extern const base::Feature
kOverlayScrollbarFlashAfterAnyScrollUpdate;
-NATIVE_THEME_EXPORT extern const base::Feature
- kOverlayScrollbarFlashWhenMouseEnter;
} // namespace features
diff --git a/chromium/ui/native_theme/native_theme_mac.h b/chromium/ui/native_theme/native_theme_mac.h
index fb95b14032d..8961b9e9dfc 100644
--- a/chromium/ui/native_theme/native_theme_mac.h
+++ b/chromium/ui/native_theme/native_theme_mac.h
@@ -44,6 +44,9 @@ class NATIVE_THEME_EXPORT NativeThemeMac : public NativeThemeBase {
// Overridden from NativeTheme:
SkColor GetSystemButtonPressedColor(SkColor base_color) const override;
+ // Overridden from NativeTheme:
+ PreferredContrast CalculatePreferredContrast() const override;
+
// Overridden from NativeThemeBase:
void Paint(cc::PaintCanvas* canvas,
Part part,
@@ -92,10 +95,10 @@ class NATIVE_THEME_EXPORT NativeThemeMac : public NativeThemeBase {
friend class base::NoDestructor<NativeThemeMac>;
static NativeThemeMac* instance();
- private:
NativeThemeMac(bool configure_web_instance, bool should_only_use_dark_colors);
~NativeThemeMac() override;
+ private:
// Paint the selected menu item background, and a border for emphasis when in
// high contrast.
void PaintSelectedMenuItem(cc::PaintCanvas* canvas,
diff --git a/chromium/ui/native_theme/native_theme_mac.mm b/chromium/ui/native_theme/native_theme_mac.mm
index 2ec658c0050..58226be7e1f 100644
--- a/chromium/ui/native_theme/native_theme_mac.mm
+++ b/chromium/ui/native_theme/native_theme_mac.mm
@@ -239,6 +239,13 @@ base::Optional<SkColor> NativeThemeMac::GetOSColor(
}
}
+NativeThemeAura::PreferredContrast NativeThemeMac::CalculatePreferredContrast()
+ const {
+ return UsesHighContrastColors()
+ ? NativeThemeAura::PreferredContrast::kMore
+ : NativeThemeAura::PreferredContrast::kNoPreference;
+}
+
void NativeThemeMac::Paint(cc::PaintCanvas* canvas,
Part part,
State state,
@@ -591,6 +598,8 @@ NativeThemeMac::NativeThemeMac(bool configure_web_instance,
queue:nil
usingBlock:^(NSNotification* notification) {
theme->set_high_contrast(IsHighContrast());
+ theme->set_preferred_contrast(
+ CalculatePreferredContrast());
theme->NotifyObservers();
}];
}
@@ -635,6 +644,7 @@ void NativeThemeMac::ConfigureWebInstance() {
NativeTheme* web_instance = NativeTheme::GetInstanceForWeb();
web_instance->set_use_dark_colors(IsDarkMode());
web_instance->set_preferred_color_scheme(CalculatePreferredColorScheme());
+ web_instance->set_preferred_contrast(CalculatePreferredContrast());
web_instance->set_high_contrast(IsHighContrast());
// Add the web native theme as an observer to stay in sync with dark mode,
diff --git a/chromium/ui/native_theme/native_theme_mac_unittest.cc b/chromium/ui/native_theme/native_theme_mac_unittest.mm
index d6d3327bb1c..6ad349e4809 100644
--- a/chromium/ui/native_theme/native_theme_mac_unittest.cc
+++ b/chromium/ui/native_theme/native_theme_mac_unittest.mm
@@ -2,12 +2,20 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/native_theme/native_theme.h"
+#include "ui/native_theme/native_theme_mac.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ui {
+class TestNativeThemeMac : public NativeThemeMac {
+ public:
+ TestNativeThemeMac() : NativeThemeMac(false, false) {}
+ TestNativeThemeMac& operator=(const TestNativeThemeMac&) = delete;
+
+ ~TestNativeThemeMac() override = default;
+};
+
// Test to ensure any system colors that are looked up by name exist on all Mac
// platforms Chrome supports, and that their colorspace and component count is
// sane.
@@ -20,7 +28,7 @@ TEST(NativeThemeMacTest, SystemColorsExist) {
EXPECT_NE(
static_cast<SkColor>(0),
native_theme->GetSystemColor(static_cast<NativeTheme::ColorId>(i)))
- << "GetSystemColor() unexpectedly gave a fully transparent color.";
+ << "GetSystemColor() unexpectedly gave a fully transparent color.";
}
}
@@ -51,4 +59,17 @@ TEST(NativeThemeMacTest, GetPlatformHighContrastColorScheme) {
EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
}
+TEST(NativeThemeMacTest, GetPreferredContrast) {
+ using PrefContrast = NativeTheme::PreferredContrast;
+
+ TestNativeThemeMac native_theme;
+
+ native_theme.set_high_contrast(false);
+ EXPECT_EQ(native_theme.CalculatePreferredContrast(),
+ PrefContrast::kNoPreference);
+
+ native_theme.set_high_contrast(true);
+ EXPECT_EQ(native_theme.CalculatePreferredContrast(), PrefContrast::kMore);
+}
+
} // namespace ui
diff --git a/chromium/ui/native_theme/native_theme_win.cc b/chromium/ui/native_theme/native_theme_win.cc
index 28acb663886..c45c48d9de7 100644
--- a/chromium/ui/native_theme/native_theme_win.cc
+++ b/chromium/ui/native_theme/native_theme_win.cc
@@ -11,6 +11,7 @@
#include <vssym32.h>
#include "base/bind.h"
+#include "base/callback.h"
#include "base/check.h"
#include "base/command_line.h"
#include "base/notreached.h"
@@ -293,6 +294,7 @@ NativeThemeWin::NativeThemeWin(bool configure_web_instance,
// Initialize the cached system colors.
UpdateSystemColors();
set_preferred_color_scheme(CalculatePreferredColorScheme());
+ set_preferred_contrast(CalculatePreferredContrast());
memset(theme_handles_, 0, sizeof(theme_handles_));
@@ -316,6 +318,7 @@ void NativeThemeWin::ConfigureWebInstance() {
web_instance->set_use_dark_colors(ShouldUseDarkColors());
web_instance->set_high_contrast(UsesHighContrastColors());
web_instance->set_preferred_color_scheme(GetPreferredColorScheme());
+ web_instance->set_preferred_contrast(GetPreferredContrast());
web_instance->set_system_colors(GetSystemColors());
}
@@ -346,6 +349,7 @@ void NativeThemeWin::OnSysColorChange() {
if (!IsForcedHighContrast())
set_high_contrast(IsUsingHighContrastThemeInternal());
set_preferred_color_scheme(CalculatePreferredColorScheme());
+ set_preferred_contrast(CalculatePreferredContrast());
NotifyObservers();
}
@@ -745,6 +749,39 @@ NativeThemeWin::CalculatePreferredColorScheme() const {
return NativeTheme::PreferredColorScheme::kLight;
}
+NativeTheme::PreferredContrast NativeThemeWin::CalculatePreferredContrast()
+ const {
+ if (!UsesHighContrastColors())
+ return NativeTheme::CalculatePreferredContrast();
+
+ // According to the spec [1], "when the user agent can determine whether the
+ // forced color palette chosen by the user has a high or low contrast, one of
+ // 'prefers-contrast: more' or 'prefers-contrast: less' must match in addition
+ // to 'prefers-contrast: forced'."
+ //
+ // Using WCAG definitions [2], we have decided to match 'more' in Forced
+ // Colors Mode if the contrast ratio between the foreground and background
+ // color is 7:1 or greater.
+ //
+ // "A contrast ratio of 3:1 is the minimum level recommended by [[ISO-9241-3]]
+ // and [[ANSI-HFES-100-1988]] for standard text and vision"[2]. Given this,
+ // we will start by matching to 'less' in Forced Colors Mode if the contrast
+ // ratio between the foreground and background color is 2.5:1 or less.
+ //
+ // These ratios will act as an experimental baseline that we can adjust based
+ // on user feedback.
+ //
+ // [1] https://www.w3.org/TR/css-color-adjust-1/#forced
+ // [2] https://www.w3.org/WAI/WCAG21/Understanding/contrast-enhanced
+ SkColor bg_color = system_colors_[SystemThemeColor::kWindow];
+ SkColor fg_color = system_colors_[SystemThemeColor::kWindowText];
+ float contrast_ratio = color_utils::GetContrastRatio(bg_color, fg_color);
+ if (contrast_ratio >= 7)
+ return NativeTheme::PreferredContrast::kMore;
+ return contrast_ratio <= 2.5 ? NativeTheme::PreferredContrast::kLess
+ : NativeTheme::PreferredContrast::kNoPreference;
+}
+
NativeTheme::ColorScheme NativeThemeWin::GetDefaultSystemColorScheme() const {
return UsesHighContrastColors() ? ColorScheme::kPlatformHighContrast
: NativeTheme::GetDefaultSystemColorScheme();
diff --git a/chromium/ui/native_theme/native_theme_win.h b/chromium/ui/native_theme/native_theme_win.h
index c6a15a8a4dc..236565d507d 100644
--- a/chromium/ui/native_theme/native_theme_win.h
+++ b/chromium/ui/native_theme/native_theme_win.h
@@ -73,6 +73,7 @@ class NATIVE_THEME_EXPORT NativeThemeWin : public NativeTheme,
gfx::Rect GetNinePatchAperture(Part part) const override;
bool ShouldUseDarkColors() const override;
PreferredColorScheme CalculatePreferredColorScheme() const override;
+ PreferredContrast CalculatePreferredContrast() const override;
ColorScheme GetDefaultSystemColorScheme() const override;
protected:
@@ -209,7 +210,7 @@ class NATIVE_THEME_EXPORT NativeThemeWin : public NativeTheme,
gfx::ScopedSysColorChangeListener color_change_listener_;
// Used to notify the web native theme of changes to dark mode, high
- // contrast, and preferred color scheme.
+ // contrast, preferred color scheme, and preferred contrast.
std::unique_ptr<NativeTheme::ColorSchemeNativeThemeObserver>
color_scheme_observer_;
diff --git a/chromium/ui/native_theme/native_theme_win_unittest.cc b/chromium/ui/native_theme/native_theme_win_unittest.cc
index 5f0d0e842d8..bcef984bd2d 100644
--- a/chromium/ui/native_theme/native_theme_win_unittest.cc
+++ b/chromium/ui/native_theme/native_theme_win_unittest.cc
@@ -15,14 +15,14 @@ using SystemThemeColor = NativeTheme::SystemThemeColor;
class TestNativeThemeWin : public NativeThemeWin {
public:
TestNativeThemeWin() : NativeThemeWin(false, false) {}
+ TestNativeThemeWin& operator=(const TestNativeThemeWin&) = delete;
+
~TestNativeThemeWin() override = default;
// NativeTheme:
void SetSystemColor(SystemThemeColor system_color, SkColor color) {
system_colors_[system_color] = color;
}
-
- DISALLOW_COPY_AND_ASSIGN(TestNativeThemeWin);
};
TEST(NativeThemeWinTest, CalculatePreferredColorScheme) {
@@ -52,6 +52,33 @@ TEST(NativeThemeWinTest, CalculatePreferredColorScheme) {
EXPECT_EQ(theme.CalculatePreferredColorScheme(), PrefScheme::kLight);
}
+TEST(NativeThemeWinTest, CalculatePreferredContrast) {
+ using PrefContrast = NativeTheme::PreferredContrast;
+
+ TestNativeThemeWin theme;
+
+ theme.set_high_contrast(false);
+ EXPECT_EQ(theme.CalculatePreferredContrast(), PrefContrast::kNoPreference);
+
+ theme.set_high_contrast(true);
+ theme.SetSystemColor(SystemThemeColor::kWindow, SK_ColorBLACK);
+ theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorWHITE);
+ EXPECT_EQ(theme.CalculatePreferredContrast(), PrefContrast::kMore);
+
+ theme.SetSystemColor(SystemThemeColor::kWindow, SK_ColorWHITE);
+ theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorBLACK);
+ EXPECT_EQ(theme.CalculatePreferredContrast(), PrefContrast::kMore);
+
+ theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorRED);
+ EXPECT_EQ(theme.CalculatePreferredContrast(), PrefContrast::kNoPreference);
+
+ theme.SetSystemColor(SystemThemeColor::kWindowText, SK_ColorYELLOW);
+ EXPECT_EQ(theme.CalculatePreferredContrast(), PrefContrast::kLess);
+
+ theme.set_high_contrast(false);
+ EXPECT_EQ(theme.CalculatePreferredContrast(), PrefContrast::kNoPreference);
+}
+
TEST(NativeThemeWinTest, GetDefaultSystemColorScheme) {
using ColorScheme = NativeTheme::ColorScheme;
diff --git a/chromium/ui/ozone/BUILD.gn b/chromium/ui/ozone/BUILD.gn
index 60cd6f56a80..8416fb1f493 100644
--- a/chromium/ui/ozone/BUILD.gn
+++ b/chromium/ui/ozone/BUILD.gn
@@ -3,10 +3,11 @@
# found in the LICENSE file.
import("//build/buildflag_header.gni")
+import("//build/config/ozone.gni")
+import("//build/config/python.gni")
import("//build/config/ui.gni")
import("//gpu/vulkan/features.gni")
import("//testing/test.gni")
-import("//ui/ozone/ozone.gni")
assert(use_ozone)
@@ -21,6 +22,10 @@ ozone_platform_deps = ozone_external_platform_deps
# Extra dependencies to pull into ozone_unittests for built platforms.
ozone_platform_test_deps = ozone_external_platform_test_deps
+# Extra dependencies to pull into ui_test_support for built platforms.
+ozone_platform_ui_test_support_deps =
+ ozone_external_platform_ui_test_support_deps
+
if (ozone_platform_windows) {
ozone_platforms += [ "windows" ]
ozone_platform_deps += [ "platform/windows" ]
@@ -51,6 +56,7 @@ if (ozone_platform_wayland) {
if (ozone_platform_x11) {
ozone_platforms += [ "x11" ]
ozone_platform_deps += [ "platform/x11" ]
+ ozone_platform_ui_test_support_deps += [ "platform/x11:test_support" ]
}
if (ozone_platform_scenic) {
@@ -63,6 +69,8 @@ platform_list_h_file = "$target_gen_dir/platform_list.h"
platform_list_txt_file = "$target_gen_dir/platform_list.txt"
constructor_list_cc_file = "$target_gen_dir/constructor_list.cc"
+test_constructor_list_cc_file = "$target_gen_dir/test_constructor_list.cc"
+
component("ozone_base") {
sources = [
"public/gl_ozone.h",
@@ -83,8 +91,12 @@ component("ozone_base") {
"public/ozone_switches.h",
"public/platform_clipboard.h",
"public/platform_gl_egl_utility.h",
+ "public/platform_menu_utils.cc",
+ "public/platform_menu_utils.h",
"public/platform_screen.cc",
"public/platform_screen.h",
+ "public/platform_user_input_monitor.cc",
+ "public/platform_user_input_monitor.h",
"public/platform_window_surface.h",
"public/surface_factory_ozone.cc",
"public/surface_factory_ozone.h",
@@ -147,7 +159,6 @@ source_set("platform") {
"common/stub_client_native_pixmap_factory.cc",
"common/stub_client_native_pixmap_factory.h",
"platform_constructor_list.h",
- "platform_object.h",
"platform_object_internal.h",
"platform_selection.cc",
"platform_selection.h",
@@ -160,6 +171,7 @@ source_set("platform") {
]
public = [
+ "platform_object.h",
"public/client_native_pixmap_factory_ozone.h",
"public/ozone_gpu_test_helper.h",
"public/ozone_platform.h",
@@ -232,6 +244,33 @@ source_set("test_support_internal") {
public_deps = [ "//base/test:test_support" ]
}
+static_library("ui_test_support") {
+ visibility = []
+ visibility = [ "//ui/views:test_support" ]
+
+ testonly = true
+
+ sources = [
+ "common/test/stub_ozone_ui_controls_test_helper.cc",
+ "common/test/stub_ozone_ui_controls_test_helper.h",
+ "public/ozone_ui_controls_test_helper.cc",
+ test_constructor_list_cc_file,
+ ]
+
+ public = [ "public/ozone_ui_controls_test_helper.h" ]
+
+ deps = [
+ ":generate_test_support_constructor_list",
+ ":ozone",
+ "//ui/base:test_support",
+ "//ui/events:events_base",
+ ]
+
+ deps += ozone_platform_ui_test_support_deps
+
+ allow_circular_includes_from = ozone_platform_ui_test_support_deps
+}
+
static_library("test_support") {
visibility = []
visibility = [
@@ -283,6 +322,24 @@ action("generate_constructor_list") {
deps = [ ":generate_ozone_platform_list" ]
}
+action("generate_test_support_constructor_list") {
+ script = "generate_constructor_list.py"
+
+ inputs = [ platform_list_txt_file ]
+ outputs = [ test_constructor_list_cc_file ]
+
+ args = [
+ "--platform_list=" + rebase_path(platform_list_txt_file, root_build_dir),
+ "--output_cc=" + rebase_path(test_constructor_list_cc_file, root_build_dir),
+ "--namespace=ui",
+ "--typename=OzoneUIControlsTestHelper",
+ "--include=\"ui/ozone/public/ozone_ui_controls_test_helper.h\"",
+ "--include=\"ui/ozone/public/ozone_platform.h\"",
+ ]
+
+ deps = [ ":generate_ozone_platform_list" ]
+}
+
test("ozone_unittests") {
deps = [ ":test_support" ]
@@ -315,6 +372,7 @@ if (ozone_platform_x11) {
buildflag_header("buildflags") {
header = "buildflags.h"
flags = [ "OZONE_PLATFORM_X11=$ozone_platform_x11" ]
+ visibility += [ "//ui/gl:gl" ]
}
group("unittests") {
diff --git a/chromium/ui/ozone/common/BUILD.gn b/chromium/ui/ozone/common/BUILD.gn
index 47617e27956..59c8b17465d 100644
--- a/chromium/ui/ozone/common/BUILD.gn
+++ b/chromium/ui/ozone/common/BUILD.gn
@@ -2,8 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
assert(use_ozone)
@@ -11,6 +11,8 @@ source_set("common") {
sources = [
"egl_util.cc",
"egl_util.h",
+ "features.cc",
+ "features.h",
"gl_ozone_egl.cc",
"gl_ozone_egl.h",
"gl_surface_egl_readback.cc",
@@ -19,7 +21,10 @@ source_set("common") {
"stub_overlay_manager.h",
]
- public_deps = [ "//ui/ozone:ozone_base" ]
+ public_deps = [
+ "//build:chromeos_buildflags",
+ "//ui/ozone:ozone_base",
+ ]
deps = [
"//ui/gfx/ipc/color",
diff --git a/chromium/ui/ozone/common/features.cc b/chromium/ui/ozone/common/features.cc
new file mode 100644
index 00000000000..e8f6809760a
--- /dev/null
+++ b/chromium/ui/ozone/common/features.cc
@@ -0,0 +1,24 @@
+
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/common/features.h"
+#include "build/chromeos_buildflags.h"
+
+namespace ui {
+
+const base::Feature kWaylandOverlayDelegation {
+ "WaylandOverlayDelegation",
+#if BUILDFLAG(IS_LACROS)
+ base::FEATURE_ENABLED_BY_DEFAULT
+#else
+ base::FEATURE_DISABLED_BY_DEFAULT
+#endif
+};
+
+bool IsWaylandOverlayDelegationEnabled() {
+ return base::FeatureList::IsEnabled(kWaylandOverlayDelegation);
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/common/features.h b/chromium/ui/ozone/common/features.h
new file mode 100644
index 00000000000..d4b94d31be1
--- /dev/null
+++ b/chromium/ui/ozone/common/features.h
@@ -0,0 +1,17 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_COMMON_FEATURES_H_
+#define UI_OZONE_COMMON_FEATURES_H_
+
+#include "base/feature_list.h"
+
+namespace ui {
+
+extern const base::Feature kWaylandOverlayDelegation;
+bool IsWaylandOverlayDelegationEnabled();
+
+} // namespace ui
+
+#endif // UI_OZONE_COMMON_FEATURES_H_
diff --git a/chromium/ui/ozone/common/test/stub_ozone_ui_controls_test_helper.cc b/chromium/ui/ozone/common/test/stub_ozone_ui_controls_test_helper.cc
new file mode 100644
index 00000000000..c0efb5df87e
--- /dev/null
+++ b/chromium/ui/ozone/common/test/stub_ozone_ui_controls_test_helper.cc
@@ -0,0 +1,44 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/common/test/stub_ozone_ui_controls_test_helper.h"
+
+#include "base/logging.h"
+#include "base/notreached.h"
+
+namespace ui {
+
+namespace {
+OzoneUIControlsTestHelper* PrintErrorAndReturnNullptr() {
+ NOTREACHED()
+ << "Notimplemented or not supported by the underlaying platform.";
+ return nullptr;
+}
+} // namespace
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperWayland() {
+ return PrintErrorAndReturnNullptr();
+}
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperWindows() {
+ return PrintErrorAndReturnNullptr();
+}
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperDrm() {
+ return PrintErrorAndReturnNullptr();
+}
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperScenic() {
+ return PrintErrorAndReturnNullptr();
+}
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperHeadless() {
+ return PrintErrorAndReturnNullptr();
+}
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperCast() {
+ return PrintErrorAndReturnNullptr();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/common/test/stub_ozone_ui_controls_test_helper.h b/chromium/ui/ozone/common/test/stub_ozone_ui_controls_test_helper.h
new file mode 100644
index 00000000000..8146a5a231e
--- /dev/null
+++ b/chromium/ui/ozone/common/test/stub_ozone_ui_controls_test_helper.h
@@ -0,0 +1,21 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_COMMON_TEST_STUB_OZONE_UI_CONTROLS_TEST_HELPER_H_
+#define UI_OZONE_COMMON_TEST_STUB_OZONE_UI_CONTROLS_TEST_HELPER_H_
+
+namespace ui {
+
+class OzoneUIControlsTestHelper;
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperWayland();
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperWindows();
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperDrm();
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperScenic();
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperHeadless();
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperCast();
+
+} // namespace ui
+
+#endif // UI_OZONE_COMMON_TEST_STUB_OZONE_UI_CONTROLS_TEST_HELPER_H_
diff --git a/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc b/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
index 15a9ae39586..f473144258a 100644
--- a/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
+++ b/chromium/ui/ozone/demo/skia/skia_gl_renderer.cc
@@ -12,6 +12,7 @@
#include "base/location.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
+#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkFont.h"
#include "third_party/skia/include/effects/SkGradientShader.h"
@@ -83,9 +84,8 @@ bool SkiaGlRenderer::Initialize() {
void SkiaGlRenderer::RenderFrame() {
TRACE_EVENT0("ozone", "SkiaGlRenderer::RenderFrame");
- // LegacyFontHost will get LCD text and skia figures out what type to use.
SkSurfaceProps surface_props =
- SkSurfaceProps(0, SkSurfaceProps::kLegacyFontHost_InitType);
+ skia::LegacyDisplayGlobals::GetSkSurfaceProps();
if (!sk_surface_) {
GrGLFramebufferInfo framebuffer_info;
diff --git a/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.cc b/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.cc
index c6b759253ce..4228fb36aec 100644
--- a/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.cc
+++ b/chromium/ui/ozone/demo/skia/skia_surfaceless_gl_renderer.cc
@@ -9,7 +9,7 @@
#include <utility>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/command_line.h"
#include "base/stl_util.h"
#include "base/trace_event/trace_event.h"
@@ -17,6 +17,7 @@
#include "third_party/skia/include/core/SkDeferredDisplayListRecorder.h"
#include "third_party/skia/include/core/SkTypeface.h"
#include "third_party/skia/include/gpu/GrBackendSurface.h"
+#include "third_party/skia/include/gpu/GrDirectContext.h"
#include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h"
#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
#include "ui/display/types/display_snapshot.h"
@@ -80,7 +81,7 @@ class SurfacelessSkiaGlRenderer::BufferWrapper {
gl::GLImage* image() const { return image_.get(); }
SkSurface* sk_surface() const { return sk_surface_.get(); }
- bool Initialize(GrContext* gr_context,
+ bool Initialize(GrDirectContext* gr_context,
gfx::AcceleratedWidget widget,
const gfx::Size& size);
void BindFramebuffer();
@@ -106,7 +107,7 @@ SurfacelessSkiaGlRenderer::BufferWrapper::~BufferWrapper() {
}
bool SurfacelessSkiaGlRenderer::BufferWrapper::Initialize(
- GrContext* gr_context,
+ GrDirectContext* gr_context,
gfx::AcceleratedWidget widget,
const gfx::Size& size) {
glGenTextures(1, &gl_tex_);
diff --git a/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc b/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
index bc45833e24b..0d9bc20d4ce 100644
--- a/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
+++ b/chromium/ui/ozone/demo/surfaceless_gl_renderer.cc
@@ -9,7 +9,7 @@
#include <utility>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/command_line.h"
#include "base/macros.h"
#include "base/strings/string_number_conversions.h"
diff --git a/chromium/ui/ozone/generate_constructor_list.py b/chromium/ui/ozone/generate_constructor_list.py
index 8d800636c97..04fa18e93df 100755
--- a/chromium/ui/ozone/generate_constructor_list.py
+++ b/chromium/ui/ozone/generate_constructor_list.py
@@ -45,12 +45,15 @@ Example Output: ./ui/ozone/generate_constructor_list.py \
} // namespace ui
"""
+try:
+ from StringIO import StringIO # for Python 2
+except ImportError:
+ from io import StringIO # for Python 3
import optparse
import os
import collections
import re
import sys
-import string
def GetTypedefName(typename):
@@ -68,7 +71,7 @@ def GetConstructorName(typename, platform):
This is just "Create" + typename + platform.
"""
- return 'Create' + typename + string.capitalize(platform)
+ return 'Create' + typename + platform.capitalize()
def GenerateConstructorList(out, namespace, export, typenames, platforms,
@@ -163,12 +166,14 @@ def main(argv):
sys.exit(1)
# Write to standard output or file specified by --output_cc.
- out_cc = sys.stdout
+ out_cc = getattr(sys.stdout, 'buffer', sys.stdout)
if options.output_cc:
out_cc = open(options.output_cc, 'wb')
- GenerateConstructorList(out_cc, options.namespace, options.export,
+ out_cc_str = StringIO()
+ GenerateConstructorList(out_cc_str, options.namespace, options.export,
typenames, platforms, includes, usings)
+ out_cc.write(out_cc_str.getvalue().encode('utf-8'))
if options.output_cc:
out_cc.close()
diff --git a/chromium/ui/ozone/generate_ozone_platform_list.py b/chromium/ui/ozone/generate_ozone_platform_list.py
index d47c398259b..2702b68b9bd 100755
--- a/chromium/ui/ozone/generate_ozone_platform_list.py
+++ b/chromium/ui/ozone/generate_ozone_platform_list.py
@@ -49,12 +49,15 @@ Example Output: ./generate_ozone_platform_list.py --default wayland dri wayland
"""
+try:
+ from StringIO import StringIO # for Python 2
+except ImportError:
+ from io import StringIO # for Python 3
import optparse
import os
import collections
import re
import sys
-import string
def GetConstantName(name):
@@ -63,7 +66,7 @@ def GetConstantName(name):
We just capitalize the platform name and prepend "CreateOzonePlatform".
"""
- return 'kPlatform' + string.capitalize(name)
+ return 'kPlatform' + name.capitalize()
def GeneratePlatformListText(out, platforms):
@@ -149,9 +152,9 @@ def main(argv):
platforms.insert(0, options.default)
# Write to standard output or file specified by --output_{cc,h}.
- out_cc = sys.stdout
- out_h = sys.stdout
- out_txt = sys.stdout
+ out_cc = getattr(sys.stdout, 'buffer', sys.stdout)
+ out_h = getattr(sys.stdout, 'buffer', sys.stdout)
+ out_txt = getattr(sys.stdout, 'buffer', sys.stdout)
if options.output_cc:
out_cc = open(options.output_cc, 'wb')
if options.output_h:
@@ -159,9 +162,16 @@ def main(argv):
if options.output_txt:
out_txt = open(options.output_txt, 'wb')
- GeneratePlatformListText(out_txt, platforms)
- GeneratePlatformListHeader(out_h, platforms)
- GeneratePlatformListSource(out_cc, platforms)
+ out_txt_str = StringIO()
+ out_h_str = StringIO()
+ out_cc_str = StringIO()
+
+ GeneratePlatformListText(out_txt_str, platforms)
+ out_txt.write(out_txt_str.getvalue().encode('utf-8'))
+ GeneratePlatformListHeader(out_h_str, platforms)
+ out_h.write(out_h_str.getvalue().encode('utf-8'))
+ GeneratePlatformListSource(out_cc_str, platforms)
+ out_cc.write(out_cc_str.getvalue().encode('utf-8'))
if options.output_cc:
out_cc.close()
diff --git a/chromium/ui/ozone/ozone.gni b/chromium/ui/ozone/ozone.gni
index 7a4976c9c05..f2eed9965f6 100644
--- a/chromium/ui/ozone/ozone.gni
+++ b/chromium/ui/ozone/ozone.gni
@@ -2,115 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import("//build/config/chromecast_build.gni")
-import("//build/config/ui.gni")
-import("//build/toolchain/toolchain.gni")
-
-declare_args() {
- # Ozone extra platforms file path. Can be overridden to build out of
- # tree ozone platforms.
- ozone_extra_path = "//ui/ozone/ozone_extra.gni"
-
- # Select platforms automatically. Turn this off for manual control.
- ozone_auto_platforms = use_ozone
-
- # TODO(petermcneeley): Backwards compatiblity support for VM images.
- # Remove when deprecated. (https://crbug.com/1122009)
- ozone_platform_gbm = -1
-}
-
-declare_args() {
- # The platform that will used at runtime by default. This can be overridden
- # with the command line flag --ozone-platform=<platform>.
- ozone_platform = ""
-
- # Compile the 'cast' platform.
- ozone_platform_cast = false
-
- # Compile the 'drm' platform.
- ozone_platform_drm = false
-
- # Compile the 'headless' platform.
- ozone_platform_headless = false
-
- # Compile the 'scenic' platform.
- ozone_platform_scenic = false
-
- # Compile the 'x11' platform.
- ozone_platform_x11 = false
-
- # Compile the 'wayland' platform.
- ozone_platform_wayland = false
-
- # Compile the 'windows' platform.
- ozone_platform_windows = false
-
- if (ozone_auto_platforms) {
- # Use headless as the default platform unless modified below.
- ozone_platform = "headless"
- ozone_platform_headless = true
-
- if (is_cast_audio_only) {
- # Just use headless for audio-only Cast platforms.
- } else if (is_chromecast && !is_fuchsia) {
- # Enable the Cast ozone platform on all A/V Cast builds except Fuchsia.
- ozone_platform_cast = true
-
- # For visual desktop Chromecast builds, override the default "headless"
- # platform with --ozone-platform=x11.
- # TODO(halliwell): Create a libcast_graphics implementation for desktop
- # using X11, and disable this platform.
- if (is_cast_desktop_build && !is_cast_audio_only) {
- ozone_platform_x11 = true
- } else {
- ozone_platform = "cast"
- }
- } else if (is_chromeos) {
- ozone_platform = "x11"
- ozone_platform_drm = true
- ozone_platform_x11 = true
- } else if (is_desktop_linux) {
- ozone_platform = "x11"
- ozone_platform_wayland = true
- ozone_platform_x11 = true
- } else if (is_win) {
- ozone_platform = "windows"
- ozone_platform_windows = true
- } else if (is_fuchsia) {
- ozone_platform = "scenic"
- ozone_platform_scenic = true
- }
- }
-
- # TODO(petermcneeley): Backwards compatiblity support for VM images.
- # Remove when deprecated. (https://crbug.com/1122009)
- if (ozone_platform_gbm != -1) {
- ozone_platform_drm = ozone_platform_gbm
- }
-}
-
-import(ozone_extra_path)
-
-_ozone_extra_directory = get_path_info(ozone_extra_path, "dir")
-
-# Extra paths to add to targets visibility list.
-ozone_external_platform_visibility = [ "$_ozone_extra_directory/*" ]
-
-if (is_a_target_toolchain) {
- assert(use_ozone || !(ozone_platform_cast || ozone_platform_drm ||
- ozone_platform_headless || ozone_platform_x11 ||
- ozone_platform_wayland || ozone_platform_windows ||
- ozone_platform_scenic),
- "Must set use_ozone to select ozone platforms")
-}
-
-# TODO(petermcneeley): Backwards compatiblity support for VM images.
-# Remove when deprecated. (https://crbug.com/1122009)
-
-assert(ozone_platform_gbm == -1 || ozone_platform_drm == ozone_platform_gbm)
-
-ozone_platform_gbm = ozone_platform_drm
-
-if (ozone_platform == "gbm") {
- ozone_platform = "drm"
-}
+import("//build/config/ozone.gni")
+# TODO(crbug.com/1129223): Remove this place holder once Angle project stops
+# referencing to this file.
+# https://source.chromium.org/chromium/chromium/src/+/master:third_party/angle/gni/angle.gni;l=43;drc=2d74170f899b91793bd7967184b4d7d216a3e9ec
diff --git a/chromium/ui/ozone/ozone_extra.gni b/chromium/ui/ozone/ozone_extra.gni
deleted file mode 100644
index c46a90b8468..00000000000
--- a/chromium/ui/ozone/ozone_extra.gni
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This list contains the name of external platforms that are passed to the
-# --ozone-platform command line argument or used for the ozone_platform build
-# config. For example ozone_external_platforms = [ "foo1", "foo2", ... ]
-ozone_external_platforms = []
-
-# This list contains dependencies for external platforms. Typically, the Ozone
-# implementations are placed into ui/ozone/platform/ and so this will look
-# something like:
-# ozone_external_platform_deps = [ "platform/foo1", "platform/foo_2", ... ]
-ozone_external_platform_deps = []
-
-# If a platform has unit tests, the corresponding source_set can be listed here
-# so that they get included into ozone_unittests.
-# ozone_external_platform_test_deps = [ "platform/foo1:foo1_unitests", ... ]
-ozone_external_platform_test_deps = []
diff --git a/chromium/ui/ozone/platform/cast/BUILD.gn b/chromium/ui/ozone/platform/cast/BUILD.gn
index 22ef134ffb2..8bb13ef34b8 100644
--- a/chromium/ui/ozone/platform/cast/BUILD.gn
+++ b/chromium/ui/ozone/platform/cast/BUILD.gn
@@ -3,11 +3,11 @@
# found in the LICENSE file.
import("//build/config/chromecast_build.gni")
-import("//ui/ozone/ozone.gni")
+import("//build/config/ozone.gni")
visibility = [
- "//ui/ozone/*",
"//chromecast/*",
+ "//ui/ozone/*",
]
# TODO(slan): gn check needs deps on ozone and media to pass. Correct this.
diff --git a/chromium/ui/ozone/platform/cast/surface_factory_cast.cc b/chromium/ui/ozone/platform/cast/surface_factory_cast.cc
index cd2587800e8..4ebb9c3eebc 100644
--- a/chromium/ui/ozone/platform/cast/surface_factory_cast.cc
+++ b/chromium/ui/ozone/platform/cast/surface_factory_cast.cc
@@ -62,13 +62,15 @@ class CastPixmap : public gfx::NativePixmap {
gfx::Size GetBufferSize() const override { return gfx::Size(); }
uint32_t GetUniqueId() const override { return 0; }
- bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
- int plane_z_order,
- gfx::OverlayTransform plane_transform,
- const gfx::Rect& display_bounds,
- const gfx::RectF& crop_rect,
- bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) override {
+ bool ScheduleOverlayPlane(
+ gfx::AcceleratedWidget widget,
+ int plane_z_order,
+ gfx::OverlayTransform plane_transform,
+ const gfx::Rect& display_bounds,
+ const gfx::RectF& crop_rect,
+ bool enable_blend,
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) override {
return false;
}
gfx::NativePixmapHandle ExportHandle() override {
diff --git a/chromium/ui/ozone/platform/drm/BUILD.gn b/chromium/ui/ozone/platform/drm/BUILD.gn
index 11f2f10ce12..37a412b4422 100644
--- a/chromium/ui/ozone/platform/drm/BUILD.gn
+++ b/chromium/ui/ozone/platform/drm/BUILD.gn
@@ -4,8 +4,8 @@
import("//build/config/chromecast_build.gni")
import("//build/config/linux/pkg_config.gni")
+import("//build/config/ozone.gni")
import("//gpu/vulkan/features.gni")
-import("//ui/ozone/ozone.gni")
visibility = [ "//ui/ozone/*" ]
diff --git a/chromium/ui/ozone/platform/drm/gpu/crtc_controller.cc b/chromium/ui/ozone/platform/drm/gpu/crtc_controller.cc
index 4aaa7b272ac..817dd0aa679 100644
--- a/chromium/ui/ozone/platform/drm/gpu/crtc_controller.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/crtc_controller.cc
@@ -27,7 +27,7 @@ CrtcController::CrtcController(const scoped_refptr<DrmDevice>& drm,
state_(drm->plane_manager()->GetCrtcStateForCrtcId(crtc)) {}
CrtcController::~CrtcController() {
- if (!is_disabled()) {
+ if (is_enabled()) {
const std::vector<std::unique_ptr<HardwareDisplayPlane>>& all_planes =
drm_->plane_manager()->planes();
for (const auto& plane : all_planes) {
@@ -44,7 +44,7 @@ bool CrtcController::AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list,
bool is_modesetting) {
// If we're in the process of modesetting, the CRTC is still disabled.
// Once the modeset is done, we expect it to be enabled.
- DCHECK(is_modesetting || !is_disabled());
+ DCHECK(is_modesetting || is_enabled());
const DrmOverlayPlane* primary = DrmOverlayPlane::GetPrimaryPlane(overlays);
if (primary &&
@@ -69,7 +69,7 @@ std::vector<uint64_t> CrtcController::GetFormatModifiers(uint32_t format) {
}
void CrtcController::SetCursor(uint32_t handle, const gfx::Size& size) {
- if (is_disabled())
+ if (!is_enabled())
return;
if (!drm_->SetCursor(crtc_, handle, size)) {
PLOG(ERROR) << "drmModeSetCursor: device " << drm_->device_path().value()
@@ -79,7 +79,7 @@ void CrtcController::SetCursor(uint32_t handle, const gfx::Size& size) {
}
void CrtcController::MoveCursor(const gfx::Point& location) {
- if (is_disabled())
+ if (!is_enabled())
return;
drm_->MoveCursor(crtc_, location);
}
diff --git a/chromium/ui/ozone/platform/drm/gpu/crtc_controller.h b/chromium/ui/ozone/platform/drm/gpu/crtc_controller.h
index 0ecb830e19b..cab7aaec031 100644
--- a/chromium/ui/ozone/platform/drm/gpu/crtc_controller.h
+++ b/chromium/ui/ozone/platform/drm/gpu/crtc_controller.h
@@ -38,7 +38,7 @@ class CrtcController {
uint32_t crtc() const { return crtc_; }
uint32_t connector() const { return connector_; }
const scoped_refptr<DrmDevice>& drm() const { return drm_; }
- bool is_disabled() const { return !state_.properties.active.value; }
+ bool is_enabled() const { return state_.properties.active.value; }
bool AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list,
const DrmOverlayPlaneList& planes,
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc
index b8af25613ab..208fb3eccf8 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_display_unittest.cc
@@ -56,7 +56,6 @@ class MockHardwareDisplayPlaneManager : public HardwareDisplayPlaneManager {
return false;
}
bool Commit(HardwareDisplayPlaneList* plane_list,
- bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override {
return false;
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc b/chromium/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc
index 889fca40606..01f1dd02dcc 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc
@@ -8,6 +8,7 @@
#include <xf86drmMode.h>
#include "base/logging.h"
+#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/ozone/platform/drm/gpu/drm_device.h"
@@ -88,7 +89,8 @@ bool DrmDumbBuffer::MapDumbBuffer(const SkImageInfo& info) {
return false;
}
- surface_ = SkSurface::MakeRasterDirect(info, mmap_base_, stride_);
+ SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps();
+ surface_ = SkSurface::MakeRasterDirect(info, mmap_base_, stride_, &props);
if (!surface_) {
LOG(ERROR) << "DrmDumbBuffer: Failed to create SkSurface: handle "
<< handle_;
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc
index 61c721807f7..8fdb11aba63 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc
@@ -169,7 +169,7 @@ void DrmGpuDisplayManager::RelinquishDisplayControl() {
base::flat_map<int64_t, bool> DrmGpuDisplayManager::ConfigureDisplays(
const std::vector<display::DisplayConfigurationParams>& config_requests) {
base::flat_map<int64_t, bool> statuses;
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_configure;
+ ScreenManager::ControllerConfigsList controllers_to_configure;
for (const auto& config : config_requests) {
int64_t display_id = config.id;
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
index 6f20ce1f430..76577c6e485 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
@@ -88,7 +88,7 @@ class DrmOverlayValidatorTest : public testing::Test {
bool status = drm_->plane_manager()->Commit(std::move(commit_request),
DRM_MODE_ATOMIC_ALLOW_MODESET);
controller->UpdateState(
- /*enabled=*/true,
+ /*enable_requested=*/true,
ui::DrmOverlayPlane::GetPrimaryPlane(request_for_update[0].overlays()));
return status;
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc b/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
index 52c31a7fa8f..d77131c3dfc 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -152,7 +152,8 @@ void DrmThread::CreateBuffer(gfx::AcceleratedWidget widget,
// explicitly set via kms on a CRTC (e.g: BufferQueue buffers), therefore
// allocation should fail if it's not possible to allocate a BO_USE_SCANOUT
// buffer in that case.
- if (!*buffer && usage != gfx::BufferUsage::SCANOUT) {
+ if (!*buffer && usage != gfx::BufferUsage::SCANOUT &&
+ usage != gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE) {
flags &= ~GBM_BO_USE_SCANOUT;
CreateBufferWithGbmFlags(drm, fourcc_format, size, framebuffer_size, flags,
modifiers, buffer, framebuffer);
diff --git a/chromium/ui/ozone/platform/drm/gpu/drm_thread_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/drm_thread_unittest.cc
index 91005483ddd..f2a6c3ef52c 100644
--- a/chromium/ui/ozone/platform/drm/gpu/drm_thread_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/drm_thread_unittest.cc
@@ -6,7 +6,7 @@
#include <utility>
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/files/scoped_temp_dir.h"
#include "base/test/task_environment.h"
#include "mojo/public/cpp/bindings/remote.h"
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc b/chromium/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc
index 79e5816e447..ffa3f3a2a47 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_overlay_surface.cc
@@ -9,7 +9,7 @@
#include <utility>
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "ui/ozone/platform/drm/gpu/drm_overlay_plane.h"
#include "ui/ozone/platform/drm/gpu/drm_window_proxy.h"
#include "ui/ozone/platform/drm/gpu/gbm_pixmap.h"
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.cc b/chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.cc
index 53aad5eba10..596340b6627 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.cc
@@ -68,21 +68,27 @@ uint32_t GbmPixmap::GetUniqueId() const {
return buffer_->GetHandle();
}
-bool GbmPixmap::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
- int plane_z_order,
- gfx::OverlayTransform plane_transform,
- const gfx::Rect& display_bounds,
- const gfx::RectF& crop_rect,
- bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) {
+bool GbmPixmap::ScheduleOverlayPlane(
+ gfx::AcceleratedWidget widget,
+ int plane_z_order,
+ gfx::OverlayTransform plane_transform,
+ const gfx::Rect& display_bounds,
+ const gfx::RectF& crop_rect,
+ bool enable_blend,
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) {
DCHECK(buffer_->GetFlags() & GBM_BO_USE_SCANOUT);
// |framebuffer_id| might be 0 if AddFramebuffer2 failed, in that case we
// already logged the error in GbmBuffer ctor. We avoid logging the error
// here since this method might be called every pageflip.
if (framebuffer_) {
+ DCHECK(acquire_fences.empty() || acquire_fences.size() == 1u);
surface_manager_->GetSurface(widget)->QueueOverlayPlane(DrmOverlayPlane(
framebuffer_, plane_z_order, plane_transform, display_bounds, crop_rect,
- enable_blend, std::move(gpu_fence)));
+ enable_blend,
+ acquire_fences.empty()
+ ? nullptr
+ : std::make_unique<gfx::GpuFence>(std::move(acquire_fences[0]))));
}
return true;
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.h b/chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.h
index 1c4d9aeb58f..3ada14de4c0 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.h
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_pixmap.h
@@ -41,7 +41,8 @@ class GbmPixmap : public gfx::NativePixmap {
const gfx::Rect& display_bounds,
const gfx::RectF& crop_rect,
bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) override;
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) override;
gfx::NativePixmapHandle ExportHandle() override;
GbmBuffer* buffer() const { return buffer_.get(); }
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
index 90d7a20d0cd..664381d52a2 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
@@ -215,6 +215,10 @@ void GbmSurfaceless::SetForceGlFlushOnSwapBuffers() {
requires_gl_flush_on_swap_buffers_ = true;
}
+gfx::SurfaceOrigin GbmSurfaceless::GetOrigin() const {
+ return gfx::SurfaceOrigin::kTopLeft;
+}
+
GbmSurfaceless::~GbmSurfaceless() {
Destroy(); // The EGL surface must be destroyed before SurfaceOzone.
surface_factory_->UnregisterSurface(window_->widget());
diff --git a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
index 9b638ef08ff..153a4e5f343 100644
--- a/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
+++ b/chromium/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
@@ -72,6 +72,7 @@ class GbmSurfaceless : public gl::SurfacelessEGL {
EGLConfig GetConfig() override;
void SetRelyOnImplicitSync() override;
void SetForceGlFlushOnSwapBuffers() override;
+ gfx::SurfaceOrigin GetOrigin() const override;
protected:
~GbmSurfaceless() override;
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
index b4736423e74..47a684e7d22 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
@@ -66,7 +66,7 @@ void DrawCursor(DrmDumbBuffer* cursor, const SkBitmap& image) {
HardwareDisplayController::HardwareDisplayController(
std::unique_ptr<CrtcController> controller,
const gfx::Point& origin)
- : origin_(origin), is_disabled_(controller->is_disabled()) {
+ : origin_(origin) {
AddCrtc(std::move(controller));
AllocateCursorBuffers();
}
@@ -124,14 +124,10 @@ void HardwareDisplayController::GetDisableProps(CommitRequest* commit_request) {
}
void HardwareDisplayController::UpdateState(
- bool is_enabled,
+ bool enable_requested,
const DrmOverlayPlane* primary_plane) {
- // TODO(markyacoub): Update how we report the controller state. Right now, the
- // controller state is independent of its CRTCs; however, it should reflect
- // its CRTCs active states.
- is_disabled_ = !is_enabled;
-
- if (is_enabled) {
+ // Verify that the current state matches the requested state.
+ if (enable_requested && IsEnabled()) {
DCHECK(primary_plane);
// TODO(markyacoub): This should be absorbed in the commit request.
ResetCursor();
@@ -182,7 +178,7 @@ bool HardwareDisplayController::ScheduleOrTestPageFlip(
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) {
TRACE_EVENT0("drm", "HDC::SchedulePageFlip");
- DCHECK(!is_disabled_);
+ DCHECK(IsEnabled());
// Ignore requests with no planes to schedule.
if (plane_list.empty())
@@ -202,8 +198,7 @@ bool HardwareDisplayController::ScheduleOrTestPageFlip(
}
status &= GetDrmDevice()->plane_manager()->Commit(
- &owned_hardware_planes_, /*should_modeset=*/false, page_flip_request,
- out_fence);
+ &owned_hardware_planes_, page_flip_request, out_fence);
return status;
}
@@ -332,8 +327,13 @@ bool HardwareDisplayController::IsMirrored() const {
return crtc_controllers_.size() > 1;
}
-bool HardwareDisplayController::IsDisabled() const {
- return is_disabled_;
+bool HardwareDisplayController::IsEnabled() const {
+ bool is_enabled = true;
+
+ for (const auto& controller : crtc_controllers_)
+ is_enabled &= controller->is_enabled();
+
+ return is_enabled;
}
gfx::Size HardwareDisplayController::GetModeSize() const {
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.h b/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.h
index 1fbd466dbfc..17a917183ae 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.h
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller.h
@@ -104,7 +104,7 @@ class HardwareDisplayController {
void GetDisableProps(CommitRequest* commit_request);
// Updates state of the controller after modeset/enable/disable is performed.
- void UpdateState(bool is_enabled, const DrmOverlayPlane* primary_plane);
+ void UpdateState(bool enable_requested, const DrmOverlayPlane* primary_plane);
// Schedules the |overlays|' framebuffers to be displayed on the next vsync
// event. The event will be posted on the graphics card file descriptor |fd_|
@@ -152,7 +152,7 @@ class HardwareDisplayController {
uint32_t crtc);
bool HasCrtc(const scoped_refptr<DrmDevice>& drm, uint32_t crtc) const;
bool IsMirrored() const;
- bool IsDisabled() const;
+ bool IsEnabled() const;
gfx::Size GetModeSize() const;
gfx::Point origin() const { return origin_; }
@@ -207,8 +207,6 @@ class HardwareDisplayController {
int cursor_frontbuffer_ = 0;
DrmDumbBuffer* current_cursor_ = nullptr;
- bool is_disabled_;
-
base::WeakPtrFactory<HardwareDisplayController> weak_ptr_factory_{this};
DISALLOW_COPY_AND_ASSIGN(HardwareDisplayController);
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
index 3a69804048c..739c8dd5d62 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
@@ -13,6 +13,7 @@
#include "base/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkCanvas.h"
+#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gfx/linux/gbm_buffer.h"
#include "ui/gfx/linux/test/mock_gbm_device.h"
@@ -41,9 +42,20 @@ constexpr uint32_t kInFormatsBlobPropId = 400;
constexpr uint32_t kActivePropId = 1000;
constexpr uint32_t kModePropId = 1001;
constexpr uint32_t kCrtcIdPropId = 2000;
-constexpr uint32_t kFenceFdPropId = 3010;
-constexpr uint32_t kTypePropId = 3011;
-constexpr uint32_t kInFormatsPropId = 3012;
+
+constexpr uint32_t kPlaneCrtcId = 3001;
+constexpr uint32_t kCrtcX = 3002;
+constexpr uint32_t kCrtcY = 3003;
+constexpr uint32_t kCrtcW = 3004;
+constexpr uint32_t kCrtcH = 3005;
+constexpr uint32_t kPlaneFbId = 3006;
+constexpr uint32_t kSrcX = 3007;
+constexpr uint32_t kSrcY = 3008;
+constexpr uint32_t kSrcW = 3009;
+constexpr uint32_t kSrcH = 3010;
+constexpr uint32_t kFenceFdPropId = 3011;
+constexpr uint32_t kTypePropId = 3012;
+constexpr uint32_t kInFormatsPropId = 3013;
const gfx::Size kDefaultModeSize(kDefaultMode.hdisplay, kDefaultMode.vdisplay);
const gfx::Size kOverlaySize(kDefaultMode.hdisplay / 2,
@@ -83,7 +95,7 @@ void FakeFenceFD::Signal() const {
class HardwareDisplayControllerTest : public testing::Test {
public:
- HardwareDisplayControllerTest() : page_flips_(0) {}
+ HardwareDisplayControllerTest() = default;
~HardwareDisplayControllerTest() override = default;
void SetUp() override;
@@ -117,7 +129,7 @@ class HardwareDisplayControllerTest : public testing::Test {
std::unique_ptr<ui::HardwareDisplayController> controller_;
scoped_refptr<ui::MockDrmDevice> drm_;
- int page_flips_;
+ int page_flips_ = 0;
gfx::SwapResult last_swap_result_;
gfx::PresentationFeedback last_presentation_feedback_;
@@ -161,16 +173,16 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties;
std::map<uint32_t, std::string> plane_property_names = {
// Add all required properties.
- {3000, "CRTC_ID"},
- {3001, "CRTC_X"},
- {3002, "CRTC_Y"},
- {3003, "CRTC_W"},
- {3004, "CRTC_H"},
- {3005, "FB_ID"},
- {3006, "SRC_X"},
- {3007, "SRC_Y"},
- {3008, "SRC_W"},
- {3009, "SRC_H"},
+ {kPlaneCrtcId, "CRTC_ID"},
+ {kCrtcX, "CRTC_X"},
+ {kCrtcY, "CRTC_Y"},
+ {kCrtcW, "CRTC_W"},
+ {kCrtcH, "CRTC_H"},
+ {kPlaneFbId, "FB_ID"},
+ {kSrcX, "SRC_X"},
+ {kSrcY, "SRC_Y"},
+ {kSrcW, "SRC_W"},
+ {kSrcH, "SRC_H"},
{kFenceFdPropId, "IN_FENCE_FD"},
// Add some optional properties we use for convenience.
{kTypePropId, "type"},
@@ -238,7 +250,7 @@ bool HardwareDisplayControllerTest::ModesetWithPlane(
bool status = drm_->plane_manager()->Commit(std::move(commit_request),
DRM_MODE_ATOMIC_ALLOW_MODESET);
controller_->UpdateState(
- /*enabled=*/true,
+ /*enable_requested=*/true,
ui::DrmOverlayPlane::GetPrimaryPlane(request_for_update[0].overlays()));
return status;
@@ -250,7 +262,7 @@ bool HardwareDisplayControllerTest::DisableController() {
ui::CommitRequest request_for_update = commit_request;
bool status = drm_->plane_manager()->Commit(std::move(commit_request),
DRM_MODE_ATOMIC_ALLOW_MODESET);
- controller_->UpdateState(/*enabled=*/false, nullptr);
+ controller_->UpdateState(/*enable_requested=*/false, nullptr);
return status;
}
@@ -295,45 +307,123 @@ TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) {
EXPECT_FALSE(plane.buffer->HasOneRef());
}
-TEST_F(HardwareDisplayControllerTest, CheckModesettingSetsProps) {
+TEST_F(HardwareDisplayControllerTest, CrtcPropsAfterModeset) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
-
EXPECT_TRUE(ModesetWithPlane(plane1));
- ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
- std::vector<ui::DrmOverlayPlane> planes = {};
- planes.push_back(plane2.Clone());
+ ui::ScopedDrmObjectPropertyPtr crtc_props =
+ drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE", &prop);
+ EXPECT_EQ(kActivePropId, prop.id);
+ EXPECT_EQ(1U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID", &prop);
+ EXPECT_EQ(kModePropId, prop.id);
+ EXPECT_GT(prop.value, 0U);
+ }
+}
- SchedulePageFlip(std::move(planes));
+TEST_F(HardwareDisplayControllerTest, ConnectorPropsAfterModeset) {
+ ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
+ EXPECT_TRUE(ModesetWithPlane(plane1));
- // Test props values after modesetting.
- ui::DrmDevice::Property connector_prop_crtc_id = {};
ui::ScopedDrmObjectPropertyPtr connector_props =
drm_->GetObjectProperties(kConnectorIdBase, DRM_MODE_OBJECT_CONNECTOR);
- ui::GetDrmPropertyForName(drm_.get(), connector_props.get(), "CRTC_ID",
- &connector_prop_crtc_id);
- EXPECT_EQ(kCrtcIdPropId, connector_prop_crtc_id.id);
- EXPECT_EQ(kCrtcIdBase, connector_prop_crtc_id.value);
- ui::DrmDevice::Property crtc_prop_for_name = {};
- ui::ScopedDrmObjectPropertyPtr crtc_props =
- drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
- GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE",
- &crtc_prop_for_name);
- EXPECT_EQ(kActivePropId, crtc_prop_for_name.id);
- EXPECT_EQ(1U, crtc_prop_for_name.value);
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), connector_props.get(), "CRTC_ID",
+ &prop);
+ EXPECT_EQ(kCrtcIdPropId, prop.id);
+ EXPECT_EQ(kCrtcIdBase, prop.value);
+}
- GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID",
- &crtc_prop_for_name);
- EXPECT_EQ(kModePropId, crtc_prop_for_name.id);
+TEST_F(HardwareDisplayControllerTest, PlanePropsAfterModeset) {
+ const FakeFenceFD fake_fence_fd;
+ ui::DrmOverlayPlane plane1(CreateBuffer(), fake_fence_fd.GetGpuFence());
+ EXPECT_TRUE(ModesetWithPlane(plane1));
- ui::DrmDevice::Property fence_fd_prop = {};
ui::ScopedDrmObjectPropertyPtr plane_props =
drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE);
- ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD",
- &fence_fd_prop);
- EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id);
- EXPECT_EQ(base::kInvalidPlatformFile, static_cast<int>(fence_fd_prop.value));
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_ID", &prop);
+ EXPECT_EQ(kPlaneCrtcId, prop.id);
+ EXPECT_EQ(kCrtcIdBase, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_X", &prop);
+ EXPECT_EQ(kCrtcX, prop.id);
+ EXPECT_EQ(plane1.display_bounds.x(), static_cast<int>(prop.value));
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_Y", &prop);
+ EXPECT_EQ(kCrtcY, prop.id);
+ EXPECT_EQ(plane1.display_bounds.y(), static_cast<int>(prop.value));
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_W", &prop);
+ EXPECT_EQ(kCrtcW, prop.id);
+ EXPECT_EQ(kDefaultModeSize.width(), static_cast<int>(prop.value));
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_H", &prop);
+ EXPECT_EQ(kCrtcH, prop.id);
+ EXPECT_EQ(kDefaultModeSize.height(), static_cast<int>(prop.value));
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "FB_ID", &prop);
+ EXPECT_EQ(kPlaneFbId, prop.id);
+ EXPECT_EQ(plane1.buffer->opaque_framebuffer_id(),
+ static_cast<uint32_t>(prop.value));
+ }
+
+ gfx::RectF crop_rectf = plane1.crop_rect;
+ crop_rectf.Scale(plane1.buffer->size().width(),
+ plane1.buffer->size().height());
+ gfx::Rect crop_rect = gfx::ToNearestRect(crop_rectf);
+ gfx::Rect fixed_point_rect =
+ gfx::Rect(crop_rect.x() << 16, crop_rect.y() << 16,
+ crop_rect.width() << 16, crop_rect.height() << 16);
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_X", &prop);
+ EXPECT_EQ(kSrcX, prop.id);
+ EXPECT_EQ(fixed_point_rect.x(), static_cast<float>(prop.value));
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_Y", &prop);
+ EXPECT_EQ(kSrcY, prop.id);
+ EXPECT_EQ(fixed_point_rect.y(), static_cast<float>(prop.value));
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_W", &prop);
+ EXPECT_EQ(kSrcW, prop.id);
+ EXPECT_EQ(fixed_point_rect.width(), static_cast<int>(prop.value));
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_H", &prop);
+ EXPECT_EQ(kSrcH, prop.id);
+ EXPECT_EQ(fixed_point_rect.height(), static_cast<int>(prop.value));
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD",
+ &prop);
+ EXPECT_EQ(kFenceFdPropId, prop.id);
+ EXPECT_GT(static_cast<int>(prop.value), base::kInvalidPlatformFile);
+ }
}
TEST_F(HardwareDisplayControllerTest, FenceFdValueChange) {
@@ -391,41 +481,103 @@ TEST_F(HardwareDisplayControllerTest, CheckDisableResetsProps) {
EXPECT_TRUE(ModesetWithPlane(plane1));
- ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
- std::vector<ui::DrmOverlayPlane> planes = {};
- planes.push_back(plane2.Clone());
-
- SchedulePageFlip(std::move(planes));
-
// Test props values after disabling.
DisableController();
- ui::DrmDevice::Property connector_prop_crtc_id;
- ui::ScopedDrmObjectPropertyPtr connector_props =
- drm_->GetObjectProperties(kConnectorIdBase, DRM_MODE_OBJECT_CONNECTOR);
- ui::GetDrmPropertyForName(drm_.get(), connector_props.get(), "CRTC_ID",
- &connector_prop_crtc_id);
- EXPECT_EQ(0U, connector_prop_crtc_id.value);
-
- ui::DrmDevice::Property crtc_prop_for_name;
ui::ScopedDrmObjectPropertyPtr crtc_props =
drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
- GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE",
- &crtc_prop_for_name);
- EXPECT_EQ(0U, crtc_prop_for_name.value);
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE", &prop);
+ EXPECT_EQ(kActivePropId, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID", &prop);
+ EXPECT_EQ(kModePropId, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
- crtc_props = drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
- GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID",
- &crtc_prop_for_name);
- EXPECT_EQ(0U, crtc_prop_for_name.value);
+ ui::ScopedDrmObjectPropertyPtr connector_props =
+ drm_->GetObjectProperties(kConnectorIdBase, DRM_MODE_OBJECT_CONNECTOR);
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), connector_props.get(), "CRTC_ID",
+ &prop);
+ EXPECT_EQ(kCrtcIdPropId, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
- ui::DrmDevice::Property fence_fd_prop = {};
ui::ScopedDrmObjectPropertyPtr plane_props =
drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE);
- ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD",
- &fence_fd_prop);
- EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id);
- EXPECT_EQ(base::kInvalidPlatformFile, static_cast<int>(fence_fd_prop.value));
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_ID", &prop);
+ EXPECT_EQ(kPlaneCrtcId, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_X", &prop);
+ EXPECT_EQ(kCrtcX, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_Y", &prop);
+ EXPECT_EQ(kCrtcY, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_W", &prop);
+ EXPECT_EQ(kCrtcW, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_H", &prop);
+ EXPECT_EQ(kCrtcH, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "FB_ID", &prop);
+ EXPECT_EQ(kPlaneFbId, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_X", &prop);
+ EXPECT_EQ(kSrcX, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_Y", &prop);
+ EXPECT_EQ(kSrcY, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_W", &prop);
+ EXPECT_EQ(kSrcW, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_H", &prop);
+ EXPECT_EQ(kSrcH, prop.id);
+ EXPECT_EQ(0U, prop.value);
+ }
+ {
+ ui::DrmDevice::Property prop = {};
+ ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD",
+ &prop);
+ EXPECT_EQ(kFenceFdPropId, prop.id);
+ EXPECT_EQ(base::kInvalidPlatformFile, static_cast<int>(prop.value));
+ }
}
TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h
index dd25a23e0b1..a4593292e8d 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h
@@ -133,7 +133,6 @@ class HardwareDisplayPlaneManager {
uint32_t crtc_id);
// Commit the plane states in |plane_list|.
- // if |should_modeset| is set, it only modesets without page flipping.
// If |page_flip_request| is null, this tests the plane configuration without
// submitting it.
// The fence returned in |out_fence| will signal when the currently scanned
@@ -141,7 +140,6 @@ class HardwareDisplayPlaneManager {
// |page_flip_request|. Note that the returned fence may be a nullptr
// if the system doesn't support out fences.
virtual bool Commit(HardwareDisplayPlaneList* plane_list,
- bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) = 0;
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
index 725d20acc45..db7e3cad473 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
@@ -244,10 +244,9 @@ void HardwareDisplayPlaneManagerAtomic::SetAtomicPropsForCommit(
bool HardwareDisplayPlaneManagerAtomic::Commit(
HardwareDisplayPlaneList* plane_list,
- bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) {
- bool test_only = !should_modeset && !page_flip_request;
+ bool test_only = !page_flip_request;
std::vector<uint32_t> crtcs = GetCrtcIdsOfPlanes(*plane_list);
@@ -273,11 +272,8 @@ bool HardwareDisplayPlaneManagerAtomic::Commit(
}
}
- uint32_t flags = 0;
- if (should_modeset)
- flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
- else
- flags = test_only ? DRM_MODE_ATOMIC_TEST_ONLY : DRM_MODE_ATOMIC_NONBLOCK;
+ uint32_t flags =
+ test_only ? DRM_MODE_ATOMIC_TEST_ONLY : DRM_MODE_ATOMIC_NONBLOCK;
if (!drm_->CommitProperties(plane_list->atomic_property_set.get(), flags,
crtcs.size(), page_flip_request)) {
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h
index b6d717746b3..6de61131a8e 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h
@@ -22,7 +22,6 @@ class HardwareDisplayPlaneManagerAtomic : public HardwareDisplayPlaneManager {
bool Commit(CommitRequest commit_request, uint32_t flags) override;
bool Commit(HardwareDisplayPlaneList* plane_list,
- bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override;
bool DisableOverlayPlanes(HardwareDisplayPlaneList* plane_list) override;
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
index 298908088a0..c79705063a5 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
@@ -76,13 +76,8 @@ bool HardwareDisplayPlaneManagerLegacy::Commit(CommitRequest commit_request,
bool HardwareDisplayPlaneManagerLegacy::Commit(
HardwareDisplayPlaneList* plane_list,
- bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) {
- // Legacy Modeset should not call Commit. Ensure the separation between both
- // Atomic and Legacy and nothing trickles in.
- DCHECK(!should_modeset);
-
bool test_only = !page_flip_request;
if (test_only) {
for (HardwareDisplayPlane* plane : plane_list->plane_list) {
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h
index 5d03f971f37..8fffbc28bf2 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h
@@ -22,7 +22,6 @@ class HardwareDisplayPlaneManagerLegacy : public HardwareDisplayPlaneManager {
bool Commit(CommitRequest commit_request, uint32_t flags) override;
bool Commit(HardwareDisplayPlaneList* plane_list,
- bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override;
bool DisableOverlayPlanes(HardwareDisplayPlaneList* plane_list) override;
diff --git a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
index 5a3eac0def0..6f73d1747a0 100644
--- a/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
@@ -227,8 +227,8 @@ void HardwareDisplayPlaneManagerTest::PerformPageFlip(
state, assigns, crtc_properties_[crtc_idx].id));
scoped_refptr<ui::PageFlipRequest> page_flip_request =
base::MakeRefCounted<ui::PageFlipRequest>(base::TimeDelta());
- ASSERT_TRUE(fake_drm_->plane_manager()->Commit(
- state, /*should_modeset*/ false, page_flip_request, nullptr));
+ ASSERT_TRUE(
+ fake_drm_->plane_manager()->Commit(state, page_flip_request, nullptr));
}
uint64_t HardwareDisplayPlaneManagerTest::GetObjectPropertyValue(
@@ -669,8 +669,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, UnusedPlanesAreReleased) {
fake_drm_->plane_manager()->BeginFrame(&hdpl);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&hdpl, assigns, crtc_properties_[0].id));
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &hdpl, /*should_modeset*/ false, page_flip_request, nullptr));
+ EXPECT_TRUE(
+ fake_drm_->plane_manager()->Commit(&hdpl, page_flip_request, nullptr));
assigns.clear();
assigns.push_back(ui::DrmOverlayPlane(primary_buffer, nullptr));
fake_drm_->plane_manager()->BeginFrame(&hdpl);
@@ -679,8 +679,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, UnusedPlanesAreReleased) {
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset + 1, "FB_ID"));
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &hdpl, /*should_modeset*/ false, page_flip_request, nullptr));
+ EXPECT_TRUE(
+ fake_drm_->plane_manager()->Commit(&hdpl, page_flip_request, nullptr));
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
EXPECT_EQ(0u, GetPlanePropertyValue(kPlaneOffset + 1, "FB_ID"));
}
@@ -704,8 +704,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, AssignPlanesRestoresInUse) {
fake_drm_->plane_manager()->BeginFrame(&hdpl);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&hdpl, assigns, crtc_properties_[0].id));
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &hdpl, /*should_modeset*/ false, page_flip_request, nullptr));
+ EXPECT_TRUE(
+ fake_drm_->plane_manager()->Commit(&hdpl, page_flip_request, nullptr));
EXPECT_TRUE(fake_drm_->plane_manager()->planes().front()->in_use());
assigns.push_back(ui::DrmOverlayPlane(overlay_buffer, nullptr));
@@ -738,14 +738,13 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, PageflipTestRestoresInUse) {
fake_drm_->plane_manager()->BeginFrame(&hdpl);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&hdpl, assigns, crtc_properties_[0].id));
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &hdpl, /*should_modeset*/ false, page_flip_request, nullptr));
+ EXPECT_TRUE(
+ fake_drm_->plane_manager()->Commit(&hdpl, page_flip_request, nullptr));
assigns.clear();
fake_drm_->plane_manager()->BeginFrame(&hdpl);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&hdpl, assigns, crtc_properties_[0].id));
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &hdpl, /*should_modeset*/ false, nullptr, nullptr));
+ EXPECT_TRUE(fake_drm_->plane_manager()->Commit(&hdpl, nullptr, nullptr));
// The primary plane should still be in use since the commit was
// a pageflip test and did not change any KMS state.
EXPECT_TRUE(fake_drm_->plane_manager()->planes().front()->in_use());
@@ -1079,8 +1078,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest,
base::MakeRefCounted<ui::PageFlipRequest>(base::TimeDelta());
std::unique_ptr<gfx::GpuFence> out_fence;
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &state_, /*should_modeset*/ false, page_flip_request, &out_fence));
+ EXPECT_TRUE(fake_drm_->plane_manager()->Commit(&state_, page_flip_request,
+ &out_fence));
EXPECT_EQ(nullptr, out_fence);
}
@@ -1320,8 +1319,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, OverlaySourceCrop) {
std::unique_ptr<gfx::GpuFence> out_fence;
scoped_refptr<ui::PageFlipRequest> page_flip_request =
base::MakeRefCounted<ui::PageFlipRequest>(base::TimeDelta());
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &state_, /*should_modeset*/ false, page_flip_request, &out_fence));
+ EXPECT_TRUE(fake_drm_->plane_manager()->Commit(&state_, page_flip_request,
+ &out_fence));
EXPECT_EQ(2u << 16, GetPlanePropertyValue(kPlaneOffset, "SRC_W"));
EXPECT_EQ(2u << 16, GetPlanePropertyValue(kPlaneOffset, "SRC_H"));
@@ -1341,8 +1340,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, OverlaySourceCrop) {
scoped_refptr<ui::PageFlipRequest> page_flip_request =
base::MakeRefCounted<ui::PageFlipRequest>(base::TimeDelta());
std::unique_ptr<gfx::GpuFence> out_fence;
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &state_, /*should_modeset*/ false, page_flip_request, &out_fence));
+ EXPECT_TRUE(fake_drm_->plane_manager()->Commit(&state_, page_flip_request,
+ &out_fence));
EXPECT_EQ(1u << 16, GetPlanePropertyValue(kPlaneOffset, "SRC_W"));
EXPECT_EQ(2u << 16, GetPlanePropertyValue(kPlaneOffset, "SRC_H"));
@@ -1362,8 +1361,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, OverlaySourceCrop) {
scoped_refptr<ui::PageFlipRequest> page_flip_request =
base::MakeRefCounted<ui::PageFlipRequest>(base::TimeDelta());
std::unique_ptr<gfx::GpuFence> out_fence;
- EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
- &state_, /*should_modeset*/ false, page_flip_request, &out_fence));
+ EXPECT_TRUE(fake_drm_->plane_manager()->Commit(&state_, page_flip_request,
+ &out_fence));
EXPECT_EQ(2u << 16, GetPlanePropertyValue(kPlaneOffset, "SRC_W"));
EXPECT_EQ(1u << 16, GetPlanePropertyValue(kPlaneOffset, "SRC_H"));
diff --git a/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc b/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc
index ae0984597c2..bf00ae93cfe 100644
--- a/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.cc
@@ -10,6 +10,7 @@
#include "base/check.h"
#include "base/stl_util.h"
+#include "skia/ext/legacy_display_globals.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h"
@@ -35,6 +36,11 @@ namespace ui {
namespace {
+constexpr uint32_t kTestModesetFlags =
+ DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET;
+
+constexpr uint32_t kCommitModesetFlags = DRM_MODE_ATOMIC_ALLOW_MODESET;
+
template <class Object>
Object* DrmAllocator() {
return static_cast<Object*>(drmMalloc(sizeof(Object)));
@@ -326,7 +332,7 @@ ScopedDrmPropertyBlob MockDrmDevice::CreatePropertyBlob(const void* blob,
size_t size) {
uint32_t id = ++property_id_generator_;
allocated_property_blobs_.insert(id);
- return ScopedDrmPropertyBlob(new DrmPropertyBlobMetadata(this, id));
+ return std::make_unique<DrmPropertyBlobMetadata>(this, id);
}
void MockDrmDevice::DestroyPropertyBlob(uint32_t id) {
@@ -385,10 +391,11 @@ bool MockDrmDevice::CreateDumbBuffer(const SkImageInfo& info,
*handle = allocate_buffer_count_++;
*stride = info.minRowBytes();
void* pixels = new char[info.computeByteSize(*stride)];
+ SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps();
buffers_.push_back(SkSurface::MakeRasterDirectReleaseProc(
info, pixels, *stride,
[](void* pixels, void* context) { delete[] static_cast<char*>(pixels); },
- /*context=*/nullptr));
+ /*context=*/nullptr, &props));
buffers_[*handle]->getCanvas()->clear(SK_ColorBLACK);
return true;
@@ -425,6 +432,11 @@ bool MockDrmDevice::CommitProperties(
uint32_t flags,
uint32_t crtc_count,
scoped_refptr<PageFlipRequest> page_flip_request) {
+ if (flags == kTestModesetFlags)
+ ++test_modeset_count_;
+ else if (flags == kCommitModesetFlags)
+ ++commit_modeset_count_;
+
commit_count_++;
if (!commit_expectation_)
return false;
diff --git a/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h b/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h
index 7eedf4e1939..922d402147c 100644
--- a/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h
+++ b/chromium/ui/ozone/platform/drm/gpu/mock_drm_device.h
@@ -71,6 +71,8 @@ class MockDrmDevice : public DrmDevice {
}
int get_page_flip_call_count() const { return page_flip_call_count_; }
int get_overlay_clear_call_count() const { return overlay_clear_call_count_; }
+ int get_test_modeset_count() const { return test_modeset_count_; }
+ int get_commit_modeset_count() const { return commit_modeset_count_; }
int get_commit_count() const { return commit_count_; }
int get_set_object_property_count() const {
return set_object_property_count_;
@@ -203,6 +205,8 @@ class MockDrmDevice : public DrmDevice {
int page_flip_call_count_;
int overlay_clear_call_count_;
int allocate_buffer_count_;
+ int test_modeset_count_ = 0;
+ int commit_modeset_count_ = 0;
int commit_count_ = 0;
int set_object_property_count_ = 0;
int set_gamma_ramp_count_ = 0;
diff --git a/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc b/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
index b7b4ebbd3ed..5a8319fe9cd 100644
--- a/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -93,8 +93,14 @@ CrtcController* GetCrtcController(HardwareDisplayController* controller,
return nullptr;
}
-inline bool AreAllStatusesTrue(
- base::flat_map<int64_t, bool>& display_statuses) {
+std::vector<uint64_t> GetModifiersForPrimaryFormat(
+ HardwareDisplayController* controller) {
+ gfx::BufferFormat format = display::DisplaySnapshot::PrimaryFormat();
+ uint32_t fourcc_format = ui::GetFourCCFormatForOpaqueFramebuffer(format);
+ return controller->GetFormatModifiersForModesetting(fourcc_format);
+}
+
+bool AreAllStatusesTrue(base::flat_map<int64_t, bool>& display_statuses) {
auto it = find_if(display_statuses.begin(), display_statuses.end(),
[](const auto status) { return status.second == false; });
return (it == display_statuses.end());
@@ -197,7 +203,7 @@ void ScreenManager::RemoveDisplayControllers(
bool is_mirrored = (*it)->IsMirrored();
std::unique_ptr<CrtcController> crtc = (*it)->RemoveCrtc(drm, crtc_id);
- if (!crtc->is_disabled()) {
+ if (crtc->is_enabled()) {
commit_request.push_back(CrtcCommitRequest::DisableCrtcRequest(
crtc->crtc(), crtc->connector()));
}
@@ -218,25 +224,23 @@ void ScreenManager::RemoveDisplayControllers(
}
base::flat_map<int64_t, bool> ScreenManager::ConfigureDisplayControllers(
- const std::vector<ScreenManager::ControllerConfigParams>&
- controllers_params) {
+ const ControllerConfigsList& controllers_params) {
// Split them to different lists unique to each DRM Device.
- base::flat_map<scoped_refptr<DrmDevice>,
- std::vector<ScreenManager::ControllerConfigParams>>
- displays_for_drms;
+ base::flat_map<scoped_refptr<DrmDevice>, ControllerConfigsList>
+ displays_for_drm_devices;
for (auto& params : controllers_params) {
- auto it = displays_for_drms.find(params.drm);
- if (it == displays_for_drms.end()) {
- displays_for_drms.insert(std::make_pair(
- params.drm, std::vector<ScreenManager::ControllerConfigParams>()));
+ auto it = displays_for_drm_devices.find(params.drm);
+ if (it == displays_for_drm_devices.end()) {
+ displays_for_drm_devices.insert(
+ std::make_pair(params.drm, ControllerConfigsList()));
}
- displays_for_drms[params.drm].emplace_back(params);
+ displays_for_drm_devices[params.drm].emplace_back(params);
}
base::flat_map<int64_t, bool> statuses;
// Perform display configurations together for the same DRM only.
- for (const auto& configs_on_drm : displays_for_drms) {
+ for (const auto& configs_on_drm : displays_for_drm_devices) {
auto display_statuses = TestAndModeset(configs_on_drm.second);
statuses.insert(display_statuses.begin(), display_statuses.end());
}
@@ -248,7 +252,7 @@ base::flat_map<int64_t, bool> ScreenManager::ConfigureDisplayControllers(
}
base::flat_map<int64_t, bool> ScreenManager::TestAndModeset(
- const std::vector<ControllerConfigParams>& controllers_params) {
+ const ControllerConfigsList& controllers_params) {
if (!TestModeset(controllers_params)) {
base::flat_map<int64_t, bool> statuses;
for (const auto& params : controllers_params)
@@ -260,9 +264,8 @@ base::flat_map<int64_t, bool> ScreenManager::TestAndModeset(
}
bool ScreenManager::TestModeset(
- const std::vector<ControllerConfigParams>& controllers_params) {
+ const ControllerConfigsList& controllers_params) {
CommitRequest commit_request;
- bool status = true;
auto drm = controllers_params[0].drm;
for (const auto& params : controllers_params) {
@@ -271,33 +274,53 @@ bool ScreenManager::TestModeset(
HardwareDisplayController* controller = it->get();
if (params.mode) {
- status &= GetModesetControllerProps(&commit_request, controller,
- params.origin, *params.mode);
+ DrmOverlayPlane primary_plane = GetModesetBuffer(
+ controller, gfx::Rect(params.origin, ModeSize(*params.mode)),
+ GetModifiersForPrimaryFormat(controller));
+ if (!primary_plane.buffer)
+ return false;
+
+ GetModesetControllerProps(&commit_request, controller, params.origin,
+ *params.mode, primary_plane);
} else {
controller->GetDisableProps(&commit_request);
}
}
- if (status) {
- status &= drm->plane_manager()->Commit(
- std::move(commit_request),
- DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET);
- }
- return status;
+
+ return drm->plane_manager()->Commit(
+ std::move(commit_request),
+ DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET);
}
base::flat_map<int64_t, bool> ScreenManager::Modeset(
- const std::vector<ControllerConfigParams>& controllers_params) {
+ const ControllerConfigsList& controllers_params) {
base::flat_map<int64_t, bool> statuses;
for (const auto& params : controllers_params) {
// Commit one controller at a time.
CommitRequest commit_request;
- bool status = params.mode
- ? SetDisplayControllerForEnableAndGetProps(
- &commit_request, params.drm, params.crtc,
- params.connector, params.origin, *params.mode)
- : SetDisableDisplayControllerForDisableAndGetProps(
- &commit_request, params.drm, params.crtc);
+ bool status = true;
+ if (params.mode) {
+ auto it = FindDisplayController(params.drm, params.crtc);
+ DCHECK(controllers_.end() != it);
+ HardwareDisplayController* controller = it->get();
+
+ DrmOverlayPlane primary_plane = GetModesetBuffer(
+ controller, gfx::Rect(params.origin, ModeSize(*params.mode)),
+ GetModifiersForPrimaryFormat(controller));
+ if (primary_plane.buffer) {
+ SetDisplayControllerForEnableAndGetProps(
+ &commit_request, params.drm, params.crtc, params.connector,
+ params.origin, *params.mode, primary_plane);
+ } else {
+ status = false;
+ }
+
+ } else {
+ status = SetDisableDisplayControllerForDisableAndGetProps(
+ &commit_request, params.drm, params.crtc);
+ }
+
CommitRequest request_for_update = commit_request;
if (status) {
status &= params.drm->plane_manager()->Commit(
@@ -311,17 +334,14 @@ base::flat_map<int64_t, bool> ScreenManager::Modeset(
return statuses;
}
-// TODO(markyacoub): As Mirroring is partially handled in
-// UpdateControllerStateAfterModeset(), this function can be greatly simplified.
-bool ScreenManager::SetDisplayControllerForEnableAndGetProps(
+void ScreenManager::SetDisplayControllerForEnableAndGetProps(
CommitRequest* commit_request,
const scoped_refptr<DrmDevice>& drm,
uint32_t crtc,
uint32_t connector,
const gfx::Point& origin,
- const drmModeModeInfo& mode) {
- gfx::Rect modeset_bounds(origin.x(), origin.y(), mode.hdisplay,
- mode.vdisplay);
+ const drmModeModeInfo& mode,
+ const DrmOverlayPlane& primary) {
HardwareDisplayControllers::iterator it = FindDisplayController(drm, crtc);
DCHECK(controllers_.end() != it)
<< "Display controller (crtc=" << crtc << ") doesn't exist.";
@@ -332,17 +352,18 @@ bool ScreenManager::SetDisplayControllerForEnableAndGetProps(
// comparison on the mode since the refresh rate may have changed.
if (SameMode(mode, crtc_controller->mode()) &&
origin == controller->origin()) {
- if (controller->IsDisabled()) {
- HardwareDisplayControllers::iterator mirror =
- FindActiveDisplayControllerByLocation(drm, modeset_bounds);
- // If there is an active controller at the same location then start mirror
- // mode.
- if (mirror != controllers_.end())
- return HandleMirrorMode(commit_request, it, mirror, mode);
+ if (!controller->IsEnabled()) {
+ // Even if there is a mirrored display, Modeset the CRTC with its mode in
+ // the original controller so that only this CRTC is affected by the mode.
+ // Otherwise it could apply a mode with the same resolution and refresh
+ // rate but with different timings to the other CRTC.
+ GetModesetControllerProps(commit_request, controller,
+ controller->origin(), mode, primary);
+ } else {
+ // Just get props to re-enable the controller re-using the current state.
+ GetEnableControllerProps(commit_request, controller, primary);
}
-
- // Just get props to re-enable the controller re-using the current state.
- return GetEnableControllerProps(commit_request, controller);
+ return;
}
// Either the mode or the location of the display changed, so exit mirror
@@ -356,13 +377,7 @@ bool ScreenManager::SetDisplayControllerForEnableAndGetProps(
controller = it->get();
}
- HardwareDisplayControllers::iterator mirror =
- FindActiveDisplayControllerByLocation(drm, modeset_bounds);
- // Handle mirror mode.
- if (mirror != controllers_.end() && it != mirror)
- return HandleMirrorMode(commit_request, it, mirror, mode);
-
- return GetModesetControllerProps(commit_request, controller, origin, mode);
+ GetModesetControllerProps(commit_request, controller, origin, mode, primary);
}
bool ScreenManager::SetDisableDisplayControllerForDisableAndGetProps(
@@ -400,19 +415,30 @@ void ScreenManager::UpdateControllerStateAfterModeset(
crtc_request.overlays()));
// If the CRTC is mirrored, move it to the mirror controller.
- if (did_succeed && was_enabled) {
- gfx::Rect modeset_bounds(config.origin, ModeSize(*config.mode));
- HardwareDisplayControllers::iterator mirror =
- FindActiveDisplayControllerByLocation(config.drm, modeset_bounds);
- if (mirror != controllers_.end() && it != mirror) {
- (*mirror)->AddCrtc((*it)->RemoveCrtc(config.drm, config.crtc));
- controllers_.erase(it);
- }
- }
+ if (did_succeed && was_enabled)
+ HandleMirrorIfExists(config, it);
}
}
}
+void ScreenManager::HandleMirrorIfExists(
+ const ControllerConfigParams& config,
+ const HardwareDisplayControllers::iterator& controller) {
+ gfx::Rect modeset_bounds(config.origin, ModeSize(*config.mode));
+ HardwareDisplayControllers::iterator mirror =
+ FindActiveDisplayControllerByLocation(config.drm, modeset_bounds);
+ // TODO(dnicoara): This is hacky, instead the DrmDisplay and
+ // CrtcController should be merged and picking the mode should be done
+ // properly within HardwareDisplayController.
+ if (mirror != controllers_.end() && controller != mirror) {
+ // TODO(markyacoub): RemoveCrtc makes a blocking commit to
+ // DisableOverlayPlanes. This should be redesigned and included as part of
+ // the Modeset commit.
+ (*mirror)->AddCrtc((*controller)->RemoveCrtc(config.drm, config.crtc));
+ controllers_.erase(controller);
+ }
+}
+
HardwareDisplayController* ScreenManager::GetDisplayController(
const gfx::Rect& bounds) {
HardwareDisplayControllers::iterator it =
@@ -463,7 +489,7 @@ ScreenManager::HardwareDisplayControllers::iterator
ScreenManager::FindActiveDisplayControllerByLocation(const gfx::Rect& bounds) {
for (auto it = controllers_.begin(); it != controllers_.end(); ++it) {
gfx::Rect controller_bounds((*it)->origin(), (*it)->GetModeSize());
- if (controller_bounds == bounds && !(*it)->IsDisabled())
+ if (controller_bounds == bounds && (*it)->IsEnabled())
return it;
}
@@ -477,34 +503,19 @@ ScreenManager::FindActiveDisplayControllerByLocation(
for (auto it = controllers_.begin(); it != controllers_.end(); ++it) {
gfx::Rect controller_bounds((*it)->origin(), (*it)->GetModeSize());
if ((*it)->GetDrmDevice() == drm && controller_bounds == bounds &&
- !(*it)->IsDisabled())
+ (*it)->IsEnabled())
return it;
}
return controllers_.end();
}
-bool ScreenManager::HandleMirrorMode(
- CommitRequest* commit_request,
- HardwareDisplayControllers::iterator original,
- HardwareDisplayControllers::iterator mirror,
- const drmModeModeInfo& mode) {
- // Modeset the CRTC with its mode in the original controller so that only this
- // CRTC is affected by the mode. Otherwise it could apply a mode with the same
- // resolution and refresh rate but with different timings to the other CRTC.
- // TODO(dnicoara): This is hacky, instead the DrmDisplay and CrtcController
- // should be merged and picking the mode should be done properly within
- // HardwareDisplayController.
- return GetModesetControllerProps(commit_request, original->get(),
- (*mirror)->origin(), mode);
-}
-
void ScreenManager::UpdateControllerToWindowMapping() {
std::map<DrmWindow*, HardwareDisplayController*> window_to_controller_map;
// First create a unique mapping between a window and a controller. Note, a
// controller may be associated with at most 1 window.
for (const auto& controller : controllers_) {
- if (controller->IsDisabled())
+ if (!controller->IsEnabled())
continue;
DrmWindow* window = FindWindowAt(
@@ -530,8 +541,14 @@ void ScreenManager::UpdateControllerToWindowMapping() {
// otherwise the controller may be waiting for a page flip while the window
// tries to schedule another buffer.
if (should_enable) {
+ DrmOverlayPlane primary_plane = GetModesetBuffer(
+ controller,
+ gfx::Rect(controller->origin(), controller->GetModeSize()),
+ GetModifiersForPrimaryFormat(controller));
+ DCHECK(primary_plane.buffer);
+
CommitRequest commit_request;
- GetEnableControllerProps(&commit_request, controller);
+ GetEnableControllerProps(&commit_request, controller, primary_plane);
controller->GetDrmDevice()->plane_manager()->Commit(
std::move(commit_request), DRM_MODE_ATOMIC_ALLOW_MODESET);
}
@@ -540,40 +557,34 @@ void ScreenManager::UpdateControllerToWindowMapping() {
DrmOverlayPlane ScreenManager::GetModesetBuffer(
HardwareDisplayController* controller,
- const gfx::Rect& bounds) {
- DrmWindow* window = FindWindowAt(bounds);
+ const gfx::Rect& bounds,
+ const std::vector<uint64_t>& modifiers) {
+ scoped_refptr<DrmDevice> drm = controller->GetDrmDevice();
+ uint32_t fourcc_format = ui::GetFourCCFormatForOpaqueFramebuffer(
+ display::DisplaySnapshot::PrimaryFormat());
+ // Get the buffer that best reflects what the next Page Flip will look like,
+ // which is using the preferred modifiers from the controllers.
+ std::unique_ptr<GbmBuffer> buffer =
+ drm->gbm_device()->CreateBufferWithModifiers(
+ fourcc_format, bounds.size(), GBM_BO_USE_SCANOUT, modifiers);
+ if (!buffer) {
+ LOG(ERROR) << "Failed to create scanout buffer";
+ return DrmOverlayPlane::Error();
+ }
- gfx::BufferFormat format = display::DisplaySnapshot::PrimaryFormat();
- uint32_t fourcc_format = ui::GetFourCCFormatForOpaqueFramebuffer(format);
- const auto& modifiers =
- controller->GetFormatModifiersForModesetting(fourcc_format);
+ // If the current primary plane matches what we need for the next page flip,
+ // we can clone it.
+ DrmWindow* window = FindWindowAt(bounds);
if (window) {
const DrmOverlayPlane* primary = window->GetLastModesetBuffer();
const DrmDevice* drm = controller->GetDrmDevice().get();
if (primary && primary->buffer->size() == bounds.size() &&
primary->buffer->drm_device() == drm) {
- // If the controller doesn't advertise modifiers, wont have a
- // modifier either and we can reuse the buffer. Otherwise, check
- // to see if the controller supports the buffers format
- // modifier.
- if (modifiers.empty())
+ if (primary->buffer->format_modifier() == buffer->GetFormatModifier())
return primary->Clone();
- for (const uint64_t modifier : modifiers) {
- if (modifier == primary->buffer->format_modifier())
- return primary->Clone();
- }
}
}
- scoped_refptr<DrmDevice> drm = controller->GetDrmDevice();
- std::unique_ptr<GbmBuffer> buffer =
- drm->gbm_device()->CreateBufferWithModifiers(
- fourcc_format, bounds.size(), GBM_BO_USE_SCANOUT, modifiers);
- if (!buffer) {
- LOG(ERROR) << "Failed to create scanout buffer";
- return DrmOverlayPlane::Error();
- }
-
scoped_refptr<DrmFramebuffer> framebuffer = DrmFramebuffer::AddFramebuffer(
drm, buffer.get(), buffer->GetSize(), modifiers);
if (!framebuffer) {
@@ -593,39 +604,25 @@ DrmOverlayPlane ScreenManager::GetModesetBuffer(
return DrmOverlayPlane(framebuffer, nullptr);
}
-bool ScreenManager::GetEnableControllerProps(
+void ScreenManager::GetEnableControllerProps(
CommitRequest* commit_request,
- HardwareDisplayController* controller) {
+ HardwareDisplayController* controller,
+ const DrmOverlayPlane& primary) {
DCHECK(!controller->crtc_controllers().empty());
- gfx::Rect rect(controller->origin(), controller->GetModeSize());
- DrmOverlayPlane primary_plane = GetModesetBuffer(controller, rect);
- if (!primary_plane.buffer) {
- PLOG(ERROR) << "Failed to find plane buffer for Enable";
- return false;
- }
-
- controller->GetEnableProps(commit_request, primary_plane);
- return true;
+ controller->GetEnableProps(commit_request, primary);
}
-bool ScreenManager::GetModesetControllerProps(
+void ScreenManager::GetModesetControllerProps(
CommitRequest* commit_request,
HardwareDisplayController* controller,
const gfx::Point& origin,
- const drmModeModeInfo& mode) {
+ const drmModeModeInfo& mode,
+ const DrmOverlayPlane& primary) {
DCHECK(!controller->crtc_controllers().empty());
- gfx::Rect rect(origin, ModeSize(mode));
controller->set_origin(origin);
- DrmOverlayPlane primary_plane = GetModesetBuffer(controller, rect);
- if (!primary_plane.buffer) {
- PLOG(ERROR) << "Failed to find plane buffer for Modeset";
- return false;
- }
-
- controller->GetModesetProps(commit_request, primary_plane, mode);
- return true;
+ controller->GetModesetProps(commit_request, primary, mode);
}
DrmWindow* ScreenManager::FindWindowAt(const gfx::Rect& bounds) const {
diff --git a/chromium/ui/ozone/platform/drm/gpu/screen_manager.h b/chromium/ui/ozone/platform/drm/gpu/screen_manager.h
index 8ed458cf1d1..d7ac2810b53 100644
--- a/chromium/ui/ozone/platform/drm/gpu/screen_manager.h
+++ b/chromium/ui/ozone/platform/drm/gpu/screen_manager.h
@@ -52,6 +52,7 @@ class ScreenManager {
const gfx::Point origin;
std::unique_ptr<drmModeModeInfo> mode = nullptr;
};
+ using ControllerConfigsList = std::vector<ControllerConfigParams>;
ScreenManager();
virtual ~ScreenManager();
@@ -68,8 +69,7 @@ class ScreenManager {
// Enables/Disables the display controller based on if a mode exists.
base::flat_map<int64_t, bool> ConfigureDisplayControllers(
- const std::vector<ScreenManager::ControllerConfigParams>&
- controllers_params);
+ const ControllerConfigsList& controllers_params);
// Returns a reference to the display controller configured to display within
// |bounds|. If the caller caches the controller it must also register as an
@@ -106,24 +106,24 @@ class ScreenManager {
uint32_t crtc);
base::flat_map<int64_t, bool> TestAndModeset(
- const std::vector<ControllerConfigParams>& controllers_params);
+ const ControllerConfigsList& controllers_params);
- bool TestModeset(
- const std::vector<ControllerConfigParams>& controllers_params);
+ bool TestModeset(const ControllerConfigsList& controllers_params);
base::flat_map<int64_t, bool> Modeset(
- const std::vector<ControllerConfigParams>& controllers_params);
+ const ControllerConfigsList& controllers_params);
// Configures a display controller to be enabled. The display controller is
// identified by (|crtc|, |connector|) and the controller is to be modeset
// using |mode|. Controller modeset props are added into |commit_request|.
- bool SetDisplayControllerForEnableAndGetProps(
+ void SetDisplayControllerForEnableAndGetProps(
CommitRequest* commit_request,
const scoped_refptr<DrmDevice>& drm,
uint32_t crtc,
uint32_t connector,
const gfx::Point& origin,
- const drmModeModeInfo& mode);
+ const drmModeModeInfo& mode,
+ const DrmOverlayPlane& primary);
// Configures a display controller to be disabled. The display controller is
// identified by |crtc|. Controller modeset props are added into
@@ -139,6 +139,10 @@ class ScreenManager {
const CommitRequest& commit_request,
bool did_succeed);
+ void HandleMirrorIfExists(
+ const ControllerConfigParams& config,
+ const HardwareDisplayControllers::iterator& controller);
+
// Returns an iterator into |controllers_| for the controller located at
// |origin|.
HardwareDisplayControllers::iterator FindActiveDisplayControllerByLocation(
@@ -150,26 +154,19 @@ class ScreenManager {
const scoped_refptr<DrmDevice>& drm,
const gfx::Rect& bounds);
- // Tries to set the |original| controller to mirror those in |mirror|.
- // |original| is an iterator to the HDC where the controller is currently
- // present.
- bool HandleMirrorMode(CommitRequest* commit_request,
- HardwareDisplayControllers::iterator original,
- HardwareDisplayControllers::iterator mirror,
- const drmModeModeInfo& mode);
-
DrmOverlayPlane GetModesetBuffer(HardwareDisplayController* controller,
- const gfx::Rect& bounds);
+ const gfx::Rect& bounds,
+ const std::vector<uint64_t>& modifiers);
- // Gets props for modesetting the |controller| using |origin| and |mode|. If
- // there is a window at the controller location, then we'll re-use the current
- // buffer.
- bool GetModesetControllerProps(CommitRequest* commit_request,
+ // Gets props for modesetting the |controller| using |origin| and |mode|.
+ void GetModesetControllerProps(CommitRequest* commit_request,
HardwareDisplayController* controller,
const gfx::Point& origin,
- const drmModeModeInfo& mode);
- bool GetEnableControllerProps(CommitRequest* commit_request,
- HardwareDisplayController* controller);
+ const drmModeModeInfo& mode,
+ const DrmOverlayPlane& primary);
+ void GetEnableControllerProps(CommitRequest* commit_request,
+ HardwareDisplayController* controller,
+ const DrmOverlayPlane& primary);
DrmWindow* FindWindowAt(const gfx::Rect& bounds) const;
diff --git a/chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc b/chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
index cc923828a64..d4a1a691a1e 100644
--- a/chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
+++ b/chromium/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
@@ -9,7 +9,7 @@
#include <memory>
#include <utility>
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/files/platform_file.h"
#include "base/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -225,6 +225,9 @@ class ScreenManagerTest : public testing::Test {
TEST_F(ScreenManagerTest, CheckWithNoControllers) {
EXPECT_FALSE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
+ EXPECT_EQ(drm_->get_test_modeset_count(), 0);
+ EXPECT_EQ(drm_->get_commit_modeset_count(), 0);
+ EXPECT_EQ(drm_->get_commit_count(), 0);
}
TEST_F(ScreenManagerTest, CheckWithValidController) {
@@ -232,12 +235,14 @@ TEST_F(ScreenManagerTest, CheckWithValidController) {
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
std::make_unique<drmModeModeInfo>(kDefaultMode));
screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ EXPECT_EQ(drm_->get_test_modeset_count(), 1);
+ EXPECT_EQ(drm_->get_commit_modeset_count(), 1);
ui::HardwareDisplayController* controller =
screen_manager_->GetDisplayController(GetPrimaryBounds());
@@ -251,7 +256,7 @@ TEST_F(ScreenManagerTest, CheckWithInvalidBounds) {
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -269,7 +274,7 @@ TEST_F(ScreenManagerTest, CheckForSecondValidController) {
screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
kSecondaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -281,6 +286,9 @@ TEST_F(ScreenManagerTest, CheckForSecondValidController) {
std::make_unique<drmModeModeInfo>(secondary_mode));
screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ EXPECT_EQ(drm_->get_test_modeset_count(), 1);
+ EXPECT_EQ(drm_->get_commit_modeset_count(), 2);
+
EXPECT_TRUE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
EXPECT_TRUE(screen_manager_->GetDisplayController(GetSecondaryBounds()));
}
@@ -290,7 +298,7 @@ TEST_F(ScreenManagerTest, CheckControllerAfterItIsRemoved) {
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -300,12 +308,41 @@ TEST_F(ScreenManagerTest, CheckControllerAfterItIsRemoved) {
EXPECT_TRUE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
ScreenManager::CrtcsWithDrmList controllers_to_remove;
-
controllers_to_remove.emplace_back(kPrimaryCrtc, drm_);
screen_manager_->RemoveDisplayControllers(controllers_to_remove);
EXPECT_FALSE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
}
+TEST_F(ScreenManagerTest, CheckControllerAfterDisabled) {
+ InitializeDrmStateWithDefault(drm_.get());
+ screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
+
+ // Enable
+ {
+ ScreenManager::ControllerConfigsList controllers_to_enable;
+ controllers_to_enable.emplace_back(
+ kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
+ GetPrimaryBounds().origin(),
+ std::make_unique<drmModeModeInfo>(kDefaultMode));
+ screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ }
+
+ int test_modeset_count_before_disable = drm_->get_test_modeset_count();
+ int commit_modeset_count_before_disable = drm_->get_commit_modeset_count();
+ // Disable
+ ScreenManager::ControllerConfigsList controllers_to_enable;
+ controllers_to_enable.emplace_back(kPrimaryDisplayId, drm_, kPrimaryCrtc,
+ kPrimaryConnector, gfx::Point(), nullptr);
+ screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+
+ EXPECT_EQ(drm_->get_test_modeset_count(),
+ test_modeset_count_before_disable + 1);
+ EXPECT_EQ(drm_->get_commit_modeset_count(),
+ commit_modeset_count_before_disable + 1);
+
+ EXPECT_FALSE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
+}
+
TEST_F(ScreenManagerTest, CheckMultipleControllersAfterBeingRemoved) {
InitializeDrmStateWithDefault(drm_.get());
@@ -313,7 +350,7 @@ TEST_F(ScreenManagerTest, CheckMultipleControllersAfterBeingRemoved) {
screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
kSecondaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -324,11 +361,54 @@ TEST_F(ScreenManagerTest, CheckMultipleControllersAfterBeingRemoved) {
std::make_unique<drmModeModeInfo>(kDefaultMode));
screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ int modeset_count_after_enable = drm_->get_commit_modeset_count();
ScreenManager::CrtcsWithDrmList controllers_to_remove;
controllers_to_remove.emplace_back(kPrimaryCrtc, drm_);
controllers_to_remove.emplace_back(kSecondaryCrtc, drm_);
screen_manager_->RemoveDisplayControllers(controllers_to_remove);
+ // Removed displays are disabled in only 1 modeset commit.
+ EXPECT_EQ(drm_->get_commit_modeset_count(), modeset_count_after_enable + 1);
+
+ EXPECT_FALSE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
+ EXPECT_FALSE(screen_manager_->GetDisplayController(GetSecondaryBounds()));
+}
+
+TEST_F(ScreenManagerTest, CheckMultipleControllersAfterBeingDisabled) {
+ InitializeDrmStateWithDefault(drm_.get());
+ screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
+ screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
+ kSecondaryConnector);
+ // Enable
+ {
+ ScreenManager::ControllerConfigsList controllers_to_enable;
+ controllers_to_enable.emplace_back(
+ kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
+ GetPrimaryBounds().origin(),
+ std::make_unique<drmModeModeInfo>(kDefaultMode));
+ controllers_to_enable.emplace_back(
+ kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
+ GetSecondaryBounds().origin(),
+ std::make_unique<drmModeModeInfo>(kDefaultMode));
+ screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+ }
+
+ int test_modeset_count_before_disable = drm_->get_test_modeset_count();
+ int commit_modeset_count_before_disable = drm_->get_commit_modeset_count();
+ // Disable
+ ScreenManager::ControllerConfigsList controllers_to_enable;
+ controllers_to_enable.emplace_back(kPrimaryDisplayId, drm_, kPrimaryCrtc,
+ kPrimaryConnector, gfx::Point(), nullptr);
+ controllers_to_enable.emplace_back(kSecondaryDisplayId, drm_, kSecondaryCrtc,
+ kSecondaryConnector, gfx::Point(),
+ nullptr);
+ screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
+
+ EXPECT_EQ(drm_->get_test_modeset_count(),
+ test_modeset_count_before_disable + 1);
+ EXPECT_EQ(drm_->get_commit_modeset_count(),
+ commit_modeset_count_before_disable + 2);
+
EXPECT_FALSE(screen_manager_->GetDisplayController(GetPrimaryBounds()));
EXPECT_FALSE(screen_manager_->GetDisplayController(GetSecondaryBounds()));
}
@@ -338,7 +418,7 @@ TEST_F(ScreenManagerTest, CheckDuplicateConfiguration) {
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -368,7 +448,7 @@ TEST_F(ScreenManagerTest, CheckChangingMode) {
// Modeset with default mode.
{
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -379,7 +459,7 @@ TEST_F(ScreenManagerTest, CheckChangingMode) {
new_mode.vdisplay = new_mode.vdisplay++;
// Modeset with a changed Mode.
{
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -404,7 +484,7 @@ TEST_F(ScreenManagerTest, CheckForControllersInMirroredMode) {
screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
kSecondaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -443,7 +523,7 @@ TEST_F(ScreenManagerTest, CheckMirrorModeTransitions) {
screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
kSecondaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -500,7 +580,7 @@ TEST_F(ScreenManagerTest, CheckMirrorModeModesettingWithDisplaysMode) {
screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
kSecondaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -535,7 +615,7 @@ TEST_F(ScreenManagerTest, MonitorGoneInMirrorMode) {
screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
kSecondaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -567,7 +647,7 @@ TEST_F(ScreenManagerTest, MonitorDisabledInMirrorMode) {
screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
kSecondaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -600,7 +680,7 @@ TEST_F(ScreenManagerTest, DoNotEnterMirrorModeUnlessSameBounds) {
// Configure displays in extended mode.
{
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -617,7 +697,7 @@ TEST_F(ScreenManagerTest, DoNotEnterMirrorModeUnlessSameBounds) {
auto new_mode = std::make_unique<drmModeModeInfo>(kDefaultMode);
new_mode->vdisplay = 10;
// Shouldn't enter mirror mode unless the display bounds are the same.
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kSecondaryDisplayId, drm_, kSecondaryCrtc, kSecondaryConnector,
GetPrimaryBounds().origin(), std::move(new_mode));
@@ -632,7 +712,7 @@ TEST_F(ScreenManagerTest, ReuseFramebufferIfDisabledThenReEnabled) {
InitializeDrmStateWithDefault(drm_.get(), /*is_atomic=*/false);
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -667,7 +747,7 @@ TEST_F(ScreenManagerTest, CheckMirrorModeAfterBeginReEnabled) {
screen_manager_->AddDisplayController(drm_, kSecondaryCrtc,
kSecondaryConnector);
{
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -680,7 +760,7 @@ TEST_F(ScreenManagerTest, CheckMirrorModeAfterBeginReEnabled) {
screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
}
{
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(0, drm_, kPrimaryCrtc, 0, gfx::Point(),
nullptr);
screen_manager_->ConfigureDisplayControllers(controllers_to_enable);
@@ -692,7 +772,7 @@ TEST_F(ScreenManagerTest, CheckMirrorModeAfterBeginReEnabled) {
EXPECT_FALSE(controller->IsMirrored());
{
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
drmModeModeInfo reenable_mode = kDefaultMode;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
@@ -732,7 +812,7 @@ TEST_F(ScreenManagerTest, ConfigureOnDifferentDrmDevices) {
screen_manager_->AddDisplayController(drm2, kSecondaryCrtc + 1,
kSecondaryConnector + 1);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -765,7 +845,7 @@ TEST_F(ScreenManagerTest,
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
screen_manager_->AddDisplayController(drm2, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -797,7 +877,7 @@ TEST_F(ScreenManagerTest, CheckControllerToWindowMappingWithSameBounds) {
screen_manager_->AddWindow(1, std::move(window));
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -822,7 +902,7 @@ TEST_F(ScreenManagerTest, CheckControllerToWindowMappingWithDifferentBounds) {
screen_manager_->AddWindow(1, std::move(window));
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -849,7 +929,7 @@ TEST_F(ScreenManagerTest,
}
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -878,7 +958,7 @@ TEST_F(ScreenManagerTest, ShouldDissociateWindowOnControllerRemoval) {
screen_manager_->AddWindow(window_id, std::move(window));
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -907,7 +987,7 @@ TEST_F(ScreenManagerTest, EnableControllerWhenWindowHasNoBuffer) {
screen_manager_->AddWindow(1, std::move(window));
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -950,7 +1030,7 @@ TEST_F(ScreenManagerTest, EnableControllerWhenWindowHasBuffer) {
screen_manager_->AddWindow(1, std::move(window));
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -978,7 +1058,7 @@ TEST_F(ScreenManagerTest, DISABLED_RejectBufferWithIncompatibleModifiers) {
screen_manager_->AddWindow(1, std::move(window));
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -1006,7 +1086,7 @@ TEST_F(ScreenManagerTest, ConfigureDisplayControllerShouldModesetOnce) {
screen_manager_->AddWindow(1, std::move(window));
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
controllers_to_enable.emplace_back(
kPrimaryDisplayId, drm_, kPrimaryCrtc, kPrimaryConnector,
GetPrimaryBounds().origin(),
@@ -1064,7 +1144,7 @@ TEST_F(ScreenManagerTest, ShouldNotHardwareMirrorDifferentDrmDevices) {
screen_manager.AddDisplayController(drm_device1, kCrtc1, kConnector1);
screen_manager.AddDisplayController(drm_device2, kCrtc2, kConnector2);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
std::unique_ptr<drmModeModeInfo> primary_mode =
std::make_unique<drmModeModeInfo>(k1920x1080Screen);
std::unique_ptr<drmModeModeInfo> secondary_mode =
@@ -1101,7 +1181,7 @@ TEST_F(ScreenManagerTest, ShouldNotHardwareMirrorDifferentDrmDevices) {
controllers_to_remove.emplace_back(kCrtc1, drm_device1);
screen_manager.RemoveDisplayControllers(controllers_to_remove);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
std::unique_ptr<drmModeModeInfo> secondary_mode =
std::make_unique<drmModeModeInfo>(k1920x1080Screen);
controllers_to_enable.emplace_back(kSecondaryDisplayId, drm_device2, kCrtc2,
@@ -1117,7 +1197,7 @@ TEST_F(ScreenManagerTest, ShouldNotHardwareMirrorDifferentDrmDevices) {
// Reconnect first display. Original configuration restored.
{
screen_manager.AddDisplayController(drm_device1, kCrtc1, kConnector1);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
std::unique_ptr<drmModeModeInfo> primary_mode =
std::make_unique<drmModeModeInfo>(k1920x1080Screen);
controllers_to_enable.emplace_back(kPrimaryDisplayId, drm_device1, kCrtc1,
@@ -1209,7 +1289,7 @@ TEST_F(ScreenManagerTest, ShouldNotUnbindFramebufferOnJoiningMirror) {
screen_manager.AddDisplayController(drm_device, kCrtc1, kConnector1);
screen_manager.AddDisplayController(drm_device, kCrtc2, kConnector2);
- std::vector<ScreenManager::ControllerConfigParams> controllers_to_enable;
+ ScreenManager::ControllerConfigsList controllers_to_enable;
std::unique_ptr<drmModeModeInfo> primary_mode =
std::make_unique<drmModeModeInfo>(k1080p60Screen);
std::unique_ptr<drmModeModeInfo> secondary_mode =
diff --git a/chromium/ui/ozone/platform/drm/host/drm_window_host.cc b/chromium/ui/ozone/platform/drm/host/drm_window_host.cc
index e1b181ce095..3bce7fcb511 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_window_host.cc
+++ b/chromium/ui/ozone/platform/drm/host/drm_window_host.cc
@@ -81,7 +81,7 @@ void DrmWindowHost::SetBounds(const gfx::Rect& bounds) {
SendBoundsChange();
}
-gfx::Rect DrmWindowHost::GetBounds() {
+gfx::Rect DrmWindowHost::GetBounds() const {
return bounds_;
}
diff --git a/chromium/ui/ozone/platform/drm/host/drm_window_host.h b/chromium/ui/ozone/platform/drm/host/drm_window_host.h
index 99bf436fd61..c0bd86abcd5 100644
--- a/chromium/ui/ozone/platform/drm/host/drm_window_host.h
+++ b/chromium/ui/ozone/platform/drm/host/drm_window_host.h
@@ -62,7 +62,7 @@ class DrmWindowHost : public PlatformWindow,
bool IsVisible() const override;
void PrepareForShutdown() override;
void SetBounds(const gfx::Rect& bounds) override;
- gfx::Rect GetBounds() override;
+ gfx::Rect GetBounds() const override;
void SetTitle(const base::string16& title) override;
void SetCapture() override;
void ReleaseCapture() override;
diff --git a/chromium/ui/ozone/platform/drm/host/host_drm_device.cc b/chromium/ui/ozone/platform/drm/host/host_drm_device.cc
index 627db7ce4f8..1c6c2b9ac58 100644
--- a/chromium/ui/ozone/platform/drm/host/host_drm_device.cc
+++ b/chromium/ui/ozone/platform/drm/host/host_drm_device.cc
@@ -12,6 +12,7 @@
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/task_runner.h"
+#include "base/threading/sequenced_task_runner_handle.h"
#include "base/threading/thread_task_runner_handle.h"
#include "mojo/public/cpp/bindings/pending_associated_remote.h"
#include "ui/display/types/display_snapshot.h"
@@ -139,7 +140,12 @@ void HostDrmDevice::GpuConfigureNativeDisplays(
base::flat_map<int64_t, bool> dummy_statuses;
for (const auto& config : config_requests)
dummy_statuses.insert(std::make_pair(config.id, false));
- std::move(callback).Run(dummy_statuses);
+
+ // Post this task to protect the callstack from accumulating too many
+ // recursive calls to ConfigureDisplaysTask::Run() in cases in which the GPU
+ // process crashes repeatedly.
+ base::SequencedTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(std::move(callback), dummy_statuses));
}
}
diff --git a/chromium/ui/ozone/platform/headless/headless_surface_factory.cc b/chromium/ui/ozone/platform/headless/headless_surface_factory.cc
index 4ecbd2c7900..b3cfb3cf344 100644
--- a/chromium/ui/ozone/platform/headless/headless_surface_factory.cc
+++ b/chromium/ui/ozone/platform/headless/headless_surface_factory.cc
@@ -14,6 +14,7 @@
#include "base/task/post_task.h"
#include "base/task/thread_pool.h"
#include "build/build_config.h"
+#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "ui/gfx/buffer_format_util.h"
@@ -72,8 +73,11 @@ class FileSurface : public SurfaceOzoneCanvas {
// SurfaceOzoneCanvas overrides:
void ResizeCanvas(const gfx::Size& viewport_size) override {
- surface_ = SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(
- viewport_size.width(), viewport_size.height()));
+ SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps();
+ surface_ = SkSurface::MakeRaster(
+ SkImageInfo::MakeN32Premul(viewport_size.width(),
+ viewport_size.height()),
+ &props);
}
SkCanvas* GetCanvas() override { return surface_->getCanvas(); }
void PresentCanvas(const gfx::Rect& damage) override {
@@ -150,13 +154,15 @@ class TestPixmap : public gfx::NativePixmap {
}
gfx::Size GetBufferSize() const override { return gfx::Size(); }
uint32_t GetUniqueId() const override { return 0; }
- bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
- int plane_z_order,
- gfx::OverlayTransform plane_transform,
- const gfx::Rect& display_bounds,
- const gfx::RectF& crop_rect,
- bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) override {
+ bool ScheduleOverlayPlane(
+ gfx::AcceleratedWidget widget,
+ int plane_z_order,
+ gfx::OverlayTransform plane_transform,
+ const gfx::Rect& display_bounds,
+ const gfx::RectF& crop_rect,
+ bool enable_blend,
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) override {
return true;
}
gfx::NativePixmapHandle ExportHandle() override {
diff --git a/chromium/ui/ozone/platform/scenic/BUILD.gn b/chromium/ui/ozone/platform/scenic/BUILD.gn
index 616316662ad..9cc209840a7 100644
--- a/chromium/ui/ozone/platform/scenic/BUILD.gn
+++ b/chromium/ui/ozone/platform/scenic/BUILD.gn
@@ -12,6 +12,8 @@ source_set("scenic") {
sources = [
"client_native_pixmap_factory_scenic.cc",
"client_native_pixmap_factory_scenic.h",
+ "overlay_manager_scenic.cc",
+ "overlay_manager_scenic.h",
"ozone_platform_scenic.cc",
"ozone_platform_scenic.h",
"scenic_gpu_host.cc",
@@ -36,6 +38,8 @@ source_set("scenic") {
"sysmem_buffer_collection.h",
"sysmem_buffer_manager.cc",
"sysmem_buffer_manager.h",
+ "sysmem_native_pixmap.cc",
+ "sysmem_native_pixmap.h",
]
defines = [
diff --git a/chromium/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc b/chromium/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc
index 6f65b910af1..c8fc7bc7f04 100644
--- a/chromium/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc
+++ b/chromium/ui/ozone/platform/scenic/client_native_pixmap_factory_scenic.cc
@@ -51,8 +51,9 @@ class ClientNativePixmapFuchsia : public gfx::ClientNativePixmap {
mapping_size_ = base::bits::Align(mapping_size_, page_size);
zx_status_t status =
- zx::vmar::root_self()->map(0, handle_.planes[0].vmo, 0, mapping_size_,
- ZX_VM_PERM_READ | ZX_VM_PERM_WRITE, &addr);
+ zx::vmar::root_self()->map(ZX_VM_PERM_READ | ZX_VM_PERM_WRITE, 0,
+ handle_.planes[0].vmo, 0, mapping_size_,
+ &addr);
if (status != ZX_OK) {
ZX_DLOG(ERROR, status) << "zx_vmar_map";
return false;
diff --git a/chromium/ui/ozone/platform/scenic/overlay_manager_scenic.cc b/chromium/ui/ozone/platform/scenic/overlay_manager_scenic.cc
new file mode 100644
index 00000000000..e8e4b816710
--- /dev/null
+++ b/chromium/ui/ozone/platform/scenic/overlay_manager_scenic.cc
@@ -0,0 +1,44 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/scenic/overlay_manager_scenic.h"
+
+#include "base/logging.h"
+#include "ui/ozone/platform/scenic/sysmem_native_pixmap.h"
+#include "ui/ozone/public/overlay_candidates_ozone.h"
+
+namespace ui {
+namespace {
+
+class OverlayCandidatesScenic : public OverlayCandidatesOzone {
+ public:
+ OverlayCandidatesScenic(gfx::AcceleratedWidget widget) : widget_(widget) {}
+
+ void CheckOverlaySupport(OverlaySurfaceCandidateList* candidates) override {
+ for (auto& candidate : *candidates) {
+ if (!candidate.native_pixmap)
+ continue;
+ SysmemNativePixmap* sysmem_native_pixmap =
+ reinterpret_cast<SysmemNativePixmap*>(candidate.native_pixmap.get());
+ candidate.overlay_handled =
+ sysmem_native_pixmap->SupportsOverlayPlane(widget_);
+ }
+ }
+
+ private:
+ const gfx::AcceleratedWidget widget_;
+};
+
+} // namespace
+
+OverlayManagerScenic::OverlayManagerScenic() {}
+
+OverlayManagerScenic::~OverlayManagerScenic() = default;
+
+std::unique_ptr<OverlayCandidatesOzone>
+OverlayManagerScenic::CreateOverlayCandidates(gfx::AcceleratedWidget widget) {
+ return std::make_unique<OverlayCandidatesScenic>(widget);
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/scenic/overlay_manager_scenic.h b/chromium/ui/ozone/platform/scenic/overlay_manager_scenic.h
new file mode 100644
index 00000000000..466469f1bec
--- /dev/null
+++ b/chromium/ui/ozone/platform/scenic/overlay_manager_scenic.h
@@ -0,0 +1,29 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_SCENIC_OVERLAY_MANAGER_SCENIC_H_
+#define UI_OZONE_PLATFORM_SCENIC_OVERLAY_MANAGER_SCENIC_H_
+
+#include <memory>
+
+#include "ui/ozone/public/overlay_manager_ozone.h"
+
+namespace ui {
+
+class OverlayManagerScenic : public OverlayManagerOzone {
+ public:
+ OverlayManagerScenic();
+ ~OverlayManagerScenic() override;
+
+ OverlayManagerScenic(const OverlayManagerScenic&) = delete;
+ OverlayManagerScenic& operator=(const OverlayManagerScenic&) = delete;
+
+ // OverlayManagerOzone implementation
+ std::unique_ptr<OverlayCandidatesOzone> CreateOverlayCandidates(
+ gfx::AcceleratedWidget widget) override;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_SCENIC_OVERLAY_MANAGER_SCENIC_H_
diff --git a/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
index b7c7dae3c40..35827691a17 100644
--- a/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
+++ b/chromium/ui/ozone/platform/scenic/ozone_platform_scenic.cc
@@ -15,6 +15,7 @@
#include "base/no_destructor.h"
#include "base/notreached.h"
#include "base/task/current_thread.h"
+#include "build/build_config.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "ui/base/cursor/cursor_factory.h"
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
@@ -25,6 +26,7 @@
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/common/stub_overlay_manager.h"
+#include "ui/ozone/platform/scenic/overlay_manager_scenic.h"
#include "ui/ozone/platform/scenic/scenic_gpu_host.h"
#include "ui/ozone/platform/scenic/scenic_gpu_service.h"
#include "ui/ozone/platform/scenic/scenic_surface_factory.h"
@@ -40,6 +42,10 @@
#include "ui/ozone/public/system_input_injector.h"
#include "ui/platform_window/platform_window_init_properties.h"
+#if defined(OS_FUCHSIA)
+#include "ui/platform_window/fuchsia/initialize_presenter_api_view.h"
+#endif
+
namespace ui {
namespace {
@@ -88,13 +94,14 @@ class OzonePlatformScenic : public OzonePlatform,
PlatformWindowDelegate* delegate,
PlatformWindowInitProperties properties) override {
BindInMainProcessIfNecessary();
+
+ // Allow tests to create a view themselves.
if (!properties.view_token.value) {
- NOTREACHED();
- return nullptr;
+ CHECK(properties.allow_null_view_token_for_test);
+ ui::fuchsia::InitializeViewTokenAndPresentView(&properties);
}
return std::make_unique<ScenicWindow>(window_manager_.get(), delegate,
- std::move(properties.view_token),
- std::move(properties.view_ref_pair));
+ std::move(properties));
}
const PlatformProperties& GetPlatformProperties() override {
@@ -165,6 +172,8 @@ class OzonePlatformScenic : public OzonePlatform,
// other end of the pipe will be attached through ScenicGpuService.
surface_factory_->Initialize(std::move(scenic_gpu_host_remote));
}
+
+ overlay_manager_ = std::make_unique<OverlayManagerScenic>();
}
void AddInterfaces(mojo::BinderMap* binders) override {
diff --git a/chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc b/chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc
index 15e00dcea3a..a9709908586 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_overlay_view.cc
@@ -8,6 +8,7 @@
#include <lib/ui/scenic/cpp/view_token_pair.h>
#include "base/fuchsia/fuchsia_logging.h"
+#include "ui/ozone/platform/scenic/scenic_surface_factory.h"
namespace ui {
@@ -28,8 +29,10 @@ fuchsia::ui::views::ViewToken CreateViewToken(
} // namespace
ScenicOverlayView::ScenicOverlayView(
- scenic::SessionPtrAndListenerRequest session_and_listener_request)
+ scenic::SessionPtrAndListenerRequest session_and_listener_request,
+ ScenicSurfaceFactory* scenic_surface_factory)
: scenic_session_(std::move(session_and_listener_request)),
+ scenic_surface_factory_(scenic_surface_factory),
view_(&scenic_session_,
CreateViewToken(&view_holder_token_),
kSessionDebugName) {
@@ -39,12 +42,21 @@ ScenicOverlayView::ScenicOverlayView(
});
}
-ScenicOverlayView::~ScenicOverlayView() = default;
+ScenicOverlayView::~ScenicOverlayView() {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+ ScenicSurface* surface = scenic_surface_factory_->GetSurface(widget_);
+ if (surface) {
+ surface->AssertBelongsToCurrentThread();
+ surface->RemoveOverlayView(buffer_collection_id_);
+ }
+}
void ScenicOverlayView::Initialize(
fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken>
collection_token) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
uint32_t image_pipe_id = scenic_session_.AllocResourceId();
scenic_session_.Enqueue(
scenic::NewCreateImagePipe2Cmd(image_pipe_id, image_pipe_.NewRequest()));
@@ -52,12 +64,12 @@ void ScenicOverlayView::Initialize(
ZX_LOG(FATAL, status) << "ImagePipe disconnected";
});
- scenic::Material image_material(&scenic_session_);
- image_material.SetTexture(image_pipe_id);
+ image_material_ = std::make_unique<scenic::Material>(&scenic_session_);
+ image_material_->SetTexture(image_pipe_id);
scenic::ShapeNode shape(&scenic_session_);
shape.SetShape(scenic::Rectangle(&scenic_session_, 1.f, 1.f));
- shape.SetMaterial(image_material);
+ shape.SetMaterial(*image_material_);
view_.AddChild(shape);
scenic_session_.ReleaseResource(image_pipe_id);
@@ -71,7 +83,74 @@ void ScenicOverlayView::Initialize(
// TODO(emircan): Consider using one ImagePipe per video decoder instead.
image_pipe_->AddBufferCollection(kImagePipeBufferCollectionId,
std::move(collection_token));
- LOG(ERROR) << __func__;
+}
+
+bool ScenicOverlayView::AddImages(uint32_t buffer_count,
+ const gfx::Size& size) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+ fuchsia::sysmem::ImageFormat_2 image_format = {};
+ image_format.coded_width = size.width();
+ image_format.coded_height = size.height();
+ for (uint32_t i = 0; i < buffer_count; ++i) {
+ // Image id cannot be 0, so add 1 to all buffer indices.
+ image_pipe_->AddImage(i + 1, kImagePipeBufferCollectionId, i, image_format);
+ }
+ return true;
+}
+
+bool ScenicOverlayView::PresentImage(uint32_t buffer_index,
+ std::vector<zx::event> acquire_fences,
+ std::vector<zx::event> release_fences) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+ image_pipe_->PresentImage(buffer_index + 1, zx_clock_get_monotonic(),
+ std::move(acquire_fences),
+ std::move(release_fences), [](auto) {});
+ return true;
+}
+
+void ScenicOverlayView::SetBlendMode(bool enable_blend) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+ if (enable_blend_ == enable_blend)
+ return;
+
+ enable_blend_ = enable_blend;
+ // Setting alpha as |255| marks the image as opaque and no content below would
+ // be seen. Anything lower than 255 allows blending.
+ image_material_->SetColor(255, 255, 255, enable_blend ? 254 : 255);
+ scenic_session_.Present2(
+ /*requested_presentation_time=*/0,
+ /*requested_prediction_span=*/0,
+ [](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
+}
+
+bool ScenicOverlayView::CanAttachToAcceleratedWidget(
+ gfx::AcceleratedWidget widget) {
+ return view_holder_token_.value.is_valid() || (widget_ == widget);
+}
+
+bool ScenicOverlayView::AttachToScenicSurface(
+ gfx::AcceleratedWidget widget,
+ gfx::SysmemBufferCollectionId id) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+ if (widget_ != gfx::kNullAcceleratedWidget && widget_ == widget)
+ return true;
+
+ if (!view_holder_token_.value.is_valid()) {
+ DLOG(ERROR) << "ViewHolder is already attached.";
+ return false;
+ }
+
+ buffer_collection_id_ = id;
+ widget_ = widget;
+
+ ScenicSurface* surface = scenic_surface_factory_->GetSurface(widget_);
+ DCHECK(surface);
+ return surface->PresentOverlayView(buffer_collection_id_,
+ std::move(view_holder_token_));
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/scenic/scenic_overlay_view.h b/chromium/ui/ozone/platform/scenic/scenic_overlay_view.h
index ee32472ea9d..c2c25b4c0f5 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_overlay_view.h
+++ b/chromium/ui/ozone/platform/scenic/scenic_overlay_view.h
@@ -8,8 +8,11 @@
#include <fuchsia/ui/scenic/cpp/fidl.h>
#include <lib/ui/scenic/cpp/resources.h>
#include <lib/ui/scenic/cpp/session.h>
+#include <memory>
#include "base/threading/thread_checker.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/ozone/platform/scenic/scenic_surface.h"
namespace ui {
@@ -21,19 +24,51 @@ namespace ui {
class ScenicOverlayView {
public:
ScenicOverlayView(
- scenic::SessionPtrAndListenerRequest session_and_listener_request);
+ scenic::SessionPtrAndListenerRequest session_and_listener_request,
+ ScenicSurfaceFactory* scenic_surface_factory);
~ScenicOverlayView();
ScenicOverlayView(const ScenicOverlayView&) = delete;
ScenicOverlayView& operator=(const ScenicOverlayView&) = delete;
+ // Calls ImagePipe2::AddBufferCollection() using |collection_token|. All
+ // |image_pipe| interactions in this class is then associated with this
+ // BufferCollection.
void Initialize(fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken>
collection_token);
+ // Calls ImagePipe2::AddImage() on |image_pipe_| for all of |buffer_count|
+ // images from the initialized BufferCollection with the specified |size|.
+ bool AddImages(uint32_t buffer_count, const gfx::Size& size);
+
+ // Calls ImagePipe2::PresentImage() on |image_pipe_| for the image
+ // corresponding to |buffer_index| from the initialized BufferCollection.
+ bool PresentImage(uint32_t buffer_index,
+ std::vector<zx::event> acquire_fences,
+ std::vector<zx::event> release_fences);
+
+ // If |enable_blend| is true, sets |image_pipe_| as non-opaque.
+ void SetBlendMode(bool enable_blend);
+
+ // Return true if |view_holder_token_| can be attached to a surface from
+ // |widget|.
+ bool CanAttachToAcceleratedWidget(gfx::AcceleratedWidget widget);
+
+ // Return true if |view_holder_token_| is attached to the scene graph of
+ // surface corresponding to |widget|.
+ bool AttachToScenicSurface(gfx::AcceleratedWidget widget,
+ gfx::SysmemBufferCollectionId id);
+
private:
scenic::Session scenic_session_;
+ ScenicSurfaceFactory* const scenic_surface_factory_;
fuchsia::ui::views::ViewHolderToken view_holder_token_;
scenic::View view_;
fuchsia::images::ImagePipe2Ptr image_pipe_;
+ std::unique_ptr<scenic::Material> image_material_;
+
+ bool enable_blend_ = false;
+ gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget;
+ gfx::SysmemBufferCollectionId buffer_collection_id_;
THREAD_CHECKER(thread_checker_);
};
diff --git a/chromium/ui/ozone/platform/scenic/scenic_screen.cc b/chromium/ui/ozone/platform/scenic/scenic_screen.cc
index 170db836e70..a5d78fa2c91 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_screen.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_screen.cc
@@ -49,6 +49,9 @@ void ScenicScreen::OnWindowBoundsChanged(int32_t window_id, gfx::Rect bounds) {
void ScenicScreen::OnWindowMetrics(int32_t window_id,
float device_pixel_ratio) {
+ if (display::Display::HasForceDeviceScaleFactor())
+ return;
+
auto display_it = std::find_if(displays_.begin(), displays_.end(),
[window_id](display::Display& display) {
return display.id() == window_id;
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface.cc b/chromium/ui/ozone/platform/scenic/scenic_surface.cc
index dc7fd2ec10f..d8ea5ddc699 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface.cc
@@ -8,26 +8,61 @@
#include <lib/ui/scenic/cpp/view_token_pair.h>
#include <lib/zx/eventpair.h>
+#include "base/numerics/math_constants.h"
#include "ui/ozone/platform/scenic/scenic_gpu_host.h"
#include "ui/ozone/platform/scenic/scenic_surface_factory.h"
namespace ui {
+namespace {
+
+// Scenic has z-fighting problems in 3D API, so we add tiny z plane increments
+// to elevate content. ViewProperties set by ScenicWindow sets z-plane to
+// [-0.5f, 0.5f] range, so 0.01f is small enough to make a difference.
+constexpr float kElevationStep = 0.01f;
+
+// Converts OverlayTransform enum to angle in radians.
+float OverlayTransformToRadians(gfx::OverlayTransform plane_transform) {
+ switch (plane_transform) {
+ case gfx::OVERLAY_TRANSFORM_NONE:
+ case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL:
+ case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL:
+ return 0;
+ case gfx::OVERLAY_TRANSFORM_ROTATE_90:
+ return base::kPiFloat * .5f;
+ case gfx::OVERLAY_TRANSFORM_ROTATE_180:
+ return base::kPiFloat;
+ case gfx::OVERLAY_TRANSFORM_ROTATE_270:
+ return base::kPiFloat * 1.5f;
+ case gfx::OVERLAY_TRANSFORM_INVALID:
+ NOTREACHED();
+ return 0;
+ }
+ NOTREACHED();
+ return 0;
+}
+
+} // namespace
+
ScenicSurface::ScenicSurface(
ScenicSurfaceFactory* scenic_surface_factory,
gfx::AcceleratedWidget window,
scenic::SessionPtrAndListenerRequest sesion_and_listener_request)
: scenic_session_(std::move(sesion_and_listener_request)),
- shape_(&scenic_session_),
+ main_shape_(&scenic_session_),
+ main_material_(&scenic_session_),
scenic_surface_factory_(scenic_surface_factory),
window_(window) {
// Setting alpha to 0 makes this transparent.
scenic::Material transparent_material(&scenic_session_);
transparent_material.SetColor(0, 0, 0, 0);
- shape_.SetShape(scenic::Rectangle(&scenic_session_, 1.f, 1.f));
- shape_.SetMaterial(transparent_material);
+ main_shape_.SetShape(scenic::Rectangle(&scenic_session_, 1.f, 1.f));
+ main_shape_.SetMaterial(transparent_material);
+ main_shape_.SetEventMask(fuchsia::ui::gfx::kMetricsEventMask);
scenic_surface_factory->AddSurface(window, this);
scenic_session_.SetDebugName("Chromium ScenicSurface");
+ scenic_session_.set_event_handler(
+ fit::bind_member(this, &ScenicSurface::OnScenicEvents));
}
ScenicSurface::~ScenicSurface() {
@@ -35,15 +70,39 @@ ScenicSurface::~ScenicSurface() {
scenic_surface_factory_->RemoveSurface(window_);
}
+ScenicSurface::OverlayViewInfo::OverlayViewInfo(scenic::ViewHolder holder,
+ scenic::EntityNode node)
+ : view_holder(std::move(holder)), entity_node(std::move(node)) {}
+
+void ScenicSurface::OnScenicEvents(
+ std::vector<fuchsia::ui::scenic::Event> events) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ for (const auto& event : events) {
+ DCHECK(event.is_gfx());
+ switch (event.gfx().Which()) {
+ case fuchsia::ui::gfx::Event::kMetrics: {
+ DCHECK(event.gfx().metrics().node_id == main_shape_.id());
+ // This is enough to track size because |main_shape_| is 1x1.
+ const auto& metrics = event.gfx().metrics().metrics;
+ main_shape_size_.set_width(metrics.scale_x);
+ main_shape_size_.set_height(metrics.scale_y);
+ UpdateViewHolderScene();
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
bool ScenicSurface::SetTextureToNewImagePipe(
fidl::InterfaceRequest<fuchsia::images::ImagePipe2> image_pipe_request) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
uint32_t image_pipe_id = scenic_session_.AllocResourceId();
scenic_session_.Enqueue(scenic::NewCreateImagePipe2Cmd(
image_pipe_id, std::move(image_pipe_request)));
- scenic::Material image_material(&scenic_session_);
- image_material.SetTexture(image_pipe_id);
- shape_.SetMaterial(image_material);
+ main_material_.SetTexture(image_pipe_id);
+ main_shape_.SetMaterial(main_material_);
scenic_session_.ReleaseResource(image_pipe_id);
scenic_session_.Present2(
/*requested_presentation_time=*/0,
@@ -54,9 +113,83 @@ bool ScenicSurface::SetTextureToNewImagePipe(
void ScenicSurface::SetTextureToImage(const scenic::Image& image) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
- scenic::Material image_material(&scenic_session_);
- image_material.SetTexture(image);
- shape_.SetMaterial(image_material);
+ main_material_.SetTexture(image);
+ main_shape_.SetMaterial(main_material_);
+}
+
+bool ScenicSurface::PresentOverlayView(
+ gfx::SysmemBufferCollectionId id,
+ fuchsia::ui::views::ViewHolderToken view_holder_token) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ scenic::ViewHolder view_holder(&scenic_session_, std::move(view_holder_token),
+ "OverlayViewHolder");
+ scenic::EntityNode entity_node(&scenic_session_);
+ fuchsia::ui::gfx::ViewProperties view_properties;
+ view_properties.bounding_box = {{-0.5f, -0.5f, 0.f}, {0.5f, 0.5f, 0.f}};
+ view_properties.focus_change = false;
+ view_holder.SetViewProperties(std::move(view_properties));
+ view_holder.SetHitTestBehavior(fuchsia::ui::gfx::HitTestBehavior::kSuppress);
+
+ entity_node.AddChild(view_holder);
+ parent_->AddChild(entity_node);
+ scenic_session_.Present2(
+ /*requested_presentation_time=*/0,
+ /*requested_prediction_span=*/0,
+ [](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
+
+ DCHECK(!overlays_.count(id));
+ overlays_.emplace(
+ std::piecewise_construct, std::forward_as_tuple(id),
+ std::forward_as_tuple(std::move(view_holder), std::move(entity_node)));
+
+ return true;
+}
+
+bool ScenicSurface::UpdateOverlayViewPosition(
+ gfx::SysmemBufferCollectionId id,
+ int plane_z_order,
+ const gfx::Rect& display_bounds,
+ const gfx::RectF& crop_rect,
+ gfx::OverlayTransform plane_transform,
+ std::vector<zx::event> acquire_fences) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ DCHECK(overlays_.count(id));
+ auto& overlay_view_info = overlays_.at(id);
+
+ if (overlay_view_info.plane_z_order == plane_z_order &&
+ overlay_view_info.display_bounds == display_bounds &&
+ overlay_view_info.crop_rect == crop_rect &&
+ overlay_view_info.plane_transform == plane_transform) {
+ return false;
+ }
+
+ overlay_view_info.plane_z_order = plane_z_order;
+ overlay_view_info.display_bounds = display_bounds;
+ overlay_view_info.crop_rect = crop_rect;
+ overlay_view_info.plane_transform = plane_transform;
+
+ for (auto& fence : acquire_fences)
+ scenic_session_.EnqueueAcquireFence(std::move(fence));
+
+ // TODO(crbug.com/1143514): Only queue commands for the affected overlays
+ // instead of the whole scene.
+ UpdateViewHolderScene();
+
+ return true;
+}
+
+bool ScenicSurface::RemoveOverlayView(gfx::SysmemBufferCollectionId id) {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+ auto it = overlays_.find(id);
+ DCHECK(it != overlays_.end());
+ parent_->DetachChild(it->second.entity_node);
+ scenic_session_.Present2(
+ /*requested_presentation_time=*/0,
+ /*requested_prediction_span=*/0,
+ [](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
+ overlays_.erase(it);
+ return true;
}
mojo::PlatformHandle ScenicSurface::CreateView() {
@@ -68,7 +201,7 @@ mojo::PlatformHandle ScenicSurface::CreateView() {
auto tokens = scenic::ViewTokenPair::New();
parent_ = std::make_unique<scenic::View>(
&scenic_session_, std::move(tokens.view_token), "chromium surface");
- parent_->AddChild(shape_);
+ parent_->AddChild(main_shape_);
scenic_session_.Present2(
/*requested_presentation_time=*/0,
@@ -77,4 +210,74 @@ mojo::PlatformHandle ScenicSurface::CreateView() {
return mojo::PlatformHandle(std::move(tokens.view_holder_token.value));
}
+void ScenicSurface::UpdateViewHolderScene() {
+ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+ if (overlays_.empty())
+ return;
+
+ // |plane_z_order| for main surface is 0.
+ int min_z_order = 0;
+ for (const auto& overlay : overlays_) {
+ min_z_order = std::min(overlay.second.plane_z_order, min_z_order);
+ }
+ for (auto& overlay : overlays_) {
+ auto& info = overlay.second;
+
+ // Apply view bound clipping around the ImagePipe that has size 1x1 and
+ // centered at (0, 0).
+ fuchsia::ui::gfx::ViewProperties view_properties;
+ const float left_bound = -0.5f + info.crop_rect.x();
+ const float top_bound = -0.5f + info.crop_rect.y();
+ view_properties.bounding_box = {{left_bound, top_bound, 0.f},
+ {left_bound + info.crop_rect.width(),
+ top_bound + info.crop_rect.height(), 0.f}};
+ view_properties.focus_change = false;
+ info.view_holder.SetViewProperties(std::move(view_properties));
+
+ // We receive |display_bounds| in screen coordinates. Convert them to fit
+ // 1x1 View, which is later scaled up by the browser process.
+ float scaled_width = info.display_bounds.width() /
+ (info.crop_rect.width() * main_shape_size_.width());
+ float scaled_height = info.display_bounds.height() /
+ (info.crop_rect.height() * main_shape_size_.height());
+ const float scaled_x = info.display_bounds.x() / main_shape_size_.width();
+ const float scaled_y = info.display_bounds.y() / main_shape_size_.height();
+
+ // Position ImagePipe based on the display bounds given.
+ info.entity_node.SetTranslation(
+ -0.5f + scaled_x + scaled_width / 2,
+ -0.5f + scaled_y + scaled_height / 2,
+ (min_z_order - info.plane_z_order) * kElevationStep);
+
+ // Apply rotation if given. Scenic expects rotation passed as Quaternion.
+ const float angle = OverlayTransformToRadians(info.plane_transform);
+ info.entity_node.SetRotation(
+ {0.f, 0.f, sinf(angle * .5f), cosf(angle * .5f)});
+
+ // Scenic applies scaling before rotation.
+ if (info.plane_transform == gfx::OVERLAY_TRANSFORM_ROTATE_90 ||
+ info.plane_transform == gfx::OVERLAY_TRANSFORM_ROTATE_270) {
+ std::swap(scaled_width, scaled_height);
+ }
+
+ // Scenic expects flip as negative scaling.
+ if (info.plane_transform == gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL) {
+ scaled_width = -scaled_width;
+ } else if (info.plane_transform == gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL) {
+ scaled_height = -scaled_height;
+ }
+
+ // Scale ImagePipe based on the display bounds and clip rect given.
+ info.entity_node.SetScale(scaled_width, scaled_height, 1.f);
+ }
+
+ main_material_.SetColor(255, 255, 255, 0 > min_z_order ? 254 : 255);
+ main_shape_.SetTranslation(0.f, 0.f, min_z_order * kElevationStep);
+
+ scenic_session_.Present2(
+ /*requested_presentation_time=*/0,
+ /*requested_prediction_span=*/0,
+ [](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface.h b/chromium/ui/ozone/platform/scenic/scenic_surface.h
index 3264a594fc0..148074adcdc 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface.h
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface.h
@@ -12,7 +12,12 @@
#include "base/macros.h"
#include "base/threading/thread_checker.h"
#include "mojo/public/cpp/platform/platform_handle.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/geometry/size_f.h"
+#include "ui/gfx/native_pixmap_handle.h"
#include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/overlay_transform.h"
#include "ui/ozone/public/platform_window_surface.h"
namespace ui {
@@ -42,10 +47,30 @@ class ScenicSurface : public ui::PlatformWindowSurface {
// Sets the texture of the surface to an image resource.
void SetTextureToImage(const scenic::Image& image);
+ // Presents a ViewHolder that is corresponding to the overlay content coming
+ // from BufferCollection specified by |id|.
+ bool PresentOverlayView(
+ gfx::SysmemBufferCollectionId id,
+ fuchsia::ui::views::ViewHolderToken view_holder_token);
+
+ // Updates positioning of ViewHolder specified by |id|. Note that it requires
+ // |id| to be added by PresentOverlayView() before.
+ bool UpdateOverlayViewPosition(gfx::SysmemBufferCollectionId id,
+ int plane_z_order,
+ const gfx::Rect& display_bounds,
+ const gfx::RectF& crop_rect,
+ gfx::OverlayTransform plane_transform,
+ std::vector<zx::event> acquire_fences);
+
+ // Remove ViewHolder specified by |id|.
+ bool RemoveOverlayView(gfx::SysmemBufferCollectionId id);
+
// Creates a View for this surface, and returns a ViewHolderToken handle
// that can be used to attach it into a scene graph.
mojo::PlatformHandle CreateView();
+ void OnScenicEvents(std::vector<fuchsia::ui::scenic::Event> events);
+
void AssertBelongsToCurrentThread() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
}
@@ -56,13 +81,34 @@ class ScenicSurface : public ui::PlatformWindowSurface {
}
private:
+ void UpdateViewHolderScene();
+
scenic::Session scenic_session_;
std::unique_ptr<scenic::View> parent_;
- scenic::ShapeNode shape_;
+
+ // Scenic resources used for the primary plane, that is not an overlay.
+ scenic::ShapeNode main_shape_;
+ scenic::Material main_material_;
+ gfx::SizeF main_shape_size_;
ScenicSurfaceFactory* const scenic_surface_factory_;
const gfx::AcceleratedWidget window_;
+ struct OverlayViewInfo {
+ OverlayViewInfo(scenic::ViewHolder holder, scenic::EntityNode node);
+
+ scenic::ViewHolder view_holder;
+ scenic::EntityNode entity_node;
+ int plane_z_order = 0;
+ gfx::Rect display_bounds;
+ gfx::RectF crop_rect;
+ gfx::OverlayTransform plane_transform;
+ };
+ std::unordered_map<gfx::SysmemBufferCollectionId,
+ OverlayViewInfo,
+ base::UnguessableTokenHash>
+ overlays_;
+
THREAD_CHECKER(thread_checker_);
DISALLOW_COPY_AND_ASSIGN(ScenicSurface);
diff --git a/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc b/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
index ba0b5e7a2da..d1e03bbb990 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_surface_factory.cc
@@ -271,7 +271,9 @@ void ScenicSurfaceFactory::RemoveSurface(gfx::AcceleratedWidget widget) {
ScenicSurface* ScenicSurfaceFactory::GetSurface(gfx::AcceleratedWidget widget) {
base::AutoLock lock(surface_lock_);
auto it = surface_map_.find(widget);
- DCHECK(it != surface_map_.end());
+ if (it == surface_map_.end())
+ return nullptr;
+
ScenicSurface* surface = it->second;
surface->AssertBelongsToCurrentThread();
return surface;
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window.cc b/chromium/ui/ozone/platform/scenic/scenic_window.cc
index 81cafe89676..330fe7de65f 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_window.cc
@@ -23,21 +23,21 @@ namespace ui {
ScenicWindow::ScenicWindow(ScenicWindowManager* window_manager,
PlatformWindowDelegate* delegate,
- fuchsia::ui::views::ViewToken view_token,
- scenic::ViewRefPair view_ref_pair)
+ PlatformWindowInitProperties properties)
: manager_(window_manager),
delegate_(delegate),
window_id_(manager_->AddWindow(this)),
event_dispatcher_(this),
scenic_session_(manager_->GetScenic()),
view_(&scenic_session_,
- std::move(view_token),
- std::move(view_ref_pair.control_ref),
- std::move(view_ref_pair.view_ref),
+ std::move(std::move(properties.view_token)),
+ std::move(properties.view_ref_pair.control_ref),
+ std::move(properties.view_ref_pair.view_ref),
"chromium window"),
node_(&scenic_session_),
input_node_(&scenic_session_),
- render_node_(&scenic_session_) {
+ render_node_(&scenic_session_),
+ bounds_(properties.bounds) {
scenic_session_.set_error_handler(
fit::bind_member(this, &ScenicWindow::OnScenicError));
scenic_session_.set_event_handler(
@@ -83,13 +83,13 @@ void ScenicWindow::AttachSurfaceView(
[](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
}
-gfx::Rect ScenicWindow::GetBounds() {
- return gfx::Rect(size_pixels_);
+gfx::Rect ScenicWindow::GetBounds() const {
+ return bounds_;
}
void ScenicWindow::SetBounds(const gfx::Rect& bounds) {
- // View dimensions are controlled by the containing view, it's not possible to
- // set them here.
+ // This path should only be reached in tests.
+ bounds_ = bounds;
}
void ScenicWindow::SetTitle(const base::string16& title) {
@@ -97,6 +97,11 @@ void ScenicWindow::SetTitle(const base::string16& title) {
}
void ScenicWindow::Show(bool inactive) {
+ if (visible_)
+ return;
+
+ visible_ = true;
+
view_.AddChild(node_);
// Call Present2() to ensure that the scenic session commands are processed,
@@ -108,6 +113,10 @@ void ScenicWindow::Show(bool inactive) {
}
void ScenicWindow::Hide() {
+ if (!visible_)
+ return;
+
+ visible_ = false;
node_.Detach();
}
@@ -155,6 +164,7 @@ void ScenicWindow::Restore() {
}
PlatformWindowState ScenicWindow::GetPlatformWindowState() const {
+ NOTIMPLEMENTED();
return PlatformWindowState::kNormal;
}
@@ -205,13 +215,12 @@ void ScenicWindow::SizeConstraintsChanged() {
void ScenicWindow::UpdateSize() {
gfx::SizeF scaled = ScaleSize(size_dips_, device_pixel_ratio_);
- size_pixels_ = gfx::Size(ceilf(scaled.width()), ceilf(scaled.height()));
- gfx::Rect size_rect(size_pixels_);
+ bounds_ = gfx::Rect(gfx::Size(ceilf(scaled.width()), ceilf(scaled.height())));
// Update this window's Screen's dimensions to match the new size.
ScenicScreen* screen = manager_->screen();
if (screen)
- screen->OnWindowBoundsChanged(window_id_, size_rect);
+ screen->OnWindowBoundsChanged(window_id_, bounds_);
// Translate the node by half of the view dimensions to put it in the center
// of the view.
@@ -233,7 +242,7 @@ void ScenicWindow::UpdateSize() {
/*requested_prediction_span=*/0,
[](fuchsia::scenic::scheduling::FuturePresentationTimes info) {});
- delegate_->OnBoundsChanged(size_rect);
+ delegate_->OnBoundsChanged(bounds_);
}
void ScenicWindow::OnScenicError(zx_status_t status) {
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window.h b/chromium/ui/ozone/platform/scenic/scenic_window.h
index 2edac2d4e7e..2981db6cde8 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window.h
+++ b/chromium/ui/ozone/platform/scenic/scenic_window.h
@@ -24,6 +24,7 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/platform_window/platform_window.h"
#include "ui/platform_window/platform_window_delegate.h"
+#include "ui/platform_window/platform_window_init_properties.h"
namespace ui {
@@ -39,8 +40,7 @@ class COMPONENT_EXPORT(OZONE) ScenicWindow
// identify it when calling out to other services (e.g. the SemanticsManager).
ScenicWindow(ScenicWindowManager* window_manager,
PlatformWindowDelegate* delegate,
- fuchsia::ui::views::ViewToken view_token,
- scenic::ViewRefPair view_ref_pair);
+ PlatformWindowInitProperties properties);
~ScenicWindow() override;
scenic::Session* scenic_session() { return &scenic_session_; }
@@ -50,7 +50,7 @@ class COMPONENT_EXPORT(OZONE) ScenicWindow
void AttachSurfaceView(fuchsia::ui::views::ViewHolderToken token);
// PlatformWindow implementation.
- gfx::Rect GetBounds() override;
+ gfx::Rect GetBounds() const override;
void SetBounds(const gfx::Rect& bounds) override;
void SetTitle(const base::string16& title) override;
void Show(bool inactive) override;
@@ -128,8 +128,13 @@ class COMPONENT_EXPORT(OZONE) ScenicWindow
// Current view size in DIPs.
gfx::SizeF size_dips_;
- // Current view size in device pixels.
- gfx::Size size_pixels_;
+ // Current view size in device pixels. The size is set to
+ // |PlatformWindowInitProperties.bounds.size()| value until Show() is called
+ // for the first time. After that the size is set to the size of the
+ // corresponding Scenic view.
+ gfx::Rect bounds_;
+
+ bool visible_ = false;
DISALLOW_COPY_AND_ASSIGN(ScenicWindow);
};
diff --git a/chromium/ui/ozone/platform/scenic/scenic_window_canvas.cc b/chromium/ui/ozone/platform/scenic/scenic_window_canvas.cc
index 14ef76692c8..cfa7be67903 100644
--- a/chromium/ui/ozone/platform/scenic/scenic_window_canvas.cc
+++ b/chromium/ui/ozone/platform/scenic/scenic_window_canvas.cc
@@ -9,6 +9,7 @@
#include "base/fuchsia/fuchsia_logging.h"
#include "base/memory/read_only_shared_memory_region.h"
#include "base/memory/writable_shared_memory_region.h"
+#include "skia/ext/legacy_display_globals.h"
#include "ui/gfx/geometry/size_f.h"
#include "ui/gfx/skia_util.h"
#include "ui/gfx/vsync_provider.h"
@@ -48,9 +49,10 @@ void ScenicWindowCanvas::Frame::Initialize(gfx::Size size,
scenic_memory = std::make_unique<scenic::Memory>(
scenic, memory_handle.PassPlatformHandle(), buffer_size,
fuchsia::images::MemoryType::HOST_MEMORY);
+ SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps();
surface = SkSurface::MakeRasterDirect(
SkImageInfo::MakeN32Premul(size.width(), size.height()),
- memory_mapping.memory(), bytes_per_row);
+ memory_mapping.memory(), bytes_per_row, &props);
dirty_region.setRect(gfx::RectToSkIRect(gfx::Rect(size)));
}
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
index e84f242d08e..9487bcaea42 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.cc
@@ -6,78 +6,17 @@
#include "base/bits.h"
#include "base/fuchsia/fuchsia_logging.h"
+#include "build/build_config.h"
#include "gpu/vulkan/vulkan_device_queue.h"
#include "gpu/vulkan/vulkan_function_pointers.h"
#include "ui/gfx/buffer_format_util.h"
-#include "ui/gfx/native_pixmap.h"
#include "ui/ozone/platform/scenic/scenic_surface_factory.h"
+#include "ui/ozone/platform/scenic/sysmem_native_pixmap.h"
namespace ui {
namespace {
-class SysmemNativePixmap : public gfx::NativePixmap {
- public:
- SysmemNativePixmap(scoped_refptr<SysmemBufferCollection> collection,
- gfx::NativePixmapHandle handle)
- : collection_(collection), handle_(std::move(handle)) {}
-
- bool AreDmaBufFdsValid() const override { return false; }
- int GetDmaBufFd(size_t plane) const override {
- NOTREACHED();
- return -1;
- }
- uint32_t GetDmaBufPitch(size_t plane) const override {
- NOTREACHED();
- return 0u;
- }
- size_t GetDmaBufOffset(size_t plane) const override {
- NOTREACHED();
- return 0u;
- }
- size_t GetDmaBufPlaneSize(size_t plane) const override {
- NOTREACHED();
- return 0;
- }
- size_t GetNumberOfPlanes() const override {
- NOTREACHED();
- return 0;
- }
- uint64_t GetBufferFormatModifier() const override {
- NOTREACHED();
- return 0;
- }
-
- gfx::BufferFormat GetBufferFormat() const override {
- return collection_->format();
- }
- gfx::Size GetBufferSize() const override { return collection_->size(); }
- uint32_t GetUniqueId() const override { return 0; }
- bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
- int plane_z_order,
- gfx::OverlayTransform plane_transform,
- const gfx::Rect& display_bounds,
- const gfx::RectF& crop_rect,
- bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) override {
- NOTIMPLEMENTED();
-
- return false;
- }
- gfx::NativePixmapHandle ExportHandle() override {
- return gfx::CloneHandleForIPC(handle_);
- }
-
- private:
- ~SysmemNativePixmap() override = default;
-
- // Keep reference to the collection to make sure it outlives the pixmap.
- scoped_refptr<SysmemBufferCollection> collection_;
- gfx::NativePixmapHandle handle_;
-
- DISALLOW_COPY_AND_ASSIGN(SysmemNativePixmap);
-};
-
size_t RoundUp(size_t value, size_t alignment) {
return ((value + alignment - 1) / alignment) * alignment;
}
@@ -90,6 +29,12 @@ VkFormat VkFormatForBufferFormat(gfx::BufferFormat buffer_format) {
case gfx::BufferFormat::YUV_420_BIPLANAR:
return VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ case gfx::BufferFormat::R_8:
+ return VK_FORMAT_R8_UNORM;
+
+ case gfx::BufferFormat::RG_88:
+ return VK_FORMAT_R8G8_UNORM;
+
case gfx::BufferFormat::BGRA_8888:
case gfx::BufferFormat::BGRX_8888:
return VK_FORMAT_B8G8R8A8_UNORM;
@@ -110,16 +55,42 @@ VkFormat VkFormatForBufferFormat(gfx::BufferFormat buffer_format) {
bool SysmemBufferCollection::IsNativePixmapConfigSupported(
gfx::BufferFormat format,
gfx::BufferUsage usage) {
- bool format_supported = format == gfx::BufferFormat::YUV_420_BIPLANAR ||
- format == gfx::BufferFormat::RGBA_8888 ||
- format == gfx::BufferFormat::RGBX_8888 ||
- format == gfx::BufferFormat::BGRA_8888 ||
- format == gfx::BufferFormat::BGRX_8888;
- bool usage_supported = usage == gfx::BufferUsage::SCANOUT ||
- usage == gfx::BufferUsage::SCANOUT_CPU_READ_WRITE ||
- usage == gfx::BufferUsage::GPU_READ_CPU_READ_WRITE ||
- usage == gfx::BufferUsage::GPU_READ;
- return format_supported && usage_supported;
+ switch (format) {
+ case gfx::BufferFormat::YUV_420_BIPLANAR:
+ case gfx::BufferFormat::R_8:
+ case gfx::BufferFormat::RG_88:
+ case gfx::BufferFormat::RGBA_8888:
+ case gfx::BufferFormat::RGBX_8888:
+ case gfx::BufferFormat::BGRA_8888:
+ case gfx::BufferFormat::BGRX_8888:
+ break;
+
+ default:
+ return false;
+ }
+ switch (usage) {
+ case gfx::BufferUsage::SCANOUT:
+ case gfx::BufferUsage::GPU_READ:
+ break;
+
+ case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+ case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
+#if defined(ARCH_CPU_X86_64)
+ // SwiftShader currently doesn't support liner image layouts (b/171299814)
+ // required for images accessed by CPU, so these formats cannot be
+ // supported with Goldfish Vulkan drivers running under emulator.It's not
+ // straightforward to detect format support here because this code runs in
+ // the renderer process. Disable these formats for all X64 devices for
+ // now.
+ // TODO(crbug.com/1141538): remove this workaround.
+ return false;
+#endif
+ break;
+
+ default:
+ return false;
+ }
+ return true;
}
SysmemBufferCollection::SysmemBufferCollection()
@@ -169,7 +140,9 @@ bool SysmemBufferCollection::Initialize(
is_protected_ = force_protected;
if (register_with_image_pipe) {
- scenic_overlay_view_.emplace(scenic_surface_factory->CreateScenicSession());
+ scenic_overlay_view_.emplace(scenic_surface_factory->CreateScenicSession(),
+ scenic_surface_factory);
+ surface_factory_ = scenic_surface_factory;
}
fuchsia::sysmem::BufferCollectionTokenSyncPtr collection_token;
@@ -367,7 +340,7 @@ SysmemBufferCollection::~SysmemBufferCollection() {
bool SysmemBufferCollection::InitializeInternal(
fuchsia::sysmem::Allocator_Sync* allocator,
fuchsia::sysmem::BufferCollectionTokenSyncPtr collection_token,
- size_t buffers_for_camping) {
+ size_t min_buffer_count) {
fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken>
collection_token_for_vulkan;
collection_token->Duplicate(ZX_RIGHT_SAME_RIGHTS,
@@ -411,7 +384,7 @@ bool SysmemBufferCollection::InitializeInternal(
constraints.usage.none = fuchsia::sysmem::noneUsage;
}
- constraints.min_buffer_count_for_camping = buffers_for_camping;
+ constraints.min_buffer_count = min_buffer_count;
constraints.image_format_constraints_count = 0;
status = collection_->SetConstraints(/*has_constraints=*/true,
@@ -460,7 +433,7 @@ bool SysmemBufferCollection::InitializeInternal(
return false;
}
- DCHECK_GE(buffers_info_.buffer_count, buffers_for_camping);
+ DCHECK_GE(buffers_info_.buffer_count, min_buffer_count);
DCHECK(buffers_info_.settings.has_image_format_constraints);
// The logic should match LogicalBufferCollection::Allocate().
@@ -476,6 +449,11 @@ bool SysmemBufferCollection::InitializeInternal(
buffer_size_ = buffers_info_.settings.buffer_settings.size_bytes;
is_protected_ = buffers_info_.settings.buffer_settings.is_secure;
+ // Add all images to Image pipe for presentation later.
+ if (scenic_overlay_view_.has_value()) {
+ scenic_overlay_view_->AddImages(buffers_info_.buffer_count, image_size_);
+ }
+
// CreateVkImage() should always be called on the same thread, but it may be
// different from the thread that called Initialize().
DETACH_FROM_THREAD(vulkan_thread_checker_);
@@ -497,10 +475,12 @@ void SysmemBufferCollection::InitializeImageCreateInfo(
vk_image_info->tiling =
is_mappable() ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL;
- vk_image_info->usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ vk_image_info->usage = VK_IMAGE_USAGE_SAMPLED_BIT |
+ VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT;
if (usage_ == gfx::BufferUsage::SCANOUT ||
usage_ == gfx::BufferUsage::SCANOUT_CPU_READ_WRITE) {
- vk_image_info->usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ vk_image_info->usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
}
vk_image_info->sharingMode = VK_SHARING_MODE_EXCLUSIVE;
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
index 07cb267c082..873ddbeccce 100644
--- a/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
+++ b/chromium/ui/ozone/platform/scenic/sysmem_buffer_collection.h
@@ -87,6 +87,11 @@ class SysmemBufferCollection
size_t buffer_size() const {
return buffers_info_.settings.buffer_settings.size_bytes;
}
+ ScenicOverlayView* scenic_overlay_view() {
+ return scenic_overlay_view_.has_value() ? &scenic_overlay_view_.value()
+ : nullptr;
+ }
+ ScenicSurfaceFactory* surface_factory() { return surface_factory_; }
private:
friend class base::RefCountedThreadSafe<SysmemBufferCollection>;
@@ -130,6 +135,7 @@ class SysmemBufferCollection
// in buffer allocation negotiations, the associated images can be displayed
// as overlays.
base::Optional<ScenicOverlayView> scenic_overlay_view_;
+ ScenicSurfaceFactory* surface_factory_ = nullptr;
// Thread checker used to verify that CreateVkImage() is always called from
// the same thread. It may be unsafe to use vk_buffer_collection_ on different
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc b/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc
new file mode 100644
index 00000000000..693548fe766
--- /dev/null
+++ b/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.cc
@@ -0,0 +1,146 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/scenic/sysmem_native_pixmap.h"
+
+#include "base/fuchsia/fuchsia_logging.h"
+#include "base/logging.h"
+#include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/gpu_fence.h"
+#include "ui/ozone/platform/scenic/scenic_surface.h"
+#include "ui/ozone/platform/scenic/scenic_surface_factory.h"
+
+namespace ui {
+
+namespace {
+
+zx::event GpuFenceToZxEvent(gfx::GpuFence fence) {
+ DCHECK(!fence.GetGpuFenceHandle().is_null());
+ return fence.GetGpuFenceHandle().Clone().owned_event;
+}
+
+std::vector<zx::event> DuplicateZxEvents(
+ const std::vector<zx::event>& acquire_events) {
+ std::vector<zx::event> duped_events;
+ for (auto& event : acquire_events) {
+ duped_events.emplace_back();
+ zx_status_t status =
+ event.duplicate(ZX_RIGHT_SAME_RIGHTS, &duped_events.back());
+ ZX_DCHECK(status == ZX_OK, status);
+ }
+ return duped_events;
+}
+
+} // namespace
+
+SysmemNativePixmap::SysmemNativePixmap(
+ scoped_refptr<SysmemBufferCollection> collection,
+ gfx::NativePixmapHandle handle)
+ : collection_(collection), handle_(std::move(handle)) {}
+
+SysmemNativePixmap::~SysmemNativePixmap() = default;
+
+bool SysmemNativePixmap::AreDmaBufFdsValid() const {
+ return false;
+}
+
+int SysmemNativePixmap::GetDmaBufFd(size_t plane) const {
+ NOTREACHED();
+ return -1;
+}
+
+uint32_t SysmemNativePixmap::GetDmaBufPitch(size_t plane) const {
+ NOTREACHED();
+ return 0u;
+}
+
+size_t SysmemNativePixmap::GetDmaBufOffset(size_t plane) const {
+ NOTREACHED();
+ return 0u;
+}
+
+size_t SysmemNativePixmap::GetDmaBufPlaneSize(size_t plane) const {
+ NOTREACHED();
+ return 0;
+}
+
+size_t SysmemNativePixmap::GetNumberOfPlanes() const {
+ NOTREACHED();
+ return 0;
+}
+
+uint64_t SysmemNativePixmap::GetBufferFormatModifier() const {
+ NOTREACHED();
+ return 0;
+}
+
+gfx::BufferFormat SysmemNativePixmap::GetBufferFormat() const {
+ return collection_->format();
+}
+
+gfx::Size SysmemNativePixmap::GetBufferSize() const {
+ return collection_->size();
+}
+
+uint32_t SysmemNativePixmap::GetUniqueId() const {
+ return 0;
+}
+
+bool SysmemNativePixmap::ScheduleOverlayPlane(
+ gfx::AcceleratedWidget widget,
+ int plane_z_order,
+ gfx::OverlayTransform plane_transform,
+ const gfx::Rect& display_bounds,
+ const gfx::RectF& crop_rect,
+ bool enable_blend,
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) {
+ DCHECK(collection_->surface_factory());
+ ScenicSurface* surface = collection_->surface_factory()->GetSurface(widget);
+ if (!surface) {
+ DLOG(ERROR) << "Failed to find surface.";
+ return false;
+ }
+
+ DCHECK(collection_->scenic_overlay_view());
+ ScenicOverlayView* overlay_view = collection_->scenic_overlay_view();
+ const auto& buffer_collection_id = handle_.buffer_collection_id.value();
+ if (!overlay_view->AttachToScenicSurface(widget, buffer_collection_id)) {
+ DLOG(ERROR) << "Failed to attach to surface.";
+ return false;
+ }
+
+ // Convert gfx::GpuFence to zx::event for PresentImage call.
+ std::vector<zx::event> acquire_events;
+ for (auto& fence : acquire_fences)
+ acquire_events.push_back(GpuFenceToZxEvent(std::move(fence)));
+ std::vector<zx::event> release_events;
+ for (auto& fence : release_fences)
+ release_events.push_back(GpuFenceToZxEvent(std::move(fence)));
+
+ surface->UpdateOverlayViewPosition(buffer_collection_id, plane_z_order,
+ display_bounds, crop_rect, plane_transform,
+ DuplicateZxEvents(acquire_events));
+
+ overlay_view->SetBlendMode(enable_blend);
+ overlay_view->PresentImage(handle_.buffer_index, std::move(acquire_events),
+ std::move(release_events));
+
+ return true;
+}
+
+gfx::NativePixmapHandle SysmemNativePixmap::ExportHandle() {
+ return gfx::CloneHandleForIPC(handle_);
+}
+
+bool SysmemNativePixmap::SupportsOverlayPlane(
+ gfx::AcceleratedWidget widget) const {
+ if (!collection_->scenic_overlay_view())
+ return false;
+
+ return collection_->scenic_overlay_view()->CanAttachToAcceleratedWidget(
+ widget);
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h b/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h
new file mode 100644
index 00000000000..bf5c0de36a6
--- /dev/null
+++ b/chromium/ui/ozone/platform/scenic/sysmem_native_pixmap.h
@@ -0,0 +1,56 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_SCENIC_SYSMEM_NATIVE_PIXMAP_H_
+#define UI_OZONE_PLATFORM_SCENIC_SYSMEM_NATIVE_PIXMAP_H_
+
+#include "ui/gfx/native_pixmap.h"
+#include "ui/ozone/platform/scenic/sysmem_buffer_collection.h"
+
+namespace ui {
+
+class SysmemNativePixmap : public gfx::NativePixmap {
+ public:
+ SysmemNativePixmap(scoped_refptr<SysmemBufferCollection> collection,
+ gfx::NativePixmapHandle handle);
+
+ SysmemNativePixmap(const SysmemNativePixmap&) = delete;
+ SysmemNativePixmap& operator=(const SysmemNativePixmap&) = delete;
+
+ // gfx::NativePixmap implementation.
+ bool AreDmaBufFdsValid() const override;
+ int GetDmaBufFd(size_t plane) const override;
+ uint32_t GetDmaBufPitch(size_t plane) const override;
+ size_t GetDmaBufOffset(size_t plane) const override;
+ size_t GetDmaBufPlaneSize(size_t plane) const override;
+ size_t GetNumberOfPlanes() const override;
+ uint64_t GetBufferFormatModifier() const override;
+ gfx::BufferFormat GetBufferFormat() const override;
+ gfx::Size GetBufferSize() const override;
+ uint32_t GetUniqueId() const override;
+ bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
+ int plane_z_order,
+ gfx::OverlayTransform plane_transform,
+ const gfx::Rect& display_bounds,
+ const gfx::RectF& crop_rect,
+ bool enable_blend,
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) override;
+ gfx::NativePixmapHandle ExportHandle() override;
+
+ // Returns true if overlay planes are supported and ScheduleOverlayPlane() can
+ // be called.
+ bool SupportsOverlayPlane(gfx::AcceleratedWidget widget) const;
+
+ private:
+ ~SysmemNativePixmap() override;
+
+ // Keep reference to the collection to make sure it outlives the pixmap.
+ scoped_refptr<SysmemBufferCollection> collection_;
+ gfx::NativePixmapHandle handle_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_SCENIC_SYSMEM_NATIVE_PIXMAP_H_
diff --git a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
index 507c9032f24..54a822aaffc 100644
--- a/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
+++ b/chromium/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
@@ -10,7 +10,7 @@
#include <vulkan/vulkan.h>
#include <memory>
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/files/file_path.h"
#include "base/fuchsia/fuchsia_logging.h"
#include "base/macros.h"
@@ -278,6 +278,8 @@ VulkanImplementationScenic::CreateImageFromGpuMemoryHandle(
return nullptr;
}
+ image->set_native_pixmap(collection->CreateNativePixmap(
+ gmb_handle.native_pixmap_handle.buffer_index));
return image;
}
diff --git a/chromium/ui/ozone/platform/wayland/BUILD.gn b/chromium/ui/ozone/platform/wayland/BUILD.gn
index e61680b4a38..46447f33e84 100644
--- a/chromium/ui/ozone/platform/wayland/BUILD.gn
+++ b/chromium/ui/ozone/platform/wayland/BUILD.gn
@@ -93,6 +93,8 @@ source_set("wayland") {
"host/wayland_input_method_context_factory.h",
"host/wayland_keyboard.cc",
"host/wayland_keyboard.h",
+ "host/wayland_menu_utils.cc",
+ "host/wayland_menu_utils.h",
"host/wayland_output.cc",
"host/wayland_output.h",
"host/wayland_output_manager.cc",
@@ -124,6 +126,10 @@ source_set("wayland") {
"host/wayland_window_manager.h",
"host/wayland_window_observer.cc",
"host/wayland_window_observer.h",
+ "host/wayland_zaura_shell.cc",
+ "host/wayland_zaura_shell.h",
+ "host/wayland_zcr_cursor_shapes.cc",
+ "host/wayland_zcr_cursor_shapes.h",
"host/wayland_zwp_linux_dmabuf.cc",
"host/wayland_zwp_linux_dmabuf.h",
"host/xdg_foreign_wrapper.cc",
@@ -132,6 +138,12 @@ source_set("wayland") {
"host/xdg_popup_wrapper_impl.h",
"host/xdg_surface_wrapper_impl.cc",
"host/xdg_surface_wrapper_impl.h",
+ "host/zwp_primary_selection_device.cc",
+ "host/zwp_primary_selection_device.h",
+ "host/zwp_primary_selection_device_manager.cc",
+ "host/zwp_primary_selection_device_manager.h",
+ "host/zwp_primary_selection_offer.cc",
+ "host/zwp_primary_selection_offer.h",
"host/zwp_text_input_wrapper.h",
"host/zwp_text_input_wrapper_v1.cc",
"host/zwp_text_input_wrapper_v1.h",
@@ -152,11 +164,14 @@ source_set("wayland") {
"//mojo/public/cpp/bindings",
"//mojo/public/cpp/system",
"//skia",
+ "//third_party/wayland-protocols:cursor_shapes_protocol",
+ "//third_party/wayland-protocols:extended_drag",
"//third_party/wayland-protocols:gtk_primary_selection_protocol",
"//third_party/wayland-protocols:keyboard_extension_protocol",
"//third_party/wayland-protocols:linux_dmabuf_protocol",
"//third_party/wayland-protocols:linux_explicit_synchronization_protocol",
"//third_party/wayland-protocols:presentation_time_protocol",
+ "//third_party/wayland-protocols:primary_selection_protocol",
"//third_party/wayland-protocols:text_input_protocol",
"//third_party/wayland-protocols:viewporter_protocol",
"//third_party/wayland-protocols:wayland_drm_protocol",
@@ -167,6 +182,7 @@ source_set("wayland") {
"//ui/base:buildflags",
"//ui/base/cursor",
"//ui/base/cursor:cursor_base",
+ "//ui/base/cursor/mojom:cursor_type",
"//ui/base/ime/linux",
"//ui/events",
"//ui/events:dom_keycode_converter",
@@ -255,6 +271,7 @@ source_set("test_support") {
testonly = true
sources = [
+ "host/wayland_connection_test_api.h",
"test/global_object.cc",
"test/global_object.h",
"test/mock_buffer.cc",
@@ -318,6 +335,7 @@ source_set("test_support") {
]
deps = [
+ ":wayland",
"//base:base",
"//ui/ozone:platform",
]
@@ -362,6 +380,7 @@ source_set("wayland_unittests") {
"//testing/gmock",
"//testing/gtest",
"//third_party/wayland:wayland_server",
+ "//third_party/wayland-protocols:cursor_shapes_protocol",
"//third_party/wayland-protocols:keyboard_extension_protocol",
"//third_party/wayland-protocols:linux_dmabuf_protocol",
"//third_party/wayland-protocols:text_input_protocol",
@@ -374,6 +393,7 @@ source_set("wayland_unittests") {
"//ui/gfx/linux:test_support",
"//ui/ozone:platform",
"//ui/ozone:test_support",
+ "//ui/ozone/common",
"//ui/platform_window/wm",
]
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_object.cc b/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
index 6d9c7536c7e..7a6c5e7b849 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_object.cc
@@ -5,11 +5,14 @@
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include <aura-shell-client-protocol.h>
+#include <cursor-shapes-unstable-v1-client-protocol.h>
+#include <extended-drag-unstable-v1-client-protocol.h>
#include <gtk-primary-selection-client-protocol.h>
#include <keyboard-extension-unstable-v1-client-protocol.h>
#include <linux-dmabuf-unstable-v1-client-protocol.h>
#include <linux-explicit-synchronization-unstable-v1-client-protocol.h>
#include <presentation-time-client-protocol.h>
+#include <primary-selection-unstable-v1-client-protocol.h>
#include <text-input-unstable-v1-client-protocol.h>
#include <viewporter-client-protocol.h>
#include <wayland-drm-client-protocol.h>
@@ -92,6 +95,30 @@ const wl_interface* ObjectTraits<gtk_primary_selection_source>::interface =
void (*ObjectTraits<gtk_primary_selection_source>::deleter)(
gtk_primary_selection_source*) = &gtk_primary_selection_source_destroy;
+const wl_interface*
+ ObjectTraits<zwp_primary_selection_device_manager_v1>::interface =
+ &zwp_primary_selection_device_manager_v1_interface;
+void (*ObjectTraits<zwp_primary_selection_device_manager_v1>::deleter)(
+ zwp_primary_selection_device_manager_v1*) =
+ &zwp_primary_selection_device_manager_v1_destroy;
+
+const wl_interface* ObjectTraits<zwp_primary_selection_device_v1>::interface =
+ &zwp_primary_selection_device_v1_interface;
+void (*ObjectTraits<zwp_primary_selection_device_v1>::deleter)(
+ zwp_primary_selection_device_v1*) =
+ &zwp_primary_selection_device_v1_destroy;
+
+const wl_interface* ObjectTraits<zwp_primary_selection_offer_v1>::interface =
+ &zwp_primary_selection_offer_v1_interface;
+void (*ObjectTraits<zwp_primary_selection_offer_v1>::deleter)(
+ zwp_primary_selection_offer_v1*) = &zwp_primary_selection_offer_v1_destroy;
+
+const wl_interface* ObjectTraits<zwp_primary_selection_source_v1>::interface =
+ &zwp_primary_selection_source_v1_interface;
+void (*ObjectTraits<zwp_primary_selection_source_v1>::deleter)(
+ zwp_primary_selection_source_v1*) =
+ &zwp_primary_selection_source_v1_destroy;
+
const wl_interface* ObjectTraits<wl_buffer>::interface = &wl_buffer_interface;
void (*ObjectTraits<wl_buffer>::deleter)(wl_buffer*) = &wl_buffer_destroy;
@@ -222,6 +249,26 @@ const wl_interface* ObjectTraits<zaura_surface>::interface =
void (*ObjectTraits<zaura_surface>::deleter)(zaura_surface*) =
&zaura_surface_destroy;
+const wl_interface* ObjectTraits<zcr_cursor_shapes_v1>::interface =
+ &zcr_cursor_shapes_v1_interface;
+void (*ObjectTraits<zcr_cursor_shapes_v1>::deleter)(zcr_cursor_shapes_v1*) =
+ &zcr_cursor_shapes_v1_destroy;
+
+const wl_interface* ObjectTraits<zcr_extended_drag_v1>::interface =
+ &zcr_extended_drag_v1_interface;
+void (*ObjectTraits<zcr_extended_drag_v1>::deleter)(zcr_extended_drag_v1*) =
+ &zcr_extended_drag_v1_destroy;
+
+const wl_interface* ObjectTraits<zcr_extended_drag_source_v1>::interface =
+ &zcr_extended_drag_source_v1_interface;
+void (*ObjectTraits<zcr_extended_drag_source_v1>::deleter)(
+ zcr_extended_drag_source_v1*) = &zcr_extended_drag_source_v1_destroy;
+
+const wl_interface* ObjectTraits<zcr_extended_drag_offer_v1>::interface =
+ &zcr_extended_drag_offer_v1_interface;
+void (*ObjectTraits<zcr_extended_drag_offer_v1>::deleter)(
+ zcr_extended_drag_offer_v1*) = &zcr_extended_drag_offer_v1_destroy;
+
const wl_interface* ObjectTraits<zcr_keyboard_extension_v1>::interface =
&zcr_keyboard_extension_v1_interface;
void (*ObjectTraits<zcr_keyboard_extension_v1>::deleter)(
diff --git a/chromium/ui/ozone/platform/wayland/common/wayland_object.h b/chromium/ui/ozone/platform/wayland/common/wayland_object.h
index bfc61f88f84..b06cf876f91 100644
--- a/chromium/ui/ozone/platform/wayland/common/wayland_object.h
+++ b/chromium/ui/ozone/platform/wayland/common/wayland_object.h
@@ -13,6 +13,10 @@ struct gtk_primary_selection_device;
struct gtk_primary_selection_device_manager;
struct gtk_primary_selection_offer;
struct gtk_primary_selection_source;
+struct zwp_primary_selection_device_v1;
+struct zwp_primary_selection_device_manager_v1;
+struct zwp_primary_selection_offer_v1;
+struct zwp_primary_selection_source_v1;
struct wl_buffer;
struct wl_callback;
struct wl_compositor;
@@ -44,8 +48,12 @@ struct xdg_popup;
struct xdg_positioner;
struct zaura_shell;
struct zaura_surface;
+struct zcr_cursor_shapes_v1;
struct zcr_keyboard_extension_v1;
struct zcr_extended_keyboard_v1;
+struct zcr_extended_drag_v1;
+struct zcr_extended_drag_source_v1;
+struct zcr_extended_drag_offer_v1;
struct zwp_linux_dmabuf_v1;
struct zwp_linux_buffer_release_v1;
struct zwp_linux_explicit_synchronization_v1;
@@ -104,6 +112,30 @@ struct ObjectTraits<gtk_primary_selection_source> {
};
template <>
+struct ObjectTraits<zwp_primary_selection_device_manager_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zwp_primary_selection_device_manager_v1*);
+};
+
+template <>
+struct ObjectTraits<zwp_primary_selection_device_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zwp_primary_selection_device_v1*);
+};
+
+template <>
+struct ObjectTraits<zwp_primary_selection_offer_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zwp_primary_selection_offer_v1*);
+};
+
+template <>
+struct ObjectTraits<zwp_primary_selection_source_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zwp_primary_selection_source_v1*);
+};
+
+template <>
struct ObjectTraits<wl_buffer> {
static const wl_interface* interface;
static void (*deleter)(wl_buffer*);
@@ -296,6 +328,30 @@ struct ObjectTraits<zaura_surface> {
};
template <>
+struct ObjectTraits<zcr_cursor_shapes_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zcr_cursor_shapes_v1*);
+};
+
+template <>
+struct ObjectTraits<zcr_extended_drag_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zcr_extended_drag_v1*);
+};
+
+template <>
+struct ObjectTraits<zcr_extended_drag_source_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zcr_extended_drag_source_v1*);
+};
+
+template <>
+struct ObjectTraits<zcr_extended_drag_offer_v1> {
+ static const wl_interface* interface;
+ static void (*deleter)(zcr_extended_drag_offer_v1*);
+};
+
+template <>
struct ObjectTraits<zcr_keyboard_extension_v1> {
static const wl_interface* interface;
static void (*deleter)(zcr_keyboard_extension_v1*);
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc b/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
index c78ca1d02aa..0e419c88b06 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
@@ -118,7 +118,8 @@ bool GbmPixmapWayland::ScheduleOverlayPlane(
const gfx::Rect& display_bounds,
const gfx::RectF& crop_rect,
bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) {
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) {
// If the widget this pixmap backs has not been assigned before, do it now.
if (widget_ == gfx::kNullAcceleratedWidget)
SetAcceleratedWiget(widget);
@@ -132,9 +133,14 @@ bool GbmPixmapWayland::ScheduleOverlayPlane(
static_cast<GbmSurfacelessWayland*>(surface);
DCHECK(surfaceless);
+ DCHECK(acquire_fences.empty() || acquire_fences.size() == 1u);
surfaceless->QueueOverlayPlane(
- OverlayPlane(this, std::move(gpu_fence), plane_z_order, plane_transform,
- display_bounds, crop_rect, enable_blend),
+ OverlayPlane(this,
+ acquire_fences.empty() ? nullptr
+ : std::make_unique<gfx::GpuFence>(
+ std::move(acquire_fences[0])),
+ plane_z_order, plane_transform, display_bounds, crop_rect,
+ enable_blend),
buffer_id_);
return true;
}
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h b/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
index e344054c251..a9b3932b1a8 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
+++ b/chromium/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
@@ -49,7 +49,8 @@ class GbmPixmapWayland : public gfx::NativePixmap {
const gfx::Rect& display_bounds,
const gfx::RectF& crop_rect,
bool enable_blend,
- std::unique_ptr<gfx::GpuFence> gpu_fence) override;
+ std::vector<gfx::GpuFence> acquire_fences,
+ std::vector<gfx::GpuFence> release_fences) override;
gfx::NativePixmapHandle ExportHandle() override;
private:
diff --git a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
index b77c13b5e75..1b15b1c27f7 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
@@ -291,7 +291,6 @@ void GbmSurfacelessWayland::OnSubmission(BufferId buffer_id,
break;
}
}
- DCHECK(erased);
// Following while loop covers below scenario:
// frame_1 submitted a buffer_1 for overlay; frame_2 submitted a buffer_2
@@ -354,8 +353,6 @@ void GbmSurfacelessWayland::OnPresentation(
}
}
- DCHECK(erased);
-
while (!pending_presentation_frames_.empty() &&
pending_presentation_frames_.front()
->pending_presentation_buffers.empty()) {
diff --git a/chromium/ui/ozone/platform/wayland/gpu/vulkan_implementation_wayland.cc b/chromium/ui/ozone/platform/wayland/gpu/vulkan_implementation_wayland.cc
index 3ec6820f18f..3a2be4275ef 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/vulkan_implementation_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/vulkan_implementation_wayland.cc
@@ -7,7 +7,7 @@
#include <vulkan/vulkan_wayland.h>
#include "base/base_paths.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/files/file_path.h"
#include "base/notreached.h"
#include "base/path_service.h"
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc b/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
index 9897b51fd91..5c14a1c918f 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
@@ -63,9 +63,12 @@ void WaylandBufferManagerGpu::OnSubmission(gfx::AcceleratedWidget widget,
gfx::SwapResult swap_result) {
base::AutoLock scoped_lock(lock_);
DCHECK(io_thread_runner_->BelongsToCurrentThread());
- DCHECK_EQ(commit_thread_runners_.count(widget), 1u);
+ DCHECK_LE(commit_thread_runners_.count(widget), 1u);
// Return back to the same thread where the commit request came from.
- commit_thread_runners_.find(widget)->second->PostTask(
+ auto it = commit_thread_runners_.find(widget);
+ if (it == commit_thread_runners_.end())
+ return;
+ it->second->PostTask(
FROM_HERE,
base::BindOnce(&WaylandBufferManagerGpu::SubmitSwapResultOnOriginThread,
base::Unretained(this), widget, buffer_id, swap_result));
@@ -77,9 +80,12 @@ void WaylandBufferManagerGpu::OnPresentation(
const gfx::PresentationFeedback& feedback) {
base::AutoLock scoped_lock(lock_);
DCHECK(io_thread_runner_->BelongsToCurrentThread());
- DCHECK_EQ(commit_thread_runners_.count(widget), 1u);
+ DCHECK_LE(commit_thread_runners_.count(widget), 1u);
// Return back to the same thread where the commit request came from.
- commit_thread_runners_.find(widget)->second->PostTask(
+ auto it = commit_thread_runners_.find(widget);
+ if (it == commit_thread_runners_.end())
+ return;
+ it->second->PostTask(
FROM_HERE,
base::BindOnce(&WaylandBufferManagerGpu::SubmitPresentationOnOriginThread,
base::Unretained(this), widget, buffer_id, feedback));
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc b/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc
index 09cfac561f6..deb43b013e4 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc
@@ -13,6 +13,7 @@
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/numerics/checked_math.h"
#include "base/posix/eintr_wrapper.h"
+#include "skia/ext/legacy_display_globals.h"
#include "third_party/skia/include/core/SkRegion.h"
#include "ui/gfx/skia_util.h"
#include "ui/gfx/vsync_provider.h"
@@ -79,9 +80,10 @@ class WaylandCanvasSurface::SharedMemoryBuffer {
buffer_manager_->CreateShmBasedBuffer(
std::move(fd_pair.fd), checked_length.ValueOrDie(), size, buffer_id_);
+ SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps();
sk_surface_ = SkSurface::MakeRasterDirect(
SkImageInfo::MakeN32Premul(size.width(), size.height()),
- shm_mapping_.memory(), CalculateStride(size.width()));
+ shm_mapping_.memory(), CalculateStride(size.width()), &props);
if (!sk_surface_)
return false;
diff --git a/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc b/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
index 1c506265172..cc71dc65c2b 100644
--- a/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/gpu/wayland_surface_factory_unittest.cc
@@ -76,9 +76,12 @@ class FakeGLImageNativePixmap : public gl::GLImageEGL {
// The GLImage must be set busy as it has been scheduled before when
// GbmSurfacelessWayland::ScheduleOverlayPlane was called.
DCHECK(busy_);
+ std::vector<gfx::GpuFence> acquire_fences;
+ if (gpu_fence)
+ acquire_fences.push_back(std::move(*gpu_fence));
return pixmap_->ScheduleOverlayPlane(widget, z_order, transform,
bounds_rect, crop_rect, enable_blend,
- std::move(gpu_fence));
+ std::move(acquire_fences), {});
}
scoped_refptr<gfx::NativePixmap> GetNativePixmap() override {
return pixmap_;
@@ -255,7 +258,7 @@ TEST_P(WaylandSurfaceFactoryTest,
// Prepare overlay plane.
gl_surface->ScheduleOverlayPlane(
- 0, gfx::OverlayTransform::OVERLAY_TRANSFORM_FLIP_VERTICAL,
+ INT32_MIN, gfx::OverlayTransform::OVERLAY_TRANSFORM_FLIP_VERTICAL,
gl_image.get(), window_->GetBounds(), {}, false, nullptr);
std::vector<scoped_refptr<FakeGLImageNativePixmap>> gl_images;
@@ -452,8 +455,10 @@ TEST_P(WaylandSurfaceFactoryTest,
Sync();
}
- auto* mock_primary_surface = server_.GetObject<wl::MockSurface>(
+ auto* root_surface = server_.GetObject<wl::MockSurface>(
window_->root_surface()->GetSurfaceId());
+ auto* mock_primary_surface = server_.GetObject<wl::MockSurface>(
+ window_->primary_subsurface()->wayland_surface()->GetSurfaceId());
CallbacksHelper cbs_helper;
// Submit a frame with only primary plane
@@ -488,9 +493,11 @@ TEST_P(WaylandSurfaceFactoryTest,
// Also, we expect only one buffer to be committed.
EXPECT_CALL(*mock_primary_surface, Attach(_, _, _)).Times(1);
- EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_primary_surface, DamageBuffer(_, _, _, _)).Times(1);
EXPECT_CALL(*mock_primary_surface, Commit()).Times(1);
+ EXPECT_CALL(*root_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*root_surface, Commit()).Times(1);
Sync();
@@ -546,13 +553,15 @@ TEST_P(WaylandSurfaceFactoryTest,
// Expect one buffer to be committed.
EXPECT_CALL(*mock_primary_surface, Attach(_, _, _)).Times(1);
- EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_primary_surface, DamageBuffer(_, _, _, _)).Times(1);
EXPECT_CALL(*mock_primary_surface, Commit()).Times(1);
+ EXPECT_CALL(*root_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*root_surface, Commit()).Times(1);
// Send the frame callback so that pending buffer for swap id=1u is processed
// and swapped.
- mock_primary_surface->SendFrameCallback();
+ root_surface->SendFrameCallback();
Sync();
@@ -604,15 +613,19 @@ TEST_P(WaylandSurfaceFactoryTest,
base::BindOnce(&CallbacksHelper::BufferPresented,
base::Unretained(&cbs_helper), swap_id));
}
- // Expect parent surface to be committed without a buffer.
+
+ // Do not expect parent surface to be committed.
EXPECT_CALL(*mock_primary_surface, Attach(_, _, _)).Times(0);
- EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_primary_surface, DamageBuffer(_, _, _, _)).Times(0);
- EXPECT_CALL(*mock_primary_surface, Commit()).Times(1);
+ EXPECT_CALL(*mock_primary_surface, Commit()).Times(0);
+ // Expect root surface to be committed.
+ EXPECT_CALL(*root_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*root_surface, Commit()).Times(1);
// Send the frame callback so that pending buffer for swap id=2u is processed
// and swapped.
- mock_primary_surface->SendFrameCallback();
+ root_surface->SendFrameCallback();
Sync();
@@ -691,8 +704,10 @@ TEST_P(WaylandSurfaceFactoryTest,
Sync();
}
- auto* mock_primary_surface = server_.GetObject<wl::MockSurface>(
+ auto* root_surface = server_.GetObject<wl::MockSurface>(
window_->root_surface()->GetSurfaceId());
+ auto* mock_primary_surface = server_.GetObject<wl::MockSurface>(
+ window_->primary_subsurface()->wayland_surface()->GetSurfaceId());
CallbacksHelper cbs_helper;
// Submit a frame with 1 primary plane and 1 overlay
@@ -737,11 +752,13 @@ TEST_P(WaylandSurfaceFactoryTest,
// Let's sync so that 1) GbmSurfacelessWayland submits the buffer according to
// internal queue and fake server processes the request.
- // Also, we expect only one buffer to be committed.
+ // Also, we expect primary buffer to be committed.
EXPECT_CALL(*mock_primary_surface, Attach(_, _, _)).Times(1);
- EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_primary_surface, DamageBuffer(_, _, _, _)).Times(1);
EXPECT_CALL(*mock_primary_surface, Commit()).Times(1);
+ EXPECT_CALL(*root_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*root_surface, Commit()).Times(1);
Sync();
@@ -810,21 +827,25 @@ TEST_P(WaylandSurfaceFactoryTest,
base::Unretained(&cbs_helper), swap_id));
}
- // Expect one buffer to be committed.
+ // Expect primary buffer to be committed.
EXPECT_CALL(*mock_primary_surface, Attach(_, _, _)).Times(1);
- EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*mock_primary_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_primary_surface, DamageBuffer(_, _, _, _)).Times(1);
EXPECT_CALL(*mock_primary_surface, Commit()).Times(1);
- // Expect one buffer to be committed.
+ // Expect overlay buffer to be committed.
EXPECT_CALL(*mock_overlay_surface, Attach(_, _, _)).Times(1);
EXPECT_CALL(*mock_overlay_surface, Frame(_)).Times(0);
EXPECT_CALL(*mock_overlay_surface, DamageBuffer(_, _, _, _)).Times(1);
EXPECT_CALL(*mock_overlay_surface, Commit()).Times(1);
+ // Expect root surface to be committed without buffer.
+ EXPECT_CALL(*root_surface, Frame(_)).Times(1);
+ EXPECT_CALL(*root_surface, Commit()).Times(1);
+
// Send the frame callback so that pending buffer for swap id=1u is processed
// and swapped.
- mock_primary_surface->SendFrameCallback();
+ root_surface->SendFrameCallback();
Sync();
diff --git a/chromium/ui/ozone/platform/wayland/host/DEPS b/chromium/ui/ozone/platform/wayland/host/DEPS
index 1741810f122..3ed58be77cd 100644
--- a/chromium/ui/ozone/platform/wayland/host/DEPS
+++ b/chromium/ui/ozone/platform/wayland/host/DEPS
@@ -1,4 +1,5 @@
include_rules = [
# For Lacros.
"+chromeos/crosapi/cpp/crosapi_constants.h",
+ "+chromeos/ui/base",
]
diff --git a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc
index 1a68f9da34e..45540640759 100644
--- a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc
+++ b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc
@@ -43,7 +43,7 @@ void GtkPrimarySelectionDevice::OnDataOffer(
DCHECK(self);
self->connection()->clipboard()->UpdateSequenceNumber(
- ClipboardBuffer::kCopyPaste);
+ ClipboardBuffer::kSelection);
self->set_data_offer(std::make_unique<GtkPrimarySelectionOffer>(offer));
}
diff --git a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_offer.cc b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_offer.cc
index a611215ec3e..f6e4cbdbdfb 100644
--- a/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_offer.cc
+++ b/chromium/ui/ozone/platform/wayland/host/gtk_primary_selection_offer.cc
@@ -6,12 +6,7 @@
#include <gtk-primary-selection-client-protocol.h>
-#include <fcntl.h>
-#include <algorithm>
-
-#include "base/check.h"
#include "base/files/file_util.h"
-#include "base/stl_util.h"
#include "ui/base/clipboard/clipboard_constants.h"
namespace ui {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_auxiliary_window.cc b/chromium/ui/ozone/platform/wayland/host/wayland_auxiliary_window.cc
index 50cbee6cad2..5139572e51b 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_auxiliary_window.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_auxiliary_window.cc
@@ -24,6 +24,7 @@ void WaylandAuxiliaryWindow::Show(bool inactive) {
CreateSubsurface();
UpdateBufferScale(false);
+ WaylandWindow::Show(inactive);
}
void WaylandAuxiliaryWindow::Hide() {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
index 5fa747f3301..fc9e374dc63 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
@@ -234,9 +234,11 @@ class WaylandBufferManagerHost::Surface {
// If the same buffer has been submitted again right after the client
// received OnSubmission for that buffer, just damage the buffer and
- // commit the surface again.
+ // commit the surface again. However, if the buffer is released, it's safe
+ // to reattach the buffer.
if (submitted_buffers_.empty() ||
- submitted_buffers_.back().buffer_id != buffer->buffer_id) {
+ submitted_buffers_.back().buffer_id != buffer->buffer_id ||
+ buffer->released) {
// Once the BufferRelease is called, the buffer will be released.
DCHECK(buffer->released);
buffer->released = false;
@@ -350,8 +352,8 @@ class WaylandBufferManagerHost::Surface {
// Releases may not necessarily come in order, so search the submitted
// buffers.
WaylandBuffer* buffer = nullptr;
- for (const auto& b : submitted_buffers_) {
- auto* submitted_buffer = GetBuffer(b.buffer_id);
+ for (const auto& buff : submitted_buffers_) {
+ auto* submitted_buffer = GetBuffer(buff.buffer_id);
if (submitted_buffer && wl_buffer == submitted_buffer->wl_buffer.get()) {
buffer = submitted_buffer;
break;
@@ -923,11 +925,21 @@ void WaylandBufferManagerHost::DestroyBuffer(gfx::AcceleratedWidget widget,
if (!surface->HasBuffers() && !surface->HasSurface())
surfaces_.erase(window->root_surface());
}
- const auto& subsurfaces = window->wayland_subsurfaces();
- for (const auto& it : subsurfaces) {
- Surface* subsurface = GetSurface((*it).wayland_surface());
- if (subsurface)
- destroyed_count += subsurface->DestroyBuffer(buffer_id);
+ if (!destroyed_count) {
+ surface = GetSurface(window->primary_subsurface()->wayland_surface());
+ if (surface) {
+ destroyed_count = surface->DestroyBuffer(buffer_id);
+ if (!surface->HasBuffers() && !surface->HasSurface())
+ surfaces_.erase(window->root_surface());
+ }
+ }
+ if (!destroyed_count) {
+ const auto& subsurfaces = window->wayland_subsurfaces();
+ for (const auto& it : subsurfaces) {
+ Surface* subsurface = GetSurface((*it).wayland_surface());
+ if (subsurface)
+ destroyed_count += subsurface->DestroyBuffer(buffer_id);
+ }
}
} else {
// Case 3)
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
index e39d1ee03fb..43d14126367 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_clipboard.cc
@@ -14,6 +14,8 @@
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/gtk_primary_selection_device.h"
#include "ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.h"
+#include "ui/ozone/platform/wayland/host/zwp_primary_selection_device.h"
+#include "ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_data_device.h"
#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
@@ -185,7 +187,8 @@ void WaylandClipboard::GetAvailableMimeTypes(
}
bool WaylandClipboard::IsSelectionBufferAvailable() const {
- return (connection_->primary_selection_device_manager() != nullptr);
+ return (connection_->zwp_primary_selection_device_manager() != nullptr) ||
+ (connection_->gtk_primary_selection_device_manager() != nullptr);
}
void WaylandClipboard::SetData(PlatformClipboard::Data contents,
@@ -214,7 +217,15 @@ wl::Clipboard* WaylandClipboard::GetClipboard(ClipboardBuffer buffer) {
return copypaste_clipboard_.get();
if (buffer == ClipboardBuffer::kSelection) {
- if (auto* manager = connection_->primary_selection_device_manager()) {
+ if (auto* manager = connection_->zwp_primary_selection_device_manager()) {
+ if (!primary_selection_clipboard_) {
+ primary_selection_clipboard_ =
+ std::make_unique<wl::ClipboardImpl<ZwpPrimarySelectionDeviceManager>>(
+ manager);
+ }
+ return primary_selection_clipboard_.get();
+ } else if (auto* manager =
+ connection_->gtk_primary_selection_device_manager()) {
if (!primary_selection_clipboard_) {
primary_selection_clipboard_ = std::make_unique<
wl::ClipboardImpl<GtkPrimarySelectionDeviceManager>>(manager);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc b/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
index 4c99dc8612c..73b76474df1 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -4,6 +4,7 @@
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include <extended-drag-unstable-v1-client-protocol.h>
#include <xdg-shell-client-protocol.h>
#include <xdg-shell-unstable-v6-client-protocol.h>
@@ -37,8 +38,11 @@
#include "ui/ozone/platform/wayland/host/wayland_touch.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
#include "ui/ozone/platform/wayland/host/wayland_window_drag_controller.h"
+#include "ui/ozone/platform/wayland/host/wayland_zaura_shell.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h"
#include "ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h"
#include "ui/ozone/platform/wayland/host/xdg_foreign_wrapper.h"
+#include "ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h"
#if defined(USE_LIBWAYLAND_STUBS)
#include <dlfcn.h>
@@ -49,7 +53,9 @@
namespace ui {
namespace {
+constexpr uint32_t kMaxAuraShellVersion = 11;
constexpr uint32_t kMaxCompositorVersion = 4;
+constexpr uint32_t kMaxCursorShapesVersion = 1;
constexpr uint32_t kMaxGtkPrimarySelectionDeviceManagerVersion = 1;
constexpr uint32_t kMaxKeyboardExtensionVersion = 1;
constexpr uint32_t kMaxLinuxDmabufVersion = 3;
@@ -61,10 +67,10 @@ constexpr uint32_t kMaxWpPresentationVersion = 1;
constexpr uint32_t kMaxWpViewporterVersion = 1;
constexpr uint32_t kMaxTextInputManagerVersion = 1;
constexpr uint32_t kMaxExplicitSyncVersion = 2;
-constexpr uint32_t kMinAuraShellVersion = 10;
constexpr uint32_t kMinWlDrmVersion = 2;
constexpr uint32_t kMinWlOutputVersion = 2;
constexpr uint32_t kMaxXdgDecorationVersion = 1;
+constexpr uint32_t kMaxExtendedDragVersion = 1;
} // namespace
WaylandConnection::WaylandConnection() = default;
@@ -158,10 +164,11 @@ void WaylandConnection::SetShutdownCb(base::OnceCallback<void()> shutdown_cb) {
}
void WaylandConnection::SetCursorBitmap(const std::vector<SkBitmap>& bitmaps,
- const gfx::Point& location) {
+ const gfx::Point& hotspot_in_dips,
+ int buffer_scale) {
if (!cursor_)
return;
- cursor_->UpdateBitmap(bitmaps, location, serial());
+ cursor_->UpdateBitmap(bitmaps, hotspot_in_dips, serial(), buffer_scale);
}
bool WaylandConnection::IsDragInProgress() const {
@@ -351,14 +358,23 @@ void WaylandConnection::Global(void* data,
std::make_unique<WaylandDataDeviceManager>(
data_device_manager.release(), connection);
connection->CreateDataObjectsIfReady();
- } else if (!connection->primary_selection_device_manager_ &&
+ } else if (!connection->gtk_primary_selection_device_manager_ &&
strcmp(interface, "gtk_primary_selection_device_manager") == 0) {
- wl::Object<gtk_primary_selection_device_manager> manager =
- wl::Bind<gtk_primary_selection_device_manager>(
+ wl::Object<::gtk_primary_selection_device_manager> manager =
+ wl::Bind<::gtk_primary_selection_device_manager>(
registry, name, kMaxGtkPrimarySelectionDeviceManagerVersion);
- connection->primary_selection_device_manager_ =
+ connection->gtk_primary_selection_device_manager_ =
std::make_unique<GtkPrimarySelectionDeviceManager>(manager.release(),
connection);
+ } else if (!connection->zwp_primary_selection_device_manager_ &&
+ strcmp(interface, "zwp_primary_selection_device_manager_v1") ==
+ 0) {
+ wl::Object<zwp_primary_selection_device_manager_v1> manager =
+ wl::Bind<zwp_primary_selection_device_manager_v1>(
+ registry, name, kMaxGtkPrimarySelectionDeviceManagerVersion);
+ connection->zwp_primary_selection_device_manager_ =
+ std::make_unique<ZwpPrimarySelectionDeviceManager>(manager.release(),
+ connection);
} else if (!connection->linux_explicit_synchronization_ &&
(strcmp(interface, "zwp_linux_explicit_synchronization_v1") ==
0)) {
@@ -380,6 +396,16 @@ void WaylandConnection::Global(void* data,
(strcmp(interface, "wp_viewporter") == 0)) {
connection->viewporter_ =
wl::Bind<wp_viewporter>(registry, name, kMaxWpViewporterVersion);
+ } else if (!connection->zcr_cursor_shapes_ &&
+ strcmp(interface, "zcr_cursor_shapes_v1") == 0) {
+ auto zcr_cursor_shapes =
+ wl::Bind<zcr_cursor_shapes_v1>(registry, name, kMaxCursorShapesVersion);
+ if (!zcr_cursor_shapes) {
+ LOG(ERROR) << "Failed to bind zcr_cursor_shapes_v1";
+ return;
+ }
+ connection->zcr_cursor_shapes_ = std::make_unique<WaylandZcrCursorShapes>(
+ zcr_cursor_shapes.release(), connection);
} else if (!connection->keyboard_extension_v1_ &&
strcmp(interface, "zcr_keyboard_extension_v1") == 0) {
connection->keyboard_extension_v1_ = wl::Bind<zcr_keyboard_extension_v1>(
@@ -408,20 +434,29 @@ void WaylandConnection::Global(void* data,
auto wayland_drm = wl::Bind<struct wl_drm>(registry, name, version);
connection->drm_ =
std::make_unique<WaylandDrm>(wayland_drm.release(), connection);
- } else if (!connection->aura_shell_ &&
- (strcmp(interface, "zaura_shell") == 0) &&
- version >= kMinAuraShellVersion) {
- connection->aura_shell_ =
- wl::Bind<struct zaura_shell>(registry, name, version);
- if (!connection->aura_shell_) {
+ } else if (!connection->zaura_shell_ &&
+ (strcmp(interface, "zaura_shell") == 0)) {
+ auto zaura_shell = wl::Bind<struct zaura_shell>(
+ registry, name, std::min(version, kMaxAuraShellVersion));
+ if (!zaura_shell) {
LOG(ERROR) << "Failed to bind zaura_shell";
return;
}
+ connection->zaura_shell_ =
+ std::make_unique<WaylandZAuraShell>(zaura_shell.release(), connection);
} else if (!connection->xdg_decoration_manager_ &&
strcmp(interface, "zxdg_decoration_manager_v1") == 0) {
connection->xdg_decoration_manager_ =
wl::Bind<struct zxdg_decoration_manager_v1>(registry, name,
kMaxXdgDecorationVersion);
+ } else if (!connection->extended_drag_v1_ &&
+ strcmp(interface, "zcr_extended_drag_v1") == 0) {
+ connection->extended_drag_v1_ =
+ wl::Bind<zcr_extended_drag_v1>(registry, name, kMaxExtendedDragVersion);
+ if (!connection->extended_drag_v1_) {
+ LOG(ERROR) << "Failed to bind to zcr_extended_drag_v1 global";
+ return;
+ }
}
connection->ScheduleFlush();
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_connection.h b/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
index ec7beb98b17..b7f2981a074 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -31,11 +31,14 @@ class WaylandOutputManager;
class WaylandPointer;
class WaylandShm;
class WaylandTouch;
+class WaylandZAuraShell;
+class WaylandZcrCursorShapes;
class WaylandZwpLinuxDmabuf;
class WaylandDataDeviceManager;
class WaylandCursorPosition;
class WaylandWindowDragController;
class GtkPrimarySelectionDeviceManager;
+class ZwpPrimarySelectionDeviceManager;
class XdgForeignWrapper;
class WaylandConnection {
@@ -67,7 +70,6 @@ class WaylandConnection {
wp_viewporter* viewporter() const { return viewporter_.get(); }
xdg_wm_base* shell() const { return shell_.get(); }
zxdg_shell_v6* shell_v6() const { return shell_v6_.get(); }
- zaura_shell* aura_shell() const { return aura_shell_.get(); }
wl_seat* seat() const { return seat_.get(); }
wp_presentation* presentation() const { return presentation_.get(); }
zwp_text_input_manager_v1* text_input_manager_v1() const {
@@ -80,6 +82,9 @@ class WaylandConnection {
zxdg_decoration_manager_v1* xdg_decoration_manager_v1() const {
return xdg_decoration_manager_.get();
}
+ zcr_extended_drag_v1* extended_drag_v1() const {
+ return extended_drag_v1_.get();
+ }
void set_serial(uint32_t serial, EventType event_type) {
serial_ = {serial, event_type};
@@ -88,7 +93,8 @@ class WaylandConnection {
EventSerial event_serial() const { return serial_; }
void SetCursorBitmap(const std::vector<SkBitmap>& bitmaps,
- const gfx::Point& location);
+ const gfx::Point& hotspot_in_dips,
+ int buffer_scale);
WaylandEventSource* event_source() const { return event_source_.get(); }
@@ -116,6 +122,12 @@ class WaylandConnection {
return buffer_manager_host_.get();
}
+ WaylandZAuraShell* zaura_shell() const { return zaura_shell_.get(); }
+
+ WaylandZcrCursorShapes* zcr_cursor_shapes() const {
+ return zcr_cursor_shapes_.get();
+ }
+
WaylandZwpLinuxDmabuf* zwp_dmabuf() const { return zwp_dmabuf_.get(); }
WaylandDrm* drm() const { return drm_.get(); }
@@ -130,8 +142,13 @@ class WaylandConnection {
return data_device_manager_.get();
}
- GtkPrimarySelectionDeviceManager* primary_selection_device_manager() const {
- return primary_selection_device_manager_.get();
+ GtkPrimarySelectionDeviceManager* gtk_primary_selection_device_manager()
+ const {
+ return gtk_primary_selection_device_manager_.get();
+ }
+
+ ZwpPrimarySelectionDeviceManager* zwp_primary_selection_device_manager() const {
+ return zwp_primary_selection_device_manager_.get();
}
WaylandDataDragController* data_drag_controller() const {
@@ -151,6 +168,8 @@ class WaylandConnection {
wl::Object<wl_surface> CreateSurface();
private:
+ friend class WaylandConnectionTestApi;
+
void Flush();
void UpdateInputDevices(wl_seat* seat, uint32_t capabilities);
@@ -192,10 +211,10 @@ class WaylandConnection {
wl::Object<wp_viewporter> viewporter_;
wl::Object<zcr_keyboard_extension_v1> keyboard_extension_v1_;
wl::Object<zwp_text_input_manager_v1> text_input_manager_v1_;
- wl::Object<zaura_shell> aura_shell_;
wl::Object<zwp_linux_explicit_synchronization_v1>
linux_explicit_synchronization_;
wl::Object<zxdg_decoration_manager_v1> xdg_decoration_manager_;
+ wl::Object<zcr_extended_drag_v1> extended_drag_v1_;
// Event source instance. Must be declared before input objects so it
// outlives them so thus being able to properly handle their destruction.
@@ -211,6 +230,8 @@ class WaylandConnection {
std::unique_ptr<WaylandClipboard> clipboard_;
std::unique_ptr<WaylandOutputManager> wayland_output_manager_;
std::unique_ptr<WaylandCursorPosition> wayland_cursor_position_;
+ std::unique_ptr<WaylandZAuraShell> zaura_shell_;
+ std::unique_ptr<WaylandZcrCursorShapes> zcr_cursor_shapes_;
std::unique_ptr<WaylandZwpLinuxDmabuf> zwp_dmabuf_;
std::unique_ptr<WaylandDrm> drm_;
std::unique_ptr<WaylandShm> shm_;
@@ -218,7 +239,10 @@ class WaylandConnection {
std::unique_ptr<XdgForeignWrapper> xdg_foreign_;
std::unique_ptr<GtkPrimarySelectionDeviceManager>
- primary_selection_device_manager_;
+ gtk_primary_selection_device_manager_;
+
+ std::unique_ptr<ZwpPrimarySelectionDeviceManager>
+ zwp_primary_selection_device_manager_;
std::unique_ptr<WaylandDataDragController> data_drag_controller_;
std::unique_ptr<WaylandWindowDragController> window_drag_controller_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h b/chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h
new file mode 100644
index 00000000000..24edbeeb21a
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_connection_test_api.h
@@ -0,0 +1,35 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_CONNECTION_TEST_API_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_CONNECTION_TEST_API_H_
+
+#include <memory>
+#include <utility>
+
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+
+namespace ui {
+
+class WaylandConnection;
+
+// Allows tests to override private data in a WaylandConnection.
+class WaylandConnectionTestApi {
+ public:
+ explicit WaylandConnectionTestApi(WaylandConnection* impl) : impl_(impl) {}
+ WaylandConnectionTestApi(const WaylandConnectionTestApi&) = delete;
+ WaylandConnectionTestApi& operator=(const WaylandConnectionTestApi&) = delete;
+ ~WaylandConnectionTestApi() = default;
+
+ void SetZcrCursorShapes(std::unique_ptr<WaylandZcrCursorShapes> obj) {
+ impl_->zcr_cursor_shapes_ = std::move(obj);
+ }
+
+ private:
+ WaylandConnection* const impl_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_CONNECTION_TEST_API_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
index fa12bbb1e31..44218ecc612 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.cc
@@ -9,6 +9,7 @@
#include "base/logging.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/geometry/point.h"
#include "ui/gfx/skia_util.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
@@ -33,8 +34,9 @@ void WaylandCursor::OnBufferRelease(void* data, wl_buffer* buffer) {
}
void WaylandCursor::UpdateBitmap(const std::vector<SkBitmap>& cursor_image,
- const gfx::Point& hotspot,
- uint32_t serial) {
+ const gfx::Point& hotspot_in_dips,
+ uint32_t serial,
+ int buffer_scale) {
DCHECK(connection_->shm());
if (!pointer_)
return;
@@ -61,8 +63,10 @@ void WaylandCursor::UpdateBitmap(const std::vector<SkBitmap>& cursor_image,
wl::DrawBitmap(image, &buffer);
+ wl_surface_set_buffer_scale(pointer_surface_.get(), buffer_scale);
+
wl_pointer_set_cursor(pointer_->wl_object(), serial, pointer_surface_.get(),
- hotspot.x(), hotspot.y());
+ hotspot_in_dips.x(), hotspot_in_dips.y());
wl_surface_damage(pointer_surface_.get(), 0, 0, image_size.width(),
image_size.height());
wl_surface_attach(pointer_surface_.get(), buffer.get(), 0, 0);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.h b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.h
index bb4978d2d3d..e60191eced4 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_cursor.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_cursor.h
@@ -39,9 +39,14 @@ class WaylandCursor {
// Updates wl_pointer's visual representation with the given bitmap
// image set and hotspot.
+ // The cursor bitmap should already match the device scale factor.
+ // `buffer_scale` should match the scale of the window surface, so that we
+ // can pass this information to the compositor which will avoid scaling it
+ // again.
void UpdateBitmap(const std::vector<SkBitmap>& bitmaps,
- const gfx::Point& hotspot,
- uint32_t serial);
+ const gfx::Point& hotspot_in_dips,
+ uint32_t serial,
+ int buffer_scale);
private:
// wl_buffer_listener:
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_source.cc b/chromium/ui/ozone/platform/wayland/host/wayland_data_source.cc
index aaaf384f3e9..2788c040a64 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_source.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_source.cc
@@ -5,6 +5,7 @@
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
#include <gtk-primary-selection-client-protocol.h>
+#include <primary-selection-unstable-v1-client-protocol.h>
#include <cstdint>
#include <vector>
@@ -145,6 +146,26 @@ void DataSource<gtk_primary_selection_source>::Offer(
connection_->ScheduleFlush();
}
+template <>
+void DataSource<zwp_primary_selection_source_v1>::Initialize() {
+ static const struct zwp_primary_selection_source_v1_listener
+ kDataSourceListener = {
+ DataSource<zwp_primary_selection_source_v1>::OnSend,
+ DataSource<zwp_primary_selection_source_v1>::OnCancel};
+ zwp_primary_selection_source_v1_add_listener(data_source_.get(),
+ &kDataSourceListener, this);
+}
+
+template <>
+void DataSource<zwp_primary_selection_source_v1>::Offer(
+ const std::vector<std::string>& mime_types) {
+ for (const auto& mime_type : mime_types)
+ zwp_primary_selection_source_v1_offer(data_source_.get(),
+ mime_type.c_str());
+ connection_->ScheduleFlush();
+}
+
template class DataSource<gtk_primary_selection_source>;
+template class DataSource<zwp_primary_selection_source_v1>;
} // namespace wl
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h b/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h
index 2bcee213cc5..b78a7f1eaf0 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_data_source.h
@@ -15,6 +15,7 @@
struct wl_data_source;
struct gtk_primary_selection_source;
+struct zwp_primary_selection_source_v1;
namespace wl {
template <typename T>
@@ -34,13 +35,13 @@ class WaylandConnection;
// Implementation wise, these variants are share a single class template, with
// specializations defined for each underlying supported extensions. Below are
// the type aliases for the variants currently supported.
-//
-// TODO(crbug.com/1088132): Support standard primary selection extension.
using WaylandDataSource = wl::DataSource<wl_data_source>;
using GtkPrimarySelectionSource = wl::DataSource<gtk_primary_selection_source>;
+using ZwpPrimarySelectionSource = wl::DataSource<zwp_primary_selection_source_v1>;
+
} // namespace ui
namespace wl {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
index 8669a18a8b5..a7bd5baba4f 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
@@ -6,7 +6,10 @@
#include "base/bind.h"
#include "base/command_line.h"
+#include "base/logging.h"
#include "base/memory/ptr_util.h"
+#include "base/notreached.h"
+#include "base/optional.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/base/ime/composition_text.h"
@@ -14,15 +17,32 @@
#include "ui/events/base_event_utils.h"
#include "ui/events/event.h"
#include "ui/events/keycodes/dom/dom_code.h"
-#include "ui/events/keycodes/dom/keycode_converter.h"
-#include "ui/events/ozone/evdev/keyboard_util_evdev.h"
#include "ui/events/types/event_type.h"
#include "ui/gfx/range/range.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h"
#include "ui/ozone/public/ozone_switches.h"
+#if BUILDFLAG(USE_XKBCOMMON)
+#include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h"
+#endif
+
namespace ui {
+namespace {
+
+base::Optional<size_t> OffsetFromUTF8Offset(const base::StringPiece& text,
+ uint32_t offset) {
+ if (offset > text.length())
+ return base::nullopt;
+
+ base::string16 converted;
+ if (!base::UTF8ToUTF16(text.data(), offset, &converted))
+ return base::nullopt;
+
+ return converted.size();
+}
+
+} // namespace
WaylandInputMethodContext::WaylandInputMethodContext(
WaylandConnection* connection,
@@ -49,7 +69,6 @@ void WaylandInputMethodContext::Init(bool initialize_for_testing) {
initialize_for_testing ||
base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableWaylandIme);
-
// If text input instance is not created then all ime context operations
// are noop. This option is because in some environments someone might not
// want to enable ime/virtual keyboard even if it's available.
@@ -123,23 +142,67 @@ void WaylandInputMethodContext::SetSurroundingText(
text_input_->SetSurroundingText(text, selection_range);
}
-void WaylandInputMethodContext::OnPreeditString(const std::string& text,
- int preedit_cursor) {
- gfx::Range selection_range = gfx::Range::InvalidRange();
+void WaylandInputMethodContext::OnPreeditString(
+ base::StringPiece text,
+ const std::vector<SpanStyle>& spans,
+ int32_t preedit_cursor) {
+ ui::CompositionText composition_text;
+ composition_text.text = base::UTF8ToUTF16(text);
+ for (const auto& span : spans) {
+ ImeTextSpan text_span;
+ auto start_offset = OffsetFromUTF8Offset(text, span.index);
+ if (!start_offset)
+ continue;
+ text_span.start_offset = *start_offset;
+ auto end_offset = OffsetFromUTF8Offset(text, span.index + span.length);
+ if (!end_offset)
+ continue;
+ text_span.end_offset = *end_offset;
+ bool supported = true;
+ switch (span.style) {
+ case ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT:
+ break;
+ case ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_HIGHLIGHT:
+ text_span.thickness = ImeTextSpan::Thickness::kThick;
+ break;
+ case ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_UNDERLINE:
+ text_span.thickness = ImeTextSpan::Thickness::kThin;
+ break;
+ case ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_SELECTION:
+ text_span.type = ImeTextSpan::Type::kSuggestion;
+ break;
+ case ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INCORRECT:
+ text_span.type = ImeTextSpan::Type::kMisspellingSuggestion;
+ break;
+ case ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_NONE:
+ case ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ACTIVE:
+ case ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INACTIVE:
+ default:
+ VLOG(1) << "Unsupported style. Skipped: " << span.style;
+ supported = false;
+ break;
+ }
+ if (!supported)
+ continue;
+ composition_text.ime_text_spans.push_back(std::move(text_span));
+ }
- if (!selection_range.IsValid()) {
- int cursor_pos = (preedit_cursor) ? text.length() : preedit_cursor;
- selection_range.set_start(cursor_pos);
- selection_range.set_end(cursor_pos);
+ if (preedit_cursor < 0) {
+ composition_text.selection = gfx::Range::InvalidRange();
+ } else {
+ auto cursor =
+ OffsetFromUTF8Offset(text, static_cast<uint32_t>(preedit_cursor));
+ if (!cursor) {
+ // Invalid cursor position. Do nothing.
+ return;
+ }
+ composition_text.selection = gfx::Range(*cursor);
}
- ui::CompositionText composition_text;
- composition_text.text = base::UTF8ToUTF16(text);
- composition_text.selection = selection_range;
ime_delegate_->OnPreeditChanged(composition_text);
}
-void WaylandInputMethodContext::OnCommitString(const std::string& text) {
+void WaylandInputMethodContext::OnCommitString(base::StringPiece text) {
ime_delegate_->OnCommit(base::UTF8ToUTF16(text));
}
@@ -148,19 +211,23 @@ void WaylandInputMethodContext::OnDeleteSurroundingText(int32_t index,
ime_delegate_->OnDeleteSurroundingText(index, length);
}
-void WaylandInputMethodContext::OnKeysym(uint32_t key,
+void WaylandInputMethodContext::OnKeysym(uint32_t keysym,
uint32_t state,
uint32_t modifiers) {
+#if BUILDFLAG(USE_XKBCOMMON)
+ // TODO(crbug.com/1079353): Handle modifiers.
DomCode dom_code =
- KeycodeConverter::NativeKeycodeToDomCode(EvdevCodeToNativeCode(key));
- if (dom_code == ui::DomCode::NONE)
+ connection_->keyboard()->layout_engine()->GetDomCodeByKeysym(keysym);
+ if (dom_code == DomCode::NONE)
return;
- // TODO(crbug.com/1079353): Handle modifiers.
EventType type =
state == WL_KEYBOARD_KEY_STATE_PRESSED ? ET_KEY_PRESSED : ET_KEY_RELEASED;
key_delegate_->OnKeyboardKeyEvent(type, dom_code, /*repeat=*/false,
EventTimeForNow());
+#else
+ NOTIMPLEMENTED();
+#endif
}
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h
index 6020ae716b8..19168e38390 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_input_method_context.h
@@ -6,9 +6,10 @@
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_INPUT_METHOD_CONTEXT_H_
#include <memory>
-#include <string>
+#include <vector>
#include "base/macros.h"
+#include "base/strings/string_piece.h"
#include "ui/base/ime/character_composer.h"
#include "ui/base/ime/linux/linux_input_method_context.h"
#include "ui/ozone/platform/wayland/host/wayland_keyboard.h"
@@ -42,10 +43,12 @@ class WaylandInputMethodContext : public LinuxInputMethodContext,
void Blur() override;
// ui::ZWPTextInputWrapperClient
- void OnPreeditString(const std::string& text, int preedit_cursor) override;
- void OnCommitString(const std::string& text) override;
+ void OnPreeditString(base::StringPiece text,
+ const std::vector<SpanStyle>& spans,
+ int32_t preedit_cursor) override;
+ void OnCommitString(base::StringPiece text) override;
void OnDeleteSurroundingText(int32_t index, uint32_t length) override;
- void OnKeysym(uint32_t key, uint32_t state, uint32_t modifiers) override;
+ void OnKeysym(uint32_t keysym, uint32_t state, uint32_t modifiers) override;
private:
void UpdatePreeditText(const base::string16& preedit_text);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
index dee622c3f50..7b1e06e7ad5 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.cc
@@ -16,7 +16,6 @@
#include "ui/events/keycodes/dom/dom_key.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/events/keycodes/keyboard_codes_posix.h"
-#include "ui/events/ozone/evdev/keyboard_util_evdev.h"
#include "ui/events/ozone/layout/keyboard_layout_engine.h"
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
#include "ui/events/types/event_type.h"
@@ -45,11 +44,7 @@ WaylandKeyboard::WaylandKeyboard(
connection_(connection),
delegate_(delegate),
auto_repeat_handler_(this),
-#if BUILDFLAG(USE_XKBCOMMON)
- layout_engine_(static_cast<XkbKeyboardLayoutEngine*>(layout_engine)) {
-#else
- layout_engine_(layout_engine) {
-#endif
+ layout_engine_(static_cast<LayoutEngine*>(layout_engine)) {
static const wl_keyboard_listener listener = {
&WaylandKeyboard::Keymap, &WaylandKeyboard::Enter,
&WaylandKeyboard::Leave, &WaylandKeyboard::Key,
@@ -193,8 +188,7 @@ void WaylandKeyboard::DispatchKey(uint32_t key,
base::TimeTicks timestamp,
int device_id,
int flags) {
- DomCode dom_code =
- KeycodeConverter::NativeKeycodeToDomCode(EvdevCodeToNativeCode(key));
+ DomCode dom_code = KeycodeConverter::EvdevCodeToDomCode(key);
if (dom_code == ui::DomCode::NONE)
return;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
index abedf290672..d655dc09cc3 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_keyboard.h
@@ -29,6 +29,14 @@ class WaylandKeyboard : public EventAutoRepeatHandler::Delegate {
public:
class Delegate;
+ using LayoutEngine =
+#if BUILDFLAG(USE_XKBCOMMON)
+ XkbKeyboardLayoutEngine
+#else
+ KeyboardLayoutEngine
+#endif
+ ;
+
WaylandKeyboard(wl_keyboard* keyboard,
zcr_keyboard_extension_v1* keyboard_extension_v1,
WaylandConnection* connection,
@@ -41,6 +49,7 @@ class WaylandKeyboard : public EventAutoRepeatHandler::Delegate {
int modifiers,
DomKey* out_dom_key,
KeyboardCode* out_key_code);
+ LayoutEngine* layout_engine() const { return layout_engine_; }
private:
// wl_keyboard_listener
@@ -99,11 +108,7 @@ class WaylandKeyboard : public EventAutoRepeatHandler::Delegate {
base::OnceClosure auto_repeat_closure_;
wl::Object<wl_callback> sync_callback_;
-#if BUILDFLAG(USE_XKBCOMMON)
- XkbKeyboardLayoutEngine* layout_engine_;
-#else
- KeyboardLayoutEngine* layout_engine_;
-#endif
+ LayoutEngine* layout_engine_;
};
class WaylandKeyboard::Delegate {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.cc b/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.cc
new file mode 100644
index 00000000000..8eed6ce70b5
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.cc
@@ -0,0 +1,23 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/wayland/host/wayland_menu_utils.h"
+
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
+
+namespace ui {
+
+WaylandMenuUtils::WaylandMenuUtils(WaylandConnection* connection)
+ : connection_(connection) {}
+
+WaylandMenuUtils::~WaylandMenuUtils() = default;
+
+int WaylandMenuUtils::GetCurrentKeyModifiers() const {
+ DCHECK(connection_);
+ DCHECK(connection_->event_source());
+ return connection_->event_source()->keyboard_modifiers();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h b/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h
new file mode 100644
index 00000000000..c9a0bbaa949
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_menu_utils.h
@@ -0,0 +1,29 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_MENU_UTILS_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_MENU_UTILS_H_
+
+#include "ui/ozone/public/platform_menu_utils.h"
+
+namespace ui {
+
+class WaylandConnection;
+
+class WaylandMenuUtils : public PlatformMenuUtils {
+ public:
+ explicit WaylandMenuUtils(WaylandConnection* connection);
+ WaylandMenuUtils(const WaylandMenuUtils&) = delete;
+ WaylandMenuUtils& operator=(const WaylandMenuUtils&) = delete;
+ ~WaylandMenuUtils() override;
+
+ int GetCurrentKeyModifiers() const override;
+
+ private:
+ WaylandConnection* const connection_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_MENU_UTILS_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
index 8e6fd03896b..91e9b9707c6 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
@@ -10,6 +10,7 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "ui/events/event.h"
#include "ui/ozone/platform/wayland/host/wayland_cursor.h"
@@ -247,13 +248,13 @@ TEST_P(WaylandPointerTest, SetBitmap) {
SkImageInfo::Make(16, 16, kUnknown_SkColorType, kUnknown_SkAlphaType));
EXPECT_CALL(*pointer_, SetCursor(nullptr, 0, 0));
- connection_->SetCursorBitmap({}, {});
+ connection_->SetCursorBitmap({}, {}, 1.0);
connection_->ScheduleFlush();
Sync();
Mock::VerifyAndClearExpectations(pointer_);
EXPECT_CALL(*pointer_, SetCursor(Ne(nullptr), 5, 8));
- connection_->SetCursorBitmap({dummy_cursor}, gfx::Point(5, 8));
+ connection_->SetCursorBitmap({dummy_cursor}, gfx::Point(5, 8), 1.0);
connection_->ScheduleFlush();
Sync();
Mock::VerifyAndClearExpectations(pointer_);
@@ -267,8 +268,8 @@ TEST_P(WaylandPointerTest, SetBitmapOnPointerFocus) {
dummy_cursor.allocPixels(info, 10 * 4);
BitmapCursorFactoryOzone cursor_factory;
- PlatformCursor cursor =
- cursor_factory.CreateImageCursor(dummy_cursor, gfx::Point(5, 8));
+ PlatformCursor cursor = cursor_factory.CreateImageCursor(
+ mojom::CursorType::kCustom, dummy_cursor, gfx::Point(5, 8));
scoped_refptr<BitmapCursorOzone> bitmap =
BitmapCursorFactoryOzone::GetBitmapCursor(cursor);
@@ -312,12 +313,18 @@ TEST_P(WaylandPointerTest, FlingVertical) {
// 1st axis event.
SendAxisEvents(pointer_->resource(), ++time, WL_POINTER_AXIS_SOURCE_FINGER,
WL_POINTER_AXIS_VERTICAL_SCROLL, 10);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// 2nd axis event.
SendAxisEvents(pointer_->resource(), ++time, WL_POINTER_AXIS_SOURCE_FINGER,
WL_POINTER_AXIS_VERTICAL_SCROLL, 10);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// axis_stop event which should trigger fling scroll.
SendAxisStopEvents(pointer_->resource(), ++time);
-
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
Sync();
// Usual axis events should follow before the fling event.
@@ -360,12 +367,18 @@ TEST_P(WaylandPointerTest, FlingHorizontal) {
// 1st axis event.
SendAxisEvents(pointer_->resource(), ++time, WL_POINTER_AXIS_SOURCE_FINGER,
WL_POINTER_AXIS_HORIZONTAL_SCROLL, 10);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// 2nd axis event.
SendAxisEvents(pointer_->resource(), ++time, WL_POINTER_AXIS_SOURCE_FINGER,
WL_POINTER_AXIS_HORIZONTAL_SCROLL, 10);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// axis_stop event which should trigger fling scroll.
SendAxisStopEvents(pointer_->resource(), ++time);
-
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
Sync();
// Usual axis events should follow before the fling event.
@@ -409,16 +422,25 @@ TEST_P(WaylandPointerTest, FlingCancel) {
// 1st axis event.
SendAxisEvents(pointer_->resource(), ++time, WL_POINTER_AXIS_SOURCE_FINGER,
WL_POINTER_AXIS_VERTICAL_SCROLL, 10);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// 2nd axis event.
SendAxisEvents(pointer_->resource(), ++time, WL_POINTER_AXIS_SOURCE_FINGER,
WL_POINTER_AXIS_VERTICAL_SCROLL, 10);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// 3rd axis event, whose offset is 0, should make the following axis_stop
// trigger fling cancel.
SendAxisEvents(pointer_->resource(), ++time, WL_POINTER_AXIS_SOURCE_FINGER,
WL_POINTER_AXIS_VERTICAL_SCROLL, 0);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// axis_stop event which should trigger fling cancel.
SendAxisStopEvents(pointer_->resource(), ++time);
-
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
Sync();
// Usual axis events should follow before the fling event.
@@ -466,12 +488,18 @@ TEST_P(WaylandPointerTest, FlingDiagonal) {
// 1st axis event notifies scrolls both in vertical and horizontal.
SendDiagonalAxisEvents(pointer_->resource(), ++time,
WL_POINTER_AXIS_SOURCE_FINGER, 20, 10);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// 2st axis event notifies scrolls both in vertical and horizontal.
SendDiagonalAxisEvents(pointer_->resource(), ++time,
WL_POINTER_AXIS_SOURCE_FINGER, 20, 10);
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
+ Sync();
+
// axis_stop event which should trigger fling scroll.
SendAxisStopEvents(pointer_->resource(), ++time);
-
+ task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(1));
Sync();
// Usual axis events should follow before the fling event.
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc b/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
index d4d60cb9d41..62601c3dde5 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_popup.cc
@@ -47,6 +47,7 @@ void WaylandPopup::Show(bool inactive) {
UpdateBufferScale(false);
connection()->ScheduleFlush();
+ WaylandWindow::Show(inactive);
}
void WaylandPopup::Hide() {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_screen.cc b/chromium/ui/ozone/platform/wayland/host/wayland_screen.cc
index 9beaf27f2a5..07e4c2864ec 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_screen.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_screen.cc
@@ -13,7 +13,6 @@
#include "ui/display/display.h"
#include "ui/display/display_finder.h"
#include "ui/display/display_list.h"
-#include "ui/display/display_observer.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/display_color_spaces.h"
#include "ui/gfx/geometry/point.h"
@@ -133,6 +132,13 @@ void WaylandScreen::AddOrUpdateDisplay(uint32_t output_id,
window->UpdateBufferScale(true);
}
+void WaylandScreen::OnTabletStateChanged(display::TabletState tablet_state) {
+ auto* observer_list = display_list_.observers();
+ for (auto& observer : *observer_list) {
+ observer.OnDisplayTabletStateChanged(tablet_state);
+ }
+}
+
base::WeakPtr<WaylandScreen> WaylandScreen::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_screen.h b/chromium/ui/ozone/platform/wayland/host/wayland_screen.h
index a8dced4e2db..911892a51f1 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_screen.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_screen.h
@@ -12,6 +12,8 @@
#include "base/observer_list.h"
#include "base/optional.h"
#include "ui/display/display_list.h"
+#include "ui/display/display_observer.h"
+#include "ui/display/tablet_state.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/geometry/point.h"
#include "ui/ozone/public/platform_screen.h"
@@ -37,6 +39,8 @@ class WaylandScreen : public PlatformScreen {
int32_t output_scale);
void OnOutputRemoved(uint32_t output_id);
+ void OnTabletStateChanged(display::TabletState tablet_state);
+
base::WeakPtr<WaylandScreen> GetWeakPtr();
// PlatformScreen overrides:
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc b/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc
index 9b27f61778d..b2bee4149ea 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_subsurface.cc
@@ -19,13 +19,11 @@ gfx::Rect AdjustSubsurfaceBounds(const gfx::Rect& bounds_px,
int32_t parent_buffer_scale) {
// TODO(fangzhoug): Verify the correctness of using ui_scale here, and in
// other ozone wayland files.
- const auto parent_bounds_dip =
- gfx::ScaleToRoundedRect(parent_bounds_px, 1.0 / ui_scale);
+ // Currently, the subsurface tree is at most 1 depth, gpu already sees buffer
+ // bounds in the root_surface-local coordinates. So translation is not
+ // needed for now.
const auto bounds_dip = gfx::ScaleToRoundedRect(bounds_px, 1.0 / ui_scale);
- auto new_bounds_dip =
- wl::TranslateBoundsToParentCoordinates(bounds_dip, parent_bounds_dip);
- return gfx::ScaleToRoundedRect(new_bounds_dip,
- ui_scale / parent_buffer_scale);
+ return gfx::ScaleToRoundedRect(bounds_dip, ui_scale / parent_buffer_scale);
}
} // namespace
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc b/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
index 3cfccaa7138..f3092c43e31 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -7,6 +7,7 @@
#include <viewporter-client-protocol.h>
#include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
@@ -96,8 +97,6 @@ void WaylandSurface::UpdateBufferDamageRegion(
if (!display_size_px_.IsEmpty()) {
viewport_dst =
gfx::ScaleToCeiledSize(display_size_px_, 1.f / buffer_scale_);
- wp_viewport_set_destination(viewport(), viewport_dst.width(),
- viewport_dst.height());
}
if (connection_->compositor_version() >=
@@ -159,6 +158,14 @@ void WaylandSurface::SetBufferScale(int32_t new_scale, bool update_bounds) {
buffer_scale_ = new_scale;
wl_surface_set_buffer_scale(surface_.get(), buffer_scale_);
+
+ if (!display_size_px_.IsEmpty()) {
+ gfx::Size viewport_dst =
+ gfx::ScaleToCeiledSize(display_size_px_, 1.f / buffer_scale_);
+ wp_viewport_set_destination(viewport(), viewport_dst.width(),
+ viewport_dst.height());
+ }
+
connection_->ScheduleFlush();
}
@@ -200,6 +207,10 @@ void WaylandSurface::SetViewportDestination(const gfx::Size& dest_size_px) {
wp_viewport_set_destination(viewport(), -1, -1);
}
display_size_px_ = dest_size_px;
+ gfx::Size viewport_dst =
+ gfx::ScaleToCeiledSize(display_size_px_, 1.f / buffer_scale_);
+ wp_viewport_set_destination(viewport(), viewport_dst.width(),
+ viewport_dst.height());
}
wl::Object<wl_subsurface> WaylandSurface::CreateSubsurface(
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_surface.h b/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
index 7747c6e9250..c026bc22cb7 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_surface.h
@@ -74,10 +74,14 @@ class WaylandSurface {
// See:
// https://cgit.freedesktop.org/wayland/wayland-protocols/tree/stable/viewporter/viewporter.xml
// If |src_rect| is empty, the source rectangle is unset.
+ // Note this method does not send corresponding wayland requests until
+ // attaching the next buffer.
void SetViewportSource(const gfx::RectF& src_rect);
// Set the destination size of the associated wl_surface according to
// |dest_size_px|, which should be in physical pixels.
+ // Note this method sends corresponding wayland requests immediately because
+ // it does not need a new buffer attach to take effect.
void SetViewportDestination(const gfx::Size& dest_size_px);
// Creates a wl_subsurface relating this surface and a parent surface,
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
index 0af423cb801..f58063afdb3 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -21,6 +21,7 @@
#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
#include "ui/ozone/platform/wayland/host/wayland_window_drag_controller.h"
+#include "ui/ozone/platform/wayland/host/wayland_zaura_shell.h"
#include "ui/platform_window/extensions/wayland_extension.h"
#include "ui/platform_window/wm/wm_drop_handler.h"
@@ -131,6 +132,11 @@ void WaylandToplevelWindow::Show(bool inactive) {
}
UpdateBufferScale(false);
+
+ if (auto* drag_controller = connection()->window_drag_controller())
+ drag_controller->OnToplevelWindowCreated(this);
+
+ WaylandWindow::Show(inactive);
}
void WaylandToplevelWindow::Hide() {
@@ -198,6 +204,17 @@ void WaylandToplevelWindow::Minimize() {
void WaylandToplevelWindow::Restore() {
DCHECK(shell_surface_);
+
+ // Differently from other platforms, under Wayland, unmaximizing the dragged
+ // window before starting the drag loop is not needed as it is assumed to be
+ // handled at compositor side, just like in xdg_toplevel_surface::move. So
+ // skip it if there's a window drag session running.
+ auto* drag_controller = connection()->window_drag_controller();
+ if (drag_controller &&
+ drag_controller->state() != WaylandWindowDragController::State::kIdle) {
+ return;
+ }
+
SetWindowState(PlatformWindowState::kNormal);
}
@@ -431,10 +448,10 @@ void WaylandToplevelWindow::SetOrResetRestoredBounds() {
}
void WaylandToplevelWindow::InitializeAuraShell() {
- if (connection()->aura_shell()) {
+ if (connection()->zaura_shell()) {
DCHECK(!aura_surface_);
aura_surface_.reset(zaura_shell_get_aura_surface(
- connection()->aura_shell(), root_surface()->surface()));
+ connection()->zaura_shell()->wl_object(), root_surface()->surface()));
zaura_surface_set_fullscreen_mode(aura_surface_.get(),
ZAURA_SURFACE_FULLSCREEN_MODE_IMMERSIVE);
}
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
index f7e6ae5d8dd..f59e227aba9 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -8,12 +8,14 @@
#include <memory>
#include "base/bind.h"
+#include "build/chromeos_buildflags.h"
#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/ozone/events_ozone.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/geometry/point_f.h"
+#include "ui/ozone/common/features.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
@@ -21,6 +23,7 @@
#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_pointer.h"
#include "ui/ozone/platform/wayland/host/wayland_subsurface.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h"
#include "ui/ozone/public/mojom/wayland/wayland_overlay_config.mojom.h"
namespace {
@@ -39,6 +42,7 @@ WaylandWindow::WaylandWindow(PlatformWindowDelegate* delegate,
WaylandConnection* connection)
: delegate_(delegate),
connection_(connection),
+ wayland_overlay_delegation_enabled_(IsWaylandOverlayDelegationEnabled()),
accelerated_widget_(
connection->wayland_window_manager()->AllocateAcceleratedWidget()) {}
@@ -47,6 +51,10 @@ WaylandWindow::~WaylandWindow() {
PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
+ if (wayland_overlay_delegation_enabled_) {
+ connection_->wayland_window_manager()->RemoveSubsurface(
+ GetWidget(), primary_subsurface_.get());
+ }
for (const auto& widget_subsurface : wayland_subsurfaces()) {
connection_->wayland_window_manager()->RemoveSubsurface(
GetWidget(), widget_subsurface.get());
@@ -106,12 +114,18 @@ void WaylandWindow::SetPointerFocus(bool focus) {
// Whenever the window gets the pointer focus back, we must reinitialize the
// cursor. Otherwise, it is invalidated whenever the pointer leaves the
// surface and is not restored by the Wayland compositor.
- if (has_pointer_focus_ && bitmap_)
- connection_->SetCursorBitmap(bitmap_->bitmaps(), bitmap_->hotspot());
+ if (has_pointer_focus_ && bitmap_) {
+ // Translate physical pixels to DIPs.
+ gfx::Point hotspot_in_dips =
+ gfx::ScaleToRoundedPoint(bitmap_->hotspot(), 1.0f / ui_scale_);
+ connection_->SetCursorBitmap(bitmap_->bitmaps(), hotspot_in_dips,
+ buffer_scale());
+ }
}
void WaylandWindow::Show(bool inactive) {
- NOTREACHED();
+ if (background_buffer_id_ != 0u)
+ should_attach_background_buffer_ = true;
}
void WaylandWindow::Hide() {
@@ -138,7 +152,7 @@ void WaylandWindow::SetBounds(const gfx::Rect& bounds_px) {
delegate_->OnBoundsChanged(bounds_px_);
}
-gfx::Rect WaylandWindow::GetBounds() {
+gfx::Rect WaylandWindow::GetBounds() const {
return bounds_px_;
}
@@ -207,11 +221,33 @@ void WaylandWindow::SetCursor(PlatformCursor cursor) {
bitmap_ = bitmap;
- if (bitmap_) {
- connection_->SetCursorBitmap(bitmap_->bitmaps(), bitmap_->hotspot());
- } else {
- connection_->SetCursorBitmap(std::vector<SkBitmap>(), gfx::Point());
+ if (!bitmap_) {
+ // Hide the cursor.
+ connection_->SetCursorBitmap(std::vector<SkBitmap>(), gfx::Point(),
+ buffer_scale());
+ return;
}
+ // Check for Wayland server-side cursor support (e.g. exo for lacros).
+ if (connection_->zcr_cursor_shapes()) {
+ base::Optional<int32_t> shape =
+ WaylandZcrCursorShapes::ShapeFromType(bitmap->type());
+ // If the server supports this cursor type, use a server-side cursor.
+ if (shape.has_value()) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+ // Lacros should not load image assets for default cursors. See
+ // BitmapCursorFactoryOzone::GetDefaultCursor().
+ DCHECK(bitmap_->bitmaps().empty());
+#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
+ connection_->zcr_cursor_shapes()->SetCursorShape(shape.value());
+ return;
+ }
+ // Fall through to client-side bitmap cursors.
+ }
+ // Translate physical pixels to DIPs.
+ gfx::Point hotspot_in_dips =
+ gfx::ScaleToRoundedPoint(bitmap_->hotspot(), 1.0f / ui_scale_);
+ connection_->SetCursorBitmap(bitmap_->bitmaps(), hotspot_in_dips,
+ buffer_scale());
}
void WaylandWindow::MoveCursorTo(const gfx::Point& location) {
@@ -351,6 +387,15 @@ bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
if (!OnInitialize(std::move(properties)))
return false;
+ if (wayland_overlay_delegation_enabled_) {
+ primary_subsurface_ =
+ std::make_unique<WaylandSubsurface>(connection_, this);
+ if (!primary_subsurface_->surface())
+ return false;
+ connection_->wayland_window_manager()->AddSubsurface(
+ GetWidget(), primary_subsurface_.get());
+ }
+
connection_->ScheduleFlush();
PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
@@ -530,6 +575,10 @@ bool WaylandWindow::CommitOverlays(
size_t above = (overlays.end() - split) - num_primary_planes;
size_t below = split - overlays.begin();
+
+ if (overlays.front()->z_order == INT32_MIN)
+ --below;
+
// Re-arrange the list of subsurfaces to fit the |overlays|. Request extra
// subsurfaces if needed.
if (!ArrangeSubsurfaceStack(above, below))
@@ -542,12 +591,14 @@ bool WaylandWindow::CommitOverlays(
auto overlay_iter = split - 1;
for (auto iter = subsurface_stack_below_.begin();
iter != subsurface_stack_below_.end(); ++iter, --overlay_iter) {
- if (overlay_iter >= overlays.begin()) {
+ if (overlays.front()->z_order == INT32_MIN
+ ? overlay_iter >= ++overlays.begin()
+ : overlay_iter >= overlays.begin()) {
WaylandSurface* reference_above = nullptr;
if (overlay_iter == split - 1) {
// It's possible that |overlays| does not contain primary plane, we
// still want to place relative to the surface with z_order=0.
- reference_above = root_surface();
+ reference_above = primary_subsurface_->wayland_surface();
} else {
reference_above = (*std::next(iter))->wayland_surface();
}
@@ -576,7 +627,7 @@ bool WaylandWindow::CommitOverlays(
if (overlay_iter == split + num_primary_planes) {
// It's possible that |overlays| does not contain primary plane, we
// still want to place relative to the surface with z_order=0.
- reference_below = root_surface();
+ reference_below = primary_subsurface_->wayland_surface();
} else {
reference_below = (*std::prev(iter))->wayland_surface();
}
@@ -595,12 +646,36 @@ bool WaylandWindow::CommitOverlays(
}
}
- if (num_primary_planes) {
+ if (!wayland_overlay_delegation_enabled_) {
connection_->buffer_manager_host()->CommitBufferInternal(
root_surface(), (*split)->buffer_id, (*split)->damage_region,
/*wait_for_frame_callback=*/true);
+ return true;
+ }
+
+ if (num_primary_planes) {
+ primary_subsurface_->ConfigureAndShowSurface(
+ (*split)->transform, (*split)->crop_rect, (*split)->bounds_rect,
+ (*split)->enable_blend, nullptr, nullptr);
+ connection_->buffer_manager_host()->CommitBufferInternal(
+ primary_subsurface_->wayland_surface(), (*split)->buffer_id,
+ (*split)->damage_region, /*wait_for_frame_callback=*/false);
+ }
+
+ root_surface_->SetViewportDestination(bounds_px_.size());
+
+ if (overlays.front()->z_order == INT32_MIN) {
+ background_buffer_id_ = overlays.front()->buffer_id;
+ should_attach_background_buffer_ = true;
+ }
+
+ if (should_attach_background_buffer_) {
+ connection_->buffer_manager_host()->CommitBufferInternal(
+ root_surface(), background_buffer_id_, /*damage_region=*/gfx::Rect(),
+ /*wait_for_frame_callback=*/true);
+ should_attach_background_buffer_ = false;
} else {
- // Subsurfaces are set to sync, above operations will only take effects
+ // Subsurfaces are set to sync, above surface configs will only take effect
// when root_surface is committed.
connection_->buffer_manager_host()->CommitWithoutBufferInternal(
root_surface(), /*wait_for_frame_callback=*/true);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window.h b/chromium/ui/ozone/platform/wayland/host/wayland_window.h
index c341ddb148a..e719914fdd4 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window.h
@@ -59,6 +59,9 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
void UpdateBufferScale(bool update_bounds);
WaylandSurface* root_surface() const { return root_surface_.get(); }
+ WaylandSubsurface* primary_subsurface() const {
+ return primary_subsurface_.get();
+ }
const WidgetSubsurfaceSet& wayland_subsurfaces() const {
return wayland_subsurfaces_;
}
@@ -115,7 +118,7 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
bool IsVisible() const override;
void PrepareForShutdown() override;
void SetBounds(const gfx::Rect& bounds) override;
- gfx::Rect GetBounds() override;
+ gfx::Rect GetBounds() const override;
void SetTitle(const base::string16& title) override;
void SetCapture() override;
void ReleaseCapture() override;
@@ -229,13 +232,21 @@ class WaylandWindow : public PlatformWindow, public PlatformEventDispatcher {
WaylandWindow* parent_window_ = nullptr;
WaylandWindow* child_window_ = nullptr;
+ bool should_attach_background_buffer_ = false;
+ uint32_t background_buffer_id_ = 0u;
+ // |root_surface_| is a surface for the opaque background. Its z-order is
+ // INT32_MIN.
std::unique_ptr<WaylandSurface> root_surface_;
+ // |primary_subsurface| is the primary that shows the widget content.
+ std::unique_ptr<WaylandSubsurface> primary_subsurface_;
+ // Subsurfaces excluding the primary_subsurface
WidgetSubsurfaceSet wayland_subsurfaces_;
+ bool wayland_overlay_delegation_enabled_;
// The stack of sub-surfaces to take effect when Commit() is called.
// |subsurface_stack_above_| refers to subsurfaces that are stacked above the
- // parent.
- // Subsurface at the front of the list is the closest to the parent.
+ // primary.
+ // Subsurface at the front of the list is the closest to the primary.
std::list<WaylandSubsurface*> subsurface_stack_above_;
std::list<WaylandSubsurface*> subsurface_stack_below_;
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
index 548359854c5..05f6bcc2ec7 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
@@ -4,6 +4,9 @@
#include "ui/ozone/platform/wayland/host/wayland_window_drag_controller.h"
+#include <extended-drag-unstable-v1-client-protocol.h>
+#include <wayland-client-protocol.h>
+
#include <cstdint>
#include <memory>
#include <ostream>
@@ -23,8 +26,11 @@
#include "ui/events/platform/scoped_event_dispatcher.h"
#include "ui/events/platform_event.h"
#include "ui/events/types/event_type.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/point_conversions.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/vector2d.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
#include "ui/ozone/platform/wayland/host/wayland_cursor_position.h"
#include "ui/ozone/platform/wayland/host/wayland_data_device_manager.h"
@@ -35,6 +41,7 @@
#include "ui/ozone/platform/wayland/host/wayland_surface.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
#include "ui/ozone/platform/wayland/host/wayland_window_manager.h"
+#include "ui/platform_window/platform_window_init_properties.h"
namespace ui {
@@ -49,6 +56,30 @@ constexpr uint32_t kDndActionWindowDrag =
} // namespace
+class WaylandWindowDragController::ExtendedDragSource {
+ public:
+ ExtendedDragSource(const WaylandConnection& connection,
+ wl_data_source* source) {
+ DCHECK(connection.extended_drag_v1());
+ uint32_t options = ZCR_EXTENDED_DRAG_V1_OPTIONS_ALLOW_SWALLOW |
+ ZCR_EXTENDED_DRAG_V1_OPTIONS_ALLOW_DROP_NO_TARGET |
+ ZCR_EXTENDED_DRAG_V1_OPTIONS_LOCK_CURSOR;
+ source_.reset(zcr_extended_drag_v1_get_extended_drag_source(
+ connection.extended_drag_v1(), source, options));
+ DCHECK(source_);
+ }
+
+ void SetDraggedWindow(WaylandToplevelWindow* window,
+ const gfx::Vector2d& offset) {
+ auto* surface = window ? window->root_surface()->surface() : nullptr;
+ zcr_extended_drag_source_v1_drag(source_.get(), surface, offset.x(),
+ offset.y());
+ }
+
+ private:
+ wl::Object<zcr_extended_drag_source_v1> source_;
+};
+
WaylandWindowDragController::WaylandWindowDragController(
WaylandConnection* connection,
WaylandDataDeviceManager* device_manager,
@@ -82,12 +113,18 @@ bool WaylandWindowDragController::StartDragSession() {
data_source_->Offer({kMimeTypeChromiumWindow});
data_source_->SetAction(DragDropTypes::DRAG_MOVE);
- // TODO(crbug.com/1099418): Use dragged window's surface as icon surface
- // once "immediate drag" protocol extensions are available.
+ if (IsExtendedDragAvailable()) {
+ extended_drag_source_ = std::make_unique<ExtendedDragSource>(
+ *connection_, data_source_->data_source());
+ } else {
+ LOG(ERROR) << "zcr_extended_drag_v1 extension not available! "
+ << "Window/Tab dragging won't be fully functional.";
+ }
+
data_device_->StartDrag(*data_source_, *origin_window_,
/*icon_surface=*/nullptr, this);
-
pointer_grab_owner_ = origin_window_;
+ should_process_drag_event_ = false;
// Observe window so we can take ownership of the origin surface in case it
// is destroyed during the DND session.
@@ -97,14 +134,13 @@ bool WaylandWindowDragController::StartDragSession() {
bool WaylandWindowDragController::Drag(WaylandToplevelWindow* window,
const gfx::Vector2d& offset) {
- DCHECK_EQ(state_, State::kAttached);
+ DCHECK_GE(state_, State::kAttached);
DCHECK(window);
- dragged_window_ = window;
- drag_offset_ = offset;
+ SetDraggedWindow(window, offset);
+ state_ = State::kDetached;
RunLoop();
-
- dragged_window_ = nullptr;
+ SetDraggedWindow(nullptr, {});
DCHECK(state_ == State::kAttached || state_ == State::kDropped);
bool dropped = state_ == State::kDropped;
@@ -141,6 +177,8 @@ void WaylandWindowDragController::OnDragOffer(
DCHECK_GE(state_, State::kAttached);
DCHECK(offer);
DCHECK(!data_offer_);
+
+ VLOG(1) << "OnOffer. mime_types=" << offer->mime_types().size();
data_offer_ = std::move(offer);
}
@@ -180,6 +218,7 @@ void WaylandWindowDragController::OnDragMotion(const gfx::PointF& location) {
VLOG(2) << "OnMotion. location=" << location.ToString();
// Forward cursor location update info to the input handling delegate.
+ should_process_drag_event_ = true;
pointer_location_ = location;
pointer_delegate_->OnPointerMotionEvent(location);
}
@@ -224,12 +263,8 @@ void WaylandWindowDragController::OnDragDrop() {
DCHECK_GE(state_, State::kAttached);
VLOG(1) << "Dropped. state=" << state_;
- // Some compositors, e.g: Exo, may delay the wl_data_source::cancelled event
- // delivery for some seconds, when the drop happens within a toplevel surface.
- // Such event is handled by OnDataSourceFinish() function below, which is the
- // single entry point for the drop event in window drag controller. In order
- // to prevent such delay, the current data offer must be destroyed here.
DCHECK(data_offer_);
+ data_offer_->FinishOffer();
data_offer_.reset();
}
@@ -246,8 +281,19 @@ void WaylandWindowDragController::OnDataSourceFinish(bool completed) {
// Release DND objects.
data_offer_.reset();
data_source_.reset();
+ extended_drag_source_.reset();
origin_surface_.reset();
origin_window_ = nullptr;
+
+ // When extended-drag is available and the drop happens while a non-null
+ // surface was being dragged (i.e: detached mode) which had pointer focus
+ // before the drag session, we must reset focus to it, otherwise it would be
+ // wrongly kept to the latest surface received through wl_data_device::enter
+ // (see OnDragEnter function).
+ if (IsExtendedDragAvailable() && dragged_window_) {
+ pointer_delegate_->OnPointerFocusChanged(dragged_window_,
+ pointer_location_);
+ }
dragged_window_ = nullptr;
// Transition to |kDropped| state and determine the next action to take. If
@@ -287,8 +333,27 @@ uint32_t WaylandWindowDragController::DispatchEvent(
return POST_DISPATCH_PERFORM_DEFAULT;
}
+void WaylandWindowDragController::OnToplevelWindowCreated(
+ WaylandToplevelWindow* window) {
+ // Skip unless a toplevel window is getting visible while in attached mode.
+ // E.g: A window/tab is being detached in a tab dragging session.
+ if (state_ != State::kAttached)
+ return;
+
+ DCHECK(window);
+ auto origin = window->GetBounds().origin();
+ gfx::Vector2d offset = gfx::ToFlooredPoint(pointer_location_) - origin;
+ VLOG(1) << "Toplevel window created (detached)."
+ << " widget=" << window->GetWidget()
+ << " calculated_offset=" << offset.ToString();
+
+ SetDraggedWindow(window, offset);
+ state_ = State::kDetached;
+}
+
void WaylandWindowDragController::OnWindowRemoved(WaylandWindow* window) {
DCHECK_NE(state_, State::kIdle);
+ DCHECK_NE(window, dragged_window_);
if (window == origin_window_)
origin_surface_ = origin_window_->TakeWaylandSurface();
}
@@ -298,6 +363,9 @@ void WaylandWindowDragController::HandleMotionEvent(MouseEvent* event) {
DCHECK(dragged_window_);
DCHECK(event);
+ if (!should_process_drag_event_)
+ return;
+
// Update current cursor position, so it can be retrieved later on through
// |Screen::GetCursorScreenPoint| API.
int32_t scale = dragged_window_->buffer_scale();
@@ -314,6 +382,8 @@ void WaylandWindowDragController::HandleMotionEvent(MouseEvent* event) {
gfx::Point new_location = event->location() - drag_offset_;
gfx::Size size = dragged_window_->GetBounds().size();
dragged_window_->SetBounds({new_location, size});
+
+ should_process_drag_event_ = false;
}
// Dispatch mouse release event (to tell clients that the drop just happened)
@@ -334,20 +404,18 @@ void WaylandWindowDragController::HandleDropAndResetState() {
}
void WaylandWindowDragController::RunLoop() {
- DCHECK_EQ(state_, State::kAttached);
+ DCHECK_EQ(state_, State::kDetached);
DCHECK(dragged_window_);
VLOG(1) << "Starting drag loop. widget=" << dragged_window_->GetWidget()
<< " offset=" << drag_offset_.ToString();
- // TODO(crbug.com/896640): Handle cursor
auto old_dispatcher = std::move(nested_dispatcher_);
nested_dispatcher_ =
PlatformEventSource::GetInstance()->OverrideDispatcher(this);
base::WeakPtr<WaylandWindowDragController> alive(weak_factory_.GetWeakPtr());
- state_ = State::kDetached;
base::RunLoop loop(base::RunLoop::Type::kNestableTasksAllowed);
quit_loop_closure_ = loop.QuitClosure();
loop.Run();
@@ -367,6 +435,24 @@ void WaylandWindowDragController::QuitLoop() {
std::move(quit_loop_closure_).Run();
}
+void WaylandWindowDragController::SetDraggedWindow(
+ WaylandToplevelWindow* window,
+ const gfx::Vector2d& offset) {
+ if (dragged_window_ == window && offset == drag_offset_)
+ return;
+
+ dragged_window_ = window;
+ drag_offset_ = offset;
+
+ // TODO(crbug.com/896640): Fallback when extended-drag is not available.
+ if (extended_drag_source_)
+ extended_drag_source_->SetDraggedWindow(dragged_window_, drag_offset_);
+}
+
+bool WaylandWindowDragController::IsExtendedDragAvailable() const {
+ return !!connection_->extended_drag_v1();
+}
+
std::ostream& operator<<(std::ostream& out,
WaylandWindowDragController::State state) {
return out << static_cast<int>(state);
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h
index fcbfae4ad36..94dae03f336 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller.h
@@ -15,7 +15,9 @@
#include "ui/events/event.h"
#include "ui/events/platform/platform_event_dispatcher.h"
#include "ui/events/platform/scoped_event_dispatcher.h"
+#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/vector2d.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/gpu/wayland_surface_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_data_device.h"
#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
@@ -68,7 +70,11 @@ class WaylandWindowDragController : public WaylandDataDevice::DragDelegate,
State state() const { return state_; }
+ void OnToplevelWindowCreated(WaylandToplevelWindow* window);
+
private:
+ class ExtendedDragSource;
+
// WaylandDataDevice::DragDelegate:
bool IsDragSource() const override;
void DrawIcon() override;
@@ -103,6 +109,13 @@ class WaylandWindowDragController : public WaylandDataDevice::DragDelegate,
void RunLoop();
// Unregisters the internal event dispatcher and asks to quit the nested loop.
void QuitLoop();
+ // Set |window| as the current dragged window and |offset| as the drag offset,
+ // which makes |window| to appear anchored to the pointer cursor, if
+ // extended-drag extension is available.
+ void SetDraggedWindow(WaylandToplevelWindow* window,
+ const gfx::Vector2d& offset);
+ // Tells if "extended drag" extension is available.
+ bool IsExtendedDragAvailable() const;
WaylandConnection* const connection_;
WaylandDataDeviceManager* const data_device_manager_;
@@ -119,6 +132,8 @@ class WaylandWindowDragController : public WaylandDataDevice::DragDelegate,
std::unique_ptr<WaylandDataSource> data_source_;
std::unique_ptr<WaylandDataOffer> data_offer_;
+ std::unique_ptr<ExtendedDragSource> extended_drag_source_;
+
// The current toplevel window being dragged, when in detached mode.
WaylandToplevelWindow* dragged_window_ = nullptr;
@@ -138,6 +153,10 @@ class WaylandWindowDragController : public WaylandDataDevice::DragDelegate,
std::unique_ptr<ScopedEventDispatcher> nested_dispatcher_;
base::OnceClosure quit_loop_closure_;
+ // Tells if the current drag event should be processedc. E.g: received through
+ // wl_data_device::motion wayland event.
+ bool should_process_drag_event_ = false;
+
base::WeakPtrFactory<WaylandWindowDragController> weak_factory_{this};
};
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
index 9e6b6e29013..db3944812a3 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
@@ -6,6 +6,7 @@
#include <wayland-server-protocol.h>
#include <wayland-server.h>
#include <wayland-util.h>
+#include <xdg-shell-server-protocol.h>
#include <cstdint>
@@ -23,6 +24,7 @@
#include "ui/ozone/platform/wayland/host/wayland_window_manager.h"
#include "ui/ozone/platform/wayland/test/mock_pointer.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
+#include "ui/ozone/platform/wayland/test/scoped_wl_array.h"
#include "ui/ozone/platform/wayland/test/test_data_device.h"
#include "ui/ozone/platform/wayland/test/test_data_device_manager.h"
#include "ui/ozone/platform/wayland/test/test_data_offer.h"
@@ -160,10 +162,15 @@ class WaylandWindowDragControllerTest : public WaylandTest,
void SendPointerMotion(WaylandWindow* window,
MockPlatformWindowDelegate* delegate,
- gfx::Point location) {
+ gfx::Point location,
+ bool sync_and_ensure_dispatched = true) {
wl_fixed_t x = wl_fixed_from_int(location.x());
wl_fixed_t y = wl_fixed_from_int(location.y());
wl_pointer_send_motion(pointer_->resource(), NextTime(), x, y);
+
+ if (!sync_and_ensure_dispatched)
+ return;
+
EXPECT_CALL(*delegate, DispatchEvent(_)).WillOnce([](Event* event) {
EXPECT_TRUE(event->IsMouseEvent());
EXPECT_EQ(ET_MOUSE_DRAGGED, event->type());
@@ -574,6 +581,148 @@ TEST_P(WaylandWindowDragControllerTest, DragExitAttached) {
screen_->GetLocalProcessWidgetAtPoint({20, 20}, {}));
}
+TEST_P(WaylandWindowDragControllerTest, RestoreDuringWindowDragSession) {
+ const gfx::Rect original_bounds = window_->GetBounds();
+ wl::ScopedWlArray states({XDG_TOPLEVEL_STATE_ACTIVATED});
+
+ // Maximize and check restored bounds is correctly set.
+ const gfx::Rect maximized_bounds = gfx::Rect(0, 0, 1024, 768);
+ EXPECT_CALL(delegate_, OnBoundsChanged(testing::Eq(maximized_bounds)));
+ window_->Maximize();
+ states.AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED);
+ SendConfigureEvent(surface_->xdg_surface(), maximized_bounds.width(),
+ maximized_bounds.height(), 1, states.get());
+ Sync();
+ auto restored_bounds = window_->GetRestoredBoundsInPixels();
+ EXPECT_EQ(original_bounds, restored_bounds);
+
+ // Start a window drag session.
+ SendPointerEnter(window_.get(), &delegate_);
+ SendPointerPress(window_.get(), &delegate_, BTN_LEFT);
+ SendPointerMotion(window_.get(), &delegate_, {10, 10});
+ Sync();
+ EXPECT_EQ(window_->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({10, 10}, {}));
+
+ auto* wayland_extension = GetWaylandExtension(*window_);
+ wayland_extension->StartWindowDraggingSessionIfNeeded();
+ EXPECT_EQ(WaylandWindowDragController::State::kAttached,
+ connection_->window_drag_controller()->state());
+
+ // Call restore and ensure it's no-op.
+ window_->Restore();
+ EXPECT_EQ(PlatformWindowState::kMaximized, window_->GetPlatformWindowState());
+}
+
+// Check the following flow works as expected:
+//
+// 1. With a single 1 window open,
+// 2. Move pointer into it, press left button, move cursor a bit (drag),
+// 3. Run move loop, drag it from 200,200 location to 100,100
+// 4. Send a few wl_pointer::motion events targeting 20,20 location and ensure
+// they are ignored (i.e: window bounds keep unchanged) until drop happens.
+//
+// Verifies window drag controller is resistant to issues such as
+// https://crbug.com/1148021.
+TEST_P(WaylandWindowDragControllerTest, IgnorePointerEventsUntilDrop) {
+ // Ensure there is no window currently focused
+ EXPECT_FALSE(window_manager()->GetCurrentFocusedWindow());
+ EXPECT_EQ(gfx::kNullAcceleratedWidget,
+ screen_->GetLocalProcessWidgetAtPoint({200, 200}, {}));
+
+ SendPointerEnter(window_.get(), &delegate_);
+ SendPointerPress(window_.get(), &delegate_, BTN_LEFT);
+ SendPointerMotion(window_.get(), &delegate_, {200, 200});
+
+ // Set up an "interaction flow", start the drag session and run move loop:
+ // - Event dispatching and bounds changes are monitored
+ // - At each event, emulates a new event at server side and proceeds to the
+ // next test step.
+ auto* wayland_extension = GetWaylandExtension(*window_);
+ wayland_extension->StartWindowDraggingSessionIfNeeded();
+ EXPECT_EQ(State::kAttached, drag_controller()->state());
+
+ auto* move_loop_handler = GetWmMoveLoopHandler(*window_);
+ DCHECK(move_loop_handler);
+
+ enum { kStarted, kDragging, kDropping, kDone } test_step = kStarted;
+
+ EXPECT_CALL(delegate_, DispatchEvent(_)).WillRepeatedly([&](Event* event) {
+ EXPECT_TRUE(event->IsMouseEvent());
+ switch (test_step) {
+ case kStarted:
+ EXPECT_EQ(ET_MOUSE_ENTERED, event->type());
+ EXPECT_EQ(State::kDetached, drag_controller()->state());
+ // Ensure PlatformScreen keeps consistent.
+ EXPECT_EQ(window_->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({200, 200}, {}));
+ // Drag it a bit more.
+ SendDndMotion({100, 100});
+ test_step = kDragging;
+ break;
+ case kDropping:
+ EXPECT_EQ(ET_MOUSE_RELEASED, event->type());
+ EXPECT_EQ(State::kDropped, drag_controller()->state());
+
+ // Ensure |window_|'s bounds did not change in response to 20,20
+ // wl_pointer::motion events sent at |kDragging| test step.
+ EXPECT_EQ(gfx::kNullAcceleratedWidget,
+ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {}));
+ EXPECT_EQ(window_->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({100, 100}, {}));
+
+ // Rather, only PlatformScreen's cursor position is updated accordingly.
+ EXPECT_EQ(gfx::Point(20, 20), screen_->GetCursorScreenPoint());
+ test_step = kDone;
+ break;
+ case kDone:
+ EXPECT_EQ(ET_MOUSE_EXITED, event->type());
+ EXPECT_EQ(window_->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({100, 100}, {}));
+ break;
+ case kDragging:
+ default:
+ FAIL() << " event=" << event->ToString()
+ << " state=" << drag_controller()->state()
+ << " step=" << static_cast<int>(test_step);
+ return;
+ }
+ });
+
+ EXPECT_CALL(delegate_, OnBoundsChanged(_))
+ .WillOnce([&](const gfx::Rect& bounds) {
+ EXPECT_EQ(State::kDetached, drag_controller()->state());
+ EXPECT_EQ(kDragging, test_step);
+ EXPECT_EQ(gfx::Point(100, 100), bounds.origin());
+
+ // Send a few wl_pointer::motion events skipping sync and dispatch
+ // checks, which will be done at |kDropping| test step handling.
+ SendPointerMotion(window_.get(), &delegate_, {30, 30},
+ /*sync_and_ensure_dispatched =*/false);
+ SendPointerMotion(window_.get(), &delegate_, {20, 20},
+ /*sync_and_ensure_dispatched =*/false);
+
+ SendDndDrop();
+ test_step = kDropping;
+ });
+
+ // RunMoveLoop() blocks until the dragging session ends, so resume test
+ // server's run loop until it returns.
+ server_.Resume();
+ move_loop_handler->RunMoveLoop({});
+ server_.Pause();
+
+ SendPointerEnter(window_.get(), &delegate_);
+ Sync();
+
+ EXPECT_EQ(State::kIdle, drag_controller()->state());
+ EXPECT_EQ(window_.get(), window_manager()->GetCurrentFocusedWindow());
+ EXPECT_EQ(window_->GetWidget(),
+ screen_->GetLocalProcessWidgetAtPoint({100, 100}, {}));
+ EXPECT_EQ(gfx::kNullAcceleratedWidget,
+ screen_->GetLocalProcessWidgetAtPoint({20, 20}, {}));
+}
+
INSTANTIATE_TEST_SUITE_P(XdgVersionStableTest,
WaylandWindowDragControllerTest,
::testing::Values(kXdgShellStable));
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
index c081c9c3514..458f6b5f0a4 100644
--- a/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -7,22 +7,30 @@
#include <memory>
#include <utility>
+#include <cursor-shapes-unstable-v1-client-protocol.h>
#include <linux/input.h>
#include <wayland-server-core.h>
#include <xdg-shell-server-protocol.h>
#include <xdg-shell-unstable-v6-server-protocol.h>
+#include "base/files/file_util.h"
+#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
#include "ui/base/hit_test.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/event.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/overlay_transform.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
+#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection_test_api.h"
#include "ui/ozone/platform/wayland/host/wayland_subsurface.h"
+#include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h"
#include "ui/ozone/platform/wayland/test/mock_pointer.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
#include "ui/ozone/platform/wayland/test/test_keyboard.h"
@@ -31,6 +39,7 @@
#include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h"
#include "ui/ozone/platform/wayland/test/wayland_test.h"
#include "ui/ozone/test/mock_platform_window_delegate.h"
+#include "ui/platform_window/platform_window.h"
#include "ui/platform_window/platform_window_init_properties.h"
#include "ui/platform_window/wm/wm_move_resize_handler.h"
@@ -81,6 +90,25 @@ class ScopedWlArray {
wl_array array_;
};
+base::ScopedFD MakeFD() {
+ base::FilePath temp_path;
+ EXPECT_TRUE(base::CreateTemporaryFile(&temp_path));
+ auto file =
+ base::File(temp_path, base::File::FLAG_READ | base::File::FLAG_WRITE |
+ base::File::FLAG_CREATE_ALWAYS);
+ return base::ScopedFD(file.TakePlatformFile());
+}
+
+class MockZcrCursorShapes : public WaylandZcrCursorShapes {
+ public:
+ MockZcrCursorShapes() : WaylandZcrCursorShapes(nullptr, nullptr) {}
+ MockZcrCursorShapes(const MockZcrCursorShapes&) = delete;
+ MockZcrCursorShapes& operator=(const MockZcrCursorShapes&) = delete;
+ ~MockZcrCursorShapes() override = default;
+
+ MOCK_METHOD(void, SetCursorShape, (int32_t), (override));
+};
+
} // namespace
class WaylandWindowTest : public WaylandTest {
@@ -162,6 +190,14 @@ class WaylandWindowTest : public WaylandTest {
hit_tests->push_back(static_cast<int>(HTTOPRIGHT));
}
+ MockZcrCursorShapes* InstallMockZcrCursorShapes() {
+ auto zcr_cursor_shapes = std::make_unique<MockZcrCursorShapes>();
+ MockZcrCursorShapes* mock_cursor_shapes = zcr_cursor_shapes.get();
+ WaylandConnectionTestApi test_api(connection_.get());
+ test_api.SetZcrCursorShapes(std::move(zcr_cursor_shapes));
+ return mock_cursor_shapes;
+ }
+
void VerifyAndClearExpectations() {
Mock::VerifyAndClearExpectations(xdg_surface_);
Mock::VerifyAndClearExpectations(&delegate_);
@@ -791,6 +827,56 @@ TEST_P(WaylandWindowTest, CanDispatchMouseEventUnfocus) {
EXPECT_FALSE(window_->CanDispatchEvent(&test_mouse_event_));
}
+TEST_P(WaylandWindowTest, SetCursorUsesZcrCursorShapesForCommonTypes) {
+ MockZcrCursorShapes* mock_cursor_shapes = InstallMockZcrCursorShapes();
+
+ // Verify some commonly-used cursors.
+ EXPECT_CALL(*mock_cursor_shapes,
+ SetCursorShape(ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_POINTER));
+ auto pointer_cursor =
+ base::MakeRefCounted<BitmapCursorOzone>(mojom::CursorType::kPointer);
+ window_->SetCursor(pointer_cursor.get());
+
+ EXPECT_CALL(*mock_cursor_shapes,
+ SetCursorShape(ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_HAND));
+ auto hand_cursor =
+ base::MakeRefCounted<BitmapCursorOzone>(mojom::CursorType::kHand);
+ window_->SetCursor(hand_cursor.get());
+
+ EXPECT_CALL(*mock_cursor_shapes,
+ SetCursorShape(ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_IBEAM));
+ auto ibeam_cursor =
+ base::MakeRefCounted<BitmapCursorOzone>(mojom::CursorType::kIBeam);
+ window_->SetCursor(ibeam_cursor.get());
+}
+
+TEST_P(WaylandWindowTest, SetCursorCallsZcrCursorShapesOncePerCursor) {
+ MockZcrCursorShapes* mock_cursor_shapes = InstallMockZcrCursorShapes();
+ auto hand_cursor =
+ base::MakeRefCounted<BitmapCursorOzone>(mojom::CursorType::kHand);
+ // Setting the same cursor twice on the client only calls the server once.
+ EXPECT_CALL(*mock_cursor_shapes, SetCursorShape(_)).Times(1);
+ window_->SetCursor(hand_cursor.get());
+ window_->SetCursor(hand_cursor.get());
+}
+
+TEST_P(WaylandWindowTest, SetCursorDoesNotUseZcrCursorShapesForNoneCursor) {
+ MockZcrCursorShapes* mock_cursor_shapes = InstallMockZcrCursorShapes();
+ EXPECT_CALL(*mock_cursor_shapes, SetCursorShape(_)).Times(0);
+ // The "none" cursor is represented by nullptr.
+ window_->SetCursor(nullptr);
+}
+
+TEST_P(WaylandWindowTest, SetCursorDoesNotUseZcrCursorShapesForCustomCursors) {
+ MockZcrCursorShapes* mock_cursor_shapes = InstallMockZcrCursorShapes();
+
+ // Custom cursors require bitmaps, so they do not use server-side cursors.
+ EXPECT_CALL(*mock_cursor_shapes, SetCursorShape(_)).Times(0);
+ auto custom_cursor = base::MakeRefCounted<BitmapCursorOzone>(
+ mojom::CursorType::kCustom, SkBitmap(), gfx::Point());
+ window_->SetCursor(custom_cursor.get());
+}
+
ACTION_P(CloneEvent, ptr) {
*ptr = Event::Clone(*arg0);
}
@@ -1879,6 +1965,87 @@ TEST_P(WaylandWindowTest, DestroysCreatesPopupsOnHideShow) {
EXPECT_TRUE(mock_surface->xdg_surface()->xdg_popup());
}
+TEST_P(WaylandWindowTest, RemovesReattachesBackgroundOnHideShow) {
+ EXPECT_TRUE(connection_->buffer_manager_host());
+
+ auto interface_ptr = connection_->buffer_manager_host()->BindInterface();
+ buffer_manager_gpu_->Initialize(std::move(interface_ptr), {}, false);
+
+ // Setup wl_buffers.
+ constexpr uint32_t buffer_id1 = 1;
+ constexpr uint32_t buffer_id2 = 2;
+ gfx::Size buffer_size(1024, 768);
+ auto length = 1024 * 768 * 4;
+ buffer_manager_gpu_->CreateShmBasedBuffer(MakeFD(), length, buffer_size,
+ buffer_id1);
+ buffer_manager_gpu_->CreateShmBasedBuffer(MakeFD(), length, buffer_size,
+ buffer_id2);
+
+ Sync();
+
+ // Create window.
+ MockPlatformWindowDelegate delegate;
+ auto window = CreateWaylandWindowWithParams(
+ PlatformWindowType::kWindow, gfx::kNullAcceleratedWidget,
+ gfx::Rect(0, 0, 100, 100), &delegate);
+ ASSERT_TRUE(window);
+ auto states = InitializeWlArrayWithActivatedState();
+
+ Sync();
+
+ // Configure window to be ready to attach wl_buffers.
+ auto* mock_surface = server_.GetObject<wl::MockSurface>(
+ window->root_surface()->GetSurfaceId());
+ EXPECT_TRUE(mock_surface->xdg_surface());
+ EXPECT_TRUE(mock_surface->xdg_surface()->xdg_toplevel());
+ SendConfigureEvent(mock_surface->xdg_surface(), 100, 100, 1, states.get());
+
+ // Commit a frame with only background.
+ std::vector<ui::ozone::mojom::WaylandOverlayConfigPtr> overlays;
+ ui::ozone::mojom::WaylandOverlayConfigPtr background{
+ ui::ozone::mojom::WaylandOverlayConfig::New()};
+ background->z_order = INT32_MIN;
+ background->transform = gfx::OVERLAY_TRANSFORM_NONE;
+ background->buffer_id = buffer_id1;
+ overlays.push_back(std::move(background));
+ buffer_manager_gpu_->CommitOverlays(window->GetWidget(), std::move(overlays));
+ mock_surface->SendFrameCallback();
+
+ Sync();
+
+ EXPECT_NE(mock_surface->attached_buffer(), nullptr);
+
+ // Hiding window attaches a nil wl_buffer as background.
+ window->Hide();
+ mock_surface->SendFrameCallback();
+
+ Sync();
+
+ EXPECT_EQ(mock_surface->attached_buffer(), nullptr);
+
+ mock_surface->ReleaseBuffer(mock_surface->prev_attached_buffer());
+ window->Show(false);
+
+ Sync();
+
+ SendConfigureEvent(mock_surface->xdg_surface(), 100, 100, 2, states.get());
+
+ // Commit a frame with only the primary_plane.
+ overlays.clear();
+ ui::ozone::mojom::WaylandOverlayConfigPtr primary{
+ ui::ozone::mojom::WaylandOverlayConfig::New()};
+ primary->z_order = 0;
+ primary->transform = gfx::OVERLAY_TRANSFORM_NONE;
+ primary->buffer_id = buffer_id2;
+ overlays.push_back(std::move(primary));
+ buffer_manager_gpu_->CommitOverlays(window->GetWidget(), std::move(overlays));
+
+ Sync();
+
+ // WaylandWindow should automatically reattach the background.
+ EXPECT_NE(mock_surface->attached_buffer(), nullptr);
+}
+
// Tests that if the window gets hidden and shown again, the title, app id and
// size constraints remain the same.
TEST_P(WaylandWindowTest, SetsPropertiesOnShow) {
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc
new file mode 100644
index 00000000000..518a1a7cce6
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc
@@ -0,0 +1,50 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/wayland/host/wayland_zaura_shell.h"
+
+#include <components/exo/wayland/protocol/aura-shell-client-protocol.h>
+
+#include "base/check.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
+#include "ui/ozone/platform/wayland/host/wayland_screen.h"
+
+namespace ui {
+
+WaylandZAuraShell::WaylandZAuraShell(zaura_shell* aura_shell,
+ WaylandConnection* connection)
+ : obj_(aura_shell), connection_(connection) {
+ DCHECK(obj_);
+ DCHECK(connection_);
+
+ static const zaura_shell_listener zaura_shell_listener = {
+ &WaylandZAuraShell::OnLayoutMode,
+ };
+ zaura_shell_add_listener(obj_.get(), &zaura_shell_listener, this);
+}
+
+WaylandZAuraShell::~WaylandZAuraShell() = default;
+
+// static
+void WaylandZAuraShell::OnLayoutMode(void* data,
+ struct zaura_shell* zaura_shell,
+ uint32_t layout_mode) {
+ auto* self = static_cast<WaylandZAuraShell*>(data);
+ auto* screen = self->connection_->wayland_output_manager()->wayland_screen();
+ // |screen| is null in some unit test suites.
+ if (!screen)
+ return;
+
+ switch (layout_mode) {
+ case ZAURA_SHELL_LAYOUT_MODE_WINDOWED:
+ screen->OnTabletStateChanged(display::TabletState::kInClamshellMode);
+ return;
+ case ZAURA_SHELL_LAYOUT_MODE_TABLET:
+ screen->OnTabletStateChanged(display::TabletState::kInTabletMode);
+ return;
+ }
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h
new file mode 100644
index 00000000000..3057ff66ce8
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zaura_shell.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZAURA_SHELL_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZAURA_SHELL_H_
+
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+
+namespace ui {
+
+class WaylandConnection;
+
+// Wraps the zaura_shell object.
+class WaylandZAuraShell {
+ public:
+ WaylandZAuraShell(zaura_shell* aura_shell, WaylandConnection* connection);
+ WaylandZAuraShell(const WaylandZAuraShell&) = delete;
+ WaylandZAuraShell& operator=(const WaylandZAuraShell&) = delete;
+ ~WaylandZAuraShell();
+
+ zaura_shell* wl_object() const { return obj_.get(); }
+
+ private:
+ // zaura_shell_listener
+ static void OnLayoutMode(void* data,
+ struct zaura_shell* zaura_shell,
+ uint32_t layout_mode);
+
+ wl::Object<zaura_shell> obj_;
+ WaylandConnection* const connection_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZAURA_SHELL_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.cc b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.cc
new file mode 100644
index 00000000000..696beda426d
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.cc
@@ -0,0 +1,148 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h"
+
+#include <cursor-shapes-unstable-v1-client-protocol.h>
+
+#include "base/check.h"
+#include "base/optional.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_pointer.h"
+
+namespace ui {
+
+using mojom::CursorType;
+
+WaylandZcrCursorShapes::WaylandZcrCursorShapes(
+ zcr_cursor_shapes_v1* zcr_cursor_shapes,
+ WaylandConnection* connection)
+ : zcr_cursor_shapes_v1_(zcr_cursor_shapes), connection_(connection) {
+ // |zcr_cursor_shapes_v1_| and |connection_| may be null in tests.
+}
+
+WaylandZcrCursorShapes::~WaylandZcrCursorShapes() = default;
+
+// static
+base::Optional<int32_t> WaylandZcrCursorShapes::ShapeFromType(CursorType type) {
+ switch (type) {
+ case CursorType::kNull:
+ // kNull is an alias for kPointer. Fall through.
+ case CursorType::kPointer:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_POINTER;
+ case CursorType::kCross:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_CROSS;
+ case CursorType::kHand:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_HAND;
+ case CursorType::kIBeam:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_IBEAM;
+ case CursorType::kWait:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_WAIT;
+ case CursorType::kHelp:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_HELP;
+ case CursorType::kEastResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_EAST_RESIZE;
+ case CursorType::kNorthResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_RESIZE;
+ case CursorType::kNorthEastResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_EAST_RESIZE;
+ case CursorType::kNorthWestResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_WEST_RESIZE;
+ case CursorType::kSouthResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_RESIZE;
+ case CursorType::kSouthEastResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_EAST_RESIZE;
+ case CursorType::kSouthWestResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_WEST_RESIZE;
+ case CursorType::kWestResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_WEST_RESIZE;
+ case CursorType::kNorthSouthResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_SOUTH_RESIZE;
+ case CursorType::kEastWestResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_EAST_WEST_RESIZE;
+ case CursorType::kNorthEastSouthWestResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_EAST_SOUTH_WEST_RESIZE;
+ case CursorType::kNorthWestSouthEastResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_WEST_SOUTH_EAST_RESIZE;
+ case CursorType::kColumnResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_COLUMN_RESIZE;
+ case CursorType::kRowResize:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_ROW_RESIZE;
+ case CursorType::kMiddlePanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_MIDDLE_PANNING;
+ case CursorType::kEastPanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_EAST_PANNING;
+ case CursorType::kNorthPanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_PANNING;
+ case CursorType::kNorthEastPanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_EAST_PANNING;
+ case CursorType::kNorthWestPanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_WEST_PANNING;
+ case CursorType::kSouthPanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_PANNING;
+ case CursorType::kSouthEastPanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_EAST_PANNING;
+ case CursorType::kSouthWestPanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_WEST_PANNING;
+ case CursorType::kWestPanning:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_WEST_PANNING;
+ case CursorType::kMove:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_MOVE;
+ case CursorType::kVerticalText:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_VERTICAL_TEXT;
+ case CursorType::kCell:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_CELL;
+ case CursorType::kContextMenu:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_CONTEXT_MENU;
+ case CursorType::kAlias:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_ALIAS;
+ case CursorType::kProgress:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_PROGRESS;
+ case CursorType::kNoDrop:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NO_DROP;
+ case CursorType::kCopy:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_COPY;
+ case CursorType::kNone:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NONE;
+ case CursorType::kNotAllowed:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NOT_ALLOWED;
+ case CursorType::kZoomIn:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_ZOOM_IN;
+ case CursorType::kZoomOut:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_ZOOM_OUT;
+ case CursorType::kGrab:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_GRAB;
+ case CursorType::kGrabbing:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_GRABBING;
+ case CursorType::kMiddlePanningVertical:
+ case CursorType::kMiddlePanningHorizontal:
+ // Not supported by this API.
+ return base::nullopt;
+ case CursorType::kCustom:
+ // Custom means a bitmap cursor, which can't use the shape API.
+ return base::nullopt;
+ case CursorType::kDndNone:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_DND_NONE;
+ case CursorType::kDndMove:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_DND_MOVE;
+ case CursorType::kDndCopy:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_DND_COPY;
+ case CursorType::kDndLink:
+ return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_DND_LINK;
+ // NOTE: If you add a new cursor shape, please also update
+ // UseDefaultCursorForType() in bitmap_cursor_factory_ozone.cc.
+ }
+}
+
+void WaylandZcrCursorShapes::SetCursorShape(int32_t shape) {
+ // Nothing to do if there's no pointer (mouse) connected.
+ if (!connection_->pointer())
+ return;
+ zcr_cursor_shapes_v1_set_cursor_shape(
+ zcr_cursor_shapes_v1_.get(), connection_->pointer()->wl_object(), shape);
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h
new file mode 100644
index 00000000000..eafea77ae68
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h
@@ -0,0 +1,42 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_CURSOR_SHAPES_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_CURSOR_SHAPES_H_
+
+#include "base/optional.h"
+#include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+
+namespace ui {
+
+class WaylandConnection;
+
+// Wraps the zcr_cursor_shapes interface for Wayland (exo) server-side cursor
+// support. Exists to support Lacros, which uses server-side cursors for
+// consistency with ARC++ and for accessibility support.
+class WaylandZcrCursorShapes {
+ public:
+ WaylandZcrCursorShapes(zcr_cursor_shapes_v1* zcr_cursor_shapes,
+ WaylandConnection* connection);
+ WaylandZcrCursorShapes(const WaylandZcrCursorShapes&) = delete;
+ WaylandZcrCursorShapes& operator=(const WaylandZcrCursorShapes&) = delete;
+ virtual ~WaylandZcrCursorShapes();
+
+ // Returns the cursor shape value for a cursor |type|, or nullopt if the
+ // type isn't supported by the cursor API.
+ static base::Optional<int32_t> ShapeFromType(mojom::CursorType type);
+
+ // Calls zcr_cursor_shapes_v1_set_cursor_shape(). See interface description
+ // for values for |shape|. Virtual for testing.
+ virtual void SetCursorShape(int32_t shape);
+
+ private:
+ wl::Object<zcr_cursor_shapes_v1> zcr_cursor_shapes_v1_;
+ WaylandConnection* const connection_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_ZCR_CURSOR_SHAPES_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device.cc b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device.cc
new file mode 100644
index 00000000000..afa819257d6
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device.cc
@@ -0,0 +1,72 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/wayland/host/zwp_primary_selection_device.h"
+
+#include <primary-selection-unstable-v1-client-protocol.h>
+
+#include "ui/ozone/platform/wayland/host/zwp_primary_selection_offer.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+
+namespace ui {
+
+// static
+ZwpPrimarySelectionDevice::ZwpPrimarySelectionDevice(
+ WaylandConnection* connection,
+ zwp_primary_selection_device_v1* data_device)
+ : WaylandDataDeviceBase(connection), data_device_(data_device) {
+ static const struct zwp_primary_selection_device_v1_listener kListener = {
+ ZwpPrimarySelectionDevice::OnDataOffer, ZwpPrimarySelectionDevice::OnSelection};
+ zwp_primary_selection_device_v1_add_listener(data_device_.get(), &kListener,
+ this);
+}
+
+ZwpPrimarySelectionDevice::~ZwpPrimarySelectionDevice() = default;
+
+void ZwpPrimarySelectionDevice::SetSelectionSource(
+ ZwpPrimarySelectionSource* source) {
+ DCHECK(source);
+ zwp_primary_selection_device_v1_set_selection(
+ data_device_.get(), source->data_source(), connection()->serial());
+ connection()->ScheduleFlush();
+}
+
+// static
+void ZwpPrimarySelectionDevice::OnDataOffer(
+ void* data,
+ zwp_primary_selection_device_v1* data_device,
+ zwp_primary_selection_offer_v1* offer) {
+ auto* self = static_cast<ZwpPrimarySelectionDevice*>(data);
+ DCHECK(self);
+
+ self->connection()->clipboard()->UpdateSequenceNumber(
+ ClipboardBuffer::kSelection);
+
+ self->set_data_offer(std::make_unique<ZwpPrimarySelectionOffer>(offer));
+}
+
+// static
+void ZwpPrimarySelectionDevice::OnSelection(
+ void* data,
+ zwp_primary_selection_device_v1* data_device,
+ zwp_primary_selection_offer_v1* offer) {
+ auto* self = static_cast<ZwpPrimarySelectionDevice*>(data);
+ DCHECK(self);
+
+ // 'offer' will be null to indicate that the selection is no longer valid,
+ // i.e. there is no longer clipboard data available to paste.
+ if (!offer) {
+ self->ResetDataOffer();
+
+ // Clear Clipboard cache.
+ self->connection()->clipboard()->SetData({}, {});
+ return;
+ }
+
+ DCHECK(self->data_offer());
+ self->data_offer()->EnsureTextMimeTypeIfNeeded();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device.h b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device.h
new file mode 100644
index 00000000000..69a7ee2c397
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device.h
@@ -0,0 +1,50 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_DEVICE_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_DEVICE_H_
+
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_device_base.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+
+struct zwp_primary_selection_device_v1;
+
+namespace ui {
+
+class WaylandConnection;
+
+// This class provides access to primary selection clipboard
+class ZwpPrimarySelectionDevice : public WaylandDataDeviceBase {
+ public:
+ ZwpPrimarySelectionDevice(WaylandConnection* connection,
+ zwp_primary_selection_device_v1* data_device);
+
+ ZwpPrimarySelectionDevice(const ZwpPrimarySelectionDevice&) = delete;
+ ZwpPrimarySelectionDevice& operator =(const ZwpPrimarySelectionDevice&) = delete;
+
+ ~ZwpPrimarySelectionDevice() override;
+
+ zwp_primary_selection_device_v1* data_device() const {
+ return data_device_.get();
+ }
+
+ void SetSelectionSource(ZwpPrimarySelectionSource* source);
+
+ private:
+ // primary_selection_device_listener callbacks
+ static void OnDataOffer(void* data,
+ zwp_primary_selection_device_v1* data_device,
+ zwp_primary_selection_offer_v1* offer);
+ static void OnSelection(void* data,
+ zwp_primary_selection_device_v1* data_device,
+ zwp_primary_selection_offer_v1* offer);
+
+ // The Wayland object wrapped by this instance.
+ wl::Object<zwp_primary_selection_device_v1> data_device_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_DEVICE_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc
new file mode 100644
index 00000000000..f117180b217
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc
@@ -0,0 +1,47 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h"
+
+#include <primary-selection-unstable-v1-client-protocol.h>
+
+#include <memory>
+
+#include "ui/ozone/platform/wayland/host/zwp_primary_selection_device.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+
+namespace ui {
+
+ZwpPrimarySelectionDeviceManager::ZwpPrimarySelectionDeviceManager(
+ zwp_primary_selection_device_manager_v1* manager,
+ WaylandConnection* connection)
+ : device_manager_(manager), connection_(connection) {
+ DCHECK(connection_);
+ DCHECK(device_manager_);
+}
+
+ZwpPrimarySelectionDeviceManager::~ZwpPrimarySelectionDeviceManager() = default;
+
+ZwpPrimarySelectionDevice* ZwpPrimarySelectionDeviceManager::GetDevice() {
+ DCHECK(connection_->seat());
+ if (!device_) {
+ device_ = std::make_unique<ZwpPrimarySelectionDevice>(
+ connection_, zwp_primary_selection_device_manager_v1_get_device(
+ device_manager_.get(), connection_->seat()));
+ }
+ DCHECK(device_);
+ return device_.get();
+}
+
+std::unique_ptr<ZwpPrimarySelectionSource>
+ZwpPrimarySelectionDeviceManager::CreateSource(
+ ZwpPrimarySelectionSource::Delegate* delegate) {
+ auto* data_source = zwp_primary_selection_device_manager_v1_create_source(
+ device_manager_.get());
+ return std::make_unique<ZwpPrimarySelectionSource>(data_source, connection_,
+ delegate);
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h
new file mode 100644
index 00000000000..4f48f897065
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h
@@ -0,0 +1,45 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_DEVICE_MANAGER_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_DEVICE_MANAGER_H_
+
+#include <memory>
+
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_source.h"
+
+namespace ui {
+
+class ZwpPrimarySelectionDevice;
+class WaylandConnection;
+
+class ZwpPrimarySelectionDeviceManager {
+ public:
+ using DataSource = ZwpPrimarySelectionSource;
+ using DataDevice = ZwpPrimarySelectionDevice;
+
+ ZwpPrimarySelectionDeviceManager(
+ zwp_primary_selection_device_manager_v1* manager,
+ WaylandConnection* connection);
+ ZwpPrimarySelectionDeviceManager(const ZwpPrimarySelectionDeviceManager&) = delete;
+ ZwpPrimarySelectionDeviceManager& operator=(
+ const ZwpPrimarySelectionDeviceManager&) = delete;
+ ~ZwpPrimarySelectionDeviceManager();
+
+ ZwpPrimarySelectionDevice* GetDevice();
+ std::unique_ptr<ZwpPrimarySelectionSource> CreateSource(
+ ZwpPrimarySelectionSource::Delegate* delegate);
+
+ private:
+ wl::Object<zwp_primary_selection_device_manager_v1> device_manager_;
+
+ WaylandConnection* const connection_;
+
+ std::unique_ptr<ZwpPrimarySelectionDevice> device_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_DEVICE_MANAGER_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_offer.cc b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_offer.cc
new file mode 100644
index 00000000000..9a869e789b4
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_offer.cc
@@ -0,0 +1,59 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/wayland/host/zwp_primary_selection_offer.h"
+
+#include <primary-selection-unstable-v1-client-protocol.h>
+
+#include <fcntl.h>
+#include <algorithm>
+
+#include "base/check.h"
+#include "base/files/file_util.h"
+#include "base/stl_util.h"
+#include "ui/base/clipboard/clipboard_constants.h"
+
+namespace ui {
+
+ZwpPrimarySelectionOffer::ZwpPrimarySelectionOffer(
+ zwp_primary_selection_offer_v1* data_offer)
+ : data_offer_(data_offer) {
+ static const struct zwp_primary_selection_offer_v1_listener kListener = {
+ ZwpPrimarySelectionOffer::OnOffer};
+ zwp_primary_selection_offer_v1_add_listener(data_offer, &kListener, this);
+}
+
+ZwpPrimarySelectionOffer::~ZwpPrimarySelectionOffer() {
+ data_offer_.reset();
+}
+
+base::ScopedFD ZwpPrimarySelectionOffer::Receive(const std::string& mime_type) {
+ if (!base::Contains(mime_types(), mime_type))
+ return base::ScopedFD();
+
+ base::ScopedFD read_fd;
+ base::ScopedFD write_fd;
+ PCHECK(base::CreatePipe(&read_fd, &write_fd));
+
+ // If we needed to forcibly write "text/plain" as an available
+ // mimetype, then it is safer to "read" the clipboard data with
+ // a mimetype mime_type known to be available.
+ std::string effective_mime_type = mime_type;
+ if (mime_type == kMimeTypeText && text_plain_mime_type_inserted())
+ effective_mime_type = kMimeTypeTextUtf8;
+
+ zwp_primary_selection_offer_v1_receive(
+ data_offer_.get(), effective_mime_type.data(), write_fd.get());
+ return read_fd;
+}
+
+// static
+void ZwpPrimarySelectionOffer::OnOffer(void* data,
+ zwp_primary_selection_offer_v1* data_offer,
+ const char* mime_type) {
+ auto* self = static_cast<ZwpPrimarySelectionOffer*>(data);
+ self->AddMimeType(mime_type);
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_offer.h b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_offer.h
new file mode 100644
index 00000000000..e1b63303f9b
--- /dev/null
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_primary_selection_offer.h
@@ -0,0 +1,50 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_OFFER_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_OFFER_H_
+
+#include <string>
+
+#include "base/files/scoped_file.h"
+#include "base/macros.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/host/wayland_data_offer_base.h"
+
+struct zwp_primary_selection_offer_v1;
+
+namespace ui {
+
+// This class represents a piece of data offered for transfer by another client,
+// the source client (see ZwpPrimarySelectionSource for more). It is used by the
+// primary selection mechanism.
+//
+// The offer describes MIME types that the data can be converted to and provides
+// the mechanism for transferring the data directly from the source client.
+class ZwpPrimarySelectionOffer : public WaylandDataOfferBase {
+ public:
+ // Takes ownership of data_offer.
+ explicit ZwpPrimarySelectionOffer(zwp_primary_selection_offer_v1* data_offer);
+
+ ZwpPrimarySelectionOffer(const ZwpPrimarySelectionOffer &) = delete;
+ ZwpPrimarySelectionOffer &operator =(const ZwpPrimarySelectionOffer &) = delete;
+
+ ~ZwpPrimarySelectionOffer() override;
+
+ // WaylandDataOfferBase overrides:
+ base::ScopedFD Receive(const std::string& mime_type) override;
+
+ private:
+ // primary_selection_offer_listener callbacks.
+ static void OnOffer(void* data,
+ zwp_primary_selection_offer_v1* data_offer,
+ const char* mime_type);
+
+ // The Wayland object wrapped by this instance.
+ wl::Object<zwp_primary_selection_offer_v1> data_offer_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_PRIMARY_SELECTION_OFFER_H_
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h
index 83e84c51776..b306a4d635d 100644
--- a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h
@@ -5,9 +5,13 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_ZWP_TEXT_INPUT_WRAPPER_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_ZWP_TEXT_INPUT_WRAPPER_H_
-#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include <stdint.h>
+
+#include <vector>
#include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
namespace gfx {
class Rect;
@@ -22,18 +26,26 @@ class WaylandWindow;
// Client interface which handles wayland text input callbacks
class ZWPTextInputWrapperClient {
public:
- virtual ~ZWPTextInputWrapperClient() {}
+ struct SpanStyle {
+ uint32_t index; // Byte offset.
+ uint32_t length; // Length in bytes.
+ uint32_t style; // One of preedit_style.
+ };
+
+ virtual ~ZWPTextInputWrapperClient() = default;
// Called when a new composing text (pre-edit) should be set around the
// current cursor position. Any previously set composing text should
// be removed.
- virtual void OnPreeditString(const std::string& text,
+ // Note that the preedit_cursor is byte-offset.
+ virtual void OnPreeditString(base::StringPiece text,
+ const std::vector<SpanStyle>& spans,
int32_t preedit_cursor) = 0;
// Called when a complete input sequence has been entered. The text to
// commit could be either just a single character after a key press or the
// result of some composing (pre-edit).
- virtual void OnCommitString(const std::string& text) = 0;
+ virtual void OnCommitString(base::StringPiece text) = 0;
// Called when client needs to delete all or part of the text surrounding
// the cursor
@@ -51,7 +63,7 @@ class ZWPTextInputWrapperClient {
// IME. This interface collects the functionality behind one wrapper API.
class ZWPTextInputWrapper {
public:
- virtual ~ZWPTextInputWrapper() {}
+ virtual ~ZWPTextInputWrapper() = default;
virtual void Initialize(WaylandConnection* connection,
ZWPTextInputWrapperClient* client) = 0;
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc
index b1c021ad330..8ae6849a3fe 100644
--- a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.cc
@@ -4,6 +4,9 @@
#include "ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h"
+#include <string>
+#include <utility>
+
#include "base/memory/ptr_util.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
@@ -33,7 +36,6 @@ ZWPTextInputWrapperV1::ZWPTextInputWrapperV1(
&ZWPTextInputWrapperV1::OnLanguage, // text_input_language,
&ZWPTextInputWrapperV1::OnTextDirection, // text_input_text_direction
};
- ResetInputEventState();
zwp_text_input_v1* text_input =
zwp_text_input_manager_v1_create_text_input(text_input_manager);
@@ -87,6 +89,7 @@ void ZWPTextInputWrapperV1::SetSurroundingText(
}
void ZWPTextInputWrapperV1::ResetInputEventState() {
+ spans_.clear();
preedit_cursor_ = -1;
}
@@ -121,8 +124,10 @@ void ZWPTextInputWrapperV1::OnPreeditString(
const char* text,
const char* commit) {
ZWPTextInputWrapperV1* wti = static_cast<ZWPTextInputWrapperV1*>(data);
+ auto spans = std::move(wti->spans_);
+ int32_t preedit_cursor = wti->preedit_cursor_;
wti->ResetInputEventState();
- wti->client_->OnPreeditString(std::string(text), wti->preedit_cursor_);
+ wti->client_->OnPreeditString(text, spans, preedit_cursor);
}
void ZWPTextInputWrapperV1::OnPreeditStyling(
@@ -131,7 +136,9 @@ void ZWPTextInputWrapperV1::OnPreeditStyling(
uint32_t index,
uint32_t length,
uint32_t style) {
- NOTIMPLEMENTED_LOG_ONCE();
+ ZWPTextInputWrapperV1* wti = static_cast<ZWPTextInputWrapperV1*>(data);
+ wti->spans_.push_back(
+ ZWPTextInputWrapperClient::SpanStyle{index, length, style});
}
void ZWPTextInputWrapperV1::OnPreeditCursor(
@@ -148,7 +155,7 @@ void ZWPTextInputWrapperV1::OnCommitString(void* data,
const char* text) {
ZWPTextInputWrapperV1* wti = static_cast<ZWPTextInputWrapperV1*>(data);
wti->ResetInputEventState();
- wti->client_->OnCommitString(std::string(text));
+ wti->client_->OnCommitString(text);
}
void ZWPTextInputWrapperV1::OnCursorPosition(
diff --git a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h
index 59f329fb0ca..3dab46b961f 100644
--- a/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h
+++ b/chromium/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h
@@ -5,8 +5,11 @@
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_ZWP_TEXT_INPUT_WRAPPER_V1_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_ZWP_TEXT_INPUT_WRAPPER_V1_H_
+#include <stdint.h>
+
+#include <vector>
+
#include <text-input-unstable-v1-client-protocol.h>
-#include <string>
#include "ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h"
@@ -98,7 +101,8 @@ class ZWPTextInputWrapperV1 : public ZWPTextInputWrapper {
wl::Object<zwp_text_input_v1> obj_;
ZWPTextInputWrapperClient* client_;
- int32_t preedit_cursor_;
+ std::vector<ZWPTextInputWrapperClient::SpanStyle> spans_;
+ int32_t preedit_cursor_ = -1;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index e4968f1bc42..ab143cad1e2 100644
--- a/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -22,6 +22,7 @@
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
#include "ui/gfx/linux/client_native_pixmap_dmabuf.h"
#include "ui/gfx/native_widget_types.h"
+#include "ui/ozone/common/features.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
#include "ui/ozone/platform/wayland/gpu/drm_render_node_path_finder.h"
#include "ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.h"
@@ -30,13 +31,14 @@
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
#include "ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h"
+#include "ui/ozone/platform/wayland/host/wayland_menu_utils.h"
#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_window.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "ui/ozone/public/input_controller.h"
#include "ui/ozone/public/ozone_platform.h"
+#include "ui/ozone/public/platform_menu_utils.h"
#include "ui/ozone/public/system_input_injector.h"
#include "ui/platform_window/platform_window_init_properties.h"
@@ -64,11 +66,6 @@ namespace ui {
namespace {
-constexpr OzonePlatform::InitializedHostProperties
- kWaylandInitializedHostProperties = {
- /*supports_overlays=*/false,
-};
-
class OzonePlatformWayland : public OzonePlatform {
public:
OzonePlatformWayland() { CHECK(features::IsUsingOzonePlatform()); }
@@ -123,12 +120,6 @@ class OzonePlatformWayland : public OzonePlatform {
return connection_->clipboard();
}
- int GetKeyModifiers() const override {
- DCHECK(connection_);
- DCHECK(connection_->event_source());
- return connection_->event_source()->keyboard_modifiers();
- }
-
std::unique_ptr<InputMethod> CreateInputMethod(
internal::InputMethodDelegate* delegate,
gfx::AcceleratedWidget widget) override {
@@ -145,6 +136,10 @@ class OzonePlatformWayland : public OzonePlatform {
return std::make_unique<InputMethodAuraLinux>(delegate);
}
+ PlatformMenuUtils* GetPlatformMenuUtils() override {
+ return menu_utils_.get();
+ }
+
bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
gfx::BufferUsage usage) const override {
// If there is no drm render node device available, native pixmaps are not
@@ -189,7 +184,9 @@ class OzonePlatformWayland : public OzonePlatform {
GtkUiDelegate::SetInstance(gtk_ui_delegate_.get());
#endif
- // TODO(crbug.com/1097007): report which Wayland compositor is used.
+ menu_utils_ = std::make_unique<WaylandMenuUtils>(connection_.get());
+
+ // TODO(crbug.com/1138740): report which Wayland compositor is used.
}
void InitializeGPU(const InitParams& args) override {
@@ -235,6 +232,13 @@ class OzonePlatformWayland : public OzonePlatform {
properties->ignore_screen_bounds_for_menus = true;
properties->app_modal_dialogs_use_event_blocker = true;
+ // Primary planes can be transluscent due to underlay strategy. As a
+ // result Wayland server draws contents occluded by an accelerated widget.
+ // To prevent this, an opaque background image is stacked below the
+ // accelerated widget to occlude contents below.
+ properties->needs_background_image =
+ ui::IsWaylandOverlayDelegationEnabled();
+
initialised = true;
}
@@ -242,7 +246,14 @@ class OzonePlatformWayland : public OzonePlatform {
}
const InitializedHostProperties& GetInitializedHostProperties() override {
- return kWaylandInitializedHostProperties;
+ static base::NoDestructor<OzonePlatform::InitializedHostProperties>
+ properties;
+ static bool initialized = false;
+ if (!initialized) {
+ properties->supports_overlays = ui::IsWaylandOverlayDelegationEnabled();
+ initialized = true;
+ }
+ return *properties;
}
void AddInterfaces(mojo::BinderMap* binders) override {
@@ -278,6 +289,7 @@ class OzonePlatformWayland : public OzonePlatform {
std::unique_ptr<WaylandInputMethodContextFactory>
input_method_context_factory_;
std::unique_ptr<WaylandBufferManagerConnector> buffer_manager_connector_;
+ std::unique_ptr<WaylandMenuUtils> menu_utils_;
// Objects, which solely live in the GPU process.
std::unique_ptr<WaylandBufferManagerGpu> buffer_manager_;
diff --git a/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.h b/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.h
index 2eb802cd466..ca00bd4b59a 100644
--- a/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.h
+++ b/chromium/ui/ozone/platform/wayland/ozone_platform_wayland.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_OZONE_PLATFORM_DRM_OZONE_PLATFORM_WAYLAND_H_
-#define UI_OZONE_PLATFORM_DRM_OZONE_PLATFORM_WAYLAND_H_
+#ifndef UI_OZONE_PLATFORM_OZONE_PLATFORM_WAYLAND_H_
+#define UI_OZONE_PLATFORM_OZONE_PLATFORM_WAYLAND_H_
namespace ui {
@@ -14,4 +14,4 @@ OzonePlatform* CreateOzonePlatformWayland();
} // namespace ui
-#endif // UI_OZONE_PLATFORM_DRM_OZONE_PLATFORM_WAYLAND_H_
+#endif // UI_OZONE_PLATFORM_OZONE_PLATFORM_WAYLAND_H_
diff --git a/chromium/ui/ozone/platform/wayland/test/wayland_test.cc b/chromium/ui/ozone/platform/wayland/test/wayland_test.cc
index b155af688f8..58e395d8e82 100644
--- a/chromium/ui/ozone/platform/wayland/test/wayland_test.cc
+++ b/chromium/ui/ozone/platform/wayland/test/wayland_test.cc
@@ -10,6 +10,7 @@
#include "ui/base/ui_base_features.h"
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
#include "ui/events/ozone/layout/scoped_keyboard_layout_engine.h"
+#include "ui/ozone/common/features.h"
#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
#include "ui/ozone/platform/wayland/host/wayland_screen.h"
#include "ui/ozone/platform/wayland/test/mock_surface.h"
@@ -28,7 +29,8 @@ using ::testing::SaveArg;
namespace ui {
WaylandTest::WaylandTest()
- : task_environment_(base::test::TaskEnvironment::MainThreadType::UI) {
+ : task_environment_(base::test::TaskEnvironment::MainThreadType::UI,
+ base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
#if BUILDFLAG(USE_XKBCOMMON)
auto keyboard_layout_engine =
std::make_unique<XkbKeyboardLayoutEngine>(xkb_evdev_code_converter_);
@@ -52,7 +54,8 @@ void WaylandTest::SetUp() {
// that automatically through changes done to "variants", which is also
// convenient to have locally so that we don't need to worry about that (it's
// the Wayland DragAndDrop that relies on the feature).
- feature_list_.InitAndEnableFeature(features::kUseOzonePlatform);
+ feature_list_.InitWithFeatures(
+ {features::kUseOzonePlatform, ui::kWaylandOverlayDelegation}, {});
ASSERT_TRUE(features::IsUsingOzonePlatform());
ASSERT_TRUE(server_.Start(GetParam()));
diff --git a/chromium/ui/ozone/platform/wayland/wayland.gni b/chromium/ui/ozone/platform/wayland/wayland.gni
index e9200e6daa8..e34a48b6318 100644
--- a/chromium/ui/ozone/platform/wayland/wayland.gni
+++ b/chromium/ui/ozone/platform/wayland/wayland.gni
@@ -2,8 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
-import("//ui/ozone/ozone.gni")
declare_args() {
# Checks if Wayland must be compiled with dmabuf/gbm feature, which allows a
diff --git a/chromium/ui/ozone/platform/x11/BUILD.gn b/chromium/ui/ozone/platform/x11/BUILD.gn
index 6a501134142..731c7d7c0a0 100644
--- a/chromium/ui/ozone/platform/x11/BUILD.gn
+++ b/chromium/ui/ozone/platform/x11/BUILD.gn
@@ -24,10 +24,14 @@ source_set("x11") {
"x11_canvas_surface.h",
"x11_clipboard_ozone.cc",
"x11_clipboard_ozone.h",
+ "x11_menu_utils.cc",
+ "x11_menu_utils.h",
"x11_screen_ozone.cc",
"x11_screen_ozone.h",
"x11_surface_factory.cc",
"x11_surface_factory.h",
+ "x11_user_input_monitor.cc",
+ "x11_user_input_monitor.h",
]
deps = [
@@ -108,3 +112,17 @@ source_set("x11_unittests") {
"//ui/platform_window/x11:x11",
]
}
+
+source_set("test_support") {
+ testonly = true
+
+ sources = [
+ "x11_ozone_ui_controls_test_helper.cc",
+ "x11_ozone_ui_controls_test_helper.h",
+ ]
+
+ deps = [
+ "//ui/base/x",
+ "//ui/base/x:test_support",
+ ]
+}
diff --git a/chromium/ui/ozone/platform/x11/gl_egl_utility_x11.cc b/chromium/ui/ozone/platform/x11/gl_egl_utility_x11.cc
index 2d2550ae517..3c8e0d04ce4 100644
--- a/chromium/ui/ozone/platform/x11/gl_egl_utility_x11.cc
+++ b/chromium/ui/ozone/platform/x11/gl_egl_utility_x11.cc
@@ -5,6 +5,8 @@
#include "ui/ozone/platform/x11/gl_egl_utility_x11.h"
#include "ui/base/x/x11_gl_egl_utility.h"
+#include "ui/base/x/x11_util.h"
+#include "ui/gl/gl_utils.h"
namespace ui {
@@ -26,4 +28,14 @@ bool GLEGLUtilityX11::IsTransparentBackgroundSupported() const {
return ui::IsTransparentBackgroundSupported();
}
+void GLEGLUtilityX11::CollectGpuExtraInfo(
+ bool enable_native_gpu_memory_buffers,
+ gfx::GpuExtraInfo& gpu_extra_info) const {
+ gl::CollectX11GpuExtraInfo(enable_native_gpu_memory_buffers, gpu_extra_info);
+}
+
+bool GLEGLUtilityX11::X11DoesVisualHaveAlphaForTest() const {
+ return ui::DoesVisualHaveAlphaForTest();
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/gl_egl_utility_x11.h b/chromium/ui/ozone/platform/x11/gl_egl_utility_x11.h
index e68d20a8118..807d3a7d20c 100644
--- a/chromium/ui/ozone/platform/x11/gl_egl_utility_x11.h
+++ b/chromium/ui/ozone/platform/x11/gl_egl_utility_x11.h
@@ -24,6 +24,9 @@ class GLEGLUtilityX11 : public PlatformGLEGLUtility {
void ChooseEGLAlphaAndBufferSize(EGLint* alpha_size,
EGLint* buffer_size) override;
bool IsTransparentBackgroundSupported() const override;
+ void CollectGpuExtraInfo(bool enable_native_gpu_memory_buffers,
+ gfx::GpuExtraInfo& gpu_extra_info) const override;
+ bool X11DoesVisualHaveAlphaForTest() const override;
};
} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc b/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc
index 1e8373db915..ea0e2ec3b42 100644
--- a/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc
+++ b/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.cc
@@ -7,7 +7,6 @@
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkPixmap.h"
#include "ui/base/x/x11_util.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
namespace ui {
diff --git a/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h b/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h
index 8f8396569f0..b80211e9493 100644
--- a/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h
+++ b/chromium/ui/ozone/platform/x11/gl_surface_egl_readback_x11.h
@@ -5,7 +5,6 @@
#ifndef UI_OZONE_PLATFORM_X11_GL_SURFACE_EGL_READBACK_X11_H_
#define UI_OZONE_PLATFORM_X11_GL_SURFACE_EGL_READBACK_X11_H_
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/xproto.h"
#include "ui/ozone/common/gl_surface_egl_readback.h"
diff --git a/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc b/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
index 3d9e737c0c9..399bd0678bb 100644
--- a/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
+++ b/chromium/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -10,6 +10,7 @@
#include "base/message_loop/message_pump_type.h"
#include "base/metrics/histogram_functions.h"
#include "base/no_destructor.h"
+#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "ui/base/buildflags.h"
@@ -18,21 +19,20 @@
#include "ui/base/dragdrop/os_exchange_data_provider_factory_ozone.h"
#include "ui/base/ime/linux/linux_input_method_context_factory.h"
#include "ui/base/x/x11_cursor_factory.h"
-#include "ui/base/x/x11_error_handler.h"
#include "ui/base/x/x11_util.h"
#include "ui/display/fake/fake_display_delegate.h"
#include "ui/events/devices/x11/touch_factory_x11.h"
#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
#include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
#include "ui/events/platform/x11/x11_event_source.h"
-#include "ui/events/x/events_x_utils.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/ozone/common/stub_overlay_manager.h"
#include "ui/ozone/platform/x11/gl_egl_utility_x11.h"
#include "ui/ozone/platform/x11/x11_clipboard_ozone.h"
+#include "ui/ozone/platform/x11/x11_menu_utils.h"
#include "ui/ozone/platform/x11/x11_screen_ozone.h"
#include "ui/ozone/platform/x11/x11_surface_factory.h"
+#include "ui/ozone/platform/x11/x11_user_input_monitor.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
#include "ui/ozone/public/input_controller.h"
#include "ui/ozone/public/ozone_platform.h"
@@ -73,7 +73,7 @@ class OzonePlatformX11 : public OzonePlatform,
SetInstance(this);
}
- ~OzonePlatformX11() override {}
+ ~OzonePlatformX11() override = default;
// OzonePlatform:
ui::SurfaceFactoryOzone* GetSurfaceFactoryOzone() override {
@@ -126,8 +126,6 @@ class OzonePlatformX11 : public OzonePlatform,
return gl_egl_utility_.get();
}
- int GetKeyModifiers() const override { return GetModifierKeyState(); }
-
std::unique_ptr<InputMethod> CreateInputMethod(
internal::InputMethodDelegate* delegate,
gfx::AcceleratedWidget) override {
@@ -144,6 +142,10 @@ class OzonePlatformX11 : public OzonePlatform,
#endif
}
+ PlatformMenuUtils* GetPlatformMenuUtils() override {
+ return menu_utils_.get();
+ }
+
std::unique_ptr<OSExchangeDataProvider> CreateProvider() override {
#if defined(OS_CHROMEOS)
return std::make_unique<OSExchangeDataProviderNonBacked>();
@@ -206,6 +208,8 @@ class OzonePlatformX11 : public OzonePlatform,
GtkUiDelegate::SetInstance(gtk_ui_delegate_.get());
#endif
+ menu_utils_ = std::make_unique<X11MenuUtils>();
+
base::UmaHistogramEnumeration("Linux.WindowManager", GetWindowManagerUMA());
}
@@ -231,21 +235,13 @@ class OzonePlatformX11 : public OzonePlatform,
// Installs the X11 error handlers for the UI process after the
// main message loop has started. This will allow us to exit cleanly
// if X exits before we do.
- SetErrorHandlers(std::move(shutdown_cb));
+ x11::Connection::Get()->SetIOErrorHandler(std::move(shutdown_cb));
}
- void PostMainMessageLoopRun() override {
- // Unset the X11 error handlers. The X11 error handlers log the errors using
- // a |PostTask()| on the message-loop. But since the message-loop is in the
- // process of terminating, this can cause errors.
- SetEmptyErrorHandlers();
- }
-
- void PreEarlyInitialize() override {
- // Installs the X11 error handlers for the browser process used during
- // startup. They simply print error messages and exit because
- // we can't shutdown properly while creating and initializing services.
- SetNullErrorHandlers();
+ std::unique_ptr<PlatformUserInputMonitor> GetPlatformUserInputMonitor(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
+ override {
+ return std::make_unique<X11UserInputMonitor>(std::move(io_task_runner));
}
private:
@@ -259,8 +255,6 @@ class OzonePlatformX11 : public OzonePlatform,
// an X server running and $DISPLAY is set.
CHECK(x11::Connection::Get()) << "Missing X server or $DISPLAY";
- ui::SetDefaultX11ErrorHandlers();
-
common_initialized_ = true;
}
@@ -286,6 +280,7 @@ class OzonePlatformX11 : public OzonePlatform,
std::unique_ptr<X11ClipboardOzone> clipboard_;
std::unique_ptr<CursorFactory> cursor_factory_;
std::unique_ptr<GpuPlatformSupportHost> gpu_platform_support_host_;
+ std::unique_ptr<X11MenuUtils> menu_utils_;
// Objects in the GPU process.
std::unique_ptr<X11SurfaceFactory> surface_factory_ozone_;
diff --git a/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc b/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc
index 9cc7e1bc245..40945c6dbf1 100644
--- a/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc
+++ b/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.cc
@@ -14,7 +14,6 @@
#include "ui/base/x/x11_util.h"
#include "ui/gfx/x/extension_manager.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_util.h"
diff --git a/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h b/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h
index a8c0c96f470..9592b8df86c 100644
--- a/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h
+++ b/chromium/ui/ozone/platform/x11/x11_clipboard_ozone.h
@@ -12,8 +12,6 @@
#include "base/containers/flat_map.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xfixes.h"
#include "ui/gfx/x/xproto.h"
#include "ui/ozone/public/platform_clipboard.h"
diff --git a/chromium/ui/ozone/platform/x11/x11_menu_utils.cc b/chromium/ui/ozone/platform/x11/x11_menu_utils.cc
new file mode 100644
index 00000000000..9633b73f308
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/x11_menu_utils.cc
@@ -0,0 +1,28 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/x11/x11_menu_utils.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "ui/events/keycodes/keyboard_code_conversion_x.h"
+#include "ui/events/keycodes/keysym_to_unicode.h"
+#include "ui/events/x/events_x_utils.h"
+
+namespace ui {
+
+X11MenuUtils::X11MenuUtils() = default;
+
+X11MenuUtils::~X11MenuUtils() = default;
+
+int X11MenuUtils::GetCurrentKeyModifiers() const {
+ return GetModifierKeyState();
+}
+
+std::string X11MenuUtils::ToDBusKeySym(KeyboardCode code) const {
+ return base::UTF16ToUTF8(
+ base::string16(1, ui::GetUnicodeCharacterFromXKeySym(
+ XKeysymForWindowsKeyCode(code, false))));
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/x11_menu_utils.h b/chromium/ui/ozone/platform/x11/x11_menu_utils.h
new file mode 100644
index 00000000000..0e1b30e867f
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/x11_menu_utils.h
@@ -0,0 +1,26 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_X11_X11_MENU_UTILS_H_
+#define UI_OZONE_PLATFORM_X11_X11_MENU_UTILS_H_
+
+#include "ui/ozone/public/platform_menu_utils.h"
+
+namespace ui {
+
+class X11MenuUtils : public PlatformMenuUtils {
+ public:
+ X11MenuUtils();
+ X11MenuUtils(const X11MenuUtils&) = delete;
+ X11MenuUtils& operator=(const X11MenuUtils&) = delete;
+ ~X11MenuUtils() override;
+
+ int GetCurrentKeyModifiers() const override;
+
+ std::string ToDBusKeySym(KeyboardCode code) const override;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_X11_X11_MENU_UTILS_H_
diff --git a/chromium/ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.cc b/chromium/ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.cc
new file mode 100644
index 00000000000..8aa26409a72
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.cc
@@ -0,0 +1,60 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.h"
+
+namespace ui {
+
+X11OzoneUIControlsTestHelper::X11OzoneUIControlsTestHelper() = default;
+X11OzoneUIControlsTestHelper::~X11OzoneUIControlsTestHelper() = default;
+
+unsigned X11OzoneUIControlsTestHelper::ButtonDownMask() const {
+ return x11_ui_controls_test_helper_.ButtonDownMask();
+}
+
+void X11OzoneUIControlsTestHelper::SendKeyPressEvent(
+ gfx::AcceleratedWidget widget,
+ ui::KeyboardCode key,
+ bool control,
+ bool shift,
+ bool alt,
+ bool command,
+ base::OnceClosure closure) {
+ x11_ui_controls_test_helper_.SendKeyPressEvent(
+ widget, key, control, shift, alt, command, std::move(closure));
+}
+
+void X11OzoneUIControlsTestHelper::SendMouseMotionNotifyEvent(
+ gfx::AcceleratedWidget widget,
+ const gfx::Point& mouse_loc,
+ const gfx::Point& mouse_root_loc,
+ base::OnceClosure closure) {
+ x11_ui_controls_test_helper_.SendMouseMotionNotifyEvent(
+ widget, mouse_loc, mouse_root_loc, std::move(closure));
+}
+
+void X11OzoneUIControlsTestHelper::SendMouseEvent(
+ gfx::AcceleratedWidget widget,
+ ui_controls::MouseButton type,
+ int button_state,
+ int accelerator_state,
+ const gfx::Point& mouse_loc,
+ const gfx::Point& mouse_root_loc,
+ base::OnceClosure closure) {
+ x11_ui_controls_test_helper_.SendMouseEvent(
+ widget, type, button_state, accelerator_state, mouse_loc, mouse_root_loc,
+ std::move(closure));
+}
+
+void X11OzoneUIControlsTestHelper::RunClosureAfterAllPendingUIEvents(
+ base::OnceClosure closure) {
+ x11_ui_controls_test_helper_.RunClosureAfterAllPendingUIEvents(
+ std::move(closure));
+}
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperX11() {
+ return new X11OzoneUIControlsTestHelper();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.h b/chromium/ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.h
new file mode 100644
index 00000000000..4026dc440d4
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/x11_ozone_ui_controls_test_helper.h
@@ -0,0 +1,51 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_X11_X11_OZONE_UI_CONTROLS_TEST_HELPER_H_
+#define UI_OZONE_PLATFORM_X11_X11_OZONE_UI_CONTROLS_TEST_HELPER_H_
+
+#include "ui/ozone/public/ozone_ui_controls_test_helper.h"
+
+#include "ui/base/x/test/x11_ui_controls_test_helper.h"
+
+namespace ui {
+
+class X11OzoneUIControlsTestHelper : public OzoneUIControlsTestHelper {
+ public:
+ X11OzoneUIControlsTestHelper();
+ X11OzoneUIControlsTestHelper(const X11OzoneUIControlsTestHelper&) = delete;
+ X11OzoneUIControlsTestHelper& operator=(const X11OzoneUIControlsTestHelper&) =
+ delete;
+ ~X11OzoneUIControlsTestHelper() override;
+
+ unsigned ButtonDownMask() const override;
+ void SendKeyPressEvent(gfx::AcceleratedWidget widget,
+ ui::KeyboardCode key,
+ bool control,
+ bool shift,
+ bool alt,
+ bool command,
+ base::OnceClosure closure) override;
+ void SendMouseMotionNotifyEvent(gfx::AcceleratedWidget widget,
+ const gfx::Point& mouse_loc,
+ const gfx::Point& mouse_root_loc,
+ base::OnceClosure closure) override;
+ void SendMouseEvent(gfx::AcceleratedWidget widget,
+ ui_controls::MouseButton type,
+ int button_state,
+ int accelerator_state,
+ const gfx::Point& mouse_loc,
+ const gfx::Point& mouse_root_loc,
+ base::OnceClosure closure) override;
+ void RunClosureAfterAllPendingUIEvents(base::OnceClosure closure) override;
+
+ private:
+ X11UIControlsTestHelper x11_ui_controls_test_helper_;
+};
+
+OzoneUIControlsTestHelper* CreateOzoneUIControlsTestHelperX11();
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_X11_X11_OZONE_UI_CONTROLS_TEST_HELPER_H_
diff --git a/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc b/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
index b98ae4ed908..d9ea9078d14 100644
--- a/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
+++ b/chromium/ui/ozone/platform/x11/x11_screen_ozone.cc
@@ -4,6 +4,8 @@
#include "ui/ozone/platform/x11/x11_screen_ozone.h"
+#include "ui/base/x/x11_idle_query.h"
+#include "ui/base/x/x11_screensaver_window_finder.h"
#include "ui/base/x/x11_util.h"
#include "ui/display/display_finder.h"
#include "ui/display/util/display_util.h"
@@ -124,6 +126,16 @@ void X11ScreenOzone::SetScreenSaverSuspended(bool suspend) {
SuspendX11ScreenSaver(suspend);
}
+bool X11ScreenOzone::IsScreenSaverActive() const {
+ // Usually the screensaver is used to lock the screen.
+ return ScreensaverWindowFinder::ScreensaverWindowExists();
+}
+
+base::TimeDelta X11ScreenOzone::CalculateIdleTime() const {
+ IdleQueryX11 idle_query;
+ return base::TimeDelta::FromSeconds(idle_query.IdleTime());
+}
+
void X11ScreenOzone::AddObserver(display::DisplayObserver* observer) {
x11_display_manager_->AddObserver(observer);
}
@@ -136,6 +148,12 @@ std::string X11ScreenOzone::GetCurrentWorkspace() {
return x11_display_manager_->GetCurrentWorkspace();
}
+base::Value X11ScreenOzone::GetGpuExtraInfoAsListValue(
+ const gfx::GpuExtraInfo& gpu_extra_info) {
+ return ui::GpuExtraInfoAsListValue(gpu_extra_info.system_visual,
+ gpu_extra_info.rgba_visual);
+}
+
bool X11ScreenOzone::DispatchXEvent(x11::Event* xev) {
return x11_display_manager_->ProcessEvent(xev);
}
diff --git a/chromium/ui/ozone/platform/x11/x11_screen_ozone.h b/chromium/ui/ozone/platform/x11/x11_screen_ozone.h
index 6aba14834f3..2d61903d35f 100644
--- a/chromium/ui/ozone/platform/x11/x11_screen_ozone.h
+++ b/chromium/ui/ozone/platform/x11/x11_screen_ozone.h
@@ -48,9 +48,13 @@ class X11ScreenOzone : public PlatformScreen,
display::Display GetDisplayMatching(
const gfx::Rect& match_rect_in_pixels) const override;
void SetScreenSaverSuspended(bool suspend) override;
+ bool IsScreenSaverActive() const override;
+ base::TimeDelta CalculateIdleTime() const override;
void AddObserver(display::DisplayObserver* observer) override;
void RemoveObserver(display::DisplayObserver* observer) override;
std::string GetCurrentWorkspace() override;
+ base::Value GetGpuExtraInfoAsListValue(
+ const gfx::GpuExtraInfo& gpu_extra_info) override;
// Overridden from ui::XEventDispatcher:
bool DispatchXEvent(x11::Event* event) override;
diff --git a/chromium/ui/ozone/platform/x11/x11_surface_factory.cc b/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
index 0778871f45a..e416f3fa817 100644
--- a/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
+++ b/chromium/ui/ozone/platform/x11/x11_surface_factory.cc
@@ -9,8 +9,6 @@
#include "gpu/vulkan/buildflags.h"
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/gfx/x/connection.h"
-#include "ui/gfx/x/x11.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gl/gl_surface_egl.h"
#include "ui/gl/gl_surface_egl_x11_gles2.h"
#include "ui/ozone/common/egl_util.h"
@@ -59,8 +57,8 @@ class GLOzoneEGLX11 : public GLOzoneEGL {
protected:
// GLOzoneEGL:
gl::EGLDisplayPlatform GetNativeDisplay() override {
- return gl::EGLDisplayPlatform(
- reinterpret_cast<EGLNativeDisplayType>(gfx::GetXDisplay()));
+ return gl::EGLDisplayPlatform(reinterpret_cast<EGLNativeDisplayType>(
+ x11::Connection::Get()->GetXlibDisplay().display()));
}
bool LoadGLES2Bindings(gl::GLImplementation implementation) override {
diff --git a/chromium/ui/ozone/platform/x11/x11_user_input_monitor.cc b/chromium/ui/ozone/platform/x11/x11_user_input_monitor.cc
new file mode 100644
index 00000000000..3de2c800baa
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/x11_user_input_monitor.cc
@@ -0,0 +1,37 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/x11/x11_user_input_monitor.h"
+
+#include "ui/base/x/x11_user_input_monitor.h"
+
+namespace ui {
+
+X11UserInputMonitor::X11UserInputMonitor(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
+ : user_input_monitor_(
+ std::make_unique<ui::XUserInputMonitor>(io_task_runner)) {}
+
+X11UserInputMonitor::~X11UserInputMonitor() = default;
+
+uint32_t X11UserInputMonitor::GetKeyPressCount() const {
+ return user_input_monitor_->GetKeyPressCount();
+}
+
+void X11UserInputMonitor::StartMonitor(
+ PlatformUserInputMonitor::WriteKeyPressCallback callback) {
+ user_input_monitor_->StartMonitor(callback);
+}
+
+void X11UserInputMonitor::StartMonitorWithMapping(
+ PlatformUserInputMonitor::WriteKeyPressCallback callback,
+ base::WritableSharedMemoryMapping mapping) {
+ user_input_monitor_->StartMonitorWithMapping(callback, std::move(mapping));
+}
+
+void X11UserInputMonitor::StopMonitor() {
+ user_input_monitor_->StopMonitor();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/platform/x11/x11_user_input_monitor.h b/chromium/ui/ozone/platform/x11/x11_user_input_monitor.h
new file mode 100644
index 00000000000..5c7281db501
--- /dev/null
+++ b/chromium/ui/ozone/platform/x11/x11_user_input_monitor.h
@@ -0,0 +1,39 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_X11_X11_USER_INPUT_MONITOR_H_
+#define UI_OZONE_PLATFORM_X11_X11_USER_INPUT_MONITOR_H_
+
+#include <memory>
+
+#include "ui/ozone/public/platform_user_input_monitor.h"
+
+namespace ui {
+
+class XUserInputMonitor;
+
+class X11UserInputMonitor : public PlatformUserInputMonitor {
+ public:
+ explicit X11UserInputMonitor(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
+ X11UserInputMonitor(const X11UserInputMonitor&) = delete;
+ X11UserInputMonitor& operator=(const X11UserInputMonitor&) = delete;
+ ~X11UserInputMonitor() override;
+
+ // PlatformUserInputMonitor:
+ uint32_t GetKeyPressCount() const override;
+ void StartMonitor(
+ PlatformUserInputMonitor::WriteKeyPressCallback callback) override;
+ void StartMonitorWithMapping(
+ PlatformUserInputMonitor::WriteKeyPressCallback callback,
+ base::WritableSharedMemoryMapping mapping) override;
+ void StopMonitor() override;
+
+ private:
+ std::unique_ptr<XUserInputMonitor> user_input_monitor_;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_X11_X11_USER_INPUT_MONITOR_H_
diff --git a/chromium/ui/ozone/platform_selection.cc b/chromium/ui/ozone/platform_selection.cc
index eb8e85edba6..1b49a08af70 100644
--- a/chromium/ui/ozone/platform_selection.cc
+++ b/chromium/ui/ozone/platform_selection.cc
@@ -33,9 +33,6 @@ int GetOzonePlatformId() {
return g_selected_platform;
std::string platform_name = GetPlatformName();
- // TODO(b/169115289) remove once all Tast tests use "drm".
- if (platform_name == "gbm")
- platform_name = "drm";
// Search for a matching platform in the list.
for (int platform_id = 0; platform_id < kPlatformCount; ++platform_id) {
diff --git a/chromium/ui/ozone/public/DEPS b/chromium/ui/ozone/public/DEPS
index 49d39fea419..fd8b8345f1e 100644
--- a/chromium/ui/ozone/public/DEPS
+++ b/chromium/ui/ozone/public/DEPS
@@ -1,4 +1,5 @@
include_rules = [
"+mojo/public",
"+ui/base/cursor/mojom/cursor_type.mojom-forward.h",
+ "+ui/base/test/ui_controls.h",
]
diff --git a/chromium/ui/ozone/public/ozone_platform.cc b/chromium/ui/ozone/public/ozone_platform.cc
index bcc577c5494..898a9c5c1b2 100644
--- a/chromium/ui/ozone/public/ozone_platform.cc
+++ b/chromium/ui/ozone/public/ozone_platform.cc
@@ -13,7 +13,9 @@
#include "ui/events/devices/device_data_manager.h"
#include "ui/ozone/platform_object.h"
#include "ui/ozone/platform_selection.h"
+#include "ui/ozone/public/platform_menu_utils.h"
#include "ui/ozone/public/platform_screen.h"
+#include "ui/ozone/public/platform_user_input_monitor.h"
namespace ui {
@@ -98,9 +100,8 @@ PlatformGLEGLUtility* OzonePlatform::GetPlatformGLEGLUtility() {
return nullptr;
}
-int OzonePlatform::GetKeyModifiers() const {
- // Platform may override this to provide the current state of modifier keys.
- return 0;
+PlatformMenuUtils* OzonePlatform::GetPlatformMenuUtils() {
+ return nullptr;
}
bool OzonePlatform::IsNativePixmapConfigSupported(
@@ -131,6 +132,12 @@ void OzonePlatform::AfterSandboxEntry() {
DCHECK(!single_process_);
}
+std::unique_ptr<PlatformUserInputMonitor>
+OzonePlatform::GetPlatformUserInputMonitor(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) {
+ return {};
+}
+
void OzonePlatform::PostMainMessageLoopStart(
base::OnceCallback<void()> shutdown_cb) {}
diff --git a/chromium/ui/ozone/public/ozone_platform.h b/chromium/ui/ozone/public/ozone_platform.h
index 764945ed097..739ffae079d 100644
--- a/chromium/ui/ozone/public/ozone_platform.h
+++ b/chromium/ui/ozone/public/ozone_platform.h
@@ -12,6 +12,7 @@
#include "base/component_export.h"
#include "base/macros.h"
#include "base/message_loop/message_pump_type.h"
+#include "base/single_thread_task_runner.h"
#include "mojo/public/cpp/bindings/binder_map.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/native_widget_types.h"
@@ -24,14 +25,16 @@ class NativeDisplayDelegate;
namespace ui {
class CursorFactory;
-class InputController;
class GpuPlatformSupportHost;
+class InputController;
class OverlayManagerOzone;
+class PlatformClipboard;
+class PlatformGLEGLUtility;
+class PlatformMenuUtils;
class PlatformScreen;
+class PlatformUserInputMonitor;
class SurfaceFactoryOzone;
class SystemInputInjector;
-class PlatformClipboard;
-class PlatformGLEGLUtility;
namespace internal {
class InputMethodDelegate;
@@ -104,6 +107,10 @@ class COMPONENT_EXPORT(OZONE) OzonePlatform {
// calculating bounds of menu windows.
bool ignore_screen_bounds_for_menus = false;
+ // Wayland only: determines whether BufferQueue needs a background image to
+ // be stacked below an AcceleratedWidget to make a widget opaque.
+ bool needs_background_image = false;
+
// If true, the platform shows and updates the drag image.
bool platform_shows_drag_image = true;
@@ -188,10 +195,7 @@ class COMPONENT_EXPORT(OZONE) OzonePlatform {
internal::InputMethodDelegate* delegate,
gfx::AcceleratedWidget widget) = 0;
virtual PlatformGLEGLUtility* GetPlatformGLEGLUtility();
-
- // Returns a bitmask of EventFlags showing the state of Alt, Shift and Ctrl
- // keys that came with the most recent UI event.
- virtual int GetKeyModifiers() const;
+ virtual PlatformMenuUtils* GetPlatformMenuUtils();
// Returns true if the specified buffer format is supported.
virtual bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
@@ -230,6 +234,13 @@ class COMPONENT_EXPORT(OZONE) OzonePlatform {
// issues.
virtual void AfterSandboxEntry();
+ // Creates a user input monitor.
+ // The user input comes from I/O devices and must be handled on the IO thread.
+ // |io_task_runner| must be bound to the IO thread so the implementation could
+ // ensure that calls happen on the right thread.
+ virtual std::unique_ptr<PlatformUserInputMonitor> GetPlatformUserInputMonitor(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
+
protected:
bool has_initialized_ui() const { return initialized_ui_; }
bool has_initialized_gpu() const { return initialized_gpu_; }
diff --git a/chromium/ui/ozone/public/ozone_ui_controls_test_helper.cc b/chromium/ui/ozone/public/ozone_ui_controls_test_helper.cc
new file mode 100644
index 00000000000..1edaccac56a
--- /dev/null
+++ b/chromium/ui/ozone/public/ozone_ui_controls_test_helper.cc
@@ -0,0 +1,17 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/public/ozone_ui_controls_test_helper.h"
+
+#include "ui/ozone/platform_object.h"
+
+#include "base/logging.h"
+
+namespace ui {
+
+std::unique_ptr<OzoneUIControlsTestHelper> CreateOzoneUIControlsTestHelper() {
+ return PlatformObject<OzoneUIControlsTestHelper>::Create();
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/public/ozone_ui_controls_test_helper.h b/chromium/ui/ozone/public/ozone_ui_controls_test_helper.h
new file mode 100644
index 00000000000..49beed55c42
--- /dev/null
+++ b/chromium/ui/ozone/public/ozone_ui_controls_test_helper.h
@@ -0,0 +1,62 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PUBLIC_OZONE_UI_CONTROLS_TEST_HELPER_H_
+#define UI_OZONE_PUBLIC_OZONE_UI_CONTROLS_TEST_HELPER_H_
+
+#include <memory>
+
+#include "base/callback_forward.h"
+#include "base/component_export.h"
+#include "ui/base/test/ui_controls.h"
+#include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/gfx/native_widget_types.h"
+
+namespace gfx {
+class Point;
+}
+
+namespace ui {
+
+class OzoneUIControlsTestHelper {
+ public:
+ virtual ~OzoneUIControlsTestHelper() = default;
+
+ // Returns current button down mask.
+ virtual unsigned ButtonDownMask() const = 0;
+
+ // Sends key press event and executes |closure| when done.
+ virtual void SendKeyPressEvent(gfx::AcceleratedWidget widget,
+ ui::KeyboardCode key,
+ bool control,
+ bool shift,
+ bool alt,
+ bool command,
+ base::OnceClosure closure) = 0;
+
+ // Sends mouse motion notify event and executes |closure| when done.
+ virtual void SendMouseMotionNotifyEvent(gfx::AcceleratedWidget widget,
+ const gfx::Point& mouse_loc,
+ const gfx::Point& mouse_root_loc,
+ base::OnceClosure closure) = 0;
+
+ // Sends mouse event and executes |closure| when done.
+ virtual void SendMouseEvent(gfx::AcceleratedWidget widget,
+ ui_controls::MouseButton type,
+ int button_state,
+ int accelerator_state,
+ const gfx::Point& mouse_loc,
+ const gfx::Point& mouse_root_loc,
+ base::OnceClosure closure) = 0;
+
+ // Executes closure after all pending ui events are sent.
+ virtual void RunClosureAfterAllPendingUIEvents(base::OnceClosure closure) = 0;
+};
+
+COMPONENT_EXPORT(OZONE)
+std::unique_ptr<OzoneUIControlsTestHelper> CreateOzoneUIControlsTestHelper();
+
+} // namespace ui
+
+#endif // UI_OZONE_PUBLIC_OZONE_UI_CONTROLS_TEST_HELPER_H_
diff --git a/chromium/ui/ozone/public/platform_gl_egl_utility.h b/chromium/ui/ozone/public/platform_gl_egl_utility.h
index 1923a3808af..96acbaf1ad9 100644
--- a/chromium/ui/ozone/public/platform_gl_egl_utility.h
+++ b/chromium/ui/ozone/public/platform_gl_egl_utility.h
@@ -11,6 +11,7 @@
#include "base/component_export.h"
#include "third_party/khronos/EGL/egl.h"
+#include "ui/gfx/gpu_extra_info.h"
namespace ui {
@@ -31,6 +32,15 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformGLEGLUtility {
// Returns whether the platform supports setting transparent background for
// windows.
virtual bool IsTransparentBackgroundSupported() const = 0;
+
+ // Fills in the platform specific bits of the GPU extra info holder.
+ // |enable_native_gpu_memory_buffers| should be taken from GpuPreferences.
+ virtual void CollectGpuExtraInfo(bool enable_native_gpu_memory_buffers,
+ gfx::GpuExtraInfo& gpu_extra_info) const = 0;
+
+ // X11 specific; returns whether the test configuration supports alpha for
+ // window visuals.
+ virtual bool X11DoesVisualHaveAlphaForTest() const = 0;
};
} // namespace ui
diff --git a/chromium/ui/ozone/public/platform_menu_utils.cc b/chromium/ui/ozone/public/platform_menu_utils.cc
new file mode 100644
index 00000000000..cef955ecf58
--- /dev/null
+++ b/chromium/ui/ozone/public/platform_menu_utils.cc
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/public/platform_menu_utils.h"
+
+#include "base/notreached.h"
+
+namespace ui {
+
+PlatformMenuUtils::PlatformMenuUtils() = default;
+
+PlatformMenuUtils::~PlatformMenuUtils() = default;
+
+int PlatformMenuUtils::GetCurrentKeyModifiers() const {
+ NOTIMPLEMENTED_LOG_ONCE();
+ return {};
+}
+
+std::string PlatformMenuUtils::ToDBusKeySym(KeyboardCode code) const {
+ NOTIMPLEMENTED_LOG_ONCE();
+ return {};
+}
+
+} // namespace ui
diff --git a/chromium/ui/ozone/public/platform_menu_utils.h b/chromium/ui/ozone/public/platform_menu_utils.h
new file mode 100644
index 00000000000..a082768de16
--- /dev/null
+++ b/chromium/ui/ozone/public/platform_menu_utils.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PUBLIC_PLATFORM_MENU_UTILS_H_
+#define UI_OZONE_PUBLIC_PLATFORM_MENU_UTILS_H_
+
+#include <string>
+
+#include "base/component_export.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
+
+namespace ui {
+
+enum class DomCode;
+
+// Platform-specific functions related to menus.
+class COMPONENT_EXPORT(OZONE_BASE) PlatformMenuUtils {
+ public:
+ PlatformMenuUtils();
+ PlatformMenuUtils(const PlatformMenuUtils&) = delete;
+ PlatformMenuUtils& operator=(const PlatformMenuUtils&) = delete;
+ virtual ~PlatformMenuUtils();
+
+ // Returns a bitmask of EventFlags showing the state of Alt, Shift and Ctrl
+ // keys that came with the most recent UI event.
+ virtual int GetCurrentKeyModifiers() const;
+
+ // Converts the keyboard code into a keysym label compatible with DBus menu
+ // protocol.
+ virtual std::string ToDBusKeySym(KeyboardCode code) const;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PUBLIC_PLATFORM_MENU_UTILS_H_
diff --git a/chromium/ui/ozone/public/platform_screen.cc b/chromium/ui/ozone/public/platform_screen.cc
index 8b58cf95caa..6700247c2d0 100644
--- a/chromium/ui/ozone/public/platform_screen.cc
+++ b/chromium/ui/ozone/public/platform_screen.cc
@@ -5,6 +5,7 @@
#include "ui/ozone/public/platform_screen.h"
#include "base/notreached.h"
+#include "base/time/time.h"
namespace ui {
@@ -27,4 +28,19 @@ void PlatformScreen::SetScreenSaverSuspended(bool suspend) {
NOTIMPLEMENTED_LOG_ONCE();
}
+bool PlatformScreen::IsScreenSaverActive() const {
+ NOTIMPLEMENTED_LOG_ONCE();
+ return false;
+}
+
+base::TimeDelta PlatformScreen::CalculateIdleTime() const {
+ NOTIMPLEMENTED_LOG_ONCE();
+ return base::TimeDelta::FromSeconds(0);
+}
+
+base::Value PlatformScreen::GetGpuExtraInfoAsListValue(
+ const gfx::GpuExtraInfo& gpu_extra_info) {
+ return base::Value(base::Value::Type::LIST);
+}
+
} // namespace ui
diff --git a/chromium/ui/ozone/public/platform_screen.h b/chromium/ui/ozone/public/platform_screen.h
index 71cc12c195b..aeb0572e5a7 100644
--- a/chromium/ui/ozone/public/platform_screen.h
+++ b/chromium/ui/ozone/public/platform_screen.h
@@ -11,8 +11,14 @@
#include "base/component_export.h"
#include "base/macros.h"
+#include "base/values.h"
+#include "ui/gfx/gpu_extra_info.h"
#include "ui/gfx/native_widget_types.h"
+namespace base {
+class TimeDelta;
+} // namespace base
+
namespace display {
class Display;
class DisplayObserver;
@@ -80,6 +86,12 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
// Suspends the platform-specific screensaver, if applicable.
virtual void SetScreenSaverSuspended(bool suspend);
+ // Returns whether the screensaver is currently running.
+ virtual bool IsScreenSaverActive() const;
+
+ // Calculates idle time.
+ virtual base::TimeDelta CalculateIdleTime() const;
+
// Adds/Removes display observers.
virtual void AddObserver(display::DisplayObserver* observer) = 0;
virtual void RemoveObserver(display::DisplayObserver* observer) = 0;
@@ -88,6 +100,11 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
// empty string is returned.
virtual std::string GetCurrentWorkspace();
+ // Returns human readable description of the window manager, desktop, and
+ // other system properties related to the compositing.
+ virtual base::Value GetGpuExtraInfoAsListValue(
+ const gfx::GpuExtraInfo& gpu_extra_info);
+
private:
DISALLOW_COPY_AND_ASSIGN(PlatformScreen);
};
diff --git a/chromium/ui/ozone/public/platform_user_input_monitor.cc b/chromium/ui/ozone/public/platform_user_input_monitor.cc
new file mode 100644
index 00000000000..15cee6b48db
--- /dev/null
+++ b/chromium/ui/ozone/public/platform_user_input_monitor.cc
@@ -0,0 +1,13 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/public/platform_user_input_monitor.h"
+
+namespace ui {
+
+PlatformUserInputMonitor::PlatformUserInputMonitor() = default;
+
+PlatformUserInputMonitor::~PlatformUserInputMonitor() = default;
+
+} // namespace ui
diff --git a/chromium/ui/ozone/public/platform_user_input_monitor.h b/chromium/ui/ozone/public/platform_user_input_monitor.h
new file mode 100644
index 00000000000..ce7684115e9
--- /dev/null
+++ b/chromium/ui/ozone/public/platform_user_input_monitor.h
@@ -0,0 +1,49 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PUBLIC_PLATFORM_USER_INPUT_MONITOR_H_
+#define UI_OZONE_PUBLIC_PLATFORM_USER_INPUT_MONITOR_H_
+
+#include <memory>
+
+#include "base/component_export.h"
+#include "base/memory/shared_memory_mapping.h"
+#include "base/single_thread_task_runner.h"
+
+namespace ui {
+
+// User input monitor for multimedia streams.
+//
+// Monitors the keyboard input events in the browser process. Can be provided
+// with the shared memory mapping; in such a case should call the callback
+// provided via StartMonitor() or StartMonitorWithMapping() every time
+// the user presses a key.
+class COMPONENT_EXPORT(OZONE_BASE) PlatformUserInputMonitor {
+ public:
+ // Via this callback, the platform implementation of the monitor gets the
+ // WriteKeyPressMonitorCount defined in media/base/user_input_monitor.h.
+ using WriteKeyPressCallback = base::RepeatingCallback<
+ void(const base::WritableSharedMemoryMapping& shmem, uint32_t count)>;
+
+ PlatformUserInputMonitor();
+ PlatformUserInputMonitor(const PlatformUserInputMonitor&) = delete;
+ PlatformUserInputMonitor& operator=(const PlatformUserInputMonitor&) = delete;
+ virtual ~PlatformUserInputMonitor();
+
+ // Returns how many key presses happened since this monitor has been started.
+ virtual uint32_t GetKeyPressCount() const = 0;
+ // Starts monitoring of events without a mapping.
+ virtual void StartMonitor(WriteKeyPressCallback callback) = 0;
+ // Starts monitoring of events. The |mapping| should be passed to the
+ // |callback| upon invocation.
+ virtual void StartMonitorWithMapping(
+ WriteKeyPressCallback callback,
+ base::WritableSharedMemoryMapping mapping) = 0;
+ // Stops monitoring.
+ virtual void StopMonitor() = 0;
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PUBLIC_PLATFORM_USER_INPUT_MONITOR_H_
diff --git a/chromium/ui/platform_window/platform_window.h b/chromium/ui/platform_window/platform_window.h
index eeeda584667..41452bace43 100644
--- a/chromium/ui/platform_window/platform_window.h
+++ b/chromium/ui/platform_window/platform_window.h
@@ -50,7 +50,7 @@ class COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindow
// Sets and gets the bounds of the platform-window. Note that the bounds is in
// physical pixel coordinates.
virtual void SetBounds(const gfx::Rect& bounds) = 0;
- virtual gfx::Rect GetBounds() = 0;
+ virtual gfx::Rect GetBounds() const = 0;
virtual void SetTitle(const base::string16& title) = 0;
diff --git a/chromium/ui/platform_window/platform_window_init_properties.cc b/chromium/ui/platform_window/platform_window_init_properties.cc
index b8590ed3da7..706217e7a2f 100644
--- a/chromium/ui/platform_window/platform_window_init_properties.cc
+++ b/chromium/ui/platform_window/platform_window_init_properties.cc
@@ -17,4 +17,8 @@ PlatformWindowInitProperties::PlatformWindowInitProperties(
PlatformWindowInitProperties::~PlatformWindowInitProperties() = default;
+#if defined(OS_FUCHSIA)
+bool PlatformWindowInitProperties::allow_null_view_token_for_test = false;
+#endif
+
} // namespace ui
diff --git a/chromium/ui/platform_window/platform_window_init_properties.h b/chromium/ui/platform_window/platform_window_init_properties.h
index be16c9672a8..faf1c2a8525 100644
--- a/chromium/ui/platform_window/platform_window_init_properties.h
+++ b/chromium/ui/platform_window/platform_window_init_properties.h
@@ -71,6 +71,7 @@ struct COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindowInitProperties {
#if defined(OS_FUCHSIA)
fuchsia::ui::views::ViewToken view_token;
scenic::ViewRefPair view_ref_pair;
+ static bool allow_null_view_token_for_test;
#endif
bool activatable = true;
diff --git a/chromium/ui/platform_window/stub/stub_window.cc b/chromium/ui/platform_window/stub/stub_window.cc
index 9e8b67a4be0..a111485f809 100644
--- a/chromium/ui/platform_window/stub/stub_window.cc
+++ b/chromium/ui/platform_window/stub/stub_window.cc
@@ -43,7 +43,7 @@ void StubWindow::SetBounds(const gfx::Rect& bounds) {
delegate_->OnBoundsChanged(bounds);
}
-gfx::Rect StubWindow::GetBounds() {
+gfx::Rect StubWindow::GetBounds() const {
return bounds_;
}
diff --git a/chromium/ui/platform_window/stub/stub_window.h b/chromium/ui/platform_window/stub/stub_window.h
index 7d8a0a06411..7d2e7483f26 100644
--- a/chromium/ui/platform_window/stub/stub_window.h
+++ b/chromium/ui/platform_window/stub/stub_window.h
@@ -34,7 +34,7 @@ class STUB_WINDOW_EXPORT StubWindow : public PlatformWindow {
bool IsVisible() const override;
void PrepareForShutdown() override;
void SetBounds(const gfx::Rect& bounds) override;
- gfx::Rect GetBounds() override;
+ gfx::Rect GetBounds() const override;
void SetTitle(const base::string16& title) override;
void SetCapture() override;
void ReleaseCapture() override;
diff --git a/chromium/ui/platform_window/win/win_window.cc b/chromium/ui/platform_window/win/win_window.cc
index 37e29f41637..96acebd7f29 100644
--- a/chromium/ui/platform_window/win/win_window.cc
+++ b/chromium/ui/platform_window/win/win_window.cc
@@ -93,7 +93,7 @@ void WinWindow::SetBounds(const gfx::Rect& bounds) {
window_bounds.width(), window_bounds.height(), flags);
}
-gfx::Rect WinWindow::GetBounds() {
+gfx::Rect WinWindow::GetBounds() const {
RECT cr;
GetClientRect(hwnd(), &cr);
return gfx::Rect(cr);
diff --git a/chromium/ui/platform_window/win/win_window.h b/chromium/ui/platform_window/win/win_window.h
index ab2910c141a..7bc9b3cdf87 100644
--- a/chromium/ui/platform_window/win/win_window.h
+++ b/chromium/ui/platform_window/win/win_window.h
@@ -33,7 +33,7 @@ class WIN_WINDOW_EXPORT WinWindow : public PlatformWindow,
bool IsVisible() const override;
void PrepareForShutdown() override;
void SetBounds(const gfx::Rect& bounds) override;
- gfx::Rect GetBounds() override;
+ gfx::Rect GetBounds() const override;
void SetTitle(const base::string16& title) override;
void SetCapture() override;
void ReleaseCapture() override;
diff --git a/chromium/ui/platform_window/x11/BUILD.gn b/chromium/ui/platform_window/x11/BUILD.gn
index 9b2028949f3..1e1e9cf1c65 100644
--- a/chromium/ui/platform_window/x11/BUILD.gn
+++ b/chromium/ui/platform_window/x11/BUILD.gn
@@ -2,9 +2,9 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")
-import("//ui/ozone/ozone.gni")
assert(use_x11 || ozone_platform_x11)
diff --git a/chromium/ui/platform_window/x11/atk_event_conversion.cc b/chromium/ui/platform_window/x11/atk_event_conversion.cc
index 4138f9c5544..88e4b0fad5d 100644
--- a/chromium/ui/platform_window/x11/atk_event_conversion.cc
+++ b/chromium/ui/platform_window/x11/atk_event_conversion.cc
@@ -7,6 +7,7 @@
#include "base/check.h"
#include "base/notreached.h"
#include "ui/events/x/events_x_utils.h"
+#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/xproto.h"
#include "ui/gfx/x/xproto_types.h"
@@ -25,12 +26,12 @@ std::unique_ptr<AtkKeyEventStruct> AtkKeyEventFromXEvent(
: ATK_KEY_EVENT_RELEASE;
auto state = static_cast<int>(xkey->state);
- auto keycode = static_cast<int>(xkey->detail);
+ auto keycode = xkey->detail;
auto keysym = x11::Connection::Get()->KeycodeToKeysym(keycode, state);
atk_key_event->state = state;
- atk_key_event->keyval = static_cast<uint32_t>(keysym);
- atk_key_event->keycode = keycode;
+ atk_key_event->keyval = keysym;
+ atk_key_event->keycode = static_cast<uint8_t>(keycode);
atk_key_event->timestamp = static_cast<uint32_t>(xkey->time);
// This string property matches the one that was removed from GdkEventKey. In
diff --git a/chromium/ui/platform_window/x11/atk_event_conversion.h b/chromium/ui/platform_window/x11/atk_event_conversion.h
index ad15f27db48..84226a4e157 100644
--- a/chromium/ui/platform_window/x11/atk_event_conversion.h
+++ b/chromium/ui/platform_window/x11/atk_event_conversion.h
@@ -10,7 +10,6 @@
#include <memory>
#include "ui/gfx/x/event.h"
-#include "ui/gfx/x/x11.h"
namespace ui {
diff --git a/chromium/ui/platform_window/x11/x11_topmost_window_finder.h b/chromium/ui/platform_window/x11/x11_topmost_window_finder.h
index 0ad199f5ccf..3b6f08ea7b4 100644
--- a/chromium/ui/platform_window/x11/x11_topmost_window_finder.h
+++ b/chromium/ui/platform_window/x11/x11_topmost_window_finder.h
@@ -12,7 +12,6 @@
#include "ui/base/x/x11_util.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/x/x11.h"
#include "ui/platform_window/x11/x11_window_export.h"
namespace ui {
diff --git a/chromium/ui/platform_window/x11/x11_window.cc b/chromium/ui/platform_window/x11/x11_window.cc
index 881bece18a4..4e5c3ddfd63 100644
--- a/chromium/ui/platform_window/x11/x11_window.cc
+++ b/chromium/ui/platform_window/x11/x11_window.cc
@@ -24,7 +24,6 @@
#include "ui/events/platform/x11/x11_event_source.h"
#include "ui/events/x/x11_event_translation.h"
#include "ui/events/x/x11_window_event_manager.h"
-#include "ui/gfx/x/x11.h"
#include "ui/platform_window/common/platform_window_defaults.h"
#include "ui/platform_window/extensions/workspace_extension_delegate.h"
#include "ui/platform_window/extensions/x11_extension_delegate.h"
@@ -241,7 +240,7 @@ void X11Window::SetBounds(const gfx::Rect& bounds) {
XWindow::SetBounds(bounds_in_pixels);
}
-gfx::Rect X11Window::GetBounds() {
+gfx::Rect X11Window::GetBounds() const {
return XWindow::bounds();
}
diff --git a/chromium/ui/platform_window/x11/x11_window.h b/chromium/ui/platform_window/x11/x11_window.h
index 69705f960ae..e5ebe7f14a0 100644
--- a/chromium/ui/platform_window/x11/x11_window.h
+++ b/chromium/ui/platform_window/x11/x11_window.h
@@ -77,7 +77,7 @@ class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
bool IsVisible() const override;
void PrepareForShutdown() override;
void SetBounds(const gfx::Rect& bounds) override;
- gfx::Rect GetBounds() override;
+ gfx::Rect GetBounds() const override;
void SetTitle(const base::string16& title) override;
void SetCapture() override;
void ReleaseCapture() override;
diff --git a/chromium/ui/resources/BUILD.gn b/chromium/ui/resources/BUILD.gn
index 0d1ad112bcb..b9762945654 100644
--- a/chromium/ui/resources/BUILD.gn
+++ b/chromium/ui/resources/BUILD.gn
@@ -10,6 +10,7 @@ group("resources") {
public_deps = [
":ui_resources_grd",
":ui_unscaled_resources_grd",
+ ":webui_generated_resources_grd",
":webui_resources_grd",
]
}
@@ -49,9 +50,18 @@ grit("webui_resources_grd") {
"grit/webui_resources_map.h",
"webui_resources.pak",
]
- grit_flags = [
- "-E",
- "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
+}
+
+grit("webui_generated_resources_grd") {
+ enable_input_discovery_for_gn_analyze = false
+ source = "$root_gen_dir/ui/webui/resources/webui_generated_resources.grd"
+ deps = [ "//ui/webui/resources:build_grd" ]
+
+ outputs = [
+ "grit/webui_generated_resources.h",
+ "grit/webui_generated_resources_map.cc",
+ "grit/webui_generated_resources_map.h",
+ "webui_generated_resources.pak",
]
}
@@ -137,6 +147,7 @@ repack("repack_ui_test_pak_100_percent") {
sources = [
"$root_gen_dir/mojo/public/js/mojo_bindings_resources.pak",
"$root_gen_dir/ui/resources/ui_resources_100_percent.pak",
+ "$root_gen_dir/ui/resources/webui_generated_resources.pak",
"$root_gen_dir/ui/resources/webui_resources.pak",
"$root_gen_dir/ui/strings/app_locale_settings_en-US.pak",
"$root_gen_dir/ui/strings/ui_strings_en-US.pak",
diff --git a/chromium/ui/shell_dialogs/select_file_dialog.cc b/chromium/ui/shell_dialogs/select_file_dialog.cc
index 96e589f8980..6e760139708 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog.cc
+++ b/chromium/ui/shell_dialogs/select_file_dialog.cc
@@ -26,8 +26,7 @@ ui::SelectFileDialogFactory* dialog_factory_ = NULL;
namespace ui {
-SelectFileDialog::FileTypeInfo::FileTypeInfo()
- : include_all_files(false), allowed_paths(NATIVE_PATH) {}
+SelectFileDialog::FileTypeInfo::FileTypeInfo() = default;
SelectFileDialog::FileTypeInfo::FileTypeInfo(const FileTypeInfo& other) =
default;
diff --git a/chromium/ui/shell_dialogs/select_file_dialog.h b/chromium/ui/shell_dialogs/select_file_dialog.h
index 832c12fb4a6..0bcc440b21c 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog.h
+++ b/chromium/ui/shell_dialogs/select_file_dialog.h
@@ -135,7 +135,13 @@ class SHELL_DIALOGS_EXPORT SelectFileDialog
std::vector<base::string16> extension_description_overrides;
// Specifies whether there will be a filter added for all files (i.e. *.*).
- bool include_all_files;
+ bool include_all_files = false;
+
+ // Some implementations by default hide the extension of a file, in
+ // particular in a save file dialog. If this is set to true, where
+ // supported, the save file dialog will instead keep the file extension
+ // visible.
+ bool keep_extension_visible = false;
// Specifies which type of paths the caller can handle.
enum AllowedPaths {
@@ -153,7 +159,7 @@ class SHELL_DIALOGS_EXPORT SelectFileDialog
// docs.google.com URL.
ANY_PATH_OR_URL
};
- AllowedPaths allowed_paths;
+ AllowedPaths allowed_paths = NATIVE_PATH;
};
// Returns a file path with a base name at most 255 characters long. This
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_mac.mm b/chromium/ui/shell_dialogs/select_file_dialog_mac.mm
index 9b16bab3b3b..2fcf6f46aa8 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_mac.mm
+++ b/chromium/ui/shell_dialogs/select_file_dialog_mac.mm
@@ -135,6 +135,8 @@ void SelectFileDialogImpl::SelectFileImpl(
mojo_file_types->extension_description_overrides =
file_types->extension_description_overrides;
mojo_file_types->include_all_files = file_types->include_all_files;
+ mojo_file_types->keep_extension_visible =
+ file_types->keep_extension_visible;
}
auto callback = base::BindOnce(&SelectFileDialogImpl::FileWasSelected,
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm b/chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm
index 8d983f5050a..8b65d667414 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm
+++ b/chromium/ui/shell_dialogs/select_file_dialog_mac_unittest.mm
@@ -501,8 +501,29 @@ TEST_F(SelectFileDialogMacTest, MultipleExtension) {
EXPECT_FALSE([panel isExtensionHidden]);
}
-// Test to ensure lifetime is sound if a reference to the panel outlives the
-// delegate.
+// Verify that the file dialog does not hide extension when the
+// `keep_extension_visible` flag is set to true.
+TEST_F(SelectFileDialogMacTest, KeepExtensionVisible) {
+ const std::string extensions_arr[][2] = {{"html", "htm"}, {"jpeg", "jpg"}};
+
+ SelectFileDialog::FileTypeInfo file_type_info;
+ file_type_info.extensions.push_back(
+ GetVectorFromArray<std::string>(extensions_arr[0]));
+ file_type_info.extensions.push_back(
+ GetVectorFromArray<std::string>(extensions_arr[1]));
+ file_type_info.keep_extension_visible = true;
+
+ FileDialogArguments args(GetDefaultArguments());
+ args.file_types = &file_type_info;
+
+ SelectFileWithParams(args);
+ NSSavePanel* panel = GetPanel();
+ EXPECT_FALSE([panel canSelectHiddenExtension]);
+ EXPECT_FALSE([panel isExtensionHidden]);
+}
+
+// Test to ensure lifetime is sound if a reference to
+// the panel outlives the delegate.
TEST_F(SelectFileDialogMacTest, Lifetime) {
base::scoped_nsobject<NSSavePanel> panel;
@autoreleasepool {
diff --git a/chromium/ui/shell_dialogs/select_file_dialog_win.cc b/chromium/ui/shell_dialogs/select_file_dialog_win.cc
index 2ea1f94ad3b..37fe4b5fa35 100644
--- a/chromium/ui/shell_dialogs/select_file_dialog_win.cc
+++ b/chromium/ui/shell_dialogs/select_file_dialog_win.cc
@@ -63,7 +63,8 @@ bool GetRegistryDescriptionFromExtension(const base::string16& file_ext,
std::vector<FileFilterSpec> FormatFilterForExtensions(
const std::vector<base::string16>& file_ext,
const std::vector<base::string16>& ext_desc,
- bool include_all_files) {
+ bool include_all_files,
+ bool keep_extension_visible) {
const base::string16 all_ext = L"*.*";
const base::string16 all_desc =
l10n_util::GetStringUTF16(IDS_APP_SAVEAS_ALL_FILES);
@@ -112,6 +113,11 @@ std::vector<FileFilterSpec> FormatFilterForExtensions(
}
if (desc.empty())
desc = L"*." + ext_name;
+ } else if (keep_extension_visible) {
+ // Having '*' in the description could cause the windows file dialog to
+ // not include the file extension in the file dialog. So strip out any '*'
+ // characters if `keep_extension_visible` is set.
+ base::ReplaceChars(desc, L"*", L"", &desc);
}
result.push_back({desc, ext});
@@ -318,9 +324,9 @@ std::vector<FileFilterSpec> SelectFileDialogImpl::GetFilterForFileTypes(
}
exts.push_back(ext_string);
}
- return FormatFilterForExtensions(exts,
- file_types->extension_description_overrides,
- file_types->include_all_files);
+ return FormatFilterForExtensions(
+ exts, file_types->extension_description_overrides,
+ file_types->include_all_files, file_types->keep_extension_visible);
}
} // namespace
diff --git a/chromium/ui/snapshot/screenshot_grabber.cc b/chromium/ui/snapshot/screenshot_grabber.cc
index 5401712a5a2..b1cd7513d21 100644
--- a/chromium/ui/snapshot/screenshot_grabber.cc
+++ b/chromium/ui/snapshot/screenshot_grabber.cc
@@ -9,8 +9,8 @@
#include <climits>
#include "base/bind.h"
-#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
diff --git a/chromium/ui/snapshot/snapshot_aura_unittest.cc b/chromium/ui/snapshot/snapshot_aura_unittest.cc
index 0537792f9c3..de78f946209 100644
--- a/chromium/ui/snapshot/snapshot_aura_unittest.cc
+++ b/chromium/ui/snapshot/snapshot_aura_unittest.cc
@@ -200,12 +200,12 @@ INSTANTIATE_TEST_SUITE_P(All, SnapshotAuraTest, ::testing::Bool());
#define MAYBE_FullScreenWindow FullScreenWindow
#endif
TEST_P(SnapshotAuraTest, MAYBE_FullScreenWindow) {
-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
- // TODO(https://crbug.com/1002716): Fix this test to run in < action_timeout()
+#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_FUCHSIA)
+ // TODO(https://crbug.com/1143031): Fix this test to run in < action_timeout()
// on the Linux Debug & TSAN bots.
const base::test::ScopedRunLoopTimeout increased_run_timeout(
FROM_HERE, TestTimeouts::action_max_timeout());
-#endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
+#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_FUCHSIA)
#if defined(OS_WIN)
// TODO(https://crbug.com/850556): Make work on Win10.
diff --git a/chromium/ui/snapshot/snapshot_win.cc b/chromium/ui/snapshot/snapshot_win.cc
index 27d99532da1..35fc4daa7a1 100644
--- a/chromium/ui/snapshot/snapshot_win.cc
+++ b/chromium/ui/snapshot/snapshot_win.cc
@@ -65,7 +65,7 @@ bool GrabHwndSnapshot(HWND window_handle,
snapshot_bounds_in_window.y());
// Clear the region of the bitmap outside the clip rect to white.
- SkCanvas image_canvas(bitmap);
+ SkCanvas image_canvas(bitmap, SkSurfaceProps{});
SkPaint paint;
paint.setColor(SK_ColorWHITE);
diff --git a/chromium/ui/strings/translations/ui_strings_af.xtb b/chromium/ui/strings/translations/ui_strings_af.xtb
index 77686c47ad4..9745d0eef02 100644
--- a/chromium/ui/strings/translations/ui_strings_af.xtb
+++ b/chromium/ui/strings/translations/ui_strings_af.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Kan nie <ph name="CONTENT_TYPE" /> deel nie</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> is geruil met <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Jy het voorheen hiervoor gesoek. As jy "<ph name="QUERY" />" in jou geskiedenis uitvee, word dit permanent op al jou toestelle van jou rekening af uitgevee.</translation>
+<translation id="1510238584712386396">Lanseerder</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuut en }other{# minute en }}</translation>
<translation id="1643823602425662293">Kennisgewing</translation>
<translation id="169515659049020177">Skuifsleutel</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-lêer</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Soek “<ph name="LOOKUP_STRING" />” op</translation>
+<translation id="3622035490309591977">Knipbordgeskiedenis</translation>
<translation id="364720409959344976">Kies vouer om op te laai</translation>
<translation id="3660179305079774227">Oppyltjie</translation>
<translation id="3670030362669914947">Nommer</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktief vandag}=1{1 dag gelede aktief}other{# dae gelede aktief}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dag en }other{# dae en }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Prent.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{oor 1 j.}other{oor # j.}}</translation>
<translation id="588258955323874662">Volskerm</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 sekonde oor}other{# sekondes oor}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">druk</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 uur oor}other{# uur oor}}</translation>
<translation id="688711909580084195">Titellose webblad</translation>
+<translation id="6902419395050653510">HTML-inhoud.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 jaar oor}other{# jaar oor}}</translation>
<translation id="6945221475159498467">Kies</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_am.xtb b/chromium/ui/strings/translations/ui_strings_am.xtb
index 4a1e1bbc2d7..ff4bcf71976 100644
--- a/chromium/ui/strings/translations/ui_strings_am.xtb
+++ b/chromium/ui/strings/translations/ui_strings_am.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ን ማጋራት አይቻልም</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> ከ<ph name="SECOND_ITEM_TITLE" /> ጋር ተቀያይሯል</translation>
<translation id="1498028757988366001">እርስዎ ይህን ከዚህ በፊት ፍለጋ አድርገውለታል። «<ph name="QUERY" />»ን ከታሪክዎ መሰረዝ በሁሉም መሣሪያዎችዎ ላይ እስከመጨረሻው ከመለያዎ ያስወግደዋል።</translation>
+<translation id="1510238584712386396">ማስጀመሪያ</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 ደቂቃ እና }one{# ደቂቃዎች እና }other{# ደቂቃዎች እና }}</translation>
<translation id="1643823602425662293">ማሳወቂያ</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">የ<ph name="SAVEAS_EXTENSION_TYPE" /> ፋይል</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">«<ph name="LOOKUP_STRING" />»ን ፈልግ</translation>
+<translation id="3622035490309591977">የቅንጥብ ሰሌዳ ታሪክ</translation>
<translation id="364720409959344976">የሚሰቀል ዓቃፊ ይምረጡ</translation>
<translation id="3660179305079774227">የላይ ቀስት</translation>
<translation id="3670030362669914947">ቁጥር</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ዛሬ ንቁ}=1{ከ1 ቀን በፊት ንቁ ነበር}one{ከ# ቀኖች በፊት ንቁ ነበር}other{ከ# ቀኖች በፊት ንቁ ነበር}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ቀን እና }one{# ቀኖች እና }other{# ቀኖች እና }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">ምስል።</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{በ 1ዓ ውስጥ}one{በ #ዓ ውስጥ}other{በ #ዓ ውስጥ}}</translation>
<translation id="588258955323874662">ሙሉ ገጽ ዕይታ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 ሰከንድ ቀርቷል}one{# ሰከንዶች ቀርቷል}other{# ሰከንዶች ቀርቷል}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">ተጫን</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 ሰዓት ቀርቷል}one{# ሰዓቶች ቀርቷል}other{# ሰዓቶች ቀርተዋል}}</translation>
<translation id="688711909580084195">ርዕስ-አልባ ድረ-ገጽ</translation>
+<translation id="6902419395050653510">የኤች ቲ ኤም ኤል ይዘት</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ፔባ/ሰ</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 ዓመት ቀርቷል}one{# ዓመቶች ቀርተዋል}other{# ዓመቶች ቀርተዋል}}</translation>
<translation id="6945221475159498467">ይምረጡ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ar.xtb b/chromium/ui/strings/translations/ui_strings_ar.xtb
index 47a4a080966..f74867184a8 100644
--- a/chromium/ui/strings/translations/ui_strings_ar.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ar.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">تعذَّرت مشاركة <ph name="CONTENT_TYPE" />.</translation>
<translation id="1487931858675166540">تم استبدال <ph name="FIRST_ITEM_TITLE" /> بالعنصر <ph name="SECOND_ITEM_TITLE" />.</translation>
<translation id="1498028757988366001">لقد بحثت عن هذا الموضوع من قبل. سيؤدي حذف "<ph name="QUERY" />" من السجل إلى إزالته نهائيًا من حسابك على جميع أجهزتك.</translation>
+<translation id="1510238584712386396">مشغِّل التطبيقات</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{دقيقة واحدة و }zero{# من الدقائق و }two{دقيقتان (#) و }few{# دقائق و }many{# دقيقة و }other{# من الدقائق و }}</translation>
<translation id="1643823602425662293">الإشعار</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">ملف <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">البحث عن "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">سجلّ الحافظة</translation>
<translation id="364720409959344976">حدد مجلدًا للتحميل</translation>
<translation id="3660179305079774227">مفتاح سهم متّجه للأعلى</translation>
<translation id="3670030362669914947">رقم</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{نشط اليوم}=1{نشط قبل يوم واحد}two{نشط قبل يومين (#)}few{نشط قبل # أيام}many{نشط قبل # يومًا}other{نشط قبل # يوم}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{يوم واحد و }zero{# من الأيام و }two{يومان (#) و }few{# أيام و }many{# يومًا و }other{# من الأيام و }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">صورة</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{خلال عام واحد}zero{خلال # عام}two{خلال عامين (#)}few{خلال # أعوام}many{خلال # عامًا}other{خلال # عام}}</translation>
<translation id="588258955323874662">ملء الشاشة</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{يتبقى ثانية واحدة}zero{يتبقى # من الثواني}two{يتبقى ثانيتان (#)}few{يتبقى # ثانية}many{يتبقى # ثانية}other{يتبقى # من الثواني}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">اضغط</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{يتبقى ساعة}zero{يتبقى # من الساعات}two{ يتبقى ساعتان (#)}few{يتبقى # ساعات}many{يتبقى # ساعة}other{يتبقى # من الساعات}}</translation>
<translation id="688711909580084195">صفحة ويب بدون عنوان</translation>
+<translation id="6902419395050653510">‏محتوى HTML</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> بيتابايت/ثانية</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{تتبقى سنة واحدة}zero{تتبقى # سنة}two{تتبقى سنتين (#)}few{تتبقى # سنوات}many{تتبقى # سنةً}other{تتبقى # سنة}}</translation>
<translation id="6945221475159498467">تحديد</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_as.xtb b/chromium/ui/strings/translations/ui_strings_as.xtb
index c920c72bd85..44a4f01562b 100644
--- a/chromium/ui/strings/translations/ui_strings_as.xtb
+++ b/chromium/ui/strings/translations/ui_strings_as.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> শ্বেয়াৰ কৰিব নোৱাৰি</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />ক <ph name="SECOND_ITEM_TITLE" />ৰ সৈতে সলনাসলনি কৰা হৈছে</translation>
<translation id="1498028757988366001">আপুনি এই বিষয়ে পূর্বে সন্ধান কৰিছে। আপোনাৰ ইতিহাসৰ পৰা "<ph name="QUERY" />"ক মচা কার্যয়ে আপোনাৰ সকলো ডিভাইচৰ পৰাই ইয়াক স্থায়ীভাৱে আঁতৰাব।</translation>
+<translation id="1510238584712386396">লঞ্চাৰ</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{১ মিনিট আৰু }one{# মিনিট আৰু }other{# মিনিট আৰু }}</translation>
<translation id="1643823602425662293">জাননী</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ফাইল</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” চাওক</translation>
+<translation id="3622035490309591977">ক্লিপব’ৰ্ডৰ ইতিহাস</translation>
<translation id="364720409959344976">আপল’ড কৰিবলগা ফ’ল্ডাৰ বাছনি কৰক</translation>
<translation id="3660179305079774227">উপৰমুৱা কাঁড়</translation>
<translation id="3670030362669914947">নম্বৰ</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{আজি সক্ৰিয় হৈছে}=1{১দিনৰ পূৰ্বে সক্ৰিয় আছিল}one{#দিনৰ পূৰ্বে সক্ৰিয় আছিল}other{#দিনৰ পূৰ্বে সক্ৰিয় আছিল}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{১দিন আৰু }one{# দিন আৰু }other{# দিন আৰু }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">প্ৰতিচ্ছবি।</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{১ বছৰত}one{# বছৰত}other{# বছৰত}}</translation>
<translation id="588258955323874662">পূৰ্ণস্ক্ৰীণ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{১ ছেকেণ্ড বাকী আছে}one{# ছেকেণ্ড বাকী আছে}other{# ছেকেণ্ড বাকী আছে}}</translation>
@@ -190,6 +193,7 @@
<translation id="6845533974506654842">টিপক</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{১ ঘণ্টা বাকী আছে}one{# ঘণ্টা বাকী আছে}other{# ঘণ্টা বাকী আছে}}</translation>
<translation id="688711909580084195">নামবিহীন ৱেবপৃষ্ঠা</translation>
+<translation id="6902419395050653510">HTML সমল।</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> পিবি/ছে</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{১ বছৰ বাকী আছে}one{# বছৰ বাকী আছে}other{# বছৰ বাকী আছে}}</translation>
<translation id="6945221475159498467">বাছনি কৰক</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_az.xtb b/chromium/ui/strings/translations/ui_strings_az.xtb
index 95ad98c9560..e54c79bba92 100644
--- a/chromium/ui/strings/translations/ui_strings_az.xtb
+++ b/chromium/ui/strings/translations/ui_strings_az.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> paylaşmaq mümkün deyil</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> <ph name="SECOND_ITEM_TITLE" /> ilə dəyişdirildi</translation>
<translation id="1498028757988366001">Bunu əvvəl axtarmısınız. Tarixçədən "<ph name="QUERY" />" sorğusunun silinməsi onu bütün cihazlardakı hesabınızdan həmişəlik siləcək.</translation>
+<translation id="1510238584712386396">Başladıcı</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 dəqiqə və }other{# dəqiqə və }}</translation>
<translation id="1643823602425662293">Bildiriş</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> Fayl</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">"<ph name="LOOKUP_STRING" />" baxın</translation>
+<translation id="3622035490309591977">Mübadilə buferi tarixçəsi</translation>
<translation id="364720409959344976">Yükləmək üçün Qovluq Seçin</translation>
<translation id="3660179305079774227">Yuxarı Ox</translation>
<translation id="3670030362669914947">Nömrə</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Bu gün aktivdir}=1{1 gün əvvəl aktiv olub}other{# gün əvvəl aktiv olub}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 gün və }other{# gün }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Şəkil.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 ildə}other{# ildə}}</translation>
<translation id="588258955323874662">Tam ekran</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 saniyə qalıb}other{# saniyə qalıb}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">basın</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 saat qalıb}other{# saat qalıb}}</translation>
<translation id="688711909580084195">Başlıqsız Veb</translation>
+<translation id="6902419395050653510">HTML məzmun.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 il qalıb}other{# il qalıb}}</translation>
<translation id="6945221475159498467">Seçin</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_be.xtb b/chromium/ui/strings/translations/ui_strings_be.xtb
index 349f69c561b..a5534cf0aaa 100644
--- a/chromium/ui/strings/translations/ui_strings_be.xtb
+++ b/chromium/ui/strings/translations/ui_strings_be.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Не ўдалося абагуліць наступнае змесціва: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> і <ph name="SECOND_ITEM_TITLE" /> памяняліся месцамі</translation>
<translation id="1498028757988366001">Вы шукалі гэта раней. Калі выдаліць запыт "<ph name="QUERY" />" з гісторыі, ён будзе незваротна выдалены з вашага ўліковага запісу на ўсіх прыладах.</translation>
+<translation id="1510238584712386396">Панэль запуску</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 хвіліна і }one{# хвіліна і }few{# хвіліны і }many{# хвілін і }other{# хвіліны і }}</translation>
<translation id="1643823602425662293">Апавяшчэнне</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Файл <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Пошук "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Гісторыя буфера абмену</translation>
<translation id="364720409959344976">Выберыце папку для запампоўвання</translation>
<translation id="3660179305079774227">Стрэлка ўверх</translation>
<translation id="3670030362669914947">Нумар</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Апошнія дзеянні адбываліся сёння}=1{Апошнія дзеянні: дзень таму}one{Апошнія дзеянні: # дзень таму}few{Апошнія дзеянні: # дні таму}many{Апошнія дзеянні: # дзён таму}other{Апошнія дзеянні: # дня таму}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 дзень і }one{# дзень і }few{# дні і }many{# дзён і }other{# дня і }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Відарыс.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{праз 1 г.}one{праз # г.}few{праз # г.}many{праз # г.}other{праз # г.}}</translation>
<translation id="588258955323874662">Поўнаэкранны рэжым</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Засталася 1 секунда}one{Засталася # секунда}few{Засталося # секунды}many{Засталося # секунд}other{Засталося # секунды}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">націснуць</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Засталася 1 гадзіна}one{Засталася # гадзіна}few{Засталося # гадзіны}many{Засталося # гадзін}other{Засталося # гадзіны}}</translation>
<translation id="688711909580084195">Вэб-старонка без назвы</translation>
+<translation id="6902419395050653510">Змесціва HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ПБ/с</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Застаўся 1 год}one{Застаўся # год}few{Засталося # гады}many{Засталося # гадоў}other{Засталося # года}}</translation>
<translation id="6945221475159498467">Выбраць</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bg.xtb b/chromium/ui/strings/translations/ui_strings_bg.xtb
index c004f4db421..2fd67866dc7 100644
--- a/chromium/ui/strings/translations/ui_strings_bg.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bg.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Споделянето на <ph name="CONTENT_TYPE" /> не е възможно</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> се замени от <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Тази заявка е сред предишните ви търсения. Изтриването на „<ph name="QUERY" />“ от историята ви ще я премахне за постоянно от профила ви на всичките ви устройства.</translation>
+<translation id="1510238584712386396">Стартов панел</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 минута и }other{# минути и }}</translation>
<translation id="1643823602425662293">Известие</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Файл във формат <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">Над <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Търсене на „<ph name="LOOKUP_STRING" />“</translation>
+<translation id="3622035490309591977">История на буферната памет</translation>
<translation id="364720409959344976">Избиране на папка за качване</translation>
<translation id="3660179305079774227">Стрелка нагоре</translation>
<translation id="3670030362669914947">Номер</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Активно днес}=1{Активно преди 1 ден}other{Активно преди # дни}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ден и }other{# дни и }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Изображение.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{след 1 г.}other{след # г.}}</translation>
<translation id="588258955323874662">Цял екран</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Остава 1 секунда}other{Остават # секунди}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">натискане</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Остава 1 час}other{Остават # часа}}</translation>
<translation id="688711909580084195">Неозаглавена уеб страница</translation>
+<translation id="6902419395050653510">HTML съдържание.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ПБ/сек</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Остава 1 година}other{Остават # години}}</translation>
<translation id="6945221475159498467">Избиране</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bn.xtb b/chromium/ui/strings/translations/ui_strings_bn.xtb
index b1fdfede5b0..b9540c92b88 100644
--- a/chromium/ui/strings/translations/ui_strings_bn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bn.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> শেয়ার করা যাচ্ছে না</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />-কে <ph name="SECOND_ITEM_TITLE" /> দিয়ে পাল্টানো হয়েছে</translation>
<translation id="1498028757988366001">আপনি এটি আগেও সার্চ করেছেন। ইতিহাস থেকে "<ph name="QUERY" />" সরিয়ে দিলে, আপনার সব ডিভাইসের অ্যাকাউন্ট থেকে সেটি স্থায়ীভাবে মুছে যাবে।</translation>
+<translation id="1510238584712386396">লঞ্চার</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{১ মিনিট এবং }one{# মিনিট এবং }other{# মিনিট এবং }}</translation>
<translation id="1643823602425662293">বিজ্ঞপ্তি</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ফাইল</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” খুঁজে দেখুন</translation>
+<translation id="3622035490309591977">ক্লিপবোর্ডের ইতিহাস</translation>
<translation id="364720409959344976">আপলোড করার জন্য ফোল্ডার বেছে নিন</translation>
<translation id="3660179305079774227">Up Arrow</translation>
<translation id="3670030362669914947">নম্বর</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{আজ ব্যবহার করা হয়েছে}=1{১ দিন আগে ব্যবহার করা হয়েছে}one{# দিন আগে ব্যবহার করা হয়েছে}other{# দিন আগে ব্যবহার করা হয়েছে}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{১ দিন এবং }one{# দিন এবং }other{# দিন এবং }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">ছবি।</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{১ বছরের মধ্যে}one{# বছরের মধ্যে}other{# বছরের মধ্যে}}</translation>
<translation id="588258955323874662">সম্পূর্নস্ক্রীণ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{১ সেকেন্ড বাকি}one{# সেকেন্ড বাকি}other{# সেকেন্ড বাকি}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">টিপুন</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{১ ঘণ্টা বাকি}one{# ঘণ্টা বাকি}other{# ঘণ্টা বাকি}}</translation>
<translation id="688711909580084195">Untitled Webpage</translation>
+<translation id="6902419395050653510">HTML কন্টেন্ট।</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{১ বছর বাকি}one{# বছর বাকি}other{# বছর বাকি}}</translation>
<translation id="6945221475159498467">নির্বাচন</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_bs.xtb b/chromium/ui/strings/translations/ui_strings_bs.xtb
index 4d961f6b59f..406e3a59646 100644
--- a/chromium/ui/strings/translations/ui_strings_bs.xtb
+++ b/chromium/ui/strings/translations/ui_strings_bs.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Nije moguće podijeliti sadržaj <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Stavka <ph name="FIRST_ITEM_TITLE" /> je zamijenjena stavkom <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">To ste već pretraživali. Ako izbrišete upit "<ph name="QUERY" />" iz historije, trajno ćete ga ukloniti s računa na svim svojim uređajima.</translation>
+<translation id="1510238584712386396">Pokretač</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuta i }one{# minuta i }few{# minute i }other{# minuta i }}</translation>
<translation id="1643823602425662293">Obavještenje</translation>
<translation id="169515659049020177">Gornji red</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> fajl</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Potražite “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Historija međumemorije</translation>
<translation id="364720409959344976">Odaberite folder za otpremanje</translation>
<translation id="3660179305079774227">Strelica nagore</translation>
<translation id="3670030362669914947">Broj</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktivan danas}=1{Aktivan prije 1 dan}one{Aktivan prije # dan}few{Aktivan prije # dana}other{Aktivan prije # dana}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dan i }one{# dan i }few{# dana i }other{# dan i }}</translation>
<translation id="5789643057113097023">,</translation>
+<translation id="5843690142429128814">Slika.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{za 1 g}one{za # g}few{za # g}other{za # g}}</translation>
<translation id="588258955323874662">Cijeli ekran</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Još 1 sekunda}one{Još # sekunda}few{Još # sekunde}other{Još # sekundi}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">pritisni</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{još 1 sat}one{još # sat}few{još # sata}other{još # sati}}</translation>
<translation id="688711909580084195">Web lokacija bez naziva</translation>
+<translation id="6902419395050653510">HTML sadržaj.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Još godinu dana}one{Još # godinu}few{Još # godine}other{Još # godina}}</translation>
<translation id="6945221475159498467">Odaberi</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ca.xtb b/chromium/ui/strings/translations/ui_strings_ca.xtb
index 8f3c7dabb5a..94f29f6710b 100644
--- a/chromium/ui/strings/translations/ui_strings_ca.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ca.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">No es pot compartir <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> s'ha intercanviat amb <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Ja has fet aquesta cerca anteriorment. En suprimir "<ph name="QUERY" />" de l'historial, també se suprimirà permanentment del teu compte en tots els dispositius.</translation>
+<translation id="1510238584712386396">Menú d'aplicacions</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minut i }other{# minuts i }}</translation>
<translation id="1643823602425662293">Notificació</translation>
<translation id="169515659049020177">Maj</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Fitxer <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">Més de <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Cerca "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Historial del porta-retalls</translation>
<translation id="364720409959344976">Selecció d'una carpeta per penjar</translation>
<translation id="3660179305079774227">Fletxa amunt</translation>
<translation id="3670030362669914947">Número</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Actiu avui}=1{Actiu fa 1 dia}other{Actiu fa # dies}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dia i }other{# dies i }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imatge.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{d'aquí a 1 a}other{d'aquí a # a}}</translation>
<translation id="588258955323874662">Pantalla completa</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 segon restant}other{# segons restants}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">prem</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 hora restant}other{# hores restants}}</translation>
<translation id="688711909580084195">Pàgina web sense títol</translation>
+<translation id="6902419395050653510">Contingut HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{D'aquí a 1 any}other{D'aquí a # anys}}</translation>
<translation id="6945221475159498467">Selecciona</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_cs.xtb b/chromium/ui/strings/translations/ui_strings_cs.xtb
index a6572c3e97d..22d0f9cea1c 100644
--- a/chromium/ui/strings/translations/ui_strings_cs.xtb
+++ b/chromium/ui/strings/translations/ui_strings_cs.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Sdílení obsahu typu <ph name="CONTENT_TYPE" /> se nezdařilo</translation>
<translation id="1487931858675166540">Položka <ph name="FIRST_ITEM_TITLE" /> byla prohozená s položkou <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Toto jste v minulosti vyhledávali. Když dotaz „<ph name="QUERY" />“ vymažete z historie, bude trvale odstraněn z vašeho účtu na všech zařízeních.</translation>
+<translation id="1510238584712386396">Spouštěč</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuta a }few{# minuty a }many{# minuty a }other{# minut a }}</translation>
<translation id="1643823602425662293">Oznámení</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Soubor <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">&gt; <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Vyhledat „<ph name="LOOKUP_STRING" />“</translation>
+<translation id="3622035490309591977">Historie schránky</translation>
<translation id="364720409959344976">Vyberte složku pro nahrávání</translation>
<translation id="3660179305079774227">Klávesa šipka nahoru</translation>
<translation id="3670030362669914947">Číslo</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktivní dnes}=1{Aktivní včera}few{Aktivní před # dny}many{Aktivní před # dne}other{Aktivní před # dny}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 den a }few{# dny a }many{# dne a }other{# dnů a }}</translation>
<translation id="5789643057113097023">,</translation>
+<translation id="5843690142429128814">Obrázek.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{za 1 r}few{za # r}many{za # r}other{za # r}}</translation>
<translation id="588258955323874662">Celá obrazovka</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Zbývá 1 sekunda}few{Zbývají # sekundy}many{Zbývá # sekundy}other{Zbývá # sekund}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">zmáčknout</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Zbývá 1 hodina}few{Zbývají # hodiny}many{Zbývá # hodiny}other{Zbývá # hodiny}}</translation>
<translation id="688711909580084195">Nepojmenovaná webová stránka</translation>
+<translation id="6902419395050653510">Obsah ve formátu HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{zbývá 1 rok}few{zbývají # roky}many{zbývá # roku}other{zbývá # let}}</translation>
<translation id="6945221475159498467">Vybrat</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_da.xtb b/chromium/ui/strings/translations/ui_strings_da.xtb
index ce164b800f8..d230c709d41 100644
--- a/chromium/ui/strings/translations/ui_strings_da.xtb
+++ b/chromium/ui/strings/translations/ui_strings_da.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Delingen af <ph name="CONTENT_TYPE" /> mislykkedes</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> blev udskiftet med <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Du har tidligere søgt efter dette. Hvis du sletter "<ph name="QUERY" />" fra din historik, fjernes den permanent på fra din konto på alle dine enheder.</translation>
+<translation id="1510238584712386396">Appliste</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minut og }one{# minutter og }other{# minutter og }}</translation>
<translation id="1643823602425662293">Notifikation</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-fil</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Slå "<ph name="LOOKUP_STRING" />" op</translation>
+<translation id="3622035490309591977">Historik for udklipsholder</translation>
<translation id="364720409959344976">Vælg den mappe, der skal uploades</translation>
<translation id="3660179305079774227">Pil opad</translation>
<translation id="3670030362669914947">Nummer</translation>
@@ -143,7 +145,7 @@
<translation id="547979256943495781">Hylden er til højre</translation>
<translation id="5528053674512161860">Siden kunne ikke indlæses, da udviklerbrugerflademodulet (dev_ui) ikke er installeret</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" />-system</translation>
-<translation id="5583640892426849032">Returtast</translation>
+<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">Venstrepil</translation>
<translation id="5652575806481723716"><ph name="FOCUSED_APP_NAME" /> kræver din opmærksomhed.</translation>
<translation id="5675363643668471212">Hyldeelement</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktiv i dag}=1{Aktiv for 1 dag siden}one{Aktiv for # dag siden}other{Aktiv for # dage siden}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dag og }one{# dage og }other{# dage og }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Billede.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{om 1 år}one{om # år}other{om # år}}</translation>
<translation id="588258955323874662">Fuld skærm</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 sekund tilbage}one{# sekunder tilbage}other{# sekunder tilbage}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">tryk</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 time tilbage}one{# timer tilbage}other{# timer tilbage}}</translation>
<translation id="688711909580084195">Unavngivet webside</translation>
+<translation id="6902419395050653510">HTML-indhold.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/sek.</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Der er 1 år tilbage}one{Der er # år tilbage}other{Der er # år tilbage}}</translation>
<translation id="6945221475159498467">Vælg</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_de.xtb b/chromium/ui/strings/translations/ui_strings_de.xtb
index f0579b777d4..aca0aff3e00 100644
--- a/chromium/ui/strings/translations/ui_strings_de.xtb
+++ b/chromium/ui/strings/translations/ui_strings_de.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> kann nicht geteilt werden</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> und <ph name="SECOND_ITEM_TITLE" /> haben die Plätze getauscht</translation>
<translation id="1498028757988366001">Danach haben Sie schon einmal gesucht. Wenn Sie "<ph name="QUERY" />" aus Ihrem Verlauf löschen, wird diese Suchanfrage dauerhaft von allen Geräten in Ihrem Konto entfernt.</translation>
+<translation id="1510238584712386396">Launcher</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 Minute und }other{# Minuten und }}</translation>
<translation id="1643823602425662293">Benachrichtigung</translation>
<translation id="169515659049020177">Umschalttaste</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-Datei</translation>
<translation id="3608915363409716668">&gt;<ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">"<ph name="LOOKUP_STRING" />" nachschlagen</translation>
+<translation id="3622035490309591977">Zwischenablagenverlauf</translation>
<translation id="364720409959344976">Ordner zum Hochladen auswählen</translation>
<translation id="3660179305079774227">Aufwärtspfeil</translation>
<translation id="3670030362669914947">Nummer</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Heute aktiv}=1{Vor 1 Tag aktiv}other{Vor # Tagen aktiv}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 Tag und }other{# Tage und }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Bild.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{in 1 J.}other{in # J.}}</translation>
<translation id="588258955323874662">Vollbild</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 Sekunde übrig}other{# Sekunden übrig}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">klicken</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 Stunde übrig}other{# Stunden übrig}}</translation>
<translation id="688711909580084195">Unbenannte Webseite</translation>
+<translation id="6902419395050653510">HTML-Inhalte.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{noch 1 Jahr}other{noch # Jahre}}</translation>
<translation id="6945221475159498467">Auswählen</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_el.xtb b/chromium/ui/strings/translations/ui_strings_el.xtb
index 74b4ff19893..57c26a230b7 100644
--- a/chromium/ui/strings/translations/ui_strings_el.xtb
+++ b/chromium/ui/strings/translations/ui_strings_el.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Δεν είναι δυνατή η κοινοποίηση <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Γίνεται ανταλλαγή του στοιχείου <ph name="FIRST_ITEM_TITLE" /> με το στοιχείο <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Αναζητήσατε αυτόν τον όρο στο παρελθόν. Η διαγραφή του όρου "<ph name="QUERY" />" από το ιστορικό σας θα τον καταργήσει οριστικά από τον λογαριασμό σας σε όλες τις συσκευές σας.</translation>
+<translation id="1510238584712386396">Λειτουργία εκκίνησης</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 λεπτό και }other{# λεπτά και }}</translation>
<translation id="1643823602425662293">Ειδοποίηση</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Αρχείο <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Αναζήτηση "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Ιστορικό προχείρου</translation>
<translation id="364720409959344976">Επιλέξτε φάκελο για μεταφόρτωση</translation>
<translation id="3660179305079774227">Πάνω βέλος</translation>
<translation id="3670030362669914947">Αριθμός</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Ενεργή σήμερα}=1{Ενεργή 1 ημέρα πριν}other{Ενεργή # ημέρες πριν}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ημέρα και }other{# ημέρες και }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Εικόνα.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{σε 1 ε.}other{σε # ε.}}</translation>
<translation id="588258955323874662">Πλήρης οθόνη</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Απομένει 1 δευτερόλεπτο}other{Απομένουν # δευτερόλεπτα}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">πατήστε</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Απομένει 1 ώρα}other{Απομένουν # ώρες}}</translation>
<translation id="688711909580084195">Ιστοσελίδα χωρίς τίτλο</translation>
+<translation id="6902419395050653510">Περιεχόμενο HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Απομένει 1 χρόνος}other{Απομένουν # χρόνια}}</translation>
<translation id="6945221475159498467">Επιλογή</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_en-GB.xtb b/chromium/ui/strings/translations/ui_strings_en-GB.xtb
index 60ee2ea1908..af74bb1b47e 100644
--- a/chromium/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/chromium/ui/strings/translations/ui_strings_en-GB.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Can't share <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> swapped with <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">You searched for this before. Deleting '<ph name="QUERY" />' from your history will permanently remove it from your account across all your devices.</translation>
+<translation id="1510238584712386396">Launcher</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minute and }other{# minutes and }}</translation>
<translation id="1643823602425662293">Notification</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> File</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Look Up “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Clipboard history</translation>
<translation id="364720409959344976">Select Folder to Upload</translation>
<translation id="3660179305079774227">Up Arrow</translation>
<translation id="3670030362669914947">Number</translation>
@@ -109,7 +111,7 @@
<translation id="3889424535448813030">Right Arrow</translation>
<translation id="3897092660631435901">Menu</translation>
<translation id="3909791450649380159">Cu&amp;t</translation>
-<translation id="3990502903496589789">Right Edge</translation>
+<translation id="3990502903496589789">Right edge</translation>
<translation id="40579289237549812">{UNREAD_NOTIFICATIONS,plural, =1{1 unread notification}other{# unread notifications}}</translation>
<translation id="4202807286478387388">jump</translation>
<translation id="4250229828105606438">Screenshot</translation>
@@ -144,13 +146,14 @@
<translation id="5528053674512161860">Page load failed because the developer UI module (dev_ui) is not installed</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> system</translation>
<translation id="5583640892426849032">Backspace</translation>
-<translation id="5613020302032141669">Left Arrow</translation>
+<translation id="5613020302032141669">Left arrow</translation>
<translation id="5652575806481723716"><ph name="FOCUSED_APP_NAME" /> requests your attention.</translation>
<translation id="5675363643668471212">Shelf item</translation>
<translation id="5754277640426581776">{MINUTES,plural, =1{1 min}other{# mins}}</translation>
<translation id="5763338081255973061">{DAYS,plural, =0{Active today}=1{Active 1 day ago}other{Active # days ago}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 day and }other{# days and }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Image.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{in 1 y}other{in # y}}</translation>
<translation id="588258955323874662">Full screen</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 second left}other{# seconds left}}</translation>
@@ -183,7 +186,7 @@
<translation id="6578407462441924264">Unnamed</translation>
<translation id="6612467943526193239">To exit calibration press Esc.</translation>
<translation id="6620110761915583480">Save File</translation>
-<translation id="6699343763173986273">Media Next Track</translation>
+<translation id="6699343763173986273">Media next track</translation>
<translation id="6710213216561001401">Previous</translation>
<translation id="6786750046913594791">Close folder</translation>
<translation id="6808150112686056157">Media Stop</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">press</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 hour left}other{# hours left}}</translation>
<translation id="688711909580084195">Untitled Web Page</translation>
+<translation id="6902419395050653510">HTML content.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 year left}other{# years left}}</translation>
<translation id="6945221475159498467">Select</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_es-419.xtb b/chromium/ui/strings/translations/ui_strings_es-419.xtb
index bc507e971cb..b84790f4064 100644
--- a/chromium/ui/strings/translations/ui_strings_es-419.xtb
+++ b/chromium/ui/strings/translations/ui_strings_es-419.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">No se puede compartir <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Se intercambió <ph name="FIRST_ITEM_TITLE" /> con <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Ya realizaste esta búsqueda. Si borras la consulta "<ph name="QUERY" />" del Historial, se quitará permanentemente de tu cuenta en todos los dispositivos.</translation>
+<translation id="1510238584712386396">Selector</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto y }other{# minutos y }}</translation>
<translation id="1643823602425662293">Notificación</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Archivo <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">+ <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Buscar "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Historial del portapapeles</translation>
<translation id="364720409959344976">Seleccionar carpeta para cargar</translation>
<translation id="3660179305079774227">Flecha arriba</translation>
<translation id="3670030362669914947">Número</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Activo hoy}=1{Activo hace 1 día}other{Activo hace # días}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 día y }other{# días y }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imagen.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{en 1 año}other{en # años}}</translation>
<translation id="588258955323874662">Pantalla completa</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Falta 1 segundo.}other{Faltan # segundos.}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">hacer clic</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Falta 1 hora.}other{Faltan # horas.}}</translation>
<translation id="688711909580084195">Página web sin título</translation>
+<translation id="6902419395050653510">Contenido HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Queda 1 año}other{Quedan # años}}</translation>
<translation id="6945221475159498467">Seleccionar</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_es.xtb b/chromium/ui/strings/translations/ui_strings_es.xtb
index 77451717a23..1837231ea79 100644
--- a/chromium/ui/strings/translations/ui_strings_es.xtb
+++ b/chromium/ui/strings/translations/ui_strings_es.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">No se ha podido compartir: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> y <ph name="SECOND_ITEM_TITLE" /> se han intercambiado</translation>
<translation id="1498028757988366001">Ya has buscado esto antes. Si eliminas "<ph name="QUERY" />" de tu historial, se eliminará de tu cuenta de forma permanente en todos tus dispositivos.</translation>
+<translation id="1510238584712386396">Menú de aplicaciones</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto y }other{# minutos y }}</translation>
<translation id="1643823602425662293">Notificación</translation>
<translation id="169515659049020177">Mayús</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Archivo <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">Más de <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Buscar <ph name="LOOKUP_STRING" /></translation>
+<translation id="3622035490309591977">Historial del portapapeles</translation>
<translation id="364720409959344976">Seleccionar una carpeta para subirla</translation>
<translation id="3660179305079774227">Flecha arriba</translation>
<translation id="3670030362669914947">Número</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Activo hoy}=1{Activo hace 1 día}other{Activo hace # días}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 día y }other{# días y }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imagen.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{en 1 año}other{en # años}}</translation>
<translation id="588258955323874662">Pantalla completa</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Queda 1 segundo}other{Quedan # segundos}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">pulsar</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Queda 1 hora}other{Quedan # horas}}</translation>
<translation id="688711909580084195">Página web sin título</translation>
+<translation id="6902419395050653510">Contenido HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Queda 1 año}other{Quedan # años}}</translation>
<translation id="6945221475159498467">Seleccionar</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_et.xtb b/chromium/ui/strings/translations/ui_strings_et.xtb
index e8dc233a351..e15f3cca2df 100644
--- a/chromium/ui/strings/translations/ui_strings_et.xtb
+++ b/chromium/ui/strings/translations/ui_strings_et.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Üksust <ph name="CONTENT_TYPE" /> ei saa jagada</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> vahetati üksuse <ph name="SECOND_ITEM_TITLE" /> vastu</translation>
<translation id="1498028757988366001">Olete seda varem otsinud. Päringu „<ph name="QUERY" />” kustutamisel ajaloost eemaldatakse see teie kontolt jäädavalt kõigis teie seadmetes.</translation>
+<translation id="1510238584712386396">Käivitaja</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minut ja }other{# minutit ja }}</translation>
<translation id="1643823602425662293">Märguanne</translation>
<translation id="169515659049020177">Tõstuklahv</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-fail</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Otsi terminit „<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Lõikelaua ajalugu</translation>
<translation id="364720409959344976">Kausta valimine üleslaadimiseks</translation>
<translation id="3660179305079774227">Ülesnool</translation>
<translation id="3670030362669914947">Number</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktiivne täna}=1{Aktiivne 1 päev tagasi}other{Aktiivne # päeva tagasi}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 päev ja }other{# päeva ja }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Pilt.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 a pärast}other{# a pärast}}</translation>
<translation id="588258955323874662">Täisekraan</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 sekund on jäänud}other{# sekundit on jäänud}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">vajuta</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 tund on jäänud}other{# tundi on jäänud}}</translation>
<translation id="688711909580084195">Nimeta veebileht</translation>
+<translation id="6902419395050653510">HTML-sisu.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 aasta jäänud}other{# aastat jäänud}}</translation>
<translation id="6945221475159498467">Vali</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_eu.xtb b/chromium/ui/strings/translations/ui_strings_eu.xtb
index 9d061fd144d..518250170f3 100644
--- a/chromium/ui/strings/translations/ui_strings_eu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_eu.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Ezin da partekatu <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="SECOND_ITEM_TITLE" /> elementuarekin trukatu da <ph name="FIRST_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Dagoeneko bilatu duzu hori. Kendu egiten baduzu "<ph name="QUERY" />" historiatik, betiko kenduko da kontutik, gailu guztietan.</translation>
+<translation id="1510238584712386396">Abiarazlea</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minutu eta }other{# minutu eta }}</translation>
<translation id="1643823602425662293">Jakinarazpena</translation>
<translation id="169515659049020177">Maius</translation>
@@ -82,7 +83,7 @@
<translation id="2981684127883932071">Iradokizunak daude ikusgai</translation>
<translation id="3036649622769666520">Ireki fitxategiak</translation>
<translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
-<translation id="3068711042108640621">Biltegia ezkerraldean dago</translation>
+<translation id="3068711042108640621">Apala ezkerraldean dago</translation>
<translation id="3087734570205094154">Behekoa</translation>
<translation id="3126026824346185272">Ktrl</translation>
<translation id="3157931365184549694">Leheneratu</translation>
@@ -93,12 +94,13 @@
<translation id="3306688585798492231">Pantaila integratua</translation>
<translation id="335581015389089642">Hizketa</translation>
<translation id="3389286852084373014">Testua luzeegia da</translation>
-<translation id="348799646910989694">Biltegia automatikoki ezkutatuko da</translation>
+<translation id="348799646910989694">Apala automatikoki ezkutatuko da</translation>
<translation id="3554637740840164787">Ainguratu da <ph name="ITEM_TITLE" /></translation>
<translation id="3600566671520689681">{DAYS,plural, =1{1 egun gelditzen da}other{# egun gelditzen dira}}</translation>
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> fitxategia</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" /> baino gehiago</translation>
<translation id="3618849550573277856">Bilatu “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Arbeleko historia</translation>
<translation id="364720409959344976">Hautatu kargatu nahi duzun fitxategia</translation>
<translation id="3660179305079774227">Gora gezia</translation>
<translation id="3670030362669914947">Zenbakia</translation>
@@ -121,7 +123,7 @@
<translation id="4588090240171750605">Joan eskuinera</translation>
<translation id="4631891353005174729"><ph name="APP_NAME_TYPE" /> aplikazioa. <ph name="RATING_SCORE" /> izarreko balorazioa dauka.</translation>
<translation id="4648249871170053485">Gomendatutako aplikazioa (<ph name="APP_NAME" />)</translation>
-<translation id="4690510401873698237">Biltegia behealdean dago</translation>
+<translation id="4690510401873698237">Apala behealdean dago</translation>
<translation id="4724120544754982507">Jakinarazpen-zentroa: irakurri gabeko <ph name="UNREAD_NOTIFICATION_COUNT" /> jakinarazpen dituzu</translation>
<translation id="4730374152663651037">MAIZ ERABILTZEN DIREN APLIKAZIOAK</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{1 hilabete gelditzen da}other{# hilabete gelditzen dira}}</translation>
@@ -140,17 +142,18 @@
<translation id="5395308026110844773"><ph name="IN_PLACE_APP" /> aplikazioaren gainean dago <ph name="DRAGGED_APP_NAME" />; aska ezazu karpeta bat sortzeko.</translation>
<translation id="5463830097259460683">Emojiak eta ikurrak</translation>
<translation id="5476505524087279545">desautatu</translation>
-<translation id="547979256943495781">Biltegia eskuinaldean dago</translation>
+<translation id="547979256943495781">Apala eskuinaldean dago</translation>
<translation id="5528053674512161860">Ezin izan da kargatu orria ez dagoelako instalatuta garatzailearen erabiltzaile-interfazearen modulua (dev_ui)</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> sistema</translation>
<translation id="5583640892426849032">Atzera tekla</translation>
<translation id="5613020302032141669">Ezkerrera gezia</translation>
<translation id="5652575806481723716">Zure arreta behar du <ph name="FOCUSED_APP_NAME" /> aplikazioak.</translation>
-<translation id="5675363643668471212">Biltegiko elementua</translation>
+<translation id="5675363643668471212">Apaleko elementua</translation>
<translation id="5754277640426581776">{MINUTES,plural, =1{1 min}other{# min}}</translation>
<translation id="5763338081255973061">{DAYS,plural, =0{Aktibo gaur}=1{Aktibo duela 1 egun}other{Aktibo duela # egun}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 egun eta }other{# egun eta }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Irudia.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 urte barru}other{# urte barru}}</translation>
<translation id="588258955323874662">Pantaila osoa</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 segundo gelditzen da}other{# segundo gelditzen dira}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">sakatu</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 ordu gelditzen da}other{# ordu gelditzen dira}}</translation>
<translation id="688711909580084195">Titulurik gabeko web-orria</translation>
+<translation id="6902419395050653510">HTML edukia.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/seg</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 urte gelditzen da}other{# urte gelditzen dira}}</translation>
<translation id="6945221475159498467">Hautatu</translation>
@@ -214,7 +218,7 @@
<translation id="7848989271541991537"><ph name="PAGE_NUMBER" />. orriko <ph name="ROW_NUMBER" />. errenkadako <ph name="COLUMN_NUMBER" /> zutabera eraman da.</translation>
<translation id="7879499977785298635">Ez blokeatu</translation>
<translation id="7907591526440419938">Ireki fitxategia</translation>
-<translation id="7952747673138230804">Chrome OS sistemak araka dezakezun eduki berriari buruzko iradokizunak erakusten ditu. Kalitatea hobetzeko balio duten estatistikak bidaltzen ditu, erabilera-datuak partekatzea aukeratu baduzu. <ph name="MANAGE_SETTINGS" /></translation>
+<translation id="7952747673138230804">Chrome OS-ek araka dezakezun eduki berriari buruzko iradokizunak erakusten ditu. Kalitatea hobetzeko balio duten estatistikak bidaltzen ditu, erabilera-datuak partekatzea aukeratu baduzu. <ph name="MANAGE_SETTINGS" /></translation>
<translation id="7969046989155602842">Command</translation>
<translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{Irakurri gabeko jakinarazpen bat baino gehiago dago}other{Irakurri gabeko # jakinarazpen baino gehiago daude}}</translation>
<translation id="8086866675552927481">{MINUTES,plural, =1{1 min barru}other{# min barru}}</translation>
@@ -239,7 +243,7 @@
<translation id="8394908167088220973">Erreproduzitu/Pausatu multimedia-elementua</translation>
<translation id="8458811141851741261">{YEARS,plural, =1{1 urte}other{# urte}}</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> fitxategia (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
-<translation id="8649597172973390955">Biltegia beti dago ikusgai</translation>
+<translation id="8649597172973390955">Apala beti dago ikusgai</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/s</translation>
<translation id="8685326675965865247">Bilatu gailuan, aplikazioetan, ezarpenetan eta sarean. Aplikazio batetik bestera pasatzeko, erabili gezi-teklak.</translation>
<translation id="8725488761726303204">eta beste <ph name="NUMBER" /></translation>
@@ -252,7 +256,7 @@
<translation id="8867568208303837180">Bidaltzen…</translation>
<translation id="8876215549894133151">Formatua:</translation>
<translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation>
-<translation id="8926951137623668982">Biltegia beti dago ezkutatuta</translation>
+<translation id="8926951137623668982">Apala beti dago ezkutatuta</translation>
<translation id="8996630695507351249">Ziurtatu <ph name="TARGET_DEVICE_NAME" /> gailua Internetera konektatuta dagoela.</translation>
<translation id="9002566407876343676">ireki</translation>
<translation id="9044832324875206639">{SECONDS,plural, =1{1 s}other{# s}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fa.xtb b/chromium/ui/strings/translations/ui_strings_fa.xtb
index 7b9bf0da89e..c7bd23b90b7 100644
--- a/chromium/ui/strings/translations/ui_strings_fa.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fa.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> هم‌رسانی نشد</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> با <ph name="SECOND_ITEM_TITLE" /> جابه‌جا شد</translation>
<translation id="1498028757988366001">قبلاً این را جستجو کردید. اگر «<ph name="QUERY" />» را از سابقه‌تان حذف کنید، این پرسمان در همه دستگاه‌ها از حسابتان به‌طور دائم برداشته خواهد شد.</translation>
+<translation id="1510238584712386396">راه‌انداز</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{۱ دقیقه و }one{# دقیقه و }other{# دقیقه و }}</translation>
<translation id="1643823602425662293">اعلان</translation>
<translation id="169515659049020177">تبدیل</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> فایل</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" /> یا بیشتر</translation>
<translation id="3618849550573277856">جستجوی «<ph name="LOOKUP_STRING" />»</translation>
+<translation id="3622035490309591977">سابقه بریده‌دان</translation>
<translation id="364720409959344976">انتخاب پوشه برای بارگذاری</translation>
<translation id="3660179305079774227">پیکان بالا</translation>
<translation id="3670030362669914947">عدد</translation>
@@ -119,7 +121,7 @@
<translation id="4316910396681052118">همه برنامه‌ها</translation>
<translation id="4491109536499578614">تصویر</translation>
<translation id="4588090240171750605">پیمایش به راست</translation>
-<translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />، رتبه‌بندی با ستاره <ph name="RATING_SCORE" /></translation>
+<translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />، رده‌بندی با ستاره <ph name="RATING_SCORE" /></translation>
<translation id="4648249871170053485"><ph name="APP_NAME" />، توصیه برنامه</translation>
<translation id="4690510401873698237">قفسه در پایین است</translation>
<translation id="4724120544754982507">مرکز اعلان، <ph name="UNREAD_NOTIFICATION_COUNT" /> اعلان خوانده‌نشده</translation>
@@ -151,13 +153,14 @@
<translation id="5763338081255973061">{DAYS,plural, =0{آخرین فعالیت: امروز}=1{آخرین فعالیت: ۱ روز قبل}one{آخرین فعالیت: # روز قبل}other{آخرین فعالیت: # روز قبل}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{۱ روز و }one{# روز و }other{# روز و }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">تصویر.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{تا ۱ سال دیگر}one{تا # سال دیگر}other{تا # سال دیگر}}</translation>
<translation id="588258955323874662">تمام صفحه</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{۱ ثانیه باقی مانده است}one{# ثانیه باقی مانده است}other{# ثانیه باقی مانده است}}</translation>
<translation id="5941711191222866238">کوچک کردن</translation>
<translation id="5943826764092288734">{HOURS,plural, =1{۱ ساعت}one{# ساعت}other{# ساعت}}</translation>
<translation id="6012623610530968780">صفحه <ph name="SELECTED_PAGE" /> از <ph name="TOTAL_PAGE_NUM" /></translation>
-<translation id="6022924867608035986">پاک کردن نوشتار کادر جستجو</translation>
+<translation id="6022924867608035986">پاک کردن نوشتار چارگوش جستجو</translation>
<translation id="6040143037577758943">بستن</translation>
<translation id="6119846243427417423">فعالسازی</translation>
<translation id="6129953537138746214">فاصله</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">فشار دادن</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{۱ ساعت باقی مانده است}one{# ساعت باقی مانده است}other{# ساعت باقی مانده است}}</translation>
<translation id="688711909580084195">صفحهٔ وب بدون عنوان</translation>
+<translation id="6902419395050653510">‏محتوای HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> پتابایت/ثانیه</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{۱ سال باقی مانده است}one{#سال باقی مانده است}other{#سال باقی مانده است}}</translation>
<translation id="6945221475159498467">انتخاب</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fi.xtb b/chromium/ui/strings/translations/ui_strings_fi.xtb
index 4c6027888d9..ebddd035e8e 100644
--- a/chromium/ui/strings/translations/ui_strings_fi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fi.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Jakaminen ei onnistu: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> vaihdettiin: <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Hait tätä aiemmin. Jos <ph name="QUERY" /> poistetaan historiastasi, se poistetaan pysyvästi tililtäsi kaikilla laitteillasi.</translation>
+<translation id="1510238584712386396">Käynnistysohjelma</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuutti ja }other{# minuuttia ja }}</translation>
<translation id="1643823602425662293">Ilmoitus</translation>
<translation id="169515659049020177">Shift</translation>
@@ -31,7 +32,7 @@
<translation id="1761785978543082658"><ph name="QUANTITY" /> t</translation>
<translation id="1801827354178857021">Jakso</translation>
<translation id="1803208670097017349">{MONTHS,plural, =1{1 kuukausi}other{# kuukautta}}</translation>
-<translation id="1809410197924942083"><ph name="QUANTITY" /> Mt/s</translation>
+<translation id="1809410197924942083"><ph name="QUANTITY" /> Mb/s</translation>
<translation id="1830179671306812954">{HOURS,plural, =1{1 tunti ja }other{# tuntia ja }}</translation>
<translation id="1830308660060964064"><ph name="ITEM_TITLE" /> irrotettiin</translation>
<translation id="1842960171412779397">Valitse</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-tiedosto</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Hae ”<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Leikepöydän historia</translation>
<translation id="364720409959344976">Valitse lähetettävä kansio</translation>
<translation id="3660179305079774227">Nuoli yl.</translation>
<translation id="3670030362669914947">Numero</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktiivinen tänään}=1{Aktiivinen 1 päivä sitten}other{Aktiivinen # päivää sitten}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 päivä ja }other{# päivää ja }}</translation>
<translation id="5789643057113097023">,</translation>
+<translation id="5843690142429128814">Kuva.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 v:n päästä}other{# v:n päästä}}</translation>
<translation id="588258955323874662">Koko ruutu</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 sekunti jäljellä}other{# sekuntia jäljellä}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">paina</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 tunti jäljellä}other{# tuntia jäljellä}}</translation>
<translation id="688711909580084195">Nimetön verkkosivu</translation>
+<translation id="6902419395050653510">HTML-sisältö</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> Pt/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 vuosi jäljellä}other{# vuotta jäljellä}}</translation>
<translation id="6945221475159498467">Valitse</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fil.xtb b/chromium/ui/strings/translations/ui_strings_fil.xtb
index 20f1e869415..5a1fc074076 100644
--- a/chromium/ui/strings/translations/ui_strings_fil.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fil.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Hindi maibahagi ang <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Ipinagpalit ang <ph name="FIRST_ITEM_TITLE" /> sa <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Hinanap mo ito dati. Kapag na-delete ang "<ph name="QUERY" />" sa iyong history, permanente itong aalisin sa account mo sa lahat ng iyong device.</translation>
+<translation id="1510238584712386396">Launcher</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto at }one{# minuto at }other{# na minuto at }}</translation>
<translation id="1643823602425662293">Notification</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> File</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Hanapin ang “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">History ng clipboard</translation>
<translation id="364720409959344976">Pumili ng Folder na I-a-upload</translation>
<translation id="3660179305079774227">Up Arrow</translation>
<translation id="3670030362669914947">Numero</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktibo ngayong araw}=1{Aktibo 1 araw ang nakalipas}one{Aktibo # araw ang nakalipas}other{Aktibo # na araw ang nakalipas}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 araw at }one{# araw at }other{# na araw at }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Larawan.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{sa loob ng 1 taon}one{sa loob ng # taon}other{sa loob ng # na taon}}</translation>
<translation id="588258955323874662">Fullscreen</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 segundo na lang ang natitira}one{# segundo na lang ang natitira}other{# na segundo na lang ang natitira}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">pindutin</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 oras na lang ang natitira}one{# oras na lang ang natitira}other{# na oras na lang ang natitira}}</translation>
<translation id="688711909580084195">Walang Pamagat na Webpage</translation>
+<translation id="6902419395050653510">Content ng HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> (na) PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 taon ang natitira}one{# taon ang natitira}other{# na taon ang natitira}}</translation>
<translation id="6945221475159498467">Pumili</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fr-CA.xtb b/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
index 71fc80b74f1..bda0e9bc905 100644
--- a/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fr-CA.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Impossible de partager l'élément suivant : <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> a changé de place avec <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Vous avez déjà effectué cette recherche. La suppression de « <ph name="QUERY" /> » de votre historique la supprimera de manière permanente de votre compte sur tous vos appareils.</translation>
+<translation id="1510238584712386396">Lanceur</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minute et }one{# minute et }other{# minutes et }}</translation>
<translation id="1643823602425662293">Notification</translation>
<translation id="169515659049020177">Maj</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Fichier <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">Plus de <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Rechercher « <ph name="LOOKUP_STRING" /> »</translation>
+<translation id="3622035490309591977">Historique du presse-papiers</translation>
<translation id="364720409959344976">Sélectionner le dossier à téléverser</translation>
<translation id="3660179305079774227">Flèche vers le haut</translation>
<translation id="3670030362669914947">Numéro</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Actif aujourd'hui}=1{Actif il y a 1 jour}one{Actif il y a # jour}other{Actif il y a # jours}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 jour et }one{# jour et }other{# jours et }}</translation>
<translation id="5789643057113097023">,</translation>
+<translation id="5843690142429128814">Image.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{dans 1 an}one{dans # an}other{dans # ans}}</translation>
<translation id="588258955323874662">Plein écran</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 seconde restante}one{# seconde restante}other{# secondes restantes}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">appuyer</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 heure restante}one{# heure restante}other{# heures restantes}}</translation>
<translation id="688711909580084195">Page Web sans titre</translation>
+<translation id="6902419395050653510">Contenu HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> Po/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Un an restant}one{# an restant}other{# ans restants}}</translation>
<translation id="6945221475159498467">Sélectionner</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fr.xtb b/chromium/ui/strings/translations/ui_strings_fr.xtb
index 8a0de2b9c63..1576b867dfe 100644
--- a/chromium/ui/strings/translations/ui_strings_fr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fr.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Impossible de partager le contenu suivant : <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Élément <ph name="FIRST_ITEM_TITLE" /> remplacé par <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Vous avez effectué cette recherche précédemment. Si vous supprimez "<ph name="QUERY" />" de votre historique, cette entrée n'apparaîtra plus dans votre compte sur aucun de vos appareils.</translation>
+<translation id="1510238584712386396">Lanceur d'applications</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minute et }one{# minute et }other{# minutes et }}</translation>
<translation id="1643823602425662293">Notification</translation>
<translation id="169515659049020177">Maj</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Fichier <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">+ de <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Rechercher "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Historique du presse-papiers</translation>
<translation id="364720409959344976">Sélectionner le dossier d'importation</translation>
<translation id="3660179305079774227">Haut</translation>
<translation id="3670030362669914947">Numéro</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Actif aujourd'hui}=1{Actif il y a 1 jour}one{Actif il y a # jour}other{Actif il y a # jours}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 jour et }one{# jour et }other{# jours et }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Image.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{dans 1 a}one{dans # a}other{dans # a}}</translation>
<translation id="588258955323874662">Plein écran</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 seconde restante}one{# seconde restante}other{# secondes restantes}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">appuyer</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 heure restante}one{# heure restante}other{# heures restantes}}</translation>
<translation id="688711909580084195">Page Web sans titre</translation>
+<translation id="6902419395050653510">Contenu HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> Po/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 an restant}one{# an restant}other{# ans restants}}</translation>
<translation id="6945221475159498467">Sélectionner</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_gl.xtb b/chromium/ui/strings/translations/ui_strings_gl.xtb
index 87811390d91..9b5d6992761 100644
--- a/chromium/ui/strings/translations/ui_strings_gl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_gl.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Non se puido compartir este contido: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> cambiouse con <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Xa buscaches isto. Ao eliminar "<ph name="QUERY" />" do historial, quitarase permanentemente da túa conta en todos os teus dispositivos.</translation>
+<translation id="1510238584712386396">Menú de aplicacións</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{Un minuto e }other{# minutos e }}</translation>
<translation id="1643823602425662293">Notificación</translation>
<translation id="169515659049020177">Maiús</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Ficheiro <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">Máis de <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Buscar "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Historial do portapapeis</translation>
<translation id="364720409959344976">Seleccionar cartafol para cargar</translation>
<translation id="3660179305079774227">Frecha cara arriba</translation>
<translation id="3670030362669914947">Número</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Dispositivo activo hoxe}=1{Dispositivo activo hai 1 día}other{Dispositivo activo hai # días}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{Un día e }other{# días e }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imaxe.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{en 1 a}other{en # a}}</translation>
<translation id="588258955323874662">Pantalla completa</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Queda un segundo}other{Quedan # segundos}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">premer</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Queda unha hora}other{Quedan # horas}}</translation>
<translation id="688711909580084195">Páxina web sen título</translation>
+<translation id="6902419395050653510">Contido HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Queda 1 ano}other{Quedan # anos}}</translation>
<translation id="6945221475159498467">Seleccionar</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_gu.xtb b/chromium/ui/strings/translations/ui_strings_gu.xtb
index 7280131bcd9..5b9c64db43e 100644
--- a/chromium/ui/strings/translations/ui_strings_gu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_gu.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> શેર કરી શકતાં નથી</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> અને <ph name="SECOND_ITEM_TITLE" />ની ફેરબદલ કરવામાં આવી</translation>
<translation id="1498028757988366001">તમે આ અગાઉ શોધ્યું હતું. "<ph name="QUERY" />"ને તમારા સ્થાન ઇતિહાસમાંથી ડિલીટ કરવાથી તેને તમારા બધા ડિવાઇસ પરના તમારા એકાઉન્ટમાંથી કાઢી નાખવામાં આવશે.</translation>
+<translation id="1510238584712386396">લૉન્ચર</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 મિનિટ અને }one{# મિનિટ અને }other{# મિનિટ અને }}</translation>
<translation id="1643823602425662293">સૂચના</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ફાઇલ</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” શોધો</translation>
+<translation id="3622035490309591977">ક્લિપબોર્ડનો ઇતિહાસ</translation>
<translation id="364720409959344976">અપલોડ કરવા માટે ફોલ્ડર પસંદ કરો</translation>
<translation id="3660179305079774227">ઉપર એરો</translation>
<translation id="3670030362669914947">નંબર</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{આજે સક્રિય છે}=1{1 દિવસ પહેલાં સક્રિય હતું}one{# દિવસ પહેલાં સક્રિય હતું}other{# દિવસ પહેલાં સક્રિય હતું}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 દિવસ અને }one{# દિવસ અને }other{# દિવસ અને }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">છબી.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1વ. માં}one{#વ. માં}other{#વ. માં}}</translation>
<translation id="588258955323874662">પૂર્ણસ્ક્રીન</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 સેકન્ડ બાકી}one{# સેકન્ડ બાકી}other{# સેકન્ડ બાકી}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">દબાવો</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 કલાક બાકી}one{# કલાક બાકી}other{# કલાક બાકી}}</translation>
<translation id="688711909580084195">શીર્ષક વિનાનું વેબપેજ</translation>
+<translation id="6902419395050653510">HTML કન્ટેન્ટ.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 વર્ષ બાકી}one{# વર્ષ બાકી}other{# વર્ષ બાકી}}</translation>
<translation id="6945221475159498467">પસંદ કરો</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hi.xtb b/chromium/ui/strings/translations/ui_strings_hi.xtb
index 15b6d5c5dd8..8eddf5d100e 100644
--- a/chromium/ui/strings/translations/ui_strings_hi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hi.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> शेयर नहीं किया जा सकता</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> की <ph name="SECOND_ITEM_TITLE" /> के साथ अदला-बदली की गई</translation>
<translation id="1498028757988366001">आपने पहले इसे खोजा है. अगर आप "<ph name="QUERY" />" को अपने इतिहास से मिटा देते हैं, तो यह सभी डिवाइस पर मौजूद आपके खाते से हटा दिया जाएगा.</translation>
+<translation id="1510238584712386396">लॉन्चर</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 मिनट और }one{# मिनट और }other{# मिनट और }}</translation>
<translation id="1643823602425662293">सूचना</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> फ़ाइल</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” को खोजें</translation>
+<translation id="3622035490309591977">क्लिपबोर्ड डेटा का इतिहास</translation>
<translation id="364720409959344976">अपलोड करने के लिए फ़ोल्‍डर चुनें</translation>
<translation id="3660179305079774227">ऊपर तीर</translation>
<translation id="3670030362669914947">कार्ड नंबर</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{आज चालू है}=1{1 दिन पहले चालू किया गया}one{# दिन पहले चालू किया गया}other{# दिन पहले चालू किया गया}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 दिन और }one{# दिन और }other{# दिन और }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">इमेज.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1साल में}one{# साल में}other{# साल में}}</translation>
<translation id="588258955323874662">पूर्णस्‍क्रीन</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 सेकंड शेष}one{# सेकंड शेष}other{# सेकंड शेष}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">दबाएं</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 घंटा शेष}one{# घंटे शेष}other{# घंटे शेष}}</translation>
<translation id="688711909580084195">शीर्षक-रहित वेबपेज</translation>
+<translation id="6902419395050653510">एचटीएमएल कॉन्टेंट.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 वर्ष शेष}one{# वर्ष शेष}other{# वर्ष शेष}}</translation>
<translation id="6945221475159498467">चुनें</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hr.xtb b/chromium/ui/strings/translations/ui_strings_hr.xtb
index f45c214a375..3975c2e0ed9 100644
--- a/chromium/ui/strings/translations/ui_strings_hr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hr.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Nije moguće dijeliti <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Stavka <ph name="FIRST_ITEM_TITLE" /> zamijenjena je stavkom <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">To ste već tražili. Brisanjem upita "<ph name="QUERY" />" iz povijesti trajno ćete ga ukloniti sa svojeg računa na svim svojim uređajima.</translation>
+<translation id="1510238584712386396">Pokretač</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuta i }one{# minuta i }few{# minute i }other{# minuta i }}</translation>
<translation id="1643823602425662293">Obavijest</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> datoteka</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Potraži "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Povijest podataka u međuspremniku</translation>
<translation id="364720409959344976">Odabir mape za prijenos</translation>
<translation id="3660179305079774227">Strelica prema gore</translation>
<translation id="3670030362669914947">Broj</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktivan danas}=1{Aktivan prije jednog dana}one{Aktivan prije # dana}few{Aktivan prije # dana}other{Aktivan prije # dana}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dan i }one{# dan i }few{# dana i }other{# dana i }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Slika.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{za 1 g}one{za # g}few{za # g}other{za # g}}</translation>
<translation id="588258955323874662">Puni zaslon</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Još 1 sekunda}one{Još # sekunda}few{Još # sekunde}other{Još # sekundi}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">pritisni</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Još 1 sat}one{Još # sat}few{Još # sata}other{Još # sati}}</translation>
<translation id="688711909580084195">Web-stranica bez naslova</translation>
+<translation id="6902419395050653510">HTML sadržaj.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Još godinu dana}one{Još # godinu}few{Još # godine}other{Još # godina}}</translation>
<translation id="6945221475159498467">Odaberi</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hu.xtb b/chromium/ui/strings/translations/ui_strings_hu.xtb
index 1735290409c..c4b2bdfe231 100644
--- a/chromium/ui/strings/translations/ui_strings_hu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hu.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Nem sikerült a(z) <ph name="CONTENT_TYPE" /> megosztása</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> lecserélve erre: <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Korábban már rákeresett erre. Ha törli a(z) <ph name="QUERY" /> lekérdezést az előzmények közül, azzal véglegesen eltávolítja fiókjából minden eszközén.</translation>
+<translation id="1510238584712386396">Indító</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 perc és }other{# perc és }}</translation>
<translation id="1643823602425662293">Értesítés</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-fájl</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">A(z) „<ph name="LOOKUP_STRING" />” keresése</translation>
+<translation id="3622035490309591977">Vágólapelőzmények</translation>
<translation id="364720409959344976">Mappa kiválasztása a feltöltéshez</translation>
<translation id="3660179305079774227">Felfelé nyíl</translation>
<translation id="3670030362669914947">Szám</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Ma volt aktív}=1{1 napja volt aktív}other{# napja volt aktív}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 nap és }other{# nap és }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Kép.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 év múlva}other{# év múlva}}</translation>
<translation id="588258955323874662">Teljes képernyő</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 másodperc van hátra}other{# másodperc van hátra}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">Gomb lenyomása</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 óra van hátra}other{# óra van hátra}}</translation>
<translation id="688711909580084195">Névtelen weboldal</translation>
+<translation id="6902419395050653510">HTML-tartalom.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{hátralévő idő: 1 év}other{hátralévő idő: # év}}</translation>
<translation id="6945221475159498467">Kiválasztás</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_hy.xtb b/chromium/ui/strings/translations/ui_strings_hy.xtb
index 012e0fd8c44..5b088169ff1 100644
--- a/chromium/ui/strings/translations/ui_strings_hy.xtb
+++ b/chromium/ui/strings/translations/ui_strings_hy.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Չհաջողվեց ուղարկել բովանդակությունը (<ph name="CONTENT_TYPE" />)</translation>
<translation id="1487931858675166540">«<ph name="FIRST_ITEM_TITLE" />» և «<ph name="SECOND_ITEM_TITLE" />» տարրերը տեղերով փոխվեցին</translation>
<translation id="1498028757988366001">Դուք նախկինում որոնել եք սա: Եթե ջնջեք «<ph name="QUERY" />» հարցումը պատմությունից, այն ընդմիշտ կհեռացվի ձեր բոլոր սարքերից, որտեղ մուտք եք գործել հաշիվ։</translation>
+<translation id="1510238584712386396">Գործարկիչ</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 րոպե }one{# րոպե }other{# րոպե }}</translation>
<translation id="1643823602425662293">Ծանուցում</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> Ֆայլ</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Փնտրել «<ph name="LOOKUP_STRING" />»</translation>
+<translation id="3622035490309591977">Սեղմատախտակի պատմություն</translation>
<translation id="364720409959344976">Ընտրեք պանակ՝ վերբեռնելու համար</translation>
<translation id="3660179305079774227">Վեր սլաք</translation>
<translation id="3670030362669914947">Քարտի համարը</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Այսօր ակտիվ է եղել}=1{Ակտիվ է եղել 1 օր առաջ}one{Ակտիվ է եղել # օր առաջ}other{Ակտիվ է եղել # օր առաջ}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 օր }one{# օր }other{# օր }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Պատկեր:</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 տ-ուց}one{# տ-ուց}other{# տ-ուց}}</translation>
<translation id="588258955323874662">Լիաէկրան</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Մնացել է 1 վայրկյան}one{Մնացել է # վայրկյան}other{Մնացել է # վայրկյան}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">սեղմել</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Մնացել է 1 ժամ}one{Մնացել է # ժամ}other{Մնացել է # ժամ}}</translation>
<translation id="688711909580084195">Անվերնագիր վեբէջ</translation>
+<translation id="6902419395050653510">HTML բովանդակություն։</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ՊԲ/վ</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Մնացել է 1 տարի}one{# years left}other{Մնացել է # տարի}}</translation>
<translation id="6945221475159498467">Ընտրել</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_id.xtb b/chromium/ui/strings/translations/ui_strings_id.xtb
index 0fe7b6d6523..4db4bda847d 100644
--- a/chromium/ui/strings/translations/ui_strings_id.xtb
+++ b/chromium/ui/strings/translations/ui_strings_id.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Tidak dapat membagikan <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> ditukar dengan <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Anda menelusuri ini sebelumnya. Menghapus "<ph name="QUERY" />" dari histori akan menghapusnya secara permanen dari akun Anda di semua perangkat.</translation>
+<translation id="1510238584712386396">Peluncur</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 menit dan }other{# menit dan }}</translation>
<translation id="1643823602425662293">Notifikasi</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">File <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Cari "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Histori papan klip</translation>
<translation id="364720409959344976">Pilih Folder untuk Diunggah</translation>
<translation id="3660179305079774227">Panah Atas</translation>
<translation id="3670030362669914947">Nomor</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktif hari ini}=1{Aktif 1 hari yang lalu}other{Aktif # hari yang lalu}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 hari dan }other{# hari dan }}</translation>
<translation id="5789643057113097023">:</translation>
+<translation id="5843690142429128814">Gambar.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{dalam 1 t}other{dalam # t}}</translation>
<translation id="588258955323874662">Layar Penuh</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 detik lagi}other{# detik lagi}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">tekan</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 jam lagi}other{# jam lagi}}</translation>
<translation id="688711909580084195">Halaman Web Tanpa Judul</translation>
+<translation id="6902419395050653510">Konten HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/dtk</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 tahun lagi}other{# tahun lagi}}</translation>
<translation id="6945221475159498467">Pilih</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_is.xtb b/chromium/ui/strings/translations/ui_strings_is.xtb
index 3f0b2f31a55..526d1ed1036 100644
--- a/chromium/ui/strings/translations/ui_strings_is.xtb
+++ b/chromium/ui/strings/translations/ui_strings_is.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Ekki er hægt að deila <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> skipt út fyrir <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Þú hefur leitað að þessu áður. Ef þú eyðir „<ph name="QUERY" />“ úr ferlinum þínum verður það fjarlægt varanlega af reikningnum þínum í öllum tækjunum þínum.</translation>
+<translation id="1510238584712386396">Ræsiforrit</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 mínúta og }one{# mínúta og }other{# mínútur og }}</translation>
<translation id="1643823602425662293">Tilkynning</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-skrá</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Fletta upp „<ph name="LOOKUP_STRING" />“</translation>
+<translation id="3622035490309591977">Klippiborðsferill</translation>
<translation id="364720409959344976">Veldu möppu til að hlaða inn</translation>
<translation id="3660179305079774227">Ör upp</translation>
<translation id="3670030362669914947">Númer</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Virkt í dag}=1{Virkt fyrir 1 degi}one{Virkt fyrir # degi}other{Virkt fyrir # dögum}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dagur og }one{# dagur og }other{# dagar og }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Mynd.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{eftir eitt ár}one{eftir # ár}other{eftir # ár}}</translation>
<translation id="588258955323874662">Allur skjárinn</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 sekúnda eftir}one{# sekúnda eftir}other{# sekúndur eftir}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">ýta</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 klukkustund eftir}one{# klukkustund eftir}other{# klukkustundir eftir}}</translation>
<translation id="688711909580084195">Ónefnd vefsíða</translation>
+<translation id="6902419395050653510">HTML-efni.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/sek.</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Eitt ár eftir}one{# ár eftir}other{# ár eftir}}</translation>
<translation id="6945221475159498467">Velja</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_it.xtb b/chromium/ui/strings/translations/ui_strings_it.xtb
index bae5e986bd7..9054dbdc983 100644
--- a/chromium/ui/strings/translations/ui_strings_it.xtb
+++ b/chromium/ui/strings/translations/ui_strings_it.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Impossibile condividere <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> è stato scambiato con <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Hai eseguito questa ricerca in precedenza. Se elimini "<ph name="QUERY" />" dalla cronologia, la query verrà rimossa in modo permanente dal tuo account su tutti i tuoi dispositivi.</translation>
+<translation id="1510238584712386396">Avvio app</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto e }other{# minuti e }}</translation>
<translation id="1643823602425662293">Notifica</translation>
<translation id="169515659049020177">Maiusc</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">File <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Cerca "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Cronologia appunti</translation>
<translation id="364720409959344976">Seleziona la cartella da caricare</translation>
<translation id="3660179305079774227">Freccia SU</translation>
<translation id="3670030362669914947">Numero</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Ultima attività: oggi}=1{Ultima attività: 1 giorno fa}other{Ultima attività: # giorni fa}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 giorno e }other{# giorni e }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Immagine.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{tra 1 a}other{tra # a}}</translation>
<translation id="588258955323874662">Schermo intero</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 secondo rimanente}other{# secondi rimanenti}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">premi</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 ora rimanente}other{# ore rimanenti}}</translation>
<translation id="688711909580084195">Pagina web senza titolo</translation>
+<translation id="6902419395050653510">Contenuti HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 anno rimasto}other{# anni rimasti}}</translation>
<translation id="6945221475159498467">Seleziona</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_iw.xtb b/chromium/ui/strings/translations/ui_strings_iw.xtb
index 72853555603..bdcc3922399 100644
--- a/chromium/ui/strings/translations/ui_strings_iw.xtb
+++ b/chromium/ui/strings/translations/ui_strings_iw.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">לא ניתן לשתף את ה<ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">הפריט <ph name="SECOND_ITEM_TITLE" /> החליף את <ph name="FIRST_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">חיפשת את השאילתה הזו בעבר. מחיקת "<ph name="QUERY" />" מההיסטוריה תסיר אותה באופן סופי מהחשבון בכל המכשירים שברשותך.</translation>
+<translation id="1510238584712386396">מרכז האפליקציות</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{דקה אחת ו }two{# דקות ו }many{# דקות ו }other{# דקות ו }}</translation>
<translation id="1643823602425662293">הודעה</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">קובץ <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">חיפוש “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">היסטוריית הלוח</translation>
<translation id="364720409959344976">בחירת תיקייה להעלאה</translation>
<translation id="3660179305079774227">חץ למעלה</translation>
<translation id="3670030362669914947">מספר</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{פעילות אחרונה: היום}=1{פעילות אחרונה: אתמול}two{פעילות אחרונה: לפני יומיים}many{פעילות אחרונה: לפני # ימים}other{פעילות אחרונה: לפני # ימים}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{יום אחד ו }two{יומיים ו }many{# ימים ו }other{# ימים ו }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">תמונה.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{עוד שנה אחת}two{עוד 2 שנים}many{עוד # שנים}other{עוד # שנים}}</translation>
<translation id="588258955323874662">מסך מלא</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{נותרה שנייה אחת}two{נותרו # שניות}many{נותרו # שניות}other{נותרו # שניות}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">לחיצה</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{נותרה שעה אחת}two{נותרו שעתיים}many{נותרו # שעות}other{נותרו # שעות}}</translation>
<translation id="688711909580084195">דף אינטרנט ללא כותרת</translation>
+<translation id="6902419395050653510">‏תוכן HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{נותרה שנה אחת}two{נותרו שנתיים}many{נותרו # שנים}other{נותרו # שנים}}</translation>
<translation id="6945221475159498467">בחירה</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ja.xtb b/chromium/ui/strings/translations/ui_strings_ja.xtb
index ba153307f1c..9d564b6a408 100644
--- a/chromium/ui/strings/translations/ui_strings_ja.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ja.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> を共有できません</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> と <ph name="SECOND_ITEM_TITLE" /> が置き換わりました</translation>
<translation id="1498028757988366001">このキーワードは以前に検索したことがあります。「<ph name="QUERY" />」を履歴から削除すると、アカウントから完全に(つまりすべてのデバイスから)削除されます。</translation>
+<translation id="1510238584712386396">ランチャー</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 分 }other{# 分 }}</translation>
<translation id="1643823602425662293">通知</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ファイル</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />~</translation>
<translation id="3618849550573277856">「<ph name="LOOKUP_STRING" />」を検索</translation>
+<translation id="3622035490309591977">クリップボードの履歴</translation>
<translation id="364720409959344976">アップロードするフォルダを選択</translation>
<translation id="3660179305079774227">上矢印キー</translation>
<translation id="3670030362669914947">番号</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{アクティブ: 今日}=1{アクティブ: 1 日前}other{アクティブ: # 日前}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 日と }other{# 日と }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">画像です。</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1年}other{#年}}</translation>
<translation id="588258955323874662">全画面表示</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{残り 1 秒}other{残り # 秒}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">押す</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{残り 1 時間}other{残り # 時間}}</translation>
<translation id="688711909580084195">無題のウェブページ</translation>
+<translation id="6902419395050653510">HTML コンテンツです。</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/秒</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{残り 1 年}other{残り # 年}}</translation>
<translation id="6945221475159498467">選択</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ka.xtb b/chromium/ui/strings/translations/ui_strings_ka.xtb
index 58e101ac395..19e61bd263c 100644
--- a/chromium/ui/strings/translations/ui_strings_ka.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ka.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ვერ ზიარდება</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> ჩანაცვლდა შემდეგით: <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">თქვენ უკვე ეძებდით ამას. ისტორიიდან „<ph name="QUERY" />“-ის წაშლის შემთხვევაში, ის ამოიშლება თქვენი ანგარიშიდან თქვენს ყველა მოწყობილობაზე.</translation>
+<translation id="1510238584712386396">გამშვები</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 წუთი და }other{# წუთი და }}</translation>
<translation id="1643823602425662293">შეტყობინება</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ფაილი</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">„<ph name="LOOKUP_STRING" />“-ის მოძიება</translation>
+<translation id="3622035490309591977">გაცვლის ბუფერის ისტორია</translation>
<translation id="364720409959344976">აირჩიეთ საქაღალდე ატვირთვისთვის</translation>
<translation id="3660179305079774227">ზემოთ მიმართული ისარი</translation>
<translation id="3670030362669914947">ნომერი</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{აქტიური იყო დღეს}=1{აქტიური იყო 1 დღის წინ}other{აქტიური იყო # დღის წინ}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 დღე და }other{# დღე და }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">სურათი.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 წ.-ში}other{# წ.-ში}}</translation>
<translation id="588258955323874662">სრული ეკრანი</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{დარჩენილია 1 წამი}other{დარჩენილია # წამი}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">დაჭერა</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{დარჩენილია 1 საათი}other{დარჩენილია # საათი}}</translation>
<translation id="688711909580084195">უსათაურო ვებგვერდი</translation>
+<translation id="6902419395050653510">HTML კონტენტი.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> პბაიტი/წმ</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{დარჩენილია 1 წელი}other{დარჩენილია # წელი}}</translation>
<translation id="6945221475159498467">არჩევა</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_kk.xtb b/chromium/ui/strings/translations/ui_strings_kk.xtb
index 5f39ede5da7..37693179e83 100644
--- a/chromium/ui/strings/translations/ui_strings_kk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_kk.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> бөлісу мүмкін емес</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> және <ph name="SECOND_ITEM_TITLE" /> өзара ауыстырылды.</translation>
<translation id="1498028757988366001">Оны бұған дейін іздегенсіз. Тарихтан "<ph name="QUERY" />" сұрауын жойып тастасаңыз, ол барлық құрылғыңыздағы есептік жазбаңыздан өшіп қалады.</translation>
+<translation id="1510238584712386396">Іске қосу құрылғысы</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 минут және }other{# минут және }}</translation>
<translation id="1643823602425662293">Хабарландыру</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> файлы</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">"<ph name="LOOKUP_STRING" />" іздеу</translation>
+<translation id="3622035490309591977">Буфер тарихы</translation>
<translation id="364720409959344976">Жүктеп салу үшін қалта таңдау</translation>
<translation id="3660179305079774227">Жоғары көрсеткісі</translation>
<translation id="3670030362669914947">Нөмір</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Бүгін қосылды.}=1{1 күн бұрын қосылды.}other{# күн бұрын қосылды.}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 күн және }other{# күн және }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Сурет.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 жылда}other{# жылда}}</translation>
<translation id="588258955323874662">Толық экран</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 секунд қалды}other{# секунд қалды}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">басу</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 сағат қалды}other{# сағат қалды}}</translation>
<translation id="688711909580084195">Атаусыз веб-бет</translation>
+<translation id="6902419395050653510">HTML мазмұны.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ПБ/с</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 жыл қалды}other{# жыл қалды}}</translation>
<translation id="6945221475159498467">Таңдау</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_km.xtb b/chromium/ui/strings/translations/ui_strings_km.xtb
index bed9bd55d1a..ac68855c17b 100644
--- a/chromium/ui/strings/translations/ui_strings_km.xtb
+++ b/chromium/ui/strings/translations/ui_strings_km.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">មិន​អាច​ចែក​រំលែក <ph name="CONTENT_TYPE" />​ បាន​ទេ</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> បានប្ដូរ​ជាមួយ <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">អ្នកបានស្វែងរកវាពីមុន។ ការលុប "<ph name="QUERY" />" ចេញពីប្រវត្តិ​របស់អ្នកនឹងលុបវាចេញពីគណនីនៅលើ​ឧបករណ៍​ទាំងអស់​របស់អ្នក​ជាអចិន្ត្រៃយ៍។</translation>
+<translation id="1510238584712386396">ឡាន់ឆ័រ</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 នាទី និង }other{# នាទី និង }}</translation>
<translation id="1643823602425662293">ការ​ជូន​ដំណឹង</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">ឯកសារ <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">ស្វែងរក “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">ប្រវត្តិ​ឃ្លីបបត</translation>
<translation id="364720409959344976">ជ្រើសរើសថតឯកសារដើម្បីទាញឡើង</translation>
<translation id="3660179305079774227">ព្រួញឡើងលើ</translation>
<translation id="3670030362669914947">លេខ</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ដំណើរការ​ថ្ងៃនេះ}=1{ដំណើរការ 1 ថ្ងៃមុន}other{ដំណើរការ # ថ្ងៃមុន}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ថ្ងៃ និង }other{# ថ្ងៃ និង }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">រូបភាព។</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 ឆ្នាំទៀត}other{# ឆ្នាំទៀត}}</translation>
<translation id="588258955323874662">ពេញអេក្រង់</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{នៅសល់ 1 វិនាទីទៀត}other{នៅសល់ # វិនាទីទៀត}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">ចុច</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{នៅសល់ 1 ម៉ោងទៀត}other{នៅសល់ # ម៉ោងទៀត}}</translation>
<translation id="688711909580084195">គេហទំព័រគ្មានចំណងជើង</translation>
+<translation id="6902419395050653510">ខ្លឹមសារ HTML។</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/វិនាទី</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{នៅសល់ 1 ឆ្នាំទៀត}other{នៅសល់ # ឆ្នាំទៀត}}</translation>
<translation id="6945221475159498467">ជ្រើសរើស</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_kn.xtb b/chromium/ui/strings/translations/ui_strings_kn.xtb
index 0976e307249..7c622893b90 100644
--- a/chromium/ui/strings/translations/ui_strings_kn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_kn.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" />ವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation>
<translation id="1487931858675166540"><ph name="SECOND_ITEM_TITLE" /> ಜೊತೆಗೆ <ph name="FIRST_ITEM_TITLE" /> ಅನ್ನು ಸ್ವ್ಯಾಪ್ ಮಾಡಲಾಗಿದೆ</translation>
<translation id="1498028757988366001">ನೀವು ಈ ಮೊದಲೇ ಇದಕ್ಕಾಗಿ ಹುಡುಕಿದ್ದೀರಿ. ನಿಮ್ಮ ಇತಿಹಾಸದಿಂದ "<ph name="QUERY" />" ಅನ್ನು ಅಳಿಸುವುದರಿಂದ, ಅದನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಾದ್ಯಂತ ಇರುವ ನಿಮ್ಮ ಖಾತೆಯಿಂದ ಶಾಶ್ವತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.</translation>
+<translation id="1510238584712386396">ಲಾಂಚರ್</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 ನಿಮಿಷ ಮತ್ತು }one{# ನಿಮಿಷಗಳು ಮತ್ತು }other{# ನಿಮಿಷಗಳು ಮತ್ತು }}</translation>
<translation id="1643823602425662293">ಅಧಿಸೂಚನೆ</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ಫೈಲ್</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” ನೋಡಿ</translation>
+<translation id="3622035490309591977">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್ ಇತಿಹಾಸ</translation>
<translation id="364720409959344976">ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ</translation>
<translation id="3660179305079774227">ಮೇಲಿನ ಬಾಣದ ಗುರುತು</translation>
<translation id="3670030362669914947">ಸಂಖ್ಯೆ</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ಇಂದು ಸಕ್ರಿಯ}=1{1 ದಿನದ ಹಿಂದೆ ಸಕ್ರಿಯ}one{# ದಿನಗಳ ಹಿಂದೆ ಸಕ್ರಿಯ}other{# ದಿನಗಳ ಹಿಂದೆ ಸಕ್ರಿಯ}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ದಿನ ಮತ್ತು }one{# ದಿನಗಳು ಮತ್ತು }other{# ದಿನಗಳು ಮತ್ತು }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">ಚಿತ್ರ.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1ವ. ದಲ್ಲಿ}one{#ವ. ಗಳಲ್ಲಿ}other{#ವ. ಗಳಲ್ಲಿ}}</translation>
<translation id="588258955323874662">ಪೂರ್ಣಪರದೆ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 ಸೆಕೆಂಡ್ ಬಾಕಿ ಉಳಿದಿದೆ}one{# ಸೆಕೆಂಡುಗಳು ಬಾಕಿ ಉಳಿದಿವೆ}other{# ಸೆಕೆಂಡುಗಳು ಬಾಕಿ ಉಳಿದಿವೆ}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">ಒತ್ತಿ</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 ಗಂಟೆ ಬಾಕಿ ಉಳಿದಿದೆ}one{# ಗಂಟೆಗಳು ಬಾಕಿ ಉಳಿದಿವೆ}other{# ಗಂಟೆಗಳು ಬಾಕಿ ಉಳಿದಿವೆ}}</translation>
<translation id="688711909580084195">ಶೀರ್ಷಿಕೆರಹಿತ ವೆಬ್‌ಪುಟ</translation>
+<translation id="6902419395050653510">HTML ಕಂಟೆಂಟ್.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 ವರ್ಷ ಉಳಿದಿದೆ}one{# ವರ್ಷಗಳು ಉಳಿದಿವೆ}other{# ವರ್ಷಗಳು ಉಳಿದಿವೆ}}</translation>
<translation id="6945221475159498467">ಆಯ್ಕೆಮಾಡಿ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ko.xtb b/chromium/ui/strings/translations/ui_strings_ko.xtb
index 4c4fce0e569..9e2154f20a8 100644
--- a/chromium/ui/strings/translations/ui_strings_ko.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ko.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> 공유할 수 없음</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> 항목과 <ph name="SECOND_ITEM_TITLE" /> 항목의 위치를 서로 바꿈</translation>
<translation id="1498028757988366001">이전에 검색한 내용입니다. 기록에서 '<ph name="QUERY" />'을(를) 삭제하면 계정과 연결된 모든 기기에서 완전히 삭제됩니다.</translation>
+<translation id="1510238584712386396">런처</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1분 }other{#분 }}</translation>
<translation id="1643823602425662293">알림</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> 파일</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" /> 이상</translation>
<translation id="3618849550573277856">'<ph name="LOOKUP_STRING" />' 찾기</translation>
+<translation id="3622035490309591977">클립보드 기록</translation>
<translation id="364720409959344976">업로드할 폴더 선택</translation>
<translation id="3660179305079774227">위쪽 화살표</translation>
<translation id="3670030362669914947">번호</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{오늘 사용}=1{1일 전에 사용}other{#일 전에 사용}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1일 }other{#일 }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">이미지입니다.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1년 후}other{#년 후}}</translation>
<translation id="588258955323874662">전체화면</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1초 남음}other{#초 남음}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">누르기</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1시간 남음}other{#시간 남음}}</translation>
<translation id="688711909580084195">제목 없는 웹페이지</translation>
+<translation id="6902419395050653510">HTML 콘텐츠입니다.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" />PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1년 남음}other{#년 남음}}</translation>
<translation id="6945221475159498467">선택</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ky.xtb b/chromium/ui/strings/translations/ui_strings_ky.xtb
index deffc452c8d..db44e01d6e5 100644
--- a/chromium/ui/strings/translations/ui_strings_ky.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ky.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> менен бөлүшүү мүмкүн эмес</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> <ph name="SECOND_ITEM_TITLE" /> менен алмаштырылды</translation>
<translation id="1498028757988366001">Муну буга чейин издегенсиз. "<ph name="QUERY" />" таржымалыңыздан өчүрүлсө, ал бардык түзмөктөрүңүздөгү аккаунтуңуздан биротоло өчүрүлөт.</translation>
+<translation id="1510238584712386396">Жүргүзгүч</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 мүнөт жана }other{# мүнөт жана }}</translation>
<translation id="1643823602425662293">Эскертме</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> файл</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” дегенди издөө</translation>
+<translation id="3622035490309591977">Алмашуу буферинин таржымалы</translation>
<translation id="364720409959344976">Жүктөлүп бериле турган куржунду тандоо</translation>
<translation id="3660179305079774227">Өйдө жебе</translation>
<translation id="3670030362669914947">Сан</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Акыркы аракеттер: бүгүн}=1{Акыркы аракеттер: 1 күн мурун}other{Акыркы аракеттер: # күн мурун}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 күн жана }other{# күн жана }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Сүрөт.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 ж. кийин}other{# ж. кийин}}</translation>
<translation id="588258955323874662">Толук экран</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 секунд калды}other{# секунд калды}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">басуу</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 саат калды}other{# саат калды}}</translation>
<translation id="688711909580084195">Аты жок веб-баракча</translation>
+<translation id="6902419395050653510">HTML мазмуну.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> Пб/сек</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 жыл калды}other{# жыл калды}}</translation>
<translation id="6945221475159498467">Тандаңыз</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lo.xtb b/chromium/ui/strings/translations/ui_strings_lo.xtb
index 002a5f2b676..334bd1f9855 100644
--- a/chromium/ui/strings/translations/ui_strings_lo.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lo.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">ບໍ່ສາມາດແບ່ງປັນ <ph name="CONTENT_TYPE" /> ໄດ້</translation>
<translation id="1487931858675166540">ສະຫຼັບ <ph name="FIRST_ITEM_TITLE" /> ກັບ <ph name="SECOND_ITEM_TITLE" /> ແລ້ວ</translation>
<translation id="1498028757988366001">ທ່ານໄດ້ຊອກຫາສິ່ງນີ້ມາກ່ອນແລ້ວ. ການລຶບ "<ph name="QUERY" />" ອອກຈາກປະຫວັດຂອທ່ານຈະລຶບມັນອອກຈາກບັນຊີຂອງທ່ານຢ່າງຖາວອນໃນທົ່ວທຸກອຸປະກອນຂອງທ່ານ.</translation>
+<translation id="1510238584712386396">ຕົວ​ເປີດ​ໃຊ້</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 ນາ​ທີ​ ແລະ }other{# ນາ​ທີ ​ແລະ }}</translation>
<translation id="1643823602425662293">ການແຈ້ງເຕືອນ</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">ໄຟລ໌ <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">ຊອກ "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">ປະຫວັດຄລິບບອດ</translation>
<translation id="364720409959344976">ເລືອກໂຟລເດີທີ່ຈະອັບໂຫຼດ</translation>
<translation id="3660179305079774227">ລູກສອນຂຶ້ນ</translation>
<translation id="3670030362669914947">ໝາຍເລກ</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ເປີດນຳໃຊ້ມື້ນີ້}=1{ເປີດນຳໃຊ້ເມື່ອ 1 ມື້ກ່ອນ}other{ເປີດນຳໃຊ້ເມື່ອ # ມື້ກ່ອນ}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ວັນ​ ແລະ }other{# ວັນ ແລະ }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">ຮູບ.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{ໃນ 1 ປີ}other{ໃນ # ປີ}}</translation>
<translation id="588258955323874662">ເຕັມໜ້າຈໍ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{ຍັງ​ເຫຼືອ 1 ວິ​ນາ​ທີ}other{ຍັງ​ເຫຼືອ # ວິ​ນາ​ທີ}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">ກົດ</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{ຍັງ​ເຫຼືອ 1 ຊົ່ວ​ໂມງ}other{ຍັງ​ເຫຼືອ # ຊົ່ວ​ໂມງ}}</translation>
<translation id="688711909580084195">ໜ້າເວັບບໍ່ມີຊື່</translation>
+<translation id="6902419395050653510">ເນື້ອຫາ HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/ວິນາທີ</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{ຍັງເຫຼືອ 1 ປີ}other{ຍັງເຫຼືອ # ປີ}}</translation>
<translation id="6945221475159498467">ເລືອກ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lt.xtb b/chromium/ui/strings/translations/ui_strings_lt.xtb
index 5529db57632..4a94db982ca 100644
--- a/chromium/ui/strings/translations/ui_strings_lt.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lt.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Nepavyko bendrinti turinio: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">„<ph name="FIRST_ITEM_TITLE" />“ sukeistas su „<ph name="SECOND_ITEM_TITLE" />“</translation>
<translation id="1498028757988366001">Jau anksčiau to ieškojote. Ištrynę „<ph name="QUERY" />“ iš istorijos, visam laikui ją pašalinsite iš savo paskyros visuose įrenginiuose.</translation>
+<translation id="1510238584712386396">Paleidimo priemonė</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minutė ir }one{# minutė ir }few{# minutės ir }many{# minutės ir }other{# minučių ir }}</translation>
<translation id="1643823602425662293">Pranešimas</translation>
<translation id="169515659049020177">Antrojo lygio klavišas</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Failas „<ph name="SAVEAS_EXTENSION_TYPE" />“</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" /> ir daugiau</translation>
<translation id="3618849550573277856">Ieškoti „<ph name="LOOKUP_STRING" />“</translation>
+<translation id="3622035490309591977">Iškarpinės istorija</translation>
<translation id="364720409959344976">Pasirinkite norimą įkelti aplanką</translation>
<translation id="3660179305079774227">Rodyklė „Aukštyn“</translation>
<translation id="3670030362669914947">Numeris</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktyvus šiandien}=1{Aktyvus prieš 1 d.}one{Aktyvus prieš # d.}few{Aktyvus prieš # d.}many{Aktyvus prieš # d.}other{Aktyvus prieš # d.}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 diena ir }one{# diena ir }few{# dienos ir }many{# dienos ir }other{# dienų ir }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Vaizdas.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{po 1 m.}one{po # m.}few{po # m.}many{po # m.}other{po # m.}}</translation>
<translation id="588258955323874662">Visas ekranas</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Liko 1 sekundė}one{Liko # sekundė}few{Liko # sekundės}many{Liko # sekundės}other{Liko # sekundžių}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">paspausti</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{LIko 1 valanda}one{Liko # valanda}few{Liko # valandos}many{Liko # valandos}other{Liko # valandų}}</translation>
<translation id="688711909580084195">Tinklalapis be pavadinimo</translation>
+<translation id="6902419395050653510">HTML turinys.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Liko 1 metai}one{Liko # metai}few{Liko # metai}many{Liko # metų}other{Liko # metų}}</translation>
<translation id="6945221475159498467">Pasirinkti</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_lv.xtb b/chromium/ui/strings/translations/ui_strings_lv.xtb
index f76ec03dfd3..d93f65a7739 100644
--- a/chromium/ui/strings/translations/ui_strings_lv.xtb
+++ b/chromium/ui/strings/translations/ui_strings_lv.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Nevar kopīgot: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> ir samainīts ar <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Jūs jau iepriekš meklējāt šo vienumu. Dzēšot vienumu “<ph name="QUERY" />” no vēstures, tas tiks neatgriezeniski noņemts no jūsu konta visās ierīcēs.</translation>
+<translation id="1510238584712386396">Lietojumprogrammu palaidējs</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minūte un }zero{# minūtes un }one{# minūte un }other{# minūtes un }}</translation>
<translation id="1643823602425662293">Paziņojums</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Fails “<ph name="SAVEAS_EXTENSION_TYPE" />”</translation>
<translation id="3608915363409716668">Vairāk nekā <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Meklēt “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Starpliktuves vēsture</translation>
<translation id="364720409959344976">Augšupielādējamās mapes atlase</translation>
<translation id="3660179305079774227">Bulta augšup</translation>
<translation id="3670030362669914947">Numurs</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktīva šodien}=1{Aktīva pirms 1 dienas}zero{Aktīva pirms # dienām}one{Aktīva pirms # dienas}other{Aktīva pirms # dienām}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 diena un }zero{# dienas un }one{# diena un }other{# dienas un }}</translation>
<translation id="5789643057113097023">:</translation>
+<translation id="5843690142429128814">Attēls.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{pēc 1 g.}zero{pēc # g.}one{pēc # g.}other{pēc # g.}}</translation>
<translation id="588258955323874662">Pilnekrāna</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Atlikusi 1 sekunde}zero{Atlikušas # sekundes}one{Atlikusi # sekunde}other{Atlikušas # sekundes}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">nospiest</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Atlikusi 1 stunda}zero{Atlikušas # stundas}one{Atlikusi # stunda}other{Atlikušas # stundas}}</translation>
<translation id="688711909580084195">Tīmekļa lapa bez nosaukuma</translation>
+<translation id="6902419395050653510">HTML saturs.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Atlicis 1 gads}zero{Atlikuši # gadi}one{Atlicis # gads}other{Atlikuši # gadi}}</translation>
<translation id="6945221475159498467">Atlasīt</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mk.xtb b/chromium/ui/strings/translations/ui_strings_mk.xtb
index a59f3cb4c49..ede2edcc6f1 100644
--- a/chromium/ui/strings/translations/ui_strings_mk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mk.xtb
@@ -10,7 +10,7 @@
<translation id="1201402288615127009">Следно</translation>
<translation id="1218444235442067213"><ph name="APP_NAME" />, апликација од Play Store</translation>
<translation id="1243314992276662751">Постави</translation>
-<translation id="1266864766717917324">Не можеше да се сподели <ph name="CONTENT_TYPE" /></translation>
+<translation id="1266864766717917324">Не може да се сподели <ph name="CONTENT_TYPE" /></translation>
<translation id="1269641567813814718">Win</translation>
<translation id="1290982764014248209">Преместете ја <ph name="DRAGGED_APP" /> во папката <ph name="FOLDER_NAME" />.</translation>
<translation id="1291104554099683393">Обидете се да споделите помали парчиња.</translation>
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Не може да се сподели <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> се замени со <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Го пребарувавте ова порано. Ако го избришете „<ph name="QUERY" />“ од историјата, трајно ќе се отстрани од вашата сметка на сите уреди.</translation>
+<translation id="1510238584712386396">Стартер</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 минута и }one{# минута и }other{# минути и }}</translation>
<translation id="1643823602425662293">Известување</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Датотека <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Побарај „<ph name="LOOKUP_STRING" />“</translation>
+<translation id="3622035490309591977">Историја на привремената меморија</translation>
<translation id="364720409959344976">Избери папка за да се постави</translation>
<translation id="3660179305079774227">Стрелка нагоре</translation>
<translation id="3670030362669914947">Број</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Активен денес}=1{Активен пред 1 ден}one{Активен пред # ден}other{Активен пред # дена}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ден и }one{# ден и }other{# дена и }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Слика.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{за 1 г.}one{за # г.}other{за # г.}}</translation>
<translation id="588258955323874662">Цел екран</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Преостана 1 секунда}one{Преостана # секунда}other{Преостанаа # секунди}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">притисни</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Преостана 1 час}one{Преостана # час}other{Преостанаа # часа}}</translation>
<translation id="688711909580084195">Неименувана веб-страница</translation>
+<translation id="6902419395050653510">HTML-содржини.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ПБ/сек.</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Преостанува 1 година}one{Преостанува # година}other{Преостануваат # години}}</translation>
<translation id="6945221475159498467">Избери</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ml.xtb b/chromium/ui/strings/translations/ui_strings_ml.xtb
index 15317b963e7..40f0ce3de8f 100644
--- a/chromium/ui/strings/translations/ui_strings_ml.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ml.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> പങ്കിടാനാവുന്നില്ല</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />, <ph name="SECOND_ITEM_TITLE" />-മായി സ്വാപ്പ് ചെയ്‌തു</translation>
<translation id="1498028757988366001">നിങ്ങൾ ഇതിനായി മുമ്പ് തിരഞ്ഞിട്ടുണ്ട്. ചരിത്രത്തിൽ നിന്ന് "<ph name="QUERY" />" ഇല്ലാതാക്കുന്നത്, നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലുമുടനീളമുള്ള അക്കൗണ്ടിൽ നിന്ന് അതിനെ ശാശ്വതമായി ഇല്ലാതാക്കും.</translation>
+<translation id="1510238584712386396">ലോഞ്ചർ</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{ഒരു മിനിറ്റും }other{# മിനിറ്റും }}</translation>
<translation id="1643823602425662293">അറിയിപ്പ്</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ഫയൽ</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” തിരയുക</translation>
+<translation id="3622035490309591977">ക്ലിപ്പ്‌ബോർഡ് ചരിത്രം</translation>
<translation id="364720409959344976">അപ്‌ലോഡ് ചെയ്യുന്നതിന് ഫോൾഡർ തിരഞ്ഞെടുക്കുക</translation>
<translation id="3660179305079774227">മുകളിലേക്കുള്ള അമ്പടയാളം</translation>
<translation id="3670030362669914947">നമ്പർ</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ഇന്ന് സജീവമായിരുന്നു}=1{ഒരു ദിവസം മുമ്പ് സജീവമായിരുന്നു}other{# ദിവസം മുമ്പ് സജീവമായിരുന്നു}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{ഒരു ദിവസവും }other{# ദിവസവും }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">ചിത്രം.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{ഒരു വർഷത്തിൽ}other{# വർഷത്തിൽ}}</translation>
<translation id="588258955323874662">പൂര്‍‌ണ്ണസ്‌ക്രീന്‍</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{ഒരു സെക്കൻഡ് ശേഷിക്കുന്നു}other{# സെക്കൻഡ് ശേഷിക്കുന്നു}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">അമര്‍ത്തുക</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{ഒരു മണിക്കൂർ ശേഷിക്കുന്നു}other{# മണിക്കൂർ ശേഷിക്കുന്നു}}</translation>
<translation id="688711909580084195">ശീർഷകമില്ലാത്ത വെബ്‌പേജ്</translation>
+<translation id="6902419395050653510">HTML ഉള്ളടക്കം.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{ഒരു വർഷം ശേഷിക്കുന്നു}other{# വർഷം ശേഷിക്കുന്നു}}</translation>
<translation id="6945221475159498467">തിരഞ്ഞെടുക്കുക</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mn.xtb b/chromium/ui/strings/translations/ui_strings_mn.xtb
index 5057427fafa..ce3d1c54b6d 100644
--- a/chromium/ui/strings/translations/ui_strings_mn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mn.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" />-г хуваалцах боломжгүй байна</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />-г <ph name="SECOND_ITEM_TITLE" />-р сольсон</translation>
<translation id="1498028757988366001">Та үүнийг өмнө нь хайж байсан. "<ph name="QUERY" />"-г түүхээсээ устгаснаар үүнийг таны бүх төхөөрөмж дээрх бүртгэлээс бүрмөсөн хасах болно.</translation>
+<translation id="1510238584712386396">Launcher</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 минут }other{# минут }}</translation>
<translation id="1643823602425662293">Мэдэгдэл</translation>
<translation id="169515659049020177">Солих</translation>
@@ -54,7 +55,7 @@
<translation id="2267918077332197517">Энэ сайтын бүх мэдэгдлийг блоклох</translation>
<translation id="2289052229480071835">Дэлгэцийнхээ хүрэх хэсгийг товшино уу.</translation>
<translation id="2295140143284145483">Судалгаа</translation>
-<translation id="2297836609126180313"><ph name="QUANTITY" /> терабайт/секунд</translation>
+<translation id="2297836609126180313"><ph name="QUANTITY" /> ТБ/секунд</translation>
<translation id="2353636109065292463">Таны интернэт холболтыг шалгаж байна</translation>
<translation id="2388990488038464401">Таны утаснаас энэ дугаар луу залгах уу?</translation>
<translation id="24452542372838207">Мэдэгдлийг дэлгэх</translation>
@@ -81,7 +82,7 @@
<translation id="2931838996092594335">дарах</translation>
<translation id="2981684127883932071">Зөвлөмжийг үзүүлж байна</translation>
<translation id="3036649622769666520">Файл нээх</translation>
-<translation id="3049748772180311791"><ph name="QUANTITY" /> Мегабайт</translation>
+<translation id="3049748772180311791"><ph name="QUANTITY" /> МБ</translation>
<translation id="3068711042108640621">Зүүн талын shelf</translation>
<translation id="3087734570205094154">Доод</translation>
<translation id="3126026824346185272">Ctrl</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> Файл</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Харах “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Түр санах ойн түүх</translation>
<translation id="364720409959344976">Татаж оруулах хавтсыг сонгох</translation>
<translation id="3660179305079774227">Дээш заасан сум</translation>
<translation id="3670030362669914947">Тоо</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Өнөөдөр идэвхтэй байсан}=1{1 өдрийн өмнө идэвхтэй байсан}other{# өдрийн өмнө идэвхтэй байсан}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 өдөр ба }other{# өдөр ба }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Зураг.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 жилийн дараа}other{# жилийн дараа}}</translation>
<translation id="588258955323874662">Дэлгэц дүүрэн</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 секунд үлдсэн}other{# секунд үлдсэн}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">Дарах</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 цаг үлдсэн}other{# цаг үлдсэн}}</translation>
<translation id="688711909580084195">Гарчиггүй веб хуудас</translation>
+<translation id="6902419395050653510">HTML контент.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ПБ/с</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 жил үлдсэн}other{# жил үлдсэн}}</translation>
<translation id="6945221475159498467">Сонгох</translation>
@@ -206,7 +210,7 @@
<translation id="7389409599945284130">- <ph name="MESSAGE" /></translation>
<translation id="7410957453383678442">{MINUTES,plural, =1{1 минут үлдсэн }other{# минут үлдсэн}}</translation>
<translation id="7430878839542012341">Энэ хайлтыг түүхээсээ устгах уу?</translation>
-<translation id="7460907917090416791"><ph name="QUANTITY" /> терабайт</translation>
+<translation id="7460907917090416791"><ph name="QUANTITY" /> ТБ</translation>
<translation id="7507604095951736240">Эможи</translation>
<translation id="7658239707568436148">Болих</translation>
<translation id="7781829728241885113">Өчигдөр</translation>
@@ -228,7 +232,7 @@
<translation id="815598010540052116">Доош нь гүйлгэж харах</translation>
<translation id="8179976553408161302">Нэвтрэх</translation>
<translation id="8210608804940886430">Хуудас доошлуулах</translation>
-<translation id="8245914219290430011">Чихтэй хуудас</translation>
+<translation id="8245914219290430011">Таб</translation>
<translation id="8247998213073982446"><ph name="APP_NAME" />, апп</translation>
<translation id="8259556432390118667">Hex өнгөний утга</translation>
<translation id="8328145009876646418">Зүүн тал</translation>
@@ -257,7 +261,7 @@
<translation id="9002566407876343676">нээх</translation>
<translation id="9044832324875206639">{SECONDS,plural, =1{1 сек}other{# сек}}</translation>
<translation id="9059834730836941392">Мэдэгдлийг буулгах</translation>
-<translation id="9150735707954472829">Чихтэй хуудас</translation>
+<translation id="9150735707954472829">Таб</translation>
<translation id="9161053988251441839">САНАЛ БОЛГОСОН АПП</translation>
<translation id="9170848237812810038">&amp; Буцаах</translation>
<translation id="9178475906033259337"><ph name="QUERY" />-н 1 илэрцийг үзүүлж байна</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mr.xtb b/chromium/ui/strings/translations/ui_strings_mr.xtb
index e4fee51dd79..ffa6cd8cceb 100644
--- a/chromium/ui/strings/translations/ui_strings_mr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mr.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> शेअर करू शकत नाही</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> हा <ph name="SECOND_ITEM_TITLE" /> सोबत स्वॅप केला</translation>
<translation id="1498028757988366001">तुम्ही यापूर्वी याचा शोध घेतला होता. तुमच्या इतिहासामधून "<ph name="QUERY" />" हटवल्याने ती तुमच्या संपूर्ण डिव्हाइसवरील सर्व खात्यामधून कायमची काढून टाकली जाईल.</translation>
+<translation id="1510238584712386396">लाँचर</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 मिनिट आणि }other{# मिनिटे आणि }}</translation>
<translation id="1643823602425662293">सूचना</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> फाइल</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” पहा</translation>
+<translation id="3622035490309591977">क्लिपबोर्डचा इतिहास</translation>
<translation id="364720409959344976">अपलोड करण्यासाठी फोल्डर निवडा</translation>
<translation id="3660179305079774227">Up Arrow</translation>
<translation id="3670030362669914947">नंबर</translation>
@@ -114,7 +116,7 @@
<translation id="4202807286478387388">जंप करा</translation>
<translation id="4250229828105606438">स्क्रीनशॉट</translation>
<translation id="4266252015790371705">{MONTHS,plural, =1{1 महिन्यापूर्वी}other{# महिन्यांपूर्वी}}</translation>
-<translation id="4289300219472526559">बोलणे प्रारंभ करा</translation>
+<translation id="4289300219472526559">बोलणे सुरू करा</translation>
<translation id="430191667033048642"><ph name="MOVED_APP_NAME" /> फोल्डर <ph name="FOLDER_NAME" /> वर हलवले.</translation>
<translation id="4316910396681052118">सर्व अ‍ॅप्स</translation>
<translation id="4491109536499578614">इमेज</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{आज ॲक्टिव्ह होते}=1{एका दिवसापूर्वी ॲक्टिव्ह होते}other{# दिवसांपूर्वी ॲक्टिव्ह होते}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 दिवस आणि }other{# दिवस आणि }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">इमेज.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{१व मध्ये}other{#व मध्ये}}</translation>
<translation id="588258955323874662">क्षेत्रे</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 सेकंद शिल्लक}other{# सेकंद शिल्लक}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">दाबा</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 तास शिल्लक}other{# तास शिल्लक}}</translation>
<translation id="688711909580084195">शीर्षकरहित वेबपेज</translation>
+<translation id="6902419395050653510">HTML आशय.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 वर्ष राहिले}other{# वर्षे राहिली}}</translation>
<translation id="6945221475159498467">निवडा</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ms.xtb b/chromium/ui/strings/translations/ui_strings_ms.xtb
index ebb4cbd32f6..3db1a22485a 100644
--- a/chromium/ui/strings/translations/ui_strings_ms.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ms.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Tidak dapat berkongsi <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> Ditukar dengan <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Anda pernah mencari perkara ini. Tindakan memadamkan "<ph name="QUERY" />" daripada sejarah anda akan mengalihkannya keluar daripada akaun anda pada semua peranti anda.</translation>
+<translation id="1510238584712386396">Pelancar</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minit dan }other{# minit dan }}</translation>
<translation id="1643823602425662293">Pemberitahuan</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Fail <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Cari “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Sejarah papan keratan</translation>
<translation id="364720409959344976">Pilih Folder untuk Dimuat Naik</translation>
<translation id="3660179305079774227">Anak Panah Atas</translation>
<translation id="3670030362669914947">Nombor</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktif hari ini}=1{Aktif 1 hari yang lalu}other{Aktif # hari yang lalu}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 hari dan }other{# hari dan }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imej.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{dalam 1t}other{dalam #t}}</translation>
<translation id="588258955323874662">Skrin penuh</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 saat lagi}other{# saat lagi}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">tekan</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 jam lagi}other{# jam lagi}}</translation>
<translation id="688711909580084195">Laman Web Tidak Bertajuk</translation>
+<translation id="6902419395050653510">Kandungan HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Berbaki 1 tahun}other{Berbaki # tahun}}</translation>
<translation id="6945221475159498467">Pilih</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_my.xtb b/chromium/ui/strings/translations/ui_strings_my.xtb
index c06aeebdb6e..ede10fe7207 100644
--- a/chromium/ui/strings/translations/ui_strings_my.xtb
+++ b/chromium/ui/strings/translations/ui_strings_my.xtb
@@ -8,7 +8,7 @@
<translation id="1169783199079129864">{MINUTES,plural, =1{၁ မိနစ်}other{# မိနစ်}}</translation>
<translation id="1181037720776840403">ဖယ်ရှားရန်</translation>
<translation id="1201402288615127009">ရှေ့သို့</translation>
-<translation id="1218444235442067213"><ph name="APP_NAME" />၊ Play စတိုးအက်ပ်</translation>
+<translation id="1218444235442067213"><ph name="APP_NAME" />၊ Play Store အက်ပ်</translation>
<translation id="1243314992276662751">အာပ်လုဒ် လုပ်ရန်</translation>
<translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> ကို မျှဝေ၍မရပါ။</translation>
<translation id="1269641567813814718">Win</translation>
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ကို မျှဝေ၍ မရပါ</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> ကို <ph name="SECOND_ITEM_TITLE" /> ဖြင့် လှဲလှယ်ထားသည်</translation>
<translation id="1498028757988366001">ဤအရာကို ယခင်က ရှာဖွေဖူးသည်။ "<ph name="QUERY" />" အား သင့်မှတ်တမ်းမှ ဖျက်ခြင်းက စက်ပစ္စည်းအားလုံးရှိ သင်၏အကောင့်မှ ၎င်းကို အပြီးဖယ်ရှားလိုက်ပါမည်။</translation>
+<translation id="1510238584712386396">Launcher</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{၁ မိနစ်နှင့် }other{# မိနစ်နှင့် }}</translation>
<translation id="1643823602425662293">အကြောင်းကြားချက်</translation>
<translation id="169515659049020177">Shift ကီး</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ဖိုင်</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />”ကို ကြည့်ရန်</translation>
+<translation id="3622035490309591977">ကလစ်ဘုတ် မှတ်တမ်း</translation>
<translation id="364720409959344976">တင်ရန် ဖိုင်တွဲရွေးပါ</translation>
<translation id="3660179305079774227">အပေါ်မြား</translation>
<translation id="3670030362669914947">နံပါတ်</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ယနေ့ အသုံးပြုထားသည်}=1{ပြီးခဲ့သော ၁ ရက်က အသုံးပြုထားသည်}other{ပြီးခဲ့သော # ရက်က အသုံးပြုထားသည်}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{၁ ရက်နှင့် }other{# ရက်နှင့် }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">ပုံ။</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{၁နှစ် အတွင်း}other{#နှစ် အတွင်း}}</translation>
<translation id="588258955323874662">မျက်နှာပြင် အပြည့်</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{၁ စက္ကန့်ကျန်၏}other{# စက္ကန့်ကျန်၏}}</translation>
@@ -179,7 +182,7 @@
<translation id="6503257047630241175">RTF အကြောင်းအရာ</translation>
<translation id="6539092367496845964">တစ်ခုခု မှားသွားသည်။ နောက်မှ ထပ်စမ်းကြည့်ပါ။</translation>
<translation id="654149438358937226">သတိပေးချက်များအားလုံးကို ပိတ်ရန်</translation>
-<translation id="6567071839949112727">ပင်မကို ကလစ်နှိပ်ပါ</translation>
+<translation id="6567071839949112727">ပင်မကို နှိပ်ပါ</translation>
<translation id="6578407462441924264">အမည်ပေးမထား</translation>
<translation id="6612467943526193239">တိုင်းတာချိန်ညှိမှုမှ ထွက်ရန် Esc ကို နှိပ်ပါ။</translation>
<translation id="6620110761915583480">ဖိုင် သိမ်းရန်</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">နှိပ်ရန်</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{ 1 နာရီကျန်၏}other{# နာရီကျန်၏}}</translation>
<translation id="688711909580084195">ခေါင်းစဉ်မဲ့ ဝဘ်စာမျက်နှာ</translation>
+<translation id="6902419395050653510">HTML အကြောင်းအရာ။</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{၁ နှစ် ကျန်သည်}other{# နှစ် ကျန်သည်}}</translation>
<translation id="6945221475159498467">ရွေးရန်</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ne.xtb b/chromium/ui/strings/translations/ui_strings_ne.xtb
index 6eda2100c0b..468ae30eb0d 100644
--- a/chromium/ui/strings/translations/ui_strings_ne.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ne.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> आदान प्रदान गर्न सकिएन</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> लाई <ph name="SECOND_ITEM_TITLE" /> सँग साटियो</translation>
<translation id="1498028757988366001">तपाईंले यसअघि यो कुरा खोज्नुभएको थियो। आफ्नो इतिहासबाट "<ph name="QUERY" />" मेटाउनुले तपाईंका सबै यन्त्रमा रहेको तपाईंको खाताबाट यसलाई सदाका लागि हटाउने छ।</translation>
+<translation id="1510238584712386396">लन्चर</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{ १ मिनेट र }other{ # मिनेट र }}</translation>
<translation id="1643823602425662293">सूचना</translation>
<translation id="169515659049020177">सिफ्ट</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> फाइल</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">"<ph name="LOOKUP_STRING" />" माथि हेर्नुहोस्</translation>
+<translation id="3622035490309591977">क्लिपबोर्डको इतिहास</translation>
<translation id="364720409959344976">अपलोड गर्न फोल्डर चयन गर्नुहोस्</translation>
<translation id="3660179305079774227">माथि वाण</translation>
<translation id="3670030362669914947">अङ्क</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{आज सक्रिय रहेको}=1{१ दिनअघि सक्रिय रहेको}other{# दिनअघि सक्रिय रहेको}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{ १ दिन र }other{ # दिन र }}</translation>
<translation id="5789643057113097023">।</translation>
+<translation id="5843690142429128814">फोटो।</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{१ वर्षमा}other{# वर्षमा}}</translation>
<translation id="588258955323874662">पूर्णस्क्रिन</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{ १ सेकेन्ड बाँकी}other{ # सेकेन्ड बाँकी}}</translation>
@@ -168,13 +171,13 @@
<translation id="6165508094623778733">थप जान्नुहोस्</translation>
<translation id="6166852626429024716">आफ्नो यन्त्र, एप, सेटिङ, वेबमा खोज्नुहोस्...</translation>
<translation id="6264365405983206840">&amp;सबै चयन गर्नुहोस्</translation>
-<translation id="6351032674660237738">अनुप्रयोगसम्बन्धी सुझावहरू</translation>
+<translation id="6351032674660237738">एपसम्बन्धी सुझावहरू</translation>
<translation id="6364916375976753737">बायाँ स्क्रोल गर्नुहोस्</translation>
<translation id="6394627529324717982">अल्पविराम</translation>
<translation id="6397363302884558537">बोल्न बन्द गर्नुहोस्</translation>
<translation id="6404817160109697034">{SECONDS,plural, =1{ १ सेकेन्डअघि}other{ # सेकेन्डअघि}}</translation>
<translation id="6417265370957905582">Google सहायक</translation>
-<translation id="6430678249303439055">यो अनुप्रयोगका सबै सूचनाहरूमाथि रोक लगाउनुहोस्</translation>
+<translation id="6430678249303439055">यो एपका सबै सूचनाहरूमाथि रोक लगाउनुहोस्</translation>
<translation id="6483402905448010557">{SECONDS,plural, =1{१ सेकेन्ड अघि}other{# सेकेन्ड अघि}}</translation>
<translation id="6503257047630241175">RTF फाइलको सामग्री</translation>
<translation id="6539092367496845964">केही चिज गडबड भयो। पछि फेरि प्रयास गर्नुहोस्।</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">थिच्नुहोस्</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{ १ घन्टा बाँकी}other{ # घन्टा बाँकी}}</translation>
<translation id="688711909580084195">शीर्षक नभएको वेबपृष्ठ</translation>
+<translation id="6902419395050653510">HTML सामग्री।</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> पीबी/से</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{१ वर्ष बाँकी}other{# वर्ष बाँकी}}</translation>
<translation id="6945221475159498467">चयन गर्नुहोस्</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_nl.xtb b/chromium/ui/strings/translations/ui_strings_nl.xtb
index dd8fcb5ed7b..e7a2da4aaeb 100644
--- a/chromium/ui/strings/translations/ui_strings_nl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_nl.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Kan <ph name="CONTENT_TYPE" /> niet delen</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> is verwisseld met <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Je hebt hier eerder naar gezocht. Als je '<ph name="QUERY" />' uit je geschiedenis verwijdert, wordt deze zoekopdracht definitief op al je apparaten uit je account verwijderd.</translation>
+<translation id="1510238584712386396">Launcher</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuut en }other{# minuten en }}</translation>
<translation id="1643823602425662293">Melding</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-bestand</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">'<ph name="LOOKUP_STRING" />' opzoeken</translation>
+<translation id="3622035490309591977">Klembordgeschiedenis</translation>
<translation id="364720409959344976">Map voor uploaden selecteren</translation>
<translation id="3660179305079774227">Pijl-omhoog</translation>
<translation id="3670030362669914947">Nummer</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Vandaag actief}=1{1 dag geleden actief}other{# dagen geleden actief}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dag en }other{# dagen en }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Afbeelding.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{over 1 j}other{over # j}}</translation>
<translation id="588258955323874662">Volledig scherm</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 seconde resterend}other{# seconden reseterend}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">Indrukken</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Nog 1 uur}other{Nog # uur}}</translation>
<translation id="688711909580084195">Naamloze webpagina</translation>
+<translation id="6902419395050653510">Html-content.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Nog 1 jaar}other{Nog # jaar}}</translation>
<translation id="6945221475159498467">Selecteren</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_no.xtb b/chromium/ui/strings/translations/ui_strings_no.xtb
index 8c809625c2d..432fe797c13 100644
--- a/chromium/ui/strings/translations/ui_strings_no.xtb
+++ b/chromium/ui/strings/translations/ui_strings_no.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Kan ikke dele <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> har byttet plass med <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Du har søkt etter dette før. Hvis du sletter «<ph name="QUERY" />» fra loggen, blir det fjernet permanent fra kontoen din på alle enhetene dine.</translation>
+<translation id="1510238584712386396">Appoversikt</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minutt og }other{# minutter og }}</translation>
<translation id="1643823602425662293">Varsel</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-fil</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Slå opp «<ph name="LOOKUP_STRING" />»</translation>
+<translation id="3622035490309591977">Utklippstavlelogg</translation>
<translation id="364720409959344976">Velg mappen du vil laste opp</translation>
<translation id="3660179305079774227">Pil opp</translation>
<translation id="3670030362669914947">Nummer</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktiv i dag}=1{Aktiv for én dag siden}other{Aktiv for # dager siden}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dag og }other{# dager og }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Bilde.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{om 1 år}other{om # år}}</translation>
<translation id="588258955323874662">Fullskjerm</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 sekund igjen}other{# sekunder igjen}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">trykk</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 time igjen}other{# timer igjen}}</translation>
<translation id="688711909580084195">Nettside uten tittel</translation>
+<translation id="6902419395050653510">HTML-innhold.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB per sek</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 år igjen}other{# år igjen}}</translation>
<translation id="6945221475159498467">Velg</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_or.xtb b/chromium/ui/strings/translations/ui_strings_or.xtb
index ca9ea213500..97720b6eba1 100644
--- a/chromium/ui/strings/translations/ui_strings_or.xtb
+++ b/chromium/ui/strings/translations/ui_strings_or.xtb
@@ -6,7 +6,7 @@
<translation id="1127811143501539442">{DAYS,plural, =1{1 ଦିନ ପୂର୍ବେ}other{# ଦିନ ପୂର୍ବେ}}</translation>
<translation id="1156623771253174079">{SECONDS,plural, =1{1 ମିନିଟ୍ ପୂର୍ବେ}other{# ମିନିଟ୍ ପୂର୍ବେ}}</translation>
<translation id="1169783199079129864">{MINUTES,plural, =1{1 ମିନିଟ୍}other{# ମିନିଟ୍}}</translation>
-<translation id="1181037720776840403">ଅପସାରଣ</translation>
+<translation id="1181037720776840403">କାଢ଼ି ଦିଅନ୍ତୁ</translation>
<translation id="1201402288615127009">ପରବର୍ତ୍ତୀ</translation>
<translation id="1218444235442067213"><ph name="APP_NAME" />, Play Store ଆପ୍‌</translation>
<translation id="1243314992276662751">ଅପ୍‌ଲୋଡ୍ କରନ୍ତୁ</translation>
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ସେୟାର୍ କରାଯାଇ ପାରିବ ନାହିଁ</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />କୁ <ph name="SECOND_ITEM_TITLE" /> ସହିତ ସ୍ୱାପ୍ କରାଯାଇଛି</translation>
<translation id="1498028757988366001">ଆପଣ ପୂର୍ବରୁ ଏହାକୁ ସନ୍ଧାନ କରିଥିଲେ। ଆପଣଙ୍କ ଇତିହାସରୁ "<ph name="QUERY" />" ଡିଲିଟ୍ କରିବା ଦ୍ୱାରା, ଏହା ଆପଣଙ୍କ ସମସ୍ତ ଡିଭାଇସ୍‌ରେ ଥିବା ଆକାଉଣ୍ଟରୁ ସ୍ଥାୟୀ ଭାବେ କାଢ଼ି ହୋଇଯିବ।</translation>
+<translation id="1510238584712386396">ଲଞ୍ଚର୍</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 ମିନିଟ୍‍ ଏବଂ }other{# ମିନିଟ୍‍ ଏବଂ }}</translation>
<translation id="1643823602425662293">ବିଜ୍ଞପ୍ତି</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ଫାଇଲ୍‍</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” ଉପରକୁ ଦେଖନ୍ତୁ</translation>
+<translation id="3622035490309591977">କ୍ଲିପବୋର୍ଡ ଇତିହାସ</translation>
<translation id="364720409959344976">ଅପ୍‌ଲୋଡ୍ କରିବାକୁ ଫୋଲ୍ଡର୍ ଚୟନ କରନ୍ତୁ</translation>
<translation id="3660179305079774227">Up Arrow</translation>
<translation id="3670030362669914947">ନମ୍ବର</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ଆଜି ସକ୍ରିୟ ଅଛି}=1{1 ଦିନ ପୂର୍ବେ ସକ୍ରିୟ ଥିଲା}other{# ଦିନ ପୂର୍ବେ ସକ୍ରିୟ ଥିଲା}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ଦିନ ଏବଂ }other{# ଦିନ ଏବଂ }}</translation>
<translation id="5789643057113097023">।</translation>
+<translation id="5843690142429128814">ଛବି।</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{ବର୍ଷରେ}other{# ବର୍ଷରେ}}</translation>
<translation id="588258955323874662">ପୂର୍ଣ୍ଣସ୍କ୍ରିନ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 ସେକେଣ୍ଡ ବାକିଅଛି}other{# ସେକେଣ୍ଡ ବାକିଅଛି}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">ଦବାନ୍ତୁ</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 ଘଣ୍ଟା}other{# ଘଣ୍ଟା ବାକି ଅଛି}}</translation>
<translation id="688711909580084195">ନାମହୀନ ୱେବ୍‌ପୃଷ୍ଠା</translation>
+<translation id="6902419395050653510">HTML ବିଷୟବସ୍ତୁ।</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 ବର୍ଷ ବାକି ଅଛି}other{# ବର୍ଷ ବାକି ଅଛି}}</translation>
<translation id="6945221475159498467">ଚୟନ କରନ୍ତୁ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pa.xtb b/chromium/ui/strings/translations/ui_strings_pa.xtb
index 1ca86f8f739..6f9e1629de1 100644
--- a/chromium/ui/strings/translations/ui_strings_pa.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pa.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ਨੂੰ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> ਨੂੰ <ph name="SECOND_ITEM_TITLE" /> ਨਾਲ ਬਦਲਿਆ ਗਿਆ</translation>
<translation id="1498028757988366001">ਤੁਸੀਂ ਇਸ ਲਈ ਪਹਿਲਾਂ ਹੀ ਖੋਜ ਕੀਤੀ ਹੈ। "<ph name="QUERY" />" ਨੂੰ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਤੋਂ ਮਿਟਾਉਣਾ ਇਸਨੂੰ ਤੁਹਾਡੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ ਵਿੱਚ ਵਰਤੇ ਜਾਂਦੇ ਤੁਹਾਡੇ ਖਾਤੇ ਤੋਂ ਸਥਾਈ ਤੌਰ 'ਤੇ ਹਟਾ ਦੇਵੇਗਾ।</translation>
+<translation id="1510238584712386396">ਲੌਂਚਰ</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 ਮਿੰਟ ਅਤੇ }one{# ਮਿੰਟ ਅਤੇ }other{# ਮਿੰਟ ਅਤੇ }}</translation>
<translation id="1643823602425662293">ਸੂਚਨਾ</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ਫ਼ਾਈਲ</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” ਦੇਖੋ</translation>
+<translation id="3622035490309591977">ਕਲਿੱਪਬੋਰਡ ਇਤਿਹਾਸ</translation>
<translation id="364720409959344976">ਅਪਲੋਡ ਕਰਨ ਲਈ ਫੋਲਡਰ ਚੁਣੋ</translation>
<translation id="3660179305079774227">ਉੱਪਰ ਦਾ ਤੀਰ</translation>
<translation id="3670030362669914947">ਨੰਬਰ</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ਅੱਜ ਕਿਰਿਆਸ਼ੀਲ}=1{1 ਦਿਨ ਪਹਿਲਾਂ ਕਿਰਿਆਸ਼ੀਲ}other{# ਦਿਨ ਪਹਿਲਾਂ ਕਿਰਿਆਸ਼ੀਲ}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ਦਿਨ ਅਤੇ }one{# ਦਿਨ ਅਤੇ }other{# ਦਿਨ ਅਤੇ }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">ਚਿੱਤਰ।</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 ਸਾਲ ਵਿੱਚ}one{# ਸਾਲ ਵਿੱਚ}other{# ਸਾਲ ਵਿੱਚ}}</translation>
<translation id="588258955323874662">ਫੁਲਸਕ੍ਰੀਨ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 ਸਕਿੰਟ ਬਾਕੀ}one{# ਸਕਿੰਟ ਬਾਕੀ}other{# ਸਕਿੰਟ ਬਾਕੀ}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">ਦਬਾਓ</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 ਘੰਟਾ ਬਾਕੀ}one{# ਘੰਟੇ ਬਾਕੀ}other{# ਘੰਟੇ ਬਾਕੀ}}</translation>
<translation id="688711909580084195">ਬਿਨਾਂ ਸਿਰਲੇਖ ਦਾ ਵੈਬਸਫ਼ਾ</translation>
+<translation id="6902419395050653510">HTML ਸਮੱਗਰੀ।</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 ਸਾਲ ਬਾਕੀ}one{# ਸਾਲ ਬਾਕੀ}other{# ਸਾਲ ਬਾਕੀ}}</translation>
<translation id="6945221475159498467">ਚੁਣੋ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pl.xtb b/chromium/ui/strings/translations/ui_strings_pl.xtb
index d26ade4bf95..0691ee3dcf8 100644
--- a/chromium/ui/strings/translations/ui_strings_pl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pl.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" />: nie udało się udostępnić</translation>
<translation id="1487931858675166540">Element <ph name="FIRST_ITEM_TITLE" /> został zastąpiony elementem <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Z Twojej historii wyszukiwania. Jeśli usuniesz zapytanie „<ph name="QUERY" />” z historii, zostanie ono trwale usunięte z Twojego konta na wszystkich urządzeniach.</translation>
+<translation id="1510238584712386396">Menu z aplikacjami</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuta i }few{# minuty i }many{# minut i }other{# minuty i }}</translation>
<translation id="1643823602425662293">Powiadomienie</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Plik <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Sprawdź słowo „<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Historia schowka</translation>
<translation id="364720409959344976">Wybierz folder do przesłania</translation>
<translation id="3660179305079774227">Strzałka w górę</translation>
<translation id="3670030362669914947">Numer</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktywność dzisiaj}=1{Aktywność 1 dzień temu}few{Aktywność # dni temu}many{Aktywność # dni temu}other{Aktywność # dnia temu}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dzień i }few{# dni i }many{# dni i }other{# dnia i }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Obraz.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{za 1 rok}few{za # lata}many{za # lat}other{za # roku}}</translation>
<translation id="588258955323874662">Pełny ekran</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Pozostała 1 sekunda}few{Pozostały # sekundy}many{Pozostało # sekund}other{Pozostało # sekundy}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">naciśnij</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Pozostała 1 godzina}few{Pozostały # godziny}many{Pozostało # godzin}other{Pozostało # godziny}}</translation>
<translation id="688711909580084195">Strona internetowa bez tytułu</translation>
+<translation id="6902419395050653510">Treść HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Pozostał rok}few{Pozostały # lata}many{Pozostało # lat}other{Pozostało # roku}}</translation>
<translation id="6945221475159498467">Wybierz</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pt-BR.xtb b/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
index 24aa331b3bb..6f9e314a08b 100644
--- a/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Falha no compartilhamento de <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Troca de <ph name="FIRST_ITEM_TITLE" /> por <ph name="SECOND_ITEM_TITLE" /> realizada</translation>
<translation id="1498028757988366001">Você já pesquisou isso. Se você excluir "<ph name="QUERY" />" do seu histórico, essa consulta será permanentemente removida da sua conta em todos os seus dispositivos.</translation>
+<translation id="1510238584712386396">Iniciador</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{Um minuto e }one{# minutos e }other{# minutos e }}</translation>
<translation id="1643823602425662293">Notificação</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Arquivo <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">+<ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Pesquisar “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Histórico da área de transferência</translation>
<translation id="364720409959344976">Selecionar pasta para upload</translation>
<translation id="3660179305079774227">Seta para cima</translation>
<translation id="3670030362669914947">Número</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Ativo hoje}=1{Ativo há um dia}one{Ativo há # dia}other{Ativo há # dias}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{Um dia e }one{# dias e }other{# dias e }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imagem.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{em 1 a}one{em # a}other{em # a}}</translation>
<translation id="588258955323874662">Tela inteira</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Um segundo restante}one{# segundos restantes}other{# segundos restantes}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">pressione</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Uma hora restante}one{# horas restantes}other{# horas restantes}}</translation>
<translation id="688711909580084195">Página da web sem título</translation>
+<translation id="6902419395050653510">Conteúdo HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 ano restante}one{# ano restante}other{# anos restantes}}</translation>
<translation id="6945221475159498467">Selecionar</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_pt-PT.xtb b/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
index 585a653e390..80f26ba74fe 100644
--- a/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
+++ b/chromium/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Não é possível partilhar <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Houve uma troca de <ph name="FIRST_ITEM_TITLE" /> por <ph name="SECOND_ITEM_TITLE" />.</translation>
<translation id="1498028757988366001">Já efetuou esta pesquisa anteriormente. A eliminação de "<ph name="QUERY" />" do histórico remove permanentemente esta consulta da sua conta em todos os dispositivos.</translation>
+<translation id="1510238584712386396">Launcher</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto e }other{# minutos e }}</translation>
<translation id="1643823602425662293">Notificação</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Ficheiro <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">Mais de <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Procurar "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Histórico da área de transferência</translation>
<translation id="364720409959344976">Selecionar Pasta a Carregar</translation>
<translation id="3660179305079774227">Seta para cima</translation>
<translation id="3670030362669914947">Número</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Ativo hoje}=1{Ativo há 1 dia}other{Ativo há # dias}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dia e }other{# dias e }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imagem.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{em 1 a.}other{em # a.}}</translation>
<translation id="588258955323874662">Ecrã inteiro</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Falta 1 segundo}other{Faltam # segundos}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">premir</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Falta 1 hora}other{Faltam # horas}}</translation>
<translation id="688711909580084195">Página Web Sem Nome</translation>
+<translation id="6902419395050653510">Conteúdo HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Falta 1 ano}other{Faltam # anos}}</translation>
<translation id="6945221475159498467">Selecionar</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ro.xtb b/chromium/ui/strings/translations/ui_strings_ro.xtb
index 0ecbfcea562..e1a8d0d3522 100644
--- a/chromium/ui/strings/translations/ui_strings_ro.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ro.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Nu se poate trimite <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> a fost înlocuit cu <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Ai mai căutat asta. Dacă ștergi „<ph name="QUERY" />” din istoric, se va elimina definitiv din contul tău, de pe toate dispozitivele.</translation>
+<translation id="1510238584712386396">Lansator</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{Un minut și }few{# minute și }other{# de minute și }}</translation>
<translation id="1643823602425662293">Notificare</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Fișier <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668">peste <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Caută „<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Istoricul clipboardului</translation>
<translation id="364720409959344976">Selectați un dosar de încărcat</translation>
<translation id="3660179305079774227">Săgeată în sus</translation>
<translation id="3670030362669914947">Număr</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Activ astăzi}=1{Activ acum o zi}few{Activ acum # zile}other{Activ acum # de zile}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{O zi și }few{# zile și }other{# de zile și }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imagine.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{în 1 an}few{în # ani}other{în # ani}}</translation>
<translation id="588258955323874662">Ecran complet</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{O secundă rămasă}few{# secunde rămase}other{# de secunde rămase}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">apasă</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{O oră rămasă}few{# ore rămase}other{# de ore rămase}}</translation>
<translation id="688711909580084195">Pagină web fără titlu</translation>
+<translation id="6902419395050653510">Conținut HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 an rămas}few{# ani rămași}other{# de ani rămași}}</translation>
<translation id="6945221475159498467">Selectează</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ru.xtb b/chromium/ui/strings/translations/ui_strings_ru.xtb
index f843eb59fdf..ec04c7c524a 100644
--- a/chromium/ui/strings/translations/ui_strings_ru.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ru.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Не удается отправить: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Вы поменяли местами объекты "<ph name="FIRST_ITEM_TITLE" />" и "<ph name="SECOND_ITEM_TITLE" />"</translation>
<translation id="1498028757988366001">Вы уже искали эту информацию. Если вы удалите запрос "<ph name="QUERY" />" из истории, он будет навсегда скрыт на всех ваших устройствах, где выполнен вход в аккаунт.</translation>
+<translation id="1510238584712386396">Панель запуска</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 минута }one{# минута }few{# минуты }many{# минут }other{# минуты }}</translation>
<translation id="1643823602425662293">Уведомление</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-файл</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Найти "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">История буфера обмена</translation>
<translation id="364720409959344976">Выберите папку для загрузки</translation>
<translation id="3660179305079774227">Стрелка вверх</translation>
<translation id="3670030362669914947">Номер</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Последние действия: сегодня}=1{Последние действия: 1 день назад}one{Последние действия: # день назад}few{Последние действия: # дня назад}many{Последние действия: # дней назад}other{Последние действия: # дня назад}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 день }one{# день }few{# дня }many{# дней }other{# дня }}</translation>
<translation id="5789643057113097023">:</translation>
+<translation id="5843690142429128814">Изображение.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{через 1 г.}one{через # г.}few{через # г.}many{через # л.}other{через # г.}}</translation>
<translation id="588258955323874662">Полноэкранный режим</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Осталась 1 секунда}one{Осталась # секунда}few{Осталось # секунды}many{Осталось # секунд}other{Осталось # секунды}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">нажать</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Остался 1 час}one{Остался # час}few{Осталось # часа}many{Осталось # часов}other{Осталось # часа}}</translation>
<translation id="688711909580084195">Страница без названия</translation>
+<translation id="6902419395050653510">HTML-контент.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ПБ/с</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{остался 1 год}one{остался # год}few{осталось # года}many{осталось # лет}other{осталось # года}}</translation>
<translation id="6945221475159498467">Выбрать</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_si.xtb b/chromium/ui/strings/translations/ui_strings_si.xtb
index f586faf6084..4bf1ff1c601 100644
--- a/chromium/ui/strings/translations/ui_strings_si.xtb
+++ b/chromium/ui/strings/translations/ui_strings_si.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> බෙදා ගත නොහැක</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> <ph name="SECOND_ITEM_TITLE" /> සමඟ හුවමාරු කර ගත්තා</translation>
<translation id="1498028757988366001">ඔබ කලින් මෙය සොයා ඇත. ඔබේ ඉතිහාසයෙන් "<ph name="QUERY" />" මැකීම ඔබේ උපාංග සියල්ලෙහිම ඔබේ ගිණුමෙන් එය ස්ථිරව මකා දමයි.</translation>
+<translation id="1510238584712386396">දියත්කරණය</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{මිනිත්තු 1 ක් සහ }one{මිනිත්තු # ක් සහ }other{මිනිත්තු # ක් සහ }}</translation>
<translation id="1643823602425662293">දැනුම්දීම</translation>
<translation id="169515659049020177">SHIFT</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ගොනුව</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” සොයන්න</translation>
+<translation id="3622035490309591977">පසුරු පුවරු ඉතිහාසය</translation>
<translation id="364720409959344976">අපගත කිරීමට ෆෝල්ඩරය තෝරන්න</translation>
<translation id="3660179305079774227">ඉහල ඊතලය</translation>
<translation id="3670030362669914947">අංකය</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{අද ක්‍රියාත්මකයි}=1{1 දිනකට පෙර ක්‍රියාත්මකයි}one{දින #-කට පෙර ක්‍රියාත්මකයි}other{දින #-කට පෙර ක්‍රියාත්මකයි}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{දින 1 ක් සහ }one{දින # ක් සහ }other{දින # ක් සහ }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">රූපය.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 වසරකින්}one{වසර #කින්}other{වසර #කින්}}</translation>
<translation id="588258955323874662">සම්පුර්ණ තිරය</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{තත්පර 1 ක් ඉතිරියි}one{තත්පර # ක් ඉතිරියි}other{තත්පර # ක් ඉතිරියි}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">ඔබන්න</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{පැය 1 ක් ඉතිරියි}one{පැය # ක් ඉතිරියි}other{පැය # ක් ඉතිරියි}}</translation>
<translation id="688711909580084195">නම් නොකළ වෙබ් පිටුව</translation>
+<translation id="6902419395050653510">HTML අන්තර්ගතය.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{වසර 1ක් ඉතිරියි}one{වසර #ක් ඉතිරියි}other{වසර #ක් ඉතිරියි}}</translation>
<translation id="6945221475159498467">තෝරන්න</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sk.xtb b/chromium/ui/strings/translations/ui_strings_sk.xtb
index 8201714bc0b..6305c4b3c70 100644
--- a/chromium/ui/strings/translations/ui_strings_sk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sk.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> sa nedá zdieľať</translation>
<translation id="1487931858675166540">Položka <ph name="FIRST_ITEM_TITLE" /> bola vymenená za <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Toto ste už vyhľadávali. Odstránením dopytu <ph name="QUERY" /> z histórie ho natrvalo vymažete zo svojho účtu vo všetkých zariadeniach.</translation>
+<translation id="1510238584712386396">Spúšťač</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minúta a }few{# minúty a }many{# minúty a }other{# minút a }}</translation>
<translation id="1643823602425662293">Upozornenie</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Súbor <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" /> a viac</translation>
<translation id="3618849550573277856">Vyhľadať „<ph name="LOOKUP_STRING" />“</translation>
+<translation id="3622035490309591977">História schránky</translation>
<translation id="364720409959344976">Výber priečinka na nahranie</translation>
<translation id="3660179305079774227">Šípka nahor</translation>
<translation id="3670030362669914947">Číslo</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktívne dnes}=1{Aktívne včera}few{Aktívne pred # dňami}many{Aktívne pred # dňa}other{Aktívne pred # dňami}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 deň a }few{# dni a }many{# dňa a }other{# dní a }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Obrázok.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{o 1 r.}few{o # r.}many{o # r.}other{o # r.}}</translation>
<translation id="588258955323874662">Celá obrazovka</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Zostáva 1 sekunda}few{Zostávajú # sekundy}many{Zostáva # sekundy}other{Zostáva # sekúnd}}</translation>
@@ -177,7 +180,7 @@
<translation id="6430678249303439055">Blokovať všetky upozornenia z tejto aplikácie</translation>
<translation id="6483402905448010557">{SECONDS,plural, =1{pred sekundou}few{pred # sekundami}many{pred # sekundami}other{pred # sekundami}}</translation>
<translation id="6503257047630241175">Obsah vo formáte RTF</translation>
-<translation id="6539092367496845964">Vyskytol sa problém. Skúste to znova neskôr.</translation>
+<translation id="6539092367496845964">Vyskytol sa problém. Skúste to neskôr.</translation>
<translation id="654149438358937226">Blokovať všetky upozornenia</translation>
<translation id="6567071839949112727">kliknúť na nadradený objekt</translation>
<translation id="6578407462441924264">Bez názvu</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">stlačiť</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Zostáva 1 hodina}few{Zostávajú # hodiny}many{Zostáva # hodiny}other{Zostáva # hodín}}</translation>
<translation id="688711909580084195">Nepomenovaná webová stránka</translation>
+<translation id="6902419395050653510">Obsah HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{zostáva 1 rok}few{zostávajú # roky}many{zostáva # roka}other{zostáva # rokov}}</translation>
<translation id="6945221475159498467">Vybrať</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sl.xtb b/chromium/ui/strings/translations/ui_strings_sl.xtb
index 58d725dd950..c62e9cdbd0f 100644
--- a/chromium/ui/strings/translations/ui_strings_sl.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sl.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Ni mogoče deliti tega: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Element <ph name="FIRST_ITEM_TITLE" /> je zamenjan z elementom <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">To ste v preteklosti že iskali. Če izbrišete poizvedbo »<ph name="QUERY" />« iz zgodovine, bo trajno odstranjena iz računa v vseh napravah.</translation>
+<translation id="1510238584712386396">Zaganjalnik</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 min in }one{# min in }two{# min in }few{# min in }other{# min in }}</translation>
<translation id="1643823602425662293">Obvestilo</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Datoteka <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Poišči »<ph name="LOOKUP_STRING" />«</translation>
+<translation id="3622035490309591977">Zgodovina podatkov v odložišču</translation>
<translation id="364720409959344976">Izberite mapo, ki jo želite prenesti</translation>
<translation id="3660179305079774227">Puščica gor</translation>
<translation id="3670030362669914947">Številka</translation>
@@ -150,6 +152,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktivna danes}=1{Aktivna pred 1 dnevom}one{Aktivna pred # dnevom}two{Aktivna pred # dnevoma}few{Aktivna pred # dnevi}other{Aktivna pred # dnevi}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dan in }one{# dan in }two{# dneva in }few{# dni in }other{# dni in }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Slika.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{čez 1 l}one{čez # l}two{čez # l}few{čez # l}other{čez # l}}</translation>
<translation id="588258955323874662">Celozaslonsko</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Še 1 s}one{Še # s}two{Še # s}few{Še # s}other{Še # s}}</translation>
@@ -190,6 +193,7 @@
<translation id="6845533974506654842">pritisni</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Še 1 h}one{Še # h}two{Še # h}few{Še # h}other{Še # h}}</translation>
<translation id="688711909580084195">Spletna stran brez naslova</translation>
+<translation id="6902419395050653510">Vsebina HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Še 1 leto}one{Še # leto}two{Še # leti}few{Še # leta}other{Še # let}}</translation>
<translation id="6945221475159498467">Izberi</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sq.xtb b/chromium/ui/strings/translations/ui_strings_sq.xtb
index 883b0a43a11..9a459364618 100644
--- a/chromium/ui/strings/translations/ui_strings_sq.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sq.xtb
@@ -7,7 +7,7 @@
<translation id="1156623771253174079">{SECONDS,plural, =1{1 minutë më parë}other{# minuta më parë}}</translation>
<translation id="1169783199079129864">{MINUTES,plural, =1{1 m}other{# m}}</translation>
<translation id="1181037720776840403">Hiq</translation>
-<translation id="1201402288615127009">Tjetra</translation>
+<translation id="1201402288615127009">Para</translation>
<translation id="1218444235442067213"><ph name="APP_NAME" />, aplikacioni "Dyqani i Play"</translation>
<translation id="1243314992276662751">Ngarko</translation>
<translation id="1266864766717917324">Nuk mund të ndahet <ph name="CONTENT_TYPE" /></translation>
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Nuk mund të ndahet <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> u ndërrua me <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Ke kërkuar për këtë më parë. Fshirja e "<ph name="QUERY" />" nga historiku yt do ta heqë atë përgjithmonë nga llogaria jote në të gjitha pajisjet e tua.</translation>
+<translation id="1510238584712386396">Nisësi</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minutë dhe }other{# minuta dhe }}</translation>
<translation id="1643823602425662293">Njoftimi</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> Skedar</translation>
<translation id="3608915363409716668">Mbi <ph name="MAXIMUM_VALUE" /></translation>
<translation id="3618849550573277856">Kërko për "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Historiku i kujtesës së fragmenteve</translation>
<translation id="364720409959344976">Zgjidh dosjen për ngarkim</translation>
<translation id="3660179305079774227">Shigjeta lart</translation>
<translation id="3670030362669914947">Numri</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktive sot}=1{Aktive 1 ditë më parë}other{Aktive # ditë më parë}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ditë e }other{# ditë e }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Imazhi.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{në 1 vit}other{në # vite}}</translation>
<translation id="588258955323874662">Ekrani i plotë</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 sekondë e mbetur}other{# sekonda të mbetura}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">shtyp</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 orë e mbetur}other{# orë të mbetura}}</translation>
<translation id="688711909580084195">Faqe uebi pa titull</translation>
+<translation id="6902419395050653510">Përmbajtje HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 vit i mbetur}other{# vite të mbetura}}</translation>
<translation id="6945221475159498467">Përzgjidhe</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb b/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
index ebe2e456962..8b788dee362 100644
--- a/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sr-Latn.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Nije uspelo deljenje: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Stavka <ph name="FIRST_ITEM_TITLE" /> je zamenjena stavkom <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Ovo ste već tražili ranije. Ako izbrišete „<ph name="QUERY" />“ iz istorije, trajno ćete ga ukloniti sa naloga na svim uređajima.</translation>
+<translation id="1510238584712386396">Pokretač</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minut i }one{# minut i }few{# minuta i }other{# minuta i }}</translation>
<translation id="1643823602425662293">Obaveštenje</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> datoteka</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Potraži „<ph name="LOOKUP_STRING" />“</translation>
+<translation id="3622035490309591977">Istorija privremene memorije</translation>
<translation id="364720409959344976">Izbor direktorijuma za otpremanje</translation>
<translation id="3660179305079774227">Strelica nagore</translation>
<translation id="3670030362669914947">Broj</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Poslednja aktivnost: danas}=1{Poslednja aktivnost: pre 1 dan}one{Poslednja aktivnost: pre # dan}few{Poslednja aktivnost: pre # dana}other{Poslednja aktivnost: pre # dana}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dan i }one{# dan i }few{# dana i }other{# dana i }}</translation>
<translation id="5789643057113097023">,</translation>
+<translation id="5843690142429128814">Slika.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{za 1 g}one{za # g}few{za # g}other{za # g}}</translation>
<translation id="588258955323874662">Ceo ekran</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Još 1 sekunda}one{Još # sekunda}few{Još # sekunde}other{Još # sekundi}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">pritisni</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Još 1 sat}one{Još # sat}few{Još # sata}other{Još # sati}}</translation>
<translation id="688711909580084195">Veb-stranica bez naslova</translation>
+<translation id="6902419395050653510">HTML sadržaj.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Još 1 godina}one{Još # godina}few{Još # godine}other{Još # godina}}</translation>
<translation id="6945221475159498467">Izaberi</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sr.xtb b/chromium/ui/strings/translations/ui_strings_sr.xtb
index 78c4eaabcca..62d7954a305 100644
--- a/chromium/ui/strings/translations/ui_strings_sr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sr.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Није успело дељење: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Ставка <ph name="FIRST_ITEM_TITLE" /> је замењена ставком <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Ово сте већ тражили раније. Ако избришете „<ph name="QUERY" />“ из историје, трајно ћете га уклонити са налога на свим уређајима.</translation>
+<translation id="1510238584712386396">Покретач</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 минут и }one{# минут и }few{# минута и }other{# минута и }}</translation>
<translation id="1643823602425662293">Обавештење</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> датотека</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Потражи „<ph name="LOOKUP_STRING" />“</translation>
+<translation id="3622035490309591977">Историја привремене меморије</translation>
<translation id="364720409959344976">Избор директоријума за отпремање</translation>
<translation id="3660179305079774227">Стрелица нагоре</translation>
<translation id="3670030362669914947">Број</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Последња активност: данас}=1{Последња активност: пре 1 дан}one{Последња активност: пре # дан}few{Последња активност: пре # дана}other{Последња активност: пре # дана}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 дан и }one{# дан и }few{# дана и }other{# дана и }}</translation>
<translation id="5789643057113097023">,</translation>
+<translation id="5843690142429128814">Слика.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{за 1 г}one{за # г}few{за # г}other{за # г}}</translation>
<translation id="588258955323874662">Цеo екран</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Још 1 секунда}one{Још # секунда}few{Још # секунде}other{Још # секунди}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">притисни</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Још 1 сат}one{Још # сат}few{Још # сата}other{Још # сати}}</translation>
<translation id="688711909580084195">Веб-страница без наслова</translation>
+<translation id="6902419395050653510">HTML садржај.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Још 1 година}one{Још # година}few{Још # године}other{Још # година}}</translation>
<translation id="6945221475159498467">Изабери</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sv.xtb b/chromium/ui/strings/translations/ui_strings_sv.xtb
index aa356652cd3..9e90303b45b 100644
--- a/chromium/ui/strings/translations/ui_strings_sv.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sv.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Det gick inte att dela <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> har bytts ut mot <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Du har sökt efter detta tidigare. Om du raderar <ph name="QUERY" /> från historiken tas förslaget bort från ditt konto på alla enheter.</translation>
+<translation id="1510238584712386396">Startprogram</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 minut och }other{# minuter och }}</translation>
<translation id="1643823602425662293">Avisering</translation>
<translation id="169515659049020177">Skift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" />-fil</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Sök efter ”<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Historik för urklipp</translation>
<translation id="364720409959344976">Välj en mapp för uppladdning</translation>
<translation id="3660179305079774227">Uppil</translation>
<translation id="3670030362669914947">Nummer</translation>
@@ -112,7 +114,7 @@
<translation id="3990502903496589789">Högerkant</translation>
<translation id="40579289237549812">{UNREAD_NOTIFICATIONS,plural, =1{1 oläst avisering}other{# olästa aviseringar}}</translation>
<translation id="4202807286478387388">fortsätta</translation>
-<translation id="4250229828105606438">Skärmdump</translation>
+<translation id="4250229828105606438">Skärmbild</translation>
<translation id="4266252015790371705">{MONTHS,plural, =1{1 månad sedan}other{# månader sedan}}</translation>
<translation id="4289300219472526559">Börja tala</translation>
<translation id="430191667033048642"><ph name="MOVED_APP_NAME" /> har flyttats till mappen <ph name="FOLDER_NAME" />.</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Aktiv i dag}=1{Aktiv för 1 dag sedan}other{Aktiv för # dagar sedan}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 dag och }other{# dagar och }}</translation>
<translation id="5789643057113097023">,</translation>
+<translation id="5843690142429128814">Bild.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{om 1 år}other{om # år}}</translation>
<translation id="588258955323874662">Helskärm</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 sekund kvar}other{# sekunder kvar}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">tryck</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 timme kvar}other{# timmar kvar}}</translation>
<translation id="688711909580084195">Namnlös webbsida</translation>
+<translation id="6902419395050653510">HTML-innehåll.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/sek</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 år kvar}other{# år kvar}}</translation>
<translation id="6945221475159498467">Välj</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sw.xtb b/chromium/ui/strings/translations/ui_strings_sw.xtb
index fbda0d15d85..e52aa11444b 100644
--- a/chromium/ui/strings/translations/ui_strings_sw.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sw.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Imeshindwa kushiriki <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> na <ph name="SECOND_ITEM_TITLE" /> zimebadilishana nafasi</translation>
<translation id="1498028757988366001">Ulitafuta hoja hii awali. Ukifuta "<ph name="QUERY" />" kwenye historia ya utafutaji, itaondolewa kabisa kwenye akaunti yako katika vifaa vyako vyote.</translation>
+<translation id="1510238584712386396">Kizindua</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{Dakika 1 na }other{Dakika # na }}</translation>
<translation id="1643823602425662293">Arifa</translation>
<translation id="169515659049020177">Hama</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Faili ya <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Angalia “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Historia ya ubao wa kunakili</translation>
<translation id="364720409959344976">Chagua Folda ya Kupakia</translation>
<translation id="3660179305079774227">Mshale Juu</translation>
<translation id="3670030362669914947">Nambari</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Kimetumika leo}=1{Kilitumika siku 1 iliyopita}other{Kilitumika ziku # zilizopita}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{Siku 1 na }other{Siku # na }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Picha.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{mwaka 1}other{miaka #}}</translation>
<translation id="588258955323874662">Skrini nzima</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Imesalia sekunde 1}other{Zimesalia sekunde #}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">bofya</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Imesalia saa 1}other{Zimesalia saa #}}</translation>
<translation id="688711909580084195">Ukurasa wa Wavuti usio na Kichwa</translation>
+<translation id="6902419395050653510">Maudhui ya HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Umesalia mwaka 1}other{Imesalia miaka #}}</translation>
<translation id="6945221475159498467">Chagua</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ta.xtb b/chromium/ui/strings/translations/ui_strings_ta.xtb
index 8f3d2bdb0c6..7fb7de50bb2 100644
--- a/chromium/ui/strings/translations/ui_strings_ta.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ta.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" />ஐப் பகிர முடியவில்லை</translation>
<translation id="1487931858675166540"><ph name="SECOND_ITEM_TITLE" /> மற்றும் <ph name="FIRST_ITEM_TITLE" /> ஒன்றுக்கொன்று மாற்றப்பட்டன</translation>
<translation id="1498028757988366001">இதை முன்பே தேடியிருக்கிறீர்கள். "<ph name="QUERY" />"யைத் தேடல் வரலாற்றிலிருந்து நீக்கினால் உங்கள் கணக்கு பயன்படுத்தப்படும் அனைத்து சாதனங்களில் இருந்தும் நிரந்தரமாக அகற்றப்படும்.</translation>
+<translation id="1510238584712386396">துவக்கி</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 நிமிடம், }other{# நிமிடங்கள், }}</translation>
<translation id="1643823602425662293">அறிவிப்பு</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> கோப்பு</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” எனத் தேடு</translation>
+<translation id="3622035490309591977">கிளிப்போர்டு வரலாறு</translation>
<translation id="364720409959344976">பதிவேற்றுவதற்குக் கோப்புறையைத் தேர்ந்தெடு</translation>
<translation id="3660179305079774227">மேல்நோக்கிய அம்பு</translation>
<translation id="3670030362669914947">எண்</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{இன்று பயன்படுத்தியுள்ளார்}=1{நேற்று பயன்படுத்தியுள்ளார்}other{# நாட்களுக்கு முன்பு பயன்படுத்தியுள்ளார்}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 நாள், }other{# நாட்கள், }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">படம்.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{இன்னும் 1ஆ}other{இன்னும் #ஆ}}</translation>
<translation id="588258955323874662">முழுத்திரை</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 நிமிடம் உள்ளது}other{# நிமிடங்கள் உள்ளன}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">அழுத்துக</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 மணிநேரம் உள்ளது}other{# மணிநேரம் உள்ளது}}</translation>
<translation id="688711909580084195">தலைப்பிடாத வலைப்பக்கம்</translation>
+<translation id="6902419395050653510">HTML உள்ளடக்கம்.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> பெ.பை/வி</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 ஆண்டு உள்ளது}other{# ஆண்டுகள் உள்ளன}}</translation>
<translation id="6945221475159498467">தேர்ந்தெடு</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_te.xtb b/chromium/ui/strings/translations/ui_strings_te.xtb
index fd3a69d0f58..0a3d076f943 100644
--- a/chromium/ui/strings/translations/ui_strings_te.xtb
+++ b/chromium/ui/strings/translations/ui_strings_te.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> షేర్ చేయడం సాధ్యపడలేదు</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />, <ph name="SECOND_ITEM_TITLE" />గా మార్చబడింది</translation>
<translation id="1498028757988366001">మీరు దీని కోసం గతంలో వెతికారు. మీ చరిత్ర నుండి "<ph name="QUERY" />"ను తొలగిస్తే, మీ ఖాతాతో సైన్ ఇన్ చేసి ఉన్న మీ పరికరాలు అన్నింటిలో అది శాశ్వతంగా తీసివేయబడుతుంది.</translation>
+<translation id="1510238584712386396">లాంచర్</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 నిమిషం మరియు }other{# నిమిషాలు మరియు }}</translation>
<translation id="1643823602425662293">నోటిఫికేషన్</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> ఫైల్</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />”ని వెతకండి</translation>
+<translation id="3622035490309591977">క్లిప్‌బోర్డ్ హిస్టరీ</translation>
<translation id="364720409959344976">అప్‌లోడ్ చేయడానికి ఫోల్డర్‌ని ఎంచుకోండి</translation>
<translation id="3660179305079774227">ఎగువ బాణం</translation>
<translation id="3670030362669914947">నంబర్</translation>
@@ -116,7 +118,7 @@
<translation id="4266252015790371705">{MONTHS,plural, =1{1 నెల క్రితం}other{# నెలల క్రితం}}</translation>
<translation id="4289300219472526559">మాట్లాడటాన్ని ప్రారంభించు</translation>
<translation id="430191667033048642"><ph name="MOVED_APP_NAME" /> అనేది <ph name="FOLDER_NAME" /> ఫోల్డర్‌కు తరలించబడింది.</translation>
-<translation id="4316910396681052118">అన్ని అనువర్తనాలు</translation>
+<translation id="4316910396681052118">అన్ని యాప్‌లు</translation>
<translation id="4491109536499578614">చిత్రం</translation>
<translation id="4588090240171750605">కుడికి స్క్రోల్ చేయి</translation>
<translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, నక్షత్ర రేటింగ్ <ph name="RATING_SCORE" /></translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ఈ రోజు యాక్టివ్‌గా ఉంది}=1{1 రోజు క్రితం యాక్టివ్‌గా ఉంది}other{# రోజుల క్రితం యాక్టివ్‌గా ఉంది}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 రోజు మరియు }other{# రోజులు మరియు }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">ఇమేజ్.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 సంవత్సరంలో}other{# సంవత్సరంలో}}</translation>
<translation id="588258955323874662">పూర్తితెర</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 సెకను మిగిలి ఉంది}other{# సెకన్లు మిగిలి ఉన్నాయి}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">నొక్కండి</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 గంట మిగిలి ఉంది}other{# గంటలు మిగిలి ఉన్నాయి}}</translation>
<translation id="688711909580084195">శీర్షిక లేని వెబ్‌పేజీ</translation>
+<translation id="6902419395050653510">HTML కంటెంట్.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 సంవత్సరం మిగిలి ఉంది}other{# సంవత్సరాలు మిగిలి ఉన్నాయి}}</translation>
<translation id="6945221475159498467">ఎంచుకోండి</translation>
@@ -258,7 +262,7 @@
<translation id="9044832324875206639">{SECONDS,plural, =1{1 సెక.}other{# సెక.}}</translation>
<translation id="9059834730836941392">నోటిఫికేషన్‌ను కుదించు</translation>
<translation id="9150735707954472829">ట్యాబ్</translation>
-<translation id="9161053988251441839">సూచించబడిన అనువర్తనాలు</translation>
+<translation id="9161053988251441839">సూచించబడిన యాప్‌లు</translation>
<translation id="9170848237812810038">&amp;అన్డు</translation>
<translation id="9178475906033259337"><ph name="QUERY" /> కోసం 1 ఫలితాన్ని ప్రదర్శిస్తోంది</translation>
<translation id="932327136139879170">హోమ్</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_th.xtb b/chromium/ui/strings/translations/ui_strings_th.xtb
index b8a3c8dcd63..f93f5fd894f 100644
--- a/chromium/ui/strings/translations/ui_strings_th.xtb
+++ b/chromium/ui/strings/translations/ui_strings_th.xtb
@@ -18,11 +18,12 @@
<translation id="1306549533752902673">แอปแนะนำ</translation>
<translation id="1368832886055348810">ซ้ายไปขวา</translation>
<translation id="1383876407941801731">ค้นหา</translation>
-<translation id="1398853756734560583">ย่อ</translation>
+<translation id="1398853756734560583">ขยายใหญ่สุด</translation>
<translation id="1414271762428216854"><ph name="APP_NAME" />, ติดตั้งแอปแล้ว</translation>
<translation id="1450753235335490080">แชร์<ph name="CONTENT_TYPE" />ไม่สำเร็จ</translation>
<translation id="1487931858675166540">สลับ <ph name="FIRST_ITEM_TITLE" /> กับ <ph name="SECOND_ITEM_TITLE" /> แล้ว</translation>
<translation id="1498028757988366001">คุณเคยค้นหารายการนี้ การลบ "<ph name="QUERY" />" ออกจากประวัติการเข้าชมจะนำรายการนี้ออกจากบัญชีของคุณในอุปกรณ์ทุกเครื่องอย่างถาวร</translation>
+<translation id="1510238584712386396">ตัวเรียกใช้งาน</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 นาทีกับอีก }other{# นาทีกับอีก }}</translation>
<translation id="1643823602425662293">การแจ้งเตือน</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">ไฟล์ <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">ค้นหา “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">ประวัติคลิปบอร์ด</translation>
<translation id="364720409959344976">เลือกโฟลเดอร์เพื่ออัปโหลด</translation>
<translation id="3660179305079774227">ลูกศรขึ้น</translation>
<translation id="3670030362669914947">หมายเลข</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{ใช้งานวันนี้}=1{ใช้งานเมื่อ 1 วันที่ผ่านมา}other{ใช้งานเมื่อ # วันที่ผ่านมา}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 วันกับอีก }other{# วันกับอีก }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">รูปภาพ</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{ใน 1 ปี}other{ใน # ปี}}</translation>
<translation id="588258955323874662">เต็มหน้าจอ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{เหลือ 1 วินาที}other{เหลือ # วินาที}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">กด</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{เหลือ 1 ชั่วโมง}other{เหลือ # ชั่วโมง}}</translation>
<translation id="688711909580084195">หน้าเว็บที่ไม่มีชื่อ</translation>
+<translation id="6902419395050653510">เนื้อหา HTML</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/วินาที</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{เหลือ 1 ปี}other{เหลือ # ปี}}</translation>
<translation id="6945221475159498467">เลือก</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_tr.xtb b/chromium/ui/strings/translations/ui_strings_tr.xtb
index 91ceeb8d303..29bd62f24f4 100644
--- a/chromium/ui/strings/translations/ui_strings_tr.xtb
+++ b/chromium/ui/strings/translations/ui_strings_tr.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> paylaşılamıyor</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />, <ph name="SECOND_ITEM_TITLE" /> ile değiştirildi</translation>
<translation id="1498028757988366001">Bunu daha önce aradınız. "<ph name="QUERY" />" sorgusunu geçmişinizden sildiğinizde bu sorgu tüm cihazlarınızda hesabınızdan kalıcı olarak kaldırılır.</translation>
+<translation id="1510238584712386396">Başlatıcı</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 dakika ve }other{# dakika ve }}</translation>
<translation id="1643823602425662293">Bildirim</translation>
<translation id="169515659049020177">ÜstKrktr</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> Dosya</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" /> +</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” Araması Yap</translation>
+<translation id="3622035490309591977">Pano geçmişi</translation>
<translation id="364720409959344976">Yüklenecek Klasörü Seçin</translation>
<translation id="3660179305079774227">Yukarı Ok</translation>
<translation id="3670030362669914947">Numara</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Bugün etkin}=1{1 gün önce etkindi}other{# gün önce etkindi}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 gün ve }other{# gün ve }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Resim.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 yıl içinde}other{# yıl içinde}}</translation>
<translation id="588258955323874662">Tam ekran</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 saniye kaldı}other{# saniye kaldı}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">bas</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 saat kaldı}other{# saat kaldı}}</translation>
<translation id="688711909580084195">Başlıksız Web Sayfası</translation>
+<translation id="6902419395050653510">HTML içeriği.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/sn</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 yıl kaldı}other{# yıl kaldı}}</translation>
<translation id="6945221475159498467">Seç</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_uk.xtb b/chromium/ui/strings/translations/ui_strings_uk.xtb
index 5f47d74451d..4c73b3593d1 100644
--- a/chromium/ui/strings/translations/ui_strings_uk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_uk.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Не вдалося надіслати: <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Заміна: "<ph name="FIRST_ITEM_TITLE" />" на "<ph name="SECOND_ITEM_TITLE" />"</translation>
<translation id="1498028757988366001">Ви раніше це шукали. Якщо видалити запит "<ph name="QUERY" />" з історії, він назавжди зникне з вашого облікового запису на всіх пристроях.</translation>
+<translation id="1510238584712386396">Панель запуску</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 хвилина та }one{# хвилина та }few{# хвилини та }many{# хвилин і }other{# хвилини та }}</translation>
<translation id="1643823602425662293">Сповіщення</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Файл <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Шукати "<ph name="LOOKUP_STRING" />"</translation>
+<translation id="3622035490309591977">Історія буфера обміну</translation>
<translation id="364720409959344976">Виберіть папку для завантаження</translation>
<translation id="3660179305079774227">Курсор угору</translation>
<translation id="3670030362669914947">Номер</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Остання активність: сьогодні}=1{Остання активність: 1 день тому}one{Остання активність: # день тому}few{Остання активність: # дні тому}many{Остання активність: # днів тому}other{Остання активність: # дня тому}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 день і }one{# день і }few{# дні та }many{# днів і }other{# дня та }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Зображення.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{через 1 р.}one{через # р.}few{через # р.}many{через # р.}other{через # р.}}</translation>
<translation id="588258955323874662">Повноекранний режим</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Залишилась 1 секунда}one{Залишилася # секунда}few{Залишилося # секунди}many{Залишилося # секунд}other{Залишилося # секунди}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">натиснути</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Залишилась 1 година}one{Залишилася # година}few{Залишилося # години}many{Залишилося # годин}other{Залишилося # години}}</translation>
<translation id="688711909580084195">Веб-сторінка без назви</translation>
+<translation id="6902419395050653510">Вміст HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> Пб/сек.</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Залишився 1 рік}one{Залишився # рік}few{Залишилося # роки}many{Залишилося # років}other{Залишилося # року}}</translation>
<translation id="6945221475159498467">Вибрати</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ur.xtb b/chromium/ui/strings/translations/ui_strings_ur.xtb
index 6873ecb4413..1de73732906 100644
--- a/chromium/ui/strings/translations/ui_strings_ur.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ur.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> کا اشتراک نہیں کیا جا سکتا</translation>
<translation id="1487931858675166540"><ph name="SECOND_ITEM_TITLE" /> کے ساتھ سویپ کردہ<ph name="FIRST_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">آپ نے اسے پہلے بھی تلاش کیا ہے۔ آپ کی سرگزشت سے "<ph name="QUERY" />" کو حذف کرنے سے، یہ آپ کے تمام آلات پر آپ کے اکاؤنٹ سے مستقل طور پر ہٹ جائے گا۔</translation>
+<translation id="1510238584712386396">لانچر</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 منٹ اور }other{# منٹ اور }}</translation>
<translation id="1643823602425662293">اطلاع</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> فائل</translation>
<translation id="3608915363409716668">‎<ph name="MAXIMUM_VALUE" />+‎</translation>
<translation id="3618849550573277856">"<ph name="LOOKUP_STRING" />" دیکھیں</translation>
+<translation id="3622035490309591977">کلپ بورڈ کی سرگزشت</translation>
<translation id="364720409959344976">اپ لوڈ کرنے کیلئے فولڈر منتخب کریں</translation>
<translation id="3660179305079774227">اوپر تیر کا نشان</translation>
<translation id="3670030362669914947">نمبر</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{آج فعال تھا}=1{1 دن پہلے فعال تھا}other{# دن پہلے فعال تھا}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 دن اور }other{# دن اور }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">تصویر۔</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 سال میں}other{# سال میں}}</translation>
<translation id="588258955323874662">پوری اسکرین</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 سیکنڈ باقی}other{# سیکنڈ باقی}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">دبائیں</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 گھنٹہ باقی}other{# گھنٹے باقی}}</translation>
<translation id="688711909580084195">بلا عنوان ویب صفحہ</translation>
+<translation id="6902419395050653510">‏HTML مواد۔</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 سال باقی}other{# سال باقی}}</translation>
<translation id="6945221475159498467">منتخب کریں</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_uz.xtb b/chromium/ui/strings/translations/ui_strings_uz.xtb
index 07d9f6fa902..1161de6d26f 100644
--- a/chromium/ui/strings/translations/ui_strings_uz.xtb
+++ b/chromium/ui/strings/translations/ui_strings_uz.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> yuborilmadi</translation>
<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> va <ph name="SECOND_ITEM_TITLE" /> almashtirildi</translation>
<translation id="1498028757988366001">Buni oldin qidirgan edingiz. Qidiruv tarixidan “<ph name="QUERY" />” oʻchirib tashlanganda u barcha . qurilmalaringizdagi hisobingizdan butunlay olib tashlanadi.</translation>
+<translation id="1510238584712386396">Ishga tushirish paneli</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 daqiqa va }other{# daqiqa va }}</translation>
<translation id="1643823602425662293">Bildirishnoma</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> fayli</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">“<ph name="LOOKUP_STRING" />” deb qidirish</translation>
+<translation id="3622035490309591977">Vaqtinchalik xotira tarixi</translation>
<translation id="364720409959344976">Yuklash uchun jildni tanlang</translation>
<translation id="3660179305079774227">Tepaga qaragan strelka</translation>
<translation id="3670030362669914947">Raqam</translation>
@@ -111,7 +113,7 @@
<translation id="3909791450649380159">&amp;Kesib olish</translation>
<translation id="3990502903496589789">O‘ng cheti</translation>
<translation id="40579289237549812">{UNREAD_NOTIFICATIONS,plural, =1{1 ta yangi bildirishnoma}other{# ta yangi bildirishnoma}}</translation>
-<translation id="4202807286478387388">o‘tish</translation>
+<translation id="4202807286478387388">borish</translation>
<translation id="4250229828105606438">Skrinshot</translation>
<translation id="4266252015790371705">{MONTHS,plural, =1{1 oy oldin}other{# oy oldin}}</translation>
<translation id="4289300219472526559">Gapirishni boshlang</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Bugun onlayn edi}=1{1 kun oldin onlayn edi}other{# kun oldin onlayn edi}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 kun va }other{# kun va }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Rasm.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 yildan keyin}other{# yildan keyin}}</translation>
<translation id="588258955323874662">Butun ekran</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 soniya qoldi}other{# soniya qoldi}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">bosish</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 soat qoldi}other{# soat qoldi}}</translation>
<translation id="688711909580084195">Nomlanmagan veb-sahifa</translation>
+<translation id="6902419395050653510">HTML kontent.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 yil qoldi}other{# yil qoldi}}</translation>
<translation id="6945221475159498467">Tanlash</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_vi.xtb b/chromium/ui/strings/translations/ui_strings_vi.xtb
index 946c5300f50..863180788e8 100644
--- a/chromium/ui/strings/translations/ui_strings_vi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_vi.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Không thể chia sẻ <ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">Đã hoán đổi <ph name="FIRST_ITEM_TITLE" /> cho <ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Bạn đã tìm kiếm nội dung này trước đây. Việc xóa "<ph name="QUERY" />" khỏi lịch sử sẽ xóa vĩnh viễn cụm từ tìm kiếm này khỏi tài khoản của bạn trên tất cả các thiết bị.</translation>
+<translation id="1510238584712386396">Trình chạy</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 phút và }other{# phút và }}</translation>
<translation id="1643823602425662293">Thông báo</translation>
<translation id="169515659049020177">Shift</translation>
@@ -65,7 +66,7 @@
<translation id="2522350507219695259">Hiệu chỉnh xong</translation>
<translation id="252373100621549798">Màn hình không xác định</translation>
<translation id="2545651323591713692">Tạm hoãn</translation>
-<translation id="2570734079541893434">Quản lý các tùy chọn cài đặt</translation>
+<translation id="2570734079541893434">Quản lý chế độ cài đặt</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{trong 1 giờ}other{trong # giờ}}</translation>
<translation id="2583543531130364912">Hiệu chỉnh màn hình cảm ứng</translation>
<translation id="2586657967955657006">Khay nhớ tạm</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418">Tệp <ph name="SAVEAS_EXTENSION_TYPE" /></translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Tra cứu “<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Lịch sử lưu dữ liệu vào khay nhớ tạm</translation>
<translation id="364720409959344976">Chọn thư mục để tải lên</translation>
<translation id="3660179305079774227">Phím mũi tên Lên</translation>
<translation id="3670030362669914947">Số</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Hoạt động hôm nay}=1{Hoạt động 1 ngày trước}other{Hoạt động # ngày trước}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 ngày và }other{# ngày và }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Hình ảnh.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{trong 1 năm}other{trong # năm}}</translation>
<translation id="588258955323874662">Toàn màn hình</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{Còn 1 giây}other{Còn # giây}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">nhấn</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{Còn 1 giờ}other{Còn # giờ}}</translation>
<translation id="688711909580084195">Trang web không có tiêu đề</translation>
+<translation id="6902419395050653510">Nội dung HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/giây</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{Còn 1 năm}other{Còn # năm}}</translation>
<translation id="6945221475159498467">Chọn</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zh-CN.xtb b/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
index 5b4aa8028c1..3ea7094adfc 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">无法分享<ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">“<ph name="FIRST_ITEM_TITLE" />”与“<ph name="SECOND_ITEM_TITLE" />”交换了位置</translation>
<translation id="1498028757988366001">您以前搜索过此内容。如果您将“<ph name="QUERY" />”从历史记录中删除,该条目将会从登录您帐号的所有设备上永久移除。</translation>
+<translation id="1510238584712386396">启动器</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 分钟 }other{# 分钟 }}</translation>
<translation id="1643823602425662293">通知</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> 文件</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">查询“<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">剪贴板历史记录</translation>
<translation id="364720409959344976">选择要上传的文件夹</translation>
<translation id="3660179305079774227">向上箭头</translation>
<translation id="3670030362669914947">卡号</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{今天曾有活动}=1{1 天前曾有活动}other{# 天前曾有活动}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 天 }other{# 天 }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">图片。</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 年后}other{# 年后}}</translation>
<translation id="588258955323874662">全屏</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{还剩 1 秒}other{还剩 # 秒}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">按</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{还剩 1 小时}other{还剩 # 小时}}</translation>
<translation id="688711909580084195">无标题网页</translation>
+<translation id="6902419395050653510">HTML 内容。</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{还有 1 年的时间}other{还有 # 年的时间}}</translation>
<translation id="6945221475159498467">选择</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zh-HK.xtb b/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
index d1890a106ff..8a168af0e0f 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-HK.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">無法分享<ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">「<ph name="FIRST_ITEM_TITLE" />」同「<ph name="SECOND_ITEM_TITLE" />」調換咗</translation>
<translation id="1498028757988366001">您曾搜尋此項目。如果從記錄中刪除「<ph name="QUERY" />」,該項目將從您所有裝置上的帳戶中永久移除。</translation>
+<translation id="1510238584712386396">啟動器</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 分鐘和}other{# 分鐘和}}</translation>
<translation id="1643823602425662293">通知</translation>
<translation id="169515659049020177">Shift</translation>
@@ -82,7 +83,7 @@
<translation id="2981684127883932071">顯示緊建議</translation>
<translation id="3036649622769666520">開啟檔案</translation>
<translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
-<translation id="3068711042108640621">檔案櫃喺螢幕左邊</translation>
+<translation id="3068711042108640621">捷徑列喺螢幕左邊</translation>
<translation id="3087734570205094154">下方</translation>
<translation id="3126026824346185272">Ctrl</translation>
<translation id="3157931365184549694">還原</translation>
@@ -93,12 +94,13 @@
<translation id="3306688585798492231">內置顯示屏</translation>
<translation id="335581015389089642">語音</translation>
<translation id="3389286852084373014">文字過多</translation>
-<translation id="348799646910989694">自動隱藏檔案櫃</translation>
+<translation id="348799646910989694">自動隱藏捷徑列</translation>
<translation id="3554637740840164787">已經將<ph name="ITEM_TITLE" />置頂</translation>
<translation id="3600566671520689681">{DAYS,plural, =1{還有 1 天}other{還有 # 天}}</translation>
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> 檔案</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">查詢「<ph name="LOOKUP_STRING" />」</translation>
+<translation id="3622035490309591977">剪貼簿記錄</translation>
<translation id="364720409959344976">選取要上載的資料夾</translation>
<translation id="3660179305079774227">向上鍵</translation>
<translation id="3670030362669914947">號碼</translation>
@@ -121,7 +123,7 @@
<translation id="4588090240171750605">向右捲動</translation>
<translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />,<ph name="RATING_SCORE" /> 星</translation>
<translation id="4648249871170053485"><ph name="APP_NAME" />,推薦應用程式</translation>
-<translation id="4690510401873698237">檔案櫃喺螢幕個底度</translation>
+<translation id="4690510401873698237">捷徑列喺螢幕個底度</translation>
<translation id="4724120544754982507">通知中心,<ph name="UNREAD_NOTIFICATION_COUNT" /> 則未讀通知</translation>
<translation id="4730374152663651037">常用的應用程式</translation>
<translation id="4788285488841504513">{MONTHS,plural, =1{尚餘 1 個月}other{尚餘 # 個月}}</translation>
@@ -140,17 +142,18 @@
<translation id="5395308026110844773">「<ph name="DRAGGED_APP_NAME" />」宜家拉咗去「<ph name="IN_PLACE_APP" />」上面,放開滑鼠就可以建立資料夾。</translation>
<translation id="5463830097259460683">Emoji 和符號</translation>
<translation id="5476505524087279545">取消勾選</translation>
-<translation id="547979256943495781">檔案櫃喺螢幕右邊</translation>
+<translation id="547979256943495781">捷徑列喺螢幕右邊</translation>
<translation id="5528053674512161860">由於未安裝開發人員使用者介面模組 (dev_ui),因此無法載入網頁</translation>
<translation id="5574202486608032840"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
<translation id="5583640892426849032">Backspace</translation>
<translation id="5613020302032141669">向左鍵</translation>
<translation id="5652575806481723716">「<ph name="FOCUSED_APP_NAME" />」有新嘅要求需要你處理。</translation>
-<translation id="5675363643668471212">檔案櫃項目</translation>
+<translation id="5675363643668471212">捷徑列項目</translation>
<translation id="5754277640426581776">{MINUTES,plural, =1{1 分鐘}other{# 分鐘}}</translation>
<translation id="5763338081255973061">{DAYS,plural, =0{上次使用時間:今天}=1{上次使用時間:1 天前}other{上次使用時間:# 天前}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 天和}other{# 天和}}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">圖片。</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 年後}other{# 年後}}</translation>
<translation id="588258955323874662">全螢幕</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{還有 1 秒}other{還有 # 秒}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">按下</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{還有 1 小時}other{還有 # 小時}}</translation>
<translation id="688711909580084195">無標題網頁</translation>
+<translation id="6902419395050653510">HTML 內容。</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/秒</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{尚餘 1 年}other{尚餘 # 年}}</translation>
<translation id="6945221475159498467">選取</translation>
@@ -239,7 +243,7 @@
<translation id="8394908167088220973">媒體播放/暫停</translation>
<translation id="8458811141851741261">{YEARS,plural, =1{1 年}other{# 年}}</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> 檔案 (.<ph name="SAVEAS_EXTENSION_NAME" />)</translation>
-<translation id="8649597172973390955">一律顯示檔案櫃</translation>
+<translation id="8649597172973390955">一律顯示捷徑列</translation>
<translation id="8677655579646609597"><ph name="QUANTITY" /> KB/秒</translation>
<translation id="8685326675965865247">搜尋您的裝置、應用程式、設定及網絡。使用箭咀鍵可瀏覽應用程式。</translation>
<translation id="8725488761726303204">還有另外 <ph name="NUMBER" /> 項</translation>
@@ -252,7 +256,7 @@
<translation id="8867568208303837180">傳送中… </translation>
<translation id="8876215549894133151">格式:</translation>
<translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation>
-<translation id="8926951137623668982">一律隱藏檔案櫃</translation>
+<translation id="8926951137623668982">一律隱藏捷徑列</translation>
<translation id="8996630695507351249">請確定 <ph name="TARGET_DEVICE_NAME" /> 已連接互聯網。</translation>
<translation id="9002566407876343676">開啟</translation>
<translation id="9044832324875206639">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zh-TW.xtb b/chromium/ui/strings/translations/ui_strings_zh-TW.xtb
index 9fd0e16d5c1..b4f3afe82d8 100644
--- a/chromium/ui/strings/translations/ui_strings_zh-TW.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">無法分享<ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">「<ph name="FIRST_ITEM_TITLE" />」已替換為「<ph name="SECOND_ITEM_TITLE" />」</translation>
<translation id="1498028757988366001">你過去曾搜尋這個項目。如果將「<ph name="QUERY" />」從搜尋記錄中刪除,該項目將從你所有裝置上的帳戶記錄中永久移除。</translation>
+<translation id="1510238584712386396">啟動器</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 分鐘 }other{# 分鐘 }}</translation>
<translation id="1643823602425662293">通知</translation>
<translation id="169515659049020177">Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> 檔案</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">查詢「<ph name="LOOKUP_STRING" />」</translation>
+<translation id="3622035490309591977">剪貼簿記錄</translation>
<translation id="364720409959344976">選取要上傳的資料夾</translation>
<translation id="3660179305079774227">向上鍵</translation>
<translation id="3670030362669914947">號碼</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{上次使用時間:今天}=1{上次使用時間:1 天前}other{上次使用時間:# 天前}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 天 }other{# 天 }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">圖片。</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{1 年內}other{# 年內}}</translation>
<translation id="588258955323874662">全螢幕</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{還剩 1 秒}other{還剩 # 秒}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">按下</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{還剩 1 小時}other{還剩 # 小時}}</translation>
<translation id="688711909580084195">無標題網頁</translation>
+<translation id="6902419395050653510">HTML 內容。</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/秒</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{還剩 1 年}other{還剩 # 年}}</translation>
<translation id="6945221475159498467">選取</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_zu.xtb b/chromium/ui/strings/translations/ui_strings_zu.xtb
index 1d7d2960a54..2664f99e949 100644
--- a/chromium/ui/strings/translations/ui_strings_zu.xtb
+++ b/chromium/ui/strings/translations/ui_strings_zu.xtb
@@ -23,6 +23,7 @@
<translation id="1450753235335490080">Ayikwazi ukwabelana nge-<ph name="CONTENT_TYPE" /></translation>
<translation id="1487931858675166540">I-<ph name="FIRST_ITEM_TITLE" /> ishintshisane ne-<ph name="SECOND_ITEM_TITLE" /></translation>
<translation id="1498028757988366001">Useshe lokhu ngaphambilini. Ukususa i-"<ph name="QUERY" />" kusuka kumlando wakho kuzowususa unaphakade kusuka ku-akhawunti yakho kuwo wonke amadivayisi akho.</translation>
+<translation id="1510238584712386396">Isiqalisi</translation>
<translation id="1591184457164800433">{MINUTES,plural, =1{1 iminithi ne- }one{# amaminithi ne- }other{# amaminithi ne- }}</translation>
<translation id="1643823602425662293">Isaziso</translation>
<translation id="169515659049020177">U-Shift</translation>
@@ -99,6 +100,7 @@
<translation id="3600969208114796418"><ph name="SAVEAS_EXTENSION_TYPE" /> Ifayela</translation>
<translation id="3608915363409716668"><ph name="MAXIMUM_VALUE" />+</translation>
<translation id="3618849550573277856">Bheka i-“<ph name="LOOKUP_STRING" />”</translation>
+<translation id="3622035490309591977">Umlando webhodi yokunamathisela</translation>
<translation id="364720409959344976">Khetha ifolda ukuze ulayishe</translation>
<translation id="3660179305079774227">Umcibisholo waphezulu</translation>
<translation id="3670030362669914947">Inombolo</translation>
@@ -151,6 +153,7 @@
<translation id="5763338081255973061">{DAYS,plural, =0{Iyasebenza namhlanje}=1{Isebenze ngosuku olungu-1 oludlule}one{Isebenze ngezinsuku ezingu-# ezedlule}other{Isebenze ngezinsuku ezingu-# ezedlule}}</translation>
<translation id="5768079895599174203">{DAYS,plural, =1{1 usuku ne- }one{# izinsuku ne- }other{# izinsuku ne- }}</translation>
<translation id="5789643057113097023">.</translation>
+<translation id="5843690142429128814">Isithombe.</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{nge-1y}one{nge-#y}other{nge-#y}}</translation>
<translation id="588258955323874662">Isikrini esigcwele</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 isekhondi elisele}one{# amasekhondi asele}other{# amasekhondi asele}}</translation>
@@ -191,6 +194,7 @@
<translation id="6845533974506654842">cindezela</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 ihora elisele}one{# amahora asele}other{# amahora asele}}</translation>
<translation id="688711909580084195">Ikhasi lewebhu elingenasihloko</translation>
+<translation id="6902419395050653510">Okuqukethwe kwe-HTML.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> PB/s</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 unyaka osele}one{# iminyaka esele}other{# iminyaka esele}}</translation>
<translation id="6945221475159498467">Khetha</translation>
diff --git a/chromium/ui/strings/ui_strings.grd b/chromium/ui/strings/ui_strings.grd
index b41cb066167..3d2c31e349d 100644
--- a/chromium/ui/strings/ui_strings.grd
+++ b/chromium/ui/strings/ui_strings.grd
@@ -381,11 +381,13 @@ need to be translated for each locale.-->
<message name="IDS_CLIPBOARD_MENU_DELETE_ALL" desc="Used to indicate to a user that all clipboard items will be deleted if selected">
Delete All
</message>
- <message name="IDS_MENU_ITEM_NEW_BADGE" desc="Appears as a badge on menu items denoting new features">
+
+ <!-- New Badge (user education) -->
+ <message name="IDS_NEW_BADGE" desc="Appears as a badge on UI elements like menus, denoting new features">
New
</message>
- <message name="IDS_MENU_ITEM_NEW_BADGE_SCREEN_READER_MESSAGE"
- desc="Message appended to screen reader description of menu items which have the 'New' badge">
+ <message name="IDS_NEW_BADGE_SCREEN_READER_MESSAGE"
+ desc="Message appended to screen reader description of UI elements which have the 'New' badge">
This is a new feature
</message>
@@ -940,6 +942,9 @@ need to be translated for each locale.-->
<message name="IDS_APP_LIST_SUGGESTED_APPS_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement that notifies users that the UI is showing a small version of the app list">
Launcher, partial view
</message>
+ <message name="IDS_APP_LIST_LAUNCHER_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement that notifies users that the UI is showing the search results">
+ Launcher
+ </message>
<message name="IDS_APP_LIST_CLEAR_SEARCHBOX" desc="Tooltip for the button that clears all text from the search box in the app list.">
Clear searchbox text
</message>
@@ -1054,6 +1059,17 @@ need to be translated for each locale.-->
Search your device, apps, settings, web...
</message>
+ <!-- Clipboard history menu -->
+ <message name="IDS_CLIPBOARD_HISTORY_MENU_BITMAP_IMAGE" desc="Accessibility text for the bitmap image shown on the clipboard history menu">
+ Image.
+ </message>
+ <message name="IDS_CLIPBOARD_HISTORY_MENU_HTML_IMAGE" desc="Accessibility text for the HTML-rendered image shown on the clipboard history menu">
+ HTML content.
+ </message>
+ <message name="IDS_CLIPBOARD_HISTORY_MENU_TITLE" desc="The title of the clipboard history menu which shows the history of the clipboard data">
+ Clipboard history
+ </message>
+
<!-- Strings describing the touch calibration UX -->
<message name="IDS_DISPLAY_TOUCH_CALIBRATION_EXIT_LABEL" desc="A message to notify the user about using the escape key to exit the calibration mode.">
To exit calibration press Esc.
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_LAUNCHER_ACCESSIBILITY_ANNOUNCEMENT.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_LAUNCHER_ACCESSIBILITY_ANNOUNCEMENT.png.sha1
new file mode 100644
index 00000000000..3c81656e1f9
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_APP_LIST_LAUNCHER_ACCESSIBILITY_ANNOUNCEMENT.png.sha1
@@ -0,0 +1 @@
+13c79cfac43e1052063608d5b032e434c82d53b2 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_BITMAP_IMAGE.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_BITMAP_IMAGE.png.sha1
new file mode 100644
index 00000000000..4249a207108
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_BITMAP_IMAGE.png.sha1
@@ -0,0 +1 @@
+bdc063cec886fe69f0905680df4a966f6b2d7e82 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_HTML_IMAGE.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_HTML_IMAGE.png.sha1
new file mode 100644
index 00000000000..b22f611cd4f
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_HTML_IMAGE.png.sha1
@@ -0,0 +1 @@
+d725f77dca975340556b037bd7c94fa4fdde8d71 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_TITLE.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_TITLE.png.sha1
new file mode 100644
index 00000000000..2a0e489024d
--- /dev/null
+++ b/chromium/ui/strings/ui_strings_grd/IDS_CLIPBOARD_HISTORY_MENU_TITLE.png.sha1
@@ -0,0 +1 @@
+2c4c79721952e341851493f105fb43565589a4e3 \ No newline at end of file
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_MENU_ITEM_NEW_BADGE.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_NEW_BADGE.png.sha1
index cfbd8f8950b..cfbd8f8950b 100644
--- a/chromium/ui/strings/ui_strings_grd/IDS_MENU_ITEM_NEW_BADGE.png.sha1
+++ b/chromium/ui/strings/ui_strings_grd/IDS_NEW_BADGE.png.sha1
diff --git a/chromium/ui/strings/ui_strings_grd/IDS_MENU_ITEM_NEW_BADGE_SCREEN_READER_MESSAGE.png.sha1 b/chromium/ui/strings/ui_strings_grd/IDS_NEW_BADGE_SCREEN_READER_MESSAGE.png.sha1
index cfbd8f8950b..cfbd8f8950b 100644
--- a/chromium/ui/strings/ui_strings_grd/IDS_MENU_ITEM_NEW_BADGE_SCREEN_READER_MESSAGE.png.sha1
+++ b/chromium/ui/strings/ui_strings_grd/IDS_NEW_BADGE_SCREEN_READER_MESSAGE.png.sha1
diff --git a/chromium/ui/touch_selection/touch_selection_controller.cc b/chromium/ui/touch_selection/touch_selection_controller.cc
index f62b1793f21..ebbeacf3488 100644
--- a/chromium/ui/touch_selection/touch_selection_controller.cc
+++ b/chromium/ui/touch_selection/touch_selection_controller.cc
@@ -366,6 +366,23 @@ bool TouchSelectionController::WillHandleTouchEventImpl(
return false;
}
+void TouchSelectionController::OnSwipeToMoveCursorBegin() {
+ if (config_.hide_active_handle) {
+ // Hide the handle when magnifier is showing since it can confuse the user.
+ SetTemporarilyHidden(true);
+
+ // If the user has typed something, the insertion handle might be hidden.
+ // Prepare to show touch handles on end.
+ show_touch_handles_ = true;
+ }
+}
+
+void TouchSelectionController::OnSwipeToMoveCursorEnd() {
+ // Show the handle at the end if magnifier was showing.
+ if (config_.hide_active_handle)
+ SetTemporarilyHidden(false);
+}
+
void TouchSelectionController::OnDragBegin(
const TouchSelectionDraggable& draggable,
const gfx::PointF& drag_position) {
diff --git a/chromium/ui/touch_selection/touch_selection_controller.h b/chromium/ui/touch_selection/touch_selection_controller.h
index 5ef240d82a7..56ae7ff02ee 100644
--- a/chromium/ui/touch_selection/touch_selection_controller.h
+++ b/chromium/ui/touch_selection/touch_selection_controller.h
@@ -139,6 +139,11 @@ class UI_TOUCH_SELECTION_EXPORT TouchSelectionController
const gfx::PointF& GetStartPosition() const;
const gfx::PointF& GetEndPosition() const;
+ // To be called when swipe-to-move-cursor motion begins.
+ void OnSwipeToMoveCursorBegin();
+ // To be called when swipe-to-move-cursor motion ends.
+ void OnSwipeToMoveCursorEnd();
+
const gfx::SelectionBound& start() const { return start_; }
const gfx::SelectionBound& end() const { return end_; }
diff --git a/chromium/ui/touch_selection/touch_selection_controller_unittest.cc b/chromium/ui/touch_selection/touch_selection_controller_unittest.cc
index 043ebe4ba34..a29c06e8edd 100644
--- a/chromium/ui/touch_selection/touch_selection_controller_unittest.cc
+++ b/chromium/ui/touch_selection/touch_selection_controller_unittest.cc
@@ -1658,4 +1658,71 @@ TEST_F(TouchSelectionControllerTest, HideActiveSelectionHandle) {
EXPECT_EQ(1.f, test_controller.GetEndAlpha());
}
+TEST_F(TouchSelectionControllerTest, SwipeToMoveCursor_HideHandlesIfShown) {
+ // Step 1: Extra set-up.
+ // For Android P+, we need to hide handles while showing magnifier.
+ SetHideActiveHandle(true);
+ TouchSelectionControllerTestApi test_controller(&controller());
+
+ gfx::RectF insertion_rect(5, 5, 0, 10);
+ bool visible = true;
+
+ OnTapEvent();
+ ChangeInsertion(insertion_rect, visible);
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN));
+ EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
+
+ EXPECT_TRUE(test_controller.GetStartVisible());
+
+ // Step 2: Swipe-to-move-cursor begins: hide handles.
+ controller().OnSwipeToMoveCursorBegin();
+ EXPECT_FALSE(test_controller.GetStartVisible());
+
+ // Step 3: Move insertion: still hidden.
+ gfx::RectF new_insertion_rect(10, 5, 0, 10);
+ ChangeInsertion(new_insertion_rect, visible);
+ EXPECT_FALSE(test_controller.GetStartVisible());
+
+ // Step 4: Swipe-to-move-cursor ends: show handles.
+ controller().OnSwipeToMoveCursorEnd();
+ EXPECT_TRUE(test_controller.GetStartVisible());
+}
+
+TEST_F(TouchSelectionControllerTest, SwipeToMoveCursor_HandleWasNotShown) {
+ // Step 1: Extra set-up.
+ // For Android P+, we need to hide handles while showing magnifier.
+ SetHideActiveHandle(true);
+ TouchSelectionControllerTestApi test_controller(&controller());
+
+ gfx::RectF insertion_rect(5, 5, 0, 10);
+ bool visible = true;
+
+ OnTapEvent();
+ ChangeInsertion(insertion_rect, visible);
+ EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_HANDLE_SHOWN));
+ EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart());
+
+ EXPECT_TRUE(test_controller.GetStartVisible());
+
+ // Step 2: Handle is initially hidden, i.e., due to user typing.
+ controller().HideAndDisallowShowingAutomatically();
+ EXPECT_FALSE(test_controller.GetStartVisible());
+
+ // Step 3: Swipe-to-move-cursor begins: hide handles.
+ controller().OnSwipeToMoveCursorBegin();
+ EXPECT_FALSE(test_controller.GetStartVisible());
+
+ // Step 4: Move insertion.
+ // Note that this step is needed to show handle at the end since
+ // OnInsertionChanged() should activate start_ again, although it will stay
+ // temporarily hidden.
+ gfx::RectF new_insertion_rect(10, 5, 0, 10);
+ ChangeInsertion(new_insertion_rect, visible);
+ EXPECT_FALSE(test_controller.GetStartVisible());
+
+ // Step 5: Swipe-to-move-cursor ends: show handles.
+ controller().OnSwipeToMoveCursorEnd();
+ EXPECT_TRUE(test_controller.GetStartVisible());
+}
+
} // namespace ui
diff --git a/chromium/ui/views/.clang-tidy b/chromium/ui/views/.clang-tidy
index 1c0e0dcbf72..b6c0d7fc364 100644
--- a/chromium/ui/views/.clang-tidy
+++ b/chromium/ui/views/.clang-tidy
@@ -1,29 +1,7 @@
---
-Checks: '-*,
- google-build-namespaces,
- google-explicit-constructor,
- google-readability-casting,
- google-readability-namespace-comments,
- modernize-avoid-bind,
- modernize-loop-convert,
- modernize-make-shared,
- modernize-make-unique,
- modernize-redundant-void-arg,
- modernize-replace-auto-ptr,
- modernize-replace-random-shuffle,
- modernize-shrink-to-fit,
- modernize-use-bool-literals,
- modernize-use-default-member-init,
- modernize-use-emplace,
- modernize-use-equals-default,
- modernize-use-noexcept,
- modernize-use-nullptr,
- modernize-use-override,
- modernize-use-transparent-functors,
- modernize-use-using,
- readability-redundant-member-init'
-HeaderFilterRegex: 'ui/views/*'
-CheckOptions:
- - key: modernize-use-default-member-init.UseAssignment
- value: 1
+ Checks: 'google-build-namespaces,
+ google-readability-namespace-comments,
+ modernize-replace-auto-ptr,
+ modernize-use-using'
+ HeaderFilterRegex: 'ui/views/*'
...
diff --git a/chromium/ui/views/BUILD.gn b/chromium/ui/views/BUILD.gn
index 4f506ca30ca..227cb94a203 100644
--- a/chromium/ui/views/BUILD.gn
+++ b/chromium/ui/views/BUILD.gn
@@ -4,11 +4,11 @@
import("//build/buildflag_header.gni")
import("//build/config/features.gni")
+import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//components/vector_icons/vector_icons.gni")
import("//testing/test.gni")
import("//ui/base/ui_features.gni")
-import("//ui/ozone/ozone.gni")
import("//ui/views/features.gni")
assert(toolkit_views)
@@ -17,7 +17,7 @@ config("flags") {
defines = [ "TOOLKIT_VIEWS=1" ]
}
-aggregate_vector_icons2("views_vector_icons") {
+aggregate_vector_icons("views_vector_icons") {
icon_directory = "vector_icons"
sources = [
@@ -142,6 +142,7 @@ component("views") {
"controls/menu/menu_scroll_view_container.h",
"controls/menu/menu_separator.h",
"controls/menu/menu_types.h",
+ "controls/menu/new_badge.h",
"controls/menu/submenu_view.h",
"controls/message_box_view.h",
"controls/native/native_view_host.h",
@@ -189,6 +190,7 @@ component("views") {
"input_event_activation_protector.h",
"layout/animating_layout_manager.h",
"layout/box_layout.h",
+ "layout/box_layout_view.h",
"layout/fill_layout.h",
"layout/flex_layout.h",
"layout/flex_layout_types.h",
@@ -354,6 +356,7 @@ component("views") {
"controls/menu/menu_runner_impl_adapter.cc",
"controls/menu/menu_scroll_view_container.cc",
"controls/menu/menu_separator.cc",
+ "controls/menu/new_badge.cc",
"controls/menu/submenu_view.cc",
"controls/message_box_view.cc",
"controls/native/native_view_host.cc",
@@ -392,6 +395,7 @@ component("views") {
"input_event_activation_protector.cc",
"layout/animating_layout_manager.cc",
"layout/box_layout.cc",
+ "layout/box_layout_view.cc",
"layout/fill_layout.cc",
"layout/flex_layout.cc",
"layout/flex_layout_types.cc",
@@ -480,6 +484,7 @@ component("views") {
deps = [
"//base:i18n",
"//base/third_party/dynamic_annotations",
+ "//build:chromeos_buildflags",
"//cc/paint",
"//mojo/public/cpp/bindings",
"//skia",
@@ -941,6 +946,7 @@ source_set("test_support") {
"test/event_generator_delegate_mac.mm",
"test/scoped_views_test_helper_cocoa.mm",
"test/test_views_delegate_mac.mm",
+ "test/views_test_base_mac.mm",
"test/views_test_helper_mac.h",
"test/views_test_helper_mac.mm",
"test/widget_test_mac.mm",
@@ -1009,6 +1015,7 @@ source_set("test_support") {
"test/ui_controls_factory_desktop_aurax11.cc",
"test/ui_controls_factory_desktop_aurax11.h",
]
+ deps += [ "//ui/base/x:test_support" ]
}
}
if (use_x11) {
@@ -1018,8 +1025,18 @@ source_set("test_support") {
"//ui/gfx/x",
]
}
- if (ozone_platform_x11) {
- deps += [ "//ui/base/x" ]
+ if (use_ozone) {
+ deps += [ "//ui/ozone" ]
+ }
+
+ if (use_ozone && is_linux && enable_desktop_aura) {
+ sources += [
+ "test/test_desktop_screen_ozone.cc",
+ "test/test_desktop_screen_ozone.h",
+ "test/ui_controls_factory_desktop_aura_ozone.cc",
+ "test/ui_controls_factory_desktop_aura_ozone.h",
+ ]
+ deps += [ "//ui/ozone:ui_test_support" ]
}
}
@@ -1099,9 +1116,11 @@ test("views_unittests") {
"focus/focus_traversal_unittest.cc",
"layout/animating_layout_manager_unittest.cc",
"layout/box_layout_unittest.cc",
+ "layout/box_layout_view_unittest.cc",
"layout/composite_layout_tests.cc",
"layout/fill_layout_unittest.cc",
"layout/flex_layout_unittest.cc",
+ "layout/flex_layout_view_unittest.cc",
"layout/grid_layout_unittest.cc",
"layout/layout_manager_base_unittest.cc",
"layout/normalized_geometry_unittest.cc",
@@ -1124,6 +1143,7 @@ test("views_unittests") {
"widget/native_widget_unittest.cc",
"widget/root_view_unittest.cc",
"widget/unique_widget_ptr_unittest.cc",
+ "widget/widget_delegate_unittest.cc",
"widget/widget_unittest.cc",
"window/custom_frame_view_unittest.cc",
"window/dialog_client_view_unittest.cc",
@@ -1312,7 +1332,7 @@ test("views_unittests") {
}
}
- if (is_desktop_linux && use_ozone) {
+ if (is_linux && use_ozone) {
data_deps +=
[ "//testing/buildbot/filters:linux_ozone_views_unittests_filters" ]
}
@@ -1326,6 +1346,10 @@ test("views_unittests") {
if (use_ozone) {
deps += [ "//ui/ozone" ]
}
+
+ if (is_linux || is_chromeos) {
+ sources += [ "color_chooser/color_chooser_unittest.cc" ]
+ }
}
# This target is added as a dependency of browser interactive_ui_tests. It must
@@ -1378,7 +1402,7 @@ source_set("views_interactive_ui_tests") {
"//ui/wm/public",
]
- if (is_desktop_linux) {
+ if (is_linux) {
sources += [ "widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc" ]
}
diff --git a/chromium/ui/views/DEPS b/chromium/ui/views/DEPS
index 6723a35cfe1..3e681c16ffa 100644
--- a/chromium/ui/views/DEPS
+++ b/chromium/ui/views/DEPS
@@ -16,6 +16,7 @@ include_rules = [
"+ui/gfx",
"+ui/gl/test/gl_surface_test_support.h", # To initialize GL for tests.
"+ui/native_theme",
+ "+ui/ozone/buildflags.h",
"+ui/ozone/public",
"+ui/platform_window",
"+ui/resources/grit/ui_resources.h",
diff --git a/chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc b/chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
index dcdd7515034..90f49f2ee05 100644
--- a/chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
+++ b/chromium/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
@@ -116,7 +116,8 @@ TEST_F(AXAuraObjCacheTest, ValidTree) {
child_widget->Show();
// Create a child view.
- auto* button = new LabelButton(nullptr, base::ASCIIToUTF16("ChildButton"));
+ auto* button = new LabelButton(Button::PressedCallback(),
+ base::ASCIIToUTF16("ChildButton"));
button->SetSize(gfx::Size(20, 20));
child_widget->GetContentsView()->AddChildView(button);
diff --git a/chromium/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc b/chromium/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc
index 60729545314..25d4d360f20 100644
--- a/chromium/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc
+++ b/chromium/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc
@@ -342,7 +342,7 @@ TEST_F(AXSystemCaretWinTest, TestCaretMSAAEvents) {
{
// Move focus to a button.
- LabelButton button(nullptr, base::string16());
+ LabelButton button{Button::PressedCallback(), base::string16()};
button.SetBounds(500, 0, 200, 20);
widget_->GetRootView()->AddChildView(&button);
test::WidgetActivationWaiter waiter(widget_, true);
diff --git a/chromium/ui/views/accessibility/ax_virtual_view_unittest.cc b/chromium/ui/views/accessibility/ax_virtual_view_unittest.cc
index 23e1ba55ab2..ae13025849b 100644
--- a/chromium/ui/views/accessibility/ax_virtual_view_unittest.cc
+++ b/chromium/ui/views/accessibility/ax_virtual_view_unittest.cc
@@ -35,7 +35,7 @@ namespace {
class TestButton : public Button {
public:
- TestButton() : Button(nullptr) {}
+ TestButton() : Button(Button::PressedCallback()) {}
TestButton(const TestButton&) = delete;
TestButton& operator=(const TestButton&) = delete;
~TestButton() override = default;
diff --git a/chromium/ui/views/accessibility/view_accessibility.cc b/chromium/ui/views/accessibility/view_accessibility.cc
index 5dfb136d2d1..3bbe3767096 100644
--- a/chromium/ui/views/accessibility/view_accessibility.cc
+++ b/chromium/ui/views/accessibility/view_accessibility.cc
@@ -59,7 +59,16 @@ ViewAccessibility::~ViewAccessibility() = default;
void ViewAccessibility::AddVirtualChildView(
std::unique_ptr<AXVirtualView> virtual_view) {
+ AddVirtualChildViewAt(std::move(virtual_view), int{virtual_children_.size()});
+}
+
+void ViewAccessibility::AddVirtualChildViewAt(
+ std::unique_ptr<AXVirtualView> virtual_view,
+ int index) {
DCHECK(virtual_view);
+ DCHECK_GE(index, 0);
+ DCHECK_LE(size_t{index}, virtual_children_.size());
+
if (virtual_view->parent_view() == this)
return;
DCHECK(!virtual_view->parent_view()) << "This |view| already has a View "
@@ -69,7 +78,8 @@ void ViewAccessibility::AddVirtualChildView(
"AXVirtualView parent. Call "
"RemoveChildView first.";
virtual_view->set_parent_view(this);
- virtual_children_.push_back(std::move(virtual_view));
+ auto insert_iterator = virtual_children_.begin() + index;
+ virtual_children_.insert(insert_iterator, std::move(virtual_view));
}
std::unique_ptr<AXVirtualView> ViewAccessibility::RemoveVirtualChildView(
diff --git a/chromium/ui/views/accessibility/view_accessibility.h b/chromium/ui/views/accessibility/view_accessibility.h
index 69cb2423d88..38cda9c6363 100644
--- a/chromium/ui/views/accessibility/view_accessibility.h
+++ b/chromium/ui/views/accessibility/view_accessibility.h
@@ -119,6 +119,11 @@ class VIEWS_EXPORT ViewAccessibility {
// virtual children.
void AddVirtualChildView(std::unique_ptr<AXVirtualView> virtual_view);
+ // Adds |virtual_view| as a child of this View at an index.
+ // We take ownership of our virtual children.
+ void AddVirtualChildViewAt(std::unique_ptr<AXVirtualView> virtual_view,
+ int index);
+
// Removes |virtual_view| from this View. The virtual view's parent will
// change to nullptr. Hands ownership back to the caller.
std::unique_ptr<AXVirtualView> RemoveVirtualChildView(
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate.h b/chromium/ui/views/accessibility/view_ax_platform_node_delegate.h
index 923e54ac9bb..f4ba9a4787b 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate.h
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate.h
@@ -87,13 +87,10 @@ class ViewAXPlatformNodeDelegate : public ViewAccessibility,
base::Optional<bool> GetTableHasColumnOrRowHeaderNode() const override;
std::vector<int32_t> GetColHeaderNodeIds() const override;
std::vector<int32_t> GetColHeaderNodeIds(int col_index) const override;
-
- // Ordered-set-like and item-like nodes.
bool IsOrderedSetItem() const override;
bool IsOrderedSet() const override;
base::Optional<int> GetPosInSet() const override;
base::Optional<int> GetSetSize() const override;
-
void SetPopupFocusOverride() override;
void EndPopupFocusOverride() override;
bool IsFocusedForTesting() override;
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
index 51fd747d4bc..454a41aa8f2 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
@@ -34,7 +34,7 @@ namespace {
class TestButton : public Button {
public:
- TestButton() : Button(nullptr) {}
+ TestButton() : Button(Button::PressedCallback()) {}
TestButton(const TestButton&) = delete;
TestButton& operator=(const TestButton&) = delete;
~TestButton() override = default;
@@ -200,7 +200,7 @@ TEST_F(ViewAXPlatformNodeDelegateTest, LabelIsChildOfButton) {
button_->SetInstallFocusRingOnFocus(false);
// |button_| is focusable, so |label_| (as its child) should be ignored.
- EXPECT_EQ(View::FocusBehavior::ACCESSIBLE_ONLY, button_->GetFocusBehavior());
+ EXPECT_NE(View::FocusBehavior::NEVER, button_->GetFocusBehavior());
EXPECT_EQ(1, button_accessibility()->GetChildCount());
EXPECT_EQ(button_->GetNativeViewAccessible(),
label_accessibility()->GetParent());
@@ -434,11 +434,11 @@ class DerivedTestView : public View {
void OnBlur() override { SetVisible(false); }
};
-using ViewAccessibilityTest = ViewsTestBase;
+using AXViewTest = ViewsTestBase;
// Check if the destruction of the widget ends successfully if |view|'s
// visibility changed during destruction.
-TEST_F(ViewAccessibilityTest, LayoutCalledInvalidateRootView) {
+TEST_F(AXViewTest, LayoutCalledInvalidateRootView) {
// TODO(jamescook): Construct a real AutomationManagerAura rather than using
// this observer to simulate it.
AXAuraObjCache cache;
diff --git a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
index 460b47fe4b2..9cea15b6858 100644
--- a/chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
+++ b/chromium/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
@@ -28,6 +28,16 @@ using Microsoft::WRL::ComPtr;
namespace views {
namespace test {
+#define EXPECT_UIA_BOOL_EQ(node, property_id, expected) \
+ { \
+ ScopedVariant expectedVariant(expected); \
+ ASSERT_EQ(VT_BOOL, expectedVariant.type()); \
+ ScopedVariant actual; \
+ ASSERT_HRESULT_SUCCEEDED( \
+ node->GetPropertyValue(property_id, actual.Receive())); \
+ EXPECT_EQ(expectedVariant.ptr()->boolVal, actual.ptr()->boolVal); \
+ }
+
namespace {
// Whether |left| represents the same COM object as |right|.
@@ -62,6 +72,13 @@ class ViewAXPlatformNodeDelegateWinTest : public ViewsTestBase {
ASSERT_EQ(S_OK, view_accessible.As(&service_provider));
ASSERT_EQ(S_OK, service_provider->QueryService(IID_IAccessible2_2, result));
}
+
+ ComPtr<IRawElementProviderSimple> GetIRawElementProviderSimple(View* view) {
+ ComPtr<IRawElementProviderSimple> result;
+ EXPECT_HRESULT_SUCCEEDED(view->GetNativeViewAccessible()->QueryInterface(
+ __uuidof(IRawElementProviderSimple), &result));
+ return result;
+ }
};
TEST_F(ViewAXPlatformNodeDelegateWinTest, TextfieldAccessibility) {
@@ -488,5 +505,30 @@ TEST_F(ViewAXPlatformNodeDelegateWinTest, GridRowColumnCount) {
EXPECT_EQ(E_UNEXPECTED, grid_provider->get_RowCount(&row_count));
EXPECT_EQ(E_UNEXPECTED, grid_provider->get_ColumnCount(&column_count));
}
+
+TEST_F(ViewAXPlatformNodeDelegateWinTest, IsUIAControlIsTrueEvenWhenReadonly) {
+ // This test ensures that the value returned by
+ // AXPlatformNodeWin::IsUIAControl returns true even if the element is
+ // read-only. The previous implementation was incorrect and used to return
+ // false for read-only views, causing all sorts of issues with ATs.
+ //
+ // Since we can't test IsUIAControl directly, we go through the
+ // UIA_IsControlElementPropertyId, which is computed using IsUIAControl.
+
+ Widget widget;
+ Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
+ init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ widget.Init(std::move(init_params));
+
+ View* content = widget.SetContentsView(std::make_unique<View>());
+
+ Textfield* text_field = new Textfield();
+ text_field->SetReadOnly(true);
+ content->AddChildView(text_field);
+
+ ComPtr<IRawElementProviderSimple> textfield_provider =
+ GetIRawElementProviderSimple(text_field);
+ EXPECT_UIA_BOOL_EQ(textfield_provider, UIA_IsControlElementPropertyId, true);
+}
} // namespace test
} // namespace views
diff --git a/chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc b/chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc
index e5a396d6f8f..d2f4d0b1acb 100644
--- a/chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc
+++ b/chromium/ui/views/accessibility/views_ax_tree_manager_unittest.cc
@@ -35,7 +35,7 @@ namespace {
class TestButton : public Button {
public:
- TestButton() : Button(nullptr) {}
+ TestButton() : Button(Button::PressedCallback()) {}
TestButton(const TestButton&) = delete;
TestButton& operator=(const TestButton&) = delete;
~TestButton() override = default;
diff --git a/chromium/ui/views/accessible_pane_view.cc b/chromium/ui/views/accessible_pane_view.cc
index 9bbcda82bc8..fa9a8203998 100644
--- a/chromium/ui/views/accessible_pane_view.cc
+++ b/chromium/ui/views/accessible_pane_view.cc
@@ -9,6 +9,7 @@
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/views/focus/focus_search.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view_tracker.h"
#include "ui/views/widget/widget.h"
diff --git a/chromium/ui/views/accessible_pane_view_unittest.cc b/chromium/ui/views/accessible_pane_view_unittest.cc
index 7ca93164512..3e0628206be 100644
--- a/chromium/ui/views/accessible_pane_view_unittest.cc
+++ b/chromium/ui/views/accessible_pane_view_unittest.cc
@@ -21,17 +21,14 @@ namespace views {
using AccessiblePaneViewTest = ViewsTestBase;
-class TestBarView : public AccessiblePaneView, public ButtonListener {
+class TestBarView : public AccessiblePaneView {
public:
TestBarView();
~TestBarView() override;
- void ButtonPressed(Button* sender, const ui::Event& event) override;
- LabelButton* child_button() const { return child_button_.get(); }
- LabelButton* second_child_button() const {
- return second_child_button_.get();
- }
- LabelButton* third_child_button() const { return third_child_button_.get(); }
+ LabelButton* child_button() const { return child_button_; }
+ LabelButton* second_child_button() const { return second_child_button_; }
+ LabelButton* third_child_button() const { return third_child_button_; }
LabelButton* not_child_button() const { return not_child_button_.get(); }
View* GetDefaultFocusableChild() override;
@@ -39,9 +36,9 @@ class TestBarView : public AccessiblePaneView, public ButtonListener {
private:
void Init();
- std::unique_ptr<LabelButton> child_button_;
- std::unique_ptr<LabelButton> second_child_button_;
- std::unique_ptr<LabelButton> third_child_button_;
+ LabelButton* child_button_;
+ LabelButton* second_child_button_;
+ LabelButton* third_child_button_;
std::unique_ptr<LabelButton> not_child_button_;
DISALLOW_COPY_AND_ASSIGN(TestBarView);
@@ -54,22 +51,17 @@ TestBarView::TestBarView() {
TestBarView::~TestBarView() = default;
-void TestBarView::ButtonPressed(Button* sender, const ui::Event& event) {}
-
void TestBarView::Init() {
SetLayoutManager(std::make_unique<FillLayout>());
base::string16 label;
- child_button_ = std::make_unique<LabelButton>(this, label);
- AddChildView(child_button_.get());
- second_child_button_ = std::make_unique<LabelButton>(this, label);
- AddChildView(second_child_button_.get());
- third_child_button_ = std::make_unique<LabelButton>(this, label);
- AddChildView(third_child_button_.get());
- not_child_button_ = std::make_unique<LabelButton>(this, label);
+ child_button_ = AddChildView(std::make_unique<LabelButton>());
+ second_child_button_ = AddChildView(std::make_unique<LabelButton>());
+ third_child_button_ = AddChildView(std::make_unique<LabelButton>());
+ not_child_button_ = std::make_unique<LabelButton>();
}
View* TestBarView::GetDefaultFocusableChild() {
- return child_button_.get();
+ return child_button_;
}
TEST_F(AccessiblePaneViewTest, SimpleSetPaneFocus) {
diff --git a/chromium/ui/views/animation/animation_delegate_views.cc b/chromium/ui/views/animation/animation_delegate_views.cc
index 67399e294eb..f379e561000 100644
--- a/chromium/ui/views/animation/animation_delegate_views.cc
+++ b/chromium/ui/views/animation/animation_delegate_views.cc
@@ -4,7 +4,8 @@
#include "ui/views/animation/animation_delegate_views.h"
-#include "ui/compositor/animation_metrics_recorder.h"
+#include <utility>
+
#include "ui/gfx/animation/animation_container.h"
#include "ui/views/animation/compositor_animation_runner.h"
#include "ui/views/widget/widget.h"
@@ -61,20 +62,6 @@ base::TimeDelta AnimationDelegateViews::GetAnimationDurationForReporting()
return base::TimeDelta();
}
-void AnimationDelegateViews::SetAnimationMetricsReporter(
- ui::AnimationMetricsReporter* animation_metrics_reporter) {
- if (animation_metrics_reporter_ == animation_metrics_reporter)
- return;
-
- animation_metrics_reporter_ = animation_metrics_reporter;
-
- if (!compositor_animation_runner_)
- return;
-
- compositor_animation_runner_->SetAnimationMetricsReporter(
- animation_metrics_reporter_, GetAnimationDurationForReporting());
-}
-
void AnimationDelegateViews::UpdateAnimationRunner() {
if (!view_ || !view_->GetWidget() || !view_->GetWidget()->GetCompositor()) {
ClearAnimationRunner();
@@ -87,8 +74,6 @@ void AnimationDelegateViews::UpdateAnimationRunner() {
auto compositor_animation_runner =
std::make_unique<CompositorAnimationRunner>(view_->GetWidget());
compositor_animation_runner_ = compositor_animation_runner.get();
- compositor_animation_runner_->SetAnimationMetricsReporter(
- animation_metrics_reporter_, GetAnimationDurationForReporting());
container_->SetAnimationRunner(std::move(compositor_animation_runner));
}
diff --git a/chromium/ui/views/animation/animation_delegate_views.h b/chromium/ui/views/animation/animation_delegate_views.h
index df98f3fb536..c8aed3937e6 100644
--- a/chromium/ui/views/animation/animation_delegate_views.h
+++ b/chromium/ui/views/animation/animation_delegate_views.h
@@ -14,10 +14,6 @@
#include "ui/views/view_observer.h"
#include "ui/views/views_export.h"
-namespace ui {
-class AnimationMetricsReporter;
-}
-
namespace views {
class CompositorAnimationRunner;
@@ -51,9 +47,6 @@ class VIEWS_EXPORT AnimationDelegateViews
// |set_animation_metrics_reporter()|.
virtual base::TimeDelta GetAnimationDurationForReporting() const;
- void SetAnimationMetricsReporter(
- ui::AnimationMetricsReporter* animation_metrics_reporter);
-
gfx::AnimationContainer* container() { return container_; }
private:
@@ -64,7 +57,6 @@ class VIEWS_EXPORT AnimationDelegateViews
View* view_;
gfx::AnimationContainer* container_ = nullptr;
- ui::AnimationMetricsReporter* animation_metrics_reporter_ = nullptr;
// The animation runner that |container_| uses.
CompositorAnimationRunner* compositor_animation_runner_ = nullptr;
diff --git a/chromium/ui/views/animation/bounds_animator_unittest.cc b/chromium/ui/views/animation/bounds_animator_unittest.cc
index 2042d98b677..2ac4a32fc8b 100644
--- a/chromium/ui/views/animation/bounds_animator_unittest.cc
+++ b/chromium/ui/views/animation/bounds_animator_unittest.cc
@@ -4,6 +4,9 @@
#include "ui/views/animation/bounds_animator.h"
+#include <algorithm>
+#include <utility>
+
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/test/icu_test_util.h"
@@ -421,7 +424,7 @@ TEST_F(BoundsAnimatorTest, VerifyBoundsAnimatorUnderRTL) {
// Enable RTL.
base::test::ScopedRestoreICUDefaultLocale scoped_locale("he");
- RecreateAnimator(/*use_transform=*/true);
+ RecreateAnimator(/*use_transforms=*/true);
parent()->SetBounds(0, 0, 40, 40);
const gfx::Rect initial_bounds(0, 0, 10, 10);
diff --git a/chromium/ui/views/animation/compositor_animation_runner.cc b/chromium/ui/views/animation/compositor_animation_runner.cc
index f945808e419..9d05e3fc99d 100644
--- a/chromium/ui/views/animation/compositor_animation_runner.cc
+++ b/chromium/ui/views/animation/compositor_animation_runner.cc
@@ -4,7 +4,6 @@
#include "ui/views/animation/compositor_animation_runner.h"
-#include "ui/compositor/animation_metrics_recorder.h"
#include "ui/views/widget/widget.h"
namespace views {
@@ -26,27 +25,7 @@ CompositorAnimationRunner::~CompositorAnimationRunner() {
CHECK(!IsInObserverList());
}
-void CompositorAnimationRunner::SetAnimationMetricsReporter(
- ui::AnimationMetricsReporter* animation_metrics_reporter,
- base::TimeDelta expected_duration) {
- if (animation_metrics_reporter) {
- DCHECK(!expected_duration.is_zero());
- animation_metrics_recorder_ =
- std::make_unique<ui::AnimationMetricsRecorder>(
- animation_metrics_reporter);
- expected_duration_ = expected_duration;
- } else {
- animation_metrics_recorder_.reset();
- }
-}
-
void CompositorAnimationRunner::Stop() {
- // Record metrics if necessary.
- if (animation_metrics_recorder_ && compositor_) {
- animation_metrics_recorder_->OnAnimationEnd(
- compositor_->activated_frame_count(), compositor_->refresh_rate());
- }
-
StopInternal();
}
@@ -90,11 +69,6 @@ void CompositorAnimationRunner::OnStart(base::TimeDelta min_interval,
min_interval_ = min_interval;
DCHECK(!compositor_->HasAnimationObserver(this));
compositor_->AddAnimationObserver(this);
-
- if (animation_metrics_recorder_) {
- animation_metrics_recorder_->OnAnimationStart(
- compositor_->activated_frame_count(), last_tick_, expected_duration_);
- }
}
void CompositorAnimationRunner::StopInternal() {
diff --git a/chromium/ui/views/animation/compositor_animation_runner.h b/chromium/ui/views/animation/compositor_animation_runner.h
index 462404ae38d..2f26f8d2948 100644
--- a/chromium/ui/views/animation/compositor_animation_runner.h
+++ b/chromium/ui/views/animation/compositor_animation_runner.h
@@ -16,11 +16,6 @@
#include "ui/views/views_export.h"
#include "ui/views/widget/widget_observer.h"
-namespace ui {
-class AnimationMetricsRecorder;
-class AnimationMetricsReporter;
-} // namespace ui
-
namespace views {
class Widget;
@@ -35,13 +30,6 @@ class VIEWS_EXPORT CompositorAnimationRunner
CompositorAnimationRunner& operator=(CompositorAnimationRunner&) = delete;
~CompositorAnimationRunner() override;
- // Set a AnimationMetricsReporter which will record metrics
- // after an animation is complete. A non zero |expected_duration| is required
- // for computations.
- void SetAnimationMetricsReporter(
- ui::AnimationMetricsReporter* animation_metrics_reporter,
- base::TimeDelta expected_duration);
-
// gfx::AnimationRunner:
void Stop() override;
@@ -72,11 +60,6 @@ class VIEWS_EXPORT CompositorAnimationRunner
base::TimeDelta min_interval_ = base::TimeDelta::Max();
base::TimeTicks last_tick_;
-
- // Expected duration of an animation. Used for and required to be non zero for
- // animation metrics recording.
- base::TimeDelta expected_duration_;
- std::unique_ptr<ui::AnimationMetricsRecorder> animation_metrics_recorder_;
};
} // namespace views
diff --git a/chromium/ui/views/animation/compositor_animation_runner_unittest.cc b/chromium/ui/views/animation/compositor_animation_runner_unittest.cc
index bab395ec9c6..8b20337e434 100644
--- a/chromium/ui/views/animation/compositor_animation_runner_unittest.cc
+++ b/chromium/ui/views/animation/compositor_animation_runner_unittest.cc
@@ -4,10 +4,10 @@
#include "ui/views/animation/compositor_animation_runner.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/timer/timer.h"
-#include "ui/compositor/animation_metrics_reporter.h"
#include "ui/compositor/test/draw_waiter_for_test.h"
+#include "ui/compositor/throughput_tracker.h"
#include "ui/gfx/animation/linear_animation.h"
#include "ui/views/animation/animation_delegate_views.h"
#include "ui/views/buildflags.h"
@@ -49,23 +49,6 @@ TEST_F(CompositorAnimationRunnerTest, BasicCoverageTest) {
namespace {
-class TestAnimationMetricsReporter : public ui::AnimationMetricsReporter {
- public:
- TestAnimationMetricsReporter() = default;
- TestAnimationMetricsReporter(TestAnimationMetricsReporter&) = delete;
- TestAnimationMetricsReporter& operator=(TestAnimationMetricsReporter&) =
- delete;
- ~TestAnimationMetricsReporter() override = default;
-
- // ui::AnimationMetricsReporter:
- void Report(int value) override { ++report_count_; }
-
- int report_count() const { return report_count_; }
-
- private:
- int report_count_ = 0;
-};
-
// Test AnimationDelegateView which has a non-zero expected animation duration
// time, which is required for getting smoothness reports.
class TestAnimationDelegateViews : public AnimationDelegateViews {
@@ -84,24 +67,32 @@ class TestAnimationDelegateViews : public AnimationDelegateViews {
} // namespace
-// Tests that an attached animation metrics reporter will get smoothness
-// reports.
-TEST_F(CompositorAnimationRunnerTest, AnimationMetricsReporter) {
+// Tests that ui::ThroughputTracker will report for gfx::Animation.
+TEST_F(CompositorAnimationRunnerTest, ThroughputTracker) {
WidgetAutoclosePtr widget(CreateTopLevelPlatformWidget());
widget->Show();
ui::DrawWaiterForTest::WaitForCompositingStarted(widget->GetCompositor());
- TestAnimationMetricsReporter metrics_reporter;
- TestAnimationMetricsReporter metrics_reporter2;
+ int report_count = 0;
+ int report_count2 = 0;
+
TestAnimationDelegateViews delegate(widget->GetContentsView());
- delegate.SetAnimationMetricsReporter(&metrics_reporter);
+
gfx::LinearAnimation animation(
kDuration, gfx::LinearAnimation::kDefaultFrameRate, &delegate);
base::RepeatingTimer interval_timer;
base::RunLoop run_loop;
+ ui::ThroughputTracker tracker1 =
+ widget->GetCompositor()->RequestNewThroughputTracker();
+ tracker1.Start(base::BindLambdaForTesting(
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
+ ++report_count;
+ run_loop.Quit();
+ }));
+
animation.Start();
EXPECT_TRUE(animation.is_animating());
EXPECT_TRUE(delegate.container()->has_custom_animation_runner());
@@ -111,16 +102,24 @@ TEST_F(CompositorAnimationRunnerTest, AnimationMetricsReporter) {
return;
interval_timer.Stop();
- run_loop.Quit();
+ tracker1.Stop();
}));
run_loop.Run();
- EXPECT_EQ(1, metrics_reporter.report_count());
- EXPECT_EQ(0, metrics_reporter2.report_count());
+ EXPECT_EQ(1, report_count);
+ EXPECT_EQ(0, report_count2);
// Tests that switching metrics reporters for the next animation works as
// expected.
base::RunLoop run_loop2;
- delegate.SetAnimationMetricsReporter(&metrics_reporter2);
+
+ ui::ThroughputTracker tracker2 =
+ widget->GetCompositor()->RequestNewThroughputTracker();
+ tracker2.Start(base::BindLambdaForTesting(
+ [&](const cc::FrameSequenceMetrics::CustomReportData& data) {
+ ++report_count2;
+ run_loop2.Quit();
+ }));
+
animation.Start();
EXPECT_TRUE(animation.is_animating());
@@ -129,11 +128,11 @@ TEST_F(CompositorAnimationRunnerTest, AnimationMetricsReporter) {
return;
interval_timer.Stop();
- run_loop2.Quit();
+ tracker2.Stop();
}));
run_loop2.Run();
- EXPECT_EQ(1, metrics_reporter.report_count());
- EXPECT_EQ(1, metrics_reporter2.report_count());
+ EXPECT_EQ(1, report_count);
+ EXPECT_EQ(1, report_count2);
}
// No DesktopAura on ChromeOS.
diff --git a/chromium/ui/views/animation/ink_drop_host_view.cc b/chromium/ui/views/animation/ink_drop_host_view.cc
index 590ae89b31a..6b66522cda6 100644
--- a/chromium/ui/views/animation/ink_drop_host_view.cc
+++ b/chromium/ui/views/animation/ink_drop_host_view.cc
@@ -19,6 +19,7 @@
#include "ui/views/animation/square_ink_drop_ripple.h"
#include "ui/views/controls/focus_ring.h"
#include "ui/views/controls/highlight_path_generator.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/view_class_properties.h"
diff --git a/chromium/ui/views/animation/ink_drop_host_view.h b/chromium/ui/views/animation/ink_drop_host_view.h
index 7a6dda99623..ce6581cbc3c 100644
--- a/chromium/ui/views/animation/ink_drop_host_view.h
+++ b/chromium/ui/views/animation/ink_drop_host_view.h
@@ -253,8 +253,10 @@ VIEW_BUILDER_PROPERTY(int, InkDropLargeCornerRadius)
VIEW_BUILDER_PROPERTY(InkDropHostView::InkDropMode, InkDropMode)
VIEW_BUILDER_PROPERTY(int, InkDropSmallCornerRadius)
VIEW_BUILDER_PROPERTY(float, InkDropVisibleOpacity)
-END_VIEW_BUILDER(VIEWS_EXPORT, InkDropHostView)
+END_VIEW_BUILDER
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, InkDropHostView)
+
#endif // UI_VIEWS_ANIMATION_INK_DROP_HOST_VIEW_H_
diff --git a/chromium/ui/views/animation/ink_drop_ripple.cc b/chromium/ui/views/animation/ink_drop_ripple.cc
index 497891ffe40..2c396d6b32d 100644
--- a/chromium/ui/views/animation/ink_drop_ripple.cc
+++ b/chromium/ui/views/animation/ink_drop_ripple.cc
@@ -5,7 +5,7 @@
#include "ui/views/animation/ink_drop_ripple.h"
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/command_line.h"
#include "ui/base/ui_base_switches.h"
#include "ui/compositor/callback_layer_animation_observer.h"
diff --git a/chromium/ui/views/animation/installable_ink_drop_animator_unittest.cc b/chromium/ui/views/animation/installable_ink_drop_animator_unittest.cc
index 0498661aa4e..5a2f635d71f 100644
--- a/chromium/ui/views/animation/installable_ink_drop_animator_unittest.cc
+++ b/chromium/ui/views/animation/installable_ink_drop_animator_unittest.cc
@@ -4,7 +4,7 @@
#include "ui/views/animation/installable_ink_drop_animator.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/memory/scoped_refptr.h"
#include "base/run_loop.h"
#include "base/test/task_environment.h"
diff --git a/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc b/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
index 7024d3e0dd0..7c4fb6a5a4d 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -4,10 +4,10 @@
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
+#include <algorithm>
#include <utility>
#include "base/bind.h"
-#include "base/feature_list.h"
#include "base/metrics/histogram_macros.h"
#include "build/build_config.h"
#include "ui/accessibility/ax_enums.mojom.h"
@@ -16,6 +16,7 @@
#include "ui/base/default_style.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/compositor/layer_animation_element.h"
+#include "ui/display/screen.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rounded_corners_f.h"
@@ -24,8 +25,9 @@
#include "ui/views/bubble/bubble_frame_view.h"
#include "ui/views/layout/layout_manager.h"
#include "ui/views/layout/layout_provider.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
+#include "ui/views/style/platform_style.h"
#include "ui/views/view_class_properties.h"
-#include "ui/views/views_features.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
@@ -55,7 +57,8 @@ namespace {
//
// TODO(tluk): Fix all cases where bubble transparency is used and have bubble
// ClientViews always paint to a layer.
-DEFINE_UI_CLASS_PROPERTY_KEY(bool, kPaintClientToLayer, true)
+// TODO(tluk): Flip this to true for all bubbles.
+DEFINE_UI_CLASS_PROPERTY_KEY(bool, kPaintClientToLayer, false)
// Override base functionality of Widget to give bubble dialogs access to the
// theme provider of the window they're anchored to.
@@ -319,11 +322,8 @@ Widget* BubbleDialogDelegate::CreateBubble(
bubble_delegate->SetAnchorView(bubble_delegate->GetAnchorView());
Widget* bubble_widget = CreateBubbleWidget(bubble_delegate);
-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_APPLE)
- // Linux clips bubble windows that extend outside their parent window bounds.
- // Mac never adjusts.
- bubble_delegate->set_adjust_if_offscreen(false);
-#endif
+ bubble_delegate->set_adjust_if_offscreen(
+ PlatformStyle::kAdjustBubbleIfOffscreen);
bubble_delegate->SizeToContents();
bubble_delegate->bubble_widget_observer_ =
@@ -399,9 +399,7 @@ ClientView* BubbleDialogDelegate::CreateClientView(Widget* widget) {
// rounded corner clip we must paint the client view to a layer. This is
// necessary because layers do not respect the clip of a non-layer backed
// parent.
- if (base::FeatureList::IsEnabled(
- features::kEnableMDRoundedCornersOnDialogs) &&
- GetProperty(kPaintClientToLayer)) {
+ if (GetProperty(kPaintClientToLayer)) {
client_view_->SetPaintToLayer();
client_view_->layer()->SetRoundedCornerRadius(
gfx::RoundedCornersF(GetCornerRadius()));
@@ -588,6 +586,63 @@ void BubbleDialogDelegate::UseCompactMargins() {
set_margins(gfx::Insets(6));
}
+// static
+gfx::Size BubbleDialogDelegate::GetMaxAvailableScreenSpaceToPlaceBubble(
+ View* anchor_view,
+ BubbleBorder::Arrow arrow,
+ bool adjust_if_offscreen,
+ BubbleFrameView::PreferredArrowAdjustment arrow_adjustment) {
+ // TODO(sanchit.abrol@microsoft.com): Implement for other arrows.
+ DCHECK(arrow == BubbleBorder::TOP_LEFT || arrow == BubbleBorder::TOP_RIGHT ||
+ arrow == BubbleBorder::BOTTOM_RIGHT ||
+ arrow == BubbleBorder::BOTTOM_LEFT);
+ DCHECK_EQ(arrow_adjustment,
+ BubbleFrameView::PreferredArrowAdjustment::kMirror);
+
+ gfx::Rect anchor_rect = anchor_view->GetAnchorBoundsInScreen();
+ gfx::Rect screen_rect =
+ display::Screen::GetScreen()
+ ->GetDisplayNearestPoint(anchor_rect.CenterPoint())
+ .work_area();
+
+ gfx::Size max_available_space;
+
+ if (adjust_if_offscreen) {
+ max_available_space = GetAvailableSpaceToPlaceBubble(
+ BubbleBorder::TOP_LEFT, anchor_rect, screen_rect);
+ max_available_space.SetToMax(GetAvailableSpaceToPlaceBubble(
+ BubbleBorder::TOP_RIGHT, anchor_rect, screen_rect));
+ max_available_space.SetToMax(GetAvailableSpaceToPlaceBubble(
+ BubbleBorder::BOTTOM_RIGHT, anchor_rect, screen_rect));
+ max_available_space.SetToMax(GetAvailableSpaceToPlaceBubble(
+ BubbleBorder::BOTTOM_LEFT, anchor_rect, screen_rect));
+ } else {
+ max_available_space =
+ GetAvailableSpaceToPlaceBubble(arrow, anchor_rect, screen_rect);
+ }
+
+ return max_available_space;
+}
+
+// static
+gfx::Size BubbleDialogDelegate::GetAvailableSpaceToPlaceBubble(
+ BubbleBorder::Arrow arrow,
+ gfx::Rect anchor_rect,
+ gfx::Rect screen_rect) {
+ int available_height_below = screen_rect.bottom() - anchor_rect.bottom();
+
+ int available_height_above = anchor_rect.y() - screen_rect.y();
+
+ int available_width_on_left = anchor_rect.right() - screen_rect.x();
+
+ int available_width_on_right = screen_rect.right() - anchor_rect.x();
+
+ return {BubbleBorder::is_arrow_on_left(arrow) ? available_width_on_right
+ : available_width_on_left,
+ BubbleBorder::is_arrow_on_top(arrow) ? available_height_below
+ : available_height_above};
+}
+
void BubbleDialogDelegate::OnAnchorBoundsChanged() {
if (!GetWidget())
return;
@@ -696,7 +751,8 @@ void BubbleDialogDelegate::SetAnchorView(View* anchor_view) {
auto* old_anchored_dialog = anchor_view->GetProperty(kAnchoredDialogKey);
if (old_anchored_dialog && old_anchored_dialog != this)
DLOG(WARNING) << "|anchor_view| has already anchored a focusable widget.";
- anchor_view->SetProperty(kAnchoredDialogKey, this);
+ anchor_view->SetProperty(kAnchoredDialogKey,
+ static_cast<DialogDelegate*>(this));
}
}
@@ -735,12 +791,6 @@ void BubbleDialogDelegateView::UpdateColorsFromTheme() {
: nullptr);
}
-void BubbleDialogDelegateView::EnableUpDownKeyboardAccelerators() {
- // The arrow keys can be used to tab between items.
- AddAccelerator(ui::Accelerator(ui::VKEY_DOWN, ui::EF_NONE));
- AddAccelerator(ui::Accelerator(ui::VKEY_UP, ui::EF_NONE));
-}
-
void BubbleDialogDelegate::OnBubbleWidgetVisibilityChanged(bool visible) {
UpdateHighlightedButton(visible);
diff --git a/chromium/ui/views/bubble/bubble_dialog_delegate_view.h b/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
index bd9cc7b0a9f..b588fdb446e 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -15,6 +15,9 @@
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/class_property.h"
#include "ui/views/bubble/bubble_border.h"
+#include "ui/views/bubble/bubble_frame_view.h"
+#include "ui/views/metadata/metadata_header_macros.h"
+#include "ui/views/metadata/view_factory.h"
#include "ui/views/view_tracker.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
@@ -235,6 +238,21 @@ class VIEWS_EXPORT BubbleDialogDelegate : public DialogDelegate,
virtual void OnBeforeBubbleWidgetInit(Widget::InitParams* params,
Widget* widget) const {}
+ // Get the maximum available screen space to place a bubble anchored to
+ // |anchor_view| at |arrow|. If offscreen adjustment is on, this would return
+ // the max space corresponding to the possible arrow positions of the bubble.
+ static gfx::Size GetMaxAvailableScreenSpaceToPlaceBubble(
+ View* anchor_view,
+ BubbleBorder::Arrow arrow,
+ bool adjust_if_offscreen,
+ BubbleFrameView::PreferredArrowAdjustment arrow_adjustment);
+
+ // Get the available space to place a bubble anchored to |anchor_rect| at
+ // |arrow| inside |screen_rect|.
+ static gfx::Size GetAvailableSpaceToPlaceBubble(BubbleBorder::Arrow arrow,
+ gfx::Rect anchor_rect,
+ gfx::Rect screen_rect);
+
protected:
// Create and initialize the bubble Widget with proper bounds.
static Widget* CreateBubble(BubbleDialogDelegate* bubble_delegate);
@@ -382,7 +400,8 @@ class VIEWS_EXPORT BubbleDialogDelegateView : public BubbleDialogDelegate,
View* anchor_view,
BubbleBorder::Arrow arrow,
BubbleBorder::Shadow shadow = BubbleBorder::DIALOG_SHADOW);
-
+ BubbleDialogDelegateView(const BubbleDialogDelegateView&) = delete;
+ BubbleDialogDelegateView& operator=(const BubbleDialogDelegateView&) = delete;
~BubbleDialogDelegateView() override;
// BubbleDialogDelegate:
@@ -408,19 +427,19 @@ class VIEWS_EXPORT BubbleDialogDelegateView : public BubbleDialogDelegate,
// Perform view initialization on the contents for bubble sizing.
void Init() override;
- // Allows the up and down arrow keys to tab between items.
- void EnableUpDownKeyboardAccelerators();
-
private:
FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, CreateDelegate);
FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, NonClientHitTest);
// Update the bubble color from the NativeTheme unless it was explicitly set.
void UpdateColorsFromTheme();
-
- DISALLOW_COPY_AND_ASSIGN(BubbleDialogDelegateView);
};
+BEGIN_VIEW_BUILDER(VIEWS_EXPORT, BubbleDialogDelegateView, View)
+END_VIEW_BUILDER
+
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, BubbleDialogDelegateView)
+
#endif // UI_VIEWS_BUBBLE_BUBBLE_DIALOG_DELEGATE_VIEW_H_
diff --git a/chromium/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc b/chromium/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
index 182254b7f5c..1e26b9e0264 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
@@ -14,9 +14,10 @@
#include "base/memory/ptr_util.h"
#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "ui/base/hit_test.h"
+#include "ui/display/test/scoped_screen_override.h"
+#include "ui/display/test/test_screen.h"
#include "ui/events/event_utils.h"
#include "ui/views/animation/test/ink_drop_host_view_test_api.h"
#include "ui/views/animation/test/test_ink_drop.h"
@@ -24,12 +25,13 @@
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/styled_label.h"
+#include "ui/views/style/platform_style.h"
#include "ui/views/test/ax_event_counter.h"
+#include "ui/views/test/button_test_api.h"
#include "ui/views/test/test_views.h"
#include "ui/views/test/test_widget_observer.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/test/widget_test.h"
-#include "ui/views/views_features.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
@@ -411,10 +413,10 @@ TEST_F(BubbleDialogDelegateViewTest, CloseMethods) {
frame_view->ResetViewShownTimeStampForTesting();
Button* close_button = frame_view->close_;
ASSERT_TRUE(close_button);
- frame_view->ButtonPressed(
- close_button,
- ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE));
+ test::ButtonTestApi(close_button)
+ .NotifyClick(ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(),
+ gfx::Point(), ui::EventTimeForNow(),
+ ui::EF_NONE, ui::EF_NONE));
EXPECT_TRUE(bubble_widget->IsClosed());
}
}
@@ -533,8 +535,9 @@ TEST_F(BubbleDialogDelegateViewTest, StyledLabelTitle) {
// widget is shown or hidden respectively.
TEST_F(BubbleDialogDelegateViewTest, AttachedWidgetShowsInkDropWhenVisible) {
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
- LabelButton* button = anchor_widget->SetContentsView(
- std::make_unique<LabelButton>(nullptr, base::string16()));
+ LabelButton* button =
+ anchor_widget->SetContentsView(std::make_unique<LabelButton>(
+ Button::PressedCallback(), base::string16()));
TestInkDrop* ink_drop = new TestInkDrop();
test::InkDropHostViewTestApi(button).SetInkDrop(base::WrapUnique(ink_drop));
TestBubbleDialogDelegateView* bubble_delegate =
@@ -561,8 +564,9 @@ TEST_F(BubbleDialogDelegateViewTest, AttachedWidgetShowsInkDropWhenVisible) {
// widget is shown.
TEST_F(BubbleDialogDelegateViewTest, VisibleWidgetShowsInkDropOnAttaching) {
std::unique_ptr<Widget> anchor_widget = CreateTestWidget();
- LabelButton* button = anchor_widget->SetContentsView(
- std::make_unique<LabelButton>(nullptr, base::string16()));
+ LabelButton* button =
+ anchor_widget->SetContentsView(std::make_unique<LabelButton>(
+ Button::PressedCallback(), base::string16()));
TestInkDrop* ink_drop = new TestInkDrop();
test::InkDropHostViewTestApi(button).SetInkDrop(base::WrapUnique(ink_drop));
TestBubbleDialogDelegateView* bubble_delegate =
@@ -625,28 +629,146 @@ TEST_F(BubbleDialogDelegateViewTest, GetThemeProvider_FromAnchorWidget) {
anchor_widget->GetThemeProvider());
}
-// Tests whether the BubbleDialogDelegateView will create a layer backed client
-// view when prompted to do so.
-class BubbleDialogDelegateClientLayerTest : public test::WidgetTest {
- public:
- BubbleDialogDelegateClientLayerTest() = default;
- ~BubbleDialogDelegateClientLayerTest() override = default;
+const int kScreenWidth = 1024;
+const int kScreenHeight = 768;
- void SetUp() override {
- WidgetTest::SetUp();
- scoped_feature_list_.InitWithFeatures(
- {features::kEnableMDRoundedCornersOnDialogs}, {});
+struct ArrowTestParameters {
+ views::BubbleBorder::Arrow arrow;
+ bool adjust_if_offscreen;
+ gfx::Rect anchor_rect;
+ views::BubbleBorder::Arrow expected_arrow;
+
+ gfx::Size ExpectedSpace() const {
+ gfx::Rect adjusted_anchor_rect = anchor_rect;
+ adjusted_anchor_rect.Offset(
+ 0, ViewsTestBase::GetSystemReservedHeightAtTopOfScreen());
+ gfx::Rect screen_rect = gfx::Rect(0, 0, kScreenWidth, kScreenHeight);
+
+ return BubbleDialogDelegate::GetAvailableSpaceToPlaceBubble(
+ expected_arrow, adjusted_anchor_rect, screen_rect);
}
+};
+
+class BubbleDialogDelegateViewArrowTest
+ : public BubbleDialogDelegateViewTest,
+ public testing::WithParamInterface<ArrowTestParameters> {
+ public:
+ BubbleDialogDelegateViewArrowTest() : screen_override_(SetUpTestScreen()) {}
+ ~BubbleDialogDelegateViewArrowTest() override = default;
private:
- base::test::ScopedFeatureList scoped_feature_list_;
+ display::Screen* SetUpTestScreen() {
+ const display::Display test_display = test_screen_.GetPrimaryDisplay();
+ display::Display display(test_display);
+ display.set_id(0x2);
+ display.set_bounds(gfx::Rect(0, 0, kScreenWidth, kScreenHeight));
+ display.set_work_area(gfx::Rect(0, 0, kScreenWidth, kScreenHeight));
+ test_screen_.display_list().RemoveDisplay(test_display.id());
+ test_screen_.display_list().AddDisplay(display,
+ display::DisplayList::Type::PRIMARY);
+ return &test_screen_;
+ }
+
+ display::test::TestScreen test_screen_;
+ display::test::ScopedScreenOverride screen_override_;
+
+ DISALLOW_COPY_AND_ASSIGN(BubbleDialogDelegateViewArrowTest);
};
-TEST_F(BubbleDialogDelegateClientLayerTest, WithClientLayerTest) {
+TEST_P(BubbleDialogDelegateViewArrowTest, AvailableScreenSpaceTest) {
+ std::unique_ptr<Widget> anchor_widget =
+ CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
+ auto* bubble_delegate =
+ new TestBubbleDialogDelegateView(anchor_widget->GetContentsView());
+ BubbleDialogDelegateView::CreateBubble(bubble_delegate);
+ EXPECT_EQ(bubble_delegate->adjust_if_offscreen(),
+ PlatformStyle::kAdjustBubbleIfOffscreen);
+
+ const ArrowTestParameters kParam = GetParam();
+
+ bubble_delegate->SetArrow(kParam.arrow);
+ bubble_delegate->set_adjust_if_offscreen(kParam.adjust_if_offscreen);
+ anchor_widget->GetContentsView()->SetBounds(
+ kParam.anchor_rect.x(), kParam.anchor_rect.y(),
+ kParam.anchor_rect.width(), kParam.anchor_rect.height());
+ gfx::Size available_space =
+ BubbleDialogDelegate::GetMaxAvailableScreenSpaceToPlaceBubble(
+ bubble_delegate->GetAnchorView(), bubble_delegate->arrow(),
+ bubble_delegate->adjust_if_offscreen(),
+ BubbleFrameView::PreferredArrowAdjustment::kMirror);
+ EXPECT_EQ(available_space, kParam.ExpectedSpace());
+}
+
+const int kAnchorFarRightX = 840;
+const int kAnchorFarLeftX = 75;
+const int kAnchorFarTopY = 57;
+const int kAnchorFarBottomY = 730;
+const int kAnchorLength = 28;
+
+// When the anchor rect is positioned at different places Rect(x, y,
+// kAnchorLength, kAnchorLength) with (x,y) set to far corners of the screen,
+// available space to position the bubble should vary acc. to
+// |adjust_if_offscreen_|.
+const ArrowTestParameters kAnchorAtFarScreenCornersParams[] = {
+ // Arrow at Top Right, no arrow adjustment needed
+ {views::BubbleBorder::Arrow::TOP_RIGHT, true,
+ gfx::Rect(kAnchorFarRightX, kAnchorFarTopY, kAnchorLength, kAnchorLength),
+ views::BubbleBorder::Arrow::TOP_RIGHT},
+ // Max size available when arrow is changed to Bottom Right
+ {views::BubbleBorder::Arrow::TOP_RIGHT, true,
+ gfx::Rect(kAnchorFarRightX,
+ kAnchorFarBottomY,
+ kAnchorLength,
+ kAnchorLength),
+ views::BubbleBorder::Arrow::BOTTOM_RIGHT},
+ // Max size available when arrow is changed to Bottom Left
+ {views::BubbleBorder::Arrow::TOP_RIGHT, true,
+ gfx::Rect(kAnchorFarLeftX,
+ kAnchorFarBottomY,
+ kAnchorLength,
+ kAnchorLength),
+ views::BubbleBorder::Arrow::BOTTOM_LEFT},
+ // Max size available when arrow is changed to Top Left
+ {views::BubbleBorder::Arrow::TOP_RIGHT, true,
+ gfx::Rect(kAnchorFarLeftX, kAnchorFarTopY, kAnchorLength, kAnchorLength),
+ views::BubbleBorder::Arrow::TOP_LEFT},
+ // Offscreen adjustment is off, available size is per Bottom Left
+ // arrow
+ {views::BubbleBorder::Arrow::BOTTOM_LEFT, false,
+ gfx::Rect(kAnchorFarRightX, kAnchorFarTopY, kAnchorLength, kAnchorLength),
+ views::BubbleBorder::Arrow::BOTTOM_LEFT},
+ // Offscreen adjustment is off, available size is per Top Left arrow
+ {views::BubbleBorder::Arrow::TOP_LEFT, false,
+ gfx::Rect(kAnchorFarRightX,
+ kAnchorFarBottomY,
+ kAnchorLength,
+ kAnchorLength),
+ views::BubbleBorder::Arrow::TOP_LEFT},
+ // Offscreen adjustment is off, available size is per Top Right arrow
+ {views::BubbleBorder::Arrow::TOP_RIGHT, false,
+ gfx::Rect(kAnchorFarLeftX,
+ kAnchorFarBottomY,
+ kAnchorLength,
+ kAnchorLength),
+ views::BubbleBorder::Arrow::TOP_RIGHT},
+ // Offscreen adjustment is off, available size is per Bottom Right
+ // arrow
+ {views::BubbleBorder::Arrow::BOTTOM_RIGHT, false,
+ gfx::Rect(kAnchorFarLeftX, kAnchorFarTopY, kAnchorLength, kAnchorLength),
+ views::BubbleBorder::Arrow::BOTTOM_RIGHT}};
+
+INSTANTIATE_TEST_SUITE_P(AnchorAtFarScreenCorners,
+ BubbleDialogDelegateViewArrowTest,
+ testing::ValuesIn(kAnchorAtFarScreenCornersParams));
+
+// Tests whether the BubbleDialogDelegateView will create a layer backed
+// ClientView when SetPaintClientToLayer is set to true.
+TEST_F(BubbleDialogDelegateViewTest, WithClientLayerTest) {
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
auto bubble_delegate = std::make_unique<BubbleDialogDelegateView>(
nullptr, BubbleBorder::TOP_LEFT);
+ bubble_delegate->SetPaintClientToLayer(true);
bubble_delegate->set_parent_window(anchor_widget->GetNativeView());
WidgetAutoclosePtr bubble_widget(
@@ -655,7 +777,9 @@ TEST_F(BubbleDialogDelegateClientLayerTest, WithClientLayerTest) {
EXPECT_NE(nullptr, bubble_widget->client_view()->layer());
}
-TEST_F(BubbleDialogDelegateClientLayerTest, WithoutClientLayerTest) {
+// Tests to ensure BubbleDialogDelegateView does not create a layer backed
+// ClientView when SetPaintClientToLayer is set to false.
+TEST_F(BubbleDialogDelegateViewTest, WithoutClientLayerTest) {
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
auto bubble_delegate = std::make_unique<BubbleDialogDelegateView>(
diff --git a/chromium/ui/views/bubble/bubble_dialog_model_host.cc b/chromium/ui/views/bubble/bubble_dialog_model_host.cc
index f467c97f3fd..3f2df684cd8 100644
--- a/chromium/ui/views/bubble/bubble_dialog_model_host.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_model_host.cc
@@ -7,6 +7,7 @@
#include <utility>
#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/base/class_property.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/combobox_model.h"
#include "ui/views/controls/button/checkbox.h"
@@ -17,16 +18,14 @@
#include "ui/views/controls/styled_label.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/grid_layout.h"
+#include "ui/views/layout/box_layout_view.h"
+#include "ui/views/layout/fill_layout.h"
#include "ui/views/layout/layout_provider.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
+#include "ui/views/view_class_properties.h"
namespace views {
namespace {
-// Note that textfields and comboboxes share column sets.
-constexpr int kTextfieldColumnSetId = 0;
-// Column sets used for fields where an individual control spans the entire
-// dialog width.
-constexpr int kSingleColumnSetId = 1;
DialogContentType FieldTypeToContentType(ui::DialogModelField::Type type) {
switch (type) {
@@ -45,34 +44,127 @@ DialogContentType FieldTypeToContentType(ui::DialogModelField::Type type) {
return DialogContentType::CONTROL;
}
-std::unique_ptr<View> CreateCheckboxControl(std::unique_ptr<Checkbox> checkbox,
- std::unique_ptr<View> label) {
- auto container = std::make_unique<views::View>();
+// A subclass of Checkbox that allows using an external Label/StyledLabel view
+// instead of LabelButton's internal label. This is required for the
+// Label/StyledLabel to be clickable, while supporting Links which requires a
+// StyledLabel.
+class CheckboxControl : public Checkbox {
+ public:
+ CheckboxControl(std::unique_ptr<View> label, int label_line_height)
+ : label_line_height_(label_line_height) {
+ auto* layout = SetLayoutManager(std::make_unique<BoxLayout>());
+ layout->set_between_child_spacing(LayoutProvider::Get()->GetDistanceMetric(
+ views::DISTANCE_RELATED_LABEL_HORIZONTAL));
+ layout->set_cross_axis_alignment(
+ views::BoxLayout::CrossAxisAlignment::kStart);
+
+ SetAssociatedLabel(label.get());
+
+ AddChildView(std::move(label));
+ }
- // Move the checkbox border up to |container| so that it surrounds both
- // |checkbox| and |label|. This done so that |container| looks like a single
- // Checkbox control that has |label| as its internal label. This method is
- // necessary as Checkbox has no internal support for a StyledLabel, which is
- // required for link support in the checkbox label.
- container->SetBorder(checkbox->CreateDefaultBorder());
- checkbox->SetBorder(nullptr);
+ void Layout() override {
+ // Skip LabelButton to use LayoutManager.
+ View::Layout();
+ }
- auto* layout = container->SetLayoutManager(std::make_unique<views::BoxLayout>(
- views::BoxLayout::Orientation::kHorizontal, gfx::Insets(),
- LayoutProvider::Get()->GetDistanceMetric(
- views::DISTANCE_RELATED_LABEL_HORIZONTAL)));
- layout->set_cross_axis_alignment(
- views::BoxLayout::CrossAxisAlignment::kStart);
+ gfx::Size CalculatePreferredSize() const override {
+ // Skip LabelButton to use LayoutManager.
+ return View::CalculatePreferredSize();
+ }
- checkbox->SetAssociatedLabel(label.get());
+ int GetHeightForWidth(int width) const override {
+ // Skip LabelButton to use LayoutManager.
+ return View::GetHeightForWidth(width);
+ }
- container->AddChildView(std::move(checkbox));
- container->AddChildView(std::move(label));
- return container;
-}
+ void OnThemeChanged() override {
+ Checkbox::OnThemeChanged();
+ // This offsets the image to align with the first line of text. See
+ // LabelButton::Layout().
+ image()->SetBorder(CreateEmptyBorder(gfx::Insets(
+ (label_line_height_ - image()->GetPreferredSize().height()) / 2, 0, 0,
+ 0)));
+ }
+
+ const int label_line_height_;
+};
} // namespace
+class BubbleDialogModelHost::LayoutConsensusView : public View {
+ public:
+ LayoutConsensusView(LayoutConsensusGroup* group, std::unique_ptr<View> view)
+ : group_(group) {
+ group->AddView(this);
+ SetLayoutManager(std::make_unique<FillLayout>());
+ AddChildView(std::move(view));
+ }
+
+ ~LayoutConsensusView() override { group_->RemoveView(this); }
+
+ gfx::Size CalculatePreferredSize() const override {
+ const gfx::Size group_preferred_size = group_->GetMaxPreferredSize();
+ DCHECK_EQ(1u, children().size());
+ const gfx::Size child_preferred_size = children()[0]->GetPreferredSize();
+ // TODO(pbos): This uses the max width, but could be configurable to use
+ // either direction.
+ return gfx::Size(group_preferred_size.width(),
+ child_preferred_size.height());
+ }
+
+ gfx::Size GetMinimumSize() const override {
+ const gfx::Size group_minimum_size = group_->GetMaxMinimumSize();
+ DCHECK_EQ(1u, children().size());
+ const gfx::Size child_minimum_size = children()[0]->GetMinimumSize();
+ // TODO(pbos): This uses the max width, but could be configurable to use
+ // either direction.
+ return gfx::Size(group_minimum_size.width(), child_minimum_size.height());
+ }
+
+ private:
+ LayoutConsensusGroup* const group_;
+};
+
+BubbleDialogModelHost::LayoutConsensusGroup::LayoutConsensusGroup() = default;
+BubbleDialogModelHost::LayoutConsensusGroup::~LayoutConsensusGroup() {
+ DCHECK(children_.empty());
+}
+
+void BubbleDialogModelHost::LayoutConsensusGroup::AddView(
+ LayoutConsensusView* view) {
+ children_.insert(view);
+ // Because this may change the max preferred/min size, invalidate all child
+ // layouts.
+ for (auto* child : children_)
+ child->InvalidateLayout();
+}
+
+void BubbleDialogModelHost::LayoutConsensusGroup::RemoveView(
+ LayoutConsensusView* view) {
+ children_.erase(view);
+}
+
+gfx::Size BubbleDialogModelHost::LayoutConsensusGroup::GetMaxPreferredSize()
+ const {
+ gfx::Size size;
+ for (auto* child : children_) {
+ DCHECK_EQ(1u, child->children().size());
+ size.SetToMax(child->children().front()->GetPreferredSize());
+ }
+ return size;
+}
+
+gfx::Size BubbleDialogModelHost::LayoutConsensusGroup::GetMaxMinimumSize()
+ const {
+ gfx::Size size;
+ for (auto* child : children_) {
+ DCHECK_EQ(1u, child->children().size());
+ size.SetToMax(child->children().front()->GetMinimumSize());
+ }
+ return size;
+}
+
BubbleDialogModelHost::BubbleDialogModelHost(
std::unique_ptr<ui::DialogModel> model,
View* anchor_view,
@@ -80,7 +172,9 @@ BubbleDialogModelHost::BubbleDialogModelHost(
: BubbleDialogDelegateView(anchor_view, arrow), model_(std::move(model)) {
model_->set_host(GetPassKey(), this);
- ConfigureGridLayout();
+ // Note that between-child spacing is manually handled using kMarginsKey.
+ SetLayoutManager(
+ std::make_unique<BoxLayout>(BoxLayout::Orientation::kVertical));
// Dialog callbacks can safely refer to |model_|, they can't be called after
// Widget::Close() calls WidgetWillClose() synchronously so there shouldn't
@@ -123,23 +217,37 @@ BubbleDialogModelHost::BubbleDialogModelHost(
// OnDialogInitialized() will not work until then.
auto* extra_button = model_->extra_button(GetPassKey());
if (extra_button) {
- OnViewCreatedForField(
- SetExtraView(std::make_unique<MdTextButton>(
- base::BindRepeating(&ui::DialogModelButton::OnPressed,
- base::Unretained(extra_button), GetPassKey()),
- extra_button->label(GetPassKey()))),
- extra_button);
+ SetExtraView(std::make_unique<MdTextButton>(
+ base::BindRepeating(&ui::DialogModelButton::OnPressed,
+ base::Unretained(extra_button), GetPassKey()),
+ extra_button->label(GetPassKey())));
}
SetButtons(button_mask);
SetTitle(model_->title(GetPassKey()));
- SetShowCloseButton(model_->show_close_button(GetPassKey()));
+
+ if (model_->override_show_close_button(GetPassKey())) {
+ SetShowCloseButton(*model_->override_show_close_button(GetPassKey()));
+ } else {
+ SetShowCloseButton(!IsModalDialog());
+ }
+
+ if (!model_->icon(GetPassKey()).IsEmpty()) {
+ // TODO(pbos): Consider adding ImageModel support to SetIcon().
+ SetIcon(model_->icon(GetPassKey()).GetImage().AsImageSkia());
+ SetShowIcon(true);
+ }
+
if (model_->is_alert_dialog(GetPassKey()))
SetAccessibleRole(ax::mojom::Role::kAlertDialog);
set_close_on_deactivate(model_->close_on_deactivate(GetPassKey()));
+ set_fixed_width(LayoutProvider::Get()->GetDistanceMetric(
+ anchor_view ? views::DISTANCE_BUBBLE_PREFERRED_WIDTH
+ : views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH));
+
AddInitialFields();
}
@@ -172,24 +280,27 @@ View* BubbleDialogModelHost::GetInitiallyFocusedView() {
if (!unique_id)
return BubbleDialogDelegateView::GetInitiallyFocusedView();
- return FieldToView(model_->GetFieldByUniqueId(unique_id.value()));
+ return GetTargetView(
+ FindDialogModelHostField(model_->GetFieldByUniqueId(unique_id.value())));
}
void BubbleDialogModelHost::OnDialogInitialized() {
// Dialog buttons are added on dialog initialization.
- if (GetOkButton())
- OnViewCreatedForField(GetOkButton(), model_->ok_button(GetPassKey()));
+ if (GetOkButton()) {
+ AddDialogModelHostFieldForExistingView(
+ {model_->ok_button(GetPassKey()), GetOkButton(), nullptr});
+ }
if (GetCancelButton()) {
- OnViewCreatedForField(GetCancelButton(),
- model_->cancel_button(GetPassKey()));
+ AddDialogModelHostFieldForExistingView(
+ {model_->cancel_button(GetPassKey()), GetCancelButton(), nullptr});
}
-}
-gfx::Size BubbleDialogModelHost::CalculatePreferredSize() const {
- // TODO(pbos): Move DISTANCE_BUBBLE_PREFERRED_WIDTH into views.
- const int width = 320 - margins().width();
- return gfx::Size(width, GetHeightForWidth(width));
+ if (model_->extra_button(GetPassKey())) {
+ DCHECK(GetExtraView());
+ AddDialogModelHostFieldForExistingView(
+ {model_->extra_button(GetPassKey()), GetExtraView(), nullptr});
+ }
}
void BubbleDialogModelHost::Close() {
@@ -198,57 +309,73 @@ void BubbleDialogModelHost::Close() {
GetWidget()->Close();
// Synchronously destroy |model_|. Widget::Close() being asynchronous should
- // not be observable by the model.
+ // not be observable by the model or client code.
// Notify the model of window closing before destroying it (as if
// Widget::Close)
model_->OnWindowClosing(GetPassKey());
- // TODO(pbos): Note that this is in place because GridLayout doesn't handle
- // View removal correctly (keeps stale pointers). This is in place to prevent
- // UAFs between Widget::Close() and destroying |this|.
- // TODO(pbos): This uses a non-nullptr LayoutManager only to prevent infinite
- // recursion in CalculatePreferredSize(). CalculatePreferredSize calls
- // GetHeightForWidth(), which if there is no LayoutManager calls
- // GetPreferredSize(). See https://crbug.com/1128500.
- SetLayoutManager(std::make_unique<GridLayout>());
-
// TODO(pbos): Consider turning this into for-each-field remove field.
RemoveAllChildViews(true);
- field_to_view_.clear();
+ fields_.clear();
model_.reset();
}
void BubbleDialogModelHost::SelectAllText(int unique_id) {
- static_cast<Textfield*>(
- FieldToView(model_->GetTextfieldByUniqueId(unique_id)))
+ const DialogModelHostField& field_view_info =
+ FindDialogModelHostField(model_->GetFieldByUniqueId(unique_id));
+
+ DCHECK(field_view_info.focusable_view);
+ static_cast<views::Textfield*>(field_view_info.focusable_view)
->SelectAll(false);
}
void BubbleDialogModelHost::OnFieldAdded(ui::DialogModelField* field) {
- // TODO(pbos): Add support for adding fields while the model is hosted.
- NOTREACHED();
+ switch (field->type(GetPassKey())) {
+ case ui::DialogModelField::kButton:
+ // TODO(pbos): Add support for buttons that are part of content area.
+ NOTREACHED();
+ return;
+ case ui::DialogModelField::kBodyText:
+ AddOrUpdateBodyText(field->AsBodyText(GetPassKey()));
+ break;
+ case ui::DialogModelField::kCheckbox:
+ AddOrUpdateCheckbox(field->AsCheckbox(GetPassKey()));
+ break;
+ case ui::DialogModelField::kCombobox:
+ AddOrUpdateCombobox(field->AsCombobox(GetPassKey()));
+ break;
+ case ui::DialogModelField::kTextfield:
+ AddOrUpdateTextfield(field->AsTextfield(GetPassKey()));
+ break;
+ }
+ UpdateSpacingAndMargins();
}
void BubbleDialogModelHost::AddInitialFields() {
- // TODO(pbos): Turn this method into consecutive OnFieldAdded(field) calls.
-
DCHECK(children().empty()) << "This should only be called once.";
- bool first_row = true;
const auto& fields = model_->fields(GetPassKey());
+ for (const auto& field : fields)
+ OnFieldAdded(field.get());
+}
+
+void BubbleDialogModelHost::UpdateSpacingAndMargins() {
const DialogContentType first_field_content_type =
- fields.empty()
+ children().empty()
? DialogContentType::CONTROL
- : FieldTypeToContentType(fields.front()->type(GetPassKey()));
+ : FieldTypeToContentType(FindDialogModelHostField(children().front())
+ .dialog_model_field->type(GetPassKey()));
DialogContentType last_field_content_type = first_field_content_type;
- for (const auto& field : fields) {
- // TODO(pbos): This needs to take previous field type + next field type into
- // account to do this properly.
- const DialogContentType field_content_type =
- FieldTypeToContentType(field->type(GetPassKey()));
-
- if (!first_row) {
+ bool first_row = true;
+ for (View* const view : children()) {
+ const DialogContentType field_content_type = FieldTypeToContentType(
+ FindDialogModelHostField(view).dialog_model_field->type(GetPassKey()));
+
+ if (first_row) {
+ first_row = false;
+ view->SetProperty(kMarginsKey, gfx::Insets());
+ } else {
int padding_margin = LayoutProvider::Get()->GetDistanceMetric(
DISTANCE_UNRELATED_CONTROL_VERTICAL);
if (last_field_content_type == DialogContentType::CONTROL &&
@@ -257,39 +384,26 @@ void BubbleDialogModelHost::AddInitialFields() {
// views::LayoutProvider and replace "12" here.
padding_margin = 12;
}
- DCHECK_NE(padding_margin, -1);
- GetGridLayout()->AddPaddingRow(GridLayout::kFixedSize, padding_margin);
+ view->SetProperty(kMarginsKey, gfx::Insets(padding_margin, 0, 0, 0));
}
-
- View* last_view = nullptr;
- switch (field->type(GetPassKey())) {
- case ui::DialogModelField::kButton:
- // TODO(pbos): Add support for buttons that are part of content area.
- continue;
- case ui::DialogModelField::kBodyText:
- last_view = AddOrUpdateBodyText(field->AsBodyText(GetPassKey()));
- break;
- case ui::DialogModelField::kCheckbox:
- last_view = AddOrUpdateCheckbox(field->AsCheckbox(GetPassKey()));
- break;
- case ui::DialogModelField::kCombobox:
- last_view = AddOrUpdateCombobox(field->AsCombobox(GetPassKey()));
- break;
- case ui::DialogModelField::kTextfield:
- last_view = AddOrUpdateTextfield(field->AsTextfield(GetPassKey()));
- break;
- }
-
- DCHECK(last_view);
- OnViewCreatedForField(last_view, field.get());
last_field_content_type = field_content_type;
-
- // TODO(pbos): Update logic here when mixing types.
- first_row = false;
}
-
- set_margins(LayoutProvider::Get()->GetDialogInsetsForContentType(
- first_field_content_type, last_field_content_type));
+ InvalidateLayout();
+
+ gfx::Insets margins = LayoutProvider::Get()->GetDialogInsetsForContentType(
+ first_field_content_type, last_field_content_type);
+ if (!model_->icon(GetPassKey()).IsEmpty()) {
+ // If we have a window icon, inset margins additionally to align with
+ // title label.
+ // TODO(pbos): Reconsider this. Aligning with title gives a massive gap on
+ // the left side of the dialog. This style is from
+ // ExtensionUninstallDialogView as part of refactoring it to use
+ // DialogModel.
+ margins.set_left(
+ margins.left() + model_->icon(GetPassKey()).Size().width() +
+ LayoutProvider::Get()->GetInsetsMetric(INSETS_DIALOG_TITLE).left());
+ }
+ set_margins(margins);
}
void BubbleDialogModelHost::OnWindowClosing() {
@@ -300,185 +414,227 @@ void BubbleDialogModelHost::OnWindowClosing() {
model_->OnWindowClosing(GetPassKey());
}
-GridLayout* BubbleDialogModelHost::GetGridLayout() {
- return static_cast<GridLayout*>(GetLayoutManager());
-}
-
-void BubbleDialogModelHost::ConfigureGridLayout() {
- SetLayoutManager(std::make_unique<GridLayout>());
- LayoutProvider* const provider = LayoutProvider::Get();
-
- // Set up kTextfieldColumnSetId.
- ColumnSet* const textfield_column_set =
- GetGridLayout()->AddColumnSet(kTextfieldColumnSetId);
- textfield_column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER,
- GridLayout::kFixedSize,
- GridLayout::ColumnSize::kUsePreferred, 0, 0);
- textfield_column_set->AddPaddingColumn(
- GridLayout::kFixedSize,
- provider->GetDistanceMetric(DISTANCE_RELATED_CONTROL_HORIZONTAL));
- textfield_column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1.0,
- GridLayout::ColumnSize::kFixed, 0, 0);
-
- // Set up kSingleColumnSetId.
- GetGridLayout()
- ->AddColumnSet(kSingleColumnSetId)
- ->AddColumn(GridLayout::FILL, GridLayout::FILL, 1.0,
- GridLayout::ColumnSize::kUsePreferred, 0, 0);
-}
-
-View* BubbleDialogModelHost::AddOrUpdateBodyText(
- ui::DialogModelBodyText* field) {
+void BubbleDialogModelHost::AddOrUpdateBodyText(
+ ui::DialogModelBodyText* model_field) {
// TODO(pbos): Handle updating existing field.
-
- auto* layout = GetGridLayout();
- layout->StartRow(1.0, kSingleColumnSetId);
-
- return layout->AddView(CreateViewForLabel(field->label(GetPassKey())));
+ std::unique_ptr<View> view =
+ CreateViewForLabel(model_field->label(GetPassKey()));
+ DialogModelHostField info{model_field, view.get(), nullptr};
+ AddDialogModelHostField(std::move(view), info);
}
-View* BubbleDialogModelHost::AddOrUpdateCheckbox(
- ui::DialogModelCheckbox* field) {
+void BubbleDialogModelHost::AddOrUpdateCheckbox(
+ ui::DialogModelCheckbox* model_field) {
// TODO(pbos): Handle updating existing field.
- auto* layout = GetGridLayout();
- layout->StartRow(1.0, kSingleColumnSetId);
-
- auto checkbox = std::make_unique<Checkbox>();
- auto* checkbox_ptr = checkbox.get();
+ std::unique_ptr<CheckboxControl> checkbox;
+ if (DialogModelLabelRequiresStyledLabel(model_field->label(GetPassKey()))) {
+ auto label =
+ CreateStyledLabelForDialogModelLabel(model_field->label(GetPassKey()));
+ const int line_height = label->GetLineHeight();
+ checkbox = std::make_unique<CheckboxControl>(std::move(label), line_height);
+ } else {
+ auto label =
+ CreateLabelForDialogModelLabel(model_field->label(GetPassKey()));
+ const int line_height = label->GetLineHeight();
+ checkbox = std::make_unique<CheckboxControl>(std::move(label), line_height);
+ }
- checkbox->set_callback(base::BindRepeating(
- [](ui::DialogModelCheckbox* model,
+ checkbox->SetCallback(base::BindRepeating(
+ [](ui::DialogModelCheckbox* model_field,
util::PassKey<DialogModelHost> pass_key, Checkbox* checkbox,
const ui::Event& event) {
- model->OnChecked(pass_key, checkbox->GetChecked());
+ model_field->OnChecked(pass_key, checkbox->GetChecked());
},
- field, GetPassKey(), checkbox.get()));
-
- layout->AddView(CreateCheckboxControl(
- std::move(checkbox), CreateViewForLabel(field->label(GetPassKey()))));
+ model_field, GetPassKey(), checkbox.get()));
- return checkbox_ptr;
+ DialogModelHostField info{model_field, checkbox.get(), nullptr};
+ AddDialogModelHostField(std::move(checkbox), info);
}
-View* BubbleDialogModelHost::AddOrUpdateCombobox(
- ui::DialogModelCombobox* model) {
+void BubbleDialogModelHost::AddOrUpdateCombobox(
+ ui::DialogModelCombobox* model_field) {
// TODO(pbos): Handle updating existing field.
- auto combobox = std::make_unique<Combobox>(model->combobox_model());
- combobox->SetAccessibleName(model->accessible_name(GetPassKey()).empty()
- ? model->label(GetPassKey())
- : model->accessible_name(GetPassKey()));
- combobox->set_callback(base::BindRepeating(
- [](ui::DialogModelCombobox* model,
+ auto combobox = std::make_unique<Combobox>(model_field->combobox_model());
+ combobox->SetAccessibleName(model_field->accessible_name(GetPassKey()).empty()
+ ? model_field->label(GetPassKey())
+ : model_field->accessible_name(GetPassKey()));
+ combobox->SetCallback(base::BindRepeating(
+ [](ui::DialogModelCombobox* model_field,
util::PassKey<DialogModelHost> pass_key, Combobox* combobox) {
// TODO(pbos): This should be a subscription through the Combobox
// directly, but Combobox right now doesn't support listening to
// selected-index changes.
- model->OnSelectedIndexChanged(pass_key, combobox->GetSelectedIndex());
- model->OnPerformAction(pass_key);
+ model_field->OnSelectedIndexChanged(pass_key,
+ combobox->GetSelectedIndex());
+ model_field->OnPerformAction(pass_key);
},
- model, GetPassKey(), combobox.get()));
+ model_field, GetPassKey(), combobox.get()));
// TODO(pbos): Add subscription to combobox selected-index changes.
- combobox->SetSelectedIndex(model->selected_index());
- auto* combobox_ptr = combobox.get();
- AddLabelAndField(model->label(GetPassKey()), std::move(combobox),
- combobox_ptr->GetFontList());
- return combobox_ptr;
+ combobox->SetSelectedIndex(model_field->selected_index());
+ const gfx::FontList& font_list = combobox->GetFontList();
+ AddViewForLabelAndField(model_field, model_field->label(GetPassKey()),
+ std::move(combobox), font_list);
}
-View* BubbleDialogModelHost::AddOrUpdateTextfield(
- ui::DialogModelTextfield* model) {
+void BubbleDialogModelHost::AddOrUpdateTextfield(
+ ui::DialogModelTextfield* model_field) {
// TODO(pbos): Support updates to the existing model.
auto textfield = std::make_unique<Textfield>();
- textfield->SetAccessibleName(model->accessible_name(GetPassKey()).empty()
- ? model->label(GetPassKey())
- : model->accessible_name(GetPassKey()));
- textfield->SetText(model->text());
+ textfield->SetAccessibleName(
+ model_field->accessible_name(GetPassKey()).empty()
+ ? model_field->label(GetPassKey())
+ : model_field->accessible_name(GetPassKey()));
+ textfield->SetText(model_field->text());
property_changed_subscriptions_.push_back(
textfield->AddTextChangedCallback(base::BindRepeating(
- [](ui::DialogModelTextfield* model,
+ [](ui::DialogModelTextfield* model_field,
util::PassKey<DialogModelHost> pass_key, Textfield* textfield) {
- model->OnTextChanged(pass_key, textfield->GetText());
+ model_field->OnTextChanged(pass_key, textfield->GetText());
},
- model, GetPassKey(), textfield.get())));
+ model_field, GetPassKey(), textfield.get())));
+
+ const gfx::FontList& font_list = textfield->GetFontList();
+ AddViewForLabelAndField(model_field, model_field->label(GetPassKey()),
+ std::move(textfield), font_list);
+}
+
+void BubbleDialogModelHost::AddViewForLabelAndField(
+ ui::DialogModelField* model_field,
+ const base::string16& label_text,
+ std::unique_ptr<View> field,
+ const gfx::FontList& field_font) {
+ auto box_layout = std::make_unique<BoxLayoutView>();
+
+ box_layout->SetBetweenChildSpacing(LayoutProvider::Get()->GetDistanceMetric(
+ DISTANCE_RELATED_CONTROL_HORIZONTAL));
- auto* textfield_ptr = textfield.get();
- AddLabelAndField(model->label(GetPassKey()), std::move(textfield),
- textfield_ptr->GetFontList());
+ DialogModelHostField info{model_field, box_layout.get(), field.get()};
- return textfield_ptr;
+ auto label = std::make_unique<Label>(label_text, style::CONTEXT_LABEL,
+ style::STYLE_PRIMARY);
+ label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+
+ box_layout->AddChildView(std::make_unique<LayoutConsensusView>(
+ &textfield_first_column_group_, std::move(label)));
+ box_layout->SetFlexForView(
+ box_layout->AddChildView(std::make_unique<LayoutConsensusView>(
+ &textfield_second_column_group_, std::move(field))),
+ 1);
+
+ AddDialogModelHostField(std::move(box_layout), info);
}
-void BubbleDialogModelHost::AddLabelAndField(const base::string16& label_text,
- std::unique_ptr<View> field,
- const gfx::FontList& field_font) {
- constexpr int kFontContext = style::CONTEXT_LABEL;
- constexpr int kFontStyle = style::STYLE_PRIMARY;
+void BubbleDialogModelHost::AddDialogModelHostField(
+ std::unique_ptr<View> view,
+ const DialogModelHostField& field_view_info) {
+ DCHECK_EQ(view.get(), field_view_info.field_view);
- int row_height = LayoutProvider::GetControlHeightForFont(
- kFontContext, kFontStyle, field_font);
- GridLayout* const layout = GetGridLayout();
- layout->StartRow(GridLayout::kFixedSize, kTextfieldColumnSetId, row_height);
- layout->AddView(
- std::make_unique<Label>(label_text, kFontContext, kFontStyle));
- layout->AddView(std::move(field));
+ AddChildView(std::move(view));
+ AddDialogModelHostFieldForExistingView(field_view_info);
}
-void BubbleDialogModelHost::OnViewCreatedForField(View* view,
- ui::DialogModelField* field) {
+void BubbleDialogModelHost::AddDialogModelHostFieldForExistingView(
+ const DialogModelHostField& field_view_info) {
+ DCHECK(field_view_info.dialog_model_field);
+ DCHECK(field_view_info.field_view);
+ DCHECK(Contains(field_view_info.field_view) ||
+ field_view_info.field_view == GetOkButton() ||
+ field_view_info.field_view == GetCancelButton() ||
+ field_view_info.field_view == GetExtraView());
#if DCHECK_IS_ON()
- // Make sure neither view nor field has been previously used.
- for (const auto& kv : field_to_view_) {
- DCHECK_NE(kv.first, field);
- DCHECK_NE(kv.second, view);
+ // Make sure none of the info is already in use.
+ for (const auto& info : fields_) {
+ DCHECK_NE(info.field_view, field_view_info.field_view);
+ DCHECK_NE(info.dialog_model_field, field_view_info.dialog_model_field);
+ if (info.focusable_view)
+ DCHECK_NE(info.focusable_view, field_view_info.focusable_view);
}
#endif // DCHECK_IS_ON()
- field_to_view_[field] = view;
- for (const auto& accelerator : field->accelerators(GetPassKey()))
- view->AddAccelerator(accelerator);
+ fields_.push_back(field_view_info);
+ View* const target = GetTargetView(field_view_info);
+ for (const auto& accelerator :
+ field_view_info.dialog_model_field->accelerators(GetPassKey())) {
+ target->AddAccelerator(accelerator);
+ }
+}
+
+BubbleDialogModelHost::DialogModelHostField
+BubbleDialogModelHost::FindDialogModelHostField(ui::DialogModelField* field) {
+ for (const auto& info : fields_) {
+ if (info.dialog_model_field == field)
+ return info;
+ }
+ NOTREACHED();
+ return {};
+}
+
+BubbleDialogModelHost::DialogModelHostField
+BubbleDialogModelHost::FindDialogModelHostField(View* view) {
+ for (const auto& info : fields_) {
+ if (info.field_view == view)
+ return info;
+ }
+ NOTREACHED();
+ return {};
}
-View* BubbleDialogModelHost::FieldToView(ui::DialogModelField* field) {
- DCHECK(field);
- DCHECK(field_to_view_[field]);
- return field_to_view_[field];
+View* BubbleDialogModelHost::GetTargetView(
+ const DialogModelHostField& field_view_info) {
+ return field_view_info.focusable_view ? field_view_info.focusable_view
+ : field_view_info.field_view;
+}
+
+bool BubbleDialogModelHost::DialogModelLabelRequiresStyledLabel(
+ const ui::DialogModelLabel& dialog_label) {
+ // Link support only exists in StyledLabel.
+ return !dialog_label.links(GetPassKey()).empty();
}
std::unique_ptr<View> BubbleDialogModelHost::CreateViewForLabel(
const ui::DialogModelLabel& dialog_label) {
- if (!dialog_label.links(GetPassKey()).empty()) {
- // Label contains links so it needs a styled label.
-
- // TODO(pbos): Make sure this works for >1 link, it uses .front() now.
- DCHECK_EQ(dialog_label.links(GetPassKey()).size(), 1u);
-
- size_t offset;
- const base::string16 link_text = l10n_util::GetStringUTF16(
- dialog_label.links(GetPassKey()).front().message_id);
- const base::string16 text = l10n_util::GetStringFUTF16(
- dialog_label.message_id(GetPassKey()), link_text, &offset);
-
- auto styled_label = std::make_unique<StyledLabel>();
- styled_label->SetText(text);
- styled_label->AddStyleRange(
- gfx::Range(offset, offset + link_text.length()),
- StyledLabel::RangeStyleInfo::CreateForLink(
- dialog_label.links(GetPassKey()).front().callback));
-
- styled_label->SetDefaultTextStyle(dialog_label.is_secondary(GetPassKey())
- ? style::STYLE_SECONDARY
- : style::STYLE_PRIMARY);
-
- return styled_label;
- }
+ if (DialogModelLabelRequiresStyledLabel(dialog_label))
+ return CreateStyledLabelForDialogModelLabel(dialog_label);
+ return CreateLabelForDialogModelLabel(dialog_label);
+}
+
+std::unique_ptr<StyledLabel>
+BubbleDialogModelHost::CreateStyledLabelForDialogModelLabel(
+ const ui::DialogModelLabel& dialog_label) {
+ DCHECK(DialogModelLabelRequiresStyledLabel(dialog_label));
+ // TODO(pbos): Make sure this works for >1 link, it uses .front() now.
+ DCHECK_EQ(dialog_label.links(GetPassKey()).size(), 1u);
+
+ size_t offset;
+ const base::string16 link_text = l10n_util::GetStringUTF16(
+ dialog_label.links(GetPassKey()).front().message_id);
+ const base::string16 text = l10n_util::GetStringFUTF16(
+ dialog_label.message_id(GetPassKey()), link_text, &offset);
+
+ auto styled_label = std::make_unique<StyledLabel>();
+ styled_label->SetText(text);
+ styled_label->AddStyleRange(
+ gfx::Range(offset, offset + link_text.length()),
+ StyledLabel::RangeStyleInfo::CreateForLink(
+ dialog_label.links(GetPassKey()).front().callback));
+
+ styled_label->SetDefaultTextStyle(dialog_label.is_secondary(GetPassKey())
+ ? style::STYLE_SECONDARY
+ : style::STYLE_PRIMARY);
+
+ return styled_label;
+}
+
+std::unique_ptr<Label> BubbleDialogModelHost::CreateLabelForDialogModelLabel(
+ const ui::DialogModelLabel& dialog_label) {
+ DCHECK(!DialogModelLabelRequiresStyledLabel(dialog_label));
auto text_label = std::make_unique<Label>(
- l10n_util::GetStringUTF16(dialog_label.message_id(GetPassKey())),
- style::CONTEXT_DIALOG_BODY_TEXT,
+ dialog_label.GetString(GetPassKey()), style::CONTEXT_DIALOG_BODY_TEXT,
dialog_label.is_secondary(GetPassKey()) ? style::STYLE_SECONDARY
: style::STYLE_PRIMARY);
text_label->SetMultiLine(true);
@@ -486,6 +642,10 @@ std::unique_ptr<View> BubbleDialogModelHost::CreateViewForLabel(
return text_label;
}
+bool BubbleDialogModelHost::IsModalDialog() const {
+ return GetModalType() != ui::MODAL_TYPE_NONE;
+}
+
BEGIN_METADATA(BubbleDialogModelHost, BubbleDialogDelegateView)
END_METADATA
diff --git a/chromium/ui/views/bubble/bubble_dialog_model_host.h b/chromium/ui/views/bubble/bubble_dialog_model_host.h
index 912092e9dae..5dd3e942a63 100644
--- a/chromium/ui/views/bubble/bubble_dialog_model_host.h
+++ b/chromium/ui/views/bubble/bubble_dialog_model_host.h
@@ -14,7 +14,9 @@
#include "ui/views/controls/button/button.h"
namespace views {
-class GridLayout;
+
+class Label;
+class StyledLabel;
// BubbleDialogModelHost is a views implementation of ui::DialogModelHost which
// hosts a ui::DialogModel as a BubbleDialogDelegateView. This exposes such as
@@ -46,7 +48,6 @@ class VIEWS_EXPORT BubbleDialogModelHost : public BubbleDialogDelegateView,
// GetInitiallyFocusedView().
View* GetInitiallyFocusedView() override;
void OnDialogInitialized() override;
- gfx::Size CalculatePreferredSize() const override;
// ui::DialogModelHost:
void Close() override;
@@ -54,30 +55,87 @@ class VIEWS_EXPORT BubbleDialogModelHost : public BubbleDialogDelegateView,
void OnFieldAdded(ui::DialogModelField* field) override;
private:
- void OnWindowClosing();
+ // TODO(pbos): Consider externalizing this functionality into a different
+ // format that could feasibly be adopted by LayoutManagers. This is used for
+ // BoxLayouts (but could be others) to agree on columns' preferred width as a
+ // replacement for using GridLayout.
+ class LayoutConsensusView;
+ class LayoutConsensusGroup {
+ public:
+ LayoutConsensusGroup();
+ ~LayoutConsensusGroup();
+
+ void AddView(LayoutConsensusView* view);
+ void RemoveView(LayoutConsensusView* view);
+
+ void InvalidateChildren();
+
+ // Get the union of all preferred sizes within the group.
+ gfx::Size GetMaxPreferredSize() const;
- GridLayout* GetGridLayout();
- void ConfigureGridLayout();
+ // Get the union of all minimum sizes within the group.
+ gfx::Size GetMaxMinimumSize() const;
+
+ private:
+ base::flat_set<View*> children_;
+ };
+
+ struct DialogModelHostField {
+ ui::DialogModelField* dialog_model_field;
+
+ // View representing the entire field.
+ View* field_view;
+
+ // Child view to |field_view|, if any, that's used for focus. For instance,
+ // a textfield row would be a container that contains both a
+ // views::Textfield and a descriptive label. In this case |focusable_view|
+ // would refer to the views::Textfield which is also what would gain focus.
+ View* focusable_view;
+ };
+
+ void OnWindowClosing();
void AddInitialFields();
- View* AddOrUpdateBodyText(ui::DialogModelBodyText* field);
- View* AddOrUpdateCheckbox(ui::DialogModelCheckbox* field);
- View* AddOrUpdateCombobox(ui::DialogModelCombobox* field);
- View* AddOrUpdateTextfield(ui::DialogModelTextfield* field);
- void AddLabelAndField(const base::string16& label_text,
- std::unique_ptr<views::View> field,
- const gfx::FontList& field_font);
+ void AddOrUpdateBodyText(ui::DialogModelBodyText* model_field);
+ void AddOrUpdateCheckbox(ui::DialogModelCheckbox* model_field);
+ void AddOrUpdateCombobox(ui::DialogModelCombobox* model_field);
+ void AddOrUpdateTextfield(ui::DialogModelTextfield* model_field);
+
+ void UpdateSpacingAndMargins();
+
+ void AddViewForLabelAndField(ui::DialogModelField* model_field,
+ const base::string16& label_text,
+ std::unique_ptr<views::View> field,
+ const gfx::FontList& field_font);
+ static bool DialogModelLabelRequiresStyledLabel(
+ const ui::DialogModelLabel& dialog_label);
std::unique_ptr<View> CreateViewForLabel(
const ui::DialogModelLabel& dialog_label);
+ std::unique_ptr<StyledLabel> CreateStyledLabelForDialogModelLabel(
+ const ui::DialogModelLabel& dialog_label);
+ std::unique_ptr<Label> CreateLabelForDialogModelLabel(
+ const ui::DialogModelLabel& dialog_label);
+
+ void AddDialogModelHostField(std::unique_ptr<View> view,
+ const DialogModelHostField& field_view_info);
+ void AddDialogModelHostFieldForExistingView(
+ const DialogModelHostField& field_view_info);
- void OnViewCreatedForField(View* view, ui::DialogModelField* field);
+ DialogModelHostField FindDialogModelHostField(
+ ui::DialogModelField* model_field);
+ DialogModelHostField FindDialogModelHostField(View* view);
- View* FieldToView(ui::DialogModelField* field);
+ static View* GetTargetView(const DialogModelHostField& field_view_info);
+
+ bool IsModalDialog() const;
std::unique_ptr<ui::DialogModel> model_;
- base::flat_map<ui::DialogModelField*, View*> field_to_view_;
+ std::vector<DialogModelHostField> fields_;
std::vector<PropertyChangedSubscription> property_changed_subscriptions_;
+
+ LayoutConsensusGroup textfield_first_column_group_;
+ LayoutConsensusGroup textfield_second_column_group_;
};
} // namespace views
diff --git a/chromium/ui/views/bubble/bubble_dialog_model_host_unittest.cc b/chromium/ui/views/bubble/bubble_dialog_model_host_unittest.cc
index 0d593dbd3b3..1c3da37f990 100644
--- a/chromium/ui/views/bubble/bubble_dialog_model_host_unittest.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_model_host_unittest.cc
@@ -19,48 +19,33 @@ using BubbleDialogModelHostTest = ViewsTestBase;
// check its compliance.
namespace {
-// TODO(pbos): Consider moving this to a non-views testutil location. This is
-// likely usable without/outside views (even if the test suite doesn't move).
-class TestModelDelegate : public ui::DialogModelDelegate {
+// WeakPtrs to this delegate is used to infer when DialogModel is destroyed.
+class WeakDialogModelDelegate : public ui::DialogModelDelegate {
public:
- struct Stats {
- int window_closing_count = 0;
- };
-
- explicit TestModelDelegate(Stats* stats) : stats_(stats) {}
-
- base::WeakPtr<TestModelDelegate> GetWeakPtr() {
+ base::WeakPtr<WeakDialogModelDelegate> GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
- static std::unique_ptr<ui::DialogModel> BuildModel(
- std::unique_ptr<TestModelDelegate> delegate) {
- auto* delegate_ptr = delegate.get();
- return ui::DialogModel::Builder(std::move(delegate))
- .SetWindowClosingCallback(
- base::BindOnce(&TestModelDelegate::OnWindowClosing,
- base::Unretained(delegate_ptr)))
- .Build();
- }
-
- void OnWindowClosing() { ++stats_->window_closing_count; }
-
private:
- Stats* const stats_;
- base::WeakPtrFactory<TestModelDelegate> weak_ptr_factory_{this};
+ base::WeakPtrFactory<WeakDialogModelDelegate> weak_ptr_factory_{this};
};
+
} // namespace
TEST_F(BubbleDialogModelHostTest, CloseIsSynchronousAndCallsWindowClosing) {
std::unique_ptr<Widget> anchor_widget =
CreateTestWidget(Widget::InitParams::TYPE_WINDOW);
- TestModelDelegate::Stats stats;
- auto delegate = std::make_unique<TestModelDelegate>(&stats);
+ auto delegate = std::make_unique<WeakDialogModelDelegate>();
auto weak_delegate = delegate->GetWeakPtr();
+ int window_closing_count = 0;
auto host = std::make_unique<BubbleDialogModelHost>(
- TestModelDelegate::BuildModel(std::move(delegate)),
+ ui::DialogModel::Builder(std::move(delegate))
+ .SetWindowClosingCallback(base::BindOnce(base::BindOnce(
+ [](int* window_closing_count) { ++(*window_closing_count); },
+ &window_closing_count)))
+ .Build(),
anchor_widget->GetContentsView(), BubbleBorder::Arrow::TOP_RIGHT);
auto* host_ptr = host.get();
@@ -68,10 +53,10 @@ TEST_F(BubbleDialogModelHostTest, CloseIsSynchronousAndCallsWindowClosing) {
BubbleDialogDelegateView::CreateBubble(host.release());
test::WidgetDestroyedWaiter waiter(bubble_widget);
- EXPECT_EQ(0, stats.window_closing_count);
+ EXPECT_EQ(0, window_closing_count);
DCHECK_EQ(host_ptr, weak_delegate->dialog_model()->host());
weak_delegate->dialog_model()->host()->Close();
- EXPECT_EQ(1, stats.window_closing_count);
+ EXPECT_EQ(1, window_closing_count);
// The model (and hence delegate) should destroy synchronously, so the
// WeakPtr should disappear before waiting for the views Widget to close.
diff --git a/chromium/ui/views/bubble/bubble_frame_view.cc b/chromium/ui/views/bubble/bubble_frame_view.cc
index 7399ae7c9b8..a2c8fc5745b 100644
--- a/chromium/ui/views/bubble/bubble_frame_view.cc
+++ b/chromium/ui/views/bubble/bubble_frame_view.cc
@@ -7,7 +7,6 @@
#include <algorithm>
#include <utility>
-#include "base/feature_list.h"
#include "build/build_config.h"
#include "components/vector_icons/vector_icons.h"
#include "third_party/skia/include/core/SkPath.h"
@@ -36,7 +35,6 @@
#include "ui/views/paint_info.h"
#include "ui/views/resources/grit/views_resources.h"
#include "ui/views/view_class_properties.h"
-#include "ui/views/views_features.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
#include "ui/views/window/client_view.h"
@@ -91,7 +89,14 @@ BubbleFrameView::BubbleFrameView(const gfx::Insets& title_margins,
default_title_->SetVisible(false);
AddChildView(default_title_);
- auto close = CreateCloseButton(this);
+ auto close = CreateCloseButton(base::BindRepeating(
+ [](BubbleFrameView* view, const ui::Event& event) {
+ if (view->input_protector_.IsPossiblyUnintendedInteraction(event))
+ return;
+ view->GetWidget()->CloseWithReason(
+ Widget::ClosedReason::kCloseButtonClicked);
+ },
+ this));
close->SetVisible(false);
#if defined(OS_WIN)
// Windows will automatically create a tooltip for the close button based on
@@ -102,7 +107,13 @@ BubbleFrameView::BubbleFrameView(const gfx::Insets& title_margins,
#endif
close_ = AddChildView(std::move(close));
- auto minimize = CreateMinimizeButton(this);
+ auto minimize = CreateMinimizeButton(base::BindRepeating(
+ [](BubbleFrameView* view, const ui::Event& event) {
+ if (view->input_protector_.IsPossiblyUnintendedInteraction(event))
+ return;
+ view->GetWidget()->Minimize();
+ },
+ this));
minimize->SetVisible(false);
#if defined(OS_WIN)
minimize->SetTooltipText(base::string16());
@@ -132,12 +143,11 @@ std::unique_ptr<Label> BubbleFrameView::CreateDefaultTitleLabel(
// static
std::unique_ptr<Button> BubbleFrameView::CreateCloseButton(
- ButtonListener* listener) {
+ Button::PressedCallback callback) {
auto close_button = CreateVectorImageButtonWithNativeTheme(
- listener, vector_icons::kCloseRoundedIcon);
+ std::move(callback), vector_icons::kCloseRoundedIcon);
close_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_APP_CLOSE));
close_button->SizeToPreferredSize();
- close_button->SetFocusForPlatform();
InstallCircleHighlightPathGenerator(close_button.get());
@@ -146,13 +156,12 @@ std::unique_ptr<Button> BubbleFrameView::CreateCloseButton(
// static
std::unique_ptr<Button> BubbleFrameView::CreateMinimizeButton(
- ButtonListener* listener) {
+ Button::PressedCallback callback) {
auto minimize_button = CreateVectorImageButtonWithNativeTheme(
- listener, kWindowControlMinimizeIcon);
+ std::move(callback), kWindowControlMinimizeIcon);
minimize_button->SetTooltipText(
l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MINIMIZE));
minimize_button->SizeToPreferredSize();
- minimize_button->SetFocusForPlatform();
InstallCircleHighlightPathGenerator(minimize_button.get());
@@ -187,12 +196,9 @@ bool BubbleFrameView::GetClientMask(const gfx::Size& size, SkPath* path) const {
// BubbleFrameView only returns a SkPath for the purpose of clipping the
// client view's corners so that it fits within the borders of its rounded
- // frame. With MD rounded coners if a client view is painted to a layer the
- // rounding is handled by the |SetRoundedCornerRadius()| layer API, so we
- // return false here.
- if (base::FeatureList::IsEnabled(
- features::kEnableMDRoundedCornersOnDialogs) &&
- GetWidget()->client_view()->layer()) {
+ // frame. If a client view is painted to a layer the rounding is handled by
+ // the |SetRoundedCornerRadius()| layer API, so we return false here.
+ if (GetWidget()->client_view()->layer()) {
return false;
}
@@ -504,17 +510,6 @@ void BubbleFrameView::PaintChildren(const PaintInfo& paint_info) {
OnPaintBorder(recorder.canvas());
}
-void BubbleFrameView::ButtonPressed(Button* sender, const ui::Event& event) {
- if (input_protector_.IsPossiblyUnintendedInteraction(event))
- return;
-
- if (sender == close_) {
- GetWidget()->CloseWithReason(Widget::ClosedReason::kCloseButtonClicked);
- } else if (sender == minimize_) {
- GetWidget()->Minimize();
- }
-}
-
void BubbleFrameView::SetBubbleBorder(std::unique_ptr<BubbleBorder> border) {
bubble_border_ = border.get();
@@ -583,8 +578,6 @@ SkColor BubbleFrameView::GetBackgroundColor() const {
}
void BubbleFrameView::UpdateClientViewBackground() {
- if (!base::FeatureList::IsEnabled(features::kEnableMDRoundedCornersOnDialogs))
- return;
DCHECK(GetWidget());
DCHECK(GetWidget()->client_view());
@@ -884,9 +877,10 @@ int BubbleFrameView::GetHeaderHeightForFrameWidth(int frame_width) const {
}
void BubbleFrameView::UpdateClientLayerCornerRadius() {
- if (GetWidget() && GetWidget()->client_view()->layer() &&
- base::FeatureList::IsEnabled(
- features::kEnableMDRoundedCornersOnDialogs)) {
+ // If the ClientView is painted to a layer we need to apply the appropriate
+ // corner radius so that the ClientView and all its child layers are masked
+ // appropriately to fit within the BubbleFrameView.
+ if (GetWidget() && GetWidget()->client_view()->layer()) {
GetWidget()->client_view()->layer()->SetRoundedCornerRadius(
GetClientCornerRadii());
}
diff --git a/chromium/ui/views/bubble/bubble_frame_view.h b/chromium/ui/views/bubble/bubble_frame_view.h
index 117f032e858..f4c770331d9 100644
--- a/chromium/ui/views/bubble/bubble_frame_view.h
+++ b/chromium/ui/views/bubble/bubble_frame_view.h
@@ -30,8 +30,7 @@ class FootnoteContainerView;
class ImageView;
// The non-client frame view of bubble-styled widgets.
-class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView,
- public ButtonListener {
+class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView {
public:
enum class PreferredArrowAdjustment { kMirror, kOffset };
@@ -46,10 +45,12 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView,
const base::string16& title_text);
// Creates a close button used in the corner of the dialog.
- static std::unique_ptr<Button> CreateCloseButton(ButtonListener* listener);
+ static std::unique_ptr<Button> CreateCloseButton(
+ Button::PressedCallback callback);
// Creates a minimize button used in the corner of the dialog.
- static std::unique_ptr<Button> CreateMinimizeButton(ButtonListener* listener);
+ static std::unique_ptr<Button> CreateMinimizeButton(
+ Button::PressedCallback callback);
// NonClientFrameView:
gfx::Rect GetBoundsForClientView() const override;
@@ -84,9 +85,6 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView,
const ViewHierarchyChangedDetails& details) override;
void VisibilityChanged(View* starting_from, bool is_visible) override;
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
// Use SetBubbleBorder() not SetBorder().
void SetBubbleBorder(std::unique_ptr<BubbleBorder> border);
@@ -119,6 +117,9 @@ class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView,
footnote_margins_ = footnote_margins;
}
+ PreferredArrowAdjustment preferred_arrow_adjustment() const {
+ return preferred_arrow_adjustment_;
+ }
void set_preferred_arrow_adjustment(PreferredArrowAdjustment adjustment) {
preferred_arrow_adjustment_ = adjustment;
}
diff --git a/chromium/ui/views/bubble/bubble_frame_view_unittest.cc b/chromium/ui/views/bubble/bubble_frame_view_unittest.cc
index e9bac53b87d..91ada18f5e3 100644
--- a/chromium/ui/views/bubble/bubble_frame_view_unittest.cc
+++ b/chromium/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -23,6 +23,7 @@
#include "ui/views/bubble/footnote_container_view.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/metrics.h"
+#include "ui/views/test/button_test_api.h"
#include "ui/views/test/test_layout_provider.h"
#include "ui/views/test/test_views.h"
#include "ui/views/test/views_test_base.h"
@@ -1242,18 +1243,18 @@ TEST_F(BubbleFrameViewTest, IgnorePossiblyUnintendedClicksClose) {
bubble->Show();
BubbleFrameView* frame = delegate.GetBubbleFrameView();
- frame->ButtonPressed(
- frame->close_,
- ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE));
+ test::ButtonTestApi(frame->close_)
+ .NotifyClick(ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(),
+ gfx::Point(), ui::EventTimeForNow(),
+ ui::EF_NONE, ui::EF_NONE));
EXPECT_FALSE(bubble->IsClosed());
- frame->ButtonPressed(
- frame->close_,
- ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow() + base::TimeDelta::FromMilliseconds(
- GetDoubleClickInterval()),
- ui::EF_NONE, ui::EF_NONE));
+ test::ButtonTestApi(frame->close_)
+ .NotifyClick(ui::MouseEvent(
+ ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+ ui::EventTimeForNow() +
+ base::TimeDelta::FromMilliseconds(GetDoubleClickInterval()),
+ ui::EF_NONE, ui::EF_NONE));
EXPECT_TRUE(bubble->IsClosed());
}
@@ -1267,18 +1268,18 @@ TEST_F(BubbleFrameViewTest, IgnorePossiblyUnintendedClicksMinimize) {
bubble->Show();
BubbleFrameView* frame = delegate.GetBubbleFrameView();
- frame->ButtonPressed(
- frame->minimize_,
- ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE));
+ test::ButtonTestApi(frame->minimize_)
+ .NotifyClick(ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(),
+ gfx::Point(), ui::EventTimeForNow(),
+ ui::EF_NONE, ui::EF_NONE));
EXPECT_FALSE(bubble->IsClosed());
- frame->ButtonPressed(
- frame->minimize_,
- ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow() + base::TimeDelta::FromMilliseconds(
- GetDoubleClickInterval()),
- ui::EF_NONE, ui::EF_NONE));
+ test::ButtonTestApi(frame->minimize_)
+ .NotifyClick(ui::MouseEvent(
+ ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+ ui::EventTimeForNow() +
+ base::TimeDelta::FromMilliseconds(GetDoubleClickInterval()),
+ ui::EF_NONE, ui::EF_NONE));
EXPECT_TRUE(bubble->IsMinimized());
}
diff --git a/chromium/ui/views/bubble/footnote_container_view.cc b/chromium/ui/views/bubble/footnote_container_view.cc
index 7f321e46721..4c4f2c548d6 100644
--- a/chromium/ui/views/bubble/footnote_container_view.cc
+++ b/chromium/ui/views/bubble/footnote_container_view.cc
@@ -15,6 +15,7 @@
#include "ui/views/background.h"
#include "ui/views/border.h"
#include "ui/views/layout/box_layout.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
diff --git a/chromium/ui/views/bubble/info_bubble.cc b/chromium/ui/views/bubble/info_bubble.cc
index b0a6701f8f3..76ffbef1262 100644
--- a/chromium/ui/views/bubble/info_bubble.cc
+++ b/chromium/ui/views/bubble/info_bubble.cc
@@ -15,6 +15,7 @@
#include "ui/views/controls/label.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/layout/layout_provider.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/widget/widget.h"
namespace views {
diff --git a/chromium/ui/views/bubble/tooltip_icon.cc b/chromium/ui/views/bubble/tooltip_icon.cc
index c1625ec5b1a..fa42d321126 100644
--- a/chromium/ui/views/bubble/tooltip_icon.cc
+++ b/chromium/ui/views/bubble/tooltip_icon.cc
@@ -11,6 +11,7 @@
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/bubble/bubble_frame_view.h"
#include "ui/views/bubble/info_bubble.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/mouse_watcher_view_host.h"
namespace views {
diff --git a/chromium/ui/views/button_drag_utils.cc b/chromium/ui/views/button_drag_utils.cc
index d462452c1a3..ca50afc36f4 100644
--- a/chromium/ui/views/button_drag_utils.cc
+++ b/chromium/ui/views/button_drag_utils.cc
@@ -48,7 +48,8 @@ void SetDragImage(const GURL& url,
ui::OSExchangeData* data) {
// Create a button to render the drag image for us.
views::LabelButton button(
- nullptr, title.empty() ? base::UTF8ToUTF16(url.spec()) : title);
+ views::Button::PressedCallback(),
+ title.empty() ? base::UTF8ToUTF16(url.spec()) : title);
button.SetTextSubpixelRenderingEnabled(false);
const ui::NativeTheme* theme = widget.GetNativeTheme();
button.SetTextColor(
diff --git a/chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm b/chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
index 21c047bd9c0..08bdeb1fe8f 100644
--- a/chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
+++ b/chromium/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
@@ -21,23 +21,6 @@
namespace views {
namespace test {
-namespace {
-
-// Provide a resizable Widget by default. Starting in 10.11, OSX doesn't
-// correctly restore the window size when coming out of fullscreen if the window
-// is not user-sizable.
-class ResizableDelegateView : public WidgetDelegateView {
- public:
- ResizableDelegateView() = default;
-
- // WidgetDelgate:
- bool CanResize() const override { return true; }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ResizableDelegateView);
-};
-
-} // namespace
class BridgedNativeWidgetUITest : public WidgetTest {
public:
@@ -52,7 +35,14 @@ class BridgedNativeWidgetUITest : public WidgetTest {
CreateParams(Widget::InitParams::TYPE_WINDOW);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.bounds = gfx::Rect(100, 100, 300, 200);
- init_params.delegate = new ResizableDelegateView;
+ init_params.delegate = new views::WidgetDelegate;
+ init_params.delegate->SetOwnedByWidget(true);
+
+ // Provide a resizable Widget by default. Starting in 10.11, OSX doesn't
+ // correctly restore the window size when coming out of fullscreen if the
+ // window is not user-sizable.
+ init_params.delegate->SetCanResize(true);
+
widget_ = std::make_unique<Widget>();
widget_->Init(std::move(init_params));
}
diff --git a/chromium/ui/views/cocoa/bridged_native_widget_unittest.mm b/chromium/ui/views/cocoa/bridged_native_widget_unittest.mm
index 6df4eecb8c2..38c4c39f776 100644
--- a/chromium/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/chromium/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -1599,6 +1599,92 @@ TEST_F(BridgedNativeWidgetTest, TextInput_SimulateTelexMoo) {
EXPECT_EQ(1, enter_view->count()); // Now we see the accelerator.
}
+// Simulate 'a' and candidate selection keys. This should just insert "啊",
+// suppressing accelerators.
+TEST_F(BridgedNativeWidgetTest, TextInput_NoAcceleratorPinyinSelectWord) {
+ Textfield* textfield = InstallTextField("");
+ EXPECT_TRUE([ns_view_ textInputClient]);
+
+ EnterAcceleratorView* enter_view = new EnterAcceleratorView();
+ textfield->parent()->AddChildView(enter_view);
+
+ // Sequence of calls (and corresponding keyDown events) obtained via tracing
+ // with Pinyin IME and pressing 'a', Tab, PageDown, PageUp, Right, Down, Left,
+ // and finally Up on the keyboard.
+ // Note 0 is the actual keyCode for 'a', not a placeholder.
+ NSEvent* a_in_ime = UnicodeKeyDown(0, @"a");
+ InterpretKeyEventsCallback handle_a_in_ime = base::BindRepeating([](id view) {
+ // Pinyin does not change composition text while selecting candidate words.
+ [view setMarkedText:@"a"
+ selectedRange:NSMakeRange(1, 0)
+ replacementRange:NSMakeRange(NSNotFound, 0)];
+ });
+
+ InterpretKeyEventsCallback handle_tab_in_ime =
+ base::BindRepeating([](id view) {
+ [view setMarkedText:@"ā"
+ selectedRange:NSMakeRange(0, 1)
+ replacementRange:NSMakeRange(NSNotFound, 0)];
+ });
+
+ // Composition text will not change in candidate selection.
+ InterpretKeyEventsCallback handle_candidate_select_in_ime =
+ base::BindRepeating([](id view) {});
+
+ InterpretKeyEventsCallback handle_space_in_ime =
+ base::BindRepeating([](id view) {
+ // Space will confirm the composition.
+ [view insertText:@"啊" replacementRange:NSMakeRange(NSNotFound, 0)];
+ });
+
+ InterpretKeyEventsCallback handle_enter_in_ime =
+ base::BindRepeating([](id view) {
+ // Space after Space will generate -insertNewLine:.
+ [view doCommandBySelector:@selector(insertNewLine:)];
+ });
+
+ EXPECT_EQ(base::UTF8ToUTF16(""), textfield->GetText());
+ EXPECT_EQ(0, enter_view->count());
+
+ object_setClass(ns_view_, [InterpretKeyEventMockedBridgedContentView class]);
+ g_fake_interpret_key_events = &handle_a_in_ime;
+ [ns_view_ keyDown:a_in_ime];
+ EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->GetText());
+ EXPECT_EQ(0, enter_view->count());
+
+ g_fake_interpret_key_events = &handle_tab_in_ime;
+ [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
+ EXPECT_EQ(base::SysNSStringToUTF16(@"ā"), textfield->GetText());
+ EXPECT_EQ(0, enter_view->count()); // Not seen as an accelerator.
+
+ // Pinyin changes candidate word on this sequence of keys without changing the
+ // composition text. At the end of this sequence, the word "啊" should be
+ // selected.
+ const ui::KeyboardCode key_seqence[] = {ui::VKEY_NEXT, ui::VKEY_PRIOR,
+ ui::VKEY_RIGHT, ui::VKEY_DOWN,
+ ui::VKEY_LEFT, ui::VKEY_UP};
+
+ g_fake_interpret_key_events = &handle_candidate_select_in_ime;
+ for (auto key : key_seqence) {
+ [ns_view_ keyDown:VkeyKeyDown(key)];
+ EXPECT_EQ(base::SysNSStringToUTF16(@"ā"),
+ textfield->GetText()); // No change.
+ EXPECT_EQ(0, enter_view->count());
+ }
+
+ // Space to confirm composition
+ g_fake_interpret_key_events = &handle_space_in_ime;
+ [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_SPACE)];
+ EXPECT_EQ(base::SysNSStringToUTF16(@"啊"), textfield->GetText());
+ EXPECT_EQ(0, enter_view->count());
+
+ // The next Enter should be processed as accelerator.
+ g_fake_interpret_key_events = &handle_enter_in_ime;
+ [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
+ EXPECT_EQ(base::SysNSStringToUTF16(@"啊"), textfield->GetText());
+ EXPECT_EQ(1, enter_view->count());
+}
+
// Simulate 'a', Enter in Hiragana. This should just insert "あ", suppressing
// accelerators.
TEST_F(BridgedNativeWidgetTest, TextInput_NoAcceleratorEnterComposition) {
diff --git a/chromium/ui/views/color_chooser/color_chooser_unittest.cc b/chromium/ui/views/color_chooser/color_chooser_unittest.cc
new file mode 100644
index 00000000000..e20ed343a43
--- /dev/null
+++ b/chromium/ui/views/color_chooser/color_chooser_unittest.cc
@@ -0,0 +1,163 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// Very quick HSV primer for those unfamiliar with it:
+// It helps to think of HSV like this:
+// h is in (0,360) and draws a circle of colors, with r = 0, b = 120, g = 240
+// s is in (0,1) and is the distance from the center of that circle - higher
+// values are more intense, with s = 0 being white, s = 1 being full color
+// and then HSV is the 3d space caused by projecting that circle into a
+// cylinder, with v in (0,1) being how far along the cylinder you are; v = 0 is
+// black, v = 1 is full color intensity
+
+#include <tuple>
+
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/test/event_generator.h"
+#include "ui/views/background.h"
+#include "ui/views/color_chooser/color_chooser_listener.h"
+#include "ui/views/color_chooser/color_chooser_view.h"
+#include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/widget_utils.h"
+
+namespace {
+
+class TestChooserListener : public views::ColorChooserListener {
+ public:
+ void OnColorChosen(SkColor color) override { color_ = color; }
+ void OnColorChooserDialogClosed() override { closed_ = true; }
+
+ private:
+ SkColor color_ = SK_ColorTRANSPARENT;
+ bool closed_ = false;
+};
+
+class ColorChooserTest : public views::ViewsTestBase {
+ public:
+ ~ColorChooserTest() override = default;
+
+ void SetUp() override {
+ ViewsTestBase::SetUp();
+ chooser_ =
+ std::make_unique<views::ColorChooserView>(&listener_, SK_ColorGREEN);
+ chooser_->SetBounds(0, 0, 400, 300);
+ widget_ = CreateTestWidget(views::Widget::InitParams::TYPE_WINDOW);
+ widget_->GetContentsView()->AddChildView(chooser());
+ generator_ = std::make_unique<ui::test::EventGenerator>(
+ views::GetRootWindow(widget_.get()), widget_->GetNativeWindow());
+ generator_->set_assume_window_at_origin(false);
+ }
+
+ void TearDown() override {
+ generator_.reset();
+ widget_.reset();
+ ViewsTestBase::TearDown();
+ }
+
+ views::ColorChooserView* chooser() { return chooser_.get(); }
+ ui::test::EventGenerator* generator() { return generator_.get(); }
+
+ void ExpectExactHSV(float h, float s, float v) const {
+ EXPECT_EQ(h, chooser_->hue());
+ EXPECT_EQ(s, chooser_->saturation());
+ EXPECT_EQ(v, chooser_->value());
+ }
+
+ void ExpectApproximateHSV(float h, float s, float v) const {
+ // At the usual size of the hue chooser it's possible to hit within
+ // roughly 5 points of hue in either direction.
+ EXPECT_NEAR(chooser_->hue(), h, 10.0);
+ EXPECT_NEAR(chooser_->saturation(), s, 0.1);
+ EXPECT_NEAR(chooser_->value(), v, 0.1);
+ }
+
+ SkColor GetShownColor() const {
+ return chooser_->selected_color_patch_for_testing()
+ ->background()
+ ->get_color();
+ }
+
+ SkColor GetTextualColor() const {
+ base::string16 text = chooser_->textfield_for_testing()->GetText();
+ if (text.empty() || text[0] != '#')
+ return SK_ColorTRANSPARENT;
+
+ uint32_t color;
+ return base::HexStringToUInt(base::UTF16ToUTF8(text.substr(1)), &color)
+ ? SkColorSetA(color, SK_AlphaOPAQUE)
+ : SK_ColorTRANSPARENT;
+ }
+
+ void TypeColor(const std::string& color) {
+ chooser_->textfield_for_testing()->SetText(base::UTF8ToUTF16(color));
+ // Synthesize ContentsChanged, since Textfield normally doesn't deliver it
+ // for SetText, only for user-typed text.
+ chooser_->ContentsChanged(chooser_->textfield_for_testing(),
+ chooser_->textfield_for_testing()->GetText());
+ }
+
+ void PressMouseAt(views::View* view, const gfx::Point& p) {
+#if 0
+ // TODO(ellyjones): Why doesn't this work?
+ const gfx::Point po = view->GetBoundsInScreen().origin();
+ generator_->MoveMouseTo(po + p.OffsetFromOrigin());
+ generator_->ClickLeftButton();
+#endif
+ ui::MouseEvent press(ui::ET_MOUSE_PRESSED,
+ gfx::Point(view->x() + p.x(), view->y() + p.y()),
+ gfx::Point(0, 0), base::TimeTicks::Now(), 0, 0);
+ view->OnMousePressed(press);
+ }
+
+ private:
+ TestChooserListener listener_;
+ std::unique_ptr<views::ColorChooserView> chooser_;
+ std::unique_ptr<views::Widget> widget_;
+ std::unique_ptr<ui::test::EventGenerator> generator_;
+};
+
+TEST_F(ColorChooserTest, ShowsInitialColor) {
+ ExpectExactHSV(120, 1, 1);
+ EXPECT_EQ(GetShownColor(), SK_ColorGREEN);
+ EXPECT_EQ(GetTextualColor(), SK_ColorGREEN);
+}
+
+TEST_F(ColorChooserTest, AdjustingTextAdjustsShown) {
+ TypeColor("#ff0000");
+ ExpectExactHSV(0, 1, 1);
+ EXPECT_EQ(GetShownColor(), SK_ColorRED);
+
+ TypeColor("0000ff");
+ ExpectExactHSV(240, 1, 1);
+ EXPECT_EQ(GetShownColor(), SK_ColorBLUE);
+}
+
+TEST_F(ColorChooserTest, HueSliderChangesHue) {
+ ExpectExactHSV(120, 1, 1);
+
+ views::View* hv = chooser()->hue_view_for_testing();
+
+ PressMouseAt(hv, gfx::Point(1, hv->height()));
+ ExpectApproximateHSV(0, 1, 1);
+
+ PressMouseAt(hv, gfx::Point(1, (hv->height() * 3) / 4));
+ ExpectApproximateHSV(90, 1, 1);
+
+ PressMouseAt(hv, gfx::Point(1, hv->height() / 2));
+ ExpectApproximateHSV(180, 1, 1);
+
+ PressMouseAt(hv, gfx::Point(1, hv->height() / 4));
+ ExpectApproximateHSV(270, 1, 1);
+}
+
+// Missing tests, TODO:
+// TEST_F(ColorChooserTest, SatValueChooserChangesSatValue)
+// TEST_F(ColorChooserTest, UpdateFromWebUpdatesShownValues)
+// TEST_F(ColorChooserTest, AdjustingTextAffectsHue)
+// TEST_F(ColorChooserTest, AdjustingTextAffectsSatValue)
+
+} // namespace
diff --git a/chromium/ui/views/color_chooser/color_chooser_view.cc b/chromium/ui/views/color_chooser/color_chooser_view.cc
index b8053d0b033..8470a676208 100644
--- a/chromium/ui/views/color_chooser/color_chooser_view.cc
+++ b/chromium/ui/views/color_chooser/color_chooser_view.cc
@@ -434,17 +434,20 @@ void ColorChooserView::OnSaturationValueChosen(SkScalar saturation,
textfield_->SetText(GetColorText(color));
}
-bool ColorChooserView::CanMinimize() const {
- return false;
+View* ColorChooserView::hue_view_for_testing() {
+ return hue_;
}
-View* ColorChooserView::GetInitiallyFocusedView() {
+View* ColorChooserView::saturation_value_view_for_testing() {
+ return saturation_value_;
+}
+
+Textfield* ColorChooserView::textfield_for_testing() {
return textfield_;
}
-void ColorChooserView::WindowClosing() {
- if (listener_)
- listener_->OnColorChooserDialogClosed();
+View* ColorChooserView::selected_color_patch_for_testing() {
+ return selected_color_patch_;
}
void ColorChooserView::ContentsChanged(Textfield* sender,
@@ -472,4 +475,17 @@ bool ColorChooserView::HandleKeyEvent(Textfield* sender,
return true;
}
+bool ColorChooserView::CanMinimize() const {
+ return false;
+}
+
+View* ColorChooserView::GetInitiallyFocusedView() {
+ return textfield_;
+}
+
+void ColorChooserView::WindowClosing() {
+ if (listener_)
+ listener_->OnColorChooserDialogClosed();
+}
+
} // namespace views
diff --git a/chromium/ui/views/color_chooser/color_chooser_view.h b/chromium/ui/views/color_chooser/color_chooser_view.h
index c28c24575ef..60bf2ac9b7f 100644
--- a/chromium/ui/views/color_chooser/color_chooser_view.h
+++ b/chromium/ui/views/color_chooser/color_chooser_view.h
@@ -42,6 +42,17 @@ class VIEWS_EXPORT ColorChooserView : public WidgetDelegateView,
float value() const { return hsv_[2]; }
void set_listener(ColorChooserListener* listener) { listener_ = listener; }
+ View* hue_view_for_testing();
+ View* saturation_value_view_for_testing();
+ Textfield* textfield_for_testing();
+ View* selected_color_patch_for_testing();
+
+ // TextfieldController overrides:
+ void ContentsChanged(Textfield* sender,
+ const base::string16& new_contents) override;
+ bool HandleKeyEvent(Textfield* sender,
+ const ui::KeyEvent& key_event) override;
+
private:
class HueView;
class SaturationValueView;
@@ -52,12 +63,6 @@ class VIEWS_EXPORT ColorChooserView : public WidgetDelegateView,
View* GetInitiallyFocusedView() override;
void WindowClosing() override;
- // TextfieldController overrides:
- void ContentsChanged(Textfield* sender,
- const base::string16& new_contents) override;
- bool HandleKeyEvent(Textfield* sender,
- const ui::KeyEvent& key_event) override;
-
// The current color in HSV coordinate.
SkScalar hsv_[3];
diff --git a/chromium/ui/views/controls/button/button.cc b/chromium/ui/views/controls/button/button.cc
index b6d254739e1..e1f389d6e1c 100644
--- a/chromium/ui/views/controls/button/button.cc
+++ b/chromium/ui/views/controls/button/button.cc
@@ -27,6 +27,7 @@
#include "ui/views/controls/button/radio_button.h"
#include "ui/views/controls/button/toggle_button.h"
#include "ui/views/controls/focus_ring.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/painter.h"
#include "ui/views/style/platform_style.h"
@@ -101,18 +102,6 @@ Button::PressedCallback::PressedCallback(base::RepeatingClosure closure)
const ui::Event& event) { closure.Run(); },
std::move(closure))) {}
-Button::PressedCallback::PressedCallback(ButtonListener* listener,
- Button* button)
- : callback_(listener ? base::BindRepeating(
- [](ButtonListener* listener,
- Button* button,
- const ui::Event& event) {
- listener->ButtonPressed(button, event);
- },
- listener,
- button)
- : Callback()) {}
-
Button::PressedCallback::PressedCallback(const PressedCallback&) = default;
Button::PressedCallback::PressedCallback(PressedCallback&&) = default;
@@ -159,15 +148,6 @@ Button::ButtonState Button::GetButtonStateFrom(ui::NativeTheme::State state) {
Button::~Button() = default;
-void Button::SetFocusForPlatform() {
-#if defined(OS_APPLE)
- // On Mac, buttons are focusable only in full keyboard access mode.
- SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
-#else
- SetFocusBehavior(FocusBehavior::ALWAYS);
-#endif
-}
-
void Button::SetTooltipText(const base::string16& tooltip_text) {
if (tooltip_text == tooltip_text_)
return;
@@ -611,17 +591,14 @@ Button::Button(PressedCallback callback)
: AnimationDelegateViews(this),
callback_(std::move(callback)),
ink_drop_base_color_(gfx::kPlaceholderColor) {
- SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
+ SetFocusBehavior(PlatformStyle::DefaultFocusBehavior());
SetProperty(kIsButtonProperty, true);
hover_animation_.SetSlideDuration(base::TimeDelta::FromMilliseconds(150));
- SetInstallFocusRingOnFocus(PlatformStyle::kPreferFocusRings);
+ SetInstallFocusRingOnFocus(true);
button_controller_ = std::make_unique<ButtonController>(
this, std::make_unique<DefaultButtonControllerDelegate>(this));
}
-Button::Button(ButtonListener* listener)
- : Button(PressedCallback(listener, this)) {}
-
void Button::RequestFocusFromEvent() {
if (request_focus_on_press_)
RequestFocus();
@@ -714,6 +691,7 @@ DEFINE_ENUM_CONVERTERS(
BEGIN_METADATA(Button, InkDropHostView)
ADD_PROPERTY_METADATA(base::string16, AccessibleName)
+ADD_PROPERTY_METADATA(PressedCallback, Callback)
ADD_PROPERTY_METADATA(bool, AnimateOnStateChange)
ADD_PROPERTY_METADATA(bool, HasInkDropActionOnClick)
ADD_PROPERTY_METADATA(bool, HideInkDropWhenShowingContextMenu)
diff --git a/chromium/ui/views/controls/button/button.h b/chromium/ui/views/controls/button/button.h
index d5f45758f00..d2ae90642d6 100644
--- a/chromium/ui/views/controls/button/button.h
+++ b/chromium/ui/views/controls/button/button.h
@@ -31,20 +31,8 @@ class Button;
class ButtonController;
class Event;
-// An interface implemented by an object to let it know that a button was
-// pressed. DEPRECATED; use PressedCallback instead.
-// TODO(crbug.com/772945): Replace ButtonListener with PressedCallback.
-class VIEWS_EXPORT ButtonListener {
- public:
- virtual void ButtonPressed(Button* sender, const ui::Event& event) = 0;
-
- protected:
- virtual ~ButtonListener() = default;
-};
-
-// A View representing a button. A Button is not focusable by default and will
-// not be part of the focus chain, unless in accessibility mode (see
-// SetFocusForPlatform()).
+// A View representing a button. A Button is focusable by default and will
+// be part of the focus chain.
class VIEWS_EXPORT Button : public InkDropHostView,
public AnimationDelegateViews {
public:
@@ -87,13 +75,12 @@ class VIEWS_EXPORT Button : public InkDropHostView,
DISALLOW_COPY_AND_ASSIGN(DefaultButtonControllerDelegate);
};
- // PressedCallback wraps a one-arg callback type with a variety of
- // constructors, both to aid conversion from ButtonListener and to allow
- // callers to specify a RepeatingClosure if they don't care about the callback
- // arg.
- // TODO(crbug.com/772945): Remove ButtonListener constructor, then re-evaluate
- // if this class can/should be converted to a type alias + various helpers or
- // overloads to support the RepeatingClosure case.
+ // PressedCallback wraps a one-arg callback type with multiple constructors to
+ // allow callers to specify a RepeatingClosure if they don't care about the
+ // callback arg.
+ // TODO(crbug.com/772945): Re-evaluate if this class can/should be converted
+ // to a type alias + various helpers or overloads to support the
+ // RepeatingClosure case.
class VIEWS_EXPORT PressedCallback {
public:
using Callback = base::RepeatingCallback<void(const ui::Event& event)>;
@@ -103,8 +90,6 @@ class VIEWS_EXPORT Button : public InkDropHostView,
// this way.
PressedCallback(Callback callback = Callback()); // NOLINT
PressedCallback(base::RepeatingClosure closure); // NOLINT
- // TODO(crbug.com/772945): Remove.
- PressedCallback(ButtonListener* listener, Button* button);
PressedCallback(const PressedCallback&);
PressedCallback(PressedCallback&&);
PressedCallback& operator=(const PressedCallback&);
@@ -132,16 +117,13 @@ class VIEWS_EXPORT Button : public InkDropHostView,
static ButtonState GetButtonStateFrom(ui::NativeTheme::State state);
- // Make the button focusable as per the platform.
- void SetFocusForPlatform();
-
void SetTooltipText(const base::string16& tooltip_text);
base::string16 GetTooltipText() const;
int tag() const { return tag_; }
void set_tag(int tag) { tag_ = tag; }
- void set_callback(PressedCallback callback) {
+ void SetCallback(PressedCallback callback) {
callback_ = std::move(callback);
}
@@ -253,7 +235,6 @@ class VIEWS_EXPORT Button : public InkDropHostView,
protected:
explicit Button(PressedCallback callback = PressedCallback());
- explicit Button(ButtonListener* listener);
// Called when the button has been clicked or tapped and should request focus
// if necessary.
@@ -310,6 +291,9 @@ class VIEWS_EXPORT Button : public InkDropHostView,
FocusRing* focus_ring() { return focus_ring_; }
+ // Getter used by metadata only.
+ const PressedCallback& GetCallback() const { return callback_; }
+
private:
friend class test::ButtonTestApi;
FRIEND_TEST_ALL_PREFIXES(BlueButtonTest, Border);
@@ -325,10 +309,8 @@ class VIEWS_EXPORT Button : public InkDropHostView,
// The button's listener. Notified when clicked.
PressedCallback callback_;
- // The id tag associated with this button. Used to disambiguate buttons in
- // the ButtonListener implementation.
- // TODO(pbos): Remove this after ButtonListener is gone since disambiguation
- // shouldn't be needed.
+ // The id tag associated with this button. Used to disambiguate buttons.
+ // TODO(pbos): See if this can be removed, e.g. by replacing with SetID().
int tag_ = -1;
ButtonState state_ = STATE_NORMAL;
@@ -381,6 +363,8 @@ class VIEWS_EXPORT Button : public InkDropHostView,
};
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Button, InkDropHostView)
+VIEW_BUILDER_PROPERTY(base::string16, AccessibleName)
+VIEW_BUILDER_PROPERTY(Button::PressedCallback, Callback)
VIEW_BUILDER_PROPERTY(base::TimeDelta, AnimationDuration)
VIEW_BUILDER_PROPERTY(bool, AnimateOnStateChange)
VIEW_BUILDER_PROPERTY(bool, HasInkDropActionOnClick)
@@ -391,9 +375,10 @@ VIEW_BUILDER_PROPERTY(bool, RequestFocusOnPress)
VIEW_BUILDER_PROPERTY(Button::ButtonState, State)
VIEW_BUILDER_PROPERTY(base::string16, TooltipText)
VIEW_BUILDER_PROPERTY(int, TriggerableEventFlags)
-VIEW_BUILDER_METHOD(SetFocusForPlatform)
-END_VIEW_BUILDER(VIEWS_EXPORT, Button)
+END_VIEW_BUILDER
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, Button)
+
#endif // UI_VIEWS_CONTROLS_BUTTON_BUTTON_H_
diff --git a/chromium/ui/views/controls/button/button_unittest.cc b/chromium/ui/views/controls/button/button_unittest.cc
index 9758c4f1661..8955695509f 100644
--- a/chromium/ui/views/controls/button/button_unittest.cc
+++ b/chromium/ui/views/controls/button/button_unittest.cc
@@ -70,9 +70,11 @@ class TestContextMenuController : public ContextMenuController {
DISALLOW_COPY_AND_ASSIGN(TestContextMenuController);
};
-class TestButton : public Button, public ButtonListener {
+class TestButton : public Button {
public:
- explicit TestButton(bool has_ink_drop_action_on_click) : Button(this) {
+ explicit TestButton(bool has_ink_drop_action_on_click)
+ : Button(base::BindRepeating([](bool* pressed) { *pressed = true; },
+ &pressed_)) {
SetHasInkDropActionOnClick(has_ink_drop_action_on_click);
}
@@ -84,13 +86,6 @@ class TestButton : public Button, public ButtonListener {
return custom_key_click_action_;
}
- void ButtonPressed(Button* sender, const ui::Event& event) override {
- pressed_ = true;
-
- if (!on_button_pressed_handler_.is_null())
- on_button_pressed_handler_.Run();
- }
-
void OnClickCanceled(const ui::Event& event) override { canceled_ = true; }
// Button:
@@ -103,19 +98,17 @@ class TestButton : public Button, public ButtonListener {
Button::RemoveInkDropLayer(ink_drop_layer);
}
- bool pressed() { return pressed_; }
- bool canceled() { return canceled_; }
- int ink_drop_layer_add_count() { return ink_drop_layer_add_count_; }
- int ink_drop_layer_remove_count() { return ink_drop_layer_remove_count_; }
+ bool pressed() const { return pressed_; }
+ bool canceled() const { return canceled_; }
+ int ink_drop_layer_add_count() const { return ink_drop_layer_add_count_; }
+ int ink_drop_layer_remove_count() const {
+ return ink_drop_layer_remove_count_;
+ }
void set_custom_key_click_action(KeyClickAction custom_key_click_action) {
custom_key_click_action_ = custom_key_click_action;
}
- void set_on_button_pressed_handler(const base::RepeatingClosure& callback) {
- on_button_pressed_handler_ = callback;
- }
-
void Reset() {
pressed_ = false;
canceled_ = false;
@@ -133,9 +126,6 @@ class TestButton : public Button, public ButtonListener {
KeyClickAction custom_key_click_action_ = KeyClickAction::kNone;
- // If available, will be triggered when the button is pressed.
- base::RepeatingClosure on_button_pressed_handler_;
-
DISALLOW_COPY_AND_ASSIGN(TestButton);
};
@@ -171,21 +161,6 @@ class TestButtonObserver {
DISALLOW_COPY_AND_ASSIGN(TestButtonObserver);
};
-class TestButtonListener : public ButtonListener {
- public:
- void ButtonPressed(Button* sender, const ui::Event& event) override {
- pressed_ = true;
- sender_ = sender;
- }
-
- bool pressed() const { return pressed_; }
- Button* sender() const { return sender_; }
-
- private:
- bool pressed_ = false;
- Button* sender_ = nullptr;
-};
-
TestInkDrop* AddTestInkDrop(TestButton* button) {
auto owned_ink_drop = std::make_unique<TestInkDrop>();
TestInkDrop* ink_drop = owned_ink_drop.get();
@@ -347,7 +322,7 @@ TEST_F(ButtonTest, HoverStatePreservedOnDescendantViewHierarchyChange) {
TEST_F(ButtonTest, NotifyAction) {
gfx::Point center(10, 10);
- // By default the button should notify its listener on mouse release.
+ // By default the button should notify the callback on mouse release.
button()->OnMousePressed(ui::MouseEvent(
ui::ET_MOUSE_PRESSED, center, center, ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
@@ -360,7 +335,7 @@ TEST_F(ButtonTest, NotifyAction) {
EXPECT_EQ(Button::STATE_HOVERED, button()->GetState());
EXPECT_TRUE(button()->pressed());
- // Set the notify action to its listener on mouse press.
+ // Set the notify action to happen on mouse press.
button()->Reset();
button()->button_controller()->set_notify_action(
ButtonController::NotifyAction::kOnPress);
@@ -384,7 +359,7 @@ TEST_F(ButtonTest, NotifyAction) {
TEST_F(ButtonTest, NotifyActionNoClick) {
gfx::Point center(10, 10);
- // By default the button should notify its listener on mouse release.
+ // By default the button should notify the callback on mouse release.
button()->OnMousePressed(ui::MouseEvent(
ui::ET_MOUSE_PRESSED, center, center, ui::EventTimeForNow(),
ui::EF_RIGHT_MOUSE_BUTTON, ui::EF_RIGHT_MOUSE_BUTTON));
@@ -395,7 +370,7 @@ TEST_F(ButtonTest, NotifyActionNoClick) {
ui::EF_RIGHT_MOUSE_BUTTON, ui::EF_RIGHT_MOUSE_BUTTON));
EXPECT_TRUE(button()->canceled());
- // Set the notify action to its listener on mouse press.
+ // Set the notify action to happen on mouse press.
button()->Reset();
button()->button_controller()->set_notify_action(
ButtonController::NotifyAction::kOnPress);
@@ -446,7 +421,7 @@ TEST_F(ButtonTest, GestureEventsSetState) {
// events will not revert the disabled state back to normal.
// https://crbug.com/1084241.
TEST_F(ButtonTest, GestureEventsRespectDisabledState) {
- button()->set_on_button_pressed_handler(base::BindRepeating(
+ button()->SetCallback(base::BindRepeating(
[](TestButton* button) { button->SetEnabled(false); }, button()));
EXPECT_EQ(Button::STATE_NORMAL, button()->GetState());
@@ -460,7 +435,7 @@ TEST_F(ButtonTest, GestureEventsRespectDisabledState) {
TEST_F(ButtonTest, AsButton) {
base::string16 text;
- LabelButton label_button(nullptr, text);
+ LabelButton label_button(Button::PressedCallback(), text);
EXPECT_TRUE(Button::AsButton(&label_button));
ImageButton image_button;
@@ -472,7 +447,7 @@ TEST_F(ButtonTest, AsButton) {
RadioButton radio_button(text, 0);
EXPECT_TRUE(Button::AsButton(&radio_button));
- MenuButton menu_button(nullptr, text);
+ MenuButton menu_button(Button::PressedCallback(), text);
EXPECT_TRUE(Button::AsButton(&menu_button));
ToggleButton toggle_button;
@@ -754,19 +729,19 @@ TEST_F(ButtonTest, InkDropStaysHiddenWhileDragging) {
// Ensure PressedCallback is dynamically settable.
TEST_F(ButtonTest, SetCallback) {
- TestButtonListener listener;
- button()->set_callback(Button::PressedCallback(&listener, button()));
+ bool pressed = false;
+ button()->SetCallback(
+ base::BindRepeating([](bool* pressed) { *pressed = true; }, &pressed));
const gfx::Point center(10, 10);
button()->OnMousePressed(ui::MouseEvent(
ui::ET_MOUSE_PRESSED, center, center, ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
- // Default button controller notifies listener at mouse release.
+ // Default button controller notifies callback at mouse release.
button()->OnMouseReleased(ui::MouseEvent(
ui::ET_MOUSE_RELEASED, center, center, ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
- EXPECT_TRUE(listener.pressed());
- EXPECT_EQ(button(), listener.sender());
+ EXPECT_TRUE(pressed);
}
// VisibilityTestButton tests to see if an ink drop or a layer has been added to
@@ -820,7 +795,6 @@ TEST_F(ButtonTest, NoLayerAddedForWidgetVisibilityChanges) {
// key-release on other platforms.
TEST_F(ButtonTest, ActionOnSpace) {
// Give focus to the button.
- button()->SetFocusForPlatform();
button()->RequestFocus();
EXPECT_TRUE(button()->HasFocus());
@@ -852,7 +826,6 @@ TEST_F(ButtonTest, ActionOnSpace) {
// with a dialog, even if a button has focus.
TEST_F(ButtonTest, ActionOnReturn) {
// Give focus to the button.
- button()->SetFocusForPlatform();
button()->RequestFocus();
EXPECT_TRUE(button()->HasFocus());
@@ -876,7 +849,6 @@ TEST_F(ButtonTest, ActionOnReturn) {
// Verify that a subclass may customize the action for a key pressed event.
TEST_F(ButtonTest, CustomActionOnKeyPressedEvent) {
// Give focus to the button.
- button()->SetFocusForPlatform();
button()->RequestFocus();
EXPECT_TRUE(button()->HasFocus());
@@ -895,7 +867,7 @@ TEST_F(ButtonTest, CustomActionOnKeyPressedEvent) {
// Verifies that button activation highlight state changes trigger property
// change callbacks.
-TEST_F(ButtonTest, ChangingHighlightStateNotifiesListener) {
+TEST_F(ButtonTest, ChangingHighlightStateNotifiesCallback) {
CreateButtonWithObserver();
EXPECT_FALSE(button_observer()->highlighted_changed());
EXPECT_FALSE(button()->GetHighlighted());
diff --git a/chromium/ui/views/controls/button/checkbox.cc b/chromium/ui/views/controls/button/checkbox.cc
index cbb7bf23224..a0c317ab848 100644
--- a/chromium/ui/views/controls/button/checkbox.cc
+++ b/chromium/ui/views/controls/button/checkbox.cc
@@ -45,12 +45,9 @@ class Checkbox::FocusRingHighlightPathGenerator
};
Checkbox::Checkbox(const base::string16& label, PressedCallback callback)
- : LabelButton(std::move(callback), label),
- checked_(false),
- label_ax_id_(0) {
+ : LabelButton(std::move(callback), label) {
SetImageCentered(false);
SetHorizontalAlignment(gfx::ALIGN_LEFT);
- SetFocusForPlatform();
SetRequestFocusOnPress(false);
SetInkDropMode(InkDropMode::ON);
@@ -71,9 +68,6 @@ Checkbox::Checkbox(const base::string16& label, PressedCallback callback)
views::InstallEmptyHighlightPathGenerator(this);
}
-Checkbox::Checkbox(const base::string16& label, ButtonListener* listener)
- : Checkbox(label, PressedCallback(listener, this)) {}
-
Checkbox::~Checkbox() = default;
void Checkbox::SetChecked(bool checked) {
@@ -169,8 +163,8 @@ std::unique_ptr<InkDrop> Checkbox::CreateInkDrop() {
std::unique_ptr<InkDropRipple> Checkbox::CreateInkDropRipple() const {
// The "small" size is 21dp, the large size is 1.33 * 21dp = 28dp.
- return CreateSquareInkDropRipple(image()->GetMirroredBounds().CenterPoint(),
- gfx::Size(21, 21));
+ return CreateSquareInkDropRipple(
+ image()->GetMirroredContentsBounds().CenterPoint(), gfx::Size(21, 21));
}
SkColor Checkbox::GetInkDropBaseColor() const {
@@ -181,7 +175,7 @@ SkColor Checkbox::GetInkDropBaseColor() const {
SkPath Checkbox::GetFocusRingPath() const {
SkPath path;
- gfx::Rect bounds = image()->GetMirroredBounds();
+ gfx::Rect bounds = image()->GetMirroredContentsBounds();
bounds.Inset(1, 1);
path.addRect(RectToSkRect(bounds));
return path;
diff --git a/chromium/ui/views/controls/button/checkbox.h b/chromium/ui/views/controls/button/checkbox.h
index 3b08bba3a4b..86cc2f134db 100644
--- a/chromium/ui/views/controls/button/checkbox.h
+++ b/chromium/ui/views/controls/button/checkbox.h
@@ -14,6 +14,7 @@
#include "cc/paint/paint_flags.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/focus_ring.h"
+#include "ui/views/metadata/view_factory.h"
namespace gfx {
struct VectorIcon;
@@ -29,7 +30,6 @@ class VIEWS_EXPORT Checkbox : public LabelButton {
explicit Checkbox(const base::string16& label = base::string16(),
PressedCallback callback = PressedCallback());
- Checkbox(const base::string16& label, ButtonListener* listener);
~Checkbox() override;
// Sets/Gets whether or not the checkbox is checked.
@@ -82,14 +82,21 @@ class VIEWS_EXPORT Checkbox : public LabelButton {
void GetExtraParams(ui::NativeTheme::ExtraParams* params) const override;
// True if the checkbox is checked.
- bool checked_;
+ bool checked_ = false;
// The unique id for the associated label's accessible object.
- int32_t label_ax_id_;
+ int32_t label_ax_id_ = 0;
DISALLOW_COPY_AND_ASSIGN(Checkbox);
};
+BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Checkbox, LabelButton)
+VIEW_BUILDER_PROPERTY(bool, Checked)
+VIEW_BUILDER_PROPERTY(bool, MultiLine)
+END_VIEW_BUILDER
+
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, Checkbox)
+
#endif // UI_VIEWS_CONTROLS_BUTTON_CHECKBOX_H_
diff --git a/chromium/ui/views/controls/button/image_button.cc b/chromium/ui/views/controls/button/image_button.cc
index 9cfe0b63bc8..0762225e0ba 100644
--- a/chromium/ui/views/controls/button/image_button.cc
+++ b/chromium/ui/views/controls/button/image_button.cc
@@ -33,12 +33,9 @@ ImageButton::ImageButton(PressedCallback callback)
// By default, we request that the gfx::Canvas passed to our View::OnPaint()
// implementation is flipped horizontally so that the button's images are
// mirrored when the UI directionality is right-to-left.
- EnableCanvasFlippingForRTLUI(true);
+ SetFlipCanvasOnPaintForRTLUI(true);
}
-ImageButton::ImageButton(ButtonListener* listener)
- : ImageButton(PressedCallback(listener, this)) {}
-
ImageButton::~ImageButton() = default;
const gfx::ImageSkia& ImageButton::GetImage(ButtonState state) const {
@@ -217,10 +214,8 @@ const gfx::Point ImageButton::ComputeImagePaintPosition(
// ToggleImageButton, public:
ToggleImageButton::ToggleImageButton(PressedCallback callback)
- : ImageButton(std::move(callback)) {}
-
-ToggleImageButton::ToggleImageButton(ButtonListener* listener)
- : ToggleImageButton(PressedCallback(listener, this)) {}
+ : ImageButton(std::move(callback)) {
+}
ToggleImageButton::~ToggleImageButton() = default;
diff --git a/chromium/ui/views/controls/button/image_button.h b/chromium/ui/views/controls/button/image_button.h
index 6aa66164f80..6ea3fdfb46e 100644
--- a/chromium/ui/views/controls/button/image_button.h
+++ b/chromium/ui/views/controls/button/image_button.h
@@ -16,10 +16,6 @@
namespace views {
-// An image button.
-// Note that this type of button is not focusable by default and will not be
-// part of the focus chain, unless in accessibility mode. Call
-// SetFocusForPlatform() to make it part of the focus chain.
class VIEWS_EXPORT ImageButton : public Button {
public:
METADATA_HEADER(ImageButton);
@@ -31,7 +27,6 @@ class VIEWS_EXPORT ImageButton : public Button {
enum VerticalAlignment { ALIGN_TOP = 0, ALIGN_MIDDLE, ALIGN_BOTTOM };
explicit ImageButton(PressedCallback callback = PressedCallback());
- explicit ImageButton(ButtonListener* listener);
~ImageButton() override;
// Returns the image for a given |state|.
@@ -118,7 +113,7 @@ VIEW_BUILDER_PROPERTY(ImageButton::HorizontalAlignment,
ImageHorizontalAlignment)
VIEW_BUILDER_PROPERTY(ImageButton::VerticalAlignment, ImageVerticalAlignment)
VIEW_BUILDER_PROPERTY(gfx::Size, MinimumImageSize)
-END_VIEW_BUILDER(VIEWS_EXPORT, ImageButton)
+END_VIEW_BUILDER
////////////////////////////////////////////////////////////////////////////////
//
@@ -132,7 +127,6 @@ class VIEWS_EXPORT ToggleImageButton : public ImageButton {
METADATA_HEADER(ToggleImageButton);
explicit ToggleImageButton(PressedCallback callback = PressedCallback());
- explicit ToggleImageButton(ButtonListener* listener);
~ToggleImageButton() override;
// Change the toggled state.
@@ -184,8 +178,11 @@ BEGIN_VIEW_BUILDER(VIEWS_EXPORT, ToggleImageButton, ImageButton)
VIEW_BUILDER_PROPERTY(bool, Toggled)
VIEW_BUILDER_PROPERTY(base::string16, ToggledTooltipText)
VIEW_BUILDER_PROPERTY(base::string16, ToggledAccessibleName)
-END_VIEW_BUILDER(VIEWS_EXPORT, ToggleImageButton)
+END_VIEW_BUILDER
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, ImageButton)
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, ToggleImageButton)
+
#endif // UI_VIEWS_CONTROLS_BUTTON_IMAGE_BUTTON_H_
diff --git a/chromium/ui/views/controls/button/image_button_factory.cc b/chromium/ui/views/controls/button/image_button_factory.cc
index d6f38ff9e3e..98c788869d0 100644
--- a/chromium/ui/views/controls/button/image_button_factory.cc
+++ b/chromium/ui/views/controls/button/image_button_factory.cc
@@ -25,9 +25,6 @@ class ColorTrackingVectorImageButton : public ImageButton {
ColorTrackingVectorImageButton(PressedCallback callback,
const gfx::VectorIcon& icon)
: ImageButton(std::move(callback)), icon_(icon) {}
- ColorTrackingVectorImageButton(ButtonListener* listener,
- const gfx::VectorIcon& icon)
- : ColorTrackingVectorImageButton(PressedCallback(listener, this), icon) {}
// ImageButton:
void OnThemeChanged() override {
@@ -52,15 +49,6 @@ std::unique_ptr<ImageButton> CreateVectorImageButtonWithNativeTheme(
return button;
}
-std::unique_ptr<ImageButton> CreateVectorImageButtonWithNativeTheme(
- ButtonListener* listener,
- const gfx::VectorIcon& icon) {
- auto button =
- std::make_unique<ColorTrackingVectorImageButton>(listener, icon);
- ConfigureVectorImageButton(button.get());
- return button;
-}
-
std::unique_ptr<ImageButton> CreateVectorImageButton(
Button::PressedCallback callback) {
auto button = std::make_unique<ImageButton>(std::move(callback));
@@ -68,12 +56,6 @@ std::unique_ptr<ImageButton> CreateVectorImageButton(
return button;
}
-std::unique_ptr<ImageButton> CreateVectorImageButton(ButtonListener* listener) {
- auto button = std::make_unique<ImageButton>(listener);
- ConfigureVectorImageButton(button.get());
- return button;
-}
-
std::unique_ptr<ToggleImageButton> CreateVectorToggleImageButton(
Button::PressedCallback callback) {
auto button = std::make_unique<ToggleImageButton>(std::move(callback));
@@ -81,13 +63,6 @@ std::unique_ptr<ToggleImageButton> CreateVectorToggleImageButton(
return button;
}
-std::unique_ptr<ToggleImageButton> CreateVectorToggleImageButton(
- ButtonListener* listener) {
- auto button = std::make_unique<ToggleImageButton>(listener);
- ConfigureVectorImageButton(button.get());
- return button;
-}
-
void ConfigureVectorImageButton(ImageButton* button) {
button->SetInkDropMode(Button::InkDropMode::ON);
button->SetHasInkDropActionOnClick(true);
diff --git a/chromium/ui/views/controls/button/image_button_factory.h b/chromium/ui/views/controls/button/image_button_factory.h
index 593ec05876e..7f54a58e737 100644
--- a/chromium/ui/views/controls/button/image_button_factory.h
+++ b/chromium/ui/views/controls/button/image_button_factory.h
@@ -25,23 +25,16 @@ class ToggleImageButton;
VIEWS_EXPORT std::unique_ptr<ImageButton>
CreateVectorImageButtonWithNativeTheme(Button::PressedCallback callback,
const gfx::VectorIcon& icon);
-VIEWS_EXPORT std::unique_ptr<ImageButton>
-CreateVectorImageButtonWithNativeTheme(ButtonListener* listener,
- const gfx::VectorIcon& icon);
// Creates an ImageButton with an ink drop and a centered image in preparation
// for applying a vector icon with SetImageFromVectorIcon below.
VIEWS_EXPORT std::unique_ptr<ImageButton> CreateVectorImageButton(
Button::PressedCallback callback);
-VIEWS_EXPORT std::unique_ptr<ImageButton> CreateVectorImageButton(
- ButtonListener* listener);
// Creates a ToggleImageButton with an ink drop and a centered image in
// preparation for applying a vector icon from SetImageFromVectorIcon below.
VIEWS_EXPORT std::unique_ptr<ToggleImageButton> CreateVectorToggleImageButton(
Button::PressedCallback callback);
-VIEWS_EXPORT std::unique_ptr<ToggleImageButton> CreateVectorToggleImageButton(
- ButtonListener* listener);
// Configures an existing ImageButton with an ink drop and a centered image in
// preparation for applying a vector icon with SetImageFromVectorIcon below.
diff --git a/chromium/ui/views/controls/button/image_button_factory_unittest.cc b/chromium/ui/views/controls/button/image_button_factory_unittest.cc
index 2197b35a527..0aa307a590e 100644
--- a/chromium/ui/views/controls/button/image_button_factory_unittest.cc
+++ b/chromium/ui/views/controls/button/image_button_factory_unittest.cc
@@ -21,13 +21,13 @@ namespace views {
using ImageButtonFactoryTest = ViewsTestBase;
TEST_F(ImageButtonFactoryTest, CreateVectorImageButton) {
- auto button = CreateVectorImageButton(nullptr);
+ auto button = CreateVectorImageButton(Button::PressedCallback());
EXPECT_EQ(ImageButton::ALIGN_CENTER, button->h_alignment_);
EXPECT_EQ(ImageButton::ALIGN_MIDDLE, button->v_alignment_);
}
TEST_F(ImageButtonFactoryTest, SetImageFromVectorIcon) {
- auto button = CreateVectorImageButton(nullptr);
+ auto button = CreateVectorImageButton(Button::PressedCallback());
SetImageFromVectorIcon(button.get(), vector_icons::kCloseRoundedIcon,
SK_ColorRED);
EXPECT_FALSE(button->GetImage(Button::STATE_NORMAL).isNull());
@@ -78,7 +78,7 @@ class ImageButtonFactoryWidgetTest : public ViewsTestBase {
TEST_F(ImageButtonFactoryWidgetTest, CreateVectorImageButtonWithNativeTheme) {
AddImageButton(CreateVectorImageButtonWithNativeTheme(
- nullptr, vector_icons::kCloseRoundedIcon));
+ Button::PressedCallback(), vector_icons::kCloseRoundedIcon));
EXPECT_EQ(button()->GetNativeTheme()->GetSystemColor(
ui::NativeTheme::kColorId_DefaultIconColor),
button()->GetInkDropBaseColor());
diff --git a/chromium/ui/views/controls/button/image_button_unittest.cc b/chromium/ui/views/controls/button/image_button_unittest.cc
index e1872623d63..c5830643357 100644
--- a/chromium/ui/views/controls/button/image_button_unittest.cc
+++ b/chromium/ui/views/controls/button/image_button_unittest.cc
@@ -7,6 +7,7 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/layout.h"
#include "ui/views/border.h"
+#include "ui/views/style/platform_style.h"
#include "ui/views/test/views_test_base.h"
namespace {
@@ -39,6 +40,12 @@ namespace views {
using ImageButtonTest = ViewsTestBase;
+TEST_F(ImageButtonTest, FocusBehavior) {
+ ImageButton button;
+
+ EXPECT_EQ(PlatformStyle::DefaultFocusBehavior(), button.GetFocusBehavior());
+}
+
TEST_F(ImageButtonTest, Basics) {
ImageButton button;
diff --git a/chromium/ui/views/controls/button/label_button.cc b/chromium/ui/views/controls/button/label_button.cc
index f330d677e93..563bc70f496 100644
--- a/chromium/ui/views/controls/button/label_button.cc
+++ b/chromium/ui/views/controls/button/label_button.cc
@@ -55,11 +55,6 @@ LabelButton::LabelButton(PressedCallback callback,
SetTextInternal(text);
}
-LabelButton::LabelButton(ButtonListener* listener,
- const base::string16& text,
- int button_context)
- : LabelButton(PressedCallback(listener, this), text, button_context) {}
-
LabelButton::~LabelButton() = default;
gfx::ImageSkia LabelButton::GetImage(ButtonState for_state) const {
@@ -377,11 +372,6 @@ void LabelButton::Layout() {
Button::Layout();
}
-void LabelButton::EnableCanvasFlippingForRTLUI(bool flip) {
- Button::EnableCanvasFlippingForRTLUI(flip);
- image_->EnableCanvasFlippingForRTLUI(flip);
-}
-
void LabelButton::GetAccessibleNodeData(ui::AXNodeData* node_data) {
if (GetIsDefault())
node_data->AddState(ax::mojom::State::kDefault);
@@ -615,6 +605,10 @@ Button::ButtonState LabelButton::ImageStateForState(
: for_state;
}
+void LabelButton::FlipCanvasOnPaintForRTLUIChanged() {
+ image_->SetFlipCanvasOnPaintForRTLUI(GetFlipCanvasOnPaintForRTLUI());
+}
+
BEGIN_METADATA(LabelButton, Button)
ADD_PROPERTY_METADATA(base::string16, Text)
ADD_PROPERTY_METADATA(gfx::HorizontalAlignment, HorizontalAlignment)
diff --git a/chromium/ui/views/controls/button/label_button.h b/chromium/ui/views/controls/button/label_button.h
index 9be9035f7b5..5dbf8e3e9c8 100644
--- a/chromium/ui/views/controls/button/label_button.h
+++ b/chromium/ui/views/controls/button/label_button.h
@@ -8,6 +8,7 @@
#include <array>
#include <memory>
+#include "base/bind.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
@@ -29,7 +30,7 @@ namespace views {
class InkDropContainerView;
class LabelButtonBorder;
-// LabelButton is a button with text and an icon, it's not focusable by default.
+// LabelButton is a button with text and an icon.
class VIEWS_EXPORT LabelButton : public Button, public NativeThemeDelegate {
public:
METADATA_HEADER(LabelButton);
@@ -40,9 +41,8 @@ class VIEWS_EXPORT LabelButton : public Button, public NativeThemeDelegate {
explicit LabelButton(PressedCallback callback = PressedCallback(),
const base::string16& text = base::string16(),
int button_context = style::CONTEXT_BUTTON);
- explicit LabelButton(ButtonListener* listener,
- const base::string16& text = base::string16(),
- int button_context = style::CONTEXT_BUTTON);
+ LabelButton(const LabelButton&) = delete;
+ LabelButton& operator=(const LabelButton&) = delete;
~LabelButton() override;
// Gets or sets the image shown for the specified button state.
@@ -118,7 +118,6 @@ class VIEWS_EXPORT LabelButton : public Button, public NativeThemeDelegate {
gfx::Size GetMinimumSize() const override;
int GetHeightForWidth(int w) const override;
void Layout() override;
- void EnableCanvasFlippingForRTLUI(bool flip) override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
void AddLayerBeneathView(ui::Layer* new_layer) override;
void RemoveLayerBeneathView(ui::Layer* old_layer) override;
@@ -209,6 +208,8 @@ class VIEWS_EXPORT LabelButton : public Button, public NativeThemeDelegate {
// STATE_NORMAL when |for_state|'s image is empty.
ButtonState ImageStateForState(ButtonState for_state) const;
+ void FlipCanvasOnPaintForRTLUIChanged();
+
// The image and label shown in the button.
ImageView* image_;
internal::LabelButtonLabel* label_;
@@ -265,7 +266,10 @@ class VIEWS_EXPORT LabelButton : public Button, public NativeThemeDelegate {
std::unique_ptr<Widget::PaintAsActiveCallbackList::Subscription>
paint_as_active_subscription_;
- DISALLOW_COPY_AND_ASSIGN(LabelButton);
+ PropertyChangedSubscription flip_canvas_on_paint_subscription_ =
+ AddFlipCanvasOnPaintForRTLUIChangedCallback(
+ base::BindRepeating(&LabelButton::FlipCanvasOnPaintForRTLUIChanged,
+ base::Unretained(this)));
};
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, LabelButton, Button)
@@ -276,8 +280,10 @@ VIEW_BUILDER_PROPERTY(gfx::Size, MaxSize)
VIEW_BUILDER_PROPERTY(bool, IsDefault)
VIEW_BUILDER_PROPERTY(int, ImageLabelSpacing)
VIEW_BUILDER_PROPERTY(bool, ImageCentered)
-END_VIEW_BUILDER(VIEWS_EXPORT, LabelButton)
+END_VIEW_BUILDER
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, LabelButton)
+
#endif // UI_VIEWS_CONTROLS_BUTTON_LABEL_BUTTON_H_
diff --git a/chromium/ui/views/controls/button/label_button_unittest.cc b/chromium/ui/views/controls/button/label_button_unittest.cc
index c39a2182548..0f55418d4ba 100644
--- a/chromium/ui/views/controls/button/label_button_unittest.cc
+++ b/chromium/ui/views/controls/button/label_button_unittest.cc
@@ -72,7 +72,7 @@ class TestLabelButton : public LabelButton {
public:
explicit TestLabelButton(const base::string16& text = base::string16(),
int button_context = style::CONTEXT_BUTTON)
- : LabelButton(nullptr, text, button_context) {}
+ : LabelButton(Button::PressedCallback(), text, button_context) {}
using LabelButton::GetVisualState;
using LabelButton::image;
@@ -142,6 +142,10 @@ class LabelButtonTest : public test::WidgetTest {
DISALLOW_COPY_AND_ASSIGN(LabelButtonTest);
};
+TEST_F(LabelButtonTest, FocusBehavior) {
+ EXPECT_EQ(PlatformStyle::DefaultFocusBehavior(), button_->GetFocusBehavior());
+}
+
TEST_F(LabelButtonTest, Init) {
const base::string16 text(ASCIIToUTF16("abc"));
TestLabelButton button(text);
@@ -740,8 +744,8 @@ class InkDropLabelButtonTest : public ViewsTestBase {
widget_->Init(std::move(params));
widget_->Show();
- button_ = widget_->SetContentsView(
- std::make_unique<LabelButton>(nullptr, base::string16()));
+ button_ = widget_->SetContentsView(std::make_unique<LabelButton>(
+ Button::PressedCallback(), base::string16()));
test_ink_drop_ = new test::TestInkDrop();
test::InkDropHostViewTestApi(button_).SetInkDrop(
diff --git a/chromium/ui/views/controls/button/md_text_button.cc b/chromium/ui/views/controls/button/md_text_button.cc
index 4b6f451e1ff..8daabc1e457 100644
--- a/chromium/ui/views/controls/button/md_text_button.cc
+++ b/chromium/ui/views/controls/button/md_text_button.cc
@@ -39,7 +39,6 @@ MdTextButton::MdTextButton(PressedCallback callback,
SetShowInkDropWhenHotTracked(true);
SetCornerRadius(LayoutProvider::Get()->GetCornerRadiusMetric(EMPHASIS_LOW));
SetHorizontalAlignment(gfx::ALIGN_CENTER);
- SetFocusForPlatform();
const int minimum_width = LayoutProvider::Get()->GetDistanceMetric(
DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH);
@@ -58,11 +57,6 @@ MdTextButton::MdTextButton(PressedCallback callback,
UpdatePadding();
}
-MdTextButton::MdTextButton(ButtonListener* listener,
- const base::string16& text,
- int button_context)
- : MdTextButton(PressedCallback(listener, this), text, button_context) {}
-
MdTextButton::~MdTextButton() = default;
void MdTextButton::SetProminent(bool is_prominent) {
@@ -169,11 +163,16 @@ void MdTextButton::SetEnabledTextColors(base::Optional<SkColor> color) {
UpdateColors();
}
-void MdTextButton::SetCustomPadding(const gfx::Insets& padding) {
+void MdTextButton::SetCustomPadding(
+ const base::Optional<gfx::Insets>& padding) {
custom_padding_ = padding;
UpdatePadding();
}
+base::Optional<gfx::Insets> MdTextButton::GetCustomPadding() const {
+ return custom_padding_.value_or(CalculateDefaultPadding());
+}
+
void MdTextButton::SetText(const base::string16& text) {
LabelButton::SetText(text);
UpdatePadding();
@@ -300,6 +299,7 @@ BEGIN_METADATA(MdTextButton, LabelButton)
ADD_PROPERTY_METADATA(bool, Prominent)
ADD_PROPERTY_METADATA(float, CornerRadius)
ADD_PROPERTY_METADATA(base::Optional<SkColor>, BgColorOverride)
+ADD_PROPERTY_METADATA(base::Optional<gfx::Insets>, CustomPadding)
END_METADATA
} // namespace views
diff --git a/chromium/ui/views/controls/button/md_text_button.h b/chromium/ui/views/controls/button/md_text_button.h
index b9aa8505a8e..b0772c1c1e4 100644
--- a/chromium/ui/views/controls/button/md_text_button.h
+++ b/chromium/ui/views/controls/button/md_text_button.h
@@ -22,9 +22,6 @@ class VIEWS_EXPORT MdTextButton : public LabelButton {
explicit MdTextButton(PressedCallback callback = PressedCallback(),
const base::string16& text = base::string16(),
int button_context = style::CONTEXT_BUTTON_MD);
- explicit MdTextButton(ButtonListener* listener,
- const base::string16& text = base::string16(),
- int button_context = style::CONTEXT_BUTTON_MD);
~MdTextButton() override;
// See |is_prominent_|.
@@ -41,7 +38,8 @@ class VIEWS_EXPORT MdTextButton : public LabelButton {
float GetCornerRadius() const;
// See |custom_padding_|.
- void SetCustomPadding(const gfx::Insets& padding);
+ void SetCustomPadding(const base::Optional<gfx::Insets>& padding);
+ base::Optional<gfx::Insets> GetCustomPadding() const;
// LabelButton:
void OnThemeChanged() override;
@@ -80,6 +78,15 @@ class VIEWS_EXPORT MdTextButton : public LabelButton {
DISALLOW_COPY_AND_ASSIGN(MdTextButton);
};
+BEGIN_VIEW_BUILDER(VIEWS_EXPORT, MdTextButton, LabelButton)
+VIEW_BUILDER_PROPERTY(bool, Prominent)
+VIEW_BUILDER_PROPERTY(base::Optional<SkColor>, BgColorOverride)
+VIEW_BUILDER_PROPERTY(float, CornerRadius)
+VIEW_BUILDER_PROPERTY(base::Optional<gfx::Insets>, CustomPadding)
+END_VIEW_BUILDER
+
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, MdTextButton)
+
#endif // UI_VIEWS_CONTROLS_BUTTON_MD_TEXT_BUTTON_H_
diff --git a/chromium/ui/views/controls/button/md_text_button_unittest.cc b/chromium/ui/views/controls/button/md_text_button_unittest.cc
index 4013de90dab..1ec3e70b0d9 100644
--- a/chromium/ui/views/controls/button/md_text_button_unittest.cc
+++ b/chromium/ui/views/controls/button/md_text_button_unittest.cc
@@ -16,8 +16,7 @@ using MdTextButtonTest = ViewsTestBase;
TEST_F(MdTextButtonTest, CustomPadding) {
const base::string16 text = base::ASCIIToUTF16("abc");
- std::unique_ptr<MdTextButton> button =
- std::make_unique<MdTextButton>(nullptr, text);
+ auto button = std::make_unique<MdTextButton>(Button::PressedCallback(), text);
const gfx::Insets custom_padding(10, 20);
ASSERT_NE(button->GetInsets(), custom_padding);
@@ -33,8 +32,8 @@ TEST_F(MdTextButtonTest, BackgroundColorChangesWithWidgetActivation) {
GTEST_SKIP() << "Button colors do not change with widget activation here.";
std::unique_ptr<Widget> widget = CreateTestWidget();
- auto* button = widget->SetContentsView(
- std::make_unique<MdTextButton>(nullptr, base::ASCIIToUTF16("button")));
+ auto* button = widget->SetContentsView(std::make_unique<MdTextButton>(
+ Button::PressedCallback(), base::ASCIIToUTF16("button")));
button->SetProminent(true);
button->SetBounds(0, 0, 70, 20);
widget->LayoutRootViewIfNecessary();
diff --git a/chromium/ui/views/controls/button/menu_button.cc b/chromium/ui/views/controls/button/menu_button.cc
index a0c9afd54cc..097c311d27d 100644
--- a/chromium/ui/views/controls/button/menu_button.cc
+++ b/chromium/ui/views/controls/button/menu_button.cc
@@ -10,13 +10,14 @@
#include "ui/events/event.h"
#include "ui/views/controls/button/button_controller_delegate.h"
#include "ui/views/controls/button/menu_button_controller.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
MenuButton::MenuButton(PressedCallback callback,
const base::string16& text,
int button_context)
- : LabelButton(nullptr, text, button_context) {
+ : LabelButton(PressedCallback(), text, button_context) {
SetHorizontalAlignment(gfx::ALIGN_LEFT);
std::unique_ptr<MenuButtonController> menu_button_controller =
std::make_unique<MenuButtonController>(
@@ -24,12 +25,9 @@ MenuButton::MenuButton(PressedCallback callback,
std::make_unique<Button::DefaultButtonControllerDelegate>(this));
menu_button_controller_ = menu_button_controller.get();
SetButtonController(std::move(menu_button_controller));
-}
-MenuButton::MenuButton(ButtonListener* listener,
- const base::string16& text,
- int button_context)
- : MenuButton(PressedCallback(listener, this), text, button_context) {}
+ SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
+}
MenuButton::~MenuButton() = default;
diff --git a/chromium/ui/views/controls/button/menu_button.h b/chromium/ui/views/controls/button/menu_button.h
index 65929bb762b..44a66ee24fd 100644
--- a/chromium/ui/views/controls/button/menu_button.h
+++ b/chromium/ui/views/controls/button/menu_button.h
@@ -27,9 +27,6 @@ class VIEWS_EXPORT MenuButton : public LabelButton {
explicit MenuButton(PressedCallback callback = PressedCallback(),
const base::string16& text = base::string16(),
int button_context = style::CONTEXT_BUTTON);
- explicit MenuButton(ButtonListener* listener,
- const base::string16& text = base::string16(),
- int button_context = style::CONTEXT_BUTTON);
~MenuButton() override;
MenuButtonController* button_controller() const {
diff --git a/chromium/ui/views/controls/button/menu_button_controller.cc b/chromium/ui/views/controls/button/menu_button_controller.cc
index a61082d11f2..f621f8b1620 100644
--- a/chromium/ui/views/controls/button/menu_button_controller.cc
+++ b/chromium/ui/views/controls/button/menu_button_controller.cc
@@ -90,14 +90,6 @@ MenuButtonController::MenuButtonController(
set_notify_action(ButtonController::NotifyAction::kOnPress);
}
-MenuButtonController::MenuButtonController(
- Button* button,
- ButtonListener* listener,
- std::unique_ptr<ButtonControllerDelegate> delegate)
- : MenuButtonController(button,
- Button::PressedCallback(listener, button),
- std::move(delegate)) {}
-
MenuButtonController::~MenuButtonController() = default;
bool MenuButtonController::OnMousePressed(const ui::MouseEvent& event) {
@@ -239,7 +231,7 @@ bool MenuButtonController::Activate(const ui::Event* event) {
bool increment_pressed_lock_called = false;
increment_pressed_lock_called_ = &increment_pressed_lock_called;
- // Allow for ButtonPressed() to delete this.
+ // Allow for the button callback to delete this.
auto ref = weak_factory_.GetWeakPtr();
// TODO(pbos): Make sure we always propagate an event. This requires changes
diff --git a/chromium/ui/views/controls/button/menu_button_controller.h b/chromium/ui/views/controls/button/menu_button_controller.h
index ca4b3467fb5..a7129e6ceea 100644
--- a/chromium/ui/views/controls/button/menu_button_controller.h
+++ b/chromium/ui/views/controls/button/menu_button_controller.h
@@ -42,9 +42,6 @@ class VIEWS_EXPORT MenuButtonController : public ButtonController {
MenuButtonController(Button* button,
Button::PressedCallback callback,
std::unique_ptr<ButtonControllerDelegate> delegate);
- MenuButtonController(Button* button,
- ButtonListener* listener,
- std::unique_ptr<ButtonControllerDelegate> delegate);
~MenuButtonController() override;
// view::ButtonController
diff --git a/chromium/ui/views/controls/button/menu_button_unittest.cc b/chromium/ui/views/controls/button/menu_button_unittest.cc
index f06d6fc2cdc..2e22a0d9e2c 100644
--- a/chromium/ui/views/controls/button/menu_button_unittest.cc
+++ b/chromium/ui/views/controls/button/menu_button_unittest.cc
@@ -7,7 +7,6 @@
#include <memory>
#include <utility>
-#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
@@ -35,28 +34,45 @@ using base::ASCIIToUTF16;
namespace views {
-using test::InkDropHostViewTestApi;
-using test::TestInkDrop;
-
-// A MenuButton subclass that provides access to some MenuButton internals.
class TestMenuButton : public MenuButton {
public:
- explicit TestMenuButton(ButtonListener* button_listener)
- : MenuButton(button_listener, base::string16(ASCIIToUTF16("button"))) {}
-
+ TestMenuButton()
+ : TestMenuButton(base::BindRepeating(&TestMenuButton::ButtonPressed,
+ base::Unretained(this))) {}
+ explicit TestMenuButton(PressedCallback callback)
+ : MenuButton(std::move(callback),
+ base::string16(ASCIIToUTF16("button"))) {}
+ TestMenuButton(const TestMenuButton&) = delete;
+ TestMenuButton& operator=(const TestMenuButton&) = delete;
~TestMenuButton() override = default;
- void SetInkDrop(std::unique_ptr<InkDrop> ink_drop) {
- InkDropHostViewTestApi(this).SetInkDrop(std::move(ink_drop));
+ bool clicked() const { return clicked_; }
+ Button::ButtonState last_state() const { return last_state_; }
+ ui::EventType last_event_type() const { return last_event_type_; }
+
+ void Reset() {
+ clicked_ = false;
+ last_state_ = Button::STATE_NORMAL;
+ last_event_type_ = ui::ET_UNKNOWN;
}
private:
- DISALLOW_COPY_AND_ASSIGN(TestMenuButton);
+ void ButtonPressed(const ui::Event& event) {
+ clicked_ = true;
+ last_state_ = GetState();
+ last_event_type_ = event.type();
+ }
+
+ bool clicked_ = false;
+ Button::ButtonState last_state_ = Button::STATE_NORMAL;
+ ui::EventType last_event_type_ = ui::ET_UNKNOWN;
};
class MenuButtonTest : public ViewsTestBase {
public:
MenuButtonTest() = default;
+ MenuButtonTest(const MenuButtonTest&) = delete;
+ MenuButtonTest& operator=(const MenuButtonTest&) = delete;
~MenuButtonTest() override = default;
void TearDown() override {
@@ -67,46 +83,16 @@ class MenuButtonTest : public ViewsTestBase {
ViewsTestBase::TearDown();
}
+ protected:
Widget* widget() { return widget_; }
TestMenuButton* button() { return button_; }
ui::test::EventGenerator* generator() { return generator_.get(); }
-
- protected:
- TestInkDrop* ink_drop() { return ink_drop_; }
-
- // Creates a MenuButton with no button listener.
- void CreateMenuButtonWithNoListener() { CreateMenuButton(nullptr); }
-
- // Creates a MenuButton with a ButtonListener. In this case, when the
- // MenuButton is pushed, it notifies the ButtonListener to open a
- // drop-down menu.
- void CreateMenuButtonWithButtonListener(ButtonListener* button_listener) {
- CreateMenuButton(button_listener);
- }
+ test::TestInkDrop* ink_drop() { return ink_drop_; }
gfx::Point GetOutOfButtonLocation() const {
return gfx::Point(button_->x() - 1, button_->y() - 1);
}
- void CreateMenuButton(ButtonListener* button_listener) {
- CreateWidget();
- generator_ =
- std::make_unique<ui::test::EventGenerator>(GetRootWindow(widget_));
- // Set initial mouse location in a consistent way so that the menu button we
- // are about to create initializes its hover state in a consistent manner.
- generator_->set_current_screen_location(gfx::Point(10, 10));
-
- button_ = widget_->SetContentsView(
- std::make_unique<TestMenuButton>(button_listener));
- button_->SetBoundsRect(gfx::Rect(0, 0, 200, 20));
-
- ink_drop_ = new test::TestInkDrop();
- test::InkDropHostViewTestApi(button_).SetInkDrop(
- base::WrapUnique(ink_drop_));
-
- widget_->Show();
- }
-
void CreateWidget() {
DCHECK(!widget_);
@@ -117,75 +103,54 @@ class MenuButtonTest : public ViewsTestBase {
widget_->Init(std::move(params));
}
- Widget* widget_ = nullptr;
- TestMenuButton* button_ = nullptr;
- std::unique_ptr<ui::test::EventGenerator> generator_;
-
- // Weak ptr, |button_| owns the instance.
- TestInkDrop* ink_drop_ = nullptr;
+ void ConfigureMenuButton(std::unique_ptr<TestMenuButton> button) {
+ CreateWidget();
+ generator_ =
+ std::make_unique<ui::test::EventGenerator>(GetRootWindow(widget_));
+ // Set initial mouse location in a consistent way so that the menu button we
+ // are about to create initializes its hover state in a consistent manner.
+ generator_->set_current_screen_location(gfx::Point(10, 10));
- DISALLOW_COPY_AND_ASSIGN(MenuButtonTest);
-};
+ button_ = widget_->SetContentsView(std::move(button));
+ button_->SetBoundsRect(gfx::Rect(0, 0, 200, 20));
-class TestButtonListener : public ButtonListener {
- public:
- TestButtonListener() = default;
- ~TestButtonListener() override = default;
-
- void ButtonPressed(Button* sender, const ui::Event& event) override {
- last_sender_ = sender;
- Button* button = Button::AsButton(sender);
- DCHECK(button);
- last_sender_state_ = button->GetState();
- last_event_type_ = event.type();
- }
+ auto ink_drop = std::make_unique<test::TestInkDrop>();
+ ink_drop_ = ink_drop.get();
+ test::InkDropHostViewTestApi(button_).SetInkDrop(std::move(ink_drop));
- void Reset() {
- last_sender_ = nullptr;
- last_sender_state_ = Button::STATE_NORMAL;
- last_event_type_ = ui::ET_UNKNOWN;
+ widget_->Show();
}
- Button* last_sender() { return last_sender_; }
- Button::ButtonState last_sender_GetState() { return last_sender_state_; }
- ui::EventType last_event_type() { return last_event_type_; }
-
private:
- Button* last_sender_ = nullptr;
- Button::ButtonState last_sender_state_ = Button::STATE_NORMAL;
- ui::EventType last_event_type_ = ui::ET_UNKNOWN;
-
- DISALLOW_COPY_AND_ASSIGN(TestButtonListener);
+ Widget* widget_ = nullptr; // Owned by self.
+ TestMenuButton* button_ = nullptr; // Owned by |widget_|.
+ std::unique_ptr<ui::test::EventGenerator> generator_;
+ test::TestInkDrop* ink_drop_ = nullptr; // Owned by |button_|.
};
-// A ButtonListener that will acquire a PressedLock in the
-// ButtonPressed() method and optionally release it as well.
-class PressStateButtonListener : public ButtonListener {
+// A Button that will acquire a PressedLock in the pressed callback and
+// optionally release it as well.
+class PressStateButton : public TestMenuButton {
public:
- explicit PressStateButtonListener(bool release_lock)
- : menu_button_(nullptr), release_lock_(release_lock) {}
-
- ~PressStateButtonListener() override = default;
-
- void set_menu_button(MenuButton* menu_button) { menu_button_ = menu_button; }
-
- void ButtonPressed(Button* source, const ui::Event& event) override {
- pressed_lock_ = menu_button_->button_controller()->TakeLock();
- if (release_lock_)
- pressed_lock_.reset();
- }
+ explicit PressStateButton(bool release_lock)
+ : TestMenuButton(base::BindRepeating(&PressStateButton::ButtonPressed,
+ base::Unretained(this))),
+ release_lock_(release_lock) {}
+ PressStateButton(const PressStateButton&) = delete;
+ PressStateButton& operator=(const PressStateButton&) = delete;
+ ~PressStateButton() override = default;
void ReleasePressedLock() { pressed_lock_.reset(); }
private:
- MenuButton* menu_button_;
-
- std::unique_ptr<MenuButtonController::PressedLock> pressed_lock_;
+ void ButtonPressed() {
+ pressed_lock_ = button_controller()->TakeLock();
+ if (release_lock_)
+ ReleasePressedLock();
+ }
- // The |pressed_lock_| will be released when true.
bool release_lock_;
-
- DISALLOW_COPY_AND_ASSIGN(PressStateButtonListener);
+ std::unique_ptr<MenuButtonController::PressedLock> pressed_lock_;
};
// Basic implementation of a DragController, to test input behaviour for
@@ -193,6 +158,8 @@ class PressStateButtonListener : public ButtonListener {
class TestDragController : public DragController {
public:
TestDragController() = default;
+ TestDragController(const TestDragController&) = delete;
+ TestDragController& operator=(const TestDragController&) = delete;
~TestDragController() override = default;
void WriteDragDataForView(View* sender,
@@ -208,9 +175,6 @@ class TestDragController : public DragController {
const gfx::Point& p) override {
return true;
}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(TestDragController);
};
#if defined(USE_AURA)
@@ -221,6 +185,8 @@ class TestDragDropClient : public aura::client::DragDropClient,
public ui::EventHandler {
public:
TestDragDropClient();
+ TestDragDropClient(const TestDragDropClient&) = delete;
+ TestDragDropClient& operator=(const TestDragDropClient&) = delete;
~TestDragDropClient() override;
// aura::client::DragDropClient:
@@ -245,8 +211,6 @@ class TestDragDropClient : public aura::client::DragDropClient,
// Target window where drag operations are occurring.
aura::Window* target_ = nullptr;
-
- DISALLOW_COPY_AND_ASSIGN(TestDragDropClient);
};
TestDragDropClient::TestDragDropClient() = default;
@@ -292,77 +256,50 @@ void TestDragDropClient::OnMouseEvent(ui::MouseEvent* event) {
}
#endif // defined(USE_AURA)
-class TestShowSiblingButtonListener : public ButtonListener {
- public:
- TestShowSiblingButtonListener() = default;
- ~TestShowSiblingButtonListener() override = default;
-
- void ButtonPressed(Button* source, const ui::Event& event) override {
- // The MenuButton itself doesn't set the PRESSED state during Activate() or
- // ButtonPressed(). That should be handled by the MenuController or,
- // if no menu is shown, the listener.
- EXPECT_EQ(Button::STATE_HOVERED, source->GetState());
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(TestShowSiblingButtonListener);
-};
-
-// Tests if the listener is notified correctly when a mouse click happens on a
-// MenuButton that has a ButtonListener.
+// Tests if the callback is called correctly when a mouse click happens on a
+// MenuButton.
TEST_F(MenuButtonTest, ActivateDropDownOnMouseClick) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
generator()->ClickLeftButton();
- // Check that MenuButton has notified the listener, while it was in pressed
- // state.
- EXPECT_EQ(button(), button_listener.last_sender());
- EXPECT_EQ(Button::STATE_HOVERED, button_listener.last_sender_GetState());
+ EXPECT_TRUE(button()->clicked());
+ EXPECT_EQ(Button::STATE_HOVERED, button()->last_state());
}
TEST_F(MenuButtonTest, ActivateOnKeyPress) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
- EXPECT_EQ(nullptr, button_listener.last_sender());
+ EXPECT_FALSE(button()->clicked());
button()->OnKeyPressed(ui::KeyEvent(
ui::ET_KEY_PRESSED, ui::KeyboardCode::VKEY_SPACE, ui::DomCode::SPACE, 0));
- EXPECT_EQ(button(), button_listener.last_sender());
+ EXPECT_TRUE(button()->clicked());
- button_listener.Reset();
- EXPECT_EQ(nullptr, button_listener.last_sender());
+ button()->Reset();
+ EXPECT_FALSE(button()->clicked());
button()->OnKeyPressed(ui::KeyEvent(ui::ET_KEY_PRESSED,
ui::KeyboardCode::VKEY_RETURN,
ui::DomCode::ENTER, 0));
- if (PlatformStyle::kReturnClicksFocusedControl) {
- EXPECT_EQ(button(), button_listener.last_sender());
- } else {
- EXPECT_EQ(nullptr, button_listener.last_sender());
- }
+ EXPECT_EQ(PlatformStyle::kReturnClicksFocusedControl, button()->clicked());
}
// Tests that the ink drop center point is set from the mouse click point.
TEST_F(MenuButtonTest, InkDropCenterSetFromClick) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
gfx::Point click_point(6, 8);
generator()->MoveMouseTo(click_point);
generator()->ClickLeftButton();
- EXPECT_EQ(button(), button_listener.last_sender());
- EXPECT_EQ(
- click_point,
- InkDropHostViewTestApi(button()).GetInkDropCenterBasedOnLastEvent());
+ EXPECT_TRUE(button()->clicked());
+ EXPECT_EQ(click_point, test::InkDropHostViewTestApi(button())
+ .GetInkDropCenterBasedOnLastEvent());
}
// Tests that the ink drop center point is set from the PressedLock constructor.
TEST_F(MenuButtonTest, InkDropCenterSetFromClickWithPressedLock) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
gfx::Point click_point(11, 7);
ui::MouseEvent click_event(ui::EventType::ET_MOUSE_PRESSED, click_point,
@@ -371,22 +308,21 @@ TEST_F(MenuButtonTest, InkDropCenterSetFromClickWithPressedLock) {
false, &click_event);
EXPECT_EQ(Button::STATE_PRESSED, button()->GetState());
- EXPECT_EQ(
- click_point,
- InkDropHostViewTestApi(button()).GetInkDropCenterBasedOnLastEvent());
+ EXPECT_EQ(click_point, test::InkDropHostViewTestApi(button())
+ .GetInkDropCenterBasedOnLastEvent());
}
// Test that the MenuButton stays pressed while there are any PressedLocks.
TEST_F(MenuButtonTest, ButtonStateForMenuButtonsWithPressedLocks) {
- CreateMenuButtonWithNoListener();
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
// Move the mouse over the button; the button should be in a hovered state.
generator()->MoveMouseTo(gfx::Point(10, 10));
EXPECT_EQ(Button::STATE_HOVERED, button()->GetState());
// Introduce a PressedLock, which should make the button pressed.
- std::unique_ptr<MenuButtonController::PressedLock> pressed_lock1(
- new MenuButtonController::PressedLock(button()->button_controller()));
+ auto pressed_lock1 = std::make_unique<MenuButtonController::PressedLock>(
+ button()->button_controller());
EXPECT_EQ(Button::STATE_PRESSED, button()->GetState());
// Even if we move the mouse outside of the button, it should remain pressed.
@@ -394,8 +330,8 @@ TEST_F(MenuButtonTest, ButtonStateForMenuButtonsWithPressedLocks) {
EXPECT_EQ(Button::STATE_PRESSED, button()->GetState());
// Creating a new lock should obviously keep the button pressed.
- std::unique_ptr<MenuButtonController::PressedLock> pressed_lock2(
- new MenuButtonController::PressedLock(button()->button_controller()));
+ auto pressed_lock2 = std::make_unique<MenuButtonController::PressedLock>(
+ button()->button_controller());
EXPECT_EQ(Button::STATE_PRESSED, button()->GetState());
// The button should remain pressed while any locks are active.
@@ -436,37 +372,24 @@ TEST_F(MenuButtonTest, ButtonStateForMenuButtonsWithPressedLocks) {
EXPECT_EQ(Button::STATE_NORMAL, button()->GetState());
}
-// Test that if a sibling menu is shown, the original menu button releases its
-// PressedLock.
-TEST_F(MenuButtonTest, PressedStateWithSiblingMenu) {
- TestShowSiblingButtonListener listener;
- CreateMenuButtonWithButtonListener(&listener);
-
- // Move the mouse over the button; the button should be in a hovered state.
- generator()->MoveMouseTo(gfx::Point(10, 10));
- EXPECT_EQ(Button::STATE_HOVERED, button()->GetState());
- generator()->ClickLeftButton();
- // Test is continued in TestShowSiblingButtonListener::ButtonPressed().
-}
-
// Test that the MenuButton does not become pressed if it can be dragged, until
// a release occurs.
TEST_F(MenuButtonTest, DraggableMenuButtonActivatesOnRelease) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
TestDragController drag_controller;
button()->set_drag_controller(&drag_controller);
generator()->PressLeftButton();
- EXPECT_EQ(nullptr, button_listener.last_sender());
+ EXPECT_FALSE(button()->clicked());
generator()->ReleaseLeftButton();
- EXPECT_EQ(button(), button_listener.last_sender());
- EXPECT_EQ(Button::STATE_HOVERED, button_listener.last_sender_GetState());
+ EXPECT_TRUE(button()->clicked());
+ EXPECT_EQ(Button::STATE_HOVERED, button()->last_state());
}
-TEST_F(MenuButtonTest, InkDropStateForMenuButtonActivationsWithoutListener) {
- CreateMenuButtonWithNoListener();
+TEST_F(MenuButtonTest, InkDropStateForMenuButtonActivationsWithoutCallback) {
+ ConfigureMenuButton(
+ std::make_unique<TestMenuButton>(Button::PressedCallback()));
ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
button()->Activate(nullptr);
@@ -474,9 +397,8 @@ TEST_F(MenuButtonTest, InkDropStateForMenuButtonActivationsWithoutListener) {
}
TEST_F(MenuButtonTest,
- InkDropStateForMenuButtonActivationsWithListenerThatDoesntAcquireALock) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ InkDropStateForMenuButtonActivationsWithCallbackThatDoesntAcquireALock) {
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
button()->Activate(nullptr);
EXPECT_EQ(InkDropState::ACTION_TRIGGERED,
@@ -485,35 +407,31 @@ TEST_F(MenuButtonTest,
TEST_F(
MenuButtonTest,
- InkDropStateForMenuButtonActivationsWithListenerThatDontReleaseAllLocks) {
- PressStateButtonListener button_listener(false);
- CreateMenuButtonWithButtonListener(&button_listener);
- button_listener.set_menu_button(button());
+ InkDropStateForMenuButtonActivationsWithCallbackThatDoesntReleaseAllLocks) {
+ ConfigureMenuButton(std::make_unique<PressStateButton>(false));
button()->Activate(nullptr);
EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
}
TEST_F(MenuButtonTest,
- InkDropStateForMenuButtonActivationsWithListenerThatReleaseAllLocks) {
- PressStateButtonListener button_listener(true);
- CreateMenuButtonWithButtonListener(&button_listener);
- button_listener.set_menu_button(button());
+ InkDropStateForMenuButtonActivationsWithCallbackThatReleasesAllLocks) {
+ ConfigureMenuButton(std::make_unique<PressStateButton>(true));
button()->Activate(nullptr);
EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop()->GetTargetInkDropState());
}
TEST_F(MenuButtonTest, InkDropStateForMenuButtonsWithPressedLocks) {
- CreateMenuButtonWithNoListener();
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
- std::unique_ptr<MenuButtonController::PressedLock> pressed_lock1(
- new MenuButtonController::PressedLock(button()->button_controller()));
+ auto pressed_lock1 = std::make_unique<MenuButtonController::PressedLock>(
+ button()->button_controller());
EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
- std::unique_ptr<MenuButtonController::PressedLock> pressed_lock2(
- new MenuButtonController::PressedLock(button()->button_controller()));
+ auto pressed_lock2 = std::make_unique<MenuButtonController::PressedLock>(
+ button()->button_controller());
EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
@@ -527,16 +445,16 @@ TEST_F(MenuButtonTest, InkDropStateForMenuButtonsWithPressedLocks) {
// Verifies only one ink drop animation is triggered when multiple PressedLocks
// are attached to a MenuButton.
TEST_F(MenuButtonTest, OneInkDropAnimationForReentrantPressedLocks) {
- CreateMenuButtonWithNoListener();
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
- std::unique_ptr<MenuButtonController::PressedLock> pressed_lock1(
- new MenuButtonController::PressedLock(button()->button_controller()));
+ auto pressed_lock1 = std::make_unique<MenuButtonController::PressedLock>(
+ button()->button_controller());
EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
- std::unique_ptr<MenuButtonController::PressedLock> pressed_lock2(
- new MenuButtonController::PressedLock(button()->button_controller()));
+ auto pressed_lock2 = std::make_unique<MenuButtonController::PressedLock>(
+ button()->button_controller());
EXPECT_EQ(InkDropState::ACTION_PENDING, ink_drop()->GetTargetInkDropState());
}
@@ -545,8 +463,7 @@ TEST_F(MenuButtonTest, OneInkDropAnimationForReentrantPressedLocks) {
// before another Activation occurs.
TEST_F(MenuButtonTest,
InkDropStateForMenuButtonWithPressedLockBeforeActivation) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
MenuButtonController::PressedLock lock(button()->button_controller());
button()->Activate(nullptr);
@@ -559,8 +476,7 @@ TEST_F(MenuButtonTest,
// Tests that the MenuButton does not become pressed if it can be dragged, and a
// DragDropClient is processing the events.
TEST_F(MenuButtonTest, DraggableMenuButtonDoesNotActivateOnDrag) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
TestDragController drag_controller;
button()->set_drag_controller(&drag_controller);
@@ -570,8 +486,8 @@ TEST_F(MenuButtonTest, DraggableMenuButtonDoesNotActivateOnDrag) {
ui::EventTarget::Priority::kSystem);
generator()->DragMouseBy(10, 0);
- EXPECT_EQ(nullptr, button_listener.last_sender());
- EXPECT_EQ(Button::STATE_NORMAL, button_listener.last_sender_GetState());
+ EXPECT_FALSE(button()->clicked());
+ EXPECT_EQ(Button::STATE_NORMAL, button()->last_state());
button()->RemovePreTargetHandler(&drag_client);
}
@@ -580,11 +496,10 @@ TEST_F(MenuButtonTest, DraggableMenuButtonDoesNotActivateOnDrag) {
// No touch on desktop Mac. Tracked in http://crbug.com/445520.
#if !defined(OS_APPLE) || defined(USE_AURA)
-// Tests if the listener is notified correctly when a gesture tap happens on a
-// MenuButton that has a ButtonListener.
+// Tests if the callback is notified correctly when a gesture tap happens on a
+// MenuButton that has a callback.
TEST_F(MenuButtonTest, ActivateDropDownOnGestureTap) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
// Move the mouse outside the menu button so that it doesn't impact the
// button state.
@@ -593,47 +508,43 @@ TEST_F(MenuButtonTest, ActivateDropDownOnGestureTap) {
generator()->GestureTapAt(gfx::Point(10, 10));
- // Check that MenuButton has notified the listener, while it was in pressed
+ // Check that MenuButton has notified the callback, while it was in pressed
// state.
- EXPECT_EQ(button(), button_listener.last_sender());
- EXPECT_EQ(Button::STATE_HOVERED, button_listener.last_sender_GetState());
+ EXPECT_TRUE(button()->clicked());
+ EXPECT_EQ(Button::STATE_HOVERED, button()->last_state());
- // The button should go back to it's normal state since the gesture ended.
+ // The button should go back to its normal state since the gesture ended.
EXPECT_EQ(Button::STATE_NORMAL, button()->GetState());
}
// Tests that the button enters a hovered state upon a tap down, before becoming
// pressed at activation.
TEST_F(MenuButtonTest, TouchFeedbackDuringTap) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
generator()->PressTouch();
EXPECT_EQ(Button::STATE_HOVERED, button()->GetState());
generator()->ReleaseTouch();
- EXPECT_EQ(Button::STATE_HOVERED, button_listener.last_sender_GetState());
+ EXPECT_EQ(Button::STATE_HOVERED, button()->last_state());
}
// Tests that a move event that exits the button returns it to the normal state,
-// and that the button did not activate the listener.
+// and that the button did not activate the callback.
TEST_F(MenuButtonTest, TouchFeedbackDuringTapCancel) {
- TestButtonListener button_listener;
- CreateMenuButtonWithButtonListener(&button_listener);
+ ConfigureMenuButton(std::make_unique<TestMenuButton>());
generator()->PressTouch();
EXPECT_EQ(Button::STATE_HOVERED, button()->GetState());
generator()->MoveTouch(gfx::Point(10, 30));
generator()->ReleaseTouch();
EXPECT_EQ(Button::STATE_NORMAL, button()->GetState());
- EXPECT_EQ(nullptr, button_listener.last_sender());
+ EXPECT_FALSE(button()->clicked());
}
#endif // !defined(OS_APPLE) || defined(USE_AURA)
TEST_F(MenuButtonTest, InkDropHoverWhenShowingMenu) {
- PressStateButtonListener button_listener(false);
- CreateMenuButtonWithButtonListener(&button_listener);
- button_listener.set_menu_button(button());
+ ConfigureMenuButton(std::make_unique<PressStateButton>(false));
generator()->MoveMouseTo(GetOutOfButtonLocation());
EXPECT_FALSE(ink_drop()->is_hovered());
@@ -646,62 +557,44 @@ TEST_F(MenuButtonTest, InkDropHoverWhenShowingMenu) {
}
TEST_F(MenuButtonTest, InkDropIsHoveredAfterDismissingMenuWhenMouseOverButton) {
- PressStateButtonListener button_listener(false);
- CreateMenuButtonWithButtonListener(&button_listener);
- button_listener.set_menu_button(button());
+ auto press_state_button = std::make_unique<PressStateButton>(false);
+ auto* test_button = press_state_button.get();
+ ConfigureMenuButton(std::move(press_state_button));
generator()->MoveMouseTo(button()->bounds().CenterPoint());
generator()->PressLeftButton();
EXPECT_FALSE(ink_drop()->is_hovered());
- button_listener.ReleasePressedLock();
+ test_button->ReleasePressedLock();
EXPECT_TRUE(ink_drop()->is_hovered());
}
TEST_F(MenuButtonTest,
InkDropIsntHoveredAfterDismissingMenuWhenMouseOutsideButton) {
- PressStateButtonListener button_listener(false);
- CreateMenuButtonWithButtonListener(&button_listener);
- button_listener.set_menu_button(button());
+ auto press_state_button = std::make_unique<PressStateButton>(false);
+ auto* test_button = press_state_button.get();
+ ConfigureMenuButton(std::move(press_state_button));
generator()->MoveMouseTo(button()->bounds().CenterPoint());
generator()->PressLeftButton();
generator()->MoveMouseTo(GetOutOfButtonLocation());
- button_listener.ReleasePressedLock();
+ test_button->ReleasePressedLock();
EXPECT_FALSE(ink_drop()->is_hovered());
}
-class DestroyButtonInGestureListener : public ButtonListener {
- public:
- DestroyButtonInGestureListener() {
- menu_button_ = std::make_unique<MenuButton>();
- }
-
- ~DestroyButtonInGestureListener() override = default;
-
- MenuButton* menu_button() { return menu_button_.get(); }
-
- private:
- // ButtonListener:
- void ButtonPressed(Button* source, const ui::Event& event) override {
- menu_button_.reset();
- }
-
- std::unique_ptr<MenuButton> menu_button_;
-
- DISALLOW_COPY_AND_ASSIGN(DestroyButtonInGestureListener);
-};
-
-// This test ensures there isn't a UAF in MenuButton::OnGestureEvent() if
-// the ButtonListener::ButtonPressed() deletes the MenuButton.
+// This test ensures there isn't a UAF in MenuButton::OnGestureEvent() if the
+// button callback deletes the MenuButton.
TEST_F(MenuButtonTest, DestroyButtonInGesture) {
- DestroyButtonInGestureListener listener;
+ std::unique_ptr<TestMenuButton> test_menu_button =
+ std::make_unique<TestMenuButton>(base::BindRepeating(
+ [](std::unique_ptr<TestMenuButton>* button) { button->reset(); },
+ &test_menu_button));
+ ConfigureMenuButton(std::move(test_menu_button));
+
ui::GestureEvent gesture_event(0, 0, 0, base::TimeTicks::Now(),
ui::GestureEventDetails(ui::ET_GESTURE_TAP));
- CreateWidget();
- widget_->SetContentsView(listener.menu_button());
- listener.menu_button()->OnGestureEvent(&gesture_event);
+ button()->OnGestureEvent(&gesture_event);
}
} // namespace views
diff --git a/chromium/ui/views/controls/button/radio_button.cc b/chromium/ui/views/controls/button/radio_button.cc
index efa7faa8784..53fbed91c88 100644
--- a/chromium/ui/views/controls/button/radio_button.cc
+++ b/chromium/ui/views/controls/button/radio_button.cc
@@ -11,6 +11,7 @@
#include "ui/events/event_utils.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/resources/grit/views_resources.h"
#include "ui/views/vector_icons.h"
#include "ui/views/widget/widget.h"
diff --git a/chromium/ui/views/controls/button/toggle_button.cc b/chromium/ui/views/controls/button/toggle_button.cc
index 0362e8cf428..e64e389141f 100644
--- a/chromium/ui/views/controls/button/toggle_button.cc
+++ b/chromium/ui/views/controls/button/toggle_button.cc
@@ -126,7 +126,6 @@ ToggleButton::ToggleButton(PressedCallback callback)
slide_animation_.SetTweenType(gfx::Tween::LINEAR);
thumb_view_ = AddChildView(std::make_unique<ThumbView>());
SetInkDropMode(InkDropMode::ON);
- SetFocusForPlatform();
// TODO(pbos): Update the highlight-path shape so that a FocusRing can be used
// on top of it to increase contrast. Disabling it for now addresses a
// regression in crbug.com/1031983, but a matching FocusRing would probably be
@@ -135,9 +134,6 @@ ToggleButton::ToggleButton(PressedCallback callback)
SetHasInkDropActionOnClick(true);
}
-ToggleButton::ToggleButton(ButtonListener* listener)
- : ToggleButton(PressedCallback(listener, this)) {}
-
ToggleButton::~ToggleButton() {
// Destroying ink drop early allows ink drop layer to be properly removed,
SetInkDropMode(InkDropMode::OFF);
diff --git a/chromium/ui/views/controls/button/toggle_button.h b/chromium/ui/views/controls/button/toggle_button.h
index 351285b20d4..b734019edb4 100644
--- a/chromium/ui/views/controls/button/toggle_button.h
+++ b/chromium/ui/views/controls/button/toggle_button.h
@@ -21,7 +21,6 @@ class VIEWS_EXPORT ToggleButton : public Button {
METADATA_HEADER(ToggleButton);
explicit ToggleButton(PressedCallback callback = PressedCallback());
- explicit ToggleButton(ButtonListener* listener);
~ToggleButton() override;
// AnimateIsOn() animates the state change to |is_on|; SetIsOn() doesn't.
diff --git a/chromium/ui/views/controls/combobox/combobox.cc b/chromium/ui/views/controls/combobox/combobox.cc
index 5757613f09e..f911fa3aeb0 100644
--- a/chromium/ui/views/controls/combobox/combobox.cc
+++ b/chromium/ui/views/controls/combobox/combobox.cc
@@ -68,7 +68,8 @@ gfx::ImageSkia GetImageSkiaFromImageModel(const ui::ImageModel* model,
// The transparent button which holds a button state but is not rendered.
class TransparentButton : public Button {
public:
- explicit TransparentButton(ButtonListener* listener) : Button(listener) {
+ explicit TransparentButton(PressedCallback callback)
+ : Button(std::move(callback)) {
SetFocusBehavior(FocusBehavior::NEVER);
button_controller()->set_notify_action(
ButtonController::NotifyAction::kOnPress);
@@ -213,7 +214,7 @@ class Combobox::ComboboxMenuModel : public ui::MenuModel {
}
void ActivatedAt(int index) override {
- owner_->selected_index_ = index;
+ owner_->SetSelectedIndex(index);
owner_->OnPerformAction();
}
@@ -243,7 +244,9 @@ Combobox::Combobox(std::unique_ptr<ui::ComboboxModel> model,
Combobox::Combobox(ui::ComboboxModel* model, int text_context, int text_style)
: text_context_(text_context),
text_style_(text_style),
- arrow_button_(new TransparentButton(this)) {
+ arrow_button_(new TransparentButton(
+ base::BindRepeating(&Combobox::ArrowButtonPressed,
+ base::Unretained(this)))) {
SetModel(model);
#if defined(OS_APPLE)
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
@@ -276,7 +279,8 @@ const gfx::FontList& Combobox::GetFontList() const {
}
void Combobox::SetSelectedIndex(int index) {
- // TODO(http://crbug.com/1132465): No-op when selected_index_ == index.
+ if (selected_index_ == index)
+ return;
selected_index_ = index;
if (size_to_largest_label_) {
OnPropertyChanged(&selected_index_, kPropertyEffectsPaint);
@@ -287,8 +291,8 @@ void Combobox::SetSelectedIndex(int index) {
}
bool Combobox::SelectValue(const base::string16& value) {
- for (int i = 0; i < model()->GetItemCount(); ++i) {
- if (value == model()->GetItemAt(i)) {
+ for (int i = 0; i < GetModel()->GetItemCount(); ++i) {
+ if (value == GetModel()->GetItemAt(i)) {
SetSelectedIndex(i);
return true;
}
@@ -313,12 +317,17 @@ void Combobox::SetModel(ui::ComboboxModel* model) {
if (model_) {
menu_model_ = std::make_unique<ComboboxMenuModel>(this, model_);
observer_.Add(model_);
- selected_index_ = model_->GetDefaultIndex();
+ SetSelectedIndex(model_->GetDefaultIndex());
OnComboboxModelChanged(model_);
}
}
-void Combobox::SetTooltipText(const base::string16& tooltip_text) {
+base::string16 Combobox::GetTooltipTextAndAccessibleName() const {
+ return arrow_button_->GetTooltipText();
+}
+
+void Combobox::SetTooltipTextAndAccessibleName(
+ const base::string16& tooltip_text) {
arrow_button_->SetTooltipText(tooltip_text);
if (accessible_name_.empty())
accessible_name_ = tooltip_text;
@@ -364,7 +373,7 @@ void Combobox::OnThemeChanged() {
}
int Combobox::GetRowCount() {
- return model()->GetItemCount();
+ return GetModel()->GetItemCount();
}
int Combobox::GetSelectedRow() {
@@ -379,8 +388,8 @@ void Combobox::SetSelectedRow(int row) {
}
base::string16 Combobox::GetTextForRow(int row) {
- return model()->IsItemSeparatorAt(row) ? base::string16()
- : model()->GetItemAt(row);
+ return GetModel()->IsItemSeparatorAt(row) ? base::string16()
+ : GetModel()->GetItemAt(row);
}
////////////////////////////////////////////////////////////////////////////////
@@ -420,9 +429,9 @@ bool Combobox::OnKeyPressed(const ui::KeyEvent& e) {
DCHECK_EQ(e.type(), ui::ET_KEY_PRESSED);
DCHECK_GE(selected_index_, 0);
- DCHECK_LT(selected_index_, model()->GetItemCount());
- if (selected_index_ < 0 || selected_index_ > model()->GetItemCount())
- selected_index_ = 0;
+ DCHECK_LT(selected_index_, GetModel()->GetItemCount());
+ if (selected_index_ < 0 || selected_index_ > GetModel()->GetItemCount())
+ SetSelectedIndex(0);
bool show_menu = false;
int new_index = kNoSelection;
@@ -449,24 +458,24 @@ bool Combobox::OnKeyPressed(const ui::KeyEvent& e) {
if (e.IsAltDown())
show_menu = true;
else
- new_index = GetAdjacentIndex(model(), 1, selected_index_);
+ new_index = GetAdjacentIndex(GetModel(), 1, selected_index_);
break;
// Move to the end of the list.
case ui::VKEY_END:
case ui::VKEY_NEXT: // Page down.
- new_index = GetAdjacentIndex(model(), -1, model()->GetItemCount());
+ new_index = GetAdjacentIndex(GetModel(), -1, GetModel()->GetItemCount());
break;
// Move to the beginning of the list.
case ui::VKEY_HOME:
case ui::VKEY_PRIOR: // Page up.
- new_index = GetAdjacentIndex(model(), 1, -1);
+ new_index = GetAdjacentIndex(GetModel(), 1, -1);
break;
// Move to the previous item if any.
case ui::VKEY_UP:
- new_index = GetAdjacentIndex(model(), -1, selected_index_);
+ new_index = GetAdjacentIndex(GetModel(), -1, selected_index_);
break;
case ui::VKEY_RETURN:
@@ -481,8 +490,8 @@ bool Combobox::OnKeyPressed(const ui::KeyEvent& e) {
if (show_menu) {
ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD);
} else if (new_index != selected_index_ && new_index != kNoSelection) {
- DCHECK(!model()->IsItemSeparatorAt(new_index));
- selected_index_ = new_index;
+ DCHECK(!GetModel()->IsItemSeparatorAt(new_index));
+ SetSelectedIndex(new_index);
OnPerformAction();
}
@@ -536,9 +545,8 @@ bool Combobox::HandleAccessibleAction(const ui::AXActionData& action_data) {
// |this|. However, mouse events for Combobox are handled by |arrow_button_|,
// which is hidden from the a11y tree (so can't expose actions). Rather than
// forwarding ax::mojom::Action::kDoDefault to View and then forwarding the
- // mouse event it generates to |arrow_button_| to have it forward back to
- // |this| (as its ButtonListener), just handle the action explicitly here and
- // bypass View.
+ // mouse event it generates to |arrow_button_| to have it forward back to the
+ // callback on |this|, just handle the action explicitly here and bypass View.
if (GetEnabled() && action_data.action == ax::mojom::Action::kDoDefault) {
ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD);
return true;
@@ -546,16 +554,6 @@ bool Combobox::HandleAccessibleAction(const ui::AXActionData& action_data) {
return View::HandleAccessibleAction(action_data);
}
-void Combobox::ButtonPressed(Button* sender, const ui::Event& event) {
- if (!GetEnabled())
- return;
-
- // TODO(hajimehoshi): Fix the problem that the arrow button blinks when
- // cliking this while the dropdown menu is opened.
- if ((base::TimeTicks::Now() - closed_time_) > kMinimumTimeBetweenButtonClicks)
- ShowDropDownMenu(ui::GetMenuSourceTypeForEvent(event));
-}
-
void Combobox::OnComboboxModelChanged(ui::ComboboxModel* model) {
DCHECK_EQ(model_, model);
@@ -564,7 +562,7 @@ void Combobox::OnComboboxModelChanged(ui::ComboboxModel* model) {
if (selected_index_ >= model_->GetItemCount() ||
model_->GetItemCount() == 0 ||
model_->IsItemSeparatorAt(selected_index_)) {
- selected_index_ = model_->GetDefaultIndex();
+ SetSelectedIndex(model_->GetDefaultIndex());
}
content_size_ = GetContentSize();
@@ -572,6 +570,14 @@ void Combobox::OnComboboxModelChanged(ui::ComboboxModel* model) {
SchedulePaint();
}
+const base::RepeatingClosure& Combobox::GetCallback() const {
+ return callback_;
+}
+
+const std::unique_ptr<ui::ComboboxModel>& Combobox::GetOwnedModel() const {
+ return owned_model_;
+}
+
void Combobox::UpdateBorder() {
std::unique_ptr<FocusableBorder> border(new FocusableBorder());
if (invalid_)
@@ -596,7 +602,7 @@ void Combobox::PaintIconAndText(gfx::Canvas* canvas) {
int contents_height = height() - insets.height();
// Draw the icon.
- ui::ImageModel icon = model()->GetIconAt(selected_index_);
+ ui::ImageModel icon = GetModel()->GetIconAt(selected_index_);
if (!icon.IsEmpty()) {
gfx::ImageSkia icon_skia =
GetImageSkiaFromImageModel(&icon, GetNativeTheme());
@@ -610,11 +616,11 @@ void Combobox::PaintIconAndText(gfx::Canvas* canvas) {
// Draw the text.
SkColor text_color = GetTextColorForEnableState(*this, GetEnabled());
- DCHECK_GE(selected_index_, 0);
- DCHECK_LT(selected_index_, model()->GetItemCount());
- if (selected_index_ < 0 || selected_index_ > model()->GetItemCount())
- selected_index_ = 0;
- base::string16 text = model()->GetItemAt(selected_index_);
+ if (selected_index_ < 0 || selected_index_ > GetModel()->GetItemCount()) {
+ NOTREACHED();
+ SetSelectedIndex(0);
+ }
+ base::string16 text = GetModel()->GetItemAt(selected_index_);
int disclosure_arrow_offset = width() - kComboboxArrowContainerWidth;
@@ -635,6 +641,16 @@ void Combobox::PaintIconAndText(gfx::Canvas* canvas) {
PaintComboboxArrow(text_color, arrow_bounds, canvas);
}
+void Combobox::ArrowButtonPressed(const ui::Event& event) {
+ if (!GetEnabled())
+ return;
+
+ // TODO(hajimehoshi): Fix the problem that the arrow button blinks when
+ // cliking this while the dropdown menu is opened.
+ if ((base::TimeTicks::Now() - closed_time_) > kMinimumTimeBetweenButtonClicks)
+ ShowDropDownMenu(ui::GetMenuSourceTypeForEvent(event));
+}
+
void Combobox::ShowDropDownMenu(ui::MenuSourceType source_type) {
constexpr int kMenuBorderWidthTop = 1;
// Menu's requested position's width should be the same as local bounds so the
@@ -684,13 +700,13 @@ gfx::Size Combobox::GetContentSize() const {
const gfx::FontList& font_list = GetFontList();
int height = font_list.GetHeight();
int width = 0;
- for (int i = 0; i < model()->GetItemCount(); ++i) {
+ for (int i = 0; i < GetModel()->GetItemCount(); ++i) {
if (model_->IsItemSeparatorAt(i))
continue;
if (size_to_largest_label_ || i == selected_index_) {
- int item_width = gfx::GetStringWidth(model()->GetItemAt(i), font_list);
- ui::ImageModel icon = model()->GetIconAt(i);
+ int item_width = gfx::GetStringWidth(GetModel()->GetItemAt(i), font_list);
+ ui::ImageModel icon = GetModel()->GetIconAt(i);
if (!icon.IsEmpty()) {
gfx::ImageSkia icon_skia =
GetImageSkiaFromImageModel(&icon, GetNativeTheme());
@@ -712,10 +728,14 @@ PrefixSelector* Combobox::GetPrefixSelector() {
}
BEGIN_METADATA(Combobox, View)
+ADD_PROPERTY_METADATA(base::RepeatingClosure, Callback)
+ADD_PROPERTY_METADATA(std::unique_ptr<ui::ComboboxModel>, OwnedModel)
+ADD_PROPERTY_METADATA(ui::ComboboxModel*, Model)
ADD_PROPERTY_METADATA(int, SelectedIndex)
ADD_PROPERTY_METADATA(bool, Invalid)
ADD_PROPERTY_METADATA(bool, SizeToLargestLabel)
ADD_PROPERTY_METADATA(base::string16, AccessibleName)
+ADD_PROPERTY_METADATA(base::string16, TooltipTextAndAccessibleName)
END_METADATA
} // namespace views
diff --git a/chromium/ui/views/controls/combobox/combobox.h b/chromium/ui/views/controls/combobox/combobox.h
index b13f3a3ac58..812810cc3b3 100644
--- a/chromium/ui/views/controls/combobox/combobox.h
+++ b/chromium/ui/views/controls/combobox/combobox.h
@@ -16,6 +16,7 @@
#include "ui/base/models/combobox_model_observer.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/prefix_delegate.h"
+#include "ui/views/metadata/view_factory.h"
#include "ui/views/style/typography.h"
namespace gfx {
@@ -39,7 +40,6 @@ class PrefixSelector;
// Combobox has two distinct parts, the drop down arrow and the text.
class VIEWS_EXPORT Combobox : public View,
public PrefixDelegate,
- public ButtonListener,
public ui::ComboboxModelObserver {
public:
METADATA_HEADER(Combobox);
@@ -64,7 +64,7 @@ class VIEWS_EXPORT Combobox : public View,
const gfx::FontList& GetFontList() const;
// Sets the callback which will be called when a selection has been made.
- void set_callback(base::RepeatingClosure callback) {
+ void SetCallback(base::RepeatingClosure callback) {
callback_ = std::move(callback);
}
@@ -77,12 +77,14 @@ class VIEWS_EXPORT Combobox : public View,
bool SelectValue(const base::string16& value);
void SetOwnedModel(std::unique_ptr<ui::ComboboxModel> model);
- void SetModel(ui::ComboboxModel* model);
- ui::ComboboxModel* model() const { return model_; }
+ void SetModel(ui::ComboboxModel* model);
+ ui::ComboboxModel* GetModel() const { return model_; }
- // Set the tooltip text, and the accessible name if it is currently empty.
- void SetTooltipText(const base::string16& tooltip_text);
+ // Gets/Sets the tooltip text, and the accessible name if it is currently
+ // empty.
+ base::string16 GetTooltipTextAndAccessibleName() const;
+ void SetTooltipTextAndAccessibleName(const base::string16& tooltip_text);
// Set the accessible name of the combobox.
void SetAccessibleName(const base::string16& name);
@@ -116,13 +118,14 @@ class VIEWS_EXPORT Combobox : public View,
void SetSelectedRow(int row) override;
base::string16 GetTextForRow(int row) override;
- // Overridden from ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
protected:
// Overridden from ComboboxModelObserver:
void OnComboboxModelChanged(ui::ComboboxModel* model) override;
+ // Getters to be used by metadata.
+ const base::RepeatingClosure& GetCallback() const;
+ const std::unique_ptr<ui::ComboboxModel>& GetOwnedModel() const;
+
private:
friend class test::ComboboxTestApi;
@@ -137,6 +140,9 @@ class VIEWS_EXPORT Combobox : public View,
// Draws the selected value of the drop down list
void PaintIconAndText(gfx::Canvas* canvas);
+ // Opens the dropdown menu in response to |event|.
+ void ArrowButtonPressed(const ui::Event& event);
+
// Show the drop down list
void ShowDropDownMenu(ui::MenuSourceType source_type);
@@ -223,6 +229,19 @@ class VIEWS_EXPORT Combobox : public View,
DISALLOW_COPY_AND_ASSIGN(Combobox);
};
+BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Combobox, View)
+VIEW_BUILDER_PROPERTY(base::RepeatingClosure, Callback)
+VIEW_BUILDER_PROPERTY(std::unique_ptr<ui::ComboboxModel>, OwnedModel)
+VIEW_BUILDER_PROPERTY(ui::ComboboxModel*, Model)
+VIEW_BUILDER_PROPERTY(int, SelectedIndex)
+VIEW_BUILDER_PROPERTY(bool, Invalid)
+VIEW_BUILDER_PROPERTY(bool, SizeToLargestLabel)
+VIEW_BUILDER_PROPERTY(base::string16, AccessibleName)
+VIEW_BUILDER_PROPERTY(base::string16, TooltipTextAndAccessibleName)
+END_VIEW_BUILDER
+
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, Combobox)
+
#endif // UI_VIEWS_CONTROLS_COMBOBOX_COMBOBOX_H_
diff --git a/chromium/ui/views/controls/combobox/combobox_unittest.cc b/chromium/ui/views/controls/combobox/combobox_unittest.cc
index 4be54a45419..f112a9bd860 100644
--- a/chromium/ui/views/controls/combobox/combobox_unittest.cc
+++ b/chromium/ui/views/controls/combobox/combobox_unittest.cc
@@ -29,6 +29,7 @@
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/events/test/event_generator.h"
#include "ui/events/types/event_type.h"
+#include "ui/gfx/text_utils.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/test/ax_event_counter.h"
#include "ui/views/test/combobox_test_api.h"
@@ -150,8 +151,8 @@ class VectorComboboxModel : public ui::ComboboxModel {
class EvilListener {
public:
EvilListener() {
- combobox_->set_callback(base::BindRepeating(&EvilListener::OnPerformAction,
- base::Unretained(this)));
+ combobox_->SetCallback(base::BindRepeating(&EvilListener::OnPerformAction,
+ base::Unretained(this)));
}
~EvilListener() = default;
@@ -546,7 +547,7 @@ TEST_F(ComboboxTest, Click) {
InitCombobox(nullptr);
TestComboboxListener listener(combobox_);
- combobox_->set_callback(base::BindRepeating(
+ combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
combobox_->Layout();
@@ -562,7 +563,7 @@ TEST_F(ComboboxTest, ClickButDisabled) {
InitCombobox(nullptr);
TestComboboxListener listener(combobox_);
- combobox_->set_callback(base::BindRepeating(
+ combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
combobox_->Layout();
@@ -579,7 +580,7 @@ TEST_F(ComboboxTest, NotifyOnClickWithReturnKey) {
InitCombobox(nullptr);
TestComboboxListener listener(combobox_);
- combobox_->set_callback(base::BindRepeating(
+ combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
// The click event is ignored. Instead the menu is shown.
@@ -593,7 +594,7 @@ TEST_F(ComboboxTest, NotifyOnClickWithSpaceKey) {
InitCombobox(nullptr);
TestComboboxListener listener(combobox_);
- combobox_->set_callback(base::BindRepeating(
+ combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
// The click event is ignored. Instead the menu is shwon.
@@ -640,7 +641,7 @@ TEST_F(ComboboxTest, NotifyOnClickWithMouse) {
InitCombobox(nullptr);
TestComboboxListener listener(combobox_);
- combobox_->set_callback(base::BindRepeating(
+ combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
combobox_->Layout();
@@ -686,6 +687,35 @@ TEST_F(ComboboxTest, ConsumingPressKeyEvents) {
}
}
+// Test that ensures that the combobox is resized correctly when selecting
+// between indices of different label lengths.
+TEST_F(ComboboxTest, ContentSizeUpdateOnSetSelectedIndex) {
+ const gfx::FontList& font_list =
+ style::GetFont(Combobox::kDefaultComboboxTextContext,
+ Combobox::kDefaultComboboxTextStyle);
+ InitCombobox(nullptr);
+ combobox_->SetSizeToLargestLabel(false);
+ test_api_->PerformActionAt(1);
+ EXPECT_EQ(gfx::GetStringWidth(model_->GetItemAt(1), font_list),
+ test_api_->content_size().width());
+ combobox_->SetSelectedIndex(1);
+ EXPECT_EQ(gfx::GetStringWidth(model_->GetItemAt(1), font_list),
+ test_api_->content_size().width());
+
+ // Avoid selected_index_ == index optimization and start with index 1 selected
+ // to test resizing from a an index with a shorter label to an index with a
+ // longer label.
+ combobox_->SetSelectedIndex(0);
+ combobox_->SetSelectedIndex(1);
+
+ test_api_->PerformActionAt(0);
+ EXPECT_EQ(gfx::GetStringWidth(model_->GetItemAt(0), font_list),
+ test_api_->content_size().width());
+ combobox_->SetSelectedIndex(0);
+ EXPECT_EQ(gfx::GetStringWidth(model_->GetItemAt(0), font_list),
+ test_api_->content_size().width());
+}
+
TEST_F(ComboboxTest, ContentWidth) {
std::vector<std::string> values;
VectorComboboxModel model(&values);
@@ -760,7 +790,7 @@ TEST_F(ComboboxTest, TypingPrefixNotifiesListener) {
InitCombobox(nullptr);
TestComboboxListener listener(combobox_);
- combobox_->set_callback(base::BindRepeating(
+ combobox_->SetCallback(base::BindRepeating(
&TestComboboxListener::OnPerformAction, base::Unretained(&listener)));
ui::TextInputClient* input_client =
widget_->GetInputMethod()->GetTextInputClient();
@@ -830,13 +860,14 @@ TEST_F(ComboboxTest, MenuModel) {
EXPECT_TRUE(menu_model->IsVisibleAt(0));
}
-// Verifies setting the tooltip text will call NotifyAccessibilityEvent.
+// Verifies SetTooltipTextAndAccessibleName will call NotifyAccessibilityEvent.
TEST_F(ComboboxTest, SetTooltipTextNotifiesAccessibilityEvent) {
InitCombobox(nullptr);
base::string16 test_tooltip_text = ASCIIToUTF16("Test Tooltip Text");
test::AXEventCounter counter(AXEventManager::Get());
EXPECT_EQ(0, counter.GetCount(ax::mojom::Event::kTextChanged));
- combobox_->SetTooltipText(test_tooltip_text);
+ combobox_->SetTooltipTextAndAccessibleName(test_tooltip_text);
+ EXPECT_EQ(test_tooltip_text, combobox_->GetTooltipTextAndAccessibleName());
EXPECT_EQ(1, counter.GetCount(ax::mojom::Event::kTextChanged));
EXPECT_EQ(test_tooltip_text, combobox_->GetAccessibleName());
ui::AXNodeData data;
diff --git a/chromium/ui/views/controls/editable_combobox/editable_combobox.cc b/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
index a1c221b7eee..b9203707279 100644
--- a/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
+++ b/chromium/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -52,6 +52,7 @@
#include "ui/views/layout/fill_layout.h"
#include "ui/views/layout/layout_manager.h"
#include "ui/views/layout/layout_provider.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/style/typography.h"
#include "ui/views/view.h"
@@ -63,7 +64,7 @@ namespace {
class Arrow : public Button {
public:
- explicit Arrow(ButtonListener* listener) : Button(listener) {
+ explicit Arrow(PressedCallback callback) : Button(std::move(callback)) {
// Similar to Combobox's TransparentButton.
SetFocusBehavior(FocusBehavior::NEVER);
button_controller()->set_notify_action(
@@ -332,7 +333,8 @@ EditableCombobox::EditableCombobox(
textfield_->SetExtraInsets(gfx::Insets(
/*top=*/0, /*left=*/0, /*bottom=*/0,
/*right=*/kComboboxArrowContainerWidth - kComboboxArrowPaddingWidth));
- arrow_ = AddChildView(std::make_unique<Arrow>(this));
+ arrow_ = AddChildView(std::make_unique<Arrow>(base::BindRepeating(
+ &EditableCombobox::ArrowButtonPressed, base::Unretained(this))));
}
SetLayoutManager(std::make_unique<views::FillLayout>());
}
@@ -445,14 +447,6 @@ void EditableCombobox::OnViewBlurred(View* observed_view) {
CloseMenu();
}
-void EditableCombobox::ButtonPressed(Button* sender, const ui::Event& event) {
- textfield_->RequestFocus();
- if (menu_runner_ && menu_runner_->IsRunning())
- CloseMenu();
- else
- ShowDropDownMenu(ui::GetMenuSourceTypeForEvent(event));
-}
-
void EditableCombobox::OnLayoutIsAnimatingChanged(
views::AnimatingLayoutManager* source,
bool is_animating) {
@@ -476,7 +470,7 @@ void EditableCombobox::OnItemSelected(int index) {
// handling code directly.
HandleNewContent(selected_item_text);
NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged,
- /*xsend_native_event=*/true);
+ /*send_native_event=*/true);
}
void EditableCombobox::HandleNewContent(const base::string16& new_content) {
@@ -495,6 +489,14 @@ void EditableCombobox::HandleNewContent(const base::string16& new_content) {
menu_model_->UpdateItemsShown();
}
+void EditableCombobox::ArrowButtonPressed(const ui::Event& event) {
+ textfield_->RequestFocus();
+ if (menu_runner_ && menu_runner_->IsRunning())
+ CloseMenu();
+ else
+ ShowDropDownMenu(ui::GetMenuSourceTypeForEvent(event));
+}
+
void EditableCombobox::ShowDropDownMenu(ui::MenuSourceType source_type) {
constexpr int kMenuBorderWidthTop = 1;
diff --git a/chromium/ui/views/controls/editable_combobox/editable_combobox.h b/chromium/ui/views/controls/editable_combobox/editable_combobox.h
index fdd5882bab5..a87863dd9cc 100644
--- a/chromium/ui/views/controls/editable_combobox/editable_combobox.h
+++ b/chromium/ui/views/controls/editable_combobox/editable_combobox.h
@@ -14,7 +14,6 @@
#include "base/strings/string16.h"
#include "build/build_config.h"
#include "ui/base/ui_base_types.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/layout/animating_layout_manager.h"
#include "ui/views/style/typography.h"
@@ -33,6 +32,7 @@ class Event;
} // namespace ui
namespace views {
+class Button;
class EditableComboboxMenuModel;
class EditableComboboxPreTargetHandler;
class MenuRunner;
@@ -43,7 +43,6 @@ class VIEWS_EXPORT EditableCombobox
: public View,
public TextfieldController,
public ViewObserver,
- public ButtonListener,
public views::AnimatingLayoutManager::Observer {
public:
METADATA_HEADER(EditableCombobox);
@@ -85,7 +84,7 @@ class VIEWS_EXPORT EditableCombobox
const gfx::FontList& GetFontList() const;
- void set_callback(base::RepeatingClosure callback) {
+ void SetCallback(base::RepeatingClosure callback) {
content_changed_callback_ = std::move(callback);
}
@@ -123,6 +122,9 @@ class VIEWS_EXPORT EditableCombobox
// Notifies listener of new content and updates the menu items to show.
void HandleNewContent(const base::string16& new_content);
+ // Toggles the dropdown menu in response to |event|.
+ void ArrowButtonPressed(const ui::Event& event);
+
// Shows the drop-down menu.
void ShowDropDownMenu(ui::MenuSourceType source_type = ui::MENU_SOURCE_NONE);
@@ -142,9 +144,6 @@ class VIEWS_EXPORT EditableCombobox
// Overridden from ViewObserver:
void OnViewBlurred(View* observed_view) override;
- // Overridden from ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
// Overridden from views::AnimatingLayoutManager::Observer:
void OnLayoutIsAnimatingChanged(views::AnimatingLayoutManager* source,
bool is_animating) override;
diff --git a/chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc b/chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
index 90e607ebf42..83a41e697a9 100644
--- a/chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
+++ b/chromium/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
@@ -154,7 +154,7 @@ void EditableComboboxTest::InitEditableCombobox(
combobox_ =
new EditableCombobox(std::make_unique<ui::SimpleComboboxModel>(items),
filter_on_edit, show_on_empty, type);
- combobox_->set_callback(base::BindRepeating(
+ combobox_->SetCallback(base::BindRepeating(
&EditableComboboxTest::OnContentChanged, base::Unretained(this)));
combobox_->SetID(2);
dummy_focusable_view_ = new View();
diff --git a/chromium/ui/views/controls/focus_ring.cc b/chromium/ui/views/controls/focus_ring.cc
index 850a09e3553..e34713127b3 100644
--- a/chromium/ui/views/controls/focus_ring.cc
+++ b/chromium/ui/views/controls/focus_ring.cc
@@ -8,13 +8,16 @@
#include <utility>
#include "base/memory/ptr_util.h"
+#include "base/notreached.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/gfx/canvas.h"
#include "ui/views/controls/focusable_border.h"
#include "ui/views/controls/highlight_path_generator.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/view_class_properties.h"
+#include "ui/views/view_utils.h"
namespace views {
@@ -56,6 +59,12 @@ SkPath GetHighlightPathInternal(const View* view) {
// static
FocusRing* FocusRing::Install(View* parent) {
+ if (IsViewClass<Button>(parent)) {
+ // Ensure we don't install dual focus rings on a button.
+ Button* button = static_cast<Button*>(parent);
+ if (button->GetInstallFocusRingOnFocus())
+ button->SetInstallFocusRingOnFocus(false);
+ }
auto ring = base::WrapUnique<FocusRing>(new FocusRing());
ring->InvalidateLayout();
ring->SchedulePaint();
@@ -94,7 +103,7 @@ void FocusRing::Layout() {
// Need to match canvas direction with the parent. This is required to ensure
// asymmetric focus ring shapes match their respective buttons in RTL mode.
- EnableCanvasFlippingForRTLUI(parent()->flip_canvas_on_paint_for_rtl_ui());
+ SetFlipCanvasOnPaintForRTLUI(parent()->GetFlipCanvasOnPaintForRTLUI());
}
void FocusRing::ViewHierarchyChanged(
@@ -141,8 +150,8 @@ void FocusRing::OnPaint(gfx::Canvas* canvas) {
path = GetHighlightPathInternal(parent());
DCHECK(IsPathUsable(path));
- DCHECK_EQ(flip_canvas_on_paint_for_rtl_ui(),
- parent()->flip_canvas_on_paint_for_rtl_ui());
+ DCHECK_EQ(GetFlipCanvasOnPaintForRTLUI(),
+ parent()->GetFlipCanvasOnPaintForRTLUI());
SkRect bounds;
SkRRect rbounds;
if (path.isRect(&bounds)) {
@@ -221,7 +230,7 @@ SkRRect FocusRing::RingRectFromPathRect(const SkRRect& rrect) const {
SkPath GetHighlightPath(const View* view) {
SkPath path = GetHighlightPathInternal(view);
- if (view->flip_canvas_on_paint_for_rtl_ui() && base::i18n::IsRTL()) {
+ if (view->GetFlipCanvasOnPaintForRTLUI() && base::i18n::IsRTL()) {
gfx::Point center = view->GetLocalBounds().CenterPoint();
SkMatrix flip;
flip.setScale(-1, 1, center.x(), center.y());
diff --git a/chromium/ui/views/controls/image_view.cc b/chromium/ui/views/controls/image_view.cc
index f31b625bbe3..603fb4b4aab 100644
--- a/chromium/ui/views/controls/image_view.cc
+++ b/chromium/ui/views/controls/image_view.cc
@@ -12,6 +12,7 @@
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/gfx/canvas.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
diff --git a/chromium/ui/views/controls/image_view.h b/chromium/ui/views/controls/image_view.h
index c6d689f56fc..c39d116b6a6 100644
--- a/chromium/ui/views/controls/image_view.h
+++ b/chromium/ui/views/controls/image_view.h
@@ -5,9 +5,15 @@
#ifndef UI_VIEWS_CONTROLS_IMAGE_VIEW_H_
#define UI_VIEWS_CONTROLS_IMAGE_VIEW_H_
+#include <memory>
+#include <utility>
+
#include "base/macros.h"
#include "ui/gfx/image/image_skia.h"
+#include "ui/views/metadata/metadata_header_macros.h"
+#include "ui/views/metadata/view_factory.h"
#include "ui/views/view.h"
+#include "ui/views/views_export.h"
namespace gfx {
class Canvas;
@@ -132,6 +138,36 @@ class VIEWS_EXPORT ImageView : public View {
DISALLOW_COPY_AND_ASSIGN(ImageView);
};
+BEGIN_VIEW_BUILDER(VIEWS_EXPORT, ImageView, View)
+// Explicitly declare the overloaded SetImage methods in order to properly
+// disambiguate between them.
+BuilderT& SetImage(const gfx::ImageSkia& value) {
+ auto setter = std::make_unique<::views::internal::PropertySetter<
+ ViewClass_, gfx::ImageSkia,
+ decltype((static_cast<void (ViewClass_::*)(const gfx::ImageSkia&)>(
+ &ViewClass_::SetImage))),
+ &ViewClass_::SetImage>>(value);
+ ::views::internal::ViewBuilderCore::AddPropertySetter(std::move(setter));
+ return *static_cast<BuilderT*>(this);
+}
+BuilderT& SetImage(const gfx::ImageSkia* value) {
+ auto setter = std::make_unique<::views::internal::PropertySetter<
+ ViewClass_, gfx::ImageSkia*,
+ decltype((static_cast<void (ViewClass_::*)(const gfx::ImageSkia*)>(
+ &ViewClass_::SetImage))),
+ &ViewClass_::SetImage>>(value);
+ ::views::internal::ViewBuilderCore::AddPropertySetter(std::move(setter));
+ return *static_cast<BuilderT*>(this);
+}
+VIEW_BUILDER_PROPERTY(gfx::Size, ImageSize)
+VIEW_BUILDER_PROPERTY(ImageView::Alignment, HorizontalAlignment)
+VIEW_BUILDER_PROPERTY(ImageView::Alignment, VerticalAlignment)
+VIEW_BUILDER_PROPERTY(base::string16, AccessibleName)
+VIEW_BUILDER_PROPERTY(base::string16, TooltipText)
+END_VIEW_BUILDER
+
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, ImageView)
+
#endif // UI_VIEWS_CONTROLS_IMAGE_VIEW_H_
diff --git a/chromium/ui/views/controls/label.cc b/chromium/ui/views/controls/label.cc
index 66ce6e76618..70370d27c47 100644
--- a/chromium/ui/views/controls/label.cc
+++ b/chromium/ui/views/controls/label.cc
@@ -17,6 +17,7 @@
#include "base/strings/string_split.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
@@ -32,6 +33,7 @@
#include "ui/views/background.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/focus/focus_manager.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/native_cursor.h"
#include "ui/views/selection_controller.h"
@@ -110,6 +112,14 @@ int Label::GetTextContext() const {
return text_context_;
}
+void Label::SetTextContext(int text_context) {
+ if (text_context == text_context_)
+ return;
+ text_context_ = text_context;
+ UpdateColorsFromTheme();
+ OnPropertyChanged(&text_context_, views::kPropertyEffectsPaint);
+}
+
int Label::GetTextStyle() const {
return text_style_;
}
@@ -215,6 +225,21 @@ void Label::SetSubpixelRenderingEnabled(bool subpixel_rendering_enabled) {
OnPropertyChanged(&subpixel_rendering_enabled_, kPropertyEffectsPaint);
}
+bool Label::GetSkipSubpixelRenderingOpacityCheck() const {
+ return skip_subpixel_rendering_opacity_check_;
+}
+
+void Label::SetSkipSubpixelRenderingOpacityCheck(
+ bool skip_subpixel_rendering_opacity_check) {
+ if (skip_subpixel_rendering_opacity_check_ ==
+ skip_subpixel_rendering_opacity_check)
+ return;
+ skip_subpixel_rendering_opacity_check_ =
+ skip_subpixel_rendering_opacity_check;
+ OnPropertyChanged(&skip_subpixel_rendering_opacity_check_,
+ kPropertyEffectsNone);
+}
+
gfx::HorizontalAlignment Label::GetHorizontalAlignment() const {
return full_text_->horizontal_alignment();
}
@@ -471,6 +496,14 @@ void Label::SelectRange(const gfx::Range& range) {
SchedulePaint();
}
+std::vector<gfx::Rect> Label::GetSubstringBounds(const gfx::Range& range) {
+ auto substring_bounds = full_text_->GetSubstringBounds(range);
+ for (auto& bound : substring_bounds) {
+ bound.Offset(GetInsets().left(), GetInsets().top());
+ }
+ return substring_bounds;
+}
+
views::PropertyChangedSubscription Label::AddTextChangedCallback(
views::PropertyChangedCallback callback) {
return AddPropertyChangedCallback(&full_text_ + kLabelText,
@@ -651,20 +684,34 @@ void Label::PaintText(gfx::Canvas* canvas) {
if (display_text_)
display_text_->Draw(canvas);
-#if DCHECK_IS_ON()
- // Attempt to ensure that if we're using subpixel rendering, we're painting
- // to an opaque background. What we don't want to find is an ancestor in the
- // hierarchy that paints to a non-opaque layer.
- if (!display_text_ || display_text_->subpixel_rendering_suppressed())
+#if DCHECK_IS_ON() && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_LACROS)
+ // TODO(crbug.com/1139395): Enable this DCHECK on ChromeOS and LaCrOS by
+ // fixing either this check (to correctly idenfify more paints-on-opaque
+ // cases), refactoring parents to use background() or by fixing
+ // subpixel-rendering issues that the DCHECK detects.
+ if (!display_text_ || display_text_->subpixel_rendering_suppressed() ||
+ skip_subpixel_rendering_opacity_check_)
return;
+ // Ensure that, if we're using subpixel rendering, we're painted to an opaque
+ // region. Subpixel rendering will sample from the r,g,b color channels of the
+ // canvas. These values are incorrect when sampling from transparent pixels.
+ // Note that these checks may need to be amended for other methods of painting
+ // opaquely underneath the Label. For now, individual cases can skip this
+ // DCHECK by calling Label::SetSkipSubpixelRenderingOpacityCheck().
for (View* view = this; view; view = view->parent()) {
+ // This is our approximation of being painted on an opaque region. If any
+ // parent has an opaque background we assume that that background covers the
+ // text bounds. This is not necessarily true as the background could be
+ // inset from the parent bounds, and get_color() does not imply that all of
+ // the background is painted with the same opaque color.
if (view->background() && IsOpaque(view->background()->get_color()))
break;
- if (view->layer() && view->layer()->fills_bounds_opaquely()) {
- DLOG(WARNING) << "Ancestor view has a non-opaque layer: "
- << view->GetClassName() << " with ID " << view->GetID();
+ if (view->layer()) {
+ // If we aren't painted to an opaque background, we must paint to an
+ // opaque layer.
+ DCHECK(view->layer()->fills_bounds_opaquely());
break;
}
}
@@ -1136,6 +1183,7 @@ void Label::BuildContextMenuContents() {
BEGIN_METADATA(Label, View)
ADD_PROPERTY_METADATA(base::string16, Text)
+ADD_PROPERTY_METADATA(int, TextContext)
ADD_PROPERTY_METADATA(int, TextStyle)
ADD_PROPERTY_METADATA(bool, AutoColorReadabilityEnabled)
ADD_PROPERTY_METADATA(SkColor, EnabledColor)
@@ -1144,6 +1192,7 @@ ADD_PROPERTY_METADATA(SkColor, BackgroundColor)
ADD_PROPERTY_METADATA(SkColor, SelectionTextColor)
ADD_PROPERTY_METADATA(SkColor, SelectionBackgroundColor)
ADD_PROPERTY_METADATA(bool, SubpixelRenderingEnabled)
+ADD_PROPERTY_METADATA(bool, SkipSubpixelRenderingOpacityCheck)
ADD_PROPERTY_METADATA(gfx::ShadowValues, Shadows)
ADD_PROPERTY_METADATA(gfx::HorizontalAlignment, HorizontalAlignment)
ADD_PROPERTY_METADATA(gfx::VerticalAlignment, VerticalAlignment)
@@ -1156,7 +1205,6 @@ ADD_PROPERTY_METADATA(base::string16, TooltipText)
ADD_PROPERTY_METADATA(bool, HandlesTooltips)
ADD_PROPERTY_METADATA(bool, CollapseWhenHidden)
ADD_PROPERTY_METADATA(int, MaximumWidth)
-ADD_READONLY_PROPERTY_METADATA(int, TextContext)
END_METADATA
} // namespace views
diff --git a/chromium/ui/views/controls/label.h b/chromium/ui/views/controls/label.h
index f5b59c83c52..0a6bac23a2f 100644
--- a/chromium/ui/views/controls/label.h
+++ b/chromium/ui/views/controls/label.h
@@ -6,6 +6,7 @@
#define UI_VIEWS_CONTROLS_LABEL_H_
#include <memory>
+#include <vector>
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
@@ -92,6 +93,7 @@ class VIEWS_EXPORT Label : public View,
// Where the label appears in the UI. Passed in from the constructor. This is
// a value from views::style::TextContext or an enum that extends it.
int GetTextContext() const;
+ void SetTextContext(int text_context);
// The style of the label. This is a value from views::style::TextStyle or an
// enum that extends it.
@@ -138,6 +140,16 @@ class VIEWS_EXPORT Label : public View,
bool GetSubpixelRenderingEnabled() const;
void SetSubpixelRenderingEnabled(bool subpixel_rendering_enabled);
+ // Gets/Sets whether the DCHECK() checking that subpixel-rendered text is
+ // only drawn onto opaque layers is skipped. Use this to suppress false
+ // positives - for example, if the label is drawn onto an opaque region of a
+ // non-opaque layer. If possible, prefer making the layer opaque or painting
+ // onto an opaque views::Background, as those cases are detected and
+ // excluded by this DCHECK automatically.
+ bool GetSkipSubpixelRenderingOpacityCheck() const;
+ void SetSkipSubpixelRenderingOpacityCheck(
+ bool skip_subpixel_rendering_opacity_check);
+
// Gets/Sets the horizontal alignment; the argument value is mirrored in RTL
// UI.
gfx::HorizontalAlignment GetHorizontalAlignment() const;
@@ -264,6 +276,10 @@ class VIEWS_EXPORT Label : public View,
// |range| endpoints don't lie on grapheme boundaries.
void SelectRange(const gfx::Range& range);
+ // Get the visual bounds containing the logical substring of the full text
+ // within the |range|. See gfx::RenderText.
+ std::vector<gfx::Rect> GetSubstringBounds(const gfx::Range& range);
+
views::PropertyChangedSubscription AddTextChangedCallback(
views::PropertyChangedCallback callback) WARN_UNUSED_RESULT;
@@ -314,6 +330,7 @@ class VIEWS_EXPORT Label : public View,
FRIEND_TEST_ALL_PREFIXES(LabelTest, FocusBounds);
FRIEND_TEST_ALL_PREFIXES(LabelTest, MultiLineSizingWithElide);
FRIEND_TEST_ALL_PREFIXES(LabelTest, IsDisplayTextTruncated);
+ FRIEND_TEST_ALL_PREFIXES(LabelTest, ChecksSubpixelRenderingOntoOpaqueSurface);
friend class LabelSelectionTest;
// ContextMenuController overrides:
@@ -392,7 +409,7 @@ class VIEWS_EXPORT Label : public View,
// Builds |context_menu_contents_|.
void BuildContextMenuContents();
- const int text_context_;
+ int text_context_;
int text_style_;
base::Optional<int> line_height_;
@@ -423,6 +440,7 @@ class VIEWS_EXPORT Label : public View,
gfx::ElideBehavior elide_behavior_ = gfx::ELIDE_TAIL;
bool subpixel_rendering_enabled_ = true;
+ bool skip_subpixel_rendering_opacity_check_ = false;
bool auto_color_readability_enabled_ = true;
// TODO(mukai): remove |multi_line_| when all RenderText can render multiline.
bool multi_line_ = false;
@@ -447,6 +465,7 @@ BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Label, View)
VIEW_BUILDER_PROPERTY(const gfx::FontList&, FontList)
VIEW_BUILDER_PROPERTY(const base::string16&, Text)
VIEW_BUILDER_PROPERTY(int, TextStyle)
+VIEW_BUILDER_PROPERTY(int, TextContext)
VIEW_BUILDER_PROPERTY(bool, AutoColorReadabilityEnabled)
VIEW_BUILDER_PROPERTY(SkColor, EnabledColor)
VIEW_BUILDER_PROPERTY(SkColor, BackgroundColor)
@@ -454,6 +473,7 @@ VIEW_BUILDER_PROPERTY(SkColor, SelectionTextColor)
VIEW_BUILDER_PROPERTY(SkColor, SelectionBackgroundColor)
VIEW_BUILDER_PROPERTY(const gfx::ShadowValues&, Shadows)
VIEW_BUILDER_PROPERTY(bool, SubpixelRenderingEnabled)
+VIEW_BUILDER_PROPERTY(bool, SkipSubpixelRenderingOpacityCheck)
VIEW_BUILDER_PROPERTY(gfx::HorizontalAlignment, HorizontalAlignment)
VIEW_BUILDER_PROPERTY(gfx::VerticalAlignment, VerticalAlignment)
VIEW_BUILDER_PROPERTY(int, LineHeight)
@@ -468,8 +488,10 @@ VIEW_BUILDER_PROPERTY(bool, HandlesTooltips)
VIEW_BUILDER_PROPERTY(int, MaximumWidth)
VIEW_BUILDER_PROPERTY(bool, CollapseWhenHidden)
VIEW_BUILDER_PROPERTY(bool, Selectable)
-END_VIEW_BUILDER(VIEWS_EXPORT, Label)
+END_VIEW_BUILDER
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, Label)
+
#endif // UI_VIEWS_CONTROLS_LABEL_H_
diff --git a/chromium/ui/views/controls/label_unittest.cc b/chromium/ui/views/controls/label_unittest.cc
index c801df6ed73..740d4cd7c59 100644
--- a/chromium/ui/views/controls/label_unittest.cc
+++ b/chromium/ui/views/controls/label_unittest.cc
@@ -14,6 +14,7 @@
#include "base/command_line.h"
#include "base/i18n/rtl.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/test/gtest_util.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/ax_enums.mojom.h"
@@ -29,6 +30,7 @@
#include "ui/gfx/text_constants.h"
#include "ui/gfx/text_elider.h"
#include "ui/strings/grit/ui_strings.h"
+#include "ui/views/background.h"
#include "ui/views/border.h"
#include "ui/views/controls/base_control_test_widget.h"
#include "ui/views/controls/link.h"
@@ -1060,6 +1062,61 @@ TEST_F(LabelTest, TextChangedCallback) {
EXPECT_TRUE(text_changed);
}
+// Verify that GetSubstringBounds returns the correct bounds, accounting for
+// label insets.
+TEST_F(LabelTest, GetSubstringBounds) {
+ label()->SetText(ASCIIToUTF16("abc"));
+ auto substring_bounds = label()->GetSubstringBounds(gfx::Range(0, 3));
+ EXPECT_EQ(1u, substring_bounds.size());
+
+ gfx::Insets insets{2, 3, 4, 5};
+ label()->SetBorder(CreateEmptyBorder(insets));
+ auto substring_bounds_with_inset =
+ label()->GetSubstringBounds(gfx::Range(0, 3));
+ EXPECT_EQ(1u, substring_bounds_with_inset.size());
+ EXPECT_EQ(substring_bounds[0].x() + 3, substring_bounds_with_inset[0].x());
+ EXPECT_EQ(substring_bounds[0].y() + 2, substring_bounds_with_inset[0].y());
+ EXPECT_EQ(substring_bounds[0].width(),
+ substring_bounds_with_inset[0].width());
+ EXPECT_EQ(substring_bounds[0].height(),
+ substring_bounds_with_inset[0].height());
+}
+
+// TODO(crbug.com/1139395): Enable on ChromeOS along with the DCHECK in Label.
+#if !defined(OS_CHROMEOS)
+// Ensures DCHECK for subpixel rendering on transparent layer is working.
+TEST_F(LabelTest, ChecksSubpixelRenderingOntoOpaqueSurface) {
+ View view;
+ Label* label = view.AddChildView(std::make_unique<TestLabel>());
+ EXPECT_TRUE(label->GetSubpixelRenderingEnabled());
+
+ gfx::Canvas canvas;
+
+ // Painting on a view not painted to a layer should be fine.
+ label->OnPaint(&canvas);
+
+ // Painting to an opaque layer should also be fine.
+ view.SetPaintToLayer();
+ label->OnPaint(&canvas);
+
+ // Set up a transparent layer for the parent view.
+ view.layer()->SetFillsBoundsOpaquely(false);
+
+ // Painting on a transparent layer should DCHECK.
+ EXPECT_DCHECK_DEATH(label->OnPaint(&canvas));
+
+ // We should not DCHECK if the check is skipped.
+ label->SetSkipSubpixelRenderingOpacityCheck(true);
+ label->OnPaint(&canvas);
+ label->SetSkipSubpixelRenderingOpacityCheck(false);
+
+ // Painting onto a transparent layer should not DCHECK if there's an opaque
+ // background in a parent of the Label.
+ view.SetBackground(CreateSolidBackground(SK_ColorWHITE));
+ label->OnPaint(&canvas);
+}
+#endif // !defined(OS_CHROMEOS)
+
TEST_F(LabelSelectionTest, Selectable) {
// By default, labels don't support text selection.
EXPECT_FALSE(label()->GetSelectable());
diff --git a/chromium/ui/views/controls/link.cc b/chromium/ui/views/controls/link.cc
index 35891182583..0ef69a5d335 100644
--- a/chromium/ui/views/controls/link.cc
+++ b/chromium/ui/views/controls/link.cc
@@ -17,6 +17,7 @@
#include "ui/gfx/color_utils.h"
#include "ui/gfx/font_list.h"
#include "ui/native_theme/native_theme.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/native_cursor.h"
#include "ui/views/style/platform_style.h"
@@ -71,6 +72,14 @@ bool Link::GetCanProcessEventsWithinSubtree() const {
return View::GetCanProcessEventsWithinSubtree();
}
+void Link::OnMouseEntered(const ui::MouseEvent& event) {
+ RecalculateFont();
+}
+
+void Link::OnMouseExited(const ui::MouseEvent& event) {
+ RecalculateFont();
+}
+
bool Link::OnMousePressed(const ui::MouseEvent& event) {
if (!GetEnabled() ||
(!event.IsLeftMouseButton() && !event.IsMiddleMouseButton()))
@@ -198,9 +207,10 @@ void Link::OnClick(const ui::Event& event) {
void Link::RecalculateFont() {
const int style = font_list().GetFontStyle();
- const int intended_style = ((GetEnabled() && HasFocus()) || force_underline_)
- ? (style | gfx::Font::UNDERLINE)
- : (style & ~gfx::Font::UNDERLINE);
+ const int intended_style =
+ ((GetEnabled() && (HasFocus() || IsMouseHovered())) || force_underline_)
+ ? (style | gfx::Font::UNDERLINE)
+ : (style & ~gfx::Font::UNDERLINE);
if (style != intended_style)
Label::SetFontList(font_list().DeriveWithStyle(intended_style));
diff --git a/chromium/ui/views/controls/link.h b/chromium/ui/views/controls/link.h
index db793368ff0..6db2cd4a3b4 100644
--- a/chromium/ui/views/controls/link.h
+++ b/chromium/ui/views/controls/link.h
@@ -14,6 +14,7 @@
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/color_palette.h"
#include "ui/views/controls/label.h"
+#include "ui/views/metadata/view_factory.h"
#include "ui/views/style/typography.h"
namespace views {
@@ -42,14 +43,14 @@ class VIEWS_EXPORT Link : public Label {
// Allow providing callbacks that expect either zero or one args, since many
// callers don't care about the argument and can avoid adapter functions this
// way.
- void set_callback(base::RepeatingClosure callback) {
+ void SetCallback(base::RepeatingClosure callback) {
// Adapt this closure to a ClickedCallback by discarding the extra arg.
callback_ =
base::BindRepeating([](base::RepeatingClosure closure,
const ui::Event& event) { closure.Run(); },
std::move(callback));
}
- void set_callback(ClickedCallback callback) {
+ void SetCallback(ClickedCallback callback) {
callback_ = std::move(callback);
}
@@ -60,6 +61,8 @@ class VIEWS_EXPORT Link : public Label {
// Label:
gfx::NativeCursor GetCursor(const ui::MouseEvent& event) override;
bool GetCanProcessEventsWithinSubtree() const override;
+ void OnMouseEntered(const ui::MouseEvent& event) override;
+ void OnMouseExited(const ui::MouseEvent& event) override;
bool OnMousePressed(const ui::MouseEvent& event) override;
bool OnMouseDragged(const ui::MouseEvent& event) override;
void OnMouseReleased(const ui::MouseEvent& event) override;
@@ -102,6 +105,11 @@ class VIEWS_EXPORT Link : public Label {
DISALLOW_COPY_AND_ASSIGN(Link);
};
+BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Link, Label)
+END_VIEW_BUILDER
+
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, Link)
+
#endif // UI_VIEWS_CONTROLS_LINK_H_
diff --git a/chromium/ui/views/controls/link_unittest.cc b/chromium/ui/views/controls/link_unittest.cc
index 490079e1220..2fb2409b598 100644
--- a/chromium/ui/views/controls/link_unittest.cc
+++ b/chromium/ui/views/controls/link_unittest.cc
@@ -9,6 +9,7 @@
#include <vector>
#include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/ui_base_switches.h"
#include "ui/events/base_event_utils.h"
@@ -31,16 +32,29 @@ class LinkTest : public test::BaseControlTestWidget {
LinkTest& operator=(const LinkTest&) = delete;
~LinkTest() override = default;
+ void SetUp() override {
+ test::BaseControlTestWidget::SetUp();
+
+ event_generator_ = std::make_unique<ui::test::EventGenerator>(
+ GetContext(), widget()->GetNativeWindow());
+ event_generator_->set_assume_window_at_origin(false);
+ }
+
protected:
void CreateWidgetContent(View* container) override {
+ // Create a widget containing a link which does not take the full size.
link_ = container->AddChildView(
std::make_unique<Link>(base::ASCIIToUTF16("TestLink")));
+ link_->SetBoundsRect(
+ gfx::ScaleToEnclosedRect(container->GetLocalBounds(), 0.5f));
}
Link* link() { return link_; }
+ ui::test::EventGenerator* event_generator() { return event_generator_.get(); }
public:
Link* link_ = nullptr;
+ std::unique_ptr<ui::test::EventGenerator> event_generator_;
};
} // namespace
@@ -52,7 +66,7 @@ TEST_F(LinkTest, Metadata) {
TEST_F(LinkTest, TestLinkClick) {
bool link_clicked = false;
- link()->set_callback(base::BindRepeating(
+ link()->SetCallback(base::BindRepeating(
[](bool* link_clicked) { *link_clicked = true; }, &link_clicked));
link()->SizeToPreferredSize();
gfx::Point point = link()->bounds().CenterPoint();
@@ -65,7 +79,7 @@ TEST_F(LinkTest, TestLinkClick) {
TEST_F(LinkTest, TestLinkTap) {
bool link_clicked = false;
- link()->set_callback(base::BindRepeating(
+ link()->SetCallback(base::BindRepeating(
[](bool* link_clicked) { *link_clicked = true; }, &link_clicked));
link()->SizeToPreferredSize();
gfx::Point point = link()->bounds().CenterPoint();
@@ -75,4 +89,30 @@ TEST_F(LinkTest, TestLinkTap) {
EXPECT_TRUE(link_clicked);
}
+// This test doesn't work on Mac due to crbug.com/1071633.
+#if !defined(OS_MAC)
+// Tests that hovering and unhovering a link adds and removes an underline.
+TEST_F(LinkTest, TestUnderlineOnHover) {
+ // A non-hovered link should not be underlined.
+ const gfx::Rect link_bounds = link()->GetBoundsInScreen();
+ const gfx::Point off_link = link_bounds.bottom_right() + gfx::Vector2d(1, 1);
+ event_generator()->MoveMouseTo(off_link);
+ EXPECT_FALSE(link()->IsMouseHovered());
+ const auto link_underlined = [link = link()]() {
+ return !!(link->font_list().GetFontStyle() & gfx::Font::UNDERLINE);
+ };
+ EXPECT_FALSE(link_underlined());
+
+ // Hovering the link should underline it.
+ event_generator()->MoveMouseTo(link_bounds.CenterPoint());
+ EXPECT_TRUE(link()->IsMouseHovered());
+ EXPECT_TRUE(link_underlined());
+
+ // Un-hovering the link should remove the underline again.
+ event_generator()->MoveMouseTo(off_link);
+ EXPECT_FALSE(link()->IsMouseHovered());
+ EXPECT_FALSE(link_underlined());
+}
+#endif // !defined(OS_MAC)
+
} // namespace views
diff --git a/chromium/ui/views/controls/menu/menu_closure_animation_mac_unittest.cc b/chromium/ui/views/controls/menu/menu_closure_animation_mac_unittest.cc
index 790d6cacfd1..1e99f895b55 100644
--- a/chromium/ui/views/controls/menu/menu_closure_animation_mac_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_closure_animation_mac_unittest.cc
@@ -6,7 +6,7 @@
#include <memory>
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/views/test/menu_test_utils.h"
diff --git a/chromium/ui/views/controls/menu/menu_config.h b/chromium/ui/views/controls/menu/menu_config.h
index e64b39342ea..c84d1377c94 100644
--- a/chromium/ui/views/controls/menu/menu_config.h
+++ b/chromium/ui/views/controls/menu/menu_config.h
@@ -208,30 +208,6 @@ struct VIEWS_EXPORT MenuConfig {
// Margins for footnotes (HIGHLIGHTED item at the end of a menu).
int footnote_vertical_margin = 11;
- // New Badge -----------------------------------------------------------------
- // Note that there are a few differences between Views and Mac constants here
- // that are due to the fact that the rendering is different and therefore
- // tweaks to the spacing need to be made to achieve the same visual result.
-
- // Difference in the font size (in pixels) between menu label font and "new"
- // badge font size.
- static constexpr int kNewBadgeFontSizeAdjustment = -1;
-
- // Space between primary text and "new" badge.
- static constexpr int kNewBadgeHorizontalMargin = 8;
-
- // Highlight padding around "new" text.
- static constexpr int kNewBadgeInternalPadding = 4;
- static constexpr int kNewBadgeInternalPaddingTopMac = 1;
-
- // The baseline offset of the "new" badge image to the menu text baseline.
- static constexpr int kNewBadgeBaslineOffsetMac = -4;
-
- // The corner radius of the rounded rect for the "new" badge.
- static constexpr int kNewBadgeCornerRadius = 3;
- static_assert(kNewBadgeCornerRadius <= kNewBadgeInternalPadding,
- "New badge corner radius should not exceed padding.");
-
private:
// Configures a MenuConfig as appropriate for the current platform.
void Init();
diff --git a/chromium/ui/views/controls/menu/menu_controller.cc b/chromium/ui/views/controls/menu/menu_controller.cc
index e6a96689ef6..ca6146dd053 100644
--- a/chromium/ui/views/controls/menu/menu_controller.cc
+++ b/chromium/ui/views/controls/menu/menu_controller.cc
@@ -626,6 +626,13 @@ bool MenuController::IsContextMenu() const {
void MenuController::SelectItemAndOpenSubmenu(MenuItemView* item) {
DCHECK(item);
SetSelection(item, SELECTION_OPEN_SUBMENU | SELECTION_UPDATE_IMMEDIATELY);
+
+ // If `item` has not a submenu, hot track `item`'s initial focusable button
+ // if any.
+ if (!item->HasSubmenu()) {
+ View* hot_view = GetInitialFocusableView(item, /*forward=*/true);
+ SetHotTrackedButton(Button::AsButton(hot_view));
+ }
}
bool MenuController::OnMousePressed(SubmenuView* source,
@@ -837,6 +844,7 @@ void MenuController::OnMouseMoved(SubmenuView* source,
menu_open_mouse_loc_.reset();
MenuHostRootView* root_view = GetRootView(source, event.location());
+ Button* new_hot_tracked_button = nullptr;
if (root_view) {
root_view->ProcessMouseMoved(event);
@@ -846,12 +854,15 @@ void MenuController::OnMouseMoved(SubmenuView* source,
ui::MouseEvent event_for_root(event);
ConvertLocatedEventForRootView(source, root_view, &event_for_root);
View* view = root_view->GetEventHandlerForPoint(event_for_root.location());
- Button* button = Button::AsButton(view);
- if (button)
- SetHotTrackedButton(button);
+ new_hot_tracked_button = Button::AsButton(view);
}
HandleMouseLocation(source, event.location());
+
+ // Updating the hot tracked button should be after `HandleMouseLocation()`
+ // which may reset the current hot tracked button.
+ if (new_hot_tracked_button)
+ SetHotTrackedButton(new_hot_tracked_button);
}
void MenuController::OnMouseEntered(SubmenuView* source,
diff --git a/chromium/ui/views/controls/menu/menu_controller_unittest.cc b/chromium/ui/views/controls/menu/menu_controller_unittest.cc
index 4ac27d0ea51..c58a57017a2 100644
--- a/chromium/ui/views/controls/menu/menu_controller_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_controller_unittest.cc
@@ -13,7 +13,7 @@
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/current_thread.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "ui/accessibility/ax_action_data.h"
@@ -51,14 +51,17 @@
#include "ui/views/controls/menu/menu_pre_target_handler.h"
#endif
-#if defined(USE_X11)
-#include "ui/events/test/events_test_utils_x11.h"
-#include "ui/gfx/x/x11.h" // nogncheck
-#endif
-
#if defined(USE_OZONE)
#include "ui/base/ui_base_features.h"
+#include "ui/ozone/buildflags.h"
#include "ui/ozone/public/ozone_platform.h"
+#if BUILDFLAG(OZONE_PLATFORM_X11)
+#define USE_OZONE_PLATFORM_X11
+#endif
+#endif
+
+#if defined(USE_X11) || defined(USE_OZONE_PLATFORM_X11)
+#include "ui/events/test/events_test_utils_x11.h"
#endif
namespace views {
@@ -760,18 +763,22 @@ class MenuControllerTest : public ViewsTestBase,
return menu_controller_->exit_type_;
}
- void AddButtonMenuItems() {
+ // Adds a menu item having buttons as children and returns it. If
+ // `single_child` is true, the hosting menu item has only one child button.
+ MenuItemView* AddButtonMenuItems(bool single_child) {
menu_item()->SetBounds(0, 0, 200, 300);
MenuItemView* item_view =
menu_item()->AppendMenuItem(5, base::ASCIIToUTF16("Five"));
- for (size_t i = 0; i < 3; ++i) {
- LabelButton* button =
- new LabelButton(nullptr, base::ASCIIToUTF16("Label"));
+ const size_t children_count = single_child ? 1 : 3;
+ for (size_t i = 0; i < children_count; ++i) {
+ LabelButton* button = new LabelButton(Button::PressedCallback(),
+ base::ASCIIToUTF16("Label"));
// This is an in-menu button. Hence it must be always focusable.
button->SetFocusBehavior(View::FocusBehavior::ALWAYS);
item_view->AddChildView(button);
}
menu_item()->GetSubmenu()->ShowAt(owner(), menu_item()->bounds(), false);
+ return item_view;
}
void DestroyMenuItem() { menu_item_.reset(); }
@@ -879,12 +886,16 @@ TEST_F(MenuControllerTest, EventTargeter) {
}
#endif // defined(USE_AURA)
-#if defined(USE_X11)
+#if defined(USE_X11) || defined(USE_OZONE_PLATFORM_X11)
// Tests that touch event ids are released correctly. See crbug.com/439051 for
// details. When the ids aren't managed correctly, we get stuck down touches.
TEST_F(MenuControllerTest, TouchIdsReleasedCorrectly) {
- if (features::IsUsingOzonePlatform())
- return;
+ // Run this test only for X11 (either Ozone or non-Ozone).
+ if (features::IsUsingOzonePlatform() &&
+ std::strcmp(ui::OzonePlatform::GetPlatformName(), "x11") != 0) {
+ GTEST_SKIP();
+ }
+
TestEventHandler test_event_handler;
GetRootWindow(owner())->AddPreTargetHandler(&test_event_handler);
@@ -907,7 +918,7 @@ TEST_F(MenuControllerTest, TouchIdsReleasedCorrectly) {
GetRootWindow(owner())->RemovePreTargetHandler(&test_event_handler);
}
-#endif // defined(USE_X11)
+#endif // defined(USE_X11) || defined(USE_OZONE_PLATFORM_X11)
// Tests that initial selected menu items are correct when items are enabled or
// disabled.
@@ -1261,7 +1272,7 @@ TEST_F(MenuControllerTest, SelectByChar) {
}
TEST_F(MenuControllerTest, SelectChildButtonView) {
- AddButtonMenuItems();
+ AddButtonMenuItems(/*single_child=*/false);
View* buttons_view = menu_item()->GetSubmenu()->children()[4];
ASSERT_NE(nullptr, buttons_view);
Button* button1 = Button::AsButton(buttons_view->children()[0]);
@@ -1331,7 +1342,7 @@ TEST_F(MenuControllerTest, SelectChildButtonView) {
}
TEST_F(MenuControllerTest, DeleteChildButtonView) {
- AddButtonMenuItems();
+ AddButtonMenuItems(/*single_child=*/false);
// Handle searching for 'f'; should find "Four".
SelectByChar('f');
@@ -1370,10 +1381,44 @@ TEST_F(MenuControllerTest, DeleteChildButtonView) {
EXPECT_FALSE(button3->IsHotTracked());
}
+// Verifies that the child button is hot tracked after the host menu item is
+// selected by `MenuController::SelectItemAndOpenSubmenu()`.
+TEST_F(MenuControllerTest, ChildButtonHotTrackedAfterMenuItemSelection) {
+ // Add a menu item which owns a button as child.
+ MenuItemView* hosting_menu_item = AddButtonMenuItems(/*single_child=*/true);
+ ASSERT_FALSE(hosting_menu_item->IsSelected());
+ const Button* button = Button::AsButton(hosting_menu_item->children()[0]);
+ EXPECT_FALSE(button->IsHotTracked());
+
+ menu_controller()->SelectItemAndOpenSubmenu(hosting_menu_item);
+ EXPECT_TRUE(hosting_menu_item->IsSelected());
+ EXPECT_TRUE(button->IsHotTracked());
+}
+
+// Verifies that the child button of the menu item which is under mouse hovering
+// is hot tracked (https://crbug.com/1135000).
+TEST_F(MenuControllerTest, ChildButtonHotTrackedAfterMouseMove) {
+ // Add a menu item which owns a button as child.
+ MenuItemView* hosting_menu_item = AddButtonMenuItems(/*single_child=*/true);
+ const Button* button = Button::AsButton(hosting_menu_item->children()[0]);
+ EXPECT_FALSE(button->IsHotTracked());
+
+ SubmenuView* sub_menu = menu_item()->GetSubmenu();
+ gfx::Point location(button->GetBoundsInScreen().CenterPoint());
+ View::ConvertPointFromScreen(sub_menu->GetScrollViewContainer(), &location);
+ ui::MouseEvent event(ui::ET_MOUSE_MOVED, location, location,
+ ui::EventTimeForNow(), 0, 0);
+ ProcessMouseMoved(sub_menu, event);
+
+ // After the mouse moves to `button`, `button` should be hot tracked.
+ EXPECT_EQ(button, GetHotButton());
+ EXPECT_TRUE(button->IsHotTracked());
+}
+
// Creates a menu with Button child views, simulates running a nested
// menu and tests that existing the nested run restores hot-tracked child view.
TEST_F(MenuControllerTest, ChildButtonHotTrackedWhenNested) {
- AddButtonMenuItems();
+ AddButtonMenuItems(/*single_child=*/false);
// Handle searching for 'f'; should find "Four".
SelectByChar('f');
@@ -2198,7 +2243,7 @@ TEST_F(MenuControllerTest, RunWithoutWidgetDoesntCrash) {
TEST_F(MenuControllerTest, MenuControllerReplacedDuringDrag) {
// Build the menu so that the appropriate root window is available to set the
// drag drop client on.
- AddButtonMenuItems();
+ AddButtonMenuItems(/*single_child=*/false);
TestDragDropClient drag_drop_client(base::BindRepeating(
&MenuControllerTest::TestMenuControllerReplacementDuringDrag,
base::Unretained(this)));
@@ -2213,7 +2258,7 @@ TEST_F(MenuControllerTest, MenuControllerReplacedDuringDrag) {
TEST_F(MenuControllerTest, CancelAllDuringDrag) {
// Build the menu so that the appropriate root window is available to set the
// drag drop client on.
- AddButtonMenuItems();
+ AddButtonMenuItems(/*single_child=*/false);
TestDragDropClient drag_drop_client(base::BindRepeating(
&MenuControllerTest::TestCancelAllDuringDrag, base::Unretained(this)));
aura::client::SetDragDropClient(
@@ -2459,7 +2504,7 @@ TEST_F(MenuControllerTest,
}
TEST_F(MenuControllerTest, SetSelectionIndices_Buttons) {
- AddButtonMenuItems();
+ AddButtonMenuItems(/*single_child=*/false);
MenuItemView* const item1 = menu_item()->GetSubmenu()->GetMenuItemAt(0);
MenuItemView* const item2 = menu_item()->GetSubmenu()->GetMenuItemAt(1);
MenuItemView* const item3 = menu_item()->GetSubmenu()->GetMenuItemAt(2);
@@ -2501,7 +2546,7 @@ TEST_F(MenuControllerTest, SetSelectionIndices_Buttons) {
}
TEST_F(MenuControllerTest, SetSelectionIndices_Buttons_SkipHiddenAndDisabled) {
- AddButtonMenuItems();
+ AddButtonMenuItems(/*single_child=*/false);
MenuItemView* const item1 = menu_item()->GetSubmenu()->GetMenuItemAt(0);
MenuItemView* const item2 = menu_item()->GetSubmenu()->GetMenuItemAt(1);
MenuItemView* const item3 = menu_item()->GetSubmenu()->GetMenuItemAt(2);
diff --git a/chromium/ui/views/controls/menu/menu_host_root_view.cc b/chromium/ui/views/controls/menu/menu_host_root_view.cc
index 416eb5b2c24..83a09ec24f0 100644
--- a/chromium/ui/views/controls/menu/menu_host_root_view.cc
+++ b/chromium/ui/views/controls/menu/menu_host_root_view.cc
@@ -7,6 +7,7 @@
#include "ui/views/controls/menu/menu_controller.h"
#include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/controls/menu/submenu_view.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
diff --git a/chromium/ui/views/controls/menu/menu_item_view.cc b/chromium/ui/views/controls/menu/menu_item_view.cc
index aaaddc97e05..38bb7252ab7 100644
--- a/chromium/ui/views/controls/menu/menu_item_view.cc
+++ b/chromium/ui/views/controls/menu/menu_item_view.cc
@@ -41,8 +41,10 @@
#include "ui/views/controls/menu/menu_image_util.h"
#include "ui/views/controls/menu/menu_scroll_view_container.h"
#include "ui/views/controls/menu/menu_separator.h"
+#include "ui/views/controls/menu/new_badge.h"
#include "ui/views/controls/menu/submenu_view.h"
#include "ui/views/controls/separator.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/style/typography.h"
#include "ui/views/vector_icons.h"
#include "ui/views/view_class_properties.h"
@@ -53,38 +55,6 @@ namespace views {
namespace {
-// Returns the appropriate font to use for the "new" badge based on the font
-// currently being used to render the title of the menu item.
-gfx::FontList DeriveNewBadgeFont(const gfx::FontList& primary_font) {
- // Preferred font is slightly smaller and slightly more bold than the title
- // font. The size change is required to make it look correct in the badge; we
- // add a small degree of bold to prevent color smearing/blurring due to font
- // smoothing. This ensures readability on all platforms and in both light and
- // dark modes.
- return primary_font.Derive(MenuConfig::kNewBadgeFontSizeAdjustment,
- gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM);
-}
-
-// Returns the horizontal space required for the "new" badge.
-int GetNewBadgeRequiredWidth(const gfx::FontList& primary_font) {
- const base::string16 new_text =
- l10n_util::GetStringUTF16(IDS_MENU_ITEM_NEW_BADGE);
- gfx::FontList badge_font = DeriveNewBadgeFont(primary_font);
- return gfx::GetStringWidth(new_text, badge_font) +
- 2 * MenuConfig::kNewBadgeInternalPadding +
- 2 * MenuConfig::kNewBadgeHorizontalMargin;
-}
-
-// Returns the highlight rect for the "new" badge given the font and text rect
-// for the badge text.
-gfx::Rect GetNewBadgeRectOutsetAroundText(const gfx::FontList& badge_font,
- const gfx::Rect& badge_text_rect) {
- gfx::Rect badge_rect = badge_text_rect;
- badge_rect.Inset(-gfx::AdjustVisualBorderForFont(
- badge_font, gfx::Insets(MenuConfig::kNewBadgeInternalPadding)));
- return badge_rect;
-}
-
// EmptyMenuMenuItem ---------------------------------------------------------
// EmptyMenuMenuItem is used when a menu has no menu items. EmptyMenuMenuItem
@@ -288,8 +258,7 @@ base::string16 MenuItemView::GetAccessibleNameForMenuItem(
if (is_new_feature) {
accessible_name.push_back(' ');
- accessible_name.append(l10n_util::GetStringUTF16(
- IDS_MENU_ITEM_NEW_BADGE_SCREEN_READER_MESSAGE));
+ accessible_name.append(NewBadge::GetNewBadgeAccessibleDescription());
}
return accessible_name;
@@ -1026,12 +995,11 @@ void MenuItemView::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
PaintMinorIconAndText(canvas, style);
if (ShouldShowNewBadge()) {
- DrawNewBadge(
- canvas,
- gfx::Point(label_start + gfx::GetStringWidth(title(), style.font_list) +
- MenuConfig::kNewBadgeHorizontalMargin,
- top_margin),
- style.font_list, flags);
+ NewBadge::DrawNewBadge(canvas, this,
+ label_start +
+ gfx::GetStringWidth(title(), style.font_list) +
+ NewBadge::kNewBadgeHorizontalMargin,
+ top_margin, style.font_list);
}
// Set the submenu indicator (arrow) image and color.
@@ -1290,7 +1258,9 @@ MenuItemView::MenuItemDimensions MenuItemView::CalculateDimensions() const {
: gfx::GetStringWidth(minor_text, style.font_list));
if (ShouldShowNewBadge())
- dimensions.minor_text_width += GetNewBadgeRequiredWidth(style.font_list);
+ dimensions.minor_text_width +=
+ NewBadge::GetNewBadgeSize(style.font_list).width() +
+ 2 * NewBadge::kNewBadgeHorizontalMargin;
// Determine the height to use.
int label_text_height = secondary_title().empty()
@@ -1349,39 +1319,6 @@ int MenuItemView::GetLabelStartForThisItem() const {
return label_start;
}
-void MenuItemView::DrawNewBadge(gfx::Canvas* canvas,
- const gfx::Point& unmirrored_badge_start,
- const gfx::FontList& primary_font,
- int text_render_flags) {
- gfx::FontList badge_font = DeriveNewBadgeFont(primary_font);
- const base::string16 new_text =
- l10n_util::GetStringUTF16(IDS_MENU_ITEM_NEW_BADGE);
-
- // Calculate bounding box for badge text.
- gfx::Rect badge_text_bounds(unmirrored_badge_start,
- gfx::GetStringSize(new_text, badge_font));
- badge_text_bounds.Offset(
- MenuConfig::kNewBadgeInternalPadding,
- gfx::GetFontCapHeightCenterOffset(primary_font, badge_font));
- if (base::i18n::IsRTL())
- badge_text_bounds.set_x(GetMirroredXForRect(badge_text_bounds));
-
- // Render the badge itself.
- cc::PaintFlags new_flags;
- const SkColor background_color = GetNativeTheme()->GetSystemColor(
- ui::NativeTheme::kColorId_ProminentButtonColor);
- new_flags.setColor(background_color);
- canvas->DrawRoundRect(
- GetNewBadgeRectOutsetAroundText(badge_font, badge_text_bounds),
- MenuConfig::kNewBadgeCornerRadius, new_flags);
-
- // Render the badge text.
- const SkColor foreground_color = GetNativeTheme()->GetSystemColor(
- ui::NativeTheme::kColorId_TextOnProminentButtonColor);
- canvas->DrawStringRectWithFlags(new_text, badge_font, foreground_color,
- badge_text_bounds, text_render_flags);
-}
-
base::string16 MenuItemView::GetMinorText() const {
if (GetID() == kEmptyMenuItemViewID) {
// Don't query the delegate for menus that represent no children.
diff --git a/chromium/ui/views/controls/menu/menu_item_view.h b/chromium/ui/views/controls/menu/menu_item_view.h
index a9222d1da1d..e0c41896c70 100644
--- a/chromium/ui/views/controls/menu/menu_item_view.h
+++ b/chromium/ui/views/controls/menu/menu_item_view.h
@@ -463,13 +463,6 @@ class VIEWS_EXPORT MenuItemView : public View {
// Get the horizontal position at which to draw the menu item's label.
int GetLabelStartForThisItem() const;
- // Draws the "new" badge on |canvas|. |unmirrored_badge_start| is the
- // upper-left corner of the badge, not mirrored for RTL.
- void DrawNewBadge(gfx::Canvas* canvas,
- const gfx::Point& unmirrored_badge_start,
- const gfx::FontList& primary_font,
- int text_render_flags);
-
// Used by MenuController to cache the menu position in use by the
// active menu.
MenuPosition actual_menu_position() const { return actual_menu_position_; }
diff --git a/chromium/ui/views/controls/menu/menu_item_view_unittest.cc b/chromium/ui/views/controls/menu/menu_item_view_unittest.cc
index 48bbbf7213e..b942a3d978e 100644
--- a/chromium/ui/views/controls/menu/menu_item_view_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_item_view_unittest.cc
@@ -9,7 +9,7 @@
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/compositor/canvas_painter.h"
diff --git a/chromium/ui/views/controls/menu/menu_runner_impl.cc b/chromium/ui/views/controls/menu/menu_runner_impl.cc
index a350498702e..b06b4c9d1a7 100644
--- a/chromium/ui/views/controls/menu/menu_runner_impl.cc
+++ b/chromium/ui/views/controls/menu/menu_runner_impl.cc
@@ -31,6 +31,7 @@
#include "ui/base/ui_base_features.h"
#include "ui/events/event_constants.h"
#include "ui/ozone/public/ozone_platform.h"
+#include "ui/ozone/public/platform_menu_utils.h"
#endif
namespace views {
@@ -54,8 +55,11 @@ void FireFocusAfterMenuClose(base::WeakPtr<Widget> widget) {
bool IsAltPressed() {
#if defined(USE_OZONE)
if (features::IsUsingOzonePlatform()) {
- return (ui::OzonePlatform::GetInstance()->GetKeyModifiers() &
- ui::EF_ALT_DOWN) != 0;
+ const auto* const platorm_menu_utils =
+ ui::OzonePlatform::GetInstance()->GetPlatformMenuUtils();
+ if (platorm_menu_utils)
+ return (platorm_menu_utils->GetCurrentKeyModifiers() & ui::EF_ALT_DOWN) !=
+ 0;
}
#endif
#if defined(USE_X11)
diff --git a/chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm b/chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm
index c51447a72ac..214011f187c 100644
--- a/chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm
+++ b/chromium/ui/views/controls/menu/menu_runner_impl_cocoa.mm
@@ -20,6 +20,7 @@
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/controls/menu/menu_config.h"
#include "ui/views/controls/menu/menu_runner_impl_adapter.h"
+#include "ui/views/controls/menu/new_badge.h"
#include "ui/views/views_features.h"
#include "ui/views/widget/widget.h"
@@ -29,7 +30,7 @@ NSImage* NewTagImage() {
static NSImage* new_tag = []() {
// 1. Make the attributed string.
- NSString* badge_text = l10n_util::GetNSString(IDS_MENU_ITEM_NEW_BADGE);
+ NSString* badge_text = l10n_util::GetNSString(IDS_NEW_BADGE);
// The preferred font is slightly smaller and slightly more bold than the
// menu font. The size change is required to make it look correct in the
@@ -39,7 +40,7 @@ NSImage* NewTagImage() {
gfx::Font badge_font = gfx::Font(
new gfx::PlatformFontMac(gfx::PlatformFontMac::SystemFontType::kMenu));
badge_font =
- badge_font.Derive(views::MenuConfig::kNewBadgeFontSizeAdjustment,
+ badge_font.Derive(views::NewBadge::kNewBadgeFontSizeAdjustment,
gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM);
NSColor* badge_text_color = skia::SkColorToSRGBNSColor(
@@ -72,9 +73,9 @@ NSImage* NewTagImage() {
badge_size.width = trunc(badge_size.width);
badge_size.height = trunc(badge_size.height);
- badge_size.width += 2 * views::MenuConfig::kNewBadgeInternalPadding +
- 2 * views::MenuConfig::kNewBadgeHorizontalMargin;
- badge_size.height += views::MenuConfig::kNewBadgeInternalPaddingTopMac;
+ badge_size.width += 2 * views::NewBadge::kNewBadgeInternalPadding +
+ 2 * views::NewBadge::kNewBadgeHorizontalMargin;
+ badge_size.height += views::NewBadge::kNewBadgeInternalPaddingTopMac;
// 3. Craft the image.
@@ -83,12 +84,11 @@ NSImage* NewTagImage() {
flipped:NO
drawingHandler:^(NSRect dest_rect) {
NSRect badge_frame = NSInsetRect(
- dest_rect, views::MenuConfig::kNewBadgeHorizontalMargin, 0);
+ dest_rect, views::NewBadge::kNewBadgeHorizontalMargin, 0);
NSBezierPath* rounded_badge_rect = [NSBezierPath
bezierPathWithRoundedRect:badge_frame
- xRadius:views::MenuConfig::kNewBadgeCornerRadius
- yRadius:views::MenuConfig::
- kNewBadgeCornerRadius];
+ xRadius:views::NewBadge::kNewBadgeCornerRadius
+ yRadius:views::NewBadge::kNewBadgeCornerRadius];
NSColor* badge_color = skia::SkColorToSRGBNSColor(
ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor(
ui::NativeTheme::kColorId_ProminentButtonColor));
@@ -96,9 +96,9 @@ NSImage* NewTagImage() {
[rounded_badge_rect fill];
NSPoint badge_text_location = NSMakePoint(
- NSMinX(badge_frame) + views::MenuConfig::kNewBadgeInternalPadding,
+ NSMinX(badge_frame) + views::NewBadge::kNewBadgeInternalPadding,
NSMinY(badge_frame) +
- views::MenuConfig::kNewBadgeInternalPaddingTopMac);
+ views::NewBadge::kNewBadgeInternalPaddingTopMac);
[badge_attr_string drawAtPoint:badge_text_location];
return YES;
@@ -123,7 +123,7 @@ NSImage* NewTagImage() {
}
- (NSPoint)cellBaselineOffset {
- return NSMakePoint(0, views::MenuConfig::kNewBadgeBaslineOffsetMac);
+ return NSMakePoint(0, views::NewBadge::kNewBadgeBaslineOffsetMac);
}
- (NSSize)cellSize {
diff --git a/chromium/ui/views/controls/menu/menu_runner_unittest.cc b/chromium/ui/views/controls/menu/menu_runner_unittest.cc
index 9c8e6348fcc..24bef47ff5d 100644
--- a/chromium/ui/views/controls/menu/menu_runner_unittest.cc
+++ b/chromium/ui/views/controls/menu/menu_runner_unittest.cc
@@ -9,7 +9,7 @@
#include <memory>
#include <utility>
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/macros.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/simple_test_tick_clock.h"
@@ -641,8 +641,8 @@ TEST_F(MenuRunnerImplTest, FocusOnMenuClose) {
TEST_F(MenuRunnerImplTest, FocusOnMenuCloseDeleteAfterRun) {
// Create test button that has focus.
- LabelButton* button =
- new LabelButton(nullptr, base::string16(), style::CONTEXT_BUTTON);
+ LabelButton* button = new LabelButton(
+ Button::PressedCallback(), base::string16(), style::CONTEXT_BUTTON);
button->SetID(1);
button->SetSize(gfx::Size(20, 20));
owner()->GetRootView()->AddChildView(button);
diff --git a/chromium/ui/views/controls/menu/menu_scroll_view_container.cc b/chromium/ui/views/controls/menu/menu_scroll_view_container.cc
index 979e2222ad7..4771d1d6e85 100644
--- a/chromium/ui/views/controls/menu/menu_scroll_view_container.cc
+++ b/chromium/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -22,6 +22,7 @@
#include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/controls/menu/submenu_view.h"
#include "ui/views/layout/flex_layout.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/round_rect_painter.h"
#include "ui/views/view.h"
#include "ui/views/view_class_properties.h"
diff --git a/chromium/ui/views/controls/menu/menu_separator.cc b/chromium/ui/views/controls/menu/menu_separator.cc
index fc7c6cb70c2..539e79934fe 100644
--- a/chromium/ui/views/controls/menu/menu_separator.cc
+++ b/chromium/ui/views/controls/menu/menu_separator.cc
@@ -9,6 +9,7 @@
#include "ui/gfx/canvas.h"
#include "ui/native_theme/native_theme.h"
#include "ui/views/controls/menu/menu_config.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#if defined(OS_WIN)
#include "ui/display/win/dpi.h"
diff --git a/chromium/ui/views/controls/menu/new_badge.cc b/chromium/ui/views/controls/menu/new_badge.cc
new file mode 100644
index 00000000000..f4c1210c541
--- /dev/null
+++ b/chromium/ui/views/controls/menu/new_badge.cc
@@ -0,0 +1,95 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/controls/menu/new_badge.h"
+
+#include <algorithm>
+
+#include "base/i18n/rtl.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/font_list.h"
+#include "ui/gfx/geometry/insets.h"
+#include "ui/gfx/text_constants.h"
+#include "ui/gfx/text_utils.h"
+#include "ui/native_theme/native_theme.h"
+#include "ui/strings/grit/ui_strings.h"
+#include "ui/views/view.h"
+
+namespace views {
+
+namespace {
+
+// Returns the appropriate font to use for the "new" badge based on the font
+// currently being used to render the title of the menu item.
+gfx::FontList DeriveNewBadgeFont(const gfx::FontList& primary_font) {
+ // Preferred font is slightly smaller and slightly more bold than the title
+ // font. The size change is required to make it look correct in the badge; we
+ // add a small degree of bold to prevent color smearing/blurring due to font
+ // smoothing. This ensures readability on all platforms and in both light and
+ // dark modes.
+ return primary_font.Derive(NewBadge::kNewBadgeFontSizeAdjustment,
+ gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM);
+}
+
+// Returns the highlight rect for the "new" badge given the font and text rect
+// for the badge text.
+gfx::Rect GetNewBadgeRectOutsetAroundText(const gfx::FontList& badge_font,
+ const gfx::Rect& badge_text_rect) {
+ gfx::Rect badge_rect = badge_text_rect;
+ badge_rect.Inset(-gfx::AdjustVisualBorderForFont(
+ badge_font, gfx::Insets(NewBadge::kNewBadgeInternalPadding)));
+ return badge_rect;
+}
+
+} // namespace
+
+// static
+void NewBadge::DrawNewBadge(gfx::Canvas* canvas,
+ const View* view,
+ int unmirrored_badge_left_x,
+ int text_top_y,
+ const gfx::FontList& primary_font) {
+ gfx::FontList badge_font = DeriveNewBadgeFont(primary_font);
+ const base::string16 new_text = l10n_util::GetStringUTF16(IDS_NEW_BADGE);
+
+ // Calculate bounding box for badge text.
+ unmirrored_badge_left_x += kNewBadgeInternalPadding;
+ text_top_y += gfx::GetFontCapHeightCenterOffset(primary_font, badge_font);
+ gfx::Rect badge_text_bounds(gfx::Point(unmirrored_badge_left_x, text_top_y),
+ gfx::GetStringSize(new_text, badge_font));
+ if (base::i18n::IsRTL())
+ badge_text_bounds.set_x(view->GetMirroredXForRect(badge_text_bounds));
+
+ // Render the badge itself.
+ cc::PaintFlags new_flags;
+ const SkColor background_color = view->GetNativeTheme()->GetSystemColor(
+ ui::NativeTheme::kColorId_ProminentButtonColor);
+ new_flags.setColor(background_color);
+ canvas->DrawRoundRect(
+ GetNewBadgeRectOutsetAroundText(badge_font, badge_text_bounds),
+ kNewBadgeCornerRadius, new_flags);
+
+ // Render the badge text.
+ const SkColor foreground_color = view->GetNativeTheme()->GetSystemColor(
+ ui::NativeTheme::kColorId_TextOnProminentButtonColor);
+ canvas->DrawStringRect(new_text, badge_font, foreground_color,
+ badge_text_bounds);
+}
+
+// static
+gfx::Size NewBadge::GetNewBadgeSize(const gfx::FontList& primary_font) {
+ const base::string16 new_text = l10n_util::GetStringUTF16(IDS_NEW_BADGE);
+ gfx::FontList badge_font = DeriveNewBadgeFont(primary_font);
+ const gfx::Size text_size = gfx::GetStringSize(new_text, badge_font);
+ return GetNewBadgeRectOutsetAroundText(badge_font, gfx::Rect(text_size))
+ .size();
+}
+
+// static
+base::string16 NewBadge::GetNewBadgeAccessibleDescription() {
+ return l10n_util::GetStringUTF16(IDS_NEW_BADGE_SCREEN_READER_MESSAGE);
+}
+
+} // namespace views
diff --git a/chromium/ui/views/controls/menu/new_badge.h b/chromium/ui/views/controls/menu/new_badge.h
new file mode 100644
index 00000000000..89c0602e703
--- /dev/null
+++ b/chromium/ui/views/controls/menu/new_badge.h
@@ -0,0 +1,80 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_CONTROLS_MENU_NEW_BADGE_H_
+#define UI_VIEWS_CONTROLS_MENU_NEW_BADGE_H_
+
+#include "base/strings/string16.h"
+#include "ui/views/views_export.h"
+
+namespace gfx {
+class Canvas;
+class FontList;
+class Size;
+} // namespace gfx
+
+namespace views {
+
+class View;
+
+// Represents a "New" badge that can be inserted into any other view as part of
+// a new feature promotion. Provides static methods only;
+class VIEWS_EXPORT NewBadge {
+ public:
+ // This is a utility class and should not be instantiated.
+ NewBadge() = delete;
+
+ // Draws the "new" badge on |canvas|. |unmirrored_badge_left_x| is the
+ // leading edge of the badge, not mirrored for RTL. |text_top_y| is the
+ // top of the text the badge should align with, and |primary_font| is the font
+ // of that text.
+ //
+ // You can call this method from any View to draw the badge directly onto the
+ // view as part of OnPaint() or a similar method, so you don't necessarily
+ // have to instantiate a NewBadge view to get this functionality.
+ static void DrawNewBadge(gfx::Canvas* canvas,
+ const View* view,
+ int unmirrored_badge_left_x,
+ int text_top_y,
+ const gfx::FontList& primary_font);
+
+ // Returns the space required for the "new" badge itself, not counting leading
+ // or trailing margin. It is recommended to leave a margin of
+ // NewBadge::kNewBadgeHorizontalMargin between the badge and any other text
+ // or image elements.
+ static gfx::Size GetNewBadgeSize(const gfx::FontList& primary_font);
+
+ // Gets the accessible description of the new badge, which can be added to
+ // tooltip/screen reader text.
+ static base::string16 GetNewBadgeAccessibleDescription();
+
+ // Layout Constants
+ //
+ // Note that there are a few differences between Views and Mac constants here
+ // that are due to the fact that the rendering is different and therefore
+ // tweaks to the spacing need to be made to achieve the same visual result.
+
+ // Difference in the font size (in pixels) between menu label font and "new"
+ // badge font size.
+ static constexpr int kNewBadgeFontSizeAdjustment = -1;
+
+ // Space between primary text and "new" badge.
+ static constexpr int kNewBadgeHorizontalMargin = 8;
+
+ // Highlight padding around "new" text.
+ static constexpr int kNewBadgeInternalPadding = 4;
+ static constexpr int kNewBadgeInternalPaddingTopMac = 1;
+
+ // The baseline offset of the "new" badge image to the menu text baseline.
+ static constexpr int kNewBadgeBaslineOffsetMac = -4;
+
+ // The corner radius of the rounded rect for the "new" badge.
+ static constexpr int kNewBadgeCornerRadius = 3;
+ static_assert(kNewBadgeCornerRadius <= kNewBadgeInternalPadding,
+ "New badge corner radius should not exceed padding.");
+};
+
+} // namespace views
+
+#endif // UI_VIEWS_CONTROLS_MENU_NEW_BADGE_H_
diff --git a/chromium/ui/views/controls/menu/submenu_view.cc b/chromium/ui/views/controls/menu/submenu_view.cc
index 96b92767319..253c795739f 100644
--- a/chromium/ui/views/controls/menu/submenu_view.cc
+++ b/chromium/ui/views/controls/menu/submenu_view.cc
@@ -22,6 +22,7 @@
#include "ui/views/controls/menu/menu_host.h"
#include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/controls/menu/menu_scroll_view_container.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/widget/root_view.h"
#include "ui/views/widget/widget.h"
diff --git a/chromium/ui/views/controls/message_box_view.cc b/chromium/ui/views/controls/message_box_view.cc
index 4d16c560b39..ba85f6f7fa2 100644
--- a/chromium/ui/views/controls/message_box_view.cc
+++ b/chromium/ui/views/controls/message_box_view.cc
@@ -27,6 +27,7 @@
#include "ui/views/layout/fill_layout.h"
#include "ui/views/layout/grid_layout.h"
#include "ui/views/layout/layout_provider.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/widget/widget.h"
#include "ui/views/window/client_view.h"
#include "ui/views/window/dialog_delegate.h"
@@ -174,7 +175,7 @@ void MessageBoxView::SetLink(const base::string16& text,
DCHECK(!callback.is_null());
DCHECK(link_);
- link_->set_callback(std::move(callback));
+ link_->SetCallback(std::move(callback));
if (link_->GetVisible() && link_->GetText() == text)
return;
link_->SetText(text);
diff --git a/chromium/ui/views/controls/message_box_view_unittest.cc b/chromium/ui/views/controls/message_box_view_unittest.cc
index f8c82ea5f4a..102d713d8da 100644
--- a/chromium/ui/views/controls/message_box_view_unittest.cc
+++ b/chromium/ui/views/controls/message_box_view_unittest.cc
@@ -7,7 +7,7 @@
#include <algorithm>
#include <memory>
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/ui/views/controls/native/native_view_host.cc b/chromium/ui/views/controls/native/native_view_host.cc
index d8e5cf4ddb6..a5a09b31bd8 100644
--- a/chromium/ui/views/controls/native/native_view_host.cc
+++ b/chromium/ui/views/controls/native/native_view_host.cc
@@ -12,6 +12,7 @@
#include "ui/base/cursor/cursor.h"
#include "ui/gfx/canvas.h"
#include "ui/views/controls/native/native_view_host_wrapper.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/painter.h"
#include "ui/views/widget/widget.h"
@@ -57,6 +58,10 @@ void NativeViewHost::SetParentAccessible(gfx::NativeViewAccessible accessible) {
native_wrapper_->SetParentAccessible(accessible);
}
+gfx::NativeViewAccessible NativeViewHost::GetParentAccessible() {
+ return native_wrapper_->GetParentAccessible();
+}
+
bool NativeViewHost::SetCornerRadii(const gfx::RoundedCornersF& corner_radii) {
return native_wrapper_->SetCornerRadii(corner_radii);
}
diff --git a/chromium/ui/views/controls/native/native_view_host.h b/chromium/ui/views/controls/native/native_view_host.h
index 71cba0d714b..ab2371857a0 100644
--- a/chromium/ui/views/controls/native/native_view_host.h
+++ b/chromium/ui/views/controls/native/native_view_host.h
@@ -83,6 +83,9 @@ class VIEWS_EXPORT NativeViewHost : public View {
// it can return this value when querying its parent accessible.
void SetParentAccessible(gfx::NativeViewAccessible);
+ // Returns the parent accessible object to this host's native view.
+ gfx::NativeViewAccessible GetParentAccessible();
+
// Fast resizing will move the native view and clip its visible region, this
// will result in white areas and will not resize the content (so scrollbars
// will be all wrong and content will flow offscreen). Only use this
diff --git a/chromium/ui/views/controls/native/native_view_host_aura.cc b/chromium/ui/views/controls/native/native_view_host_aura.cc
index 888393377d9..740a26c2c82 100644
--- a/chromium/ui/views/controls/native/native_view_host_aura.cc
+++ b/chromium/ui/views/controls/native/native_view_host_aura.cc
@@ -111,6 +111,11 @@ void NativeViewHostAura::SetParentAccessible(
aura::client::kParentNativeViewAccessibleKey, accessible);
}
+gfx::NativeViewAccessible NativeViewHostAura::GetParentAccessible() {
+ return host_->native_view()->GetProperty(
+ aura::client::kParentNativeViewAccessibleKey);
+}
+
void NativeViewHostAura::NativeViewDetaching(bool destroyed) {
// This method causes a succession of window tree changes. ScopedPause ensures
// that occlusion is recomputed at the end of the method instead of after each
diff --git a/chromium/ui/views/controls/native/native_view_host_aura.h b/chromium/ui/views/controls/native/native_view_host_aura.h
index c754f91a096..fc49aba17ee 100644
--- a/chromium/ui/views/controls/native/native_view_host_aura.h
+++ b/chromium/ui/views/controls/native/native_view_host_aura.h
@@ -52,6 +52,7 @@ class NativeViewHostAura : public NativeViewHostWrapper,
gfx::NativeCursor GetCursor(int x, int y) override;
void SetVisible(bool visible) override;
void SetParentAccessible(gfx::NativeViewAccessible) override;
+ gfx::NativeViewAccessible GetParentAccessible() override;
private:
friend class NativeViewHostAuraTest;
diff --git a/chromium/ui/views/controls/native/native_view_host_mac.h b/chromium/ui/views/controls/native/native_view_host_mac.h
index f81c7192e12..017cc11e821 100644
--- a/chromium/ui/views/controls/native/native_view_host_mac.h
+++ b/chromium/ui/views/controls/native/native_view_host_mac.h
@@ -61,6 +61,7 @@ class NativeViewHostMac : public NativeViewHostWrapper,
gfx::NativeCursor GetCursor(int x, int y) override;
void SetVisible(bool visible) override;
void SetParentAccessible(gfx::NativeViewAccessible) override;
+ gfx::NativeViewAccessible GetParentAccessible() override;
private:
// Return the NativeWidgetMacNSWindowHost for this hosted view.
diff --git a/chromium/ui/views/controls/native/native_view_host_mac.mm b/chromium/ui/views/controls/native/native_view_host_mac.mm
index 583ae80698f..bf60b86ae20 100644
--- a/chromium/ui/views/controls/native/native_view_host_mac.mm
+++ b/chromium/ui/views/controls/native/native_view_host_mac.mm
@@ -274,6 +274,12 @@ void NativeViewHostMac::SetParentAccessible(
}
}
+gfx::NativeViewAccessible NativeViewHostMac::GetParentAccessible() {
+ return native_view_hostable_
+ ? native_view_hostable_->ViewsHostableGetParentAccessible()
+ : nullptr;
+}
+
// static
NativeViewHostWrapper* NativeViewHostWrapper::CreateWrapper(
NativeViewHost* host) {
diff --git a/chromium/ui/views/controls/native/native_view_host_mac_unittest.mm b/chromium/ui/views/controls/native/native_view_host_mac_unittest.mm
index 0d125253db1..60282b77090 100644
--- a/chromium/ui/views/controls/native/native_view_host_mac_unittest.mm
+++ b/chromium/ui/views/controls/native/native_view_host_mac_unittest.mm
@@ -36,6 +36,9 @@ class TestViewsHostable : public ui::ViewsHostableView {
gfx::NativeViewAccessible parent_accessibility_element) override {
parent_accessibility_element_ = parent_accessibility_element;
}
+ gfx::NativeViewAccessible ViewsHostableGetParentAccessible() override {
+ return parent_accessibility_element_;
+ }
gfx::NativeViewAccessible ViewsHostableGetAccessibilityElement() override {
return nil;
}
diff --git a/chromium/ui/views/controls/native/native_view_host_wrapper.h b/chromium/ui/views/controls/native/native_view_host_wrapper.h
index 868f0e06736..c1084a3b781 100644
--- a/chromium/ui/views/controls/native/native_view_host_wrapper.h
+++ b/chromium/ui/views/controls/native/native_view_host_wrapper.h
@@ -115,6 +115,9 @@ class NativeViewHostWrapper {
// this value when querying its parent accessible.
virtual void SetParentAccessible(gfx::NativeViewAccessible) = 0;
+ // Returns the parent accessible object to the native view.
+ virtual gfx::NativeViewAccessible GetParentAccessible() = 0;
+
// Creates a platform-specific instance of an object implementing this
// interface.
static NativeViewHostWrapper* CreateWrapper(NativeViewHost* host);
diff --git a/chromium/ui/views/controls/progress_bar.cc b/chromium/ui/views/controls/progress_bar.cc
index 4192f5b6758..09e80a9c335 100644
--- a/chromium/ui/views/controls/progress_bar.cc
+++ b/chromium/ui/views/controls/progress_bar.cc
@@ -53,7 +53,7 @@ int RoundToPercent(double fractional_value) {
ProgressBar::ProgressBar(int preferred_height, bool allow_round_corner)
: preferred_height_(preferred_height),
allow_round_corner_(allow_round_corner) {
- EnableCanvasFlippingForRTLUI(true);
+ SetFlipCanvasOnPaintForRTLUI(true);
}
ProgressBar::~ProgressBar() = default;
diff --git a/chromium/ui/views/controls/resize_area.cc b/chromium/ui/views/controls/resize_area.cc
index 7c9c4178bc5..10d404f623a 100644
--- a/chromium/ui/views/controls/resize_area.cc
+++ b/chromium/ui/views/controls/resize_area.cc
@@ -8,6 +8,7 @@
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/cursor/cursor.h"
#include "ui/views/controls/resize_area_delegate.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/native_cursor.h"
namespace views {
diff --git a/chromium/ui/views/controls/scroll_view.cc b/chromium/ui/views/controls/scroll_view.cc
index 81430515e58..1911f194535 100644
--- a/chromium/ui/views/controls/scroll_view.cc
+++ b/chromium/ui/views/controls/scroll_view.cc
@@ -23,13 +23,30 @@
#include "ui/views/background.h"
#include "ui/views/border.h"
#include "ui/views/controls/focus_ring.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/style/platform_style.h"
+#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
namespace views {
namespace {
+// Returns the combined scroll amount given separate x and y offsets. This is
+// used in the "treat all scroll events as horizontal" case when there is both
+// an x and y offset and we do not want them to add in unintuitive ways.
+//
+// The current approach is to return whichever offset has the larger absolute
+// value, which should at least handle the case in which the gesture is mostly
+// vertical or horizontal. It does mean that for a gesture at 135° or 315° from
+// the x axis there is a breakpoint where scroll direction reverses, but we do
+// not typically expect users to try to scroll a horizontal-scroll-only view at
+// this exact angle.
+template <class T>
+T CombineScrollOffsets(T x, T y) {
+ return std::abs(x) >= std::abs(y) ? x : y;
+}
+
class ScrollCornerView : public View {
public:
ScrollCornerView() = default;
@@ -303,11 +320,42 @@ gfx::Rect ScrollView::GetVisibleRect() const {
contents_viewport_->height());
}
-void ScrollView::SetHideHorizontalScrollBar(bool visible) {
- if (hide_horizontal_scrollbar_ == visible)
+void ScrollView::SetHorizontalScrollBarMode(
+ ScrollBarMode horizontal_scroll_bar_mode) {
+ if (horizontal_scroll_bar_mode_ == horizontal_scroll_bar_mode)
+ return;
+ horizontal_scroll_bar_mode_ = horizontal_scroll_bar_mode;
+ OnPropertyChanged(&horizontal_scroll_bar_mode_, kPropertyEffectsPaint);
+}
+
+void ScrollView::SetVerticalScrollBarMode(
+ ScrollBarMode vertical_scroll_bar_mode) {
+ if (vertical_scroll_bar_mode_ == vertical_scroll_bar_mode)
+ return;
+
+ // Enabling vertical scrolling is incompatible with all scrolling being
+ // interpreted as horizontal.
+ DCHECK(!treat_all_scroll_events_as_horizontal_ ||
+ vertical_scroll_bar_mode == ScrollBarMode::kDisabled);
+
+ vertical_scroll_bar_mode_ = vertical_scroll_bar_mode;
+ OnPropertyChanged(&vertical_scroll_bar_mode_, kPropertyEffectsPaint);
+}
+
+void ScrollView::SetTreatAllScrollEventsAsHorizontal(
+ bool treat_all_scroll_events_as_horizontal) {
+ if (treat_all_scroll_events_as_horizontal_ ==
+ treat_all_scroll_events_as_horizontal) {
return;
- hide_horizontal_scrollbar_ = visible;
- OnPropertyChanged(&hide_horizontal_scrollbar_, kPropertyEffectsPaint);
+ }
+ treat_all_scroll_events_as_horizontal_ =
+ treat_all_scroll_events_as_horizontal;
+ OnPropertyChanged(&treat_all_scroll_events_as_horizontal_,
+ kPropertyEffectsNone);
+
+ // Since this effectively disables vertical scrolling, don't show a
+ // vertical scrollbar.
+ SetVerticalScrollBarMode(ScrollBarMode::kDisabled);
}
void ScrollView::SetDrawOverflowIndicator(bool draw_overflow_indicator) {
@@ -383,9 +431,10 @@ int ScrollView::GetHeightForWidth(int width) const {
}
void ScrollView::Layout() {
- // When horizontal scrollbar is disabled, it should not matter
- // if its OverlapsContent matches vertical bar's.
- if (!hide_horizontal_scrollbar_) {
+ // When either scrollbar is disabled, it should not matter
+ // if its OverlapsContent matches other bar's.
+ if (horizontal_scroll_bar_mode_ == ScrollBarMode::kEnabled &&
+ vertical_scroll_bar_mode_ == ScrollBarMode::kEnabled) {
#if defined(OS_APPLE)
// On Mac, scrollbars may update their style one at a time, so they may
// temporarily be of different types. Refuse to lay out at this point.
@@ -578,10 +627,10 @@ bool ScrollView::OnKeyPressed(const ui::KeyEvent& event) {
bool processed = false;
// Give vertical scrollbar priority
- if (vert_sb_->GetVisible())
+ if (IsVerticalScrollEnabled())
processed = vert_sb_->OnKeyPressed(event);
- if (!processed && horiz_sb_->GetVisible())
+ if (!processed && IsHorizontalScrollEnabled())
processed = horiz_sb_->OnKeyPressed(event);
return processed;
@@ -590,12 +639,21 @@ bool ScrollView::OnKeyPressed(const ui::KeyEvent& event) {
bool ScrollView::OnMouseWheel(const ui::MouseWheelEvent& e) {
bool processed = false;
+ const ui::MouseWheelEvent to_propagate =
+ treat_all_scroll_events_as_horizontal_
+ ? ui::MouseWheelEvent(
+ e, CombineScrollOffsets(e.x_offset(), e.y_offset()), 0)
+ : e;
+
// TODO(https://crbug.com/615948): Use composited scrolling.
- if (vert_sb_->GetVisible())
- processed = vert_sb_->OnMouseWheel(e);
+ if (IsVerticalScrollEnabled())
+ processed = vert_sb_->OnMouseWheel(to_propagate);
- if (horiz_sb_->GetVisible())
- processed = horiz_sb_->OnMouseWheel(e) || processed;
+ if (IsHorizontalScrollEnabled()) {
+ // When there is no vertical scrollbar, allow vertical scroll events to be
+ // interpreted as horizontal scroll events.
+ processed |= horiz_sb_->OnMouseWheel(to_propagate);
+ }
return processed;
}
@@ -604,13 +662,28 @@ void ScrollView::OnScrollEvent(ui::ScrollEvent* event) {
if (!contents_)
return;
+ // Possibly force the scroll event to horizontal based on the configuration
+ // option.
+ ui::ScrollEvent e =
+ treat_all_scroll_events_as_horizontal_
+ ? ui::ScrollEvent(
+ event->type(), event->location_f(), event->root_location_f(),
+ event->time_stamp(), event->flags(),
+ CombineScrollOffsets(event->x_offset(), event->y_offset()),
+ 0.0f,
+ CombineScrollOffsets(event->y_offset_ordinal(),
+ event->x_offset_ordinal()),
+ 0.0f, event->finger_count(), event->momentum_phase(),
+ event->scroll_event_phase())
+ : *event;
+
ui::ScrollInputHandler* compositor_scroller =
GetWidget()->GetCompositor()->scroll_input_handler();
if (compositor_scroller) {
DCHECK(scroll_with_layers_enabled_);
- if (compositor_scroller->OnScrollEvent(*event, contents_->layer())) {
- event->SetHandled();
- event->StopPropagation();
+ if (compositor_scroller->OnScrollEvent(e, contents_->layer())) {
+ e.SetHandled();
+ e.StopPropagation();
}
}
@@ -618,9 +691,15 @@ void ScrollView::OnScrollEvent(ui::ScrollEvent* event) {
// scrollbars that they may be about scroll, or that they may need to cancel
// UI feedback once the scrolling direction is known.
if (horiz_sb_)
- horiz_sb_->ObserveScrollEvent(*event);
+ horiz_sb_->ObserveScrollEvent(e);
if (vert_sb_)
- vert_sb_->ObserveScrollEvent(*event);
+ vert_sb_->ObserveScrollEvent(e);
+
+ // Need to copy state back to original event.
+ if (e.handled())
+ event->SetHandled();
+ if (e.stopped_propagation())
+ event->StopPropagation();
}
void ScrollView::OnGestureEvent(ui::GestureEvent* event) {
@@ -632,14 +711,20 @@ void ScrollView::OnGestureEvent(ui::GestureEvent* event) {
event->type() == ui::ET_GESTURE_SCROLL_END ||
event->type() == ui::ET_SCROLL_FLING_START;
+ // Note: we will not invert gesture events because it will be confusing to
+ // have a vertical finger gesture on a touchscreen cause the scroll pane to
+ // scroll horizontally.
+
// TODO(https://crbug.com/615948): Use composited scrolling.
- if (vert_sb_->GetVisible()) {
- if (vert_sb_->bounds().Contains(event->location()) || scroll_event)
- vert_sb_->OnGestureEvent(event);
+ if (IsVerticalScrollEnabled() &&
+ (scroll_event || (vert_sb_->GetVisible() &&
+ vert_sb_->bounds().Contains(event->location())))) {
+ vert_sb_->OnGestureEvent(event);
}
- if (!event->handled() && horiz_sb_->GetVisible()) {
- if (horiz_sb_->bounds().Contains(event->location()) || scroll_event)
- horiz_sb_->OnGestureEvent(event);
+ if (!event->handled() && IsHorizontalScrollEnabled() &&
+ (scroll_event || (horiz_sb_->GetVisible() &&
+ horiz_sb_->bounds().Contains(event->location())))) {
+ horiz_sb_->OnGestureEvent(event);
}
}
@@ -719,13 +804,13 @@ void ScrollView::ScrollToPosition(ScrollBar* source, int position) {
return;
gfx::ScrollOffset offset = CurrentOffset();
- if (source == horiz_sb_.get() && horiz_sb_->GetVisible()) {
+ if (source == horiz_sb_.get() && IsHorizontalScrollEnabled()) {
position = AdjustPosition(offset.x(), position, contents_->width(),
contents_viewport_->width());
if (offset.x() == position)
return;
offset.set_x(position);
- } else if (source == vert_sb_.get() && vert_sb_->GetVisible()) {
+ } else if (source == vert_sb_.get() && IsVerticalScrollEnabled()) {
position = AdjustPosition(offset.y(), position, contents_->height(),
contents_viewport_->height());
if (offset.y() == position)
@@ -783,8 +868,10 @@ void ScrollView::SetHeaderOrContents(View* parent,
}
void ScrollView::ScrollContentsRegionToBeVisible(const gfx::Rect& rect) {
- if (!contents_ || (!horiz_sb_->GetVisible() && !vert_sb_->GetVisible()))
+ if (!contents_ ||
+ (!IsHorizontalScrollEnabled() && !IsVerticalScrollEnabled())) {
return;
+ }
// Figure out the maximums for this scroll view.
const int contents_max_x =
@@ -830,9 +917,19 @@ void ScrollView::ComputeScrollBarsVisibility(const gfx::Size& vp_size,
const gfx::Size& content_size,
bool* horiz_is_shown,
bool* vert_is_shown) const {
- if (hide_horizontal_scrollbar_) {
+ const bool horizontal_enabled =
+ horizontal_scroll_bar_mode_ == ScrollBarMode::kEnabled;
+ const bool vertical_enabled =
+ vertical_scroll_bar_mode_ == ScrollBarMode::kEnabled;
+ if (!horizontal_enabled) {
*horiz_is_shown = false;
- *vert_is_shown = content_size.height() > vp_size.height();
+ *vert_is_shown =
+ vertical_enabled && content_size.height() > vp_size.height();
+ return;
+ }
+ if (!vertical_enabled) {
+ *vert_is_shown = false;
+ *horiz_is_shown = content_size.width() > vp_size.width();
return;
}
@@ -876,12 +973,12 @@ void ScrollView::UpdateScrollBarPositions() {
return;
const gfx::ScrollOffset offset = CurrentOffset();
- if (horiz_sb_->GetVisible()) {
+ if (IsHorizontalScrollEnabled()) {
int vw = contents_viewport_->width();
int cw = contents_->width();
horiz_sb_->Update(vw, cw, offset.x());
}
- if (vert_sb_->GetVisible()) {
+ if (IsVerticalScrollEnabled()) {
int vh = contents_viewport_->height();
int ch = contents_->height();
vert_sb_->Update(vh, ch, offset.y());
@@ -919,6 +1016,28 @@ bool ScrollView::ScrollsWithLayers() const {
return contents_viewport_->layer() != nullptr;
}
+bool ScrollView::IsHorizontalScrollEnabled() const {
+ switch (horizontal_scroll_bar_mode_) {
+ case ScrollBarMode::kDisabled:
+ return false;
+ case ScrollBarMode::kHiddenButEnabled:
+ return bool{horiz_sb_};
+ case ScrollBarMode::kEnabled:
+ return horiz_sb_ && horiz_sb_->GetVisible();
+ }
+}
+
+bool ScrollView::IsVerticalScrollEnabled() const {
+ switch (vertical_scroll_bar_mode_) {
+ case ScrollBarMode::kDisabled:
+ return false;
+ case ScrollBarMode::kHiddenButEnabled:
+ return bool{vert_sb_};
+ case ScrollBarMode::kEnabled:
+ return vert_sb_ && vert_sb_->GetVisible();
+ }
+}
+
void ScrollView::EnableViewportLayer() {
if (DoesViewportOrScrollViewHaveLayer())
return;
@@ -1013,20 +1132,21 @@ void ScrollView::PositionOverflowIndicators() {
void ScrollView::UpdateOverflowIndicatorVisibility(
const gfx::ScrollOffset& offset) {
SetControlVisibility(more_content_top_.get(),
- !draw_border_ && !header_ && vert_sb_->GetVisible() &&
+ !draw_border_ && !header_ && IsVerticalScrollEnabled() &&
offset.y() > vert_sb_->GetMinPosition() &&
draw_overflow_indicator_);
SetControlVisibility(
more_content_bottom_.get(),
!draw_border_ && vert_sb_->GetVisible() && !horiz_sb_->GetVisible() &&
offset.y() < vert_sb_->GetMaxPosition() && draw_overflow_indicator_);
+
SetControlVisibility(more_content_left_.get(),
- !draw_border_ && horiz_sb_->GetVisible() &&
+ !draw_border_ && IsHorizontalScrollEnabled() &&
offset.x() > horiz_sb_->GetMinPosition() &&
draw_overflow_indicator_);
SetControlVisibility(
more_content_right_.get(),
- !draw_border_ && horiz_sb_->GetVisible() && !vert_sb_->GetVisible() &&
+ !draw_border_ && IsHorizontalScrollEnabled() && !vert_sb_->GetVisible() &&
offset.x() < horiz_sb_->GetMaxPosition() && draw_overflow_indicator_);
}
@@ -1038,7 +1158,9 @@ ADD_PROPERTY_METADATA(base::Optional<ui::NativeTheme::ColorId>,
BackgroundThemeColorId)
ADD_PROPERTY_METADATA(bool, DrawOverflowIndicator)
ADD_PROPERTY_METADATA(bool, HasFocusIndicator)
-ADD_PROPERTY_METADATA(bool, HideHorizontalScrollBar)
+ADD_PROPERTY_METADATA(ScrollView::ScrollBarMode, HorizontalScrollBarMode)
+ADD_PROPERTY_METADATA(ScrollView::ScrollBarMode, VerticalScrollBarMode)
+ADD_PROPERTY_METADATA(bool, TreatAllScrollEventsAsHorizontal)
END_METADATA
// VariableRowHeightScrollHelper ----------------------------------------------
diff --git a/chromium/ui/views/controls/scroll_view.h b/chromium/ui/views/controls/scroll_view.h
index e37d0f6d7ee..ec20b217e4a 100644
--- a/chromium/ui/views/controls/scroll_view.h
+++ b/chromium/ui/views/controls/scroll_view.h
@@ -50,6 +50,19 @@ class VIEWS_EXPORT ScrollView : public View, public ScrollBarController {
// Indicates whether or not scroll view is initialized with layer-scrolling.
enum class ScrollWithLayers { kDisabled, kEnabled };
+ // Controls how a scroll bar appears and functions.
+ enum class ScrollBarMode {
+ // The scrollbar is hidden, and the pane will not respond to e.g. mousewheel
+ // events even if the contents are larger than the viewport.
+ kDisabled,
+ // The scrollbar is hidden whether or not the contents are larger than the
+ // viewport, but the pane will respond to scroll events.
+ kHiddenButEnabled,
+ // The scrollbar will be visible if the contents are larger than the
+ // viewport and the pane will respond to scroll events.
+ kEnabled
+ };
+
ScrollView();
// Additional constructor for overriding scrolling as defined by
@@ -110,8 +123,19 @@ class VIEWS_EXPORT ScrollView : public View, public ScrollBarController {
bool GetUseColorId() const { return !!background_color_id_; }
- bool GetHideHorizontalScrollBar() const { return hide_horizontal_scrollbar_; }
- void SetHideHorizontalScrollBar(bool visible);
+ ScrollBarMode GetHorizontalScrollBarMode() const {
+ return horizontal_scroll_bar_mode_;
+ }
+ ScrollBarMode GetVerticalScrollBarMode() const {
+ return vertical_scroll_bar_mode_;
+ }
+ bool GetTreatAllScrollEventsAsHorizontal() const {
+ return treat_all_scroll_events_as_horizontal_;
+ }
+ void SetHorizontalScrollBarMode(ScrollBarMode horizontal_scroll_bar_mode);
+ void SetVerticalScrollBarMode(ScrollBarMode vertical_scroll_bar_mode);
+ void SetTreatAllScrollEventsAsHorizontal(
+ bool treat_all_scroll_events_as_horizontal);
bool GetDrawOverflowIndicator() const { return draw_overflow_indicator_; }
void SetDrawOverflowIndicator(bool draw_overflow_indicator);
@@ -165,6 +189,9 @@ class VIEWS_EXPORT ScrollView : public View, public ScrollBarController {
class Viewport;
+ bool IsHorizontalScrollEnabled() const;
+ bool IsVerticalScrollEnabled() const;
+
// Forces |contents_viewport_| to have a Layer (assuming it doesn't already).
void EnableViewportLayer();
@@ -269,9 +296,14 @@ class VIEWS_EXPORT ScrollView : public View, public ScrollBarController {
base::Optional<ui::NativeTheme::ColorId> background_color_id_ =
ui::NativeTheme::kColorId_DialogBackground;
- // If true, never show the horizontal scrollbar (even if the contents is wider
- // than the viewport).
- bool hide_horizontal_scrollbar_ = false;
+ // How to handle the case when the contents overflow the viewport.
+ ScrollBarMode horizontal_scroll_bar_mode_ = ScrollBarMode::kEnabled;
+ ScrollBarMode vertical_scroll_bar_mode_ = ScrollBarMode::kEnabled;
+
+ // Causes vertical scroll events (e.g. scrolling with the mousewheel) as
+ // horizontal events, to make scrolling in horizontal-only scroll situations
+ // easier for the user.
+ bool treat_all_scroll_events_as_horizontal_ = false;
// In Harmony, the indicator is a focus ring. Pre-Harmony, the indicator is a
// different border painter.
@@ -298,13 +330,15 @@ VIEW_BUILDER_VIEW_TYPE_PROPERTY(View, Contents)
VIEW_BUILDER_VIEW_TYPE_PROPERTY(View, Header)
VIEW_BUILDER_PROPERTY(base::Optional<ui::NativeTheme::ColorId>,
BackgroundThemeColorId)
-VIEW_BUILDER_PROPERTY(bool, HideHorizontalScrollBar)
+VIEW_BUILDER_PROPERTY(ScrollView::ScrollBarMode, HorizontalScrollBarMode)
+VIEW_BUILDER_PROPERTY(ScrollView::ScrollBarMode, VerticalScrollBarMode)
+VIEW_BUILDER_PROPERTY(bool, TreatAllScrollEventsAsHorizontal)
VIEW_BUILDER_PROPERTY(bool, DrawOverflowIndicator)
VIEW_BUILDER_PROPERTY(base::Optional<SkColor>, BackgroundColor)
VIEW_BUILDER_VIEW_PROPERTY(ScrollBar, HorizontalScrollBar)
VIEW_BUILDER_VIEW_PROPERTY(ScrollBar, VerticalScrollBar)
VIEW_BUILDER_PROPERTY(bool, HasFocusIndicator)
-END_VIEW_BUILDER(VIEWS_EXPORT, ScrollView)
+END_VIEW_BUILDER
// VariableRowHeightScrollHelper is intended for views that contain rows of
// varying height. To use a VariableRowHeightScrollHelper create one supplying
@@ -380,4 +414,6 @@ class FixedRowHeightScrollHelper : public VariableRowHeightScrollHelper {
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, ScrollView)
+
#endif // UI_VIEWS_CONTROLS_SCROLL_VIEW_H_
diff --git a/chromium/ui/views/controls/scroll_view_unittest.cc b/chromium/ui/views/controls/scroll_view_unittest.cc
index 0bf63542ad7..3eb0d5202c9 100644
--- a/chromium/ui/views/controls/scroll_view_unittest.cc
+++ b/chromium/ui/views/controls/scroll_view_unittest.cc
@@ -65,7 +65,9 @@ class ScrollViewTestApi {
return gfx::Point() - gfx::ScrollOffsetToFlooredVector2d(CurrentOffset());
}
- gfx::ScrollOffset CurrentOffset() { return scroll_view_->CurrentOffset(); }
+ gfx::ScrollOffset CurrentOffset() const {
+ return scroll_view_->CurrentOffset();
+ }
base::RetainingOneShotTimer* GetScrollBarHideTimer(
ScrollBarOrientation orientation) {
@@ -183,6 +185,21 @@ class VerticalResizingView : public View {
DISALLOW_COPY_AND_ASSIGN(VerticalResizingView);
};
+// Same as VerticalResizingView, but horizontal instead.
+class HorizontalResizingView : public View {
+ public:
+ HorizontalResizingView() = default;
+ ~HorizontalResizingView() override = default;
+ void Layout() override {
+ int height = 10000;
+ int width = parent()->width();
+ SetBounds(x(), y(), width, height);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(HorizontalResizingView);
+};
+
class TestScrollBarThumb : public BaseScrollBarThumb {
public:
using BaseScrollBarThumb::BaseScrollBarThumb;
@@ -469,6 +486,53 @@ TEST_F(ScrollViewTest, VerticalScrollbarDoesNotAppearUnnecessarily) {
EXPECT_TRUE(scroll_view_->horizontal_scroll_bar()->GetVisible());
}
+// Same as above, but setting horizontal scroll bar to hidden.
+TEST_F(ScrollViewTest, HorizontalScrollbarDoesNotAppearIfHidden) {
+ const gfx::Rect default_outer_bounds(0, 0, 100, 100);
+ scroll_view_->SetHorizontalScrollBarMode(
+ ScrollView::ScrollBarMode::kHiddenButEnabled);
+ scroll_view_->SetContents(std::make_unique<VerticalResizingView>());
+ scroll_view_->SetBoundsRect(default_outer_bounds);
+ scroll_view_->Layout();
+ EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
+ EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible());
+}
+
+// Same as above, but setting vertical scrollbar instead.
+TEST_F(ScrollViewTest, VerticalScrollbarDoesNotAppearIfHidden) {
+ const gfx::Rect default_outer_bounds(0, 0, 100, 100);
+ scroll_view_->SetVerticalScrollBarMode(
+ ScrollView::ScrollBarMode::kHiddenButEnabled);
+ scroll_view_->SetContents(std::make_unique<HorizontalResizingView>());
+ scroll_view_->SetBoundsRect(default_outer_bounds);
+ scroll_view_->Layout();
+ EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
+ EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible());
+}
+
+// Same as above, but setting horizontal scroll bar to disabled.
+TEST_F(ScrollViewTest, HorizontalScrollbarDoesNotAppearIfDisabled) {
+ const gfx::Rect default_outer_bounds(0, 0, 100, 100);
+ scroll_view_->SetHorizontalScrollBarMode(
+ ScrollView::ScrollBarMode::kDisabled);
+ scroll_view_->SetContents(std::make_unique<VerticalResizingView>());
+ scroll_view_->SetBoundsRect(default_outer_bounds);
+ scroll_view_->Layout();
+ EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
+ EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible());
+}
+
+// Same as above, but setting vertical scrollbar instead.
+TEST_F(ScrollViewTest, VerticallScrollbarDoesNotAppearIfDisabled) {
+ const gfx::Rect default_outer_bounds(0, 0, 100, 100);
+ scroll_view_->SetVerticalScrollBarMode(ScrollView::ScrollBarMode::kDisabled);
+ scroll_view_->SetContents(std::make_unique<HorizontalResizingView>());
+ scroll_view_->SetBoundsRect(default_outer_bounds);
+ scroll_view_->Layout();
+ EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible());
+ EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible());
+}
+
// Verifies the scrollbars are added as necessary.
// If on Mac, test the non-overlay scrollbars.
TEST_F(ScrollViewTest, ScrollBars) {
@@ -742,6 +806,46 @@ TEST_F(ScrollViewTest, ScrollToPositionUpdatesScrollBar) {
EXPECT_GT(scroll_bar->GetPosition(), 0);
}
+// Test that calling ScrollToPosition() also updates the position of the
+// child view even when the horizontal scrollbar is hidden.
+TEST_F(ScrollViewTest, ScrollToPositionUpdatesWithHiddenHorizontalScrollBar) {
+ scroll_view_->SetHorizontalScrollBarMode(
+ ScrollView::ScrollBarMode::kHiddenButEnabled);
+ ScrollViewTestApi test_api(scroll_view_.get());
+ View* contents = InstallContents();
+
+ contents->SetBounds(0, 0, 400, 50);
+ scroll_view_->Layout();
+ auto* scroll_bar = test_api.GetScrollBar(HORIZONTAL);
+ ASSERT_TRUE(scroll_bar);
+ EXPECT_FALSE(scroll_bar->GetVisible());
+ // We can't rely on the scrollbar, which may not be updated as it's not
+ // visible, but we can check the scroll offset itself.
+ EXPECT_EQ(0, test_api.CurrentOffset().x());
+ scroll_view_->ScrollToPosition(scroll_bar, 20);
+ EXPECT_GT(test_api.CurrentOffset().x(), 0);
+}
+
+// Test that calling ScrollToPosition() also updates the position of the
+// child view even when the horizontal scrollbar is hidden.
+TEST_F(ScrollViewTest, ScrollToPositionUpdatesWithHiddenVerticalScrollBar) {
+ scroll_view_->SetVerticalScrollBarMode(
+ ScrollView::ScrollBarMode::kHiddenButEnabled);
+ ScrollViewTestApi test_api(scroll_view_.get());
+ View* contents = InstallContents();
+
+ contents->SetBounds(0, 0, 50, 400);
+ scroll_view_->Layout();
+ auto* scroll_bar = test_api.GetScrollBar(VERTICAL);
+ ASSERT_TRUE(scroll_bar);
+ EXPECT_FALSE(scroll_bar->GetVisible());
+ // We can't rely on the scrollbar, which may not be updated as it's not
+ // visible, but we can check the scroll offset itself.
+ EXPECT_EQ(0, test_api.CurrentOffset().y());
+ scroll_view_->ScrollToPosition(scroll_bar, 20);
+ EXPECT_GT(test_api.CurrentOffset().y(), 0);
+}
+
// Verifies ScrollRectToVisible() on the child works.
TEST_F(ScrollViewTest, ScrollRectToVisible) {
ScrollViewTestApi test_api(scroll_view_.get());
@@ -769,6 +873,66 @@ TEST_F(ScrollViewTest, ScrollRectToVisible) {
EXPECT_EQ(415 - viewport_height, test_api.CurrentOffset().y());
}
+// Verifies ScrollRectToVisible() scrolls the view horizontally even if the
+// horizontal scrollbar is hidden (but not disabled).
+TEST_F(ScrollViewTest, ScrollRectToVisibleWithHiddenHorizontalScrollbar) {
+ scroll_view_->SetHorizontalScrollBarMode(
+ ScrollView::ScrollBarMode::kHiddenButEnabled);
+ ScrollViewTestApi test_api(scroll_view_.get());
+ auto contents = std::make_unique<CustomView>();
+ contents->SetPreferredSize(gfx::Size(500, 1000));
+ auto* contents_ptr = scroll_view_->SetContents(std::move(contents));
+
+ scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
+ scroll_view_->Layout();
+ EXPECT_EQ("0,0", test_api.IntegralViewOffset().ToString());
+
+ // Scroll to x=305 width=10, this should make the x position of the content
+ // at (305 + 10) - viewport_width (scroll region right aligned).
+ contents_ptr->ScrollRectToVisible(gfx::Rect(305, 0, 10, 10));
+ const int viewport_width = test_api.contents_viewport()->width();
+
+ // Expect there to be a vertical scrollbar, making the viewport shorter.
+ EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(), viewport_width);
+
+ gfx::ScrollOffset offset = test_api.CurrentOffset();
+ EXPECT_EQ(315 - viewport_width, offset.x());
+
+ // Scroll to the current x-location and 10x10; should do nothing.
+ contents_ptr->ScrollRectToVisible(gfx::Rect(offset.x(), 0, 10, 10));
+ EXPECT_EQ(315 - viewport_width, test_api.CurrentOffset().x());
+}
+
+// Verifies ScrollRectToVisible() scrolls the view horizontally even if the
+// horizontal scrollbar is hidden (but not disabled).
+TEST_F(ScrollViewTest, ScrollRectToVisibleWithHiddenVerticalScrollbar) {
+ scroll_view_->SetVerticalScrollBarMode(
+ ScrollView::ScrollBarMode::kHiddenButEnabled);
+ ScrollViewTestApi test_api(scroll_view_.get());
+ auto contents = std::make_unique<CustomView>();
+ contents->SetPreferredSize(gfx::Size(1000, 500));
+ auto* contents_ptr = scroll_view_->SetContents(std::move(contents));
+
+ scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100));
+ scroll_view_->Layout();
+ EXPECT_EQ("0,0", test_api.IntegralViewOffset().ToString());
+
+ // Scroll to y=305 height=10, this should make the y position of the content
+ // at (305 + 10) - viewport_height (scroll region bottom aligned).
+ contents_ptr->ScrollRectToVisible(gfx::Rect(0, 305, 10, 10));
+ const int viewport_height = test_api.contents_viewport()->height();
+
+ // Expect there to be a vertical scrollbar, making the viewport shorter.
+ EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutHeight(), viewport_height);
+
+ gfx::ScrollOffset offset = test_api.CurrentOffset();
+ EXPECT_EQ(315 - viewport_height, offset.y());
+
+ // Scroll to the current x-location and 10x10; should do nothing.
+ contents_ptr->ScrollRectToVisible(gfx::Rect(0, offset.y(), 10, 10));
+ EXPECT_EQ(315 - viewport_height, test_api.CurrentOffset().y());
+}
+
// Verifies that child scrolls into view when it's focused.
TEST_F(ScrollViewTest, ScrollChildToVisibleOnFocus) {
ScrollViewTestApi test_api(scroll_view_.get());
@@ -1576,8 +1740,34 @@ TEST_F(ScrollViewTest, VerticalWithHeaderOverflowIndicators) {
EXPECT_FALSE(test_api.more_content_right()->GetVisible());
}
-// Ensure ScrollView::Layout succeeds if a hidden scrollbar's overlap style
+// Ensure ScrollView::Layout succeeds if a disabled scrollbar's overlap style
// does not match the other scrollbar.
+TEST_F(ScrollViewTest, IgnoreOverlapWithDisabledHorizontalScroll) {
+ ScrollViewTestApi test_api(scroll_view_.get());
+
+ constexpr int kThickness = 1;
+ // Assume horizontal scroll bar is the default and is overlapping.
+ scroll_view_->SetHorizontalScrollBar(std::make_unique<TestScrollBar>(
+ /* horizontal */ true, /* overlaps_content */ true, kThickness));
+ // Assume vertical scroll bar is custom and it we want it to not overlap.
+ scroll_view_->SetVerticalScrollBar(std::make_unique<TestScrollBar>(
+ /* horizontal */ false, /* overlaps_content */ false, kThickness));
+
+ // Also, let's turn off horizontal scroll bar.
+ scroll_view_->SetHorizontalScrollBarMode(
+ ScrollView::ScrollBarMode::kDisabled);
+
+ View* contents = InstallContents();
+ contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
+ scroll_view_->Layout();
+
+ gfx::Size expected_size = scroll_view_->size();
+ expected_size.Enlarge(-kThickness, 0);
+ EXPECT_EQ(expected_size, test_api.contents_viewport()->size());
+}
+
+// Ensure ScrollView::Layout succeeds if a hidden but enabled scrollbar's
+// overlap style does not match the other scrollbar.
TEST_F(ScrollViewTest, IgnoreOverlapWithHiddenHorizontalScroll) {
ScrollViewTestApi test_api(scroll_view_.get());
@@ -1590,7 +1780,8 @@ TEST_F(ScrollViewTest, IgnoreOverlapWithHiddenHorizontalScroll) {
/* horizontal */ false, /* overlaps_content */ false, kThickness));
// Also, let's turn off horizontal scroll bar.
- scroll_view_->SetHideHorizontalScrollBar(true);
+ scroll_view_->SetHorizontalScrollBarMode(
+ ScrollView::ScrollBarMode::kHiddenButEnabled);
View* contents = InstallContents();
contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
@@ -1601,6 +1792,57 @@ TEST_F(ScrollViewTest, IgnoreOverlapWithHiddenHorizontalScroll) {
EXPECT_EQ(expected_size, test_api.contents_viewport()->size());
}
+// Ensure ScrollView::Layout succeeds if a disabled scrollbar's overlap style
+// does not match the other scrollbar.
+TEST_F(ScrollViewTest, IgnoreOverlapWithDisabledVerticalScroll) {
+ ScrollViewTestApi test_api(scroll_view_.get());
+
+ constexpr int kThickness = 1;
+ // Assume horizontal scroll bar is custom and it we want it to not overlap.
+ scroll_view_->SetHorizontalScrollBar(std::make_unique<TestScrollBar>(
+ /* horizontal */ true, /* overlaps_content */ false, kThickness));
+ // Assume vertical scroll bar is the default and is overlapping.
+ scroll_view_->SetVerticalScrollBar(std::make_unique<TestScrollBar>(
+ /* horizontal */ false, /* overlaps_content */ true, kThickness));
+
+ // Also, let's turn off horizontal scroll bar.
+ scroll_view_->SetVerticalScrollBarMode(ScrollView::ScrollBarMode::kDisabled);
+
+ View* contents = InstallContents();
+ contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
+ scroll_view_->Layout();
+
+ gfx::Size expected_size = scroll_view_->size();
+ expected_size.Enlarge(0, -kThickness);
+ EXPECT_EQ(expected_size, test_api.contents_viewport()->size());
+}
+
+// Ensure ScrollView::Layout succeeds if a hidden but enabled scrollbar's
+// overlap style does not match the other scrollbar.
+TEST_F(ScrollViewTest, IgnoreOverlapWithHiddenVerticalScroll) {
+ ScrollViewTestApi test_api(scroll_view_.get());
+
+ constexpr int kThickness = 1;
+ // Assume horizontal scroll bar is custom and it we want it to not overlap.
+ scroll_view_->SetHorizontalScrollBar(std::make_unique<TestScrollBar>(
+ /* horizontal */ true, /* overlaps_content */ false, kThickness));
+ // Assume vertical scroll bar is the default and is overlapping.
+ scroll_view_->SetVerticalScrollBar(std::make_unique<TestScrollBar>(
+ /* horizontal */ false, /* overlaps_content */ true, kThickness));
+
+ // Also, let's turn off horizontal scroll bar.
+ scroll_view_->SetVerticalScrollBarMode(
+ ScrollView::ScrollBarMode::kHiddenButEnabled);
+
+ View* contents = InstallContents();
+ contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300));
+ scroll_view_->Layout();
+
+ gfx::Size expected_size = scroll_view_->size();
+ expected_size.Enlarge(0, -kThickness);
+ EXPECT_EQ(expected_size, test_api.contents_viewport()->size());
+}
+
// Test scrolling behavior when clicking on the scroll track.
TEST_F(WidgetScrollViewTest, ScrollTrackScrolling) {
// Set up with a vertical scroller.
@@ -1847,43 +2089,123 @@ TEST_P(WidgetScrollViewTestRTLAndLayers, ScrollOffsetUsingLayers) {
EXPECT_EQ(gfx::ScrollOffset(offset.x(), offset.y()), impl_offset);
}
-// Tests to see the scroll events are handled correctly in composited and
-// non-composited scrolling.
-TEST_F(WidgetScrollViewTest, CompositedScrollEvents) {
- // Set up with a vertical scroll bar.
- ScrollView* scroll_view =
- AddScrollViewWithContentSize(gfx::Size(10, kDefaultHeight * 5));
- ScrollViewTestApi test_api(scroll_view);
+namespace {
- // Create a fake scroll event and send it to the scroll view.
- ui::ScrollEvent scroll(ui::ET_SCROLL, gfx::Point(), base::TimeTicks::Now(), 0,
- 0, -10, 0, -10, 3);
- EXPECT_FALSE(scroll.handled());
- EXPECT_FALSE(scroll.stopped_propagation());
- scroll_view->OnScrollEvent(&scroll);
+// Applies |scroll_event| to |scroll_view| and verifies that the event is
+// applied correctly whether or not compositor scrolling is enabled.
+static void ApplyScrollEvent(const ScrollViewTestApi& test_api,
+ ScrollView* scroll_view,
+ ui::ScrollEvent& scroll_event) {
+ EXPECT_FALSE(scroll_event.handled());
+ EXPECT_FALSE(scroll_event.stopped_propagation());
+ scroll_view->OnScrollEvent(&scroll_event);
// Check to see if the scroll event is handled by the scroll view.
if (base::FeatureList::IsEnabled(::features::kUiCompositorScrollWithLayers)) {
// If UiCompositorScrollWithLayers is enabled, the event is set handled
// and its propagation is stopped.
- EXPECT_TRUE(scroll.handled());
- EXPECT_TRUE(scroll.stopped_propagation());
+ EXPECT_TRUE(scroll_event.handled());
+ EXPECT_TRUE(scroll_event.stopped_propagation());
} else {
// If UiCompositorScrollWithLayers is disabled, the event isn't handled.
// This informs Widget::OnScrollEvent() to convert to a MouseWheel event
// and dispatch again. Simulate that.
- EXPECT_FALSE(scroll.handled());
- EXPECT_FALSE(scroll.stopped_propagation());
+ EXPECT_FALSE(scroll_event.handled());
+ EXPECT_FALSE(scroll_event.stopped_propagation());
EXPECT_EQ(gfx::ScrollOffset(), test_api.CurrentOffset());
- ui::MouseWheelEvent wheel(scroll);
+ ui::MouseWheelEvent wheel(scroll_event);
scroll_view->OnMouseEvent(&wheel);
}
+}
+
+} // namespace
+
+// Tests to see the scroll events are handled correctly in composited and
+// non-composited scrolling.
+TEST_F(WidgetScrollViewTest, CompositedScrollEvents) {
+ // Set up with a vertical scroll bar.
+ ScrollView* scroll_view =
+ AddScrollViewWithContentSize(gfx::Size(10, kDefaultHeight * 5));
+ ScrollViewTestApi test_api(scroll_view);
+
+ // Create a fake scroll event and send it to the scroll view.
+ ui::ScrollEvent scroll(ui::ET_SCROLL, gfx::Point(), base::TimeTicks::Now(), 0,
+ 0, -10, 0, -10, 3);
+ ApplyScrollEvent(test_api, scroll_view, scroll);
// Check if the scroll view has been offset.
EXPECT_EQ(gfx::ScrollOffset(0, 10), test_api.CurrentOffset());
}
+// Tests to see that transposed (treat-as-horizontal) scroll events are handled
+// correctly in composited and non-composited scrolling.
+TEST_F(WidgetScrollViewTest, CompositedTransposedScrollEvents) {
+ // Set up with a vertical scroll bar.
+ ScrollView* scroll_view =
+ AddScrollViewWithContentSize(gfx::Size(kDefaultHeight * 5, 10));
+ scroll_view->SetTreatAllScrollEventsAsHorizontal(true);
+ ScrollViewTestApi test_api(scroll_view);
+
+ // Create a fake scroll event and send it to the scroll view.
+ // Note that this is still a VERTICAL scroll event, but we'll be looking for
+ // HORIZONTAL motion later because we're transposed.
+ ui::ScrollEvent scroll(ui::ET_SCROLL, gfx::Point(), base::TimeTicks::Now(), 0,
+ 0, -10, 0, -10, 3);
+ ApplyScrollEvent(test_api, scroll_view, scroll);
+
+ // Check if the scroll view has been offset.
+ EXPECT_EQ(gfx::ScrollOffset(10, 0), test_api.CurrentOffset());
+}
+
+// Tests to see that transposed (treat-as-horizontal) scroll events are handled
+// correctly in composited and non-composited scrolling when the scroll offset
+// is somewhat ambiguous. This is the case where the horizontal component is
+// larger than the vertical.
+TEST_F(WidgetScrollViewTest,
+ CompositedTransposedScrollEventsHorizontalComponentIsLarger) {
+ // Set up with a vertical scroll bar.
+ ScrollView* scroll_view =
+ AddScrollViewWithContentSize(gfx::Size(kDefaultHeight * 5, 10));
+ scroll_view->SetTreatAllScrollEventsAsHorizontal(true);
+ ScrollViewTestApi test_api(scroll_view);
+
+ // Create a fake scroll event and send it to the scroll view.
+ // This will be a horizontal scroll event but there will be a conflicting
+ // vertical element. We should still scroll horizontally, since the horizontal
+ // component is greater.
+ ui::ScrollEvent scroll(ui::ET_SCROLL, gfx::Point(), base::TimeTicks::Now(), 0,
+ -10, 7, -10, 7, 3);
+ ApplyScrollEvent(test_api, scroll_view, scroll);
+
+ // Check if the scroll view has been offset.
+ EXPECT_EQ(gfx::ScrollOffset(10, 0), test_api.CurrentOffset());
+}
+
+// Tests to see that transposed (treat-as-horizontal) scroll events are handled
+// correctly in composited and non-composited scrolling when the scroll offset
+// is somewhat ambiguous. This is the case where the vertical component is
+// larger than the horizontal.
+TEST_F(WidgetScrollViewTest,
+ CompositedTransposedScrollEventsVerticalComponentIsLarger) {
+ // Set up with a vertical scroll bar.
+ ScrollView* scroll_view =
+ AddScrollViewWithContentSize(gfx::Size(kDefaultHeight * 5, 10));
+ scroll_view->SetTreatAllScrollEventsAsHorizontal(true);
+ ScrollViewTestApi test_api(scroll_view);
+
+ // Create a fake scroll event and send it to the scroll view.
+ // This will be a vertical scroll event but there will be a conflicting
+ // horizontal element. We should still scroll horizontally, since the vertical
+ // component is greater.
+ ui::ScrollEvent scroll(ui::ET_SCROLL, gfx::Point(), base::TimeTicks::Now(), 0,
+ 7, -10, 7, -10, 3);
+ ApplyScrollEvent(test_api, scroll_view, scroll);
+
+ // Check if the scroll view has been offset.
+ EXPECT_EQ(gfx::ScrollOffset(10, 0), test_api.CurrentOffset());
+}
+
INSTANTIATE_TEST_SUITE_P(All,
WidgetScrollViewTestRTLAndLayers,
::testing::Values(UiConfig::kLtr,
diff --git a/chromium/ui/views/controls/scrollbar/base_scroll_bar_button.cc b/chromium/ui/views/controls/scrollbar/base_scroll_bar_button.cc
index eccbe91f9d5..b8099acc9b6 100644
--- a/chromium/ui/views/controls/scrollbar/base_scroll_bar_button.cc
+++ b/chromium/ui/views/controls/scrollbar/base_scroll_bar_button.cc
@@ -4,19 +4,25 @@
#include "ui/views/controls/scrollbar/base_scroll_bar_button.h"
+#include <utility>
+
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "ui/display/screen.h"
#include "ui/events/event_utils.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
-BaseScrollBarButton::BaseScrollBarButton(ButtonListener* listener,
+BaseScrollBarButton::BaseScrollBarButton(PressedCallback callback,
const base::TickClock* tick_clock)
- : Button(listener),
+ : Button(std::move(callback)),
repeater_(base::BindRepeating(&BaseScrollBarButton::RepeaterNotifyClick,
base::Unretained(this)),
- tick_clock) {}
+ tick_clock) {
+ // Not focusable by default.
+ SetFocusBehavior(FocusBehavior::NEVER);
+}
BaseScrollBarButton::~BaseScrollBarButton() = default;
diff --git a/chromium/ui/views/controls/scrollbar/base_scroll_bar_button.h b/chromium/ui/views/controls/scrollbar/base_scroll_bar_button.h
index b055ffd8130..09635d6ce35 100644
--- a/chromium/ui/views/controls/scrollbar/base_scroll_bar_button.h
+++ b/chromium/ui/views/controls/scrollbar/base_scroll_bar_button.h
@@ -30,7 +30,7 @@ class VIEWS_EXPORT BaseScrollBarButton : public Button {
public:
METADATA_HEADER(BaseScrollBarButton);
- explicit BaseScrollBarButton(ButtonListener* listener,
+ explicit BaseScrollBarButton(PressedCallback callback,
const base::TickClock* tick_clock = nullptr);
~BaseScrollBarButton() override;
diff --git a/chromium/ui/views/controls/scrollbar/base_scroll_bar_button_unittest.cc b/chromium/ui/views/controls/scrollbar/base_scroll_bar_button_unittest.cc
index 9c5f679c17a..86721694c08 100644
--- a/chromium/ui/views/controls/scrollbar/base_scroll_bar_button_unittest.cc
+++ b/chromium/ui/views/controls/scrollbar/base_scroll_bar_button_unittest.cc
@@ -24,31 +24,28 @@ using testing::_;
using testing::AtLeast;
using testing::AtMost;
-class MockButtonListener : public ButtonListener {
+class MockButtonCallback {
public:
- MockButtonListener() = default;
- MockButtonListener(const MockButtonListener&) = delete;
- MockButtonListener& operator=(const MockButtonListener&) = delete;
- ~MockButtonListener() override = default;
-
- // ButtonListener:
- MOCK_METHOD(void,
- ButtonPressed,
- (Button * sender, const ui::Event& event),
- (override));
+ MockButtonCallback() = default;
+ MockButtonCallback(const MockButtonCallback&) = delete;
+ MockButtonCallback& operator=(const MockButtonCallback&) = delete;
+ ~MockButtonCallback() = default;
+
+ MOCK_METHOD(void, ButtonPressed, ());
};
class BaseScrollBarButtonTest : public testing::Test {
public:
BaseScrollBarButtonTest()
: button_(std::make_unique<BaseScrollBarButton>(
- &listener_,
+ base::BindRepeating(&MockButtonCallback::ButtonPressed,
+ base::Unretained(&callback_)),
task_environment_.GetMockTickClock())) {}
~BaseScrollBarButtonTest() override = default;
protected:
- testing::StrictMock<MockButtonListener>& listener() { return listener_; }
+ testing::StrictMock<MockButtonCallback>& callback() { return callback_; }
Button* button() { return button_.get(); }
void AdvanceTime(base::TimeDelta time_delta) {
@@ -61,7 +58,7 @@ class BaseScrollBarButtonTest : public testing::Test {
display::test::TestScreen test_screen_;
display::test::ScopedScreenOverride screen_override{&test_screen_};
- testing::StrictMock<MockButtonListener> listener_;
+ testing::StrictMock<MockButtonCallback> callback_;
const std::unique_ptr<Button> button_;
};
@@ -71,19 +68,23 @@ TEST_F(BaseScrollBarButtonTest, Metadata) {
test::TestViewMetadata(button());
}
+TEST_F(BaseScrollBarButtonTest, FocusBehavior) {
+ EXPECT_EQ(View::FocusBehavior::NEVER, button()->GetFocusBehavior());
+}
+
TEST_F(BaseScrollBarButtonTest, CallbackFiresOnMouseDown) {
- EXPECT_CALL(listener(), ButtonPressed(_, _));
+ EXPECT_CALL(callback(), ButtonPressed());
- // By default the button should notify its listener on mouse release.
+ // By default the button should notify its callback on mouse release.
button()->OnMousePressed(ui::MouseEvent(
ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
}
-TEST_F(BaseScrollBarButtonTest, CallbackFilesMultipleTimesMouseHeldDown) {
- EXPECT_CALL(listener(), ButtonPressed(_, _)).Times(AtLeast(2));
+TEST_F(BaseScrollBarButtonTest, CallbackFiresMultipleTimesMouseHeldDown) {
+ EXPECT_CALL(callback(), ButtonPressed()).Times(AtLeast(2));
- // By default the button should notify its listener on mouse release.
+ // By default the button should notify its callback on mouse release.
button()->OnMousePressed(ui::MouseEvent(
ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
@@ -92,16 +93,16 @@ TEST_F(BaseScrollBarButtonTest, CallbackFilesMultipleTimesMouseHeldDown) {
}
TEST_F(BaseScrollBarButtonTest, CallbackStopsFiringAfterMouseReleased) {
- EXPECT_CALL(listener(), ButtonPressed(_, _)).Times(AtLeast(2));
+ EXPECT_CALL(callback(), ButtonPressed()).Times(AtLeast(2));
- // By default the button should notify its listener on mouse release.
+ // By default the button should notify its callback on mouse release.
button()->OnMousePressed(ui::MouseEvent(
ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
AdvanceTime(RepeatController::GetInitialWaitForTesting() * 10);
- testing::Mock::VerifyAndClearExpectations(&listener());
+ testing::Mock::VerifyAndClearExpectations(&callback());
button()->OnMouseReleased(ui::MouseEvent(
ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(),
@@ -109,26 +110,26 @@ TEST_F(BaseScrollBarButtonTest, CallbackStopsFiringAfterMouseReleased) {
AdvanceTime(RepeatController::GetInitialWaitForTesting() * 10);
- EXPECT_CALL(listener(), ButtonPressed(_, _)).Times(AtMost(0));
+ EXPECT_CALL(callback(), ButtonPressed()).Times(AtMost(0));
}
TEST_F(BaseScrollBarButtonTest, CallbackStopsFiringAfterMouseCaptureReleased) {
- EXPECT_CALL(listener(), ButtonPressed(_, _)).Times(AtLeast(2));
+ EXPECT_CALL(callback(), ButtonPressed()).Times(AtLeast(2));
- // By default the button should notify its listener on mouse release.
+ // By default the button should notify its callback on mouse release.
button()->OnMousePressed(ui::MouseEvent(
ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON));
AdvanceTime(RepeatController::GetInitialWaitForTesting() * 10);
- testing::Mock::VerifyAndClearExpectations(&listener());
+ testing::Mock::VerifyAndClearExpectations(&callback());
button()->OnMouseCaptureLost();
AdvanceTime(RepeatController::GetInitialWaitForTesting() * 10);
- EXPECT_CALL(listener(), ButtonPressed(_, _)).Times(AtMost(0));
+ EXPECT_CALL(callback(), ButtonPressed()).Times(AtMost(0));
}
} // namespace views
diff --git a/chromium/ui/views/controls/scrollbar/base_scroll_bar_thumb.cc b/chromium/ui/views/controls/scrollbar/base_scroll_bar_thumb.cc
index 17581d95920..0c222e30d9b 100644
--- a/chromium/ui/views/controls/scrollbar/base_scroll_bar_thumb.cc
+++ b/chromium/ui/views/controls/scrollbar/base_scroll_bar_thumb.cc
@@ -7,6 +7,7 @@
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/views/controls/scrollbar/scroll_bar.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace {
// The distance the mouse can be dragged outside the bounds of the thumb during
diff --git a/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm b/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
index df22c8b503e..e2fd6a5eab7 100644
--- a/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
+++ b/chromium/ui/views/controls/scrollbar/cocoa_scroll_bar.mm
@@ -14,6 +14,7 @@
#include "ui/compositor/scoped_layer_animation_settings.h"
#include "ui/gfx/canvas.h"
#include "ui/views/controls/scrollbar/base_scroll_bar_thumb.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
diff --git a/chromium/ui/views/controls/scrollbar/overlay_scroll_bar.cc b/chromium/ui/views/controls/scrollbar/overlay_scroll_bar.cc
index e58df085d96..276a558b746 100644
--- a/chromium/ui/views/controls/scrollbar/overlay_scroll_bar.cc
+++ b/chromium/ui/views/controls/scrollbar/overlay_scroll_bar.cc
@@ -16,6 +16,7 @@
#include "ui/views/background.h"
#include "ui/views/border.h"
#include "ui/views/layout/fill_layout.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
namespace {
@@ -42,7 +43,7 @@ OverlayScrollBar::Thumb::Thumb(OverlayScrollBar* scroll_bar)
OverlayScrollBar::Thumb::~Thumb() = default;
void OverlayScrollBar::Thumb::Init() {
- EnableCanvasFlippingForRTLUI(true);
+ SetFlipCanvasOnPaintForRTLUI(true);
SetPaintToLayer();
layer()->SetFillsBoundsOpaquely(false);
// Animate all changes to the layer except the first one.
diff --git a/chromium/ui/views/controls/scrollbar/scroll_bar.cc b/chromium/ui/views/controls/scrollbar/scroll_bar.cc
index 5255712dca4..45565d0c548 100644
--- a/chromium/ui/views/controls/scrollbar/scroll_bar.cc
+++ b/chromium/ui/views/controls/scrollbar/scroll_bar.cc
@@ -8,8 +8,8 @@
#include <memory>
#include "base/bind.h"
-#include "base/bind_helpers.h"
#include "base/callback.h"
+#include "base/callback_helpers.h"
#include "base/compiler_specific.h"
#include "base/containers/flat_map.h"
#include "base/no_destructor.h"
@@ -29,6 +29,7 @@
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/controls/scroll_view.h"
#include "ui/views/controls/scrollbar/base_scroll_bar_thumb.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/widget/widget.h"
namespace views {
diff --git a/chromium/ui/views/controls/scrollbar/scroll_bar_views.cc b/chromium/ui/views/controls/scrollbar/scroll_bar_views.cc
index 3e0a667c252..45683aa9de2 100644
--- a/chromium/ui/views/controls/scrollbar/scroll_bar_views.cc
+++ b/chromium/ui/views/controls/scrollbar/scroll_bar_views.cc
@@ -18,6 +18,7 @@
#include "ui/views/controls/scrollbar/base_scroll_bar_thumb.h"
#include "ui/views/controls/scrollbar/scroll_bar.h"
#include "ui/views/layout/flex_layout.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view_class_properties.h"
namespace views {
@@ -34,7 +35,7 @@ class ScrollBarButton : public BaseScrollBarButton {
kRight,
};
- ScrollBarButton(ButtonListener* listener, Type type);
+ ScrollBarButton(PressedCallback callback, Type type);
~ScrollBarButton() override;
gfx::Size CalculatePreferredSize() const override;
@@ -69,13 +70,10 @@ class ScrollBarThumb : public BaseScrollBarThumb {
ScrollBar* scroll_bar_;
};
-/////////////////////////////////////////////////////////////////////////////
-// ScrollBarButton
-
-ScrollBarButton::ScrollBarButton(ButtonListener* listener, Type type)
- : BaseScrollBarButton(listener), type_(type) {
- EnableCanvasFlippingForRTLUI(true);
- SetFocusBehavior(FocusBehavior::NEVER);
+ScrollBarButton::ScrollBarButton(PressedCallback callback, Type type)
+ : BaseScrollBarButton(std::move(callback)), type_(type) {
+ SetFlipCanvasOnPaintForRTLUI(true);
+ DCHECK_EQ(FocusBehavior::NEVER, GetFocusBehavior());
}
ScrollBarButton::~ScrollBarButton() = default;
@@ -141,9 +139,6 @@ ui::NativeTheme::State ScrollBarButton::GetNativeThemeState() const {
return ui::NativeTheme::kNormal;
}
-/////////////////////////////////////////////////////////////////////////////
-// ScrollBarThumb
-
ScrollBarThumb::ScrollBarThumb(ScrollBar* scroll_bar)
: BaseScrollBarThumb(scroll_bar), scroll_bar_(scroll_bar) {}
@@ -200,34 +195,24 @@ ui::NativeTheme::State ScrollBarThumb::GetNativeThemeState() const {
} // namespace
-////////////////////////////////////////////////////////////////////////////////
-// ScrollBarViews, public:
-
ScrollBarViews::ScrollBarViews(bool horizontal) : ScrollBar(horizontal) {
- EnableCanvasFlippingForRTLUI(true);
+ SetFlipCanvasOnPaintForRTLUI(true);
state_ = ui::NativeTheme::kNormal;
auto* layout = SetLayoutManager(std::make_unique<views::FlexLayout>());
-
- std::unique_ptr<ScrollBarButton> prev_button, next_button;
- using Type = ScrollBarButton::Type;
- if (horizontal) {
- prev_button = std::make_unique<ScrollBarButton>(this, Type::kLeft);
- next_button = std::make_unique<ScrollBarButton>(this, Type::kRight);
-
- part_ = ui::NativeTheme::kScrollbarHorizontalTrack;
- } else {
+ if (!horizontal)
layout->SetOrientation(views::LayoutOrientation::kVertical);
- prev_button = std::make_unique<ScrollBarButton>(this, Type::kUp);
- next_button = std::make_unique<ScrollBarButton>(this, Type::kDown);
-
- part_ = ui::NativeTheme::kScrollbarVerticalTrack;
- }
- prev_button->set_context_menu_controller(this);
- next_button->set_context_menu_controller(this);
+ const auto scroll_func = [](ScrollBarViews* scrollbar, ScrollAmount amount) {
+ scrollbar->ScrollByAmount(amount);
+ };
+ using Type = ScrollBarButton::Type;
+ prev_button_ = AddChildView(std::make_unique<ScrollBarButton>(
+ base::BindRepeating(scroll_func, base::Unretained(this),
+ ScrollAmount::kPrevLine),
+ horizontal ? Type::kLeft : Type::kUp));
+ prev_button_->set_context_menu_controller(this);
- prev_button_ = AddChildView(std::move(prev_button));
SetThumb(new ScrollBarThumb(this));
// Allow the thumb to take up the whole size of the scrollbar, save for the
// prev/next buttons. Layout need only set the thumb cross-axis coordinate;
@@ -236,7 +221,14 @@ ScrollBarViews::ScrollBarViews(bool horizontal) : ScrollBar(horizontal) {
views::kFlexBehaviorKey,
views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
views::MaximumFlexSizeRule::kUnbounded));
- next_button_ = AddChildView(std::move(next_button));
+
+ next_button_ = AddChildView(std::make_unique<ScrollBarButton>(
+ base::BindRepeating(scroll_func, base::Unretained(this),
+ ScrollBar::ScrollAmount::kNextLine),
+ horizontal ? Type::kRight : Type::kDown));
+ next_button_->set_context_menu_controller(this);
+ part_ = horizontal ? ui::NativeTheme::kScrollbarHorizontalTrack
+ : ui::NativeTheme::kScrollbarVerticalTrack;
}
ScrollBarViews::~ScrollBarViews() = default;
@@ -258,9 +250,6 @@ int ScrollBarViews::GetVerticalScrollBarWidth(const ui::NativeTheme* theme) {
return std::max(track_size.width(), button_size.width());
}
-////////////////////////////////////////////////////////////////////////////////
-// ScrollBarViews, View overrides:
-
void ScrollBarViews::OnPaint(gfx::Canvas* canvas) {
gfx::Rect bounds = GetTrackBounds();
if (bounds.IsEmpty())
@@ -300,19 +289,6 @@ int ScrollBarViews::GetThickness() const {
return IsHorizontal() ? size.height() : size.width();
}
-//////////////////////////////////////////////////////////////////////////////
-// BaseButton::ButtonListener overrides:
-
-void ScrollBarViews::ButtonPressed(Button* sender, const ui::Event& event) {
- const bool is_prev = sender == prev_button_;
- DCHECK(is_prev || sender == next_button_);
- ScrollByAmount(is_prev ? ScrollBar::ScrollAmount::kPrevLine
- : ScrollBar::ScrollAmount::kNextLine);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// ScrollBarViews, private:
-
gfx::Rect ScrollBarViews::GetTrackBounds() const {
gfx::Rect bounds = GetLocalBounds();
gfx::Size size = prev_button_->GetPreferredSize();
diff --git a/chromium/ui/views/controls/scrollbar/scroll_bar_views.h b/chromium/ui/views/controls/scrollbar/scroll_bar_views.h
index e30f08f8b4d..a08f89b2f2b 100644
--- a/chromium/ui/views/controls/scrollbar/scroll_bar_views.h
+++ b/chromium/ui/views/controls/scrollbar/scroll_bar_views.h
@@ -8,7 +8,6 @@
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "ui/gfx/geometry/point.h"
-#include "ui/native_theme/native_theme.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/scrollbar/scroll_bar.h"
#include "ui/views/view.h"
@@ -20,7 +19,7 @@ class Canvas;
namespace views {
// Views implementation for the scrollbar.
-class VIEWS_EXPORT ScrollBarViews : public ScrollBar, public ButtonListener {
+class VIEWS_EXPORT ScrollBarViews : public ScrollBar {
public:
METADATA_HEADER(ScrollBarViews);
@@ -37,9 +36,6 @@ class VIEWS_EXPORT ScrollBarViews : public ScrollBar, public ButtonListener {
// ScrollBar overrides:
int GetThickness() const override;
- // BaseButton::ButtonListener overrides:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
// Returns the area for the track. This is the area of the scrollbar minus
// the size of the arrow buttons.
gfx::Rect GetTrackBounds() const override;
diff --git a/chromium/ui/views/controls/separator.cc b/chromium/ui/views/controls/separator.cc
index 60f6d91942d..dc2e4e43918 100644
--- a/chromium/ui/views/controls/separator.cc
+++ b/chromium/ui/views/controls/separator.cc
@@ -11,6 +11,7 @@
#include "ui/gfx/canvas.h"
#include "ui/gfx/scoped_canvas.h"
#include "ui/native_theme/native_theme.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
diff --git a/chromium/ui/views/controls/separator.h b/chromium/ui/views/controls/separator.h
index eeb92d16815..6e1a20c32f0 100644
--- a/chromium/ui/views/controls/separator.h
+++ b/chromium/ui/views/controls/separator.h
@@ -46,8 +46,10 @@ class VIEWS_EXPORT Separator : public View {
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Separator, View)
VIEW_BUILDER_PROPERTY(SkColor, Color)
VIEW_BUILDER_PROPERTY(int, PreferredHeight)
-END_VIEW_BUILDER(VIEWS_EXPORT, Separator)
+END_VIEW_BUILDER
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, Separator)
+
#endif // UI_VIEWS_CONTROLS_SEPARATOR_H_
diff --git a/chromium/ui/views/controls/slider.cc b/chromium/ui/views/controls/slider.cc
index 89d4052153f..4cd9bd43263 100644
--- a/chromium/ui/views/controls/slider.cc
+++ b/chromium/ui/views/controls/slider.cc
@@ -27,6 +27,7 @@
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/native_theme/native_theme.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/widget/widget.h"
namespace views {
@@ -70,12 +71,9 @@ float GetNearestAllowedValue(const base::flat_set<float>& allowed_values,
} // namespace
-Slider::Slider(SliderListener* listener)
- : listener_(listener),
- highlight_animation_(this),
- pending_accessibility_value_change_(false) {
+Slider::Slider(SliderListener* listener) : listener_(listener) {
highlight_animation_.SetSlideDuration(base::TimeDelta::FromMilliseconds(150));
- EnableCanvasFlippingForRTLUI(true);
+ SetFlipCanvasOnPaintForRTLUI(true);
#if defined(OS_APPLE)
SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
#else
diff --git a/chromium/ui/views/controls/slider.h b/chromium/ui/views/controls/slider.h
index ca84c17502a..2b4c1ce5e79 100644
--- a/chromium/ui/views/controls/slider.h
+++ b/chromium/ui/views/controls/slider.h
@@ -161,9 +161,9 @@ class VIEWS_EXPORT Slider : public View, public gfx::AnimationDelegate {
// Animating value of the current radius of the thumb's highlight.
float thumb_highlight_radius_ = 0.f;
- gfx::SlideAnimation highlight_animation_;
+ gfx::SlideAnimation highlight_animation_{this};
- bool pending_accessibility_value_change_;
+ bool pending_accessibility_value_change_ = false;
};
} // namespace views
diff --git a/chromium/ui/views/controls/styled_label.cc b/chromium/ui/views/controls/styled_label.cc
index 8429239f6ac..520990f1cbb 100644
--- a/chromium/ui/views/controls/styled_label.cc
+++ b/chromium/ui/views/controls/styled_label.cc
@@ -20,6 +20,7 @@
#include "ui/gfx/text_utils.h"
#include "ui/native_theme/native_theme.h"
#include "ui/views/controls/label.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view_class_properties.h"
namespace views {
@@ -526,7 +527,7 @@ std::unique_ptr<Label> StyledLabel::CreateLabel(
// Note this ignores |default_text_style_|, in favor of style::STYLE_LINK.
auto link = std::make_unique<Link>(text, text_context_);
- link->set_callback(style_info.callback);
+ link->SetCallback(style_info.callback);
result = std::move(link);
} else if (style_info.custom_font) {
diff --git a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
index 887bd2b0bb7..4e43dde3360 100644
--- a/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/chromium/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -32,6 +32,7 @@
#include "ui/views/layout/fill_layout.h"
#include "ui/views/layout/flex_layout.h"
#include "ui/views/layout/layout_manager.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view_class_properties.h"
#include "ui/views/widget/widget.h"
diff --git a/chromium/ui/views/controls/table/table_view.cc b/chromium/ui/views/controls/table/table_view.cc
index ec0671feac2..1b254a0b416 100644
--- a/chromium/ui/views/controls/table/table_view.cc
+++ b/chromium/ui/views/controls/table/table_view.cc
@@ -41,6 +41,7 @@
#include "ui/views/controls/table/table_utils.h"
#include "ui/views/controls/table/table_view_observer.h"
#include "ui/views/layout/layout_provider.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/style/typography.h"
@@ -212,8 +213,6 @@ void TableView::Init(ui::TableModel* model,
}
SetModel(model);
- if (model_)
- UpdateVirtualAccessibilityChildren();
}
// TODO(sky): this doesn't support arbitrarily changing the model, rename this
@@ -226,8 +225,14 @@ void TableView::SetModel(ui::TableModel* model) {
model_->SetObserver(nullptr);
model_ = model;
selection_model_.Clear();
- if (model_)
+ if (model_) {
model_->SetObserver(this);
+
+ // Clears and creates a new virtual accessibility tree.
+ RebuildVirtualAccessibilityChildren();
+ } else {
+ ClearVirtualAccessibilityChildren();
+ }
}
void TableView::SetGrouper(TableGrouper* grouper) {
@@ -268,13 +273,17 @@ void TableView::SetColumnVisibility(int id, bool is_visible) {
SetActiveVisibleColumnIndex(int{visible_columns_.size()} - 1);
}
}
- ClearVirtualAccessibilityChildren();
+
UpdateVisibleColumnSizes();
PreferredSizeChanged();
SchedulePaint();
+
if (header_)
header_->SchedulePaint();
- UpdateVirtualAccessibilityChildren();
+
+ // This will clear and create the entire accessibility tree, to optimize this
+ // further, removing/adding the cell's dynamically could be done instead.
+ RebuildVirtualAccessibilityChildren();
}
void TableView::ToggleSortOrder(int visible_column_index) {
@@ -350,19 +359,22 @@ void TableView::SetVisibleColumnWidth(int index, int width) {
}
int TableView::ModelToView(int model_index) const {
+ DCHECK_GE(model_index, 0) << " negative model_index " << model_index;
if (!GetIsSorted())
return model_index;
- DCHECK_GE(model_index, 0) << " negative model_index " << model_index;
- DCHECK_LT(model_index, GetRowCount())
+ DCHECK_LT(model_index, int{model_to_view_.size()})
<< " out of bounds model_index " << model_index;
return model_to_view_[model_index];
}
int TableView::ViewToModel(int view_index) const {
DCHECK_GE(view_index, 0) << " negative view_index " << view_index;
- DCHECK_LT(view_index, GetRowCount())
+ DCHECK_LT(view_index, GetRowCount());
+ if (!GetIsSorted())
+ return view_index;
+ DCHECK_LT(view_index, int{view_to_model_.size()})
<< " out of bounds view_index " << view_index;
- return GetIsSorted() ? view_to_model_[view_index] : view_index;
+ return view_to_model_[view_index];
}
bool TableView::GetSelectOnRemove() const {
@@ -393,6 +405,13 @@ void TableView::SetSortOnPaint(bool sort_on_paint) {
OnPropertyChanged(&sort_on_paint_, kPropertyEffectsNone);
}
+ax::mojom::SortDirection TableView::GetFirstSortDescriptorDirection() const {
+ DCHECK(!sort_descriptors().empty());
+ if (sort_descriptors()[0].ascending)
+ return ax::mojom::SortDirection::kAscending;
+ return ax::mojom::SortDirection::kDescending;
+}
+
void TableView::Layout() {
// When the scrollview's width changes we force recalculating column sizes.
ScrollView* scroll_view = ScrollView::GetScrollViewForContents(this);
@@ -682,7 +701,8 @@ bool TableView::HandleAccessibleAction(const ui::AXActionData& action_data) {
void TableView::OnModelChanged() {
selection_model_.Clear();
- NumRowsChanged();
+ RebuildVirtualAccessibilityChildren();
+ PreferredSizeChanged();
}
void TableView::OnItemsChanged(int start, int length) {
@@ -690,9 +710,21 @@ void TableView::OnItemsChanged(int start, int length) {
}
void TableView::OnItemsAdded(int start, int length) {
+ DCHECK_GE(start, 0);
+ DCHECK_GE(length, 0);
+ DCHECK_LE(start + length, GetRowCount());
+
for (int i = 0; i < length; ++i)
selection_model_.IncrementFrom(start);
- NumRowsChanged();
+
+ // Create the accessibility view for the new row and insert it in the
+ // virtual accessibility tree.
+ for (int i = start; i < start + length; i++)
+ GetViewAccessibility().AddVirtualChildView(CreateRowAccessibilityView(i));
+
+ SortItemsAndUpdateMapping(/*schedule_paint=*/true);
+ PreferredSizeChanged();
+ NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged, true);
}
void TableView::OnItemsMoved(int old_start, int length, int new_start) {
@@ -702,6 +734,8 @@ void TableView::OnItemsMoved(int old_start, int length, int new_start) {
void TableView::OnItemsRemoved(int start, int length) {
DCHECK_GE(start, 0);
+ DCHECK_GE(length, 0);
+
// Determine the currently selected index in terms of the view. We inline the
// implementation here since ViewToModel() has DCHECKs that fail since the
// model has changed but |model_to_view_| has not been updated yet.
@@ -712,7 +746,16 @@ void TableView::OnItemsRemoved(int start, int length) {
model_to_view_[previously_selected_model_index];
for (int i = 0; i < length; ++i)
selection_model_.DecrementFrom(start);
- NumRowsChanged();
+
+ // Remove the virtual views that are no longer needed.
+ auto& virtual_children = GetViewAccessibility().virtual_children();
+ for (int i = start; i < start + length; i++)
+ virtual_children[virtual_children.size() - 1]->RemoveFromParentView();
+
+ SortItemsAndUpdateMapping(/*schedule_paint=*/true);
+ PreferredSizeChanged();
+ NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged, true);
+
// If the selection was empty and is no longer empty select the same visual
// index.
if (selection_model_.empty() && previously_selected_view_index != -1 &&
@@ -877,24 +920,24 @@ int TableView::GetCellElementSpacing() const {
DISTANCE_RELATED_LABEL_HORIZONTAL);
}
-void TableView::NumRowsChanged() {
- SortItemsAndUpdateMapping(/*schedule_paint=*/true);
- PreferredSizeChanged();
-}
void TableView::SortItemsAndUpdateMapping(bool schedule_paint) {
+ const int row_count = GetRowCount();
+
if (!GetIsSorted()) {
view_to_model_.clear();
model_to_view_.clear();
} else {
- const int row_count = GetRowCount();
view_to_model_.resize(row_count);
model_to_view_.resize(row_count);
- for (int i = 0; i < row_count; ++i)
- view_to_model_[i] = i;
+
+ // Resets the mapping so it can be sorted again.
+ for (int view_index = 0; view_index < row_count; ++view_index)
+ view_to_model_[view_index] = view_index;
+
if (grouper_) {
GroupSortHelper sort_helper(this);
- GetModelIndexToRangeStart(grouper_, GetRowCount(),
+ GetModelIndexToRangeStart(grouper_, row_count,
&sort_helper.model_index_to_range_start);
std::stable_sort(view_to_model_.begin(), view_to_model_.end(),
sort_helper);
@@ -902,12 +945,15 @@ void TableView::SortItemsAndUpdateMapping(bool schedule_paint) {
std::stable_sort(view_to_model_.begin(), view_to_model_.end(),
SortHelper(this));
}
- for (int i = 0; i < row_count; ++i)
- model_to_view_[view_to_model_[i]] = i;
+
+ for (int view_index = 0; view_index < row_count; ++view_index)
+ model_to_view_[view_to_model_[view_index]] = view_index;
+
model_->ClearCollator();
}
- UpdateVirtualAccessibilityChildren();
+ UpdateVirtualAccessibilityChildrenBounds();
+
if (schedule_paint)
SchedulePaint();
}
@@ -937,9 +983,8 @@ gfx::Rect TableView::GetCellBounds(int row, int visible_column_index) const {
}
gfx::Rect TableView::GetActiveCellBounds() const {
- if (selection_model_.active() == ui::ListSelectionModel::kUnselectedIndex) {
+ if (selection_model_.active() == ui::ListSelectionModel::kUnselectedIndex)
return gfx::Rect();
- }
return GetCellBounds(ModelToView(selection_model_.active()),
active_visible_column_index_);
}
@@ -966,7 +1011,11 @@ void TableView::CreateHeaderIfNecessary(ScrollView* scroll_view) {
return;
header_ = scroll_view->SetHeader(std::make_unique<TableHeader>(this));
- UpdateVirtualAccessibilityChildren();
+
+ // The header accessibility view should be the first row, to match the
+ // original view accessibility construction.
+ GetViewAccessibility().AddVirtualChildViewAt(CreateHeaderAccessibilityView(),
+ 0);
}
void TableView::UpdateVisibleColumnSizes() {
@@ -1218,170 +1267,242 @@ GroupRange TableView::GetGroupRange(int model_index) const {
return range;
}
-void TableView::UpdateVirtualAccessibilityChildren() {
+void TableView::RebuildVirtualAccessibilityChildren() {
ClearVirtualAccessibilityChildren();
+
if (!GetRowCount() || visible_columns_.empty())
return;
+ if (header_)
+ GetViewAccessibility().AddVirtualChildView(CreateHeaderAccessibilityView());
+
+ // Create a virtual accessibility view for each row. At this point on, the
+ // table has no sort behavior, hence the view index is the same as the model
+ // index, the sorting will happen at the end.
+ for (int index = 0; index < GetRowCount(); ++index)
+ GetViewAccessibility().AddVirtualChildView(
+ CreateRowAccessibilityView(index));
+
+ SortItemsAndUpdateMapping(/*schedule_paint=*/true);
+ NotifyAccessibilityEvent(ax::mojom::Event::kChildrenChanged, true);
+}
+
+void TableView::ClearVirtualAccessibilityChildren() {
+ GetViewAccessibility().RemoveAllVirtualChildViews();
+}
+
+std::unique_ptr<AXVirtualView> TableView::CreateRowAccessibilityView(
+ int row_index) {
+ auto ax_row = std::make_unique<AXVirtualView>();
+
+ ui::AXNodeData& row_data = ax_row->GetCustomData();
+ row_data.role = ax::mojom::Role::kRow;
+
+ row_data.AddIntAttribute(ax::mojom::IntAttribute::kTableRowIndex,
+ static_cast<int32_t>(row_index));
+
+ if (!PlatformStyle::kTableViewSupportsKeyboardNavigationByCell) {
+ row_data.AddState(ax::mojom::State::kFocusable);
+ row_data.AddAction(ax::mojom::Action::kFocus);
+ row_data.AddAction(ax::mojom::Action::kScrollToMakeVisible);
+ row_data.AddAction(ax::mojom::Action::kSetSelection);
+ }
+
+ row_data.SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kSelect);
+ if (!single_selection_)
+ row_data.AddState(ax::mojom::State::kMultiselectable);
+
+ // Add a dynamic accessibility data callback for each row.
+ ax_row->SetPopulateDataCallback(
+ base::BindRepeating(&TableView::PopulateAccessibilityRowData,
+ base::Unretained(this), ax_row.get()));
+
+ for (size_t visible_column_index = 0;
+ visible_column_index < visible_columns_.size(); ++visible_column_index) {
+ std::unique_ptr<AXVirtualView> ax_cell =
+ CreateCellAccessibilityView(row_index, visible_column_index);
+ ax_row->AddChildView(std::move(ax_cell));
+ }
+
+ return ax_row;
+}
+
+std::unique_ptr<AXVirtualView> TableView::CreateCellAccessibilityView(
+ int row_index,
+ size_t column_index) {
+ const VisibleColumn& visible_column = visible_columns_[column_index];
+ const ui::TableColumn column = visible_column.column;
+ auto ax_cell = std::make_unique<AXVirtualView>();
+ ui::AXNodeData& cell_data = ax_cell->GetCustomData();
+ cell_data.role = ax::mojom::Role::kCell;
+
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellRowIndex,
+ static_cast<int32_t>(row_index));
+
+ if (PlatformStyle::kTableViewSupportsKeyboardNavigationByCell) {
+ cell_data.AddState(ax::mojom::State::kFocusable);
+ cell_data.AddAction(ax::mojom::Action::kFocus);
+ cell_data.AddAction(ax::mojom::Action::kScrollLeft);
+ cell_data.AddAction(ax::mojom::Action::kScrollRight);
+ cell_data.AddAction(ax::mojom::Action::kScrollToMakeVisible);
+ cell_data.AddAction(ax::mojom::Action::kSetSelection);
+ }
+
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellRowSpan, 1);
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellColumnIndex,
+ static_cast<int32_t>(column_index));
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellColumnSpan, 1);
+
+ if (base::i18n::IsRTL())
+ cell_data.SetTextDirection(ax::mojom::WritingDirection::kRtl);
+
+ auto sort_direction = ax::mojom::SortDirection::kUnsorted;
const base::Optional<int> primary_sorted_column_id =
sort_descriptors().empty()
? base::nullopt
: base::make_optional(sort_descriptors()[0].column_id);
- if (header_) {
- auto ax_header = std::make_unique<AXVirtualView>();
- ui::AXNodeData& header_data = ax_header->GetCustomData();
- header_data.role = ax::mojom::Role::kRow;
- for (size_t visible_column_index = 0;
- visible_column_index < visible_columns_.size();
- ++visible_column_index) {
- const VisibleColumn& visible_column =
- visible_columns_[visible_column_index];
- const ui::TableColumn column = visible_column.column;
- auto ax_cell = std::make_unique<AXVirtualView>();
- ui::AXNodeData& cell_data = ax_cell->GetCustomData();
- cell_data.role = ax::mojom::Role::kColumnHeader;
- cell_data.SetName(column.title);
- cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellColumnIndex,
- static_cast<int32_t>(visible_column_index));
- cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellColumnSpan,
- 1);
- if (base::i18n::IsRTL())
- cell_data.SetTextDirection(ax::mojom::WritingDirection::kRtl);
-
- auto sort_direction = ax::mojom::SortDirection::kUnsorted;
- if (column.sortable && primary_sorted_column_id.has_value() &&
- column.id == primary_sorted_column_id.value()) {
- DCHECK(!sort_descriptors().empty());
- if (sort_descriptors()[0].ascending)
- sort_direction = ax::mojom::SortDirection::kAscending;
- else
- sort_direction = ax::mojom::SortDirection::kDescending;
- }
- cell_data.AddIntAttribute(ax::mojom::IntAttribute::kSortDirection,
- static_cast<int32_t>(sort_direction));
+ if (column.sortable && primary_sorted_column_id.has_value() &&
+ column.id == primary_sorted_column_id.value()) {
+ sort_direction = GetFirstSortDescriptorDirection();
+ }
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kSortDirection,
+ static_cast<int32_t>(sort_direction));
- ax_header->AddChildView(std::move(ax_cell));
- }
+ // Add a dynamic accessibility data callback for each cell.
+ ax_cell->SetPopulateDataCallback(
+ base::BindRepeating(&TableView::PopulateAccessibilityCellData,
+ base::Unretained(this), ax_cell.get()));
+
+ return ax_cell;
+}
+
+void TableView::PopulateAccessibilityRowData(AXVirtualView* ax_row,
+ ui::AXNodeData* data) {
+ int ax_index = GetViewAccessibility().GetIndexOf(ax_row);
+ DCHECK_GE(ax_index, 0);
+
+ int row_index = ax_index - (header_ ? 1 : 0);
+ int model_index = ViewToModel(row_index);
+ DCHECK_GE(model_index, 0);
- GetViewAccessibility().AddVirtualChildView(std::move(ax_header));
+ // When navigating using up / down cursor keys on the Mac, we read the
+ // contents of the first cell. If the user needs to explore additional cell's,
+ // they can use VoiceOver shortcuts.
+ if (!PlatformStyle::kTableViewSupportsKeyboardNavigationByCell)
+ data->SetName(model_->GetText(model_index, GetVisibleColumn(0).column.id));
+
+ gfx::Rect row_bounds = GetRowBounds(model_index);
+
+ if (!GetVisibleBounds().Intersects(row_bounds))
+ data->AddState(ax::mojom::State::kInvisible);
+
+ if (selection_model().IsSelected(model_index))
+ data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
+}
+
+void TableView::PopulateAccessibilityCellData(AXVirtualView* ax_cell,
+ ui::AXNodeData* data) {
+ AXVirtualView* ax_row = ax_cell->virtual_parent_view();
+ DCHECK(ax_row);
+
+ int ax_index = GetViewAccessibility().GetIndexOf(ax_row);
+ DCHECK_GE(ax_index, 0);
+
+ int row_index = ax_index - (header_ ? 1 : 0);
+ int column_index = ax_row->GetIndexOf(ax_cell);
+ DCHECK_GE(column_index, 0);
+
+ int model_index = ViewToModel(row_index);
+ DCHECK_GE(model_index, 0);
+
+ gfx::Rect cell_bounds = GetCellBounds(row_index, column_index);
+
+ if (!GetVisibleBounds().Intersects(cell_bounds))
+ data->AddState(ax::mojom::State::kInvisible);
+
+ if (PlatformStyle::kTableViewSupportsKeyboardNavigationByCell &&
+ static_cast<const int>(column_index) == GetActiveVisibleColumnIndex()) {
+ if (selection_model().IsSelected(model_index))
+ data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected, true);
}
- for (int view_index = 0; view_index < GetRowCount(); ++view_index) {
- const int model_index = ViewToModel(view_index);
- auto ax_row = std::make_unique<AXVirtualView>();
- ui::AXNodeData& row_data = ax_row->GetCustomData();
- row_data.role = ax::mojom::Role::kRow;
-
- if (!PlatformStyle::kTableViewSupportsKeyboardNavigationByCell) {
- row_data.AddState(ax::mojom::State::kFocusable);
- row_data.AddAction(ax::mojom::Action::kFocus);
- row_data.AddAction(ax::mojom::Action::kScrollToMakeVisible);
- row_data.AddAction(ax::mojom::Action::kSetSelection);
-
- // When navigating using up / down cursor keys on the Mac, we read the
- // contents of the first cell. If the user needs to explore additional
- // cells, they can use VoiceOver shortcuts.
- row_data.SetName(
- model_->GetText(model_index, visible_columns_[0].column.id));
- }
+ // Set the cell's value since it changes dynamically.
+ base::string16 current_name = base::UTF8ToUTF16(
+ data->GetStringAttribute(ax::mojom::StringAttribute::kName));
+ base::string16 new_name =
+ model()->GetText(model_index, GetVisibleColumn(column_index).column.id);
+ data->SetName(new_name);
+ if (current_name != new_name)
+ NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
+}
- row_data.SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kSelect);
- row_data.AddIntAttribute(ax::mojom::IntAttribute::kTableRowIndex,
- static_cast<int32_t>(view_index));
- if (!single_selection_)
- row_data.AddState(ax::mojom::State::kMultiselectable);
-
- base::RepeatingCallback<void(ui::AXNodeData*)> row_callback =
- base::BindRepeating(
- [](TableView* table, int model_index, ui::AXNodeData* data) {
- DCHECK(table);
- gfx::Rect row_bounds =
- table->GetRowBounds(table->ModelToView(model_index));
- if (!table->GetVisibleBounds().Intersects(row_bounds))
- data->AddState(ax::mojom::State::kInvisible);
- if (table->selection_model().IsSelected(model_index)) {
- data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected,
- true);
- }
- },
- base::Unretained(this), model_index);
- ax_row->SetPopulateDataCallback(std::move(row_callback));
+std::unique_ptr<AXVirtualView> TableView::CreateHeaderAccessibilityView() {
+ DCHECK(header_) << "header_ needs to be instantiated before setting its"
+ "accessibility view.";
- for (size_t visible_column_index = 0;
- visible_column_index < visible_columns_.size();
- ++visible_column_index) {
- const VisibleColumn& visible_column =
- visible_columns_[visible_column_index];
- const ui::TableColumn column = visible_column.column;
- auto ax_cell = std::make_unique<AXVirtualView>();
- ui::AXNodeData& cell_data = ax_cell->GetCustomData();
- cell_data.role = ax::mojom::Role::kCell;
- if (PlatformStyle::kTableViewSupportsKeyboardNavigationByCell) {
- cell_data.AddState(ax::mojom::State::kFocusable);
- cell_data.AddAction(ax::mojom::Action::kFocus);
- cell_data.AddAction(ax::mojom::Action::kScrollLeft);
- cell_data.AddAction(ax::mojom::Action::kScrollRight);
- cell_data.AddAction(ax::mojom::Action::kScrollToMakeVisible);
- cell_data.AddAction(ax::mojom::Action::kSetSelection);
- }
+ const base::Optional<int> primary_sorted_column_id =
+ sort_descriptors().empty()
+ ? base::nullopt
+ : base::make_optional(sort_descriptors()[0].column_id);
- cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellRowIndex,
- static_cast<int32_t>(view_index));
- cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellRowSpan, 1);
- cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellColumnIndex,
- static_cast<int32_t>(visible_column_index));
- cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellColumnSpan,
- 1);
-
- cell_data.SetName(model_->GetText(model_index, column.id));
- if (base::i18n::IsRTL())
- cell_data.SetTextDirection(ax::mojom::WritingDirection::kRtl);
-
- auto sort_direction = ax::mojom::SortDirection::kUnsorted;
- if (column.sortable && primary_sorted_column_id.has_value() &&
- column.id == primary_sorted_column_id.value()) {
- DCHECK(!sort_descriptors().empty());
- if (sort_descriptors()[0].ascending)
- sort_direction = ax::mojom::SortDirection::kAscending;
- else
- sort_direction = ax::mojom::SortDirection::kDescending;
- }
- cell_data.AddIntAttribute(ax::mojom::IntAttribute::kSortDirection,
- static_cast<int32_t>(sort_direction));
-
- base::RepeatingCallback<void(ui::AXNodeData*)> cell_callback =
- base::BindRepeating(
- [](TableView* table, int model_index, size_t visible_column_index,
- ui::AXNodeData* data) {
- DCHECK(table);
- gfx::Rect cell_bounds = table->GetCellBounds(
- table->ModelToView(model_index), visible_column_index);
- if (!table->GetVisibleBounds().Intersects(cell_bounds))
- data->AddState(ax::mojom::State::kInvisible);
- if (PlatformStyle::kTableViewSupportsKeyboardNavigationByCell &&
- static_cast<const int>(visible_column_index) ==
- table->GetActiveVisibleColumnIndex()) {
- if (table->selection_model().IsSelected(model_index)) {
- data->AddBoolAttribute(ax::mojom::BoolAttribute::kSelected,
- true);
- }
- }
- },
- base::Unretained(this), model_index, visible_column_index);
- ax_cell->SetPopulateDataCallback(std::move(cell_callback));
-
- ax_row->AddChildView(std::move(ax_cell));
+ auto ax_header = std::make_unique<AXVirtualView>();
+ ui::AXNodeData& header_data = ax_header->GetCustomData();
+ header_data.role = ax::mojom::Role::kRow;
+
+ for (size_t visible_column_index = 0;
+ visible_column_index < visible_columns_.size(); ++visible_column_index) {
+ const VisibleColumn& visible_column =
+ visible_columns_[visible_column_index];
+ const ui::TableColumn column = visible_column.column;
+ auto ax_cell = std::make_unique<AXVirtualView>();
+ ui::AXNodeData& cell_data = ax_cell->GetCustomData();
+ cell_data.role = ax::mojom::Role::kColumnHeader;
+ cell_data.SetName(column.title);
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellColumnIndex,
+ static_cast<int32_t>(visible_column_index));
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellColumnSpan, 1);
+ if (base::i18n::IsRTL()) {
+ cell_data.SetTextDirection(ax::mojom::WritingDirection::kRtl);
+ }
+
+ auto sort_direction = ax::mojom::SortDirection::kUnsorted;
+ if (column.sortable && primary_sorted_column_id.has_value() &&
+ column.id == primary_sorted_column_id.value()) {
+ sort_direction = GetFirstSortDescriptorDirection();
}
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kSortDirection,
+ static_cast<int32_t>(sort_direction));
- GetViewAccessibility().AddVirtualChildView(std::move(ax_row));
+ ax_header->AddChildView(std::move(ax_cell));
}
- UpdateVirtualAccessibilityChildrenBounds();
+ return ax_header;
}
-void TableView::ClearVirtualAccessibilityChildren() {
- GetViewAccessibility().RemoveAllVirtualChildViews();
+bool TableView::UpdateVirtualAccessibilityRowData(AXVirtualView* ax_row,
+ int view_index,
+ int model_index) {
+ DCHECK_GE(view_index, 0);
+
+ ui::AXNodeData& row_data = ax_row->GetCustomData();
+
+ int previous_view_index =
+ row_data.GetIntAttribute(ax::mojom::IntAttribute::kTableRowIndex);
+ if (previous_view_index == view_index)
+ return false;
+
+ row_data.AddIntAttribute(ax::mojom::IntAttribute::kTableRowIndex,
+ static_cast<int32_t>(view_index));
+
+ // Update the cell's in the current row to have the new data.
+ for (const auto& ax_cell : ax_row->children()) {
+ ui::AXNodeData& cell_data = ax_cell->GetCustomData();
+ cell_data.AddIntAttribute(ax::mojom::IntAttribute::kTableCellRowIndex,
+ static_cast<int32_t>(view_index));
+ }
+
+ return true;
}
void TableView::UpdateVirtualAccessibilityChildrenBounds() {
@@ -1396,7 +1517,7 @@ void TableView::UpdateVirtualAccessibilityChildrenBounds() {
if (header_) {
auto& ax_row = virtual_children[0];
ui::AXNodeData& row_data = ax_row->GetCustomData();
- DCHECK_EQ(ax_row->GetData().role, ax::mojom::Role::kRow);
+ DCHECK_EQ(row_data.role, ax::mojom::Role::kRow);
row_data.relative_bounds.bounds =
gfx::RectF(CalculateHeaderRowAccessibilityBounds());
@@ -1406,10 +1527,14 @@ void TableView::UpdateVirtualAccessibilityChildrenBounds() {
visible_column_index++) {
ui::AXNodeData& cell_data =
ax_row->children()[visible_column_index]->GetCustomData();
-
DCHECK_EQ(cell_data.role, ax::mojom::Role::kColumnHeader);
- cell_data.relative_bounds.bounds = gfx::RectF(
- CalculateHeaderCellAccessibilityBounds(visible_column_index));
+
+ if (visible_column_index < visible_columns_.size()) {
+ cell_data.relative_bounds.bounds = gfx::RectF(
+ CalculateHeaderCellAccessibilityBounds(visible_column_index));
+ } else {
+ cell_data.relative_bounds.bounds = gfx::RectF();
+ }
}
}
@@ -1417,7 +1542,7 @@ void TableView::UpdateVirtualAccessibilityChildrenBounds() {
for (int row_index = 0; row_index < GetRowCount(); row_index++) {
auto& ax_row = virtual_children[header_ ? row_index + 1 : row_index];
ui::AXNodeData& row_data = ax_row->GetCustomData();
- DCHECK_EQ(ax_row->GetData().role, ax::mojom::Role::kRow);
+ DCHECK_EQ(row_data.role, ax::mojom::Role::kRow);
row_data.relative_bounds.bounds =
gfx::RectF(CalculateTableRowAccessibilityBounds(row_index));
@@ -1427,11 +1552,15 @@ void TableView::UpdateVirtualAccessibilityChildrenBounds() {
visible_column_index++) {
ui::AXNodeData& cell_data =
ax_row->children()[visible_column_index]->GetCustomData();
-
DCHECK_EQ(cell_data.role, ax::mojom::Role::kCell);
- cell_data.relative_bounds.bounds =
- gfx::RectF(CalculateTableCellAccessibilityBounds(
- row_index, visible_column_index));
+
+ if (visible_column_index < visible_columns_.size()) {
+ cell_data.relative_bounds.bounds =
+ gfx::RectF(CalculateTableCellAccessibilityBounds(
+ row_index, visible_column_index));
+ } else {
+ cell_data.relative_bounds.bounds = gfx::RectF();
+ }
}
}
}
@@ -1480,15 +1609,13 @@ void TableView::UpdateAccessibilityFocus() {
int active_row = ModelToView(selection_model_.active());
if (!PlatformStyle::kTableViewSupportsKeyboardNavigationByCell) {
AXVirtualView* ax_row = GetVirtualAccessibilityRow(active_row);
- if (ax_row) {
+ if (ax_row)
GetViewAccessibility().OverrideFocus(ax_row);
- }
} else {
AXVirtualView* ax_cell =
GetVirtualAccessibilityCell(active_row, active_visible_column_index_);
- if (ax_cell) {
+ if (ax_cell)
GetViewAccessibility().OverrideFocus(ax_cell);
- }
}
}
@@ -1504,7 +1631,7 @@ AXVirtualView* TableView::GetVirtualAccessibilityRow(int row) {
return ax_row.get();
}
NOTREACHED() << "|row| not found. Did you forget to call "
- "UpdateVirtualAccessibilityChildren()?";
+ "RebuildVirtualAccessibilityChildren()?";
return nullptr;
}
@@ -1513,7 +1640,7 @@ AXVirtualView* TableView::GetVirtualAccessibilityCell(
int visible_column_index) {
AXVirtualView* ax_row = GetVirtualAccessibilityRow(row);
DCHECK(ax_row) << "|row| not found. Did you forget to call "
- "UpdateVirtualAccessibilityChildren()?";
+ "RebuildVirtualAccessibilityChildren()?";
const auto matches_index = [visible_column_index](const auto& ax_cell) {
DCHECK(ax_cell);
DCHECK(ax_cell->GetData().role == ax::mojom::Role::kColumnHeader ||
@@ -1526,7 +1653,7 @@ AXVirtualView* TableView::GetVirtualAccessibilityCell(
ax_row->children().cend(), matches_index);
DCHECK(i != ax_row->children().cend())
<< "|visible_column_index| not found. Did you forget to call "
- << "UpdateVirtualAccessibilityChildren()?";
+ << "RebuildVirtualAccessibilityChildren()?";
return i->get();
}
diff --git a/chromium/ui/views/controls/table/table_view.h b/chromium/ui/views/controls/table/table_view.h
index e6a73ca73b6..e20f57b2b34 100644
--- a/chromium/ui/views/controls/table/table_view.h
+++ b/chromium/ui/views/controls/table/table_view.h
@@ -49,7 +49,7 @@ class TableHeader;
class TableViewObserver;
class TableViewTestHelper;
-// The cells in the first column of a table can contain:
+// The cell's in the first column of a table can contain:
// - only text
// - a small icon (16x16) and some text
// - a check box and some text
@@ -206,10 +206,13 @@ class VIEWS_EXPORT TableView : public views::View,
bool GetSortOnPaint() const;
void SetSortOnPaint(bool sort_on_paint);
+ // Returns the proper ax sort direction.
+ ax::mojom::SortDirection GetFirstSortDescriptorDirection() const;
+
TableTypes GetTableType() const;
// Updates the relative bounds of the virtual accessibility children created
- // in UpdateVirtualAccessibilityChildren(). This function is public so that
+ // in RebuildVirtualAccessibilityChildren(). This function is public so that
// the table's |header_| can trigger an update when its visible bounds are
// changed, because its accessibility information is also contained in the
// table's virtual accessibility children.
@@ -248,7 +251,7 @@ class VIEWS_EXPORT TableView : public views::View,
struct GroupSortHelper;
struct SortHelper;
- // Used during painting to determine the range of cells that need to be
+ // Used during painting to determine the range of cell's that need to be
// painted.
// NOTE: the row indices returned by this are in terms of the view and column
// indices in terms of |visible_columns_|.
@@ -272,9 +275,6 @@ class VIEWS_EXPORT TableView : public views::View,
// in a cell.
int GetCellElementSpacing() const;
- // Invoked when the number of rows changes in some way.
- void NumRowsChanged();
-
// Does the actual sort and updates the mappings (|view_to_model_| and
// |model_to_view_|) appropriately. If |schedule_paint| is true,
// schedules a paint. This should be true, unless called from
@@ -308,7 +308,7 @@ class VIEWS_EXPORT TableView : public views::View,
// Updates the |x| and |width| of each of the columns in |visible_columns_|.
void UpdateVisibleColumnSizes();
- // Returns the cells that need to be painted for the specified region.
+ // Returns the cell's that need to be painted for the specified region.
// |bounds| is in terms of |this|.
PaintRegion GetPaintRegion(const gfx::Rect& bounds) const;
@@ -353,17 +353,17 @@ class VIEWS_EXPORT TableView : public views::View,
// Updates a set of accessibility views that expose the visible table contents
// to assistive software.
- void UpdateVirtualAccessibilityChildren();
+ void RebuildVirtualAccessibilityChildren();
// Clears the set of accessibility views set up in
- // UpdateVirtualAccessibilityChildren(). Useful when the model is in the
+ // RebuildVirtualAccessibilityChildren(). Useful when the model is in the
// process of changing but the virtual accessibility children haven't been
// updated yet, e.g. showing or hiding a column via SetColumnVisibility().
void ClearVirtualAccessibilityChildren();
// Helper functions used in UpdateVirtualAccessibilityChildrenBounds() for
// calculating the accessibility bounds for the header and table rows and
- // cells.
+ // cell's.
gfx::Rect CalculateHeaderRowAccessibilityBounds() const;
gfx::Rect CalculateHeaderCellAccessibilityBounds(
const int visible_column_index) const;
@@ -386,6 +386,37 @@ class VIEWS_EXPORT TableView : public views::View,
// |visible_column_index| indexes into |visible_columns_|.
AXVirtualView* GetVirtualAccessibilityCell(int row, int visible_column_index);
+ // Creates a virtual accessibility view that is used to expose information
+ // about the row at |view_index| to assistive software.
+ std::unique_ptr<AXVirtualView> CreateRowAccessibilityView(int view_index);
+
+ // Creates a virtual accessibility view that is used to expose information
+ // about the cell at the provided coordinates |row_index| and |column_index|
+ // to assistive software.
+ std::unique_ptr<AXVirtualView> CreateCellAccessibilityView(
+ int row_index,
+ size_t column_index);
+
+ // Creates a virtual accessibility view that is used to expose information
+ // about this header to assistive software.
+ std::unique_ptr<AXVirtualView> CreateHeaderAccessibilityView();
+
+ // Updates the accessibility data for |ax_row| to match the data in the view
+ // at |view_index| in the table. Returns false if row data not changed.
+ bool UpdateVirtualAccessibilityRowData(AXVirtualView* ax_row,
+ int view_index,
+ int model_index);
+
+ // The accessibility view |ax_row| callback function that populates the
+ // accessibility data for a table row.
+ void PopulateAccessibilityRowData(AXVirtualView* ax_row,
+ ui::AXNodeData* data);
+
+ // The accessibility view |ax_cell| callback function that populates the
+ // accessibility data for a table cell.
+ void PopulateAccessibilityCellData(AXVirtualView* ax_cell,
+ ui::AXNodeData* data);
+
ui::TableModel* model_ = nullptr;
std::vector<ui::TableColumn> columns_;
diff --git a/chromium/ui/views/controls/table/table_view_unittest.cc b/chromium/ui/views/controls/table/table_view_unittest.cc
index 503a5e00124..dfa2affc493 100644
--- a/chromium/ui/views/controls/table/table_view_unittest.cc
+++ b/chromium/ui/views/controls/table/table_view_unittest.cc
@@ -10,6 +10,7 @@
#include <utility>
#include "base/macros.h"
+#include "base/numerics/ranges.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
@@ -154,9 +155,17 @@ class TestTableModel2 : public ui::TableModel {
// Adds a new row at index |row| with values |c1_value| and |c2_value|.
void AddRow(int row, int c1_value, int c2_value);
+ // Adds new rows starting from |row| to |row| + |length| with the value
+ // of |row| times the |value_multiplier|. The |value_multiplier| can be used
+ // to distinguish these rows from the rest.
+ void AddRows(int row, int length, int value_multiplier);
+
// Removes the row at index |row|.
void RemoveRow(int row);
+ // Removes all the rows starting from |row| to |row| + |length|.
+ void RemoveRows(int row, int length);
+
// Changes the values of the row at |row|.
void ChangeRow(int row, int c1_value, int c2_value);
@@ -195,13 +204,43 @@ void TestTableModel2::AddRow(int row, int c1_value, int c2_value) {
if (observer_)
observer_->OnItemsAdded(row, 1);
}
+
+void TestTableModel2::AddRows(int row, int length, int value_multiplier) {
+ DCHECK(row >= 0 && length >= 0);
+ // Do not DCHECK here since we are testing the OnItemsAdded callback.
+ if (row >= 0 && row <= static_cast<int>(rows_.size())) {
+ for (int i = row; i < row + length; i++) {
+ std::vector<int> new_row;
+ new_row.push_back(i + value_multiplier);
+ new_row.push_back(i + value_multiplier);
+ rows_.insert(rows_.begin() + i, new_row);
+ }
+ }
+
+ if (observer_ && length > 0)
+ observer_->OnItemsAdded(row, length);
+}
+
void TestTableModel2::RemoveRow(int row) {
- DCHECK(row >= 0 && row <= static_cast<int>(rows_.size()));
+ DCHECK(row >= 0 && row < static_cast<int>(rows_.size()));
rows_.erase(rows_.begin() + row);
if (observer_)
observer_->OnItemsRemoved(row, 1);
}
+void TestTableModel2::RemoveRows(int row, int length) {
+ DCHECK(row >= 0 && length >= 0);
+ if (row >= 0 && row <= static_cast<int>(rows_.size())) {
+ rows_.erase(
+ rows_.begin() + row,
+ rows_.begin() + base::ClampToRange(row + length, 0,
+ static_cast<int>(rows_.size())));
+ }
+
+ if (observer_ && length > 0)
+ observer_->OnItemsRemoved(row, length);
+}
+
void TestTableModel2::ChangeRow(int row, int c1_value, int c2_value) {
DCHECK(row >= 0 && row < static_cast<int>(rows_.size()));
rows_[row][0] = c1_value;
@@ -290,6 +329,54 @@ std::string GetRowsInViewOrderAsString(TableView* table) {
return result;
}
+// Formats the whole accessibility views as a string.
+// Like: "[a, b, c], [d, e, f]".
+std::string GetRowsInVirtualViewAsString(TableView* table) {
+ auto& virtual_children = table->GetViewAccessibility().virtual_children();
+ std::string result;
+
+ for (size_t row_index = 0; row_index < virtual_children.size(); row_index++) {
+ if (row_index != 0)
+ result += ", "; // Comma between each row.
+
+ const auto& row = virtual_children[row_index];
+
+ result += "[";
+
+ for (size_t cell_index = 0; cell_index < row->children().size();
+ cell_index++) {
+ if (cell_index != 0)
+ result += ", "; // Comma between each value in the row.
+
+ const auto& cell = row->children()[cell_index];
+ const ui::AXNodeData& cell_data = cell->GetData();
+
+ result += cell_data.GetStringAttribute(ax::mojom::StringAttribute::kName);
+ }
+
+ result += "]";
+ }
+
+ return result;
+}
+
+std::string GetHeaderRowAsString(TableView* table) {
+ std::string result = "[";
+
+ for (size_t col_index = 0; col_index < table->visible_columns().size();
+ ++col_index) {
+ if (col_index != 0)
+ result += ", "; // Comma between each column.
+
+ result +=
+ base::UTF16ToUTF8(table->GetVisibleColumn(col_index).column.title);
+ }
+
+ result += "]";
+
+ return result;
+}
+
bool PressLeftMouseAt(views::View* target, const gfx::Point& point) {
const ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, point, point,
ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
@@ -399,6 +486,26 @@ class TableViewTest : public ViewsTestBase,
generator.PressKey(code, flags);
}
+ void VerifyTableViewAndAXOrder(std::string expected_view_order) {
+ auto& virtual_children = table_->GetViewAccessibility().virtual_children();
+
+ // Makes sure the virtual children count takes into account of the header
+ // row.
+ int virtual_row_count = table_->GetRowCount() + (helper_->header() ? 1 : 0);
+ EXPECT_EQ(virtual_row_count, int{virtual_children.size()});
+
+ // The table views should match the expected view order.
+ EXPECT_EQ(expected_view_order, GetRowsInViewOrderAsString(table_));
+
+ // Update the expected view order to have header information if exists.
+ if (helper_->header()) {
+ expected_view_order =
+ GetHeaderRowAsString(table_) + ", " + expected_view_order;
+ }
+
+ EXPECT_EQ(expected_view_order, GetRowsInVirtualViewAsString(table_));
+ }
+
// Helper function for comparing the bounds of |table_|'s virtual
// accessibility child rows and cells with a set of expected bounds.
void VerifyTableAccChildrenBounds(
@@ -479,7 +586,7 @@ TEST_P(TableViewTest, GetPaintRegion) {
helper_->GetPaintRegion(gfx::Rect(0, 0, 1, table_->height())));
}
-TEST_P(TableViewTest, UpdateVirtualAccessibilityChildren) {
+TEST_P(TableViewTest, RebuildVirtualAccessibilityChildren) {
const ViewAccessibility& view_accessibility = table_->GetViewAccessibility();
ui::AXNodeData data;
view_accessibility.GetAccessibleNodeData(&data);
@@ -718,8 +825,7 @@ TEST_P(TableViewTest, Sort) {
EXPECT_TRUE(table_->sort_descriptors().empty());
EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
- EXPECT_EQ("[0, 1], [1, 1], [2, 2], [3, 0]",
- GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[0, 1], [1, 1], [2, 2], [3, 0]");
// Toggle the sort order of the first column, shouldn't change anything.
table_->ToggleSortOrder(0);
@@ -728,8 +834,7 @@ TEST_P(TableViewTest, Sort) {
EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
- EXPECT_EQ("[0, 1], [1, 1], [2, 2], [3, 0]",
- GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[0, 1], [1, 1], [2, 2], [3, 0]");
// Toggle the sort (first column descending).
table_->ToggleSortOrder(0);
@@ -738,8 +843,7 @@ TEST_P(TableViewTest, Sort) {
EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
EXPECT_EQ("3 2 1 0", GetViewToModelAsString(table_));
EXPECT_EQ("3 2 1 0", GetModelToViewAsString(table_));
- EXPECT_EQ("[3, 0], [2, 2], [1, 1], [0, 1]",
- GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[3, 0], [2, 2], [1, 1], [0, 1]");
// Change the [3, 0] cell to [-1, 0]. This should move it to the back of
// the current sort order.
@@ -749,16 +853,14 @@ TEST_P(TableViewTest, Sort) {
EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
EXPECT_EQ("2 1 0 3", GetViewToModelAsString(table_));
EXPECT_EQ("2 1 0 3", GetModelToViewAsString(table_));
- EXPECT_EQ("[2, 2], [1, 1], [0, 1], [-1, 0]",
- GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[2, 2], [1, 1], [0, 1], [-1, 0]");
// Toggle the sort again, to clear the sort and restore the model ordering.
table_->ToggleSortOrder(0);
EXPECT_TRUE(table_->sort_descriptors().empty());
EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
- EXPECT_EQ("[0, 1], [1, 1], [2, 2], [-1, 0]",
- GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[0, 1], [1, 1], [2, 2], [-1, 0]");
// Toggle the sort again (first column ascending).
table_->ToggleSortOrder(0);
@@ -767,19 +869,18 @@ TEST_P(TableViewTest, Sort) {
EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
EXPECT_EQ("3 0 1 2", GetViewToModelAsString(table_));
EXPECT_EQ("1 2 3 0", GetModelToViewAsString(table_));
- EXPECT_EQ("[-1, 0], [0, 1], [1, 1], [2, 2]",
- GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[-1, 0], [0, 1], [1, 1], [2, 2]");
- // Add a row that's second in the model order, but last in the active sort
+ // Add two rows that's second in the model order, but last in the active sort
// order.
- model_->AddRow(1, 3, 4);
+ model_->AddRows(1, 2, 10 /* Multiplier */);
ASSERT_EQ(1u, table_->sort_descriptors().size());
EXPECT_EQ(0, table_->sort_descriptors()[0].column_id);
EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
- EXPECT_EQ("4 0 2 3 1", GetViewToModelAsString(table_));
- EXPECT_EQ("1 4 2 3 0", GetModelToViewAsString(table_));
- EXPECT_EQ("[-1, 0], [0, 1], [1, 1], [2, 2], [3, 4]",
- GetRowsInViewOrderAsString(table_));
+ EXPECT_EQ("5 0 3 4 1 2", GetViewToModelAsString(table_));
+ EXPECT_EQ("1 4 5 2 3 0", GetModelToViewAsString(table_));
+ VerifyTableViewAndAXOrder(
+ "[-1, 0], [0, 1], [1, 1], [2, 2], [11, 11], [12, 12]");
// Add a row that's last in the model order but second in the the active sort
// order.
@@ -787,10 +888,10 @@ TEST_P(TableViewTest, Sort) {
ASSERT_EQ(1u, table_->sort_descriptors().size());
EXPECT_EQ(0, table_->sort_descriptors()[0].column_id);
EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
- EXPECT_EQ("4 5 0 2 3 1", GetViewToModelAsString(table_));
- EXPECT_EQ("2 5 3 4 0 1", GetModelToViewAsString(table_));
- EXPECT_EQ("[-1, 0], [-1, 20], [0, 1], [1, 1], [2, 2], [3, 4]",
- GetRowsInViewOrderAsString(table_));
+ EXPECT_EQ("5 6 0 3 4 1 2", GetViewToModelAsString(table_));
+ EXPECT_EQ("2 5 6 3 4 0 1", GetModelToViewAsString(table_));
+ VerifyTableViewAndAXOrder(
+ "[-1, 20], [-1, 0], [0, 1], [1, 1], [2, 2], [11, 11], [12, 12]");
// Click the first column again, then click the second column. This should
// yield an ordering of second column ascending, with the first column
@@ -802,10 +903,10 @@ TEST_P(TableViewTest, Sort) {
EXPECT_TRUE(table_->sort_descriptors()[0].ascending);
EXPECT_EQ(0, table_->sort_descriptors()[1].column_id);
EXPECT_FALSE(table_->sort_descriptors()[1].ascending);
- EXPECT_EQ("4 2 0 3 1 5", GetViewToModelAsString(table_));
- EXPECT_EQ("2 4 1 3 0 5", GetModelToViewAsString(table_));
- EXPECT_EQ("[-1, 0], [1, 1], [0, 1], [2, 2], [3, 4], [-1, 20]",
- GetRowsInViewOrderAsString(table_));
+ EXPECT_EQ("6 3 0 4 1 2 5", GetViewToModelAsString(table_));
+ EXPECT_EQ("2 4 5 1 3 6 0", GetModelToViewAsString(table_));
+ VerifyTableViewAndAXOrder(
+ "[-1, 0], [1, 1], [0, 1], [2, 2], [11, 11], [12, 12], [-1, 20]");
// Toggle the current column to change from ascending to descending. This
// should result in an almost-reversal of the previous order, except for the
@@ -816,10 +917,10 @@ TEST_P(TableViewTest, Sort) {
EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
EXPECT_EQ(0, table_->sort_descriptors()[1].column_id);
EXPECT_FALSE(table_->sort_descriptors()[1].ascending);
- EXPECT_EQ("5 1 3 2 0 4", GetViewToModelAsString(table_));
- EXPECT_EQ("4 1 3 2 5 0", GetModelToViewAsString(table_));
- EXPECT_EQ("[-1, 20], [3, 4], [2, 2], [1, 1], [0, 1], [-1, 0]",
- GetRowsInViewOrderAsString(table_));
+ EXPECT_EQ("5 2 1 4 3 0 6", GetViewToModelAsString(table_));
+ EXPECT_EQ("5 2 1 4 3 0 6", GetModelToViewAsString(table_));
+ VerifyTableViewAndAXOrder(
+ "[-1, 20], [12, 12], [11, 11], [2, 2], [1, 1], [0, 1], [-1, 0]");
// Delete the [0, 1] row from the model. It's at model index zero.
model_->RemoveRow(0);
@@ -828,19 +929,29 @@ TEST_P(TableViewTest, Sort) {
EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
EXPECT_EQ(0, table_->sort_descriptors()[1].column_id);
EXPECT_FALSE(table_->sort_descriptors()[1].ascending);
- EXPECT_EQ("4 0 2 1 3", GetViewToModelAsString(table_));
- EXPECT_EQ("1 3 2 4 0", GetModelToViewAsString(table_));
- EXPECT_EQ("[-1, 20], [3, 4], [2, 2], [1, 1], [-1, 0]",
- GetRowsInViewOrderAsString(table_));
+ EXPECT_EQ("4 1 0 3 2 5", GetViewToModelAsString(table_));
+ EXPECT_EQ("2 1 4 3 0 5", GetModelToViewAsString(table_));
+ VerifyTableViewAndAXOrder(
+ "[-1, 20], [12, 12], [11, 11], [2, 2], [1, 1], [-1, 0]");
+
+ // Delete [-1, 20] and [10, 11] from the model.
+ model_->RemoveRows(1, 2);
+ ASSERT_EQ(2u, table_->sort_descriptors().size());
+ EXPECT_EQ(1, table_->sort_descriptors()[0].column_id);
+ EXPECT_FALSE(table_->sort_descriptors()[0].ascending);
+ EXPECT_EQ(0, table_->sort_descriptors()[1].column_id);
+ EXPECT_FALSE(table_->sort_descriptors()[1].ascending);
+ EXPECT_EQ("2 0 1 3", GetViewToModelAsString(table_));
+ EXPECT_EQ("1 2 0 3", GetModelToViewAsString(table_));
+ VerifyTableViewAndAXOrder("[-1, 20], [11, 11], [2, 2], [-1, 0]");
// Toggle the current sort column again. This should clear both the primary
// and secondary sort descriptor.
table_->ToggleSortOrder(1);
EXPECT_TRUE(table_->sort_descriptors().empty());
- EXPECT_EQ("0 1 2 3 4", GetViewToModelAsString(table_));
- EXPECT_EQ("0 1 2 3 4", GetModelToViewAsString(table_));
- EXPECT_EQ("[3, 4], [1, 1], [2, 2], [-1, 0], [-1, 20]",
- GetRowsInViewOrderAsString(table_));
+ EXPECT_EQ("0 1 2 3", GetViewToModelAsString(table_));
+ EXPECT_EQ("0 1 2 3", GetModelToViewAsString(table_));
+ VerifyTableViewAndAXOrder("[11, 11], [2, 2], [-1, 20], [-1, 0]");
}
// Verifies clicking on the header sorts.
@@ -1171,6 +1282,16 @@ TEST_P(TableViewTest, Selection) {
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=3 anchor=3 selection=3", SelectionStateAsString());
+ // Insert two rows to the selection.
+ model_->AddRows(2, 2, 1);
+ EXPECT_EQ(0, observer.GetChangedCountAndClear());
+ EXPECT_EQ("active=5 anchor=5 selection=5", SelectionStateAsString());
+
+ // Remove two rows which include the selection.
+ model_->RemoveRows(4, 2);
+ EXPECT_EQ(1, observer.GetChangedCountAndClear());
+ EXPECT_EQ("active=0 anchor=0 selection=0", SelectionStateAsString());
+
table_->set_observer(nullptr);
}
@@ -1194,6 +1315,22 @@ TEST_P(TableViewTest, RemoveUnselectedRows) {
EXPECT_EQ("active=1 anchor=1 selection=1", SelectionStateAsString());
}
+TEST_P(TableViewTest, AddingRemovingMultipleRows) {
+ TableViewObserverImpl observer;
+ table_->set_observer(&observer);
+
+ VerifyTableViewAndAXOrder("[0, 1], [1, 1], [2, 2], [3, 0]");
+
+ model_->AddRows(0, 3, 10);
+
+ VerifyTableViewAndAXOrder(
+ "[10, 10], [11, 11], [12, 12], [0, 1], [1, 1], [2, 2], [3, 0]");
+
+ model_->RemoveRows(4, 3);
+
+ VerifyTableViewAndAXOrder("[10, 10], [11, 11], [12, 12], [0, 1]");
+}
+
// 0 1 2 3:
// select 3 -> 0 1 2 [3]
// remove 3 -> 0 1 2 (none selected)
@@ -1644,44 +1781,44 @@ TEST_P(TableViewTest, MoveRowsWithMultipleSelection) {
ClickOnRow(4, ui::EF_SHIFT_DOWN);
EXPECT_EQ(2, observer.GetChangedCountAndClear());
EXPECT_EQ("active=4 anchor=2 selection=2 3 4", SelectionStateAsString());
- EXPECT_EQ("[0], [1], [2], [77], [3]", GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[0], [1], [2], [77], [3]");
// Move the unselected rows to the middle of the current selection. None of
// the move operations should affect the view order.
model_->MoveRows(0, 2, 1);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=4 anchor=0 selection=0 3 4", SelectionStateAsString());
- EXPECT_EQ("[2], [0], [1], [77], [3]", GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[2], [0], [1], [77], [3]");
// Move the unselected rows to the end of the current selection.
model_->MoveRows(1, 2, 3);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=2 anchor=0 selection=0 1 2", SelectionStateAsString());
- EXPECT_EQ("[2], [77], [3], [0], [1]", GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[2], [77], [3], [0], [1]");
// Move the unselected rows back to the middle of the selection.
model_->MoveRows(3, 2, 1);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=4 anchor=0 selection=0 3 4", SelectionStateAsString());
- EXPECT_EQ("[2], [0], [1], [77], [3]", GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[2], [0], [1], [77], [3]");
// Swap the unselected rows.
model_->MoveRows(1, 1, 2);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=4 anchor=0 selection=0 3 4", SelectionStateAsString());
- EXPECT_EQ("[2], [1], [0], [77], [3]", GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[2], [1], [0], [77], [3]");
// Move the second unselected row to be between two selected rows.
model_->MoveRows(2, 1, 3);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=4 anchor=0 selection=0 2 4", SelectionStateAsString());
- EXPECT_EQ("[2], [1], [77], [0], [3]", GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[2], [1], [77], [0], [3]");
// Move the three middle rows to the beginning, including one selected row.
model_->MoveRows(1, 3, 0);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=4 anchor=3 selection=1 3 4", SelectionStateAsString());
- EXPECT_EQ("[1], [77], [0], [2], [3]", GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder("[1], [77], [0], [2], [3]");
table_->set_observer(nullptr);
}
@@ -1694,7 +1831,7 @@ TEST_P(TableViewTest, MoveRowsWithMultipleSelectionAndSort) {
table_->ToggleSortOrder(0);
table_->SetColumnVisibility(1, false);
const char* kViewOrder = "[0], [1], [2], [3], [77]";
- EXPECT_EQ(kViewOrder, GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder(kViewOrder);
TableViewObserverImpl observer;
table_->set_observer(&observer);
@@ -1710,37 +1847,37 @@ TEST_P(TableViewTest, MoveRowsWithMultipleSelectionAndSort) {
model_->MoveRows(0, 2, 1);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=3 anchor=0 selection=0 3 4", SelectionStateAsString());
- EXPECT_EQ(kViewOrder, GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder(kViewOrder);
// Move the unselected rows to the end of the current selection.
model_->MoveRows(1, 2, 3);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=1 anchor=0 selection=0 1 2", SelectionStateAsString());
- EXPECT_EQ(kViewOrder, GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder(kViewOrder);
// Move the unselected rows back to the middle of the selection.
model_->MoveRows(3, 2, 1);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=3 anchor=0 selection=0 3 4", SelectionStateAsString());
- EXPECT_EQ(kViewOrder, GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder(kViewOrder);
// Swap the unselected rows.
model_->MoveRows(1, 1, 2);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=3 anchor=0 selection=0 3 4", SelectionStateAsString());
- EXPECT_EQ(kViewOrder, GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder(kViewOrder);
// Swap the unselected rows again.
model_->MoveRows(2, 1, 1);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=3 anchor=0 selection=0 3 4", SelectionStateAsString());
- EXPECT_EQ(kViewOrder, GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder(kViewOrder);
// Move the unselected rows back to the beginning.
model_->MoveRows(1, 2, 0);
EXPECT_EQ(0, observer.GetChangedCountAndClear());
EXPECT_EQ("active=3 anchor=2 selection=2 3 4", SelectionStateAsString());
- EXPECT_EQ(kViewOrder, GetRowsInViewOrderAsString(table_));
+ VerifyTableViewAndAXOrder(kViewOrder);
table_->set_observer(nullptr);
}
@@ -1760,15 +1897,6 @@ TEST_P(TableViewTest, FocusAfterRemovingAnchor) {
table_->RequestFocus();
}
-TEST_P(TableViewTest, RemovingInvalidRowIsNoOp) {
- table_->Select(3);
- EXPECT_EQ("active=3 anchor=3 selection=3", SelectionStateAsString());
- table_->OnItemsRemoved(4, 1);
- EXPECT_EQ("active=3 anchor=3 selection=3", SelectionStateAsString());
- table_->OnItemsRemoved(2, 0);
- EXPECT_EQ("active=3 anchor=3 selection=3", SelectionStateAsString());
-}
-
namespace {
class RemoveFocusChangeListenerDelegate : public WidgetDelegate {
diff --git a/chromium/ui/views/controls/textfield/textfield.cc b/chromium/ui/views/controls/textfield/textfield.cc
index bd1a7e404f1..432332a7fad 100644
--- a/chromium/ui/views/controls/textfield/textfield.cc
+++ b/chromium/ui/views/controls/textfield/textfield.cc
@@ -8,12 +8,14 @@
#include <set>
#include <string>
#include <utility>
+#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/events/gesture_event_details.h"
#if defined(OS_WIN)
#include <vector>
#endif
+#include "base/auto_reset.h"
#include "base/command_line.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/utf_string_conversions.h"
@@ -53,6 +55,7 @@
#include "ui/views/controls/views_text_services_context_menu.h"
#include "ui/views/drag_utils.h"
#include "ui/views/layout/layout_provider.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/native_cursor.h"
#include "ui/views/painter.h"
#include "ui/views/style/platform_style.h"
@@ -382,6 +385,10 @@ void Textfield::SetAssociatedLabel(View* labelling_view) {
node_data.GetString16Attribute(ax::mojom::StringAttribute::kName));
}
+void Textfield::SetController(TextfieldController* controller) {
+ controller_ = controller;
+}
+
bool Textfield::GetReadOnly() const {
return read_only_;
}
@@ -820,6 +827,8 @@ bool Textfield::OnKeyPressed(const ui::KeyEvent& event) {
}
#endif
+ base::AutoReset<bool> show_rejection_ui(&show_rejection_ui_if_any_, true);
+
if (edit_command == ui::TextEditCommand::INVALID_COMMAND)
edit_command = GetCommandForKeyEvent(event);
@@ -1765,9 +1774,12 @@ bool Textfield::IsTextEditCommandEnabled(ui::TextEditCommand command) const {
return editable && readable && HasSelection();
case ui::TextEditCommand::COPY:
return readable && HasSelection();
- case ui::TextEditCommand::PASTE:
+ case ui::TextEditCommand::PASTE: {
+ ui::DataTransferEndpoint data_dst(ui::EndpointType::kDefault,
+ show_rejection_ui_if_any_);
ui::Clipboard::GetForCurrentThread()->ReadText(
- ui::ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr, &result);
+ ui::ClipboardBuffer::kCopyPaste, &data_dst, &result);
+ }
return editable && !result.empty();
case ui::TextEditCommand::SELECT_ALL:
return !GetText().empty() &&
@@ -1829,6 +1841,7 @@ bool Textfield::SetCompositionFromExistingText(
const std::vector<ui::ImeTextSpan>& ui_ime_text_spans) {
// TODO(https://crbug.com/952355): Support custom text spans.
DCHECK(!model_->HasCompositionText());
+ OnBeforeUserAction();
model_->SetCompositionFromExistingText(range);
SchedulePaint();
OnAfterUserAction();
@@ -1914,6 +1927,8 @@ void Textfield::ExecuteTextEditCommand(ui::TextEditCommand command) {
bool add_to_kill_buffer = false;
+ base::AutoReset<bool> show_rejection_ui(&show_rejection_ui_if_any_, true);
+
// Some codepaths may bypass GetCommandForKeyEvent, so any selection-dependent
// modifications of the command should happen here.
switch (command) {
diff --git a/chromium/ui/views/controls/textfield/textfield.h b/chromium/ui/views/controls/textfield/textfield.h
index 52da4166122..3e3b731dbb4 100644
--- a/chromium/ui/views/controls/textfield/textfield.h
+++ b/chromium/ui/views/controls/textfield/textfield.h
@@ -91,6 +91,8 @@ class VIEWS_EXPORT Textfield : public View,
static const gfx::FontList& GetDefaultFontList();
Textfield();
+ Textfield(const Textfield&) = delete;
+ Textfield& operator=(const Textfield&) = delete;
~Textfield() override;
// Set the controller for this textfield.
@@ -98,6 +100,9 @@ class VIEWS_EXPORT Textfield : public View,
controller_ = controller;
}
+ // TODD (kylixrd): Remove set_controller and refactor codebase.
+ void SetController(TextfieldController* controller);
+
// Gets/Sets whether or not the Textfield is read-only.
bool GetReadOnly() const;
void SetReadOnly(bool read_only);
@@ -697,6 +702,9 @@ class VIEWS_EXPORT Textfield : public View,
// True if this textfield should use a focus ring to indicate focus.
bool use_focus_ring_ = true;
+ // Whether the user should be notified if the clipboard is restricted.
+ bool show_rejection_ui_if_any_ = false;
+
// Whether the text should be used to improve typing suggestions.
base::Optional<bool> should_do_learning_;
@@ -734,27 +742,30 @@ class VIEWS_EXPORT Textfield : public View,
// Used to bind callback functions to this object.
base::WeakPtrFactory<Textfield> weak_ptr_factory_{this};
-
- DISALLOW_COPY_AND_ASSIGN(Textfield);
};
BEGIN_VIEW_BUILDER(VIEWS_EXPORT, Textfield, View)
-VIEW_BUILDER_PROPERTY(bool, ReadOnly)
-VIEW_BUILDER_PROPERTY(base::string16, Text)
-VIEW_BUILDER_PROPERTY(ui::TextInputType, TextInputType)
-VIEW_BUILDER_PROPERTY(int, TextInputFlags)
-VIEW_BUILDER_PROPERTY(SkColor, TextColor)
-VIEW_BUILDER_PROPERTY(SkColor, SelectionTextColor)
+VIEW_BUILDER_PROPERTY(base::string16, AccessibleName)
VIEW_BUILDER_PROPERTY(SkColor, BackgroundColor)
-VIEW_BUILDER_PROPERTY(SkColor, SelectionBackgroundColor)
+VIEW_BUILDER_PROPERTY(TextfieldController*, Controller)
VIEW_BUILDER_PROPERTY(bool, CursorEnabled)
-VIEW_BUILDER_PROPERTY(base::string16, PlaceholderText)
-VIEW_BUILDER_PROPERTY(bool, Invalid)
+VIEW_BUILDER_PROPERTY(int, DefaultWidthInChars)
VIEW_BUILDER_PROPERTY(gfx::HorizontalAlignment, HorizontalAlignment)
+VIEW_BUILDER_PROPERTY(bool, Invalid)
+VIEW_BUILDER_PROPERTY(int, MinimumWidthInChars)
+VIEW_BUILDER_PROPERTY(base::string16, PlaceholderText)
+VIEW_BUILDER_PROPERTY(bool, ReadOnly)
VIEW_BUILDER_PROPERTY(gfx::Range, SelectedRange)
-VIEW_BUILDER_PROPERTY(base::string16, AccessibleName)
-END_VIEW_BUILDER(VIEWS_EXPORT, Textfield)
+VIEW_BUILDER_PROPERTY(SkColor, SelectionBackgroundColor)
+VIEW_BUILDER_PROPERTY(SkColor, SelectionTextColor)
+VIEW_BUILDER_PROPERTY(base::string16, Text)
+VIEW_BUILDER_PROPERTY(SkColor, TextColor)
+VIEW_BUILDER_PROPERTY(int, TextInputFlags)
+VIEW_BUILDER_PROPERTY(ui::TextInputType, TextInputType)
+END_VIEW_BUILDER
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, Textfield)
+
#endif // UI_VIEWS_CONTROLS_TEXTFIELD_TEXTFIELD_H_
diff --git a/chromium/ui/views/controls/textfield/textfield_unittest.cc b/chromium/ui/views/controls/textfield/textfield_unittest.cc
index eee49b4143a..42d1f0f7cad 100644
--- a/chromium/ui/views/controls/textfield/textfield_unittest.cc
+++ b/chromium/ui/views/controls/textfield/textfield_unittest.cc
@@ -2996,6 +2996,21 @@ TEST_F(TextfieldTest, CommitEmptyComposingTextTest) {
EXPECT_EQ(composed_text_length, static_cast<uint32_t>(0));
}
+#if defined(OS_WIN) || defined(OS_CHROMEOS)
+// SetCompositionFromExistingText is only available on Windows and Chrome OS.
+TEST_F(TextfieldTest, SetCompositionFromExistingTextTest) {
+ InitTextfield();
+ textfield_->SetText(ASCIIToUTF16("abc"));
+
+ textfield_->SetCompositionFromExistingText(gfx::Range(1, 3), {});
+
+ gfx::Range actual_range;
+ EXPECT_TRUE(textfield_->HasCompositionText());
+ EXPECT_TRUE(textfield_->GetCompositionTextRange(&actual_range));
+ EXPECT_EQ(actual_range, gfx::Range(1, 3));
+}
+#endif
+
TEST_F(TextfieldTest, GetCompositionCharacterBoundsTest) {
InitTextfield();
ui::CompositionText composition;
diff --git a/chromium/ui/views/controls/throbber.cc b/chromium/ui/views/controls/throbber.cc
index ab4e3d87503..924a718afc8 100644
--- a/chromium/ui/views/controls/throbber.cc
+++ b/chromium/ui/views/controls/throbber.cc
@@ -16,6 +16,7 @@
#include "ui/gfx/paint_vector_icon.h"
#include "ui/native_theme/common_theme.h"
#include "ui/native_theme/native_theme.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
diff --git a/chromium/ui/views/controls/tree/tree_view.cc b/chromium/ui/views/controls/tree/tree_view.cc
index 8d7c8a85eac..6425c114994 100644
--- a/chromium/ui/views/controls/tree/tree_view.cc
+++ b/chromium/ui/views/controls/tree/tree_view.cc
@@ -41,6 +41,7 @@
#include "ui/views/controls/scroll_view.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/controls/tree/tree_view_controller.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/vector_icons.h"
diff --git a/chromium/ui/views/controls/views_text_services_context_menu_mac.mm b/chromium/ui/views/controls/views_text_services_context_menu_mac.mm
index 4f7510d6a1e..464133b410a 100644
--- a/chromium/ui/views/controls/views_text_services_context_menu_mac.mm
+++ b/chromium/ui/views/controls/views_text_services_context_menu_mac.mm
@@ -68,9 +68,10 @@ ViewsTextServicesContextMenuMac::ViewsTextServicesContextMenuMac(
menu->InsertItemAt(
0, IDS_CONTENT_CONTEXT_LOOK_UP,
l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_LOOK_UP, text));
+
+ text_services_menu_.AppendToContextMenu(menu);
}
- text_services_menu_.AppendToContextMenu(menu);
text_services_menu_.AppendEditableItems(menu);
}
diff --git a/chromium/ui/views/controls/webview/web_contents_set_background_color.cc b/chromium/ui/views/controls/webview/web_contents_set_background_color.cc
index 42bb5588788..2a9ff959e44 100644
--- a/chromium/ui/views/controls/webview/web_contents_set_background_color.cc
+++ b/chromium/ui/views/controls/webview/web_contents_set_background_color.cc
@@ -35,6 +35,7 @@ WebContentsSetBackgroundColor::~WebContentsSetBackgroundColor() = default;
void WebContentsSetBackgroundColor::RenderViewReady() {
web_contents()
+ ->GetMainFrame()
->GetRenderViewHost()
->GetWidget()
->GetView()
diff --git a/chromium/ui/views/controls/webview/webview.cc b/chromium/ui/views/controls/webview/webview.cc
index 61e127ee3f2..44a8fc6ef9d 100644
--- a/chromium/ui/views/controls/webview/webview.cc
+++ b/chromium/ui/views/controls/webview/webview.cc
@@ -22,6 +22,7 @@
#include "ui/accessibility/platform/ax_platform_node.h"
#include "ui/events/event.h"
#include "ui/views/focus/focus_manager.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/views_delegate.h"
namespace views {
@@ -92,25 +93,12 @@ void WebView::SetWebContents(content::WebContents* replacement) {
UpdateCrashedOverlayView();
if (wc_owner_.get() != replacement)
wc_owner_.reset();
- if (embed_fullscreen_widget_mode_enabled_) {
- is_embedding_fullscreen_widget_ =
- fullscreen_native_view_for_testing_ ||
- (web_contents() && web_contents()->GetFullscreenRenderWidgetHostView());
- } else {
- DCHECK(!is_embedding_fullscreen_widget_);
- }
AttachWebContentsNativeView();
NotifyAccessibilityWebContentsChanged();
MaybeEnableAutoResize();
}
-void WebView::SetEmbedFullscreenWidgetMode(bool enable) {
- DCHECK(!web_contents())
- << "Cannot change mode while a WebContents is attached.";
- embed_fullscreen_widget_mode_enabled_ = enable;
-}
-
content::BrowserContext* WebView::GetBrowserContext() {
return browser_context_;
}
@@ -174,13 +162,11 @@ void WebView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
// Only WebContentses that are in fullscreen mode and being screen-captured
// will engage the special layout/sizing behavior.
gfx::Rect holder_bounds = GetContentsBounds();
- if (!embed_fullscreen_widget_mode_enabled_ || !web_contents() ||
- !web_contents()->IsBeingCaptured() ||
+ if (!web_contents() || !web_contents()->IsBeingCaptured() ||
web_contents()->GetPreferredSize().IsEmpty() ||
- !(is_embedding_fullscreen_widget_ ||
- (web_contents()->GetDelegate() &&
- web_contents()->GetDelegate()->IsFullscreenForTabOrPending(
- web_contents())))) {
+ !(web_contents()->GetDelegate() &&
+ web_contents()->GetDelegate()->IsFullscreenForTabOrPending(
+ web_contents()))) {
// Reset the native view size.
holder_->SetNativeViewSize(gfx::Size());
holder_->SetBoundsRect(holder_bounds);
@@ -268,6 +254,14 @@ void WebView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
}
}
+void WebView::AddedToWidget() {
+ // If added to a widget hierarchy and |holder_| already has a NativeView
+ // attached, update the accessible parent here to support reparenting the
+ // WebView.
+ if (web_contents() && holder_->native_view())
+ UpdateNativeViewHostAccessibleParent(holder_, parent());
+}
+
gfx::NativeViewAccessible WebView::GetNativeViewAccessible() {
if (web_contents() && !web_contents()->IsCrashed()) {
content::RenderWidgetHostView* host_view =
@@ -301,11 +295,6 @@ void WebView::OnAXModeAdded(ui::AXMode mode) {
////////////////////////////////////////////////////////////////////////////////
// WebView, content::WebContentsDelegate implementation:
-bool WebView::EmbedsFullscreenWidget() {
- DCHECK(wc_owner_.get());
- return embed_fullscreen_widget_mode_enabled_;
-}
-
////////////////////////////////////////////////////////////////////////////////
// WebView, content::WebContentsObserver implementation:
@@ -336,20 +325,12 @@ void WebView::WebContentsDestroyed() {
NotifyAccessibilityWebContentsChanged();
}
-void WebView::DidShowFullscreenWidget() {
- if (embed_fullscreen_widget_mode_enabled_)
- ReattachForFullscreenChange(true);
-}
-
-void WebView::DidDestroyFullscreenWidget() {
- if (embed_fullscreen_widget_mode_enabled_)
- ReattachForFullscreenChange(false);
-}
-
void WebView::DidToggleFullscreenModeForTab(bool entered_fullscreen,
bool will_cause_resize) {
- if (embed_fullscreen_widget_mode_enabled_)
- ReattachForFullscreenChange(entered_fullscreen);
+ // Notify a bounds change on fullscreen change even though it actually
+ // doesn't change. Cast needs this see https://crbug.com/1144255.
+ OnBoundsChanged(bounds());
+ NotifyAccessibilityWebContentsChanged();
}
void WebView::OnWebContentsFocused(
@@ -384,26 +365,12 @@ void WebView::AttachWebContentsNativeView() {
if (!GetWidget() || !web_contents())
return;
- gfx::NativeView view_to_attach;
- if (is_embedding_fullscreen_widget_) {
- view_to_attach = fullscreen_native_view_for_testing_
- ? fullscreen_native_view_for_testing_
- : web_contents()
- ->GetFullscreenRenderWidgetHostView()
- ->GetNativeView();
- } else {
- view_to_attach = web_contents()->GetNativeView();
- }
+ gfx::NativeView view_to_attach = web_contents()->GetNativeView();
OnBoundsChanged(bounds());
if (holder_->native_view() == view_to_attach)
return;
holder_->Attach(view_to_attach);
- // Attach() asynchronously sets the bounds of the widget. Pepper expects
- // fullscreen widgets to be sized immediately, so force a layout now.
- // See https://crbug.com/361408 and https://crbug.com/id=959118.
- if (is_embedding_fullscreen_widget_)
- holder_->Layout();
// We set the parent accessible of the native view to be our parent.
UpdateNativeViewHostAccessibleParent(holder(), parent());
@@ -422,26 +389,6 @@ void WebView::DetachWebContentsNativeView() {
holder_->Detach();
}
-void WebView::ReattachForFullscreenChange(bool enter_fullscreen) {
- DCHECK(embed_fullscreen_widget_mode_enabled_);
- const bool web_contents_has_separate_fs_widget =
- fullscreen_native_view_for_testing_ ||
- (web_contents() && web_contents()->GetFullscreenRenderWidgetHostView());
- if (is_embedding_fullscreen_widget_ || web_contents_has_separate_fs_widget) {
- // Shutting down or starting up the embedding of the separate fullscreen
- // widget. Need to detach and re-attach to a different native view.
- DetachWebContentsNativeView();
- is_embedding_fullscreen_widget_ =
- enter_fullscreen && web_contents_has_separate_fs_widget;
- AttachWebContentsNativeView();
- } else {
- // Entering or exiting "non-Flash" fullscreen mode, where the native view is
- // the same. So, do not change attachment.
- OnBoundsChanged(bounds());
- }
- NotifyAccessibilityWebContentsChanged();
-}
-
void WebView::UpdateCrashedOverlayView() {
if (web_contents() && web_contents()->IsCrashed() && crashed_overlay_view_) {
SetFocusBehavior(FocusBehavior::NEVER);
diff --git a/chromium/ui/views/controls/webview/webview.h b/chromium/ui/views/controls/webview/webview.h
index f18eea14290..9604515c2d5 100644
--- a/chromium/ui/views/controls/webview/webview.h
+++ b/chromium/ui/views/controls/webview/webview.h
@@ -54,12 +54,6 @@ class WEBVIEW_EXPORT WebView : public View,
// those it implicitly creates via GetWebContents() above.
void SetWebContents(content::WebContents* web_contents);
- // If |mode| is true, WebView will register itself with WebContents as a
- // WebContentsObserver, monitor for the showing/destruction of fullscreen
- // render widgets, and alter its child view hierarchy to embed the fullscreen
- // widget or restore the normal WebContentsView.
- void SetEmbedFullscreenWidgetMode(bool mode);
-
content::BrowserContext* GetBrowserContext();
void SetBrowserContext(content::BrowserContext* browser_context);
@@ -141,9 +135,7 @@ class WEBVIEW_EXPORT WebView : public View,
void AboutToRequestFocusFromTabTraversal(bool reverse) override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
gfx::NativeViewAccessible GetNativeViewAccessible() override;
-
- // Overridden from content::WebContentsDelegate:
- bool EmbedsFullscreenWidget() override;
+ void AddedToWidget() override;
// Overridden from content::WebContentsObserver:
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
@@ -152,8 +144,6 @@ class WEBVIEW_EXPORT WebView : public View,
void RenderViewHostChanged(content::RenderViewHost* old_host,
content::RenderViewHost* new_host) override;
void WebContentsDestroyed() override;
- void DidShowFullscreenWidget() override;
- void DidDestroyFullscreenWidget() override;
void DidToggleFullscreenModeForTab(bool entered_fullscreen,
bool will_cause_resize) override;
// Workaround for MSVC++ linker bug/feature that requires
@@ -174,7 +164,6 @@ class WEBVIEW_EXPORT WebView : public View,
void AttachWebContentsNativeView();
void DetachWebContentsNativeView();
- void ReattachForFullscreenChange(bool enter_fullscreen);
void UpdateCrashedOverlayView();
void NotifyAccessibilityWebContentsChanged();
@@ -192,12 +181,6 @@ class WEBVIEW_EXPORT WebView : public View,
AddChildView(std::make_unique<NativeViewHost>());
// Non-NULL if |web_contents()| was created and is owned by this WebView.
std::unique_ptr<content::WebContents> wc_owner_;
- // When true, WebView auto-embeds fullscreen widgets as a child view.
- bool embed_fullscreen_widget_mode_enabled_ = false;
- // Set to true while WebView is embedding a fullscreen widget view as a child
- // view instead of the normal WebContentsView render view. Note: This will be
- // false in the case of non-Flash fullscreen.
- bool is_embedding_fullscreen_widget_ = false;
// Set to true when |holder_| is letterboxed (scaled to be smaller than this
// view, to preserve its aspect ratio).
bool is_letterboxing_ = false;
@@ -215,13 +198,6 @@ class WEBVIEW_EXPORT WebView : public View,
// WebContents's main RenderFrameHost.
ui::AXTreeID child_ax_tree_id_;
- // Used as the fullscreen NativeView if
- // |embed_fullscreen_widget_mode_enabled_| is enabled. This is only set in
- // tests as injecting a different value for
- // WebContents::GetFullscreenRenderWidgetHostView() is rather tricky in
- // unit-tests.
- gfx::NativeView fullscreen_native_view_for_testing_ = nullptr;
-
DISALLOW_COPY_AND_ASSIGN(WebView);
};
diff --git a/chromium/ui/views/controls/webview/webview_unittest.cc b/chromium/ui/views/controls/webview/webview_unittest.cc
index a6bad73e014..d407fb1dd0e 100644
--- a/chromium/ui/views/controls/webview/webview_unittest.cc
+++ b/chromium/ui/views/controls/webview/webview_unittest.cc
@@ -191,10 +191,6 @@ class WebViewUnitTest : public views::test::WidgetTest {
content::WebContents::CreateParams(browser_context_.get()));
}
- void SetFullscreenNativeView(WebView* web_view, gfx::NativeView native_view) {
- web_view->fullscreen_native_view_for_testing_ = native_view;
- }
-
private:
std::unique_ptr<content::RenderViewHostTestEnabler> rvh_enabler_;
std::unique_ptr<content::TestBrowserContext> browser_context_;
@@ -303,196 +299,6 @@ TEST_F(WebViewUnitTest, TestWebViewAttachDetachWebContents) {
parent2->Close();
}
-// Tests that the layout of the NativeViewHost within WebView behaves as
-// expected when embedding a fullscreen widget during WebContents screen
-// capture.
-TEST_F(WebViewUnitTest, EmbeddedFullscreenDuringScreenCapture_Layout) {
- web_view()->SetEmbedFullscreenWidgetMode(true);
- ASSERT_EQ(1u, web_view()->children().size());
-
- const std::unique_ptr<content::WebContents> web_contents(CreateWebContents());
- WebViewTestWebContentsDelegate delegate;
- web_contents->SetDelegate(&delegate);
- web_view()->SetWebContents(web_contents.get());
-
- // Initially, the holder should fill the entire WebView.
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100), holder()->bounds());
-
- // Simulate a transition into fullscreen mode, but without screen capture
- // active on the WebContents, the holder should still fill the entire
- // WebView like before.
- delegate.set_is_fullscreened(true);
- static_cast<content::WebContentsObserver*>(web_view())
- ->DidToggleFullscreenModeForTab(true, false);
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100), holder()->bounds());
-
- // ...and transition back out of fullscreen mode.
- delegate.set_is_fullscreened(false);
- static_cast<content::WebContentsObserver*>(web_view())
- ->DidToggleFullscreenModeForTab(false, false);
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100), holder()->bounds());
-
- // Now, begin screen capture of the WebContents and then enter fullscreen
- // mode. This time, the holder should be centered within WebView and
- // sized to match the capture size.
- const gfx::Size capture_size(64, 48);
- web_contents->IncrementCapturerCount(capture_size, /* stay_hidden */ false);
- delegate.set_is_fullscreened(true);
- static_cast<content::WebContentsObserver*>(web_view())
- ->DidToggleFullscreenModeForTab(true, false);
-
- // The expected size should be scaled to whichever dimension matches the
- // holder first, with the other scaled from the capture size to match the
- // holder. So 100, 100 holder size and 64, 48 capture size gives:
- // 100 / 64 * 48 = 75
- // The positioning centers the unmatched holder/capture dimension, giving:
- // (100 - 75 = 25) / 2 = 12
- EXPECT_EQ(gfx::Rect(0, 12, 100, 75), holder()->bounds());
-
- // Resize the WebView so that its width is smaller than the capture width.
- // Expect the holder to be scaled-down, letterboxed style.
- web_view()->SetBoundsRect(gfx::Rect(0, 0, 32, 100));
- EXPECT_EQ(gfx::Rect(0, 38, 32, 24), holder()->bounds());
-
- // Resize the WebView so that its height is smaller than the capture height.
- // Expect the holder to be scaled-down, pillarboxed style.
- web_view()->SetBoundsRect(gfx::Rect(0, 0, 100, 24));
- EXPECT_EQ(gfx::Rect(34, 0, 32, 24), holder()->bounds());
-
- // Transition back out of fullscreen mode a final time and confirm the bounds
- // of the holder fill the entire WebView once again.
- delegate.set_is_fullscreened(false);
- static_cast<content::WebContentsObserver*>(web_view())
- ->DidToggleFullscreenModeForTab(false, false);
- EXPECT_EQ(gfx::Rect(0, 0, 100, 24), holder()->bounds());
-}
-
-// Tests that a WebView correctly switches between WebContentses when one of
-// them is embedding a fullscreen widget during WebContents screen capture.
-TEST_F(WebViewUnitTest, EmbeddedFullscreenDuringScreenCapture_Switching) {
- web_view()->SetEmbedFullscreenWidgetMode(true);
- ASSERT_EQ(1u, web_view()->children().size());
- const gfx::NativeView unset_native_view = holder()->native_view();
-
- // Create two WebContentses to switch between.
- const std::unique_ptr<content::WebContents> web_contents1(
- CreateWebContents());
- WebViewTestWebContentsDelegate delegate1;
- web_contents1->SetDelegate(&delegate1);
- const std::unique_ptr<content::WebContents> web_contents2(
- CreateWebContents());
- WebViewTestWebContentsDelegate delegate2;
- web_contents2->SetDelegate(&delegate2);
-
- EXPECT_NE(web_contents1->GetNativeView(), holder()->native_view());
- web_view()->SetWebContents(web_contents1.get());
- EXPECT_EQ(web_contents1->GetNativeView(), holder()->native_view());
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100), holder()->bounds());
-
- // Begin screen capture of the WebContents and then enter fullscreen mode.
- // The native view should not have changed, but the layout of its holder will
- // have (indicates WebView has responded).
- const gfx::Size capture_size(64, 48);
- web_contents1->IncrementCapturerCount(capture_size, /* stay_hidden */ false);
- delegate1.set_is_fullscreened(true);
- static_cast<content::WebContentsObserver*>(web_view())
- ->DidToggleFullscreenModeForTab(true, false);
- EXPECT_EQ(web_contents1->GetNativeView(), holder()->native_view());
- EXPECT_EQ(gfx::Rect(0, 12, 100, 75), holder()->bounds());
-
- // When setting the WebContents to nullptr, the native view should become
- // unset.
- web_view()->SetWebContents(nullptr);
- EXPECT_EQ(unset_native_view, holder()->native_view());
-
- // ...and when setting the WebContents back to the currently-fullscreened
- // instance, expect the native view and layout to reflect that.
- web_view()->SetWebContents(web_contents1.get());
- EXPECT_EQ(web_contents1->GetNativeView(), holder()->native_view());
- EXPECT_EQ(gfx::Rect(0, 12, 100, 75), holder()->bounds());
-
- // Now, switch to a different, non-null WebContents instance and check that
- // the native view has changed and the holder is filling WebView again.
- web_view()->SetWebContents(web_contents2.get());
- EXPECT_EQ(web_contents2->GetNativeView(), holder()->native_view());
- EXPECT_EQ(gfx::Rect(0, 0, 100, 100), holder()->bounds());
-
- // Finally, switch back to the first WebContents (still fullscreened).
- web_view()->SetWebContents(web_contents1.get());
- EXPECT_EQ(web_contents1->GetNativeView(), holder()->native_view());
- EXPECT_EQ(gfx::Rect(0, 12, 100, 75), holder()->bounds());
-}
-
-// Tests that clicking anywhere within the bounds of WebView, and either outside
-// or inside the bounds of its child NativeViewHost, causes WebView to gain
-// focus.
-TEST_F(WebViewUnitTest, EmbeddedFullscreenDuringScreenCapture_ClickToFocus) {
- // For this test, add another View that can take focus away from WebView.
- web_view()->SetBoundsRect(gfx::Rect(0, 0, 100, 90));
- views::View* const something_to_focus = new views::View();
- something_to_focus->SetBoundsRect(gfx::Rect(0, 90, 100, 10));
- something_to_focus->SetFocusBehavior(View::FocusBehavior::ALWAYS);
- top_level_widget()->GetContentsView()->AddChildView(something_to_focus);
-
- web_view()->SetEmbedFullscreenWidgetMode(true);
- ASSERT_EQ(1u, web_view()->children().size());
-
- const std::unique_ptr<content::WebContents> web_contents(CreateWebContents());
- WebViewTestWebContentsDelegate delegate;
- web_contents->SetDelegate(&delegate);
- web_view()->SetWebContents(web_contents.get());
-
- // Begin screen capture of the WebContents and then enter fullscreen mode.
- // The holder should be centered within WebView and sized to match the capture
- // size.
- const gfx::Size capture_size(64, 48);
- web_contents->IncrementCapturerCount(capture_size, /* stay_hidden */ false);
- delegate.set_is_fullscreened(true);
- static_cast<content::WebContentsObserver*>(web_view())
- ->DidToggleFullscreenModeForTab(true, false);
- EXPECT_EQ(gfx::Rect(0, 7, 100, 75), holder()->bounds());
-
- // Focus the other widget.
- something_to_focus->RequestFocus();
- EXPECT_FALSE(web_view()->HasFocus());
- EXPECT_FALSE(holder()->HasFocus());
- EXPECT_TRUE(something_to_focus->HasFocus());
-
- // Send mouse press event to WebView outside the bounds of the holder, and
- // confirm WebView took focus.
- const ui::MouseEvent click_outside_holder(
- ui::ET_MOUSE_PRESSED, gfx::Point(1, 1),
- gfx::Point(), // Immaterial.
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
- EXPECT_TRUE(static_cast<views::View*>(web_view())
- ->OnMousePressed(click_outside_holder));
- EXPECT_TRUE(web_view()->HasFocus());
- EXPECT_FALSE(holder()->HasFocus());
- EXPECT_FALSE(something_to_focus->HasFocus());
-
- // Focus the other widget again.
- something_to_focus->RequestFocus();
- EXPECT_FALSE(web_view()->HasFocus());
- EXPECT_FALSE(holder()->HasFocus());
- EXPECT_TRUE(something_to_focus->HasFocus());
-
- // Send a mouse press event within the bounds of the holder and expect no
- // focus change. The reason is that WebView is not supposed to handle mouse
- // events within the bounds of the holder, and it would be up to the
- // WebContents native view to grab the focus instead. In this test
- // environment, the WebContents native view doesn't include the implementation
- // needed to grab focus, so no focus change will occur.
- const ui::MouseEvent click_inside_holder(
- ui::ET_MOUSE_PRESSED, web_view()->bounds().CenterPoint(),
- gfx::Point(), // Immaterial.
- ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
- EXPECT_FALSE(static_cast<views::View*>(web_view())
- ->OnMousePressed(click_inside_holder));
- EXPECT_FALSE(web_view()->HasFocus());
- EXPECT_FALSE(holder()->HasFocus());
- EXPECT_TRUE(something_to_focus->HasFocus());
-}
-
// Verifies that there is no crash in WebView destructor
// if WebView is already removed from Widget.
TEST_F(WebViewUnitTest, DetachedWebViewDestructor) {
@@ -585,44 +391,34 @@ TEST_F(WebViewUnitTest, DefaultConstructability) {
EXPECT_EQ(browser_context.get(), web_contents->GetBrowserContext());
}
-#if defined(USE_AURA)
-namespace {
+// Tests that when a web view is reparented to a different widget hierarchy its
+// holder's parent NativeViewAccessible matches that of its parent view's
+// NativeViewAccessible.
+TEST_F(WebViewUnitTest, ReparentingUpdatesParentAccessible) {
+ const std::unique_ptr<content::WebContents> web_contents(CreateWebContents());
+ auto web_view = std::make_unique<WebView>(web_contents->GetBrowserContext());
+ web_view->SetWebContents(web_contents.get());
-// TODO(sky): factor this for mac.
-gfx::Rect GetNativeViewBounds(gfx::NativeView native_view) {
- return native_view->bounds();
-}
+ WidgetAutoclosePtr widget_1(CreateTopLevelPlatformWidget());
+ View* contents_view_1 = widget_1->GetContentsView();
+ WebView* added_web_view = contents_view_1->AddChildView(std::move(web_view));
-} // namespace
+ // After being added to the widget hierarchy the holder's NativeViewAccessible
+ // should match that of the web view's parent view.
+ EXPECT_EQ(added_web_view->parent()->GetNativeViewAccessible(),
+ added_web_view->holder()->GetParentAccessible());
-TEST_F(WebViewUnitTest, LayoutFullscreenNativeView) {
- web_view()->SetEmbedFullscreenWidgetMode(true);
- // WebView lazily creates WebContents. Force creation.
- web_view()->GetWebContents();
- // Layout is async, force a layout now to ensure bounds are set.
- web_view()->Layout();
- const gfx::Rect initial_bounds =
- GetNativeViewBounds(web_view()->GetWebContents()->GetNativeView());
- EXPECT_NE(gfx::Rect(), initial_bounds);
+ WidgetAutoclosePtr widget_2(CreateTopLevelPlatformWidget());
+ View* contents_view_2 = widget_2->GetContentsView();
- // Create another WebContents for a separate gfx::NativeView. The WebContent's
- // gfx::NativeView is used as the fullscreen widget for web_view().
- const std::unique_ptr<content::WebContents> fullscreen_web_contents(
- CreateWebContents());
- EXPECT_NE(initial_bounds,
- GetNativeViewBounds(fullscreen_web_contents->GetNativeView()));
- SetFullscreenNativeView(web_view(), fullscreen_web_contents->GetNativeView());
-
- // Trigger going fullscreen. Once fullscreen, the fullscreen gfx::NativeView
- // should be immediately resized.
- static_cast<content::WebContentsObserver*>(web_view())
- ->DidShowFullscreenWidget();
- EXPECT_EQ(initial_bounds,
- GetNativeViewBounds(fullscreen_web_contents->GetNativeView()));
-
- static_cast<content::WebContentsObserver*>(web_view())
- ->DidDestroyFullscreenWidget();
+ // Reparent the web view.
+ added_web_view = contents_view_2->AddChildView(
+ contents_view_1->RemoveChildViewT(added_web_view));
+
+ // After reparenting the holder's NativeViewAccessible should match that of
+ // the web view's new parent view.
+ EXPECT_EQ(added_web_view->parent()->GetNativeViewAccessible(),
+ added_web_view->holder()->GetParentAccessible());
}
-#endif
} // namespace views
diff --git a/chromium/ui/views/examples/ax_example.cc b/chromium/ui/views/examples/ax_example.cc
index 03513d07f21..395b2832a8b 100644
--- a/chromium/ui/views/examples/ax_example.cc
+++ b/chromium/ui/views/examples/ax_example.cc
@@ -29,13 +29,14 @@ void AxExample::CreateExampleView(View* container) {
layout->SetMainAxisAlignment(LayoutAlignment::kStart);
layout->SetCrossAxisAlignment(LayoutAlignment::kStart);
- announce_button_ = container->AddChildView(
- std::make_unique<MdTextButton>(this, base::ASCIIToUTF16("AnnounceText")));
-}
-
-void AxExample::ButtonPressed(Button* sender, const ui::Event& event) {
- sender->GetViewAccessibility().AnnounceText(
- base::ASCIIToUTF16("Button pressed."));
+ auto announce_text = [](AxExample* example) {
+ example->announce_button_->GetViewAccessibility().AnnounceText(
+ base::ASCIIToUTF16("Button pressed."));
+ };
+
+ announce_button_ = container->AddChildView(std::make_unique<MdTextButton>(
+ base::BindRepeating(announce_text, base::Unretained(this)),
+ base::ASCIIToUTF16("AnnounceText")));
}
} // namespace examples
diff --git a/chromium/ui/views/examples/ax_example.h b/chromium/ui/views/examples/ax_example.h
index 2be51f6ffba..4b38291ffc2 100644
--- a/chromium/ui/views/examples/ax_example.h
+++ b/chromium/ui/views/examples/ax_example.h
@@ -6,16 +6,16 @@
#define UI_VIEWS_EXAMPLES_AX_EXAMPLE_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
namespace views {
+class Button;
+
namespace examples {
// ButtonExample simply counts the number of clicks.
-class VIEWS_EXAMPLES_EXPORT AxExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT AxExample : public ExampleBase {
public:
AxExample();
~AxExample() override;
@@ -24,9 +24,6 @@ class VIEWS_EXAMPLES_EXPORT AxExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
Button* announce_button_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(AxExample);
diff --git a/chromium/ui/views/examples/box_layout_example.cc b/chromium/ui/views/examples/box_layout_example.cc
index b65adbec395..ba7955edd20 100644
--- a/chromium/ui/views/examples/box_layout_example.cc
+++ b/chromium/ui/views/examples/box_layout_example.cc
@@ -53,11 +53,6 @@ void BoxLayoutExample::ContentsChanged(Textfield* textfield,
RefreshLayoutPanel(false);
}
-void BoxLayoutExample::ButtonPressedImpl(Button* sender) {
- if (sender == collapse_margins_)
- RefreshLayoutPanel(true);
-}
-
void BoxLayoutExample::CreateAdditionalControls() {
constexpr const char* kOrientationValues[2] = {"Horizontal", "Vertical"};
orientation_ = CreateAndAddCombobox(
@@ -89,8 +84,10 @@ void BoxLayoutExample::CreateAdditionalControls() {
CreateMarginsTextFields(base::ASCIIToUTF16("Insets"), &border_insets_);
- collapse_margins_ =
- CreateAndAddCheckbox(base::ASCIIToUTF16("Collapse margins"));
+ collapse_margins_ = CreateAndAddCheckbox(
+ base::ASCIIToUTF16("Collapse margins"),
+ base::BindRepeating(&LayoutExampleBase::RefreshLayoutPanel,
+ base::Unretained(this), true));
UpdateLayoutManager();
}
diff --git a/chromium/ui/views/examples/box_layout_example.h b/chromium/ui/views/examples/box_layout_example.h
index 254bd8d96e2..28d326c842f 100644
--- a/chromium/ui/views/examples/box_layout_example.h
+++ b/chromium/ui/views/examples/box_layout_example.h
@@ -29,7 +29,6 @@ class VIEWS_EXAMPLES_EXPORT BoxLayoutExample : public LayoutExampleBase {
// LayoutExampleBase:
void ContentsChanged(Textfield* sender,
const base::string16& new_contents) override;
- void ButtonPressedImpl(Button* sender) override;
void CreateAdditionalControls() override;
void UpdateLayoutManager() override;
diff --git a/chromium/ui/views/examples/bubble_example.cc b/chromium/ui/views/examples/bubble_example.cc
index 9cb925e7761..c820f71d040 100644
--- a/chromium/ui/views/examples/bubble_example.cc
+++ b/chromium/ui/views/examples/bubble_example.cc
@@ -94,21 +94,38 @@ BubbleExample::~BubbleExample() = default;
void BubbleExample::CreateExampleView(View* container) {
container->SetLayoutManager(std::make_unique<BoxLayout>(
BoxLayout::Orientation::kHorizontal, gfx::Insets(), 10));
- no_shadow_ = container->AddChildView(
- std::make_unique<LabelButton>(this, ASCIIToUTF16("No Shadow")));
- no_shadow_opaque_ = container->AddChildView(
- std::make_unique<LabelButton>(this, ASCIIToUTF16("Opaque Border")));
- big_shadow_ = container->AddChildView(
- std::make_unique<LabelButton>(this, ASCIIToUTF16("Big Shadow")));
- small_shadow_ = container->AddChildView(
- std::make_unique<LabelButton>(this, ASCIIToUTF16("Small Shadow")));
- no_assets_ = container->AddChildView(
- std::make_unique<LabelButton>(this, ASCIIToUTF16("No Assets")));
- persistent_ = container->AddChildView(
- std::make_unique<LabelButton>(this, ASCIIToUTF16("Persistent")));
+
+ no_shadow_ = container->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&BubbleExample::ShowBubble, base::Unretained(this),
+ &no_shadow_, BubbleBorder::NO_SHADOW, false),
+ ASCIIToUTF16("No Shadow")));
+ no_shadow_opaque_ = container->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&BubbleExample::ShowBubble, base::Unretained(this),
+ &no_shadow_opaque_,
+ BubbleBorder::NO_SHADOW_OPAQUE_BORDER, false),
+ ASCIIToUTF16("Opaque Border")));
+ big_shadow_ = container->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&BubbleExample::ShowBubble, base::Unretained(this),
+ &big_shadow_, BubbleBorder::BIG_SHADOW, false),
+ ASCIIToUTF16("Big Shadow")));
+ small_shadow_ = container->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&BubbleExample::ShowBubble, base::Unretained(this),
+ &small_shadow_, BubbleBorder::SMALL_SHADOW, false),
+ ASCIIToUTF16("Small Shadow")));
+ no_assets_ = container->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&BubbleExample::ShowBubble, base::Unretained(this),
+ &no_assets_, BubbleBorder::NO_ASSETS, false),
+ ASCIIToUTF16("No Assets")));
+ persistent_ = container->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&BubbleExample::ShowBubble, base::Unretained(this),
+ &persistent_, BubbleBorder::NO_SHADOW, true),
+ ASCIIToUTF16("Persistent")));
}
-void BubbleExample::ButtonPressed(Button* sender, const ui::Event& event) {
+void BubbleExample::ShowBubble(Button** button,
+ BubbleBorder::Shadow shadow,
+ bool persistent,
+ const ui::Event& event) {
static int arrow_index = 0, color_index = 0;
static const int count = base::size(arrows);
arrow_index = (arrow_index + count + (event.IsShiftDown() ? -1 : 1)) % count;
@@ -119,21 +136,10 @@ void BubbleExample::ButtonPressed(Button* sender, const ui::Event& event) {
arrow = BubbleBorder::FLOAT;
// |bubble| will be destroyed by its widget when the widget is destroyed.
- ExampleBubble* bubble = new ExampleBubble(sender, arrow);
+ ExampleBubble* bubble = new ExampleBubble(*button, arrow);
bubble->set_color(colors[(color_index++) % base::size(colors)]);
-
- if (sender == no_shadow_)
- bubble->set_shadow(BubbleBorder::NO_SHADOW);
- else if (sender == no_shadow_opaque_)
- bubble->set_shadow(BubbleBorder::NO_SHADOW_OPAQUE_BORDER);
- else if (sender == big_shadow_)
- bubble->set_shadow(BubbleBorder::BIG_SHADOW);
- else if (sender == small_shadow_)
- bubble->set_shadow(BubbleBorder::SMALL_SHADOW);
- else if (sender == no_assets_)
- bubble->set_shadow(BubbleBorder::NO_ASSETS);
-
- if (sender == persistent_)
+ bubble->set_shadow(shadow);
+ if (persistent)
bubble->set_close_on_deactivate(false);
BubbleDialogDelegateView::CreateBubble(bubble)->Show();
diff --git a/chromium/ui/views/examples/bubble_example.h b/chromium/ui/views/examples/bubble_example.h
index 6d5717f07aa..f146df6c563 100644
--- a/chromium/ui/views/examples/bubble_example.h
+++ b/chromium/ui/views/examples/bubble_example.h
@@ -6,15 +6,19 @@
#define UI_VIEWS_EXAMPLES_BUBBLE_EXAMPLE_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
+#include "ui/events/event.h"
+#include "ui/views/bubble/bubble_border.h"
#include "ui/views/examples/example_base.h"
+#include "ui/views/examples/views_examples_export.h"
namespace views {
+
+class Button;
+
namespace examples {
// A Bubble example.
-class VIEWS_EXAMPLES_EXPORT BubbleExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT BubbleExample : public ExampleBase {
public:
BubbleExample();
~BubbleExample() override;
@@ -23,8 +27,10 @@ class VIEWS_EXAMPLES_EXPORT BubbleExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ void ShowBubble(Button** button,
+ BubbleBorder::Shadow shadow,
+ bool persistent,
+ const ui::Event& event);
Button* no_shadow_;
Button* no_shadow_opaque_;
diff --git a/chromium/ui/views/examples/button_example.cc b/chromium/ui/views/examples/button_example.cc
index 17f44efed2f..daeaf564670 100644
--- a/chromium/ui/views/examples/button_example.cc
+++ b/chromium/ui/views/examples/button_example.cc
@@ -17,7 +17,11 @@
#include "ui/views/controls/button/md_text_button.h"
#include "ui/views/examples/examples_window.h"
#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/box_layout_view.h"
+#include "ui/views/layout/fill_layout.h"
+#include "ui/views/metadata/view_factory.h"
#include "ui/views/resources/grit/views_resources.h"
+#include "ui/views/style/platform_style.h"
#include "ui/views/view.h"
using base::ASCIIToUTF16;
@@ -41,42 +45,60 @@ ButtonExample::ButtonExample() : ExampleBase("Button") {
ButtonExample::~ButtonExample() = default;
void ButtonExample::CreateExampleView(View* container) {
- container->SetBackground(CreateSolidBackground(SK_ColorWHITE));
- auto layout = std::make_unique<BoxLayout>(BoxLayout::Orientation::kVertical,
- gfx::Insets(10), 10);
- layout->set_cross_axis_alignment(BoxLayout::CrossAxisAlignment::kCenter);
- container->SetLayoutManager(std::move(layout));
-
- auto label_button =
- std::make_unique<LabelButton>(this, ASCIIToUTF16(kLabelButton));
- label_button->SetFocusForPlatform();
- label_button->SetRequestFocusOnPress(true);
- label_button_ = container->AddChildView(std::move(label_button));
-
- md_button_ = container->AddChildView(std::make_unique<views::MdTextButton>(
- this, base::ASCIIToUTF16("Material Design")));
-
- auto md_disabled_button = std::make_unique<views::MdTextButton>(
- this, ASCIIToUTF16("Material Design Disabled Button"));
- md_disabled_button->SetState(Button::STATE_DISABLED);
- md_disabled_button_ = container->AddChildView(std::move(md_disabled_button));
-
- auto md_default_button = std::make_unique<views::MdTextButton>(
- this, base::ASCIIToUTF16("Default"));
- md_default_button->SetIsDefault(true);
- md_default_button_ = container->AddChildView(std::move(md_default_button));
-
+ container->SetLayoutManager(std::make_unique<FillLayout>());
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- auto image_button = std::make_unique<ImageButton>(this);
- image_button->SetFocusForPlatform();
- image_button->SetRequestFocusOnPress(true);
- image_button->SetImage(ImageButton::STATE_NORMAL,
- rb.GetImageNamed(IDR_CLOSE).ToImageSkia());
- image_button->SetImage(ImageButton::STATE_HOVERED,
- rb.GetImageNamed(IDR_CLOSE_H).ToImageSkia());
- image_button->SetImage(ImageButton::STATE_PRESSED,
- rb.GetImageNamed(IDR_CLOSE_P).ToImageSkia());
- image_button_ = container->AddChildView(std::move(image_button));
+
+ auto start_throbber_cb = [](MdTextButton* button) {
+ button->StartThrobbing(5);
+ };
+ auto view =
+ Builder<BoxLayoutView>()
+ .SetOrientation(BoxLayout::Orientation::kVertical)
+ .SetInsideBorderInsets(gfx::Insets(10))
+ .SetBetweenChildSpacing(10)
+ .SetCrossAxisAlignment(BoxLayout::CrossAxisAlignment::kCenter)
+ .SetBackground(CreateSolidBackground(SK_ColorWHITE))
+ .AddChildren(
+ {Builder<LabelButton>()
+ .CopyAddressTo(&label_button_)
+ .SetText(ASCIIToUTF16(kLabelButton))
+ .SetRequestFocusOnPress(true)
+ .SetCallback(base::BindRepeating(
+ &ButtonExample::LabelButtonPressed,
+ base::Unretained(this), label_button_)),
+ Builder<MdTextButton>()
+ .CopyAddressTo(&md_button_)
+ .SetText(base::ASCIIToUTF16("Material Design"))
+ .SetCallback(
+ base::BindRepeating(start_throbber_cb, md_button_)),
+ Builder<MdTextButton>()
+ .CopyAddressTo(&md_disabled_button_)
+ .SetText(ASCIIToUTF16("Material Design Disabled Button"))
+ .SetState(Button::STATE_DISABLED)
+ .SetCallback(base::BindRepeating(start_throbber_cb,
+ md_disabled_button_)),
+ Builder<MdTextButton>()
+ .CopyAddressTo(&md_default_button_)
+ .SetText(base::ASCIIToUTF16("Default"))
+ .SetIsDefault(true)
+ .SetCallback(base::BindRepeating(start_throbber_cb,
+ md_default_button_)),
+ Builder<ImageButton>()
+ .CopyAddressTo(&image_button_)
+ .SetRequestFocusOnPress(true)
+ .SetCallback(
+ base::BindRepeating(&ButtonExample::ImageButtonPressed,
+ base::Unretained(this)))})
+ .Build();
+
+ image_button_->SetImage(ImageButton::STATE_NORMAL,
+ rb.GetImageNamed(IDR_CLOSE).ToImageSkia());
+ image_button_->SetImage(ImageButton::STATE_HOVERED,
+ rb.GetImageNamed(IDR_CLOSE_H).ToImageSkia());
+ image_button_->SetImage(ImageButton::STATE_PRESSED,
+ rb.GetImageNamed(IDR_CLOSE_P).ToImageSkia());
+
+ container->AddChildView(std::move(view));
}
void ButtonExample::LabelButtonPressed(LabelButton* label_button,
@@ -102,9 +124,10 @@ void ButtonExample::LabelButtonPressed(LabelButton* label_button,
} else if (event.IsShiftDown()) {
if (event.IsAltDown()) {
// Toggle focusability.
- label_button_->IsAccessibilityFocusable()
- ? label_button_->SetFocusBehavior(View::FocusBehavior::NEVER)
- : label_button_->SetFocusForPlatform();
+ label_button->IsAccessibilityFocusable()
+ ? label_button->SetFocusBehavior(View::FocusBehavior::NEVER)
+ : label_button->SetFocusBehavior(
+ PlatformStyle::DefaultFocusBehavior());
}
} else if (event.IsAltDown()) {
label_button->SetIsDefault(!label_button->GetIsDefault());
@@ -112,15 +135,8 @@ void ButtonExample::LabelButtonPressed(LabelButton* label_button,
example_view()->GetLayoutManager()->Layout(example_view());
}
-void ButtonExample::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == label_button_)
- LabelButtonPressed(label_button_, event);
- else if (sender == md_button_ || sender == md_default_button_)
- static_cast<Button*>(sender)->StartThrobbing(5);
- else if (sender == md_disabled_button_)
- LabelButtonPressed(md_disabled_button_, event);
- else
- PrintStatus("Image Button Pressed! count: %d", ++count_);
+void ButtonExample::ImageButtonPressed() {
+ PrintStatus("Image Button Pressed! count: %d", ++count_);
}
} // namespace examples
diff --git a/chromium/ui/views/examples/button_example.h b/chromium/ui/views/examples/button_example.h
index 649a842fae5..f3693d6fdb8 100644
--- a/chromium/ui/views/examples/button_example.h
+++ b/chromium/ui/views/examples/button_example.h
@@ -6,9 +6,16 @@
#define UI_VIEWS_EXAMPLES_BUTTON_EXAMPLE_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
+namespace gfx {
+class ImageSkia;
+} // namespace gfx
+
+namespace ui {
+class Event;
+} // namespace ui
+
namespace views {
class ImageButton;
@@ -18,8 +25,7 @@ class MdTextButton;
namespace examples {
// ButtonExample simply counts the number of clicks.
-class VIEWS_EXAMPLES_EXPORT ButtonExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT ButtonExample : public ExampleBase {
public:
ButtonExample();
~ButtonExample() override;
@@ -29,9 +35,7 @@ class VIEWS_EXAMPLES_EXPORT ButtonExample : public ExampleBase,
private:
void LabelButtonPressed(LabelButton* label_button, const ui::Event& event);
-
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ void ImageButtonPressed();
// Example buttons.
LabelButton* label_button_ = nullptr;
diff --git a/chromium/ui/views/examples/button_sticker_sheet.cc b/chromium/ui/views/examples/button_sticker_sheet.cc
index 2c5fc4ba542..bdc711f3c07 100644
--- a/chromium/ui/views/examples/button_sticker_sheet.cc
+++ b/chromium/ui/views/examples/button_sticker_sheet.cc
@@ -76,16 +76,17 @@ void AddLabeledRowToGridLayout(GridLayout* layout,
// button in |*primary| is a call-to-action button, and the button in
// |*secondary| is a regular button.
std::vector<std::unique_ptr<MdTextButton>> MakeButtonsInState(
- ButtonListener* listener,
Button::ButtonState state) {
std::vector<std::unique_ptr<MdTextButton>> buttons;
const base::string16 button_text = base::ASCIIToUTF16("Button");
- auto primary = std::make_unique<views::MdTextButton>(listener, button_text);
+ auto primary = std::make_unique<views::MdTextButton>(
+ Button::PressedCallback(), button_text);
primary->SetProminent(true);
primary->SetState(state);
buttons.push_back(std::move(primary));
- auto secondary = std::make_unique<views::MdTextButton>(listener, button_text);
+ auto secondary = std::make_unique<views::MdTextButton>(
+ Button::PressedCallback(), button_text);
secondary->SetState(state);
buttons.push_back(std::move(secondary));
return buttons;
@@ -108,19 +109,15 @@ void ButtonStickerSheet::CreateExampleView(View* container) {
AddLabeledRowToGridLayout(layout, std::string(), std::move(plainLabel));
AddLabeledRowToGridLayout(layout, "Default",
- MakeButtonsInState(this, Button::STATE_NORMAL));
+ MakeButtonsInState(Button::STATE_NORMAL));
AddLabeledRowToGridLayout(layout, "Normal",
- MakeButtonsInState(this, Button::STATE_NORMAL));
+ MakeButtonsInState(Button::STATE_NORMAL));
AddLabeledRowToGridLayout(layout, "Hovered",
- MakeButtonsInState(this, Button::STATE_HOVERED));
+ MakeButtonsInState(Button::STATE_HOVERED));
AddLabeledRowToGridLayout(layout, "Pressed",
- MakeButtonsInState(this, Button::STATE_PRESSED));
+ MakeButtonsInState(Button::STATE_PRESSED));
AddLabeledRowToGridLayout(layout, "Disabled",
- MakeButtonsInState(this, Button::STATE_DISABLED));
-}
-
-void ButtonStickerSheet::ButtonPressed(Button* button, const ui::Event& event) {
- // Ignore button presses.
+ MakeButtonsInState(Button::STATE_DISABLED));
}
} // namespace examples
diff --git a/chromium/ui/views/examples/button_sticker_sheet.h b/chromium/ui/views/examples/button_sticker_sheet.h
index 3b8888e06ee..692ac731bb0 100644
--- a/chromium/ui/views/examples/button_sticker_sheet.h
+++ b/chromium/ui/views/examples/button_sticker_sheet.h
@@ -6,7 +6,6 @@
#define UI_VIEWS_EXAMPLES_BUTTON_STICKER_SHEET_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
namespace views {
@@ -16,8 +15,7 @@ namespace examples {
// design button styles. This example only looks right with `--secondary-ui-md`.
// It is designed to be as visually similar to the UI Harmony spec's sticker
// sheet for buttons as possible.
-class VIEWS_EXAMPLES_EXPORT ButtonStickerSheet : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT ButtonStickerSheet : public ExampleBase {
public:
ButtonStickerSheet();
~ButtonStickerSheet() override;
@@ -25,9 +23,6 @@ class VIEWS_EXAMPLES_EXPORT ButtonStickerSheet : public ExampleBase,
// ExampleBase:
void CreateExampleView(View* container) override;
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
private:
DISALLOW_COPY_AND_ASSIGN(ButtonStickerSheet);
};
diff --git a/chromium/ui/views/examples/checkbox_example.cc b/chromium/ui/views/examples/checkbox_example.cc
index 676f0f79cc7..a9862e1a72a 100644
--- a/chromium/ui/views/examples/checkbox_example.cc
+++ b/chromium/ui/views/examples/checkbox_example.cc
@@ -6,6 +6,7 @@
#include <memory>
+#include "base/bind.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/views/controls/button/checkbox.h"
@@ -22,12 +23,13 @@ CheckboxExample::~CheckboxExample() = default;
void CheckboxExample::CreateExampleView(View* container) {
container->SetLayoutManager(std::make_unique<FillLayout>());
- button_ = container->AddChildView(
- std::make_unique<Checkbox>(base::ASCIIToUTF16("Checkbox"), this));
-}
-
-void CheckboxExample::ButtonPressed(Button* sender, const ui::Event& event) {
- PrintStatus("Pressed! count: %d", ++count_);
+ container->AddChildView(
+ views::Builder<Checkbox>()
+ .SetText(base::ASCIIToUTF16("Checkbox"))
+ .SetCallback(base::BindRepeating(
+ [](int* count) { PrintStatus("Pressed! count: %d", ++(*count)); },
+ &count_))
+ .Build());
}
} // namespace examples
diff --git a/chromium/ui/views/examples/checkbox_example.h b/chromium/ui/views/examples/checkbox_example.h
index 2a88f5adc68..414fd290f37 100644
--- a/chromium/ui/views/examples/checkbox_example.h
+++ b/chromium/ui/views/examples/checkbox_example.h
@@ -6,8 +6,8 @@
#define UI_VIEWS_EXAMPLES_CHECKBOX_EXAMPLE_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
+#include "ui/views/examples/views_examples_export.h"
namespace views {
class Checkbox;
@@ -15,8 +15,7 @@ class Checkbox;
namespace examples {
// CheckboxExample exercises a Checkbox control.
-class VIEWS_EXAMPLES_EXPORT CheckboxExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT CheckboxExample : public ExampleBase {
public:
CheckboxExample();
~CheckboxExample() override;
@@ -25,12 +24,7 @@ class VIEWS_EXAMPLES_EXPORT CheckboxExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
- // The only control in this test.
- Checkbox* button_ = nullptr;
-
+ // The number of times the contained checkbox has been clicked.
int count_ = 0;
DISALLOW_COPY_AND_ASSIGN(CheckboxExample);
diff --git a/chromium/ui/views/examples/colored_dialog_example.cc b/chromium/ui/views/examples/colored_dialog_example.cc
index 7f623e3cd6f..c1ca5336e8c 100644
--- a/chromium/ui/views/examples/colored_dialog_example.cc
+++ b/chromium/ui/views/examples/colored_dialog_example.cc
@@ -27,11 +27,12 @@
namespace views {
namespace examples {
-class ThemeTrackingCheckbox : public views::Checkbox,
- public views::ButtonListener {
+class ThemeTrackingCheckbox : public views::Checkbox {
public:
explicit ThemeTrackingCheckbox(const base::string16& label)
- : Checkbox(label, this) {}
+ : Checkbox(label,
+ base::BindRepeating(&ThemeTrackingCheckbox::ButtonPressed,
+ base::Unretained(this))) {}
ThemeTrackingCheckbox(const ThemeTrackingCheckbox&) = delete;
ThemeTrackingCheckbox& operator=(const ThemeTrackingCheckbox&) = delete;
~ThemeTrackingCheckbox() override = default;
@@ -39,12 +40,10 @@ class ThemeTrackingCheckbox : public views::Checkbox,
// views::Checkbox
void OnThemeChanged() override {
views::Checkbox::OnThemeChanged();
-
SetChecked(GetNativeTheme()->ShouldUseDarkColors());
}
- // ButtonListener
- void ButtonPressed(views::Button* sender, const ui::Event& event) override {
+ void ButtonPressed() {
GetNativeTheme()->set_use_dark_colors(GetChecked());
GetWidget()->ThemeChanged();
}
@@ -52,10 +51,10 @@ class ThemeTrackingCheckbox : public views::Checkbox,
class TextVectorImageButton : public views::MdTextButton {
public:
- TextVectorImageButton(ButtonListener* listener,
+ TextVectorImageButton(PressedCallback callback,
const base::string16& text,
const gfx::VectorIcon& icon)
- : MdTextButton(listener, text), icon_(icon) {}
+ : MdTextButton(callback, text), icon_(icon) {}
TextVectorImageButton(const TextVectorImageButton&) = delete;
TextVectorImageButton& operator=(const TextVectorImageButton&) = delete;
~TextVectorImageButton() override = default;
@@ -125,7 +124,9 @@ ColoredDialogChooser::ColoredDialogChooser() {
l10n_util::GetStringUTF16(IDS_COLORED_DIALOG_CHOOSER_CHECKBOX)));
AddChildView(std::make_unique<TextVectorImageButton>(
- this, l10n_util::GetStringUTF16(IDS_COLORED_DIALOG_CHOOSER_BUTTON),
+ base::BindRepeating(&ColoredDialogChooser::ButtonPressed,
+ base::Unretained(this)),
+ l10n_util::GetStringUTF16(IDS_COLORED_DIALOG_CHOOSER_BUTTON),
views::kInfoIcon));
confirmation_label_ = AddChildView(
@@ -135,8 +136,7 @@ ColoredDialogChooser::ColoredDialogChooser() {
ColoredDialogChooser::~ColoredDialogChooser() = default;
-void ColoredDialogChooser::ButtonPressed(Button* sender,
- const ui::Event& event) {
+void ColoredDialogChooser::ButtonPressed() {
// Create the colored dialog.
views::Widget* widget = DialogDelegate::CreateDialogWidget(
new ColoredDialog(base::BindOnce(&ColoredDialogChooser::OnFeedbackSubmit,
diff --git a/chromium/ui/views/examples/colored_dialog_example.h b/chromium/ui/views/examples/colored_dialog_example.h
index 42a4ddf1e62..64184159df3 100644
--- a/chromium/ui/views/examples/colored_dialog_example.h
+++ b/chromium/ui/views/examples/colored_dialog_example.h
@@ -6,7 +6,6 @@
#define UI_VIEWS_EXAMPLES_COLORED_DIALOG_EXAMPLE_H_
#include "base/timer/timer.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/examples/example_base.h"
#include "ui/views/view.h"
@@ -14,7 +13,6 @@
namespace views {
-class Button;
class Label;
namespace examples {
@@ -41,15 +39,14 @@ class ColoredDialog : public views::DialogDelegateView,
views::Textfield* textfield_;
};
-class ColoredDialogChooser : public views::View, public views::ButtonListener {
+class ColoredDialogChooser : public views::View {
public:
ColoredDialogChooser();
ColoredDialogChooser(const ColoredDialogChooser&) = delete;
ColoredDialogChooser& operator=(const ColoredDialogChooser&) = delete;
~ColoredDialogChooser() override;
- // ButtonListener
- void ButtonPressed(views::Button* sender, const ui::Event& event) override;
+ void ButtonPressed();
private:
void OnFeedbackSubmit(base::string16 text);
diff --git a/chromium/ui/views/examples/combobox_example.cc b/chromium/ui/views/examples/combobox_example.cc
index 2af95c16f05..2ee32316b37 100644
--- a/chromium/ui/views/examples/combobox_example.cc
+++ b/chromium/ui/views/examples/combobox_example.cc
@@ -5,13 +5,15 @@
#include "ui/views/examples/combobox_example.h"
#include <memory>
+#include <utility>
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/controls/combobox/combobox.h"
#include "ui/views/examples/examples_window.h"
-#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/box_layout_view.h"
+#include "ui/views/layout/fill_layout.h"
namespace views {
namespace examples {
@@ -41,27 +43,36 @@ ComboboxExample::ComboboxExample() : ExampleBase("Combo Box") {}
ComboboxExample::~ComboboxExample() = default;
void ComboboxExample::CreateExampleView(View* container) {
- container->SetLayoutManager(std::make_unique<BoxLayout>(
- BoxLayout::Orientation::kVertical, gfx::Insets(10, 0), 5));
+ container->SetLayoutManager(std::make_unique<FillLayout>());
- combobox_ = container->AddChildView(
- std::make_unique<Combobox>(std::make_unique<ComboboxModelExample>()));
- combobox_->set_callback(base::BindRepeating(&ComboboxExample::ValueChanged,
- base::Unretained(this)));
- combobox_->SetSelectedIndex(3);
+ auto view =
+ Builder<BoxLayoutView>()
+ .SetOrientation(BoxLayout::Orientation::kVertical)
+ .SetInsideBorderInsets(gfx::Insets(10, 0))
+ .SetBetweenChildSpacing(5)
+ .AddChildren(
+ {Builder<Combobox>()
+ .CopyAddressTo(&combobox_)
+ .SetOwnedModel(std::make_unique<ComboboxModelExample>())
+ .SetSelectedIndex(3)
+ .SetCallback(base::BindRepeating(
+ &ComboboxExample::ValueChanged, base::Unretained(this))),
+ Builder<Combobox>()
+ .SetOwnedModel(std::make_unique<ComboboxModelExample>())
+ .SetEnabled(false)
+ .SetSelectedIndex(4)
+ .SetCallback(
+ base::BindRepeating(&ComboboxExample::ValueChanged,
+ base::Unretained(this)))})
+ .Build();
- auto* disabled_combobox = container->AddChildView(
- std::make_unique<Combobox>(std::make_unique<ComboboxModelExample>()));
- disabled_combobox->set_callback(base::BindRepeating(
- &ComboboxExample::ValueChanged, base::Unretained(this)));
- disabled_combobox->SetSelectedIndex(4);
- disabled_combobox->SetEnabled(false);
+ container->AddChildView(std::move(view));
}
void ComboboxExample::ValueChanged() {
PrintStatus("Selected: %s",
- base::UTF16ToUTF8(
- combobox_->model()->GetItemAt(combobox_->GetSelectedIndex()))
+ base::UTF16ToUTF8(combobox_->GetModel()->GetItemAt(
+ combobox_->GetSelectedIndex()))
.c_str());
}
diff --git a/chromium/ui/views/examples/dialog_example.cc b/chromium/ui/views/examples/dialog_example.cc
index d4cfe71980a..d5940b0f14d 100644
--- a/chromium/ui/views/examples/dialog_example.cc
+++ b/chromium/ui/views/examples/dialog_example.cc
@@ -58,7 +58,7 @@ class DialogExample::Delegate : public virtual DialogType {
if (parent_->has_extra_button_->GetChecked()) {
DialogDelegate::SetExtraView(std::make_unique<views::MdTextButton>(
- nullptr, parent_->extra_button_label_->GetText()));
+ Button::PressedCallback(), parent_->extra_button_label_->GetText()));
}
}
@@ -153,8 +153,8 @@ void DialogExample::CreateExampleView(View* container) {
StartRowWithLabel(layout, "Modal Type");
mode_ = layout->AddView(std::make_unique<Combobox>(&mode_model_));
- mode_->set_callback(base::BindRepeating(&DialogExample::OnPerformAction,
- base::Unretained(this)));
+ mode_->SetCallback(base::BindRepeating(&DialogExample::OnPerformAction,
+ base::Unretained(this)));
mode_->SetSelectedIndex(ui::MODAL_TYPE_CHILD);
StartRowWithLabel(layout, "Bubble");
@@ -169,8 +169,10 @@ void DialogExample::CreateExampleView(View* container) {
kFixed, kButtonsColumnId, kFixed,
provider->GetDistanceMetric(views::DISTANCE_UNRELATED_CONTROL_VERTICAL));
- show_ = layout->AddView(
- std::make_unique<views::MdTextButton>(this, base::ASCIIToUTF16("Show")));
+ show_ = layout->AddView(std::make_unique<views::MdTextButton>(
+ base::BindRepeating(&DialogExample::ShowButtonPressed,
+ base::Unretained(this)),
+ base::ASCIIToUTF16("Show")));
}
void DialogExample::StartRowWithLabel(GridLayout* layout, const char* label) {
@@ -194,7 +196,10 @@ void DialogExample::StartTextfieldRow(GridLayout* layout,
}
void DialogExample::AddCheckbox(GridLayout* layout, Checkbox** member) {
- auto checkbox = std::make_unique<Checkbox>(base::string16(), this);
+ auto callback = member == &bubble_ ? &DialogExample::BubbleCheckboxPressed
+ : &DialogExample::OtherCheckboxPressed;
+ auto checkbox = std::make_unique<Checkbox>(
+ base::string16(), base::BindRepeating(callback, base::Unretained(this)));
checkbox->SetChecked(true);
*member = layout->AddView(std::move(checkbox));
}
@@ -243,49 +248,48 @@ void DialogExample::ResizeDialog() {
widget->OnSizeConstraintsChanged();
}
-void DialogExample::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == show_) {
- if (bubble_->GetChecked()) {
- // |bubble| will be destroyed by its widget when the widget is destroyed.
- Bubble* bubble = new Bubble(this, sender);
- last_dialog_ = bubble;
- BubbleDialogDelegateView::CreateBubble(bubble);
- } else {
- // |dialog| will be destroyed by its widget when the widget is destroyed.
- Dialog* dialog = new Dialog(this);
- last_dialog_ = dialog;
- dialog->InitDelegate();
-
- // constrained_window::CreateBrowserModalDialogViews() allows dialogs to
- // be created as MODAL_TYPE_WINDOW without specifying a parent.
- gfx::NativeView parent = nullptr;
- if (mode_->GetSelectedIndex() != kFakeModeless)
- parent = example_view()->GetWidget()->GetNativeView();
-
- DialogDelegate::CreateDialogWidget(
- dialog, example_view()->GetWidget()->GetNativeWindow(), parent);
- }
- last_dialog_->GetWidget()->Show();
- return;
+void DialogExample::ShowButtonPressed() {
+ if (bubble_->GetChecked()) {
+ // |bubble| will be destroyed by its widget when the widget is destroyed.
+ Bubble* bubble = new Bubble(this, show_);
+ last_dialog_ = bubble;
+ BubbleDialogDelegateView::CreateBubble(bubble);
+ } else {
+ // |dialog| will be destroyed by its widget when the widget is destroyed.
+ Dialog* dialog = new Dialog(this);
+ last_dialog_ = dialog;
+ dialog->InitDelegate();
+
+ // constrained_window::CreateBrowserModalDialogViews() allows dialogs to
+ // be created as MODAL_TYPE_WINDOW without specifying a parent.
+ gfx::NativeView parent = nullptr;
+ if (mode_->GetSelectedIndex() != kFakeModeless)
+ parent = example_view()->GetWidget()->GetNativeView();
+
+ DialogDelegate::CreateDialogWidget(
+ dialog, example_view()->GetWidget()->GetNativeWindow(), parent);
}
+ last_dialog_->GetWidget()->Show();
+}
- if (sender == bubble_) {
- if (bubble_->GetChecked() && GetModalType() != ui::MODAL_TYPE_CHILD) {
- mode_->SetSelectedIndex(ui::MODAL_TYPE_CHILD);
- LogStatus("You nearly always want Child Modal for bubbles.");
- }
- persistent_bubble_->SetEnabled(bubble_->GetChecked());
- OnPerformAction(); // Validate the modal type.
+void DialogExample::BubbleCheckboxPressed() {
+ if (bubble_->GetChecked() && GetModalType() != ui::MODAL_TYPE_CHILD) {
+ mode_->SetSelectedIndex(ui::MODAL_TYPE_CHILD);
+ LogStatus("You nearly always want Child Modal for bubbles.");
+ }
+ persistent_bubble_->SetEnabled(bubble_->GetChecked());
+ OnPerformAction(); // Validate the modal type.
- if (!bubble_->GetChecked() && GetModalType() == ui::MODAL_TYPE_CHILD) {
- // Do something reasonable when simply unchecking bubble and re-enable.
- mode_->SetSelectedIndex(ui::MODAL_TYPE_WINDOW);
- OnPerformAction();
- }
- return;
+ if (!bubble_->GetChecked() && GetModalType() == ui::MODAL_TYPE_CHILD) {
+ // Do something reasonable when simply unchecking bubble and re-enable.
+ mode_->SetSelectedIndex(ui::MODAL_TYPE_WINDOW);
+ OnPerformAction();
}
+}
- // Other buttons are all checkboxes. Update the dialog if there is one.
+void DialogExample::OtherCheckboxPressed() {
+ // Buttons other than show and bubble are pressed. They are all checkboxes.
+ // Update the dialog if there is one.
if (last_dialog_) {
last_dialog_->DialogModelChanged();
ResizeDialog();
diff --git a/chromium/ui/views/examples/dialog_example.h b/chromium/ui/views/examples/dialog_example.h
index a4c89058904..25c2490ac42 100644
--- a/chromium/ui/views/examples/dialog_example.h
+++ b/chromium/ui/views/examples/dialog_example.h
@@ -7,7 +7,7 @@
#include "base/macros.h"
#include "ui/base/models/simple_combobox_model.h"
-#include "ui/views/controls/button/button.h"
+#include "ui/base/ui_base_types.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/examples/example_base.h"
@@ -25,7 +25,6 @@ namespace examples {
// An example that exercises BubbleDialogDelegateView or DialogDelegateView.
class VIEWS_EXAMPLES_EXPORT DialogExample : public ExampleBase,
- public ButtonListener,
public TextfieldController {
public:
DialogExample();
@@ -61,8 +60,9 @@ class VIEWS_EXAMPLES_EXPORT DialogExample : public ExampleBase,
// Resize the dialog Widget to match the preferred size. Triggers Layout().
void ResizeDialog();
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ void ShowButtonPressed();
+ void BubbleCheckboxPressed();
+ void OtherCheckboxPressed();
// TextfieldController:
void ContentsChanged(Textfield* sender,
diff --git a/chromium/ui/views/examples/examples_window.cc b/chromium/ui/views/examples/examples_window.cc
index 8a3b78f8615..aa986da800b 100644
--- a/chromium/ui/views/examples/examples_window.cc
+++ b/chromium/ui/views/examples/examples_window.cc
@@ -120,7 +120,7 @@ class ExamplesWindowContents : public WidgetDelegateView {
auto combobox = std::make_unique<Combobox>(std::move(combobox_model));
instance_ = this;
- combobox->set_callback(base::BindRepeating(
+ combobox->SetCallback(base::BindRepeating(
&ExamplesWindowContents::ComboboxChanged, base::Unretained(this)));
SetBackground(CreateThemedSolidBackground(
diff --git a/chromium/ui/views/examples/flex_layout_example.cc b/chromium/ui/views/examples/flex_layout_example.cc
index 52cd4d91548..af233be5797 100644
--- a/chromium/ui/views/examples/flex_layout_example.cc
+++ b/chromium/ui/views/examples/flex_layout_example.cc
@@ -41,16 +41,6 @@ void FlexLayoutExample::ContentsChanged(Textfield* sender,
RefreshLayoutPanel(false);
}
-void FlexLayoutExample::ButtonPressedImpl(Button* sender) {
- if (sender == collapse_margins_) {
- layout_->SetCollapseMargins(collapse_margins_->GetChecked());
- } else if (sender == ignore_default_main_axis_margins_) {
- layout_->SetIgnoreDefaultMainAxisMargins(
- ignore_default_main_axis_margins_->GetChecked());
- }
- RefreshLayoutPanel(false);
-}
-
void FlexLayoutExample::CreateAdditionalControls() {
constexpr const char* kOrientationValues[2] = {"Horizontal", "Vertical"};
orientation_ = CreateAndAddCombobox(
@@ -81,10 +71,24 @@ void FlexLayoutExample::CreateAdditionalControls() {
&default_child_margins_);
collapse_margins_ =
- CreateAndAddCheckbox(base::ASCIIToUTF16("Collapse margins"));
-
- ignore_default_main_axis_margins_ =
- CreateAndAddCheckbox(base::ASCIIToUTF16("Ignore main axis margins"));
+ CreateAndAddCheckbox(base::ASCIIToUTF16("Collapse margins"),
+ base::BindRepeating(
+ [](FlexLayoutExample* example) {
+ example->layout_->SetCollapseMargins(
+ example->collapse_margins_->GetChecked());
+ example->RefreshLayoutPanel(false);
+ },
+ base::Unretained(this)));
+
+ ignore_default_main_axis_margins_ = CreateAndAddCheckbox(
+ base::ASCIIToUTF16("Ignore main axis margins"),
+ base::BindRepeating(
+ [](FlexLayoutExample* example) {
+ example->layout_->SetIgnoreDefaultMainAxisMargins(
+ example->ignore_default_main_axis_margins_->GetChecked());
+ example->RefreshLayoutPanel(false);
+ },
+ base::Unretained(this)));
layout_ = layout_panel()->SetLayoutManager(std::make_unique<FlexLayout>());
}
diff --git a/chromium/ui/views/examples/flex_layout_example.h b/chromium/ui/views/examples/flex_layout_example.h
index 64cc32e3625..fe32000e45e 100644
--- a/chromium/ui/views/examples/flex_layout_example.h
+++ b/chromium/ui/views/examples/flex_layout_example.h
@@ -30,7 +30,6 @@ class VIEWS_EXAMPLES_EXPORT FlexLayoutExample : public LayoutExampleBase {
// LayoutExampleBase:
void ContentsChanged(Textfield* sender,
const base::string16& new_contents) override;
- void ButtonPressedImpl(Button* sender) override;
void CreateAdditionalControls() override;
void UpdateLayoutManager() override;
diff --git a/chromium/ui/views/examples/label_example.cc b/chromium/ui/views/examples/label_example.cc
index ee036c59ed7..7ea30bc47af 100644
--- a/chromium/ui/views/examples/label_example.cc
+++ b/chromium/ui/views/examples/label_example.cc
@@ -125,21 +125,21 @@ void LabelExample::CreateExampleView(View* container) {
AddCustomLabel(container);
}
-void LabelExample::ButtonPressed(Button* button, const ui::Event& event) {
- if (button == multiline_) {
- custom_label_->SetMultiLine(multiline_->GetChecked());
- } else if (button == shadows_) {
- gfx::ShadowValues shadows;
- if (shadows_->GetChecked()) {
- shadows.push_back(gfx::ShadowValue(gfx::Vector2d(), 1, SK_ColorRED));
- shadows.push_back(gfx::ShadowValue(gfx::Vector2d(2, 2), 0, SK_ColorGRAY));
- }
- custom_label_->SetShadows(shadows);
- } else if (button == selectable_) {
- custom_label_->SetSelectable(selectable_->GetChecked());
+void LabelExample::MultilineCheckboxPressed() {
+ custom_label_->SetMultiLine(multiline_->GetChecked());
+}
+
+void LabelExample::ShadowsCheckboxPressed() {
+ gfx::ShadowValues shadows;
+ if (shadows_->GetChecked()) {
+ shadows.push_back(gfx::ShadowValue(gfx::Vector2d(), 1, SK_ColorRED));
+ shadows.push_back(gfx::ShadowValue(gfx::Vector2d(2, 2), 0, SK_ColorGRAY));
}
- custom_label_->parent()->parent()->InvalidateLayout();
- custom_label_->SchedulePaint();
+ custom_label_->SetShadows(shadows);
+}
+
+void LabelExample::SelectableCheckboxPressed() {
+ custom_label_->SetSelectable(selectable_->GetChecked());
}
void LabelExample::ContentsChanged(Textfield* sender,
@@ -187,12 +187,18 @@ void LabelExample::AddCustomLabel(View* container) {
column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0,
GridLayout::ColumnSize::kUsePreferred, 0, 0);
layout->StartRow(0, 1);
- multiline_ = layout->AddView(
- std::make_unique<Checkbox>(base::ASCIIToUTF16("Multiline"), this));
- shadows_ = layout->AddView(
- std::make_unique<Checkbox>(base::ASCIIToUTF16("Shadows"), this));
- selectable_ = layout->AddView(
- std::make_unique<Checkbox>(base::ASCIIToUTF16("Selectable"), this));
+ multiline_ = layout->AddView(std::make_unique<Checkbox>(
+ base::ASCIIToUTF16("Multiline"),
+ base::BindRepeating(&LabelExample::MultilineCheckboxPressed,
+ base::Unretained(this))));
+ shadows_ = layout->AddView(std::make_unique<Checkbox>(
+ base::ASCIIToUTF16("Shadows"),
+ base::BindRepeating(&LabelExample::ShadowsCheckboxPressed,
+ base::Unretained(this))));
+ selectable_ = layout->AddView(std::make_unique<Checkbox>(
+ base::ASCIIToUTF16("Selectable"),
+ base::BindRepeating(&LabelExample::SelectableCheckboxPressed,
+ base::Unretained(this))));
layout->AddPaddingRow(0, 8);
column_set = layout->AddColumnSet(2);
@@ -222,7 +228,7 @@ Combobox* LabelExample::AddCombobox(GridLayout* layout,
auto combobox = std::make_unique<Combobox>(
std::make_unique<ExampleComboboxModel>(strings, count));
combobox->SetSelectedIndex(0);
- combobox->set_callback(base::BindRepeating(function, base::Unretained(this)));
+ combobox->SetCallback(base::BindRepeating(function, base::Unretained(this)));
return layout->AddView(std::move(combobox));
}
diff --git a/chromium/ui/views/examples/label_example.h b/chromium/ui/views/examples/label_example.h
index d98fac41dd3..d30c86f128c 100644
--- a/chromium/ui/views/examples/label_example.h
+++ b/chromium/ui/views/examples/label_example.h
@@ -6,7 +6,6 @@
#define UI_VIEWS_EXAMPLES_LABEL_EXAMPLE_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/examples/example_base.h"
@@ -20,7 +19,6 @@ class Label;
namespace examples {
class VIEWS_EXAMPLES_EXPORT LabelExample : public ExampleBase,
- public ButtonListener,
public TextfieldController {
public:
LabelExample();
@@ -29,8 +27,9 @@ class VIEWS_EXAMPLES_EXPORT LabelExample : public ExampleBase,
// ExampleBase:
void CreateExampleView(View* container) override;
- // ButtonListener:
- void ButtonPressed(Button* button, const ui::Event& event) override;
+ void MultilineCheckboxPressed();
+ void ShadowsCheckboxPressed();
+ void SelectableCheckboxPressed();
// TextfieldController:
void ContentsChanged(Textfield* sender,
diff --git a/chromium/ui/views/examples/layout_example_base.cc b/chromium/ui/views/examples/layout_example_base.cc
index ebf05807b6d..7bb72994b35 100644
--- a/chromium/ui/views/examples/layout_example_base.cc
+++ b/chromium/ui/views/examples/layout_example_base.cc
@@ -189,7 +189,7 @@ Combobox* LayoutExampleBase::CreateAndAddCombobox(
row->AddChildView(std::make_unique<Label>(label_text));
auto* const combobox = row->AddChildView(std::make_unique<Combobox>(
std::make_unique<ExampleComboboxModel>(items, count)));
- combobox->set_callback(std::move(combobox_callback));
+ combobox->SetCallback(std::move(combobox_callback));
return combobox;
}
@@ -229,9 +229,10 @@ void LayoutExampleBase::CreateMarginsTextFields(
}
Checkbox* LayoutExampleBase::CreateAndAddCheckbox(
- const base::string16& label_text) {
+ const base::string16& label_text,
+ base::RepeatingClosure checkbox_callback) {
return control_panel_->AddChildView(
- std::make_unique<Checkbox>(label_text, this));
+ std::make_unique<Checkbox>(label_text, std::move(checkbox_callback)));
}
void LayoutExampleBase::CreateExampleView(View* container) {
@@ -259,7 +260,9 @@ void LayoutExampleBase::CreateExampleView(View* container) {
kLayoutExampleVerticalSpacing))
->set_cross_axis_alignment(BoxLayout::CrossAxisAlignment::kCenter);
add_button_ = row->AddChildView(std::make_unique<MdTextButton>(
- this, l10n_util::GetStringUTF16(IDS_LAYOUT_BASE_ADD_LABEL)));
+ base::BindRepeating(&LayoutExampleBase::AddButtonPressed,
+ base::Unretained(this)),
+ l10n_util::GetStringUTF16(IDS_LAYOUT_BASE_ADD_LABEL)));
preferred_width_view_ = row->AddChildView(CreateCommonTextfield(this));
preferred_width_view_->SetText(
@@ -272,19 +275,6 @@ void LayoutExampleBase::CreateExampleView(View* container) {
CreateAdditionalControls();
}
-void LayoutExampleBase::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == add_button_) {
- auto* const panel =
- layout_panel_->AddChildView(std::make_unique<ChildPanel>(this));
- panel->SetPreferredSize(GetNewChildPanelPreferredSize());
- constexpr int kChildPanelGroup = 100;
- panel->SetGroup(kChildPanelGroup);
- RefreshLayoutPanel(false);
- } else {
- ButtonPressedImpl(sender);
- }
-}
-
gfx::Size LayoutExampleBase::GetNewChildPanelPreferredSize() {
int width;
if (!base::StringToInt(preferred_width_view_->GetText(), &width))
@@ -297,5 +287,14 @@ gfx::Size LayoutExampleBase::GetNewChildPanelPreferredSize() {
return gfx::Size(std::max(0, width), std::max(0, height));
}
+void LayoutExampleBase::AddButtonPressed() {
+ auto* const panel =
+ layout_panel_->AddChildView(std::make_unique<ChildPanel>(this));
+ panel->SetPreferredSize(GetNewChildPanelPreferredSize());
+ constexpr int kChildPanelGroup = 100;
+ panel->SetGroup(kChildPanelGroup);
+ RefreshLayoutPanel(false);
+}
+
} // namespace examples
} // namespace views
diff --git a/chromium/ui/views/examples/layout_example_base.h b/chromium/ui/views/examples/layout_example_base.h
index 0d7e793904b..7448c17f58d 100644
--- a/chromium/ui/views/examples/layout_example_base.h
+++ b/chromium/ui/views/examples/layout_example_base.h
@@ -7,7 +7,6 @@
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/size.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/checkbox.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/textfield/textfield_controller.h"
@@ -23,7 +22,6 @@ namespace examples {
// controls. Lays out a sequence of ChildPanels in a view using the layout
// manager of choice.
class VIEWS_EXAMPLES_EXPORT LayoutExampleBase : public ExampleBase,
- public ButtonListener,
public TextfieldController {
public:
// Grouping of multiple textfields that provide insets.
@@ -103,13 +101,10 @@ class VIEWS_EXAMPLES_EXPORT LayoutExampleBase : public ExampleBase,
void CreateMarginsTextFields(const base::string16& label_text,
InsetTextfields* textfields);
- // Creates and adds a Checkbox with label |label_text|.
- Checkbox* CreateAndAddCheckbox(const base::string16& label_text);
-
- // ButtonListener:
- // Be sure to call LayoutExampleBase::ButtonPressed() to ensure the "add"
- // button works correctly.
- void ButtonPressed(Button* sender, const ui::Event& event) final;
+ // Creates and adds a Checkbox with label |label_text|. Sets
+ // |checkbox_callback| as the callback for the created checkbox.
+ Checkbox* CreateAndAddCheckbox(const base::string16& label_text,
+ base::RepeatingClosure checkbox_callback);
// ExampleBase:
// Be sure to call LayoutExampleBase::CreateExampleView() to ensure default
@@ -122,14 +117,12 @@ class VIEWS_EXAMPLES_EXPORT LayoutExampleBase : public ExampleBase,
// the specific layout.
virtual void CreateAdditionalControls() = 0;
- // Handles buttons added by derived classes after button handling for
- // common controls is done.
- virtual void ButtonPressedImpl(Button* sender) = 0;
-
// Performs layout-specific update of the layout manager.
virtual void UpdateLayoutManager() = 0;
private:
+ void AddButtonPressed();
+
View* layout_panel_ = nullptr;
View* control_panel_ = nullptr;
LabelButton* add_button_ = nullptr;
diff --git a/chromium/ui/views/examples/link_example.cc b/chromium/ui/views/examples/link_example.cc
index 553c40d0d7e..f1cd3316ec4 100644
--- a/chromium/ui/views/examples/link_example.cc
+++ b/chromium/ui/views/examples/link_example.cc
@@ -13,6 +13,7 @@
#include "ui/views/examples/examples_window.h"
#include "ui/views/examples/grit/views_examples_resources.h"
#include "ui/views/layout/fill_layout.h"
+#include "ui/views/metadata/view_factory.h"
#include "ui/views/view.h"
using l10n_util::GetStringUTF16;
@@ -27,9 +28,10 @@ LinkExample::LinkExample()
LinkExample::~LinkExample() = default;
void LinkExample::CreateExampleView(View* container) {
- auto link =
- std::make_unique<Link>(GetStringUTF16(IDS_LINK_CLICK_PROMPT_LABEL));
- link->set_callback(base::BindRepeating(
+ auto link = views::Builder<Link>()
+ .SetText(GetStringUTF16(IDS_LINK_CLICK_PROMPT_LABEL))
+ .Build();
+ link->SetCallback(base::BindRepeating(
&LogStatus, GetStringUTF8(IDS_LINK_CLICK_CONFIRMED_LABEL)));
container->SetLayoutManager(std::make_unique<FillLayout>());
diff --git a/chromium/ui/views/examples/login_bubble_dialog_example.cc b/chromium/ui/views/examples/login_bubble_dialog_example.cc
index c7502cc8be4..dd53f311044 100644
--- a/chromium/ui/views/examples/login_bubble_dialog_example.cc
+++ b/chromium/ui/views/examples/login_bubble_dialog_example.cc
@@ -138,7 +138,11 @@ void LoginBubbleDialogExample::CreateExampleView(View* container) {
layout->StartRowWithPadding(0, 0, 0, related_control_padding);
button_ = layout->AddView(std::make_unique<MdTextButton>(
- this, GetStringUTF16(IDS_LOGIN_SHOW_BUTTON_LABEL)));
+ Button::PressedCallback(), GetStringUTF16(IDS_LOGIN_SHOW_BUTTON_LABEL)));
+ button_->SetCallback(base::BindRepeating(
+ &LoginBubbleDialogView::Show, button_, BubbleBorder::TOP_LEFT,
+ base::BindRepeating(&LoginBubbleDialogExample::OnSubmit,
+ base::Unretained(this))));
layout->StartRowWithPadding(0, 0, 0, related_control_padding);
username_label_ = layout->AddView(std::make_unique<Label>(
@@ -153,14 +157,6 @@ void LoginBubbleDialogExample::CreateExampleView(View* container) {
password_input_ = layout->AddView(std::make_unique<Label>());
}
-void LoginBubbleDialogExample::ButtonPressed(Button* sender,
- const ui::Event& event) {
- LoginBubbleDialogView::Show(
- button_, BubbleBorder::TOP_LEFT,
- base::BindOnce(&LoginBubbleDialogExample::OnSubmit,
- base::Unretained(this)));
-}
-
void LoginBubbleDialogExample::OnSubmit(base::string16 username,
base::string16 password) {
username_label_->SetVisible(true);
diff --git a/chromium/ui/views/examples/login_bubble_dialog_example.h b/chromium/ui/views/examples/login_bubble_dialog_example.h
index d4323ad2190..30c778186d8 100644
--- a/chromium/ui/views/examples/login_bubble_dialog_example.h
+++ b/chromium/ui/views/examples/login_bubble_dialog_example.h
@@ -8,7 +8,6 @@
#include "base/strings/string16.h"
#include "ui/views/bubble/bubble_border.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/examples/example_base.h"
@@ -45,7 +44,7 @@ class LoginBubbleDialogView : public BubbleDialogDelegateView,
};
// Instantiates the login dialog example.
-class LoginBubbleDialogExample : public ExampleBase, public ButtonListener {
+class LoginBubbleDialogExample : public ExampleBase {
public:
LoginBubbleDialogExample();
~LoginBubbleDialogExample() override;
@@ -53,9 +52,6 @@ class LoginBubbleDialogExample : public ExampleBase, public ButtonListener {
// ExampleBase:
void CreateExampleView(View* container) override;
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
// LoginBubbleDialogController:
void OnSubmit(base::string16 username, base::string16 password);
diff --git a/chromium/ui/views/examples/menu_example.cc b/chromium/ui/views/examples/menu_example.cc
index 7eae61ccf23..b0a9e13580a 100644
--- a/chromium/ui/views/examples/menu_example.cc
+++ b/chromium/ui/views/examples/menu_example.cc
@@ -60,14 +60,13 @@ class ExampleMenuModel : public ui::SimpleMenuModel,
DISALLOW_COPY_AND_ASSIGN(ExampleMenuModel);
};
-class ExampleMenuButton : public MenuButton, public ButtonListener {
+class ExampleMenuButton : public MenuButton {
public:
explicit ExampleMenuButton(const base::string16& test);
~ExampleMenuButton() override;
private:
- // ButtonListener:
- void ButtonPressed(Button* source, const ui::Event& event) override;
+ void ButtonPressed();
ui::SimpleMenuModel* GetMenuModel();
@@ -172,22 +171,23 @@ void ExampleMenuModel::ExecuteCommand(int command_id, int event_flags) {
// ExampleMenuButton -----------------------------------------------------------
ExampleMenuButton::ExampleMenuButton(const base::string16& test)
- : MenuButton(this, test) {}
+ : MenuButton(base::BindRepeating(&ExampleMenuButton::ButtonPressed,
+ base::Unretained(this)),
+ test) {}
ExampleMenuButton::~ExampleMenuButton() = default;
-void ExampleMenuButton::ButtonPressed(Button* source, const ui::Event& event) {
+void ExampleMenuButton::ButtonPressed() {
menu_runner_ =
std::make_unique<MenuRunner>(GetMenuModel(), MenuRunner::HAS_MNEMONICS);
- menu_runner_->RunMenuAt(source->GetWidget()->GetTopLevelWidget(),
- button_controller(),
- gfx::Rect(source->GetMenuPosition(), gfx::Size()),
+ menu_runner_->RunMenuAt(GetWidget()->GetTopLevelWidget(), button_controller(),
+ gfx::Rect(GetMenuPosition(), gfx::Size()),
MenuAnchorPosition::kTopRight, ui::MENU_SOURCE_NONE);
}
ui::SimpleMenuModel* ExampleMenuButton::GetMenuModel() {
- if (!menu_model_.get())
+ if (!menu_model_)
menu_model_ = std::make_unique<ExampleMenuModel>();
return menu_model_.get();
}
diff --git a/chromium/ui/views/examples/message_box_example.cc b/chromium/ui/views/examples/message_box_example.cc
index 1f7d60ba807..8f663a6055a 100644
--- a/chromium/ui/views/examples/message_box_example.cc
+++ b/chromium/ui/views/examples/message_box_example.cc
@@ -42,26 +42,26 @@ void MessageBoxExample::CreateExampleView(View* container) {
->SetOrientation(LayoutOrientation::kHorizontal)
.SetMainAxisAlignment(LayoutAlignment::kStart);
- status_ = button_panel->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_MESSAGE_STATUS_LABEL)));
- toggle_ = button_panel->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_MESSAGE_TOGGLE_LABEL)));
+ button_panel->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&MessageBoxExample::StatusButtonPressed,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_MESSAGE_STATUS_LABEL)));
+ button_panel->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(
+ [](MessageBoxView* message_box) {
+ message_box->SetCheckBoxSelected(message_box->IsCheckBoxSelected());
+ },
+ base::Unretained(message_box_view_)),
+ GetStringUTF16(IDS_MESSAGE_TOGGLE_LABEL)));
}
-void MessageBoxExample::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == status_) {
- message_box_view_->SetCheckBoxLabel(
- message_box_view_->IsCheckBoxSelected()
- ? GetStringUTF16(IDS_MESSAGE_ON_LABEL)
- : GetStringUTF16(IDS_MESSAGE_OFF_LABEL));
- LogStatus(
- message_box_view_->IsCheckBoxSelected()
- ? GetStringUTF8(IDS_MESSAGE_CHECK_SELECTED_LABEL).c_str()
- : GetStringUTF8(IDS_MESSAGE_CHECK_NOT_SELECTED_LABEL).c_str());
- } else if (sender == toggle_) {
- message_box_view_->SetCheckBoxSelected(
- !message_box_view_->IsCheckBoxSelected());
- }
+void MessageBoxExample::StatusButtonPressed() {
+ const bool selected = message_box_view_->IsCheckBoxSelected();
+ message_box_view_->SetCheckBoxLabel(
+ GetStringUTF16(selected ? IDS_MESSAGE_ON_LABEL : IDS_MESSAGE_OFF_LABEL));
+ LogStatus(GetStringUTF8(selected ? IDS_MESSAGE_CHECK_SELECTED_LABEL
+ : IDS_MESSAGE_CHECK_NOT_SELECTED_LABEL)
+ .c_str());
}
} // namespace examples
diff --git a/chromium/ui/views/examples/message_box_example.h b/chromium/ui/views/examples/message_box_example.h
index 2bed43b047c..d8648c583ef 100644
--- a/chromium/ui/views/examples/message_box_example.h
+++ b/chromium/ui/views/examples/message_box_example.h
@@ -8,7 +8,6 @@
#include <string>
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
namespace views {
@@ -17,8 +16,7 @@ class MessageBoxView;
namespace examples {
// A MessageBoxView example. This tests some of checkbox features as well.
-class VIEWS_EXAMPLES_EXPORT MessageBoxExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT MessageBoxExample : public ExampleBase {
public:
MessageBoxExample();
~MessageBoxExample() override;
@@ -27,17 +25,11 @@ class VIEWS_EXAMPLES_EXPORT MessageBoxExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ void StatusButtonPressed();
// The MessageBoxView to be tested.
MessageBoxView* message_box_view_;
- // Control buttons to show the status and toggle checkbox in the
- // message box.
- Button* status_;
- Button* toggle_;
-
DISALLOW_COPY_AND_ASSIGN(MessageBoxExample);
};
diff --git a/chromium/ui/views/examples/multiline_example.cc b/chromium/ui/views/examples/multiline_example.cc
index afc0bdfe18f..186cd38265b 100644
--- a/chromium/ui/views/examples/multiline_example.cc
+++ b/chromium/ui/views/examples/multiline_example.cc
@@ -145,13 +145,26 @@ void MultilineExample::CreateExampleView(View* container) {
label->SetMultiLine(true);
label->SetBorder(CreateSolidBorder(2, SK_ColorCYAN));
- auto label_checkbox =
- std::make_unique<Checkbox>(GetStringUTF16(IDS_MULTILINE_LABEL), this);
+ auto label_checkbox = std::make_unique<Checkbox>(
+ GetStringUTF16(IDS_MULTILINE_LABEL),
+ base::BindRepeating(
+ [](MultilineExample* example) {
+ example->label_->SetText(example->label_checkbox_->GetChecked()
+ ? example->textfield_->GetText()
+ : base::string16());
+ },
+ base::Unretained(this)));
label_checkbox->SetChecked(true);
label_checkbox->SetRequestFocusOnPress(false);
auto elision_checkbox = std::make_unique<Checkbox>(
- GetStringUTF16(IDS_MULTILINE_ELIDE_LABEL), this);
+ GetStringUTF16(IDS_MULTILINE_ELIDE_LABEL),
+ base::BindRepeating(
+ [](MultilineExample* example) {
+ example->render_text_view_->SetMaxLines(
+ example->elision_checkbox_->GetChecked() ? 3 : 0);
+ },
+ base::Unretained(this)));
elision_checkbox->SetChecked(false);
elision_checkbox->SetRequestFocusOnPress(false);
@@ -195,16 +208,5 @@ void MultilineExample::ContentsChanged(Textfield* sender,
example_view()->SchedulePaint();
}
-void MultilineExample::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == label_checkbox_) {
- label_->SetText(label_checkbox_->GetChecked() ? textfield_->GetText()
- : base::string16());
- } else if (sender == elision_checkbox_) {
- render_text_view_->SetMaxLines(elision_checkbox_->GetChecked() ? 3 : 0);
- }
- example_view()->InvalidateLayout();
- example_view()->SchedulePaint();
-}
-
} // namespace examples
} // namespace views
diff --git a/chromium/ui/views/examples/multiline_example.h b/chromium/ui/views/examples/multiline_example.h
index 7bcdbe913b2..34342820cda 100644
--- a/chromium/ui/views/examples/multiline_example.h
+++ b/chromium/ui/views/examples/multiline_example.h
@@ -6,7 +6,6 @@
#define UI_VIEWS_EXAMPLES_MULTILINE_EXAMPLE_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/examples/example_base.h"
@@ -19,8 +18,7 @@ namespace examples {
// An example that compares the multiline rendering of different controls.
class VIEWS_EXAMPLES_EXPORT MultilineExample : public ExampleBase,
- public TextfieldController,
- public ButtonListener {
+ public TextfieldController {
public:
MultilineExample();
~MultilineExample() override;
@@ -28,9 +26,6 @@ class VIEWS_EXAMPLES_EXPORT MultilineExample : public ExampleBase,
// ExampleBase:
void CreateExampleView(View* container) override;
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
private:
class RenderTextView;
diff --git a/chromium/ui/views/examples/progress_bar_example.cc b/chromium/ui/views/examples/progress_bar_example.cc
index b101feb20e3..b8bf1404bd3 100644
--- a/chromium/ui/views/examples/progress_bar_example.cc
+++ b/chromium/ui/views/examples/progress_bar_example.cc
@@ -43,11 +43,15 @@ void ProgressBarExample::CreateExampleView(View* container) {
GridLayout::ColumnSize::kUsePreferred, 0, 0);
layout->StartRow(0, 0);
- minus_button_ = layout->AddView(
- std::make_unique<views::MdTextButton>(this, base::ASCIIToUTF16("-")));
+ layout->AddView(std::make_unique<views::MdTextButton>(
+ base::BindRepeating(&ProgressBarExample::ButtonPressed,
+ base::Unretained(this), -0.1),
+ base::ASCIIToUTF16("-")));
progress_bar_ = layout->AddView(std::make_unique<ProgressBar>());
- plus_button_ = layout->AddView(
- std::make_unique<views::MdTextButton>(this, base::ASCIIToUTF16("+")));
+ layout->AddView(std::make_unique<views::MdTextButton>(
+ base::BindRepeating(&ProgressBarExample::ButtonPressed,
+ base::Unretained(this), 0.1),
+ base::ASCIIToUTF16("+")));
layout->StartRowWithPadding(0, 0, 0, 10);
layout->AddView(
@@ -64,9 +68,7 @@ void ProgressBarExample::CreateExampleView(View* container) {
layout->AddView(std::move(shorter_bar));
}
-void ProgressBarExample::ButtonPressed(Button* sender, const ui::Event& event) {
- constexpr double kStepSize = 0.1;
- const double step = (sender == minus_button_) ? -kStepSize : kStepSize;
+void ProgressBarExample::ButtonPressed(double step) {
current_percent_ = base::ClampToRange(current_percent_ + step, 0.0, 1.0);
progress_bar_->SetValue(current_percent_);
}
diff --git a/chromium/ui/views/examples/progress_bar_example.h b/chromium/ui/views/examples/progress_bar_example.h
index a38751bd470..b76ff85d13b 100644
--- a/chromium/ui/views/examples/progress_bar_example.h
+++ b/chromium/ui/views/examples/progress_bar_example.h
@@ -6,7 +6,6 @@
#define UI_VIEWS_EXAMPLES_PROGRESS_BAR_EXAMPLE_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
namespace views {
@@ -14,8 +13,7 @@ class ProgressBar;
namespace examples {
-class VIEWS_EXAMPLES_EXPORT ProgressBarExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT ProgressBarExample : public ExampleBase {
public:
ProgressBarExample();
~ProgressBarExample() override;
@@ -24,11 +22,8 @@ class VIEWS_EXAMPLES_EXPORT ProgressBarExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* button, const ui::Event& event) override;
+ void ButtonPressed(double step);
- Button* minus_button_ = nullptr;
- Button* plus_button_ = nullptr;
ProgressBar* progress_bar_ = nullptr;
double current_percent_ = 0.0;
diff --git a/chromium/ui/views/examples/radio_button_example.cc b/chromium/ui/views/examples/radio_button_example.cc
index 6345a5f1fe4..76de2e9f78e 100644
--- a/chromium/ui/views/examples/radio_button_example.cc
+++ b/chromium/ui/views/examples/radio_button_example.cc
@@ -51,22 +51,22 @@ void RadioButtonExample::CreateExampleView(View* container) {
group)));
}
- select_ = container->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_RADIO_BUTTON_SELECT_BUTTON_LABEL)));
- status_ = container->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_RADIO_BUTTON_STATUS_LABEL)));
+ container->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&RadioButton::SetChecked,
+ base::Unretained(radio_buttons_[2]), true),
+ GetStringUTF16(IDS_RADIO_BUTTON_SELECT_BUTTON_LABEL)));
+ container->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&RadioButtonExample::StatusButtonPressed,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_RADIO_BUTTON_STATUS_LABEL)));
}
-void RadioButtonExample::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == select_) {
- radio_buttons_[2]->SetChecked(true);
- } else if (sender == status_) {
- // Show the state of radio buttons.
- PrintStatus("Group: 1:%s, 2:%s, 3:%s",
- BoolToOnOff(radio_buttons_[0]->GetChecked()),
- BoolToOnOff(radio_buttons_[1]->GetChecked()),
- BoolToOnOff(radio_buttons_[2]->GetChecked()));
- }
+void RadioButtonExample::StatusButtonPressed() {
+ // Show the state of radio buttons.
+ PrintStatus("Group: 1:%s, 2:%s, 3:%s",
+ BoolToOnOff(radio_buttons_[0]->GetChecked()),
+ BoolToOnOff(radio_buttons_[1]->GetChecked()),
+ BoolToOnOff(radio_buttons_[2]->GetChecked()));
}
} // namespace examples
diff --git a/chromium/ui/views/examples/radio_button_example.h b/chromium/ui/views/examples/radio_button_example.h
index 889934ebf36..0b9cb09a998 100644
--- a/chromium/ui/views/examples/radio_button_example.h
+++ b/chromium/ui/views/examples/radio_button_example.h
@@ -9,18 +9,15 @@
#include <vector>
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
namespace views {
-class LabelButton;
class RadioButton;
namespace examples {
-class VIEWS_EXAMPLES_EXPORT RadioButtonExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT RadioButtonExample : public ExampleBase {
public:
RadioButtonExample();
~RadioButtonExample() override;
@@ -29,16 +26,11 @@ class VIEWS_EXAMPLES_EXPORT RadioButtonExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ void StatusButtonPressed();
// Group of 3 radio buttons.
std::vector<RadioButton*> radio_buttons_;
- // Control button to select radio buttons, and show the status of buttons.
- LabelButton* select_;
- LabelButton* status_;
-
DISALLOW_COPY_AND_ASSIGN(RadioButtonExample);
};
diff --git a/chromium/ui/views/examples/scroll_view_example.cc b/chromium/ui/views/examples/scroll_view_example.cc
index 91c3756518d..3e4b9c8ae98 100644
--- a/chromium/ui/views/examples/scroll_view_example.cc
+++ b/chromium/ui/views/examples/scroll_view_example.cc
@@ -48,7 +48,8 @@ class ScrollViewExample::ScrollableView : public View {
container->AddChildView(std::move(view));
};
add_child(std::make_unique<LabelButton>(
- nullptr, GetStringUTF16(IDS_SCROLL_VIEW_BUTTON_LABEL)));
+ Button::PressedCallback(),
+ GetStringUTF16(IDS_SCROLL_VIEW_BUTTON_LABEL)));
add_child(std::make_unique<RadioButton>(
GetStringUTF16(IDS_SCROLL_VIEW_RADIO_BUTTON_LABEL), 0));
layout_manager->SetDefaultFlex(1);
@@ -101,39 +102,41 @@ void ScrollViewExample::CreateExampleView(View* container) {
button_panel->SetLayoutManager(std::make_unique<FlexLayout>())
->SetOrientation(LayoutOrientation::kHorizontal);
- wide_ = button_panel->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_SCROLL_VIEW_WIDE_LABEL)));
- tall_ = button_panel->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_SCROLL_VIEW_TALL_LABEL)));
- big_square_ = button_panel->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_SCROLL_VIEW_BIG_SQUARE_LABEL)));
- small_square_ = button_panel->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_SCROLL_VIEW_SMALL_SQUARE_LABEL)));
- scroll_to_ = button_panel->AddChildView(std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_SCROLL_VIEW_SCROLL_TO_LABEL)));
+ button_panel->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&ScrollViewExample::ButtonPressed,
+ base::Unretained(this), gfx::Rect(0, 0, 1000, 100),
+ SK_ColorYELLOW, SK_ColorCYAN),
+ GetStringUTF16(IDS_SCROLL_VIEW_WIDE_LABEL)));
+ button_panel->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&ScrollViewExample::ButtonPressed,
+ base::Unretained(this), gfx::Rect(0, 0, 100, 1000),
+ SK_ColorRED, SK_ColorCYAN),
+ GetStringUTF16(IDS_SCROLL_VIEW_TALL_LABEL)));
+ button_panel->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&ScrollViewExample::ButtonPressed,
+ base::Unretained(this), gfx::Rect(0, 0, 1000, 1000),
+ SK_ColorRED, SK_ColorGREEN),
+ GetStringUTF16(IDS_SCROLL_VIEW_BIG_SQUARE_LABEL)));
+ button_panel->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&ScrollViewExample::ButtonPressed,
+ base::Unretained(this), gfx::Rect(0, 0, 100, 100),
+ SK_ColorYELLOW, SK_ColorGREEN),
+ GetStringUTF16(IDS_SCROLL_VIEW_SMALL_SQUARE_LABEL)));
+ button_panel->AddChildView(std::make_unique<LabelButton>(
+ base::BindRepeating(&View::ScrollRectToVisible,
+ base::Unretained(scroll_view_->contents()),
+ gfx::Rect(20, 500, 1000, 500)),
+ GetStringUTF16(IDS_SCROLL_VIEW_SCROLL_TO_LABEL)));
for (View* child : button_panel->children())
child->SetProperty(views::kFlexBehaviorKey, full_flex);
}
-void ScrollViewExample::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == wide_) {
- scrollable_->SetBounds(0, 0, 1000, 100);
- scrollable_->SetColor(SK_ColorYELLOW, SK_ColorCYAN);
- } else if (sender == tall_) {
- scrollable_->SetBounds(0, 0, 100, 1000);
- scrollable_->SetColor(SK_ColorRED, SK_ColorCYAN);
- } else if (sender == big_square_) {
- scrollable_->SetBounds(0, 0, 1000, 1000);
- scrollable_->SetColor(SK_ColorRED, SK_ColorGREEN);
- } else if (sender == small_square_) {
- scrollable_->SetBounds(0, 0, 100, 100);
- scrollable_->SetColor(SK_ColorYELLOW, SK_ColorGREEN);
- } else if (sender == scroll_to_) {
- scroll_view_->contents()->ScrollRectToVisible(
- gfx::Rect(20, 500, 1000, 500));
- }
- scroll_view_->InvalidateLayout();
+void ScrollViewExample::ButtonPressed(gfx::Rect bounds,
+ SkColor from,
+ SkColor to) {
+ scrollable_->SetBoundsRect(std::move(bounds));
+ scrollable_->SetColor(from, to);
}
} // namespace examples
diff --git a/chromium/ui/views/examples/scroll_view_example.h b/chromium/ui/views/examples/scroll_view_example.h
index ce2111032e4..9283b145c94 100644
--- a/chromium/ui/views/examples/scroll_view_example.h
+++ b/chromium/ui/views/examples/scroll_view_example.h
@@ -8,18 +8,13 @@
#include <string>
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/scroll_view.h"
#include "ui/views/examples/example_base.h"
namespace views {
-
-class LabelButton;
-
namespace examples {
-class VIEWS_EXAMPLES_EXPORT ScrollViewExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT ScrollViewExample : public ExampleBase {
public:
ScrollViewExample();
~ScrollViewExample() override;
@@ -28,18 +23,10 @@ class VIEWS_EXAMPLES_EXPORT ScrollViewExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ class ScrollableView;
- // Control buttons to change the size of scrollable and jump to
- // predefined position.
- LabelButton* wide_;
- LabelButton* tall_;
- LabelButton* big_square_;
- LabelButton* small_square_;
- LabelButton* scroll_to_;
+ void ButtonPressed(gfx::Rect bounds, SkColor from, SkColor to);
- class ScrollableView;
// The content of the scroll view.
ScrollableView* scrollable_;
diff --git a/chromium/ui/views/examples/tabbed_pane_example.cc b/chromium/ui/views/examples/tabbed_pane_example.cc
index 11bcdcf14e6..642fd16b2d2 100644
--- a/chromium/ui/views/examples/tabbed_pane_example.cc
+++ b/chromium/ui/views/examples/tabbed_pane_example.cc
@@ -32,11 +32,22 @@ void TabbedPaneExample::CreateExampleView(View* container) {
auto tabbed_pane = std::make_unique<TabbedPane>();
tabbed_pane->set_listener(this);
auto add = std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TABBED_PANE_ADD_LABEL));
+ base::BindRepeating(&TabbedPaneExample::AddButton, base::Unretained(this),
+ GetStringUTF16(IDS_TABBED_PANE_ADDED_LABEL)),
+ GetStringUTF16(IDS_TABBED_PANE_ADD_LABEL));
+
auto add_at = std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TABBED_PANE_ADD_1_LABEL));
+ base::BindRepeating(&TabbedPaneExample::AddAtButtonPressed,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_TABBED_PANE_ADD_1_LABEL));
auto select_at = std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TABBED_PANE_SELECT_1_LABEL));
+ base::BindRepeating(
+ [](TabbedPane* pane) {
+ if (pane->GetTabCount() > 1)
+ pane->SelectTabAt(1);
+ },
+ base::Unretained(tabbed_pane_)),
+ GetStringUTF16(IDS_TABBED_PANE_SELECT_1_LABEL));
container->SetLayoutManager(std::make_unique<views::FlexLayout>())
->SetOrientation(LayoutOrientation::kVertical);
@@ -64,20 +75,6 @@ void TabbedPaneExample::CreateExampleView(View* container) {
view->SetProperty(views::kFlexBehaviorKey, full_flex);
}
-void TabbedPaneExample::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == add_) {
- AddButton(GetStringUTF16(IDS_TABBED_PANE_ADDED_LABEL));
- } else if (sender == add_at_) {
- const base::string16 label = GetStringUTF16(IDS_TABBED_PANE_ADDED_1_LABEL);
- tabbed_pane_->AddTabAtIndex(1, label,
- std::make_unique<LabelButton>(nullptr, label));
- } else if (sender == select_at_) {
- if (tabbed_pane_->GetTabCount() > 1)
- tabbed_pane_->SelectTabAt(1);
- }
- PrintCurrentStatus();
-}
-
void TabbedPaneExample::TabSelectedAt(int index) {
// Just print the status when selection changes.
PrintCurrentStatus();
@@ -89,7 +86,17 @@ void TabbedPaneExample::PrintCurrentStatus() {
}
void TabbedPaneExample::AddButton(const base::string16& label) {
- tabbed_pane_->AddTab(label, std::make_unique<LabelButton>(nullptr, label));
+ tabbed_pane_->AddTab(
+ label, std::make_unique<LabelButton>(Button::PressedCallback(), label));
+ PrintCurrentStatus();
+}
+
+void TabbedPaneExample::AddAtButtonPressed() {
+ const base::string16 label = GetStringUTF16(IDS_TABBED_PANE_ADDED_1_LABEL);
+ tabbed_pane_->AddTabAtIndex(
+ 1, label,
+ std::make_unique<LabelButton>(Button::PressedCallback(), label));
+ PrintCurrentStatus();
}
} // namespace examples
diff --git a/chromium/ui/views/examples/tabbed_pane_example.h b/chromium/ui/views/examples/tabbed_pane_example.h
index ce4fe34d4e9..c9f4cf0982d 100644
--- a/chromium/ui/views/examples/tabbed_pane_example.h
+++ b/chromium/ui/views/examples/tabbed_pane_example.h
@@ -8,18 +8,18 @@
#include <string>
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
+#include "base/strings/string16.h"
#include "ui/views/controls/tabbed_pane/tabbed_pane_listener.h"
#include "ui/views/examples/example_base.h"
namespace views {
+class Button;
class TabbedPane;
namespace examples {
// A TabbedPane example tests adding and selecting tabs.
class VIEWS_EXAMPLES_EXPORT TabbedPaneExample : public ExampleBase,
- public ButtonListener,
public TabbedPaneListener {
public:
TabbedPaneExample();
@@ -29,9 +29,6 @@ class VIEWS_EXAMPLES_EXPORT TabbedPaneExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
// TabbedPaneListener:
void TabSelectedAt(int index) override;
@@ -40,6 +37,8 @@ class VIEWS_EXAMPLES_EXPORT TabbedPaneExample : public ExampleBase,
void AddButton(const base::string16& label);
+ void AddAtButtonPressed();
+
// The tabbed pane to be tested.
TabbedPane* tabbed_pane_;
diff --git a/chromium/ui/views/examples/table_example.cc b/chromium/ui/views/examples/table_example.cc
index b2ba1eac5d1..647d5275e67 100644
--- a/chromium/ui/views/examples/table_example.cc
+++ b/chromium/ui/views/examples/table_example.cc
@@ -73,29 +73,34 @@ void TableExample::CreateExampleView(View* container) {
icon1_.allocN32Pixels(16, 16);
icon2_.allocN32Pixels(16, 16);
- SkCanvas canvas1(icon1_), canvas2(icon2_);
+ SkCanvas canvas1(icon1_, SkSurfaceProps{}), canvas2(icon2_, SkSurfaceProps{});
canvas1.drawColor(SK_ColorRED);
canvas2.drawColor(SK_ColorBLUE);
- auto make_checkbox =
- [this](base::string16 text) -> std::unique_ptr<Checkbox> {
- auto result = std::make_unique<Checkbox>(text, this);
- result->SetChecked(true);
- return result;
- };
-
- // Make buttons
auto* button_panel = container->AddChildView(std::make_unique<View>());
button_panel->SetLayoutManager(std::make_unique<views::FlexLayout>())
->SetOrientation(LayoutOrientation::kHorizontal);
- column1_visible_checkbox_ = button_panel->AddChildView(
- make_checkbox(ASCIIToUTF16("Fruit column visible")));
- column2_visible_checkbox_ = button_panel->AddChildView(
- make_checkbox(ASCIIToUTF16("Color column visible")));
- column3_visible_checkbox_ = button_panel->AddChildView(
- make_checkbox(ASCIIToUTF16("Origin column visible")));
- column4_visible_checkbox_ = button_panel->AddChildView(
- make_checkbox(ASCIIToUTF16("Price column visible")));
+
+ const auto make_checkbox = [&](base::string16 label, int id) {
+ auto* const checkbox =
+ button_panel->AddChildView(std::make_unique<Checkbox>(
+ std::move(label), Button::PressedCallback()));
+ checkbox->SetCallback(base::BindRepeating(
+ [](TableView* table, int id, Checkbox* checkbox) {
+ table->SetColumnVisibility(id, checkbox->GetChecked());
+ },
+ base::Unretained(table_), id, checkbox));
+ checkbox->SetChecked(true);
+ return checkbox;
+ };
+ column1_visible_checkbox_ =
+ make_checkbox(ASCIIToUTF16("Fruit column visible"), 0);
+ column2_visible_checkbox_ =
+ make_checkbox(ASCIIToUTF16("Color column visible"), 1);
+ column3_visible_checkbox_ =
+ make_checkbox(ASCIIToUTF16("Origin column visible"), 2);
+ column4_visible_checkbox_ =
+ make_checkbox(ASCIIToUTF16("Price column visible"), 3);
for (View* child : button_panel->children())
child->SetProperty(views::kFlexBehaviorKey, full_flex);
@@ -169,24 +174,5 @@ void TableExample::OnMiddleClick() {}
void TableExample::OnKeyDown(ui::KeyboardCode virtual_keycode) {}
-void TableExample::ButtonPressed(Button* sender, const ui::Event& event) {
- int index = 0;
- bool show = true;
- if (sender == column1_visible_checkbox_) {
- index = 0;
- show = column1_visible_checkbox_->GetChecked();
- } else if (sender == column2_visible_checkbox_) {
- index = 1;
- show = column2_visible_checkbox_->GetChecked();
- } else if (sender == column3_visible_checkbox_) {
- index = 2;
- show = column3_visible_checkbox_->GetChecked();
- } else if (sender == column4_visible_checkbox_) {
- index = 3;
- show = column4_visible_checkbox_->GetChecked();
- }
- table_->SetColumnVisibility(index, show);
-}
-
} // namespace examples
} // namespace views
diff --git a/chromium/ui/views/examples/table_example.h b/chromium/ui/views/examples/table_example.h
index a12ac53266a..ba044839acd 100644
--- a/chromium/ui/views/examples/table_example.h
+++ b/chromium/ui/views/examples/table_example.h
@@ -10,7 +10,6 @@
#include "base/macros.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/models/table_model.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/table/table_grouper.h"
#include "ui/views/controls/table/table_view.h"
#include "ui/views/controls/table/table_view_observer.h"
@@ -29,8 +28,7 @@ namespace examples {
class VIEWS_EXAMPLES_EXPORT TableExample : public ExampleBase,
public ui::TableModel,
public TableGrouper,
- public TableViewObserver,
- public ButtonListener {
+ public TableViewObserver {
public:
TableExample();
~TableExample() override;
@@ -54,9 +52,6 @@ class VIEWS_EXAMPLES_EXPORT TableExample : public ExampleBase,
void OnMiddleClick() override;
void OnKeyDown(ui::KeyboardCode virtual_keycode) override;
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
private:
// The table to be tested.
TableView* table_ = nullptr;
diff --git a/chromium/ui/views/examples/text_example.cc b/chromium/ui/views/examples/text_example.cc
index 08f27815e47..4eed781685e 100644
--- a/chromium/ui/views/examples/text_example.cc
+++ b/chromium/ui/views/examples/text_example.cc
@@ -106,8 +106,9 @@ TextExample::TextExample() : ExampleBase("Text Styles") {}
TextExample::~TextExample() = default;
Checkbox* TextExample::AddCheckbox(GridLayout* layout, const char* name) {
- return layout->AddView(
- std::make_unique<Checkbox>(base::ASCIIToUTF16(name), this));
+ return layout->AddView(std::make_unique<Checkbox>(
+ base::ASCIIToUTF16(name),
+ base::BindRepeating(&TextExample::UpdateStyle, base::Unretained(this))));
}
Combobox* TextExample::AddCombobox(GridLayout* layout,
@@ -121,7 +122,7 @@ Combobox* TextExample::AddCombobox(GridLayout* layout,
std::make_unique<Combobox>(
std::make_unique<ExampleComboboxModel>(strings, count)),
kNumColumns - 1, 1);
- combobox->set_callback(
+ combobox->SetCallback(
base::BindRepeating(combobox_callback, base::Unretained(this)));
return combobox;
}
@@ -208,7 +209,7 @@ void TextExample::CreateExampleView(View* container) {
TextComboboxChanged(); // Sets initial text content.
}
-void TextExample::ButtonPressed(Button* button, const ui::Event& event) {
+void TextExample::UpdateStyle() {
int flags = text_view_->GetFlags();
int style = text_view_->GetStyle();
SetFlagFromCheckbox(multiline_checkbox_, &flags, gfx::Canvas::MULTI_LINE);
diff --git a/chromium/ui/views/examples/text_example.h b/chromium/ui/views/examples/text_example.h
index 6d6a6367d97..eb76a150211 100644
--- a/chromium/ui/views/examples/text_example.h
+++ b/chromium/ui/views/examples/text_example.h
@@ -9,7 +9,6 @@
#include <vector>
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
namespace views {
@@ -19,8 +18,7 @@ class GridLayout;
namespace examples {
-class VIEWS_EXAMPLES_EXPORT TextExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT TextExample : public ExampleBase {
public:
TextExample();
~TextExample() override;
@@ -29,6 +27,8 @@ class VIEWS_EXAMPLES_EXPORT TextExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
+ class TextExampleView;
+
// Creates and adds a check box to the layout.
Checkbox* AddCheckbox(GridLayout* layout, const char* name);
@@ -46,10 +46,8 @@ class VIEWS_EXAMPLES_EXPORT TextExample : public ExampleBase,
void PrefixComboboxChanged();
void WeightComboboxChanged();
- // ButtonListener:
- void ButtonPressed(Button* button, const ui::Event& event) override;
+ void UpdateStyle();
- class TextExampleView;
// The content of the scroll view.
TextExampleView* text_view_;
diff --git a/chromium/ui/views/examples/textfield_example.cc b/chromium/ui/views/examples/textfield_example.cc
index 7f1d9b2ddc4..9748909d061 100644
--- a/chromium/ui/views/examples/textfield_example.cc
+++ b/chromium/ui/views/examples/textfield_example.cc
@@ -104,27 +104,44 @@ void TextfieldExample::CreateExampleView(View* container) {
show_password_ = MakeRow<View, LabelButton>(
layout, nullptr,
std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TEXTFIELD_SHOW_PASSWORD_LABEL)));
+ base::BindRepeating(
+ [](TextfieldExample* example) {
+ PrintStatus(
+ "Password [%s]",
+ base::UTF16ToUTF8(example->password_->GetText()).c_str());
+ },
+ base::Unretained(this)),
+ GetStringUTF16(IDS_TEXTFIELD_SHOW_PASSWORD_LABEL)));
set_background_ = MakeRow<View, LabelButton>(
layout, nullptr,
std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TEXTFIELD_BACKGROUND_LABEL)));
+ base::BindRepeating(&Textfield::SetBackgroundColor,
+ base::Unretained(password_), gfx::kGoogleRed300),
+ GetStringUTF16(IDS_TEXTFIELD_BACKGROUND_LABEL)));
clear_all_ = MakeRow<View, LabelButton>(
layout, nullptr,
- std::make_unique<LabelButton>(this,
- GetStringUTF16(IDS_TEXTFIELD_CLEAR_LABEL)));
+ std::make_unique<LabelButton>(
+ base::BindRepeating(&TextfieldExample::ClearAllButtonPressed,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_TEXTFIELD_CLEAR_LABEL)));
append_ = MakeRow<View, LabelButton>(
layout, nullptr,
std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TEXTFIELD_APPEND_LABEL)));
+ base::BindRepeating(&TextfieldExample::AppendButtonPressed,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_TEXTFIELD_APPEND_LABEL)));
set_ = MakeRow<View, LabelButton>(
layout, nullptr,
- std::make_unique<LabelButton>(this,
- GetStringUTF16(IDS_TEXTFIELD_SET_LABEL)));
+ std::make_unique<LabelButton>(
+ base::BindRepeating(&TextfieldExample::SetButtonPressed,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_TEXTFIELD_SET_LABEL)));
set_style_ = MakeRow<View, LabelButton>(
layout, nullptr,
std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TEXTFIELD_SET_STYLE_LABEL)));
+ base::BindRepeating(&TextfieldExample::SetStyleButtonPressed,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_TEXTFIELD_SET_STYLE_LABEL)));
}
bool TextfieldExample::HandleKeyEvent(Textfield* sender,
@@ -138,51 +155,53 @@ bool TextfieldExample::HandleMouseEvent(Textfield* sender,
return false;
}
-void TextfieldExample::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == show_password_) {
- PrintStatus("Password [%s]",
- base::UTF16ToUTF8(password_->GetText()).c_str());
- } else if (sender == set_background_) {
- password_->SetBackgroundColor(gfx::kGoogleRed300);
- } else if (sender == clear_all_) {
- base::string16 empty;
- name_->SetText(empty);
- password_->SetText(empty);
- disabled_->SetText(empty);
- read_only_->SetText(empty);
- invalid_->SetText(empty);
- rtl_->SetText(empty);
- } else if (sender == append_) {
- name_->AppendText(GetStringUTF16(IDS_TEXTFIELD_APPEND_UPDATE_TEXT));
- password_->AppendText(GetStringUTF16(IDS_TEXTFIELD_APPEND_UPDATE_TEXT));
- disabled_->SetText(GetStringUTF16(IDS_TEXTFIELD_APPEND_UPDATE_TEXT));
- read_only_->AppendText(GetStringUTF16(IDS_TEXTFIELD_APPEND_UPDATE_TEXT));
- invalid_->AppendText(GetStringUTF16(IDS_TEXTFIELD_APPEND_UPDATE_TEXT));
- rtl_->AppendText(GetStringUTF16(IDS_TEXTFIELD_APPEND_UPDATE_TEXT));
- } else if (sender == set_) {
- name_->SetText(GetStringUTF16(IDS_TEXTFIELD_SET_UPDATE_TEXT));
- password_->SetText(GetStringUTF16(IDS_TEXTFIELD_SET_UPDATE_TEXT));
- disabled_->SetText(GetStringUTF16(IDS_TEXTFIELD_SET_UPDATE_TEXT));
- read_only_->SetText(GetStringUTF16(IDS_TEXTFIELD_SET_UPDATE_TEXT));
- invalid_->SetText(GetStringUTF16(IDS_TEXTFIELD_SET_UPDATE_TEXT));
- rtl_->SetText(GetStringUTF16(IDS_TEXTFIELD_SET_UPDATE_TEXT));
- } else if (sender == set_style_) {
- if (!name_->GetText().empty()) {
- name_->SetColor(SK_ColorGREEN);
-
- if (name_->GetText().length() >= 5) {
- size_t fifth = name_->GetText().length() / 5;
- const gfx::Range big_range(1 * fifth, 4 * fifth);
- name_->ApplyStyle(gfx::TEXT_STYLE_UNDERLINE, true, big_range);
- name_->ApplyColor(SK_ColorBLUE, big_range);
-
- const gfx::Range small_range(2 * fifth, 3 * fifth);
- name_->ApplyStyle(gfx::TEXT_STYLE_ITALIC, true, small_range);
- name_->ApplyStyle(gfx::TEXT_STYLE_UNDERLINE, false, small_range);
- name_->ApplyColor(SK_ColorRED, small_range);
- }
- }
- }
+void TextfieldExample::ClearAllButtonPressed() {
+ name_->SetText(base::string16());
+ password_->SetText(base::string16());
+ disabled_->SetText(base::string16());
+ read_only_->SetText(base::string16());
+ invalid_->SetText(base::string16());
+ rtl_->SetText(base::string16());
+}
+
+void TextfieldExample::AppendButtonPressed() {
+ const base::string16 append_text =
+ GetStringUTF16(IDS_TEXTFIELD_APPEND_UPDATE_TEXT);
+ name_->AppendText(append_text);
+ password_->AppendText(append_text);
+ disabled_->SetText(append_text);
+ read_only_->AppendText(append_text);
+ invalid_->AppendText(append_text);
+ rtl_->AppendText(append_text);
+}
+
+void TextfieldExample::SetButtonPressed() {
+ const base::string16 set_text = GetStringUTF16(IDS_TEXTFIELD_SET_UPDATE_TEXT);
+ name_->SetText(set_text);
+ password_->SetText(set_text);
+ disabled_->SetText(set_text);
+ read_only_->SetText(set_text);
+ invalid_->SetText(set_text);
+ rtl_->SetText(set_text);
+}
+
+void TextfieldExample::SetStyleButtonPressed() {
+ if (name_->GetText().empty())
+ return;
+ name_->SetColor(SK_ColorGREEN);
+
+ const size_t fifth = name_->GetText().length() / 5;
+ if (!fifth)
+ return;
+
+ const gfx::Range big_range(1 * fifth, 4 * fifth);
+ name_->ApplyStyle(gfx::TEXT_STYLE_UNDERLINE, true, big_range);
+ name_->ApplyColor(SK_ColorBLUE, big_range);
+
+ const gfx::Range small_range(2 * fifth, 3 * fifth);
+ name_->ApplyStyle(gfx::TEXT_STYLE_ITALIC, true, small_range);
+ name_->ApplyStyle(gfx::TEXT_STYLE_UNDERLINE, false, small_range);
+ name_->ApplyColor(SK_ColorRED, small_range);
}
} // namespace examples
diff --git a/chromium/ui/views/examples/textfield_example.h b/chromium/ui/views/examples/textfield_example.h
index 6ab66ff47f9..90a437145f3 100644
--- a/chromium/ui/views/examples/textfield_example.h
+++ b/chromium/ui/views/examples/textfield_example.h
@@ -8,7 +8,6 @@
#include <string>
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/examples/example_base.h"
@@ -20,8 +19,7 @@ namespace examples {
// TextfieldExample mimics login screen.
class VIEWS_EXAMPLES_EXPORT TextfieldExample : public ExampleBase,
- public TextfieldController,
- public ButtonListener {
+ public TextfieldController {
public:
TextfieldExample();
~TextfieldExample() override;
@@ -36,8 +34,10 @@ class VIEWS_EXAMPLES_EXPORT TextfieldExample : public ExampleBase,
bool HandleMouseEvent(Textfield* sender,
const ui::MouseEvent& mouse_event) override;
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ void ClearAllButtonPressed();
+ void AppendButtonPressed();
+ void SetButtonPressed();
+ void SetStyleButtonPressed();
// Textfields for name and password.
Textfield* name_ = nullptr;
diff --git a/chromium/ui/views/examples/toggle_button_example.cc b/chromium/ui/views/examples/toggle_button_example.cc
index 3bc279ffc1e..66f63eb0561 100644
--- a/chromium/ui/views/examples/toggle_button_example.cc
+++ b/chromium/ui/views/examples/toggle_button_example.cc
@@ -29,12 +29,12 @@ void ToggleButtonExample::CreateExampleView(View* container) {
auto layout = std::make_unique<BoxLayout>(BoxLayout::Orientation::kVertical);
layout->set_cross_axis_alignment(BoxLayout::CrossAxisAlignment::kCenter);
container->SetLayoutManager(std::move(layout));
- button_ = container->AddChildView(std::make_unique<ToggleButton>(this));
-}
-
-void ToggleButtonExample::ButtonPressed(Button* sender,
- const ui::Event& event) {
- PrintStatus("Pressed! count: %d", ++count_);
+ button_ = container->AddChildView(
+ std::make_unique<ToggleButton>(base::BindRepeating(
+ [](ToggleButtonExample* example) {
+ PrintStatus("Pressed! count: %d", ++example->count_);
+ },
+ base::Unretained(this))));
}
} // namespace examples
diff --git a/chromium/ui/views/examples/toggle_button_example.h b/chromium/ui/views/examples/toggle_button_example.h
index 90a5891862a..1fca2e5b0bb 100644
--- a/chromium/ui/views/examples/toggle_button_example.h
+++ b/chromium/ui/views/examples/toggle_button_example.h
@@ -6,7 +6,6 @@
#define UI_VIEWS_EXAMPLES_TOGGLE_BUTTON_EXAMPLE_H_
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
namespace views {
@@ -15,8 +14,7 @@ class ToggleButton;
namespace examples {
// ToggleButtonExample exercises a ToggleButton control.
-class VIEWS_EXAMPLES_EXPORT ToggleButtonExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT ToggleButtonExample : public ExampleBase {
public:
ToggleButtonExample();
~ToggleButtonExample() override;
@@ -25,9 +23,6 @@ class VIEWS_EXAMPLES_EXPORT ToggleButtonExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
// The only control in this test.
ToggleButton* button_ = nullptr;
diff --git a/chromium/ui/views/examples/tree_view_example.cc b/chromium/ui/views/examples/tree_view_example.cc
index 372bfbc960f..aebe4305b43 100644
--- a/chromium/ui/views/examples/tree_view_example.cc
+++ b/chromium/ui/views/examples/tree_view_example.cc
@@ -95,16 +95,18 @@ void TreeViewExample::CreateExampleView(View* container) {
tree_view->SetDrawingProvider(
std::make_unique<ExampleTreeViewDrawingProvider>());
auto add = std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TREE_VIEW_ADD_BUTTON_LABEL));
- add->SetFocusForPlatform();
+ base::BindRepeating(&TreeViewExample::AddNewNode, base::Unretained(this)),
+ GetStringUTF16(IDS_TREE_VIEW_ADD_BUTTON_LABEL));
add->SetRequestFocusOnPress(true);
auto remove = std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TREE_VIEW_REMOVE_BUTTON_LABEL));
- remove->SetFocusForPlatform();
+ base::BindRepeating(&TreeViewExample::RemoveSelectedNode,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_TREE_VIEW_REMOVE_BUTTON_LABEL));
remove->SetRequestFocusOnPress(true);
auto change_title = std::make_unique<LabelButton>(
- this, GetStringUTF16(IDS_TREE_VIEW_CHANGE_TITLE_LABEL));
- change_title->SetFocusForPlatform();
+ base::BindRepeating(&TreeViewExample::SetSelectedNodeTitle,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_TREE_VIEW_CHANGE_TITLE_LABEL));
change_title->SetRequestFocusOnPress(true);
container->SetLayoutManager(std::make_unique<views::FlexLayout>())
@@ -142,28 +144,26 @@ void TreeViewExample::AddNewNode() {
tree_view_->SetSelectedNode(new_node);
}
+void TreeViewExample::RemoveSelectedNode() {
+ auto* selected_node = static_cast<NodeType*>(tree_view_->GetSelectedNode());
+ DCHECK(selected_node);
+ DCHECK_NE(model_.GetRoot(), selected_node);
+ model_.Remove(selected_node->parent(), selected_node);
+}
+
+void TreeViewExample::SetSelectedNodeTitle() {
+ auto* selected_node = static_cast<NodeType*>(tree_view_->GetSelectedNode());
+ DCHECK(selected_node);
+ model_.SetTitle(
+ selected_node,
+ selected_node->GetTitle() + GetStringUTF16(IDS_TREE_VIEW_NEW_NODE_LABEL));
+}
+
bool TreeViewExample::IsCommandIdEnabled(int command_id) {
return command_id != ID_REMOVE ||
tree_view_->GetSelectedNode() != model_.GetRoot();
}
-void TreeViewExample::ButtonPressed(Button* sender, const ui::Event& event) {
- NodeType* selected_node =
- static_cast<NodeType*>(tree_view_->GetSelectedNode());
- if (sender == add_) {
- AddNewNode();
- } else if (sender == remove_) {
- DCHECK(selected_node);
- DCHECK_NE(model_.GetRoot(), selected_node);
- model_.Remove(selected_node->parent(), selected_node);
- } else if (sender == change_title_) {
- DCHECK(selected_node);
- model_.SetTitle(selected_node,
- selected_node->GetTitle() +
- GetStringUTF16(IDS_TREE_VIEW_NEW_NODE_LABEL));
- }
-}
-
void TreeViewExample::OnTreeViewSelectionChanged(TreeView* tree_view) {
ui::TreeModelNode* node = tree_view_->GetSelectedNode();
if (node) {
diff --git a/chromium/ui/views/examples/tree_view_example.h b/chromium/ui/views/examples/tree_view_example.h
index 31fa1970244..2a184f8cc81 100644
--- a/chromium/ui/views/examples/tree_view_example.h
+++ b/chromium/ui/views/examples/tree_view_example.h
@@ -11,7 +11,6 @@
#include "ui/base/models/simple_menu_model.h"
#include "ui/base/models/tree_node_model.h"
#include "ui/views/context_menu_controller.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/controls/tree/tree_view.h"
#include "ui/views/controls/tree/tree_view_controller.h"
#include "ui/views/examples/example_base.h"
@@ -29,7 +28,6 @@ namespace examples {
class VIEWS_EXAMPLES_EXPORT TreeViewExample
: public ExampleBase,
- public ButtonListener,
public TreeViewController,
public ContextMenuController,
public ui::SimpleMenuModel::Delegate {
@@ -44,15 +42,13 @@ class VIEWS_EXAMPLES_EXPORT TreeViewExample
// IDs used by the context menu.
enum MenuIDs { ID_EDIT, ID_REMOVE, ID_ADD };
- // Adds a new node.
void AddNewNode();
+ void RemoveSelectedNode();
+ void SetSelectedNodeTitle();
// Non-const version of IsCommandIdEnabled.
bool IsCommandIdEnabled(int command_id);
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
// TreeViewController:
void OnTreeViewSelectionChanged(TreeView* tree_view) override;
bool CanEdit(TreeView* tree_view, ui::TreeModelNode* node) override;
diff --git a/chromium/ui/views/examples/vector_example.cc b/chromium/ui/views/examples/vector_example.cc
index 6ba3ef07b2f..26b9cf9eff9 100644
--- a/chromium/ui/views/examples/vector_example.cc
+++ b/chromium/ui/views/examples/vector_example.cc
@@ -37,9 +37,7 @@ namespace examples {
namespace {
-class VectorIconGallery : public View,
- public TextfieldController,
- public ButtonListener {
+class VectorIconGallery : public View, public TextfieldController {
public:
VectorIconGallery() {
size_input_ = AddChildView(std::make_unique<Textfield>());
@@ -72,7 +70,9 @@ class VectorIconGallery : public View,
file_chooser_ = file_container->AddChildView(std::move(file_chooser));
file_go_button_ =
file_container->AddChildView(std::make_unique<MdTextButton>(
- this, GetStringUTF16(IDS_VECTOR_RENDER_LABEL)));
+ base::BindRepeating(&VectorIconGallery::FileGoButtonPressed,
+ base::Unretained(this)),
+ GetStringUTF16(IDS_VECTOR_RENDER_LABEL)));
file_box->SetFlexForView(file_chooser_, 1);
AddChildView(std::move(file_container));
@@ -109,9 +109,8 @@ class VectorIconGallery : public View,
}
}
- // ButtonListener
- void ButtonPressed(Button* sender, const ui::Event& event) override {
- DCHECK_EQ(file_go_button_, sender);
+ private:
+ void FileGoButtonPressed() {
base::ScopedAllowBlockingForTesting allow_blocking;
#if defined(OS_WIN)
base::FilePath path(file_chooser_->GetText());
@@ -128,7 +127,6 @@ class VectorIconGallery : public View,
Update();
}
- private:
void Update() {
if (!contents_.empty()) {
image_view_->SetImage(
diff --git a/chromium/ui/views/examples/widget_example.cc b/chromium/ui/views/examples/widget_example.cc
index 5365784c28c..1570e690ab3 100644
--- a/chromium/ui/views/examples/widget_example.cc
+++ b/chromium/ui/views/examples/widget_example.cc
@@ -27,33 +27,6 @@ using l10n_util::GetStringUTF8;
namespace views {
namespace examples {
-namespace {
-
-// TODO(ellyjones): This should return unique_ptr<> instead, but
-// CreateDialogWidget doesn't yet have an override that takes that, and can't
-// pending sorting out the mess around WidgetDelegate ownership.
-DialogDelegate* MakeExampleDialog(bool modal) {
- auto dialog = std::make_unique<DialogDelegateView>();
- dialog->SetTitle(IDS_WIDGET_WINDOW_TITLE);
-
- dialog->SetBackground(CreateSolidBackground(SK_ColorGRAY));
- dialog->SetLayoutManager(std::make_unique<BoxLayout>(
- BoxLayout::Orientation::kVertical, gfx::Insets(10), 10));
- dialog->SetExtraView(std::make_unique<MdTextButton>(
- nullptr, GetStringUTF16(IDS_WIDGET_EXTRA_BUTTON)));
- dialog->SetFootnoteView(
- std::make_unique<Label>(GetStringUTF16(IDS_WIDGET_FOOTNOTE_LABEL)));
- dialog->AddChildView(std::make_unique<Label>(
- GetStringUTF16(IDS_WIDGET_DIALOG_CONTENTS_LABEL)));
-
- if (modal)
- dialog->SetModalType(ui::MODAL_TYPE_WINDOW);
-
- return dialog.release();
-}
-
-} // namespace
-
WidgetExample::WidgetExample()
: ExampleBase(GetStringUTF8(IDS_WIDGET_SELECT_LABEL).c_str()) {}
@@ -62,30 +35,61 @@ WidgetExample::~WidgetExample() = default;
void WidgetExample::CreateExampleView(View* container) {
container->SetLayoutManager(std::make_unique<BoxLayout>(
BoxLayout::Orientation::kHorizontal, gfx::Insets(), 10));
- BuildButton(container, GetStringUTF16(IDS_WIDGET_POPUP_BUTTON_LABEL), POPUP);
- BuildButton(container, GetStringUTF16(IDS_WIDGET_DIALOG_BUTTON_LABEL),
- DIALOG);
- BuildButton(container, GetStringUTF16(IDS_WIDGET_MODAL_BUTTON_LABEL),
- MODAL_DIALOG);
+ LabelButton* popup_button =
+ BuildButton(container, GetStringUTF16(IDS_WIDGET_POPUP_BUTTON_LABEL));
+ popup_button->SetCallback(
+ base::BindRepeating(&WidgetExample::ShowWidget, base::Unretained(this),
+ popup_button, Widget::InitParams::TYPE_POPUP));
+ LabelButton* dialog_button =
+ BuildButton(container, GetStringUTF16(IDS_WIDGET_DIALOG_BUTTON_LABEL));
+ dialog_button->SetCallback(
+ base::BindRepeating(&WidgetExample::CreateDialogWidget,
+ base::Unretained(this), dialog_button, false));
+ LabelButton* modal_button =
+ BuildButton(container, GetStringUTF16(IDS_WIDGET_MODAL_BUTTON_LABEL));
+ modal_button->SetCallback(
+ base::BindRepeating(&WidgetExample::CreateDialogWidget,
+ base::Unretained(this), modal_button, true));
#if defined(OS_LINUX) || defined(OS_CHROMEOS)
// Windows does not support TYPE_CONTROL top-level widgets.
- BuildButton(container, GetStringUTF16(IDS_WIDGET_CHILD_WIDGET_BUTTON_LABEL),
- CHILD);
+ LabelButton* control_button = BuildButton(
+ container, GetStringUTF16(IDS_WIDGET_CHILD_WIDGET_BUTTON_LABEL));
+ control_button->SetCallback(
+ base::BindRepeating(&WidgetExample::ShowWidget, base::Unretained(this),
+ control_button, Widget::InitParams::TYPE_CONTROL));
#endif
}
-void WidgetExample::BuildButton(View* container,
- const base::string16& label,
- int tag) {
- LabelButton* button =
- container->AddChildView(std::make_unique<LabelButton>(this, label));
- button->SetFocusForPlatform();
+LabelButton* WidgetExample::BuildButton(View* container,
+ const base::string16& label) {
+ LabelButton* button = container->AddChildView(
+ std::make_unique<LabelButton>(Button::PressedCallback(), label));
button->SetRequestFocusOnPress(true);
- button->set_tag(tag);
+ return button;
+}
+
+void WidgetExample::CreateDialogWidget(View* sender, bool modal) {
+ auto dialog = std::make_unique<DialogDelegateView>();
+ dialog->SetTitle(IDS_WIDGET_WINDOW_TITLE);
+ dialog->SetBackground(CreateSolidBackground(SK_ColorGRAY));
+ dialog->SetLayoutManager(std::make_unique<BoxLayout>(
+ BoxLayout::Orientation::kVertical, gfx::Insets(10), 10));
+ dialog->SetExtraView(std::make_unique<MdTextButton>(
+ Button::PressedCallback(), GetStringUTF16(IDS_WIDGET_EXTRA_BUTTON)));
+ dialog->SetFootnoteView(
+ std::make_unique<Label>(GetStringUTF16(IDS_WIDGET_FOOTNOTE_LABEL)));
+ dialog->AddChildView(std::make_unique<Label>(
+ GetStringUTF16(IDS_WIDGET_DIALOG_CONTENTS_LABEL)));
+ if (modal)
+ dialog->SetModalType(ui::MODAL_TYPE_WINDOW);
+ DialogDelegate::CreateDialogWidget(dialog.release(), nullptr,
+ sender->GetWidget()->GetNativeView())
+ ->Show();
}
-void WidgetExample::ShowWidget(View* sender, Widget::InitParams params) {
+void WidgetExample::ShowWidget(View* sender, Widget::InitParams::Type type) {
// Setup shared Widget hierarchy and bounds parameters.
+ Widget::InitParams params(type);
params.parent = sender->GetWidget()->GetNativeView();
params.bounds =
gfx::Rect(sender->GetBoundsInScreen().CenterPoint(), gfx::Size(300, 200));
@@ -100,42 +104,13 @@ void WidgetExample::ShowWidget(View* sender, Widget::InitParams params) {
contents->SetLayoutManager(
std::make_unique<BoxLayout>(BoxLayout::Orientation::kHorizontal));
contents->SetBackground(CreateSolidBackground(SK_ColorGRAY));
- BuildButton(contents, GetStringUTF16(IDS_WIDGET_CLOSE_BUTTON_LABEL),
- CLOSE_WIDGET);
+ BuildButton(contents, GetStringUTF16(IDS_WIDGET_CLOSE_BUTTON_LABEL))
+ ->SetCallback(
+ base::BindRepeating(&Widget::Close, base::Unretained(widget)));
}
widget->Show();
}
-void WidgetExample::ButtonPressed(Button* sender, const ui::Event& event) {
- switch (sender->tag()) {
- case POPUP:
- ShowWidget(sender, Widget::InitParams(Widget::InitParams::TYPE_POPUP));
- break;
- case DIALOG: {
- // The DialogDelegate will be destroyed by the widget when the created
- // widget is destroyed.
- DialogDelegate::CreateDialogWidget(MakeExampleDialog(false), nullptr,
- sender->GetWidget()->GetNativeView())
- ->Show();
- break;
- }
- case MODAL_DIALOG: {
- // ModalDialogExample will be destroyed by the widget when the created
- // widget is destroyed.
- DialogDelegate::CreateDialogWidget(MakeExampleDialog(true), nullptr,
- sender->GetWidget()->GetNativeView())
- ->Show();
- break;
- }
- case CHILD:
- ShowWidget(sender, Widget::InitParams(Widget::InitParams::TYPE_CONTROL));
- break;
- case CLOSE_WIDGET:
- sender->GetWidget()->Close();
- break;
- }
-}
-
} // namespace examples
} // namespace views
diff --git a/chromium/ui/views/examples/widget_example.h b/chromium/ui/views/examples/widget_example.h
index 1094f135c01..57d8a8ee0ec 100644
--- a/chromium/ui/views/examples/widget_example.h
+++ b/chromium/ui/views/examples/widget_example.h
@@ -8,16 +8,17 @@
#include <string>
#include "base/macros.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/examples/example_base.h"
#include "ui/views/widget/widget.h"
namespace views {
+
+class LabelButton;
+
namespace examples {
// WidgetExample demonstrates how to create a popup widget.
-class VIEWS_EXAMPLES_EXPORT WidgetExample : public ExampleBase,
- public ButtonListener {
+class VIEWS_EXAMPLES_EXPORT WidgetExample : public ExampleBase {
public:
WidgetExample();
~WidgetExample() override;
@@ -26,23 +27,13 @@ class VIEWS_EXAMPLES_EXPORT WidgetExample : public ExampleBase,
void CreateExampleView(View* container) override;
private:
- // Button tags used to identify various commands.
- enum Command {
- POPUP, // Show a popup widget.
- DIALOG, // Show a dialog widget.
- MODAL_DIALOG, // Show a modal dialog widget.
- CHILD, // Show a child widget.
- CLOSE_WIDGET, // Close the sender button's widget.
- };
-
- // Construct a button with the specified |label| and |tag| in |container|.
- void BuildButton(View* container, const base::string16& label, int tag);
-
- // Construct a Widget for |sender|, initialize with |params|, and call Show().
- void ShowWidget(View* sender, Widget::InitParams params);
-
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ // Construct a button with the specified |label| in |container|.
+ LabelButton* BuildButton(View* container, const base::string16& label);
+
+ void CreateDialogWidget(View* sender, bool modal);
+
+ // Construct a Widget for |sender|, initialize with |type|, and call Show().
+ void ShowWidget(View* sender, Widget::InitParams::Type type);
DISALLOW_COPY_AND_ASSIGN(WidgetExample);
};
diff --git a/chromium/ui/views/focus/focus_manager.cc b/chromium/ui/views/focus/focus_manager.cc
index a6900d0ff32..6fe9cab8422 100644
--- a/chromium/ui/views/focus/focus_manager.cc
+++ b/chromium/ui/views/focus/focus_manager.cc
@@ -71,8 +71,7 @@ bool FocusManager::OnKeyEvent(const ui::KeyEvent& event) {
return false;
}
- if ((arrow_key_traversal_enabled_ ||
- arrow_key_traversal_enabled_for_widget_) &&
+ if (IsArrowKeyTraversalEnabledForWidget() &&
ProcessArrowKeyTraversal(event)) {
return false;
}
@@ -169,7 +168,7 @@ bool FocusManager::RotatePaneFocus(Direction direction,
// Initialize |index| to an appropriate starting index if nothing is
// focused initially.
- int index = direction == kBackward ? 0 : count - 1;
+ int index = direction == Direction::kBackward ? 0 : count - 1;
// Check to see if a pane already has focus and update the index accordingly.
const views::View* focused_view = GetFocusedView();
@@ -185,7 +184,7 @@ bool FocusManager::RotatePaneFocus(Direction direction,
// Rotate focus.
int start_index = index;
for (;;) {
- if (direction == kBackward)
+ if (direction == Direction::kBackward)
index--;
else
index++;
@@ -650,4 +649,14 @@ bool FocusManager::RedirectAcceleratorToBubbleAnchorWidget(
return accelerator_processed;
}
+bool FocusManager::IsArrowKeyTraversalEnabledForWidget() const {
+ if (arrow_key_traversal_enabled_)
+ return true;
+
+ Widget* const widget = (focused_view_ && focused_view_->GetWidget())
+ ? focused_view_->GetWidget()
+ : widget_;
+ return widget->widget_delegate()->enable_arrow_key_traversal();
+}
+
} // namespace views
diff --git a/chromium/ui/views/focus/focus_manager.h b/chromium/ui/views/focus/focus_manager.h
index 1f7df49ae79..6175b8ecd74 100644
--- a/chromium/ui/views/focus/focus_manager.h
+++ b/chromium/ui/views/focus/focus_manager.h
@@ -22,12 +22,6 @@
// - The native focus, which is the focus that a gfx::NativeView has.
// - The view focus, which is the focus that a views::View has.
//
-// When registering a view with the FocusManager, the caller can provide a view
-// whose focus will be kept in sync with the view the FocusManager is managing.
-//
-// (Focus registration is already done for you if you subclass the NativeControl
-// class or if you use the NativeViewHost class.)
-//
// When a top window (derived from views::Widget) that is not a child window is
// created, it creates and owns a FocusManager to manage the focus for itself
// and all its child windows.
@@ -43,8 +37,8 @@
// order.
//
// If you are embedding a native view containing a nested RootView (for example
-// by adding a NativeControl that contains a NativeWidgetWin as its native
-// component), then you need to:
+// by adding a view that contains a native widget as its native component),
+// then you need to:
//
// - Override the View::GetFocusTraversable method in your outer component.
// It should return the RootView of the inner component. This is used when
@@ -137,7 +131,7 @@ class VIEWS_EXPORT FocusManager : public ViewObserver {
};
// TODO(dmazzoni): use Direction in place of bool reverse throughout.
- enum Direction { kForward, kBackward };
+ enum class Direction { kForward, kBackward };
enum class FocusCycleWrapping { kEnabled, kDisabled };
@@ -292,11 +286,6 @@ class VIEWS_EXPORT FocusManager : public ViewObserver {
return arrow_key_traversal_enabled_;
}
- // Similar to above, but only for the widget that owns this FocusManager.
- void set_arrow_key_traversal_enabled_for_widget(bool enabled) {
- arrow_key_traversal_enabled_for_widget_ = enabled;
- }
-
// Returns the next focusable view. Traversal starts at |starting_view|. If
// |starting_view| is null, |starting_widget| is consulted to determine which
// Widget to start from. See WidgetDelegate::Params::focus_traverses_out for
@@ -338,13 +327,12 @@ class VIEWS_EXPORT FocusManager : public ViewObserver {
bool RedirectAcceleratorToBubbleAnchorWidget(
const ui::Accelerator& accelerator);
+ // Returns true if arrow key traversal is enabled for the current widget.
+ bool IsArrowKeyTraversalEnabledForWidget() const;
+
// Whether arrow key traversal is enabled globally.
static bool arrow_key_traversal_enabled_;
- // Whether arrow key traversal is enabled for all widgets under the top-level
- // widget that owns the FocusManager.
- bool arrow_key_traversal_enabled_for_widget_ = false;
-
// The top-level Widget this FocusManager is associated with.
Widget* widget_;
diff --git a/chromium/ui/views/focus/focus_manager_factory.h b/chromium/ui/views/focus/focus_manager_factory.h
index 9b0994ebc81..9e6c81c1f4d 100644
--- a/chromium/ui/views/focus/focus_manager_factory.h
+++ b/chromium/ui/views/focus/focus_manager_factory.h
@@ -14,8 +14,8 @@ namespace views {
class FocusManager;
class Widget;
-// A factory to create FocusManager. This is used in unit tests
-// to inject a custom factory.
+// A factory to create FocusManager. This can be used to inject a custom
+// factory.
class VIEWS_EXPORT FocusManagerFactory {
public:
// Create a FocusManager for the given |widget| using the installed Factory.
diff --git a/chromium/ui/views/focus/focus_manager_unittest.cc b/chromium/ui/views/focus/focus_manager_unittest.cc
index ee9a3846c45..9a610d60363 100644
--- a/chromium/ui/views/focus/focus_manager_unittest.cc
+++ b/chromium/ui/views/focus/focus_manager_unittest.cc
@@ -432,78 +432,6 @@ TEST_F(FocusManagerTest, SuspendAccelerators) {
EXPECT_EQ(1, target.accelerator_count());
}
-class FocusManagerDtorTest : public FocusManagerTest {
- protected:
- using DtorTrackVector = std::vector<std::string>;
-
- class FocusManagerDtorTracked : public FocusManager {
- public:
- FocusManagerDtorTracked(Widget* widget, DtorTrackVector* dtor_tracker)
- : FocusManager(widget, nullptr /* delegate */),
- dtor_tracker_(dtor_tracker) {}
-
- FocusManagerDtorTracked(const FocusManagerDtorTracked&) = delete;
- FocusManagerDtorTracked& operator=(const FocusManagerDtorTracked&) = delete;
-
- ~FocusManagerDtorTracked() override {
- dtor_tracker_->push_back("FocusManagerDtorTracked");
- }
-
- DtorTrackVector* dtor_tracker_;
- };
-
- class TestFocusManagerFactory : public FocusManagerFactory {
- public:
- explicit TestFocusManagerFactory(DtorTrackVector* dtor_tracker)
- : dtor_tracker_(dtor_tracker) {}
- TestFocusManagerFactory(const TestFocusManagerFactory&) = delete;
- TestFocusManagerFactory& operator=(const TestFocusManagerFactory&) = delete;
- ~TestFocusManagerFactory() override = default;
-
- std::unique_ptr<FocusManager> CreateFocusManager(Widget* widget) override {
- return std::make_unique<FocusManagerDtorTracked>(widget, dtor_tracker_);
- }
-
- private:
- DtorTrackVector* dtor_tracker_;
- };
-
- class WindowDtorTracked : public Widget {
- public:
- explicit WindowDtorTracked(DtorTrackVector* dtor_tracker)
- : dtor_tracker_(dtor_tracker) {}
-
- ~WindowDtorTracked() override {
- dtor_tracker_->push_back("WindowDtorTracked");
- }
-
- DtorTrackVector* dtor_tracker_;
- };
-
- void SetUp() override {
- ViewsTestBase::SetUp();
- FocusManagerFactory::Install(new TestFocusManagerFactory(&dtor_tracker_));
- // Create WindowDtorTracked that uses FocusManagerDtorTracked.
- Widget* widget = new WindowDtorTracked(&dtor_tracker_);
- Widget::InitParams params;
- params.delegate = this;
- params.bounds = gfx::Rect(0, 0, 100, 100);
- widget->Init(std::move(params));
-
- tracked_focus_manager_ =
- static_cast<FocusManagerDtorTracked*>(GetFocusManager());
- widget->Show();
- }
-
- void TearDown() override {
- FocusManagerFactory::Install(nullptr);
- ViewsTestBase::TearDown();
- }
-
- FocusManager* tracked_focus_manager_;
- DtorTrackVector dtor_tracker_;
-};
-
namespace {
class FocusInAboutToRequestFocusFromTabTraversalView : public View {
@@ -581,44 +509,46 @@ TEST_F(FocusManagerTest, RotatePaneFocus) {
FocusManager* focus_manager = GetWidget()->GetFocusManager();
// Advance forwards. Focus should stay trapped within each pane.
- EXPECT_TRUE(focus_manager->RotatePaneFocus(
- FocusManager::kForward, FocusManager::FocusCycleWrapping::kEnabled));
+ using Direction = FocusManager::Direction;
+ using FocusCycleWrapping = FocusManager::FocusCycleWrapping;
+ EXPECT_TRUE(focus_manager->RotatePaneFocus(Direction::kForward,
+ FocusCycleWrapping::kEnabled));
EXPECT_EQ(v1, focus_manager->GetFocusedView());
focus_manager->AdvanceFocus(false);
EXPECT_EQ(v2, focus_manager->GetFocusedView());
focus_manager->AdvanceFocus(false);
EXPECT_EQ(v1, focus_manager->GetFocusedView());
- EXPECT_TRUE(focus_manager->RotatePaneFocus(
- FocusManager::kForward, FocusManager::FocusCycleWrapping::kEnabled));
+ EXPECT_TRUE(focus_manager->RotatePaneFocus(Direction::kForward,
+ FocusCycleWrapping::kEnabled));
EXPECT_EQ(v3, focus_manager->GetFocusedView());
focus_manager->AdvanceFocus(false);
EXPECT_EQ(v4, focus_manager->GetFocusedView());
focus_manager->AdvanceFocus(false);
EXPECT_EQ(v3, focus_manager->GetFocusedView());
- EXPECT_TRUE(focus_manager->RotatePaneFocus(
- FocusManager::kForward, FocusManager::FocusCycleWrapping::kEnabled));
+ EXPECT_TRUE(focus_manager->RotatePaneFocus(Direction::kForward,
+ FocusCycleWrapping::kEnabled));
EXPECT_EQ(v1, focus_manager->GetFocusedView());
// Advance backwards.
- EXPECT_TRUE(focus_manager->RotatePaneFocus(
- FocusManager::kBackward, FocusManager::FocusCycleWrapping::kEnabled));
+ EXPECT_TRUE(focus_manager->RotatePaneFocus(Direction::kBackward,
+ FocusCycleWrapping::kEnabled));
EXPECT_EQ(v3, focus_manager->GetFocusedView());
- EXPECT_TRUE(focus_manager->RotatePaneFocus(
- FocusManager::kBackward, FocusManager::FocusCycleWrapping::kEnabled));
+ EXPECT_TRUE(focus_manager->RotatePaneFocus(Direction::kBackward,
+ FocusCycleWrapping::kEnabled));
EXPECT_EQ(v1, focus_manager->GetFocusedView());
// Advance without wrap. When it gets to the end of the list of
// panes, RotatePaneFocus should return false but the current
// focused view shouldn't change.
- EXPECT_TRUE(focus_manager->RotatePaneFocus(
- FocusManager::kForward, FocusManager::FocusCycleWrapping::kDisabled));
+ EXPECT_TRUE(focus_manager->RotatePaneFocus(Direction::kForward,
+ FocusCycleWrapping::kDisabled));
EXPECT_EQ(v3, focus_manager->GetFocusedView());
- EXPECT_FALSE(focus_manager->RotatePaneFocus(
- FocusManager::kForward, FocusManager::FocusCycleWrapping::kDisabled));
+ EXPECT_FALSE(focus_manager->RotatePaneFocus(Direction::kForward,
+ FocusCycleWrapping::kDisabled));
EXPECT_EQ(v3, focus_manager->GetFocusedView());
}
diff --git a/chromium/ui/views/focus/focus_search.cc b/chromium/ui/views/focus/focus_search.cc
index 5b2d36d025b..1443f3ec604 100644
--- a/chromium/ui/views/focus/focus_search.cc
+++ b/chromium/ui/views/focus/focus_search.cc
@@ -6,11 +6,11 @@
#include "base/logging.h"
#include "build/build_config.h"
-#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/focus/focus_manager.h"
#include "ui/views/view.h"
#include "ui/views/view_class_properties.h"
#include "ui/views/widget/widget.h"
+#include "ui/views/window/dialog_delegate.h"
namespace views {
@@ -203,8 +203,7 @@ View* FocusSearch::FindNextFocusableViewImpl(
// Check to see if we should navigate into a dialog anchored at this view.
if (can_go_into_anchored_dialog ==
AnchoredDialogPolicy::kCanGoIntoAnchoredDialog) {
- BubbleDialogDelegate* bubble =
- starting_view->GetProperty(kAnchoredDialogKey);
+ DialogDelegate* bubble = starting_view->GetProperty(kAnchoredDialogKey);
if (bubble) {
*focus_traversable = bubble->GetWidget()->GetFocusTraversable();
*focus_traversable_view = starting_view;
@@ -230,7 +229,7 @@ View* FocusSearch::FindNextFocusableViewImpl(
while (parent && parent != root_) {
if (can_go_into_anchored_dialog ==
AnchoredDialogPolicy::kCanGoIntoAnchoredDialog) {
- BubbleDialogDelegate* bubble = parent->GetProperty(kAnchoredDialogKey);
+ DialogDelegate* bubble = parent->GetProperty(kAnchoredDialogKey);
if (bubble) {
*focus_traversable = bubble->GetWidget()->GetFocusTraversable();
*focus_traversable_view = starting_view;
@@ -301,8 +300,7 @@ View* FocusSearch::FindPreviousFocusableViewImpl(
// Check to see if we should navigate into a dialog anchored at this view.
if (can_go_into_anchored_dialog ==
AnchoredDialogPolicy::kCanGoIntoAnchoredDialog) {
- BubbleDialogDelegate* bubble =
- starting_view->GetProperty(kAnchoredDialogKey);
+ DialogDelegate* bubble = starting_view->GetProperty(kAnchoredDialogKey);
if (bubble) {
*focus_traversable = bubble->GetWidget()->GetFocusTraversable();
*focus_traversable_view = starting_view;
diff --git a/chromium/ui/views/focus/focus_traversal_unittest.cc b/chromium/ui/views/focus/focus_traversal_unittest.cc
index b80dceb1f70..9fc96e0b3ce 100644
--- a/chromium/ui/views/focus/focus_traversal_unittest.cc
+++ b/chromium/ui/views/focus/focus_traversal_unittest.cc
@@ -372,8 +372,8 @@ void FocusTraversalTest::InitContentView() {
y += label_height + gap_between_labels;
- auto button =
- std::make_unique<MdTextButton>(nullptr, ASCIIToUTF16("Click me"));
+ auto button = std::make_unique<MdTextButton>(Button::PressedCallback(),
+ ASCIIToUTF16("Click me"));
button->SetBounds(label_x, y + 10, 80, 30);
button->SetID(FRUIT_BUTTON_ID);
left_container_->AddChildView(std::move(button));
@@ -470,18 +470,21 @@ void FocusTraversalTest::InitContentView() {
y = 250;
int width = 60;
- button = std::make_unique<MdTextButton>(nullptr, ASCIIToUTF16("OK"));
+ button = std::make_unique<MdTextButton>(Button::PressedCallback(),
+ ASCIIToUTF16("OK"));
button->SetID(OK_BUTTON_ID);
button->SetIsDefault(true);
button->SetBounds(150, y, width, 30);
GetContentsView()->AddChildView(std::move(button));
- button = std::make_unique<MdTextButton>(nullptr, ASCIIToUTF16("Cancel"));
+ button = std::make_unique<MdTextButton>(Button::PressedCallback(),
+ ASCIIToUTF16("Cancel"));
button->SetID(CANCEL_BUTTON_ID);
button->SetBounds(220, y, width, 30);
GetContentsView()->AddChildView(std::move(button));
- button = std::make_unique<MdTextButton>(nullptr, ASCIIToUTF16("Help"));
+ button = std::make_unique<MdTextButton>(Button::PressedCallback(),
+ ASCIIToUTF16("Help"));
button->SetID(HELP_BUTTON_ID);
button->SetBounds(290, y, width, 30);
GetContentsView()->AddChildView(std::move(button));
@@ -531,7 +534,8 @@ void FocusTraversalTest::InitContentView() {
text_field_ptr->SetBounds(10, 10, 100, 20);
text_field_ptr->SetID(SEARCH_TEXTFIELD_ID);
- button = std::make_unique<MdTextButton>(nullptr, ASCIIToUTF16("Search"));
+ button = std::make_unique<MdTextButton>(Button::PressedCallback(),
+ ASCIIToUTF16("Search"));
button->SetBounds(112, 5, 60, 30);
button->SetID(SEARCH_BUTTON_ID);
border_contents->AddChildView(std::move(button));
@@ -555,11 +559,13 @@ void FocusTraversalTest::InitContentView() {
view_contents->SetFocusBehavior(View::FocusBehavior::ALWAYS);
view_contents->SetBackground(CreateSolidBackground(SK_ColorBLUE));
view_contents->SetID(THUMBNAIL_CONTAINER_ID);
- button = std::make_unique<MdTextButton>(nullptr, ASCIIToUTF16("Star"));
+ button = std::make_unique<MdTextButton>(Button::PressedCallback(),
+ ASCIIToUTF16("Star"));
button->SetBounds(5, 5, 50, 30);
button->SetID(THUMBNAIL_STAR_ID);
view_contents->AddChildView(std::move(button));
- button = std::make_unique<MdTextButton>(nullptr, ASCIIToUTF16("SuperStar"));
+ button = std::make_unique<MdTextButton>(Button::PressedCallback(),
+ ASCIIToUTF16("SuperStar"));
button->SetBounds(60, 5, 100, 30);
button->SetID(THUMBNAIL_SUPER_STAR_ID);
view_contents->AddChildView(std::move(button));
diff --git a/chromium/ui/views/layout/box_layout.cc b/chromium/ui/views/layout/box_layout.cc
index 6dec3c98612..57d071b96c5 100644
--- a/chromium/ui/views/layout/box_layout.cc
+++ b/chromium/ui/views/layout/box_layout.cc
@@ -99,6 +99,28 @@ BoxLayout::BoxLayout(BoxLayout::Orientation orientation,
BoxLayout::~BoxLayout() = default;
+void BoxLayout::SetOrientation(Orientation orientation) {
+ if (orientation_ != orientation) {
+ orientation_ = orientation;
+ InvalidateLayout();
+ }
+}
+
+BoxLayout::Orientation BoxLayout::GetOrientation() const {
+ return orientation_;
+}
+
+void BoxLayout::SetCollapseMarginsSpacing(bool collapse_margins_spacing) {
+ if (collapse_margins_spacing != collapse_margins_spacing_) {
+ collapse_margins_spacing_ = collapse_margins_spacing;
+ InvalidateLayout();
+ }
+}
+
+bool BoxLayout::GetCollapseMarginsSpacing() const {
+ return collapse_margins_spacing_;
+}
+
void BoxLayout::SetFlexForView(const View* view,
int flex_weight,
bool use_min_size) {
@@ -120,6 +142,10 @@ void BoxLayout::SetDefaultFlex(int default_flex) {
default_flex_ = default_flex;
}
+int BoxLayout::GetDefaultFlex() const {
+ return default_flex_;
+}
+
void BoxLayout::Layout(View* host) {
DCHECK_EQ(host_, host);
gfx::Rect child_area(host->GetContentsBounds());
diff --git a/chromium/ui/views/layout/box_layout.h b/chromium/ui/views/layout/box_layout.h
index 63567e762af..c00f93d8d4f 100644
--- a/chromium/ui/views/layout/box_layout.h
+++ b/chromium/ui/views/layout/box_layout.h
@@ -7,8 +7,6 @@
#include <map>
-#include "base/compiler_specific.h"
-#include "base/macros.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/layout/layout_manager.h"
#include "ui/views/view.h"
@@ -106,31 +104,48 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager {
// SSSSSSSSSSSSSSSSSSSS
// --------------------
//
- explicit BoxLayout(Orientation orientation,
+ explicit BoxLayout(Orientation orientation = Orientation::kHorizontal,
const gfx::Insets& inside_border_insets = gfx::Insets(),
int between_child_spacing = 0,
bool collapse_margins_spacing = false);
~BoxLayout() override;
+ void SetOrientation(Orientation orientation);
+ Orientation GetOrientation() const;
+
+ // TODO(tluk): These class member setters should likely be calling
+ // LayoutManager::InvalidateLayout() .
void set_main_axis_alignment(MainAxisAlignment main_axis_alignment) {
main_axis_alignment_ = main_axis_alignment;
}
+ MainAxisAlignment main_axis_alignment() const { return main_axis_alignment_; }
void set_cross_axis_alignment(CrossAxisAlignment cross_axis_alignment) {
cross_axis_alignment_ = cross_axis_alignment;
}
+ CrossAxisAlignment cross_axis_alignment() const {
+ return cross_axis_alignment_;
+ }
void set_inside_border_insets(const gfx::Insets& insets) {
inside_border_insets_ = insets;
}
+ const gfx::Insets& inside_border_insets() const {
+ return inside_border_insets_;
+ }
void set_minimum_cross_axis_size(int size) {
minimum_cross_axis_size_ = size;
}
+ int minimum_cross_axis_size() const { return minimum_cross_axis_size_; }
void set_between_child_spacing(int spacing) {
between_child_spacing_ = spacing;
}
+ int between_child_spacing() const { return between_child_spacing_; }
+
+ void SetCollapseMarginsSpacing(bool collapse_margins_spacing);
+ bool GetCollapseMarginsSpacing() const;
// Sets the flex weight for the given |view|. Using the preferred size as
// the basis, free space along the main axis is distributed to views in the
@@ -152,6 +167,7 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager {
// Sets the flex for views to use when none is specified.
void SetDefaultFlex(int default_flex);
+ int GetDefaultFlex() const;
// Overridden from views::LayoutManager:
void Installed(View* host) override;
@@ -304,7 +320,7 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager {
// Return the last visible view in the host or nullptr if none are visible.
View* LastVisibleView() const;
- const Orientation orientation_;
+ Orientation orientation_;
// Spacing between child views and host view border.
gfx::Insets inside_border_insets_;
@@ -330,12 +346,10 @@ class VIEWS_EXPORT BoxLayout : public LayoutManager {
int minimum_cross_axis_size_ = 0;
// Adjacent view margins and spacing should be collapsed.
- const bool collapse_margins_spacing_;
+ bool collapse_margins_spacing_;
// The view that this BoxLayout is managing the layout for.
views::View* host_ = nullptr;
-
- DISALLOW_IMPLICIT_CONSTRUCTORS(BoxLayout);
};
} // namespace views
diff --git a/chromium/ui/views/layout/box_layout_view.cc b/chromium/ui/views/layout/box_layout_view.cc
new file mode 100644
index 00000000000..452fe64da15
--- /dev/null
+++ b/chromium/ui/views/layout/box_layout_view.cc
@@ -0,0 +1,135 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/layout/box_layout_view.h"
+
+#include <memory>
+
+#include "ui/gfx/geometry/insets.h"
+#include "ui/views/layout/layout_manager.h"
+
+namespace views {
+
+BoxLayoutView::BoxLayoutView()
+ : layout_(SetLayoutManager(std::make_unique<BoxLayout>())),
+ orientation_(layout_->GetOrientation()),
+ main_axis_alignment_(layout_->main_axis_alignment()),
+ cross_axis_alignment_(layout_->cross_axis_alignment()),
+ inside_border_insets_(layout_->inside_border_insets()),
+ minimum_cross_axis_size_(layout_->minimum_cross_axis_size()),
+ between_child_spacing_(layout_->between_child_spacing()),
+ collapse_margins_spacing_(layout_->GetCollapseMarginsSpacing()),
+ default_flex_(layout_->GetDefaultFlex()) {}
+
+void BoxLayoutView::SetOrientation(BoxLayout::Orientation orientation) {
+ if (orientation_ == orientation)
+ return;
+ layout_->SetOrientation(orientation);
+ orientation_ = orientation;
+ OnPropertyChanged(&orientation_, kPropertyEffectsLayout);
+}
+
+BoxLayout::Orientation BoxLayoutView::GetOrientation() const {
+ return orientation_;
+}
+
+void BoxLayoutView::SetMainAxisAlignment(
+ BoxLayout::MainAxisAlignment main_axis_alignment) {
+ if (main_axis_alignment_ == main_axis_alignment)
+ return;
+ layout_->set_main_axis_alignment(main_axis_alignment);
+ main_axis_alignment_ = main_axis_alignment;
+ OnPropertyChanged(&main_axis_alignment_, kPropertyEffectsLayout);
+}
+
+BoxLayout::MainAxisAlignment BoxLayoutView::GetMainAxisAlignment() const {
+ return main_axis_alignment_;
+}
+
+void BoxLayoutView::SetCrossAxisAlignment(
+ BoxLayout::CrossAxisAlignment cross_axis_alignment) {
+ if (cross_axis_alignment_ == cross_axis_alignment)
+ return;
+ layout_->set_cross_axis_alignment(cross_axis_alignment);
+ cross_axis_alignment_ = cross_axis_alignment;
+ OnPropertyChanged(&cross_axis_alignment_, kPropertyEffectsLayout);
+}
+
+BoxLayout::CrossAxisAlignment BoxLayoutView::GetCrossAxisAlignment() const {
+ return cross_axis_alignment_;
+}
+
+void BoxLayoutView::SetInsideBorderInsets(const gfx::Insets& insets) {
+ if (inside_border_insets_ == insets)
+ return;
+ layout_->set_inside_border_insets(insets);
+ inside_border_insets_ = insets;
+ OnPropertyChanged(&inside_border_insets_, kPropertyEffectsLayout);
+}
+
+const gfx::Insets& BoxLayoutView::GetInsideBorderInsets() const {
+ return inside_border_insets_;
+}
+
+void BoxLayoutView::SetMinimumCrossAxisSize(int size) {
+ if (minimum_cross_axis_size_ == size)
+ return;
+ layout_->set_minimum_cross_axis_size(size);
+ minimum_cross_axis_size_ = size;
+ OnPropertyChanged(&minimum_cross_axis_size_, kPropertyEffectsLayout);
+}
+
+int BoxLayoutView::GetMinimumCrossAxisSize() const {
+ return minimum_cross_axis_size_;
+}
+
+void BoxLayoutView::SetBetweenChildSpacing(int spacing) {
+ if (between_child_spacing_ == spacing)
+ return;
+ layout_->set_between_child_spacing(spacing);
+ between_child_spacing_ = spacing;
+ OnPropertyChanged(&between_child_spacing_, kPropertyEffectsLayout);
+}
+
+int BoxLayoutView::GetBetweenChildSpacing() const {
+ return between_child_spacing_;
+}
+
+void BoxLayoutView::SetCollapseMarginsSpacing(bool collapse_margins_spacing) {
+ if (collapse_margins_spacing_ == collapse_margins_spacing)
+ return;
+ layout_->SetCollapseMarginsSpacing(collapse_margins_spacing);
+ collapse_margins_spacing_ = collapse_margins_spacing;
+ OnPropertyChanged(&collapse_margins_spacing_, kPropertyEffectsLayout);
+}
+
+bool BoxLayoutView::GetCollapseMarginsSpacing() const {
+ return collapse_margins_spacing_;
+}
+
+void BoxLayoutView::SetDefaultFlex(int default_flex) {
+ if (default_flex_ == default_flex)
+ return;
+ layout_->SetDefaultFlex(default_flex);
+ default_flex_ = default_flex;
+ OnPropertyChanged(&default_flex_, kPropertyEffectsLayout);
+}
+
+int BoxLayoutView::GetDefaultFlex() const {
+ return default_flex_;
+}
+
+void BoxLayoutView::SetFlexForView(const View* view,
+ int flex,
+ bool use_min_size) {
+ layout_->SetFlexForView(view, flex, use_min_size);
+ InvalidateLayout();
+}
+
+void BoxLayoutView::ClearFlexForView(const View* view) {
+ layout_->ClearFlexForView(view);
+ InvalidateLayout();
+}
+
+} // namespace views
diff --git a/chromium/ui/views/layout/box_layout_view.h b/chromium/ui/views/layout/box_layout_view.h
new file mode 100644
index 00000000000..9b0dcad42fe
--- /dev/null
+++ b/chromium/ui/views/layout/box_layout_view.h
@@ -0,0 +1,83 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_LAYOUT_BOX_LAYOUT_VIEW_H_
+#define UI_VIEWS_LAYOUT_BOX_LAYOUT_VIEW_H_
+
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/metadata/view_factory.h"
+#include "ui/views/view.h"
+
+namespace gfx {
+class Insets;
+} // namespace gfx
+
+namespace views {
+
+class VIEWS_EXPORT BoxLayoutView : public View {
+ public:
+ BoxLayoutView();
+ BoxLayoutView(BoxLayoutView&) = delete;
+ BoxLayoutView& operator=(BoxLayoutView&) = delete;
+ ~BoxLayoutView() override = default;
+
+ void SetOrientation(BoxLayout::Orientation orientation);
+ BoxLayout::Orientation GetOrientation() const;
+
+ void SetMainAxisAlignment(BoxLayout::MainAxisAlignment main_axis_alignment);
+ BoxLayout::MainAxisAlignment GetMainAxisAlignment() const;
+
+ void SetCrossAxisAlignment(
+ BoxLayout::CrossAxisAlignment cross_axis_alignment);
+ BoxLayout::CrossAxisAlignment GetCrossAxisAlignment() const;
+
+ void SetInsideBorderInsets(const gfx::Insets& insets);
+ const gfx::Insets& GetInsideBorderInsets() const;
+
+ void SetMinimumCrossAxisSize(int size);
+ int GetMinimumCrossAxisSize() const;
+
+ void SetBetweenChildSpacing(int spacing);
+ int GetBetweenChildSpacing() const;
+
+ void SetCollapseMarginsSpacing(bool collapse_margins_spacing);
+ bool GetCollapseMarginsSpacing() const;
+
+ void SetDefaultFlex(int default_flex);
+ int GetDefaultFlex() const;
+
+ void SetFlexForView(const View* view, int flex, bool use_min_size = false);
+ void ClearFlexForView(const View* view);
+
+ private:
+ BoxLayout* const layout_;
+
+ // TODO(tluk): Merge these with the values in BoxLayout after transition to
+ // layout views is complete.
+ BoxLayout::Orientation orientation_;
+ BoxLayout::MainAxisAlignment main_axis_alignment_;
+ BoxLayout::CrossAxisAlignment cross_axis_alignment_;
+ gfx::Insets inside_border_insets_;
+ int minimum_cross_axis_size_;
+ int between_child_spacing_;
+ int collapse_margins_spacing_;
+ int default_flex_;
+};
+
+BEGIN_VIEW_BUILDER(VIEWS_EXPORT, BoxLayoutView, View)
+VIEW_BUILDER_PROPERTY(BoxLayout::Orientation, Orientation)
+VIEW_BUILDER_PROPERTY(BoxLayout::MainAxisAlignment, MainAxisAlignment)
+VIEW_BUILDER_PROPERTY(BoxLayout::CrossAxisAlignment, CrossAxisAlignment)
+VIEW_BUILDER_PROPERTY(const gfx::Insets, InsideBorderInsets)
+VIEW_BUILDER_PROPERTY(int, MinimumCrossAxisSize)
+VIEW_BUILDER_PROPERTY(int, BetweenChildSpacing)
+VIEW_BUILDER_PROPERTY(int, CollapseMarginsSpacing)
+VIEW_BUILDER_PROPERTY(int, DefaultFlex)
+END_VIEW_BUILDER
+
+} // namespace views
+
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, BoxLayoutView)
+
+#endif // UI_VIEWS_LAYOUT_BOX_LAYOUT_VIEW_H_
diff --git a/chromium/ui/views/layout/box_layout_view_unittest.cc b/chromium/ui/views/layout/box_layout_view_unittest.cc
new file mode 100644
index 00000000000..0873e57152d
--- /dev/null
+++ b/chromium/ui/views/layout/box_layout_view_unittest.cc
@@ -0,0 +1,100 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/layout/box_layout_view.h"
+
+#include <memory>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/insets.h"
+#include "ui/views/view_test_api.h"
+
+namespace views {
+
+class BoxLayoutViewTest : public testing::Test {
+ public:
+ void SetUp() override { host_ = std::make_unique<BoxLayoutView>(); }
+
+ BoxLayoutView* host() { return host_.get(); }
+
+ private:
+ std::unique_ptr<BoxLayoutView> host_;
+};
+
+TEST_F(BoxLayoutViewTest, LayoutInvalidationWhenPropertyChanged) {
+ ViewTestApi view_test_api(host());
+ auto reset_layout = [&]() {
+ EXPECT_TRUE(view_test_api.needs_layout());
+ // Call layout() to set layout to a valid state.
+ host()->Layout();
+ };
+
+ // Ensure host() starts with a valid layout.
+ host()->Layout();
+
+ EXPECT_FALSE(view_test_api.needs_layout());
+ EXPECT_NE(BoxLayout::Orientation::kVertical, host()->GetOrientation());
+ host()->SetOrientation(BoxLayout::Orientation::kVertical);
+ reset_layout();
+
+ EXPECT_FALSE(view_test_api.needs_layout());
+ EXPECT_NE(BoxLayout::MainAxisAlignment::kEnd, host()->GetMainAxisAlignment());
+ host()->SetMainAxisAlignment(BoxLayout::MainAxisAlignment::kEnd);
+ reset_layout();
+
+ EXPECT_FALSE(view_test_api.needs_layout());
+ EXPECT_NE(BoxLayout::CrossAxisAlignment::kEnd,
+ host()->GetCrossAxisAlignment());
+ host()->SetCrossAxisAlignment(BoxLayout::CrossAxisAlignment::kEnd);
+ reset_layout();
+
+ EXPECT_FALSE(view_test_api.needs_layout());
+ constexpr gfx::Insets inside_border_insets(10, 10);
+ EXPECT_NE(inside_border_insets, host()->GetInsideBorderInsets());
+ host()->SetInsideBorderInsets(inside_border_insets);
+ reset_layout();
+
+ EXPECT_FALSE(view_test_api.needs_layout());
+ constexpr int minimum_cross_axis_size = 10;
+ EXPECT_NE(minimum_cross_axis_size, host()->GetMinimumCrossAxisSize());
+ host()->SetMinimumCrossAxisSize(minimum_cross_axis_size);
+ reset_layout();
+
+ EXPECT_FALSE(view_test_api.needs_layout());
+ constexpr int between_child_spacing = 10;
+ EXPECT_NE(between_child_spacing, host()->GetBetweenChildSpacing());
+ host()->SetBetweenChildSpacing(between_child_spacing);
+ reset_layout();
+
+ EXPECT_FALSE(view_test_api.needs_layout());
+ constexpr bool collapse_margins_spacing = true;
+ EXPECT_NE(collapse_margins_spacing, host()->GetCollapseMarginsSpacing());
+ host()->SetCollapseMarginsSpacing(collapse_margins_spacing);
+ reset_layout();
+
+ EXPECT_FALSE(view_test_api.needs_layout());
+ constexpr int default_flex = 10;
+ EXPECT_NE(default_flex, host()->GetDefaultFlex());
+ host()->SetDefaultFlex(default_flex);
+ reset_layout();
+}
+
+TEST_F(BoxLayoutViewTest, NoLayoutInvalidationWhenPropertyUnchanged) {
+ ViewTestApi view_test_api(host());
+
+ // Ensure view starts with a valid layout.
+ host()->Layout();
+ EXPECT_FALSE(view_test_api.needs_layout());
+ host()->SetOrientation(host()->GetOrientation());
+ host()->SetMainAxisAlignment(host()->GetMainAxisAlignment());
+ host()->SetCrossAxisAlignment(host()->GetCrossAxisAlignment());
+ host()->SetInsideBorderInsets(host()->GetInsideBorderInsets());
+ host()->SetMinimumCrossAxisSize(host()->GetMinimumCrossAxisSize());
+ host()->SetBetweenChildSpacing(host()->GetBetweenChildSpacing());
+ host()->SetCollapseMarginsSpacing(host()->GetCollapseMarginsSpacing());
+ host()->SetDefaultFlex(host()->GetDefaultFlex());
+ EXPECT_FALSE(view_test_api.needs_layout());
+}
+
+} // namespace views
diff --git a/chromium/ui/views/layout/flex_layout_view.cc b/chromium/ui/views/layout/flex_layout_view.cc
index 051a85a6bee..0ed1c1e7929 100644
--- a/chromium/ui/views/layout/flex_layout_view.cc
+++ b/chromium/ui/views/layout/flex_layout_view.cc
@@ -6,47 +6,41 @@
#include <memory>
-namespace {
-
-// An enum giving different RenderText properties unique keys for the
-// OnPropertyChanged call.
-enum LabelPropertyKey {
- kOrientation = 1,
- kMainAxisAlignment,
- kCrossAxisAlignment,
- kInteriorMargin,
- kMinimumCrossAxisSize,
- kCollapseMargins,
- kIncludeHostInsetsInLayout,
- kIgnoreMainAxisMargins,
- kFlexAllocationOrder,
-};
-
-} // namespace
-
namespace views {
FlexLayoutView::FlexLayoutView()
- : layout_(SetLayoutManager(std::make_unique<FlexLayout>())) {}
+ : layout_(SetLayoutManager(std::make_unique<FlexLayout>())),
+ orientation_(layout_->orientation()),
+ main_axis_alignment_(layout_->main_axis_alignment()),
+ cross_axis_alignment_(layout_->cross_axis_alignment()),
+ interior_margin_(layout_->interior_margin()),
+ minimum_cross_axis_size_(layout_->minimum_cross_axis_size()),
+ collapse_margins_(layout_->collapse_margins()),
+ include_host_insets_in_layout_(layout_->include_host_insets_in_layout()),
+ ignore_default_main_axis_margins_(
+ layout_->ignore_default_main_axis_margins()),
+ flex_allocation_order_(layout_->flex_allocation_order()) {}
FlexLayoutView::~FlexLayoutView() = default;
void FlexLayoutView::SetOrientation(LayoutOrientation orientation) {
- if (orientation == layout_->orientation())
+ if (orientation_ == orientation)
return;
layout_->SetOrientation(orientation);
- OnPropertyChanged(&layout_ + kOrientation, kPropertyEffectsLayout);
+ orientation_ = orientation;
+ OnPropertyChanged(&orientation_, kPropertyEffectsLayout);
}
LayoutOrientation FlexLayoutView::GetOrientation() const {
- return layout_->orientation();
+ return orientation_;
}
void FlexLayoutView::SetMainAxisAlignment(LayoutAlignment main_axis_alignment) {
- if (main_axis_alignment == layout_->main_axis_alignment())
+ if (main_axis_alignment_ == main_axis_alignment)
return;
layout_->SetMainAxisAlignment(main_axis_alignment);
- OnPropertyChanged(&layout_ + kMainAxisAlignment, kPropertyEffectsLayout);
+ main_axis_alignment_ = main_axis_alignment;
+ OnPropertyChanged(&main_axis_alignment_, kPropertyEffectsLayout);
}
LayoutAlignment FlexLayoutView::GetMainAxisAlignment() const {
@@ -55,86 +49,91 @@ LayoutAlignment FlexLayoutView::GetMainAxisAlignment() const {
void FlexLayoutView::SetCrossAxisAlignment(
LayoutAlignment cross_axis_alignment) {
- if (cross_axis_alignment == layout_->cross_axis_alignment())
+ if (cross_axis_alignment_ == cross_axis_alignment)
return;
layout_->SetCrossAxisAlignment(cross_axis_alignment);
- OnPropertyChanged(&layout_ + kCrossAxisAlignment, kPropertyEffectsLayout);
+ cross_axis_alignment_ = cross_axis_alignment;
+ OnPropertyChanged(&cross_axis_alignment_, kPropertyEffectsLayout);
}
LayoutAlignment FlexLayoutView::GetCrossAxisAlignment() const {
- return layout_->cross_axis_alignment();
+ return cross_axis_alignment_;
}
void FlexLayoutView::SetInteriorMargin(const gfx::Insets& interior_margin) {
- if (interior_margin == layout_->interior_margin())
+ if (interior_margin_ == interior_margin)
return;
layout_->SetInteriorMargin(interior_margin);
- OnPropertyChanged(&layout_ + kInteriorMargin, kPropertyEffectsLayout);
+ interior_margin_ = interior_margin;
+ OnPropertyChanged(&interior_margin_, kPropertyEffectsLayout);
}
const gfx::Insets& FlexLayoutView::GetInteriorMargin() const {
- return layout_->interior_margin();
+ return interior_margin_;
}
void FlexLayoutView::SetMinimumCrossAxisSize(int size) {
- if (size == layout_->minimum_cross_axis_size())
+ if (minimum_cross_axis_size_ == size)
return;
layout_->SetMinimumCrossAxisSize(size);
- OnPropertyChanged(&layout_ + kMinimumCrossAxisSize, kPropertyEffectsLayout);
+ minimum_cross_axis_size_ = size;
+ OnPropertyChanged(&minimum_cross_axis_size_, kPropertyEffectsLayout);
}
int FlexLayoutView::GetMinimumCrossAxisSize() const {
- return layout_->minimum_cross_axis_size();
+ return minimum_cross_axis_size_;
}
void FlexLayoutView::SetCollapseMargins(bool collapse_margins) {
- if (collapse_margins == layout_->collapse_margins())
+ if (collapse_margins_ == collapse_margins)
return;
layout_->SetCollapseMargins(collapse_margins);
- OnPropertyChanged(&layout_ + kCollapseMargins, kPropertyEffectsLayout);
+ collapse_margins_ = collapse_margins;
+ OnPropertyChanged(&collapse_margins_, kPropertyEffectsLayout);
}
bool FlexLayoutView::GetCollapseMargins() const {
- return layout_->collapse_margins();
+ return collapse_margins_;
}
void FlexLayoutView::SetIncludeHostInsetsInLayout(
bool include_host_insets_in_layout) {
- if (include_host_insets_in_layout == layout_->include_host_insets_in_layout())
+ if (include_host_insets_in_layout_ == include_host_insets_in_layout)
return;
layout_->SetIncludeHostInsetsInLayout(include_host_insets_in_layout);
- OnPropertyChanged(&layout_ + kIncludeHostInsetsInLayout,
- kPropertyEffectsLayout);
+ include_host_insets_in_layout_ = include_host_insets_in_layout;
+ OnPropertyChanged(&include_host_insets_in_layout_, kPropertyEffectsLayout);
}
bool FlexLayoutView::GetIncludeHostInsetsInLayout() const {
- return layout_->include_host_insets_in_layout();
+ return include_host_insets_in_layout_;
}
void FlexLayoutView::SetIgnoreDefaultMainAxisMargins(
bool ignore_default_main_axis_margins) {
- if (ignore_default_main_axis_margins ==
- layout_->ignore_default_main_axis_margins()) {
+ if (ignore_default_main_axis_margins == ignore_default_main_axis_margins_) {
return;
}
layout_->SetIgnoreDefaultMainAxisMargins(ignore_default_main_axis_margins);
- OnPropertyChanged(&layout_ + kIgnoreMainAxisMargins, kPropertyEffectsLayout);
+ ignore_default_main_axis_margins_ = ignore_default_main_axis_margins;
+ OnPropertyChanged(&ignore_default_main_axis_margins_, kPropertyEffectsLayout);
}
bool FlexLayoutView::GetIgnoreDefaultMainAxisMargins() const {
- return layout_->ignore_default_main_axis_margins();
+ return ignore_default_main_axis_margins_;
}
void FlexLayoutView::SetFlexAllocationOrder(
FlexAllocationOrder flex_allocation_order) {
- if (flex_allocation_order == layout_->flex_allocation_order())
+ if (flex_allocation_order_ == flex_allocation_order)
return;
layout_->SetFlexAllocationOrder(flex_allocation_order);
- OnPropertyChanged(&layout_ + kFlexAllocationOrder, kPropertyEffectsLayout);
+ flex_allocation_order_ = flex_allocation_order;
+ OnPropertyChanged(&flex_allocation_order_, kPropertyEffectsLayout);
}
FlexAllocationOrder FlexLayoutView::GetFlexAllocationOrder() const {
- return layout_->flex_allocation_order();
+ return flex_allocation_order_;
}
FlexRule FlexLayoutView::GetDefaultFlexRule() const {
diff --git a/chromium/ui/views/layout/flex_layout_view.h b/chromium/ui/views/layout/flex_layout_view.h
index 35192ec588f..135324435dc 100644
--- a/chromium/ui/views/layout/flex_layout_view.h
+++ b/chromium/ui/views/layout/flex_layout_view.h
@@ -7,6 +7,7 @@
#include "ui/views/layout/flex_layout.h"
#include "ui/views/layout/flex_layout_types.h"
+#include "ui/views/metadata/view_factory.h"
#include "ui/views/view.h"
#include "ui/views/views_export.h"
@@ -54,18 +55,43 @@ class VIEWS_EXPORT FlexLayoutView : public View {
template <class T, class U>
void SetDefault(const ui::ClassProperty<T>* key, U&& value) {
layout_->SetDefault(key, value);
+ InvalidateLayout();
}
// Copies and uses |value| as the default value for layout property |key|.
template <class T, class U>
void SetDefault(const ui::ClassProperty<T>* key, const U& value) {
layout_->SetDefault(key, value);
+ InvalidateLayout();
}
private:
FlexLayout* layout_;
+ LayoutOrientation orientation_;
+ LayoutAlignment main_axis_alignment_;
+ LayoutAlignment cross_axis_alignment_;
+ gfx::Insets interior_margin_;
+ int minimum_cross_axis_size_;
+ bool collapse_margins_;
+ bool include_host_insets_in_layout_;
+ bool ignore_default_main_axis_margins_;
+ FlexAllocationOrder flex_allocation_order_;
};
+BEGIN_VIEW_BUILDER(VIEWS_EXPORT, FlexLayoutView, View)
+VIEW_BUILDER_PROPERTY(LayoutOrientation, Orientation)
+VIEW_BUILDER_PROPERTY(LayoutAlignment, MainAxisAlignment)
+VIEW_BUILDER_PROPERTY(LayoutAlignment, CrossAxisAlignment)
+VIEW_BUILDER_PROPERTY(const gfx::Insets, InteriorMargin)
+VIEW_BUILDER_PROPERTY(int, MinimumCrossAxisSize)
+VIEW_BUILDER_PROPERTY(bool, CollapseMargins)
+VIEW_BUILDER_PROPERTY(bool, IncludeHostInsetsInLayout)
+VIEW_BUILDER_PROPERTY(bool, IgnoreDefaultMainAxisMargins)
+VIEW_BUILDER_PROPERTY(FlexAllocationOrder, FlexAllocationOrder)
+END_VIEW_BUILDER
+
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, FlexLayoutView)
+
#endif // UI_VIEWS_LAYOUT_FLEX_LAYOUT_VIEW_H_
diff --git a/chromium/ui/views/layout/flex_layout_view_unittest.cc b/chromium/ui/views/layout/flex_layout_view_unittest.cc
new file mode 100644
index 00000000000..c7f8a0a5ae0
--- /dev/null
+++ b/chromium/ui/views/layout/flex_layout_view_unittest.cc
@@ -0,0 +1,101 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/layout/flex_layout_view.h"
+
+#include <memory>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/insets.h"
+#include "ui/views/layout/flex_layout_types.h"
+#include "ui/views/view_test_api.h"
+
+namespace views {
+
+class FlexLayoutViewTest : public testing::Test {
+ public:
+ void SetUp() override { host_ = std::make_unique<FlexLayoutView>(); }
+
+ FlexLayoutView* host() { return host_.get(); }
+
+ private:
+ std::unique_ptr<FlexLayoutView> host_;
+};
+
+TEST_F(FlexLayoutViewTest, LayoutInvalidationWhenPropertyChanged) {
+ ViewTestApi view_test_api(host());
+ auto reset_layout = [&]() {
+ EXPECT_TRUE(view_test_api.needs_layout());
+ // Call layout() to set layout to a valid state.
+ host()->Layout();
+ };
+
+ // Ensure host() starts with a valid layout.
+ host()->Layout();
+
+ EXPECT_NE(LayoutOrientation::kVertical, host()->GetOrientation());
+ host()->SetOrientation(LayoutOrientation::kVertical);
+ reset_layout();
+
+ EXPECT_NE(LayoutAlignment::kEnd, host()->GetMainAxisAlignment());
+ host()->SetMainAxisAlignment(LayoutAlignment::kEnd);
+ reset_layout();
+
+ EXPECT_NE(LayoutAlignment::kEnd, host()->GetCrossAxisAlignment());
+ host()->SetCrossAxisAlignment(LayoutAlignment::kEnd);
+ reset_layout();
+
+ constexpr gfx::Insets interior_margin(10, 10);
+ EXPECT_NE(interior_margin, host()->GetInteriorMargin());
+ host()->SetInteriorMargin(interior_margin);
+ reset_layout();
+
+ constexpr int min_cross_axis_size = 10;
+ EXPECT_NE(min_cross_axis_size, host()->GetMinimumCrossAxisSize());
+ host()->SetMinimumCrossAxisSize(min_cross_axis_size);
+ reset_layout();
+
+ constexpr bool collapse_margins = true;
+ EXPECT_NE(collapse_margins, host()->GetCollapseMargins());
+ host()->SetCollapseMargins(collapse_margins);
+ reset_layout();
+
+ constexpr bool include_host_insets_in_layout = true;
+ EXPECT_NE(include_host_insets_in_layout,
+ host()->GetIncludeHostInsetsInLayout());
+ host()->SetIncludeHostInsetsInLayout(include_host_insets_in_layout);
+ reset_layout();
+
+ constexpr bool ignore_default_main_axis_margins = true;
+ EXPECT_NE(ignore_default_main_axis_margins,
+ host()->GetIgnoreDefaultMainAxisMargins());
+ host()->SetIgnoreDefaultMainAxisMargins(ignore_default_main_axis_margins);
+ reset_layout();
+
+ constexpr FlexAllocationOrder flex_allocation_order =
+ FlexAllocationOrder::kReverse;
+ EXPECT_NE(flex_allocation_order, host()->GetFlexAllocationOrder());
+ host()->SetFlexAllocationOrder(flex_allocation_order);
+ reset_layout();
+}
+
+TEST_F(FlexLayoutViewTest, NoLayoutInvalidationWhenPropertyUnchanged) {
+ ViewTestApi view_test_api(host());
+
+ // Ensure view starts with a valid layout.
+ host()->Layout();
+ host()->SetOrientation(host()->GetOrientation());
+ host()->SetMainAxisAlignment(host()->GetMainAxisAlignment());
+ host()->SetCrossAxisAlignment(host()->GetCrossAxisAlignment());
+ host()->SetInteriorMargin(host()->GetInteriorMargin());
+ host()->SetMinimumCrossAxisSize(host()->GetMinimumCrossAxisSize());
+ host()->SetCollapseMargins(host()->GetCollapseMargins());
+ host()->SetIncludeHostInsetsInLayout(host()->GetIncludeHostInsetsInLayout());
+ host()->SetIgnoreDefaultMainAxisMargins(
+ host()->GetIgnoreDefaultMainAxisMargins());
+ host()->SetFlexAllocationOrder(host()->GetFlexAllocationOrder());
+ EXPECT_FALSE(view_test_api.needs_layout());
+}
+
+} // namespace views
diff --git a/chromium/ui/views/layout/layout_manager_base_unittest.cc b/chromium/ui/views/layout/layout_manager_base_unittest.cc
index 827fc380a84..f616d87a642 100644
--- a/chromium/ui/views/layout/layout_manager_base_unittest.cc
+++ b/chromium/ui/views/layout/layout_manager_base_unittest.cc
@@ -782,7 +782,7 @@ TEST_F(LayoutManagerBaseAvailableSizeTest,
// Create a default root layout with non-visible, zero-size child with no
// available size.
ProposedLayout root_layout;
- root_layout.child_layouts.push_back(ChildLayout());
+ root_layout.child_layouts.emplace_back();
root_layout.child_layouts[0].child_view = child;
root_layout.child_layouts[0].available_size = SizeBounds(0, 0);
diff --git a/chromium/ui/views/layout/layout_provider.cc b/chromium/ui/views/layout/layout_provider.cc
index 05dfc3464b5..e8e3cd7709a 100644
--- a/chromium/ui/views/layout/layout_provider.cc
+++ b/chromium/ui/views/layout/layout_provider.cc
@@ -37,8 +37,7 @@ LayoutProvider* LayoutProvider::Get() {
int LayoutProvider::GetControlHeightForFont(int context,
int style,
const gfx::FontList& font) {
- return std::max(views::style::GetLineHeight(context, style),
- font.GetHeight()) +
+ return std::max(style::GetLineHeight(context, style), font.GetHeight()) +
Get()->GetDistanceMetric(DISTANCE_CONTROL_VERTICAL_TEXT_PADDING) * 2;
}
@@ -74,39 +73,56 @@ gfx::Insets LayoutProvider::GetInsetsMetric(int metric) const {
int LayoutProvider::GetDistanceMetric(int metric) const {
DCHECK_GE(metric, VIEWS_DISTANCE_START);
- DCHECK_LT(metric, VIEWS_DISTANCE_MAX);
- switch (metric) {
- case DistanceMetric::DISTANCE_BUTTON_HORIZONTAL_PADDING:
+ DCHECK_LT(metric, VIEWS_DISTANCE_END);
+
+ switch (static_cast<DistanceMetric>(metric)) {
+ case DISTANCE_BUBBLE_PREFERRED_WIDTH:
+ return kSmallDialogWidth;
+ case DISTANCE_BUTTON_HORIZONTAL_PADDING:
return 16;
- case DistanceMetric::DISTANCE_BUTTON_MAX_LINKABLE_WIDTH:
- return 0;
- case DistanceMetric::DISTANCE_CLOSE_BUTTON_MARGIN:
- return 7;
- case DistanceMetric::DISTANCE_CONTROL_VERTICAL_TEXT_PADDING:
+ case DISTANCE_BUTTON_MAX_LINKABLE_WIDTH:
+ return 112;
+ case DISTANCE_CLOSE_BUTTON_MARGIN:
return 4;
- case DistanceMetric::DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH:
- return 75;
- case DistanceMetric::DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL:
- case DistanceMetric::DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT:
- case DistanceMetric::DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL:
- case DistanceMetric::DISTANCE_DIALOG_CONTENT_MARGIN_TOP_TEXT:
- return 13;
- case DistanceMetric::DISTANCE_RELATED_BUTTON_HORIZONTAL:
+ case DISTANCE_CONTROL_VERTICAL_TEXT_PADDING:
return 6;
- case DistanceMetric::DISTANCE_RELATED_CONTROL_HORIZONTAL:
+ case DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH:
+ // Minimum label size plus padding.
+ return 32 + 2 * GetDistanceMetric(DISTANCE_BUTTON_HORIZONTAL_PADDING);
+ case DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL:
+ return 24;
+ case DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT:
+ // This is reduced so there is about the same amount of visible
+ // whitespace, compensating for the text's internal leading.
+ return GetDistanceMetric(DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL) -
+ 8;
+ case DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL:
+ return 16;
+ case DISTANCE_DIALOG_CONTENT_MARGIN_TOP_TEXT:
+ // See the comment in DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT above.
+ return GetDistanceMetric(DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL) - 8;
+ case DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH:
+ return kMediumDialogWidth;
+ case DISTANCE_RELATED_BUTTON_HORIZONTAL:
return 8;
- case DistanceMetric::DISTANCE_RELATED_CONTROL_VERTICAL:
+ case DISTANCE_RELATED_CONTROL_HORIZONTAL:
+ return 16;
+ case DISTANCE_RELATED_CONTROL_VERTICAL:
return 8;
- case DistanceMetric::DISTANCE_RELATED_LABEL_HORIZONTAL:
- return 10;
- case DistanceMetric::DISTANCE_DIALOG_SCROLLABLE_AREA_MAX_HEIGHT:
- return 160;
- case DistanceMetric::DISTANCE_TABLE_CELL_HORIZONTAL_MARGIN:
- return 10;
- case DistanceMetric::DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING:
- return 4;
- case DistanceMetric::DISTANCE_UNRELATED_CONTROL_VERTICAL:
- return 20;
+ case DISTANCE_RELATED_LABEL_HORIZONTAL:
+ return 12;
+ case DISTANCE_DIALOG_SCROLLABLE_AREA_MAX_HEIGHT:
+ return 192;
+ case DISTANCE_TABLE_CELL_HORIZONTAL_MARGIN:
+ return 12;
+ case DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING:
+ return 8;
+ case DISTANCE_UNRELATED_CONTROL_VERTICAL:
+ return 16;
+ case VIEWS_DISTANCE_END:
+ case VIEWS_DISTANCE_MAX:
+ NOTREACHED();
+ return 0;
}
NOTREACHED();
return 0;
@@ -117,6 +133,9 @@ const TypographyProvider& LayoutProvider::GetTypographyProvider() const {
}
int LayoutProvider::GetSnappedDialogWidth(int min_width) const {
+ // TODO(pbos): Move snapping logic from ChromeLayoutProvider and update
+ // unittests to pass with snapping points (instead of exact preferred width).
+
// This is an arbitrary value, but it's a good arbitrary value. Some dialogs
// have very small widths for their contents views, which causes ugly
// title-wrapping where a two-word title is split across multiple lines or
@@ -145,7 +164,7 @@ gfx::Insets LayoutProvider::GetDialogInsetsForContentType(
int LayoutProvider::GetCornerRadiusMetric(EmphasisMetric emphasis_metric,
const gfx::Size& size) const {
switch (emphasis_metric) {
- case views::EMPHASIS_NONE:
+ case EMPHASIS_NONE:
return 0;
case EMPHASIS_LOW:
case EMPHASIS_MEDIUM:
@@ -160,15 +179,15 @@ int LayoutProvider::GetCornerRadiusMetric(EmphasisMetric emphasis_metric,
int LayoutProvider::GetShadowElevationMetric(
EmphasisMetric emphasis_metric) const {
switch (emphasis_metric) {
- case views::EMPHASIS_NONE:
+ case EMPHASIS_NONE:
return 0;
- case views::EMPHASIS_LOW:
+ case EMPHASIS_LOW:
return 1;
- case views::EMPHASIS_MEDIUM:
+ case EMPHASIS_MEDIUM:
return 2;
- case views::EMPHASIS_HIGH:
+ case EMPHASIS_HIGH:
return 3;
- case views::EMPHASIS_MAXIMUM:
+ case EMPHASIS_MAXIMUM:
return 16;
}
}
diff --git a/chromium/ui/views/layout/layout_provider.h b/chromium/ui/views/layout/layout_provider.h
index d5412bd0767..1fa20d73cff 100644
--- a/chromium/ui/views/layout/layout_provider.h
+++ b/chromium/ui/views/layout/layout_provider.h
@@ -55,8 +55,11 @@ enum DistanceMetric {
// two types have not been interchanged.
VIEWS_DISTANCE_START = VIEWS_INSETS_MAX,
+ // Width of a bubble unless the content is too wide to make that
+ // feasible.
+ DISTANCE_BUBBLE_PREFERRED_WIDTH = VIEWS_DISTANCE_START,
// The default padding to add on each side of a button's label.
- DISTANCE_BUTTON_HORIZONTAL_PADDING = VIEWS_DISTANCE_START,
+ DISTANCE_BUTTON_HORIZONTAL_PADDING,
// The maximum width a button can have and still influence the sizes of
// other linked buttons. This allows short buttons to have linked widths
// without long buttons making things overly wide.
@@ -80,6 +83,9 @@ enum DistanceMetric {
// The distance between the bottom of a dialog's title and the top of the
// dialog's content, when the first content element is text.
DISTANCE_DIALOG_CONTENT_MARGIN_TOP_TEXT,
+ // Width of modal dialogs unless the content is too wide to make that
+ // feasible.
+ DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH,
// The spacing between a pair of related horizontal buttons, used for
// dialog layout.
DISTANCE_RELATED_BUTTON_HORIZONTAL,
@@ -176,6 +182,11 @@ class VIEWS_EXPORT LayoutProvider {
virtual gfx::ShadowValues MakeShadowValues(int elevation,
SkColor color) const;
+ protected:
+ static constexpr int kSmallDialogWidth = 320;
+ static constexpr int kMediumDialogWidth = 448;
+ static constexpr int kLargeDialogWidth = 512;
+
private:
TypographyProvider typography_provider_;
diff --git a/chromium/ui/views/metadata/metadata_types.cc b/chromium/ui/views/metadata/metadata_types.cc
index ef38d3a8ae3..8ed567caf7f 100644
--- a/chromium/ui/views/metadata/metadata_types.cc
+++ b/chromium/ui/views/metadata/metadata_types.cc
@@ -14,6 +14,25 @@
namespace views {
namespace metadata {
+PropertyFlags operator|(PropertyFlags op1, PropertyFlags op2) {
+ return static_cast<PropertyFlags>(static_cast<uint32_t>(op1) |
+ static_cast<uint32_t>(op2));
+}
+
+PropertyFlags operator&(PropertyFlags op1, PropertyFlags op2) {
+ return static_cast<PropertyFlags>(static_cast<uint32_t>(op1) &
+ static_cast<uint32_t>(op2));
+}
+
+PropertyFlags operator^(PropertyFlags op1, PropertyFlags op2) {
+ return static_cast<PropertyFlags>(static_cast<uint32_t>(op1) ^
+ static_cast<uint32_t>(op2));
+}
+
+bool operator!(PropertyFlags op) {
+ return !static_cast<bool>(op);
+}
+
ClassMetaData::ClassMetaData() = default;
ClassMetaData::ClassMetaData(std::string file, int line) : line_(line) {
diff --git a/chromium/ui/views/metadata/metadata_types.h b/chromium/ui/views/metadata/metadata_types.h
index 001e6b3bcf1..1d559678351 100644
--- a/chromium/ui/views/metadata/metadata_types.h
+++ b/chromium/ui/views/metadata/metadata_types.h
@@ -16,15 +16,27 @@
namespace views {
namespace metadata {
-enum class PropertyFlags {
+enum class PropertyFlags : uint32_t {
// By default, properties are read/write. This flag indicates that the given
// property metadata instance needs no special attention.
kEmpty = 0x00,
// Property metadata instance should be treated as read-only. Calling
// SetValueAsString() will trigger a NOTREACHED() error under debug.
kReadOnly = 0x01,
+ // Property metadata can be serialized to or from a string. Needs to make sure
+ // this flag is set to have meaningful SetValueAsString() and
+ // GetValueFromString().
+ kSerializable = 0x100,
};
+VIEWS_EXPORT extern PropertyFlags operator|(PropertyFlags op1,
+ PropertyFlags op2);
+VIEWS_EXPORT extern PropertyFlags operator&(PropertyFlags op1,
+ PropertyFlags op2);
+VIEWS_EXPORT extern PropertyFlags operator^(PropertyFlags op1,
+ PropertyFlags op2);
+VIEWS_EXPORT extern bool operator!(PropertyFlags op);
+
// Interface for classes that provide ClassMetaData (via macros in
// metadata_header_macros.h). GetClassMetaData() is automatically overridden and
// implemented in the relevant macros, so a class must merely have
diff --git a/chromium/ui/views/metadata/property_metadata.h b/chromium/ui/views/metadata/property_metadata.h
index 9804f784cbf..3dd90433514 100644
--- a/chromium/ui/views/metadata/property_metadata.h
+++ b/chromium/ui/views/metadata/property_metadata.h
@@ -7,10 +7,12 @@
#include <string>
#include <type_traits>
+#include <utility>
#include "base/macros.h"
#include "base/strings/string16.h"
#include "ui/views/metadata/metadata_cache.h"
+#include "ui/views/metadata/metadata_types.h"
#include "ui/views/metadata/type_conversion.h"
#include "ui/views/views_export.h"
@@ -31,14 +33,21 @@ class ClassPropertyReadOnlyMetaData : public MemberMetaDataBase {
~ClassPropertyReadOnlyMetaData() override = default;
base::string16 GetValueAsString(void* obj) const override {
+ if (!kIsSerializable)
+ return base::string16();
return TypeConverter<TValue>::ToString((static_cast<TClass*>(obj)->*Get)());
}
PropertyFlags GetPropertyFlags() const override {
- return PropertyFlags::kReadOnly;
+ return kIsSerializable
+ ? (PropertyFlags::kReadOnly | PropertyFlags::kSerializable)
+ : PropertyFlags::kReadOnly;
}
private:
+ static constexpr bool kIsSerializable =
+ TypeConverter<TValue>::is_serializable;
+
DISALLOW_COPY_AND_ASSIGN(ClassPropertyReadOnlyMetaData);
};
@@ -61,16 +70,24 @@ class ClassPropertyMetaData
~ClassPropertyMetaData() override = default;
void SetValueAsString(void* obj, const base::string16& new_value) override {
+ if (!kIsSerializable)
+ return;
if (base::Optional<TValue> result =
- TypeConverter<TValue>::FromString(new_value))
- (static_cast<TClass*>(obj)->*Set)(result.value());
+ TypeConverter<TValue>::FromString(new_value)) {
+ (static_cast<TClass*>(obj)->*Set)(std::move(result.value()));
+ }
}
PropertyFlags GetPropertyFlags() const override {
- return PropertyFlags::kEmpty;
+ return kIsSerializable
+ ? (PropertyFlags::kEmpty | PropertyFlags::kSerializable)
+ : PropertyFlags::kEmpty;
}
private:
+ static constexpr bool kIsSerializable =
+ TypeConverter<TValue>::is_serializable;
+
DISALLOW_COPY_AND_ASSIGN(ClassPropertyMetaData);
};
diff --git a/chromium/ui/views/metadata/type_conversion.cc b/chromium/ui/views/metadata/type_conversion.cc
index 2af67582928..ac0cf7632dc 100644
--- a/chromium/ui/views/metadata/type_conversion.cc
+++ b/chromium/ui/views/metadata/type_conversion.cc
@@ -14,6 +14,7 @@
#include "ui/base/ime/text_input_type.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/native_theme/native_theme.h"
+#include "ui/views/controls/scroll_view.h"
namespace views {
namespace metadata {
@@ -85,6 +86,13 @@ base::string16 TypeConverter<gfx::Range>::ToString(
"{%i, %i}", source_value.GetMin(), source_value.GetMax()));
}
+base::string16 TypeConverter<gfx::Insets>::ToString(
+ const gfx::Insets& source_value) {
+ return base::ASCIIToUTF16(base::StringPrintf(
+ "{%d, %d, %d, %d}", source_value.top(), source_value.left(),
+ source_value.bottom(), source_value.right()));
+}
+
base::Optional<int8_t> TypeConverter<int8_t>::FromString(
const base::string16& source_value) {
int32_t ret = 0;
@@ -247,6 +255,21 @@ base::Optional<gfx::Range> TypeConverter<gfx::Range>::FromString(
return base::nullopt;
}
+base::Optional<gfx::Insets> TypeConverter<gfx::Insets>::FromString(
+ const base::string16& source_value) {
+ const auto values =
+ base::SplitStringPiece(source_value, base::ASCIIToUTF16("{,,,}"),
+ base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+ int top, left, bottom, right;
+ if ((values.size() == 4) && base::StringToInt(values[0], &top) &&
+ base::StringToInt(values[1], &left) &&
+ base::StringToInt(values[2], &bottom) &&
+ base::StringToInt(values[3], &right)) {
+ return gfx::Insets(top, left, bottom, right);
+ }
+ return base::nullopt;
+}
+
} // namespace metadata
} // namespace views
@@ -332,6 +355,14 @@ DEFINE_ENUM_CONVERTERS(ui::MenuSeparatorType,
{ui::MenuSeparatorType::PADDED_SEPARATOR,
base::ASCIIToUTF16("PADDED_SEPARATOR")})
+DEFINE_ENUM_CONVERTERS(views::ScrollView::ScrollBarMode,
+ {views::ScrollView::ScrollBarMode::kDisabled,
+ base::ASCIIToUTF16("kDisabled")},
+ {views::ScrollView::ScrollBarMode::kHiddenButEnabled,
+ base::ASCIIToUTF16("kHiddenButEnabled")},
+ {views::ScrollView::ScrollBarMode::kEnabled,
+ base::ASCIIToUTF16("kEnabled")})
+
#define OP(enum_name) \
{ ui::NativeTheme::enum_name, base::ASCIIToUTF16(#enum_name) }
DEFINE_ENUM_CONVERTERS(ui::NativeTheme::ColorId, NATIVE_THEME_COLOR_IDS)
diff --git a/chromium/ui/views/metadata/type_conversion.h b/chromium/ui/views/metadata/type_conversion.h
index 79349fe9eaa..9ba57d48a75 100644
--- a/chromium/ui/views/metadata/type_conversion.h
+++ b/chromium/ui/views/metadata/type_conversion.h
@@ -7,6 +7,7 @@
#include <stdint.h>
+#include <memory>
#include <utility>
#include <vector>
@@ -18,6 +19,7 @@
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
+#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/range/range.h"
#include "ui/gfx/shadow_value.h"
@@ -45,6 +47,8 @@ using ArgType =
// General Type Conversion Template Functions ---------------------------------
template <typename T>
struct TypeConverter {
+ static constexpr bool is_serializable = std::is_enum<T>::value;
+ static bool IsSerializable() { return is_serializable; }
static base::string16 ToString(ArgType<T> source_value);
static base::Optional<T> FromString(const base::string16& source_value);
};
@@ -106,6 +110,8 @@ static const EnumStrings<T>& GetEnumStringsInstance();
#define DECLARE_CONVERSIONS(T) \
template <> \
struct VIEWS_EXPORT TypeConverter<T> { \
+ static constexpr bool is_serializable = true; \
+ static bool IsSerializable() { return is_serializable; } \
static base::string16 ToString(ArgType<T> source_value); \
static base::Optional<T> FromString(const base::string16& source_value); \
};
@@ -127,6 +133,7 @@ DECLARE_CONVERSIONS(base::TimeDelta)
DECLARE_CONVERSIONS(gfx::ShadowValues)
DECLARE_CONVERSIONS(gfx::Size)
DECLARE_CONVERSIONS(gfx::Range)
+DECLARE_CONVERSIONS(gfx::Insets)
#undef DECLARE_CONVERSIONS
@@ -136,6 +143,8 @@ VIEWS_EXPORT const base::string16& GetNullOptStr();
template <typename T>
struct TypeConverter<base::Optional<T>> {
+ static constexpr bool is_serializable = TypeConverter<T>::is_serializable;
+ static bool IsSerializable() { return is_serializable; }
static base::string16 ToString(ArgType<base::Optional<T>> source_value) {
if (!source_value)
return GetNullOptStr();
@@ -151,6 +160,15 @@ struct TypeConverter<base::Optional<T>> {
}
};
+template <typename T>
+struct TypeConverter<std::unique_ptr<T>> {
+ static constexpr bool is_serializable = false;
+ static bool IsSerializable() { return is_serializable; }
+ static base::string16 ToString(const std::unique_ptr<T>& source_value);
+ static base::Optional<std::unique_ptr<T>> FromString(
+ const base::string16& source_value);
+};
+
} // namespace metadata
} // namespace views
diff --git a/chromium/ui/views/metadata/type_conversion_unittest.cc b/chromium/ui/views/metadata/type_conversion_unittest.cc
index 0fdfce3a7bb..d1630597c00 100644
--- a/chromium/ui/views/metadata/type_conversion_unittest.cc
+++ b/chromium/ui/views/metadata/type_conversion_unittest.cc
@@ -7,58 +7,70 @@
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
+#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/rect.h"
-
-namespace MD = views::metadata;
+#include "ui/views/controls/button/button.h"
using TypeConversionTest = PlatformTest;
+namespace views {
+
+// Used in CheckIsSerializable test case.
+enum TestResult {
+ TEST_TRUE,
+ TEST_FALSE,
+};
+DEFINE_ENUM_CONVERTERS(TestResult,
+ {TEST_TRUE, base::ASCIIToUTF16("TRUE")},
+ {TEST_FALSE, base::ASCIIToUTF16("FALSE")})
+
TEST_F(TypeConversionTest, TestConversion_IntToString) {
int from_int = 5;
- base::string16 to_string = MD::TypeConverter<int>::ToString(from_int);
+ base::string16 to_string = metadata::TypeConverter<int>::ToString(from_int);
EXPECT_EQ(to_string, base::ASCIIToUTF16("5"));
}
TEST_F(TypeConversionTest, TestConversion_StringToInt) {
base::string16 from_string = base::ASCIIToUTF16("10");
- EXPECT_EQ(MD::TypeConverter<int>::FromString(from_string), 10);
+ EXPECT_EQ(metadata::TypeConverter<int>::FromString(from_string), 10);
}
// This tests whether the converter handles a bogus input string, in which case
// the return value should be nullopt.
TEST_F(TypeConversionTest, TestConversion_BogusStringToInt) {
base::string16 from_string = base::ASCIIToUTF16("Foo");
- EXPECT_EQ(MD::TypeConverter<int>::FromString(from_string), base::nullopt);
+ EXPECT_EQ(metadata::TypeConverter<int>::FromString(from_string),
+ base::nullopt);
}
TEST_F(TypeConversionTest, TestConversion_BogusStringToFloat) {
base::string16 from_string = base::ASCIIToUTF16("1.2");
- EXPECT_EQ(MD::TypeConverter<float>::FromString(from_string), 1.2f);
+ EXPECT_EQ(metadata::TypeConverter<float>::FromString(from_string), 1.2f);
}
TEST_F(TypeConversionTest, TestConversion_OptionalIntToString) {
base::Optional<int> src;
base::string16 to_string =
- MD::TypeConverter<base::Optional<int>>::ToString(src);
- EXPECT_EQ(to_string, MD::GetNullOptStr());
+ metadata::TypeConverter<base::Optional<int>>::ToString(src);
+ EXPECT_EQ(to_string, metadata::GetNullOptStr());
src = 5;
- to_string = MD::TypeConverter<base::Optional<int>>::ToString(src);
+ to_string = metadata::TypeConverter<base::Optional<int>>::ToString(src);
EXPECT_EQ(to_string, base::ASCIIToUTF16("5"));
}
TEST_F(TypeConversionTest, TestConversion_StringToOptionalInt) {
base::Optional<int> ret;
- EXPECT_EQ(
- MD::TypeConverter<base::Optional<int>>::FromString(MD::GetNullOptStr()),
- base::make_optional(ret));
+ EXPECT_EQ(metadata::TypeConverter<base::Optional<int>>::FromString(
+ metadata::GetNullOptStr()),
+ base::make_optional(ret));
- EXPECT_EQ(MD::TypeConverter<base::Optional<int>>::FromString(
+ EXPECT_EQ(metadata::TypeConverter<base::Optional<int>>::FromString(
base::ASCIIToUTF16("10")),
10);
- EXPECT_EQ(MD::TypeConverter<base::Optional<int>>::FromString(
+ EXPECT_EQ(metadata::TypeConverter<base::Optional<int>>::FromString(
base::ASCIIToUTF16("ab0")),
base::nullopt);
}
@@ -68,21 +80,21 @@ TEST_F(TypeConversionTest, TestConversion_ShadowValuesToString) {
shadow_values.emplace_back(gfx::Vector2d(1, 2), .3,
SkColorSetARGB(128, 255, 0, 0));
- EXPECT_EQ(MD::TypeConverter<gfx::ShadowValues>::ToString(shadow_values),
+ EXPECT_EQ(metadata::TypeConverter<gfx::ShadowValues>::ToString(shadow_values),
base::ASCIIToUTF16("[ (1,2),0.30,rgba(255,0,0,128) ]"));
shadow_values.emplace_back(gfx::Vector2d(9, 8), .76,
SkColorSetARGB(20, 0, 64, 255));
EXPECT_EQ(
- MD::TypeConverter<gfx::ShadowValues>::ToString(shadow_values),
+ metadata::TypeConverter<gfx::ShadowValues>::ToString(shadow_values),
base::ASCIIToUTF16(
"[ (1,2),0.30,rgba(255,0,0,128); (9,8),0.76,rgba(0,64,255,20) ]"));
}
TEST_F(TypeConversionTest, TestConversion_StringToShadowValues) {
base::Optional<gfx::ShadowValues> opt_result =
- MD::TypeConverter<gfx::ShadowValues>::FromString(base::ASCIIToUTF16(
+ metadata::TypeConverter<gfx::ShadowValues>::FromString(base::ASCIIToUTF16(
"[ (6,4),0.53,rgba(23,44,0,255); (93,83),4.33,rgba(10,20,0,15) ]"));
EXPECT_EQ(opt_result.has_value(), true);
@@ -101,3 +113,58 @@ TEST_F(TypeConversionTest, TestConversion_StringToShadowValues) {
EXPECT_EQ(result[0].blur(), 0.53);
EXPECT_EQ(result[1].blur(), 4.33);
}
+
+TEST_F(TypeConversionTest, TestConversion_InsetsToString) {
+ base::string16 to_string =
+ metadata::TypeConverter<gfx::Insets>::ToString(gfx::Insets(3, 5, 7, 9));
+
+ EXPECT_EQ(to_string, base::ASCIIToUTF16("{3, 5, 7, 9}"));
+}
+
+TEST_F(TypeConversionTest, TestConversion_StringToInsets) {
+ base::string16 from_string = base::ASCIIToUTF16("{2, 3, 4, 5}");
+ EXPECT_EQ(metadata::TypeConverter<gfx::Insets>::FromString(from_string),
+ gfx::Insets(2, 3, 4, 5));
+}
+
+TEST_F(TypeConversionTest, CheckIsSerializable) {
+ // Test types with explicitly added converters.
+ EXPECT_TRUE(metadata::TypeConverter<int8_t>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<int16_t>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<int32_t>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<int64_t>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<uint8_t>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<uint16_t>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<uint32_t>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<uint64_t>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<float>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<double>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<bool>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<const char*>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<base::string16>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<gfx::ShadowValues>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<gfx::Size>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<gfx::Range>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<gfx::Insets>::IsSerializable());
+
+ // Test enum type.
+ EXPECT_TRUE(metadata::TypeConverter<TestResult>::IsSerializable());
+
+ // Test aliased types.
+ EXPECT_TRUE(metadata::TypeConverter<int>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<SkColor>::IsSerializable());
+
+ // Test types with no explicit or aliased converters.
+ EXPECT_FALSE(metadata::TypeConverter<
+ views::Button::PressedCallback>::IsSerializable());
+ EXPECT_FALSE(metadata::TypeConverter<views::FocusRing*>::IsSerializable());
+
+ // Test base::Optional type.
+ EXPECT_TRUE(
+ metadata::TypeConverter<base::Optional<const char*>>::IsSerializable());
+ EXPECT_TRUE(metadata::TypeConverter<base::Optional<int>>::IsSerializable());
+ EXPECT_FALSE(metadata::TypeConverter<
+ base::Optional<views::FocusRing*>>::IsSerializable());
+}
+
+} // namespace views
diff --git a/chromium/ui/views/metadata/view_factory.h b/chromium/ui/views/metadata/view_factory.h
index f3e7f4f8680..2a195a21d0c 100644
--- a/chromium/ui/views/metadata/view_factory.h
+++ b/chromium/ui/views/metadata/view_factory.h
@@ -22,13 +22,14 @@ template <typename Builder>
class BaseViewBuilderT : public internal::ViewBuilderCore {
public:
using ViewClass_ = typename internal::ViewClassTrait<Builder>::ViewClass_;
- BaseViewBuilderT() = default;
+ BaseViewBuilderT() { view_ = std::make_unique<ViewClass_>(); }
+ explicit BaseViewBuilderT(ViewClass_* root_view) : root_view_(root_view) {}
BaseViewBuilderT(BaseViewBuilderT&&) = default;
BaseViewBuilderT& operator=(BaseViewBuilderT&&) = default;
~BaseViewBuilderT() override = default;
Builder& CopyAddressTo(ViewClass_** view_address) {
- view_address_ = view_address;
+ *view_address = view_ ? view_.get() : root_view_;
return *static_cast<Builder*>(this);
}
@@ -46,19 +47,44 @@ class BaseViewBuilderT : public internal::ViewBuilderCore {
}
std::unique_ptr<ViewClass_> Build() {
- auto view = std::make_unique<ViewClass_>();
- SetProperties(view.get());
- CreateChildren(view.get());
- if (view_address_)
- *view_address_ = view.get();
- return view;
+ DCHECK(!root_view_) << "Root view specified. Use BuildChildren() instead.";
+ DCHECK(view_);
+ SetProperties(view_.get());
+ CreateChildren(view_.get());
+ return std::move(view_);
+ }
+
+ void BuildChildren() {
+ DCHECK(!view_) << "Default constructor called. Use Build() instead.";
+ DCHECK(root_view_);
+ SetProperties(root_view_);
+ CreateChildren(root_view_);
}
template <typename T>
Builder& SetProperty(const ui::ClassProperty<T>* property,
metadata::ArgType<T> value) {
auto setter =
- std::make_unique<internal::ClassPropertySetter<ViewClass_, T>>(
+ std::make_unique<internal::ClassPropertyValueSetter<ViewClass_, T>>(
+ property, value);
+ internal::ViewBuilderCore::AddPropertySetter(std::move(setter));
+ return *static_cast<Builder*>(this);
+ }
+
+ template <typename T>
+ Builder& SetProperty(const ui::ClassProperty<T*>* property,
+ metadata::ArgType<T> value) {
+ auto setter =
+ std::make_unique<internal::ClassPropertyMoveSetter<ViewClass_, T>>(
+ property, value);
+ internal::ViewBuilderCore::AddPropertySetter(std::move(setter));
+ return *static_cast<Builder*>(this);
+ }
+
+ template <typename T>
+ Builder& SetProperty(const ui::ClassProperty<T*>* property, T&& value) {
+ auto setter =
+ std::make_unique<internal::ClassPropertyMoveSetter<ViewClass_, T>>(
property, std::move(value));
internal::ViewBuilderCore::AddPropertySetter(std::move(setter));
return *static_cast<Builder*>(this);
@@ -67,9 +93,17 @@ class BaseViewBuilderT : public internal::ViewBuilderCore {
protected:
std::unique_ptr<View> DoBuild() override { return Build(); }
- ViewClass_** view_address_ = nullptr;
+ // Owned and meaningful during the Builder building process. Its
+ // ownership will be transferred out upon Build() call.
+ std::unique_ptr<ViewClass_> view_;
+
+ // Unowned root view. Used for creating a builder with an existing root
+ // instance.
+ ViewClass_* root_view_ = nullptr;
};
+} // namespace views
+
// Example of builder class generated by the following macros.
//
// template <typename Builder, typename ViewClass>
@@ -116,16 +150,24 @@ class BaseViewBuilderT : public internal::ViewBuilderCore {
// }
// };
//
-// class VIEWS_EXPORT LabelButtonBuilderTest
-// : public LabelButtonBuilderT<LabelButtonBuilderTest, LabelButton> {};
+// class VIEWS_EXPORT LabelButtonBuilder
+// : public LabelButtonBuilderT<LabelButtonBuilder, LabelButton> {};
+
+// BEGIN_VIEW_BUILDER, END_VIEW_BUILDER and VIEW_BUILDER_XXXX macros should
+// be placed into the same namespace as the 'view_class' parameter.
#define BEGIN_VIEW_BUILDER(export, view_class, ancestor) \
template <typename BuilderT> \
class export view_class##BuilderT : public ancestor##BuilderT<BuilderT> { \
- public: \
+ private: \
using ViewClass_ = view_class; \
\
+ public: \
view_class##BuilderT() = default; \
+ explicit view_class##BuilderT( \
+ typename ::views::internal::ViewClassTrait<BuilderT>::ViewClass_* \
+ root_view) \
+ : ancestor##BuilderT<BuilderT>(root_view) {} \
view_class##BuilderT(view_class##BuilderT&&) = default; \
view_class##BuilderT& operator=(view_class##BuilderT&&) = default; \
~view_class##BuilderT() override = default;
@@ -184,15 +226,29 @@ class BaseViewBuilderT : public internal::ViewBuilderCore {
// semi-colon on a separate line.
// clang-format off
-#define END_VIEW_BUILDER(export, view_class) \
- }; \
- \
- template <> \
- class export Builder<view_class> \
- : public view_class##BuilderT<views::Builder<view_class>>{};
+#define END_VIEW_BUILDER };
+
+// Unlike the above macros, DEFINE_VIEW_BUILDER must be placed in the global
+// namespace. Unless 'view_class' is already in the 'views' namespace, it should
+// be fully qualified with the namespace in which it lives.
+
+#define DEFINE_VIEW_BUILDER(export, view_class) \
+namespace views { \
+ template <> \
+ class export Builder<view_class> \
+ : public view_class##BuilderT<Builder<view_class>> { \
+ private: \
+ using ViewClass_ = view_class; \
+ public: \
+ Builder<ViewClass_>() = default; \
+ explicit Builder<ViewClass_>(ViewClass_* root_view) \
+ : view_class##BuilderT<Builder<ViewClass_>>(root_view) {} \
+ Builder<ViewClass_>(Builder&&) = default; \
+ Builder<ViewClass_>& operator=(Builder<ViewClass_>&&) = default; \
+ ~Builder<ViewClass_>() = default; \
+ }; \
+} // namespace views
// clang-format on
-} // namespace views
-
#endif // UI_VIEWS_METADATA_VIEW_FACTORY_H_
diff --git a/chromium/ui/views/metadata/view_factory_internal.h b/chromium/ui/views/metadata/view_factory_internal.h
index e9af4ae6517..95c11e4604c 100644
--- a/chromium/ui/views/metadata/view_factory_internal.h
+++ b/chromium/ui/views/metadata/view_factory_internal.h
@@ -64,21 +64,43 @@ class PropertySetter : public PropertySetterBase {
};
template <typename TClass, typename TValue>
-class ClassPropertySetter : public PropertySetterBase {
+class ClassPropertyValueSetter : public PropertySetterBase {
public:
- ClassPropertySetter(const ui::ClassProperty<TValue>* property,
- metadata::ArgType<TValue> value)
+ ClassPropertyValueSetter(const ui::ClassProperty<TValue>* property,
+ TValue value)
+ : property_(property), value_(value) {}
+ ClassPropertyValueSetter(const ClassPropertyValueSetter&) = delete;
+ ClassPropertyValueSetter& operator=(const ClassPropertyValueSetter&) = delete;
+ ~ClassPropertyValueSetter() override = default;
+
+ void SetProperty(void* obj) override {
+ static_cast<TClass*>(obj)->SetProperty(property_, value_);
+ }
+
+ private:
+ const ui::ClassProperty<TValue>* property_;
+ TValue value_;
+};
+
+template <typename TClass, typename TValue>
+class ClassPropertyMoveSetter : public PropertySetterBase {
+ public:
+ ClassPropertyMoveSetter(const ui::ClassProperty<TValue*>* property,
+ const TValue& value)
+ : property_(property), value_(value) {}
+ ClassPropertyMoveSetter(const ui::ClassProperty<TValue*>* property,
+ TValue&& value)
: property_(property), value_(std::move(value)) {}
- ClassPropertySetter(const ClassPropertySetter&) = delete;
- ClassPropertySetter& operator=(const ClassPropertySetter&) = delete;
- ~ClassPropertySetter() override = default;
+ ClassPropertyMoveSetter(const ClassPropertyMoveSetter&) = delete;
+ ClassPropertyMoveSetter& operator=(const ClassPropertyMoveSetter&) = delete;
+ ~ClassPropertyMoveSetter() override = default;
void SetProperty(void* obj) override {
static_cast<TClass*>(obj)->SetProperty(property_, std::move(value_));
}
private:
- const ui::ClassProperty<TValue>* property_;
+ const ui::ClassProperty<TValue*>* property_;
TValue value_;
};
diff --git a/chromium/ui/views/metadata/view_factory_unittest.cc b/chromium/ui/views/metadata/view_factory_unittest.cc
index 8bc1cb98784..87d9f52244c 100644
--- a/chromium/ui/views/metadata/view_factory_unittest.cc
+++ b/chromium/ui/views/metadata/view_factory_unittest.cc
@@ -15,6 +15,7 @@
#include "ui/views/test/widget_test.h"
#include "ui/views/view.h"
#include "ui/views/view_class_properties.h"
+#include "ui/views/view_utils.h"
using ViewFactoryTest = views::test::WidgetTest;
@@ -43,8 +44,7 @@ TEST_F(ViewFactoryTest, TestViewBuilder) {
.CopyAddressTo(&button)
.SetIsDefault(true)
.SetEnabled(true)
- .SetText(base::ASCIIToUTF16("Test"))
- .SetFocusForPlatform(),
+ .SetText(base::ASCIIToUTF16("Test")),
views::Builder<views::ScrollView>()
.CopyAddressTo(&scroll_view)
.SetContents(views::Builder<views::LabelButton>()
@@ -52,12 +52,12 @@ TEST_F(ViewFactoryTest, TestViewBuilder) {
.SetText(base::ASCIIToUTF16("ScrollTest")))
.SetHeader(views::Builder<views::View>().SetID(2))})
.Build();
- EXPECT_NE(view.get(), nullptr);
+ ASSERT_TRUE(view.get());
EXPECT_NE(parent, nullptr);
EXPECT_NE(button, nullptr);
EXPECT_TRUE(view->GetVisible());
EXPECT_FALSE(view->GetEnabled());
- EXPECT_GT(view->children().size(), size_t{0});
+ ASSERT_GT(view->children().size(), size_t{2});
EXPECT_EQ(view->children()[1]->GetFocusBehavior(),
views::View::FocusBehavior::NEVER);
EXPECT_EQ(view->children()[2], button);
diff --git a/chromium/ui/views/style/platform_style.cc b/chromium/ui/views/style/platform_style.cc
index 155fb12b920..f264720140d 100644
--- a/chromium/ui/views/style/platform_style.cc
+++ b/chromium/ui/views/style/platform_style.cc
@@ -5,6 +5,7 @@
#include "ui/views/style/platform_style.h"
#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/range/range.h"
#include "ui/gfx/utf16_indexing.h"
@@ -16,7 +17,7 @@
#include "ui/views/controls/focusable_border.h"
#include "ui/views/controls/scrollbar/scroll_bar_views.h"
-#if defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
#include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
#endif
@@ -48,12 +49,20 @@ const bool PlatformStyle::kTreeViewSelectionPaintsEntireRow = false;
const bool PlatformStyle::kUseRipples = true;
const bool PlatformStyle::kTextfieldScrollsToStartOnFocusChange = false;
const bool PlatformStyle::kTextfieldUsesDragCursorWhenDraggable = true;
-const bool PlatformStyle::kPreferFocusRings = true;
const bool PlatformStyle::kInactiveWidgetControlsAppearDisabled = false;
+// Linux clips bubble windows that extend outside their parent window
+// bounds.
+const bool PlatformStyle::kAdjustBubbleIfOffscreen =
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ false;
+#else
+ true;
+#endif
+
// static
std::unique_ptr<ScrollBar> PlatformStyle::CreateScrollBar(bool is_horizontal) {
-#if defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS) || BUILDFLAG(IS_LACROS)
return std::make_unique<OverlayScrollBar>(is_horizontal);
#else
return std::make_unique<ScrollBarViews>(is_horizontal);
@@ -72,6 +81,11 @@ gfx::Range PlatformStyle::RangeToDeleteBackwards(const base::string16& text,
return gfx::Range(cursor_position, previous_grapheme_index);
}
+// static
+View::FocusBehavior PlatformStyle::DefaultFocusBehavior() {
+ return View::FocusBehavior::ALWAYS;
+}
+
#endif // OS_APPLE
#if !BUILDFLAG(ENABLE_DESKTOP_AURA) || \
diff --git a/chromium/ui/views/style/platform_style.h b/chromium/ui/views/style/platform_style.h
index e40325ee146..a5c8d415300 100644
--- a/chromium/ui/views/style/platform_style.h
+++ b/chromium/ui/views/style/platform_style.h
@@ -9,6 +9,7 @@
#include "base/macros.h"
#include "ui/views/controls/button/button.h"
+#include "ui/views/view.h"
#include "ui/views/views_export.h"
namespace gfx {
@@ -72,14 +73,13 @@ class VIEWS_EXPORT PlatformStyle {
static const float kFocusHaloThickness;
static const float kFocusHaloInset;
- // Whether "button-like" (for example, buttons in the top chrome or Omnibox
- // decorations) UI elements should use a focus ring, rather than show
- // hover state on focus.
- static const bool kPreferFocusRings;
-
// Whether controls in inactive widgets appear disabled.
static const bool kInactiveWidgetControlsAppearDisabled;
+ // Default setting at bubble creation time for whether arrow will be adjusted
+ // for bubbles going off-screen to bring more bubble area into view.
+ static const bool kAdjustBubbleIfOffscreen;
+
// Creates the default scrollbar for the given orientation.
static std::unique_ptr<ScrollBar> CreateScrollBar(bool is_horizontal);
@@ -99,6 +99,9 @@ class VIEWS_EXPORT PlatformStyle {
static gfx::Range RangeToDeleteBackwards(const base::string16& text,
size_t cursor_position);
+ // Returns the default focus behavior based on the platform.
+ static View::FocusBehavior DefaultFocusBehavior();
+
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(PlatformStyle);
};
diff --git a/chromium/ui/views/style/platform_style_mac.mm b/chromium/ui/views/style/platform_style_mac.mm
index 739f8e6fbe4..527f947a2b7 100644
--- a/chromium/ui/views/style/platform_style_mac.mm
+++ b/chromium/ui/views/style/platform_style_mac.mm
@@ -42,8 +42,8 @@ const bool PlatformStyle::kTextfieldUsesDragCursorWhenDraggable = false;
const bool PlatformStyle::kTableViewSupportsKeyboardNavigationByCell = false;
const bool PlatformStyle::kTreeViewSelectionPaintsEntireRow = true;
const bool PlatformStyle::kUseRipples = false;
-const bool PlatformStyle::kPreferFocusRings = true;
const bool PlatformStyle::kInactiveWidgetControlsAppearDisabled = true;
+const bool PlatformStyle::kAdjustBubbleIfOffscreen = false;
const Button::KeyClickAction PlatformStyle::kKeyClickActionOnSpace =
Button::KeyClickAction::kOnKeyPress;
@@ -81,4 +81,10 @@ gfx::Range PlatformStyle::RangeToDeleteBackwards(const base::string16& text,
return gfx::Range(range_to_delete.location + range_to_delete.length,
range_to_delete.location);
}
+
+// static
+View::FocusBehavior PlatformStyle::DefaultFocusBehavior() {
+ return View::FocusBehavior::ACCESSIBLE_ONLY;
+}
+
} // namespace views
diff --git a/chromium/ui/views/test/test_desktop_screen_ozone.cc b/chromium/ui/views/test/test_desktop_screen_ozone.cc
new file mode 100644
index 00000000000..aa14505f1a1
--- /dev/null
+++ b/chromium/ui/views/test/test_desktop_screen_ozone.cc
@@ -0,0 +1,26 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/test/test_desktop_screen_ozone.h"
+
+#include <memory>
+
+#include "base/memory/singleton.h"
+
+namespace views {
+namespace test {
+
+TestDesktopScreenOzone* TestDesktopScreenOzone::GetInstance() {
+ return base::Singleton<TestDesktopScreenOzone>::get();
+}
+
+gfx::Point TestDesktopScreenOzone::GetCursorScreenPoint() {
+ return cursor_screen_point_;
+}
+
+TestDesktopScreenOzone::TestDesktopScreenOzone() = default;
+TestDesktopScreenOzone::~TestDesktopScreenOzone() = default;
+
+} // namespace test
+} // namespace views
diff --git a/chromium/ui/views/test/test_desktop_screen_ozone.h b/chromium/ui/views/test/test_desktop_screen_ozone.h
new file mode 100644
index 00000000000..abaea86dfd5
--- /dev/null
+++ b/chromium/ui/views/test/test_desktop_screen_ozone.h
@@ -0,0 +1,50 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_TEST_TEST_DESKTOP_SCREEN_OZONE_H_
+#define UI_VIEWS_TEST_TEST_DESKTOP_SCREEN_OZONE_H_
+
+#include "ui/gfx/geometry/point.h"
+#include "ui/views/widget/desktop_aura/desktop_screen_ozone.h"
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}
+
+namespace views {
+namespace test {
+
+// Replaces the screen instance in Linux/Ozone (non-ChromeOS) tests. Allows
+// aura tests to manually set the cursor screen point to be reported
+// by GetCursorScreenPoint(). Needed because of a limitation in the
+// X11 protocol that restricts us from warping the pointer with the
+// mouse button held down.
+class TestDesktopScreenOzone : public views::DesktopScreenOzone {
+ public:
+ TestDesktopScreenOzone(const TestDesktopScreenOzone&) = delete;
+ TestDesktopScreenOzone& operator=(const TestDesktopScreenOzone&) = delete;
+
+ static TestDesktopScreenOzone* GetInstance();
+
+ // DesktopScreenOzone:
+ gfx::Point GetCursorScreenPoint() override;
+
+ void set_cursor_screen_point(const gfx::Point& point) {
+ cursor_screen_point_ = point;
+ }
+
+ private:
+ friend struct base::DefaultSingletonTraits<TestDesktopScreenOzone>;
+
+ TestDesktopScreenOzone();
+ ~TestDesktopScreenOzone() override;
+
+ gfx::Point cursor_screen_point_;
+};
+
+} // namespace test
+} // namespace views
+
+#endif // UI_VIEWS_TEST_TEST_DESKTOP_SCREEN_OZONE_H_
diff --git a/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc b/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc
new file mode 100644
index 00000000000..f8f61c0e707
--- /dev/null
+++ b/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.cc
@@ -0,0 +1,177 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/test/ui_controls_factory_desktop_aura_ozone.h"
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/check_op.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "ui/aura/client/screen_position_client.h"
+#include "ui/aura/env.h"
+#include "ui/aura/test/aura_test_utils.h"
+#include "ui/aura/test/ui_controls_factory_aura.h"
+#include "ui/aura/window_event_dispatcher.h"
+#include "ui/base/test/ui_controls_aura.h"
+#include "ui/ozone/public/ozone_ui_controls_test_helper.h"
+#include "ui/views/test/test_desktop_screen_ozone.h"
+#include "ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h"
+
+namespace views {
+namespace test {
+namespace {
+
+using ui_controls::DOWN;
+using ui_controls::LEFT;
+using ui_controls::MIDDLE;
+using ui_controls::MouseButton;
+using ui_controls::RIGHT;
+using ui_controls::UIControlsAura;
+using ui_controls::UP;
+
+class UIControlsDesktopOzone : public UIControlsAura {
+ public:
+ UIControlsDesktopOzone()
+ : ozone_ui_controls_test_helper_(ui::CreateOzoneUIControlsTestHelper()) {
+ DCHECK(ozone_ui_controls_test_helper_)
+ << "The test suite cannot be run without OzoneUIControlsTestHelper.";
+ }
+ ~UIControlsDesktopOzone() override = default;
+
+ bool SendKeyPress(gfx::NativeWindow window,
+ ui::KeyboardCode key,
+ bool control,
+ bool shift,
+ bool alt,
+ bool command) override {
+ DCHECK(!command); // No command key on Aura
+ return SendKeyPressNotifyWhenDone(window, key, control, shift, alt, command,
+ base::OnceClosure());
+ }
+
+ bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window,
+ ui::KeyboardCode key,
+ bool control,
+ bool shift,
+ bool alt,
+ bool command,
+ base::OnceClosure closure) override {
+ DCHECK(!command); // No command key on Aura
+ aura::WindowTreeHost* host = window->GetHost();
+ ozone_ui_controls_test_helper_->SendKeyPressEvent(
+ host->GetAcceleratedWidget(), key, control, shift, alt, command,
+ std::move(closure));
+ return true;
+ }
+
+ bool SendMouseMove(int screen_x, int screen_y) override {
+ return SendMouseMoveNotifyWhenDone(screen_x, screen_y, base::OnceClosure());
+ }
+ bool SendMouseMoveNotifyWhenDone(int screen_x,
+ int screen_y,
+ base::OnceClosure closure) override {
+ gfx::Point screen_location(screen_x, screen_y);
+ gfx::Point root_location = screen_location;
+ aura::Window* root_window = RootWindowForPoint(screen_location);
+
+ aura::client::ScreenPositionClient* screen_position_client =
+ aura::client::GetScreenPositionClient(root_window);
+ if (screen_position_client) {
+ screen_position_client->ConvertPointFromScreen(root_window,
+ &root_location);
+ }
+
+ aura::WindowTreeHost* host = root_window->GetHost();
+ gfx::Point root_current_location =
+ aura::test::QueryLatestMousePositionRequestInHost(host);
+ host->ConvertPixelsToDIP(&root_current_location);
+
+ auto* screen = views::test::TestDesktopScreenOzone::GetInstance();
+ DCHECK_EQ(screen, display::Screen::GetScreen());
+ screen->set_cursor_screen_point(gfx::Point(screen_x, screen_y));
+
+ if (root_location != root_current_location &&
+ ozone_ui_controls_test_helper_->ButtonDownMask() == 0) {
+ // Move the cursor because EnterNotify/LeaveNotify are generated with the
+ // current mouse position as a result of XGrabPointer()
+ root_window->MoveCursorTo(root_location);
+ } else {
+ gfx::Point screen_point(root_location);
+ host->ConvertDIPToScreenInPixels(&screen_point);
+ ozone_ui_controls_test_helper_->SendMouseMotionNotifyEvent(
+ host->GetAcceleratedWidget(), root_location, screen_point,
+ std::move(closure));
+ }
+ ozone_ui_controls_test_helper_->RunClosureAfterAllPendingUIEvents(
+ std::move(closure));
+ return true;
+ }
+ bool SendMouseEvents(MouseButton type,
+ int button_state,
+ int accelerator_state) override {
+ return SendMouseEventsNotifyWhenDone(
+ type, button_state, base::OnceClosure(), accelerator_state);
+ }
+
+ bool SendMouseEventsNotifyWhenDone(MouseButton type,
+ int button_state,
+ base::OnceClosure closure,
+ int accelerator_state) override {
+ gfx::Point mouse_loc = aura::Env::GetInstance()->last_mouse_location();
+ aura::Window* root_window = RootWindowForPoint(mouse_loc);
+ aura::client::ScreenPositionClient* screen_position_client =
+ aura::client::GetScreenPositionClient(root_window);
+ if (screen_position_client)
+ screen_position_client->ConvertPointFromScreen(root_window, &mouse_loc);
+
+ // x11::ButtonEvent xevent;
+ gfx::Point mouse_root_loc = mouse_loc;
+ root_window->GetHost()->ConvertDIPToScreenInPixels(&mouse_root_loc);
+ ozone_ui_controls_test_helper_->SendMouseEvent(
+ root_window->GetHost()->GetAcceleratedWidget(), type, button_state,
+ accelerator_state, mouse_loc, mouse_root_loc, std::move(closure));
+ return true;
+ }
+ bool SendMouseClick(MouseButton type) override {
+ return SendMouseEvents(type, UP | DOWN, ui_controls::kNoAccelerator);
+ }
+
+ private:
+ aura::Window* RootWindowForPoint(const gfx::Point& point) {
+ // Most interactive_ui_tests run inside of the aura_test_helper
+ // environment. This means that we can't rely on display::Screen and several
+ // other things to work properly. Therefore we hack around this by
+ // iterating across the windows owned DesktopWindowTreeHostLinux since this
+ // doesn't rely on having a DesktopScreenX11.
+ std::vector<aura::Window*> windows =
+ DesktopWindowTreeHostLinux::GetAllOpenWindows();
+ const auto i =
+ std::find_if(windows.cbegin(), windows.cend(), [point](auto* window) {
+ return window->GetBoundsInScreen().Contains(point) ||
+ window->HasCapture();
+ });
+ DCHECK(i != windows.cend()) << "Couldn't find RW for " << point.ToString()
+ << " among " << windows.size() << " RWs.";
+ return (*i)->GetRootWindow();
+ }
+
+ std::unique_ptr<ui::OzoneUIControlsTestHelper> ozone_ui_controls_test_helper_;
+
+ DISALLOW_COPY_AND_ASSIGN(UIControlsDesktopOzone);
+};
+
+} // namespace
+
+UIControlsAura* CreateUIControlsDesktopAuraOzone() {
+ return new UIControlsDesktopOzone();
+}
+
+} // namespace test
+} // namespace views
diff --git a/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.h b/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.h
new file mode 100644
index 00000000000..3f05bdf775f
--- /dev/null
+++ b/chromium/ui/views/test/ui_controls_factory_desktop_aura_ozone.h
@@ -0,0 +1,20 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_TEST_UI_CONTROLS_FACTORY_DESKTOP_AURA_OZONE_H_
+#define UI_VIEWS_TEST_UI_CONTROLS_FACTORY_DESKTOP_AURA_OZONE_H_
+
+namespace ui_controls {
+class UIControlsAura;
+}
+
+namespace views {
+namespace test {
+
+ui_controls::UIControlsAura* CreateUIControlsDesktopAuraOzone();
+
+} // namespace test
+} // namespace views
+
+#endif // UI_VIEWS_TEST_UI_CONTROLS_FACTORY_DESKTOP_AURA_OZONE_H_
diff --git a/chromium/ui/views/touchui/touch_selection_menu_views.cc b/chromium/ui/views/touchui/touch_selection_menu_views.cc
index 7975690c84e..d183819e841 100644
--- a/chromium/ui/views/touchui/touch_selection_menu_views.cc
+++ b/chromium/ui/views/touchui/touch_selection_menu_views.cc
@@ -5,6 +5,7 @@
#include "ui/views/touchui/touch_selection_menu_views.h"
#include <memory>
+#include <utility>
#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
@@ -22,6 +23,7 @@
#include "ui/touch_selection/touch_selection_menu_runner.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/layout/box_layout.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
namespace views {
namespace {
@@ -56,7 +58,7 @@ TouchSelectionMenuViews::TouchSelectionMenuViews(
set_margins(kMenuMargins);
SetCanActivate(false);
set_adjust_if_offscreen(true);
- EnableCanvasFlippingForRTLUI(true);
+ SetFlipCanvasOnPaintForRTLUI(true);
SetLayoutManager(
std::make_unique<BoxLayout>(BoxLayout::Orientation::kHorizontal,
@@ -122,30 +124,35 @@ TouchSelectionMenuViews::~TouchSelectionMenuViews() = default;
void TouchSelectionMenuViews::CreateButtons() {
for (const auto& command : kMenuCommands) {
- if (!client_->IsCommandIdEnabled(command.command_id))
- continue;
-
- Button* button =
- CreateButton(l10n_util::GetStringUTF16(command.message_id));
- button->set_tag(command.command_id);
- AddChildView(button);
+ if (client_->IsCommandIdEnabled(command.command_id)) {
+ CreateButton(
+ l10n_util::GetStringUTF16(command.message_id),
+ base::BindRepeating(&TouchSelectionMenuViews::ButtonPressed,
+ base::Unretained(this), command.command_id));
+ }
}
// Finally, add ellipsis button.
- LabelButton* ellipsis_button = CreateButton(base::ASCIIToUTF16("..."));
- ellipsis_button->SetID(ButtonViewId::kEllipsisButton);
- AddChildView(ellipsis_button);
+ CreateButton(base::ASCIIToUTF16("..."),
+ base::BindRepeating(
+ [](TouchSelectionMenuViews* menu) {
+ menu->CloseMenu();
+ menu->client_->RunContextMenu();
+ },
+ base::Unretained(this)))
+ ->SetID(ButtonViewId::kEllipsisButton);
InvalidateLayout();
}
LabelButton* TouchSelectionMenuViews::CreateButton(
- const base::string16& title) {
+ const base::string16& title,
+ Button::PressedCallback callback) {
base::string16 label =
gfx::RemoveAcceleratorChar(title, '&', nullptr, nullptr);
- LabelButton* button = new LabelButton(this, label, style::CONTEXT_TOUCH_MENU);
+ auto* button = AddChildView(std::make_unique<LabelButton>(
+ std::move(callback), label, style::CONTEXT_TOUCH_MENU));
constexpr gfx::Size kMenuButtonMinSize = gfx::Size(63, 38);
button->SetMinSize(kMenuButtonMinSize);
- button->SetFocusForPlatform();
button->SetHorizontalAlignment(gfx::ALIGN_CENTER);
return button;
}
@@ -178,13 +185,10 @@ void TouchSelectionMenuViews::WindowClosing() {
DisconnectOwner();
}
-void TouchSelectionMenuViews::ButtonPressed(Button* sender,
+void TouchSelectionMenuViews::ButtonPressed(int command,
const ui::Event& event) {
CloseMenu();
- if (sender->GetID() != ButtonViewId::kEllipsisButton)
- client_->ExecuteCommand(sender->tag(), event.flags());
- else
- client_->RunContextMenu();
+ client_->ExecuteCommand(command, event.flags());
}
BEGIN_METADATA(TouchSelectionMenuViews, BubbleDialogDelegateView)
diff --git a/chromium/ui/views/touchui/touch_selection_menu_views.h b/chromium/ui/views/touchui/touch_selection_menu_views.h
index 77121939b18..9e1d093228a 100644
--- a/chromium/ui/views/touchui/touch_selection_menu_views.h
+++ b/chromium/ui/views/touchui/touch_selection_menu_views.h
@@ -7,7 +7,6 @@
#include "base/macros.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/touchui/touch_selection_menu_runner_views.h"
namespace ui {
@@ -19,8 +18,7 @@ class LabelButton;
// A bubble that contains actions available for the selected text. An object of
// this type, as a BubbleDialogDelegateView, manages its own lifetime.
-class VIEWS_EXPORT TouchSelectionMenuViews : public BubbleDialogDelegateView,
- public ButtonListener {
+class VIEWS_EXPORT TouchSelectionMenuViews : public BubbleDialogDelegateView {
public:
METADATA_HEADER(TouchSelectionMenuViews);
@@ -47,14 +45,14 @@ class VIEWS_EXPORT TouchSelectionMenuViews : public BubbleDialogDelegateView,
virtual void CreateButtons();
// Helper method to create a single button.
- LabelButton* CreateButton(const base::string16& title);
-
- // ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
+ LabelButton* CreateButton(const base::string16& title,
+ Button::PressedCallback callback);
private:
friend class TouchSelectionMenuRunnerViews::TestApi;
+ void ButtonPressed(int command, const ui::Event& event);
+
// Helper to disconnect this menu object from its owning menu runner.
void DisconnectOwner();
diff --git a/chromium/ui/views/view.cc b/chromium/ui/views/view.cc
index 03f02eb227a..39e229e165a 100644
--- a/chromium/ui/views/view.cc
+++ b/chromium/ui/views/view.cc
@@ -732,6 +732,13 @@ gfx::Rect View::GetMirroredBounds() const {
return bounds;
}
+gfx::Rect View::GetMirroredContentsBounds() const {
+ gfx::Rect bounds(bounds_);
+ bounds.Inset(GetInsets());
+ bounds.set_x(GetMirroredX());
+ return bounds;
+}
+
gfx::Point View::GetMirroredPosition() const {
return gfx::Point(GetMirroredX(), y());
}
@@ -1148,8 +1155,30 @@ void View::SetNativeThemeForTesting(ui::NativeTheme* theme) {
// RTL painting ----------------------------------------------------------------
-void View::EnableCanvasFlippingForRTLUI(bool enable) {
+bool View::GetFlipCanvasOnPaintForRTLUI() const {
+ return flip_canvas_on_paint_for_rtl_ui_;
+}
+
+void View::SetFlipCanvasOnPaintForRTLUI(bool enable) {
+ if (enable == flip_canvas_on_paint_for_rtl_ui_)
+ return;
flip_canvas_on_paint_for_rtl_ui_ = enable;
+
+ OnPropertyChanged(&flip_canvas_on_paint_for_rtl_ui_, kPropertyEffectsPaint);
+}
+
+PropertyChangedSubscription View::AddFlipCanvasOnPaintForRTLUIChangedCallback(
+ PropertyChangedCallback callback) {
+ return AddPropertyChangedCallback(&flip_canvas_on_paint_for_rtl_ui_,
+ std::move(callback));
+}
+
+void View::SetMirrored(bool is_mirrored) {
+ if (is_mirrored_ && is_mirrored_.value() == is_mirrored)
+ return;
+ is_mirrored_ = is_mirrored;
+
+ OnPropertyChanged(&is_mirrored_, kPropertyEffectsPaint);
}
bool View::GetMirrored() const {
@@ -3053,6 +3082,7 @@ BEGIN_METADATA_BASE(View)
ADD_READONLY_PROPERTY_METADATA(const char*, ClassName)
ADD_PROPERTY_METADATA(bool, Enabled)
ADD_PROPERTY_METADATA(View::FocusBehavior, FocusBehavior)
+ADD_PROPERTY_METADATA(bool, FlipCanvasOnPaintForRTLUI)
ADD_PROPERTY_METADATA(int, Group)
ADD_PROPERTY_METADATA(int, ID)
ADD_READONLY_PROPERTY_METADATA(gfx::Size, MaximumSize)
diff --git a/chromium/ui/views/view.h b/chromium/ui/views/view.h
index ff42e928249..758e7d17bea 100644
--- a/chromium/ui/views/view.h
+++ b/chromium/ui/views/view.h
@@ -48,7 +48,6 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/views/layout/layout_types.h"
#include "ui/views/metadata/metadata_header_macros.h"
-#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/metadata/view_factory.h"
#include "ui/views/paint_info.h"
#include "ui/views/view_targeter.h"
@@ -683,6 +682,7 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// transparent to the View subclasses and therefore you should use the
// bounds() accessor instead.
gfx::Rect GetMirroredBounds() const;
+ gfx::Rect GetMirroredContentsBounds() const;
gfx::Point GetMirroredPosition() const;
int GetMirroredX() const;
@@ -763,8 +763,8 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// Recursively descends the view tree starting at this view, and returns
// the first child that it encounters that has the given ID.
// Returns NULL if no matching child view is found.
- virtual const View* GetViewByID(int id) const;
- virtual View* GetViewByID(int id);
+ const View* GetViewByID(int id) const;
+ View* GetViewByID(int id);
// Gets and sets the ID for this view. ID should be unique within the subtree
// that you intend to search for it. 0 is the default ID for views.
@@ -897,13 +897,10 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// RTL painting --------------------------------------------------------------
- // This method determines whether the gfx::Canvas object passed to
- // Paint() needs to be transformed such that anything drawn on the canvas
- // object during Paint() is flipped horizontally.
- bool flip_canvas_on_paint_for_rtl_ui() const {
- return flip_canvas_on_paint_for_rtl_ui_;
- }
-
+ // Returns whether the gfx::Canvas object passed to Paint() needs to be
+ // transformed such that anything drawn on the canvas object during Paint()
+ // is flipped horizontally.
+ bool GetFlipCanvasOnPaintForRTLUI() const;
// Enables or disables flipping of the gfx::Canvas during Paint(). Note that
// if canvas flipping is enabled, the canvas will be flipped only if the UI
// layout is right-to-left; that is, the canvas will be flipped only if
@@ -914,19 +911,25 @@ class VIEWS_EXPORT View : public ui::LayerDelegate,
// (views::Button, for example). This method is helpful for such classes
// because their drawing logic stays the same and they can become agnostic to
// the UI directionality.
- virtual void EnableCanvasFlippingForRTLUI(bool enable);
+ void SetFlipCanvasOnPaintForRTLUI(bool enable);
+
+ // Adds a callback subscription associated with the above
+ // FlipCanvasOnPaintForRTLUI property. The callback will be invoked whenever
+ // the FlipCanvasOnPaintForRTLUI property changes.
+ PropertyChangedSubscription AddFlipCanvasOnPaintForRTLUIChangedCallback(
+ PropertyChangedCallback callback) WARN_UNUSED_RESULT;
// When set, this view will ignore base::l18n::IsRTL() and instead be drawn
// according to |is_mirrored|.
//
// This is useful for views that should be displayed the same regardless of UI
- // direction. Unlike EnableCanvasFlippingForRTLUI this setting has an effect
+ // direction. Unlike SetFlipCanvasOnPaintForRTLUI this setting has an effect
// on the visual order of child views.
//
// This setting does not propagate to child views. So while the visual order
// of this view's children may change, the visual order of this view's
// grandchildren in relation to their parents are unchanged.
- void SetMirrored(bool is_mirrored) { is_mirrored_ = is_mirrored; }
+ void SetMirrored(bool is_mirrored);
bool GetMirrored() const;
// Input ---------------------------------------------------------------------
@@ -2074,6 +2077,7 @@ VIEW_BUILDER_PROPERTY(gfx::Size, PreferredSize)
VIEW_BUILDER_PROPERTY(SkPath, ClipPath)
VIEW_BUILDER_PROPERTY_DEFAULT(ui::LayerType, PaintToLayer, ui::LAYER_TEXTURED)
VIEW_BUILDER_PROPERTY(bool, Enabled)
+VIEW_BUILDER_PROPERTY(bool, FlipCanvasOnPaintForRTLUI)
VIEW_BUILDER_PROPERTY(views::View::FocusBehavior, FocusBehavior)
VIEW_BUILDER_PROPERTY(int, Group)
VIEW_BUILDER_PROPERTY(int, ID)
@@ -2082,8 +2086,10 @@ VIEW_BUILDER_PROPERTY(bool, NotifyEnterExitOnChild)
VIEW_BUILDER_PROPERTY(gfx::Transform, Transform)
VIEW_BUILDER_PROPERTY(bool, Visible)
VIEW_BUILDER_PROPERTY(bool, CanProcessEventsWithinSubtree)
-END_VIEW_BUILDER(VIEWS_EXPORT, View)
+END_VIEW_BUILDER
} // namespace views
+DEFINE_VIEW_BUILDER(VIEWS_EXPORT, View)
+
#endif // UI_VIEWS_VIEW_H_
diff --git a/chromium/ui/views/view_class_properties.cc b/chromium/ui/views/view_class_properties.cc
index 38854bc09cc..a2799b0c428 100644
--- a/chromium/ui/views/view_class_properties.cc
+++ b/chromium/ui/views/view_class_properties.cc
@@ -19,8 +19,7 @@ DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT, int)
DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT, gfx::Insets*)
-DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
- views::BubbleDialogDelegate*)
+DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT, views::DialogDelegate*)
DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
views::HighlightPathGenerator*)
@@ -32,7 +31,7 @@ namespace views {
DEFINE_UI_CLASS_PROPERTY_KEY(int, kHitTestComponentKey, HTNOWHERE)
DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Insets, kMarginsKey, nullptr)
DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Insets, kInternalPaddingKey, nullptr)
-DEFINE_UI_CLASS_PROPERTY_KEY(views::BubbleDialogDelegate*,
+DEFINE_UI_CLASS_PROPERTY_KEY(views::DialogDelegate*,
kAnchoredDialogKey,
nullptr)
DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(views::HighlightPathGenerator,
diff --git a/chromium/ui/views/view_class_properties.h b/chromium/ui/views/view_class_properties.h
index 8656abe0129..bf7abfd4716 100644
--- a/chromium/ui/views/view_class_properties.h
+++ b/chromium/ui/views/view_class_properties.h
@@ -15,7 +15,7 @@ class Insets;
namespace views {
-class BubbleDialogDelegate;
+class DialogDelegate;
class FlexSpecification;
class HighlightPathGenerator;
@@ -42,7 +42,7 @@ VIEWS_EXPORT extern const ui::ClassProperty<gfx::Insets*>* const
// A property to store the bubble dialog anchored to this view, to
// enable the bubble's contents to be included in the focus order.
-VIEWS_EXPORT extern const ui::ClassProperty<BubbleDialogDelegate*>* const
+VIEWS_EXPORT extern const ui::ClassProperty<DialogDelegate*>* const
kAnchoredDialogKey;
// A property to store a highlight-path generator. This generator is used to
@@ -66,8 +66,7 @@ VIEWS_EXPORT extern const ui::ClassProperty<LayoutAlignment*>* const
// template instance before its specialization is declared in a
// translation unit is a C++ error.
DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT, gfx::Insets*)
-DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
- views::BubbleDialogDelegate*)
+DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT, views::DialogDelegate*)
DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
views::HighlightPathGenerator*)
DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT, views::FlexSpecification*)
diff --git a/chromium/ui/views/view_unittest.cc b/chromium/ui/views/view_unittest.cc
index 071d221038b..957d0e21cd1 100644
--- a/chromium/ui/views/view_unittest.cc
+++ b/chromium/ui/views/view_unittest.cc
@@ -2417,90 +2417,6 @@ TEST_F(ViewTest, ViewInHiddenWidgetWithAccelerator) {
}
#endif // OS_APPLE
-// TODO(crbug.com/667757): these tests were initially commented out when getting
-// aura to run. Figure out if still valuable and either nuke or fix.
-#if 0
-////////////////////////////////////////////////////////////////////////////////
-// Mouse-wheel message rerouting
-////////////////////////////////////////////////////////////////////////////////
-class ScrollableTestView : public View {
- public:
- ScrollableTestView() { }
-
- virtual gfx::Size GetPreferredSize() {
- return gfx::Size(100, 10000);
- }
-
- virtual void Layout() {
- SizeToPreferredSize();
- }
-};
-
-class TestViewWithControls : public View {
- public:
- TestViewWithControls() {
- text_field_ = new Textfield();
- AddChildView(text_field_);
- }
-
- Textfield* text_field_;
-};
-
-class SimpleWidgetDelegate : public WidgetDelegate {
- public:
- explicit SimpleWidgetDelegate(View* contents) : contents_(contents) { }
-
- virtual void DeleteDelegate() { delete this; }
-
- virtual View* GetContentsView() { return contents_; }
-
- virtual Widget* GetWidget() { return contents_->GetWidget(); }
- virtual const Widget* GetWidget() const { return contents_->GetWidget(); }
-
- private:
- View* contents_;
-};
-
-// Tests that the mouse-wheel messages are correctly rerouted to the window
-// under the mouse.
-// TODO(jcampan): http://crbug.com/10572 Disabled as it fails on the Vista build
-// bot.
-// Note that this fails for a variety of reasons:
-// - focused view is apparently reset across window activations and never
-// properly restored
-// - this test depends on you not having any other window visible open under the
-// area that it opens the test windows. --beng
-TEST_F(ViewTest, DISABLED_RerouteMouseWheelTest) {
- TestViewWithControls* view_with_controls = new TestViewWithControls();
- Widget* window1 = Widget::CreateWindowWithBounds(
- new SimpleWidgetDelegate(view_with_controls),
- gfx::Rect(0, 0, 100, 100));
- window1->Show();
- ScrollView* scroll_view = new ScrollView();
- scroll_view->SetContents(new ScrollableTestView());
- Widget* window2 = Widget::CreateWindowWithBounds(
- new SimpleWidgetDelegate(scroll_view),
- gfx::Rect(200, 200, 100, 100));
- window2->Show();
- EXPECT_EQ(0, scroll_view->GetVisibleRect().y());
-
- // Make the window1 active, as this is what it would be in real-world.
- window1->Activate();
-
- // Let's send a mouse-wheel message to the different controls and check that
- // it is rerouted to the window under the mouse (effectively scrolling the
- // scroll-view).
-
- // First to the Window's HWND.
- ::SendMessage(view_with_controls->GetWidget()->GetNativeView(),
- WM_MOUSEWHEEL, MAKEWPARAM(0, -20), MAKELPARAM(250, 250));
- EXPECT_EQ(20, scroll_view->GetVisibleRect().y());
-
- window1->CloseNow();
- window2->CloseNow();
-}
-#endif // 0
-
////////////////////////////////////////////////////////////////////////////////
// Native view hierachy
////////////////////////////////////////////////////////////////////////////////
diff --git a/chromium/ui/views/views_features.cc b/chromium/ui/views/views_features.cc
index 3c30f2f1fe6..83a10c42e3c 100644
--- a/chromium/ui/views/views_features.cc
+++ b/chromium/ui/views/views_features.cc
@@ -30,16 +30,9 @@ const base::Feature kEnableViewPaintOptimization{
"EnableViewPaintOptimization", base::FEATURE_DISABLED_BY_DEFAULT};
// Change views::Textfield to take focus on a completed tap, rather than
-// immediately on tap down. This only affects touch input. See
-// https://crbug.com/1069634.
-const base::Feature kTextfieldFocusOnTapUp {
- "TextfieldFocusOnTapUp",
-#if defined(OS_CHROMEOS)
- base::FEATURE_DISABLED_BY_DEFAULT
-#else
- base::FEATURE_ENABLED_BY_DEFAULT
-#endif // defined(OS_CHROMEOS)
-};
+// immediately on tap down. This only affects touch input.
+const base::Feature kTextfieldFocusOnTapUp{"TextfieldFocusOnTapUp",
+ base::FEATURE_ENABLED_BY_DEFAULT};
// Allows a "New" badge to be displayed on menu items that provide access to new
// features.
diff --git a/chromium/ui/views/widget/any_widget_observer.cc b/chromium/ui/views/widget/any_widget_observer.cc
index b0b1860cad2..9bf2ee7efd2 100644
--- a/chromium/ui/views/widget/any_widget_observer.cc
+++ b/chromium/ui/views/widget/any_widget_observer.cc
@@ -25,7 +25,7 @@ AnyWidgetObserver::~AnyWidgetObserver() {
#define PROPAGATE_NOTIFICATION(method, callback) \
void AnyWidgetObserver::method(Widget* widget) { \
if (callback) \
- callback.Run(widget); \
+ (callback).Run(widget); \
}
PROPAGATE_NOTIFICATION(OnAnyWidgetInitialized, initialized_callback_)
diff --git a/chromium/ui/views/widget/any_widget_observer_unittest.cc b/chromium/ui/views/widget/any_widget_observer_unittest.cc
index 344fd0943bd..e67837940af 100644
--- a/chromium/ui/views/widget/any_widget_observer_unittest.cc
+++ b/chromium/ui/views/widget/any_widget_observer_unittest.cc
@@ -8,7 +8,7 @@
#include <utility>
#include "base/bind.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "base/threading/thread_task_runner_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/views/test/native_widget_factory.h"
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
index 87fc643f18b..9c6073c46e1 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
@@ -40,7 +40,7 @@ class FakePlatformWindow : public ui::PlatformWindow, public ui::WmDragHandler {
bool IsVisible() const override { return true; }
void PrepareForShutdown() override {}
void SetBounds(const gfx::Rect& bounds) override {}
- gfx::Rect GetBounds() override { return gfx::Rect(); }
+ gfx::Rect GetBounds() const override { return gfx::Rect(); }
void SetTitle(const base::string16& title) override {}
void SetCapture() override {}
void ReleaseCapture() override {}
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc b/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
index ab7213a3889..fd44f73d9b5 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
@@ -37,9 +37,8 @@ void DesktopNativeCursorManager::RemoveHost(aura::WindowTreeHost* host) {
void DesktopNativeCursorManager::SetDisplay(
const display::Display& display,
wm::NativeCursorManagerDelegate* delegate) {
- cursor_loader_->UnloadAll();
- cursor_loader_->set_rotation(display.rotation());
- cursor_loader_->set_scale(display.device_scale_factor());
+ cursor_loader_->SetDisplayData(display.rotation(),
+ display.device_scale_factor());
SetCursor(delegate->GetCursor(), delegate);
}
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
index 48a91153ca9..3d70eb212ae 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -30,6 +30,7 @@
#include "ui/base/ime/input_method.h"
#include "ui/base/ui_base_features.h"
#include "ui/compositor/layer.h"
+#include "ui/display/screen.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/point_conversions.h"
#include "ui/gfx/geometry/rect.h"
@@ -522,6 +523,9 @@ void DesktopNativeWidgetAura::InitNativeWidget(Widget::InitParams params) {
if (!cursor_manager_) {
cursor_manager_ = new wm::CursorManager(
std::unique_ptr<wm::NativeCursorManager>(native_cursor_manager_));
+ cursor_manager_->SetDisplay(
+ display::Screen::GetScreen()->GetDisplayNearestWindow(
+ host_->window()));
}
native_cursor_manager_->AddHost(host());
aura::client::SetCursorClient(host_->window(), cursor_manager_);
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_position_client.cc b/chromium/ui/views/widget/desktop_aura/desktop_screen_position_client.cc
index 2406d29e9b4..5a04e034a57 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen_position_client.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_position_client.cc
@@ -46,7 +46,7 @@ void DesktopScreenPositionClient::SetBounds(aura::Window* window,
gfx::Point origin = bounds.origin();
aura::Window::ConvertPointToTarget(window->parent(), root, &origin);
- gfx::Point host_origin = GetOriginInScreen(root);
+ gfx::Point host_origin = GetRootWindowOriginInScreen(root);
origin.Offset(-host_origin.x(), -host_origin.y());
window->SetBounds(gfx::Rect(origin, bounds.size()));
return;
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc b/chromium/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
index b014bb2eda3..ad4c60e07bf 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
@@ -24,7 +24,6 @@
#include "ui/events/test/event_generator.h"
#include "ui/gfx/font_render_params.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h"
@@ -71,7 +70,7 @@ class DesktopScreenX11Test : public views::ViewsTestBase,
// Overridden from testing::Test:
void SetUp() override {
ViewsTestBase::SetUp();
- // TODO(msisov): rewrite desktop screen tests for ozone and non-ozone Linux.
+ // TODO(crbug.com/1096425): Once non-Ozone X11 is deprecated, re-work this.
if (features::IsUsingOzonePlatform())
GTEST_SKIP();
// Initialize the world to the single monitor case.
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc
index caa9ccef20b..ee8f425455c 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc
@@ -21,7 +21,6 @@
#include "ui/base/x/test/x11_property_change_waiter.h"
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/x11/x11_event_source.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/xproto.h"
#include "ui/views/controls/textfield/textfield.h"
diff --git a/chromium/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc b/chromium/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc
index 9d64b437e54..7836638956f 100644
--- a/chromium/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc
+++ b/chromium/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc
@@ -30,9 +30,7 @@
#include "ui/base/x/x11_os_exchange_data_provider.h"
#include "ui/base/x/x11_util.h"
#include "ui/events/event_utils.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
-#include "ui/gfx/x/x11_types.h"
#include "ui/gfx/x/xproto.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
@@ -487,7 +485,7 @@ class X11DragDropClientTest : public ViewsTestBase {
set_native_widget_type(NativeWidgetType::kDesktop);
ViewsTestBase::SetUp();
- // TODO(msisov): rewrite these tests for ozone and non-ozone Linux.
+ // TODO(crbug.com/1096425): Once non-Ozone X11 is deprecated, re-work this.
if (features::IsUsingOzonePlatform())
GTEST_SKIP();
diff --git a/chromium/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc b/chromium/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
index 6d968113213..12f95a35876 100644
--- a/chromium/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
+++ b/chromium/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
@@ -11,6 +11,7 @@
#include <vector>
#include "base/stl_util.h"
+#include "build/build_config.h"
#include "third_party/skia/include/core/SkRect.h"
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
@@ -21,7 +22,6 @@
#include "ui/gfx/x/connection.h"
#include "ui/gfx/x/event.h"
#include "ui/gfx/x/shape.h"
-#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
#include "ui/gfx/x/x11_path.h"
#include "ui/gfx/x/xproto.h"
@@ -124,13 +124,13 @@ class X11TopmostWindowFinderTest : public test::DesktopWidgetTestInteractive {
#endif
// Make X11 synchronous for our display connection. This does not force the
// window manager to behave synchronously.
- XSynchronize(xdisplay(), true);
+ connection()->SynchronizeForTest(true);
DesktopWidgetTestInteractive::SetUp();
}
void TearDown() override {
if (!IsSkipped())
- XSynchronize(xdisplay(), false);
+ connection()->SynchronizeForTest(false);
DesktopWidgetTestInteractive::TearDown();
}
@@ -178,7 +178,6 @@ class X11TopmostWindowFinderTest : public test::DesktopWidgetTestInteractive {
}
x11::Connection* connection() { return x11::Connection::Get(); }
- Display* xdisplay() { return gfx::GetXDisplay(); }
// Returns the topmost X window at the passed in screen position.
x11::Window FindTopmostXWindowAt(int screen_x, int screen_y) {
@@ -378,7 +377,13 @@ TEST_F(X11TopmostWindowFinderTest, NonRectangularEmptyShape) {
}
// Test that setting a Null shape removes the shape.
-TEST_F(X11TopmostWindowFinderTest, NonRectangularNullShape) {
+// crbug.com/955316: flaky on Linux
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+#define MAYBE_NonRectangularNullShape DISABLED_NonRectangularNullShape
+#else
+#define MAYBE_NonRectangularNullShape NonRectangularNullShape
+#endif
+TEST_F(X11TopmostWindowFinderTest, MAYBE_NonRectangularNullShape) {
if (!ui::IsShapeExtensionAvailable())
return;
diff --git a/chromium/ui/views/widget/native_widget_aura.cc b/chromium/ui/views/widget/native_widget_aura.cc
index 254be7a1692..9f5dff1077c 100644
--- a/chromium/ui/views/widget/native_widget_aura.cc
+++ b/chromium/ui/views/widget/native_widget_aura.cc
@@ -472,6 +472,21 @@ gfx::Rect NativeWidgetAura::GetRestoredBounds() const {
if (restore_bounds)
return *restore_bounds;
}
+
+ // Prefer getting the window bounds and converting them to screen bounds since
+ // Window::GetBoundsInScreen takes into the account the window transform.
+ auto* screen_position_client =
+ aura::client::GetScreenPositionClient(window_->GetRootWindow());
+ if (screen_position_client) {
+ // |window_|'s bounds are in parent's coordinate system so use that when
+ // converting.
+ gfx::Rect bounds = window_->bounds();
+ gfx::Point origin = bounds.origin();
+ screen_position_client->ConvertPointToScreenIgnoringTransforms(
+ window_->parent(), &origin);
+ return gfx::Rect(origin, bounds.size());
+ }
+
return window_->GetBoundsInScreen();
}
diff --git a/chromium/ui/views/widget/native_widget_aura_unittest.cc b/chromium/ui/views/widget/native_widget_aura_unittest.cc
index ace63da70a4..39ba6823954 100644
--- a/chromium/ui/views/widget/native_widget_aura_unittest.cc
+++ b/chromium/ui/views/widget/native_widget_aura_unittest.cc
@@ -149,6 +149,25 @@ TEST_F(NativeWidgetAuraTest, CreateMinimized) {
widget->CloseNow();
}
+// Tests that GetRestoreBounds returns the window bounds even if the window is
+// transformed.
+TEST_F(NativeWidgetAuraTest, RestoreBounds) {
+ Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.parent = nullptr;
+ params.context = root_window();
+ params.bounds.SetRect(0, 0, 400, 400);
+ auto widget = std::make_unique<Widget>();
+ widget->Init(std::move(params));
+ widget->Show();
+ EXPECT_EQ(gfx::Rect(400, 400), widget->GetRestoredBounds());
+
+ gfx::Transform transform;
+ transform.Translate(100.f, 100.f);
+ widget->GetNativeWindow()->SetTransform(transform);
+ EXPECT_EQ(gfx::Rect(400, 400), widget->GetRestoredBounds());
+}
+
// A WindowObserver that counts kShowStateKey property changes.
class TestWindowObserver : public aura::WindowObserver {
public:
diff --git a/chromium/ui/views/widget/native_widget_mac_unittest.mm b/chromium/ui/views/widget/native_widget_mac_unittest.mm
index f2f744f40ad..41ef0a06f87 100644
--- a/chromium/ui/views/widget/native_widget_mac_unittest.mm
+++ b/chromium/ui/views/widget/native_widget_mac_unittest.mm
@@ -401,56 +401,6 @@ class PaintCountView : public View {
DISALLOW_COPY_AND_ASSIGN(PaintCountView);
};
-// Test for correct child window restore when parent window is minimized
-// and restored using -makeKeyAndOrderFront:.
-// Parent-child window relationships in AppKit are not supported when window
-// visibility changes.
-// Disabled because it relies on cocoa occlusion APIs
-// and state changes that are unavoidably flaky.
-TEST_F(NativeWidgetMacTest, DISABLED_OrderFrontAfterMiniaturize) {
- Widget* widget = CreateTopLevelPlatformWidget();
- NSWindow* ns_window = widget->GetNativeWindow().GetNativeNSWindow();
-
- Widget* child_widget = CreateChildPlatformWidget(widget->GetNativeView());
- NSWindow* child_ns_window =
- child_widget->GetNativeWindow().GetNativeNSWindow();
-
- // Set parent bounds that overlap child.
- widget->SetBounds(gfx::Rect(100, 100, 300, 300));
- child_widget->SetBounds(gfx::Rect(110, 110, 100, 100));
-
- widget->Show();
- base::RunLoop().RunUntilIdle();
-
- EXPECT_FALSE(widget->IsMinimized());
-
- // Minimize parent.
- [ns_window performMiniaturize:nil];
- base::RunLoop().RunUntilIdle();
-
- EXPECT_TRUE(widget->IsMinimized());
- EXPECT_FALSE(widget->IsVisible());
- EXPECT_FALSE(child_widget->IsVisible());
-
- // Restore parent window as AppController does.
- [ns_window makeKeyAndOrderFront:nil];
-
- // Wait and check that child is really visible.
- // TODO(kirr): remove the fixed delay.
- base::RunLoop run_loop;
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
- FROM_HERE, run_loop.QuitWhenIdleClosure(),
- base::TimeDelta::FromSeconds(2));
- run_loop.Run();
-
- EXPECT_FALSE(widget->IsMinimized());
- EXPECT_TRUE(widget->IsVisible());
- EXPECT_TRUE(child_widget->IsVisible());
- // Check that child window is visible.
- EXPECT_TRUE([child_ns_window occlusionState] & NSWindowOcclusionStateVisible);
- EXPECT_TRUE(IsWindowStackedAbove(child_widget, widget));
- widget->Close();
-}
// Test that a child widget is only added to its parent NSWindow when the
// parent is on the active space. Otherwise, it may cause a space transition.
@@ -879,26 +829,6 @@ TEST_F(NativeWidgetMacTest, NonWidgetParentLastReference) {
EXPECT_TRUE(native_parent_dealloced);
}
-// Tests visibility for child of native NSWindow, reshowing after -[NSApp hide].
-// Occasionally flaky (maybe due to [NSApp hide]). See https://crbug.com/777247.
-TEST_F(NativeWidgetMacTest, DISABLED_VisibleAfterNativeParentShow) {
- NSWindow* native_parent = MakeBorderlessNativeParent();
- Widget* child = AttachPopupToNativeParent(native_parent);
- child->Show();
- EXPECT_TRUE(child->IsVisible());
-
- WidgetChangeObserver child_observer(child);
- [NSApp hide:nil];
- child_observer.WaitForVisibleCounts(0, 1);
- EXPECT_FALSE(child->IsVisible());
-
- [native_parent makeKeyAndOrderFront:nil];
- child_observer.WaitForVisibleCounts(1, 1);
- EXPECT_TRUE(child->IsVisible());
-
- [native_parent close];
-}
-
// Tests visibility for a child of a native NSWindow, reshowing after a
// deminiaturize on the parent window (after attempting to show the child while
// the parent was miniaturized).
diff --git a/chromium/ui/views/widget/root_view.cc b/chromium/ui/views/widget/root_view.cc
index 87beb3fb55e..2ebd95f6631 100644
--- a/chromium/ui/views/widget/root_view.cc
+++ b/chromium/ui/views/widget/root_view.cc
@@ -22,6 +22,7 @@
#include "ui/gfx/canvas.h"
#include "ui/views/drag_controller.h"
#include "ui/views/layout/fill_layout.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view_targeter.h"
#include "ui/views/widget/root_view_targeter.h"
#include "ui/views/widget/widget.h"
diff --git a/chromium/ui/views/widget/unique_widget_ptr.cc b/chromium/ui/views/widget/unique_widget_ptr.cc
index 558c9f35b23..fe1d2607c84 100644
--- a/chromium/ui/views/widget/unique_widget_ptr.cc
+++ b/chromium/ui/views/widget/unique_widget_ptr.cc
@@ -28,9 +28,9 @@ using WidgetAutoClosePtr = std::unique_ptr<Widget, WidgetAutoCloser>;
class UniqueWidgetPtr::UniqueWidgetPtrImpl : public WidgetObserver {
public:
UniqueWidgetPtrImpl() = default;
- // Deliberately implicit
- // NOLINTNEXTLINE(runtime/explicit)
- UniqueWidgetPtrImpl(std::unique_ptr<Widget> widget)
+ // This class acts like unique_ptr<Widget>, so this constructor is
+ // deliberately implicit.
+ UniqueWidgetPtrImpl(std::unique_ptr<Widget> widget) // NOLINT
: widget_closer_(widget.release()) {
widget_observer_.Add(widget_closer_.get());
}
diff --git a/chromium/ui/views/widget/unique_widget_ptr.h b/chromium/ui/views/widget/unique_widget_ptr.h
index f493c367a73..fc8c471db8e 100644
--- a/chromium/ui/views/widget/unique_widget_ptr.h
+++ b/chromium/ui/views/widget/unique_widget_ptr.h
@@ -19,9 +19,9 @@ class Widget;
class VIEWS_EXPORT UniqueWidgetPtr {
public:
UniqueWidgetPtr();
- // Deliberately implicit since it's supposed to resemble a std::unique_ptr.
- // NOLINTNEXTLINE(runtime/explicit)
- UniqueWidgetPtr(std::unique_ptr<Widget> widget);
+ // This class acts like a std::unique_ptr<Widget>, so this constructor is
+ // deliberately implicit.
+ UniqueWidgetPtr(std::unique_ptr<Widget> widget); // NOLINT
UniqueWidgetPtr(UniqueWidgetPtr&&);
UniqueWidgetPtr& operator=(UniqueWidgetPtr&&);
~UniqueWidgetPtr();
diff --git a/chromium/ui/views/widget/widget.cc b/chromium/ui/views/widget/widget.cc
index d784b8eae00..c27777b9e95 100644
--- a/chromium/ui/views/widget/widget.cc
+++ b/chromium/ui/views/widget/widget.cc
@@ -197,6 +197,13 @@ Widget* Widget::CreateWindowWithParent(WidgetDelegate* delegate,
return new Widget(std::move(params));
}
+Widget* Widget::CreateWindowWithParent(std::unique_ptr<WidgetDelegate> delegate,
+ gfx::NativeView parent,
+ const gfx::Rect& bounds) {
+ DCHECK(delegate->owned_by_widget());
+ return CreateWindowWithParent(delegate.release(), parent, bounds);
+}
+
// static
Widget* Widget::CreateWindowWithContext(WidgetDelegate* delegate,
gfx::NativeWindow context,
@@ -209,6 +216,15 @@ Widget* Widget::CreateWindowWithContext(WidgetDelegate* delegate,
}
// static
+Widget* Widget::CreateWindowWithContext(
+ std::unique_ptr<WidgetDelegate> delegate,
+ gfx::NativeWindow context,
+ const gfx::Rect& bounds) {
+ DCHECK(delegate->owned_by_widget());
+ return CreateWindowWithContext(delegate.release(), context, bounds);
+}
+
+// static
Widget* Widget::GetWidgetForNativeView(gfx::NativeView native_view) {
internal::NativeWidgetPrivate* native_widget =
internal::NativeWidgetPrivate::GetNativeWidgetForNativeView(native_view);
@@ -282,11 +298,13 @@ bool Widget::RequiresNonClientView(InitParams::Type type) {
void Widget::Init(InitParams params) {
TRACE_EVENT0("views", "Widget::Init");
- // If an internal name was not provided the class name of the contents view
- // is a reasonable default.
- if (params.name.empty() && params.delegate &&
- params.delegate->GetContentsView())
- params.name = params.delegate->GetContentsView()->GetClassName();
+ if (params.name.empty() && params.delegate) {
+ params.name = params.delegate->internal_name();
+ // If an internal name was not provided the class name of the contents view
+ // is a reasonable default.
+ if (params.name.empty() && params.delegate->GetContentsView())
+ params.name = params.delegate->GetContentsView()->GetClassName();
+ }
parent_ = params.parent ? GetWidgetForNativeView(params.parent) : nullptr;
diff --git a/chromium/ui/views/widget/widget.h b/chromium/ui/views/widget/widget.h
index e1e380513db..b0e093c4f94 100644
--- a/chromium/ui/views/widget/widget.h
+++ b/chromium/ui/views/widget/widget.h
@@ -396,16 +396,26 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
// Creates a decorated window Widget with the specified properties. The
// returned Widget is owned by its NativeWidget; see Widget class comment for
// details.
+ // The std::unique_ptr variant requires that delegate->owned_by_widget().
static Widget* CreateWindowWithParent(WidgetDelegate* delegate,
gfx::NativeView parent,
const gfx::Rect& bounds = gfx::Rect());
+ static Widget* CreateWindowWithParent(
+ std::unique_ptr<WidgetDelegate> delegate,
+ gfx::NativeView parent,
+ const gfx::Rect& bounds = gfx::Rect());
// Creates a decorated window Widget in the same desktop context as |context|.
// The returned Widget is owned by its NativeWidget; see Widget class comment
// for details.
+ // The std::unique_ptr variant requires that delegate->owned_by_widget().
static Widget* CreateWindowWithContext(WidgetDelegate* delegate,
gfx::NativeWindow context,
const gfx::Rect& bounds = gfx::Rect());
+ static Widget* CreateWindowWithContext(
+ std::unique_ptr<WidgetDelegate> delegate,
+ gfx::NativeWindow context,
+ const gfx::Rect& bounds = gfx::Rect());
// Closes all Widgets that aren't identified as "secondary widgets". Called
// during application shutdown when the last non-secondary widget is closed.
@@ -615,7 +625,9 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate,
// Hides the widget.
void Hide();
- // Like Show(), but does not activate the window.
+ // Like Show(), but does not activate the window. Tests may be flaky on Mac:
+ // Mac browsertests do not have an activation policy so the widget may be
+ // activated.
void ShowInactive();
// Activates the widget, assuming it already exists and is visible.
diff --git a/chromium/ui/views/widget/widget_delegate.cc b/chromium/ui/views/widget/widget_delegate.cc
index 8bc76339bc2..383ca7e0a11 100644
--- a/chromium/ui/views/widget/widget_delegate.cc
+++ b/chromium/ui/views/widget/widget_delegate.cc
@@ -14,6 +14,7 @@
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/gfx/image/image_skia.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/view.h"
#include "ui/views/views_delegate.h"
#include "ui/views/widget/widget.h"
@@ -21,13 +22,39 @@
namespace views {
+namespace {
+
+std::unique_ptr<ClientView> CreateDefaultClientView(WidgetDelegate* delegate,
+ Widget* widget) {
+ return std::make_unique<ClientView>(
+ widget, delegate->TransferOwnershipOfContentsView());
+}
+
+std::unique_ptr<NonClientFrameView> CreateDefaultNonClientFrameView(
+ Widget* widget) {
+ return nullptr;
+}
+
+std::unique_ptr<View> CreateDefaultOverlayView() {
+ return nullptr;
+}
+
+} // namespace
+
////////////////////////////////////////////////////////////////////////////////
// WidgetDelegate:
WidgetDelegate::Params::Params() = default;
WidgetDelegate::Params::~Params() = default;
-WidgetDelegate::WidgetDelegate() = default;
+WidgetDelegate::WidgetDelegate()
+ : widget_initializing_callbacks_(std::make_unique<ClosureVector>()),
+ widget_initialized_callbacks_(std::make_unique<ClosureVector>()),
+ client_view_factory_(
+ base::BindOnce(&CreateDefaultClientView, base::Unretained(this))),
+ non_client_frame_view_factory_(
+ base::BindRepeating(&CreateDefaultNonClientFrameView)),
+ overlay_view_factory_(base::BindOnce(&CreateDefaultOverlayView)) {}
WidgetDelegate::~WidgetDelegate() {
CHECK(can_delete_this_) << "A WidgetDelegate must outlive its Widget";
}
@@ -159,10 +186,16 @@ bool WidgetDelegate::GetSavedWindowPlacement(
void WidgetDelegate::WidgetInitializing(Widget* widget) {
widget_ = widget;
+ for (auto&& callback : *widget_initializing_callbacks_)
+ std::move(callback).Run();
+ widget_initializing_callbacks_.reset();
OnWidgetInitializing();
}
void WidgetDelegate::WidgetInitialized() {
+ for (auto&& callback : *widget_initialized_callbacks_)
+ std::move(callback).Run();
+ widget_initialized_callbacks_.reset();
OnWidgetInitialized();
}
@@ -199,6 +232,8 @@ const Widget* WidgetDelegate::GetWidget() const {
}
View* WidgetDelegate::GetContentsView() {
+ if (unowned_contents_view_)
+ return unowned_contents_view_;
if (!default_contents_view_)
default_contents_view_ = new View;
return default_contents_view_;
@@ -207,20 +242,25 @@ View* WidgetDelegate::GetContentsView() {
View* WidgetDelegate::TransferOwnershipOfContentsView() {
DCHECK(!contents_view_taken_);
contents_view_taken_ = true;
+ if (owned_contents_view_)
+ owned_contents_view_.release();
return GetContentsView();
}
ClientView* WidgetDelegate::CreateClientView(Widget* widget) {
- return new ClientView(widget, TransferOwnershipOfContentsView());
+ DCHECK(client_view_factory_);
+ return std::move(client_view_factory_).Run(widget).release();
}
std::unique_ptr<NonClientFrameView> WidgetDelegate::CreateNonClientFrameView(
Widget* widget) {
- return nullptr;
+ DCHECK(non_client_frame_view_factory_);
+ return non_client_frame_view_factory_.Run(widget);
}
View* WidgetDelegate::CreateOverlayView() {
- return nullptr;
+ DCHECK(overlay_view_factory_);
+ return std::move(overlay_view_factory_).Run().release();
}
bool WidgetDelegate::WidgetHasHitTestMask() const {
@@ -246,15 +286,21 @@ void WidgetDelegate::SetAccessibleTitle(base::string16 title) {
}
void WidgetDelegate::SetCanMaximize(bool can_maximize) {
- params_.can_maximize = can_maximize;
+ std::exchange(params_.can_maximize, can_maximize);
+ if (GetWidget() && params_.can_maximize != can_maximize)
+ GetWidget()->OnSizeConstraintsChanged();
}
void WidgetDelegate::SetCanMinimize(bool can_minimize) {
- params_.can_minimize = can_minimize;
+ std::exchange(params_.can_minimize, can_minimize);
+ if (GetWidget() && params_.can_minimize != can_minimize)
+ GetWidget()->OnSizeConstraintsChanged();
}
void WidgetDelegate::SetCanResize(bool can_resize) {
- params_.can_resize = can_resize;
+ std::exchange(params_.can_resize, can_resize);
+ if (GetWidget() && params_.can_resize != can_resize)
+ GetWidget()->OnSizeConstraintsChanged();
}
void WidgetDelegate::SetOwnedByWidget(bool owned) {
@@ -265,6 +311,11 @@ void WidgetDelegate::SetFocusTraversesOut(bool focus_traverses_out) {
params_.focus_traverses_out = focus_traverses_out;
}
+void WidgetDelegate::SetEnableArrowKeyTraversal(
+ bool enable_arrow_key_traversal) {
+ params_.enable_arrow_key_traversal = enable_arrow_key_traversal;
+}
+
void WidgetDelegate::SetIcon(const gfx::ImageSkia& icon) {
params_.icon = icon;
if (GetWidget())
@@ -319,6 +370,18 @@ void WidgetDelegate::SetHasWindowSizeControls(bool has_controls) {
SetCanResize(has_controls);
}
+void WidgetDelegate::RegisterWidgetInitializingCallback(
+ base::OnceClosure callback) {
+ DCHECK(widget_initializing_callbacks_);
+ widget_initializing_callbacks_->emplace_back(std::move(callback));
+}
+
+void WidgetDelegate::RegisterWidgetInitializedCallback(
+ base::OnceClosure callback) {
+ DCHECK(widget_initialized_callbacks_);
+ widget_initialized_callbacks_->emplace_back(std::move(callback));
+}
+
void WidgetDelegate::RegisterWindowWillCloseCallback(
base::OnceClosure callback) {
window_will_close_callbacks_.emplace_back(std::move(callback));
@@ -333,6 +396,31 @@ void WidgetDelegate::RegisterDeleteDelegateCallback(
delete_delegate_callbacks_.emplace_back(std::move(callback));
}
+void WidgetDelegate::SetClientViewFactory(ClientViewFactory factory) {
+ DCHECK(!GetWidget());
+ client_view_factory_ = std::move(factory);
+}
+
+void WidgetDelegate::SetNonClientFrameViewFactory(
+ NonClientFrameViewFactory factory) {
+ DCHECK(!GetWidget());
+ non_client_frame_view_factory_ = std::move(factory);
+}
+
+void WidgetDelegate::SetOverlayViewFactory(OverlayViewFactory factory) {
+ DCHECK(!GetWidget());
+ overlay_view_factory_ = std::move(factory);
+}
+
+void WidgetDelegate::SetContentsViewImpl(View* contents) {
+ // Note: DCHECKing the ownership of contents is done in the public setters,
+ // which are inlined in the header.
+ DCHECK(!unowned_contents_view_);
+ if (!contents->owned_by_client())
+ owned_contents_view_ = base::WrapUnique(contents);
+ unowned_contents_view_ = contents;
+}
+
////////////////////////////////////////////////////////////////////////////////
// WidgetDelegateView:
diff --git a/chromium/ui/views/widget/widget_delegate.h b/chromium/ui/views/widget/widget_delegate.h
index ce51f9d0f35..211ac11173e 100644
--- a/chromium/ui/views/widget/widget_delegate.h
+++ b/chromium/ui/views/widget/widget_delegate.h
@@ -30,6 +30,18 @@ class View;
// Handles events on Widgets in context-specific ways.
class VIEWS_EXPORT WidgetDelegate {
public:
+ using ClientViewFactory =
+ base::OnceCallback<std::unique_ptr<ClientView>(Widget*)>;
+ using OverlayViewFactory = base::OnceCallback<std::unique_ptr<View>()>;
+
+ // NonClientFrameViewFactory is a RepeatingCallback because the
+ // NonClientFrameView is rebuilt on Aura platforms when WindowTreeHost
+ // properties that might affect its appearance change. Rebuilding the entire
+ // NonClientFrameView is a pretty big hammer for that but it's the one we
+ // have.
+ using NonClientFrameViewFactory =
+ base::RepeatingCallback<std::unique_ptr<NonClientFrameView>(Widget*)>;
+
struct Params {
Params();
~Params();
@@ -61,6 +73,12 @@ class VIEWS_EXPORT WidgetDelegate {
// Widget; if false, focus cycles within this Widget.
bool focus_traverses_out = false;
+ // Controls whether the user can traverse a Widget's views using up/down
+ // and left/right arrow keys in addition to TAB. Applies only to the
+ // current widget so can be set independently even on widgets that share a
+ // focus manager.
+ bool enable_arrow_key_traversal = false;
+
// The widget's icon, if any.
gfx::ImageSkia icon;
@@ -68,6 +86,11 @@ class VIEWS_EXPORT WidgetDelegate {
// this WidgetDelegate is used to initialize a Widget.
base::Optional<View*> initially_focused_view;
+ // The widget's internal name, used to identify it in window-state
+ // restoration (if this widget participates in that) and in debugging
+ // contexts. Never displayed to the user, and not translated.
+ std::string internal_name;
+
// The widget's modality type. Note that MODAL_TYPE_SYSTEM does not work at
// all on Mac.
ui::ModalType modal_type = ui::MODAL_TYPE_NONE;
@@ -301,6 +324,7 @@ class VIEWS_EXPORT WidgetDelegate {
void SetCanMinimize(bool can_minimize);
void SetCanResize(bool can_resize);
void SetFocusTraversesOut(bool focus_traverses_out);
+ void SetEnableArrowKeyTraversal(bool enable_arrow_key_traversal);
void SetIcon(const gfx::ImageSkia& icon);
void SetInitiallyFocusedView(View* initially_focused_view);
void SetModalType(ui::ModalType modal_type);
@@ -314,14 +338,35 @@ class VIEWS_EXPORT WidgetDelegate {
void SetCenterTitle(bool center_title);
#endif
+ template <typename T>
+ T* SetContentsView(std::unique_ptr<T> contents) {
+ DCHECK(!contents->owned_by_client());
+ T* raw_contents = contents.get();
+ SetContentsViewImpl(contents.release());
+ return raw_contents;
+ }
+
+ template <typename T>
+ T* SetContentsView(T* contents) {
+ DCHECK(contents->owned_by_client());
+ SetContentsViewImpl(contents);
+ return contents;
+ }
+
// A convenience wrapper that does all three of SetCanMaximize,
// SetCanMinimize, and SetCanResize.
void SetHasWindowSizeControls(bool has_controls);
+ void RegisterWidgetInitializingCallback(base::OnceClosure callback);
+ void RegisterWidgetInitializedCallback(base::OnceClosure callback);
void RegisterWindowWillCloseCallback(base::OnceClosure callback);
void RegisterWindowClosingCallback(base::OnceClosure callback);
void RegisterDeleteDelegateCallback(base::OnceClosure callback);
+ void SetClientViewFactory(ClientViewFactory factory);
+ void SetNonClientFrameViewFactory(NonClientFrameViewFactory factory);
+ void SetOverlayViewFactory(OverlayViewFactory factory);
+
// Called to notify the WidgetDelegate of changes to the state of its Widget.
// It is not usually necessary to call these from client code.
void WidgetInitializing(Widget* widget);
@@ -333,11 +378,24 @@ class VIEWS_EXPORT WidgetDelegate {
bool ShouldCenterWindowTitleText() const;
bool focus_traverses_out() const { return params_.focus_traverses_out; }
+ bool enable_arrow_key_traversal() const {
+ return params_.enable_arrow_key_traversal;
+ }
bool owned_by_widget() const { return params_.owned_by_widget; }
+ void set_internal_name(std::string name) { params_.internal_name = name; }
+ std::string internal_name() const { return params_.internal_name; }
+
private:
+ // We're using a vector of OnceClosures instead of a OnceCallbackList because
+ // most of the clients of WidgetDelegate don't have a convenient place to
+ // store the CallbackLists' subscription objects.
+ using ClosureVector = std::vector<base::OnceClosure>;
+
friend class Widget;
+ void SetContentsViewImpl(View* contents);
+
// The Widget that was initialized with this instance as its WidgetDelegate,
// if any.
Widget* widget_ = nullptr;
@@ -347,12 +405,24 @@ class VIEWS_EXPORT WidgetDelegate {
bool contents_view_taken_ = false;
bool can_activate_ = true;
+ View* unowned_contents_view_ = nullptr;
+ std::unique_ptr<View> owned_contents_view_;
+
// Managed by Widget. Ensures |this| outlives its Widget.
bool can_delete_this_ = true;
- std::vector<base::OnceClosure> window_will_close_callbacks_;
- std::vector<base::OnceClosure> window_closing_callbacks_;
- std::vector<base::OnceClosure> delete_delegate_callbacks_;
+ // The first two are stored as unique_ptrs to make it easier to check in the
+ // registration methods whether a callback is being registered too late in the
+ // WidgetDelegate's lifecycle.
+ std::unique_ptr<ClosureVector> widget_initializing_callbacks_;
+ std::unique_ptr<ClosureVector> widget_initialized_callbacks_;
+ ClosureVector window_will_close_callbacks_;
+ ClosureVector window_closing_callbacks_;
+ ClosureVector delete_delegate_callbacks_;
+
+ ClientViewFactory client_view_factory_;
+ NonClientFrameViewFactory non_client_frame_view_factory_;
+ OverlayViewFactory overlay_view_factory_;
DISALLOW_COPY_AND_ASSIGN(WidgetDelegate);
};
diff --git a/chromium/ui/views/widget/widget_delegate_unittest.cc b/chromium/ui/views/widget/widget_delegate_unittest.cc
new file mode 100644
index 00000000000..e5f3305f9d0
--- /dev/null
+++ b/chromium/ui/views/widget/widget_delegate_unittest.cc
@@ -0,0 +1,117 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/widget/widget_delegate.h"
+
+#include <utility>
+
+#include "base/test/bind.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/view.h"
+#include "ui/views/view_tracker.h"
+
+namespace views {
+namespace {
+
+using WidgetDelegateTest = views::ViewsTestBase;
+
+TEST_F(WidgetDelegateTest, ClientOwnedContentsViewOwnershipNotHeld) {
+ std::unique_ptr<View> view = std::make_unique<View>();
+ view->set_owned_by_client();
+ ViewTracker tracker(view.get());
+
+ auto delegate = std::make_unique<WidgetDelegate>();
+ delegate->SetContentsView(view.get());
+ delegate.reset();
+
+ ASSERT_TRUE(tracker.view());
+ view.reset();
+ EXPECT_FALSE(tracker.view());
+}
+
+TEST_F(WidgetDelegateTest, ContentsViewOwnershipHeld) {
+ std::unique_ptr<View> view = std::make_unique<View>();
+ ViewTracker tracker(view.get());
+
+ auto delegate = std::make_unique<WidgetDelegate>();
+ delegate->SetContentsView(std::move(view));
+ delegate.reset();
+
+ EXPECT_FALSE(tracker.view());
+}
+
+TEST_F(WidgetDelegateTest, ContentsViewOwnershipTransferredToCaller) {
+ std::unique_ptr<View> view = std::make_unique<View>();
+ ViewTracker tracker(view.get());
+ std::unique_ptr<View> same_view;
+
+ auto delegate = std::make_unique<WidgetDelegate>();
+ delegate->SetContentsView(std::move(view));
+ same_view = base::WrapUnique(delegate->TransferOwnershipOfContentsView());
+ EXPECT_EQ(tracker.view(), same_view.get());
+ delegate.reset();
+
+ EXPECT_TRUE(tracker.view());
+}
+
+TEST_F(WidgetDelegateTest, GetContentsViewDoesNotTransferOwnership) {
+ std::unique_ptr<View> view = std::make_unique<View>();
+ ViewTracker tracker(view.get());
+
+ auto delegate = std::make_unique<WidgetDelegate>();
+ delegate->SetContentsView(std::move(view));
+ EXPECT_EQ(delegate->GetContentsView(), tracker.view());
+ delegate.reset();
+
+ EXPECT_FALSE(tracker.view());
+}
+
+TEST_F(WidgetDelegateTest, ClientViewFactoryCanReplaceClientView) {
+ ViewTracker tracker;
+
+ auto delegate = std::make_unique<WidgetDelegate>();
+ delegate->SetClientViewFactory(
+ base::BindLambdaForTesting([&tracker](Widget* widget) {
+ auto view = std::make_unique<ClientView>(widget, nullptr);
+ tracker.SetView(view.get());
+ return view;
+ }));
+
+ auto client =
+ base::WrapUnique<ClientView>(delegate->CreateClientView(nullptr));
+ EXPECT_EQ(tracker.view(), client.get());
+}
+
+TEST_F(WidgetDelegateTest,
+ NonClientFrameViewFactoryCanReplaceNonClientFrameView) {
+ ViewTracker tracker;
+
+ auto delegate = std::make_unique<WidgetDelegate>();
+ delegate->SetNonClientFrameViewFactory(
+ base::BindLambdaForTesting([&tracker](Widget* widget) {
+ auto view = std::make_unique<NonClientFrameView>();
+ tracker.SetView(view.get());
+ return view;
+ }));
+
+ auto nonclient = delegate->CreateNonClientFrameView(nullptr);
+ EXPECT_EQ(tracker.view(), nonclient.get());
+}
+
+TEST_F(WidgetDelegateTest, OverlayViewFactoryCanReplaceOverlayView) {
+ ViewTracker tracker;
+
+ auto delegate = std::make_unique<WidgetDelegate>();
+ delegate->SetOverlayViewFactory(base::BindLambdaForTesting([&tracker]() {
+ auto view = std::make_unique<View>();
+ tracker.SetView(view.get());
+ return view;
+ }));
+
+ auto overlay = base::WrapUnique<View>(delegate->CreateOverlayView());
+ EXPECT_EQ(tracker.view(), overlay.get());
+}
+
+} // namespace
+} // namespace views
diff --git a/chromium/ui/views/widget/widget_unittest.cc b/chromium/ui/views/widget/widget_unittest.cc
index 3f204a12bfc..e0dbbb691dc 100644
--- a/chromium/ui/views/widget/widget_unittest.cc
+++ b/chromium/ui/views/widget/widget_unittest.cc
@@ -25,6 +25,7 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/buildflags.h"
+#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/event_monitor.h"
#include "ui/views/layout/fill_layout.h"
@@ -63,6 +64,11 @@
#include "ui/wm/core/shadow_controller_delegate.h"
#endif
+#if defined(USE_OZONE)
+#include "ui/base/ui_base_features.h"
+#include "ui/ozone/public/ozone_platform.h"
+#endif
+
namespace views {
namespace test {
@@ -173,22 +179,62 @@ TEST_F(WidgetTest, WidgetInitParams) {
// Tests that the internal name is propagated through widget initialization to
// the native widget and back.
-class WidgetNameTest : public WidgetTest {
+class WidgetWithCustomParamsTest : public WidgetTest {
public:
+ using InitFunction = base::RepeatingCallback<void(Widget::InitParams*)>;
+ void SetInitFunction(const InitFunction& init) { init_ = std::move(init); }
Widget::InitParams CreateParams(Widget::InitParams::Type type) override {
Widget::InitParams params = WidgetTest::CreateParams(type);
- params.name = "MyWidget";
+ DCHECK(init_) << "If you don't need an init function, use WidgetTest";
+ init_.Run(&params);
return params;
}
+
+ private:
+ InitFunction init_;
};
-TEST_F(WidgetNameTest, GetName) {
+TEST_F(WidgetWithCustomParamsTest, NamePropagatedFromParams) {
+ SetInitFunction(base::BindLambdaForTesting(
+ [](Widget::InitParams* params) { params->name = "MyWidget"; }));
std::unique_ptr<Widget> widget = CreateTestWidget();
EXPECT_EQ("MyWidget", widget->native_widget_private()->GetName());
EXPECT_EQ("MyWidget", widget->GetName());
}
+TEST_F(WidgetWithCustomParamsTest, NamePropagatedFromDelegate) {
+ WidgetDelegate delegate;
+ delegate.set_internal_name("Foobar");
+ SetInitFunction(base::BindLambdaForTesting(
+ [&](Widget::InitParams* params) { params->delegate = &delegate; }));
+
+ std::unique_ptr<Widget> widget = CreateTestWidget();
+
+ EXPECT_EQ(delegate.internal_name(),
+ widget->native_widget_private()->GetName());
+ EXPECT_EQ(delegate.internal_name(), widget->GetName());
+}
+
+TEST_F(WidgetWithCustomParamsTest, NamePropagatedFromContentsViewClassName) {
+ class ViewWithClassName : public View {
+ public:
+ const char* GetClassName() const override { return "ViewWithClassName"; }
+ };
+
+ WidgetDelegate delegate;
+ auto view = std::make_unique<ViewWithClassName>();
+ auto* contents = delegate.SetContentsView(std::move(view));
+ SetInitFunction(base::BindLambdaForTesting(
+ [&](Widget::InitParams* params) { params->delegate = &delegate; }));
+
+ std::unique_ptr<Widget> widget = CreateTestWidget();
+
+ EXPECT_EQ(contents->GetClassName(),
+ widget->native_widget_private()->GetName());
+ EXPECT_EQ(contents->GetClassName(), widget->GetName());
+}
+
TEST_F(WidgetTest, NativeWindowProperty) {
const char* key = "foo";
int value = 3;
@@ -216,6 +262,153 @@ TEST_F(WidgetTest, GetParent) {
// children should be automatically destroyed with |toplevel|.
}
+// Verify that there is no change in focus if |enable_arrow_key_traversal| is
+// false (the default).
+TEST_F(WidgetTest, ArrowKeyFocusTraversalOffByDefault) {
+ WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget());
+
+ // Establish default value.
+ DCHECK(!toplevel->widget_delegate()->enable_arrow_key_traversal());
+
+ View* container = toplevel->client_view();
+ container->SetLayoutManager(std::make_unique<FillLayout>());
+ auto* const button1 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ auto* const button2 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ toplevel->Show();
+ button1->RequestFocus();
+
+ ui::KeyEvent right_arrow(ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE);
+ toplevel->OnKeyEvent(&right_arrow);
+ EXPECT_TRUE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+
+ ui::KeyEvent left_arrow(ui::ET_KEY_PRESSED, ui::VKEY_LEFT, ui::EF_NONE);
+ toplevel->OnKeyEvent(&left_arrow);
+ EXPECT_TRUE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+
+ ui::KeyEvent up_arrow(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::EF_NONE);
+ toplevel->OnKeyEvent(&up_arrow);
+ EXPECT_TRUE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+
+ ui::KeyEvent down_arrow(ui::ET_KEY_PRESSED, ui::VKEY_DOWN, ui::EF_NONE);
+ toplevel->OnKeyEvent(&down_arrow);
+ EXPECT_TRUE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+}
+
+// Verify that arrow keys can change focus if |enable_arrow_key_traversal| is
+// set to true.
+TEST_F(WidgetTest, ArrowKeyTraversalMovesFocusBetweenViews) {
+ WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget());
+ toplevel->widget_delegate()->SetEnableArrowKeyTraversal(true);
+
+ View* container = toplevel->client_view();
+ container->SetLayoutManager(std::make_unique<FillLayout>());
+ auto* const button1 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ auto* const button2 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ auto* const button3 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ toplevel->Show();
+ button1->RequestFocus();
+
+ // Right should advance focus (similar to TAB).
+ ui::KeyEvent right_arrow(ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE);
+ toplevel->OnKeyEvent(&right_arrow);
+ EXPECT_FALSE(button1->HasFocus());
+ EXPECT_TRUE(button2->HasFocus());
+ EXPECT_FALSE(button3->HasFocus());
+
+ // Down should also advance focus.
+ ui::KeyEvent down_arrow(ui::ET_KEY_PRESSED, ui::VKEY_DOWN, ui::EF_NONE);
+ toplevel->OnKeyEvent(&down_arrow);
+ EXPECT_FALSE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+ EXPECT_TRUE(button3->HasFocus());
+
+ // Left should reverse focus (similar to SHIFT+TAB).
+ ui::KeyEvent left_arrow(ui::ET_KEY_PRESSED, ui::VKEY_LEFT, ui::EF_NONE);
+ toplevel->OnKeyEvent(&left_arrow);
+ EXPECT_FALSE(button1->HasFocus());
+ EXPECT_TRUE(button2->HasFocus());
+ EXPECT_FALSE(button3->HasFocus());
+
+ // Up should also reverse focus.
+ ui::KeyEvent up_arrow(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::EF_NONE);
+ toplevel->OnKeyEvent(&up_arrow);
+ EXPECT_TRUE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+ EXPECT_FALSE(button3->HasFocus());
+
+ // Test backwards wrap-around.
+ ui::KeyEvent up_arrow2(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::EF_NONE);
+ toplevel->OnKeyEvent(&up_arrow2);
+ EXPECT_FALSE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+ EXPECT_TRUE(button3->HasFocus());
+
+ // Test forward wrap-around.
+ ui::KeyEvent down_arrow2(ui::ET_KEY_PRESSED, ui::VKEY_DOWN, ui::EF_NONE);
+ toplevel->OnKeyEvent(&down_arrow2);
+ EXPECT_TRUE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+ EXPECT_FALSE(button3->HasFocus());
+}
+
+TEST_F(WidgetTest, ArrowKeyTraversalNotInheritedByChildWidgets) {
+ WidgetAutoclosePtr parent(CreateTopLevelPlatformWidget());
+ Widget* child = CreateChildPlatformWidget(parent->GetNativeView());
+
+ parent->widget_delegate()->SetEnableArrowKeyTraversal(true);
+
+ View* container = child->GetContentsView();
+ DCHECK(container);
+ container->SetLayoutManager(std::make_unique<FillLayout>());
+ auto* const button1 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ auto* const button2 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ parent->Show();
+ child->Show();
+ button1->RequestFocus();
+
+ // Arrow key should not cause focus change on child since only the parent
+ // Widget has |enable_arrow_key_traversal| set.
+ ui::KeyEvent right_arrow(ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE);
+ child->OnKeyEvent(&right_arrow);
+ EXPECT_TRUE(button1->HasFocus());
+ EXPECT_FALSE(button2->HasFocus());
+}
+
+TEST_F(WidgetTest, ArrowKeyTraversalMayBeExplicitlyEnabledByChildWidgets) {
+ WidgetAutoclosePtr parent(CreateTopLevelPlatformWidget());
+ Widget* child = CreateChildPlatformWidget(parent->GetNativeView());
+
+ child->widget_delegate()->SetEnableArrowKeyTraversal(true);
+
+ View* container = child->GetContentsView();
+ container->SetLayoutManager(std::make_unique<FillLayout>());
+ auto* const button1 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ auto* const button2 =
+ container->AddChildView(std::make_unique<LabelButton>());
+ parent->Show();
+ child->Show();
+ button1->RequestFocus();
+
+ // Arrow key should cause focus key on child since child has flag set, even
+ // if the parent Widget does not.
+ ui::KeyEvent right_arrow(ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, ui::EF_NONE);
+ child->OnKeyEvent(&right_arrow);
+ EXPECT_FALSE(button1->HasFocus());
+ EXPECT_TRUE(button2->HasFocus());
+}
+
////////////////////////////////////////////////////////////////////////////////
// Widget::GetTopLevelWidget tests.
@@ -3878,6 +4071,21 @@ TEST_F(DesktopWidgetTest, WindowModalOwnerDestroyedEnabledTest) {
namespace {
+bool CanHaveCompositingManager() {
+#if defined(USE_OZONE)
+ if (features::IsUsingOzonePlatform()) {
+ const auto* const egl_utility =
+ ui::OzonePlatform::GetInstance()->GetPlatformGLEGLUtility();
+ return egl_utility != nullptr;
+ }
+#endif
+#if defined(USE_X11)
+ return true;
+#else
+ return false;
+#endif
+}
+
class CompositingWidgetTest : public DesktopWidgetTest {
public:
CompositingWidgetTest()
@@ -3933,17 +4141,15 @@ class CompositingWidgetTest : public DesktopWidgetTest {
EXPECT_EQ(IsNativeWindowTransparent(widget->GetNativeWindow()),
should_be_transparent);
-#if defined(USE_X11)
- if (features::IsUsingOzonePlatform())
- return;
- if (HasCompositingManager() &&
- (widget_type == Widget::InitParams::TYPE_DRAG ||
- widget_type == Widget::InitParams::TYPE_WINDOW)) {
- EXPECT_TRUE(widget->IsTranslucentWindowOpacitySupported());
- } else {
- EXPECT_FALSE(widget->IsTranslucentWindowOpacitySupported());
+ if (CanHaveCompositingManager()) {
+ if (HasCompositingManager() &&
+ (widget_type == Widget::InitParams::TYPE_DRAG ||
+ widget_type == Widget::InitParams::TYPE_WINDOW)) {
+ EXPECT_TRUE(widget->IsTranslucentWindowOpacitySupported());
+ } else {
+ EXPECT_FALSE(widget->IsTranslucentWindowOpacitySupported());
+ }
}
-#endif
}
}
diff --git a/chromium/ui/views/widget/widget_utils.cc b/chromium/ui/views/widget/widget_utils.cc
index 94539dafdd0..81c67ad1a4d 100644
--- a/chromium/ui/views/widget/widget_utils.cc
+++ b/chromium/ui/views/widget/widget_utils.cc
@@ -4,6 +4,8 @@
#include "ui/views/widget/widget_utils.h"
+#include <utility>
+
#include "ui/views/widget/widget.h"
#if defined(USE_AURA)
@@ -12,6 +14,26 @@
namespace views {
+WidgetOpenTimer::WidgetOpenTimer(Callback callback)
+ : callback_(std::move(callback)) {}
+
+WidgetOpenTimer::~WidgetOpenTimer() = default;
+
+void WidgetOpenTimer::OnWidgetDestroying(Widget* widget) {
+ DCHECK(open_timer_.has_value());
+ DCHECK(observed_widget_.IsObserving(widget));
+ callback_.Run(open_timer_->Elapsed());
+ open_timer_.reset();
+ observed_widget_.Remove(widget);
+}
+
+void WidgetOpenTimer::Reset(Widget* widget) {
+ DCHECK(!open_timer_.has_value());
+ DCHECK(!observed_widget_.IsObserving(widget));
+ observed_widget_.Add(widget);
+ open_timer_ = base::ElapsedTimer();
+}
+
gfx::NativeWindow GetRootWindow(const Widget* widget) {
gfx::NativeWindow window = widget->GetNativeWindow();
#if defined(USE_AURA)
diff --git a/chromium/ui/views/widget/widget_utils.h b/chromium/ui/views/widget/widget_utils.h
index 93479e8e7d7..cb092fe7e0f 100644
--- a/chromium/ui/views/widget/widget_utils.h
+++ b/chromium/ui/views/widget/widget_utils.h
@@ -5,12 +5,43 @@
#ifndef UI_VIEWS_WIDGET_WIDGET_UTILS_H_
#define UI_VIEWS_WIDGET_WIDGET_UTILS_H_
+#include "base/callback.h"
+#include "base/scoped_observer.h"
+#include "base/time/time.h"
+#include "base/timer/elapsed_timer.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/views/views_export.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
namespace views {
class Widget;
+class VIEWS_EXPORT WidgetOpenTimer : public WidgetObserver {
+ public:
+ using Callback = base::RepeatingCallback<void(base::TimeDelta)>;
+
+ explicit WidgetOpenTimer(Callback callback);
+ WidgetOpenTimer(const WidgetOpenTimer&) = delete;
+ const WidgetOpenTimer& operator=(const WidgetOpenTimer&) = delete;
+ ~WidgetOpenTimer() override;
+
+ // WidgetObserver:
+ void OnWidgetDestroying(Widget* widget) override;
+
+ // Called to start the |open_timer_|.
+ void Reset(Widget* widget);
+
+ private:
+ // Callback run when the passed in Widget is destroyed.
+ Callback callback_;
+
+ // Time the bubble has been open. Used for UMA metrics collection.
+ base::Optional<base::ElapsedTimer> open_timer_;
+
+ ScopedObserver<Widget, WidgetObserver> observed_widget_{this};
+};
+
// Returns the root window for |widget|. On non-Aura, this is equivalent to
// widget->GetNativeWindow().
VIEWS_EXPORT gfx::NativeWindow GetRootWindow(const Widget* widget);
diff --git a/chromium/ui/views/win/DEPS b/chromium/ui/views/win/DEPS
index 71f96c79c5a..e2eba5ccdd8 100644
--- a/chromium/ui/views/win/DEPS
+++ b/chromium/ui/views/win/DEPS
@@ -13,6 +13,8 @@ include_rules = [
"-ui/views",
"+base",
+ "+services/tracing/public",
+ "+third_party/perfetto/protos/perfetto/trace/track_event",
"+ui/base",
"+ui/gfx",
"+ui/latency",
diff --git a/chromium/ui/views/win/hwnd_message_handler.cc b/chromium/ui/views/win/hwnd_message_handler.cc
index 754528f7d28..5e202cabf38 100644
--- a/chromium/ui/views/win/hwnd_message_handler.cc
+++ b/chromium/ui/views/win/hwnd_message_handler.cc
@@ -14,7 +14,7 @@
#include "base/auto_reset.h"
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/debug/alias.h"
#include "base/location.h"
#include "base/macros.h"
@@ -27,6 +27,8 @@
#include "base/win/scoped_gdi_object.h"
#include "base/win/win_util.h"
#include "base/win/windows_version.h"
+#include "services/tracing/public/cpp/perfetto/macros.h"
+#include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_window_handle_event_info.pbzero.h"
#include "third_party/skia/include/core/SkPath.h"
#include "ui/accessibility/accessibility_switches.h"
#include "ui/accessibility/platform/ax_fragment_root_win.h"
@@ -393,6 +395,7 @@ base::LazyInstance<HWNDMessageHandler::FullscreenWindowMonitorMap>::
// HWNDMessageHandler, public:
LONG HWNDMessageHandler::last_touch_or_pen_message_time_ = 0;
+bool HWNDMessageHandler::is_pen_active_in_client_area_ = false;
HWNDMessageHandler::HWNDMessageHandler(HWNDMessageHandlerDelegate* delegate,
const std::string& debugging_id)
@@ -988,7 +991,12 @@ HICON HWNDMessageHandler::GetSmallWindowIcon() const {
LRESULT HWNDMessageHandler::OnWndProc(UINT message,
WPARAM w_param,
LPARAM l_param) {
- TRACE_EVENT1("ui", "HWNDMessageHandler::OnWndProc", "message_id", message);
+ TRACE_EVENT("ui", "HWNDMessageHandler::OnWndProc",
+ [&](perfetto::EventContext ctx) {
+ perfetto::protos::pbzero::ChromeWindowHandleEventInfo* args =
+ ctx.event()->set_chrome_window_handle_event_info();
+ args->set_message_id(message);
+ });
HWND window = hwnd();
LRESULT result = 0;
@@ -1696,8 +1704,12 @@ LRESULT HWNDMessageHandler::OnDpiChanged(UINT msg,
if (LOWORD(w_param) != HIWORD(w_param))
NOTIMPLEMENTED() << "Received non-square scaling factors";
- TRACE_EVENT1("ui", "HWNDMessageHandler::OnDwmCompositionChanged", "dpi",
- LOWORD(w_param));
+ TRACE_EVENT("ui", "HWNDMessageHandler::OnDpiChanged",
+ [&](perfetto::EventContext ctx) {
+ perfetto::protos::pbzero::ChromeWindowHandleEventInfo* args =
+ ctx.event()->set_chrome_window_handle_event_info();
+ args->set_dpi(LOWORD(w_param));
+ });
int dpi;
float scaling_factor;
@@ -2474,6 +2486,11 @@ LRESULT HWNDMessageHandler::OnScrollMessage(UINT message,
LRESULT HWNDMessageHandler::OnSetCursor(UINT message,
WPARAM w_param,
LPARAM l_param) {
+ // Ignore system generated cursors likely caused by window management mouse
+ // moves while the pen is active over the window client area.
+ if (is_pen_active_in_client_area_)
+ return 1;
+
// Reimplement the necessary default behavior here. Calling DefWindowProc can
// trigger weird non-client painting for non-glass windows with custom frames.
// Using a ScopedRedrawLock to prevent caption rendering artifacts may allow
@@ -2965,6 +2982,22 @@ LRESULT HWNDMessageHandler::HandleMouseEventInternal(UINT message,
WPARAM w_param,
LPARAM l_param,
bool track_mouse) {
+ // Ignore system generated mouse messages while the pen is active over the
+ // window client area.
+ if (is_pen_active_in_client_area_) {
+ INPUT_MESSAGE_SOURCE input_message_source;
+ static const auto get_current_input_message_source =
+ reinterpret_cast<decltype(&::GetCurrentInputMessageSource)>(
+ base::win::GetUser32FunctionPointer(
+ "GetCurrentInputMessageSource"));
+ if (get_current_input_message_source &&
+ get_current_input_message_source(&input_message_source) &&
+ input_message_source.deviceType == IMDT_UNAVAILABLE) {
+ return 0;
+ }
+ is_pen_active_in_client_area_ = false;
+ }
+
// We handle touch events in Aura. Windows generates synthesized mouse
// messages whenever there's a touch, but it doesn't give us the actual touch
// messages if it thinks the touch point is in non-client space.
@@ -3027,7 +3060,7 @@ LRESULT HWNDMessageHandler::HandleMouseEventInternal(UINT message,
// we need to tell the RootView to send the mouse pressed event (which
// sets capture, allowing subsequent WM_LBUTTONUP (note, _not_
// WM_NCLBUTTONUP) to fire so that the appropriate WM_SYSCOMMAND can be
- // sent by the applicable button's ButtonListener. We _have_ to do this
+ // sent by the applicable button's callback. We _have_ to do this this
// way rather than letting Windows just send the syscommand itself (as
// would happen if we never did this dance) because for some insane
// reason DefWindowProc for WM_NCLBUTTONDOWN also renders the pressed
@@ -3267,6 +3300,7 @@ LRESULT HWNDMessageHandler::HandlePointerEventTypePenClient(UINT message,
NOTREACHED();
last_touch_or_pen_message_time_ = ::GetMessageTime();
+ is_pen_active_in_client_area_ = true;
}
// Always mark as handled as we don't want to generate WM_MOUSE compatiblity
@@ -3292,9 +3326,7 @@ bool HWNDMessageHandler::IsSynthesizedMouseMessage(unsigned int message,
::ClientToScreen(hwnd(), &mouse_location);
POINT cursor_pos = {0};
::GetCursorPos(&cursor_pos);
- if (memcmp(&cursor_pos, &mouse_location, sizeof(POINT)))
- return false;
- return true;
+ return memcmp(&cursor_pos, &mouse_location, sizeof(POINT)) == 0;
}
return false;
}
diff --git a/chromium/ui/views/win/hwnd_message_handler.h b/chromium/ui/views/win/hwnd_message_handler.h
index 7118ff56f0d..5e5845b4b95 100644
--- a/chromium/ui/views/win/hwnd_message_handler.h
+++ b/chromium/ui/views/win/hwnd_message_handler.h
@@ -715,6 +715,14 @@ class VIEWS_EXPORT HWNDMessageHandler : public gfx::WindowImpl,
// IsMouseEventFromTouch function.
static LONG last_touch_or_pen_message_time_;
+ // When true, this flag makes us discard window management mouse messages.
+ // Windows sends window management mouse messages at the mouse location when
+ // window states change (e.g. tooltips or status bubbles opening/closing).
+ // Those system generated messages should be ignored while the pen is active
+ // over the client area, where it is not in sync with the mouse position.
+ // Reset to false when we get user mouse input again.
+ static bool is_pen_active_in_client_area_;
+
// Time the last WM_MOUSEHWHEEL message is received. Please refer to the
// HandleMouseEventInternal function as to why this is needed.
LONG last_mouse_hwheel_time_;
diff --git a/chromium/ui/views/win/hwnd_util_aurawin.cc b/chromium/ui/views/win/hwnd_util_aurawin.cc
index f404e7e2ed3..b6fe9255b93 100644
--- a/chromium/ui/views/win/hwnd_util_aurawin.cc
+++ b/chromium/ui/views/win/hwnd_util_aurawin.cc
@@ -5,6 +5,7 @@
#include "ui/views/win/hwnd_util.h"
#include "base/i18n/rtl.h"
+#include "base/trace_event/base_tracing.h"
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#include "ui/views/widget/widget.h"
@@ -46,6 +47,8 @@ gfx::Rect GetWindowBoundsForClientBounds(View* view,
}
void ShowSystemMenuAtScreenPixelLocation(HWND window, const gfx::Point& point) {
+ TRACE_EVENT0("ui", "ShowSystemMenuAtScreenPixelLocation");
+
UINT flags = TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD;
if (base::i18n::IsRTL())
flags |= TPM_RIGHTALIGN;
diff --git a/chromium/ui/views/window/client_view.cc b/chromium/ui/views/window/client_view.cc
index 0daaa19402c..5527e26da27 100644
--- a/chromium/ui/views/window/client_view.cc
+++ b/chromium/ui/views/window/client_view.cc
@@ -11,6 +11,7 @@
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/hit_test.h"
#include "ui/views/layout/fill_layout.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
@@ -40,7 +41,18 @@ void ClientView::WidgetClosing() {}
gfx::Size ClientView::CalculatePreferredSize() const {
// |contents_view_| is allowed to be NULL up until the point where this view
// is attached to a Container.
- return contents_view_ ? contents_view_->GetPreferredSize() : gfx::Size();
+ if (!contents_view_)
+ return gfx::Size();
+
+ return contents_view_->GetPreferredSize();
+}
+
+int ClientView::GetHeightForWidth(int width) const {
+ // |contents_view_| is allowed to be NULL up until the point where this view
+ // is attached to a Container.
+ if (!contents_view_)
+ return 0;
+ return contents_view_->GetHeightForWidth(width);
}
gfx::Size ClientView::GetMaximumSize() const {
diff --git a/chromium/ui/views/window/client_view.h b/chromium/ui/views/window/client_view.h
index 0f69d64c838..28749e1aa7b 100644
--- a/chromium/ui/views/window/client_view.h
+++ b/chromium/ui/views/window/client_view.h
@@ -52,6 +52,7 @@ class VIEWS_EXPORT ClientView : public View {
// Overridden from View:
gfx::Size CalculatePreferredSize() const override;
+ int GetHeightForWidth(int width) const override;
gfx::Size GetMinimumSize() const override;
gfx::Size GetMaximumSize() const override;
diff --git a/chromium/ui/views/window/custom_frame_view.cc b/chromium/ui/views/window/custom_frame_view.cc
index 5b5cfff9cf5..d72f31b31ce 100644
--- a/chromium/ui/views/window/custom_frame_view.cc
+++ b/chromium/ui/views/window/custom_frame_view.cc
@@ -5,6 +5,7 @@
#include "ui/views/window/custom_frame_view.h"
#include <algorithm>
+#include <utility>
#include <vector>
#include "base/containers/adapters.h"
@@ -69,18 +70,24 @@ void LayoutButton(ImageButton* button, const gfx::Rect& bounds) {
CustomFrameView::CustomFrameView(Widget* frame)
: frame_(frame), frame_background_(new FrameBackground()) {
- close_button_ = InitWindowCaptionButton(IDS_APP_ACCNAME_CLOSE, IDR_CLOSE,
- IDR_CLOSE_H, IDR_CLOSE_P);
+ close_button_ = InitWindowCaptionButton(
+ base::BindRepeating(&Widget::CloseWithReason, base::Unretained(frame_),
+ views::Widget::ClosedReason::kCloseButtonClicked),
+ IDS_APP_ACCNAME_CLOSE, IDR_CLOSE, IDR_CLOSE_H, IDR_CLOSE_P);
minimize_button_ = InitWindowCaptionButton(
+ base::BindRepeating(&Widget::Minimize, base::Unretained(frame_)),
IDS_APP_ACCNAME_MINIMIZE, IDR_MINIMIZE, IDR_MINIMIZE_H, IDR_MINIMIZE_P);
maximize_button_ = InitWindowCaptionButton(
+ base::BindRepeating(&Widget::Maximize, base::Unretained(frame_)),
IDS_APP_ACCNAME_MAXIMIZE, IDR_MAXIMIZE, IDR_MAXIMIZE_H, IDR_MAXIMIZE_P);
restore_button_ = InitWindowCaptionButton(
+ base::BindRepeating(&Widget::Restore, base::Unretained(frame_)),
IDS_APP_ACCNAME_RESTORE, IDR_RESTORE, IDR_RESTORE_H, IDR_RESTORE_P);
if (frame_->widget_delegate()->ShouldShowWindowIcon()) {
- window_icon_ = new ImageButton(this);
- AddChildView(window_icon_);
+ window_icon_ =
+ AddChildView(std::make_unique<ImageButton>(Button::PressedCallback()));
+ window_icon_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
}
}
@@ -231,17 +238,6 @@ gfx::Size CustomFrameView::GetMaximumSize() const {
max_size.height() == 0 ? 0 : converted_size.height());
}
-void CustomFrameView::ButtonPressed(Button* sender, const ui::Event& event) {
- if (sender == close_button_)
- frame_->CloseWithReason(views::Widget::ClosedReason::kCloseButtonClicked);
- else if (sender == minimize_button_)
- frame_->Minimize();
- else if (sender == maximize_button_)
- frame_->Maximize();
- else if (sender == restore_button_)
- frame_->Restore();
-}
-
int CustomFrameView::FrameBorderThickness() const {
return frame_->IsMaximized() ? 0 : kFrameBorderThickness;
}
@@ -538,12 +534,15 @@ void CustomFrameView::LayoutClientView() {
}
ImageButton* CustomFrameView::InitWindowCaptionButton(
+ Button::PressedCallback callback,
int accessibility_string_id,
int normal_image_id,
int hot_image_id,
int pushed_image_id) {
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- ImageButton* button = new ImageButton(this);
+ ImageButton* button =
+ AddChildView(std::make_unique<ImageButton>(std::move(callback)));
+ button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
button->SetAccessibleName(l10n_util::GetStringUTF16(accessibility_string_id));
button->SetImage(Button::STATE_NORMAL,
rb.GetImageNamed(normal_image_id).ToImageSkia());
@@ -551,7 +550,6 @@ ImageButton* CustomFrameView::InitWindowCaptionButton(
rb.GetImageNamed(hot_image_id).ToImageSkia());
button->SetImage(Button::STATE_PRESSED,
rb.GetImageNamed(pushed_image_id).ToImageSkia());
- AddChildView(button);
return button;
}
diff --git a/chromium/ui/views/window/custom_frame_view.h b/chromium/ui/views/window/custom_frame_view.h
index 50ff6791aea..cb702728f20 100644
--- a/chromium/ui/views/window/custom_frame_view.h
+++ b/chromium/ui/views/window/custom_frame_view.h
@@ -33,8 +33,7 @@ class Widget;
// rendering the non-standard window caption, border, and controls.
//
////////////////////////////////////////////////////////////////////////////////
-class VIEWS_EXPORT CustomFrameView : public NonClientFrameView,
- public ButtonListener {
+class VIEWS_EXPORT CustomFrameView : public NonClientFrameView {
public:
explicit CustomFrameView(Widget* frame);
~CustomFrameView() override;
@@ -57,9 +56,6 @@ class VIEWS_EXPORT CustomFrameView : public NonClientFrameView,
gfx::Size GetMinimumSize() const override;
gfx::Size GetMaximumSize() const override;
- // Overridden from ButtonListener:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
// Returns the font list to use in the window's title bar.
// TODO(https://crbug.com/968860): Move this into the typography provider.
static gfx::FontList GetWindowTitleFontList();
@@ -124,7 +120,8 @@ class VIEWS_EXPORT CustomFrameView : public NonClientFrameView,
// Creates, adds and returns a new window caption button (e.g, minimize,
// maximize, restore).
- ImageButton* InitWindowCaptionButton(int accessibility_string_id,
+ ImageButton* InitWindowCaptionButton(Button::PressedCallback callback,
+ int accessibility_string_id,
int normal_image_id,
int hot_image_id,
int pushed_image_id);
diff --git a/chromium/ui/views/window/dialog_client_view.cc b/chromium/ui/views/window/dialog_client_view.cc
index 5e8aa157d46..98a32c4a5e4 100644
--- a/chromium/ui/views/window/dialog_client_view.cc
+++ b/chromium/ui/views/window/dialog_client_view.cc
@@ -20,6 +20,7 @@
#include "ui/views/controls/button/md_text_button.h"
#include "ui/views/layout/grid_layout.h"
#include "ui/views/layout/layout_provider.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/view_observer.h"
#include "ui/views/view_tracker.h"
@@ -69,9 +70,6 @@ class DialogClientView::ButtonRowContainer : public View {
DISALLOW_COPY_AND_ASSIGN(ButtonRowContainer);
};
-///////////////////////////////////////////////////////////////////////////////
-// DialogClientView, public:
-
DialogClientView::DialogClientView(Widget* owner, View* contents_view)
: ClientView(owner, contents_view),
button_row_insets_(
@@ -95,18 +93,31 @@ void DialogClientView::SetButtonRowInsets(const gfx::Insets& insets) {
UpdateDialogButtons();
}
-////////////////////////////////////////////////////////////////////////////////
-// DialogClientView, View overrides:
-
gfx::Size DialogClientView::CalculatePreferredSize() const {
- gfx::Size contents_size = ClientView::CalculatePreferredSize();
const gfx::Insets& content_margins = GetDialogDelegate()->margins();
+
+ gfx::Size contents_size;
+ const int fixed_width = GetDialogDelegate()->fixed_width();
+ if (fixed_width) {
+ const int content_width = fixed_width - content_margins.width();
+ contents_size = gfx::Size(content_width,
+ ClientView::GetHeightForWidth(content_width));
+ } else {
+ contents_size = ClientView::CalculatePreferredSize();
+ }
contents_size.Enlarge(content_margins.width(), content_margins.height());
return GetBoundingSizeForVerticalStack(
contents_size, button_row_container_->GetPreferredSize());
}
gfx::Size DialogClientView::GetMinimumSize() const {
+ // TODO(pbos): Try to find a way for ClientView::GetMinimumSize() to be
+ // fixed-width aware. For now this uses min-size = preferred size for
+ // fixed-width dialogs (even though min height might not be preferred height).
+ // Fixing this might require View::GetMinHeightForWidth().
+ if (GetDialogDelegate()->fixed_width())
+ return CalculatePreferredSize();
+
return GetBoundingSizeForVerticalStack(
ClientView::GetMinimumSize(), button_row_container_->GetMinimumSize());
}
@@ -198,32 +209,10 @@ void DialogClientView::OnThemeChanged() {
}
}
-////////////////////////////////////////////////////////////////////////////////
-// DialogClientView, ButtonListener implementation:
-
-void DialogClientView::ButtonPressed(Button* sender, const ui::Event& event) {
- // Check for a valid delegate to avoid handling events after destruction.
- if (!GetDialogDelegate())
- return;
-
- if (input_protector_.IsPossiblyUnintendedInteraction(event))
- return;
-
- if (sender == ok_button_)
- GetDialogDelegate()->AcceptDialog();
- else if (sender == cancel_button_)
- GetDialogDelegate()->CancelDialog();
- else
- NOTREACHED();
-}
-
void DialogClientView::ResetViewShownTimeStampForTesting() {
input_protector_.ResetForTesting();
}
-////////////////////////////////////////////////////////////////////////////////
-// DialogClientView, private:
-
DialogDelegate* DialogClientView::GetDialogDelegate() const {
return GetWidget()->widget_delegate()->AsDialogDelegate();
}
@@ -266,7 +255,10 @@ void DialogClientView::UpdateDialogButton(LabelButton** member,
return;
}
- auto button = std::make_unique<MdTextButton>(this, title);
+ auto button = std::make_unique<MdTextButton>(
+ base::BindRepeating(&DialogClientView::ButtonPressed,
+ base::Unretained(this), type),
+ title);
button->SetProminent(is_default);
button->SetIsDefault(is_default);
button->SetEnabled(delegate->IsDialogButtonEnabled(type));
@@ -280,6 +272,15 @@ void DialogClientView::UpdateDialogButton(LabelButton** member,
*member = button_row_container_->AddChildView(std::move(button));
}
+void DialogClientView::ButtonPressed(ui::DialogButton type,
+ const ui::Event& event) {
+ DialogDelegate* const delegate = GetDialogDelegate();
+ if (delegate && !input_protector_.IsPossiblyUnintendedInteraction(event)) {
+ (type == ui::DIALOG_BUTTON_OK) ? delegate->AcceptDialog()
+ : delegate->CancelDialog();
+ }
+}
+
int DialogClientView::GetExtraViewSpacing() const {
if (!ShouldShow(extra_view_) || !(ok_button_ || cancel_button_))
return 0;
diff --git a/chromium/ui/views/window/dialog_client_view.h b/chromium/ui/views/window/dialog_client_view.h
index faf6b5e8a5f..9a467cbf6ea 100644
--- a/chromium/ui/views/window/dialog_client_view.h
+++ b/chromium/ui/views/window/dialog_client_view.h
@@ -9,7 +9,6 @@
#include "base/macros.h"
#include "base/time/time.h"
#include "ui/base/ui_base_types.h"
-#include "ui/views/controls/button/button.h"
#include "ui/views/input_event_activation_protector.h"
#include "ui/views/window/client_view.h"
#include "ui/views/window/dialog_observer.h"
@@ -34,9 +33,7 @@ class Widget;
// You must not directly depend on or use DialogClientView; it is internal to
// //ui/views. Access it through the public interfaces on DialogDelegate. It is
// only VIEWS_EXPORT to make it available to views_unittests.
-class VIEWS_EXPORT DialogClientView : public ClientView,
- public ButtonListener,
- public DialogObserver {
+class VIEWS_EXPORT DialogClientView : public ClientView, public DialogObserver {
public:
METADATA_HEADER(DialogClientView);
@@ -62,9 +59,6 @@ class VIEWS_EXPORT DialogClientView : public ClientView,
const ViewHierarchyChangedDetails& details) override;
void OnThemeChanged() override;
- // ButtonListener implementation:
- void ButtonPressed(Button* sender, const ui::Event& event) override;
-
void set_minimum_size(const gfx::Size& size) { minimum_size_ = size; }
// Resets the time when view has been shown. Tests may need to call this
@@ -97,6 +91,8 @@ class VIEWS_EXPORT DialogClientView : public ClientView,
// |member| points to a button that already exists.
void UpdateDialogButton(LabelButton** member, ui::DialogButton type);
+ void ButtonPressed(ui::DialogButton type, const ui::Event& event);
+
// Returns the spacing between the extra view and the ok/cancel buttons. 0 if
// no extra view. Otherwise uses the default padding.
int GetExtraViewSpacing() const;
diff --git a/chromium/ui/views/window/dialog_client_view_unittest.cc b/chromium/ui/views/window/dialog_client_view_unittest.cc
index 921d7e999f8..cd9cc849d04 100644
--- a/chromium/ui/views/window/dialog_client_view_unittest.cc
+++ b/chromium/ui/views/window/dialog_client_view_unittest.cc
@@ -4,8 +4,10 @@
#include "ui/views/window/dialog_client_view.h"
+#include <algorithm>
#include <map>
#include <memory>
+#include <string>
#include <utility>
#include "base/macros.h"
@@ -21,6 +23,7 @@
#include "ui/views/controls/button/label_button.h"
#include "ui/views/metrics.h"
#include "ui/views/style/platform_style.h"
+#include "ui/views/test/button_test_api.h"
#include "ui/views/test/test_layout_provider.h"
#include "ui/views/test/test_views.h"
#include "ui/views/test/widget_test.h"
@@ -45,7 +48,7 @@ class DialogClientViewTest : public test::WidgetTest,
// Note: not using DialogDelegate::CreateDialogWidget(..), since that can
// alter the frame type according to the platform.
- widget_ = new views::Widget;
+ widget_ = new Widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
params.delegate = this;
widget_->Init(std::move(params));
@@ -132,9 +135,8 @@ class DialogClientViewTest : public test::WidgetTest,
DialogModelChanged();
}
- views::Button* GetButtonByAccessibleName(views::View* root,
- const base::string16& name) {
- views::Button* button = Button::AsButton(root);
+ Button* GetButtonByAccessibleName(View* root, const base::string16& name) {
+ Button* button = Button::AsButton(root);
if (button && button->GetAccessibleName() == name)
return button;
for (auto* child : root->children()) {
@@ -145,7 +147,7 @@ class DialogClientViewTest : public test::WidgetTest,
return nullptr;
}
- views::Button* GetButtonByAccessibleName(const std::string& label) {
+ Button* GetButtonByAccessibleName(const std::string& label) {
return GetButtonByAccessibleName(widget_->GetRootView(),
base::UTF8ToUTF16(label));
}
@@ -396,8 +398,8 @@ TEST_F(DialogClientViewTest, LinkedWidthDoesLink) {
layout_provider()->SetDistanceMetric(DISTANCE_BUTTON_MAX_LINKABLE_WIDTH, 200);
// The extra view should also match, if it's a matching button type.
- View* extra_button =
- SetExtraView(std::make_unique<LabelButton>(nullptr, base::string16()));
+ View* extra_button = SetExtraView(std::make_unique<LabelButton>(
+ Button::PressedCallback(), base::string16()));
CheckContentsIsSetToPreferredSize();
EXPECT_EQ(cancel_button_width, extra_button->width());
}
@@ -512,16 +514,16 @@ TEST_F(DialogClientViewTest, IgnorePossiblyUnintendedClicks_ClickAfterShown) {
// Should ignore clicks right after the dialog is shown.
ui::MouseEvent mouse_event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE);
- client_view()->ButtonPressed(client_view()->ok_button(), mouse_event);
- client_view()->ButtonPressed(client_view()->cancel_button(), mouse_event);
+ test::ButtonTestApi(client_view()->ok_button()).NotifyClick(mouse_event);
+ test::ButtonTestApi cancel_button(client_view()->cancel_button());
+ cancel_button.NotifyClick(mouse_event);
EXPECT_FALSE(widget()->IsClosed());
- client_view()->ButtonPressed(
- client_view()->cancel_button(),
- ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- ui::EventTimeForNow() + base::TimeDelta::FromMilliseconds(
- GetDoubleClickInterval()),
- ui::EF_NONE, ui::EF_NONE));
+ cancel_button.NotifyClick(ui::MouseEvent(
+ ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
+ ui::EventTimeForNow() +
+ base::TimeDelta::FromMilliseconds(GetDoubleClickInterval()),
+ ui::EF_NONE, ui::EF_NONE));
EXPECT_TRUE(widget()->IsClosed());
}
@@ -538,8 +540,9 @@ TEST_F(DialogClientViewTest, IgnorePossiblyUnintendedClicks_RepeatedClicks) {
// Should ignore clicks right after the dialog is shown.
ui::MouseEvent mouse_event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
kNow, ui::EF_NONE, ui::EF_NONE);
- client_view()->ButtonPressed(client_view()->ok_button(), mouse_event);
- client_view()->ButtonPressed(client_view()->cancel_button(), mouse_event);
+ test::ButtonTestApi(client_view()->ok_button()).NotifyClick(mouse_event);
+ test::ButtonTestApi cancel_button(client_view()->cancel_button());
+ cancel_button.NotifyClick(mouse_event);
EXPECT_FALSE(widget()->IsClosed());
// Should ignore repeated clicks with short intervals, even though enough time
@@ -549,20 +552,18 @@ TEST_F(DialogClientViewTest, IgnorePossiblyUnintendedClicks_RepeatedClicks) {
ASSERT_TRUE(kNumClicks * kRepeatedClickInterval > kShortClickInterval);
base::TimeTicks event_time = kNow;
for (size_t i = 0; i < kNumClicks; i++) {
- client_view()->ButtonPressed(
- client_view()->cancel_button(),
- ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- event_time, ui::EF_NONE, ui::EF_NONE));
+ cancel_button.NotifyClick(ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(),
+ gfx::Point(), event_time,
+ ui::EF_NONE, ui::EF_NONE));
EXPECT_FALSE(widget()->IsClosed());
event_time += kRepeatedClickInterval;
}
// Sufficient time passed, events are now allowed.
event_time += kShortClickInterval;
- client_view()->ButtonPressed(
- client_view()->cancel_button(),
- ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
- event_time, ui::EF_NONE, ui::EF_NONE));
+ cancel_button.NotifyClick(ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(),
+ gfx::Point(), event_time,
+ ui::EF_NONE, ui::EF_NONE));
EXPECT_TRUE(widget()->IsClosed());
}
@@ -581,8 +582,8 @@ TEST_F(DialogClientViewTest, ButtonLayoutWithExtra) {
SetDialogButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
SetDialogButtonLabel(ui::DIALOG_BUTTON_OK, "ok");
SetDialogButtonLabel(ui::DIALOG_BUTTON_CANCEL, "cancel");
- SetExtraView(
- std::make_unique<LabelButton>(nullptr, base::UTF8ToUTF16("extra")));
+ SetExtraView(std::make_unique<LabelButton>(Button::PressedCallback(),
+ base::UTF8ToUTF16("extra")));
widget()->Show();
diff --git a/chromium/ui/views/window/dialog_delegate.h b/chromium/ui/views/window/dialog_delegate.h
index b543d96a276..e04889916e2 100644
--- a/chromium/ui/views/window/dialog_delegate.h
+++ b/chromium/ui/views/window/dialog_delegate.h
@@ -154,6 +154,10 @@ class VIEWS_EXPORT DialogDelegate : public WidgetDelegate {
const gfx::Insets& margins() const { return margins_; }
void set_margins(const gfx::Insets& margins) { margins_ = margins; }
+ // Set a fixed width for the dialog. Used by DialogClientView.
+ void set_fixed_width(int fixed_width) { fixed_width_ = fixed_width; }
+ int fixed_width() const { return fixed_width_; }
+
template <typename T>
T* SetExtraView(std::unique_ptr<T> extra_view) {
T* view = extra_view.get();
@@ -317,6 +321,9 @@ class VIEWS_EXPORT DialogDelegate : public WidgetDelegate {
// margins.
gfx::Insets margins_{0};
+ // Use a fixed dialog width for dialog. Used by DialogClientView.
+ int fixed_width_ = 0;
+
// The time the dialog is created.
base::TimeTicks creation_time_;
diff --git a/chromium/ui/views/window/dialog_delegate_unittest.cc b/chromium/ui/views/window/dialog_delegate_unittest.cc
index a0c0e570eb4..426cfde3bb4 100644
--- a/chromium/ui/views/window/dialog_delegate_unittest.cc
+++ b/chromium/ui/views/window/dialog_delegate_unittest.cc
@@ -6,7 +6,7 @@
#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
-#include "base/test/bind_test_util.h"
+#include "base/test/bind.h"
#include "build/build_config.h"
#include "ui/base/hit_test.h"
#include "ui/events/event_processor.h"
diff --git a/chromium/ui/views/window/frame_caption_button.cc b/chromium/ui/views/window/frame_caption_button.cc
index b0c89781868..e8412e3877f 100644
--- a/chromium/ui/views/window/frame_caption_button.cc
+++ b/chromium/ui/views/window/frame_caption_button.cc
@@ -5,6 +5,7 @@
#include "ui/views/window/frame_caption_button.h"
#include <memory>
+#include <utility>
#include "ui/base/hit_test.h"
#include "ui/gfx/animation/slide_animation.h"
@@ -66,10 +67,10 @@ class FrameCaptionButton::HighlightPathGenerator
// static
const char FrameCaptionButton::kViewClassName[] = "FrameCaptionButton";
-FrameCaptionButton::FrameCaptionButton(views::ButtonListener* listener,
+FrameCaptionButton::FrameCaptionButton(PressedCallback callback,
CaptionButtonIcon icon,
int hit_test_type)
- : Button(listener),
+ : Button(std::move(callback)),
icon_(icon),
background_color_(SK_ColorWHITE),
paint_as_active_(false),
@@ -77,6 +78,8 @@ FrameCaptionButton::FrameCaptionButton(views::ButtonListener* listener,
ink_drop_corner_radius_(kCaptionButtonInkDropDefaultCornerRadius),
swap_images_animation_(new gfx::SlideAnimation(this)) {
views::SetHitTestComponent(this, hit_test_type);
+ // Not focusable by default, only for accessibility.
+ SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
SetAnimateOnStateChange(true);
swap_images_animation_->Reset(1);
diff --git a/chromium/ui/views/window/frame_caption_button.h b/chromium/ui/views/window/frame_caption_button.h
index d04cc761f42..dd3733c8dab 100644
--- a/chromium/ui/views/window/frame_caption_button.h
+++ b/chromium/ui/views/window/frame_caption_button.h
@@ -29,7 +29,7 @@ class VIEWS_EXPORT FrameCaptionButton : public views::Button {
static const char kViewClassName[];
- FrameCaptionButton(views::ButtonListener* listener,
+ FrameCaptionButton(PressedCallback callback,
CaptionButtonIcon icon,
int hit_test_type);
~FrameCaptionButton() override;
diff --git a/chromium/ui/views/window/frame_caption_button_unittest.cc b/chromium/ui/views/window/frame_caption_button_unittest.cc
index 211c4b883c1..2c698f9d5d7 100644
--- a/chromium/ui/views/window/frame_caption_button_unittest.cc
+++ b/chromium/ui/views/window/frame_caption_button_unittest.cc
@@ -6,7 +6,10 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/hit_test.h"
#include "ui/gfx/color_utils.h"
+#include "ui/views/view.h"
+#include "ui/views/window/caption_button_types.h"
namespace {
@@ -20,10 +23,19 @@ constexpr SkColor kBackgroundColors[] = {
} // namespace
+namespace views {
+
TEST(FrameCaptionButtonTest, ThemedColorContrast) {
for (SkColor background_color : kBackgroundColors) {
- SkColor button_color =
- views::FrameCaptionButton::GetButtonColor(background_color);
+ SkColor button_color = FrameCaptionButton::GetButtonColor(background_color);
EXPECT_GE(color_utils::GetContrastRatio(button_color, background_color), 3);
}
}
+
+TEST(FrameCaptionButtonTest, DefaultAccessibilityFocus) {
+ FrameCaptionButton button(Button::PressedCallback(),
+ CAPTION_BUTTON_ICON_MINIMIZE, HTMINBUTTON);
+ EXPECT_EQ(View::FocusBehavior::ACCESSIBLE_ONLY, button.GetFocusBehavior());
+}
+
+} // namespace views
diff --git a/chromium/ui/views/window/non_client_view.cc b/chromium/ui/views/window/non_client_view.cc
index 0fe58fc0985..111839222e4 100644
--- a/chromium/ui/views/window/non_client_view.cc
+++ b/chromium/ui/views/window/non_client_view.cc
@@ -11,6 +11,7 @@
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/hit_test.h"
#include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/views/metadata/metadata_impl_macros.h"
#include "ui/views/rect_based_targeting_utils.h"
#include "ui/views/view_targeter.h"
#include "ui/views/widget/root_view.h"
@@ -90,6 +91,15 @@ int NonClientFrameView::GetHTComponentForFrame(const gfx::Point& point,
return can_resize ? component : HTBORDER;
}
+gfx::Rect NonClientFrameView::GetBoundsForClientView() const {
+ return gfx::Rect();
+}
+
+gfx::Rect NonClientFrameView::GetWindowBoundsForClientBounds(
+ const gfx::Rect& client_bounds) const {
+ return client_bounds;
+}
+
bool NonClientFrameView::GetClientMask(const gfx::Size& size,
SkPath* mask) const {
return false;
@@ -106,6 +116,10 @@ gfx::Point NonClientFrameView::GetSystemMenuScreenPixelLocation() const {
}
#endif
+int NonClientFrameView::NonClientHitTest(const gfx::Point& point) {
+ return HTNOWHERE;
+}
+
void NonClientFrameView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->role = ax::mojom::Role::kClient;
}
diff --git a/chromium/ui/views/window/non_client_view.h b/chromium/ui/views/window/non_client_view.h
index 6ddc33405d0..b8df6d4d2fc 100644
--- a/chromium/ui/views/window/non_client_view.h
+++ b/chromium/ui/views/window/non_client_view.h
@@ -39,6 +39,7 @@ class VIEWS_EXPORT NonClientFrameView : public View,
kClientEdgeThickness = 1,
};
+ NonClientFrameView();
~NonClientFrameView() override;
// Used to determine if the frame should be painted as active. Keyed off the
@@ -59,10 +60,10 @@ class VIEWS_EXPORT NonClientFrameView : public View,
// Returns the bounds (in this View's parent's coordinates) that the client
// view should be laid out within.
- virtual gfx::Rect GetBoundsForClientView() const = 0;
+ virtual gfx::Rect GetBoundsForClientView() const;
virtual gfx::Rect GetWindowBoundsForClientBounds(
- const gfx::Rect& client_bounds) const = 0;
+ const gfx::Rect& client_bounds) const;
// Gets the clip mask (in this View's parent's coordinates) that should be
// applied to the client view. Returns false if no special clip should be
@@ -80,26 +81,24 @@ class VIEWS_EXPORT NonClientFrameView : public View,
// hittests for regions that are partially obscured by the ClientView, e.g.
// HTSYSMENU.
// Return value is one of the windows HT constants (see ui/base/hit_test.h).
- virtual int NonClientHitTest(const gfx::Point& point) = 0;
+ virtual int NonClientHitTest(const gfx::Point& point);
// Used to make the hosting widget shaped (non-rectangular). For a
// rectangular window do nothing. For a shaped window update |window_mask|
// accordingly. |size| is the size of the widget.
- virtual void GetWindowMask(const gfx::Size& size, SkPath* window_mask) = 0;
- virtual void ResetWindowControls() = 0;
- virtual void UpdateWindowIcon() = 0;
- virtual void UpdateWindowTitle() = 0;
+ virtual void GetWindowMask(const gfx::Size& size, SkPath* window_mask) {}
+ virtual void ResetWindowControls() {}
+ virtual void UpdateWindowIcon() {}
+ virtual void UpdateWindowTitle() {}
// Whether the widget can be resized or maximized has changed.
- virtual void SizeConstraintsChanged() = 0;
+ virtual void SizeConstraintsChanged() {}
// View:
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
void OnThemeChanged() override;
protected:
- NonClientFrameView();
-
// ViewTargeterDelegate:
bool DoesIntersectRect(const View* target,
const gfx::Rect& rect) const override;
diff --git a/chromium/ui/views/window/vector_icons/BUILD.gn b/chromium/ui/views/window/vector_icons/BUILD.gn
index 3f1a7b1d33b..07488787069 100644
--- a/chromium/ui/views/window/vector_icons/BUILD.gn
+++ b/chromium/ui/views/window/vector_icons/BUILD.gn
@@ -4,7 +4,7 @@
import("//components/vector_icons/vector_icons.gni")
-aggregate_vector_icons2("window_control_vector_icons") {
+aggregate_vector_icons("window_control_vector_icons") {
icon_directory = "."
sources = [
diff --git a/chromium/ui/views_content_client/views_content_client.h b/chromium/ui/views_content_client/views_content_client.h
index 4e4fb3ecd34..fc8b38a6bfc 100644
--- a/chromium/ui/views_content_client/views_content_client.h
+++ b/chromium/ui/views_content_client/views_content_client.h
@@ -32,7 +32,7 @@ namespace ui {
//
// #if defined(OS_WIN)
// int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t*, int) {
-// sandbox::SandboxInterfaceInfo sandbox_info = {0};
+// sandbox::SandboxInterfaceInfo sandbox_info = {nullptr};
// content::InitializeSandboxInfo(&sandbox_info);
// ui::ViewsContentClient params(instance, &sandbox_info);
// #else
diff --git a/chromium/ui/web_dialogs/web_dialog_ui.cc b/chromium/ui/web_dialogs/web_dialog_ui.cc
index ca118e3e44e..721d9fdbad8 100644
--- a/chromium/ui/web_dialogs/web_dialog_ui.cc
+++ b/chromium/ui/web_dialogs/web_dialog_ui.cc
@@ -5,7 +5,7 @@
#include "ui/web_dialogs/web_dialog_ui.h"
#include "base/bind.h"
-#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/lazy_instance.h"
#include "base/memory/ptr_util.h"
#include "base/values.h"
diff --git a/chromium/ui/webui/BUILD.gn b/chromium/ui/webui/BUILD.gn
index bc3709a4084..4d523c55d21 100644
--- a/chromium/ui/webui/BUILD.gn
+++ b/chromium/ui/webui/BUILD.gn
@@ -4,6 +4,8 @@
static_library("webui") {
sources = [
+ "mojo_bubble_web_ui_controller.cc",
+ "mojo_bubble_web_ui_controller.h",
"mojo_web_ui_controller.cc",
"mojo_web_ui_controller.h",
"webui_allowlist.cc",
diff --git a/chromium/ui/webui/DIR_METADATA b/chromium/ui/webui/DIR_METADATA
new file mode 100644
index 00000000000..cf1499073d6
--- /dev/null
+++ b/chromium/ui/webui/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Browser>WebUI"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/OWNERS b/chromium/ui/webui/OWNERS
index 8c48ccde790..1dbead9cf13 100644
--- a/chromium/ui/webui/OWNERS
+++ b/chromium/ui/webui/OWNERS
@@ -1,5 +1,3 @@
file://ui/webui/PLATFORM_OWNERS
fukino@chromium.org
-
-# COMPONENT: UI>Browser>WebUI
diff --git a/chromium/ui/webui/PLATFORM_OWNERS b/chromium/ui/webui/PLATFORM_OWNERS
index 9820db07c3d..98b1491e276 100644
--- a/chromium/ui/webui/PLATFORM_OWNERS
+++ b/chromium/ui/webui/PLATFORM_OWNERS
@@ -3,9 +3,7 @@ aee@chromium.org
antrim@chromium.org # CET
calamity@chromium.org
dpapad@chromium.org
-dschuyler@chromium.org
johntlee@chromium.org
khorimoto@chromium.org # For Chrome OS changes.
michaelpg@chromium.org # For Chrome OS changes.
rbpotter@chromium.org
-tommycli@chromium.org
diff --git a/chromium/ui/webui/mojo_bubble_web_ui_controller.cc b/chromium/ui/webui/mojo_bubble_web_ui_controller.cc
new file mode 100644
index 00000000000..b91ba17f892
--- /dev/null
+++ b/chromium/ui/webui/mojo_bubble_web_ui_controller.cc
@@ -0,0 +1,17 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/webui/mojo_bubble_web_ui_controller.h"
+
+#include "content/public/browser/web_ui.h"
+
+namespace ui {
+
+MojoBubbleWebUIController::MojoBubbleWebUIController(content::WebUI* contents,
+ bool enable_chrome_send)
+ : MojoWebUIController(contents, enable_chrome_send) {}
+
+MojoBubbleWebUIController::~MojoBubbleWebUIController() = default;
+
+} // namespace ui
diff --git a/chromium/ui/webui/mojo_bubble_web_ui_controller.h b/chromium/ui/webui/mojo_bubble_web_ui_controller.h
new file mode 100644
index 00000000000..2cf7f5a0eaf
--- /dev/null
+++ b/chromium/ui/webui/mojo_bubble_web_ui_controller.h
@@ -0,0 +1,44 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_WEBUI_MOJO_BUBBLE_WEB_UI_CONTROLLER_H_
+#define UI_WEBUI_MOJO_BUBBLE_WEB_UI_CONTROLLER_H_
+
+#include "base/callback_forward.h"
+#include "base/memory/weak_ptr.h"
+#include "ui/webui/mojo_web_ui_controller.h"
+
+namespace content {
+class WebUI;
+} // namespace content
+
+namespace ui {
+
+class MojoBubbleWebUIController : public MojoWebUIController {
+ public:
+ class Embedder {
+ public:
+ virtual void ShowUI() = 0;
+ virtual void CloseUI() = 0;
+ };
+
+ // By default MojoBubbleWebUIController do not have normal WebUI bindings.
+ // Pass |enable_chrome_send| as true if these are needed.
+ explicit MojoBubbleWebUIController(content::WebUI* contents,
+ bool enable_chrome_send = false);
+ MojoBubbleWebUIController(const MojoBubbleWebUIController&) = delete;
+ MojoBubbleWebUIController& operator=(const MojoBubbleWebUIController&) =
+ delete;
+ ~MojoBubbleWebUIController() override;
+
+ void set_embedder(base::WeakPtr<Embedder> embedder) { embedder_ = embedder; }
+ base::WeakPtr<Embedder> embedder() { return embedder_; }
+
+ private:
+ base::WeakPtr<Embedder> embedder_;
+};
+
+} // namespace ui
+
+#endif // UI_WEBUI_MOJO_BUBBLE_WEB_UI_CONTROLLER_H_
diff --git a/chromium/ui/webui/resources/BUILD.gn b/chromium/ui/webui/resources/BUILD.gn
index e5c0bf6779a..988878976b1 100644
--- a/chromium/ui/webui/resources/BUILD.gn
+++ b/chromium/ui/webui/resources/BUILD.gn
@@ -3,203 +3,56 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/grit/preprocess_grit.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
-preprocess_folder = "preprocessed"
+include_polymer = !is_android && !is_ios
+
+generate_grd("build_grd") {
+ grd_prefix = "webui_generated"
+ out_grd = "$target_gen_dir/${grd_prefix}_resources.grd"
-group("preprocess") {
deps = [
- ":preprocess_generated",
- ":preprocess_src",
+ "css:build_grdp",
+ "html:build_grdp",
+ "js:build_grdp",
+ "js/cr/ui:build_grdp",
]
-}
-
-preprocess_grit("preprocess_src") {
- in_folder = "./"
- out_folder = "$target_gen_dir/$preprocess_folder"
- in_files = [
- "js/action_link.js",
- "js/color_utils.js",
- "js/cr.m.js",
- "js/plural_string_proxy.js",
+ grdp_files = [
+ "$target_gen_dir/css/resources.grdp",
+ "$target_gen_dir/html/resources.grdp",
+ "$target_gen_dir/js/cr/ui/resources.grdp",
+ "$target_gen_dir/js/resources.grdp",
]
- if (!is_android) {
- in_files += [
- "cr_elements/cr_splitter/cr_splitter.js",
- "cr_components/certificate_manager/certificates_browser_proxy.js",
- "cr_components/certificate_manager/certificate_manager_types.js",
- "cr_components/certificate_manager/certificate_provisioning_browser_proxy.js",
- "cr_components/customize_themes/browser_proxy.js",
+ if (include_polymer) {
+ deps += [
+ "cr_components:build_grdp",
+ "cr_elements:build_grdp",
+ "//third_party/polymer/v1_0:build_grdp",
+ "//third_party/polymer/v3_0:build_grdp",
]
- }
-}
-
-preprocess_grit("preprocess_generated") {
- deps = [ ":modulize" ]
- in_folder = target_gen_dir
- out_folder = "$target_gen_dir/$preprocess_folder"
- in_files = [
- "js/assert.m.js",
- "js/event_tracker.m.js",
- "js/icon.m.js",
- "js/load_time_data.m.js",
- "js/parse_html_subset.m.js",
- "js/promise_resolver.m.js",
- "js/util.m.js",
- "js/cr/event_target.m.js",
- "js/cr/ui/drag_wrapper.m.js",
- "js/cr/ui/focus_grid.m.js",
- "js/cr/ui/focus_outline_manager.m.js",
- "js/cr/ui/focus_row.m.js",
- "js/cr/ui/keyboard_shortcut_list.m.js",
- "js/cr/ui/store_client.m.js",
- "js/cr/ui/store.m.js",
- ]
-
- if (!is_android) {
- in_files += [
- "cr_components/certificate_manager/ca_trust_edit_dialog.js",
- "cr_components/certificate_manager/certificate_delete_confirmation_dialog.js",
- "cr_components/certificate_manager/certificate_entry.js",
- "cr_components/certificate_manager/certificate_list.js",
- "cr_components/certificate_manager/certificate_manager.js",
- "cr_components/certificate_manager/certificate_password_decryption_dialog.js",
- "cr_components/certificate_manager/certificate_password_encryption_dialog.js",
- "cr_components/certificate_manager/certificate_provisioning_details_dialog.js",
- "cr_components/certificate_manager/certificate_provisioning_entry.js",
- "cr_components/certificate_manager/certificate_provisioning_list.js",
- "cr_components/certificate_manager/certificates_error_dialog.js",
- "cr_components/certificate_manager/certificate_shared_css.js",
- "cr_components/certificate_manager/certificate_subentry.js",
- "cr_components/customize_themes/customize_themes.js",
- "cr_components/customize_themes/customize_themes.mojom-lite.js",
- "cr_components/customize_themes/theme_icon.js",
- "cr_components/managed_footnote/managed_footnote.m.js",
- "cr_components/omnibox/cr_autocomplete_match_list.js",
- "cr_elements/shared_vars_css.m.js",
- "cr_elements/shared_style_css.m.js",
- "cr_elements/search_highlight_style_css.m.js",
- "cr_elements/md_select_css.m.js",
- "cr_elements/icons.m.js",
- "cr_elements/hidden_style_css.m.js",
- "cr_elements/cr_scrollable_behavior.m.js",
- "cr_elements/cr_page_host_style_css.m.js",
- "cr_elements/cr_icons_css.m.js",
- "cr_elements/cr_container_shadow_behavior.m.js",
- "cr_elements/action_link_css.m.js",
- "cr_elements/cr_grid/cr_grid.js",
- "cr_elements/cr_view_manager/cr_view_manager.m.js",
- "cr_elements/cr_toolbar/cr_toolbar_selection_overlay.m.js",
- "cr_elements/cr_toolbar/cr_toolbar_search_field.m.js",
- "cr_elements/cr_toolbar/cr_toolbar.m.js",
- "cr_elements/cr_toggle/cr_toggle.m.js",
- "cr_elements/cr_toast/cr_toast.m.js",
- "cr_elements/cr_toast/cr_toast_manager.m.js",
- "cr_elements/cr_tabs/cr_tabs.m.js",
- "cr_elements/cr_slider/cr_slider.m.js",
- "cr_elements/cr_search_field/cr_search_field.m.js",
- "cr_elements/cr_search_field/cr_search_field_behavior.m.js",
- "cr_elements/cr_radio_group/cr_radio_group.m.js",
- "cr_elements/cr_radio_button/cr_radio_button_style_css.m.js",
- "cr_elements/cr_radio_button/cr_radio_button.m.js",
- "cr_elements/cr_radio_button/cr_radio_button_behavior.m.js",
- "cr_elements/cr_radio_button/cr_card_radio_button.m.js",
- "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.m.js",
- "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector_grid.m.js",
- "cr_elements/cr_lottie/cr_lottie.m.js",
- "cr_elements/cr_link_row/cr_link_row.m.js",
- "cr_elements/cr_lazy_render/cr_lazy_render.m.js",
- "cr_elements/cr_input/cr_input_style_css.m.js",
- "cr_elements/cr_input/cr_input.m.js",
- "cr_elements/cr_icon_button/cr_icon_button.m.js",
- "cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.js",
- "cr_elements/cr_fingerprint/cr_fingerprint_icon.m.js",
- "cr_elements/cr_expand_button/cr_expand_button.m.js",
- "cr_elements/cr_drawer/cr_drawer.m.js",
- "cr_elements/cr_dialog/cr_dialog.m.js",
- "cr_elements/cr_checkbox/cr_checkbox.m.js",
- "cr_elements/cr_button/cr_button.m.js",
- "cr_elements/cr_action_menu/cr_action_menu.m.js",
- "cr_elements/find_shortcut_behavior.m.js",
- "cr_elements/policy/cr_policy_indicator_behavior.m.js",
- "cr_elements/policy/cr_policy_indicator.m.js",
- "cr_elements/policy/cr_policy_pref_behavior.m.js",
- "cr_elements/policy/cr_policy_pref_indicator.m.js",
- "cr_elements/policy/cr_tooltip_icon.m.js",
- "js/i18n_behavior.m.js",
- "js/list_property_update_behavior.m.js",
- "js/search_highlight_utils.m.js",
- "js/web_ui_listener_behavior.m.js",
- "js/cr/ui/focus_row_behavior.m.js",
- "js/cr/ui/focus_without_ink.m.js",
+ grdp_files += [
+ "$root_gen_dir/third_party/polymer/v1_0/polymer_1_0_resources.grdp",
+ "$root_gen_dir/third_party/polymer/v3_0/polymer_3_0_resources.grdp",
+ "$root_gen_dir/ui/webui/resources/cr_components/cr_components_resources.grdp",
+ "$root_gen_dir/ui/webui/resources/cr_elements/cr_elements_resources.grdp",
]
}
if (is_chromeos) {
- in_files += [
- "cr_components/chromeos/bluetooth/bluetooth_dialog.m.js",
- "cr_components/chromeos/cellular_setup/base_page.m.js",
- "cr_components/chromeos/cellular_setup/button_bar.m.js",
- "cr_components/chromeos/cellular_setup/cellular_setup_delegate.m.js",
- "cr_components/chromeos/cellular_setup/cellular_setup.m.js",
- "cr_components/chromeos/cellular_setup/cellular_types.m.js",
- "cr_components/chromeos/cellular_setup/esim_flow_ui.m.js",
- "cr_components/chromeos/cellular_setup/final_page.m.js",
- "cr_components/chromeos/cellular_setup/mojo_interface_provider.m.js",
- "cr_components/chromeos/cellular_setup/provisioning_page.m.js",
- "cr_components/chromeos/cellular_setup/psim_flow_ui.m.js",
- "cr_components/chromeos/cellular_setup/setup_selection_flow.m.js",
- "cr_components/chromeos/cellular_setup/sim_detect_page.m.js",
- "cr_components/chromeos/cellular_setup/subflow_behavior.m.js",
- "cr_components/chromeos/cellular_setup/webview_post_util.m.js",
- "cr_components/chromeos/network/cr_policy_network_behavior_mojo.m.js",
- "cr_components/chromeos/network/cr_policy_network_indicator_mojo.m.js",
- "cr_components/chromeos/network_health/network_diagnostics.m.js",
- "cr_components/chromeos/network_health/network_health_summary.m.js",
- "cr_components/chromeos/network/mojo_interface_provider.m.js",
- "cr_components/chromeos/network/network_apnlist.m.js",
- "cr_components/chromeos/network/network_choose_mobile.m.js",
- "cr_components/chromeos/network/network_config_element_behavior.m.js",
- "cr_components/chromeos/network/network_config_input.m.js",
- "cr_components/chromeos/network/network_config.m.js",
- "cr_components/chromeos/network/network_config_select.m.js",
- "cr_components/chromeos/network/network_config_toggle.m.js",
- "cr_components/chromeos/network/network_icon.m.js",
- "cr_components/chromeos/network/network_icons.m.js",
- "cr_components/chromeos/network/network_ip_config.m.js",
- "cr_components/chromeos/network/network_listener_behavior.m.js",
- "cr_components/chromeos/network/network_list_item.m.js",
- "cr_components/chromeos/network/network_list.m.js",
- "cr_components/chromeos/network/network_list_types.m.js",
- "cr_components/chromeos/network/network_nameservers.m.js",
- "cr_components/chromeos/network/network_password_input.m.js",
- "cr_components/chromeos/network/network_property_list_mojo.m.js",
- "cr_components/chromeos/network/network_proxy_exclusions.m.js",
- "cr_components/chromeos/network/network_proxy_input.m.js",
- "cr_components/chromeos/network/network_proxy.m.js",
- "cr_components/chromeos/network/network_select.m.js",
- "cr_components/chromeos/network/network_shared_css.m.js",
- "cr_components/chromeos/network/network_siminfo.m.js",
- "cr_components/chromeos/network/onc_mojo.m.js",
- "cr_components/chromeos/quick_unlock/lock_screen_constants.m.js",
- "cr_components/chromeos/quick_unlock/pin_keyboard_icon.m.js",
- "cr_components/chromeos/quick_unlock/pin_keyboard.m.js",
- "cr_components/chromeos/quick_unlock/setup_pin_keyboard.m.js",
- "cr_components/chromeos/smb_shares/add_smb_share_dialog.m.js",
- "cr_components/chromeos/smb_shares/smb_browser_proxy.m.js",
- "cr_elements/chromeos/cros_color_overrides.m.js",
- "cr_elements/chromeos/cr_picture/cr_camera.m.js",
- "cr_elements/chromeos/cr_picture/cr_picture_list.m.js",
- "cr_elements/chromeos/cr_picture/cr_picture_pane.m.js",
- "cr_elements/chromeos/cr_picture/cr_picture_types.m.js",
- "cr_elements/chromeos/cr_picture/icons.m.js",
- "cr_elements/chromeos/cr_picture/png.m.js",
- "cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.m.js",
- ]
+ deps += [ "//third_party/web-animations-js:build_grdp" ]
+ grdp_files += [ "$root_gen_dir/third_party/web-animations-js/web_animations_resources.grdp" ]
}
}
+group("preprocess") {
+ deps = [
+ "cr_components:preprocess",
+ "cr_elements:preprocess",
+ "js:preprocess",
+ ]
+}
+
group("closure_compile") {
deps = [
"js:closure_compile",
diff --git a/chromium/ui/webui/resources/PRESUBMIT.py b/chromium/ui/webui/resources/PRESUBMIT.py
index 0604bc21f11..dfb9dfd752b 100644
--- a/chromium/ui/webui/resources/PRESUBMIT.py
+++ b/chromium/ui/webui/resources/PRESUBMIT.py
@@ -71,9 +71,7 @@ def _CheckWebDevStyle(input_api, output_api):
cwd = input_api.PresubmitLocalPath()
sys.path += [input_api.os_path.join(cwd, '..', '..', '..', 'tools')]
from web_dev_style import presubmit_support
- IGNORELIST = ['ui/webui/resources/js/jstemplate_compiled.js']
- file_filter = lambda f: f.LocalPath() not in IGNORELIST
- results += presubmit_support.CheckStyle(input_api, output_api, file_filter)
+ results += presubmit_support.CheckStyle(input_api, output_api)
finally:
sys.path = old_sys_path
return results
diff --git a/chromium/ui/webui/resources/cr_components/BUILD.gn b/chromium/ui/webui/resources/cr_components/BUILD.gn
index f91009bc108..5d11cb92984 100644
--- a/chromium/ui/webui/resources/cr_components/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/BUILD.gn
@@ -3,6 +3,287 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/preprocess_grit.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/webui_features.gni")
+
+preprocess_folder =
+ "$root_gen_dir/ui/webui/resources/preprocessed/cr_components"
+preprocess_gen_manifest = "preprocessed_gen_manifest.json"
+preprocess_polymer2_manifest = "preprocessed_polymer2_manifest.json"
+preprocess_src_manifest = "preprocessed_src_manifest.json"
+
+generate_grd("build_grdp") {
+ grd_prefix = "cr_components"
+ out_grd = "$target_gen_dir/${grd_prefix}_resources.grdp"
+ deps = [ ":preprocess" ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_gen_manifest",
+ "$target_gen_dir/$preprocess_polymer2_manifest",
+ "$target_gen_dir/$preprocess_src_manifest",
+ ]
+ resource_path_prefix = "cr_components"
+}
+
+group("preprocess") {
+ public_deps = [
+ ":preprocess_generated",
+ ":preprocess_polymer2",
+ ":preprocess_src",
+ ]
+}
+
+preprocess_grit("preprocess_src") {
+ in_folder = "./"
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_src_manifest"
+ in_files = [ "customize_themes/browser_proxy.js" ]
+
+ if (use_nss_certs) {
+ in_files += [
+ "certificate_manager/certificate_manager_types.js",
+ "certificate_manager/certificate_provisioning_browser_proxy.js",
+ "certificate_manager/certificates_browser_proxy.js",
+ ]
+ }
+}
+
+preprocess_grit("preprocess_generated") {
+ deps = [ ":polymer3_elements" ]
+ in_folder = target_gen_dir
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+ in_files = [
+ "customize_themes/customize_themes.js",
+ "customize_themes/customize_themes.mojom-lite.js",
+ "customize_themes/theme_icon.js",
+ "managed_footnote/managed_footnote.m.js",
+ "omnibox/cr_autocomplete_match_list.js",
+ ]
+
+ if (use_nss_certs) {
+ in_files += [
+ "certificate_manager/ca_trust_edit_dialog.js",
+ "certificate_manager/certificate_delete_confirmation_dialog.js",
+ "certificate_manager/certificate_entry.js",
+ "certificate_manager/certificate_list.js",
+ "certificate_manager/certificate_manager.js",
+ "certificate_manager/certificate_password_decryption_dialog.js",
+ "certificate_manager/certificate_password_encryption_dialog.js",
+ "certificate_manager/certificate_provisioning_details_dialog.js",
+ "certificate_manager/certificate_provisioning_entry.js",
+ "certificate_manager/certificate_provisioning_list.js",
+ "certificate_manager/certificates_error_dialog.js",
+ "certificate_manager/certificate_shared_css.js",
+ "certificate_manager/certificate_subentry.js",
+ ]
+ }
+
+ if (is_chromeos) {
+ in_files += [
+ "chromeos/bluetooth/bluetooth_dialog.m.js",
+ "chromeos/cellular_setup/activation_code_page.m.js",
+ "chromeos/cellular_setup/base_page.m.js",
+ "chromeos/cellular_setup/button_bar.m.js",
+ "chromeos/cellular_setup/cellular_setup_delegate.m.js",
+ "chromeos/cellular_setup/cellular_setup.m.js",
+ "chromeos/cellular_setup/cellular_types.m.js",
+ "chromeos/cellular_setup/esim_flow_ui.m.js",
+ "chromeos/cellular_setup/final_page.m.js",
+ "chromeos/cellular_setup/mojo_interface_provider.m.js",
+ "chromeos/cellular_setup/profile_discovery_list_item.m.js",
+ "chromeos/cellular_setup/profile_discovery_list_page.m.js",
+ "chromeos/cellular_setup/provisioning_page.m.js",
+ "chromeos/cellular_setup/psim_flow_ui.m.js",
+ "chromeos/cellular_setup/setup_selection_flow.m.js",
+ "chromeos/cellular_setup/sim_detect_page.m.js",
+ "chromeos/cellular_setup/subflow_behavior.m.js",
+ "chromeos/cellular_setup/webview_post_util.m.js",
+ "chromeos/network_health/network_diagnostics.m.js",
+ "chromeos/network_health/network_diagnostics_mojo.m.js",
+ "chromeos/network/cr_policy_network_behavior_mojo.m.js",
+ "chromeos/network/cr_policy_network_indicator_mojo.m.js",
+ "chromeos/network/mojo_interface_provider.m.js",
+ "chromeos/network/network_apnlist.m.js",
+ "chromeos/network/network_choose_mobile.m.js",
+ "chromeos/network/network_config_element_behavior.m.js",
+ "chromeos/network/network_config_input.m.js",
+ "chromeos/network/network_config.m.js",
+ "chromeos/network/network_config_select.m.js",
+ "chromeos/network/network_config_toggle.m.js",
+ "chromeos/network/network_icon.m.js",
+ "chromeos/network/network_icons.m.js",
+ "chromeos/network/network_ip_config.m.js",
+ "chromeos/network/network_listener_behavior.m.js",
+ "chromeos/network/network_list_item.m.js",
+ "chromeos/network/network_list.m.js",
+ "chromeos/network/network_list_types.m.js",
+ "chromeos/network/network_nameservers.m.js",
+ "chromeos/network/network_password_input.m.js",
+ "chromeos/network/network_property_list_mojo.m.js",
+ "chromeos/network/network_proxy_exclusions.m.js",
+ "chromeos/network/network_proxy_input.m.js",
+ "chromeos/network/network_proxy.m.js",
+ "chromeos/network/network_select.m.js",
+ "chromeos/network/network_shared_css.m.js",
+ "chromeos/network/network_siminfo.m.js",
+ "chromeos/network/onc_mojo.m.js",
+ "chromeos/quick_unlock/lock_screen_constants.m.js",
+ "chromeos/quick_unlock/pin_keyboard_icon.m.js",
+ "chromeos/quick_unlock/pin_keyboard.m.js",
+ "chromeos/quick_unlock/setup_pin_keyboard.m.js",
+ "chromeos/smb_shares/add_smb_share_dialog.m.js",
+ "chromeos/smb_shares/smb_browser_proxy.m.js",
+ ]
+ }
+}
+
+preprocess_grit("preprocess_polymer2") {
+ in_folder = "./"
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_polymer2_manifest"
+ in_files = [
+ "managed_footnote/managed_footnote.html",
+ "managed_footnote/managed_footnote.js",
+ ]
+ if (is_chromeos) {
+ if (!optimize_webui) {
+ in_files += [
+ "chromeos/bluetooth/bluetooth_dialog.html",
+ "chromeos/bluetooth/bluetooth_dialog.js",
+ "chromeos/network/network_apnlist.html",
+ "chromeos/network/network_apnlist.js",
+ "chromeos/network/network_choose_mobile.html",
+ "chromeos/network/network_choose_mobile.js",
+ "chromeos/network/network_config.html",
+ "chromeos/network/network_config.js",
+ "chromeos/network/network_config_element_behavior.html",
+ "chromeos/network/network_config_element_behavior.js",
+ "chromeos/network/network_config_input.html",
+ "chromeos/network/network_config_input.js",
+ "chromeos/network/network_config_select.html",
+ "chromeos/network/network_config_select.js",
+ "chromeos/network/network_config_toggle.html",
+ "chromeos/network/network_config_toggle.js",
+ "chromeos/network/network_ip_config.html",
+ "chromeos/network/network_ip_config.js",
+ "chromeos/network/network_nameservers.html",
+ "chromeos/network/network_nameservers.js",
+ "chromeos/network/network_password_input.html",
+ "chromeos/network/network_password_input.js",
+ "chromeos/network/network_property_list_mojo.html",
+ "chromeos/network/network_property_list_mojo.js",
+ "chromeos/network/network_proxy.html",
+ "chromeos/network/network_proxy.js",
+ "chromeos/network/network_proxy_exclusions.html",
+ "chromeos/network/network_proxy_exclusions.js",
+ "chromeos/network/network_proxy_input.html",
+ "chromeos/network/network_proxy_input.js",
+ "chromeos/network/network_siminfo.html",
+ "chromeos/network/network_siminfo.js",
+ "chromeos/network/network_shared_css.html",
+ ]
+ }
+ in_files += [
+ "chromeos/cellular_setup/activation_code_page.html",
+ "chromeos/cellular_setup/activation_code_page.js",
+ "chromeos/cellular_setup/base_page.html",
+ "chromeos/cellular_setup/base_page.js",
+ "chromeos/cellular_setup/button_bar.html",
+ "chromeos/cellular_setup/button_bar.js",
+ "chromeos/cellular_setup/cellular_setup_delegate.html",
+ "chromeos/cellular_setup/cellular_setup_delegate.js",
+ "chromeos/cellular_setup/cellular_setup.html",
+ "chromeos/cellular_setup/cellular_setup.js",
+ "chromeos/cellular_setup/cellular_types.html",
+ "chromeos/cellular_setup/cellular_types.js",
+ "chromeos/cellular_setup/esim_flow_ui.html",
+ "chromeos/cellular_setup/esim_flow_ui.js",
+ "chromeos/cellular_setup/final_page.html",
+ "chromeos/cellular_setup/final_page.js",
+ "chromeos/cellular_setup/mojo_interface_provider.html",
+ "chromeos/cellular_setup/mojo_interface_provider.js",
+ "chromeos/cellular_setup/profile_discovery_list_item.html",
+ "chromeos/cellular_setup/profile_discovery_list_item.js",
+ "chromeos/cellular_setup/profile_discovery_list_page.html",
+ "chromeos/cellular_setup/profile_discovery_list_page.js",
+ "chromeos/cellular_setup/provisioning_page.html",
+ "chromeos/cellular_setup/provisioning_page.js",
+ "chromeos/cellular_setup/psim_flow_ui.html",
+ "chromeos/cellular_setup/psim_flow_ui.js",
+ "chromeos/cellular_setup/setup_selection_flow.html",
+ "chromeos/cellular_setup/setup_selection_flow.js",
+ "chromeos/cellular_setup/sim_detect_page.html",
+ "chromeos/cellular_setup/sim_detect_page.js",
+ "chromeos/cellular_setup/subflow_behavior.html",
+ "chromeos/cellular_setup/subflow_behavior.js",
+ "chromeos/cellular_setup/webview_post_util.html",
+ "chromeos/cellular_setup/webview_post_util.js",
+ "chromeos/multidevice_setup/button_bar.html",
+ "chromeos/multidevice_setup/button_bar.js",
+ "chromeos/multidevice_setup/fake_mojo_service.html",
+ "chromeos/multidevice_setup/fake_mojo_service.js",
+ "chromeos/multidevice_setup/icons.html",
+ "chromeos/multidevice_setup/mojo_api.html",
+ "chromeos/multidevice_setup/mojo_api.js",
+ "chromeos/multidevice_setup/multidevice_setup_browser_proxy.html",
+ "chromeos/multidevice_setup/multidevice_setup_browser_proxy.js",
+ "chromeos/multidevice_setup/multidevice_setup_delegate.html",
+ "chromeos/multidevice_setup/multidevice_setup_delegate.js",
+ "chromeos/multidevice_setup/multidevice_setup.html",
+ "chromeos/multidevice_setup/multidevice_setup.js",
+ "chromeos/multidevice_setup/multidevice_setup_shared_css.html",
+ "chromeos/multidevice_setup/password_page.html",
+ "chromeos/multidevice_setup/password_page.js",
+ "chromeos/multidevice_setup/setup_succeeded_page.html",
+ "chromeos/multidevice_setup/setup_succeeded_page.js",
+ "chromeos/multidevice_setup/start_setup_page.html",
+ "chromeos/multidevice_setup/start_setup_page.js",
+ "chromeos/multidevice_setup/ui_page_container_behavior.html",
+ "chromeos/multidevice_setup/ui_page_container_behavior.js",
+ "chromeos/multidevice_setup/ui_page.html",
+ "chromeos/multidevice_setup/ui_page.js",
+ "chromeos/network/cr_policy_network_behavior_mojo.html",
+ "chromeos/network/cr_policy_network_behavior_mojo.js",
+ "chromeos/network/cr_policy_network_indicator_mojo.html",
+ "chromeos/network/cr_policy_network_indicator_mojo.js",
+ "chromeos/network_health/network_diagnostics.html",
+ "chromeos/network_health/network_diagnostics.js",
+ "chromeos/network_health/network_diagnostics_mojo.html",
+ "chromeos/network_health/network_diagnostics_mojo.js",
+ "chromeos/network_health/network_health_summary.html",
+ "chromeos/network_health/network_health_summary.js",
+ "chromeos/network/mojo_interface_provider.html",
+ "chromeos/network/mojo_interface_provider.js",
+ "chromeos/network/network_icon.html",
+ "chromeos/network/network_icon.js",
+ "chromeos/network/network_icons.html",
+ "chromeos/network/network_listener_behavior.html",
+ "chromeos/network/network_listener_behavior.js",
+ "chromeos/network/network_list.html",
+ "chromeos/network/network_list_item.html",
+ "chromeos/network/network_list_item.js",
+ "chromeos/network/network_list.js",
+ "chromeos/network/network_list_types.html",
+ "chromeos/network/network_list_types.js",
+ "chromeos/network/network_select.html",
+ "chromeos/network/network_select.js",
+ "chromeos/network/onc_mojo.html",
+ "chromeos/network/onc_mojo.js",
+ "chromeos/quick_unlock/lock_screen_constants.html",
+ "chromeos/quick_unlock/lock_screen_constants.js",
+ "chromeos/quick_unlock/pin_keyboard.html",
+ "chromeos/quick_unlock/pin_keyboard_icon.html",
+ "chromeos/quick_unlock/pin_keyboard.js",
+ "chromeos/quick_unlock/setup_pin_keyboard.html",
+ "chromeos/quick_unlock/setup_pin_keyboard.js",
+ "chromeos/smb_shares/add_smb_share_dialog.html",
+ "chromeos/smb_shares/add_smb_share_dialog.js",
+ "chromeos/smb_shares/smb_browser_proxy.html",
+ "chromeos/smb_shares/smb_browser_proxy.js",
+ ]
+ }
+}
group("closure_compile") {
deps = [
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.html b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.html
index 81d4eb5bb59..07cc4f1feb3 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.html
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.html
@@ -22,28 +22,28 @@
<cr-policy-indicator indicator-type="[[getPolicyIndicatorType_(model)]]">
</cr-policy-indicator>
<cr-icon-button class="icon-more-vert" id="dots"
- title="[[i18n('moreActions')]]" on-click="onDotsTap_">
+ title="[[i18n('moreActions')]]" on-click="onDotsClick_">
</cr-icon-button>
<cr-lazy-render id="menu">
<template>
<cr-action-menu role-description="[[i18n('menu')]]">
<button class="dropdown-item" id="view"
- on-tap="onViewTap_">
+ on-click="onViewClick_">
[[i18n('certificateManagerView')]]
</button>
<button class="dropdown-item" id="edit"
hidden$="[[!canEdit_(model)]]"
- on-tap="onEditTap_">
+ on-click="onEditClick_">
[[i18n('edit')]]
</button>
<button class="dropdown-item" id="export"
hidden$="[[!canExport_(certificateType, model)]]"
- on-tap="onExportTap_">
+ on-click="onExportClick_">
[[i18n('certificateManagerExport')]]
</button>
<button class="dropdown-item" id="delete"
hidden$="[[!canDelete_(model)]]"
- on-tap="onDeleteTap_">
+ on-click="onDeleteClick_">
[[i18n('certificateManagerDelete')]]
</button>
</cr-action-menu>
diff --git a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.js b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.js
index ef95ba04614..03394fe7041 100644
--- a/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.js
+++ b/chromium/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.js
@@ -79,38 +79,26 @@ Polymer({
this.fire('certificates-error', {error: error, anchor: this.$.dots});
},
- /**
- * @param {!Event} event
- * @private
- */
- onViewTap_(event) {
+ /** @private */
+ onViewClick_() {
this.closePopupMenu_();
this.browserProxy_.viewCertificate(this.model.id);
},
- /**
- * @param {!Event} event
- * @private
- */
- onEditTap_(event) {
+ /** @private */
+ onEditClick_() {
this.closePopupMenu_();
this.dispatchCertificateActionEvent_(CertificateAction.EDIT);
},
- /**
- * @param {!Event} event
- * @private
- */
- onDeleteTap_(event) {
+ /** @private */
+ onDeleteClick_() {
this.closePopupMenu_();
this.dispatchCertificateActionEvent_(CertificateAction.DELETE);
},
- /**
- * @param {!Event} event
- * @private
- */
- onExportTap_(event) {
+ /** @private */
+ onExportClick_() {
this.closePopupMenu_();
if (this.certificateType === CertificateType.PERSONAL) {
this.browserProxy_.exportPersonalCertificate(this.model.id).then(() => {
@@ -158,7 +146,7 @@ Polymer({
},
/** @private */
- onDotsTap_() {
+ onDotsClick_() {
const actionMenu = /** @type {!CrActionMenuElement} */ (this.$.menu.get());
actionMenu.showAt(this.$.dots);
},
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/DIR_METADATA b/chromium/ui/webui/resources/cr_components/chromeos/DIR_METADATA
new file mode 100644
index 00000000000..b39cd583495
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "OS>Systems>Settings"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/OWNERS b/chromium/ui/webui/resources/cr_components/chromeos/OWNERS
index a0616b8cd36..96f54b2cb48 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/OWNERS
+++ b/chromium/ui/webui/resources/cr_components/chromeos/OWNERS
@@ -1,3 +1 @@
file://chrome/browser/resources/settings/chromeos/OWNERS
-
-# COMPONENT: OS>Systems>Settings
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
index 53ddac682b2..0c87689c71c 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
@@ -11,6 +11,7 @@ assert(is_chromeos, "CellularSetup UI is Chrome OS only.")
js_type_check("closure_compile") {
deps = [
+ ":activation_code_page",
":base_page",
":button_bar",
":cellular_setup",
@@ -18,6 +19,8 @@ js_type_check("closure_compile") {
":cellular_types",
":final_page",
":mojo_interface_provider",
+ ":profile_discovery_list_item",
+ ":profile_discovery_list_page",
":provisioning_page",
":psim_flow_ui",
":setup_selection_flow",
@@ -68,6 +71,25 @@ js_library("final_page") {
deps = [ ":base_page" ]
}
+js_library("activation_code_page") {
+ deps = [
+ ":cellular_setup_delegate",
+ ":subflow_behavior",
+ "//ui/webui/resources/js:i18n_behavior",
+ ]
+}
+
+js_library("profile_discovery_list_page") {
+ deps = [
+ "//third_party/polymer/v1_0/components-chromium/iron-list:iron-list-extracted",
+ "//ui/webui/resources/js:i18n_behavior",
+ ]
+}
+
+js_library("profile_discovery_list_item") {
+ deps = [ "//ui/webui/resources/js:i18n_behavior" ]
+}
+
js_library("psim_flow_ui") {
deps = [
":cellular_setup_delegate",
@@ -85,9 +107,10 @@ js_library("psim_flow_ui") {
js_library("esim_flow_ui") {
deps = [
+ ":activation_code_page",
":cellular_setup_delegate",
- ":cellular_types",
- ":final_page",
+ ":profile_discovery_list_item",
+ ":profile_discovery_list_page",
":subflow_behavior",
"//ui/webui/resources/js:i18n_behavior",
]
@@ -140,6 +163,7 @@ js_library("mojo_interface_provider") {
js_type_check("closure_compile_module") {
is_polymer3 = true
deps = [
+ ":activation_code_page.m",
":base_page.m",
":button_bar.m",
":cellular_setup.m",
@@ -148,6 +172,8 @@ js_type_check("closure_compile_module") {
":esim_flow_ui.m",
":final_page.m",
":mojo_interface_provider.m",
+ ":profile_discovery_list_item.m",
+ ":profile_discovery_list_page.m",
":provisioning_page.m",
":psim_flow_ui.m",
":setup_selection_flow.m",
@@ -176,6 +202,32 @@ js_library("final_page.m") {
extra_deps = [ ":final_page_module" ]
}
+js_library("activation_code_page.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.m.js" ]
+ deps = [
+ ":cellular_setup_delegate.m",
+ ":subflow_behavior.m",
+ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+ extra_deps = [ ":activation_code_page_module" ]
+}
+
+js_library("profile_discovery_list_item.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.m.js" ]
+ deps = [ "//ui/webui/resources/js:i18n_behavior.m" ]
+ extra_deps = [ ":profile_discovery_list_item_module" ]
+}
+
+js_library("profile_discovery_list_page.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.m.js" ]
+ deps = [
+ "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
+ "//ui/webui/resources/js:i18n_behavior.m",
+ ]
+ extra_deps = [ ":profile_discovery_list_page_module" ]
+}
+
js_library("mojo_interface_provider.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.m.js" ]
deps = [
@@ -268,9 +320,12 @@ js_library("psim_flow_ui.m") {
js_library("esim_flow_ui.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.m.js" ]
deps = [
+ ":activation_code_page.m",
":cellular_setup_delegate.m",
":cellular_types.m",
":final_page.m",
+ ":profile_discovery_list_item.m",
+ ":profile_discovery_list_page.m",
":subflow_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -304,12 +359,15 @@ js_library("cellular_setup.m") {
group("polymer3_elements") {
public_deps = [
+ ":activation_code_page_module",
":base_page_module",
":button_bar_module",
":cellular_setup_module",
":esim_flow_ui_module",
":final_page_module",
":modulize",
+ ":profile_discovery_list_item_module",
+ ":profile_discovery_list_page_module",
":provisioning_page_module",
":psim_flow_ui_module",
":setup_selection_flow_module",
@@ -333,6 +391,14 @@ polymer_modulizer("final_page") {
auto_imports = cr_components_chromeos_auto_imports
}
+polymer_modulizer("activation_code_page") {
+ js_file = "activation_code_page.js"
+ html_file = "activation_code_page.html"
+ html_type = "dom-module"
+ namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ auto_imports = cr_components_chromeos_auto_imports
+}
+
polymer_modulizer("button_bar") {
js_file = "button_bar.js"
html_file = "button_bar.html"
@@ -349,6 +415,22 @@ polymer_modulizer("sim_detect_page") {
auto_imports = cr_components_chromeos_auto_imports
}
+polymer_modulizer("profile_discovery_list_item") {
+ js_file = "profile_discovery_list_item.js"
+ html_file = "profile_discovery_list_item.html"
+ html_type = "dom-module"
+ namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ auto_imports = cr_components_chromeos_auto_imports
+}
+
+polymer_modulizer("profile_discovery_list_page") {
+ js_file = "profile_discovery_list_page.js"
+ html_file = "profile_discovery_list_page.html"
+ html_type = "dom-module"
+ namespace_rewrites = cr_components_chromeos_namespace_rewrites
+ auto_imports = cr_components_chromeos_auto_imports
+}
+
polymer_modulizer("provisioning_page") {
js_file = "provisioning_page.js"
html_file = "provisioning_page.html"
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.html
new file mode 100644
index 00000000000..8e9086e9818
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.html
@@ -0,0 +1,151 @@
+<link rel="import" href="../../../html/polymer.html">
+
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
+<link rel="import" href="base_page.html">
+<link rel="import" href="cellular_setup_delegate.html">
+
+<dom-module id="activation-code-page">
+ <template>
+ <style>
+ [slot='page-body'] {
+ height: 300px;
+ margin-top: -20px;
+ }
+
+ :host cr-button {
+ --ripple-opacity: 0;
+ }
+
+ #esimQrCodeDetection {
+ background-color: var(--google-grey-refresh-100);
+ border-radius: 4px;
+ height: 130px;
+ margin: 20px 0 30px 0;
+ overflow: hidden;
+ position: relative;
+ }
+
+ cr-button {
+ border: none;
+ box-shadow: none;
+ }
+
+ cr-button:hover {
+ background-color: transparent;
+ }
+
+ #scanSuccessMessage {
+ color: green;
+ font-size: medium;
+ }
+
+ #scanSuccessMessage:hover {
+ cursor: default;
+ }
+
+ .center {
+ left: 50%;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%) translateX(-50%);
+ }
+
+ .label {
+ font-weight: 500;
+ }
+
+ .button-image {
+ height: 20px;
+ margin-inline-end: 8px;
+ width: 20px;
+ }
+
+ #useCameraAgainButton {
+ font-weight: 500;
+ left: 50%;
+ margin-top: 16px;
+ transform: translateX(-50%);
+ }
+
+ #scanSuccessImage {
+ height: 20px;
+ position: absolute;
+ width: 20px;
+ }
+
+ #scanSuccessMessage {
+ padding-inline-end: 0;
+ padding-inline-start: 30px;
+ }
+
+ #switchCameraButton {
+ background-color: rgba(0, 0, 0, 0.04);
+ border-radius: 4px;
+ color: var(--google-grey-refresh-300);
+ margin: 8px;
+ padding: 8px;
+ position: absolute;
+ right: 0;
+ z-index: 2;
+ }
+
+ #switchCameraButton img {
+ filter: brightness(2.1);
+ }
+ </style>
+ <base-page>
+ <div slot="page-body">
+ <span id="scanQrCodeDescription">
+ [[i18n('scanQRCode')]]
+ </span>
+ <div id="esimQrCodeDetection">
+ <cr-button id="switchCameraButton"
+ on-click="onSwitchCameraButtonPressed_"
+ hidden$="[[isUiElementHidden_(UiElement.SWITCH_CAMERA, state_, hasMultipleCameras_)]]"
+ disabled="[[isUiElementDisabled_(UiElement.SWITCH_CAMERA, state_)]]">
+ <img class="button-image"
+ src="activation_code_page_switch_camera.svg"
+ aria-hidden="true">
+ [[i18n('switchCamera')]]
+ </cr-button>
+ <video id="video"
+ hidden$="[[isUiElementHidden_(UiElement.VIDEO, state_)]]">
+ </video>
+ <div class="center" id="startScanningContainer"
+ hidden$="[[isUiElementHidden_(UiElement.START_SCANNING, state_)]]">
+ <cr-button class="label"
+ id="startScanningButton"
+ on-click="startScanning_"
+ aria-describedby="scanQrCodeDescription">
+ <img class="button-image"
+ src="activation_code_page_camera.svg"
+ aria-hidden="true">
+ [[i18n('useCamera')]]
+ </cr-button>
+ </div>
+ <div class="center" id="scanSuccessContainer"
+ hidden$="[[isUiElementHidden_(UiElement.SCAN_SUCCESS, state_)]]">
+ <div>
+ <img id="scanSuccessImage"
+ src="activation_code_page_checked.svg"
+ aria-hidden="true">
+ <span class="label" id="scanSuccessMessage">
+ [[i18n('scanQRCodeSuccess')]]
+ </span>
+ </div>
+ <cr-button id="useCameraAgainButton"
+ on-click="startScanning_">
+ [[i18n('qrCodeRetry')]]
+ </cr-button>
+ </div>
+ </div>
+ <cr-input id="activationCode"
+ label="[[i18n('activationCode')]]"
+ value="{{activationCode_}}">
+ </cr-input>
+ </div>
+ </base-page>
+ </template>
+ <script src="activation_code_page.js"></script>
+</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js
new file mode 100644
index 00000000000..eb391054d34
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page.js
@@ -0,0 +1,300 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @type {!number}
+ * @private
+ */
+const QR_CODE_DETECTION_INTERVAL_MS = 1000;
+
+/** @enum {number} */
+const PageState = {
+ INITIAL: 1,
+ SCANNING_USER_FACING: 2,
+ SCANNING_ENVIRONMENT_FACING: 3,
+ SWITCHING_CAM_USER_TO_ENVIRONMENT: 4,
+ SWITCHING_CAM_ENVIRONMENT_TO_USER: 5,
+ SUCCESS: 6,
+};
+
+/** @enum {number} */
+const UiElement = {
+ START_SCANNING: 1,
+ VIDEO: 2,
+ SCAN_SUCCESS: 3,
+ SWITCH_CAMERA: 4,
+};
+
+/**
+ * Page in eSIM Setup flow that accepts activation code. User has option for
+ * manual entry or scan a QR code.
+ */
+Polymer({
+ is: 'activation-code-page',
+
+ behaviors: [I18nBehavior],
+
+ properties: {
+ /** @private */
+ activationCode_: {
+ type: String,
+ value: '',
+ observer: 'onActivationCodeChanged_',
+ },
+
+ /**
+ * @type {!PageState}
+ * @private
+ */
+ state_: {
+ type: Object,
+ value: PageState,
+ },
+
+ /** @private */
+ hasMultipleCameras_: {
+ type: Boolean,
+ value: false,
+ observer: 'onHasMultipleCamerasChanged_',
+ },
+
+ /**
+ * Enum used as an ID for specific UI elements.
+ * A UiElement is passed between html and JS for
+ * certain UI elements to determine their state.
+ *
+ * @type {!UiElement}
+ */
+ UiElement: {
+ type: Object,
+ value: UiElement,
+ },
+ },
+
+ /**
+ * @type {MediaDevices}
+ * @private
+ */
+ mediaDevices_: null,
+
+ /**
+ * @type {?MediaStream}
+ * @private
+ */
+ stream_: null,
+
+ /**
+ * @type {?number}
+ * @private
+ */
+ qrCodeDetectorTimer_: null,
+
+ /** @override */
+ ready() {
+ this.setMediaDevices(navigator.mediaDevices);
+ this.state_ = PageState.INITIAL;
+ },
+
+ /** @override */
+ detached() {
+ if (this.stream_) {
+ this.stream_.getTracks()[0].stop();
+ }
+ if (this.qrCodeDetectorTimer_) {
+ clearTimeout(this.qrCodeDetectorTimer_);
+ }
+ this.mediaDevices_.removeEventListener(
+ 'devicechange', this.updateHasMultipleCameras_.bind(this));
+ },
+
+ /**
+ * @param {MediaDevices} mediaDevices
+ */
+ setMediaDevices(mediaDevices) {
+ this.mediaDevices_ = mediaDevices;
+ this.mediaDevices_.addEventListener(
+ 'devicechange', this.updateHasMultipleCameras_.bind(this));
+ },
+
+ /** @private */
+ updateHasMultipleCameras_() {
+ this.mediaDevices_.enumerateDevices().then(devices => {
+ const numVideoInputDevices =
+ devices.filter(device => device.kind === 'videoinput').length;
+ this.hasMultipleCameras_ = numVideoInputDevices > 1;
+ });
+ },
+
+ /** @private */
+ onHasMultipleCamerasChanged_() {
+ // If the user was using an environment-facing camera and it was removed,
+ // restart scanning with the user-facing camera.
+ if ((this.state_ === PageState.SCANNING_ENVIRONMENT_FACING) &&
+ !this.hasMultipleCameras_) {
+ this.state_ = PageState.SWITCHING_CAM_ENVIRONMENT_TO_USER;
+ this.startScanning_();
+ }
+ },
+
+ /** private */
+ startScanning_() {
+ const oldStream = this.stream_;
+ if (this.qrCodeDetectorTimer_) {
+ clearTimeout(this.qrCodeDetectorTimer_);
+ }
+
+ const useUserFacingCamera =
+ this.state_ !== PageState.SWITCHING_CAM_USER_TO_ENVIRONMENT;
+ this.mediaDevices_
+ .getUserMedia({
+ video: {
+ height: 130,
+ width: 482,
+ facingMode: useUserFacingCamera ? 'user' : 'environment'
+ },
+ audio: false
+ })
+ .then(stream => {
+ this.stream_ = stream;
+ if (stream) {
+ const video = this.$.video;
+ video.srcObject = stream;
+ video.play();
+ }
+ if (oldStream) {
+ oldStream.getTracks()[0].stop();
+ }
+
+ this.activationCode_ = '';
+ this.state_ = useUserFacingCamera ?
+ PageState.SCANNING_USER_FACING :
+ PageState.SCANNING_ENVIRONMENT_FACING;
+
+ this.detectQrCode_(stream);
+ });
+ },
+
+ /**
+ * Continuously checks stream if it contains a QR code. If a QR code is
+ * detected, activationCode_ is set to the QR code's value and the detection
+ * stops.
+ * @param {MediaStream} stream
+ * @private
+ */
+ async detectQrCode_(stream) {
+ try {
+ this.qrCodeDetectorTimer_ = setInterval(
+ (async function() {
+ const capturer = new ImageCapture(stream.getVideoTracks()[0]);
+ const frame = await capturer.grabFrame();
+ const activationCode = await this.detectActivationCode_(frame);
+ if (activationCode) {
+ clearTimeout(this.qrCodeDetectorTimer_);
+ this.activationCode_ = activationCode;
+ }
+ }).bind(this),
+ QR_CODE_DETECTION_INTERVAL_MS);
+ } catch (error) {
+ // TODO(crbug.com/1093185): Update the UI in response to the error.
+ console.log(error);
+ }
+ },
+
+ /**
+ * @param {ImageBitmap} frame
+ * @return {!Promise<string|null>}
+ * TODO(crbug.com/1093185): Remove suppression when shape_detection extern
+ * definitions become available.
+ * @suppress {undefinedVars|missingProperties}
+ * @private
+ */
+ async detectActivationCode_(frame) {
+ const qrCodeDetector = new BarcodeDetector({
+ formats: [
+ 'qr_code',
+ ]
+ });
+ const qrCodes = await qrCodeDetector.detect(frame);
+ if (qrCodes.length > 0) {
+ return qrCodes[0].rawValue;
+ }
+ return null;
+ },
+
+ /** @private */
+ onActivationCodeChanged_() {
+ const activationCode = this.validateActivationCode_(this.activationCode_);
+ this.fire('activation-code-updated', {activationCode: activationCode});
+ // TODO(crbug.com/1093185): Handle if activation code is invalid.
+ if (activationCode) {
+ if (this.stream_) {
+ this.stream_.getTracks()[0].stop();
+ }
+ this.state_ = PageState.SUCCESS;
+ }
+ },
+
+ /**
+ * @param {string} activationCode
+ * @return {string|null} The validated activation code or null if it's
+ * invalid.
+ * @private
+ */
+ validateActivationCode_(activationCode) {
+ // TODO(crbug.com/1093185): Add better validation when we know the
+ // constraints.
+ activationCode = activationCode.trim();
+ if (activationCode.length > 3) {
+ return activationCode;
+ }
+ return null;
+ },
+
+ /** @private */
+ onSwitchCameraButtonPressed_() {
+ if (this.state_ === PageState.SCANNING_USER_FACING) {
+ this.state_ = PageState.SWITCHING_CAM_USER_TO_ENVIRONMENT;
+ } else if (this.state_ === PageState.SCANNING_ENVIRONMENT_FACING) {
+ this.state_ = PageState.SWITCHING_CAM_ENVIRONMENT_TO_USER;
+ }
+ this.startScanning_();
+ },
+
+ /**
+ * @param {UiElement} uiElement
+ * @param {PageState} state
+ * @param {boolean} hasMultipleCameras
+ * @private
+ */
+ isUiElementHidden_(uiElement, state, hasMultipleCameras) {
+ switch (uiElement) {
+ case UiElement.START_SCANNING:
+ return state !== PageState.INITIAL;
+ case UiElement.VIDEO:
+ return state !== PageState.SCANNING_USER_FACING &&
+ state !== PageState.SCANNING_ENVIRONMENT_FACING;
+ case UiElement.SCAN_SUCCESS:
+ return state !== PageState.SUCCESS;
+ case UiElement.SWITCH_CAMERA:
+ const isScanning = state === PageState.SCANNING_USER_FACING ||
+ state === PageState.SCANNING_ENVIRONMENT_FACING;
+ return !(isScanning && hasMultipleCameras);
+ }
+ },
+
+ /**
+ * @param {UiElement} uiElement
+ * @param {PageState} state
+ * @private
+ */
+ isUiElementDisabled_(uiElement, state) {
+ switch (uiElement) {
+ case UiElement.SWITCH_CAMERA:
+ return state === PageState.SWITCHING_CAM_USER_TO_ENVIRONMENT ||
+ state === PageState.SWITCHING_CAM_ENVIRONMENT_TO_USER;
+ default:
+ return false;
+ }
+ },
+});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_camera.svg b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_camera.svg
new file mode 100644
index 00000000000..9e8e0fe771c
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_camera.svg
@@ -0,0 +1 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><mask id="a" maskUnits="userSpaceOnUse" x="1" y="2" width="18" height="16"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.667 4.167h-2.642L12.5 2.5h-5L5.975 4.167H3.334c-.917 0-1.667.75-1.667 1.666v10c0 .917.75 1.667 1.667 1.667h13.333c.917 0 1.667-.75 1.667-1.667v-10c0-.916-.75-1.666-1.667-1.666zm0 11.666H3.334v-10h13.333v10zm-10-5A3.332 3.332 0 1 1 10 14.166a3.332 3.332 0 0 1-3.333-3.333z" fill="#fff"/></mask><g mask="url(#a)"><path fill="#1A73E8" d="M0 0h20v20H0z"/></g></svg> \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_checked.svg b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_checked.svg
new file mode 100644
index 00000000000..adf445fe700
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_checked.svg
@@ -0,0 +1 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M13.707 7.293a1 1 0 0 0-1.414 0L9 10.586 7.707 9.293a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0 0-1.414z" fill="#1E8E3E"/><path fill-rule="evenodd" clip-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16zm0-2a6 6 0 1 0 0-12 6 6 0 0 0 0 12z" fill="#1E8E3E"/></svg> \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_switch_camera.svg b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_switch_camera.svg
new file mode 100644
index 00000000000..ba6127d7e39
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/activation_code_page_switch_camera.svg
@@ -0,0 +1 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7 9V7H4.802A5.996 5.996 0 0 1 10 4a6 6 0 0 1 5.917 5h2.021c-.491-3.945-3.853-7-7.93-7a7.992 7.992 0 0 0-6.009 2.712L4 3H2v6h5zm5.938 2v2h2.198a5.996 5.996 0 0 1-5.198 3 6 6 0 0 1-5.917-5H2c.492 3.945 3.853 7 7.93 7a7.992 7.992 0 0 0 6.009-2.712V17h2v-6h-5zM10 12a2 2 0 1 0 0-4 2 2 0 0 0 0 4z" fill="#5F6368"/></svg> \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html
index 7500a3a3c6e..a3908c637a4 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html
@@ -30,6 +30,13 @@
[[i18n('back')]]
</cr-button>
<div id="flex"></div>
+ <cr-button id="cancel"
+ class="cancel-button"
+ on-click="onCancelButtonClicked_"
+ disabled="[[isButtonDisabled_(Button.CANCEL, buttonState.*)]]"
+ hidden$="[[isButtonHidden_(Button.CANCEL, buttonState.*)]]">
+ [[i18n('cancel')]]
+ </cr-button>
<cr-button id="tryAgain"
class="action-button"
on-click="onTryAgainButtonClicked_"
@@ -38,18 +45,18 @@
[[i18n('tryAgain')]]
</cr-button>
<cr-button id="done"
- class="action-button"
- on-click="onDoneButtonClicked_"
- disabled="[[isButtonDisabled_(Button.DONE, buttonState.*)]]"
- hidden$="[[isButtonHidden_(Button.DONE, buttonState.*)]]">
- [[i18n('done')]]
- </cr-button>
- <cr-button id="cancel"
- class="cancel-button"
- on-click="onCancelButtonClicked_"
- disabled="[[isButtonDisabled_(Button.CANCEL, buttonState.*)]]"
- hidden$="[[isButtonHidden_(Button.CANCEL, buttonState.*)]]">
- [[i18n('cancel')]]
+ class="action-button"
+ on-click="onDoneButtonClicked_"
+ disabled="[[isButtonDisabled_(Button.DONE, buttonState.*)]]"
+ hidden$="[[isButtonHidden_(Button.DONE, buttonState.*)]]">
+ [[i18n('done')]]
+ </cr-button>
+ <cr-button id="skipDiscovery"
+ class="action-button"
+ on-click="onNextButtonClicked_"
+ disabled="[[isButtonDisabled_(Button.SKIP_DISCOVERY, buttonState.*)]]"
+ hidden$="[[isButtonHidden_(Button.SKIP_DISCOVERY, buttonState.*)]]">
+ [[i18n('skipDiscovery')]]
</cr-button>
<cr-button id="next"
class="action-button"
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js
index 78be710778f..05b648c5b6f 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js
@@ -89,6 +89,8 @@ Polymer({
return this.buttonState.next;
case cellularSetup.Button.TRY_AGAIN:
return this.buttonState.tryAgain;
+ case cellularSetup.Button.SKIP_DISCOVERY:
+ return this.buttonState.skipDiscovery;
default:
assertNotReached();
return cellularSetup.ButtonState.SHOWN_AND_ENABLED;
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html
index 95f0ed9abb8..dd55d49c420 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html
@@ -12,7 +12,7 @@
<template>
<iron-pages
attr-for-selected="id"
- selected="[[currentPageName_]]"
+ selected="[[currentPageName]]"
selected-item="{{currentPage_}}">
<setup-selection-flow
selected-page="{{selectedFlow_}}"
@@ -20,18 +20,19 @@
id="setup-selection-flow">
</setup-selection-flow>
<template is="dom-if"
- if="[[isPSimSelected_(currentPageName_)]]" restamp>
+ if="[[isPSimSelected_(currentPageName)]]" restamp>
<psim-flow-ui
button-state="{{buttonState_}}"
+ name-of-carrier-pending-setup="{{flowTitle}}"
delegate="[[delegate]]"
id="psim-flow-ui">
</psim-flow-ui>
</template>
<template is="dom-if"
- if="[[isESimSelected_(currentPageName_)]]" restamp>
+ if="[[isESimSelected_(currentPageName)]]" restamp>
<esim-flow-ui
button-state="{{buttonState_}}"
- delegate="[[delegate]]"
+ delegate="[[delegate]]"
id="esim-flow-ui">
</esim-flow-ui>
</template>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
index 9c4ec8d2c65..d716ce4538a 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
@@ -15,11 +15,16 @@ Polymer({
/** @type {!cellular_setup.CellularSetupDelegate} */
delegate: Object,
+ flowTitle: {
+ type: String,
+ notify: true,
+ },
+
/**
* Name of the currently displayed sub-page.
* @private {!cellularSetup.CellularSetupPageName|null}
*/
- currentPageName_: {
+ currentPageName: {
type: String,
value: cellularSetup.CellularSetupPageName.SETUP_FLOW_SELECTION,
},
@@ -65,6 +70,7 @@ Polymer({
/** @private */
onPageChange_() {
if (this.currentPage_) {
+ this.flowTitle = '';
this.currentPage_.initSubflow();
}
},
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js
index 5636e63d79f..ec12f757a6b 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js
@@ -27,6 +27,7 @@ cr.define('cellularSetup', function() {
DONE: 3,
NEXT: 4,
TRY_AGAIN: 5,
+ SKIP_DISCOVERY: 6,
};
/**
@@ -36,6 +37,7 @@ cr.define('cellularSetup', function() {
* done: (!cellularSetup.ButtonState|undefined),
* next: (!cellularSetup.ButtonState|undefined),
* tryAgain: (!cellularSetup.ButtonState|undefined),
+ * skipDiscovery: (!cellularSetup.ButtonState|undefined),
* }}
*/
/* #export */ let ButtonBarState;
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html
index 113b44c4bcc..4657fa02d5c 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html
@@ -1,10 +1,12 @@
<link rel="import" href="../../../html/polymer.html">
<link rel="import" href="../../../html/i18n_behavior.html">
-<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
<link rel="import" href="subflow_behavior.html">
<link rel="import" href="cellular_types.html">
<link rel="import" href="cellular_setup_delegate.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-pages/iron-pages.html">
+<link rel="import" href="activation_code_page.html">
+<link rel="import" href="final_page.html">
+<link rel="import" href="profile_discovery_list_page.html">
<dom-module id="esim-flow-ui">
<template>
@@ -15,29 +17,16 @@
flex: 1 1 auto;
flex-direction: column;
}
-
- #esim-qrcode-detection {
- /* TODO(crbug.com/1093185): Remove When QR code detection is added */
- background-color: darkgray;
- height: 200px;
- margin: 10px 0;
- }
</style>
<iron-pages attr-for-selected="id"
selected="[[selectedESimPageName_]]">
- <!-- TODO(crbug.com/1093185): Move to separate page-->
- <div id="qr-code-page">
- [[i18n('scanQRCode')]]
- <!-- TODO(crbug.com/1093185): Add QR code detection-->
- <div id="esim-qrcode-detection"></div>
- <cr-input id="activation-code"
- label="[[i18n('activationCode')]]"
- value="{{activationCode_}}">
- </cr-input>
- </div>
+ <profile-discovery-list-page id="profileDiscoveryPage"
+ selected-profiles="{{selectedProfiles_}}">
+ </profile-discovery-list-page>
+ <activation-code-page id="activationCodePage"></activation-code-page>
<final-page
- id="final-page"
- delegate="[[delegate]]"
+ id="finalPage"
+ delegate="[[delegate]]"
show-error="[[showError_]]">
</final-page>
</iron-pages>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js
index 66185927d6f..745f808b82c 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js
@@ -5,8 +5,9 @@
cr.define('cellular_setup', function() {
/** @enum{string} */
/* #export */ const ESimPageName = {
- ESIM: 'qr-code-page',
- FINAL: 'final-page',
+ PROFILE_DISCOVERY: 'profileDiscoveryPage',
+ ESIM: 'activationCodePage',
+ FINAL: 'finalPage',
};
/**
* Root element for the eSIM cellular setup flow. This element interacts with
@@ -25,23 +26,13 @@ cr.define('cellular_setup', function() {
delegate: Object,
/**
- * @type {string}
- * @private
- */
- activationCode_: {
- type: String,
- value: '',
- observer: 'onActivationCodeChanged_',
- },
-
- /**
* Element name of the current selected sub-page.
* @type {!cellular_setup.ESimPageName}
* @private
*/
selectedESimPageName_: {
type: String,
- value: ESimPageName.ESIM,
+ value: ESimPageName.PROFILE_DISCOVERY,
},
/**
@@ -52,20 +43,61 @@ cr.define('cellular_setup', function() {
type: Boolean,
value: false,
},
+
+ /**
+ * @type {Array<!Object>}
+ * @private
+ */
+ selectedProfiles_: {
+ type: Object,
+ },
+ },
+
+ listeners: {
+ 'activation-code-updated': 'onActivationCodeUpdated_',
},
+ observers: ['onSelectedProfilesChanged_(selectedProfiles_.splices)'],
+
initSubflow() {
this.buttonState = {
- backward: cellularSetup.ButtonState.SHOWN_AND_ENABLED,
+ backward: cellularSetup.ButtonState.HIDDEN,
cancel: this.delegate.shouldShowCancelButton() ?
cellularSetup.ButtonState.SHOWN_AND_ENABLED :
cellularSetup.ButtonState.HIDDEN,
done: cellularSetup.ButtonState.HIDDEN,
- next: cellularSetup.ButtonState.SHOWN_BUT_DISABLED,
- tryAgain: cellularSetup.ButtonState.HIDDEN
+ next: cellularSetup.ButtonState.HIDDEN,
+ tryAgain: cellularSetup.ButtonState.HIDDEN,
+ skipDiscovery: cellularSetup.ButtonState.SHOWN_AND_ENABLED,
};
},
+ /** @private */
+ onActivationCodeUpdated_(event) {
+ if (event.detail.activationCode) {
+ this.set(
+ 'buttonState.next', cellularSetup.ButtonState.SHOWN_AND_ENABLED);
+ } else {
+ this.set(
+ 'buttonState.next', cellularSetup.ButtonState.SHOWN_BUT_DISABLED);
+ }
+ },
+
+ /** @private */
+ onSelectedProfilesChanged_() {
+ // TODO(crbug.com/1093185): Add navigation logic.
+ if (this.selectedProfiles_.length > 0) {
+ this.set('buttonState.skipDiscovery', cellularSetup.ButtonState.HIDDEN);
+ this.set(
+ 'buttonState.done', cellularSetup.ButtonState.SHOWN_AND_ENABLED);
+ } else {
+ this.set(
+ 'buttonState.skipDiscovery',
+ cellularSetup.ButtonState.SHOWN_AND_ENABLED);
+ this.set('buttonState.done', cellularSetup.ButtonState.HIDDEN);
+ }
+ },
+
navigateForward() {
this.selectedESimPageName_ = ESimPageName.FINAL;
},
@@ -77,16 +109,6 @@ cr.define('cellular_setup', function() {
// TODO(crbug.com/1093185): Handle state when camera is used
return false;
},
-
- /** @private */
- onActivationCodeChanged_() {
- if (!this.activationCode_) {
- this.buttonState.next = cellularSetup.ButtonState.SHOWN_BUT_DISABLED;
- return;
- }
-
- this.buttonState.next = cellularSetup.ButtonState.SHOWN_AND_ENABLED;
- }
});
// #cr_define_end
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js
index e5f87bd0164..01e24f158c6 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js
@@ -2,37 +2,36 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// #import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
+// clang-format off
+// #import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+// #import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
+// #import 'chrome://resources/mojo/chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom-lite.js';
+// clang-format on
cr.define('cellular_setup', function() {
- /** @interface */
- /* #export */ class MojoInterfaceProvider {
- /** @return {!chromeos.cellularSetup.mojom.CellularSetupRemote} */
- getMojoServiceRemote() {}
+ let cellularRemote = null;
+
+ /**
+ * @param {?chromeos.cellularSetup.mojom.CellularSetupRemote}
+ * testCellularRemote A test cellular remote
+ */
+ /* #export */ function setCellularSetupRemoteForTesting(testCellularRemote) {
+ cellularRemote = testCellularRemote;
}
- /** @implements {cellular_setup.MojoInterfaceProvider} */
- /* #export */ class MojoInterfaceProviderImpl {
- constructor() {
- /** @private {?chromeos.cellularSetup.mojom.CellularSetupRemote} */
- this.remote_ = null;
+ /**
+ * @returns {!chromeos.cellularSetup.mojom.CellularSetupRemote}
+ */
+ /* #export */ function getCellularSetupRemote() {
+ if (cellularRemote) {
+ return cellularRemote;
}
- /** @override */
- getMojoServiceRemote() {
- if (!this.remote_) {
- this.remote_ = chromeos.cellularSetup.mojom.CellularSetup.getRemote();
- }
+ cellularRemote = chromeos.cellularSetup.mojom.CellularSetup.getRemote();
- return this.remote_;
- }
+ return cellularRemote;
}
- cr.addSingletonGetter(MojoInterfaceProviderImpl);
-
// #cr_define_end
- return {
- MojoInterfaceProvider: MojoInterfaceProvider,
- MojoInterfaceProviderImpl: MojoInterfaceProviderImpl,
- };
+ return {setCellularSetupRemoteForTesting, getCellularSetupRemote};
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.html
new file mode 100644
index 00000000000..f6069727917
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.html
@@ -0,0 +1,55 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
+
+<dom-module id="profile-discovery-list-item">
+ <template>
+ <style include="iron-flex">
+ #details {
+ align-items: center;
+ display: flex;
+ flex: auto;
+ min-height: var(--cr-section-two-line-min-height);
+ }
+
+ #profileImage {
+ margin-inline-end: 16px;
+ }
+
+ #profileTitleLabel {
+ color: var(--cr-primary-text-color);
+ }
+
+ #checkmark {
+ -webkit-mask: url(activation_code_page_checked.svg) no-repeat center;
+ background-color: var(--google-blue-600);
+ height: 20px;
+ margin-inline-end: 8px;
+ mask: url(activation_code_page_checked.svg) no-repeat center;
+ padding-inline-end: var(--cr-section-padding);
+ width: 20px;
+ }
+ </style>
+ <div class="two-line no-padding" selectable>
+ <div class="flex layout horizontal center link-wrapper">
+ <div id="details" no-flex$="false">
+ <!-- TODO(crbug.com/1093185): Update with real profile image. -->
+ <img id="profileImage" src="../../../images/200-logo_googleg.png">
+ <div class="flex settings-box-text">
+ <div id="profileTitleLabel">
+ [[profile.name]]
+ </div>
+ <div id="profileProviderLabel">
+ [[profile.provider]]
+ </div>
+ </div>
+ </div>
+ <span id="checkmark" hidden$="[[!selected]]"
+ tabindex="-1">
+ </div>
+ </div>
+ </template>
+ <script src="profile_discovery_list_item.js"></script>
+</dom-module> \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.js
new file mode 100644
index 00000000000..a2705ddff12
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_item.js
@@ -0,0 +1,29 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * Item in the profile-discovery-list-page list displaying details of an eSIM
+ * profile.
+ */
+
+Polymer({
+ is: 'profile-discovery-list-item',
+
+ behaviors: [I18nBehavior],
+
+ properties: {
+ // TODO(crbug.com/1093185) Add type annotation when the real Profile struct
+ // is available.
+ profile: {
+ type: Object,
+ value: null,
+ },
+
+ selected: {
+ type: Boolean,
+ reflectToAttribute: true,
+ },
+ },
+});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.html
new file mode 100644
index 00000000000..a6cad8e1d48
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.html
@@ -0,0 +1,56 @@
+<link rel="import" href="../../../html/polymer.html">
+
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html">
+<link rel="import" href="base_page.html">
+<link rel="import" href="profile_discovery_list_item.html">
+
+<dom-module id="profile-discovery-list-page">
+ <template>
+ <style include="cr-shared-style iron-flex">
+ [slot='page-body'] {
+ height: 300px;
+ margin-top: -20px;
+ }
+
+ profile-discovery-list-item {
+ height: 64px;
+ }
+
+ #container {
+ height: 230px;
+ margin-top: 20px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ }
+
+ iron-list > *:not(:first-of-type) {
+ border-top: var(--cr-separator-line);
+ }
+ </style>
+ <base-page>
+ <div slot="page-body">
+ <div>[[i18n('profileListPageMessage')]]</div>
+ <div id="container" class="layout vertical flex" scrollable>
+ <iron-list id="profileList" items="[[profiles_]]"
+ scroll-target="container" selection-enabled
+ preserve-focus multi-selection
+ selected-items="{{selectedProfiles}}"
+ role="listbox"
+ aria-multiselectable="true">
+ <template>
+ <profile-discovery-list-item profile="[[item]]"
+ selected="[[isProfileSelected_(item, selectedProfiles.length)]]"
+ tabindex="0"
+ role="option"
+ aria-selected="[[isProfileSelected_(item, selectedProfiles.length)]]">
+ </profile-discovery-list-item>
+ </template>
+ </iron-list>
+ </div>
+ </div>
+ </base-page>
+ </template>
+ <script src="profile_discovery_list_page.js"></script>
+</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js
new file mode 100644
index 00000000000..7ac95a631b0
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/profile_discovery_list_page.js
@@ -0,0 +1,58 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * Page in eSIM Setup flow that displays a choice of available eSIM Profiles.
+ */
+
+Polymer({
+ is: 'profile-discovery-list-page',
+
+ behaviors: [I18nBehavior],
+
+ properties: {
+ /**
+ * TODO(crbug.com/1093185) Fetch real profiles.
+ * @type {Array<!Object>}
+ * @private
+ */
+ profiles_: {
+ type: Array,
+ value() {
+ return [
+ {
+ name: 'Profile 1',
+ provider: 'Google Fi',
+ },
+ {
+ name: 'Profile 2',
+ provider: 'Verizon',
+ },
+ {
+ name: 'Profile 3',
+ provider: 'Google Fi',
+ },
+ ];
+ },
+ },
+
+ /**
+ * @type {Array<!Object>}
+ * @private
+ */
+ selectedProfiles: {
+ type: Object,
+ notify: true,
+ },
+ },
+
+ /**
+ * @param {Object} profile
+ * @private
+ */
+ isProfileSelected_(profile) {
+ return this.selectedProfiles.some(p => p === profile);
+ }
+});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.html b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.html
index 61a391f53a6..e0d9e9cee3d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.html
@@ -29,6 +29,7 @@
url(error_2x.png) 2x);
background-position: center center;
background-repeat: no-repeat;
+ background-size: contain;
height: 100%;
width: 100%;
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js
index 4ccfeaadb04..3da72094f86 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js
@@ -71,6 +71,18 @@ cr.define('cellularSetup', function() {
delegate: Object,
/**
+ * Carrier name; used in dialog title to show the current carrier
+ * name being setup
+ * @type {string}
+ */
+ nameOfCarrierPendingSetup: {
+ type: String,
+ notify: true,
+ computed: 'getCarrierText(' +
+ 'selectedPSimPageName_, cellularMetadata_.*)',
+ },
+
+ /**
* @type {!cellularSetup.PSimUIState}
* @private
*/
@@ -112,25 +124,6 @@ cr.define('cellularSetup', function() {
type: Object,
value: null,
},
-
- /**
- * Whether try again should be shown in the button bar.
- * @private {boolean}
- */
- showTryAgainButton_: {type: Boolean, value: false},
-
- /**
- * Whether finish button should be shown in the button bar.
- * @private {boolean}
- */
- showFinishButton_: {type: Boolean, value: false},
-
- /**
- * Whether cancel button should be shown in the button bar.
- * @private {boolean}
- */
- showCancelButton_: {type: Boolean, value: false},
-
},
observers: [
@@ -142,9 +135,9 @@ cr.define('cellularSetup', function() {
/**
* Provides an interface to the CellularSetup Mojo service.
- * @private {?cellular_setup.MojoInterfaceProvider}
+ * @private {?chromeos.cellularSetup.mojom.CellularSetupRemote}
*/
- mojoInterfaceProvider_: null,
+ cellularSetupRemote_: null,
/**
* Delegate responsible for routing activation started/finished events.
@@ -168,8 +161,7 @@ cr.define('cellularSetup', function() {
/** @override */
created() {
- this.mojoInterfaceProvider_ =
- cellular_setup.MojoInterfaceProviderImpl.getInstance();
+ this.cellularSetupRemote_ = cellular_setup.getCellularSetupRemote();
},
/**
@@ -220,6 +212,7 @@ cr.define('cellularSetup', function() {
done: cellularSetup.ButtonState.HIDDEN,
next: cellularSetup.ButtonState.SHOWN_BUT_DISABLED,
tryAgain: cellularSetup.ButtonState.HIDDEN,
+ skipDiscovery: cellularSetup.ButtonState.HIDDEN,
};
break;
case PSimUIState.ACTIVATION_SUCCESS:
@@ -231,6 +224,7 @@ cr.define('cellularSetup', function() {
done: cellularSetup.ButtonState.HIDDEN,
next: cellularSetup.ButtonState.SHOWN_AND_ENABLED,
tryAgain: cellularSetup.ButtonState.HIDDEN,
+ skipDiscovery: cellularSetup.ButtonState.HIDDEN,
};
break;
case PSimUIState.WAITING_FOR_ACTIVATION_TO_FINISH:
@@ -241,6 +235,7 @@ cr.define('cellularSetup', function() {
done: cellularSetup.ButtonState.SHOWN_AND_ENABLED,
next: cellularSetup.ButtonState.HIDDEN,
tryAgain: cellularSetup.ButtonState.HIDDEN,
+ skipDiscovery: cellularSetup.ButtonState.HIDDEN,
};
break;
default:
@@ -274,6 +269,15 @@ cr.define('cellularSetup', function() {
},
/** @private */
+ getCarrierText() {
+ if (this.selectedPSimPageName_ === PSimPageName.PROVISIONING &&
+ this.cellularMetadata_) {
+ return this.cellularMetadata_.carrier;
+ }
+ return '';
+ },
+
+ /** @private */
updateShowError_() {
switch (this.state_) {
case PSimUIState.TIMEOUT_START_ACTIVATION:
@@ -364,7 +368,7 @@ cr.define('cellularSetup', function() {
*/
(this));
- this.mojoInterfaceProvider_.getMojoServiceRemote()
+ this.cellularSetupRemote_
.startActivation(
this.activationDelegateReceiver_.$.bindNewPipeAndPassRemote())
.then(
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_selection_flow.js b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_selection_flow.js
index d03e0f5cdf0..16339d8e58e 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_selection_flow.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_selection_flow.js
@@ -26,13 +26,7 @@ Polymer({
},
initSubflow() {
- this.buttonState = {
- backward: cellularSetup.ButtonState.HIDDEN,
- cancel: cellularSetup.ButtonState.SHOWN_AND_ENABLED,
- done: cellularSetup.ButtonState.HIDDEN,
- next: cellularSetup.ButtonState.SHOWN_BUT_DISABLED,
- tryAgain: cellularSetup.ButtonState.HIDDEN
- };
+ this.updateButtonState_(this.selectedPage);
},
/**
@@ -40,20 +34,27 @@ Polymer({
* @private
*/
onSetupFlowRadioSelectedChange_(event) {
- switch (event.detail.value) {
- case cellularSetup.CellularSetupPageName.PSIM_FLOW_UI:
- this.selectedPage = cellularSetup.CellularSetupPageName.PSIM_FLOW_UI;
- this.set(
- 'buttonState.next', cellularSetup.ButtonState.SHOWN_AND_ENABLED);
- break;
- case cellularSetup.CellularSetupPageName.ESIM_FLOW_UI:
- this.selectedPage = cellularSetup.CellularSetupPageName.ESIM_FLOW_UI;
- this.set(
- 'buttonState.next', cellularSetup.ButtonState.SHOWN_AND_ENABLED);
- break;
- default:
- this.set(
- 'buttonState.next', cellularSetup.ButtonState.SHOWN_BUT_DISABLED);
- }
+ this.selectedPage = event.detail.value;
+ this.updateButtonState_(this.selectedPage);
},
+
+ /**
+ * @param {!cellularSetup.CellularSetupPageName} selectedPage
+ * @private
+ */
+ updateButtonState_(selectedPage) {
+ this.buttonState = {
+ backward: cellularSetup.ButtonState.HIDDEN,
+ cancel: cellularSetup.ButtonState.SHOWN_AND_ENABLED,
+ done: cellularSetup.ButtonState.HIDDEN,
+ tryAgain: cellularSetup.ButtonState.HIDDEN,
+ skipDiscovery: cellularSetup.ButtonState.HIDDEN,
+ };
+ if (selectedPage === cellularSetup.CellularSetupPageName.PSIM_FLOW_UI ||
+ selectedPage === cellularSetup.CellularSetupPageName.ESIM_FLOW_UI) {
+ this.buttonState.next = cellularSetup.ButtonState.SHOWN_AND_ENABLED;
+ } else {
+ this.buttonState.next = cellularSetup.ButtonState.SHOWN_BUT_DISABLED;
+ }
+ }
}); \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/DIR_METADATA b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/DIR_METADATA
new file mode 100644
index 00000000000..e2b4343fe38
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "OS>Systems>Multidevice"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/OWNERS b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/OWNERS
index 8eaf92b23b5..7027ab73e02 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/OWNERS
+++ b/chromium/ui/webui/resources/cr_components/chromeos/multidevice_setup/OWNERS
@@ -1,3 +1 @@
file://chromeos/components/multidevice/OWNERS
-
-# COMPONENT: OS>Systems>Multidevice
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
index 271c35c2bb0..1a9096bdc1b 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
@@ -205,6 +205,7 @@ js_library("network_list") {
deps = [
":network_list_types",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior",
+ "//ui/webui/resources/js:list_property_update_behavior",
]
}
@@ -214,6 +215,7 @@ js_library("network_list_item") {
":network_list_types",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:i18n_behavior",
+ "//ui/webui/resources/js/cr/ui:focus_row_behavior",
]
}
@@ -277,6 +279,10 @@ js_type_check("closure_compile_module") {
":network_siminfo.m",
":onc_mojo.m",
]
+
+ # closure_flags = default_closure_args + [
+ # "js_module_root=../../ui/webui/resources/js/",
+ # "js_module_root=./gen/ui/webui/resources/js/"]
}
js_library("mojo_interface_provider.m") {
@@ -432,9 +438,12 @@ js_library("network_ip_config.m") {
js_library("network_list.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/network/network_list.m.js" ]
deps = [
+ ":network_list_item.m",
+ ":network_list_types.m",
"//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
+ "//ui/webui/resources/js:list_property_update_behavior.m",
]
extra_deps = [ ":network_list_module" ]
}
@@ -442,7 +451,9 @@ js_library("network_list.m") {
js_library("network_list_item.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/network/network_list_item.m.js" ]
deps = [
+ ":network_list_types.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+ "//ui/webui/resources/js/cr/ui:focus_row_behavior.m",
]
extra_deps = [ ":network_list_item_module" ]
}
@@ -552,6 +563,7 @@ js_library("network_select.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/network/network_select.m.js" ]
deps = [
":network_list.m",
+ ":network_list_types.m",
":network_listener_behavior.m",
":onc_mojo.m",
"//third_party/polymer/v3_0/components-chromium/paper-progress:paper-progress",
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/DIR_METADATA b/chromium/ui/webui/resources/cr_components/chromeos/network/DIR_METADATA
new file mode 100644
index 00000000000..7b39ab306d9
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "OS>Systems>Network>General"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS b/chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS
index dce98057e78..6d4883dabc4 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/OWNERS
@@ -1,3 +1 @@
file://chrome/browser/resources/settings/chromeos/internet_page/OWNERS
-
-# COMPONENT: OS>Systems>Network
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js b/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js
index 21cb6cf04f6..3587a0dcffa 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js
@@ -97,6 +97,42 @@
},
/**
+ * @param {!chromeos.networkConfig.mojom.ManagedBoolean|
+ * !chromeos.networkConfig.mojom.ManagedInt32|
+ * !chromeos.networkConfig.mojom.ManagedString|
+ * !chromeos.networkConfig.mojom.ManagedStringList|
+ * !chromeos.networkConfig.mojom.ManagedApnList} property
+ * @return {boolean|number|string|!Array<string>|
+ * !Array<!chromeos.networkConfig.mojom.ApnProperties>|null}
+ * |property.policyValue| if the property is policy-enforced or null
+ * otherwise.
+ */
+ getEnforcedPolicyValue(property) {
+ if (!property || !this.isNetworkPolicyEnforced(property)) {
+ return null;
+ }
+ return property.policyValue === undefined ? null : property.policyValue;
+ },
+
+ /**
+ * @param {!chromeos.networkConfig.mojom.ManagedBoolean|
+ * !chromeos.networkConfig.mojom.ManagedInt32|
+ * !chromeos.networkConfig.mojom.ManagedString|
+ * !chromeos.networkConfig.mojom.ManagedStringList|
+ * !chromeos.networkConfig.mojom.ManagedApnList} property
+ * @return {boolean|number|string|!Array<string>|
+ * !Array<!chromeos.networkConfig.mojom.ApnProperties>|null}
+ * |property.policyValue| if the property is policy-recommended or
+ * null otherwise.
+ */
+ getRecommendedPolicyValue(property) {
+ if (!property || !this.isNetworkPolicyRecommended(property)) {
+ return null;
+ }
+ return property.policyValue === undefined ? null : property.policyValue;
+ },
+
+ /**
* @param {!chromeos.networkConfig.mojom.OncSource} source
* @return {boolean}
* @protected
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js
index d15f3273b8a..9a9fe325cf0 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -595,10 +595,9 @@ Polymer({
if (this.mojoType_ === mojom.NetworkType.kVPN) {
let saveCredentials = false;
const vpn = managedProperties.typeProperties.vpn;
- const vpnType = vpn.type && vpn.type.value;
- if (vpnType === mojom.VpnType.kOpenVPN) {
+ if (vpn.type === mojom.VpnType.kOpenVPN) {
saveCredentials = this.getActiveBoolean_(vpn.openVpn.saveCredentials);
- } else if (vpnType === mojom.VpnType.kL2TPIPsec) {
+ } else if (vpn.type === mojom.VpnType.kL2TPIPsec) {
saveCredentials = this.getActiveBoolean_(vpn.ipSec.saveCredentials) ||
this.getActiveBoolean_(vpn.l2tp.saveCredentials);
}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
index 97534abd228..7994ae85c99 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
@@ -42,7 +42,7 @@ const getRoutingPrefixAsNetmask = function(prefixLength) {
/**
* Returns the routing prefix length as a number from the netmask string.
- * @param {string} netmask The netmask string, e.g. 255.255.255.0.
+ * @param {string|undefined} netmask The netmask string, e.g. 255.255.255.0.
* @return {number} The corresponding netmask or NO_ROUTING_PREFIX if invalid.
*/
const getRoutingPrefixAsLength = function(netmask) {
@@ -128,7 +128,7 @@ Polymer({
value() {
return [
'ipv4.ipAddress',
- 'ipv4.routingPrefix',
+ 'ipv4.netmask',
'ipv4.gateway',
'ipv6.ipAddress',
];
@@ -163,11 +163,8 @@ Polymer({
}
// Update the 'automatic' property.
- if (properties.ipAddressConfigType) {
- const ipConfigType =
- OncMojo.getActiveValue(properties.ipAddressConfigType);
- this.automatic_ = ipConfigType !== 'Static';
- }
+ const ipConfigType = OncMojo.getActiveValue(properties.ipAddressConfigType);
+ this.automatic_ = ipConfigType !== 'Static';
if (properties.ipConfigs || properties.staticIpConfig) {
// Update the 'ipConfig' property.
@@ -197,26 +194,51 @@ Polymer({
* @private
*/
canChangeIPConfigType_(managedProperties) {
+ if (managedProperties.type ===
+ chromeos.networkConfig.mojom.NetworkType.kCellular) {
+ // Cellular IP config properties can not be changed.
+ return false;
+ }
const ipConfigType = managedProperties.ipAddressConfigType;
return !ipConfigType || !this.isNetworkPolicyEnforced(ipConfigType);
},
+ /**
+ * Overrides null values of |ipv4| with defaults so |ipv4| passes validation
+ * after being converted to ONC StaticIPConfig.
+ * TODO(https://crbug.com/1148841): Setting defaults here is strange, find
+ * some better way.
+ * @param {!OncMojo.IPConfigUIProperties} ipv4 this will be modified in place
+ * @private
+ */
+ setIpv4Defaults_(ipv4) {
+ if (!ipv4.gateway) {
+ ipv4.gateway = '192.168.1.1';
+ }
+ if (!ipv4.ipAddress) {
+ ipv4.ipAddress = '192.168.1.1';
+ }
+ if (!ipv4.netmask) {
+ ipv4.netmask = '255.255.255.0';
+ }
+ if (!ipv4.type) {
+ ipv4.type = 'IPv4';
+ }
+ },
+
/** @private */
onAutomaticChange_() {
if (!this.automatic_) {
- const defaultIpv4 = {
- gateway: '192.168.1.1',
- ipAddress: '192.168.1.1',
- routingPrefix: '255.255.255.0',
- type: 'IPv4',
- };
- // Ensure that there is a valid IPConfig object. Copy any set properties
- // over the default properties to ensure all properties are set.
- if (this.ipConfig_) {
- this.ipConfig_.ipv4 = Object.assign(defaultIpv4, this.ipConfig_.ipv4);
- } else {
- this.ipConfig_ = {ipv4: defaultIpv4};
+ if (!this.ipConfig_) {
+ this.ipConfig_ = {};
+ }
+ if (this.savedStaticIp_) {
+ this.ipConfig_.ipv4 = this.savedStaticIp_;
+ }
+ if (!this.ipConfig_.ipv4) {
+ this.ipConfig_.ipv4 = {};
}
+ this.setIpv4Defaults_(this.ipConfig_.ipv4);
this.sendStaticIpConfig_();
return;
}
@@ -235,9 +257,9 @@ Polymer({
* @param {!chromeos.networkConfig.mojom.IPConfigProperties|undefined}
* ipconfig
* @return {!OncMojo.IPConfigUIProperties|undefined} A new
- * IPConfigUIProperties object with routingPrefix expressed as a string
- * mask instead of a prefix length. Returns undefined if |ipconfig| is not
- * defined.
+ * IPConfigUIProperties object with routingPrefix expressed as a netmask
+ * string instead of a prefix length. Returns undefined if |ipconfig|
+ * is not defined.
* @private
*/
getIPConfigUIProperties_(ipconfig) {
@@ -245,39 +267,39 @@ Polymer({
return undefined;
}
- // Copy |ipconfig| into a new object, |newIpconfig|.
- const newIpconfig = {};
- Object.assign(newIpconfig, ipconfig);
+ // Copy |ipconfig| properties into |ipconfigUI|.
+ const ipconfigUI = {};
+ ipconfigUI.gateway = ipconfig.gateway;
+ ipconfigUI.ipAddress = ipconfig.ipAddress;
+ ipconfigUI.nameServers = ipconfig.nameServers;
+ ipconfigUI.type = ipconfig.type;
+ ipconfigUI.webProxyAutoDiscoveryUrl = ipconfig.webProxyAutoDiscoveryUrl;
if (ipconfig.routingPrefix !==
chromeos.networkConfig.mojom.NO_ROUTING_PREFIX) {
- const netmask = getRoutingPrefixAsNetmask(ipconfig.routingPrefix);
- if (netmask !== undefined) {
- newIpconfig.routingPrefix = netmask;
- }
+ ipconfigUI.netmask = getRoutingPrefixAsNetmask(ipconfig.routingPrefix);
}
- return newIpconfig;
+ return ipconfigUI;
},
/**
- * @param {!OncMojo.IPConfigUIProperties} ipconfig
+ * @param {!OncMojo.IPConfigUIProperties} ipconfigUI
* @return {!chromeos.networkConfig.mojom.IPConfigProperties} A new
- * IPConfigProperties object with RoutingPrefix expressed as a a prefix
+ * IPConfigProperties object with netmask expressed as a a prefix
* length.
* @private
*/
- getIPConfigProperties_(ipconfig) {
- const result = {};
- for (const key in ipconfig) {
- const value = ipconfig[key];
- if (key === 'routingPrefix') {
- result.routingPrefix = getRoutingPrefixAsLength(value);
- } else {
- result[key] = value;
- }
- }
- return result;
+ getIPConfigProperties_(ipconfigUI) {
+ const ipconfig = {};
+ ipconfig.gateway = ipconfigUI.gateway;
+ ipconfig.ipAddress = ipconfigUI.ipAddress;
+ ipconfig.nameServers = ipconfigUI.nameServers;
+ ipconfig.routingPrefix = getRoutingPrefixAsLength(ipconfigUI.netmask);
+ ipconfig.type = ipconfigUI.type;
+ ipconfig.webProxyAutoDiscoveryUrl = ipconfigUI.webProxyAutoDiscoveryUrl;
+
+ return ipconfig;
},
/**
@@ -291,11 +313,7 @@ Polymer({
for (let i = 0; i < this.ipConfigFields_.length; ++i) {
const key = this.ipConfigFields_[i];
const value = this.get(key, this.ipConfig_);
- if (key === 'ipv4.routingPrefix') {
- if (value !== chromeos.networkConfig.mojom.NO_ROUTING_PREFIX) {
- return true;
- }
- } else if (value !== undefined && value !== '') {
+ if (value !== undefined && value !== '') {
return true;
}
}
@@ -323,8 +341,10 @@ Polymer({
}
return {
'ipv4.ipAddress': this.getIPFieldEditType_(staticIpConfig.ipAddress),
- 'ipv4.routingPrefix':
- this.getIPFieldEditType_(staticIpConfig.routingPrefix),
+ // Use routingPrefix instead of netmask because getIPFieldEditType_
+ // expects a ManagedProperty and routingPrefix has the same type as
+ // netmask.
+ 'ipv4.netmask': this.getIPFieldEditType_(staticIpConfig.routingPrefix),
'ipv4.gateway': this.getIPFieldEditType_(staticIpConfig.gateway)
};
},
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.html
index a4732962b83..67c933d9669 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.html
@@ -1,17 +1,16 @@
<link rel="import" href="../../../html/polymer.html">
<link rel="import" href="network_list_item.html">
+<link rel="import" href="network_list_types.html">
<link rel="import" href="../../../cr_elements/cr_scrollable_behavior.html">
<link rel="import" href="../../../cr_elements/shared_style_css.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html">
+<link rel="import" href="../../../html/list_property_update_behavior.html">
<dom-module id="network-list">
<template>
<style include="cr-shared-style iron-flex">
- :host {
- display: inline-flex;
- }
network-list-item {
align-items: center;
@@ -35,13 +34,18 @@
</style>
<div id="container" class="layout vertical flex" scrollable
no-bottom-scroll-border$="[[noBottomScrollBorder]]">
- <iron-list id="networkList" selection-enabled items="[[listItems_]]"
- scroll-target="container" selected-item="{{selectedItem}}">
+ <iron-list id="networkList" items="[[listItems_]]"
+ scroll-target="container" preserve-focus>
<template>
<network-list-item item="[[item]]"
show-technology-badge="[[showTechnologyBadge]]"
- show-buttons="[[showButtons]]" tabindex$="[[tabIndex]]"
+ show-buttons="[[showButtons]]"
+ tabindex$="[[tabIndex]]"
+ focus-row-index="[[index]]"
+ iron-list-tab-index="[[tabIndex]]"
activation-unavailable="[[activationUnavailable]]"
+ last-focused="{{lastFocused_}}"
+ list-blurred="{{listBlurred_}}"
device-state="[[deviceState]]">
</network-list-item>
</template>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.js
index 77c50ebf42e..7e8190e6f03 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list.js
@@ -74,12 +74,49 @@ Polymer({
return [];
},
},
+
+ /**
+ * Used by FocusRowBehavior to track the last focused element on a row.
+ * @private
+ */
+ lastFocused_: Object,
+
+ /**
+ * Used by FocusRowBehavior to track if the list has been blurred.
+ * @private
+ */
+ listBlurred_: Boolean,
},
- behaviors: [CrScrollableBehavior],
+ behaviors: [CrScrollableBehavior, ListPropertyUpdateBehavior],
observers: ['updateListItems_(networks, customItems)'],
+ /** @type {ResizeObserver} used to observer size changes to this element */
+ resizeObserver_: null,
+
+ /** @override */
+ attached() {
+ // This is a required work around to get the iron-list to display on first
+ // view. Currently iron-list won't generate item elements on attach if the
+ // element is not visible. Because there are some instances where this
+ // component might not be visible when the items are bound, we listen for
+ // resize events and manually call notifyResize on the iron-list
+ this.resizeObserver_ = new ResizeObserver(entries => {
+ const networkList =
+ /** @type {IronListElement} */ (this.$$('#networkList'));
+ if (networkList) {
+ networkList.notifyResize();
+ }
+ });
+ this.resizeObserver_.observe(this);
+ },
+
+ /** @override */
+ detached() {
+ this.resizeObserver_.disconnect();
+ },
+
/** @private {boolean} */
focusRequested_: false,
@@ -89,16 +126,15 @@ Polymer({
},
/** @private */
- updateListItems_() {
- this.saveScroll(/** @type {!IronListElement} */ (this.$.networkList));
- const beforeNetworks = this.customItems.filter(function(item) {
- return item.showBeforeNetworksList === true;
- });
- const afterNetworks = this.customItems.filter(function(item) {
- return item.showBeforeNetworksList !== true;
- });
- this.listItems_ = beforeNetworks.concat(this.networks, afterNetworks);
- this.restoreScroll(/** @type {!IronListElement} */ (this.$.networkList));
+ updateListItems_: function() {
+ const beforeNetworks =
+ this.customItems.filter(n => n.showBeforeNetworksList === true);
+ const afterNetworks =
+ this.customItems.filter(n => n.showBeforeNetworksList === false);
+ const newList = beforeNetworks.concat(this.networks, afterNetworks);
+
+ this.updateList('listItems_', item => item.guid, newList);
+
this.updateScrollableContents();
if (this.focusRequested_) {
this.async(function() {
@@ -117,28 +153,4 @@ Polymer({
item.focus();
this.focusRequested_ = false;
},
-
- /**
- * Use iron-list selection (which is not the same as focus) to trigger
- * tap (requires selection-enabled) or keyboard selection.
- * @private
- */
- selectedItemChanged_() {
- if (this.selectedItem) {
- this.onItemAction_(this.selectedItem);
- }
- },
-
- /**
- * @param {!NetworkList.NetworkListItemType} item
- * @private
- */
- onItemAction_(item) {
- if (item.hasOwnProperty('customItemName')) {
- this.fire('custom-item-selected', item);
- } else {
- this.fire('selected', item);
- this.focusRequested_ = true;
- }
- },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html
index e760d59f223..a2347543db2 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.html
@@ -7,8 +7,10 @@
<link rel="import" href="../../../cr_elements/shared_style_css.html">
<link rel="import" href="../../../cr_elements/shared_vars_css.html">
<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="../../../html/cr/ui/focus_row_behavior.html">
<link rel="import" href="cr_policy_network_behavior_mojo.html">
<link rel="import" href="network_icon.html">
+<link rel="import" href="network_list_types.html">
<link rel="import" href="onc_mojo.html">
<dom-module id="network-list-item">
@@ -20,6 +22,7 @@
}
#divOuter {
+ height: 100%;
padding-inline-end: var(--cr-icon-ripple-padding);
}
@@ -53,40 +56,61 @@
cr-policy-indicator {
padding: 0 var(--cr-controlled-by-spacing);
}
+
+ #wrapper {
+ height: 100%;
+ }
</style>
- <div id="divOuter"
- class="layout horizontal center flex" actionable>
- <template is="dom-if" if="[[networkState]]">
- <network-icon is-list-item
- show-technology-badge="[[showTechnologyBadge]]"
- network-state="[[networkState]]">
- </network-icon>
- </template>
- <template is="dom-if" if="[[item.polymerIcon]]">
- <iron-icon icon="[[item.polymerIcon]]"></iron-icon>
- </template>
- <div id="divText" class="layout horizontal flex">
- <div aria-hidden="true">[[getItemName_(item)]]</div>
- <div id="networkStateText"
- class="cr-secondary-text"
- hidden$="[[!isStateTextVisible_(networkState)]]"
- active$="[[isStateTextActive_(networkState,
- activationUnavailable)]]">
- [[getNetworkStateText_(networkState, activationUnavailable)]]
+ <div id="wrapper" focus-row-container
+ class="layout horizontal center flex">
+ <div id="divOuter"
+ class="layout horizontal center flex"
+ actionable
+ focus-row-control
+ selectable
+ aria-label$="[[rowLabel]]"
+ aria-live="[[getLiveStatus_(isFocused)]]"
+ role="button"
+ focus-type="rowWrapper"
+ on-keydown="onKeydown_"
+ on-click="onSelected_">
+ <template is="dom-if" if="[[networkState]]">
+ <network-icon is-list-item
+ show-technology-badge="[[showTechnologyBadge]]"
+ network-state="[[networkState]]">
+ </network-icon>
+ </template>
+ <template is="dom-if" if="[[item.polymerIcon]]">
+ <iron-icon icon="[[item.polymerIcon]]"></iron-icon>
+ </template>
+ <div id="divText" class="layout horizontal flex">
+ <div aria-hidden="true">[[getItemName_(item)]]</div>
+ <div id="networkStateText"
+ class="cr-secondary-text"
+ hidden$="[[!isStateTextVisible_(networkState)]]"
+ active$="[[isStateTextActive_(networkState,
+ activationUnavailable)]]">
+ [[getNetworkStateText_(networkState, activationUnavailable)]]
+ </div>
</div>
+ <template is="dom-if" if="[[isPolicySource(networkState.source)]]">
+ <cr-policy-indicator indicator-type="[[getIndicatorTypeForSource(
+ networkState.source)]]">
+ </cr-policy-indicator>
+ </template>
+ <template is="dom-if" if="[[isSubpageButtonVisible_(networkState, showButtons)]]" restamp>
+ <div>
+ <cr-icon-button class="subpage-arrow"
+ id="subpage-button"
+ on-click="onSubpageArrowClick_"
+ tabindex$="[[tabindex]]"
+ aria-label$="[[buttonLabel]]"
+ focus-row-control
+ focus-type="subpageButton">
+ </cr-icon-button>
+ </div>
+ </template>
</div>
- <template is="dom-if" if="[[isPolicySource(networkState.source)]]">
- <cr-policy-indicator indicator-type="[[getIndicatorTypeForSource(
- networkState.source)]]">
- </cr-policy-indicator>
- </template>
- <template is="dom-if"
- if="[[isSubpageButtonVisible_(networkState, showButtons)]]" restamp>
- <cr-icon-button class="subpage-arrow" id="subpage-button"
- on-click="onSubpageArrowClick_" tabindex$="[[tabindex]]"
- aria-label$="[[buttonLabel]]">
- </cr-icon-button>
- </template>
</div>
</template>
<script src="network_list_item.js"></script>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
index c9a66919de1..91d70ebcdc2 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
@@ -13,6 +13,7 @@ Polymer({
behaviors: [
CrPolicyNetworkBehaviorMojo,
I18nBehavior,
+ cr.ui.FocusRowBehavior,
],
properties: {
@@ -45,7 +46,6 @@ Polymer({
tabindex: {
type: Number,
value: -1,
- reflectToAttribute: true,
},
/**
@@ -53,11 +53,10 @@ Polymer({
* added as an attribute on this top-level network-list-item, and can
* be used by any sub-element which applies it.
*/
- ariaLabel: {
+ rowLabel: {
type: String,
notify: true,
- reflectToAttribute: true,
- computed: 'getAriaLabel_(item, networkState)',
+ computed: 'getRowLabel_(item, networkState)',
},
buttonLabel: {
@@ -162,7 +161,7 @@ Polymer({
* @return {string}
* @private
*/
- getAriaLabel_() {
+ getRowLabel_() {
const NetworkType = chromeos.networkConfig.mojom.NetworkType;
const OncSource = chromeos.networkConfig.mojom.OncSource;
const SecurityType = chromeos.networkConfig.mojom.SecurityType;
@@ -344,15 +343,11 @@ Polymer({
* @private
*/
onKeydown_(event) {
- // The only key event handled by this element is pressing Enter when the
- // subpage arrow is focused.
- if (event.key !== 'Enter' ||
- !this.isSubpageButtonVisible_(this.networkState, this.showButtons) ||
- this.$$('#subpage-button') !== this.shadowRoot.activeElement) {
+ if (event.key !== 'Enter' && event.key !== ' ') {
return;
}
- this.fireShowDetails_(event);
+ this.onSelected_(event);
// The default event for pressing Enter on a focused button is to simulate a
// click on the button. Prevent this action, since it would navigate a
@@ -362,6 +357,22 @@ Polymer({
},
/**
+ * @param {!Event} event
+ * @private
+ */
+ onSelected_(event) {
+ if (this.isSubpageButtonVisible_(this.networkState, this.showButtons) &&
+ this.$$('#subpage-button') === this.shadowRoot.activeElement) {
+ this.fireShowDetails_(event);
+ } else if (this.item.hasOwnProperty('customItemName')) {
+ this.fire('custom-item-selected', this.item);
+ } else {
+ this.fire('selected', this.item);
+ this.focusRequested_ = true;
+ }
+ },
+
+ /**
* @param {!MouseEvent} event
* @private
*/
@@ -396,4 +407,17 @@ Polymer({
this.networkState.typeState.cellular.activationState !==
mojom.ActivationStateType.kActivated;
},
+
+ /**
+ * When the row is focused, this enables aria-live in "polite" mode to notify
+ * a11y users when details about the network change or when the list gets
+ * re-ordered because of changing signal strengths.
+ * @param {boolean} isFocused
+ * @return {string}
+ * @private
+ */
+ getLiveStatus_(isFocused) {
+ // isFocused is supplied by FocusRowBehavior.
+ return this.isFocused ? 'polite' : 'off';
+ },
});
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.js
index a98bcf66a95..e8efab5ccfd 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_list_types.js
@@ -8,7 +8,7 @@
* NetworkListItem.
*/
-const NetworkList = {};
+/* #export */ const NetworkList = {};
/**
* Custom data for implementation specific network list items.
@@ -23,5 +23,3 @@ NetworkList.CustomItemState;
/** @typedef {OncMojo.NetworkStateProperties|NetworkList.CustomItemState} */
NetworkList.NetworkListItemType;
-
-// #export {NetworkList}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html
index b5d635d771c..4cd9b911e4d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html
@@ -67,43 +67,46 @@
on-selected-changed="onTypeChange_"
aria-label="[[i18n('networkNameservers')]]">
<!-- Automatic nameservers -->
- <cr-radio-button name="automatic" disabled="[[!canChangeConfigType_]]">
+ <cr-radio-button name="[[nameserversTypeEnum_.AUTOMATIC]]"
+ disabled="[[!canChangeConfigType_]]">
[[i18n('networkNameserversAutomatic')]]
</cr-radio-button>
<template is="dom-if" if="[[showNameservers_(nameserversType_,
- 'automatic', nameservers_)]]">
+ nameserversTypeEnum_.AUTOMATIC, nameservers_)]]">
<div class="nameservers" changeable$="[[canChangeConfigType_]]">
[[getNameserversString_(nameservers_)]]
</div>
</template>
<!-- Google nameservers -->
- <cr-radio-button name="google" disabled="[[!canChangeConfigType_]]">
+ <cr-radio-button name="[[nameserversTypeEnum_.GOOGLE]]"
+ disabled="[[!canChangeConfigType_]]">
[[i18n('networkNameserversGoogle')]]
<template is="dom-if"
if="[[i18nExists('networkGoogleNameserversLearnMoreUrl')]]">
<a href="[[i18n('networkGoogleNameserversLearnMoreUrl')]]"
- target="_blank" on-tap="doNothing_">
+ target="_blank" on-click="doNothing_">
[[i18n('networkNameserversLearnMore')]]
</a>
</template>
</cr-radio-button>
<template is="dom-if" if="[[showNameservers_(nameserversType_,
- 'google', nameservers_)]]">
+ nameserversTypeEnum_.GOOGLE, nameservers_)]]">
<div class="nameservers" changeable>
[[getNameserversString_(nameservers_)]]
</div>
</template>
<!-- Custom nameservers -->
- <cr-radio-button name="custom" disabled="[[!canChangeConfigType_]]">
+ <cr-radio-button name="[[nameserversTypeEnum_.CUSTOM]]"
+ disabled="[[!canChangeConfigType_]]">
[[i18n('networkNameserversCustom')]]
</cr-radio-button>
<template is="dom-if" if="[[showNameservers_(nameserversType_,
- 'custom')]]">
+ nameserversTypeEnum_.CUSTOM)]]">
<div class="property-box single-column two-line">
<template is="dom-repeat" items="[[nameservers_]]">
- <cr-input id="nameserver[[index]]" value="[[item]]"
+ <cr-input id="nameserver[[index]]" value="{{item}}"
aria-label="[[getCustomNameServerInputA11yLabel_(index)]]"
on-change="onValueChange_"
disabled="[[!canEditCustomNameServers_(nameserversType_,
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
index a7025298708..9a69c00b7d0 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
@@ -5,6 +5,17 @@
/**
* @fileoverview Polymer element for displaying network nameserver options.
*/
+
+/**
+ * UI configuration options for nameservers.
+ * @enum {string}
+ */
+const NameserversType = {
+ AUTOMATIC: 'automatic',
+ CUSTOM: 'custom',
+ GOOGLE: 'google'
+};
+
Polymer({
is: 'network-nameservers',
@@ -30,11 +41,21 @@ Polymer({
/**
* The selected nameserver type.
- * @private
+ * @private {!NameserversType}
*/
nameserversType_: {
type: String,
- value: 'automatic',
+ value: NameserversType.AUTOMATIC,
+ },
+
+ /**
+ * Enum values for |nameserversType_|.
+ * @private {NameserversType}
+ */
+ nameserversTypeEnum_: {
+ readOnly: true,
+ type: Object,
+ value: NameserversType,
},
/** @private */
@@ -66,10 +87,18 @@ Polymer({
MAX_NAMESERVERS: 4,
/**
- * Saved nameservers when switching to 'automatic'.
+ * Saved nameservers from the NameserversType.CUSTOM tab. If this is empty, it
+ * means that the user has not entered any custom nameservers yet.
* @private {!Array<string>}
*/
- savedNameservers_: [],
+ savedCustomNameservers_: [],
+
+ /**
+ * The last manually performed selection of the nameserver type. If this is
+ * null, no explicit selection has been done for this network yet.
+ * @private {?NameserversType}
+ */
+ savedNameserversType_: null,
/*
* Returns the nameserver type CrRadioGroupElement.
@@ -80,36 +109,67 @@ Polymer({
},
/**
+ * Returns true if the nameservers in |nameservers1| match the nameservers in
+ * |nameservers2|, ignoring order and empty / 0.0.0.0 entries.
+ * @param {!Array<string>} nameservers1
+ * @param {!Array<string>} nameservers2
+ */
+ nameserversMatch_(nameservers1, nameservers2) {
+ const nonEmptySortedNameservers1 =
+ this.clearEmptyNameServers_(nameservers1).sort();
+ const nonEmptySortedNameservers2 =
+ this.clearEmptyNameServers_(nameservers2).sort();
+ if (nonEmptySortedNameservers1.length !==
+ nonEmptySortedNameservers2.length) {
+ return false;
+ }
+ for (let i = 0; i < nonEmptySortedNameservers1.length; i++) {
+ if (nonEmptySortedNameservers1[i] !== nonEmptySortedNameservers2[i]) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ /**
* Returns true if |nameservers| contains any all google nameserver entries
* and only google nameserver entries or empty entries.
* @param {!Array<string>} nameservers
* @private
*/
isGoogleNameservers_(nameservers) {
- const matches = [];
- for (let i = 0; i < nameservers.length; ++i) {
- const nameserver = nameservers[i];
- if (nameserver === this.EMPTY_NAMESERVER) {
- continue;
- }
- let valid = false;
- for (let j = 0; j < this.GOOGLE_NAMESERVERS.length; ++j) {
- if (nameserver === this.GOOGLE_NAMESERVERS[j]) {
- valid = true;
- matches[j] = true;
- break;
- }
- }
- if (!valid) {
- return false;
- }
+ return this.nameserversMatch_(nameservers, this.GOOGLE_NAMESERVERS);
+ },
+
+ /**
+ * Returns the nameservers enforced by policy. If nameservers are not being
+ * enforced, returns null.
+ * @return {Array<string>|null}
+ */
+ getPolicyEnforcedNameservers_() {
+ const staticIpConfig =
+ this.managedProperties && this.managedProperties.staticIpConfig;
+ if (!staticIpConfig || !staticIpConfig.nameServers) {
+ return null;
}
- for (let j = 0; j < this.GOOGLE_NAMESERVERS.length; ++j) {
- if (!matches[j]) {
- return false;
- }
+ return /** @type {Array<string>|null} */ (
+ this.getEnforcedPolicyValue(staticIpConfig.nameServers));
+ },
+
+ /**
+ * Returns the nameservers recommended by policy. If nameservers are not being
+ * recommended, returns null. Note: also returns null if nameservers are being
+ * enforced by policy.
+ * @return {Array<string>|null}
+ */
+ getPolicyRecommendedNameservers_() {
+ const staticIpConfig =
+ this.managedProperties && this.managedProperties.staticIpConfig;
+ if (!staticIpConfig || !staticIpConfig.nameServers) {
+ return null;
}
- return true;
+ return /** @type {Array<string>|null} */ (
+ this.getRecommendedPolicyValue(staticIpConfig.nameServers));
},
/** @private */
@@ -119,62 +179,57 @@ Polymer({
}
if (!oldValue || newValue.guid !== oldValue.guid) {
- this.savedNameservers_ = [];
+ this.savedCustomNameservers_ = [];
+ this.savedNameserversType_ = null;
}
// Update the 'nameservers' property.
let nameservers = [];
const ipv4 = OncMojo.getIPConfigForType(this.managedProperties, 'IPv4');
if (ipv4 && ipv4.nameServers) {
- nameservers = ipv4.nameServers;
+ nameservers = ipv4.nameServers.slice();
}
// Update the 'nameserversType' property.
- let configType;
- if (this.managedProperties.nameServersConfigType) {
- configType =
- OncMojo.getActiveValue(this.managedProperties.nameServersConfigType);
- }
- let type;
+ const configType =
+ OncMojo.getActiveValue(this.managedProperties.nameServersConfigType);
+ /** @type {NameserversType} */ let type;
if (configType === 'Static') {
- if (this.isGoogleNameservers_(nameservers)) {
- type = 'google';
+ if (this.isGoogleNameservers_(nameservers) &&
+ this.savedNameserversType_ !== NameserversType.CUSTOM) {
+ type = NameserversType.GOOGLE;
nameservers = this.GOOGLE_NAMESERVERS; // Use consistent order.
} else {
- type = 'custom';
+ type = NameserversType.CUSTOM;
}
} else {
- type = 'automatic';
+ type = NameserversType.AUTOMATIC;
nameservers = this.clearEmptyNameServers_(nameservers);
}
this.setNameservers_(type, nameservers, false /* send */);
},
/**
- * @param {string} nameserversType
+ * @param {!NameserversType} nameserversType
* @param {!Array<string>} nameservers
* @param {boolean} sendNameservers If true, send the nameservers once they
* have been set in the UI.
* @private
*/
setNameservers_(nameserversType, nameservers, sendNameservers) {
- if (nameserversType === 'custom') {
+ if (nameserversType === NameserversType.CUSTOM) {
// Add empty entries for unset custom nameservers.
for (let i = nameservers.length; i < this.MAX_NAMESERVERS; ++i) {
nameservers[i] = this.EMPTY_NAMESERVER;
}
- if (!this.isGoogleNameservers_(nameservers)) {
- this.savedNameservers_ = nameservers.slice();
- }
+ } else {
+ nameservers = this.clearEmptyNameServers_(nameservers);
}
this.nameservers_ = nameservers;
- // Set nameserversType_ after dom-repeat has been stamped.
- this.async(() => {
- this.nameserversType_ = nameserversType;
- if (sendNameservers) {
- this.sendNameServers_();
- }
- });
+ this.nameserversType_ = nameserversType;
+ if (sendNameservers) {
+ this.sendNameServers_();
+ }
},
/**
@@ -186,14 +241,7 @@ Polymer({
if (!managedProperties) {
return false;
}
- if (managedProperties.nameServersConfigType &&
- this.isNetworkPolicyEnforced(managedProperties.nameServersConfigType)) {
- return false;
- }
- if (managedProperties.staticIpConfig &&
- managedProperties.staticIpConfig.nameServers &&
- this.isNetworkPolicyEnforced(
- managedProperties.staticIpConfig.nameServers)) {
+ if (this.isNetworkPolicyEnforced(managedProperties.nameServersConfigType)) {
return false;
}
return true;
@@ -209,11 +257,10 @@ Polymer({
if (!managedProperties) {
return false;
}
- if (nameserversType !== 'custom') {
+ if (nameserversType !== NameserversType.CUSTOM) {
return false;
}
- if (managedProperties.nameServersConfigType &&
- this.isNetworkPolicyEnforced(managedProperties.nameServersConfigType)) {
+ if (this.isNetworkPolicyEnforced(managedProperties.nameServersConfigType)) {
return false;
}
if (managedProperties.staticIpConfig &&
@@ -226,8 +273,8 @@ Polymer({
},
/**
- * @param {string} nameserversType
- * @param {string} type
+ * @param {NameserversType} nameserversType
+ * @param {NameserversType} type
* @param {!Array<string>} nameservers
* @return {boolean}
* @private
@@ -236,7 +283,7 @@ Polymer({
if (nameserversType !== type) {
return false;
}
- return type === 'custom' || nameservers.length > 0;
+ return type === NameserversType.CUSTOM || nameservers.length > 0;
},
/**
@@ -249,6 +296,37 @@ Polymer({
},
/**
+ * Returns currently configured custom nameservers, to be used when toggling
+ * to 'custom' from 'automatic' or 'google', prefer nameservers in the
+ * following priority:
+ *
+ * 1) policy-enforced nameservers,
+ * 2) previously manually entered nameservers (|savedCustomNameservers_|),
+ * 3) policy-recommended nameservers,
+ * 4) active nameservers (e.g. from DHCP).
+ * @return {!Array<string>} nameservers
+ * @private
+ */
+ getCustomNameServers_() {
+ const policyEnforcedNameservers = this.getPolicyEnforcedNameservers_();
+ if (policyEnforcedNameservers !== null) {
+ return policyEnforcedNameservers.slice();
+ }
+
+ if (this.savedCustomNameservers_.length > 0) {
+ return this.savedCustomNameservers_;
+ }
+
+ const policyRecommendedNameservers =
+ this.getPolicyRecommendedNameservers_();
+ if (policyRecommendedNameservers !== null) {
+ return policyRecommendedNameservers.slice();
+ }
+
+ return this.nameservers_;
+ },
+
+ /**
* Event triggered when the selected type changes. Updates nameservers and
* sends the change value if necessary.
* @private
@@ -256,24 +334,24 @@ Polymer({
onTypeChange_() {
const type = this.$$('#nameserverType').selected;
this.nameserversType_ = type;
- if (type === 'custom') {
- // Restore the saved nameservers.
- this.setNameservers_(type, this.savedNameservers_, true /* send */);
+ this.savedNameserversType_ = type;
+ if (type === NameserversType.CUSTOM) {
+ this.setNameservers_(type, this.getCustomNameServers_(), true /* send */);
return;
}
this.sendNameServers_();
},
/**
- * Event triggered when a nameserver value changes.
+ * Event triggered when a |nameservers_| value changes through the custom
+ * namservers UI.
+ * This gets called after data-binding updates a |nameservers_[i]| entry.
+ * This saves the custom nameservers and reflects that change to the backend
+ * (sending the custom nameservers).
* @private
*/
onValueChange_() {
- if (this.nameserversType_ !== 'custom') {
- // If a user inputs Google nameservers in the custom nameservers fields,
- // |nameserversType| will change to 'google' so don't send the values.
- return;
- }
+ this.savedCustomNameservers_ = this.nameservers_.slice();
this.sendNameServers_();
},
@@ -284,25 +362,18 @@ Polymer({
sendNameServers_() {
const type = this.nameserversType_;
- if (type === 'custom') {
- const nameservers = new Array(this.MAX_NAMESERVERS);
- for (let i = 0; i < this.MAX_NAMESERVERS; ++i) {
- const nameserverInput = this.$$('#nameserver' + i);
- nameservers[i] = nameserverInput ? nameserverInput.value : '';
- }
- this.nameservers_ = nameservers;
- this.savedNameservers_ = nameservers.slice();
+ if (type === NameserversType.CUSTOM) {
this.fire('nameservers-change', {
field: 'nameServers',
- value: nameservers,
+ value: this.nameservers_,
});
- } else if (type === 'google') {
+ } else if (type === NameserversType.GOOGLE) {
this.nameservers_ = this.GOOGLE_NAMESERVERS;
this.fire('nameservers-change', {
field: 'nameServers',
value: this.GOOGLE_NAMESERVERS,
});
- } else { // type === automatic
+ } else { // type === NameserversType.AUTOMATIC
// If not connected, properties will clear. Otherwise they may or may not
// change so leave them as-is.
if (!OncMojo.connectionStateIsConnected(
@@ -324,7 +395,8 @@ Polymer({
* @private
*/
clearEmptyNameServers_(nameservers) {
- return nameservers.filter((nameserver) => !!nameserver);
+ return nameservers.filter(
+ (nameserver) => (!!nameserver && nameserver !== this.EMPTY_NAMESERVER));
},
/**
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.html
index f327000afd8..12f0954885c 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.html
@@ -4,6 +4,7 @@
<link rel="import" href="../../../cr_elements/cr_input/cr_input.html">
<link rel="import" href="../../../cr_elements/shared_vars_css.html">
<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-tooltip/paper-tooltip.html">
<link rel="import" href="cr_policy_network_behavior_mojo.html">
<link rel="import" href="cr_policy_network_indicator_mojo.html">
<link rel="import" href="network_config_element_behavior.html">
@@ -22,6 +23,10 @@
flex: 1;
}
+ paper-tooltip {
+ --paper-tooltip-min-width: 0px;
+ }
+
cr-policy-network-indicator-mojo {
--cr-tooltip-icon-margin-start: var(--cr-controlled-by-spacing);
}
@@ -39,9 +44,14 @@
<template is="dom-if" if="[[!showPolicyIndicator_]]" restamp>
<cr-icon-button id="icon" slot="suffix"
class$="[[getIconClass_(showPassword)]]"
+ aria-describedby="passwordVisibilityTooltip"
on-click="onShowPasswordTap_"
- title="[[getShowPasswordTitle_(showPassword)]]">
+ on-touchend="onShowPasswordTap_">
</cr-icon-button>
+ <paper-tooltip id="passwordVisibilityTooltip" for="icon" position="left"
+ fit-to-visible-bounds role="tooltip">
+ [[getShowPasswordTitle_(showPassword)]]
+ </paper-tooltip>
</template>
<template is="dom-if" if="[[showPolicyIndicator_]]" restamp>
<cr-policy-network-indicator-mojo
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.js
index 752814ef9bb..35e14ecd6d2 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_password_input.js
@@ -90,6 +90,12 @@ Polymer({
* @private
*/
onShowPasswordTap_(event) {
+ if (event.type === 'touchend') {
+ // Prevent touch from producing secondary mouse events
+ // that may cause the tooltip to appear unnecessarily.
+ event.preventDefault();
+ }
+
if (this.isShowingPlaceholder_()) {
// Never show the actual placeholder, clear the field instead.
this.value = '';
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
index 13760bc29ec..1ccc8c4d80b 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
@@ -303,6 +303,9 @@ Polymer({
valueStr = OncMojo.getActivationStateTypeString(
/** @type{!chromeos.networkConfig.mojom.ActivationStateType}*/ (
value));
+ } else if (key === 'portalState') {
+ valueStr = OncMojo.getPortalStateString(
+ /** @type{!chromeos.networkConfig.mojom.PortalState}*/ (value));
} else if (key === 'vpn.type') {
valueStr = OncMojo.getVpnTypeString(
/** @type{!chromeos.networkConfig.mojom.VpnType}*/ (value));
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_select.html b/chromium/ui/webui/resources/cr_components/chromeos/network/network_select.html
index 103a0c5e4ef..d2abd388d3d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_select.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_select.html
@@ -4,6 +4,7 @@
<link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html">
<link rel="import" href="mojo_interface_provider.html">
<link rel="import" href="network_list.html">
+<link rel="import" href="network_list_types.html">
<link rel="import" href="network_listener_behavior.html">
<link rel="import" href="onc_mojo.html">
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/network_select.js b/chromium/ui/webui/resources/cr_components/chromeos/network/network_select.js
index 1cb4d6e24a8..5c385f28b65 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/network_select.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/network_select.js
@@ -128,7 +128,7 @@ Polymer({
for (const network of networkList.children) {
if (network.is === 'network-list-item' &&
network.$$('#divText').children[0].innerText === name) {
- return network;
+ return network.shadowRoot.getElementById('divOuter');
}
}
return null;
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js b/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
index 0ee22a63985..932940e4306 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
@@ -82,6 +82,30 @@
}
/**
+ * @param {!chromeos.networkConfig.mojom.PortalState} value
+ * @return {string}
+ */
+ static getPortalStateString(value) {
+ const PortalState = chromeos.networkConfig.mojom.PortalState;
+ switch (value) {
+ case PortalState.kUnknown:
+ return 'Unknown';
+ case PortalState.kOnline:
+ return 'Online';
+ case PortalState.kPortalSuspected:
+ return 'PortalSuspected';
+ case PortalState.kPortal:
+ return 'Portal';
+ case PortalState.kProxyAuthRequired:
+ return 'ProxyAuthRequired';
+ case PortalState.kNoInternet:
+ return 'NoInternet';
+ }
+ assertNotReached('Unexpected enum value: ' + OncMojo.getEnumString(value));
+ return '';
+ }
+
+ /**
* @param {!chromeos.networkConfig.mojom.ConnectionStateType} value
* @return {string}
*/
@@ -555,6 +579,7 @@
connectionState: mojom.ConnectionStateType.kNotConnected,
guid: opt_name ? (opt_name + '_guid') : '',
name: opt_name || '',
+ portalState: mojom.PortalState.kUnknown,
priority: 0,
proxyMode: mojom.ProxyMode.kDirect,
prohibitedByPolicy: false,
@@ -692,7 +717,9 @@
connectable: false,
guid: guid,
name: OncMojo.createManagedString(name),
- restrictedConnectivity: false,
+ ipAddressConfigType: OncMojo.createManagedString('DHCP'),
+ nameServersConfigType: OncMojo.createManagedString('DHCP'),
+ portalState: mojom.PortalState.kUnknown,
};
switch (type) {
case mojom.NetworkType.kCellular:
@@ -1134,6 +1161,30 @@
}
return a.every((apn, index) => OncMojo.apnMatch(apn, b[index]));
}
+
+ /**
+ * Returns true if the portal state has restricted connectivity.
+ * @param {!chromeos.networkConfig.mojom.PortalState|undefined} portal
+ * @return {boolean}
+ */
+ static isRestrictedConnectivity(portal) {
+ if (portal === undefined) {
+ return false;
+ }
+ const PortalState = chromeos.networkConfig.mojom.PortalState;
+ switch (portal) {
+ case PortalState.kUnknown:
+ case PortalState.kOnline:
+ return false;
+ case PortalState.kPortalSuspected:
+ case PortalState.kPortal:
+ case PortalState.kProxyAuthRequired:
+ case PortalState.kNoInternet:
+ return true;
+ }
+ assertNotReached();
+ return false;
+ }
}
/** @typedef {chromeos.networkConfig.mojom.DeviceStateProperties} */
@@ -1152,13 +1203,14 @@ OncMojo.NetworkStateProperties;
OncMojo.ManagedProperty;
/**
- * Modified version of mojom.IPConfigProperties to store routingPrefix as a
- * human-readable string instead of as a number. Used in network_ip_config.js.
+ * Modified version of mojom.IPConfigProperties to store routingPrefix as
+ * a human-readable netmask string instead of as a number. Used in
+ * network_ip_config.js.
* @typedef {{
* gateway: (string|undefined),
* ipAddress: (string|undefined),
- * nameServers: (!Array<string>|undefined),
- * routingPrefix: (string|undefined),
+ * nameServers: (Array<string>|undefined),
+ * netmask: (string|undefined),
* type: (string|undefined),
* webProxyAutoDiscoveryUrl: (string|undefined),
* }}
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn b/chromium/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
index 607bd812ae1..a326dc50a52 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
@@ -21,6 +21,7 @@ js_type_check("closure_compile_module") {
is_polymer3 = true
deps = [
":network_diagnostics.m",
+ ":network_diagnostics_mojo.m",
":network_health_summary.m",
]
}
@@ -42,6 +43,13 @@ js_library("network_diagnostics") {
]
}
+js_library("network_diagnostics_mojo") {
+ deps = [
+ "//chromeos/services/network_health/public/mojom:mojom_js_library_for_compile",
+ "//ui/webui/resources/js:cr",
+ ]
+}
+
js_library("network_health_summary.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.m.js" ]
deps = [
@@ -56,6 +64,7 @@ js_library("network_health_summary.m") {
js_library("network_diagnostics.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.m.js" ]
deps = [
+ ":network_diagnostics_mojo.m",
"//chromeos/services/network_health/public/mojom:mojom_js_library_for_compile",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:i18n_behavior.m",
@@ -63,6 +72,12 @@ js_library("network_diagnostics.m") {
extra_deps = [ ":network_diagnostics_module" ]
}
+js_library("network_diagnostics_mojo.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.m.js" ]
+ deps = [ "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings_js_library_for_compile" ]
+ extra_deps = [ ":modulize" ]
+}
+
# polymer_modulizer for converting Polymer2 to Polymer3
polymer_modulizer("network_health_summary") {
@@ -77,8 +92,13 @@ polymer_modulizer("network_diagnostics") {
html_type = "dom-module"
}
+js_modulizer("modulize") {
+ input_files = [ "network_diagnostics_mojo.js" ]
+}
+
group("polymer3_elements") {
public_deps = [
+ ":modulize",
":network_diagnostics_module",
":network_health_summary_module",
]
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.html b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.html
index 63657be2640..4e0997eba8d 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.html
@@ -1,7 +1,6 @@
<link rel="import" href="../../../html/polymer.html">
-<link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
-<link rel="import" href="chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_diagnostics.mojom.html">
+<link rel="import" href="chrome://resources/cr_components/chromeos/network_health/network_diagnostics_mojo.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html">
<link rel="import" href="../../../cr_elements/cr_button/cr_button.html">
<link rel="import" href="../../../html/i18n_behavior.html">
@@ -9,82 +8,43 @@
<dom-module id="network-diagnostics">
<template>
<style>
- .button-group > * {
- margin-inline-start: 10px;
- }
-
- .routine-group {
- display: inline-flex;
- flex-wrap: wrap;
- }
-
.routine-container {
- border: 2px solid rgb(150, 150, 150);
- height: 50px;
+ align-items: center;
+ border: 2px solid rgb(175, 175, 175);
+ display: flex;
+ height: 30px;
margin: 10px;
padding: 5px;
- width: 400px;
}
- .run-btn {
- background-color: white;
+ .routine-icon {
+ height: 25px;
+ padding-inline-end: 10px;
+ width: auto;
}
.routine-name {
- font-size: 1rem;
- font-weight: bold;
- }
-
- .routine-content {
- display: flex;
- }
-
- .routine-result {
flex: 1;
- }
-
- .result-passed {
- background-color: rgb(217, 234, 211);
- }
-
- .result-error {
- background-color: rgb(244, 204, 204);
- }
-
- .result-not-run {
- background-color: rgb(255, 242, 204);
+ font-size: 1rem;
}
</style>
- <div class="button-group">
- <cr-button on-click="onRunAllRoutinesClick_">
- [[i18n('NetworkDiagnosticsRunAll')]]
- </cr-button>
- <cr-button on-click="onSendFeedbackReportClick_">
- [[i18n('NetworkDiagnosticsSendFeedback')]]
- </cr-button>
- </div>
- <div class="routine-group">
- <template is="dom-repeat" items="[[routines_]]" as="routine">
- <div class="routine-container">
- <div class="routine-name">[[i18n(routine.name)]]</div>
- <div class="routine-content">
- <div class="routine-result">
- <span class="routine-verdict">[[routine.verdict]]</span>
- <span hidden="[[!routine.errorMsg]]">: </span>
- <span class="routine-errormsg">[[routine.errorMsg]]</span>
- </div>
-
- <template is="dom-if" if="[[routine.running]]">
- <paper-spinner-lite active></paper-spinner-lite>
- </template>
-
- <cr-button class="run-btn" hidden="[[routine.running]]" on-click="onRunRoutineClick_">
- [[i18n('NetworkDiagnosticsRun')]]
- </cr-button>
- </div>
+ <template is="dom-repeat" items="[[routines_]]" as="routine">
+ <div class="routine-container" aria-label="[[i18n(routine.name)]]"
+ aria-description="[[routine.ariaDescription]]">
+ <img class="routine-icon" src="[[getRoutineIcon_(routine.result)]]">
+ <div aria-hidden="true" class="routine-name">
+ [[i18n(routine.name)]]
</div>
- </template>
- </div>
+ <div aria-hidden="true" class="routine-result"
+ hidden="[[!routine.resultMsg]]">
+ [[routine.resultMsg]]
+ </div>
+
+ <template is="dom-if" if="[[routine.running]]">
+ <paper-spinner-lite active></paper-spinner-lite>
+ </template>
+ </div>
+ </template>
</template>
<script src="network_diagnostics.js"></script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js
index cb7dc0d3add..1bc363c0810 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics.js
@@ -28,8 +28,7 @@ let RoutineResponse;
* name: string,
* type: !RoutineType,
* running: boolean,
- * verdict: string,
- * errorMsg: string,
+ * resultMsg: string,
* result: ?RoutineResponse,
* }}
*/
@@ -48,6 +47,9 @@ const RoutineType = {
DNS_RESOLVER: 4,
DNS_LATENCY: 5,
DNS_RESOLUTION: 6,
+ HTTP_FIREWALL: 7,
+ HTTPS_FIREWALL: 8,
+ HTTPS_LATENCY: 9,
};
/**
@@ -61,9 +63,9 @@ function createRoutine(name, type) {
name: name,
type: type,
running: false,
- verdict: '',
- errorMsg: '',
- result: null
+ resultMsg: '',
+ result: null,
+ ariaDescription: '',
};
}
@@ -98,6 +100,12 @@ Polymer({
'NetworkDiagnosticsDnsLatency', RoutineType.DNS_LATENCY);
routines[RoutineType.DNS_RESOLUTION] = createRoutine(
'NetworkDiagnosticsDnsResolution', RoutineType.DNS_RESOLUTION);
+ routines[RoutineType.HTTP_FIREWALL] = createRoutine(
+ 'NetworkDiagnosticsHttpFirewall', RoutineType.HTTP_FIREWALL);
+ routines[RoutineType.HTTPS_FIREWALL] = createRoutine(
+ 'NetworkDiagnosticsHttpsFirewall', RoutineType.HTTPS_FIREWALL);
+ routines[RoutineType.HTTPS_LATENCY] = createRoutine(
+ 'NetworkDiagnosticsHttpsLatency', RoutineType.HTTPS_LATENCY);
return routines;
}
}
@@ -116,39 +124,47 @@ Polymer({
diagnosticsMojom.NetworkDiagnosticsRoutines.getRemote();
},
- /** @private */
- onRunAllRoutinesClick_() {
+ /**
+ * Runs all supported network diagnostics routines.
+ * @public
+ */
+ runAllRoutines() {
for (const routine of this.routines_) {
this.runRoutine_(routine.type);
}
},
/**
- * @param {!Event} event
- * @private
+ * Gets the network diagnostics routine results and organizes them into a
+ * stringified object that is returned.
+ * @return {!string} The network diagnostics routine results
+ * @public
*/
- onRunRoutineClick_(event) {
- this.runRoutine_(event.model.index);
- },
-
- /** @private */
- onSendFeedbackReportClick_() {
+ getResults() {
const results = {};
for (const routine of this.routines_) {
if (routine.result) {
const name = routine.name.replace('NetworkDiagnostics', '');
const result = {};
result['verdict'] =
- this.getRoutineVerdictFeedbackString_(routine.result.verdict);
+ this.getRoutineVerdictRawString_(routine.result.verdict);
if (routine.result.problems && routine.result.problems.length > 0) {
result['problems'] = this.getRoutineProblemsString_(
- routine.type, routine.result.problems, true);
+ routine.type, routine.result.problems, false);
}
results[name] = result;
}
}
- this.fire('open-feedback-dialog', JSON.stringify(results, undefined, 2));
+ return JSON.stringify(results, undefined, 2);
+ },
+
+ /**
+ * @param {!Event} event
+ * @private
+ */
+ onRunRoutineClick_(event) {
+ this.runRoutine_(event.model.index);
},
/**
@@ -157,11 +173,12 @@ Polymer({
*/
runRoutine_(type) {
this.set(`routines_.${type}.running`, true);
- this.set(`routines_.${type}.verdict`, '');
+ this.set(`routines_.${type}.resultMsg`, '');
this.set(`routines_.${type}.result`, null);
- const element =
- this.shadowRoot.querySelectorAll('.routine-container')[type];
- element.classList.remove('result-passed', 'result-error', 'result-not-run');
+ this.set(
+ `routines_.${type}.ariaDescription`,
+ this.i18n('NetworkDiagnosticsRunning'));
+
switch (type) {
case RoutineType.LAN_CONNECTIVITY:
this.networkDiagnostics_.lanConnectivity().then(
@@ -191,6 +208,18 @@ Polymer({
this.networkDiagnostics_.dnsResolution().then(
result => this.evaluateRoutine_(type, result));
break;
+ case RoutineType.HTTP_FIREWALL:
+ this.networkDiagnostics_.httpFirewall().then(
+ result => this.evaluateRoutine_(type, result));
+ break;
+ case RoutineType.HTTPS_FIREWALL:
+ this.networkDiagnostics_.httpsFirewall().then(
+ result => this.evaluateRoutine_(type, result));
+ break;
+ case RoutineType.HTTPS_LATENCY:
+ this.networkDiagnostics_.httpsLatency().then(
+ result => this.evaluateRoutine_(type, result));
+ break;
}
},
@@ -201,48 +230,80 @@ Polymer({
*/
evaluateRoutine_(type, result) {
const routine = `routines_.${type}`;
- this.set(`${routine}.running`, false);
+ this.set(routine + '.running', false);
+ this.set(routine + '.result', result);
- const element =
- this.shadowRoot.querySelectorAll('.routine-container')[type];
- let verdict = '';
- let errorMsg = '';
+ const resultMsg = this.getRoutineResult_(this.routines_[type]);
+ this.set(routine + '.resultMsg', resultMsg);
+ this.set(routine + '.ariaDescription', resultMsg);
+ },
+
+ /**
+ * Helper function to get the icon for a routine based on the result.
+ * @param {RoutineResponse} result
+ * @return {string}
+ * @private
+ */
+ getRoutineIcon_(result) {
+ if (!result) {
+ return 'test_not_run.png';
+ }
switch (result.verdict) {
case diagnosticsMojom.RoutineVerdict.kNoProblem:
+ return 'test_passed.png';
+ case diagnosticsMojom.RoutineVerdict.kProblem:
+ return 'test_failed.png';
+ case diagnosticsMojom.RoutineVerdict.kNotRun:
+ return 'test_canceled.png';
+ }
+
+ return '';
+ },
+
+ /**
+ * Helper function to generate the routine result string.
+ * @param {Routine} routine
+ * @return {string}
+ * @private
+ */
+ getRoutineResult_(routine) {
+ let verdict = '';
+ switch (routine.result.verdict) {
+ case diagnosticsMojom.RoutineVerdict.kNoProblem:
verdict = this.i18n('NetworkDiagnosticsPassed');
- element.classList.add('result-passed');
break;
case diagnosticsMojom.RoutineVerdict.kProblem:
verdict = this.i18n('NetworkDiagnosticsFailed');
- element.classList.add('result-error');
break;
case diagnosticsMojom.RoutineVerdict.kNotRun:
verdict = this.i18n('NetworkDiagnosticsNotRun');
- element.classList.add('result-not-run');
break;
}
- if (result.problems && result.problems.length) {
- errorMsg = this.getRoutineProblemsString_(type, result.problems, false);
+ if (routine.result && routine.result.problems &&
+ routine.result.problems.length) {
+ const problemStrings = this.getRoutineProblemsString_(
+ routine.type, routine.result.problems, true);
+ return this.i18n(
+ 'NetworkDiagnosticsResultPlaceholder', verdict, ...problemStrings);
+ } else if (routine.result) {
+ return verdict;
}
- this.set(routine + '.result', result);
- this.set(routine + '.verdict', verdict);
- this.set(routine + '.errorMsg', errorMsg);
+ return '';
},
/**
*
* @param {!RoutineType} type The type of routine
* @param {!Array<number>} problems The list of problems for the routine
- * @param {boolean} feedback Flag to return a feedback or user display string
- * @return {Array<string>} List of network diagnostic problem strings
+ * @param {boolean} translate Flag to return a translated string
+ * @return {!Array<string>} List of network diagnostic problem strings
* @private
*/
- getRoutineProblemsString_(type, problems, feedback) {
- // Do not localize feedback strings.
- const getString = s => feedback ? s : this.i18n(s);
+ getRoutineProblemsString_(type, problems, translate) {
+ const getString = s => translate ? this.i18n(s) : s;
const problemStrings = [];
for (const problem of problems) {
@@ -351,6 +412,46 @@ Polymer({
break;
}
break;
+
+ case RoutineType.HTTP_FIREWALL:
+ case RoutineType.HTTPS_FIREWALL:
+ switch (problem) {
+ case diagnosticsMojom.HttpFirewallProblem
+ .kDnsResolutionFailuresAboveThreshold:
+ case diagnosticsMojom.HttpsFirewallProblem.kFailedDnsResolutions:
+ problemStrings.push(
+ getString('FirewallProblem_DnsResolutionFailureRate'));
+ break;
+ case diagnosticsMojom.HttpFirewallProblem.kFirewallDetected:
+ case diagnosticsMojom.HttpsFirewallProblem.kFirewallDetected:
+ problemStrings.push(
+ getString('FirewallProblem_FirewallDetected'));
+ break;
+ case diagnosticsMojom.HttpFirewallProblem.kPotentialFirewall:
+ case diagnosticsMojom.HttpsFirewallProblem.kPotentialFirewall:
+ problemStrings.push(
+ getString('FirewallProblem_FirewallSuspected'));
+ break;
+ }
+
+ case RoutineType.HTTPS_LATENCY:
+ switch (problem) {
+ case diagnosticsMojom.HttpsLatencyProblem.kFailedDnsResolutions:
+ problemStrings.push(
+ getString('HttpsLatencyProblem_FailedDnsResolution'));
+ break;
+ case diagnosticsMojom.HttpsLatencyProblem.kFailedHttpsRequests:
+ problemStrings.push(
+ getString('HttpsLatencyProblem_FailedHttpsRequests'));
+ break;
+ case diagnosticsMojom.HttpsLatencyProblem.kHighLatency:
+ problemStrings.push(getString('HttpsLatencyProblem_HighLatency'));
+ break;
+ case diagnosticsMojom.HttpsLatencyProblem.kVeryHighLatency:
+ problemStrings.push(
+ getString('HttpsLatencyProblem_VeryHighLatency'));
+ break;
+ }
}
}
@@ -359,10 +460,10 @@ Polymer({
/**
* @param {!chromeos.networkDiagnostics.mojom.RoutineVerdict} verdict
- * @return {string} String for a network diagnostic verdict used for feedback
+ * @return {string} Untranslated string for a network diagnostic verdict
* @private
*/
- getRoutineVerdictFeedbackString_(verdict) {
+ getRoutineVerdictRawString_(verdict) {
switch (verdict) {
case diagnosticsMojom.RoutineVerdict.kNoProblem:
return 'Passed';
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.html b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.html
new file mode 100644
index 00000000000..7af89656d32
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.html
@@ -0,0 +1,4 @@
+<link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
+
+<script src="chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_diagnostics.mojom-lite.js"></script>
+<script src="network_diagnostics_mojo.js"></script>
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.js b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.js
new file mode 100644
index 00000000000..f89eb43c719
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/network_diagnostics_mojo.js
@@ -0,0 +1,15 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// clang-format off
+// #import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+// #import 'chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_diagnostics.mojom-lite.js';
+// clang-format on
+
+/**
+ * @fileoverview Wrapper around Network Diagnostics mojom file and associated
+ * utilities.
+ * TODO(crbug/1111852): Remove this wrapper once Polymer2 no longer needs to be
+ * supported. These imports can be used directly.
+ */
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_canceled.png b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_canceled.png
new file mode 100644
index 00000000000..cc718770e1a
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_canceled.png
Binary files differ
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_failed.png b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_failed.png
new file mode 100644
index 00000000000..f5aca4677e9
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_failed.png
Binary files differ
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_not_run.png b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_not_run.png
new file mode 100644
index 00000000000..4d34f3d308b
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_not_run.png
Binary files differ
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_passed.png b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_passed.png
new file mode 100644
index 00000000000..cc285a22f82
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_passed.png
Binary files differ
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_warning.png b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_warning.png
new file mode 100644
index 00000000000..ec58ed3cbc4
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/network_health/test_warning.png
Binary files differ
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni b/chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni
index 56c56b504d5..b9f33603437 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni
+++ b/chromium/ui/webui/resources/cr_components/chromeos/os_cr_components.gni
@@ -14,7 +14,8 @@ cr_components_chromeos_namespace_rewrites = [
"cellularSetup.PSimPageName|PSimPageName",
"cellularSetup.PSimUIState|PSimUIState",
"cellularSetup.getTimeoutMsForPSimUIState|getTimeoutMsForPSimUIState",
- "cellular_setup.MojoInterfaceProvider|MojoInterfaceProvider",
+ "cellular_setup.getCellularSetupRemote|getCellularSetupRemote",
+ "cellular_setup.setCellularSetupRemoteForTesting|setCellularSetupRemoteForTesting",
"cellular_setup.CellularSetupDelegate|CellularSetupDelegate",
"network_config.MojoInterfaceProvider|MojoInterfaceProvider",
"network_config.MojoInterfaceProviderImpl|MojoInterfaceProviderImpl",
@@ -28,14 +29,17 @@ cr_components_chromeos_auto_imports = [
"ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.html|ButtonState,Button,ButtonBarState,CellularSetupPageName",
"ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_delegate.html|CellularSetupDelegate",
"ui/webui/resources/cr_components/chromeos/cellular_setup/subflow_behavior.html|SubflowBehavior",
- "ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html|MojoInterfaceProviderImpl,MojoInterfaceProvider",
+ "ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.html|setCellularSetupRemoteForTesting,getCellularSetupRemote",
"ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.html|CrPolicyNetworkBehaviorMojo",
"ui/webui/resources/cr_components/chromeos/network/onc_mojo.html|OncMojo",
"ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.html|NetworkConfigElementBehavior",
"ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.html|NetworkListenerBehavior",
+ "ui/webui/resources/cr_components/chromeos/network/network_list_types.html|NetworkList",
"ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.html|MojoInterfaceProviderImpl,MojoInterfaceProvider",
"ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.html|recordLockScreenProgress,LockScreenProgress",
"ui/webui/resources/cr_components/chromeos/cellular_setup/webview_post_util.html|postDeviceDataToWebview",
"ui/webui/resources/html/assert.html|assert,assertNotReached",
+ "ui/webui/resources/html/cr/ui/focus_row_behavior.html|FocusRowBehavior",
+ "ui/webui/resources/html/list_property_update_behavior.html|ListPropertyUpdateBehavior",
"ui/webui/resources/html/polymer.html|Polymer,flush,html",
]
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/DIR_METADATA b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/DIR_METADATA
new file mode 100644
index 00000000000..b39cd583495
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "OS>Systems>Settings"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/OWNERS b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/OWNERS
index ce3b74f2b01..b71a2190f88 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/OWNERS
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/OWNERS
@@ -3,5 +3,3 @@ alemate@chromium.org
# (in CET)
rsorokin@chromium.org
-
-# COMPONENT: UI>Settings
diff --git a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html
index 74d26d2f35c..61925083206 100644
--- a/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html
+++ b/chromium/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html
@@ -155,7 +155,7 @@
}
</style>
- <div id="root" on-tap="onRootTap_">
+ <div id="root" on-click="onRootTap_">
<div id="pinInputDiv">
<cr-input id="pinInput" type="password" value="{{value}}"
is-input-rtl$="[[isInputRtl_(value)]]" aria-label="[[ariaLabel]]"
@@ -169,21 +169,21 @@
<slot select="[problem]"></slot>
<div id="rowsContainer">
<div class="row">
- <cr-button class="digit-button" on-tap="onNumberTap_" value="1"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="1"
id="digitButton1" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard1')]]</inner-text>
<inner-text class="letter empty"
hidden="[[!enableLetters]]">ABC</inner-text>
</cr-button>
- <cr-button class="digit-button" on-tap="onNumberTap_" value="2"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="2"
id="digitButton2" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard2')]]</inner-text>
<inner-text class="letter"
hidden="[[!enableLetters]]">ABC</inner-text>
</cr-button>
- <cr-button class="digit-button" on-tap="onNumberTap_" value="3"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="3"
id="digitButton3" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard3')]]</inner-text>
@@ -192,21 +192,21 @@
</cr-button>
</div>
<div class="row">
- <cr-button class="digit-button" on-tap="onNumberTap_" value="4"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="4"
id="digitButton4" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard4')]]</inner-text>
<inner-text class="letter"
hidden="[[!enableLetters]]">GHI</inner-text>
</cr-button>
- <cr-button class="digit-button" on-tap="onNumberTap_" value="5"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="5"
id="digitButton5" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard5')]]</inner-text>
<inner-text class="letter"
hidden="[[!enableLetters]]">JKL</inner-text>
</cr-button>
- <cr-button class="digit-button" on-tap="onNumberTap_" value="6"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="6"
id="digitButton6" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard6')]]</inner-text>
@@ -215,21 +215,21 @@
</cr-button>
</div>
<div class="row">
- <cr-button class="digit-button" on-tap="onNumberTap_" value="7"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="7"
id="digitButton7" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard7')]]</inner-text>
<inner-text class="letter"
hidden="[[!enableLetters]]">PQRS</inner-text>
</cr-button>
- <cr-button class="digit-button" on-tap="onNumberTap_" value="8"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="8"
id="digitButton8" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard8')]]</inner-text>
<inner-text class="letter"
hidden="[[!enableLetters]]">TUV</inner-text>
</cr-button>
- <cr-button class="digit-button" on-tap="onNumberTap_" value="9"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="9"
id="digitButton9" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard9')]]</inner-text>
@@ -241,7 +241,7 @@
<cr-icon-button id="backspaceButton"
disabled$="[[!hasInput_(value)]]"
iron-icon="pin-keyboard:backspace"
- on-tap="onBackspaceTap_"
+ on-click="onBackspaceTap_"
on-pointerdown="onBackspacePointerDown_"
on-pointerout="clearAndReset_"
on-pointerup="onBackspacePointerUp_"
@@ -249,7 +249,7 @@
title="[[i18n('pinKeyboardDeleteAccessibleName')]]"
custom-tab-index="-1">
</cr-icon-button>
- <cr-button class="digit-button" on-tap="onNumberTap_" value="0"
+ <cr-button class="digit-button" on-click="onNumberTap_" value="0"
id="digitButton0" disabled="[[disabled]]" circle-ripple
custom-tab-index="-1">
<inner-text class="number">[[i18n('pinKeyboard0')]]</inner-text>
diff --git a/chromium/ui/webui/resources/cr_components/cr_components_images.grdp b/chromium/ui/webui/resources/cr_components/cr_components_images.grdp
index ba9048f5f05..c0884efcd49 100644
--- a/chromium/ui/webui/resources/cr_components/cr_components_images.grdp
+++ b/chromium/ui/webui/resources/cr_components/cr_components_images.grdp
@@ -27,6 +27,18 @@
compress="gzip" />
<!-- CellularSetup Images -->
+ <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_ACTIVATION_CODE_PAGE_CAMERA_SVG"
+ file="cr_components/chromeos/cellular_setup/activation_code_page_camera.svg"
+ type="BINDATA"
+ compress="gzip" />
+ <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_ACTIVATION_CODE_PAGE_CHECKED_SVG"
+ file="cr_components/chromeos/cellular_setup/activation_code_page_checked.svg"
+ type="BINDATA"
+ compress="gzip" />
+ <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_ACTIVATION_CODE_PAGE_SWITCH_CAMERA_SVG"
+ file="cr_components/chromeos/cellular_setup/activation_code_page_switch_camera.svg"
+ type="BINDATA"
+ compress="gzip" />
<include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_ERROR_1X_PNG"
file="cr_components/chromeos/cellular_setup/error_1x.png"
type="BINDATA"
@@ -101,5 +113,22 @@
file="cr_components/chromeos/network/wifi_4.svg" type="BINDATA" />
<include name="IDR_CR_ELEMENTS_WIFI_OFF_SVG"
file="cr_components/chromeos/network/wifi_off.svg" type="BINDATA" />
+
+ <!-- NetworkDiagnostics Images -->
+ <include name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_DIAGNOSTICS_CANCELED_ICON"
+ file="cr_components/chromeos/network_health/test_canceled.png"
+ type="BINDATA" />
+ <include name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_DIAGNOSTICS_FAILED_ICON"
+ file="cr_components/chromeos/network_health/test_failed.png"
+ type="BINDATA" />
+ <include name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_DIAGNOSTICS_NOT_RUN_ICON"
+ file="cr_components/chromeos/network_health/test_not_run.png"
+ type="BINDATA" />
+ <include name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_DIAGNOSTICS_PASSED_ICON"
+ file="cr_components/chromeos/network_health/test_passed.png"
+ type="BINDATA" />
+ <include name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_DIAGNOSTICS_WARNING_ICON"
+ file="cr_components/chromeos/network_health/test_warning.png"
+ type="BINDATA" />
</if>
</grit-part>
diff --git a/chromium/ui/webui/resources/cr_components/cr_components_resources.grdp b/chromium/ui/webui/resources/cr_components/cr_components_resources.grdp
deleted file mode 100644
index f660ae7dd0e..00000000000
--- a/chromium/ui/webui/resources/cr_components/cr_components_resources.grdp
+++ /dev/null
@@ -1,390 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
- <if expr="chromeos and not optimize_webui">
- <!-- Chrome OS Custom Elements. When optimize_webui is true these are -->
- <!-- vulcanized and are not included individually. -->
- <structure name="IDR_WEBUI_CHROMEOS_BLUETOOTH_DIALOG_HTML"
- file="cr_components/chromeos/bluetooth/bluetooth_dialog.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_BLUETOOTH_DIALOG_JS"
- file="cr_components/chromeos/bluetooth/bluetooth_dialog.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_APNLIST_HTML"
- file="cr_components/chromeos/network/network_apnlist.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_APNLIST_JS"
- file="cr_components/chromeos/network/network_apnlist.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CHOOSE_MOBILE_HTML"
- file="cr_components/chromeos/network/network_choose_mobile.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CHOOSE_MOBILE_JS"
- file="cr_components/chromeos/network/network_choose_mobile.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_HTML"
- file="cr_components/chromeos/network/network_config.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_JS"
- file="cr_components/chromeos/network/network_config.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_ELEMENT_BEHAVIOR_HTML"
- file="cr_components/chromeos/network/network_config_element_behavior.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_ELEMENT_BEHAVIOR_JS"
- file="cr_components/chromeos/network/network_config_element_behavior.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_INPUT_HTML"
- file="cr_components/chromeos/network/network_config_input.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_INPUT_JS"
- file="cr_components/chromeos/network/network_config_input.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_SELECT_HTML"
- file="cr_components/chromeos/network/network_config_select.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_SELECT_JS"
- file="cr_components/chromeos/network/network_config_select.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_TOGGLE_HTML"
- file="cr_components/chromeos/network/network_config_toggle.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_TOGGLE_JS"
- file="cr_components/chromeos/network/network_config_toggle.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_IP_CONFIG_HTML"
- file="cr_components/chromeos/network/network_ip_config.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_IP_CONFIG_JS"
- file="cr_components/chromeos/network/network_ip_config.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_NAMESERVERS_HTML"
- file="cr_components/chromeos/network/network_nameservers.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_NAMESERVERS_JS"
- file="cr_components/chromeos/network/network_nameservers.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PASSWORD_INPUT_HTML"
- file="cr_components/chromeos/network/network_password_input.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PASSWORD_INPUT_JS"
- file="cr_components/chromeos/network/network_password_input.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROPERTY_LIST_MOJO_HTML"
- file="cr_components/chromeos/network/network_property_list_mojo.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROPERTY_LIST_MOJO_JS"
- file="cr_components/chromeos/network/network_property_list_mojo.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_HTML"
- file="cr_components/chromeos/network/network_proxy.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_JS"
- file="cr_components/chromeos/network/network_proxy.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_EXCLUSIONS_HTML"
- file="cr_components/chromeos/network/network_proxy_exclusions.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_EXCLUSIONS_JS"
- file="cr_components/chromeos/network/network_proxy_exclusions.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_INPUT_HTML"
- file="cr_components/chromeos/network/network_proxy_input.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_INPUT_JS"
- file="cr_components/chromeos/network/network_proxy_input.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_SIMINFO_HTML"
- file="cr_components/chromeos/network/network_siminfo.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_SIMINFO_JS"
- file="cr_components/chromeos/network/network_siminfo.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_SHARED_CSS_HTML"
- file="cr_components/chromeos/network/network_shared_css.html"
- type="chrome_html" />
- </if>
- <if expr="chromeos">
- <!-- Shared between settings and OOBE, which is not vulcanized. -->
- <structure name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_PIN_KEYBOARD_HTML"
- file="cr_components/chromeos/quick_unlock/pin_keyboard.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_PIN_KEYBOARD_JS"
- file="cr_components/chromeos/quick_unlock/pin_keyboard.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_SETUP_PIN_KEYBOARD_JS"
- file="cr_components/chromeos/quick_unlock/setup_pin_keyboard.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_SETUP_PIN_KEYBOARD_HTML"
- file="cr_components/chromeos/quick_unlock/setup_pin_keyboard.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_PIN_KEYBOARD_ICON_HTML"
- file="cr_components/chromeos/quick_unlock/pin_keyboard_icon.html"
- type="chrome_html"/>
- <structure name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_LOCK_SCREEN_CONSTANTS_JS"
- file="cr_components/chromeos/quick_unlock/lock_screen_constants.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_LOCK_SCREEN_CONSTANTS_HTML"
- file="cr_components/chromeos/quick_unlock/lock_screen_constants.html"
- type="chrome_html" />
-
- <!-- Shared between cellular setup flow and OOBE. -->
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_CELLULAR_SETUP_HTML"
- file="cr_components/chromeos/cellular_setup/cellular_setup.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_CELLULAR_SETUP_JS"
- file="cr_components/chromeos/cellular_setup/cellular_setup.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_PSIM_FLOW_HTML"
- file="cr_components/chromeos/cellular_setup/psim_flow_ui.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_PSIM_FLOW_JS"
- file="cr_components/chromeos/cellular_setup/psim_flow_ui.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_ESIM_FLOW_HTML"
- file="cr_components/chromeos/cellular_setup/esim_flow_ui.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_ESIM_FLOW_JS"
- file="cr_components/chromeos/cellular_setup/esim_flow_ui.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_TYPES_JS"
- file="cr_components/chromeos/cellular_setup/cellular_types.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_TYPES_HTML"
- file="cr_components/chromeos/cellular_setup/cellular_types.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_DELEGATE_HTML"
- file="cr_components/chromeos/cellular_setup/cellular_setup_delegate.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_DELEGATE_JS"
- file="cr_components/chromeos/cellular_setup/cellular_setup_delegate.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_MOJO_INTERFACE_PROVIDER_HTML"
- file="cr_components/chromeos/cellular_setup/mojo_interface_provider.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_MOJO_INTERFACE_PROVIDER_JS"
- file="cr_components/chromeos/cellular_setup/mojo_interface_provider.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_BUTTON_BAR_HTML"
- file="cr_components/chromeos/cellular_setup/button_bar.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_BUTTON_BAR_JS"
- file="cr_components/chromeos/cellular_setup/button_bar.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_BASE_PAGE_HTML"
- file="cr_components/chromeos/cellular_setup/base_page.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_BASE_PAGE_JS"
- file="cr_components/chromeos/cellular_setup/base_page.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_SIM_DETECT_PAGE_HTML"
- file="cr_components/chromeos/cellular_setup/sim_detect_page.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_SIM_DETECT_PAGE_JS"
- file="cr_components/chromeos/cellular_setup/sim_detect_page.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_PROVISIONING_PAGE_HTML"
- file="cr_components/chromeos/cellular_setup/provisioning_page.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_PROVISIONING_PAGE_JS"
- file="cr_components/chromeos/cellular_setup/provisioning_page.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_FINAL_PAGE_HTML"
- file="cr_components/chromeos/cellular_setup/final_page.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_FINAL_PAGE_JS"
- file="cr_components/chromeos/cellular_setup/final_page.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_WEBVIEW_POST_UTIL_HTML"
- file="cr_components/chromeos/cellular_setup/webview_post_util.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_WEBVIEW_POST_UTIL_JS"
- file="cr_components/chromeos/cellular_setup/webview_post_util.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_SELECTION_FLOW_HTML"
- file="cr_components/chromeos/cellular_setup/setup_selection_flow.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_SELECTION_FLOW_JS"
- file="cr_components/chromeos/cellular_setup/setup_selection_flow.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SUBFLOW_BEHAVIOR_HTML"
- file="cr_components/chromeos/cellular_setup/subflow_behavior.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SUBFLOW_BEHAVIOR_JS"
- file="cr_components/chromeos/cellular_setup/subflow_behavior.js"
- type="chrome_html" />
-
- <!-- Shared between MultiDevice setup flow and OOBE. -->
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_BROWSER_PROXY_HTML"
- file="cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_BROWSER_PROXY_JS"
- file="cr_components/chromeos/multidevice_setup/multidevice_setup_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_BUTTON_BAR_HTML"
- file="cr_components/chromeos/multidevice_setup/button_bar.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_BUTTON_BAR_JS"
- file="cr_components/chromeos/multidevice_setup/button_bar.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_FAKE_MOJO_SERVICE_HTML"
- file="cr_components/chromeos/multidevice_setup/fake_mojo_service.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_FAKE_MOJO_SERVICE_JS"
- file="cr_components/chromeos/multidevice_setup/fake_mojo_service.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_ICONS_HTML"
- file="cr_components/chromeos/multidevice_setup/icons.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MOJO_API_HTML"
- file="cr_components/chromeos/multidevice_setup/mojo_api.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MOJO_API_JS"
- file="cr_components/chromeos/multidevice_setup/mojo_api.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_HTML"
- file="cr_components/chromeos/multidevice_setup/multidevice_setup.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_JS"
- file="cr_components/chromeos/multidevice_setup/multidevice_setup.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_DELEGATE_HTML"
- file="cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_DELEGATE_JS"
- file="cr_components/chromeos/multidevice_setup/multidevice_setup_delegate.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_SHARED_CSS_HTML"
- file="cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_PASSWORD_PAGE_HTML"
- file="cr_components/chromeos/multidevice_setup/password_page.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_PASSWORD_PAGE_JS"
- file="cr_components/chromeos/multidevice_setup/password_page.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_SETUP_SUCCEEDED_PAGE_HTML"
- file="cr_components/chromeos/multidevice_setup/setup_succeeded_page.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_SETUP_SUCCEEDED_PAGE_JS"
- file="cr_components/chromeos/multidevice_setup/setup_succeeded_page.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_START_SETUP_PAGE_HTML"
- file="cr_components/chromeos/multidevice_setup/start_setup_page.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_START_SETUP_PAGE_JS"
- file="cr_components/chromeos/multidevice_setup/start_setup_page.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_UI_PAGE_CONTAINER_BEHAVIOR_HTML"
- file="cr_components/chromeos/multidevice_setup/ui_page_container_behavior.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_UI_PAGE_CONTAINER_BEHAVIOR_JS"
- file="cr_components/chromeos/multidevice_setup/ui_page_container_behavior.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_UI_PAGE_HTML"
- file="cr_components/chromeos/multidevice_setup/ui_page.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_UI_PAGE_JS"
- file="cr_components/chromeos/multidevice_setup/ui_page.js"
- type="chrome_html" />
-
- <!-- For use in Settings, oobe, configuration dialogs, and debug UI. -->
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_MOJO_INTERFACE_PROVIDER_HTML"
- file="cr_components/chromeos/network/mojo_interface_provider.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_NETWORK_MOJO_INTERFACE_PROVIDER_JS"
- file="cr_components/chromeos/network/mojo_interface_provider.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_HEALTH_SUMMARY_HTML"
- file="cr_components/chromeos/network_health/network_health_summary.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_HEALTH_SUMMARY_JS"
- file="cr_components/chromeos/network_health/network_health_summary.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_DIAGNOSTICS_HTML"
- file="cr_components/chromeos/network_health/network_diagnostics.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_DIAGNOSTICS_JS"
- file="cr_components/chromeos/network_health/network_diagnostics.js"
- type="chrome_html" />
-
- <!-- Shared between settings and add new share flow. -->
- <structure name="IDR_WEBUI_CHROMEOS_SMB_SHARES_SMB_BROWSER_PROXY_HTML"
- file="cr_components/chromeos/smb_shares/smb_browser_proxy.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_SMB_SHARES_SMB_BROWSER_PROXY_JS"
- file="cr_components/chromeos/smb_shares/smb_browser_proxy.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_SMB_SHARES_ADD_SMB_SHARE_DIALOG_HTML"
- file="cr_components/chromeos/smb_shares/add_smb_share_dialog.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_CHROMEOS_SMB_SHARES_ADD_SMB_SHARE_DIALOG_JS"
- file="cr_components/chromeos/smb_shares/add_smb_share_dialog.js"
- type="chrome_html" />
-
- <!-- Used to render network-list and related subcomponents. -->
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_CR_POLICY_NETWORK_BEHAVIOR_MOJO_HTML"
- file="cr_components/chromeos/network/cr_policy_network_behavior_mojo.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_CR_POLICY_NETWORK_BEHAVIOR_MOJO_JS"
- file="cr_components/chromeos/network/cr_policy_network_behavior_mojo.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_CR_POLICY_NETWORK_INDICATOR_MOJO_HTML"
- file="cr_components/chromeos/network/cr_policy_network_indicator_mojo.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_CR_POLICY_NETWORK_INDICATOR_MOJO_JS"
- file="cr_components/chromeos/network/cr_policy_network_indicator_mojo.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_ICON_HTML"
- file="cr_components/chromeos/network/network_icon.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_ICON_JS"
- file="cr_components/chromeos/network/network_icon.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LIST_HTML"
- file="cr_components/chromeos/network/network_list.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LIST_JS"
- file="cr_components/chromeos/network/network_list.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LIST_ITEM_HTML"
- file="cr_components/chromeos/network/network_list_item.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LIST_ITEM_JS"
- file="cr_components/chromeos/network/network_list_item.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LIST_TYPES_HTML"
- file="cr_components/chromeos/network/network_list_types.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LIST_TYPES_JS"
- file="cr_components/chromeos/network/network_list_types.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LISTENER_BEHAVIOR_HTML"
- file="cr_components/chromeos/network/network_listener_behavior.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_LISTENER_BEHAVIOR_JS"
- file="cr_components/chromeos/network/network_listener_behavior.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_SELECT_HTML"
- file="cr_components/chromeos/network/network_select.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_SELECT_JS"
- file="cr_components/chromeos/network/network_select.js"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_NETWORK_ICONS_HTML"
- file="cr_components/chromeos/network/network_icons.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_ONC_MOJO_HTML"
- file="cr_components/chromeos/network/onc_mojo.html"
- type="chrome_html" />
- <structure name="IDR_CR_COMPONENTS_CHROMEOS_ONC_MOJO_JS"
- file="cr_components/chromeos/network/onc_mojo.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_WEBUI_MANAGED_FOOTNOTE_HTML"
- file="cr_components/managed_footnote/managed_footnote.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_MANAGED_FOOTNOTE_JS"
- file="cr_components/managed_footnote/managed_footnote.js"
- type="chrome_html" />
-</grit-part>
diff --git a/chromium/ui/webui/resources/cr_components/cr_components_resources_v3.grdp b/chromium/ui/webui/resources/cr_components/cr_components_resources_v3.grdp
deleted file mode 100644
index 942ceac8681..00000000000
--- a/chromium/ui/webui/resources/cr_components/cr_components_resources_v3.grdp
+++ /dev/null
@@ -1,296 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
- <include name="IDR_WEBUI_MANAGED_FOOTNOTE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/managed_footnote/managed_footnote.m.js"
- use_base_dir="false"
- type="BINDATA"
- preprocess="true" />
- <include name="IDR_WEBUI_CR_COMPONENTS_OMNIBOX_CR_AUTOCOMPLETE_MATCH_LIST_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/omnibox/cr_autocomplete_match_list.js"
- use_base_dir="false"
- type="BINDATA" />
-
- <!-- customize_themes -->
- <include name="IDR_WEBUI_CR_COMPONENTS_CUSTOMIZE_THEMES_CUSTOMIZE_THEMES_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/customize_themes/customize_themes.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CR_COMPONENTS_CUSTOMIZE_THEMES_THEME_ICON_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/customize_themes/theme_icon.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CUSTOMIZE_THEMES_MOJOM_LITE_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/customize_themes/customize_themes.mojom-lite.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CR_COMPONENTS_CUSTOMIZE_THEMES_BROWSER_PROXY_JS"
- file="cr_components/customize_themes/browser_proxy.js"
- type="BINDATA" />
-
- <if expr="chromeos">
- <include name="IDR_WEBUI_CHROMEOS_SMB_SHARES_ADD_SMB_SHARE_DIALOG_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/smb_shares/add_smb_share_dialog.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_SMB_SHARES_SMB_BROWSER_PROXY_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/smb_shares/smb_browser_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_BLUETOOTH_BLUETOOTH_DIALOG_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_dialog.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CR_POLICY_NETWORK_BEHAVIOR_MOJO_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CR_POLICY_NETWORK_INDICATOR_MOJO_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_APNLIST_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_apnlist.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_CHOOSE_MOBILE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_ELEMENT_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_config_element_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_config.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_INPUT_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_config_input.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_SELECT_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_config_select.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_CONFIG_TOGGLE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_config_toggle.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_LISTENER_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_IP_CONFIG_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_ip_config.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_LIST_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_list.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_LIST_ITEM_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_list_item.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_LIST_TYPES_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_list_types.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_NAMESERVERS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_nameservers.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_PASSWORD_INPUT_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_password_input.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_PROPRETY_LIST_MOJO_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_EXCLUSIONS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_proxy_exclusions.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_INPUT_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_PROXY_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_proxy.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_SELECT_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_select.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_SHARED_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_shared_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_SIMINFO_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_siminfo.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_ONC_MOJOM_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/onc_mojo.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_MOJO_INTERFACE_PROVIDER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_ICON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_icon.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_NETWORK_ICONS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/network/network_icons.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_LOCK_SCREEN_CONSTANTS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/quick_unlock/lock_screen_constants.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_LOCK_SETUP_PIN_KEYBOARD_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/quick_unlock/setup_pin_keyboard.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_LOCK_PIN_KEYBOARD_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_QUICK_UNLOCK_LOCK_PIN_KEYBOARD_ICON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard_icon.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_BASE_PAGE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/base_page.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_FINAL_PAGE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/final_page.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_MOJO_INTERFACE_PROVIDER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_WEBVIEW_POST_UTIL_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/webview_post_util.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_SIM_DETECT_PAGE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/sim_detect_page.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_PROVISIONING_PAGE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/provisioning_page.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_BUTTON_BAR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_CELLULAR_TYPES_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_CELLULAR_SETUP_DELEGATE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup_delegate.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_SUBFLOW_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/subflow_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_PSIM_FLOW_UI_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_ESIM_FLOW_UI_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_SETUP_SELECTION_FLOW_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/setup_selection_flow.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_CELLULAR_SETUP_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.m.js"
- use_base_dir="false"
- type="BINDATA" />
- </if>
- <if expr="use_nss_certs">
- <include name="IDR_WEBUI_CA_TRUST_EDIT_DIALOG_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_DELETE_CONFIRMATION_DIALOG_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_MANAGER_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_manager.js"
- use_base_dir="false"
- preprocess="true"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_PASSWORD_ENCRYPTION_DIALOG_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_PASSWORD_DECRYPTION_DIALOG_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATES_ERROR_DIALOG_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_ENTRY_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_entry.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_LIST_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_list.js"
- use_base_dir="false"
- preprocess="true"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_MANAGER_TYPES_JS"
- file="cr_components/certificate_manager/certificate_manager_types.js"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_SHARED_CSS_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_shared_css.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_WEBUI_CERTIFICATE_SUBENTRY_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.js"
- use_base_dir="false"
- type="BINDATA" />
- <!-- TODO(https://crbug.com/1071641): When conditional imports are possible
- in cr_components, only include the certificate provisioning items for
- ChromeOS platforms. -->
- <include name="IDR_WEBUI_CERTIFICATE_PROVISIONING_LIST_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_list.js"
- use_base_dir="false"
- type="BINDATA"
- preprocess="true" />
- <include name="IDR_WEBUI_CERTIFICATE_PROVISIONING_ENTRY_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_entry.js"
- use_base_dir="false"
- type="BINDATA"
- preprocess="true" />
- <include name="IDR_WEBUI_CERTIFICATE_PROVISIONING_DETAILS_DIALOG_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_components/certificate_manager/certificate_provisioning_details_dialog.js"
- use_base_dir="false"
- type="BINDATA"
- preprocess="true" />
- <include name="IDR_WEBUI_CERTIFICATE_PROVISIONING_BROWSER_PROXY"
- file="cr_components/certificate_manager/certificate_provisioning_browser_proxy.js"
- type="BINDATA"
- preprocess="true" />
- <include name="IDR_WEBUI_CERTIFICATES_BROWSER_PROXY_JS"
- file="cr_components/certificate_manager/certificates_browser_proxy.js"
- type="BINDATA" />
- </if>
-</grit-part>
diff --git a/chromium/ui/webui/resources/cr_components/customize_themes/DIR_METADATA b/chromium/ui/webui/resources/cr_components/customize_themes/DIR_METADATA
new file mode 100644
index 00000000000..c7043c6d396
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/customize_themes/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Browser>Themes"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/customize_themes/OWNERS b/chromium/ui/webui/resources/cr_components/customize_themes/OWNERS
index 3e630904d62..66d3eb7d65c 100644
--- a/chromium/ui/webui/resources/cr_components/customize_themes/OWNERS
+++ b/chromium/ui/webui/resources/cr_components/customize_themes/OWNERS
@@ -5,5 +5,3 @@ tiborg@chromium.org
per-file *.mojom=set noparent
per-file *.mojom=file://ipc/SECURITY_OWNERS
-
-# COMPONENT: UI>Browser>Themes
diff --git a/chromium/ui/webui/resources/cr_components/omnibox/DIR_METADATA b/chromium/ui/webui/resources/cr_components/omnibox/DIR_METADATA
new file mode 100644
index 00000000000..e776efa54cc
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_components/omnibox/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Browser>Omnibox"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_components/omnibox/OWNERS b/chromium/ui/webui/resources/cr_components/omnibox/OWNERS
index 90b1b756a2d..5535cd29ae9 100644
--- a/chromium/ui/webui/resources/cr_components/omnibox/OWNERS
+++ b/chromium/ui/webui/resources/cr_components/omnibox/OWNERS
@@ -1,3 +1 @@
file://components/omnibox/OWNERS
-
-# COMPONENT: UI>Browser>Omnibox
diff --git a/chromium/ui/webui/resources/cr_elements/BUILD.gn b/chromium/ui/webui/resources/cr_elements/BUILD.gn
index c82088f8b18..708349fa816 100644
--- a/chromium/ui/webui/resources/cr_elements/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/BUILD.gn
@@ -3,10 +3,233 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/preprocess_grit.gni")
import("//tools/polymer/html_to_js.gni")
import("//tools/polymer/polymer.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
+preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_elements"
+preprocess_gen_manifest = "preprocessed_gen_manifest.json"
+preprocess_polymer2_manifest = "preprocessed_polymer2_manifest.json"
+preprocess_src_manifest = "preprocessed_src_manifest.json"
+
+generate_grd("build_grdp") {
+ grd_prefix = "cr_elements"
+ out_grd = "$target_gen_dir/${grd_prefix}_resources.grdp"
+ deps = [ ":preprocess" ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_gen_manifest",
+ "$target_gen_dir/$preprocess_src_manifest",
+ "$target_gen_dir/$preprocess_polymer2_manifest",
+ ]
+ resource_path_prefix = "cr_elements"
+}
+
+group("preprocess") {
+ public_deps = [
+ ":preprocess_generated",
+ ":preprocess_polymer2",
+ ":preprocess_src",
+ ]
+}
+
+preprocess_grit("preprocess_src") {
+ in_folder = "./"
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_src_manifest"
+ in_files = [ "cr_splitter/cr_splitter.js" ]
+}
+
+preprocess_grit("preprocess_polymer2") {
+ in_folder = "./"
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_polymer2_manifest"
+ in_files = [
+ "action_link_css.html",
+ "cr_action_menu/cr_action_menu.html",
+ "cr_action_menu/cr_action_menu.js",
+ "cr_button/cr_button.html",
+ "cr_button/cr_button.js",
+ "cr_checkbox/cr_checkbox.html",
+ "cr_checkbox/cr_checkbox.js",
+ "cr_container_shadow_behavior.html",
+ "cr_container_shadow_behavior.js",
+ "cr_dialog/cr_dialog.html",
+ "cr_dialog/cr_dialog.js",
+ "cr_drawer/cr_drawer.html",
+ "cr_drawer/cr_drawer.js",
+ "cr_expand_button/cr_expand_button.html",
+ "cr_expand_button/cr_expand_button.js",
+ "cr_fingerprint/cr_fingerprint_icon.html",
+ "cr_fingerprint/cr_fingerprint_progress_arc.html",
+ "cr_fingerprint/cr_fingerprint_progress_arc.js",
+ "cr_icon_button/cr_icon_button.html",
+ "cr_icon_button/cr_icon_button.js",
+ "cr_icons_css.html",
+ "cr_input/cr_input.html",
+ "cr_input/cr_input.js",
+ "cr_input/cr_input_style_css.html",
+ "cr_lazy_render/cr_lazy_render.html",
+ "cr_lazy_render/cr_lazy_render.js",
+ "cr_link_row/cr_link_row.html",
+ "cr_link_row/cr_link_row.js",
+ "cr_lottie/cr_lottie.html",
+ "cr_lottie/cr_lottie.js",
+ "cr_page_host_style_css.html",
+ "cr_profile_avatar_selector/cr_profile_avatar_selector_grid.html",
+ "cr_profile_avatar_selector/cr_profile_avatar_selector_grid.js",
+ "cr_profile_avatar_selector/cr_profile_avatar_selector.html",
+ "cr_profile_avatar_selector/cr_profile_avatar_selector.js",
+ "cr_radio_button/cr_card_radio_button.html",
+ "cr_radio_button/cr_card_radio_button.js",
+ "cr_radio_button/cr_radio_button_behavior.html",
+ "cr_radio_button/cr_radio_button_behavior.js",
+ "cr_radio_button/cr_radio_button.html",
+ "cr_radio_button/cr_radio_button.js",
+ "cr_radio_button/cr_radio_button_style_css.html",
+ "cr_radio_group/cr_radio_group.html",
+ "cr_radio_group/cr_radio_group.js",
+ "cr_scrollable_behavior.html",
+ "cr_scrollable_behavior.js",
+ "cr_search_field/cr_search_field_behavior.html",
+ "cr_search_field/cr_search_field_behavior.js",
+ "cr_search_field/cr_search_field.html",
+ "cr_search_field/cr_search_field.js",
+ "cr_slider/cr_slider.html",
+ "cr_slider/cr_slider.js",
+ "cr_tabs/cr_tabs.html",
+ "cr_tabs/cr_tabs.js",
+ "cr_toast/cr_toast.html",
+ "cr_toast/cr_toast.js",
+ "cr_toast/cr_toast_manager.html",
+ "cr_toast/cr_toast_manager.js",
+ "cr_toggle/cr_toggle.html",
+ "cr_toggle/cr_toggle.js",
+ "cr_toolbar/cr_toolbar.html",
+ "cr_toolbar/cr_toolbar.js",
+ "cr_toolbar/cr_toolbar_search_field.html",
+ "cr_toolbar/cr_toolbar_search_field.js",
+ "cr_toolbar/cr_toolbar_selection_overlay.html",
+ "cr_toolbar/cr_toolbar_selection_overlay.js",
+ "cr_view_manager/cr_view_manager.html",
+ "cr_view_manager/cr_view_manager.js",
+ "find_shortcut_behavior.html",
+ "find_shortcut_behavior.js",
+ "hidden_style_css.html",
+ "icons.html",
+ "md_select_css.html",
+ "policy/cr_policy_indicator_behavior.html",
+ "policy/cr_policy_indicator_behavior.js",
+ "policy/cr_policy_indicator.html",
+ "policy/cr_policy_indicator.js",
+ "policy/cr_policy_pref_behavior.html",
+ "policy/cr_policy_pref_behavior.js",
+ "policy/cr_policy_pref_indicator.html",
+ "policy/cr_policy_pref_indicator.js",
+ "policy/cr_tooltip_icon.html",
+ "policy/cr_tooltip_icon.js",
+ "search_highlight_style_css.html",
+ "shared_style_css.html",
+ "shared_vars_css.html",
+ ]
+
+ if (is_chromeos) {
+ in_files += [
+ "chromeos/cros_color_overrides.html",
+ "chromeos/cr_picture/cr_camera.html",
+ "chromeos/cr_picture/cr_camera.js",
+ "chromeos/cr_picture/cr_picture_list.html",
+ "chromeos/cr_picture/cr_picture_list.js",
+ "chromeos/cr_picture/cr_picture_pane.html",
+ "chromeos/cr_picture/cr_picture_pane.js",
+ "chromeos/cr_picture/cr_picture_types.html",
+ "chromeos/cr_picture/cr_picture_types.js",
+ "chromeos/cr_picture/icons.html",
+ "chromeos/cr_picture/png.html",
+ "chromeos/cr_picture/png.js",
+ "cr_searchable_drop_down/cr_searchable_drop_down.html",
+ "cr_searchable_drop_down/cr_searchable_drop_down.js",
+ ]
+ }
+}
+
+preprocess_grit("preprocess_generated") {
+ deps = [ ":polymer3_elements" ]
+ in_folder = target_gen_dir
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+ in_files = [
+ "action_link_css.m.js",
+ "cr_action_menu/cr_action_menu.m.js",
+ "cr_button/cr_button.m.js",
+ "cr_checkbox/cr_checkbox.m.js",
+ "cr_container_shadow_behavior.m.js",
+ "cr_dialog/cr_dialog.m.js",
+ "cr_drawer/cr_drawer.m.js",
+ "cr_expand_button/cr_expand_button.m.js",
+ "cr_fingerprint/cr_fingerprint_icon.m.js",
+ "cr_fingerprint/cr_fingerprint_progress_arc.m.js",
+ "cr_grid/cr_grid.js",
+ "cr_icon_button/cr_icon_button.m.js",
+ "cr_icons_css.m.js",
+ "cr_input/cr_input.m.js",
+ "cr_input/cr_input_style_css.m.js",
+ "cr_lazy_render/cr_lazy_render.m.js",
+ "cr_link_row/cr_link_row.m.js",
+ "cr_lottie/cr_lottie.m.js",
+ "cr_menu_selector/cr_menu_selector.js",
+ "cr_page_host_style_css.m.js",
+ "cr_profile_avatar_selector/cr_profile_avatar_selector_grid.m.js",
+ "cr_profile_avatar_selector/cr_profile_avatar_selector.m.js",
+ "cr_radio_button/cr_card_radio_button.m.js",
+ "cr_radio_button/cr_radio_button_behavior.m.js",
+ "cr_radio_button/cr_radio_button.m.js",
+ "cr_radio_button/cr_radio_button_style_css.m.js",
+ "cr_radio_group/cr_radio_group.m.js",
+ "cr_scrollable_behavior.m.js",
+ "cr_search_field/cr_search_field_behavior.m.js",
+ "cr_search_field/cr_search_field.m.js",
+ "cr_slider/cr_slider.m.js",
+ "cr_tabs/cr_tabs.m.js",
+ "cr_toast/cr_toast_manager.m.js",
+ "cr_toast/cr_toast.m.js",
+ "cr_toggle/cr_toggle.m.js",
+ "cr_toolbar/cr_toolbar.m.js",
+ "cr_toolbar/cr_toolbar_search_field.m.js",
+ "cr_toolbar/cr_toolbar_selection_overlay.m.js",
+ "cr_view_manager/cr_view_manager.m.js",
+ "find_shortcut_behavior.m.js",
+ "hidden_style_css.m.js",
+ "icons.m.js",
+ "md_select_css.m.js",
+ "mwb_shared_icons.js",
+ "mwb_shared_style.js",
+ "mwb_shared_vars.js",
+ "policy/cr_policy_indicator_behavior.m.js",
+ "policy/cr_policy_indicator.m.js",
+ "policy/cr_policy_pref_behavior.m.js",
+ "policy/cr_policy_pref_indicator.m.js",
+ "policy/cr_tooltip_icon.m.js",
+ "search_highlight_style_css.m.js",
+ "shared_style_css.m.js",
+ "shared_vars_css.m.js",
+ ]
+
+ if (is_chromeos) {
+ in_files += [
+ "chromeos/cros_color_overrides.m.js",
+ "chromeos/cr_picture/cr_camera.m.js",
+ "chromeos/cr_picture/cr_picture_list.m.js",
+ "chromeos/cr_picture/cr_picture_pane.m.js",
+ "chromeos/cr_picture/cr_picture_types.m.js",
+ "chromeos/cr_picture/icons.m.js",
+ "chromeos/cr_picture/png.m.js",
+ "cr_searchable_drop_down/cr_searchable_drop_down.m.js",
+ ]
+ }
+}
+
group("closure_compile") {
deps = [
":cr_elements_resources",
@@ -22,6 +245,7 @@ group("closure_compile") {
"cr_input:closure_compile",
"cr_link_row:closure_compile",
"cr_lottie:closure_compile",
+ "cr_menu_selector:closure_compile",
"cr_profile_avatar_selector:closure_compile",
"cr_radio_button:closure_compile",
"cr_radio_group:closure_compile",
@@ -188,6 +412,7 @@ group("polymer3_elements") {
"cr_lazy_render:cr_lazy_render_module",
"cr_link_row:cr_link_row_module",
"cr_lottie:cr_lottie_module",
+ "cr_menu_selector:web_components",
"cr_profile_avatar_selector:polymer3_elements",
"cr_radio_button:polymer3_elements",
"cr_radio_group:cr_radio_group_module",
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/DIR_METADATA b/chromium/ui/webui/resources/cr_elements/chromeos/DIR_METADATA
new file mode 100644
index 00000000000..b39cd583495
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/chromeos/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "OS>Systems>Settings"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/OWNERS b/chromium/ui/webui/resources/cr_elements/chromeos/OWNERS
index a0616b8cd36..96f54b2cb48 100644
--- a/chromium/ui/webui/resources/cr_elements/chromeos/OWNERS
+++ b/chromium/ui/webui/resources/cr_elements/chromeos/OWNERS
@@ -1,3 +1 @@
file://chrome/browser/resources/settings/chromeos/OWNERS
-
-# COMPONENT: OS>Systems>Settings
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn
index ed62aabe2a2..fb064493ebc 100644
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/BUILD.gn
@@ -7,13 +7,6 @@ import("//tools/polymer/polymer.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_cr_elements.gni")
-# This file depends on the legacy global sources assignment filter. It should
-# be converted to check target platform before assigning source files to the
-# sources variable. Remove this import and set_sources_assignment_filter call
-# when the file has been converted. See https://crbug.com/1018739 for details.
-import("//build/config/deprecated_default_sources_assignment_filter.gni")
-set_sources_assignment_filter(deprecated_default_sources_assignment_filter)
-
js_type_check("closure_compile") {
deps = [
":cr_camera",
@@ -70,19 +63,20 @@ js_type_check("closure_compile_module") {
}
js_library("png.m") {
- # Need to turn off default sources filtering by GN, otherwise |sources| is
- # filtered on non-CrOS, because it contains the term "chromeos". This
- # js_library() target is needed in non-CrOS builds as well (see
- # chrome/browser/resources/settings/people_page:people_page.m)
- set_sources_assignment_filter([])
sources = [
"$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/png.m.js",
]
extra_deps = [ ":modulize" ]
}
+# TODO(crbug.com/1134204): This target should probably only be defined if
+# target_os is "chromos" as it does not include any source files on other
+# platforms.
js_library("cr_picture_types.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.m.js" ]
+ sources = []
+ if (is_chromeos) {
+ sources += [ "$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.m.js" ]
+ }
extra_deps = [ ":modulize" ]
}
@@ -96,8 +90,14 @@ group("polymer3_elements") {
]
}
+# TODO(crbug.com/1134204): This target should probably only be defined if
+# target_os is "chromos" as it does not include any source files on other
+# platforms.
js_library("cr_picture_pane.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.m.js" ]
+ sources = []
+ if (is_chromeos) {
+ sources += [ "$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.m.js" ]
+ }
deps = [
":cr_camera.m",
":cr_picture_types.m",
@@ -106,14 +106,26 @@ js_library("cr_picture_pane.m") {
extra_deps = [ ":cr_picture_pane_module" ]
}
+# TODO(crbug.com/1134204): This target should probably only be defined if
+# target_os is "chromos" as it does not include any source files on other
+# platforms.
js_library("cr_camera.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.m.js" ]
+ sources = []
+ if (is_chromeos) {
+ sources += [ "$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.m.js" ]
+ }
deps = [ ":png.m" ]
extra_deps = [ ":cr_camera_module" ]
}
+# TODO(crbug.com/1134204): This target should probably only be defined if
+# target_os is "chromos" as it does not include any source files on other
+# platforms.
js_library("cr_picture_list.m") {
- sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.m.js" ]
+ sources = []
+ if (is_chromeos) {
+ sources += [ "$root_gen_dir/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.m.js" ]
+ }
deps = [
":cr_picture_types.m",
":png.m",
diff --git a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html
index 4ccb9c2e1b8..9546b5dfb92 100644
--- a/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html
+++ b/chromium/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.html
@@ -31,6 +31,10 @@
outline: none;
}
+ img:focus {
+ outline: 1px solid rgba(66, 133, 244, 0.6);
+ }
+
iron-icon {
--iron-icon-fill-color: var(--google-grey-500);
--iron-icon-height: 24px;
@@ -50,8 +54,8 @@
outline: none;
}
- #container {
- outline: none;
+ iron-icon:focus {
+ outline: 1px solid rgba(66, 133, 244, 0.6);
}
</style>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html b/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html
index a5102d531e2..c8e1972cf47 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.html
@@ -19,6 +19,7 @@
min-width: 128px;
outline: none;
padding: 0;
+ position: absolute;
}
:host dialog::backdrop {
diff --git a/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js b/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js
index 90213b046fe..f31d61c3a87 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_button/cr_button.js
@@ -52,7 +52,6 @@ Polymer({
keydown: 'onKeyDown_',
keyup: 'onKeyUp_',
pointerdown: 'onPointerDown_',
- tap: 'onTap_',
},
/**
@@ -193,15 +192,6 @@ Polymer({
},
/**
- * Need to handle tap events to enable tap events for where they are still
- * used with |button.addEventListener('tap', handler)|.
- * TODO(crbug.com/812035): Remove function and listener after Chrome OS no
- * longer uses tap event at least with addEventListener().
- * @private
- */
- onTap_() {},
-
- /**
* Customize the element's ripple. Overriding the '_createRipple' function
* from PaperRippleBehavior.
* @return {PaperRippleElement}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html b/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
index 1a11bd4ba5b..911c83b93c9 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
@@ -161,7 +161,7 @@ List of customizable styles:
<div id="label-container" aria-hidden="true" part="label-container">
<slot></slot>
</div>
- <div id="ariaDescription">[[ariaDescription]]</div>
+ <div id="ariaDescription" aria-hidden="true">[[ariaDescription]]</div>
</template>
<script src="cr_checkbox.js"></script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html b/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
index 00423ce19ae..2e14f41d854 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
@@ -19,8 +19,11 @@
box-shadow: 0 0 16px rgba(0, 0, 0, 0.12),
0 16px 16px rgba(0, 0, 0, 0.24);
color: inherit;
+ max-height: initial;
+ max-width: initial;
overflow-y: hidden;
padding: 0;
+ position: absolute;
top: 50%;
width: var(--cr-dialog-width, 512px);
}
@@ -70,10 +73,10 @@
flex: 1;
font-size: calc(15 / 13 * 100%);
line-height: 1;
- padding-bottom: 16px;
- padding-inline-end: 20px;
- padding-inline-start: 20px;
- padding-top: 20px;
+ padding-bottom: var(--cr-dialog-title-slot-padding-bottom, 16px);
+ padding-inline-end: var(--cr-dialog-title-slot-padding-end, 20px);
+ padding-inline-start: var(--cr-dialog-title-slot-padding-start, 20px);
+ padding-top: var(--cr-dialog-title-slot-padding-top, 20px);
}
:host ::slotted([slot=button-container]) {
@@ -145,9 +148,13 @@
margin-top: 4px;
}
</style>
+ <!-- TODO(crbug/1139958): Remove "not chromeos" block when chromeVox issue is fixed-->
+ <!--Update both "not chromeos" and "chromeos" blocks if either changes-->
+<if expr="not chromeos">
<dialog id="dialog" on-close="onNativeDialogClose_"
- on-cancel="onNativeDialogCancel_" part="dialog" aria-labelledby="title">
- <!-- This wrapper is necessary, such that the "pulse" animation is not
+ on-cancel="onNativeDialogCancel_" part="dialog"
+ aria-labelledby="title">
+ <!-- This wrapper is necessary, such that the "pulse" animation is not
erroneously played when the user clicks on the outer-most scrollbar. -->
<div id="content-wrapper" part="wrapper">
<div class="top-container">
@@ -168,6 +175,32 @@
<slot name="footer"></slot>
</div>
</dialog>
+</if>
+<if expr="chromeos">
+ <dialog id="dialog" on-close="onNativeDialogClose_"
+ on-cancel="onNativeDialogCancel_" part="dialog">
+ <!-- This wrapper is necessary, such that the "pulse" animation is not
+ erroneously played when the user clicks on the outer-most scrollbar. -->
+ <div id="content-wrapper" part="wrapper">
+ <div class="top-container">
+ <div id="title" class="title-container" tabindex="-1">
+ <slot name="title"></slot>
+ </div>
+ <cr-icon-button id="close" class="icon-clear"
+ hidden$="[[!showCloseButton]]" aria-label$="[[closeText]]"
+ on-click="cancel" on-keypress="onCloseKeypress_">
+ </cr-icon-button>
+ </div>
+ <slot name="header"></slot>
+ <div class="body-container" id="container" show-bottom-shadow
+ part="body-container">
+ <slot name="body"></slot>
+ </div>
+ <slot name="button-container"></slot>
+ <slot name="footer"></slot>
+ </div>
+ </dialog>
+</if>
</template>
<script src="cr_dialog.js"></script>
</dom-module>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html b/chromium/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html
index 302cff77fdc..381897374b7 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.html
@@ -16,6 +16,8 @@
bottom: 0;
left: calc(-1 * var(--drawer-width));
margin: 0;
+ max-height: initial;
+ max-width: initial;
overflow: hidden;
padding: 0;
position: absolute;
diff --git a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html b/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html
index 337aa32897e..ab2fa36e6a1 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html
@@ -34,7 +34,7 @@
}
</style>
- <div id="label"><slot></slot></div>
+ <div id="label" aria-hidden="true"><slot></slot></div>
<cr-icon-button id="icon" aria-labelledby="label" disabled="[[disabled]]"
tabindex="[[tabIndex]]"></cr-icon-button>
</template>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
index 0373979a468..4717ef596e1 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
@@ -32,9 +32,11 @@
<div id="canvasDiv">
<canvas id="canvas" height="240" width="460"></canvas>
- <cr-lottie id="scanningAnimation" aria-hidden="true" autoplay>
+ <cr-lottie id="scanningAnimation" aria-hidden="true"
+ autoplay="[[autoplay]]">
</cr-lottie>
- <iron-icon id="enrollmentDone" icon="cr-fingerprint-icon:enrollment-done" hidden>
+ <iron-icon id="enrollmentDone" icon="cr-fingerprint-icon:enrollment-done"
+ hidden>
</iron-icon>
</div>
</template>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js
index 1350b9dc6fe..347fc7022dd 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js
@@ -92,6 +92,15 @@ Polymer({
},
/**
+ * Whether lottie animation should be autoplayed.
+ * @type {boolean}
+ */
+ autoplay: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
* Scale factor based the configured radius (circleRadius) vs the default
* radius (DEFAULT_CANVAS_CIRCLE_RADIUS).
* This will affect the size of icons and checkmark.
@@ -264,6 +273,16 @@ Polymer({
},
/**
+ * Controls the animation based on the value of |shouldPlay|.
+ * @param {boolean} shouldPlay Will play the animation if true else pauses it.
+ */
+ setPlay(shouldPlay) {
+ const scanningAnimation =
+ /** @type {CrLottieElement|HTMLElement} */ (this.$.scanningAnimation);
+ scanningAnimation.setPlay(shouldPlay);
+ },
+
+ /**
* Updates the lottie animation taking into account the current state and
* whether dark mode is enabled.
* @private
diff --git a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html
index 0ef93380275..31727bd9a17 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html
@@ -44,7 +44,12 @@
--cr-icon-button-margin-start: 0;
}
- :host-context([dir=rtl]):host(:not([dir=ltr])) {
+ :host-context([dir=rtl]):host(:not([dir=ltr]):not([multiple-icons_])) {
+ transform: scaleX(-1); /* Invert X: flip on the Y axis (aka mirror). */
+ }
+
+ :host-context([dir=rtl]):host(:not([dir=ltr])[multiple-icons_])
+ iron-icon {
transform: scaleX(-1); /* Invert X: flip on the Y axis (aka mirror). */
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js
index 1bf3b2f4c5f..efcd199a2ed 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js
@@ -63,14 +63,20 @@ Polymer({
observer: 'applyTabIndex_',
},
- disableRipple: {
+ ironIcon: {
+ type: String,
+ observer: 'onIronIconChanged_',
+ reflectToAttribute: true,
+ },
+
+ noRippleOnFocus: {
type: Boolean,
value: false,
},
- ironIcon: {
- type: String,
- observer: 'onIronIconChanged_',
+ /** @private */
+ multipleIcons_: {
+ type: Boolean,
reflectToAttribute: true,
},
@@ -92,7 +98,7 @@ Polymer({
blur: 'onBlur_',
click: 'onClick_',
down: 'showRipple_',
- focus: 'showRipple_',
+ focus: 'onFocus_',
keydown: 'onKeyDown_',
keyup: 'onKeyUp_',
pointerdown: 'ensureRipple',
@@ -120,7 +126,7 @@ Polymer({
/** @private */
showRipple_() {
- if (!this.noink && !this.disabled && !this.disableRipple) {
+ if (!this.noink && !this.disabled) {
this.getRipple().showAndHoldDown();
this.rippleShowing_ = true;
}
@@ -155,9 +161,19 @@ Polymer({
},
/** @private */
+ onFocus_() {
+ if (!this.noRippleOnFocus) {
+ this.showRipple_();
+ }
+ },
+
+ /** @private */
onBlur_() {
this.spaceKeyDown_ = false;
- this.hideRipple_();
+
+ if (!this.noRippleOnFocus) {
+ this.hideRipple_();
+ }
},
/**
@@ -177,6 +193,7 @@ Polymer({
return;
}
const icons = (this.ironIcon || '').split(',');
+ this.multipleIcons_ = icons.length > 1;
icons.forEach(icon => {
const ironIcon = document.createElement('iron-icon');
ironIcon.icon = icon;
diff --git a/chromium/ui/webui/resources/cr_elements/cr_icons_css.html b/chromium/ui/webui/resources/cr_elements/cr_icons_css.html
index fd1e81e1f9f..ab876e906ac 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_icons_css.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_icons_css.html
@@ -28,6 +28,10 @@
--cr-icon-image: url(../images/icon_delete_gray.svg);
}
+ .icon-edit {
+ --cr-icon-image: url(../images/icon_edit.svg);
+ }
+
.icon-picture-delete {
--cr-icon-image: url(../images/icon_picture_delete.svg);
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html
index 92136b08b15..b12e77a65e0 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_input/cr_input.html
@@ -137,7 +137,8 @@
aria-invalid$="[[getAriaInvalid_(invalid)]]"
max="[[max]]" min="[[min]]" on-focus="onInputFocus_"
on-blur="onInputBlur_" on-change="onInputChange_"
- on-keydown="onInputKeydown_" part="input">
+ on-keydown="onInputKeydown_" part="input"
+ autocomplete="off">
<slot name="inline-suffix"></slot>
</div>
<div id="underline"></div>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_menu_selector/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_menu_selector/BUILD.gn
new file mode 100644
index 00000000000..d1fc033f758
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_menu_selector/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/html_to_js.gni")
+
+html_to_js("web_components") {
+ js_files = [ "cr_menu_selector.js" ]
+}
+
+js_type_check("closure_compile") {
+ is_polymer3 = true
+ deps = [ ":cr_menu_selector" ]
+}
+
+js_library("cr_menu_selector") {
+ deps = [
+ "//ui/webui/resources/js:assert.m",
+ "//ui/webui/resources/js/cr/ui:focus_outline_manager.m",
+ ]
+}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.html b/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.html
new file mode 100644
index 00000000000..49aeb95a1db
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.html
@@ -0,0 +1 @@
+<slot></slot> \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.js b/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.js
new file mode 100644
index 00000000000..7b1254a8a3a
--- /dev/null
+++ b/chromium/ui/webui/resources/cr_elements/cr_menu_selector/cr_menu_selector.js
@@ -0,0 +1,107 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
+
+/** @extends {HTMLElement} */
+export class CrMenuSelector extends HTMLElement {
+ static get is() {
+ return 'cr-menu-selector';
+ }
+
+ constructor() {
+ super();
+
+ /** @private {!FocusOutlineManager} */
+ this.focusOutlineManager_;
+
+ this.addEventListener(
+ 'focusin', e => this.onFocusin_(/** @type {!FocusEvent} */ (e)));
+ this.addEventListener(
+ 'keydown', e => this.onKeydown_(/** @type {!KeyboardEvent} */ (e)));
+ }
+
+ connectedCallback() {
+ this.focusOutlineManager_ = FocusOutlineManager.forDocument(document);
+ this.setAttribute('role', 'menu');
+ }
+
+ /**
+ * @return {!Array<!HTMLElement>}
+ * @private
+ */
+ getItems_() {
+ return /** @type {!Array<!HTMLElement>} */ (
+ Array.from(this.querySelectorAll(
+ '[role=menuitem]:not([disabled]):not([hidden])')));
+ }
+
+ /**
+ * @param {!FocusEvent} e
+ * @private
+ */
+ onFocusin_(e) {
+ // If the focus was moved by keyboard and is coming in from a relatedTarget
+ // that is not within this menu, move the focus to the first menu item. This
+ // ensures that the first menu item is always the first focused item when
+ // focusing into the menu.
+ const focusMovedWithKeyboard = this.focusOutlineManager_.visible;
+ const focusMovedFromOutside = e.relatedTarget &&
+ !this.contains(/** @type {!HTMLElement} */ (e.relatedTarget));
+ if (focusMovedWithKeyboard && focusMovedFromOutside) {
+ this.getItems_()[0].focus();
+ }
+ }
+
+ /**
+ * @param {!KeyboardEvent} event
+ * @private
+ */
+ onKeydown_(event) {
+ const items = this.getItems_();
+ assert(items.length >= 1);
+ const currentFocusedIndex = items.indexOf(
+ /** @type {!HTMLElement} */ (this.querySelector(':focus')));
+
+ let newFocusedIndex = currentFocusedIndex;
+ switch (event.key) {
+ case 'Tab':
+ if (event.shiftKey) {
+ // If pressing Shift+Tab, immediately focus the first element so that
+ // when the event is finished processing, the browser automatically
+ // focuses the previous focusable element outside of the menu.
+ items[0].focus();
+ } else {
+ // If pressing Tab, immediately focus the last element so that when
+ // the event is finished processing, the browser automatically focuses
+ // the next focusable element outside of the menu.
+ items[items.length - 1].focus();
+ }
+ return;
+ case 'ArrowDown':
+ newFocusedIndex = (currentFocusedIndex + 1) % items.length;
+ break;
+ case 'ArrowUp':
+ newFocusedIndex =
+ (currentFocusedIndex + items.length - 1) % items.length;
+ break;
+ case 'Home':
+ newFocusedIndex = 0;
+ break;
+ case 'End':
+ newFocusedIndex = items.length - 1;
+ break;
+ }
+
+ if (newFocusedIndex === currentFocusedIndex) {
+ return;
+ }
+
+ event.preventDefault();
+ items[newFocusedIndex].focus();
+ }
+}
+
+customElements.define(CrMenuSelector.is, CrMenuSelector); \ No newline at end of file
diff --git a/chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js b/chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js
index 4da52c65a93..96950a03fba 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js
@@ -10,8 +10,9 @@
/**
* @typedef {{url: string,
* label: string,
- * isGaiaAvatar: (boolean|undefined),
- * selected: (boolean|undefined)}}
+ * index: (number),
+ * isGaiaAvatar: (boolean),
+ * selected: (boolean)}}
*/
/* #export */ let AvatarIcon;
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn
index c1855e35727..cdfd3e6b911 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/BUILD.gn
@@ -41,7 +41,6 @@ group("polymer3_elements") {
js_modulizer("modulize") {
input_files = [ "cr_radio_button_behavior.js" ]
- deps = [ "//third_party/polymer/v3_0/components-chromium/paper-behaviors:paper-ripple-behavior" ]
namespace_rewrites = [ "Polymer.PaperRippleBehavior|PaperRippleBehavior" ]
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html
index 8f5ff9bb3c8..68f46000969 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html
@@ -34,9 +34,10 @@
}
#checkMark {
+ left: var(--cr-card-radio-button-checkmark-left, auto);
position: absolute;
- right: var(--cr-button-edge-spacing);
- top: var(--cr-button-edge-spacing);
+ right: var(--cr-card-radio-button-checkmark-right, var(--cr-button-edge-spacing));
+ top: var(--cr-card-radio-button-checkmark-top, var(--cr-button-edge-spacing));
}
:host(:not([checked])) #checkMark {
diff --git a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html
index 5d797a25a8f..3870420026d 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.html
@@ -38,8 +38,8 @@
:host([disabled]) {
opacity: var(--cr-disabled-opacity);
- /* Disable pointer events for this whole element, as outer on-tap gets
- * triggered when clicking/tapping anywhere in :host. */
+ /* Disable pointer events for this whole element, as outer on-click gets
+ * triggered when clicking anywhere in :host. */
pointer-events: none;
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_search_field/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_search_field/BUILD.gn
index 4fa8b9db92a..7def963811c 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_search_field/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_search_field/BUILD.gn
@@ -36,7 +36,6 @@ group("polymer3_elements") {
js_modulizer("modulize") {
input_files = [ "cr_search_field_behavior.js" ]
- deps = []
}
polymer_modulizer("cr_search_field") {
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toast/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_toast/BUILD.gn
index a06ff0e25c7..a29159d168d 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toast/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_toast/BUILD.gn
@@ -13,7 +13,6 @@ js_type_check("closure_compile") {
}
js_library("cr_toast") {
- deps = [ "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted" ]
}
js_library("cr_toast_manager") {
@@ -57,7 +56,6 @@ js_library("cr_toast.m") {
sources =
[ "$root_gen_dir/ui/webui/resources/cr_elements/cr_toast/cr_toast.m.js" ]
deps = [
- "//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
extra_deps = [ ":cr_toast_module" ]
@@ -67,7 +65,6 @@ js_library("cr_toast_manager.m") {
sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.m.js" ]
deps = [
":cr_toast.m",
- "//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m",
]
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.html b/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.html
index 6debee31ed0..4433d933ad3 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.html
@@ -1,6 +1,5 @@
<link rel="import" href="../../html/polymer.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
<link rel="import" href="../shared_vars_css.html">
@@ -38,7 +37,7 @@
padding: 0 24px;
position: fixed;
transform: translateY(100px);
- transition: opacity 300ms, transform 300ms, visibility 300ms;
+ transition: opacity 300ms, transform 300ms;
visibility: hidden;
z-index: 1;
}
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.js b/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.js
index 7cb95803a7f..97b4d555467 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast.js
@@ -14,16 +14,13 @@ Polymer({
},
open: {
+ readOnly: true,
type: Boolean,
value: false,
reflectToAttribute: true,
},
},
- hostAttributes: {
- 'role': 'alert',
- },
-
observers: ['resetAutoHide_(duration, open)'],
/** @private {number|null} */
@@ -41,75 +38,37 @@ Polymer({
if (this.open && this.duration !== 0) {
this.hideTimeoutId_ = window.setTimeout(() => {
- this.open = false;
+ this._setOpen(false);
}, this.duration);
}
},
/**
- * Announce a11y message
- * @param {string} text
- * @private
- */
- announceA11yMessage_(text) {
- Polymer.IronA11yAnnouncer.requestAvailability();
- this.fire('iron-announce', { text });
- },
-
- /**
* Shows the toast and auto-hides after |this.duration| milliseconds has
* passed. If the toast is currently being shown, any preexisting auto-hide
* is cancelled and replaced with a new auto-hide.
- *
- * If |this.duration| is set to 0, the toast will remain open indefinitely.
- * The caller is responsible for hiding the toast.
- *
- * When |duration| is passed in the non-negative number, |this.duration|
- * is updated to that value.
- *
- * If text is set, replace the toast content with text,
- * can also optionally announce a11y with text
- *
- * @param {number=} duration
- * @param {string=} text
- * @param {boolean=} shouldAnnounceA11y
*/
- show(duration, text, shouldAnnounceA11y) {
- if (text !== undefined) {
- this.textContent = '';
- const span = document.createElement('span');
- span.textContent = text;
- this.appendChild(span);
+ show() {
+ // Force autohide to reset if calling show on an already shown toast.
+ const shouldResetAutohide = this.open;
- if (shouldAnnounceA11y) {
- this.announceA11yMessage_(text);
- }
- }
-
- // |this.resetAutoHide_| is called whenever |this.duration| or |this.open|
- // is changed. If neither is changed, we will still need to reset auto-hide.
- let shouldResetAutoHide = true;
+ // The role attribute is removed first so that screen readers to better
+ // ensure that screen readers will read out the content inside the toast.
+ // If the role is not removed and re-added back in, certain screen readers
+ // do not read out the contents, especially if the text remains exactly
+ // the same as a previous toast.
+ this.removeAttribute('role');
- if (typeof (duration) !== 'undefined' && duration >= 0 &&
- this.duration !== duration) {
- this.duration = duration;
- shouldResetAutoHide = false;
- }
+ this._setOpen(true);
+ this.setAttribute('role', 'alert');
- if (!this.open) {
- this.open = true;
- shouldResetAutoHide = false;
- }
-
- if (shouldResetAutoHide) {
+ if (shouldResetAutohide) {
this.resetAutoHide_();
}
},
- /**
- * Hides the toast.
- */
+ /** Hides the toast. */
hide() {
- this.open = false;
+ this._setOpen(false);
},
});
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html b/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html
index 07ecf9f38a4..5c0ce956af9 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.html
@@ -1,6 +1,5 @@
<link rel="import" href="../../html/polymer.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html">
<link rel="import" href="../../html/assert.html">
<link rel="import" href="../../html/cr.html">
<link rel="import" href="../../html/event_tracker.html">
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js b/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js
index b4df9970a4b..53009cdffbf 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.js
@@ -93,10 +93,6 @@ cr.define('cr.toastManager', () => {
*/
showInternal_(hideSlotted) {
this.$.slotted.hidden = hideSlotted;
- Polymer.IronA11yAnnouncer.requestAvailability();
- this.fire('iron-announce', {
- text: this.$.content.textContent,
- });
this.$.toast.show();
},
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn b/chromium/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
index 040f9a4fba9..7d0f4a7203e 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
+++ b/chromium/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
@@ -38,8 +38,7 @@ polymer_modulizer("cr_toolbar") {
js_file = "cr_toolbar.js"
html_file = "cr_toolbar.html"
html_type = "dom-module"
- auto_imports =
- [ "ui/webui/resources/html/polymer.html|afterNextRender,html,Polymer" ]
+ auto_imports = [ "ui/webui/resources/html/polymer.html|html,Polymer" ]
}
polymer_modulizer("cr_toolbar_search_field") {
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html
index da7259f3012..98231ed6793 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html
@@ -104,72 +104,15 @@
flex: 1 1 0;
text-align: end;
}
-
- #menuPromo {
- align-items: center;
- background: #616161;
- border-radius: 2px;
- color: white;
- display: flex;
- font-size: 92.3%;
- font-weight: 500;
- opacity: 0;
- padding-bottom: 6px;
- padding-inline-end: 12px;
- padding-inline-start: 8px;
- padding-top: 6px;
- position: absolute;
- top: var(--cr-toolbar-height);
- white-space: nowrap;
- z-index: 2;
- }
-
- #menuPromo::before {
- background: inherit;
- /* Up arrow. 105% in Y coordinates fixes glitch at 110/125% zoom. */
- clip-path: polygon(0 105%, 100% 105%, 50% 0);
- content: '';
- display: block;
- height: 6px;
- left: 10px;
- position: absolute;
- top: -6px;
- width: 12px;
- }
-
- :host-context([dir=rtl]) #menuPromo::before {
- left: auto;
- right: 10px;
- }
-
- #closePromo {
- -webkit-appearance: none;
- background: none;
- border: none;
- color: inherit;
- font-size: 20px; /* Shouldn't change if default font-size changes. */
- line-height: 20px;
- margin-inline-start: 12px;
- padding: 0;
- width: 20px;
- }
</style>
<div id="leftContent">
<div id="leftSpacer">
- <!-- Note: showing #menuPromo relies on this dom-if being [restamp]. -->
<template is="dom-if" if="[[showMenu]]" restamp>
<cr-icon-button id="menuButton" class="no-overlap"
iron-icon="cr20:menu" on-click="onMenuTap_"
aria-label$="[[menuLabel]]"
- title="[[titleIfNotShowMenuPromo_(menuLabel, showMenuPromo)]]">
+ title="[[menuLabel]]">
</cr-icon-button>
- <template is="dom-if" if="[[showMenuPromo]]">
- <div id="menuPromo" role="tooltip">
- [[menuPromo]]
- <button id="closePromo" on-click="onClosePromoTap_"
- aria-label$="[[closeMenuPromo]]">&#x2715;</button>
- </paper-tooltip>
- </template>
</template>
<h1>[[pageName]]</h1>
</div>
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js
index 23640a9a3b3..46af1382867 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js
+++ b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js
@@ -18,10 +18,6 @@ Polymer({
// Tooltip to display on the menu button.
menuLabel: String,
- // Promotional toolstip string, shown in narrow mode if showMenuPromo is
- // true.
- menuPromo: String,
-
// Value is proxied through to cr-toolbar-search-field. When true,
// the search field will show a processing spinner.
spinnerActive: Boolean,
@@ -29,12 +25,6 @@ Polymer({
// Controls whether the menu button is shown at the start of the menu.
showMenu: {type: Boolean, value: false},
- // Whether to show menu promo tooltip.
- showMenuPromo: {
- type: Boolean,
- value: false,
- },
-
// Controls whether the search field is shown.
showSearch: {type: Boolean, value: true},
@@ -62,8 +52,6 @@ Polymer({
value: 900,
},
- closeMenuPromo: String,
-
/** @private */
showingSearch_: {
type: Boolean,
@@ -71,50 +59,14 @@ Polymer({
},
},
- observers: [
- 'possiblyShowMenuPromo_(showMenu, showMenuPromo, showingSearch_)',
- ],
-
/** @return {!CrToolbarSearchFieldElement} */
getSearchField() {
return /** @type {!CrToolbarSearchFieldElement} */ (this.$.search);
},
/** @private */
- onClosePromoTap_() {
- this.fire('cr-toolbar-menu-promo-close');
- },
-
- /** @private */
onMenuTap_() {
this.fire('cr-toolbar-menu-tap');
},
- /** @private */
- possiblyShowMenuPromo_() {
- Polymer.RenderStatus.afterNextRender(this, function() {
- if (this.showMenu && this.showMenuPromo && !this.showingSearch_) {
- // The call to animate can have 2 methods of passing the keyframes,
- // however as of the current closure version, only one of them is
- // supported. See https://crbug.com/987842 for more info.
- this.$$('#menuPromo')
- .animate(
- [{opacity: 0}, {opacity: 0.9}],
- /** @type {!KeyframeAnimationOptions} */ ({
- duration: 500,
- fill: 'forwards'
- }));
- this.fire('cr-toolbar-menu-promo-shown');
- }
- }.bind(this));
- },
-
- /**
- * @param {string} title
- * @param {boolean} showMenuPromo
- * @return {string} The title if the menu promo isn't showing, else "".
- */
- titleIfNotShowMenuPromo_(title, showMenuPromo) {
- return showMenuPromo ? '' : title;
- },
});
diff --git a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
index 86e320ea2a3..27a5c19e4ab 100644
--- a/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
+++ b/chromium/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
@@ -50,13 +50,14 @@
}
#prompt {
- --cr-toolbar-search-field-prompt-opacity: .7;
+ color: var(--cr-toolbar-search-field-prompt-color, white);
opacity: 0;
}
@media (prefers-color-scheme: dark) {
#prompt {
--cr-toolbar-search-field-prompt-opacity: 1;
+ color: var(--cr-secondary-text-color, white);
}
}
@@ -138,11 +139,11 @@
}
:host(:not([narrow]):not([showing-search])) #icon {
- opacity: .7;
+ opacity: var(--cr-toolbar-search-field-icon-opacity, .7);
}
:host(:not([narrow])) #prompt {
- opacity: var(--cr-toolbar-search-field-prompt-opacity);
+ opacity: var(--cr-toolbar-search-field-prompt-opacity, .7);
}
:host([narrow]) #prompt {
diff --git a/chromium/ui/webui/resources/cr_elements/icons.html b/chromium/ui/webui/resources/cr_elements/icons.html
index 5790b5860e6..a19c7bd7904 100644
--- a/chromium/ui/webui/resources/cr_elements/icons.html
+++ b/chromium/ui/webui/resources/cr_elements/icons.html
@@ -87,11 +87,6 @@ blurry at 20 px). Please use 20 px icons when available.
d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z">
</path>
</g>
- <g id="check-circle">
- <path
- d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z">
- </path>
- </g>
</if>
<g id="cancel">
<path
@@ -101,6 +96,11 @@ blurry at 20 px). Please use 20 px icons when available.
<g id="check">
<path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"></path>
</g>
+ <g id="check-circle">
+ <path
+ d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z">
+ </path>
+ </g>
<g id="chevron-left">
<path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"></path>
</g>
diff --git a/chromium/ui/webui/resources/cr_elements/mwb_shared_style.html b/chromium/ui/webui/resources/cr_elements/mwb_shared_style.html
index 2a9658d7aef..0ad5679bedb 100644
--- a/chromium/ui/webui/resources/cr_elements/mwb_shared_style.html
+++ b/chromium/ui/webui/resources/cr_elements/mwb_shared_style.html
@@ -22,7 +22,7 @@
}
::-webkit-scrollbar-track {
- background: var(--tab-search-background-color);
+ background: var(--mwb-background-color);
}
::-webkit-scrollbar {
@@ -32,6 +32,8 @@
.mwb-list-item {
align-items: center;
background-color: var(--mwb-background-color);
+ contain-intrinsic-size: var(--mwb-item-height);
+ content-visibility: auto;
display: flex;
height: var(--mwb-item-height);
padding: 0 var(--mwb-list-item-horizontal-margin);
diff --git a/chromium/ui/webui/resources/cr_elements/mwb_shared_vars.html b/chromium/ui/webui/resources/cr_elements/mwb_shared_vars.html
index b7d9ff6ad63..b83244d4024 100644
--- a/chromium/ui/webui/resources/cr_elements/mwb_shared_vars.html
+++ b/chromium/ui/webui/resources/cr_elements/mwb_shared_vars.html
@@ -14,8 +14,8 @@
@media (prefers-color-scheme: dark) {
html {
--mwb-background-color: var(--google-grey-900);
- --mwb-list-item-hover-background-color: var(--google-grey-800);
- --mwb-list-item-selected-background-color: var(--google-grey-refresh-700);
+ --mwb-list-item-hover-background-color: rgb(55, 56, 58); /* #37383a */
+ --mwb-list-item-selected-background-color: rgb(68, 69, 71); /* #444547 */
}
}
</style>
diff --git a/chromium/ui/webui/resources/cr_elements_images.grdp b/chromium/ui/webui/resources/cr_elements_images.grdp
index f7c1c795c1d..61a8eab915c 100644
--- a/chromium/ui/webui/resources/cr_elements_images.grdp
+++ b/chromium/ui/webui/resources/cr_elements_images.grdp
@@ -3,50 +3,52 @@
<!-- TODO(dschuyler): Many of these may be included for the unit tests which
don't appear to flatten the html. We may be able to avoid including
these if the browser_tests would not try to load them. -->
- <include name="IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G"
+ <include name="IDR_WEBUI_IMAGES_200_LOGO_GOOGLE_G_PNG"
file="images/200-logo_googleg.png" type="BINDATA" compress="gzip" />
- <include name="IDR_WEBUI_IMAGES_ARROW_DOWN"
+ <include name="IDR_WEBUI_IMAGES_ARROW_DOWN_SVG"
file="images/arrow_down.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ARROW_RIGHT"
+ <include name="IDR_WEBUI_IMAGES_ARROW_RIGHT_SVG"
file="images/arrow_right.svg" type="BINDATA" />
<include name="IDR_WEBUI_IMAGES_BUSINESS" file="images/business.svg"
type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_DARK_ARROW_DOWN"
+ <include name="IDR_WEBUI_IMAGES_DARK_ARROW_DOWN_SVG"
file="images/dark/arrow_down.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_DARK_ICON_SEARCH"
+ <include name="IDR_WEBUI_IMAGES_DARK_ICON_SEARCH_SVG"
file="images/dark/icon_search.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_ARROW_BACK"
+ <include name="IDR_WEBUI_IMAGES_ICON_ARROW_BACK_SVG"
file="images/icon_arrow_back.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_ARROW_DROPDOWN"
+ <include name="IDR_WEBUI_IMAGES_ICON_ARROW_DROPDOWN_SVG"
file="images/icon_arrow_dropdown.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_CANCEL"
+ <include name="IDR_WEBUI_IMAGES_ICON_CANCEL_SVG"
file="images/icon_cancel.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_CLEAR"
+ <include name="IDR_WEBUI_IMAGES_ICON_CLEAR_SVG"
file="images/icon_clear.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_DELETE_GRAY"
+ <include name="IDR_WEBUI_IMAGES_ICON_DELETE_GRAY_SVG"
file="images/icon_delete_gray.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_EXPAND_LESS"
+ <include name="IDR_WEBUI_IMAGES_ICON_EDIT_SVG"
+ file="images/icon_edit.svg" type="BINDATA" />
+ <include name="IDR_WEBUI_IMAGES_ICON_EXPAND_LESS_SVG"
file="images/icon_expand_less.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_EXPAND_MORE"
+ <include name="IDR_WEBUI_IMAGES_ICON_EXPAND_MORE_SVG"
file="images/icon_expand_more.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_EXTERNAL"
+ <include name="IDR_WEBUI_IMAGES_ICON_EXTERNAL_SVG"
file="images/open_in_new.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_MORE_VERT"
+ <include name="IDR_WEBUI_IMAGES_ICON_MORE_VERT_SVG"
file="images/icon_more_vert.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_PICTURE_DELETE"
+ <include name="IDR_WEBUI_IMAGES_ICON_PICTURE_DELETE_SVG"
file="images/icon_picture_delete.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_REFRESH"
+ <include name="IDR_WEBUI_IMAGES_ICON_REFRESH_SVG"
file="images/icon_refresh.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_SEARCH"
+ <include name="IDR_WEBUI_IMAGES_ICON_SEARCH_SVG"
file="images/icon_search.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_SETTINGS"
+ <include name="IDR_WEBUI_IMAGES_ICON_SETTINGS_SVG"
file="images/icon_settings.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY"
+ <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_SVG"
file="images/icon_visibility.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_OFF"
+ <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_OFF_SVG"
file="images/icon_visibility_off.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ICON_COPY_CONTENT"
+ <include name="IDR_WEBUI_IMAGES_ICON_COPY_CONTENT_SVG"
file="images/icon_copy_content.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_OPEN_IN_NEW"
+ <include name="IDR_WEBUI_IMAGES_OPEN_IN_NEW_SVG"
file="images/open_in_new.svg" type="BINDATA" />
</grit-part>
diff --git a/chromium/ui/webui/resources/cr_elements_resources.grdp b/chromium/ui/webui/resources/cr_elements_resources.grdp
deleted file mode 100644
index ded4e7e62be..00000000000
--- a/chromium/ui/webui/resources/cr_elements_resources.grdp
+++ /dev/null
@@ -1,308 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
- <!-- Polymer 1.0 Elements -->
- <structure name="IDR_CR_ELEMENTS_ACTION_LINK_CSS_HTML"
- file="cr_elements/action_link_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_ACTION_MENU_HTML"
- file="cr_elements/cr_action_menu/cr_action_menu.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_ACTION_MENU_JS"
- file="cr_elements/cr_action_menu/cr_action_menu.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_BUTTON_HTML"
- file="cr_elements/cr_button/cr_button.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_BUTTON_JS"
- file="cr_elements/cr_button/cr_button.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_CHECKBOX_HTML"
- file="cr_elements/cr_checkbox/cr_checkbox.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_CHECKBOX_JS"
- file="cr_elements/cr_checkbox/cr_checkbox.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_CONTAINER_SHADOW_BEHAVIOR_HTML"
- file="cr_elements/cr_container_shadow_behavior.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_CONTAINER_SHADOW_BEHAVIOR_JS"
- file="cr_elements/cr_container_shadow_behavior.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_FINGERPRINT_ICON_HTML"
- file="cr_elements/cr_fingerprint/cr_fingerprint_icon.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_FINGERPRINT_PROGRESS_ARC_HTML"
- file="cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_FINGERPRINT_PROGRESS_ARC_JS"
- file="cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_INPUT_HTML"
- file="cr_elements/cr_input/cr_input.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_INPUT_JS"
- file="cr_elements/cr_input/cr_input.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_INPUT_STYLE_CSS_HTML"
- file="cr_elements/cr_input/cr_input_style_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SCROLLABLE_BEHAVIOR_HTML"
- file="cr_elements/cr_scrollable_behavior.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SCROLLABLE_BEHAVIOR_JS"
- file="cr_elements/cr_scrollable_behavior.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_DIALOG_HTML"
- file="cr_elements/cr_dialog/cr_dialog.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_DIALOG_JS"
- file="cr_elements/cr_dialog/cr_dialog.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_DRAWER_HTML"
- file="cr_elements/cr_drawer/cr_drawer.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_DRAWER_JS"
- file="cr_elements/cr_drawer/cr_drawer.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_EXPAND_BUTTON_HTML"
- file="cr_elements/cr_expand_button/cr_expand_button.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_EXPAND_BUTTON_JS"
- file="cr_elements/cr_expand_button/cr_expand_button.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_ICON_BUTTON_HTML"
- file="cr_elements/cr_icon_button/cr_icon_button.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_ICON_BUTTON_JS"
- file="cr_elements/cr_icon_button/cr_icon_button.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_ICONS_HTML"
- file="cr_elements/icons.html"
- type="chrome_html"
- preprocess="true" />
- <structure name="IDR_CR_ELEMENTS_CR_LAZY_RENDER_HTML"
- file="cr_elements/cr_lazy_render/cr_lazy_render.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_LAZY_RENDER_JS"
- file="cr_elements/cr_lazy_render/cr_lazy_render.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_LINK_ROW_HTML"
- file="cr_elements/cr_link_row/cr_link_row.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_LINK_ROW_JS"
- file="cr_elements/cr_link_row/cr_link_row.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_RADIO_BUTTON_HTML"
- file="cr_elements/cr_radio_button/cr_radio_button.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_RADIO_BUTTON_JS"
- file="cr_elements/cr_radio_button/cr_radio_button.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_CARD_RADIO_BUTTON_HTML"
- file="cr_elements/cr_radio_button/cr_card_radio_button.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_CARD_RADIO_BUTTON_JS"
- file="cr_elements/cr_radio_button/cr_card_radio_button.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_RADIO_BUTTON_BEHAVIOR_HTML"
- file="cr_elements/cr_radio_button/cr_radio_button_behavior.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_RADIO_BUTTON_BEHAVIOR_JS"
- file="cr_elements/cr_radio_button/cr_radio_button_behavior.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_RADIO_BUTTON_STYLE_CSS_HTML"
- file="cr_elements/cr_radio_button/cr_radio_button_style_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_RADIO_GROUP_HTML"
- file="cr_elements/cr_radio_group/cr_radio_group.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_RADIO_GROUP_JS"
- file="cr_elements/cr_radio_group/cr_radio_group.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SLIDER_HTML"
- file="cr_elements/cr_slider/cr_slider.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SLIDER_JS"
- file="cr_elements/cr_slider/cr_slider.js"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_CR_ELEMENTS_CR_SEARCHABLE_DROP_DOWN_HTML"
- file="cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SEARCHABLE_DROP_DOWN_JS"
- file="cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_CR_ELEMENTS_CR_VIEW_MANAGER_HTML"
- file="cr_elements/cr_view_manager/cr_view_manager.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_VIEW_MANAGER_JS"
- file="cr_elements/cr_view_manager/cr_view_manager.js"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CROS_COLOR_OVERRIDES_HTML"
- file="cr_elements/chromeos/cros_color_overrides.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CR_CAMERA_HTML"
- file="cr_elements/chromeos/cr_picture/cr_camera.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CR__CAMERA_JS"
- file="cr_elements/chromeos/cr_picture/cr_camera.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CR_PICTURE_LIST_HTML"
- file="cr_elements/chromeos/cr_picture/cr_picture_list.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CR__PICTURE_LIST_JS"
- file="cr_elements/chromeos/cr_picture/cr_picture_list.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CR_PICTURE_PANE_HTML"
- file="cr_elements/chromeos/cr_picture/cr_picture_pane.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CR_PICTURE_PANE_JS"
- file="cr_elements/chromeos/cr_picture/cr_picture_pane.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CR_PICTURE_TYPES_HTML"
- file="cr_elements/chromeos/cr_picture/cr_picture_types.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CR_PICTURE_TYPES_JS"
- file="cr_elements/chromeos/cr_picture/cr_picture_types.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_PNG_HTML"
- file="cr_elements/chromeos/cr_picture/png.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_PNG_JS"
- file="cr_elements/chromeos/cr_picture/png.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_ICONS_HTML"
- file="cr_elements/chromeos/cr_picture/icons.html"
- type="chrome_html" />
- </if>
- <structure name="IDR_CR_ELEMENTS_CR_LOTTIE_HTML"
- file="cr_elements/cr_lottie/cr_lottie.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_LOTTIE_JS"
- file="cr_elements/cr_lottie/cr_lottie.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_POLICY_INDICATOR_HTML"
- file="cr_elements/policy/cr_policy_indicator.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_POLICY_INDICATOR_JS"
- file="cr_elements/policy/cr_policy_indicator.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_POLICY_INDICATOR_BEHAVIOR_HTML"
- file="cr_elements/policy/cr_policy_indicator_behavior.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_POLICY_INDICATOR_BEHAVIOR_JS"
- file="cr_elements/policy/cr_policy_indicator_behavior.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_POLICY_PREF_BEHAVIOR_HTML"
- file="cr_elements/policy/cr_policy_pref_behavior.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_POLICY_PREF_BEHAVIOR_JS"
- file="cr_elements/policy/cr_policy_pref_behavior.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_POLICY_PREF_INDICATOR_JS"
- file="cr_elements/policy/cr_policy_pref_indicator.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_POLICY_PREF_INDICATOR_HTML"
- file="cr_elements/policy/cr_policy_pref_indicator.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOGGLE_HTML"
- file="cr_elements/cr_toggle/cr_toggle.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOGGLE_JS"
- file="cr_elements/cr_toggle/cr_toggle.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOOLTIP_ICON_HTML"
- file="cr_elements/policy/cr_tooltip_icon.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOOLTIP_ICON_JS"
- file="cr_elements/policy/cr_tooltip_icon.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_PROFILE_AVATAR_SELECTOR_HTML"
- file="cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_PROFILE_AVATAR_SELECTOR_JS"
- file="cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_PROFILE_AVATAR_ICON_SELECTOR_GRID_HTML"
- file="cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector_grid.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_PROFILE_AVATAR_SELECTOR_GRID_JS"
- file="cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector_grid.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SEARCH_FIELD_HTML"
- file="cr_elements/cr_search_field/cr_search_field.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SEARCH_FIELD_JS"
- file="cr_elements/cr_search_field/cr_search_field.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SEARCH_FIELD_BEHAVIOR_HTML"
- file="cr_elements/cr_search_field/cr_search_field_behavior.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SEARCH_FIELD_BEHAVIOR_JS"
- file="cr_elements/cr_search_field/cr_search_field_behavior.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SHARED_STYLE_CSS_HTML"
- file="cr_elements/shared_style_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_HIDDEN_STYLE_CSS_HTML"
- file="cr_elements/hidden_style_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_ICONS_CSS_HTML"
- file="cr_elements/cr_icons_css.html"
- flattenhtml="true"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_PAGE_HOST_STYLE_CSS_HTML"
- file="cr_elements/cr_page_host_style_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_MD_SELECT_CSS_HTML"
- file="cr_elements/md_select_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_SEARCH_HIGHLIGHT_STYLE_CSS_HTML"
- file="cr_elements/search_highlight_style_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_SHARED_VARS_CSS_HTML"
- file="cr_elements/shared_vars_css.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TABS_HTML"
- file="cr_elements/cr_tabs/cr_tabs.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TABS_JS"
- file="cr_elements/cr_tabs/cr_tabs.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOOLBAR_HTML"
- file="cr_elements/cr_toolbar/cr_toolbar.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOOLBAR_JS"
- file="cr_elements/cr_toolbar/cr_toolbar.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOOLBAR_SEARCH_FIELD_HTML"
- file="cr_elements/cr_toolbar/cr_toolbar_search_field.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOOLBAR_SEARCH_FIELD_JS"
- file="cr_elements/cr_toolbar/cr_toolbar_search_field.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOOLBAR_SELECTION_OVERLAY_HTML"
- file="cr_elements/cr_toolbar/cr_toolbar_selection_overlay.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOOLBAR_SELECTION_OVERLAY_JS"
- file="cr_elements/cr_toolbar/cr_toolbar_selection_overlay.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOAST_HTML"
- file="cr_elements/cr_toast/cr_toast.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOAST_JS"
- file="cr_elements/cr_toast/cr_toast.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOAST_MANAGER_HTML"
- file="cr_elements/cr_toast/cr_toast_manager.html"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_CR_TOAST_MANAGER_JS"
- file="cr_elements/cr_toast/cr_toast_manager.js"
- type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_FIND_SHORTCUT_BEHAVIOR_HTML"
- file="cr_elements/find_shortcut_behavior.html" type="chrome_html" />
- <structure name="IDR_CR_ELEMENTS_FIND_SHORTCUT_BEHAVIOR_JS"
- file="cr_elements/find_shortcut_behavior.js" type="chrome_html" />
-</grit-part>
diff --git a/chromium/ui/webui/resources/cr_elements_resources_v3.grdp b/chromium/ui/webui/resources/cr_elements_resources_v3.grdp
deleted file mode 100644
index c5a527d5966..00000000000
--- a/chromium/ui/webui/resources/cr_elements_resources_v3.grdp
+++ /dev/null
@@ -1,254 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
- <!-- Polymer 3.0 Elements -->
- <include name="IDR_CR_ELEMENTS_ACTION_LINK_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/action_link_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_ACTION_MENU_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_BUTTON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_button/cr_button.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_CHECKBOX_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_CONTAINER_SHADOW_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_container_shadow_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_DIALOG_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_DRAWER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_drawer/cr_drawer.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_EXPAND_BUTTON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_FINGERPRINT_ICON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_FINGERPRINT_PROGRESS_ARC_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_GRID_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_grid/cr_grid.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_ICON_BUTTON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_ICONS_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_icons_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_INPUT_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_input/cr_input.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_INPUT_STYLE_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_input/cr_input_style_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_PAGE_HOST_STYLE_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_page_host_style_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_LAZY_RENDER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_LINK_ROW_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_PROFILE_AVATAR_SELECTOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_PROFILE_AVATAR_SELECTOR_GRID_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector_grid.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_CARD_RADIO_BUTTON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_RADIO_BUTTON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_RADIO_BUTTON_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_RADIO_BUTTON_STYLE_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_style_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_RADIO_GROUP_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_SCROLLABLE_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_scrollable_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_SEARCH_FIELD_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_search_field/cr_search_field.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_SEARCH_FIELD_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_SHARED_STYLE_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/shared_style_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_SHARED_VARS_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/shared_vars_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_SLIDER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_slider/cr_slider.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_SPLITTER_JS"
- file="cr_elements/cr_splitter/cr_splitter.js"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_TABS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_tabs/cr_tabs.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_TOAST_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_toast/cr_toast.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_TOAST_MANAGER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_toast/cr_toast_manager.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_TOGGLE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_TOOLBAR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_TOOLBAR_SEARCH_FIELD_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_TOOLBAR_SELECTION_OVERLAY_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_selection_overlay.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_FIND_SHORTCUT_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/find_shortcut_behavior.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_POLICY_CR_TOOLTIP_ICON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/policy/cr_tooltip_icon.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_POLICY_CR_POLICY_INDICATOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/policy/cr_policy_indicator.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_POLICY_CR_POLICY_INDICATOR_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_POLICY_CR_POLICY_PREF_INDICATOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_POLICY_CR_POLICY_PREF_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/policy/cr_policy_pref_behavior.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CR_VIEW_MANAGER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_MD_SELECT_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/md_select_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_MWB_SHARED_ICONS_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/mwb_shared_icons.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_MWB_SHARED_STYLE_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/mwb_shared_style.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_MWB_SHARED_VARS_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/mwb_shared_vars.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_HIDDEN_STYLE_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/hidden_style_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_ICONS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/icons.m.js"
- use_base_dir="false"
- preprocess="true"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_SEARCH_HIGHLIGHT_STYLE_CSS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/search_highlight_style_css.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <if expr="chromeos">
- <include name="IDR_CR_ELEMENTS_CR_SEARCHABLE_DROP_DOWN_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_searchable_drop_down/cr_searchable_drop_down.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CHROMEOS_CROS_COLOR_OVERRIDES_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/chromeos/cros_color_overrides.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_PNG_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/chromeos/cr_picture/png.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_CAMERA_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_camera.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_PICTURE_LIST_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_list.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_PICTURE_PANE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_pane.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_PICTURE_TYPES_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/chromeos/cr_picture/cr_picture_types.m.js"
- use_base_dir="false"
- type="BINDATA" />
- <include name="IDR_CR_ELEMENTS_CHROMEOS_CR_PICTURE_ICONS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/chromeos/cr_picture/icons.m.js"
- use_base_dir="false"
- preprocess="true"
- type="BINDATA" />
- </if>
- <include name="IDR_CR_ELEMENTS_LOTTIE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_lottie/cr_lottie.m.js"
- use_base_dir="false"
- type="BINDATA" />
-</grit-part>
diff --git a/chromium/ui/webui/resources/cr_polymer_resources.grdp b/chromium/ui/webui/resources/cr_polymer_resources.grdp
deleted file mode 100644
index 4ed463ad149..00000000000
--- a/chromium/ui/webui/resources/cr_polymer_resources.grdp
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Holds various resources under ui/webui/resources/{js,html}, that depend on
- Polymer or are Polymer related. -->
-<grit-part>
- <!-- HTML resources -->
- <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_ROW_BEHAVIOR"
- file="html/cr/ui/focus_row_behavior.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_WITHOUT_INK"
- file="html/cr/ui/focus_without_ink.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_I18N_BEHAVIOR"
- file="html/i18n_behavior.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_LIST_PROPERTY_UPDATE_BEHAVIOR"
- file="html/list_property_update_behavior.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_POLYMER"
- file="html/polymer.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_WEBUI_LISTENER_BEHAVIOR"
- file="html/web_ui_listener_behavior.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_SEARCH_HIGHLIGHT_UTILS"
- file="html/search_highlight_utils.html" type="chrome_html" />
-
- <!-- CSS resources -->
- <structure name="IDR_WEBUI_CSS_MD_COLORS"
- file="css/md_colors.css" type="chrome_html" />
-
- <!-- JS resources -->
- <structure name="IDR_WEBUI_JS_I18N_BEHAVIOR"
- file="js/i18n_behavior.js" type="chrome_html" preprocess="true" />
- <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_ROW_BEHAVIOR"
- file="js/cr/ui/focus_row_behavior.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_WITHOUT_INK"
- file="js/cr/ui/focus_without_ink.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_LIST_PROPERTY_UPDATE_BEHAVIOR"
- file="js/list_property_update_behavior.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_POLYMER_CONFIG"
- file="js/polymer_config.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_WEBUI_LISTENER_BEHAVIOR"
- file="js/web_ui_listener_behavior.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_SEARCH_HIGHLIGHT_UTILS"
- file="js/search_highlight_utils.js" type="chrome_html" />
-</grit-part>
diff --git a/chromium/ui/webui/resources/cr_polymer_resources_v3.grdp b/chromium/ui/webui/resources/cr_polymer_resources_v3.grdp
deleted file mode 100644
index 2b3c9799732..00000000000
--- a/chromium/ui/webui/resources/cr_polymer_resources_v3.grdp
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
- <include name="IDR_WEBUI_JS_CR_UI_FOCUS_ROW_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_row_behavior.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_I18N_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/i18n_behavior.m.js"
- use_base_dir="false" type="BINDATA"
- preprocess="true" />
- <include name="IDR_WEBUI_JS_LIST_PROPERTY_UPDATE_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/list_property_update_behavior.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_SEARCH_HIGHLIGHT_UTILS_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/search_highlight_utils.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_WEBUI_LISTENER_BEHAVIOR_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/web_ui_listener_behavior.m.js"
- use_base_dir="false" type="BINDATA" />
-</grit-part>
diff --git a/chromium/ui/webui/resources/css/BUILD.gn b/chromium/ui/webui/resources/css/BUILD.gn
new file mode 100644
index 00000000000..755e164eae6
--- /dev/null
+++ b/chromium/ui/webui/resources/css/BUILD.gn
@@ -0,0 +1,57 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tools/grit/preprocess_grit.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+include_polymer = !is_android && !is_ios
+
+preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/css"
+preprocess_src_manifest = "preprocessed_src_manifest.json"
+
+generate_grd("build_grdp") {
+ grd_prefix = "webui_css"
+ out_grd = "$target_gen_dir/resources.grdp"
+ deps = [ ":preprocess_src" ]
+ manifest_files = [ "$target_gen_dir/$preprocess_src_manifest" ]
+ resource_path_prefix = "css"
+}
+
+preprocess_grit("preprocess_src") {
+ in_folder = "./"
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_src_manifest"
+ in_files = [
+ "action_link.css",
+ "apps/common.css",
+ "apps/topbutton_bar.css",
+ "bubble_button.css",
+ "bubble.css",
+ "butter_bar.css",
+ "chrome_shared.css",
+ "dialogs.css",
+ "i18n_process.css",
+ "list.css",
+ "roboto.css",
+ "table.css",
+ "tabs.css",
+ "text_defaults.css",
+ "text_defaults_md.css",
+ "throbber.css",
+
+ # TODO(dpapad): Include remaining files once thy no longer depend on
+ # flattenhtml=true.
+ #"controlled_indicator.css",
+ #"menu_button.css",
+ #"menu.css",
+ #"overlay.css",
+ #"spinner.css",
+ #"tree.css",
+ #"widgets.css",
+ ]
+
+ if (include_polymer) {
+ in_files += [ "md_colors.css" ]
+ }
+}
diff --git a/chromium/ui/webui/resources/html/BUILD.gn b/chromium/ui/webui/resources/html/BUILD.gn
new file mode 100644
index 00000000000..c1eff1165a7
--- /dev/null
+++ b/chromium/ui/webui/resources/html/BUILD.gn
@@ -0,0 +1,62 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+include_polymer = !is_android && !is_ios
+
+generate_grd("build_grdp") {
+ grd_prefix = "webui_html"
+ out_grd = "$target_gen_dir/resources.grdp"
+ resource_path_prefix = "html"
+ input_files = [
+ "action_link.html",
+ "assert.html",
+ "cr/event_target.html",
+ "cr.html",
+ "cr/ui/array_data_model.html",
+ "cr/ui/command.html",
+ "cr/ui/context_menu_handler.html",
+ "cr/ui/drag_wrapper.html",
+ "cr/ui/focus_grid.html",
+ "cr/ui/focus_manager.html",
+ "cr/ui/focus_outline_manager.html",
+ "cr/ui/focus_row.html",
+ "cr/ui.html",
+ "cr/ui/keyboard_shortcut_list.html",
+ "cr/ui/list.html",
+ "cr/ui/list_item.html",
+ "cr/ui/list_selection_controller.html",
+ "cr/ui/list_selection_model.html",
+ "cr/ui/menu_button.html",
+ "cr/ui/menu.html",
+ "cr/ui/menu_item.html",
+ "cr/ui/overlay.html",
+ "cr/ui/position_util.html",
+ "cr/ui/splitter.html",
+ "cr/ui/store_client.html",
+ "cr/ui/store.html",
+ "event_tracker.html",
+ "icon.html",
+ "load_time_data.html",
+ "parse_html_subset.html",
+ "promise_resolver.html",
+ "test_loader.html",
+ "trash.html",
+ "util.html",
+ ]
+
+ if (include_polymer) {
+ input_files += [
+ "cr/ui/focus_row_behavior.html",
+ "cr/ui/focus_without_ink.html",
+ "i18n_behavior.html",
+ "list_property_update_behavior.html",
+ "polymer.html",
+ "search_highlight_utils.html",
+ "web_ui_listener_behavior.html",
+ ]
+ }
+ input_files_base_dir = rebase_path(".", "//")
+}
diff --git a/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close.png b/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close.png
deleted file mode 100644
index 65d84b771ea..00000000000
--- a/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close_hover.png b/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close_hover.png
deleted file mode 100644
index 9f7d3dbadb4..00000000000
--- a/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close_hover.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close_pressed.png b/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close_pressed.png
deleted file mode 100644
index 6a93b4e5f12..00000000000
--- a/chromium/ui/webui/resources/images/2x/apps/button_butter_bar_close_pressed.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/webui/resources/images/apps/button_butter_bar_close.png b/chromium/ui/webui/resources/images/apps/button_butter_bar_close.png
deleted file mode 100644
index 001f22742c3..00000000000
--- a/chromium/ui/webui/resources/images/apps/button_butter_bar_close.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/webui/resources/images/apps/button_butter_bar_close_hover.png b/chromium/ui/webui/resources/images/apps/button_butter_bar_close_hover.png
deleted file mode 100644
index 906436343a4..00000000000
--- a/chromium/ui/webui/resources/images/apps/button_butter_bar_close_hover.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/webui/resources/images/apps/button_butter_bar_close_pressed.png b/chromium/ui/webui/resources/images/apps/button_butter_bar_close_pressed.png
deleted file mode 100644
index 45abc414d89..00000000000
--- a/chromium/ui/webui/resources/images/apps/button_butter_bar_close_pressed.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/webui/resources/images/google_logo.svg b/chromium/ui/webui/resources/images/google_logo.svg
deleted file mode 100644
index a971e1d7a9d..00000000000
--- a/chromium/ui/webui/resources/images/google_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="272" height="92"><path fill="#EA4335" d="M115.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18C71.25 34.32 81.24 25 93.5 25s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44S80.99 39.2 80.99 47.18c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z"/><path fill="#FBBC05" d="M163.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18c0-12.85 9.99-22.18 22.25-22.18s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44s-12.51 5.46-12.51 13.44c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z"/><path fill="#4285F4" d="M209.75 26.34v39.82c0 16.38-9.66 23.07-21.08 23.07-10.75 0-17.22-7.19-19.66-13.07l8.48-3.53c1.51 3.61 5.21 7.87 11.17 7.87 7.31 0 11.84-4.51 11.84-13v-3.19h-.34c-2.18 2.69-6.38 5.04-11.68 5.04-11.09 0-21.25-9.66-21.25-22.09 0-12.52 10.16-22.26 21.25-22.26 5.29 0 9.49 2.35 11.68 4.96h.34v-3.61h9.25zm-8.56 20.92c0-7.81-5.21-13.52-11.84-13.52-6.72 0-12.35 5.71-12.35 13.52 0 7.73 5.63 13.36 12.35 13.36 6.63 0 11.84-5.63 11.84-13.36z"/><path fill="#34A853" d="M225 3v65h-9.5V3h9.5z"/><path fill="#EA4335" d="M262.02 54.48l7.56 5.04c-2.44 3.61-8.32 9.83-18.48 9.83-12.6 0-22.01-9.74-22.01-22.18 0-13.19 9.49-22.18 20.92-22.18 11.51 0 17.14 9.16 18.98 14.11l1.01 2.52-29.65 12.28c2.27 4.45 5.8 6.72 10.75 6.72 4.96 0 8.4-2.44 10.92-6.14zm-23.27-7.98l19.82-8.23c-1.09-2.77-4.37-4.7-8.23-4.7-4.95 0-11.84 4.37-11.59 12.93z"/><path fill="#4285F4" d="M35.29 41.41V32H67c.31 1.64.47 3.58.47 5.68 0 7.06-1.93 15.79-8.15 22.01-6.05 6.3-13.78 9.66-24.02 9.66C16.32 69.35.36 53.89.36 34.91.36 15.93 16.32.47 35.3.47c10.5 0 17.98 4.12 23.6 9.49l-6.64 6.64c-4.03-3.78-9.49-6.72-16.97-6.72-13.86 0-24.7 11.17-24.7 25.03 0 13.86 10.84 25.03 24.7 25.03 8.99 0 14.11-3.61 17.39-6.89 2.66-2.66 4.41-6.46 5.1-11.65l-22.49.01z"/></svg> \ No newline at end of file
diff --git a/chromium/ui/webui/resources/images/icon_edit.svg b/chromium/ui/webui/resources/images/icon_edit.svg
new file mode 100644
index 00000000000..2acc71a13c8
--- /dev/null
+++ b/chromium/ui/webui/resources/images/icon_edit.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M20.41 4.94l-1.35-1.35c-.78-.78-2.05-.78-2.83 0L13.4 6.41 3 16.82V21h4.18l10.46-10.46 2.77-2.77c.79-.78.79-2.05 0-2.83zm-14 14.12L5 19v-1.36l9.82-9.82 1.41 1.41-9.82 9.83z"/></svg> \ No newline at end of file
diff --git a/chromium/ui/webui/resources/js/BUILD.gn b/chromium/ui/webui/resources/js/BUILD.gn
index a74ecbccf87..597d8f7e369 100644
--- a/chromium/ui/webui/resources/js/BUILD.gn
+++ b/chromium/ui/webui/resources/js/BUILD.gn
@@ -3,8 +3,101 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/preprocess_grit.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
import("../tools/js_modulizer.gni")
+preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/js"
+preprocess_gen_manifest = "preprocessed_gen_manifest.json"
+preprocess_src_manifest = "preprocessed_src_manifest.json"
+
+include_polymer = !is_android && !is_ios
+
+generate_grd("build_grdp") {
+ grd_prefix = "webui_js"
+ out_grd = "$target_gen_dir/resources.grdp"
+ deps = [ ":preprocess" ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_gen_manifest",
+ "$target_gen_dir/$preprocess_src_manifest",
+ ]
+ resource_path_prefix = "js"
+}
+
+group("preprocess") {
+ public_deps = [
+ ":preprocess_generated",
+ ":preprocess_src",
+ "cr/ui:preprocess",
+ ]
+}
+
+preprocess_grit("preprocess_src") {
+ in_folder = "./"
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_src_manifest"
+ in_files = [
+ "action_link.js",
+ "assert.js",
+ "color_utils.js",
+ "cr/event_target.js",
+ "cr.js",
+ "cr.m.js",
+ "cr/ui.js",
+ "event_tracker.js",
+ "i18n_template_no_process.js",
+ "icon.js",
+ "load_time_data.js",
+ "parse_html_subset.js",
+ "plural_string_proxy.js",
+ "promise_resolver.js",
+ "test_loader.js",
+ "util.js",
+ "webui_resource_test.js",
+ ]
+
+ if (is_chromeos) {
+ in_files += [ "i18n_template_process.js" ]
+ }
+
+ if (include_polymer) {
+ in_files += [
+ "i18n_behavior.js",
+ "list_property_update_behavior.js",
+ "polymer_config.js",
+ "search_highlight_utils.js",
+ "web_ui_listener_behavior.js",
+ ]
+ }
+}
+
+preprocess_grit("preprocess_generated") {
+ deps = [ ":modulize" ]
+ in_folder = target_gen_dir
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+ in_files = [
+ "assert.m.js",
+ "cr/event_target.m.js",
+ "cr/ui.m.js",
+ "event_tracker.m.js",
+ "icon.m.js",
+ "load_time_data.m.js",
+ "parse_html_subset.m.js",
+ "promise_resolver.m.js",
+ "util.m.js",
+ ]
+
+ if (include_polymer) {
+ in_files += [
+ "i18n_behavior.m.js",
+ "list_property_update_behavior.m.js",
+ "search_highlight_utils.m.js",
+ "web_ui_listener_behavior.m.js",
+ ]
+ }
+}
+
group("closure_compile") {
deps = [
":js_resources",
@@ -115,7 +208,14 @@ js_library("webui_resource_test") {
# Targets for auto-generating and type-checking JS Modules
-js_modulizer("modulize") {
+group("modulize") {
+ public_deps = [
+ ":modulize_local",
+ "cr:modulize",
+ ]
+}
+
+js_modulizer("modulize_local") {
input_files = [
"assert.js",
"event_tracker.js",
@@ -133,7 +233,6 @@ js_modulizer("modulize") {
"cr.search_highlight_utils.Range|Range",
"Polymer.ArraySplice.calculateSplices|calculateSplices",
]
- deps = [ "cr:modulize" ]
}
group("closure_compile_modules") {
@@ -164,7 +263,7 @@ js_type_check("js_resources_modules") {
js_library("assert.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/assert.m.js" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("cr.m") {
@@ -177,13 +276,13 @@ js_library("cr.m") {
js_library("event_tracker.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/event_tracker.m.js" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("icon.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/icon.m.js" ]
deps = [ ":cr.m" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("i18n_behavior.m") {
@@ -192,7 +291,7 @@ js_library("i18n_behavior.m") {
":load_time_data.m",
":parse_html_subset.m",
]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("list_property_update_behavior.m") {
@@ -202,7 +301,7 @@ js_library("list_property_update_behavior.m") {
deps = [
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("load_time_data.m") {
@@ -212,12 +311,12 @@ js_library("load_time_data.m") {
":parse_html_subset.m",
"//third_party/jstemplate:jstemplate",
]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("parse_html_subset.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/parse_html_subset.m.js" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("plural_string_proxy") {
@@ -227,14 +326,14 @@ js_library("plural_string_proxy") {
js_library("promise_resolver.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/promise_resolver.m.js" ]
deps = [ ":assert.m" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("search_highlight_utils.m") {
sources =
[ "$root_gen_dir/ui/webui/resources/js/search_highlight_utils.m.js" ]
deps = [ ":assert.m" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("util.m") {
@@ -244,12 +343,12 @@ js_library("util.m") {
":cr.m",
]
externs_list = [ "$externs_path/chrome_send.js" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
js_library("web_ui_listener_behavior.m") {
sources =
[ "$root_gen_dir/ui/webui/resources/js/web_ui_listener_behavior.m.js" ]
deps = [ ":cr.m" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
}
diff --git a/chromium/ui/webui/resources/js/action_link.js b/chromium/ui/webui/resources/js/action_link.js
index e67182c0b27..f241bb49a8b 100644
--- a/chromium/ui/webui/resources/js/action_link.js
+++ b/chromium/ui/webui/resources/js/action_link.js
@@ -13,9 +13,9 @@
// underlined). This gives the user an idea that clicking this link will do
// something similar to navigation but in the same page.
//
-// They can be created in JavaScript like this:
+// They can be created in JavaScript like this (note second arg):
//
-// var link = document.createElement('a', 'action-link'); // Note second arg.
+// var link = document.createElement('a', {is: 'action-link'});
//
// or with a constructor like this:
//
diff --git a/chromium/ui/webui/resources/js/cr.gni b/chromium/ui/webui/resources/js/cr.gni
new file mode 100644
index 00000000000..360d4c4d698
--- /dev/null
+++ b/chromium/ui/webui/resources/js/cr.gni
@@ -0,0 +1,43 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+cr_namespace_rewrites = [
+ "cr.getPropertyDescriptor|getPropertyDescriptor",
+ "cr.PropertyKind|PropertyKind",
+ "cr.dispatchPropertyChange|dispatchPropertyChange",
+ "cr.EventTarget|EventTarget",
+ "cr.ui.Command|Command",
+ "cr.ui.contextMenuHandler|contextMenuHandler",
+ "cr.ui.decorate|decorate",
+ "cr.ui.dialogs.BaseDialog|BaseDialog",
+ "cr.ui.dialogs.AlertDialog|AlertDialog",
+ "cr.ui.dialogs.ConfirmDialog|ConfirmDialog",
+ "cr.ui.dialogs.PromptDialog|PromptDialog",
+ "cr.ui.Action|Action",
+ "cr.ui.AnchorType|AnchorType",
+ "cr.ui.ArrayDataModel|ArrayDataModel",
+ "cr.ui.define|crUiDefine",
+ "cr.ui.DeferredAction|DeferredAction",
+ "cr.ui.DragWrapperDelegate|DragWrapperDelegate",
+ "cr.ui.FocusRowDelegate|FocusRowDelegate",
+ "cr.ui.FocusRow|FocusRow",
+ "cr.ui.Grid|Grid",
+ "cr.ui.HideType|HideType",
+ "cr.ui.limitInputWidth|limitInputWidth",
+ "cr.ui.List|List",
+ "cr.ui.ListItem|ListItem",
+ "cr.ui.ListSelectionModel|ListSelectionModel",
+ "cr.ui.ListSelectionController|ListSelectionController",
+ "cr.ui.Menu|Menu",
+ "cr.ui.positionPopupAroundElement|positionPopupAroundElement",
+ "cr.ui.positionPopupAtPoint|positionPopupAtPoint",
+ "cr.ui.swallowDoubleClick|swallowDoubleClick",
+ "cr.ui.Size|Size",
+ "cr.ui.Splitter|Splitter",
+ "cr.ui.StoreObserver|StoreObserver",
+ "cr.ui.Tab|Tab",
+ "cr.ui.Tree|Tree",
+ "cr.ui.TreeItem|TreeItem",
+ "cr.ui.VirtualFocusRow|VirtualFocusRow",
+]
diff --git a/chromium/ui/webui/resources/js/cr.js b/chromium/ui/webui/resources/js/cr.js
index a7f9d9d6d08..655ccfce4a3 100644
--- a/chromium/ui/webui/resources/js/cr.js
+++ b/chromium/ui/webui/resources/js/cr.js
@@ -223,6 +223,25 @@ var cr = cr || function(global) {
}
/**
+ * Returns a getter and setter to be used as property descriptor in
+ * Object.defineProperty(). When the setter changes the value a property
+ * change event with the type {@code name + 'Change'} is fired.
+ * @param {string} name The name of the property.
+ * @param {PropertyKind=} opt_kind What kind of underlying storage to use.
+ * @param {function(*, *):void=} opt_setHook A function to run after the
+ * property is set, but before the propertyChange event is fired.
+ */
+ function getPropertyDescriptor(name, opt_kind, opt_setHook) {
+ const kind = /** @type {PropertyKind} */ (opt_kind || PropertyKind.JS);
+
+ const desc = {
+ get: getGetter(name, kind),
+ set: getSetter(name, kind, opt_setHook),
+ };
+ return desc;
+ }
+
+ /**
* Counter for use with createUid
*/
let uidCounter = 1;
@@ -415,6 +434,7 @@ var cr = cr || function(global) {
addSingletonGetter: addSingletonGetter,
define: define,
defineProperty: defineProperty,
+ getPropertyDescriptor: getPropertyDescriptor,
dispatchPropertyChange: dispatchPropertyChange,
dispatchSimpleEvent: dispatchSimpleEvent,
PropertyKind: PropertyKind,
diff --git a/chromium/ui/webui/resources/js/cr.m.js b/chromium/ui/webui/resources/js/cr.m.js
index 3e0a65f1633..89fc368a895 100644
--- a/chromium/ui/webui/resources/js/cr.m.js
+++ b/chromium/ui/webui/resources/js/cr.m.js
@@ -9,7 +9,7 @@
* logic in js_modulizer.py only to address the cr.js case, which is not worth
* it.
*/
-import {assert} from './assert.m.js';
+import {assert, assertNotReached} from './assert.m.js';
import {PromiseResolver} from './promise_resolver.m.js';
/** @typedef {{eventName: string, uid: number}} */
@@ -59,6 +59,23 @@ export function addSingletonGetter(ctor) {
}
/**
+ * Fires a property change event on the target.
+ * @param {!EventTarget} target The target to dispatch the event on.
+ * @param {string} propertyName The name of the property that changed.
+ * @param {*} newValue The new value for the property.
+ * @param {*} oldValue The old value for the property.
+ */
+export function dispatchPropertyChange(
+ target, propertyName, newValue, oldValue) {
+ const e = new Event(propertyName + 'Change');
+ e.propertyName = propertyName;
+ e.newValue = newValue;
+ e.oldValue = oldValue;
+ target.dispatchEvent(e);
+}
+
+
+/**
* The mapping used by the sendWithPromise mechanism to tie the Promise
* returned to callers with the corresponding WebUI response. The mapping is
* from ID to the PromiseResolver helper; the ID is generated by
@@ -210,3 +227,153 @@ export const isAndroid = /Android/.test(navigator.userAgent);
/** Whether this is on iOS. */
export const isIOS = /CriOS/.test(navigator.userAgent);
+
+/**
+ * Converts a camelCase javascript property name to a hyphenated-lower-case
+ * attribute name.
+ * @param {string} jsName The javascript camelCase property name.
+ * @return {string} The equivalent hyphenated-lower-case attribute name.
+ */
+function getAttributeName(jsName) {
+ return jsName.replace(/([A-Z])/g, '-$1').toLowerCase();
+}
+
+/**
+ * The kind of property to define in {@code getPropertyDescriptor}.
+ * @enum {string}
+ * @const
+ */
+export const PropertyKind = {
+ /**
+ * Plain old JS property where the backing data is stored as a "private"
+ * field on the object.
+ * Use for properties of any type. Type will not be checked.
+ */
+ JS: 'js',
+
+ /**
+ * The property backing data is stored as an attribute on an element.
+ * Use only for properties of type {string}.
+ */
+ ATTR: 'attr',
+
+ /**
+ * The property backing data is stored as an attribute on an element. If the
+ * element has the attribute then the value is true.
+ * Use only for properties of type {boolean}.
+ */
+ BOOL_ATTR: 'boolAttr'
+};
+
+/**
+ * Helper function for getPropertyDescriptor that returns the getter to use for
+ * the property.
+ * @param {string} name The name of the property.
+ * @param {PropertyKind} kind The kind of the property.
+ * @return {function():*} The getter for the property.
+ */
+function getGetter(name, kind) {
+ let attributeName;
+ switch (kind) {
+ case PropertyKind.JS:
+ const privateName = name + '_';
+ return function() {
+ return this[privateName];
+ };
+ case PropertyKind.ATTR:
+ attributeName = getAttributeName(name);
+ return function() {
+ return this.getAttribute(attributeName);
+ };
+ case PropertyKind.BOOL_ATTR:
+ attributeName = getAttributeName(name);
+ return function() {
+ return this.hasAttribute(attributeName);
+ };
+ }
+
+ assertNotReached();
+}
+
+/**
+ * Helper function for getPropertyDescriptor that returns the setter of the
+ * right kind.
+ * @param {string} name The name of the property we are defining the setter
+ * for.
+ * @param {PropertyKind} kind The kind of property we are getting the
+ * setter for.
+ * @param {function(*, *):void=} opt_setHook A function to run after the
+ * property is set, but before the propertyChange event is fired.
+ * @return {function(*):void} The function to use as a setter.
+ */
+function getSetter(name, kind, opt_setHook) {
+ let attributeName;
+ switch (kind) {
+ case PropertyKind.JS:
+ const privateName = name + '_';
+ return function(value) {
+ const oldValue = this[name];
+ if (value !== oldValue) {
+ this[privateName] = value;
+ if (opt_setHook) {
+ opt_setHook.call(this, value, oldValue);
+ }
+ dispatchPropertyChange(this, name, value, oldValue);
+ }
+ };
+
+ case PropertyKind.ATTR:
+ attributeName = getAttributeName(name);
+ return function(value) {
+ const oldValue = this[name];
+ if (value !== oldValue) {
+ if (value === undefined) {
+ this.removeAttribute(attributeName);
+ } else {
+ this.setAttribute(attributeName, value);
+ }
+ if (opt_setHook) {
+ opt_setHook.call(this, value, oldValue);
+ }
+ dispatchPropertyChange(this, name, value, oldValue);
+ }
+ };
+
+ case PropertyKind.BOOL_ATTR:
+ attributeName = getAttributeName(name);
+ return function(value) {
+ const oldValue = this[name];
+ if (value !== oldValue) {
+ if (value) {
+ this.setAttribute(attributeName, name);
+ } else {
+ this.removeAttribute(attributeName);
+ }
+ if (opt_setHook) {
+ opt_setHook.call(this, value, oldValue);
+ }
+ dispatchPropertyChange(this, name, value, oldValue);
+ }
+ };
+ }
+
+ assertNotReached();
+}
+
+/**
+ * Returns a getter and setter to be used as property descriptor in
+ * Object.defineProperty(). When the setter changes the value a property change
+ * event with the type {@code name + 'Change'} is fired.
+ * @param {string} name The name of the property.
+ * @param {PropertyKind=} opt_kind What kind of underlying storage to use.
+ * @param {function(?, ?):void=} opt_setHook A function to run after the
+ * property is set, but before the propertyChange event is fired.
+ */
+export function getPropertyDescriptor(name, opt_kind, opt_setHook) {
+ const kind = /** @type {PropertyKind} */ (opt_kind || PropertyKind.JS);
+
+ return {
+ get: getGetter(name, kind),
+ set: getSetter(name, kind, opt_setHook),
+ };
+}
diff --git a/chromium/ui/webui/resources/js/cr/BUILD.gn b/chromium/ui/webui/resources/js/cr/BUILD.gn
index d68bb4598b9..3163c760db7 100644
--- a/chromium/ui/webui/resources/js/cr/BUILD.gn
+++ b/chromium/ui/webui/resources/js/cr/BUILD.gn
@@ -14,7 +14,10 @@ js_type_check("closure_compile") {
js_type_check("closure_compile_modules") {
uses_js_modules = true
- deps = [ ":event_target.m" ]
+ deps = [
+ ":event_target.m",
+ ":ui.m",
+ ]
}
js_library("event_target") {
@@ -27,10 +30,24 @@ js_library("ui") {
js_library("event_target.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/cr/event_target.m.js" ]
- extra_deps = [ ":modulize" ]
+ extra_deps = [ ":modulize_local" ]
+}
+
+js_library("ui.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui.m.js" ]
+ extra_deps = [ ":modulize_local" ]
}
-js_modulizer("modulize") {
- input_files = [ "event_target.js" ]
- deps = [ "ui:modulize" ]
+group("modulize") {
+ public_deps = [
+ ":modulize_local",
+ "ui:modulize",
+ ]
+}
+
+js_modulizer("modulize_local") {
+ input_files = [
+ "event_target.js",
+ "ui.js",
+ ]
}
diff --git a/chromium/ui/webui/resources/js/cr/ui.js b/chromium/ui/webui/resources/js/cr/ui.js
index a054874aaac..aefe25ca9ce 100644
--- a/chromium/ui/webui/resources/js/cr/ui.js
+++ b/chromium/ui/webui/resources/js/cr/ui.js
@@ -12,7 +12,7 @@ cr.define('cr.ui', function() {
* needs to have a {@code decorate} function.
* @closurePrimitive {asserts.matchesReturn}
*/
- function decorate(source, constr) {
+ /* #export */ function decorate(source, constr) {
let elements;
if (typeof source === 'string') {
elements = document.querySelectorAll(source);
@@ -63,7 +63,7 @@ cr.define('cr.ui', function() {
* an optional property bag. The function also has a static
* {@code decorate} method added to it.
*/
- function define(tagNameOrFunction) {
+ /* #export */ function define(tagNameOrFunction) {
let createFunction, tagName;
if (typeof tagNameOrFunction === 'function') {
createFunction = tagNameOrFunction;
@@ -96,7 +96,9 @@ cr.define('cr.ui', function() {
*/
f.decorate = function(el) {
el.__proto__ = f.prototype;
- el.decorate();
+ if (el.decorate) {
+ el.decorate();
+ }
};
return f;
@@ -112,7 +114,7 @@ cr.define('cr.ui', function() {
* @param {number} min The minimum width.
* @param {number=} opt_scale Optional scale factor to apply to the width.
*/
- function limitInputWidth(el, parentEl, min, opt_scale) {
+ /* #export */ function limitInputWidth(el, parentEl, min, opt_scale) {
// Needs a size larger than borders
el.style.width = '10px';
const doc = el.ownerDocument;
@@ -167,7 +169,7 @@ cr.define('cr.ui', function() {
* @param {number} pixels The number of pixels.
* @return {string} e.g. '16px'.
*/
- function toCssPx(pixels) {
+ /* #export */ function toCssPx(pixels) {
if (!window.isFinite(pixels)) {
console.error('Pixel value is not a number: ' + pixels);
}
@@ -180,7 +182,7 @@ cr.define('cr.ui', function() {
* the doubleclick time interval.
* @param {MouseEvent} e Initial click event.
*/
- function swallowDoubleClick(e) {
+ /* #export */ function swallowDoubleClick(e) {
const doc = e.target.ownerDocument;
let counter = Math.min(1, e.detail);
function swallow(e) {
@@ -207,6 +209,7 @@ cr.define('cr.ui', function() {
}, 0);
}
+ // #cr_define_end
return {
decorate: decorate,
define: define,
diff --git a/chromium/ui/webui/resources/js/cr/ui/BUILD.gn b/chromium/ui/webui/resources/js/cr/ui/BUILD.gn
index 0b066e08b6b..0e10c8d0ec2 100644
--- a/chromium/ui/webui/resources/js/cr/ui/BUILD.gn
+++ b/chromium/ui/webui/resources/js/cr/ui/BUILD.gn
@@ -3,7 +3,126 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/preprocess_grit.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
import("../../../tools/js_modulizer.gni")
+import("../../cr.gni")
+
+preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/js/cr/ui"
+preprocess_src_manifest = "preprocessed_src_manifest.json"
+preprocess_gen_manifest = "preprocessed_gen_manifest.json"
+
+generate_grd("build_grdp") {
+ grd_prefix = "webui_js_cr_ui"
+ out_grd = "$target_gen_dir/resources.grdp"
+ deps = [ ":preprocess" ]
+ manifest_files = [
+ "$target_gen_dir/$preprocess_gen_manifest",
+ "$target_gen_dir/$preprocess_src_manifest",
+ ]
+ resource_path_prefix = "js/cr/ui"
+}
+
+group("preprocess") {
+ public_deps = [
+ ":preprocess_generated",
+ ":preprocess_src",
+ ]
+}
+
+preprocess_grit("preprocess_src") {
+ in_folder = "./"
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_src_manifest"
+ in_files = [
+ "array_data_model.js",
+ "bubble_button.js",
+ "bubble.js",
+ "card_slider.js",
+ "command.js",
+ "context_menu_handler.js",
+ "controlled_indicator.js",
+ "dialogs.js",
+ "drag_wrapper.js",
+ "focus_grid.js",
+ "focus_manager.js",
+ "focus_outline_manager.js",
+ "focus_row.js",
+ "keyboard_shortcut_list.js",
+ "list_item.js",
+ "list.js",
+ "list_selection_controller.js",
+ "list_selection_model.js",
+ "list_single_selection_model.js",
+ "menu_button.js",
+ "menu_item.js",
+ "menu.js",
+ "overlay.js",
+ "position_util.js",
+ "splitter.js",
+ "store_client.js",
+ "store.js",
+ "tabs.js",
+ "touch_handler.js",
+ "tree.js",
+ ]
+
+ if (!is_android) {
+ in_files += [
+ "focus_row_behavior.js",
+ "focus_without_ink.js",
+ ]
+ }
+
+ if (is_chromeos) {
+ in_files += [ "grid.js" ]
+ }
+}
+
+preprocess_grit("preprocess_generated") {
+ deps = [ ":modulize" ]
+ in_folder = target_gen_dir
+ out_folder = "$preprocess_folder"
+ out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+ in_files = [
+ "drag_wrapper.m.js",
+ "focus_grid.m.js",
+ "focus_outline_manager.m.js",
+ "focus_row.m.js",
+ "keyboard_shortcut_list.m.js",
+ "store_client.m.js",
+ "store.m.js",
+ "tabs.m.js",
+ "tree.m.js",
+ ]
+
+ if (!is_android) {
+ in_files += [
+ "focus_row_behavior.m.js",
+ "focus_without_ink.m.js",
+ ]
+ }
+
+ if (is_chromeos) {
+ in_files += [
+ "array_data_model.m.js",
+ "command.m.js",
+ "context_menu_handler.m.js",
+ "dialogs.m.js",
+ "grid.m.js",
+ "list_item.m.js",
+ "list.m.js",
+ "list_selection_controller.m.js",
+ "list_selection_model.m.js",
+ "list_single_selection_model.m.js",
+ "menu_button.m.js",
+ "menu_item.m.js",
+ "menu.m.js",
+ "position_util.m.js",
+ "splitter.m.js",
+ ]
+ }
+}
group("closure_compile") {
deps = [
@@ -248,40 +367,112 @@ js_library("tree") {
js_modulizer("modulize") {
input_files = [
+ "array_data_model.js",
+ "command.js",
+ "context_menu_handler.js",
+ "dialogs.js",
"drag_wrapper.js",
"focus_grid.js",
"focus_outline_manager.js",
"focus_row.js",
"focus_row_behavior.js",
"focus_without_ink.js",
+ "grid.js",
"keyboard_shortcut_list.js",
+ "list.js",
+ "list_item.js",
+ "list_selection_controller.js",
+ "list_selection_model.js",
+ "list_single_selection_model.js",
+ "menu.js",
+ "menu_button.js",
+ "menu_item.js",
+ "position_util.js",
+ "splitter.js",
"store.js",
"store_client.js",
+ "tabs.js",
+ "tree.js",
]
- namespace_rewrites = [
- "cr.ui.Action|Action",
- "cr.ui.DeferredAction|DeferredAction",
- "cr.ui.DragWrapperDelegate|DragWrapperDelegate",
- "cr.ui.FocusRowDelegate|FocusRowDelegate",
- "cr.ui.FocusRow|FocusRow",
- "cr.ui.StoreObserver|StoreObserver",
- "cr.ui.VirtualFocusRow|VirtualFocusRow",
- ]
+ namespace_rewrites = cr_namespace_rewrites
}
js_type_check("ui_resources_modules") {
is_polymer3 = true
deps = [
+ ":array_data_model.m",
+ ":command.m",
+ ":context_menu_handler.m",
+ ":dialogs.m",
":drag_wrapper.m",
":focus_grid.m",
":focus_outline_manager.m",
":focus_row.m",
":focus_row_behavior.m",
":focus_without_ink.m",
+ ":grid.m",
":keyboard_shortcut_list.m",
+ ":list.m",
+ ":list_item.m",
+ ":list_selection_controller.m",
+ ":list_selection_model.m",
+ ":list_single_selection_model.m",
+ ":menu.m",
+ ":menu_button.m",
+ ":menu_item.m",
+ ":position_util.m",
+ ":splitter.m",
":store.m",
":store_client.m",
+ ":tabs.m",
+ ":tree.m",
+ ]
+}
+
+js_library("array_data_model.m") {
+ sources =
+ [ "$root_gen_dir/ui/webui/resources/js/cr/ui/array_data_model.m.js" ]
+ deps = [
+ "..:event_target.m",
+ "../..:assert.m",
]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("command.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/command.m.js" ]
+ deps = [
+ ":keyboard_shortcut_list.m",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("context_menu_handler.m") {
+ sources =
+ [ "$root_gen_dir/ui/webui/resources/js/cr/ui/context_menu_handler.m.js" ]
+ deps = [
+ ":menu.m",
+ ":menu_button.m",
+ ":menu_item.m",
+ ":position_util.m",
+ "..:event_target.m",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ "../..:event_tracker.m",
+ ]
+
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("dialogs.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/dialogs.m.js" ]
+ extra_deps = [ ":modulize" ]
}
js_library("drag_wrapper.m") {
@@ -336,6 +527,18 @@ js_library("focus_without_ink.m") {
extra_deps = [ ":modulize" ]
}
+js_library("grid.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/grid.m.js" ]
+ deps = [
+ ":list.m",
+ ":list_item.m",
+ ":list_selection_controller.m",
+ ":list_selection_model.m",
+ "../:ui.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
js_library("keyboard_shortcut_list.m") {
sources = [
"$root_gen_dir/ui/webui/resources/js/cr/ui/keyboard_shortcut_list.m.js",
@@ -343,6 +546,106 @@ js_library("keyboard_shortcut_list.m") {
extra_deps = [ ":modulize" ]
}
+js_library("list.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list.m.js" ]
+ deps = [
+ ":array_data_model.m",
+ ":list_item.m",
+ ":list_selection_controller.m",
+ ":list_selection_model.m",
+ "../:ui.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("list_item.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_item.m.js" ]
+ deps = [ "../..:cr.m" ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("list_selection_controller.m") {
+ sources = [
+ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_selection_controller.m.js",
+ ]
+ deps = [
+ ":list_selection_model.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("list_selection_model.m") {
+ sources =
+ [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_selection_model.m.js" ]
+ deps = [
+ "..:event_target.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("list_single_selection_model.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/list_single_selection_model.m.js" ]
+ deps = [
+ "..:event_target.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("menu.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/menu.m.js" ]
+ deps = [
+ ":menu_item.m",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("menu_button.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/menu_button.m.js" ]
+ deps = [
+ ":menu.m",
+ ":menu_item.m",
+ ":position_util.m",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ "../..:event_tracker.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("menu_item.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/menu_item.m.js" ]
+ deps = [
+ ":command.m",
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ "../..:load_time_data.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("position_util.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/position_util.m.js" ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("splitter.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/splitter.m.js" ]
+ deps = [
+ "..:ui.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
js_library("store.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/store.m.js" ]
extra_deps = [ ":modulize" ]
@@ -356,3 +659,24 @@ js_library("store_client.m") {
sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/store_client.m.js" ]
extra_deps = [ ":modulize" ]
}
+
+js_library("tabs.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/tabs.m.js" ]
+ deps = [
+ ":focus_outline_manager.m",
+ "..:ui.m",
+ "../..:cr.m",
+ "../..:util.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
+
+js_library("tree.m") {
+ sources = [ "$root_gen_dir/ui/webui/resources/js/cr/ui/tree.m.js" ]
+ deps = [
+ "../:ui.m",
+ "../..:assert.m",
+ "../..:cr.m",
+ ]
+ extra_deps = [ ":modulize" ]
+}
diff --git a/chromium/ui/webui/resources/js/cr/ui/array_data_model.js b/chromium/ui/webui/resources/js/cr/ui/array_data_model.js
index cc356578f2a..1621859b64d 100644
--- a/chromium/ui/webui/resources/js/cr/ui/array_data_model.js
+++ b/chromium/ui/webui/resources/js/cr/ui/array_data_model.js
@@ -6,20 +6,15 @@
* @fileoverview This is a data model representin
*/
-// The include directives are put into Javascript-style comments to prevent
-// parsing errors in non-flattened mode. The flattener still sees them.
-// Note that this makes the flattener to comment out the first line of the
-// included file but that's all right since any javascript file should start
-// with a copyright comment anyway.
-
-// <include src="../../assert.js">
+// #import {assert} from '../../assert.m.js';
+// #import {NativeEventTarget as EventTarget} from '../event_target.m.js'
cr.define('cr.ui', function() {
/**
* A data model that wraps a simple array and supports sorting by storing
* initial indexes of elements for each position in sorted array.
*/
- class ArrayDataModel extends cr.EventTarget {
+ /* #export */ class ArrayDataModel extends cr.EventTarget {
/**
* @param {!Array} array The underlying array.
*/
@@ -457,5 +452,6 @@ cr.define('cr.ui', function() {
}
}
+ // #cr_define_end
return {ArrayDataModel: ArrayDataModel};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/command.js b/chromium/ui/webui/resources/js/cr/ui/command.js
index 4d467c0d66f..53257dff86a 100644
--- a/chromium/ui/webui/resources/js/cr/ui/command.js
+++ b/chromium/ui/webui/resources/js/cr/ui/command.js
@@ -15,13 +15,21 @@
* command if there might be other command listeners higher up in the DOM tree.
*/
+// clang-format off
+// #import {assert} from '../../assert.m.js';
+// #import {define as crUiDefine} from '../ui.m.js';
+// #import {KeyboardShortcutList} from './keyboard_shortcut_list.m.js';
+// #import {dispatchPropertyChange, getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
+// #import {MenuItem} from './menu_item.m.js';
+// clang-format on
+
cr.define('cr.ui', function() {
/**
* Creates a new command element.
* @constructor
* @extends {HTMLElement}
*/
- const Command = cr.ui.define('command');
+ /* #export */ const Command = cr.ui.define('command');
Command.prototype = {
__proto__: HTMLElement.prototype,
@@ -113,23 +121,37 @@ cr.define('cr.ui', function() {
/**
* The label of the command.
+ * @type {string}
*/
- cr.defineProperty(Command, 'label', cr.PropertyKind.ATTR);
+ Command.prototype.label;
+ Object.defineProperty(
+ Command.prototype, 'label',
+ cr.getPropertyDescriptor('label', cr.PropertyKind.ATTR));
/**
* Whether the command is disabled or not.
+ * @type {boolean}
*/
- cr.defineProperty(Command, 'disabled', cr.PropertyKind.BOOL_ATTR);
+ Command.prototype.disabled;
+ Object.defineProperty(
+ Command.prototype, 'disabled',
+ cr.getPropertyDescriptor('disabled', cr.PropertyKind.BOOL_ATTR));
/**
* Whether the command is hidden or not.
*/
- cr.defineProperty(Command, 'hidden', cr.PropertyKind.BOOL_ATTR);
+ Object.defineProperty(
+ Command.prototype, 'hidden',
+ cr.getPropertyDescriptor('hidden', cr.PropertyKind.BOOL_ATTR));
/**
* Whether the command is checked or not.
+ * @type {boolean}
*/
- cr.defineProperty(Command, 'checked', cr.PropertyKind.BOOL_ATTR);
+ Command.prototype.checked;
+ Object.defineProperty(
+ Command.prototype, 'checked',
+ cr.getPropertyDescriptor('checked', cr.PropertyKind.BOOL_ATTR));
/**
* The flag that prevents the shortcut text from being displayed on menu.
@@ -137,8 +159,12 @@ cr.define('cr.ui', function() {
* If false, the keyboard shortcut text (eg. "Ctrl+X" for the cut command)
* is displayed in menu when the command is associated with a menu item.
* Otherwise, no text is displayed.
+ * @type {boolean}
*/
- cr.defineProperty(Command, 'hideShortcutText', cr.PropertyKind.BOOL_ATTR);
+ Command.prototype.hideShortcutText;
+ Object.defineProperty(
+ Command.prototype, 'hideShortcutText',
+ cr.getPropertyDescriptor('hideShortcutText', cr.PropertyKind.BOOL_ATTR));
/**
* Dispatches a canExecute event on the target.
@@ -240,7 +266,7 @@ cr.define('cr.ui', function() {
* @constructor
* @class
*/
- function CanExecuteEvent(command) {
+ /* #export */ function CanExecuteEvent(command) {
const e = new Event('canExecute', {bubbles: true, cancelable: true});
e.__proto__ = CanExecuteEvent.prototype;
e.command = command;
@@ -274,6 +300,7 @@ cr.define('cr.ui', function() {
};
// Export
+ // #cr_define_end
return {
Command: Command,
CanExecuteEvent: CanExecuteEvent,
diff --git a/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js b/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js
index ca032d85e3d..4a1bf527959 100644
--- a/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js
+++ b/chromium/ui/webui/resources/js/cr/ui/context_menu_handler.js
@@ -4,8 +4,20 @@
// require: event_target.js
+// clang-format off
+// #import {assertInstanceof} from '../../assert.m.js';
+// #import {NativeEventTarget as EventTarget} from '../event_target.m.js'
+// #import {EventTracker} from '../../event_tracker.m.js'
+// #import {isWindows, isLinux, isMac, isLacros, dispatchPropertyChange} from '../../cr.m.js';
+// #import {decorate} from '../ui.m.js';
+// #import {Menu} from './menu.m.js';
+// #import {MenuItem} from './menu_item.m.js';
+// #import {HideType} from './menu_button.m.js';
+// #import {positionPopupAtPoint} from './position_util.m.js';
+// clang-format on
+
cr.define('cr.ui', function() {
- /** @const */ const Menu = cr.ui.Menu;
+ /* #ignore */ /** @const */ const Menu = cr.ui.Menu;
/**
* Handles context menus.
@@ -304,9 +316,10 @@ cr.define('cr.ui', function() {
* The singleton context menu handler.
* @type {!ContextMenuHandler}
*/
- const contextMenuHandler = new ContextMenuHandler;
+ /* #export */ const contextMenuHandler = new ContextMenuHandler;
// Export
+ // #cr_define_end
return {
contextMenuHandler: contextMenuHandler,
};
diff --git a/chromium/ui/webui/resources/js/cr/ui/dialogs.js b/chromium/ui/webui/resources/js/cr/ui/dialogs.js
index 055f6068a9c..6c17b44d3b5 100644
--- a/chromium/ui/webui/resources/js/cr/ui/dialogs.js
+++ b/chromium/ui/webui/resources/js/cr/ui/dialogs.js
@@ -6,7 +6,7 @@ cr.define('cr.ui.dialogs', function() {
/**
* @constructor
*/
- function BaseDialog(parentNode) {
+ /* #export */ function BaseDialog(parentNode) {
this.parentNode_ = parentNode;
this.document_ = parentNode.ownerDocument;
@@ -329,7 +329,7 @@ cr.define('cr.ui.dialogs', function() {
* @constructor
* @extends {cr.ui.dialogs.BaseDialog}
*/
- function AlertDialog(parentNode) {
+ /* #export */ function AlertDialog(parentNode) {
BaseDialog.call(this, parentNode);
this.cancelButton.style.display = 'none';
}
@@ -351,7 +351,7 @@ cr.define('cr.ui.dialogs', function() {
* @constructor
* @extends {cr.ui.dialogs.BaseDialog}
*/
- function ConfirmDialog(parentNode) {
+ /* #export */ function ConfirmDialog(parentNode) {
BaseDialog.call(this, parentNode);
}
@@ -363,7 +363,7 @@ cr.define('cr.ui.dialogs', function() {
* @constructor
* @extends {cr.ui.dialogs.BaseDialog}
*/
- function PromptDialog(parentNode) {
+ /* #export */ function PromptDialog(parentNode) {
BaseDialog.call(this, parentNode);
this.input_ = this.document_.createElement('input');
this.input_.setAttribute('type', 'text');
@@ -416,6 +416,7 @@ cr.define('cr.ui.dialogs', function() {
}
};
+ // #cr_define_end
return {
BaseDialog: BaseDialog,
AlertDialog: AlertDialog,
diff --git a/chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js b/chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js
index f1c964b3de6..1695e4ff438 100644
--- a/chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js
+++ b/chromium/ui/webui/resources/js/cr/ui/focus_row_behavior.js
@@ -107,6 +107,12 @@ cr.define('cr.ui', function() {
reflectToAttribute: true,
},
+ /** For notifying when the row is in focus. */
+ isFocused: {
+ type: Boolean,
+ notify: true,
+ },
+
/** Should be bound to the index of the item from the iron-list */
focusRowIndex: {
type: Number,
@@ -331,6 +337,7 @@ cr.define('cr.ui', function() {
cr.ui.focusWithoutInk(firstFocusable);
}
this.listBlurred = false;
+ this.isFocused = true;
},
/** @param {!KeyboardEvent} e */
@@ -363,7 +370,9 @@ cr.define('cr.ui', function() {
* @private
*/
onBlur_(e) {
- this.mouseFocused_ = false; // Reset flag since it's not active anymore.
+ // Reset focused flags since it's not active anymore.
+ this.mouseFocused_ = false;
+ this.isFocused = false;
const node =
e.relatedTarget ? /** @type {!Node} */ (e.relatedTarget) : null;
diff --git a/chromium/ui/webui/resources/js/cr/ui/grid.js b/chromium/ui/webui/resources/js/cr/ui/grid.js
index 69fdb08288c..7c372342876 100644
--- a/chromium/ui/webui/resources/js/cr/ui/grid.js
+++ b/chromium/ui/webui/resources/js/cr/ui/grid.js
@@ -2,9 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// require: list_selection_model.js
-// require: list_selection_controller.js
-// require: list.js
+// clang-format off
+// #import {define as crUiDefine} from '../ui.m.js';
+// #import {ListSelectionModel} from './list_selection_model.m.js';
+// #import {ListSelectionController} from './list_selection_controller.m.js';
+// #import {List} from './list.m.js';
+// #import {ListItem} from './list_item.m.js';
+// clang-format on
/**
* @fileoverview This implements a grid control. Grid contains a bunch of
@@ -13,9 +17,10 @@
*/
cr.define('cr.ui', function() {
- /** @const */ const ListSelectionController = cr.ui.ListSelectionController;
- /** @const */ const List = cr.ui.List;
- /** @const */ const ListItem = cr.ui.ListItem;
+ /* #ignore */ /** @const */ const ListSelectionController =
+ /* #ignore */ cr.ui.ListSelectionController;
+ /* #ignore */ /** @const */ const List = cr.ui.List;
+ /* #ignore */ /** @const */ const ListItem = cr.ui.ListItem;
/**
* Creates a new grid item element.
@@ -23,7 +28,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {cr.ui.ListItem}
*/
- function GridItem(dataItem) {
+ /* #export */ function GridItem(dataItem) {
const el = document.createElement('li');
el.dataItem = dataItem;
el.__proto__ = GridItem.prototype;
@@ -48,7 +53,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {cr.ui.List}
*/
- const Grid = cr.ui.define('grid');
+ /* #export */ const Grid = cr.ui.define('grid');
Grid.prototype = {
__proto__: List.prototype,
@@ -357,7 +362,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {cr.ui.ListSelectionController}
*/
- function GridSelectionController(selectionModel, grid) {
+ /* #export */ function GridSelectionController(selectionModel, grid) {
this.selectionModel_ = selectionModel;
this.grid_ = grid;
}
@@ -438,6 +443,7 @@ cr.define('cr.ui', function() {
}
};
+ // #cr_define_end
return {
Grid: Grid,
GridItem: GridItem,
diff --git a/chromium/ui/webui/resources/js/cr/ui/list.js b/chromium/ui/webui/resources/js/cr/ui/list.js
index 6fe75907927..d68e3160eca 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list.js
@@ -7,14 +7,25 @@
// require: list_selection_controller.js
// require: list_item.js
+// clang-format off
+// #import {define as crUiDefine} from '../ui.m.js';
+// #import {getPropertyDescriptor, PropertyKind, dispatchSimpleEvent} from '../../cr.m.js';
+// #import {ArrayDataModel} from './array_data_model.m.js';
+// #import {ListSelectionModel} from './list_selection_model.m.js';
+// #import {ListSelectionController} from './list_selection_controller.m.js';
+// #import {ListItem} from './list_item.m.js';
+// clang-format on
+
/**
* @fileoverview This implements a list control.
*/
cr.define('cr.ui', function() {
- /** @const */ const ListSelectionModel = cr.ui.ListSelectionModel;
- /** @const */ const ListSelectionController = cr.ui.ListSelectionController;
- /** @const */ const ArrayDataModel = cr.ui.ArrayDataModel;
+ /* #ignore */ /** @const */ const ListSelectionModel =
+ /* #ignore */ cr.ui.ListSelectionModel;
+ /* #ignore */ /** @const */ const ListSelectionController =
+ /* #ignore */ cr.ui.ListSelectionController;
+ /* #ignore */ /** @const */ const ArrayDataModel = cr.ui.ArrayDataModel;
/**
* @typedef {{
@@ -26,7 +37,7 @@ cr.define('cr.ui', function() {
* width: number
* }}
*/
- let Size;
+ /* #export */ let Size;
/**
* Whether a mouse event is inside the element viewport. This will return
@@ -55,7 +66,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLUListElement}
*/
- const List = cr.ui.define('list');
+ /* #export */ const List = cr.ui.define('list');
List.prototype = {
__proto__: HTMLUListElement.prototype,
@@ -1364,15 +1375,23 @@ cr.define('cr.ui', function() {
},
};
- cr.defineProperty(List, 'disabled', cr.PropertyKind.BOOL_ATTR);
+ /** @type {boolean} */
+ List.prototype.disabled;
+ Object.defineProperty(
+ List.prototype, 'disabled',
+ cr.getPropertyDescriptor('disabled', cr.PropertyKind.BOOL_ATTR));
/**
* Whether the list or one of its descendents has focus. This is necessary
* because list items can contain controls that can be focused, and for some
* purposes (e.g., styling), the list can still be conceptually focused at
* that point even though it doesn't actually have the page focus.
+ * @type {boolean}
*/
- cr.defineProperty(List, 'hasElementFocus', cr.PropertyKind.BOOL_ATTR);
+ List.prototype.hasElementFocus;
+ Object.defineProperty(
+ List.prototype, 'hasElementFocus',
+ cr.getPropertyDescriptor('hasElementFocus', cr.PropertyKind.BOOL_ATTR));
/**
* Mousedown event handler.
@@ -1453,6 +1472,7 @@ cr.define('cr.ui', function() {
return false;
}
+ // #cr_define_end
return {
List: List,
Size: Size,
diff --git a/chromium/ui/webui/resources/js/cr/ui/list_item.js b/chromium/ui/webui/resources/js/cr/ui/list_item.js
index c6450a47273..a2c1ba8f1d9 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list_item.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list_item.js
@@ -2,14 +2,18 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-cr.define('cr.ui', function() {
+// clang-format off
+// #import {PropertyKind, getPropertyDescriptor} from '../../cr.m.js';
+// #import {define as crUiDefine} from '../ui.m.js';
+// clang-format on
+cr.define('cr.ui', function() {
/**
* Creates a new list item element.
* @constructor
* @extends {HTMLLIElement}
*/
- const ListItem = cr.ui.define('li');
+ /* #export */ const ListItem = cr.ui.define('li');
/**
* The next id suffix to use when giving each item an unique id.
@@ -57,23 +61,34 @@ cr.define('cr.ui', function() {
/**
* Whether the item is selected. Setting this does not update the underlying
* selection model. This is only used for display purpose.
+ * @type {boolean}
*/
- cr.defineProperty(
- ListItem, 'selected', cr.PropertyKind.BOOL_ATTR, function() {
- this.selectionChanged();
- });
+ ListItem.prototype.selected;
+ Object.defineProperty(
+ ListItem.prototype, 'selected',
+ cr.getPropertyDescriptor(
+ 'selected', cr.PropertyKind.BOOL_ATTR, function() {
+ this.selectionChanged();
+ }));
/**
* Whether the item is the lead in a selection. Setting this does not update
* the underlying selection model. This is only used for display purpose.
+ * @type {boolean}
*/
- cr.defineProperty(ListItem, 'lead', cr.PropertyKind.BOOL_ATTR);
+ ListItem.prototype.lead;
+ Object.defineProperty(
+ ListItem.prototype, 'lead',
+ cr.getPropertyDescriptor('lead', cr.PropertyKind.BOOL_ATTR));
/**
* This item's index in the containing list.
* type {number}
*/
- cr.defineProperty(ListItem, 'listIndex');
+ ListItem.prototype.listIndex;
+ Object.defineProperty(
+ ListItem.prototype, 'listIndex', cr.getPropertyDescriptor('listIndex'));
+ // #cr_define_end
return {ListItem: ListItem};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js b/chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js
index 0a18b1df606..0692f919594 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list_selection_controller.js
@@ -2,6 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// #import {isMac, isChromeOS} from '../../cr.m.js';
+// #import {ListSelectionModel} from './list_selection_model.m.js';
+
cr.define('cr.ui', function() {
/**
* Creates a selection controller that is to be used with lists. This is
@@ -15,7 +18,7 @@ cr.define('cr.ui', function() {
*
* @constructor
*/
- function ListSelectionController(selectionModel) {
+ /* #export */ function ListSelectionController(selectionModel) {
this.selectionModel_ = selectionModel;
}
@@ -304,5 +307,6 @@ cr.define('cr.ui', function() {
}
};
+ // #cr_define_end
return {ListSelectionController: ListSelectionController};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/list_selection_model.js b/chromium/ui/webui/resources/js/cr/ui/list_selection_model.js
index 28ddbdb0a3b..bd49f601684 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list_selection_model.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list_selection_model.js
@@ -2,12 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// #import {NativeEventTarget as EventTarget} from '../event_target.m.js'
+// #import {isMac, isChromeOS, dispatchPropertyChange} from '../../cr.m.js';
+
cr.define('cr.ui', function() {
/**
* Creates a new selection model that is to be used with lists.
*
*/
- class ListSelectionModel extends cr.EventTarget {
+ /* #export */ class ListSelectionModel extends cr.EventTarget {
/**
* @param {number=} opt_length The number items in the selection.
*/
@@ -393,5 +396,6 @@ cr.define('cr.ui', function() {
}
}
+ // #cr_define_end
return {ListSelectionModel: ListSelectionModel};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/list_single_selection_model.js b/chromium/ui/webui/resources/js/cr/ui/list_single_selection_model.js
index da96825af3d..2839167d4ee 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list_single_selection_model.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list_single_selection_model.js
@@ -2,12 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// #import {NativeEventTarget as EventTarget} from '../event_target.m.js'
+// #import {isMac, isChromeOS, dispatchPropertyChange} from '../../cr.m.js';
+
cr.define('cr.ui', function() {
/**
* Creates a new selection model that is to be used with lists. This only
* allows a single index to be selected.
*/
- class ListSingleSelectionModel extends cr.EventTarget {
+ /* #export */ class ListSingleSelectionModel extends cr.EventTarget {
/**
* @param {number=} opt_length The number items in the selection.
*/
@@ -256,5 +259,6 @@ cr.define('cr.ui', function() {
}
}
+ // #cr_define_end
return {ListSingleSelectionModel: ListSingleSelectionModel};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/menu.js b/chromium/ui/webui/resources/js/cr/ui/menu.js
index 5fb640fde0e..1f4fe262370 100644
--- a/chromium/ui/webui/resources/js/cr/ui/menu.js
+++ b/chromium/ui/webui/resources/js/cr/ui/menu.js
@@ -2,8 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// #import {assert, assertInstanceof} from '../../assert.m.js';
+// #import {define as crUiDefine, decorate} from '../ui.m.js';
+// #import {getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
+// #import {MenuItem} from './menu_item.m.js';
+
cr.define('cr.ui', function() {
- /** @const */ const MenuItem = cr.ui.MenuItem;
+ /* #ignore */ /** @const */ const MenuItem = cr.ui.MenuItem;
/**
* Creates a new menu element. Menu dispatches all commands on the element it
@@ -13,7 +18,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- const Menu = cr.ui.define('cr-menu');
+ /* #export */ const Menu = cr.ui.define('cr-menu');
Menu.prototype = {
__proto__: HTMLElement.prototype,
@@ -361,6 +366,7 @@ cr.define('cr.ui', function() {
}
};
+ /** @suppress {globalThis} This standalone function is used like method. */
function selectedIndexChanged(selectedIndex, oldSelectedIndex) {
const oldSelectedItem = this.menuItems[oldSelectedIndex];
if (oldSelectedItem) {
@@ -375,16 +381,24 @@ cr.define('cr.ui', function() {
/**
* The selected menu item.
- * type {number}
+ * @type {number}
*/
- cr.defineProperty(
- Menu, 'selectedIndex', cr.PropertyKind.JS, selectedIndexChanged);
+ Menu.prototype.selectedIndex;
+ Object.defineProperty(
+ Menu.prototype, 'selectedIndex',
+ cr.getPropertyDescriptor(
+ 'selectedIndex', cr.PropertyKind.JS, selectedIndexChanged));
/**
* Selector for children which are menu items.
+ * @type {string}
*/
- cr.defineProperty(Menu, 'menuItemSelector', cr.PropertyKind.ATTR);
+ Menu.prototype.menuItemSelector;
+ Object.defineProperty(
+ Menu.prototype, 'menuItemSelector',
+ cr.getPropertyDescriptor('menuItemSelector', cr.PropertyKind.ATTR));
// Export
+ // #cr_define_end
return {Menu: Menu};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/menu_button.js b/chromium/ui/webui/resources/js/cr/ui/menu_button.js
index 0f95dc510a9..3b9d998d110 100644
--- a/chromium/ui/webui/resources/js/cr/ui/menu_button.js
+++ b/chromium/ui/webui/resources/js/cr/ui/menu_button.js
@@ -2,25 +2,30 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// <include src="../../assert.js">
-
+// #import {assert} from '../../assert.m.js';
+// #import {isWindows} from '../../cr.m.js';
+// #import {EventTracker} from '../../event_tracker.m.js'
+// #import {define as crUiDefine, decorate} from '../ui.m.js';
+// #import {positionPopupAroundElement, AnchorType} from './position_util.m.js';
+// #import {Menu} from './menu.m.js';
+// #import {MenuItem} from './menu_item.m.js';
cr.define('cr.ui', function() {
- /** @const */
- const Menu = cr.ui.Menu;
+ /* #ignore */ const Menu = cr.ui.Menu;
/**
* Enum for type of hide. Delayed is used when called by clicking on a
* checkable menu item.
* @enum {number}
*/
- const HideType = {
+ /* #export */ const HideType = {
INSTANT: 0,
DELAYED: 1,
};
/** @const */
- const positionPopupAroundElement = cr.ui.positionPopupAroundElement;
+ /* #ignore */ const positionPopupAroundElement =
+ /* #ignore */ cr.ui.positionPopupAroundElement;
/**
* Creates a new menu button element.
@@ -29,7 +34,7 @@ cr.define('cr.ui', function() {
* @extends {HTMLButtonElement}
* @implements {EventListener}
*/
- const MenuButton = cr.ui.define('button');
+ /* #export */ const MenuButton = cr.ui.define('button');
MenuButton.prototype = {
__proto__: HTMLButtonElement.prototype,
@@ -345,6 +350,7 @@ cr.define('cr.ui', function() {
};
// Export
+ // #cr_define_end
return {
HideType: HideType,
MenuButton: MenuButton,
diff --git a/chromium/ui/webui/resources/js/cr/ui/menu_item.js b/chromium/ui/webui/resources/js/cr/ui/menu_item.js
index dc81baed622..2dba74be2ae 100644
--- a/chromium/ui/webui/resources/js/cr/ui/menu_item.js
+++ b/chromium/ui/webui/resources/js/cr/ui/menu_item.js
@@ -2,8 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// clang-format off
+// #import {loadTimeData} from '../../load_time_data.m.js';
+// #import {assert} from '../../assert.m.js';
+// #import {Command} from './command.m.js';
+// #import {define as crUiDefine, decorate, swallowDoubleClick} from '../ui.m.js';
+// #import {getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
+// clang-format on
+
cr.define('cr.ui', function() {
- /** @const */ const Command = cr.ui.Command;
+ /* #ignore */ const Command = cr.ui.Command;
/**
* Creates a new menu item element.
@@ -12,7 +20,7 @@ cr.define('cr.ui', function() {
* @extends {HTMLElement}
* @implements {EventListener}
*/
- const MenuItem = cr.ui.define('cr-menu-item');
+ /* #export */ const MenuItem = cr.ui.define('cr-menu-item');
/**
* Creates a new menu separator element.
@@ -20,7 +28,9 @@ cr.define('cr.ui', function() {
*/
MenuItem.createSeparator = function() {
const el = /** @type {!cr.ui.MenuItem} */ (document.createElement('hr'));
- MenuItem.decorate(el);
+ if (MenuItem.decorate) {
+ MenuItem.decorate(el);
+ }
return el;
};
@@ -251,32 +261,50 @@ cr.define('cr.ui', function() {
}
}
};
-
/**
* Whether the menu item is disabled or not.
+ * @type {boolean}
*/
- cr.defineProperty(MenuItem, 'disabled', cr.PropertyKind.BOOL_ATTR);
+ MenuItem.prototype.disabled;
+ Object.defineProperty(
+ MenuItem.prototype, 'disabled',
+ cr.getPropertyDescriptor('disabled', cr.PropertyKind.BOOL_ATTR));
/**
* Whether the menu item is hidden or not.
*/
- cr.defineProperty(MenuItem, 'hidden', cr.PropertyKind.BOOL_ATTR);
+ Object.defineProperty(
+ MenuItem.prototype, 'hidden',
+ cr.getPropertyDescriptor('hidden', cr.PropertyKind.BOOL_ATTR));
/**
* Whether the menu item is selected or not.
+ * @type {boolean}
*/
- cr.defineProperty(MenuItem, 'selected', cr.PropertyKind.BOOL_ATTR);
+ MenuItem.prototype.selected;
+ Object.defineProperty(
+ MenuItem.prototype, 'selected',
+ cr.getPropertyDescriptor('selected', cr.PropertyKind.BOOL_ATTR));
/**
* Whether the menu item is checked or not.
+ * @type {boolean}
*/
- cr.defineProperty(MenuItem, 'checked', cr.PropertyKind.BOOL_ATTR);
+ MenuItem.prototype.checked;
+ Object.defineProperty(
+ MenuItem.prototype, 'checked',
+ cr.getPropertyDescriptor('checked', cr.PropertyKind.BOOL_ATTR));
/**
* Whether the menu item is checkable or not.
+ * @type {boolean}
*/
- cr.defineProperty(MenuItem, 'checkable', cr.PropertyKind.BOOL_ATTR);
+ MenuItem.prototype.checkable;
+ Object.defineProperty(
+ MenuItem.prototype, 'checkable',
+ cr.getPropertyDescriptor('checkable', cr.PropertyKind.BOOL_ATTR));
// Export
+ // #cr_define_end
return {MenuItem: MenuItem};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/position_util.js b/chromium/ui/webui/resources/js/cr/ui/position_util.js
index b9ab4eea8d6..40b59f7c1f9 100644
--- a/chromium/ui/webui/resources/js/cr/ui/position_util.js
+++ b/chromium/ui/webui/resources/js/cr/ui/position_util.js
@@ -18,7 +18,7 @@ cr.define('cr.ui', function() {
* Enum for defining how to anchor a popup to an anchor element.
* @enum {number}
*/
- const AnchorType = {
+ /* #export */ const AnchorType = {
/**
* The popup's right edge is aligned with the left edge of the anchor.
* The popup's top edge is aligned with the top edge of the anchor.
@@ -215,7 +215,7 @@ cr.define('cr.ui', function() {
* @param {boolean=} opt_invertLeftRight Whether to invert the right/left
* alignment.
*/
- function positionPopupAroundElement(
+ /* #export */ function positionPopupAroundElement(
anchorElement, popupElement, type, opt_invertLeftRight) {
const anchorRect = anchorElement.getBoundingClientRect();
positionPopupAroundRect(
@@ -229,7 +229,8 @@ cr.define('cr.ui', function() {
* @param {!HTMLElement} popupElement The popup element we are positioning.
* @param {cr.ui.AnchorType=} opt_anchorType The type of anchoring we want.
*/
- function positionPopupAtPoint(x, y, popupElement, opt_anchorType) {
+ /* #export */ function positionPopupAtPoint(
+ x, y, popupElement, opt_anchorType) {
const rect = {left: x, top: y, width: 0, height: 0, right: x, bottom: y};
const anchorType = opt_anchorType || AnchorType.BELOW;
@@ -237,6 +238,7 @@ cr.define('cr.ui', function() {
}
// Export
+ // #cr_define_end
return {
AnchorType: AnchorType,
positionPopupAroundElement: positionPopupAroundElement,
diff --git a/chromium/ui/webui/resources/js/cr/ui/splitter.js b/chromium/ui/webui/resources/js/cr/ui/splitter.js
index ef4b55b693c..0c214cf4fa9 100644
--- a/chromium/ui/webui/resources/js/cr/ui/splitter.js
+++ b/chromium/ui/webui/resources/js/cr/ui/splitter.js
@@ -18,6 +18,9 @@
*
*/
+// #import {define as crUiDefine} from '../ui.m.js';
+// #import {dispatchSimpleEvent} from '../../cr.m.js';
+
cr.define('cr.ui', function() {
// TODO(arv): Currently this only supports horizontal layout.
// TODO(arv): This ignores min-width and max-width of the elements to the
@@ -58,7 +61,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLDivElement}
*/
- const Splitter = cr.ui.define('div');
+ /* #export */ const Splitter = cr.ui.define('div');
Splitter.prototype = {
__proto__: HTMLDivElement.prototype,
@@ -274,5 +277,6 @@ cr.define('cr.ui', function() {
},
};
+ // #cr_define_end
return {Splitter: Splitter};
});
diff --git a/chromium/ui/webui/resources/js/cr/ui/tabs.js b/chromium/ui/webui/resources/js/cr/ui/tabs.js
index 7394337a817..45d51ce3985 100644
--- a/chromium/ui/webui/resources/js/cr/ui/tabs.js
+++ b/chromium/ui/webui/resources/js/cr/ui/tabs.js
@@ -2,6 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// #import {decorate} from '../ui.m.js';
+// #import {define as crUiDefine} from '../ui.m.js';
+// #import {findAncestor} from '../../util.m.js';
+// #import {FocusOutlineManager} from './focus_outline_manager.m.js';
+// #import {isMac, getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
+
cr.define('cr.ui', function() {
/**
* Returns the TabBox for a Tab or a TabPanel.
@@ -89,7 +95,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- const TabBox = cr.ui.define('tabbox');
+ /* #export */ const TabBox = cr.ui.define('tabbox');
TabBox.prototype = {
__proto__: HTMLElement.prototype,
@@ -120,8 +126,11 @@ cr.define('cr.ui', function() {
* The index of the selected tab or -1 if no tab is selected.
* @type {number}
*/
- cr.defineProperty(
- TabBox, 'selectedIndex', cr.PropertyKind.JS, selectedIndexSetHook);
+ TabBox.prototype.selectedIndex;
+ Object.defineProperty(
+ TabBox.prototype, 'selectedIndex',
+ cr.getPropertyDescriptor(
+ 'selectedIndex', cr.PropertyKind.JS, selectedIndexSetHook));
/**
* Creates a new tabs element.
@@ -129,7 +138,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- const Tabs = cr.ui.define('tabs');
+ /* #export */ const Tabs = cr.ui.define('tabs');
Tabs.prototype = {
__proto__: HTMLElement.prototype,
decorate() {
@@ -186,7 +195,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- const Tab = cr.ui.define('tab');
+ /* #export */ const Tab = cr.ui.define('tab');
Tab.prototype = {
__proto__: HTMLElement.prototype,
decorate() {
@@ -201,7 +210,10 @@ cr.define('cr.ui', function() {
* Whether the tab is selected.
* @type {boolean}
*/
- cr.defineProperty(Tab, 'selected', cr.PropertyKind.BOOL_ATTR);
+ Tab.prototype.selected;
+ Object.defineProperty(
+ Tab.prototype, 'selected',
+ cr.getPropertyDescriptor('selected', cr.PropertyKind.BOOL_ATTR));
/**
* Creates a new tabpanels element.
@@ -209,7 +221,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- const TabPanels = cr.ui.define('tabpanels');
+ /* #export */ const TabPanels = cr.ui.define('tabpanels');
TabPanels.prototype = {
__proto__: HTMLElement.prototype,
decorate: decorateChildren
@@ -221,15 +233,19 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- const TabPanel = cr.ui.define('tabpanel');
+ /* #export */ const TabPanel = cr.ui.define('tabpanel');
TabPanel.prototype = {__proto__: HTMLElement.prototype, decorate() {}};
/**
* Whether the tab is selected.
* @type {boolean}
*/
- cr.defineProperty(TabPanel, 'selected', cr.PropertyKind.BOOL_ATTR);
+ TabPanel.prototype.selected;
+ Object.defineProperty(
+ TabPanel.prototype, 'selected',
+ cr.getPropertyDescriptor('selected', cr.PropertyKind.BOOL_ATTR));
+ // #cr_define_end
return {
TabBox: TabBox,
Tabs: Tabs,
diff --git a/chromium/ui/webui/resources/js/cr/ui/tree.js b/chromium/ui/webui/resources/js/cr/ui/tree.js
index 7e8b2e91b15..3ce3a3c79e8 100644
--- a/chromium/ui/webui/resources/js/cr/ui/tree.js
+++ b/chromium/ui/webui/resources/js/cr/ui/tree.js
@@ -2,6 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// clang-format off
+// #import {assert, assertInstanceof} from '../../assert.m.js';
+// #import {define as crUiDefine, limitInputWidth} from '../ui.m.js';
+// #import {isMac, dispatchSimpleEvent, getPropertyDescriptor, PropertyKind} from '../../cr.m.js';
+// clang-format on
+
cr.define('cr.ui', function() {
// require cr.ui.define
// require cr.ui.limitInputWidth
@@ -48,7 +54,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- const Tree = cr.ui.define('tree');
+ /* #export */ const Tree = cr.ui.define('tree');
Tree.prototype = {
__proto__: HTMLElement.prototype,
@@ -276,8 +282,12 @@ cr.define('cr.ui', function() {
* next to expandable parent nodes. If set to 'all' folder icons will be
* displayed next to all nodes. Icons can be set using the treeItem's icon
* property.
+ * @type {boolean}
*/
- cr.defineProperty(Tree, 'iconVisibility', cr.PropertyKind.ATTR);
+ Tree.prototype.iconVisibility;
+ Object.defineProperty(
+ Tree.prototype, 'iconVisibility',
+ cr.getPropertyDescriptor('iconVisibility', cr.PropertyKind.ATTR));
/**
* Incremental counter for an auto generated ID of the tree item. This will
@@ -328,7 +338,7 @@ cr.define('cr.ui', function() {
* @constructor
* @extends {HTMLElement}
*/
- const TreeItem = cr.ui.define(function() {
+ /* #export */ const TreeItem = cr.ui.define(function() {
const treeItem = treeItemProto.cloneNode(true);
treeItem.id = 'tree-item-autogen-id-' + treeItemAutoGeneratedIdCounter++;
return treeItem;
@@ -772,5 +782,6 @@ cr.define('cr.ui', function() {
}
// Export
+ // #cr_define_end
return {Tree: Tree, TreeItem: TreeItem};
});
diff --git a/chromium/ui/webui/resources/js/ios/DIR_METADATA b/chromium/ui/webui/resources/js/ios/DIR_METADATA
new file mode 100644
index 00000000000..089d7e04537
--- /dev/null
+++ b/chromium/ui/webui/resources/js/ios/DIR_METADATA
@@ -0,0 +1,10 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+team_email: "ios-directory-owners@chromium.org"
+os: IOS \ No newline at end of file
diff --git a/chromium/ui/webui/resources/js/ios/OWNERS b/chromium/ui/webui/resources/js/ios/OWNERS
index 589970fa85e..cf3afee2ca7 100644
--- a/chromium/ui/webui/resources/js/ios/OWNERS
+++ b/chromium/ui/webui/resources/js/ios/OWNERS
@@ -1,4 +1 @@
-# TEAM: ios-directory-owners@chromium.org
-# OS: iOS
-
file://ios/OWNERS
diff --git a/chromium/ui/webui/resources/js/jstemplate_compiled.js b/chromium/ui/webui/resources/js/jstemplate_compiled.js
deleted file mode 100644
index 59344758f80..00000000000
--- a/chromium/ui/webui/resources/js/jstemplate_compiled.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file serves as a proxy to bring the included js file from /third_party
-// into its correct location under the resources directory tree, whence it is
-// delivered via a chrome://resources URL. See ../webui_resources.grd.
-
-// Note: this <include> is not behind a single-line comment because the first
-// line of the file is source code (so the first line would be skipped) instead
-// of a licence header.
-// clang-format off
-<include src="../../../../third_party/jstemplate/jstemplate_compiled.js">
diff --git a/chromium/ui/webui/resources/js/util.js b/chromium/ui/webui/resources/js/util.js
index 08680c98783..69091dfda6c 100644
--- a/chromium/ui/webui/resources/js/util.js
+++ b/chromium/ui/webui/resources/js/util.js
@@ -4,7 +4,6 @@
// #import {assertInstanceof} from './assert.m.js';
// #import {dispatchSimpleEvent} from './cr.m.js';
-// <include src="assert.js">
/**
* Alias for document.getElementById. Found elements must be HTMLElements.
@@ -323,110 +322,6 @@
});
}
-// <if expr="is_ios">
-// Polyfill 'key' in KeyboardEvent for iOS.
-// This function is not intended to be complete but should
-// be sufficient enough to have iOS work correctly while
-// it does not support key yet.
-if (!('key' in KeyboardEvent.prototype)) {
- Object.defineProperty(KeyboardEvent.prototype, 'key', {
- /** @this {KeyboardEvent} */
- get() {
- // 0-9
- if (this.keyCode >= 0x30 && this.keyCode <= 0x39) {
- return String.fromCharCode(this.keyCode);
- }
-
- // A-Z
- if (this.keyCode >= 0x41 && this.keyCode <= 0x5a) {
- let result = String.fromCharCode(this.keyCode).toLowerCase();
- if (this.shiftKey) {
- result = result.toUpperCase();
- }
- return result;
- }
-
- // Special characters
- switch (this.keyCode) {
- case 0x08:
- return 'Backspace';
- case 0x09:
- return 'Tab';
- case 0x0d:
- return 'Enter';
- case 0x10:
- return 'Shift';
- case 0x11:
- return 'Control';
- case 0x12:
- return 'Alt';
- case 0x1b:
- return 'Escape';
- case 0x20:
- return ' ';
- case 0x21:
- return 'PageUp';
- case 0x22:
- return 'PageDown';
- case 0x23:
- return 'End';
- case 0x24:
- return 'Home';
- case 0x25:
- return 'ArrowLeft';
- case 0x26:
- return 'ArrowUp';
- case 0x27:
- return 'ArrowRight';
- case 0x28:
- return 'ArrowDown';
- case 0x2d:
- return 'Insert';
- case 0x2e:
- return 'Delete';
- case 0x5b:
- return 'Meta';
- case 0x70:
- return 'F1';
- case 0x71:
- return 'F2';
- case 0x72:
- return 'F3';
- case 0x73:
- return 'F4';
- case 0x74:
- return 'F5';
- case 0x75:
- return 'F6';
- case 0x76:
- return 'F7';
- case 0x77:
- return 'F8';
- case 0x78:
- return 'F9';
- case 0x79:
- return 'F10';
- case 0x7a:
- return 'F11';
- case 0x7b:
- return 'F12';
- case 0xbb:
- return '=';
- case 0xbd:
- return '-';
- case 0xdb:
- return '[';
- case 0xdd:
- return ']';
- }
- return 'Unidentified';
- }
- });
-} else {
- window.console.log('KeyboardEvent.Key polyfill not required');
-}
-// </if> /* is_ios */
-
/**
* @param {!Event} e
* @return {boolean} Whether a modifier key was down when processing |e|.
diff --git a/chromium/ui/webui/resources/js/webui_resource_test.js b/chromium/ui/webui/resources/js/webui_resource_test.js
index 603f02713af..c7131485c5e 100644
--- a/chromium/ui/webui/resources/js/webui_resource_test.js
+++ b/chromium/ui/webui/resources/js/webui_resource_test.js
@@ -243,7 +243,7 @@ function startTesting() {
* @param {boolean=} opt_asyncTestFailure Optional parameter indicated if the
* last asynchronous test failed.
*/
-function continueTesting(opt_asyncTestFailure) {
+async function continueTesting(opt_asyncTestFailure) {
const now = performance.now();
if (testName) {
console.log(
@@ -270,7 +270,7 @@ function continueTesting(opt_asyncTestFailure) {
testHarness.setUp();
}
pendingTearDown = testHarness.tearDown || null;
- testScope[testName](continueTesting);
+ await testScope[testName](continueTesting);
} catch (err) {
console.error('Failure in test ' + testName + '\n' + err);
console.log(err.stack);
diff --git a/chromium/ui/webui/resources/polymer_resources.grdp b/chromium/ui/webui/resources/polymer_resources.grdp
deleted file mode 100644
index 1b613df5c94..00000000000
--- a/chromium/ui/webui/resources/polymer_resources.grdp
+++ /dev/null
@@ -1,327 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- This file is partially generated. See note below about the "partially" part.
-
- Please use 'src/tools/polymer/polymer_grdp_to_txt.py' and
- 'src/tools/polymer/txt_to_polymer_grdp.py' to modify it, if possible.
-
- 'polymer_grdp_to_txt.py' converts 'polymer_resources.grdp' to a plain list of
- used Polymer components:
- ...
- iron-iron-iconset/iron-iconset-extracted.js
- iron-iron-iconset/iron-iconset.html
- ...
-
- 'txt_to_polymer_grdp.py' converts list back to GRDP file.
-
- Usage:
- $ polymer_grdp_to_txt.py polymer_resources.grdp \-\-polymer-version=1 > /tmp/list.txt
- $ vim /tmp/list.txt
- $ txt_to_polymer_grdp.py /tmp/list.txt \-\-polymer-version=1 > polymer_resources.grdp
-
- NOTE: Regenerating this file will eliminate all previous <if expr> statements.
- Please restore these manually.
--->
-<grit-part>
- <!-- Polymer 1.0 -->
- <structure name="IDR_POLYMER_1_0_FONT_ROBOTO_ROBOTO_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/font-roboto/roboto.html"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_1_0_HTML_IMPORTS_HTML_IMPORTS_MIN_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/html-imports/html-imports.min.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_POLYMER_1_0_IRON_A11Y_ANNOUNCER_IRON_A11Y_ANNOUNCER_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/iron-a11y-announcer-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_A11Y_ANNOUNCER_IRON_A11Y_ANNOUNCER_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-a11y-announcer/iron-a11y-announcer.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_A11Y_KEYS_BEHAVIOR_IRON_A11Y_KEYS_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/iron-a11y-keys-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_A11Y_KEYS_BEHAVIOR_IRON_A11Y_KEYS_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_A11Y_KEYS_IRON_A11Y_KEYS_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_A11Y_KEYS_IRON_A11Y_KEYS_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_BEHAVIORS_IRON_BUTTON_STATE_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-button-state-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_BEHAVIORS_IRON_BUTTON_STATE_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-button-state.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_BEHAVIORS_IRON_CONTROL_STATE_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-control-state-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_BEHAVIORS_IRON_CONTROL_STATE_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-behaviors/iron-control-state.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_COLLAPSE_IRON_COLLAPSE_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_COLLAPSE_IRON_COLLAPSE_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-collapse/iron-collapse.html"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_1_0_IRON_DROPDOWN_IRON_DROPDOWN_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_DROPDOWN_IRON_DROPDOWN_SCROLL_MANAGER_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-scroll-manager-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_DROPDOWN_IRON_DROPDOWN_SCROLL_MANAGER_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown-scroll-manager.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_DROPDOWN_IRON_DROPDOWN_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-dropdown/iron-dropdown.html"
- type="chrome_html" />
- </if>
- <structure name="IDR_POLYMER_1_0_IRON_FIT_BEHAVIOR_IRON_FIT_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_FIT_BEHAVIOR_IRON_FIT_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-fit-behavior/iron-fit-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_FLEX_LAYOUT_IRON_FLEX_LAYOUT_CLASSES_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-flex-layout/iron-flex-layout-classes.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_FLEX_LAYOUT_IRON_FLEX_LAYOUT_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-flex-layout/iron-flex-layout.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_ICON_IRON_ICON_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-icon/iron-icon-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_ICON_IRON_ICON_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-icon/iron-icon.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_ICONSET_SVG_IRON_ICONSET_SVG_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-iconset-svg/iron-iconset-svg-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_ICONSET_SVG_IRON_ICONSET_SVG_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-iconset-svg/iron-iconset-svg.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_LIST_IRON_LIST_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-list/iron-list-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_LIST_IRON_LIST_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-list/iron-list.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_LOCATION_IRON_LOCATION_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-location/iron-location-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_LOCATION_IRON_LOCATION_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-location/iron-location.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_LOCATION_IRON_QUERY_PARAMS_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-location/iron-query-params-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_LOCATION_IRON_QUERY_PARAMS_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-location/iron-query-params.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_MEDIA_QUERY_IRON_MEDIA_QUERY_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-media-query/iron-media-query-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_MEDIA_QUERY_IRON_MEDIA_QUERY_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-media-query/iron-media-query.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_META_IRON_META_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-meta/iron-meta-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_META_IRON_META_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-meta/iron-meta.html"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_FOCUSABLES_HELPER_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_FOCUSABLES_HELPER_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-focusables-helper.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_BACKDROP_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-backdrop-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_BACKDROP_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-backdrop.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_MANAGER_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-manager-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_MANAGER_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-overlay-manager.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_SCROLL_MANAGER_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-scroll-manager-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_OVERLAY_BEHAVIOR_IRON_SCROLL_MANAGER_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-overlay-behavior/iron-scroll-manager.html"
- type="chrome_html" />
- </if>
- <structure name="IDR_POLYMER_1_0_IRON_PAGES_IRON_PAGES_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-pages/iron-pages-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_PAGES_IRON_PAGES_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-pages/iron-pages.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_RANGE_BEHAVIOR_IRON_RANGE_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-range-behavior/iron-range-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_RANGE_BEHAVIOR_IRON_RANGE_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-range-behavior/iron-range-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_RESIZABLE_BEHAVIOR_IRON_RESIZABLE_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/iron-resizable-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_RESIZABLE_BEHAVIOR_IRON_RESIZABLE_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/iron-resizable-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SCROLL_TARGET_BEHAVIOR_IRON_SCROLL_TARGET_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/iron-scroll-target-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SCROLL_TARGET_BEHAVIOR_IRON_SCROLL_TARGET_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-scroll-target-behavior/iron-scroll-target-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SCROLL_THRESHOLD_IRON_SCROLL_THRESHOLD_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/iron-scroll-threshold-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SCROLL_THRESHOLD_IRON_SCROLL_THRESHOLD_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-scroll-threshold/iron-scroll-threshold.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SELECTOR_IRON_MULTI_SELECTABLE_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-selector/iron-multi-selectable-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SELECTOR_IRON_MULTI_SELECTABLE_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-selector/iron-multi-selectable.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SELECTOR_IRON_SELECTABLE_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-selector/iron-selectable-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SELECTOR_IRON_SELECTABLE_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-selector/iron-selectable.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SELECTOR_IRON_SELECTION_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-selector/iron-selection-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SELECTOR_IRON_SELECTION_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-selector/iron-selection.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SELECTOR_IRON_SELECTOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-selector/iron-selector-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_IRON_SELECTOR_IRON_SELECTOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/iron-selector/iron-selector.html"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_ANIMATIONS_FADE_IN_ANIMATION_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-in-animation-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_ANIMATIONS_FADE_IN_ANIMATION_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-in-animation.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_ANIMATIONS_FADE_OUT_ANIMATION_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-out-animation-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_ANIMATIONS_FADE_OUT_ANIMATION_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/animations/fade-out-animation.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATABLE_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATABLE_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATABLE_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATABLE_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animatable.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATED_PAGES_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATED_PAGES_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animated-pages.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATION_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATION_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATION_RUNNER_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_NEON_ANIMATION_RUNNER_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/neon-animation-runner-behavior.html"
- type="chrome_html" />
- </if>
- <structure name="IDR_POLYMER_1_0_NEON_ANIMATION_WEB_ANIMATIONS_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/neon-animation/web-animations.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_BEHAVIORS_PAPER_RIPPLE_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_BEHAVIORS_PAPER_RIPPLE_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_PROGRESS_PAPER_PROGRESS_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-progress/paper-progress-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_PROGRESS_PAPER_PROGRESS_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-progress/paper-progress.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_RIPPLE_PAPER_RIPPLE_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-ripple/paper-ripple-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_RIPPLE_PAPER_RIPPLE_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-ripple/paper-ripple.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_SPINNER_PAPER_SPINNER_BEHAVIOR_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-spinner/paper-spinner-behavior-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_SPINNER_PAPER_SPINNER_BEHAVIOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-spinner/paper-spinner-behavior.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_SPINNER_PAPER_SPINNER_LITE_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-spinner/paper-spinner-lite-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_SPINNER_PAPER_SPINNER_LITE_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-spinner/paper-spinner-lite.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_SPINNER_PAPER_SPINNER_STYLES_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-spinner/paper-spinner-styles.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_STYLES_COLOR_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-styles/color.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_STYLES_SHADOW_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-styles/shadow.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_TOOLTIP_PAPER_TOOLTIP_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-tooltip/paper-tooltip-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_PAPER_TOOLTIP_PAPER_TOOLTIP_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/paper-tooltip/paper-tooltip.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_POLYMER2_POLYMER_EXTRACTED_JS"
- file="../../../third_party/polymer/v1_0/components-chromium/polymer2/polymer-extracted.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_POLYMER2_POLYMER_HTML"
- file="../../../third_party/polymer/v1_0/components-chromium/polymer2/polymer.html"
- type="chrome_html" />
- <structure name="IDR_POLYMER_1_0_WEB_ANIMATIONS_JS_WEB_ANIMATIONS_NEXT_LITE_MIN_JS"
- file="../../../third_party/web-animations-js/sources/web-animations-next-lite.min.js"
- type="chrome_html" />
-</grit-part>
-
diff --git a/chromium/ui/webui/resources/polymer_resources_v3.grdp b/chromium/ui/webui/resources/polymer_resources_v3.grdp
deleted file mode 100644
index aaa6d6e34de..00000000000
--- a/chromium/ui/webui/resources/polymer_resources_v3.grdp
+++ /dev/null
@@ -1,193 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- This file is partially generated. See note below about the "partially" part.
-
- Please use 'src/tools/polymer/polymer_grdp_to_txt.py' and
- 'src/tools/polymer/txt_to_polymer_grdp.py' to modify it, if possible.
-
- 'polymer_grdp_to_txt.py' converts 'polymer_resources.grdp' to a plain list of
- used Polymer components:
- ...
- iron-iron-iconset/iron-iconset-extracted.js
- iron-iron-iconset/iron-iconset.html
- ...
-
- 'txt_to_polymer_grdp.py' converts list back to GRDP file.
-
- Usage:
- $ polymer_grdp_to_txt.py polymer_resources.grdp \-\-polymer_version=3 > /tmp/list.txt
- $ vim /tmp/list.txt
- $ txt_to_polymer_grdp.py /tmp/list.txt \-\-polymer_version=3 > polymer_resources.grdp
-
- NOTE: Regenerating this file will eliminate all previous <if expr> statements.
- Please restore these manually.
--->
-<grit-part>
- <!-- Polymer 3.0 -->
- <structure name="IDR_POLYMER_3_0_FONT_ROBOTO_ROBOTO_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/font-roboto/roboto.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_A11Y_ANNOUNCER_IRON_A11Y_ANNOUNCER_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-a11y-announcer/iron-a11y-announcer.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_A11Y_KEYS_BEHAVIOR_IRON_A11Y_KEYS_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_A11Y_KEYS_IRON_A11Y_KEYS_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-a11y-keys/iron-a11y-keys.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_BEHAVIORS_IRON_BUTTON_STATE_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-behaviors/iron-button-state.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_BEHAVIORS_IRON_CONTROL_STATE_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-behaviors/iron-control-state.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_COLLAPSE_IRON_COLLAPSE_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-collapse/iron-collapse.js"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_3_0_IRON_DROPDOWN_IRON_DROPDOWN_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-dropdown/iron-dropdown.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_DROPDOWN_IRON_DROPDOWN_SCROLL_MANAGER_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-dropdown/iron-dropdown-scroll-manager.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_POLYMER_3_0_IRON_FIT_BEHAVIOR_IRON_FIT_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-fit-behavior/iron-fit-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_FLEX_LAYOUT_IRON_FLEX_LAYOUT_CLASSES_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-flex-layout/iron-flex-layout-classes.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_FLEX_LAYOUT_IRON_FLEX_LAYOUT_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-flex-layout/iron-flex-layout.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_ICONSET_SVG_IRON_ICONSET_SVG_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-iconset-svg/iron-iconset-svg.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_ICON_IRON_ICON_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-icon/iron-icon.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_LIST_IRON_LIST_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-list/iron-list.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_LOCATION_IRON_LOCATION_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-location/iron-location.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_LOCATION_IRON_QUERY_PARAMS_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-location/iron-query-params.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_MEDIA_QUERY_IRON_MEDIA_QUERY_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-media-query/iron-media-query.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_META_IRON_META_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-meta/iron-meta.js"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_3_0_IRON_OVERLAY_BEHAVIOR_IRON_FOCUSABLES_HELPER_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/iron-focusables-helper.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_BACKDROP_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/iron-overlay-backdrop.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/iron-overlay-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_OVERLAY_BEHAVIOR_IRON_OVERLAY_MANAGER_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/iron-overlay-manager.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_OVERLAY_BEHAVIOR_IRON_SCROLL_MANAGER_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/iron-scroll-manager.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_POLYMER_3_0_IRON_PAGES_IRON_PAGES_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-pages/iron-pages.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_RANGE_BEHAVIOR_IRON_RANGE_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-range-behavior/iron-range-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_RESIZABLE_BEHAVIOR_IRON_RESIZABLE_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-resizable-behavior/iron-resizable-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_SCROLL_TARGET_BEHAVIOR_IRON_SCROLL_TARGET_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-scroll-target-behavior/iron-scroll-target-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_SCROLL_THRESHOLD_IRON_SCROLL_THRESHOLD_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/iron-scroll-threshold.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_SELECTOR_IRON_MULTI_SELECTABLE_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-selector/iron-multi-selectable.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_SELECTOR_IRON_SELECTABLE_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-selector/iron-selectable.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_SELECTOR_IRON_SELECTION_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-selector/iron-selection.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_SELECTOR_IRON_SELECTOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-selector/iron-selector.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_IRON_TEST_HELPERS_MOCK_INTERACTIONS_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/iron-test-helpers/mock-interactions.js"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_POLYMER_3_0_NEON_ANIMATION_ANIMATIONS_FADE_IN_ANIMATION_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/neon-animation/animations/fade-in-animation.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_NEON_ANIMATION_ANIMATIONS_FADE_OUT_ANIMATION_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/neon-animation/animations/fade-out-animation.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_NEON_ANIMATION_NEON_ANIMATABLE_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/neon-animation/neon-animatable-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_NEON_ANIMATION_NEON_ANIMATABLE_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/neon-animation/neon-animatable.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_NEON_ANIMATION_NEON_ANIMATED_PAGES_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/neon-animation/neon-animated-pages.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_NEON_ANIMATION_NEON_ANIMATION_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/neon-animation/neon-animation-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_NEON_ANIMATION_NEON_ANIMATION_RUNNER_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/neon-animation/neon-animation-runner-behavior.js"
- type="chrome_html" />
- </if>
- <structure name="IDR_POLYMER_3_0_PAPER_BEHAVIORS_PAPER_INKY_FOCUS_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-behaviors/paper-inky-focus-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_BEHAVIORS_PAPER_RIPPLE_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-behaviors/paper-ripple-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_PROGRESS_PAPER_PROGRESS_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-progress/paper-progress.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_RIPPLE_PAPER_RIPPLE_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-ripple/paper-ripple.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_SPINNER_PAPER_SPINNER_BEHAVIOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-spinner/paper-spinner-behavior.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_SPINNER_PAPER_SPINNER_LITE_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-spinner/paper-spinner-lite.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_SPINNER_PAPER_SPINNER_STYLES_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-spinner/paper-spinner-styles.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_STYLES_COLOR_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/color.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_STYLES_SHADOW_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/shadow.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_STYLES_TYPOGRAPHY_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-styles/typography.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_PAPER_TOOLTIP_PAPER_TOOLTIP_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/paper-tooltip/paper-tooltip.js"
- type="chrome_html" />
- <structure name="IDR_POLYMER_3_0_POLYMER_POLYMER_BUNDLED_MIN_JS"
- file="../../../third_party/polymer/v3_0/components-chromium/polymer/polymer_bundled.min.js"
- type="chrome_html" />
-</grit-part>
-
diff --git a/chromium/ui/webui/resources/roboto/DIR_METADATA b/chromium/ui/webui/resources/roboto/DIR_METADATA
new file mode 100644
index 00000000000..70c7a85cdb0
--- /dev/null
+++ b/chromium/ui/webui/resources/roboto/DIR_METADATA
@@ -0,0 +1,11 @@
+# Metadata information for this directory.
+#
+# For more information on DIR_METADATA files, see:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md
+#
+# For the schema of this file, see Metadata message:
+# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto
+
+monorail {
+ component: "UI>Browser"
+} \ No newline at end of file
diff --git a/chromium/ui/webui/resources/roboto/OWNERS b/chromium/ui/webui/resources/roboto/OWNERS
index e7cc61351d4..07a31a62aca 100644
--- a/chromium/ui/webui/resources/roboto/OWNERS
+++ b/chromium/ui/webui/resources/roboto/OWNERS
@@ -1,3 +1 @@
mathp@chromium.org
-
-# COMPONENT: UI>Browser
diff --git a/chromium/ui/webui/resources/tools/generate_grd.gni b/chromium/ui/webui/resources/tools/generate_grd.gni
index 405871b4155..ba86c707730 100644
--- a/chromium/ui/webui/resources/tools/generate_grd.gni
+++ b/chromium/ui/webui/resources/tools/generate_grd.gni
@@ -10,17 +10,46 @@ template("generate_grd") {
deps = invoker.deps
}
- inputs = invoker.manifest_files
+ inputs = []
outputs = [ invoker.out_grd ]
args = [
- "--out-grd",
- rebase_path(invoker.out_grd, root_build_dir),
- "--grd-prefix",
- invoker.grd_prefix,
- "--root-gen-dir",
- rebase_path(root_gen_dir, root_build_dir),
- "--manifest-files",
- ] + rebase_path(invoker.manifest_files, root_build_dir)
+ "--out-grd",
+ rebase_path(invoker.out_grd, root_build_dir),
+ "--grd-prefix",
+ invoker.grd_prefix,
+ "--root-gen-dir",
+ rebase_path(root_gen_dir, root_build_dir),
+ ]
+
+ if (defined(invoker.manifest_files)) {
+ inputs += invoker.manifest_files
+ args += [ "--manifest-files" ] +
+ rebase_path(invoker.manifest_files, root_build_dir)
+ }
+
+ if (defined(invoker.grdp_files)) {
+ inputs += invoker.grdp_files
+ args +=
+ [ "--grdp-files" ] + rebase_path(invoker.grdp_files, root_build_dir)
+ }
+
+ if (defined(invoker.input_files)) {
+ args += [
+ "--input-files-base-dir",
+ invoker.input_files_base_dir,
+ "--input-files",
+ ] + invoker.input_files
+ }
+
+ if (defined(invoker.resource_path_rewrites)) {
+ args += [ "--resource-path-rewrites" ] + invoker.resource_path_rewrites
+ }
+ if (defined(invoker.resource_path_prefix)) {
+ args += [
+ "--resource-path-prefix",
+ invoker.resource_path_prefix,
+ ]
+ }
}
}
diff --git a/chromium/ui/webui/resources/tools/generate_grd.py b/chromium/ui/webui/resources/tools/generate_grd.py
index 59d2a960c32..d65706e61ae 100644
--- a/chromium/ui/webui/resources/tools/generate_grd.py
+++ b/chromium/ui/webui/resources/tools/generate_grd.py
@@ -29,6 +29,14 @@
# from the root generated directory for setting file paths, as grd files
# with generated file paths must specify these paths as
# "${root_gen_dir}/<path_to_file>"
+#
+# input_files:
+# List of file paths (from |input_files_base_dir|) that are not included in
+# any manifest files, but should be added to the grd.
+#
+# input_files_base_dir:
+# The base directory for the paths in |input_files|. |input_files| and
+# |input_files_base_dir| must either both be provided or both be omitted.
import argparse
import json
@@ -56,38 +64,112 @@ GRD_BEGIN_TEMPLATE = '<?xml version="1.0" encoding="UTF-8"?>\n'\
' <includes>\n'
GRD_INCLUDE_TEMPLATE = ' <include name="{name}" ' \
- 'file="${{root_gen_dir}}/{path_from_gen}" ' \
- 'use_base_dir="false" type="BINDATA" />\n'
+ 'file="{file}" resource_path="{path}" ' \
+ 'use_base_dir="false" type="{type}" />\n'
+GRD_INCLUDE_TEMPLATE_PP = ' <include name="{name}" ' \
+ 'file="{file}" resource_path="{path}" ' \
+ 'use_base_dir="false" preprocess="true" '\
+ 'type="{type}" />\n'
GRD_END_TEMPLATE = ' </includes>\n'\
' </release>\n'\
'</grit>\n'
+GRDP_BEGIN_TEMPLATE = '<?xml version="1.0" encoding="UTF-8"?>\n'\
+ '<grit-part>\n'
+GRDP_END_TEMPLATE = '</grit-part>\n'
+
+# Generates an <include .... /> row for the given file.
+def _generate_include_row(grd_prefix, filename, pathname, \
+ resource_path_rewrites, resource_path_prefix):
+ name_suffix = filename.upper().replace('/', '_').replace('.', '_'). \
+ replace('-', '_')
+ name = 'IDR_%s_%s' % (grd_prefix.upper(), name_suffix)
+ extension = os.path.splitext(filename)[1]
+ type = 'chrome_html' if extension == '.html' or extension == '.js' \
+ else 'BINDATA'
+
+ resource_path = resource_path_rewrites[filename] \
+ if filename in resource_path_rewrites else filename
+
+ if resource_path_prefix != None:
+ resource_path = resource_path_prefix + '/' + resource_path
+
+ # This is a temporary workaround, since Polymer 2 shared resource files are
+ # not preprocessed.
+ # TODO(rbpotter): Remove this once OS Settings has been migrated to Polymer 3.
+ if ('vulcanized' in pathname or 'crisper' in pathname):
+ return GRD_INCLUDE_TEMPLATE_PP.format(
+ file=pathname,
+ path=resource_path,
+ name=name,
+ type=type)
+
+ return GRD_INCLUDE_TEMPLATE.format(
+ file=pathname,
+ path=resource_path,
+ name=name,
+ type=type)
+
+
+def _generate_part_row(filename):
+ return ' <part file="%s" />\n' % filename
+
+
def main(argv):
parser = argparse.ArgumentParser()
- parser.add_argument('--manifest-files', required=True, nargs="*")
+ parser.add_argument('--manifest-files', nargs="*")
parser.add_argument('--out-grd', required=True)
parser.add_argument('--grd-prefix', required=True)
parser.add_argument('--root-gen-dir', required=True)
+ parser.add_argument('--input-files', nargs="*")
+ parser.add_argument('--input-files-base-dir')
+ parser.add_argument('--grdp-files', nargs="*")
+ parser.add_argument('--resource-path-rewrites', nargs="*")
+ parser.add_argument('--resource-path-prefix')
args = parser.parse_args(argv)
grd_file = open(os.path.normpath(os.path.join(_CWD, args.out_grd)), 'w')
- grd_file.write(GRD_BEGIN_TEMPLATE.format(prefix=args.grd_prefix))
-
- for manifest_file in args.manifest_files:
- manifest_path = os.path.normpath(os.path.join(_CWD, manifest_file))
- with open(manifest_path, 'r') as f:
- data = json.load(f)
- base_dir= os.path.normpath(os.path.join(_CWD, data['base_dir']))
- for filename in data['files']:
- name_suffix = filename.upper().replace('/', '_').replace('.', '_')
- name = 'IDR_%s_%s' % (args.grd_prefix.upper(), name_suffix)
- filepath = os.path.join(base_dir, filename).replace('\\', '/')
- rebased_path = os.path.relpath(filepath, args.root_gen_dir)
- grd_file.write(GRD_INCLUDE_TEMPLATE.format(name=name,
- path_from_gen=rebased_path))
-
- grd_file.write(GRD_END_TEMPLATE)
+ begin_template = GRDP_BEGIN_TEMPLATE if args.out_grd.endswith('.grdp') else \
+ GRD_BEGIN_TEMPLATE
+ grd_file.write(begin_template.format(prefix=args.grd_prefix))
+
+ if args.grdp_files != None:
+ for grdp_file in args.grdp_files:
+ grdp_path = os.path.relpath(grdp_file, os.path.dirname(args.out_grd))
+ grd_file.write(_generate_part_row(grdp_path))
+
+ resource_path_rewrites = {}
+ if args.resource_path_rewrites != None:
+ for r in args.resource_path_rewrites:
+ [original, rewrite] = r.split("|")
+ resource_path_rewrites[original] = rewrite
+
+ if args.input_files != None:
+ assert(args.input_files_base_dir)
+ for filename in args.input_files:
+ filepath = os.path.join(
+ args.input_files_base_dir, filename).replace('\\', '/')
+ grd_file.write(_generate_include_row(
+ args.grd_prefix, filename, '${root_src_dir}/' + filepath,
+ resource_path_rewrites, args.resource_path_prefix))
+
+ if args.manifest_files != None:
+ for manifest_file in args.manifest_files:
+ manifest_path = os.path.normpath(os.path.join(_CWD, manifest_file))
+ with open(manifest_path, 'r') as f:
+ data = json.load(f)
+ base_dir= os.path.normpath(os.path.join(_CWD, data['base_dir']))
+ for filename in data['files']:
+ filepath = os.path.join(base_dir, filename).replace('\\', '/')
+ rebased_path = os.path.relpath(filepath, args.root_gen_dir)
+ grd_file.write(_generate_include_row(
+ args.grd_prefix, filename, '${root_gen_dir}/' + rebased_path,
+ resource_path_rewrites, args.resource_path_prefix))
+
+ end_template = GRDP_END_TEMPLATE if args.out_grd.endswith('.grdp') else \
+ GRD_END_TEMPLATE
+ grd_file.write(end_template)
return
diff --git a/chromium/ui/webui/resources/tools/generate_grd_test.py b/chromium/ui/webui/resources/tools/generate_grd_test.py
index 3549cdc63e2..c42d4f7eafe 100755
--- a/chromium/ui/webui/resources/tools/generate_grd_test.py
+++ b/chromium/ui/webui/resources/tools/generate_grd_test.py
@@ -14,10 +14,33 @@ _CWD = os.getcwd()
_HERE_DIR = os.path.dirname(__file__)
pathToHere = os.path.relpath(_HERE_DIR, _CWD)
+# This needs to be a constant, because if this expected file is checked into
+# the repo, translation.py will try to find the dummy grdp files, which don't
+# exist. We can't alter the translation script, so work around it by
+# hardcoding this string, instead of checking in even more dummy files.
+EXPECTED_GRD_WITH_GRDP_FILES = '''<?xml version="1.0" encoding="UTF-8"?>
+<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+ <outputs>
+ <output filename="grit/test_resources.h" type="rc_header">
+ <emit emit_type='prepend'></emit>
+ </output>
+ <output filename="grit/test_resources_map.cc"
+ type="resource_file_map_source" />
+ <output filename="grit/test_resources_map.h"
+ type="resource_map_header" />
+ <output filename="test_resources.pak" type="data_package" />
+ </outputs>
+ <release seq="1">
+ <includes>
+ <part file="foo_resources.grdp" />
+ <part file="foo/bar_resources.grdp" />
+ </includes>
+ </release>
+</grit>\n'''
class GenerateGrdTest(unittest.TestCase):
def setUp(self):
- self._out_folder = None
+ self._out_folder = tempfile.mkdtemp(dir=_HERE_DIR)
def tearDown(self):
shutil.rmtree(self._out_folder)
@@ -26,28 +49,103 @@ class GenerateGrdTest(unittest.TestCase):
assert self._out_folder
return open(os.path.join(self._out_folder, file_name), 'rb').read()
- def _run_test_(self, manifest_files, grd_expected):
- assert not self._out_folder
- self._out_folder = tempfile.mkdtemp(dir=_HERE_DIR)
+ def _run_test_(self, grd_expected,
+ out_grd='test_resources.grd',
+ manifest_files=None, input_files=None,
+ input_files_base_dir=None, grdp_files=None,
+ resource_path_rewrites=None, resource_path_prefix=None):
args = [
- '--out-grd', os.path.join(self._out_folder, 'test_resources.grd'),
+ '--out-grd', os.path.join(self._out_folder, out_grd),
'--grd-prefix', 'test',
'--root-gen-dir', os.path.join(_CWD, pathToHere, 'tests'),
- '--manifest-files',
- ] + manifest_files
+ ]
+
+ if manifest_files != None:
+ args += [
+ '--manifest-files',
+ ] + manifest_files
+
+ if grdp_files != None:
+ args += [
+ '--grdp-files',
+ ] + grdp_files
+
+ if (input_files_base_dir):
+ args += [
+ '--input-files-base-dir',
+ input_files_base_dir,
+ '--input-files',
+ ] + input_files
+
+ if (resource_path_rewrites):
+ args += [ '--resource-path-rewrites' ] + resource_path_rewrites
+
+ if (resource_path_prefix):
+ args += [ '--resource-path-prefix', resource_path_prefix ]
generate_grd.main(args)
- actual_grd = self._read_out_file('test_resources.grd')
- expected_grd = open(
- os.path.join(_HERE_DIR, 'tests', grd_expected), 'rb').read()
- self.assertEquals(expected_grd, actual_grd)
+ actual_grd = self._read_out_file(out_grd)
+ if (grd_expected.endswith('.grd') or grd_expected.endswith('.grdp')):
+ expected_grd_content = open(
+ os.path.join(_HERE_DIR, 'tests', grd_expected), 'rb').read()
+ self.assertEquals(expected_grd_content, actual_grd)
+ else:
+ self.assertEquals(grd_expected, actual_grd)
def testSuccess(self):
- self._run_test_([
+ self._run_test_(
+ 'expected_grd.grd',
+ manifest_files = [
os.path.join(pathToHere, 'tests', 'test_manifest_1.json'),
os.path.join(pathToHere, 'tests', 'test_manifest_2.json'),
- ], 'expected_grd.grd')
+ ])
+
+ def testSuccessWithInputFiles(self):
+ self._run_test_(
+ 'expected_grd_with_input_files.grd',
+ manifest_files = [
+ os.path.join(pathToHere, 'tests', 'test_manifest_1.json'),
+ os.path.join(pathToHere, 'tests', 'test_manifest_2.json'),
+ ],
+ input_files = [ 'images/test_svg.svg', 'test_html_in_src.html' ],
+ input_files_base_dir = 'test_src_dir')
+
+ def testSuccessWithGrdpFiles(self):
+ self._run_test_(
+ EXPECTED_GRD_WITH_GRDP_FILES,
+ grdp_files = [
+ os.path.join(self._out_folder, 'foo_resources.grdp'),
+ os.path.join(self._out_folder, 'foo', 'bar_resources.grdp'),
+ ])
+
+ def testSuccessGrdpWithInputFiles(self):
+ self._run_test_(
+ 'expected_grdp_with_input_files.grdp',
+ out_grd = 'test_resources.grdp',
+ input_files = [ 'images/test_svg.svg', 'test_html_in_src.html' ],
+ input_files_base_dir = 'test_src_dir')
+
+ def testSuccessGrdpWithResourcePathPrefix(self):
+ self._run_test_(
+ 'expected_grdp_with_resource_path_prefix.grdp',
+ out_grd = 'test_resources.grdp',
+ input_files = [ 'foo.js', 'bar.svg' ],
+ input_files_base_dir = 'test_src_dir',
+ resource_path_prefix = 'baz')
+
+ def testSuccessWithRewrites(self):
+ self._run_test_(
+ 'expected_grd_with_rewrites.grd',
+ manifest_files = [
+ os.path.join(pathToHere, 'tests', 'test_manifest_1.json'),
+ os.path.join(pathToHere, 'tests', 'test_manifest_2.json'),
+ ],
+ resource_path_rewrites=[
+ 'test.rollup.js|test.js',
+ 'dir/another_element_in_dir.js|dir2/another_element_in_dir_renamed.js',
+ ])
+
if __name__ == '__main__':
unittest.main()
diff --git a/chromium/ui/webui/resources/tools/js_modulizer.gni b/chromium/ui/webui/resources/tools/js_modulizer.gni
index 169566d0c3c..f70bc47aa11 100644
--- a/chromium/ui/webui/resources/tools/js_modulizer.gni
+++ b/chromium/ui/webui/resources/tools/js_modulizer.gni
@@ -46,6 +46,8 @@ template("js_modulizer") {
[ "$target_gen_dir/" + get_path_info(_input, "name") + ".m.js" ]
}
+ data = outputs
+
args = [
"--in_folder",
rebase_path(".", root_build_dir),
@@ -58,9 +60,5 @@ template("js_modulizer") {
if (defined(invoker.namespace_rewrites)) {
args += invoker.namespace_rewrites
}
-
- if (defined(invoker.deps)) {
- deps = invoker.deps
- }
}
}
diff --git a/chromium/ui/webui/resources/webui_resources.grd b/chromium/ui/webui/resources/webui_resources.grd
index cc15b3e7da8..461cd851af1 100644
--- a/chromium/ui/webui/resources/webui_resources.grd
+++ b/chromium/ui/webui/resources/webui_resources.grd
@@ -13,11 +13,9 @@ without changes to the corresponding grd file. -->
</outputs>
<release seq="1">
<includes>
- <if expr="chromeos">
- <include name="IDR_WEBUI_I18N_TEMPLATE_PROCESS_JS" file="js/i18n_template_process.js" type="BINDATA" />
- </if>
- <include name="IDR_WEBUI_JSTEMPLATE_JS" file="js/jstemplate_compiled.js"
- flattenhtml="true" type="BINDATA"/>
+ <include name="IDR_WEBUI_JS_JSTEMPLATE_COMPILED_JS"
+ file="../../../third_party/jstemplate/jstemplate_compiled.js"
+ resource_path="js/jstemplate_compiled.js" type="BINDATA"/>
<!-- Roboto Font. Roboto-Regular and Roboto-Light is already available on
Android, and Roboto-Medium is not used on Android. All 6 weights of
Roboto are available on Chrome OS.-->
@@ -29,186 +27,72 @@ without changes to the corresponding grd file. -->
<!-- Component apps common image resources - 1x -->
<!-- Misc buttons -->
- <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_CLOSE"
+ <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_CLOSE_PNG"
file="images/apps/topbar_button_close.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_MAXIMIZE"
+ <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_MAXIMIZE_PNG"
file="images/apps/topbar_button_maximize.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_MINIMIZE"
+ <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_MINIMIZE_PNG"
file="images/apps/topbar_button_minimize.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE"
- file="images/apps/button_butter_bar_close.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_HOVER"
- file="images/apps/button_butter_bar_close_hover.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_PRESSED"
- file="images/apps/button_butter_bar_close_pressed.png" type="BINDATA" />
<!-- Component apps common image resources - 2x -->
<!-- Misc buttons -->
- <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_CLOSE"
+ <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_CLOSE_PNG"
file="images/2x/apps/topbar_button_close.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_MAXIMIZE"
+ <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_MAXIMIZE_PNG"
file="images/2x/apps/topbar_button_maximize.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_MINIMIZE"
+ <include name="IDR_WEBUI_IMAGES_APPS_TOPBAR_BUTTON_2X_MINIMIZE_PNG"
file="images/2x/apps/topbar_button_minimize.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_2X"
- file="images/2x/apps/button_butter_bar_close.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_HOVER_2X"
- file="images/2x/apps/button_butter_bar_close_hover.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_APPS_BUTTON_BUTTER_BAR_CLOSE_PRESSED_2X"
- file="images/2x/apps/button_butter_bar_close_pressed.png" type="BINDATA" />
<!-- Non-apps images -->
- <include name="IDR_WEBUI_IMAGES_ADD"
+ <include name="IDR_WEBUI_IMAGES_ADD_SVG"
file="images/add.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_CHECK"
+ <include name="IDR_WEBUI_IMAGES_CHECK_PNG"
file="images/check.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_CHECKBOX_BLACK"
+ <include name="IDR_WEBUI_IMAGES_CHECKBOX_BLACK_PNG"
file="images/checkbox_black.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_CHECKBOX_WHITE"
+ <include name="IDR_WEBUI_IMAGES_CHECKBOX_WHITE_PNG"
file="images/checkbox_white.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_DISABLED_SELECT"
+ <include name="IDR_WEBUI_IMAGES_DISABLED_SELECT_PNG"
file="images/disabled_select.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_ERROR"
+ <include name="IDR_WEBUI_IMAGES_ERROR_SVG"
file="images/error.svg" type="BINDATA" />
<!-- Similar to IDR_WEBUI_IMAGES_ERROR except that it is white-filled instead of transparent-filled. Useful for badging images where the background may be red. -->
- <include name="IDR_WEBUI_IMAGES_ERROR_BADGE"
+ <include name="IDR_WEBUI_IMAGES_ERROR_BADGE_SVG"
file="images/error_badge.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_GOOGLE_LOGO"
- file="images/google_logo.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_SELECT"
+ <include name="IDR_WEBUI_IMAGES_SELECT_PNG"
file="images/select.png" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_THROBBER_MEDIUM"
+ <include name="IDR_WEBUI_IMAGES_THROBBER_MEDIUM_SVG"
file="images/throbber_medium.svg" type="BINDATA" />
- <include name="IDR_WEBUI_IMAGES_THROBBER_SMALL"
+ <include name="IDR_WEBUI_IMAGES_THROBBER_SMALL_SVG"
file="images/throbber_small.svg" type="BINDATA" />
- <!-- Web UI shared JS module resources. -->
- <include name="IDR_WEBUI_JS_ASSERT_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/assert.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_COLOR_UTILS_JS"
- file="js/color_utils.js" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_EVENT_TARGET_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/event_target.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_UI_DRAG_WRAPPER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/drag_wrapper.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_UI_FOCUS_GRID_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_grid.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_UI_FOCUS_OUTLINE_MANAGER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_outline_manager.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_UI_FOCUS_ROW_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_row.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_UI_FOCUS_WITHOUT_INK_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/focus_without_ink.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_UI_KEYBOARD_SHORTCUT_LIST_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/keyboard_shortcut_list.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_UI_STORE_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/store.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_CR_UI_STORE_CLIENT_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/cr/ui/store_client.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_EVENT_TRACKER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/event_tracker.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_ICON_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/icon.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_LOAD_TIME_DATA_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/load_time_data.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_PARSE_HTML_SUBSET_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/parse_html_subset.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_PLURAL_STRING_PROXY"
- file="js/plural_string_proxy.js" type="BINDATA" />
- <include name="IDR_WEBUI_JS_PROMISE_RESOLVER_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/promise_resolver.m.js"
- use_base_dir="false" type="BINDATA" />
- <include name="IDR_WEBUI_JS_UTIL_M_JS"
- file="${root_gen_dir}/ui/webui/resources/js/util.m.js"
- use_base_dir="false" type="BINDATA"
- preprocess="true" />
<if expr="not is_android">
<part file="cr_components/cr_components_images.grdp" />
<part file="cr_elements_images.grdp" />
</if>
-
- <if expr="not is_android and not is_ios">
- <part file="cr_components/cr_components_resources_v3.grdp" />
- <part file="cr_elements_resources_v3.grdp" />
- <part file="cr_polymer_resources_v3.grdp" />
- </if>
</includes>
<structures>
- <structure name="IDR_WEBUI_CSS_ACTION_LINK"
- file="css/action_link.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_APPS_COMMON"
- file="css/apps/common.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_APPS_TOPBUTTON_BAR"
- file="css/apps/topbutton_bar.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_BUBBLE"
- file="css/bubble.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_BUBBLE_BUTTON"
- file="css/bubble_button.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_BUTTER_BAR"
- file="css/butter_bar.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_CHROME"
- file="css/chrome_shared.css" type="chrome_html"
- flattenhtml="true" />
- <structure name="IDR_WEBUI_CSS_CONTROLLED_INDICATOR"
+ <structure name="IDR_WEBUI_CSS_CONTROLLED_INDICATOR_CSS"
file="css/controlled_indicator.css" type="chrome_html" flattenhtml="true" />
- <structure name="IDR_WEBUI_CSS_DIALOGS"
- file="css/dialogs.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_I18N_PROCESS"
- file="css/i18n_process.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_LIST"
- file="css/list.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_MENU"
+ <structure name="IDR_WEBUI_CSS_MENU_CSS"
file="css/menu.css" type="chrome_html"
flattenhtml="true" />
- <structure name="IDR_WEBUI_CSS_MENU_BUTTON"
+ <structure name="IDR_WEBUI_CSS_MENU_BUTTON_CSS"
file="css/menu_button.css" type="chrome_html"
flattenhtml="true" />
- <structure name="IDR_WEBUI_CSS_TEXT_DEFAULTS"
- file="css/text_defaults.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_TEXT_DEFAULTS_MD"
- file="css/text_defaults_md.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_OVERLAY"
+ <structure name="IDR_WEBUI_CSS_OVERLAY_CSS"
file="css/overlay.css" type="chrome_html"
flattenhtml="true" />
- <structure name="IDR_WEBUI_CSS_ROBOTO" preprocess="true"
- file="css/roboto.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_SPINNER"
+ <structure name="IDR_WEBUI_CSS_SPINNER_CSS"
file="css/spinner.css" type="chrome_html"
flattenhtml="true" />
- <structure name="IDR_WEBUI_CSS_TABLE"
- file="css/table.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_TABS"
- file="css/tabs.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_THROBBER"
- file="css/throbber.css" type="chrome_html" />
- <structure name="IDR_WEBUI_CSS_TREE"
+ <structure name="IDR_WEBUI_CSS_TREE_CSS"
file="css/tree.css" type="chrome_html"
flattenhtml="true" />
- <structure name="IDR_WEBUI_CSS_WIDGETS"
+ <structure name="IDR_WEBUI_CSS_WIDGETS_CSS"
file="css/widgets.css" type="chrome_html"
flattenhtml="true" />
- <structure name="IDR_WEBUI_HTML_ACTION_LINK"
- file="html/action_link.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_ASSERT"
- file="html/assert.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_PROMISE_RESOLVER"
- file="html/promise_resolver.html" type="chrome_html" />
-
<if expr="chromeos">
<structure name="IDR_WEBUI_CROS_COLORS_CSS"
file="${root_gen_dir}/ui/chromeos/colors/cros_colors.generated.css"
@@ -216,185 +100,6 @@ without changes to the corresponding grd file. -->
use_base_dir="false" />
</if>
- <structure name="IDR_WEBUI_HTML_CR"
- file="html/cr.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_EVENT_TARGET"
- file="html/cr/event_target.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI"
- file="html/cr/ui.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_ARRAY_DATA_MODEL"
- file="html/cr/ui/array_data_model.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_COMMAND"
- file="html/cr/ui/command.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_CONTEXT_MENU_HANDLER"
- file="html/cr/ui/context_menu_handler.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_DRAG_WRAPPER"
- file="html/cr/ui/drag_wrapper.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_GRID"
- file="html/cr/ui/focus_grid.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_MANAGER"
- file="html/cr/ui/focus_manager.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_OUTLINE_MANAGER"
- file="html/cr/ui/focus_outline_manager.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_FOCUS_ROW"
- file="html/cr/ui/focus_row.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_KEYBOARD_SHORTCUT_LIST"
- file="html/cr/ui/keyboard_shortcut_list.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_LIST"
- file="html/cr/ui/list.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_LIST_ITEM"
- file="html/cr/ui/list_item.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_LIST_SELECTION_CONTROLLER"
- file="html/cr/ui/list_selection_controller.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_LIST_SELECTION_MODEL"
- file="html/cr/ui/list_selection_model.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_MENU"
- file="html/cr/ui/menu.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_MENU_BUTTON"
- file="html/cr/ui/menu_button.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_MENU_ITEM"
- file="html/cr/ui/menu_item.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_OVERLAY"
- file="html/cr/ui/overlay.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_POSITION_UTIL"
- file="html/cr/ui/position_util.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_SPLITTER"
- file="html/cr/ui/splitter.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_STORE"
- file="html/cr/ui/store.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_CR_UI_STORE_CLIENT"
- file="html/cr/ui/store_client.html"
- type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_EVENT_TRACKER"
- file="html/event_tracker.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_ICON"
- file="html/icon.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_LOAD_TIME_DATA"
- file="html/load_time_data.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_PARSE_HTML_SUBSET"
- file="html/parse_html_subset.html" type="chrome_html" />
- <structure name="IDR_WEBUI_HTML_TEST_LOADER"
- file="html/test_loader.html" type="chrome_html"/>
- <structure name="IDR_WEBUI_HTML_UTIL"
- file="html/util.html" type="chrome_html" />
-
- <structure name="IDR_WEBUI_JS_ACTION_LINK"
- file="js/action_link.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_ASSERT"
- file="js/assert.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_PROMISE_RESOLVER"
- file="js/promise_resolver.js" type="chrome_html" />
-
- <structure name="IDR_WEBUI_JS_CR"
- file="js/cr.js" type="chrome_html"
- preprocess="true" />
- <structure name="IDR_WEBUI_JS_CR_M_JS"
- file="js/cr.m.js" type="chrome_html"
- preprocess="true" />
- <structure name="IDR_WEBUI_JS_CR_EVENT_TARGET"
- file="js/cr/event_target.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI"
- file="js/cr/ui.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_ARRAY_DATA_MODEL"
- file="js/cr/ui/array_data_model.js"
- type="chrome_html" flattenhtml="true" />
- <structure name="IDR_WEBUI_JS_CR_UI_BUBBLE"
- file="js/cr/ui/bubble.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_BUBBLE_BUTTON"
- file="js/cr/ui/bubble_button.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_CARD_SLIDER"
- file="js/cr/ui/card_slider.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_COMMAND"
- file="js/cr/ui/command.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_CONTEXT_MENU_HANDLER"
- file="js/cr/ui/context_menu_handler.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_CONTROLLED_INDICATOR"
- file="js/cr/ui/controlled_indicator.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_DIALOGS"
- file="js/cr/ui/dialogs.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_DRAG_WRAPPER"
- file="js/cr/ui/drag_wrapper.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_GRID"
- file="js/cr/ui/focus_grid.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_MANAGER"
- file="js/cr/ui/focus_manager.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_OUTLINE_MANAGER"
- file="js/cr/ui/focus_outline_manager.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_FOCUS_ROW"
- file="js/cr/ui/focus_row.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_KEYBOARD_SHORTCUT_LIST"
- file="js/cr/ui/keyboard_shortcut_list.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_LIST"
- file="js/cr/ui/list.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_LIST_ITEM"
- file="js/cr/ui/list_item.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_CONTROLLER"
- file="js/cr/ui/list_selection_controller.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_LIST_SELECTION_MODEL"
- file="js/cr/ui/list_selection_model.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_LIST_SINGLE_SELECTION_MODEL"
- file="js/cr/ui/list_single_selection_model.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_MENU"
- file="js/cr/ui/menu.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_MENU_BUTTON"
- file="js/cr/ui/menu_button.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_MENU_ITEM"
- file="js/cr/ui/menu_item.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_OVERLAY"
- file="js/cr/ui/overlay.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_POSITION_UTIL"
- file="js/cr/ui/position_util.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_SPLITTER"
- file="js/cr/ui/splitter.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_STORE"
- file="js/cr/ui/store.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_STORE_CLENT"
- file="js/cr/ui/store_client.js"
- type="chrome_html" />
- <if expr="chromeos">
- <structure name="IDR_WEBUI_JS_CR_UI_GRID"
- file="js/cr/ui/grid.js" type="chrome_html" />
- </if>
- <structure name="IDR_WEBUI_JS_CR_UI_TABS"
- file="js/cr/ui/tabs.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_TREE"
- file="js/cr/ui/tree.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_CR_UI_TOUCH_HANDLER"
- file="js/cr/ui/touch_handler.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_EVENT_TRACKER"
- file="js/event_tracker.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_ICON"
- file="js/icon.js" type="chrome_html"
- flattenhtml="true" />
- <structure name="IDR_WEBUI_JS_I18N_TEMPLATE_NO_PROCESS"
- file="js/i18n_template_no_process.js"
- type="chrome_html" />
- <structure name="IDR_WEBUI_JS_LOAD_TIME_DATA"
- file="js/load_time_data.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_PARSE_HTML_SUBSET"
- file="js/parse_html_subset.js" type="chrome_html" />
- <structure name="IDR_WEBUI_JS_TEST_LOADER"
- file="js/test_loader.js" type="chrome_html"/>
- <structure name="IDR_WEBUI_JS_UTIL"
- file="js/util.js" type="chrome_html"
- flattenhtml="true" />
- <structure name="IDR_WEBUI_JS_WEBUI_RESOURCE_TEST"
- file="js/webui_resource_test.js" type="chrome_html" />
-
<if expr="is_ios">
<structure name="IDR_WEBUI_JS_IOS_WEB_UI"
file="js/ios/web_ui.js" type="chrome_html" />
@@ -407,14 +112,6 @@ without changes to the corresponding grd file. -->
file="../../../third_party/lottie/lottie_worker.min.js"
type="chrome_html" />
</if>
-
- <if expr="not is_android and not is_ios">
- <part file="cr_components/cr_components_resources.grdp" />
- <part file="cr_elements_resources.grdp" />
- <part file="cr_polymer_resources.grdp" />
- <part file="polymer_resources.grdp" />
- <part file="polymer_resources_v3.grdp" />
- </if>
</structures>
</release>
</grit>
diff --git a/chromium/ui/webui/webui_allowlist_provider.cc b/chromium/ui/webui/webui_allowlist_provider.cc
index 4d057b7cd6e..779e8022fce 100644
--- a/chromium/ui/webui/webui_allowlist_provider.cc
+++ b/chromium/ui/webui/webui_allowlist_provider.cc
@@ -18,7 +18,6 @@ WebUIAllowlistProvider::~WebUIAllowlistProvider() = default;
std::unique_ptr<content_settings::RuleIterator>
WebUIAllowlistProvider::GetRuleIterator(
ContentSettingsType content_type,
- const content_settings::ResourceIdentifier& /*resource_identifier*/,
bool incognito) const {
if (!allowlist_)
return nullptr;
@@ -30,15 +29,13 @@ void WebUIAllowlistProvider::NotifyContentSettingChange(
const ContentSettingsPattern& primary_pattern,
const ContentSettingsPattern& secondary_pattern,
ContentSettingsType content_type) {
- NotifyObservers(primary_pattern, secondary_pattern, content_type,
- /*resource_identifier*/ std::string());
+ NotifyObservers(primary_pattern, secondary_pattern, content_type);
}
bool WebUIAllowlistProvider::SetWebsiteSetting(
const ContentSettingsPattern& primary_pattern,
const ContentSettingsPattern& secondary_pattern,
ContentSettingsType content_type,
- const content_settings::ResourceIdentifier& /*resource_identifier*/,
std::unique_ptr<base::Value>&& value,
const content_settings::ContentSettingConstraints& constraints) {
// WebUIAllowlistProvider doesn't support settings Website settings.
diff --git a/chromium/ui/webui/webui_allowlist_provider.h b/chromium/ui/webui/webui_allowlist_provider.h
index 0c95a3c7bcb..9f7f9776fd6 100644
--- a/chromium/ui/webui/webui_allowlist_provider.h
+++ b/chromium/ui/webui/webui_allowlist_provider.h
@@ -29,14 +29,12 @@ class WebUIAllowlistProvider : public content_settings::ObservableProvider {
// content_settings::ObservableProvider:
std::unique_ptr<content_settings::RuleIterator> GetRuleIterator(
ContentSettingsType content_type,
- const content_settings::ResourceIdentifier& /*resource_identifier*/,
bool incognito) const override;
void ShutdownOnUIThread() override;
bool SetWebsiteSetting(
const ContentSettingsPattern& primary_pattern,
const ContentSettingsPattern& secondary_pattern,
ContentSettingsType content_type,
- const content_settings::ResourceIdentifier& /*resource_identifier*/,
std::unique_ptr<base::Value>&& value,
const content_settings::ContentSettingConstraints& constraints) override;
void ClearAllContentSettingsRules(ContentSettingsType content_type) override;
diff --git a/chromium/ui/webui/webui_features.gni b/chromium/ui/webui/webui_features.gni
index 2c037396837..0affd25bd87 100644
--- a/chromium/ui/webui/webui_features.gni
+++ b/chromium/ui/webui/webui_features.gni
@@ -12,10 +12,4 @@ declare_args() {
# Enable the WebUI version of the browser's tab strip.
enable_webui_tab_strip = is_chromeos || is_linux || is_win
-
- # Enable tab search only on a branded desktop build.
- # In order to get commit queue coverage for C++ tests,
- # this flag only gates the html/js webui resources, not the C++
- # files
- enable_tab_search = !is_android && !is_ios && is_chrome_branded
}
diff --git a/chromium/ui/wm/core/default_screen_position_client.cc b/chromium/ui/wm/core/default_screen_position_client.cc
index 1c532c275ce..fda4d85839d 100644
--- a/chromium/ui/wm/core/default_screen_position_client.cc
+++ b/chromium/ui/wm/core/default_screen_position_client.cc
@@ -27,7 +27,7 @@ void DefaultScreenPositionClient::ConvertPointToScreen(
gfx::PointF* point) {
const aura::Window* root_window = window->GetRootWindow();
aura::Window::ConvertPointToTarget(window, root_window, point);
- gfx::Point origin = GetOriginInScreen(root_window);
+ gfx::Point origin = GetRootWindowOriginInScreen(root_window);
point->Offset(origin.x(), origin.y());
}
@@ -35,7 +35,7 @@ void DefaultScreenPositionClient::ConvertPointFromScreen(
const aura::Window* window,
gfx::PointF* point) {
const aura::Window* root_window = window->GetRootWindow();
- gfx::Point origin = GetOriginInScreen(root_window);
+ gfx::Point origin = GetRootWindowOriginInScreen(root_window);
point->Offset(-origin.x(), -origin.y());
aura::Window::ConvertPointToTarget(root_window, window, point);
}
@@ -52,7 +52,7 @@ void DefaultScreenPositionClient::SetBounds(aura::Window* window,
window->SetBounds(bounds);
}
-gfx::Point DefaultScreenPositionClient::GetOriginInScreen(
+gfx::Point DefaultScreenPositionClient::GetRootWindowOriginInScreen(
const aura::Window* root_window) {
aura::Window* window = const_cast<aura::Window*>(root_window);
display::Screen* screen = display::Screen::GetScreen();
diff --git a/chromium/ui/wm/core/default_screen_position_client.h b/chromium/ui/wm/core/default_screen_position_client.h
index 2e70ce2edd8..f5b1befcf53 100644
--- a/chromium/ui/wm/core/default_screen_position_client.h
+++ b/chromium/ui/wm/core/default_screen_position_client.h
@@ -31,8 +31,9 @@ class WM_CORE_EXPORT DefaultScreenPositionClient
const display::Display& display) override;
protected:
- // Returns the origin of the host platform-window in system DIP coordinates.
- virtual gfx::Point GetOriginInScreen(const aura::Window* root_window);
+ // aura::client::ScreenPositionClient:
+ gfx::Point GetRootWindowOriginInScreen(
+ const aura::Window* root_window) override;
private:
aura::Window* root_window_;
diff --git a/chromium/ui/wm/core/window_animations.cc b/chromium/ui/wm/core/window_animations.cc
index 282c0fbe438..f26851877b5 100644
--- a/chromium/ui/wm/core/window_animations.cc
+++ b/chromium/ui/wm/core/window_animations.cc
@@ -146,9 +146,9 @@ ui::AnimationThroughputReporter::ReportCallback ForSmoothness(
SmoothnessCallback callback) {
return base::BindRepeating(
[](SmoothnessCallback callback,
- cc::FrameSequenceMetrics::ThroughputData throughput) {
- const int smoothness = std::floor(100.0f * throughput.frames_produced /
- throughput.frames_expected);
+ const cc::FrameSequenceMetrics::CustomReportData& data) {
+ const int smoothness =
+ std::floor(100.0f * data.frames_produced / data.frames_expected);
callback.Run(smoothness);
},
std::move(callback));